aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2024-02-03 11:05:38 +0800
committerGitHub <noreply@github.com>2024-02-03 11:05:38 +0800
commit6709f7f8f130377f44c36b2150a167a2afcbdff9 (patch)
treeea4c270eccd08d938ea469ff61c70746141b0cd9
parent9ab9cde2ca7b917a894068698ef2fec3a851fdd5 (diff)
downloadrneovim-6709f7f8f130377f44c36b2150a167a2afcbdff9.tar.gz
rneovim-6709f7f8f130377f44c36b2150a167a2afcbdff9.tar.bz2
rneovim-6709f7f8f130377f44c36b2150a167a2afcbdff9.zip
fix(keycodes): simplify S- properly when D- is present (#27316)
-rw-r--r--src/nvim/keycodes.c11
-rw-r--r--test/functional/ui/input_spec.lua14
2 files changed, 21 insertions, 4 deletions
diff --git a/src/nvim/keycodes.c b/src/nvim/keycodes.c
index c45ad83204..c910d0955a 100644
--- a/src/nvim/keycodes.c
+++ b/src/nvim/keycodes.c
@@ -758,17 +758,20 @@ static int extract_modifiers(int key, int *modp, const bool simplify, bool *cons
{
int modifiers = *modp;
- // Command-key and ctrl are special
- if (!(modifiers & MOD_MASK_CMD) && !(modifiers & MOD_MASK_CTRL)) {
- if ((modifiers & MOD_MASK_SHIFT) && ASCII_ISALPHA(key)) {
- key = TOUPPER_ASC(key);
+ if ((modifiers & MOD_MASK_SHIFT) && ASCII_ISALPHA(key)) {
+ key = TOUPPER_ASC(key);
+ // With <C-S-a> we keep the shift modifier.
+ // With <S-a>, <A-S-a> and <S-A> we don't keep the shift modifier.
+ if (!(modifiers & MOD_MASK_CTRL)) {
modifiers &= ~MOD_MASK_SHIFT;
}
}
+
// <C-H> and <C-h> mean the same thing, always use "H"
if ((modifiers & MOD_MASK_CTRL) && ASCII_ISALPHA(key)) {
key = TOUPPER_ASC(key);
}
+
if (simplify && (modifiers & MOD_MASK_CTRL)
&& ((key >= '?' && key <= '_') || ASCII_ISALPHA(key))) {
key = CTRL_CHR(key);
diff --git a/test/functional/ui/input_spec.lua b/test/functional/ui/input_spec.lua
index 80862b668f..b2899bf82d 100644
--- a/test/functional/ui/input_spec.lua
+++ b/test/functional/ui/input_spec.lua
@@ -29,6 +29,10 @@ describe('mappings', function()
end
before_each(function()
+ add_mapping('<A-l>', '<A-l>')
+ add_mapping('<A-L>', '<A-L>')
+ add_mapping('<D-l>', '<D-l>')
+ add_mapping('<D-L>', '<D-L>')
add_mapping('<C-L>', '<C-L>')
add_mapping('<C-S-L>', '<C-S-L>')
add_mapping('<s-up>', '<s-up>')
@@ -61,7 +65,17 @@ describe('mappings', function()
end)
it('ok', function()
+ check_mapping('<A-l>', '<A-l>')
+ check_mapping('<A-L>', '<A-L>')
+ check_mapping('<A-S-l>', '<A-L>')
+ check_mapping('<A-S-L>', '<A-L>')
+ check_mapping('<D-l>', '<D-l>')
+ check_mapping('<D-L>', '<D-L>')
+ check_mapping('<D-S-l>', '<D-L>')
+ check_mapping('<D-S-L>', '<D-L>')
+ check_mapping('<C-l>', '<C-L>')
check_mapping('<C-L>', '<C-L>')
+ check_mapping('<C-S-l>', '<C-S-L>')
check_mapping('<C-S-L>', '<C-S-L>')
check_mapping('<s-up>', '<s-up>')
check_mapping('<c-s-up>', '<c-s-up>')