nano-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[PATCH V2] input: allow distinguishing shifted from unshifted Meta keyst


From: Benno Schulenberg
Subject: [PATCH V2] input: allow distinguishing shifted from unshifted Meta keystrokes
Date: Wed, 11 Dec 2019 16:44:15 +0100

V2: Lowercase the default M-letter binds when 'set splitmeta' is used.

When the new option 'splitmeta' is set, nano will differentiate
between Meta+letter and Shift+Meta+letter.  In other words, typing
Alt+a will do something else than typing Alt+A, and binding M-a will
be different from binding M-A.
---
 src/global.c |  9 ++++++---
 src/nano.c   | 10 +++++++++-
 src/nano.h   |  3 ++-
 src/rcfile.c |  8 +++++---
 src/winio.c  | 10 ++++++----
 5 files changed, 28 insertions(+), 12 deletions(-)

diff --git a/src/global.c b/src/global.c
index d0ab509b..263aca2b 100644
--- a/src/global.c
+++ b/src/global.c
@@ -501,9 +501,12 @@ int keycode_from_string(const char *keystring)
        } else if (keystring[0] == 'M') {
                if (strcasecmp(keystring, "M-Space") == 0)
                        return (int)' ';
-               if (keystring[1] == '-' && strlen(keystring) == 3)
-                       return tolower((unsigned char)keystring[2]);
-               else
+               if (keystring[1] == '-' && strlen(keystring) == 3) {
+                       if (ISSET(SPLIT_META))
+                               return (unsigned char)keystring[2];
+                       else
+                               return tolower((unsigned char)keystring[2]);
+               } else
                        return -1;
        } else if (keystring[0] == 'F') {
                int fn = atoi(&keystring[1]);
diff --git a/src/nano.c b/src/nano.c
index 25a070b4..834f981e 100644
--- a/src/nano.c
+++ b/src/nano.c
@@ -1541,7 +1541,8 @@ void unbound_key(int code)
                if (code == '[')
                        statusline(ALERT, _("Unbindable key: M-["));
                else
-                       statusline(ALERT, _("Unbound key: M-%c"), 
toupper(code));
+                       statusline(ALERT, _("Unbound key: M-%c"),
+                                               ISSET(SPLIT_META) ? code : 
toupper(code));
        } else if (code == ESC_CODE)
                statusline(ALERT, _("Unbindable key: ^["));
        else if (code < 0x20)
@@ -2384,6 +2385,13 @@ int main(int argc, char **argv)
                for (size_t i = 0; i < sizeof(flags) / sizeof(flags[0]); i++)
                        flags[i] |= flags_cmdline[i];
        }
+
+       /* When using split Meta, change all letters after "M-" to lowercase. */
+       if (ISSET(SPLIT_META)) {
+               for (keystruct *chord = sclist; chord != NULL; chord = 
chord->next)
+                       if (chord->meta && chord->keystr[3] == '\0')
+                               chord->keystr[2] = tolower(chord->keystr[2]);
+       }
 #endif /* ENABLE_NANORC */
 
        if (hardwrap == 0)
diff --git a/src/nano.h b/src/nano.h
index ba05501c..a568b419 100644
--- a/src/nano.h
+++ b/src/nano.h
@@ -537,7 +537,8 @@ enum
        LET_THEM_ZAP,
        BREAK_LONG_LINES,
        JUMPY_SCROLLING,
-       EMPTY_LINE
+       EMPTY_LINE,
+       SPLIT_META
 };
 
 /* Flags for the menus in which a given function should be present. */
diff --git a/src/rcfile.c b/src/rcfile.c
index 469c4ce2..bb88656d 100644
--- a/src/rcfile.c
+++ b/src/rcfile.c
@@ -89,6 +89,7 @@ static const rcoption rcopts[] = {
 #ifdef ENABLE_SPELLER
        {"speller", 0},
 #endif
+       {"splitmeta", SPLIT_META},
        {"suspend", SUSPEND},
        {"tabsize", 0},
        {"tempfile", TEMP_FILE},
@@ -428,9 +429,10 @@ void parse_binding(char *ptr, bool dobind)
        keycopy[0] = toupper((unsigned char)keycopy[0]);
        keycopy[1] = toupper((unsigned char)keycopy[1]);
        if (keycopy[0] == 'M' && keycopy[1] == '-') {
-               if (strlen(keycopy) > 2)
-                       keycopy[2] = toupper((unsigned char)keycopy[2]);
-               else {
+               if (strlen(keycopy) > 2) {
+                       if (!ISSET(SPLIT_META))
+                               keycopy[2] = toupper((unsigned char)keycopy[2]);
+               } else {
                        jot_error(N_("Key name is too short"));
                        goto free_things;
                }
diff --git a/src/winio.c b/src/winio.c
index b702a30c..d905aadd 100644
--- a/src/winio.c
+++ b/src/winio.c
@@ -401,9 +401,11 @@ int parse_kbinput(WINDOW *win)
                                                key_buffer_len == 0 || 
*key_buffer == ESC_CODE) {
                                /* One escape followed by a single non-escape:
                                 * meta key sequence mode. */
-                               if (!solitary || (keycode >= 0x20 && keycode < 
0x7F))
+                               if (!solitary || (keycode >= 0x20 && keycode < 
0x7F)) {
                                        meta_key = TRUE;
-                               retval = tolower(keycode);
+                                       retval = ISSET(SPLIT_META) ? keycode : 
tolower(keycode);
+                               } else
+                                       retval = tolower(keycode);
                        } else
                                /* One escape followed by a non-escape, and 
there
                                 * are more codes waiting: escape sequence 
mode. */
@@ -478,7 +480,7 @@ int parse_kbinput(WINDOW *win)
                                                 * or control character 
sequence mode. */
                                                if (!solitary) {
                                                        meta_key = TRUE;
-                                                       retval = 
tolower(keycode);
+                                                       retval = 
ISSET(SPLIT_META) ? keycode : tolower(keycode);
                                                } else
                                                        retval = 
get_control_kbinput(keycode);
                                        else {
@@ -507,7 +509,7 @@ int parse_kbinput(WINDOW *win)
                        if (key_buffer_len == 0) {
                                if (!solitary) {
                                        meta_key = TRUE;
-                                       retval = tolower(keycode);
+                                       retval = ISSET(SPLIT_META) ? keycode : 
tolower(keycode);
                                } else
                                        /* Three escapes followed by a 
non-escape, and no
                                         * other codes are waiting: normal 
input mode. */
-- 
2.24.1




reply via email to

[Prev in Thread] Current Thread [Next in Thread]