Vim 插件: vim-which-key - V2EX
simple26
V2EX    Vim

Vim 插件: vim-which-key

  •  1
     
  •   simple26 Oct 12, 2018 2793 views
    This topic created in 2793 days ago, the information mentioned may be changed or developed.

    emacs-which-keyvim-which-key

    emacs 用户相信应该对于 emacs-which-key 很熟悉,如果你在一定时间没有输入下一个按键,它会自动显示接下来可能的所有快捷键映射,这对于常常需要多组合键的 emacs 来说很是方便。我在一开始使用 spacemacs 的时候,就被这个功能所吸引。不过一直以来 vim 中都缺少像 emacs-which-key 这样“形神兼备”的插件,这一点我在 space-vim 的 README 中也一早有提及。

    vim-leader-guide 是 vim 里出现的一个比较接近的插件,它主要借鉴自 guide-key,而 guide-key 是 emacs-which-key 的前身,目前已经不更新了,上一次 commit 还是在 2015 年。emacs-which-key 作为 guide-key 的继任者对它进行了重写,并加入了一些新的特性。

    因为 vim-leader-guide 之前长时间没有更新,而且在我看来不够 fancy,所以我对它进行了一个大的改造,也就是现在的 vim-which-key,主要改进的地方有:

    • 大量 UI 细节上的调整与改进,比如:

      • 底部输出当前输入的内容
      • 高亮群组
      • 每列支持按照分隔符对齐
      • 必要时更新窗口内容,而不是每一次都关闭再打开一个新窗口
      • ......
    • 使用 getchar() 而不是 input() 进行交互,快速响应用户键入的每一个字符。

    • 引入针对 vim-which-key 的 timeout 解决由于 getchar() 带来的一些不友好体验。

    vim-which-key

    使用要求

    vim-which-key 对于 vim 的版本和特性基本没什么要求,需要注意的一点是不要关闭选项 timeout,即不要在 vimrc 中设置 set notimeout。另外可以自行设置 timeout 的时长:

    " 默认超时是 1000 ms,如果不想那么长的话,你可以在 vimrc 中设置更短一些 set timeoutlen=500 

    安装使用

    如果使用 vim-plug:

    Plug 'liuchengxu/vim-which-key' let g:mapleader = "\<Space>" let g:maplocalleader = "," nnoremap <silent> <leader> :WhichKey '<Space>'<CR> nnoremap <silent> <localleader> :WhichKey ','<CR> 

    这是使用 vim-which-key 的最小配置,它会自动解析用户自定义的 <leader><localleader> 相关快捷键。但是通常来说,通过自动解析所展示的内容并不能起到 cheatsheet 的作用,所以一般还需要稍加一点自定义配置来实现一个比较好的效果。

    自定义配置

    要想实现上图中的效果,只需要再多额外两步配置。

    第一步是用一个 dict 定义你要展示的信息和执行的操作,用过 vim-leader-guide 的应该都很熟悉,跟它很像,不同的地方主要有:

    • 对于用户已经定义的快捷键,可以只传入一个字符串描述该快捷键
    • 支持解析 <C-W> 等键位

    更详细的样例可以参考 space-vimleader.vim, 它也是截图中的配置。

    let g:which_key_map = {} " `name` 是一个特殊字段,如果 dict 里面的元素也是一个 dict,那么表明一个 group,比如 `+file`, 就会高亮和显示 `+file` 。默认是 `+prefix`. " ======================================================= " 基于已经存在的快捷键映射,直接使用一个字符串说明介绍信息即可 " ======================================================= " You can pass a descriptive text to an existing mapping. let g:which_key_map.f = { 'name' : '+file' } nnoremap <silent> <leader>fs :update<CR> let g:which_key_map.f.s = 'save-file' nnoremap <silent> <leader>fd :e $MYVIMRC<CR> let g:which_key_map.f.d = 'open-vimrc' nnoremap <silent> <leader>oq :copen<CR> nnoremap <silent> <leader>ol :lopen<CR> let g:which_key_map.o = { \ 'name' : '+open', \ 'q' : 'open-quickfix' , \ 'l' : 'open-locationlist', \ } " ======================================================= " 不存在相关的快捷键映射,需要用一个 list: " 第一个元素表明执行的操作,第二个是该操作的介绍 " ======================================================= " Provide commands(ex-command, <Plug>/<C-W>/<C-d> mapping, etc.) and descriptions for existing mappings let g:which_key_map.b = { \ 'name' : '+buffer' , \ '1' : ['b1' , 'buffer 1'] , \ '2' : ['b2' , 'buffer 2'] , \ 'd' : ['bd' , 'delete-buffer'] , \ 'f' : ['bfirst' , 'first-buffer'] , \ 'h' : ['Startify' , 'home-buffer'] , \ 'l' : ['blast' , 'last-buffer'] , \ 'n' : ['bnext' , 'next-buffer'] , \ 'p' : ['bprevious' , 'previous-buffer'] , \ '?' : ['Buffers' , 'fzf-buffer'] , \ } let g:which_key_map.l = { \ 'name' : '+lsp' , \ 'f' : ['LanguageClient#textDocument_formatting()' , 'formatting'] , \ 'h' : ['LanguageClient#textDocument_hover()' , 'hover'] , \ 'r' : ['LanguageClient#textDocument_references()' , 'references'] , \ 'R' : ['LanguageClient#textDocument_rename()' , 'rename'] , \ 's' : ['LanguageClient#textDocument_documentSymbol()' , 'document-symbol'] , \ 'S' : ['LanguageClient#workspace_symbol()' , 'workspace-symbol'] , \ 'g' : { \ 'name': '+goto', \ 'd' : ['LanguageClient#textDocument_definition()' , 'definition'] , \ 't' : ['LanguageClient#textDocument_typeDefinition()' , 'type-definition'] , \ 'i' : ['LanguageClient#textDocument_implementation()' , 'implementation'] , \ }, \ } 

    第二步是注册键位与对应的 dict,这一步比较简单,不要忘记就行。

    call which_key#register('<Space>', "g:which_key_map") nnoremap <silent> <leader> :<c-u>WhichKey '<Space>'<CR> vnoremap <silent> <leader> :<c-u>WhichKeyVisual '<Space>'<CR> 

    除了 leaderlocalleader,如果想要提示其他键也可以:

    nnoremap <silent> ] :<c-u>WhichKey ']'<CR> nnoremap <silent> [ :<c-u>WhichKey '['<CR> 

    更多介绍请参看 vim-which-key 的 README 和 doc。

    如果在使用 vim-which-key 过程中有任何问题,请到 GitHub 上的 issue 里面提,提 issue 时请说明重现步骤并提供可重现的最小 vimrc,比如这样:

    set nocompatible call plug#begin() Plug 'liuchengxu/vim-which-key' call plug#end() let g:mapleader="\<Space>" nnoremap <silent> <leader> :<c-u>WhichKey '<Space>'<CR> nnoremap <silent> <localleader> :<c-u>WhichKey ','<CR> nnoremap <Leader>a<Tab> :echom "Hello, World"<cr> nnoremap <Leader>1 :echom "THis is one"<cr> let g:which_key_map = {} let g:which_key_map.a = { \ 'name':"Test", \ '<Tab>':"Hello world" \} let g:which_key_map.1 = "One" call which_key#register('<Space>', "g:which_key_map") 

    最后打个广告,对区块链行业感兴趣的欢迎来信交流: [email protected]

    1 replies    2018-10-14 13:39:58 +08:00
    agagega
        1
    agagega  
       Oct 14, 2018 via iPhone
    原来 emacs 这个插件叫这个名字,学习了
    /div>
    About     Help     Advertise     Blog     API     FAQ     Solana     931 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 22:07 PVG 06:07 LAX 15:07 JFK 18:07
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86