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

Rob*_*ose 53 vim vim-registers

vim中的寄存器是存储文本片段甚至对存储在其中的文本运行命令的一个很好的功能.但是,我是一个整洁的人,并在我完成后倾向于清理事情.

我知道如果我想清除注册a,我可以使用qaq.

我也可以执行以下命令:

:let @a = ''
Run Code Online (Sandbox Code Playgroud)

但是,这些解决方案似乎只是解决问题的方法.当我执行时:registers,列表仍然显示寄存器a(具有空值),而不显示从未使用过的寄存器.

有没有办法清除寄存器,从这个列表中删除寄存器的副作用?

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

Luc*_*tte 24

由于@romainl链接的邮件列表上的那个令人尊敬的答案,我们已经setreg('a', [])清除了寄存器.

因此,代码可能变为:

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

  • 哇 - 这实际上将它从`:registers`列表中删除了!谢谢!!^ ^ü (3认同)
  • 不适合我; `:exec setreg('a',[])`给我`E730:使用List作为字符串`,并且不会删除也不清空寄存器。 (2认同)

rom*_*inl 17

AFAIK您无法使用内置命令/函数使寄存器从列表中消失.这似乎是可行的,只有从你的~/.viminfo声音中删除它们听起来有点极端.

vim邮件列表中的这个线程有一个命令可以清除每个寄存器但它不会从:reg以下位置删除它们:

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


lak*_*tak 9

把它放在你的.vimrc:

command! WipeReg for i in range(34,122) | silent! call setreg(nr2char(i), []) | endfor
Run Code Online (Sandbox Code Playgroud)

并清除每个注册表 :WipeReg

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

autocmd VimEnter * WipeReg
Run Code Online (Sandbox Code Playgroud)


Mar*_*slo 6

删除.viminfo文件或删除文件中的注册行.viminfo.

您可以从这里获取详细信息:

The viminfo file is used to store:
- The command line history.
- The search string history.
- The input-line history.
- Contents of non-empty registers.
- Marks for several files.
- File marks, pointing to locations in files.
- Last search/substitute pattern (for 'n' and '&').
- The buffer list.
- Global variables
Run Code Online (Sandbox Code Playgroud)


DJM*_*hem 6

另一种选择是从不加载任何寄存器。正如其他人所说,寄存器是从加载的.viminfo。该-i标志用于指定要使用的viminfo文件。如果指定NONE,则不会输入viminfo,因此不会加载任何寄存器。

vim -i NONE
Run Code Online (Sandbox Code Playgroud)


Ric*_*ich 6

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

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


mMo*_*ntu 5

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

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
Run Code Online (Sandbox Code Playgroud)

这避免了在输出上包含额外的寄存器 :registers