From fdee0df84954e48a4186b8cf2d686ea7fa28bd5e Mon Sep 17 00:00:00 2001
From: Benno Schulenberg <bensberg@justemail.net>
Date: Tue, 11 Oct 2016 10:50:04 +0200
Subject: [PATCH] input: keep the Ctrl+Arrow keys working when their synonyms
 are unbound

This fixes https://savannah.gnu.org/bugs/?49058 reported by Rishabh Dave.
---
 src/global.c | 15 ++++++++++++++-
 src/winio.c  |  8 ++++----
 2 files changed, 18 insertions(+), 5 deletions(-)

diff --git a/src/global.c b/src/global.c
index eab922ba..ebfed9ad 100644
--- a/src/global.c
+++ b/src/global.c
@@ -410,9 +410,18 @@ void assign_keyinfo(sc *s, const char *keystring)
     assert(strlen(keystring) > 1 && (!s->meta || strlen(keystring) > 2));
 
     if (keystring[0] == '^') {
-	s->keycode = keystring[1] - 64;
 	if (strcasecmp(keystring, "^Space") == 0)
 	    s->keycode = 0;
+	else if (strcasecmp(keystring, "^Left") == 0)
+	    s->keycode = CONTROL_LEFT;
+	else if (strcasecmp(keystring, "^Right") == 0)
+	    s->keycode = CONTROL_RIGHT;
+	else if (strcasecmp(keystring, "^Up") == 0)
+	    s->keycode = CONTROL_UP;
+	else if (strcasecmp(keystring, "^Down") == 0)
+	    s->keycode = CONTROL_DOWN;
+	else
+	    s->keycode = keystring[1] - 64;
     } else if (s->meta) {
 	s->keycode = tolower((int)keystring[2]);
 	if (strcasecmp(keystring, "M-Space") == 0)
@@ -1113,6 +1122,8 @@ void shortcut_init(void)
     add_to_sclist(MMOST, "Left", do_left, 0);
     add_to_sclist(MMOST, "^F", do_right, 0);
     add_to_sclist(MMOST, "Right", do_right, 0);
+    add_to_sclist(MMOST, "^Left", do_prev_word_void, 0);
+    add_to_sclist(MMOST, "^Right", do_next_word_void, 0);
     add_to_sclist(MMOST, "M-Space", do_prev_word_void, 0);
     add_to_sclist(MMOST, "^Space", do_next_word_void, 0);
     add_to_sclist((MMOST & ~MBROWSER), "^A", do_home, 0);
@@ -1123,6 +1134,8 @@ void shortcut_init(void)
     add_to_sclist(MMAIN|MHELP|MBROWSER, "Up", do_up_void, 0);
     add_to_sclist(MMAIN|MHELP|MBROWSER, "^N", do_down_void, 0);
     add_to_sclist(MMAIN|MHELP|MBROWSER, "Down", do_down_void, 0);
+    add_to_sclist(MMAIN, "^Up", do_prev_block, 0);
+    add_to_sclist(MMAIN, "^Down", do_next_block, 0);
     add_to_sclist(MMAIN, "M-7", do_prev_block, 0);
     add_to_sclist(MMAIN, "M-8", do_next_block, 0);
 #ifndef DISABLE_JUSTIFY
diff --git a/src/winio.c b/src/winio.c
index 1573c61b..a1f6c0cf 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -495,13 +495,13 @@ int parse_kbinput(WINDOW *win)
 	return ERR;
 
     if (retval == controlleft)
-	return sc_seq_or(do_prev_word_void, controlleft);
+	return CONTROL_LEFT;
     else if (retval == controlright)
-	return sc_seq_or(do_next_word_void, controlright);
+	return CONTROL_RIGHT;
     else if (retval == controlup)
-	return sc_seq_or(do_prev_block, controlup);
+	return CONTROL_UP;
     else if (retval == controldown)
-	return sc_seq_or(do_next_block, controldown);
+	return CONTROL_DOWN;
 #ifndef NANO_TINY
     else if (retval == shiftcontrolleft) {
 	shift_held = TRUE;
-- 
GitLab