From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: Ted Zlatanov Newsgroups: gmane.emacs.devel Subject: Re: superword-mode Date: Wed, 27 Mar 2013 09:04:49 -0400 Organization: =?utf-8?B?0KLQtdC+0LTQvtGAINCX0LvQsNGC0LDQvdC+0LI=?= @ Cienfuegos Message-ID: <87mwtpt2mm.fsf@lifelogs.com> References: <87wqt0xqiy.fsf@lifelogs.com> <87sj3ny4ca.fsf@lifelogs.com> <87ehf7zid3.fsf@fleche.redhat.com> <87obeby2ph.fsf@lifelogs.com> <878v5fxzjg.fsf@lifelogs.com> <871ub7xn7e.fsf@lifelogs.com> <87r4j2v7t8.fsf@lifelogs.com> <87zjxqt21y.fsf_-_@lifelogs.com> NNTP-Posting-Host: plane.gmane.org Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-Trace: ger.gmane.org 1364389507 22679 80.91.229.3 (27 Mar 2013 13:05:07 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Wed, 27 Mar 2013 13:05:07 +0000 (UTC) Cc: emacs-devel@gnu.org To: Stefan Monnier Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Wed Mar 27 14:05:34 2013 Return-path: Envelope-to: ged-emacs-devel@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by plane.gmane.org with esmtp (Exim 4.69) (envelope-from ) id 1UKq2n-0008Qv-7g for ged-emacs-devel@m.gmane.org; Wed, 27 Mar 2013 14:05:33 +0100 Original-Received: from localhost ([::1]:39574 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UKq2P-0000eJ-6O for ged-emacs-devel@m.gmane.org; Wed, 27 Mar 2013 09:05:09 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:60025) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UKq2H-0000b7-9p for emacs-devel@gnu.org; Wed, 27 Mar 2013 09:05:06 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1UKq2A-0001rr-86 for emacs-devel@gnu.org; Wed, 27 Mar 2013 09:05:01 -0400 Original-Received: from mail-qe0-f46.google.com ([209.85.128.46]:35522) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1UKq2A-0001r1-2M for emacs-devel@gnu.org; Wed, 27 Mar 2013 09:04:54 -0400 Original-Received: by mail-qe0-f46.google.com with SMTP id a11so4456178qen.5 for ; Wed, 27 Mar 2013 06:04:53 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=lifelogs.com; s=google; h=x-received:from:to:cc:subject:organization:references:x-face :mail-copies-to:gmane-reply-to-list:date:in-reply-to:message-id :user-agent:mime-version:content-type; bh=QvJzdS9mIIyaLArZOtk1XgjPSHZOzEXpp3f6lZmxPQo=; b=qq90JCBjsx9FfLBZE/JMwOIK2bGO6MPdBWE0v3pvsPGq1G7e+6GQQztVUAAxr4YHlM TRpCctu4Z4rtJWSTPcLEpkusdlIn0pDytLImZUU8WyFujlD89YNUT1CO+LMREgPJTMJ9 7ManiX4GTfX9GNid0j4TM4LxZ6v4N+UgVVfQw= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=x-received:from:to:cc:subject:organization:references:x-face :mail-copies-to:gmane-reply-to-list:date:in-reply-to:message-id :user-agent:mime-version:content-type:x-gm-message-state; bh=QvJzdS9mIIyaLArZOtk1XgjPSHZOzEXpp3f6lZmxPQo=; b=Qq+ZE2kZIj7hdVQ1RVEbIbPArQIVE3pd9C1nTKN0x92V5s6eEtKykffw71w9QYVxPh 9HCg3c46+8m+27TMO6Sk0yJZSOZ28ez9DTNVabFrPX1erWyA38xd5FnN5R5gvwHr5io5 RfGRUBlv1TQAmr3DIWlt80cZgOIRjMbj/reFfTa4LASEW3NuRK+yMHYKfuxlsXWNY+VK lMcPR/kNdzbw8PV0KfSqHPxddzlw4PGsew+VGyr7gMK9b//fsm2/qWLh97GS/XthK548 zBPgbm+t9UInGqFYUaWf9GUs2TDhLpH24P8ImyRlvvnyX4zjiEuB8pFKnCBCAorapQ4N JeWw== X-Received: by 10.224.198.67 with SMTP id en3mr10506489qab.23.1364389493033; Wed, 27 Mar 2013 06:04:53 -0700 (PDT) Original-Received: from heechee (pool-72-93-31-86.bstnma.east.verizon.net. [72.93.31.86]) by mx.google.com with ESMTPS id 10sm16659193qax.13.2013.03.27.06.04.50 (version=TLSv1.2 cipher=RC4-SHA bits=128/128); Wed, 27 Mar 2013 06:04:52 -0700 (PDT) X-Face: bd.DQ~'29fIs`T_%O%C\g%6jW)yi[zuz6; d4V0`@y-~$#3P_Ng{@m+e4o<4P'#(_GJQ%TT= D}[Ep*b!\e,fBZ'j_+#"Ps?s2!4H2-Y"sx" Mail-Copies-To: never Gmane-Reply-To-List: yes In-Reply-To: (Stefan Monnier's message of "Tue, 26 Mar 2013 21:23:18 -0400") User-Agent: Gnus/5.130006 (Ma Gnus v0.6) Emacs/24.3.50 (gnu/linux) X-Gm-Message-State: ALoCoQmg2sMR/M85zZopXqn2IgnbC5qGALDWIMaRkhJF5dpSNkgOjIEuhf7cCzliXGISjDQqTrjH X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x [fuzzy] X-Received-From: 209.85.128.46 X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.emacs.devel:158295 Archived-At: --=-=-= Content-Type: text/plain On Tue, 26 Mar 2013 21:23:18 -0400 Stefan Monnier wrote: >> OK; see attached. Implemented by looking at the `superword-mode' >> variable in the internal `subword-mode' commands. SM> Looks good, see comments below. >> Included and done for both `subword-mode' and `superword-mode'. SM> BTW, this needs an entry in etc/NEWS, of course. OK; done. >> +;; (add-hook 'c-mode-common-hook >> +;; (lambda () (superword-mode 1))) SM> This should be simply SM> +;; (add-hook 'c-mode-common-hook 'superword-mode) OK; done for both cases in the docs. >> + :lighter " ," >> + nil >> + nil >> + subword-mode-map SM> The "three args" are only used if there's no :keyword arg. SM> So the above is the same as >> + :lighter " ," >> + (progn nil >> + nil >> + subword-mode-map) SM> The subword-mode-map should be used by default anyway, so you can just SM> remove those 3 expressions. Oh, OK. Done for both subword and superword. SM> I'm not sure we want to add a :lighter, by the way. Booo. I want my modeline to look like a Christmas tree ;) SM> Why not (defalias 'subword-right 'subword-forward)? SM> Else, please add a docstring. I thought it would be nicer, but I see it's not. Changed for both left and right. >> +(defvar superword-mode-map >> + (let ((map (make-sparse-keymap))) >> + (dolist (cmd '(forward-word backward-word mark-word kill-word >> + backward-kill-word transpose-words >> + capitalize-word upcase-word downcase-word >> + left-word right-word)) >> + (let ((othercmd (let ((name (symbol-name cmd))) >> + (string-match "\\([[:alpha:]-]+\\)-word[s]?" name) >> + (intern (concat "subword-" (match-string 1 name)))))) >> + (define-key map (vector 'remap cmd) othercmd))) >> + map) SM> Why not (defvar superword-mode-map subword-mode-map)? OK; done. I'd rather not inherit, they are identical right now. I still don't have the mutual exclusivity working; you can't go subword->superword with `M-x superword-mode'. It goes subword->subword disabled->superword and you have to do `M-x superword-mode' twice. See attached. Ted --=-=-= Content-Type: text/x-diff; charset=iso-8859-1 Content-Disposition: inline; filename=superword-mode2.patch Content-Transfer-Encoding: quoted-printable =3D=3D=3D modified file 'etc/NEWS' --- etc/NEWS 2013-03-23 00:38:11 +0000 +++ etc/NEWS 2013-03-27 12:55:03 +0000 @@ -254,6 +254,11 @@ =20 * New Modes and Packages in Emacs 24.4 +** New `superword-mode' in subword.el +`superword-mode' overrides the default word motion commands to treat +symbol_words as a single word, similar to what `subword-mode' does and +using the same internal functions. + ** New nadvice.el package offering lighter-weight advice facilities. It is layered as: - add-function/remove-function which can be used to add/remove code on any =3D=3D=3D modified file 'lisp/progmodes/subword.el' --- lisp/progmodes/subword.el 2013-01-01 09:11:05 +0000 +++ lisp/progmodes/subword.el 2013-03-27 13:01:32 +0000 @@ -26,7 +26,8 @@ =20 ;; This package provides `subword' oriented commands and a minor mode ;; (`subword-mode') that substitutes the common word handling -;; functions with them. +;; functions with them. It also provides the `superword-mode' minor +;; mode that treats symbols as words, the opposite of `subword-mode'. =20 ;; In spite of GNU Coding Standards, it is popular to name a symbol by ;; mixing uppercase and lowercase letters, e.g. "GtkWidget", @@ -43,12 +44,13 @@ =20 ;; 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 also get a mode to treat symbols as words instead, +;; called `superword-mode' (the opposite of `subword-mode'). =20 ;; In the minor mode, all common key bindings for word oriented ;; commands are overridden by the subword oriented commands: =20 -;; Key Word oriented command Subword oriented command +;; Key Word oriented command Subword oriented command (also super= word) ;; =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D ;; M-f `forward-word' `subword-forward' ;; M-b `backward-word' `subword-backward' @@ -67,8 +69,13 @@ ;; To make the mode turn on automatically, put the following code in ;; your .emacs: ;; -;; (add-hook 'c-mode-common-hook -;; (lambda () (subword-mode 1))) +;; (add-hook 'c-mode-common-hook 'subword-mode) +;; + +;; To make the mode turn `superword-mode' on automatically for +;; only some modes, put the following code in your .emacs: +;; +;; (add-hook 'c-mode-common-hook 'superword-mode) ;; =20 ;; Acknowledgment: @@ -98,7 +105,8 @@ (let ((map (make-sparse-keymap))) (dolist (cmd '(forward-word backward-word mark-word kill-word backward-kill-word transpose-words - capitalize-word upcase-word downcase-word)) + capitalize-word upcase-word downcase-word + left-word right-word)) (let ((othercmd (let ((name (symbol-name cmd))) (string-match "\\([[:alpha:]-]+\\)-word[s]?" name) (intern (concat "subword-" (match-string 1 name)))= ))) @@ -133,9 +141,8 @@ as words. =20 \\{subword-mode-map}" - nil - nil - subword-mode-map) + :lighter " ," + (when superword-mode (superword-mode -1))) =20 (define-obsolete-function-alias 'c-subword-mode 'subword-mode "23.2") =20 @@ -161,6 +168,8 @@ =20 (put 'subword-forward 'CUA 'move) =20 +(defalias 'subword-right 'subword-forward) + (defun subword-backward (&optional arg) "Do the same as `backward-word' but on subwords. See the command `subword-mode' for a description of subwords. @@ -168,6 +177,8 @@ (interactive "p") (subword-forward (- (or arg 1)))) =20 +(defalias 'subword-left 'subword-backward) + (defun subword-mark (arg) "Do the same as `mark-word' but on subwords. See the command `subword-mode' for a description of subwords. @@ -254,41 +265,73 @@ (unless advance (goto-char start)))) =20 + + +(defvar superword-mode-map subword-mode-map + "Keymap used in `superword-mode' minor mode.") + +;;;###autoload +(define-minor-mode superword-mode + "Toggle superword movement and editing (Superword mode). +With a prefix argument ARG, enable Superword mode if ARG is +positive, and disable it otherwise. If called from Lisp, enable +the mode if ARG is omitted or nil. + +Superword mode is a buffer-local minor mode. Enabling it remaps +word-based editing commands to superword-based commands that +treat symbols as words, e.g. \"this_is_a_symbol\". + +The superword oriented commands activated in this minor mode +recognize symbols as superwords to move between superwords and to +edit them as words. + +\\{superword-mode-map}" + :lighter " =B2" + (when subword-mode (subword-mode -1))) + +;;;###autoload +(define-global-minor-mode global-superword-mode superword-mode + (lambda () (superword-mode 1))) =20 ;; ;; 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 superword-mode + (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)))) =20 (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 superword-mode + (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)))) =20 + (provide 'subword) +(provide 'superword) =20 ;;; subword.el ends here --=-=-=--