当不录制宏时,按q
后跟一个寄存器开始在该寄存器中录制宏。其他命令也可用,例如q:
,打开命令窗口。
录制宏时,按q
会停止录制。换句话说,无论宏是否正在录制,q
映射的行为都不同。你不能将一个录音嵌套在另一个录音中。
我想在不录制宏时重新映射q:
,但保留q
的常规行为以在当前录制时停止宏。常规映射不能正常工作 - 如果我正在录制宏然后按q
会有延迟,因为Vim正在尝试确定我是否要使用:
来跟踪它触发映射。如果我没有录制宏,我希望映射只能应用,所以这种延迟不会发生。我怎么能发现这个?
我的用例是我希望q:
的行为与:q
相同,而是映射g:
以打开命令窗口,因为有一半我按q:
我的意思按:q
。
答案 0 :(得分:1)
我相信我找到了一个基于this answer的解决方案。
nnoremap <silent> q :<C-u>call <SID>SmartQ()<CR>
function! s:SmartQ()
if exists("g:recording_macro")
let r = g:recording_macro
unlet g:recording_macro
normal! q
execute 'let @'.r.' = @'.r.'[:-2]'
else
let c = nr2char(getchar())
if c == ':'
quit
else
if c =~ '\v[0-9a-zA-Z"]'
let g:recording_macro = c
endif
execute 'normal! q'.c
endif
endif
endfunction