2017-04-27 82 views
3

當不記錄宏時,按q後跟一個寄存器開始在該寄存器中記錄一個宏。其他命令也可用,例如, q:,打開命令窗口。Vim - 僅當不記錄時映射q?

錄製宏時,按q將停止錄製。換句話說,無論宏是否正在錄製,q映射的行爲會有所不同。您不能將一個錄音嵌入另一個錄音。

我想在不錄製宏時重映射q:,但保留q的常規行爲以在當前錄製時停止宏。常規映射不能正常工作 - 如果我正在錄製一個宏,然後按q,則會出現延遲,因爲Vim正在嘗試確定是否要使用:來觸發映射。我想映射只適用於如果我沒有錄製宏,所以這種延遲不會發生。我如何檢測這個?

我的使用情況是,我想q:表現得像:q,而是映射g:打開命令窗口,因爲一半的時間我按q:我的意思是按:q

回答

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