如何删除 vim 中所有寄存器关联的值?
我发现此片段在网上:
function! ClearRegisters()
let regs='abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789/-="*+'
let i=0
while (i<strlen(regs))
exec 'let @'.regs[i].'=""'
let i=i+1
endwhile
endfunction
command! ClearRegisters call ClearRegisters()
它几乎可以正常工作,但它会将一个空值放入每个寄存器,而不是删除寄存器。至关重要的是,这意味着当您使用该:registers
命令时,所有寄存器仍然存在,这使得显示变得繁琐(尽管值得注意的是,如果您退出 vim 并重新加载它,则寄存器将被完全清空,即使viminfo
设置为保存它们)。
我怎么能够充分删除所有寄存器,这样:registers
就不会显示它们,并且无需重新启动?
答案1
与标记(具有:delmarks
命令和特殊的“未设置”值)不同,寄存器不能被删除。空寄存器是最接近“未使用”状态的寄存器。(但是,Vim 和命令:registers
确实具有您所观察到的特殊行为,即未从维明信息文件在输出中被跳过。)
我认为你更想要的是扩展的:Registers
自定义命令(你甚至可以用 a:cmap
或别名插件)从其输出中省略了空寄存器,如下所示:
function! s:Registers( arguments )
redir => l:registersOutput
silent! execute 'registers' a:arguments
redir END
for l:line in split(l:registersOutput, "\n")
if l:line !~# '^"\S\s*$'
echo l:line
endif
endfor
endfunction
command! -nargs=? Registers call <SID>Registers(<q-args>)
或者,您可以编写 Vim 补丁来引入:delregisters
命令。编写起来应该不太难;它基本上必须将结构设置y_regs[i].y_array
为NULL
(参见ops.c
Vim 源代码)。
答案2
将其放入您的.vimrc
:
command! WipeReg for i in range(34,122) | silent! call setreg(nr2char(i), []) | endfor
并清除所有寄存器:WipeReg
如果你希望每次启动 Vim 时都发生这种情况,请添加:
autocmd VimEnter * WipeReg