如何清空 vim 中的所有寄存器?

如何清空 vim 中的所有寄存器?

如何删除 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_arrayNULL(参见ops.cVim 源代码)。

答案2

将其放入您的.vimrc

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

并清除所有寄存器:WipeReg

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

autocmd VimEnter * WipeReg

相关内容