From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Newsgroups: gmane.emacs.bugs Subject: bug#38013: [PATCH] Rectangular region selection with mouse Date: Thu, 31 Oct 2019 22:55:26 +0100 Message-ID: Mime-Version: 1.0 (Mac OS X Mail 12.4 \(3445.104.11\)) Content-Type: multipart/mixed; boundary="Apple-Mail=_9055E942-6BCB-4037-8CC3-7D965542314C" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="25223"; mail-complaints-to="usenet@blaine.gmane.org" To: 38013@debbugs.gnu.org Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Fri Nov 01 00:12:58 2019 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1iQJcg-0006Sd-GG for geb-bug-gnu-emacs@m.gmane.org; Fri, 01 Nov 2019 00:12:58 +0100 Original-Received: from localhost ([::1]:54706 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQJcf-0005GO-AX for geb-bug-gnu-emacs@m.gmane.org; Thu, 31 Oct 2019 19:12:57 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:33109) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQJar-00042K-TV for bug-gnu-emacs@gnu.org; Thu, 31 Oct 2019 19:11:07 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iQJap-0002d9-R7 for bug-gnu-emacs@gnu.org; Thu, 31 Oct 2019 19:11:05 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:45630) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1iQJao-0002Xu-0o for bug-gnu-emacs@gnu.org; Thu, 31 Oct 2019 19:11:03 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1iQJan-0007se-PL for bug-gnu-emacs@gnu.org; Thu, 31 Oct 2019 19:11:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Mattias =?UTF-8?Q?Engdeg=C3=A5rd?= Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Thu, 31 Oct 2019 23:11:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 38013 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-gnu-emacs@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.157256341730224 (code B ref -1); Thu, 31 Oct 2019 23:11:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 31 Oct 2019 23:10:17 +0000 Original-Received: from localhost ([127.0.0.1]:54450 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iQJa4-0007rP-IC for submit@debbugs.gnu.org; Thu, 31 Oct 2019 19:10:16 -0400 Original-Received: from lists.gnu.org ([209.51.188.17]:59540) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1iQJa3-0007rH-0e for submit@debbugs.gnu.org; Thu, 31 Oct 2019 19:10:15 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:60761) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iQJZy-0003jY-Ls for bug-gnu-emacs@gnu.org; Thu, 31 Oct 2019 19:10:13 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iQJZx-0000ZX-1q for bug-gnu-emacs@gnu.org; Thu, 31 Oct 2019 19:10:10 -0400 Original-Received: from mail1427c50.megamailservers.eu ([91.136.14.27]:36958 helo=mail118c50.megamailservers.eu) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iQJZw-0000Nb-EH for bug-gnu-emacs@gnu.org; Thu, 31 Oct 2019 19:10:08 -0400 X-Authenticated-User: mattiase@bredband.net DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=megamailservers.eu; s=maildub; t=1572558929; bh=M8+USFmPJl2YyXZXwoKrBXuKgyuK/Eph4xNQYnEIObU=; h=From:Subject:Date:To:From; b=XZya4othq3+0aaSwVrlvfIwGrz1gj8QJnYp0EXuVx0OyMcTvNC7RFBhjTrXW+q4ud RaWMRy1mU0j5H6y46DeF41Wl2TkeQS5eKzN9/EPAeonJ/1hg3OBREC30nZeKwY8txM NL08K7aDdU8eK9i3mVZMQyqkjqsFUrdmjyKTlhwI= Feedback-ID: mattiase@acm.or Original-Received: from [192.168.0.4] (c188-150-171-71.bredband.comhem.se [188.150.171.71]) (authenticated bits=0) by mail118c50.megamailservers.eu (8.14.9/8.13.1) with ESMTP id x9VLtRba007532 for ; Thu, 31 Oct 2019 21:55:29 +0000 X-Mailer: Apple Mail (2.3445.104.11) X-CTCH-RefID: str=0001.0A0B0214.5DBB5851.0013, ss=1, re=0.000, recu=0.000, reip=0.000, cl=1, cld=1, fgs=0 X-CTCH-VOD: Unknown X-CTCH-Spam: Unknown X-CTCH-Score: 0.000 X-CTCH-Flags: 0 X-CTCH-ScoreCust: 0.000 X-CSC: 0 X-CHA: v=2.3 cv=DYBpVclW c=1 sm=1 tr=0 a=SF+I6pRkHZhrawxbOkkvaA==:117 a=SF+I6pRkHZhrawxbOkkvaA==:17 a=M51BFTxLslgA:10 a=z8QdycKeBd5250rj2sgA:9 a=7Zwj6sZBwVKJAoWSPKxL6X1jA+E=:19 a=CjuIK1q_8ugA:10 a=tia7W_PVlcL2gi8pddYA:9 a=B2y7HmGcmWMA:10 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x (no timestamps) [generic] [fuzzy] X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:170566 Archived-At: --Apple-Mail=_9055E942-6BCB-4037-8CC3-7D965542314C Content-Transfer-Encoding: quoted-printable Content-Type: text/plain; charset=us-ascii This is a proposal to add mouse-selection of rectangular regions. It = turns out to be useful; Emacs should come with the facility built-in. The main problem is what to bind it to. The common modifiers (shift, = control, meta) are already taken. Platforms have different "standard" = modifiers: Option on macOS, Alt on Windows, Control in Gnome (?). Assuming that the secondary selection is somewhat of an anachronism = which is likely to be less used today than the rectangular one would be, = the patch uses Meta as default modifier. Both secondary and rectangular = mouse selection have defcustoms permitting easy change. The defaults could be different, for example if secondary mouse = selection turns out to be very popular. There is no documentation yet. --Apple-Mail=_9055E942-6BCB-4037-8CC3-7D965542314C Content-Disposition: attachment; filename=0001-Mouse-rectangular-region-selection.patch Content-Type: application/octet-stream; x-unix-mode=0644; name="0001-Mouse-rectangular-region-selection.patch" Content-Transfer-Encoding: quoted-printable =46rom=20e8d781baf8ffd0cd911505a50ffefa0f54d2d185=20Mon=20Sep=2017=20= 00:00:00=202001=0AFrom:=20=3D?UTF-8?q?Mattias=3D20Engdeg=3DC3=3DA5rd?=3D=20= =0ADate:=20Fri,=2025=20Oct=202019=2011:16:39=20+0200=0A= Subject:=20[PATCH]=20Mouse=20rectangular=20region=20selection=0A=0AMake=20= it=20possible=20to=20select=20a=20rectangular=20region=20using=20the=20= mouse.=0AThe=20modifier=20is=20customisable=20and=20defaults=20to=20= meta.=0AThe=20modifier=20for=20mouse=20secondary=20selection=20is=20now=20= also=20customisable=20and=0Adefaults=20to=20nil=20(disabled).=0A=0A*=20= lisp/mouse.el=20(mouse-scroll-subr):=20Add=20COLUMN=20argument.=0A= (mouse-drag-region-rectangle):=20New.=0A(mouse--global-with-modifier)=0A= (mouse--set-secondary-selection-bindings,=20= mouse-secondary-selection-modifier)=0A= (mouse--set-rectangular-region-selection-bindings)=0A= (mouse-region-rectangle-modifier):=20New=20defcustoms=20with=20helper=20= functions.=0A---=0A=20lisp/mouse.el=20|=20110=20= +++++++++++++++++++++++++++++++++++++++++++++++---=0A=201=20file=20= changed,=20104=20insertions(+),=206=20deletions(-)=0A=0Adiff=20--git=20= a/lisp/mouse.el=20b/lisp/mouse.el=0Aindex=204a351f7be2..48ea109daa=20= 100644=0A---=20a/lisp/mouse.el=0A+++=20b/lisp/mouse.el=0A@@=20-1045,10=20= +1045,11=20@@=20mouse-scroll-min-lines=0A=20of=20lines=20specified=20by=20= this=20variable."=0A=20=20=20:type=20'integer)=0A=20=0A-(defun=20= mouse-scroll-subr=20(window=20jump=20&optional=20overlay=20start)=0A= +(defun=20mouse-scroll-subr=20(window=20jump=20&optional=20overlay=20= start=20column)=0A=20=20=20"Scroll=20the=20window=20WINDOW,=20JUMP=20= lines=20at=20a=20time,=20until=20new=20input=20arrives.=0A=20If=20= OVERLAY=20is=20an=20overlay,=20let=20it=20stretch=20from=20START=20to=20= the=20far=20edge=20of=0A=20the=20newly=20visible=20text.=0A+If=20COLUMN=20= is=20non-nil,=20try=20to=20keep=20point=20in=20that=20column=20when=20= scrolling.=0A=20Upon=20exit,=20point=20is=20at=20the=20far=20edge=20of=20= the=20newly=20visible=20text."=0A=20=20=20(cond=0A=20=20=20=20((and=20(>=20= jump=200)=20(<=20jump=20mouse-scroll-min-lines))=0A@@=20-1077,6=20= +1078,8=20@@=20mouse-scroll-subr=0A=20=09=09=20=20=20;;=20so=20that=20we=20= don't=20mess=20up=20the=20selected=20window.=0A=20=09=09=20=20=20(or=20= (eq=20window=20(selected-window))=0A=20=09=09=20=20=20=20=20=20=20= (goto-char=20opoint))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(when=20column=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20(move-to-column=20column))=0A=20=09=09=20=20=20(sit-for=20= mouse-scroll-delay)))))=0A=20=20=20=20=20(or=20(eq=20window=20= (selected-window))=0A=20=09(goto-char=20opoint))))=0A@@=20-1666,11=20= +1669,43=20@@=20mouse-save-then-kill=0A=20=20=20=20=20=20=20(setq=20= mouse-save-then-kill-posn=20click-pt)))))=0A=20=0A=20=0C=0A= -(global-set-key=20[M-mouse-1]=20'mouse-start-secondary)=0A= -(global-set-key=20[M-drag-mouse-1]=20'mouse-set-secondary)=0A= -(global-set-key=20[M-down-mouse-1]=20'mouse-drag-secondary)=0A= -(global-set-key=20[M-mouse-3]=20'mouse-secondary-save-then-kill)=0A= -(global-set-key=20[M-mouse-2]=20'mouse-yank-secondary)=0A+(defun=20= mouse--global-with-modifier=20(base=20modifier=20command)=0A+=20=20= "Globally=20bind=20BASE=20+=20MODIFIER=20to=20COMMAND."=0A+=20=20= (global-set-key=20(vector=20(event-convert-list=20(list=20modifier=20= base)))=20command))=0A+=0A+(defun=20= mouse--set-secondary-selection-bindings=20(mod=20activate)=0A+=20=20"Set=20= global=20mouse=20bindings=20using=20MOD=20for=20secondary=20selection.=0A= +If=20ACTIVATE=20is=20nil,=20remove=20those=20bindings."=0A+=20=20(when=20= mod=0A+=20=20=20=20(mouse--global-with-modifier=20'mouse-1=20mod=0A+=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20(and=20activate=20'mouse-start-secondary))=0A+=20=20=20= =20(mouse--global-with-modifier=20'drag-mouse-1=20mod=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20(and=20activate=20'mouse-set-secondary))=0A+=20=20=20=20= (mouse--global-with-modifier=20'down-mouse-1=20mod=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(and=20activate=20'mouse-drag-secondary))=0A+=20=20=20=20= (mouse--global-with-modifier=20'mouse-3=20mod=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (and=20activate=20'mouse-secondary-save-then-kill))=0A+=20=20=20=20= (mouse--global-with-modifier=20'mouse-2=20mod=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (and=20activate=20'mouse-yank-secondary))))=0A+=0A+(defcustom=20= mouse-secondary-selection-modifier=20nil=0A+=20=20"The=20modifier=20key=20= for=20secondary=20selection=20using=20the=20mouse.=0A+If=20nil,=20mouse=20= secondary=20selection=20is=20disabled."=0A+=20=20:group=20'mouse=0A+=20=20= :type=20'(choice=20(const=20:tag=20"None=20(disabled)"=20nil)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20(const=20meta)=0A+=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(const=20control)=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(const=20shift)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(const=20super)=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20(const=20hyper))=0A+=20=20:version=20"27.1"=0A= +=20=20:set=20(lambda=20(variable=20new-value)=0A+=20=20=20=20=20=20=20=20= =20(when=20(boundp=20'mouse-secondary-selection-modifier)=0A+=20=20=20=20= =20=20=20=20=20=20=20(mouse--set-secondary-selection-bindings=0A+=20=20=20= =20=20=20=20=20=20=20=20=20mouse-secondary-selection-modifier=20nil))=0A= +=20=20=20=20=20=20=20=20=20(set-default=20variable=20new-value)=0A+=20=20= =20=20=20=20=20=20=20(mouse--set-secondary-selection-bindings=0A+=20=20=20= =20=20=20=20=20=20=20mouse-secondary-selection-modifier=20t)))=0A=20=0A=20= (defconst=20mouse-secondary-overlay=0A=20=20=20(let=20((ol=20= (make-overlay=20(point-min)=20(point-min))))=0A@@=20-1960,6=20+1995,69=20= @@=20secondary-selection-from-region=0A=20=20=20=20=20(move-overlay=20= mouse-secondary-overlay=20(region-beginning)=20(region-end))))=0A=20=0A=20= =0C=0A+(defun=20mouse-drag-region-rectangle=20(start-event)=0A+=20=20= "Set=20the=20region=20to=20the=20rectangle=20that=20the=20mouse=20is=20= dragged=20over.=0A+This=20must=20be=20bound=20to=20a=20button-down=20= mouse=20event."=0A+=20=20(interactive=20"e")=0A+=20=20(deactivate-mark)=0A= +=20=20(mouse-set-point=20start-event)=0A+=20=20(rectangle-mark-mode)=0A= +=20=20(let*=20((scroll-margin=200)=0A+=20=20=20=20=20=20=20=20=20= (start-posn=20(event-start=20start-event))=0A+=20=20=20=20=20=20=20=20=20= (start-point=20(posn-point=20start-posn))=0A+=20=20=20=20=20=20=20=20=20= (start-window=20(posn-window=20start-posn))=0A+=20=20=20=20=20=20=20=20=20= (bounds=20(window-edges=20start-window))=0A+=20=20=20=20=20=20=20=20=20= (top=20(nth=201=20bounds))=0A+=20=20=20=20=20=20=20=20=20(bottom=20(if=20= (window-minibuffer-p=20start-window)=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20(nth=203=20bounds)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20(1-=20(nth=203=20bounds))))=0A+=20=20= =20=20=20=20=20=20=20event)=0A+=20=20=20=20(track-mouse=0A+=20=20=20=20=20= =20(while=20(progn=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(setq=20= event=20(read-event))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (mouse-movement-p=20event))=0A+=20=20=20=20=20=20=20=20(let=20((window=20= (posn-window=20(event-end=20event)))=0A+=20=20=20=20=20=20=20=20=20=20=20= =20=20=20(mouse-row=20(cddr=20(mouse-position))))=0A+=20=20=20=20=20=20=20= =20=20=20(if=20(and=20(eq=20window=20start-window)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20mouse-row=0A+=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20(<=3D=20top=20mouse-row=20(1-=20= bottom)))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20(mouse-set-point=20= event)=0A+=20=20=20=20=20=20=20=20=20=20=20=20(cond=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20((null=20mouse-row))=0A+=20=20=20=20=20=20=20=20=20=20= =20=20=20((<=20mouse-row=20top)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20= =20(mouse-scroll-subr=20start-window=20(-=20mouse-row=20top)=0A+=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20nil=20start-point=20(current-column)))=0A+=20=20=20=20=20=20= =20=20=20=20=20=20=20((>=3D=20mouse-row=20bottom)=0A+=20=20=20=20=20=20=20= =20=20=20=20=20=20=20(mouse-scroll-subr=20start-window=20(1+=20(-=20= mouse-row=20bottom))=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20nil=20start-point=20= (current-column))))))))))=0A+=0A+(defun=20= mouse--set-rectangular-region-selection-bindings=20(mod=20activate)=0A+=20= =20"Set=20global=20mouse=20bindings=20using=20MOD=20for=20rectangular=20= selection.=0A+If=20ACTIVATE=20is=20nil,=20remove=20those=20bindings."=0A= +=20=20(when=20mod=0A+=20=20=20=20(mouse--global-with-modifier=20= 'down-mouse-1=20mod=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20(and=20activate=20= 'mouse-drag-region-rectangle))))=0A+=0A+(defcustom=20= mouse-region-rectangle-modifier=20'meta=0A+=20=20"The=20modifier=20key=20= for=20rectangular=20region=20selection=20using=20the=20mouse.=0A+If=20= nil,=20mouse=20rectangular=20region=20selection=20is=20disabled."=0A+=20=20= :group=20'mouse=0A+=20=20:type=20'(choice=20(const=20:tag=20"None=20= (disabled)"=20nil)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (const=20meta)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (const=20control)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (const=20shift)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (const=20super)=0A+=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= (const=20hyper))=0A+=20=20:version=20"27.1"=0A+=20=20:set=20(lambda=20= (variable=20new-value)=0A+=20=20=20=20=20=20=20=20=20(when=20(boundp=20= 'mouse-region-rectangle-modifier)=0A+=20=20=20=20=20=20=20=20=20=20=20= (mouse--set-rectangular-region-selection-bindings=0A+=20=20=20=20=20=20=20= =20=20=20=20=20mouse-region-rectangle-modifier=20nil))=0A+=20=20=20=20=20= =20=20=20=20(set-default=20variable=20new-value)=0A+=20=20=20=20=20=20=20= =20=20(mouse--set-rectangular-region-selection-bindings=0A+=20=20=20=20=20= =20=20=20=20=20mouse-region-rectangle-modifier=20t)))=0A+=0A+=0C=0A=20= (defcustom=20mouse-buffer-menu-maxlen=2020=0A=20=20=20"Number=20of=20= buffers=20in=20one=20pane=20(submenu)=20of=20the=20buffer=20menu.=0A=20= If=20we=20have=20lots=20of=20buffers,=20divide=20them=20into=20groups=20= of=0A--=20=0A2.21.0=20(Apple=20Git-122)=0A=0A= --Apple-Mail=_9055E942-6BCB-4037-8CC3-7D965542314C--