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 裡用就好了。