Vim Advent Calendar 181日目の記事です。昨日はcohamaさんによるVim のコマンドラインモードを使いこなそうでした。
本記事は久々の文書による記事です。せっかくなので口頭で説明しづらいkey mappingについて綴りたいと思います。
すでに
- vimでキーマッピングする際に考えたほうがいいこと
- http://d.hatena.ne.jp/thinca/20130513/1368385494
- http://d.hatena.ne.jp/tyru/20130509/vim_replaceable_keys
などのkey mappingに関するVim Advent Calendar記事があがっています。
MacでいうCmdキー、LinuxでいうAltキーのことです。スペースのすぐ左、Xの下にあるキーのことです。このキーはmodifier keyであるにもかかわらずFPの消費が極端に少ないという特殊な性質があります。したがって我々Vim使いは、ctrlキーなどのFP消費量の大きいキーを差し控え、このキーの使用を最大化するべきです。(*1)
normal modeやvisual modeでctrlキーを使うのは情弱、という名言がありました。spaceなどをprefixとして様々なキーを割り当てたり、あるいはsなどの一部のキーを潰してそれをprefixに用いる、などがよく使われていることと思います。しかしながらinsert modeへのキー割り当てはこのようにいきません。直接入力する対象のkey以外を使わなければなりません。
この記事は、altキーを再発見します。
<M-
として指定します。<D-
や<A-
とすると一部の環境でしか動作しなくなるため危険です。
たとえば~/.vimrc
にて以下のようにすることでAlt-Backslashにneosnippetのjump-or-expandの割り当てを行います。
imap <M-\> <Plug>(neosnippet_jump_or_expand)
なお著者は端末のvimを積極的に避ける派ですが、どうしても端末のvimを使わざるをえない状況に陥りそうであるならば、thincaさんの端末の Vim でも Alt キーを使うが便利です。
著者のvimrcからいくつか引用することで具体例としましょう。
omap <Space>p %
omap <M-9> %
operator-pending modeの%
をかなりよく使うのですが、%
はとても入力しにくいことで有名です。著者はながらく<space>p
で代用していましたが、最近Alt-9
にするとよいのではないかと発見しました。つまり、Alt-(
をshiftを押さずに打鍵するという意味です。
inoremap <M-BS> <C-w>
insert modeのままでの単語単位の削除です。また著者はinsert modeの<BS>
に様々な昨日を割り当てているため、それらを回避したいときにも活用しています。
nnoremap <silent> <M-j> :<C-u>execute 'tabnext' 1 + (tabpagenr() + v:count1 - 1) % tabpagenr('$')<CR>:redraw<CR>
nnoremap <M-k> gT
Alt-j
とAlt-k
でタブページを移動するためのものです。著者は同様の設定をChromeやSkypeに割り当てており、ほとんどすべてのアプリケーションでタブ間移動を同じインタフェースで行えるようにしています。とても便利です。
" <C-g> is to swap visual mode and select mode. <C-g> is difficult to type.
" Use Alt-g instead
vnoremap <M-g> <C-g>
snoremap <M-g> <C-g>
## 脚注
visual modeとselect modeの<C-g>
がたまに便利なものの入力しにくさトップレベルなのでAlt-g
にしました。
nmap <M-o> <Plug>(openbrowser-open)
openbrowser.vim用の設定です。Mac OSXのFinderはアイコンを選択した状態でCmd-Oとするとそのファイルを開きます。その流れで、Vim上でもURLをAlt-o
することでブラウザで開くようにしました。便利です。
augroup vimrc-vimshell
autocmd!
autocmd FileType vimshell call s:vimshell_local()
augroup END
function! s:vimshell_local()
(長いので中略)
inoremap <buffer> <expr><M-l> unite#sources#vimshell_history#start_complete(!0)
endfunction
vimshell専用設定です。vimshellではinsert modeの<C-l>
でヒストリをuniteることができるのですが、それを<M-l>
でできるようにしています。(似た記述でiexeにも対応させています)
imap <M-l> <Plug>(neocomplcache_start_unite_complete)
neocomplcacheは補完候補が多すぎるときなどのためその候補をuniteに委ねる機能があります。補完ポップアップがでているとき、つまりinsert modeのときにしか使えないので、これもaltりましょう。
nnoremap <sid>(command-line-enter) q:
xnoremap <sid>(command-line-enter) q:
nnoremap <sid>(command-line-norange) q:<C-u>
nmap : <sid>(command-line-enter)
xmap : <sid>(command-line-enter)
imap <M-:> <Esc><sid>(command-line-enter)
これは正直あまりつかっていません。insert modeから直接Alt-:
でcmdwinを開くようにしています。
imap <M-\> <Plug>(neosnippet_jump_or_expand)
smap <M-\> <Plug>(neosnippet_jump_or_expand)
nmap <M-\> a<M-\>
xmap <M-\> <Plug>(neosnippet_expand_target)
前述のneosnippet用の設定です。著者はneosnippet病で、かなり頻繁に用いています。
imap <expr> <M-v> col('$') <= col('.') ? '<C-o>"+p' : '<C-o>"+P'
vnoremap <M-c> "+y
Alt-c
とAlt-v
でコピペができるようにしています。
nmap <M--> <Plug>(fontzoom-smaller)
nmap <M-=> <Plug>(fontzoom-larger)
fontzoom.vim用の設定です。MacVimではCmd-+
とCmd--
をshiftキーなしで用いることでフォントサイズを変更することができました。それとまったく同じものをGentooのGVimで利用可能にしています。
いかがでしたか。著者は今後ますますAltキーを多用することになると思います。
- (*1) 小指が長いなど、FPが非常に大きな人にとっては本記事は不要です。