diff options
author | Maria José Solano <majosolano99@gmail.com> | 2023-09-02 19:34:09 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-03 10:34:09 +0800 |
commit | 517dfdf0fcf5c9c88c83dbb77a931b8e940b7472 (patch) | |
tree | b87508979336d33fe0284623e7ac3745071b2a50 | |
parent | 36cb3262b93d8e60f9c5bffc8c820838860b302c (diff) | |
download | rneovim-517dfdf0fcf5c9c88c83dbb77a931b8e940b7472.tar.gz rneovim-517dfdf0fcf5c9c88c83dbb77a931b8e940b7472.tar.bz2 rneovim-517dfdf0fcf5c9c88c83dbb77a931b8e940b7472.zip |
fix(shada): update marks when using delmarks! (#24978)
-rw-r--r-- | src/nvim/mark.c | 19 | ||||
-rw-r--r-- | test/functional/shada/marks_spec.lua | 22 |
2 files changed, 40 insertions, 1 deletions
diff --git a/src/nvim/mark.c b/src/nvim/mark.c index 6480a47344..06d0295c3d 100644 --- a/src/nvim/mark.c +++ b/src/nvim/mark.c @@ -925,7 +925,24 @@ void ex_delmarks(exarg_T *eap) if (*eap->arg == NUL && eap->forceit) { // clear all marks - clrallmarks(curbuf); + const Timestamp timestamp = os_time(); + for (size_t i = 0; i < NMARKS; i++) { + curbuf->b_namedm[i].mark.lnum = 0; + curbuf->b_namedm[i].timestamp = timestamp; + } + curbuf->b_last_cursor.timestamp = timestamp; + CLEAR_FMARK(&curbuf->b_last_cursor); + curbuf->b_last_cursor.mark.lnum = 1; + curbuf->b_last_insert.timestamp = timestamp; + CLEAR_FMARK(&curbuf->b_last_insert); + curbuf->b_last_change.timestamp = timestamp; + CLEAR_FMARK(&curbuf->b_last_change); + curbuf->b_op_start.lnum = 0; // start/end op mark cleared + curbuf->b_op_end.lnum = 0; + for (int i = 0; i < curbuf->b_changelistlen; i++) { + clear_fmark(&curbuf->b_changelist[i]); + } + curbuf->b_changelistlen = 0; } else if (eap->forceit) { emsg(_(e_invarg)); } else if (*eap->arg == NUL) { diff --git a/test/functional/shada/marks_spec.lua b/test/functional/shada/marks_spec.lua index a73e9a244d..7f03022ab8 100644 --- a/test/functional/shada/marks_spec.lua +++ b/test/functional/shada/marks_spec.lua @@ -272,4 +272,26 @@ describe('ShaDa support code', function() eq('Vim(normal):E20: Mark not set', exc_exec('normal! `a')) eq('Vim(normal):E20: Mark not set', exc_exec('normal! `.')) end) + + it('updates deleted marks with :delmarks!', function() + nvim_command('edit ' .. testfilename) + + nvim_command('mark A') + nvim_command('mark a') + feed('ggifoobar<esc>') + nvim_command('wshada') + + reset() + nvim_command('edit ' .. testfilename) + nvim_command('normal! `A`a`.') + nvim_command('delmarks!') + nvim_command('wshada') + + reset() + nvim_command('edit ' .. testfilename) + eq('Vim(normal):E20: Mark not set', exc_exec('normal! `a')) + eq('Vim(normal):E20: Mark not set', exc_exec('normal! `.')) + -- Make sure that uppercase marks aren't deleted. + nvim_command('normal! `A') + end) end) |