帮助文本缓冲区中的自定义映射

问题描述 投票:0回答:3

我不太喜欢在 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
3个回答
5
投票

将其放入文件中

~/.vim/ftplugin/help.vim

nnoremap <silent> <buffer> q :q<CR>

4
投票

我使用这样的东西(我想是从 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

0
投票

现有答案将等待超时来消除其他

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
© www.soinside.com 2019 - 2024. All rights reserved.