摘要:不過一直以來中都缺少像這樣形神兼備的插件,這一點我在的中也一早有提及。是里出現的一個比較接近的插件,它主要借鑒自,而是的前身,目前已經不更新了,上一次還是在年。引入針對的解決由于帶來的一些不友好體驗。
從 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 的最小配置,它會自動解析用戶自定義的
要想實現上圖中的效果,只需要再多額外兩步配置。
第一步是用一個 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" } nnoremapfs :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 " "
除了 leader 和 localleader,如果想要提示其他鍵也可以:
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")
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/25032.html
摘要:自從的浮動窗口被合到以后,很多插件都利用了這個特性實現了很多很酷的功能,比如,另外和也利用了這一特性。首先是個配置項讓輸入上方,搜索列表在下方打開的方式選擇還有個函數指定如何打開浮動窗口設置浮動窗口打開的位置,大小等。 fzf 是一個非常高效實用且美觀的命令行工具,并且配置有對應的 vim 插件 fzf.vim, 相信很多人都用過。這里就不在贅述,如果你還沒有用過,很推薦一試。 自從 ...
摘要:擴展了的,用于快速跳轉到配對的標簽對編輯有很大幫助,新版以上自帶該插件快速編寫的神級插件,可支持快速編輯和的插件,可支持為文件提供函數提供快速對齊操作符解析顏色語法并用想對應顏色做為背景色顯示,支持多種語法和文件類型,支持的代碼段管 matchit.vim 擴展了 vim 的 %,用于快速跳轉到配對的標簽(對編輯 html 有很大幫助), 新版 vim 7.0 以上自帶該插件 emm...
摘要:概述之所以廣受青睞好評如潮,它豐富多樣的插件起到了舉足輕重的貢獻。那么如何獲取和安裝插件呢通常我們可以在官網或上獲取插件,然后可以手動安裝或利用等插件管理器來安裝。如果你想避免可以使用下面的插件管理器來安裝插件。 概述 vim之所以廣受青睞好評如潮,它豐富多樣的插件起到了舉足輕重的貢獻。那么如何獲取和安裝插件呢? 通常我們可以在vim官網或github上獲取插件,然后可以手動安裝或利用...
摘要:什么是插件見一個插件不過是啟動時自動加載的腳本而已啟動時會自動加載中的子目錄下的所有文件那么又是什么就是查找腳本文件的地方之于,有點類似之于下面有兩個子目錄需要注意目錄下面的所有文件都會在啟動時進行記載里面的文件在啟動時并不會進行加載而是通 什么是 Vim 插件 見 :h plugin : Vims functionality can be extended by adding plu...
閱讀 2952·2021-11-23 09:51
閱讀 1006·2021-09-26 09:55
閱讀 3934·2021-09-22 14:58
閱讀 1467·2021-09-08 09:35
閱讀 1077·2021-08-26 14:16
閱讀 881·2019-08-23 18:17
閱讀 2053·2019-08-23 16:45
閱讀 700·2019-08-23 15:55