2015-11-10 32 views
0

背景:我使用的是skwp's dotfiles,他最近changes是打破一些功能我每天都在使用。如何取消映射VIM快捷鍵時的quickfix退出

代替全局設置映射,我試圖在quickfix輸入後嘗試輸入nnoremap兩個快捷方式,並在quickfix退出後輸入nunmap

BTW,我認爲syntastic用於linting,它調用quickfix/location列表。

下面的代碼:

augroup quickfixShortcutsGroup 
    autocmd! 
    autocmd BufWrite * :echom "Foo" 
    " au BufReadPost quickfix nnoremap <silent> <C-z> :cp<CR> 
    " au BufReadPost quickfix nnoremap <silent> <C-x> :cn<CR> 
    au BufWinEnter quickfix nnoremap <silent> <C-z> :cp<CR> 
    au BufWinEnter quickfix :echo '1' 
    au BufWinLeave quickfix nnoremap <silent> <C-z> :cp<CR> 
    au BufWinLeave quickfix :echo 'BufWinLeave' 
    au BufLeave qf :echo 'BufLeave' 
    au BufUnload qf :echo 'unload qf' 
    " au BufLeave qf noremap <silent> <C-z> :cb<CR> 
    " au BufLeave quickfix noremap <silent> <C-z> :cb<CR> 
    " au BufWinLeave quickfix noremap <silent> <C-z> :cb<CR> 
    " au BufWinLeave quickfix nunmap <C-z> 
    " au BufWinLeave quickfix :echom 'Hello'<cr> 
    " BufWinEnter 
augroup END 

讀引用後:

  1. http://vimdoc.sourceforge.net/htmldoc/autocmd.html#BufWinLeave
  2. http://vimdoc.sourceforge.net/htmldoc/autocmd.html#autocmd-patterns

我仍然無法得到unmap事件的工作,即BufWinLeaveBufUnloadBufLeave不被調用。

Vimers能告訴我哪些事件(S)我應該使用,並幫助我在這?預先感謝您的幫助。

+1

對'qf'使用'ftplugin'而不是所有'autocmd's,並且將''添加到映射以使它們位於quickfix緩衝區的本地。 –

+0

「背景:我正在使用skwp的點文件,他最近的更改打破了我每天使用的某些功能。」真是一個驚喜! – romainl

回答

2

由於:help BufWinLeave解釋,當前緩衝區「%」可能不同於正在卸載的緩衝區「」。因此,你需要一個全球性的自動命令,並解決已經離開了緩衝號碼,然後檢查是否有的quickfix'buftype'

autocmd! BufWinLeave * if getbufvar(bufnr(expand('<afile>')), '&buftype') ==# 'quickfix' | echo "leaving quickfix" | endif 

但在一般情況下,我建議對這類技巧,尤其是有條件的映射。您的<C-z>/<C-x>映射仍然是全局映射,現在取決於quickfix列表是否可見。這對於肌肉記憶力不好,而關鍵組合的超載在精神上是要徵稅的。我寧願完全擺脫映射,或分配不同的(如果可能更長)鍵。

還有的下一個併發症:Vim的「發行」等人的點文件引誘你能夠快速安裝且亂的出廠設置,但是你付出的代價與增加的複雜性(你需要了解兩個Vim的運行時間加載方案和分佈的任意約定)和不靈活性(分佈可能會使一些事情更容易,但其他事情非常困難)。 Vim是令人難以置信的可定製的,使用別人的定製是沒有意義的。

0

如果你想在和quickfix進入和nunmap的quickfix退出後nnoremap這兩個映射,你可以

" map silently upon entering Quickfix 
autocmd BufWinEnter * if &buftype == 'quickfix' 
    \| nnoremap <silent> <C-x> :cn<CR> 
    \| nnoremap <silent> <C-z> :cp<CR> 
    \| endif 

" unmap upon leaving Quickfix 
autocmd BufWinLeave * if &buftype == 'quickfix' 
    \| nunmap <C-x> 
    \| nunmap <C-z> 
    \| endif 

或者你可以利用本地緩存映射,使你的代碼更短

" map silently upon entering Quickfix, and only for Quickfix 
autocmd BufWinEnter * if &buftype == 'quickfix' 
    \| nnoremap <buffer><silent> <C-x> :cn<CR> 
    \| nnoremap <buffer><silent> <C-z> :cp<CR> 
    \| endif 

這些autocmd的被調用每次你進入或離開一個緩衝時間。因此,它是真正的好只是,作爲Sato Katsurasuggested,加在你~/.vim/ftplugin/qf.vim

nnoremap <buffer><silent> <C-x> :cn<CR> 
    nnoremap <buffer><silent> <C-z> :cp<CR> 

你可以考慮讀這些: