Vim:在映射中保存一个宏

时间:2017-04-13 16:30:35

标签: vim macros

我有一个映射,如<leader>x,在该映射中,它执行一些中等复杂的工作。作为其工作的一部分,我希望将该映射保存为宏,以便之后我可以使用@z(或其他)重复它。

我知道想要一个已经是捷径的东西的快捷方式有点奇怪,但请耐心等待(

我的真实例子有点复杂,所以我们在这里使用一个简单的例子:

这是一个有效的映射:

nnoremap <expr> <leader>x 'mz' . v:count . 'Ax<ESC>' . v:count . 'Ix<ESC>`z'

我可以在普通模式下输入10,x来使用它,它会在当前行附加并添加10 x个字符,然后返回原来的位置。

工作正常。

我想做的是:首先像以前一样运行10,x,然后让这个工作序列作为宏存储在q寄存器中,这样我就可以运行{ {1}}重复一遍。

我试过这个,但它不起作用:

@q

正如您所看到的,我刚开始添加nnoremap <expr> <leader>x 'qqmz' . v:count . 'Ax<ESC>' . v:count . 'Ix<ESC>`zq' (开始在qq寄存器中录制宏),最后添加最终q以停止宏观录音。

如果我手动输入这些命令,它可以正常工作。

但是当我将它们放在q中时,它不起作用。

这里发生了什么?

2 个答案:

答案 0 :(得分:1)

啊,我在文档中错过了这个:

  

执行寄存器时禁用'q'命令,但它没有   在映射中工作和|:normal |。

(来自:help q

我想我想要的是不可能不进入vimscript等等。

答案 1 :(得分:1)

您已经明白为什么这种方法不适合您,因为q在映射中被禁用。以下是解决问题的方法:

nnoremap <leader>x :<C-u>let @q='mz'.v:count.'Ax<C-v><ESC>'.v:count.'Ix<C-v><ESC>`z'<CR>@q

这只需将您想要的命令直接输入注册&#39; q&#39;,然后再运行它。