diff options
| author | Tim Allen <screwtape@froup.com> | 2020-10-31 00:43:34 +1100 |
|---|---|---|
| committer | Tim Allen <screwtape@froup.com> | 2020-10-31 01:20:49 +1100 |
| commit | c039879c82544e1c0bfb75b197ff76e6d73cd10a (patch) | |
| tree | f2ed2a9e8438f7be0230ce420e3b15e2e25dca45 | |
| parent | 90043e7df04359ec9ef629fa46fc6a524673be84 (diff) | |
src/ncurses_ui.cc: Teach Kakoune about ctrl-symbol keys.
Previously, Kakoune only handled ctrl-codes less than 27, representing them as
lower-case ASCII codes. For regular keys like <c-a>, that worked fine. However,
NUL became the unorthodox <c-`> and other ctrl-symbols (<c-\>, <c-]>, <c-_>)
weren't supported at all.
Now NUL is rendered as the more comfortable <c-space>, and the other ctrl-symbol
codes are properly decoded.
Fixes #2553.
| -rw-r--r-- | src/keys.cc | 4 | ||||
| -rw-r--r-- | src/ncurses_ui.cc | 11 |
2 files changed, 15 insertions, 0 deletions
diff --git a/src/keys.cc b/src/keys.cc index 29fa9ce1..b6761584 100644 --- a/src/keys.cc +++ b/src/keys.cc @@ -229,6 +229,10 @@ UnitTest test_keys{[]() alt('j'), ctrl('r'), shift(Key::Up), + ctrl('['), + ctrl('\\'), + ctrl(']'), + ctrl('_'), }; String keys_as_str; for (auto& key : keys) diff --git a/src/ncurses_ui.cc b/src/ncurses_ui.cc index 14308c98..732f009f 100644 --- a/src/ncurses_ui.cc +++ b/src/ncurses_ui.cc @@ -623,8 +623,19 @@ Optional<Key> NCursesUI::get_next_key() kill(0, SIGTSTP); // We suspend at this line return {}; } + // Special case: you can type NUL with Ctrl-2 or Ctrl-Shift-2 or + // Ctrl-Backtick, but the most straightforward way is Ctrl-Space. + if (c == 0) + return ctrl(' '); + // Represent Ctrl-letter combinations in lower-case, to be clear + // that Shift is not involved. if (c < 27) return ctrl(c - 1 + 'a'); + // Represent Ctrl-symbol combinations in "upper-case", as they are + // traditionally-rendered. + // Note that Escape is handled elsewhere. + if (c < 32) + return ctrl(c - 1 + 'A'); struct Sentinel{}; struct CharIterator |
