emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Emacs-diffs] /srv/bzr/emacs/trunk r112104: * progmodes/cfengine.el


From: Ted Zlatanov
Subject: Re: [Emacs-diffs] /srv/bzr/emacs/trunk r112104: * progmodes/cfengine.el (cfengine-common-syntax): Add "_" to word syntax.
Date: Tue, 26 Mar 2013 05:17:39 -0400
User-agent: Gnus/5.130006 (Ma Gnus v0.6) Emacs/24.3.50 (gnu/linux)

On Sat, 23 Mar 2013 12:01:31 -0400 Stefan Monnier <address@hidden> wrote: 

>>>> Yes!  In particular, context expressions in CFEngine are things like
>>>> "a_b_c.d_e" and it's a pain to skip over them with the usual `M-f' or
>>>> CUA keybindings.
SM> I use C-M-f, C-M-b, C-M-t for that.
>> Right.  Well, do you want me to work on the symbol-word minor mode or
>> will you?  It seems like a pretty useful change.

SM> I do not plan to work on it, so please go ahead.  You might want to
SM> start from subword.el which makes a similar change, tho in a different
SM> direction (making words smaller rather than larger).

The below simply adds a buffer-local `subword-superiority' defcustom
which, when set, makes `subword-mode' treat symbol_words as a single
word.  I named it to reflect the opposite behavior (the opposite of
"sub" is usually "super", e.g. subscript vs. superscript).  Let me know
what you think and if you'd rather see a separate mode or even a
separate file instead.  IMO it's such a simple change that I'd rather
not make it a big deal.

The only possible enhancement I'd want over the attached is to also make
`subword-mode' override the CUA keyboard shortcuts (C-left, C-right),
but I wasn't sure if that's OK in general.

Ted

=== modified file 'lisp/progmodes/subword.el'
--- lisp/progmodes/subword.el   2013-01-01 09:11:05 +0000
+++ lisp/progmodes/subword.el   2013-03-26 09:11:57 +0000
@@ -43,7 +43,9 @@
 
 ;; The subword oriented commands defined in this package recognize
 ;; subwords in a nomenclature to move between them and to edit them as
-;; words.
+;; words.  You can customize `subword-superiority' to make the mode
+;; treat symbols as words instead, creating a sort of "superword-mode"
+;; (but not explicitly).
 
 ;; In the minor mode, all common key bindings for word oriented
 ;; commands are overridden by the subword oriented commands:
@@ -71,6 +73,13 @@
 ;;       (lambda () (subword-mode 1)))
 ;;
 
+;; To make the mode turn `subword-superiority' on automatically for
+;; only some modes, put the following code in your .emacs:
+;;
+;; (add-hook 'c-mode-common-hook
+;;       (lambda () (subword-mode 1) (setq subword-superiority t)))
+;;
+
 ;; Acknowledgment:
 ;; The regular expressions to detect subwords are mostly based on
 ;; the old `c-forward-into-nomenclature' originally contributed by
@@ -80,6 +89,14 @@
 
 ;;; Code:
 
+(defcustom subword-superiority nil
+  "Whether `subword-mode' should move inside SubWords or treat symbols as 
words.
+Becomes buffer-local when set."
+  :group 'editing
+  :type '(choice (const :tag "Treat SubWords as two words" nil)
+                 (const :tag "Treat symbol_words as a single word" t)))
+(make-variable-buffer-local 'subword-superiority)
+
 (defvar subword-forward-function 'subword-forward-internal
   "Function to call for forward subword movement.")
 
@@ -128,6 +145,9 @@
   EmacsFrameClass    =>  \"Emacs\", \"Frame\" and \"Class\"
   NSGraphicsContext  =>  \"NS\", \"Graphics\" and \"Context\"
 
+When `subword-superiority' is set to t, `subword-mode' treats
+symbol_words as single words instead.
+
 The subword oriented commands activated in this minor mode recognize
 subwords in a nomenclature to move between subwords and to edit them
 as words.
@@ -143,6 +163,9 @@
 (define-global-minor-mode global-subword-mode subword-mode
   (lambda () (subword-mode 1)))
 
+(define-global-minor-mode global-superword-mode subword-mode
+  (lambda () (subword-mode 1) (setq subword-superiority t)))
+
 (defun subword-forward (&optional arg)
   "Do the same as `forward-word' but on subwords.
 See the command `subword-mode' for a description of subwords.
@@ -260,33 +283,37 @@
 ;; Internal functions
 ;;
 (defun subword-forward-internal ()
-  (if (and
-       (save-excursion
-        (let ((case-fold-search nil))
-          (re-search-forward subword-forward-regexp nil t)))
-       (> (match-end 0) (point)))
-      (goto-char
-       (cond
-       ((< 1 (- (match-end 2) (match-beginning 2)))
-        (1- (match-end 2)))
-       (t
-        (match-end 0))))
-    (forward-word 1)))
+  (if subword-superiority
+      (forward-symbol 1)
+    (if (and
+         (save-excursion
+           (let ((case-fold-search nil))
+             (re-search-forward subword-forward-regexp nil t)))
+         (> (match-end 0) (point)))
+        (goto-char
+         (cond
+          ((< 1 (- (match-end 2) (match-beginning 2)))
+           (1- (match-end 2)))
+          (t
+           (match-end 0))))
+      (forward-word 1))))
 
 
 (defun subword-backward-internal ()
-  (if (save-excursion
-       (let ((case-fold-search nil))
-         (re-search-backward subword-backward-regexp nil t)))
-      (goto-char
-       (cond
-       ((and (match-end 3)
-             (< 1 (- (match-end 3) (match-beginning 3)))
-             (not (eq (point) (match-end 3))))
-        (1- (match-end 3)))
-       (t
-        (1+ (match-beginning 0)))))
-    (backward-word 1)))
+  (if subword-superiority
+      (forward-symbol -1)
+    (if (save-excursion
+          (let ((case-fold-search nil))
+            (re-search-backward subword-backward-regexp nil t)))
+        (goto-char
+         (cond
+          ((and (match-end 3)
+                (< 1 (- (match-end 3) (match-beginning 3)))
+                (not (eq (point) (match-end 3))))
+           (1- (match-end 3)))
+          (t
+           (1+ (match-beginning 0)))))
+      (backward-word 1))))
 
 
 (provide 'subword)


reply via email to

[Prev in Thread] Current Thread [Next in Thread]