使用Vim我经常想用我刚刚拉出的块替换代码块.
但是当我删除要替换的代码块时,该块本身会进入寄存器,该寄存器会擦除我刚刚移动的块.所以我习惯于yanking,然后插入,然后删除我不想要的东西,但是对于大块代码,这会变得混乱,试图保持插入的块和块分开删除.
那么在Vim中替换文本的最简单,最快捷的方法是什么?
有没有办法删除文本而不将其放入注册表?
有没有办法说例如"替换下一个单词"或"替换为下一个段落"
或者是以某种方式使用多寄存器功能的最佳方式?
Christian Be.. 421
要删除某些内容而不将其保存在寄存器中,可以使用"黑洞寄存器":
"_d
当然,您也可以使用任何其他不包含您感兴趣的寄存器.
要删除某些内容而不将其保存在寄存器中,可以使用"黑洞寄存器":
"_d
当然,您也可以使用任何其他不包含您感兴趣的寄存器.
是的.它比首先删除"旧"文本稍微复杂一点,但是:
我开始......
line1 line2 line3 line4 old1 old2 old3 old4
我shift+ v选择line1,第2,3和4行,并使用d命令删除它们
然后我以同样的方式删除旧的1-4行.
然后做
"2p
那将粘贴倒数第二个线(第1-4行)."3p
会做第三次,依此类推......
所以我最终得到了
line1 line2 line3 line4
参考: 编号寄存器上的Vim文档
VIM docs:编号寄存器0包含最近的yank命令中的文本,除非该命令指定了另一个带有["x]的寄存器.
例如,我们猛拉"foo"并删除"bar" - 注册表0仍然包含"foo"!因此可以粘贴"foo""0p
使用简单的映射很方便,可以用缓冲区替换当前选择.
例如,当你把它放在.vimrc中时
vmap r "_dP // it's a capital 'p' on the end
然后,在将某些内容复制到寄存器中(即使用"y")后,您只需选择要替换的文本,然后只需按键盘上的"r"即可.选择将替换为您当前的注册.
说明:
vmap - mapping for visual mode "_d - delete current selection into "black hole register" P - paste
我把以下内容放在我的vimrc中:
noremap y "*y noremap Y "*Y noremap p "*p noremap P "*P vnoremap y "*y vnoremap Y "*Y vnoremap p "*p vnoremap P "*P
现在我从剪贴板寄存器中抽出并放入,并且不必关心默认寄存器会发生什么.另一个好处是我可以轻松地从其他应用程序粘贴.我知道,我正在失去一些功能,但我无论如何都无法跟踪多个注册/剪贴板.
对于您提供的具体示例,如果我理解了问题,那么这可能有效:
*Highlight what you want to put somewhere else *delete (d) *Highlight the code that you want it to replace *paste (p)
默认情况下,所有yank和delete操作都会写入未命名的寄存器.但是,最近的删除和最近的删除始终(单独)存储在编号的寄存器中.该登记册0
持有最近的一次猛拉.寄存器1-9
保存最近的9个删除(最近的删除1
).
换句话说,删除会覆盖未命名寄存器中最近的一个yank,但它仍然存在于0
寄存器中."_dd
其他答案中提到的黑洞寄存器技巧()可以工作,因为它可以防止覆盖未命名的寄存器,但这不是必需的.
您使用双引号引用寄存器,因此粘贴最近被拉出的文本可以这样做:
"0p
这是一个很好的参考:
http://blog.sanctum.geek.nz/advanced-vim-registers/
要强调EBGreen说的话:
如果在选择文本时粘贴,则所选文本将替换为粘贴文本.
如果要复制某些文本然后将其粘贴到多个位置,请使用"0p
粘贴.编号寄存器0包含最近的yank命令中的文本.
此外,您可以列出所有寄存器的内容:
:registers
这个命令可以让你在做dbr的答案时更容易找出你想要的寄存器.您还会看到/,%,#个寄存器.(另见:help registers
)
最后,检查cW
并cW
更改包含但不包括尾随空格的单词.(使用资本W
包括标点符号.)
如果您正在使用Vim,那么您将拥有可视模式,这就像选择一样,但是使用分离模式的东西是vi/vim的基础.
你想要做的是使用可视模式选择源,然后猛拉,然后再次使用可视模式选择目标的范围,然后从默认缓冲区粘贴到文本.
例:
在一个文本文件中:
1| qwer 2| asdf 3| zxcv 4| poiu
按以下顺序:ggVjyGVkp
你将以:
1| qwer 2| asdf 3| qewr 4| asdf
解释:
gg
:去第一线
V
:用整行开始视觉模式
j
:向下走一行(选择在前一行开始,这使得选择向下增加一行)
y
:猛拉到默认缓冲区(两条选定的行,它会自动从可视模式退出)
G
:转到最后一行
V
:启动视觉模式(与之前相同)
k
:向上移动一行(如前所述,启用可视模式,这会使选择增加一行)
p
:粘贴(选择最后两行,它将用缓冲区中的任何内容替换那些行 - 在这种情况下为2行)
这有点不方便将最后一个块放在缓冲区上,所以不管怎样都不希望重复粘贴同一个东西,所以你需要将源保存到一个命名缓冲区,例如"ay
(到一个叫做"a"的缓冲区) "),并且用类似粘贴"ap
(但当时如果你编程,你可能不想贴几次,但创建一个函数并调用它,对吗?RIGHT?).
如果你只是使用vi,那么你必须使用隐形标记而不是视觉模式,:he mark
对于更多这方面,我很抱歉,但我对这个隐形标记的东西不是很好,我很鄙视视觉模式.
对于"替换单词",请尝试cw
正常模式.
对于"替换段落",请尝试cap
正常模式.
针对懒人的微创解决方案:
注册0
总是包含最后一个猛拉(如Rafael,alex2k8和idbrii已经提到过).不幸的是,一直选择寄存器0
可能非常烦人,所以如果默认p
使用它会很好"0
.这可以通过将以下行放入您的.vimrc
:
noremap p "0p noremap P "0P for s:i in ['"','*','+','-','.',':','%','/','=','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'] execute 'noremap "'.s:i.'p "'.s:i.'p' execute 'noremap "'.s:i.'P "'.s:i.'P' endfor
第一行将每个p
笔划映射到"0p
.但是,这会阻止p
访问任何其他寄存器.因此p
,具有显式选择的寄存器的所有笔划都映射到for循环中的等效命令行表达式.这样做也是如此P
.
这种方式保留了标准行为,但隐式p
和P
笔划除外,它们现在0
默认使用register .
提示1:剪切命令现在"0d
而不仅仅是d
.但是因为我很懒,这对我来说太长了;)因此我使用以下映射:
noremapd "0d noremap D "0D
\
默认情况下,领导键是您可以通过键入\d
或轻松剪切文本\D
.
提示2:多键映射的默认超时非常短.您可能希望增加它以便在选择寄存器时有更多时间.查看:help timeoutlen
详情,我正在使用:
set timeout timeoutlen=3000 ttimeoutlen=100
好吧,先做这个命令:
:h d
然后你会意识到你可以删除到特定的寄存器.这样您就不会改变默认寄存器中的内容.