有没有办法在vim中删除而不覆盖你的上一次猛拉?

ted*_*suo 262 vi vim

我爱vim,但一个常见的问题是:

  • 拉了一条线
  • 转到要粘贴的位置
  • 删除那里有什么
  • 粘贴你的猛拉,发现它粘贴你刚删除的东西

显然工作流程首先是删除,然后是第二个.但是,如果我没有这将是reeeeeaaaaaalllly不错来.有人有这个诀窍吗?vim是否有一个运行良好的粘贴缓冲区,或者我可以更改.vimrc设置吗?

das*_*ang 301

传递到_寄存器,黑洞.

要删除一行而不将其粘贴在寄存器中:

"_dd
Run Code Online (Sandbox Code Playgroud)

另见:help registers.

它可能是最安全的,如果你想要反复粘贴一些东西,把它拉到一个"命名"寄存器中.

"aY
Run Code Online (Sandbox Code Playgroud)

a登记册中划线.粘贴它"ap.

  • 我发现抓到"p"寄存器很有用.这样,粘贴是"pp (14认同)
  • 黑洞登记是这里的方式,但我有时会发现:Vp是一个很好的选择,因为它更短.请注意,未命名的寄存器将填充先前选择的文本. (13认同)
  • 哈,不知道黑洞登记.谢谢你的启示. (9认同)
  • +1提到黑洞注册. (3认同)
  • 粘贴插入模式`<ctrl> -ra`粘贴寄存器'a' (3认同)

mb1*_*b14 170

你的猛拉线应该仍然在寄存器0中.所以

"0p
Run Code Online (Sandbox Code Playgroud)

粘贴该行(并随时删除)

  • [`:help"0`](http://vimdoc.sourceforge.net/htmldoc/change.html#quote0):"编号寄存器0包含最近的yank命令中的文本,除非命令指定了另一个寄存器` "x`." (8认同)
  • 这可能是最简单但有效的解决方案!我发现我所需要的只是99%病例中最近的一次猛拉.而这个伎俩只是划伤了痒! (2认同)

Way*_*ett 87

默认情况下,所有yank和delete操作都会写入未命名的寄存器.但是,最近的删除和最近的删除始终(单独)存储在编号的寄存器中.该登记册0持有最近的一次猛拉.寄存器1-9保存最近的9个删除(最近的删除1).

换句话说,删除会覆盖未命名寄存器中最近的一个yank,但它仍然存在于0寄存器中."_dd其他答案中提到的黑洞寄存器技巧()可以工作,因为它可以防止覆盖未命名的寄存器,但这不是必需的.

您使用双引号引用寄存器,因此粘贴最近被拉出的文本可以这样做:

"0p
Run Code Online (Sandbox Code Playgroud)

这是一个很好的参考:

  • 这是迄今为止最好的答案.谢谢. (10认同)
  • 请注意,只有当yank或delete至少有一行时,才会使用1-9寄存器.http://vimdoc.sourceforge.net/htmldoc/change.html#quote_number (6认同)
  • 请注意,在插入模式下,您还可以使用“Ctrl-R 0”来粘贴最后的复制内容 (2认同)

kni*_*ttl 39

另一种可能性是:

像往常一样猛拉你的线条

转到要粘贴它们的位置,进入可视线模式(V)

选择要替换的行

点击p粘贴你的线条.

这也有额外的好处,缓冲区与被替换的内容"交换"

  • 您的"额外好处"实际上是一种阻碍,因为它会阻止您再次重复粘贴操作.正如顶部示例中所述**[here](http://vim.wikia.com/wiki/Replace_a_word_with_yanked_text)**.或者,**[这个问题](http://stackoverflow.com/questions/12625722/vim-toggling-buffer-overwrite-behavior-when-deleting/)**建议重新映射,这可能是最优雅的:`vnoremap p"_dp`和`vnoremap P"_dP`我认为这是与你的`v'结合的最佳解决方案 (5认同)
  • 您建议的好处正是OP 不想要的,也是他首先问这个问题的原因。 (2认同)

Jör*_*ann 23

我使用以下映射使删除黑洞寄存器更容易:

nnoremap R "_d
Run Code Online (Sandbox Code Playgroud)

这样一来,dd变得Rdd$R$.注意,R通常绑定进入替换模式,但我发现我从未使用过,因此最容易记住"真正删除"功能的密钥.

  • 我更喜欢`nnoremap d"_d`所以`dd`仍然是`dd`,同样也是'd $`等. (3认同)
  • 如果你这样做,不会成为"_d"_d(不是你想要的)? (2认同)

Pen*_*eck 8

" map paste, yank and delete to named register so the content
" will not be overwritten
nnoremap d "xd
vnoremap d "xd
nnoremap y "xy
vnoremap y "xy
nnoremap p "xp
vnoremap p "xp
Run Code Online (Sandbox Code Playgroud)


小智 5

我写了这个插件(yankstack.vim)来解决这个问题.它为你提供了像Emacs的杀戮戒指一样东西.您可以抽取或删除多个内容,执行粘贴,然后在您的已删除/已删除文本的历史记录中来回循环.我发现它更容易记住我把东西塞进去的寄存器.

在我的.vimrc中,我有这些映射:

nmap <M-p> <Plug>yankstack_substitute_older_paste
nmap <M-P> <Plug>yankstack_substitute_newer_paste
Run Code Online (Sandbox Code Playgroud)

让我点击ALT-p或ALT-SHIFT-p来循环我的粘贴历史记录.