我最近阅读了有关黑洞寄存器"_的信息,该寄存器是只写寄存器。

Vim文档是这样描述的:




黑洞寄存器“ _

写入此寄存器时,什么也不会发生。这可用于删除
文本而不会影响普通寄存器。从该寄存器中读取时,不会返回任何内容。


在我读过的所有文章和书中,作者总是使用相同的示例,即当我们需要删除某些文本而不删除以前要删除的内容时使用该寄存器。

我了解这种用法​​,但令我惊讶的是我找不到该寄存器的其他用例,这使我想到两个问题:


该寄存器有用吗?在其他一些用例中,如果是,是哪个?
如果我之前引用的用例中使用了该寄存器的唯一目的,为什么Vim的创建者决定使用这种寄存器来解决此问题。我的意思是nswer显示了该问题的解决方案,该问题意味着与使用"_相比,击键次数更少。使用"0还可以避免使用黑洞寄存器,为什么他们要创建它呢?


#1 楼

黑洞寄存器在与/dev/null相同的情况下使用:执行通常会输出某些内容但对该输出无用的动作。

Vim的默认行为是“剪切”,而不是“删除”。在大多数情况下,这并不重要,但有时,用户实际上可能需要“删除”。这就是黑洞寄存器的方便之处。

该寄存器在其他一些用例中有用吗?

这里的黑洞寄存器可以让我们切割东西而不会破坏未命名的寄存器寄存器和编号寄存器。

可能的用例很多,但都非常相似,这不足为奇:


提供实际的“删除”,
具有更好地控制寄存器(主要是未命名的寄存器),
将编号的寄存器保持在稳定状态,
在保留未命名寄存器的放置权的同时削减某些​​内容,从而为我们提供“可重复放置”的功能,
用一些您不关心的东西,
防止脚本中的副作用...

对于“重复放置”情形(最常见的用例,因此可以使用"0p)在Vim文献中普遍存在),但对于其他情况,该寄存器远没有"_有用。

评论


我将您的用例更多地看做是该寄存器行为的后果,但是我认为您的答案用以下内容清楚地描述了该寄存器:“黑洞寄存器是在这里,我们可以在不破坏未命名寄存器和编号寄存器的情况下切割东西。”期待其他答案,但这似乎是该寄存器的唯一用途。非常感谢您的回答!

–statox♦
15年5月27日在5:40

#2 楼

除了删除文本,您还可以使用黑洞寄存器删除其他寄存器。示例:

:let @a=@_


这是清除寄存器"a的一种方法。

评论


如果其他任何人都读过:“我想知道这是否是对:call setreg('a',[])的更短,更清晰的替换”,就像我所做的那样:很遗憾,答案是否定的。它的行为类似于:call setreg('a','')(在:registers命令的输出中保留“ a”。

–丰富
18-3-5在15:42



@Rich在未注册的:registers输出中保留“ a”的意义是什么?

–́Alexej Magura
19年6月7日在18:41

@AlexejMagura好吧,如果您的目标是整理在查看寄存器内容时看到的内容,那么留下一堆空寄存器可能不是理想的选择。我不确定删除的寄存器和现有的寄存器是否为空之间是否还有其他实际区别。

–丰富
19年7月10日在10:53

#3 楼

一种功能的一种实际用途。在波纹管功能中,根据#的结果添加和删除了Python注释getline('.')[0]。如果该行中有注释,则会删除char #,但是在这种情况下,我们不希望它与默认寄存器混淆。

function! ToggleComment()
    let l:win_view = winsaveview()
    if getline('.')[0] == "#"
        normal! 0"_x
    else
        normal! I#
    endif
    call winrestview(l:win_view)
endfunction
nnoremap <Leader>t :call ToggleComment()<CR>
vnoremap <Leader>t <C-o>:call ToggleComment()<CR>