资讯专栏INFORMATION COLUMN

Vim 插件:vim-which-key

chengtao1633 / 1940人阅读

摘要:不过一直以来中都缺少像这样形神兼备的插件,这一点我在的中也一早有提及。是里出现的一个比较接近的插件,它主要借鉴自,而是的前身,目前已经不更新了,上一次还是在年。引入针对的解决由于带来的一些不友好体验。

从 emacs-which-key 到 vim-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 的版本和特性基本没什么要求,需要注意的一点是不要关闭选项 timeout,即不要在 vimrc 中设置 set notimeout。另外可以自行设置 timeout 的时长:

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

如果使用 vim-plug:

Plug "liuchengxu/vim-which-key"

let g:mapleader = ""
let g:maplocalleader = ","

nnoremap   :WhichKey ""
nnoremap   :WhichKey ","

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

自定义配置

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

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

对于用户已经定义的快捷键,可以只传入一个字符串描述该快捷键

支持解析 等键位

更详细的样例可以参考 space-vim 的 leader.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  fs :update
let g:which_key_map.f.s = "save-file"

nnoremap  fd :e $MYVIMRC
let g:which_key_map.f.d = "open-vimrc"

nnoremap  oq  :copen
nnoremap  ol  :lopen
let g:which_key_map.o = {
       "name" : "+open",
       "q" : "open-quickfix"    ,
       "l" : "open-locationlist",
       }

" =======================================================
" 不存在相关的快捷键映射,需要用一个 list:
" 第一个元素表明执行的操作,第二个是该操作的介绍
" =======================================================
" Provide commands(ex-command, // 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("", "g:which_key_map")
nnoremap   :WhichKey ""
vnoremap   :WhichKeyVisual ""

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

nnoremap  ] :WhichKey "]"
nnoremap  [ :WhichKey "["

更多介绍请参看 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=""

nnoremap        :WhichKey ""
nnoremap   :WhichKey  ","

nnoremap a :echom "Hello, World"
nnoremap 1 :echom "THis is one"

let g:which_key_map = {}

let g:which_key_map.a = {
             "name":"Test",
             "":"Hello world"
            }

let g:which_key_map.1 = "One"

call which_key#register("", "g:which_key_map")

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/25032.html

相关文章

  • 使用 neovim 的浮动窗口让你再次爱上 fzf

    摘要:自从的浮动窗口被合到以后,很多插件都利用了这个特性实现了很多很酷的功能,比如,另外和也利用了这一特性。首先是个配置项让输入上方,搜索列表在下方打开的方式选择还有个函数指定如何打开浮动窗口设置浮动窗口打开的位置,大小等。 fzf 是一个非常高效实用且美观的命令行工具,并且配置有对应的 vim 插件 fzf.vim, 相信很多人都用过。这里就不在赘述,如果你还没有用过,很推荐一试。 自从 ...

    msup 评论0 收藏0
  • 个人使用的 vim 插件集合

    摘要:扩展了的,用于快速跳转到配对的标签对编辑有很大帮助,新版以上自带该插件快速编写的神级插件,可支持快速编辑和的插件,可支持为文件提供函数提供快速对齐操作符解析颜色语法并用想对应颜色做为背景色显示,支持多种语法和文件类型,支持的代码段管 matchit.vim 扩展了 vim 的 %,用于快速跳转到配对的标签(对编辑 html 有很大帮助), 新版 vim 7.0 以上自带该插件 emm...

    李涛 评论0 收藏0
  • 如何安装vim插件

    摘要:概述之所以广受青睐好评如潮,它丰富多样的插件起到了举足轻重的贡献。那么如何获取和安装插件呢通常我们可以在官网或上获取插件,然后可以手动安装或利用等插件管理器来安装。如果你想避免可以使用下面的插件管理器来安装插件。 概述 vim之所以广受青睐好评如潮,它丰富多样的插件起到了举足轻重的贡献。那么如何获取和安装插件呢? 通常我们可以在vim官网或github上获取插件,然后可以手动安装或利用...

    Rindia 评论0 收藏0
  • Vim 插件管理器概览

    摘要:什么是插件见一个插件不过是启动时自动加载的脚本而已启动时会自动加载中的子目录下的所有文件那么又是什么就是查找脚本文件的地方之于,有点类似之于下面有两个子目录需要注意目录下面的所有文件都会在启动时进行记载里面的文件在启动时并不会进行加载而是通 什么是 Vim 插件 见 :h plugin : Vims functionality can be extended by adding plu...

    e10101 评论0 收藏0
  • Vim插件简单介绍

    摘要:转换时支持模板文件,配合强大的模板文件,可以自己创建,或者是实现语法高亮,还支持数学公式编辑。标签文件允许这些项目能够被一个文本编辑器或其它工具简捷迅速的定位。 原文地址 Vim作为一个强大的编辑器,再配合强大的插件,就可以称得上为编辑神器了。 pathogen pathogen为管理插件的插件,类似的还有vundle。在 Pathogen 之前,安装插件就是把插件文件放在.vim目录...

    dackel 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<