map 的左手邊不一定是按鍵
map 指令的 {lhs} 可以不是用來 key 的。
這個用法至少在 2007 就被分享過(Vim: <Space>で始まるkey mappingの可視化 - while ("im automaton");)不過我是前陣子才知道的,sorry。
原本以為 map 就是 map 一個鍵,例如 map <C-S> :update<CR>
;
或 map 一串 key sequence 如 map jk zz
。
其實可以在 {lhs} 放抽象的 key sequence,例如以下 unite.vim 設定例片段:
nnoremap [unite] <Nop> nmap f [unite] nnoremap <silent> [unite]c :<C-u>UniteWithCurrentDir -buffer-name=files buffer file_mru bookmark file<CR> nnoremap <silent> [unite]b :<C-u>UniteWithBufferDir -buffer-name=files -prompt=%\ buffer file_mru bookmark file<CR> nnoremap <silent> [unite]r :<C-u>Unite -buffer-name=register register<CR> nnoremap <silent> [unite]o :<C-u>Unite outline<CR>
定義了 [unite] 來取代 f,這樣就可以寫 [unite]c
,使用時卻是按 fc。
有幾個好處:
1) 更好讀。
2) 不想用 f 要換掉時,只要改一個地方即可。
3) 按下 f 時,畫面下方會顯示 [fuf]
(如果沒把 'showcmd' 關掉的話),相當有意義。
再舉這幾天試用的 EasyMotion 設定為例:
noremap [emotion] <Nop> noremap [emotion]<Space> f map f [emotion] let g:EasyMotion_leader_key = '[emotion]'
把 [emotion] 拿來當 EasyMotion 的啟動鍵,實際上是 f。
想用原本的 f 時,就按 f<Space>。
此外在 plugin 中常看到這樣的寫法(取自 rails.vim):
nnoremap <buffer> <silent> <Plug>RailsAlternate :<C-U>A<CR> nnoremap <buffer> <silent> <Plug>RailsRelated :<C-U>R<CR> nnoremap <buffer> <silent> <Plug>RailsFind :<C-U>REfind<CR>
其中 nnoremap <Plug>RailsFind
看起來跟這篇道理很像,可以方便用 map <Plug>RailsFind
來定義 plugin 的 map。
不過 <Plug>
其實是 map 的一個保留字 <Plug>,把 <Plug>foo 放 {rhs} 時 'showcmd' 顯示也怪怪的;所以雖然可以用,還是先在 plugin 裡用就好了。
有 0 個意見
☂