Vim - 仅在非录制时映射 q 键?

4
当没有录制宏时,按下q加上一个寄存器的键开始在该寄存器中记录宏。还有其他可用的命令,例如q:,打开命令窗口。
当录制宏时,按下q会停止录制。换句话说,q映射在是否正在录制宏时的行为不同。您无法嵌套一个录制宏在另一个录制宏中。
我想在没有录制宏时重新映射q:,但保留q的常规行为,以停止当前正在录制的宏。常规映射不完全正确 -- 如果我正在录制宏然后按下q,就会出现延迟,因为Vim正在尝试确定我是否会跟随它使用:来触发映射。我希望只有在没有录制宏时映射才能应用,这样就不会发生延迟。如何检测这个问题?
我的用例是我想让q:的行为像:q,并将g:映射到打开命令窗口,因为一半的时间我按下q:时我想按下:q
1个回答

2

我相信我找到了一个解决方案,基于这个答案

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接