我有一个映射,如<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
中时,它不起作用。
这里发生了什么?
答案 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;,然后再运行它。