重播vim宏,直到缓冲区结束


85

我想x在vim中运行一个刚记录在寄存器“ ”中的宏,该宏在打开的缓冲区的每一行中,从我的光标到缓冲区的结尾。我怎么做?

我知道我可以将宏重播n次:

15@x

...或者按住@直到我到达最后一行,但我只想敲击几下并完成操作。

提前致谢。


15 @ x在Windows gVIM上不起作用
Shi Mingjiang Shi

Answers:


101

就我个人而言

VG:normal @x

编辑:将寄存器更改为您指定的寄存器。


好东西。我喜欢这种解决方案仅在选定区域上运行。
凯文,

我将此映射到nnoremap <C-@> VG:norm @ q <CR>
PAS

我使用宏“ 1z =] s尝试了此操作,但是它仅对每行的第一个单词进行拼写固定,而其余的跳过。
elig

@elig您可能想创建一个递归宏,该宏将在所有行上找到缺失的单词。
拉曼

67

您可以做(在命令模式下)

:%normal @x

我喜欢这种解决方案,但il将在缓冲区的每一行上执行宏,OP仅从其光标向末尾询问。
Porunga

24

制作递归宏:

qa@aq

例如:

qa0gUwj@aq

它会使用单个@a来从当前行到文件末尾UPCASE第一个单​​词。但是请确保“一个寄存器为空:

let @a=""

3
优秀。该方法比该%:normal方法更有用,因为它支持宏内的任何行移动,因此在行的形式不相同时很有用。我发现创建宏“ a”来定义动作,然后让宏“ b”执行递归位(即qb @ a @ bq)更加容易。
Paul Ruane 2014年

3
如果您的宏涉及搜索,请避免这种情况,因为它将从顶部继续。ctrl-c如果发生这种情况就停止!
伊恩·巴拉德

3
@IainBallard,:set nowrapscan使其失败并在到达文件末尾时停止。
ericbn

1
要清除寄存器a,只需qaq在宏之前执行:qaqqa0gUwj@aq。此外,如果您忘记将@q末尾放置,则始终qA可以开始添加寄存器,然后执行@q。我通常出于某种原因向reg q记录,因为它很容易(特别是对于递归宏),通常最终qqqqqgUiwj@qq代替两个宏。前三个q清除寄存器q,后两个清除q记录。参见vim.wikia.com/wiki/Record_a_recursive_macro
dylnmc '18年

我认为要清除a寄存器可能是一种简单的类型qaq
PeterPerháč18年

11

999999@x,除非您有很大的缓冲区...


6
为什么不直接%:normal @x1,$:normal @x
内森·费尔曼

3
这绝对是一个更优雅的解决方案-我想99999@x这只是您急忙想出的自然方法:)
彼得

2
除非您正好有999999行,否则9999999 @ x不会在最后一行运行多次吗?
大卫·奥尼尔

2
刚刚尝试过。挂起会话。可能会继续运行一百万次,而不会在行尾停止。
CDR

1
至少在某些情况下,这不会达到预期的效果。考虑在宏中查找下一个/查找上一个。因此,一旦宏重复到达文件末尾,它将从头开始继续。关于该主题的vim doc。为了防止搜索换行,可能需要使用:set nowrapscan。这是我可以提出的一个例子,但这并不意味着没有其他例子了。:%normal @x是@ryan_s在上面的答案中建议的一种方法。
谢尔盖·马尔科洛夫

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.