如何有效地清除vim寄存器?

如何有效地清除vim寄存器?,vim,vim-registers,Vim,Vim Registers,vim中的寄存器是存储文本片段甚至对其中存储的文本运行命令的强大功能。然而,我是一个整洁的人,当我完成的时候,我倾向于清理东西 我知道如果我想清除registera,我可以使用qaq 我还可以执行以下命令: :let @a = '' 然而,这些解决方案似乎只是解决问题的一个办法。当我执行:registers时,列表仍然显示registera(带有空值),而不显示从未使用过的寄存器 是否有一种方法可以清除一个寄存器,从而产生从列表中删除该寄存器的副作用 如果是这样,是否还有一种方法可以一次清除所

vim中的寄存器是存储文本片段甚至对其中存储的文本运行命令的强大功能。然而,我是一个整洁的人,当我完成的时候,我倾向于清理东西

我知道如果我想清除register
a
,我可以使用qaq

我还可以执行以下命令:

:let @a = ''
然而,这些解决方案似乎只是解决问题的一个办法。当我执行
:registers
时,列表仍然显示register
a
(带有空值),而不显示从未使用过的寄存器

是否有一种方法可以清除一个寄存器,从而产生从列表中删除该寄存器的副作用


如果是这样,是否还有一种方法可以一次清除所有寄存器,即重置寄存器列表?

好的,您不能使用内置命令/函数使寄存器从列表中消失。这似乎只有从
~/.viminfo
中删除它们才可行,这听起来有点极端

有一个清除每个寄存器的命令,但它不会将它们从
:reg
中删除:

let regs='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-"' | let i=0 | while (i<strlen(regs)) | exec 'let @'.regs[i].'=""' | let i=i+1 | endwhile | unlet regs

让regs='abcdefghijklmnopqrstuvwxyzabcdefghijklmnopqrstuvwxyzo123456789/-“;让i=0,而(i删除
.viminfo
文件或删除
.viminfo
文件中的寄存器行

您可以从以下网站获取详细信息:


可以为每个使用的寄存器设置一个值,类似于Romaill的方法:

function! ClearRegisters()
   redir => l:register_out
   silent register
   redir end
   let l:register_list = split(l:register_out, '\n')
   call remove(l:register_list, 0) " remove header (-- Registers --)
   call map(l:register_list, "substitute(v:val, '^.\\(.\\).*', '\\1', '')")
   call filter(l:register_list, 'v:val !~ "[%#=.:]"') " skip readonly registers
   for elem in l:register_list
      execute 'let @'.elem.'= ""'
   endfor
endfunction

这避免了在
:registers

的输出中包含额外的寄存器。另一个选项是从不加载任何寄存器。正如其他人所说,寄存器从
.viminfo
加载。
-i
标志用于指定要使用的viminfo文件。如果指定
,则无viminfo,因此无寄存器rs将被加载

vim -i NONE

由于邮件列表上的答案是由链接而成的,因此我们有
setreg('a',[])
来清除注册表

因此,该准则可以成为:

let regs=split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-"', '\zs')
for r in regs
  call setreg(r, [])
endfor

把这个放到你的
.vimrc

command! WipeReg for i in range(34,122) | silent! call setreg(nr2char(i), []) | endfor
并用
:WipeReg

如果您希望每次启动Vim时都发生这种情况,还可以添加:

autocmd VimEnter * WipeReg

为了完整起见,我要注意,虽然将寄存器设置为包含空字符串不会从
:registers
命令的输出中删除寄存器,但Vim不会将以这种方式清除的寄存器保存到
.viminfo
文件中


因此,从列表中删除特定寄存器的另一个快速而肮脏的替代方法是使用您建议的任一命令清除它们,然后重新启动Vim。

Wow-这实际上将它从
:registers
列表中删除!谢谢!!^u^不适合我;
:exec setreg('a',[])
给出了
E730:将列表用作字符串,并且不删除或清空寄存器。在某个时间点,vim已开始拒绝
:let a=1
+
:let a={}
。在去年,这一版本被还原。我怀疑您在这两个补丁之间的某个地方编译了一个vim版本。@dgmstuart,您的理解是正确的。因此,似乎在寄存器中附加一个空列表后,它没有被修改。@Atralb注意:它不是
:执行
,而是
:调用
。使用
exe
,您尝试执行
setreg()
的结果,该结果应为0(没有返回值的函数将在vim脚本中返回0),这意味着这将执行
:0
,IOW,它将光标移动到第一行。关于nvim,我不知道。尝试查看
:h setreg()
在nvim存在某些特定参数组合的情况下返回。可能您应该尝试在nvim邮件列表中询问——我猜有一个。嗯。同样的策略也可以清除搜索寄存器。
:map:let@/=”“
遗憾的是,它不能满足OP的要求。我想我不是一个整洁的人——我从不看
:reg
下面。这很好,但当然你失去了.viminfo文件的好处。这很不幸。这仍然是一个有效的方法。
autocmd VimEnter * WipeReg