Vim - 仅在不录制时映射q?

时间:2017-04-27 09:39:07

标签: vim macros

当不录制宏时,按q后跟一个寄存器开始在该寄存器中录制宏。其他命令也可用,例如q:,打开命令窗口。

录制宏时,按q会停止录制。换句话说,无论宏是否正在录制,q映射的行为都不同。你不能将一个录音嵌套在另一个录音中。

我想在不录制宏时重新映射q:,但保留q的常规行为以在当前录制时停止宏。常规映射不能正常工作 - 如果我正在录制宏然后按q会有延迟,因为Vim正在尝试确定我是否要使用:来跟踪它触发映射。如果我没有录制宏,我希望映射只能应用,所以这种延迟不会发生。我怎么能发现这个?

我的用例是我希望q:的行为与:q相同,而是映射g:以打开命令窗口,因为有一半我按q:我的意思按:q

1 个答案:

答案 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