diff options
author | zeertzjq <zeertzjq@outlook.com> | 2022-04-07 22:40:01 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-07 22:40:01 +0800 |
commit | abc157a6fd5ed2f09271ee3dd75d23d9ec3e0313 (patch) | |
tree | dde71e2d365e1d1eb49453eaf83fd3e03efc2619 /src/nvim/getchar.c | |
parent | dc9e436986bec15b027c2a8d78782f514c046a8b (diff) | |
parent | 64802da6c4304a2700d9471d17c0aae143d9aab1 (diff) | |
download | rneovim-abc157a6fd5ed2f09271ee3dd75d23d9ec3e0313.tar.gz rneovim-abc157a6fd5ed2f09271ee3dd75d23d9ec3e0313.tar.bz2 rneovim-abc157a6fd5ed2f09271ee3dd75d23d9ec3e0313.zip |
Merge pull request #18021 from zeertzjq/fix-clearing-reg-executing
Fix clearing of reg_executing
Diffstat (limited to 'src/nvim/getchar.c')
-rw-r--r-- | src/nvim/getchar.c | 21 |
1 files changed, 17 insertions, 4 deletions
diff --git a/src/nvim/getchar.c b/src/nvim/getchar.c index eddd5ccd14..299385cb17 100644 --- a/src/nvim/getchar.c +++ b/src/nvim/getchar.c @@ -2060,7 +2060,7 @@ static int handle_mapping(int *keylenp, bool *timedout, int *mapdepth) } /// unget one character (can only be done once!) -/// If the character was stuffed, vgetc() will get it next time it was called. +/// If the character was stuffed, vgetc() will get it next time it is called. /// Otherwise vgetc() will only get it when the stuff buffer is empty. void vungetc(int c) { @@ -2072,6 +2072,20 @@ void vungetc(int c) old_KeyStuffed = KeyStuffed; } +/// When peeking and not getting a character, reg_executing cannot be cleared +/// yet, so set a flag to clear it later. +void check_end_reg_executing(bool advance) +{ + if (reg_executing != 0 && (typebuf.tb_maplen == 0 || pending_end_reg_executing)) { + if (advance) { + reg_executing = 0; + pending_end_reg_executing = false; + } else { + pending_end_reg_executing = true; + } + } +} + /// Gets a byte: /// 1. from the stuffbuffer /// This is used for abbreviated commands like "D" -> "d$". @@ -2126,9 +2140,7 @@ static int vgetorpeek(bool advance) init_typebuf(); start_stuff(); - if (advance && typebuf.tb_maplen == 0) { - reg_executing = 0; - } + check_end_reg_executing(advance); do { // get a character: 1. from the stuffbuffer if (typeahead_char != 0) { @@ -2155,6 +2167,7 @@ static int vgetorpeek(bool advance) // If a mapped key sequence is found we go back to the start to // try re-mapping. for (;;) { + check_end_reg_executing(advance); // os_breakcheck() is slow, don't use it too often when // inside a mapping. But call it each time for typed // characters. |