65

vim 中的寄存器是一个很棒的功能,可以存储文本片段,甚至可以对存储在其中的文本运行命令。但是,我是一个爱整洁的人,并且在完成后倾向于收拾东西。

我知道如果我想清除寄存器a,我可以使用qaq.

我还可以执行以下命令:

:let @a = ''

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

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

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

4

7 回答 7

35

由于邮件列表上由@romainl链接的那个古老的答案,我们已经setreg('a', [])清除了注册表。

因此,代码可以变成:

let regs=split('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-"', '\zs')
for r in regs
  call setreg(r, [])
endfor
于 2016-09-06T11:57:54.657 回答
19

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

- - 编辑 - -

不再需要上面的命令,但这里是好奇的细分:

" The value of variable regs is a string made up of all named
" and numbered registers, plus the search, small delete, and
" unnamed registers. A string can be used as a list for our
" use case so we use the most concise method. We could have
" done let regs = ['a', 'b', 'c', etc. instead.
let regs = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-"'

" We are going to iterate through the string so we initialize
" a loop counter with value 0.
let i = 0

" Here is our loop where we check at each iteration if the loop
" counter is smaller than the length of regs.
while (i < strlen(regs))

    " If it is, we programmatically assign an empty string
    " to each corresponding register
    exec 'let @' . regs[i] . ' = ""'

    " and we add 1 to the loop counter.
    let i = i + 1
endwhile

" Once we are done, we get rid of the variable we created above
" which is now unnecessary.
unlet regs
于 2013-10-17T15:38:40.890 回答
16

把它放在你的.vimrc

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

并清除每个寄存器:WipeReg

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

autocmd VimEnter * WipeReg
于 2016-12-06T19:25:19.620 回答
9

删除.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
于 2014-06-18T07:05:22.377 回答
7

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

vim -i NONE
于 2016-03-30T00:08:47.897 回答
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

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

于 2014-09-25T16:09:22.013 回答
3

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

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

于 2018-01-31T10:31:00.017 回答