aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaria José Solano <majosolano99@gmail.com>2023-09-02 19:34:09 -0700
committerGitHub <noreply@github.com>2023-09-03 10:34:09 +0800
commit517dfdf0fcf5c9c88c83dbb77a931b8e940b7472 (patch)
treeb87508979336d33fe0284623e7ac3745071b2a50
parent36cb3262b93d8e60f9c5bffc8c820838860b302c (diff)
downloadrneovim-517dfdf0fcf5c9c88c83dbb77a931b8e940b7472.tar.gz
rneovim-517dfdf0fcf5c9c88c83dbb77a931b8e940b7472.tar.bz2
rneovim-517dfdf0fcf5c9c88c83dbb77a931b8e940b7472.zip
fix(shada): update marks when using delmarks! (#24978)
-rw-r--r--src/nvim/mark.c19
-rw-r--r--test/functional/shada/marks_spec.lua22
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)