From aff618536bb6a8a149f11ced73dd07e34dea19db Mon Sep 17 00:00:00 2001 From: Barrett Ruth <62671086+barrettruth@users.noreply.github.com> Date: Mon, 6 Jul 2026 08:40:17 -0500 Subject: [PATCH] fix(shada): persist cleared registers #40601 Problem: Clearing a register via `:let @a = ""` doesn't persist in shada. Solution: Follows the precedent of ee56daebb6468075e743db0d605cb3f2a1699419 . Namely, when the live register is empty and *at least as recent* as the copy that is on disk, drop it instead of writing it back. --- src/nvim/shada.c | 7 ++++++ test/functional/shada/merging_spec.lua | 33 ++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/src/nvim/shada.c b/src/nvim/shada.c index 9a9bf15741..8d8abcaa91 100644 --- a/src/nvim/shada.c +++ b/src/nvim/shada.c @@ -1806,6 +1806,13 @@ static inline ShaDaWriteResult shada_read_when_writing(FileDescriptor *const sd_ shada_free_shada_entry(&entry); break; } + if (wms->registers[idx].type == kSDItemMissing) { + const yankreg_T *const reg = op_reg_get(entry.data.reg.name); + if (reg != NULL && reg_empty(reg) && reg->timestamp >= entry.timestamp) { + shada_free_shada_entry(&entry); + break; + } + } COMPARE_WITH_ENTRY(&wms->registers[idx], entry); break; } diff --git a/test/functional/shada/merging_spec.lua b/test/functional/shada/merging_spec.lua index 825bad22a6..d5744d42f1 100644 --- a/test/functional/shada/merging_spec.lua +++ b/test/functional/shada/merging_spec.lua @@ -941,6 +941,39 @@ describe('ShaDa registers support code', function() end eq(1, found) end) + + it('does not restore a register cleared with :let @a = ""', function() + command('let @a = "hello"') + command('wshada ' .. shada_fname) + + reset({ shadafile = shada_fname }) + eq('hello', fn.getreg('a')) + command('let @a = ""') + command('wshada ' .. shada_fname) + + local found = 0 + for _, v in ipairs(read_shada_file(shada_fname)) do + if v.type == 5 and v.value.n == ('a'):byte() then + found = found + 1 + end + end + eq(0, found) + + reset({ shadafile = shada_fname }) + eq('', fn.getreg('a')) + end) + + it('keeps an on-disk register that the instance never set', function() + wshada('\005\001\015\131\161na\162rX\194\162rc\145\196\001-') + command('wshada ' .. shada_fname) + local found = 0 + for _, v in ipairs(read_shada_file(shada_fname)) do + if v.type == 5 and v.value.n == ('a'):byte() then + found = found + 1 + end + end + eq(1, found) + end) end) describe('ShaDa jumps support code', function()