我不太喜欢在 Vim 中使用窗口(我更喜欢选项卡),但有些东西会使用它们,例如帮助文本缓冲区。我对此很满意,但由于我很少使用窗口,我通常需要一秒钟才能记住如何关闭窗口 (
<C-w>c
) 并返回到我正在做的事情。因此,我想在 vimrc 中添加一行,映射 q
以关闭窗口,前提是该窗口是帮助缓冲区。
我已经为 netrw windows 做了类似的事情,如下所示:
augroup wtf_netrw
autocmd!
autocmd filetype netrw nnoremap <buffer> q :e#<CR>
augroup END
我尝试用
filetype help
做类似的事情:
:autocmd filetype help nnoremap <buffer> q <C-w>c
但它不起作用——在帮助文本缓冲区中输入
q
只是执行了默认的 q
操作,录制宏。
当我尝试仅
:nnoremap q <C-w>c
时,在帮助文本缓冲区中键入 q
会按我的预期关闭窗口。
有没有一种特殊的方法来添加仅在帮助文本缓冲区中起作用的映射?
将其放入文件中
~/.vim/ftplugin/help.vim
:
nnoremap <silent> <buffer> q :q<CR>
我使用这样的东西(我想是从 Junegunn 的 vimrc 借来的):
augroup vimrc
autocmd!
autocmd BufEnter *.txt call s:at_help()
...
augroup END
" special actions for help files
function! s:at_help()
if &buftype == 'help'
" enable 'q' = quit
nnoremap <buffer> q :q<cr>
endif
endfunction
现有答案将等待超时来消除其他
q
键的歧义,并且当映射到 :q
时,如果帮助窗口为 :only
并且没有保留修改的缓冲区,它将关闭 vim。此外,它留下了一个未列出的缓冲区,该缓冲区有时会出现,例如在 bufexplorer 中。
而是在
after/ftplugin/help.vim
中尝试这个:
if exists("b:did_ftplugin_after") | finish | endif
noremap <buffer> q :bw<return>
augroup TimeoutRestore
au!
au BufEnter <buffer> let b:oldtm = &tm | set tm=1
au BufLeave <buffer> let &tm = b:oldtm
augroup END
let b:did_ftplugin_after = 1