3

有时我需要编写如下所示的长代码块:

a.id = b.id
a.name = b.name
a.host = b.host
a.port = b.port
...

目前我通过输入第一行来输入这个,然后输入下一个属性yy3pjf.lcw,输入属性名称,然后f..j重复下一个属性。

但我想知道是否有更快的方法来输入类似的东西?

4

4 回答 4

7

如果我花时间事先考虑清楚,我会输入如下:

id
name
host
port
...

然后将输入的行 ( '[,']) 转换为所需的结果:

:'[,']s/.*/a.& = b.&/

这匹配整行 ( .*) 并在替换中使用结果 via &

于 2013-09-03T12:00:17.077 回答
1

如果您使用复制和粘贴方法,可以使用我的ChangeGlobally 插件来简化。在每个粘贴的行上,键入ll( 转到id要替换的第一部分的开头,然后键入gcename<Esc>.gc是插件映射,e表示单词的结尾。在 之后<Esc>,插件将自动更改第二个/以下出现。

yy3p可以使用我的LineJuggler 插件简化复制和粘贴 ( ) ,该插件具有]d复制行的命令。这里的确切等价物是V3]D(它不短,但不会破坏默认寄存器)。

于 2013-09-03T12:07:42.973 回答
1

我建议这个映射(<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
于 2013-09-03T12:04:20.850 回答
0

这是一个接近您已经习惯的解决方案,但击键次数更少。

假设您从第一行开始。使用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 的映射或宏。

于 2013-09-03T16:38:40.833 回答