Re: Using shift+arrows to select text

Benno Schulenberg <[email protected]> Fri, 5 Oct 2018 20:04:19 +0200
Newsgroups gmane.editors.nano.general
Message-ID <[email protected]>
Hello Javier,

Op 05-10-18 om 10:26 schreef Javier Valencia:
> Hello list, I've seen that I can select text using shift+arrows in
> xfce4-terminal, but I wonder why can't I use them in other terminals like urxvt.

Thanks for reporting.

For me, <Shift+Left> and <Shift+Right> work fine.  It's just
<Shift+Up> and <Shift+Down> that don't work -- saying "Unbound key"
instead.  (It can be made to work, though, by using option -K, or
'set rebindkeypad' in your nanorc.)

> Is it something that urxvt needs to implement? or is it nano related?

The problem is that ncurses does not have default codes for
<Shift+Up> and <Shift+Down>, only for <Shift+Left> and <Shift+Right>:
KEY_SLEFT and KEY_SRIGHT.  But most terminals will create codes for
the missing combinations at startup.  So all we have to do is ask
ncurses for the codes for those combinations, and then nano can
recognize them.  See attached patch.

Benno

_______________________________________________
Help-nano mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/help-nano
0001-bindings-make-the-Shift-arrow-keys-work-by-default-o.patch (text/x-patch, 3.4 KB)
From ec5c28899684308a599ac3e6f8cc0e571aa605ce Mon Sep 17 00:00:00 2001
From: Benno Schulenberg <[email protected]>
Date: Fri, 5 Oct 2018 19:50:41 +0200
Subject: [PATCH] bindings: make the Shift+arrow keys work by default on more
 terminals

Ask ncurses for the codes for the Shift+arrow keys, so that also
<Shift+Up> and <Shift+Down> can be recognized, for which ncurses
doesn't have standard codes.

This fixes https://savannah.gnu.org/bugs/?54790.
Reported-by: Javier Valencia <[email protected]>
---
 src/global.c |  1 +
 src/nano.c   |  5 +++++
 src/nano.h   |  4 ++++
 src/proto.h  |  4 ++++
 src/winio.c  | 14 +++++++++++++-
 5 files changed, 27 insertions(+), 1 deletion(-)

diff --git a/src/global.c b/src/global.c
index 9aebe36f..1fd55156 100644
--- a/src/global.c
+++ b/src/global.c
@@ -71,6 +71,7 @@ int didfind = 0;
 int controlleft, controlright, controlup, controldown, controlhome, controlend;
 int controldelete, controlshiftdelete;
 #ifndef NANO_TINY
+int shiftleft, shiftright, shiftup, shiftdown;
 int shiftcontrolleft, shiftcontrolright, shiftcontrolup, shiftcontroldown;
 int shiftcontrolhome, shiftcontrolend;
 int altleft, altright, altup, altdown;
diff --git a/src/nano.c b/src/nano.c
index 89aaf0f3..5c9730c4 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -2579,6 +2579,11 @@ int main(int argc, char **argv)
 #ifndef NANO_TINY
 	controldelete = get_keycode("kDC5", CONTROL_DELETE);
 	controlshiftdelete = get_keycode("kDC6", CONTROL_SHIFT_DELETE);
+	/* Ask for the codes for Shift+Left/Right/Up/Down. */
+	shiftleft = get_keycode("kLFT", SHIFT_LEFT);
+	shiftright = get_keycode("kRIT", SHIFT_RIGHT);
+	shiftup = get_keycode("kUP", SHIFT_UP);
+	shiftdown = get_keycode("kDN", SHIFT_DOWN);
 	/* Ask for the codes for Shift+Control+Left/Right/Up/Down. */
 	shiftcontrolleft = get_keycode("kLFT6", SHIFT_CONTROL_LEFT);
 	shiftcontrolright = get_keycode("kRIT6", SHIFT_CONTROL_RIGHT);
diff --git a/src/nano.h b/src/nano.h
index 3beffe43..480e4c3c 100644
--- a/src/nano.h
+++ b/src/nano.h
@@ -597,6 +597,10 @@ enum
 #define SHIFT_ALT_RIGHT 0x432
 #define SHIFT_ALT_UP 0x433
 #define SHIFT_ALT_DOWN 0x434
+#define SHIFT_LEFT 0x451
+#define SHIFT_RIGHT 0x452
+#define SHIFT_UP 0x453
+#define SHIFT_DOWN 0x454
 #define SHIFT_HOME 0x455
 #define SHIFT_END 0x456
 #define SHIFT_PAGEUP 0x457
diff --git a/src/proto.h b/src/proto.h
index ec25c931..35ac4562 100644
--- a/src/proto.h
+++ b/src/proto.h
@@ -64,6 +64,10 @@ extern int controlend;
 #ifndef NANO_TINY
 extern int controldelete;
 extern int controlshiftdelete;
+extern int shiftleft;
+extern int shiftright;
+extern int shiftup;
+extern int shiftdown;
 extern int shiftcontrolleft;
 extern int shiftcontrolright;
 extern int shiftcontrolup;
diff --git a/src/winio.c b/src/winio.c
index 8ba37e42..10331e28 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -543,7 +543,19 @@ int parse_kbinput(WINDOW *win)
 		return CONTROL_DELETE;
 	else if (retval == controlshiftdelete)
 		return CONTROL_SHIFT_DELETE;
-	else if (retval == shiftcontrolleft) {
+	else if (retval == shiftleft) {
+		shift_held = TRUE;
+		return KEY_LEFT;
+	} else if (retval == shiftright) {
+		shift_held = TRUE;
+		return KEY_RIGHT;
+	} else if (retval == shiftup) {
+		shift_held = TRUE;
+		return KEY_UP;
+	} else if (retval == shiftdown) {
+		shift_held = TRUE;
+		return KEY_DOWN;
+	} else if (retval == shiftcontrolleft) {
 		shift_held = TRUE;
 		return CONTROL_LEFT;
 	} else if (retval == shiftcontrolright) {
-- 
2.17.1
signature.asc (application/pgp-signature, 833 B)
-----BEGIN PGP SIGNATURE-----

iQIzBAEBCgAdFiEEv9AJBh5TUFKtDfIVDSjU0qCs6IQFAlu3p6sACgkQDSjU0qCs
6IRgAQ/8CGsVJwqtSIf0JvJ36XuIwU3x+gKxpyt92kYNOBR89KrLkQGcUUB6+5uf
zaBMbr0uYttcxRj10YPpl3RZM8sMNC/VUqIdLd4vWpb9Jwtg3Z5+qItYOVpe16xq
QtHaCmyGzLJIPqQVPGqDsnX1Lz/846PjQSPCOKnDsuAeMj1wa6YJto5K2kp/5KNF
R80cv6+3BSDRSE1NAYlV6/gn+/Vd7XeaUHstOlVq4dYpdhOfG3rLxYKnfTVYtbaz
hlOeA9njwXf6b8MTHXGO34j4peTX9gZg1MVEC9l9rH30fZzOPEBWZQszsU2OUnfB
7jgt25VFq1WaZfbMgfvFKm6war+1PtHRdKHUNXYp9qSSBgZWSVQpOKT1jWvYFeKL
iINBu+0jEex7SdbxlSf15MMTyi949j7eUiwMliiqG8IDsifeFIFPQ6zSxK0ebBTc
oXwc7mfdYWmwjBN7LSrIJh6fz0Anye98z3tnG/JGMu7cFF55rrv0c7zWF1isoQ+F
RldsuLoY92Rb19qfb6o9LOFA0KfXNjSyDp2eVl4waQ9nSdAblVqDWzYi/fNP3Etf
D0KT+2xPN4I7Qr/FUvUXiNKH6oBlnXLd/ppDxrqPriyWneebn7B7MaNIpodEXDw2
+kIvN6gys0eXspITjFrtX+cxal1AuicOfCGvTh8EoT7pfqt4U1A=
=Qm6s
-----END PGP SIGNATURE-----