Skip to content

Instantly share code, notes, and snippets.

@ujihisa ujihisa/vac181.md
Last active Dec 17, 2015

Embed
What would you like to do?

Vim Advent Calendar 181日目

Vim Advent Calendar 181日目の記事です。昨日はcohamaさんによるVim のコマンドラインモードを使いこなそうでした。

本記事は久々の文書による記事です。せっかくなので口頭で説明しづらいkey mappingについて綴りたいと思います。

すでに

などのkey mappingに関するVim Advent Calendar記事があがっています。

Altキーのすすめ

keyboard

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キーを再発見します。

Mapping方法

<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-jAlt-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-cAlt-vでコピペができるようにしています。

nmap <M--> <Plug>(fontzoom-smaller)
nmap <M-=> <Plug>(fontzoom-larger)

fontzoom.vim用の設定です。MacVimではCmd-+Cmd--をshiftキーなしで用いることでフォントサイズを変更することができました。それとまったく同じものをGentooのGVimで利用可能にしています。

まとめ

いかがでしたか。著者は今後ますますAltキーを多用することになると思います。

脚注

  • (*1) 小指が長いなど、FPが非常に大きな人にとっては本記事は不要です。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.