黑洞寄存器(“ _”)的用途是什么?


15

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

Vim文档以这种方式描述它:

  1. 黑洞寄存器“ _

写入该寄存器时,没有任何反应。这可用于删除文本,而不会影响普通寄存器。从该寄存器读取时,不返回任何内容。

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

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

  • 该寄存器在其他一些用例中有用吗?如果是,哪个?

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

Answers:


18

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

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

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

这里的黑洞寄存器使我们可以在不破坏未命名寄存器和编号寄存器的情况下进行切割。

可能的用例很多,但毫不奇怪,它们非常相似:

  • 提供实际的“删除”,
  • 对寄存器(主要是未命名的寄存器)有更好的控制,
  • 使编号寄存器保持稳定状态,
  • 在保留未命名记录的推杆能力的同时削减一些东西,从而为我们提供“可重复推杆”,
  • 把一些东西放在你不关心的地方,
  • 防止脚本中出现副作用...

一个可以"0p用于“重复放置”场景(最常见的用例,因此在Vim文献中很普遍),但是该寄存器远没有"_其他场景有用。


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

5

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

:let @a=@_

这是清除注册表的一种方法"a


2
如果其他阅读此书的人像我那样想:“我想知道这是否是对的更短,更清晰的替换:call setreg('a', [])”:遗憾的是,答案是否定的。它的作用类似于:call setreg('a', '')(留下"a在的输出:registers命令。

@Rich对于未启动的人,保留"a其输出的意义是什么:registers
Alexej Magura

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

1

一种功能的一种实际用途。在波纹管功能中,#根据的结果添加和删除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>
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.