如何在vim宏中包含光标移动

时间:2012-01-05 13:00:25

标签: vim macros

宏似乎没有考虑到击键。在这种特殊情况下,我想编写一个注释掉一行的宏(在latex注释中以%开头)。以下是我正在使用的按键:

q + a + 0 + w + i + + j + j + j + q

将宏分配给a,转到行的开头,进入插入模式,放置百分号,退出插入模式,向下移动一行,然后结束宏。然后我像这样使用宏

@ +

如果我有4行像这样

1   In This life I have learned one thing █
2   It is pity incarnate of which I sing.
3   You have been told about the back of the crowd
4   And I repeat it, plenty loud.

使用宏三次导致此

1   %%%In This life I have learned one thing █
2   It is pity incarnate of which I sing.
3   You have been told about the back of the crowd
4   And I repeat it, plenty loud.

当我想要的是这个

1   %In This life I have learned one thing █
2   %It is pity incarnate of which I sing.
3   %You have been told about the back of the crowd
4   And I repeat it, plenty loud.

更具体地说,我希望能够做30 + @ + a 来评论30行。我该怎么做?

3 个答案:

答案 0 :(得分:5)

我会选择:

:.,+30 s/^\s*/&%

说明:

  • .,+30是从当前行到当前行+ 30(因此跨越31行)的范围(:help range
  • s是替换命令(:help :s
  • /是模式分隔符
  • ^\s*是一种模式(:help pattern),对应于一行开头的任意数量的空格
  • &是插入匹配模式的替换特殊字符

其他方式:

ab©d (cursor on the c)
efgh
ijkl

键入 CTRL-V 2jI,你好, Esc ,你得到:

abhellocd
efhellogh
ijhellokl

答案 1 :(得分:3)

Benoit的答案很好。

我认为你的宏应该是

I%<Esc>j

之后它只是

30@a

如果您将宏缩短为

I%<Esc>

您可以直观地选择所有行并执行

:'<,'>norm @a

或在Benoit的回答中处理范围。

您也可以跳过宏部分并使用VISUAL-BLOCK模式:

<C-v> " enter visual block mode
30G   " go to line 30
I%    " insert % at the beginning of selection
<Esc> " exit visual block mode

答案 2 :(得分:2)

您可以使用:normal命令。它的作用是将它的参数作为普通模式命令执行。它也可以给出一个范围,因此要在接下来的30行前面插入%,您可以输入:.,+30 norm I%I将vim置于插入模式,光标位于当前行的开头。由于您现在处于插入模式,%只会插入一个%字符。