diff options
author | Jerry <guanru0919@yahoo.com> | 2024-06-14 19:21:16 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-06-15 10:21:16 +0800 |
commit | 61aabe0730b547b733faaf74ff181ec8c33f8b92 (patch) | |
tree | b369b3555b8cccb6fbd2ecca9b70f5f9e30e2cbb | |
parent | 199d852d9f8584217be38efb56b725aa3db62931 (diff) | |
download | rneovim-61aabe0730b547b733faaf74ff181ec8c33f8b92.tar.gz rneovim-61aabe0730b547b733faaf74ff181ec8c33f8b92.tar.bz2 rneovim-61aabe0730b547b733faaf74ff181ec8c33f8b92.zip |
fix(defaults): default @/Q broken when 'ignorecase' is set (#29343)
Problem:
When 'ignorecase' is set, the default keymap Q and Q would exit visual
mode.
This issue was raised in #28287 and a fix was applied in #28289.
However, `==` operator is subject to user `ignorecase` setting.
Solution:
Switching to `==#` operator would guarantee case sensitive comparison
between visual mode and linewise visual mode.
Co-authored-by: Kuanju Chen <kuanju.chen@mksinst.com>
-rw-r--r-- | runtime/lua/vim/_defaults.lua | 4 | ||||
-rw-r--r-- | test/functional/editor/macro_spec.lua | 17 |
2 files changed, 19 insertions, 2 deletions
diff --git a/runtime/lua/vim/_defaults.lua b/runtime/lua/vim/_defaults.lua index 8e4562c8ba..630f2219c7 100644 --- a/runtime/lua/vim/_defaults.lua +++ b/runtime/lua/vim/_defaults.lua @@ -85,13 +85,13 @@ do vim.keymap.set( 'x', 'Q', - "mode() == 'V' ? ':normal! @<C-R>=reg_recorded()<CR><CR>' : 'Q'", + "mode() ==# 'V' ? ':normal! @<C-R>=reg_recorded()<CR><CR>' : 'Q'", { silent = true, expr = true, desc = ':help v_Q-default' } ) vim.keymap.set( 'x', '@', - "mode() == 'V' ? ':normal! @'.getcharstr().'<CR>' : '@'", + "mode() ==# 'V' ? ':normal! @'.getcharstr().'<CR>' : '@'", { silent = true, expr = true, desc = ':help v_@-default' } ) diff --git a/test/functional/editor/macro_spec.lua b/test/functional/editor/macro_spec.lua index 27c5eddac8..680a70b78a 100644 --- a/test/functional/editor/macro_spec.lua +++ b/test/functional/editor/macro_spec.lua @@ -148,6 +148,23 @@ helloFOO]] eq({ 0, 1, 1, 0 }, fn.getpos('v')) end) + it('can be recorded and replayed in Visual mode when ignorecase', function() + command('set ignorecase') + insert('foo BAR BAR foo BAR foo BAR BAR BAR foo BAR BAR') + feed('0vqifofRq') + eq({ 0, 1, 7, 0 }, fn.getpos('.')) + eq({ 0, 1, 1, 0 }, fn.getpos('v')) + feed('Q') + eq({ 0, 1, 19, 0 }, fn.getpos('.')) + eq({ 0, 1, 1, 0 }, fn.getpos('v')) + feed('Q') + eq({ 0, 1, 27, 0 }, fn.getpos('.')) + eq({ 0, 1, 1, 0 }, fn.getpos('v')) + feed('@i') + eq({ 0, 1, 43, 0 }, fn.getpos('.')) + eq({ 0, 1, 1, 0 }, fn.getpos('v')) + end) + it('can be replayed with @ in blockwise Visual mode', function() insert [[ hello |