unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Ted Zlatanov <tzz@lifelogs.com>
To: emacs-devel@gnu.org
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	[thread overview]
Message-ID: <87r4j2v7t8.fsf@lifelogs.com> (raw)
In-Reply-To: jwvboaartt1.fsf-monnier+emacs@gnu.org

[-- Attachment #1: Type: text/plain, Size: 1258 bytes --]

On Sat, 23 Mar 2013 12:01:31 -0400 Stefan Monnier <monnier@iro.umontreal.ca> 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


[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: subword-superiority.patch --]
[-- Type: text/x-diff, Size: 4104 bytes --]

=== 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))))
 
 \f
 (provide 'subword)


  reply	other threads:[~2013-03-26  9:17 UTC|newest]

Thread overview: 42+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
     [not found] <E1UIiBH-0005sm-Vy@vcs.savannah.gnu.org>
2013-03-21 23:44 ` [Emacs-diffs] /srv/bzr/emacs/trunk r112104: * progmodes/cfengine.el (cfengine-common-syntax): Add "_" to word syntax Stefan Monnier
2013-03-21 23:49   ` Ted Zlatanov
2013-03-22  1:32     ` Stefan Monnier
2013-03-22 13:03       ` Ted Zlatanov
2013-03-22 13:14         ` Tom Tromey
2013-03-22 13:38           ` Ted Zlatanov
2013-03-22 14:18             ` Stefan Monnier
2013-03-22 14:46               ` Ted Zlatanov
2013-03-22 17:30                 ` Stefan Monnier
2013-03-22 19:13                   ` Ted Zlatanov
2013-03-23 16:01                     ` Stefan Monnier
2013-03-26  9:17                       ` Ted Zlatanov [this message]
2013-03-26 17:06                         ` Stefan Monnier
2013-03-26 19:04                           ` superword-mode (was: [Emacs-diffs] /srv/bzr/emacs/trunk r112104: * progmodes/cfengine.el (cfengine-common-syntax): Add "_" to word syntax.) Ted Zlatanov
2013-03-27  1:23                             ` superword-mode Stefan Monnier
2013-03-27  3:18                               ` superword-mode Masatake YAMATO
2013-03-27  9:31                                 ` superword-mode Andreas Schwab
2013-03-27 13:06                                 ` superword-mode Ted Zlatanov
2013-03-27 13:14                                 ` superword-mode Stefan Monnier
2013-03-27 13:04                               ` superword-mode Ted Zlatanov
2013-03-27 13:50                                 ` superword-mode Stefan Monnier
2013-03-27 14:06                                   ` superword-mode Ted Zlatanov
2013-03-27 15:03                             ` superword-mode Davis Herring
2013-03-27 15:19                               ` superword-mode Ted Zlatanov
2013-03-27 15:33                                 ` superword-mode Ted Zlatanov
2013-03-27 16:33                                   ` superword-mode Stefan Monnier
2013-03-27 19:31                                     ` superword-mode Ted Zlatanov
2013-03-27 22:23                                       ` superword-mode Stefan Monnier
2013-03-28 23:00                             ` superword-mode Ted Zlatanov
2013-03-29 13:26                               ` superword-mode Ted Zlatanov
2013-03-29 16:23                                 ` superword-mode Andreas Röhler
2013-03-29 16:43                                   ` superword-mode Ted Zlatanov
2013-03-29 17:49                                     ` superword-mode Andreas Röhler
2013-03-29 18:10                                       ` superword-mode Ted Zlatanov
2013-03-29 18:50                                         ` superword-mode Andreas Röhler
2013-03-29 19:04                                           ` superword-mode Ted Zlatanov
2013-03-29 20:16                                 ` superword-mode Davis Herring
2013-03-29 21:18                               ` superword-mode Stefan Monnier
2013-03-30  1:34                                 ` superword-mode Ted Zlatanov
2013-03-30  1:36                                   ` superword-mode Ted Zlatanov
2013-03-30  6:28                                 ` superword-mode Andreas Röhler
2013-03-22 14:13         ` [Emacs-diffs] /srv/bzr/emacs/trunk r112104: * progmodes/cfengine.el (cfengine-common-syntax): Add "_" to word syntax Stefan Monnier

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=87r4j2v7t8.fsf@lifelogs.com \
    --to=tzz@lifelogs.com \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).