有时我需要编写如下所示的长代码块:
a.id = b.id
a.name = b.name
a.host = b.host
a.port = b.port
...
目前我通过输入第一行来输入这个,然后输入下一个属性yy3pjf.lcw
,输入属性名称,然后f..j
重复下一个属性。
但我想知道是否有更快的方法来输入类似的东西?
有时我需要编写如下所示的长代码块:
a.id = b.id
a.name = b.name
a.host = b.host
a.port = b.port
...
目前我通过输入第一行来输入这个,然后输入下一个属性yy3pjf.lcw
,输入属性名称,然后f..j
重复下一个属性。
但我想知道是否有更快的方法来输入类似的东西?
如果我花时间事先考虑清楚,我会输入如下:
id
name
host
port
...
然后将输入的行 ( '[,']
) 转换为所需的结果:
:'[,']s/.*/a.& = b.&/
这匹配整行 ( .*
) 并在替换中使用结果 via &
。
如果您使用复制和粘贴方法,可以使用我的ChangeGlobally 插件来简化。在每个粘贴的行上,键入ll
( 转到id
要替换的第一部分的开头,然后键入gcename<Esc>
.gc
是插件映射,e
表示单词的结尾。在 之后<Esc>
,插件将自动更改第二个/以下出现。
yy3p
可以使用我的LineJuggler 插件简化复制和粘贴 ( ) ,该插件具有]d
复制行的命令。这里的确切等价物是V3]D
(它不短,但不会破坏默认寄存器)。
我建议这个映射(<F6>
是一个例子):
nnoremap <F6> yypww:s/<C-r><C-w>/
set gdefault
如果你的中没有~/.vimrc
,这个应该可以工作:
nnoremap <F6> yypww:s/<C-r><C-w>//g<Left><Left>
分解:
yyp " duplicate the line
ww " move to the attribute name
:s/<C-r><C-w>/ " insert the beginning of a :s command using the word under the cursor as pattern
在行动:
a.id = b.id
<F6>name<CR>
a.id = b.id
a.name = b.name
这是一个接近您已经习惯的解决方案,但击键次数更少。
假设您从第一行开始。使用E*
后跟 进行设置Y3p
。
a.id = b.id
a.id = b.id
a.id = b.id
a.id = b.id
现在进行更改:后跟. . . 完毕。ncename<Esc>
n.
ncehost<Esc>n.
nceport<Esc>n.
a.id = b.id
a.name = b.name
a.host = b.host
a.port = b.port
这种方法的优势在于它非常自然:使用日常命令进行高效编辑。而且重复击键的开销实际上很小。
在编辑文件时,我经常编造这种稍微重复的模式。但是一旦这样的编辑经常出现,并且您意识到这会花费您很多时间,我建议采取更严肃的方法,例如使用@IngoKarkat 的:s
命令、@romainl 的映射或宏。