在许多情况下,我有一些 vim 脚本,我只希望在它不在宏中运行时执行它。例如,在某些情况下,我会闪烁光标来提醒自己它现在在哪里(这在宏中运行时毫无意义,只会导致宏花费 10 倍的时间)。
因此,对于这些情况,我想检查它是否作为宏运行,并避免在这种情况下执行不必要的操作。我搜索了帮助,但找不到检测这一点的标志。这可能吗?
答案1
没有类似的函数mode()
或特殊v:macro_running
变量,许多人认为这些只会鼓励不良做法。
你可以使用 的行为feedkeys()
,其传递的键通常在命令 / 映射之后立即执行,但仅在宏执行的最后执行。如果你将长时间运行的命令放入其中,它们会像往常一样直接减慢正常命令的速度,但只会在宏执行后(累积地)减慢速度(通常你可以用 中止它<C-C>
)。
例子
let @q = ',a,b'
代替:
nnoremap ,a aHello<Esc>2gs
nnoremap ,b aWorld<Esc>2gs
使用
nnoremap ,a aHello<Esc>:call feedkeys('2gs', 'n')<CR>
nnoremap ,b aWorld<Esc>:call feedkeys('2gs', 'n')<CR>
这会立即将整个HelloWorld
文本插入宏中。