Vim 粘贴内部分隔符而不使用视觉选择
在Vim中,假设我想用另一个字符串的内容替换一个字符串的内容 原始输入Vim 粘贴内部分隔符而不使用视觉选择,vim,Vim,在Vim中,假设我想用另一个字符串的内容替换一个字符串的内容 原始输入 var1 = "January" var2 = "February" var1 = "January" var2 = "January" 所需输出 var1 = "January" var2 = "February" var1 = "January" var2 = "January" 我通常会做的是: 将光标移到第1行 yi“(yank内部引号) 将光标移动到第2行中的目标报价 vi”p(可视化选择内部引号,粘贴)
var1 = "January"
var2 = "February"
var1 = "January"
var2 = "January"
所需输出
var1 = "January"
var2 = "February"
var1 = "January"
var2 = "January"
我通常会做的是:
- 将光标移到第1行
y
i
(yank内部引号)“
- 将光标移动到第2行中的目标报价
v
i
”
(可视化选择内部引号,粘贴)p
虽然这很有效,但我通常尽量避免使用可视模式,因此我对第4步并不完全满意(
v
I
“
p
)
有没有办法在不使用视觉模式的情况下指定“目标粘贴区域”呢?我怀疑它可能是链接到
g
的东西,但我想不出任何东西。它不是特别漂亮,但下面是:
yi“
“\u di”hp
yi“j”\u di“hp
。为什么人们会觉得vim很吓人?;)
或者,将第一行正常拖动,然后下降到第二行,键入
ci“
,然后从菜单中选择先前拖动的文本。摘自my.vimrc:
" Delete to 'black hole' register
nnoremap <leader>d "_d
vnoremap <leader>d "_d
“删除到“黑洞”寄存器
nnoremap d“\u d
vnoremap d“\u d
因此,您只需将
\di“p
作为最后一步(假设您将\
用作
)。有很多方法可以做到这一点,但使用视觉模式是最简单的
- 使用黑洞寄存器删除内容,然后粘贴。e、 g.
“\u di”P
- Do
插入寄存器的内容ci“0
- 只需粘贴一个字符,然后移动到该字符上并删除旧文本。例如
pldt“
然而,视觉模式仍然有我的投票权。我发现大多数人担心的是,使用VisualMode+paste时,默认寄存器与所选文本交换,并且不会很好地重复。大家好消息!
0
寄存器始终存储最后一个yank。坏消息是视觉模式仍然不能很好地重复。更多信息,请看这一vimcast插曲。它提到了一些有助于解决这个问题的插件。有一个插件正好解决了这个问题。它可能是出于与您的感受相同的原因,即对于高级Vim用户来说,视觉模式通常感觉不太理想
–操作员用寄存器内容替换文本
安装了operator replace后,更换过程如下所示
yi"
j
gr
设置为替换操作符::映射gr(operator replace)
。选择您自己的映射。)
看看!这是真正优秀的/框架的一部分。没有它们我无法工作。我经常需要它,我编写了一个插件来简化并允许最大速度:
这个插件提供了一个二合一的
gr
命令,用寄存器的内容替换{motion}/text对象、整行或当前选择所覆盖的文本;旧文本被删除到黑洞寄存器中,即它消失了。它透明地处理许多拐角情况,并允许通过标准的
命令快速重复。如果您不喜欢它,它的页面上会有指向备选方案的链接。black hold register+1“我通常会尽可能避免使用视觉模式”。。。如果您不介意我问一下,为什么?使用操作员动作更改文本比使用视觉模式更可取,因为只有前者可以在
中可靠地重复。Drew Neil称之为“点公式”。对于第二种方法,我认为您应该像第一种方法一样使用黑洞寄存器(“\u ci”“
),或者使用0寄存器(ci“0
)。对于第三种方法,您必须从开始引用开始,而不是从内部开始,并且它不能满足可重复使用
(第一种方法也不能)。我猜那个进球是在@PeterRincker的回答之后加上的。@benjifisher谢谢。我已经纠正了第二个选项。我认为,如果通过
实现重复能力是最终目标,那么第二种方法可能是vim的最佳选择。然而,使用像Ingo Karkat这样的插件(在Vimcast一集中提到过)可能是维护
重复能力的最简单的解决方案。