vimで無駄なカーソル移動から解放されるためのカーソル移動講座

僕のvimの理想

指をホームポジションから動かすことなく、全てキーボード操作で終わらせたい。マウス操作は直感的だが時間がかかるし効率が悪い。せっかくvimを使っているならば、全ての操作をキーボード操作で済ませたいと思うのはある種プログラマーの理想かもしれません。

hjklから解放されたい!

vimのデフォルトカーソル移動といえば言わずと知れたhjkl。ほぼ全てのvimmerはカーソル移動にhjklを使っているでしょう。このカーソル移動の一番のメリットは右手のホームポジションに近いところに移動キーが詰まっているところ。指を移動させる距離が少なく、カーソルを移動させることができます。 矢印キーでも移動はできますが、指を動かす距離が多くなりますし、移動するためにホームポジションから外れてしまうため効率的ではありません。 vim特有のhjklでのカーソル移動になれることはvim初級者必須トレーニングの一つでしょう。

本記事はhjklからの解放を目指しますが、これらを一切使わないわけではありません。 少し設定を変えることで効率化を図ることができます。 答えは単純で、”キーボード の入力速度をあげる”だけ。 これだけでhjklの移動がサクサクします。 初心者向け Vimでカーソルの移動速度を速くする方法 Macでの設定方法を載せておきます。他のOSでも同様に設定ができるはずなので、まずはこちらを試してみてください。

デフォルトのカーソル移動を使いこなす

Vim初心者なのでカーソル移動まとめてみた デフォルトのカーソル移動はこの記事によく纏まっているので詳しく説明は控えますが、ポイントだけ紹介します。

カーソル移動と言ってもvimには複数種類があり、それらを組み合わせて使うことで編集速度は格段に上がります。 上で紹介した記事にならって大きくまとめると6種類にわかれます。

  • 一文字単位の移動
  • 単語移動
  • 行/文/段落単位移動
  • 行指定移動
  • 画面単位移動
  • 検索移動

これらを基本として設定やプラグインなどを用いてカーソル移動を強化していくことになるので、まずはこれらの移動方法の習得をすることが先決です。

単語ごとの移動とf{char}による行内検索はとにかく便利なので意識的に使うことが大事。

行指定移動をする際は

set number

と記述しておくと:{number}による行指定移動が使いやすくなるのでおすすめな設定です。

easymotionでバッファ内移動を高速にする

デフォルトのカーソル移動をさらに高速化させるのがeasymotionです。 Vim-EasyMotionでカーソル移動を爆速にして生産性をもっと向上させる 記事にもありますが、easymotionはスクリーン内の見えている範囲の移動において最小のキーストロークで爆速にカーソルを移動させることを目指したカーソル移動系プラグイン。 操作も簡単なので、慣れるとマジで強力です。

記事でも紹介されているおすすめ機能は記事でも紹介されている’2-key Find Motion’です。

nmap m <Plug>(easymotion-s2)
xmap m <Plug>(easymotion-s2)

例えば以上のように設定することで、m{char}{char}{label}の4ストロークで画面内のほぼ全ての位置にカーソルを移動させることができるという優れもの。 元記事ではmではなくsにキーマップを設定していますが、僕はsに別の機能をマッピング済みでしたのでmに設定しています。

easymotionは画面以内の検索だけではなく、バッファ全体を検索するときにも便利です。 以下、僕がeasymotionのためにしている設定を抜き出して載せておきますので参考にしてみてください。

let g:maplocalleader = 'm'
nnoremap m  <Nop>

map  <Leader> <Plug>(easymotion-prefix)
" <Leader>f{char} to move to {char}
map  <Leader>f <Plug>(easymotion-bd-f)
nmap <Leader>f <Plug>(easymotion-overwin-f)

" s{char}{char} to move to {char}{char}
nmap ff <Plug>(easymotion-overwin-f2)

" Move to line
map  <Leader>L <Plug>(easymotion-bd-jk)
nmap <Leader>L <Plug>(easymotion-overwin-line)

" Move to word
map  <Leader>w <Plug>(easymotion-bd-w)
nmap <Leader>w <Plug>(easymotion-overwin-w)

nmap m <Plug>(easymotion-s2)
xmap m <Plug>(easymotion-s2)
nmap <Leader>t <Plug>(easymotion-t2)

map  <Leader>/ <Plug>(easymotion-sn)
omap <Leader>/ <Plug>(easymotion-tn)

" These `n` & `N` mappings are options. You do not have to map `n` & `N` to EasyMotion.
" Without these mappings, `n` & `N` works fine. (These mappings just provide
" different highlight method and have some other features )
map  n <Plug>(easymotion-next)
map  P <Plug>(easymotion-prev)

map  <Leader>l <Plug>(easymotion-lineforward)
map  <Leader>j <Plug>(easymotion-j)
map  <Leader>k <Plug>(easymotion-k)
map  <Leader>h <Plug>(easymotion-linebackward)

let g:EasyMotion_startofline = 0 " keep cursor column when JK motion

let g:EasyMotion_smartcase = 1
" Smartsign (type `3` and match `3`&`#`)
let g:EasyMotion_use_smartsign_us = 1

カーソル移動の効率化でvimを使用した記事編集は何倍にも早くなる

hjklだけでも普通のテキストエディターに比べたらマウスや矢印キーを使わない分だけ十分早いのですが、hjkl連打だとカーソルを移動する時間”待つ”という行為が生じてしまいます。 この”待つ”時間を意図的に減らすだけでも体感的にファイル編集速度が格段に上がる気がしています。 あと、とにかく狙った場所にカーソルが一発で動くのは快感です。

About the author

日本の大学を休学してスノーボードするためにノルウェーで1年間生活。腰椎分離症になってしまったため、現在は様子を見ながらニセコで滑っています。プロでもなんでもないですが、行けるとこまで行ってやろうと毎日滑ってます