【Vim】目的の行に素早く移動する(相対行番号と easymotion プラグイン)


120819-0006.png

vim では移動、編集に行数を指定することがよくあります。そのために行番号を画面に表示して 5j 5 行下へ移動d6k 6 行上まで削除などとするわけですが、パッと見て目標を 5 行下6 行上などと見積もることはなかなか難しいです。

そこでオススメなのが相対行番号です。これは現在カーソルがある位置から見て何行離れているかを画面に表示します。.vimrc 内で set number などと指定する代わりに set relativenumber と入力すると有効になります。

set relativenumber

easymotion プラグイン

この考えを更に発展させたのが easymotion プラグインです。

EasyMotion – Vim motions on speed! : vim online
http://www.vim.org/scripts/script.php?script_id=3526
Lokaltog/vim-easymotion
https://github.com/Lokaltog/vim-easymotion/

github でソースが公開されていますので、インストールは Bundle 'Lokaltog/vim-easymotion'BundleInstall で完了です。(vundle 利用の場合)

使い方

ちょっとデフォルトでは使いにくかったので設定を ~/.vimrc に追加しました。以下の説明はこの設定の元に行います。

" ホームポジションに近いキーを使う
let g:EasyMotion_keys='hjklasdfgyuiopqwertnmzxcvbHJKLASDFGYUIOPQWERTNMZXCVB'
" 「'」 + 何かにマッピング
let g:EasyMotion_leader_key="'"
" 1 ストローク選択を優先する
let g:EasyMotion_grouping=1
" カラー設定変更
hi EasyMotionTarget ctermbg=none ctermfg=red
hi EasyMotionShade  ctermbg=none ctermfg=blue

行移動

たとえば画面の上方にカーソルを移動したいとしましょう。普通なら行番号を見て 15 行上だな、よし、15k っと……などとするわけです。

しかし、如何な達人 Vimmer であろうとも、行数を一瞬で判断するのはキツいです。そこで、easymotion プラグインを使っている場合は 'k と押すと……

120819-0007.png

表示された文字が薄くなり、行頭にアルファベット小文字で目立つショートカットが現れます。

120819-0007.png

Q を押すと、目的の場所にカーソルが移動しました。行を数える必要もありません。便利ですね〜。

単語移動

120819-0007.png

次はもうちょっとピンポイントでの移動です。画面の真ん中にある URL の位置にカーソルを移動したいとします。

120819-0007.png

'w と押すと、ワードごとにショートカットが出現しました。今度は大文字アルファベットも混ざっています。

120819-0007.png

Shift + K を押すと、目的の場所にカーソルが移動しました。

2 ストローク入力

120819-0007.png

遠くに移動しようとすると、一回の入力では移動先を特定できない場合があります。画面下部に見える正規表現の場所まで移動しようと 'w と押すと……

120819-0007.png

画面下部、カーソルの位置から遠いところはショートカットがダブって表示されています。気にせず Shift + B を押してみましょう。

120819-0007.png

2 文字目の入力を求められました。今回は目標の位置である U を押します。

120819-0007.png

ちょっと手間はかかりましたが遠くまで移動できました。

ショートカット一覧

今まで 'k'w の説明を行ってきましたが、他にもたくさんのコマンドが定義されています。

easymotion のコマンド一覧
コマンド 意味
word
アルファベット、数字、アンダースコアなどで構成された“単語”。
WORD
空白のみによって区切られた“単語”。

詳しくは :help word を見てください。

'fx カーソルの右側に現れる x(任意の文字)を探す。
'Fx カーソルの左側に現れる x(任意の文字)を探す。
'tx カーソルの右側に現れる x(任意の文字)の一文字左を探す。
'Tx カーソルの左側に現れる x(任意の文字)の一文字右を探す。
'w カーソルの後に現れる word の最初の文字を探す。
'W カーソルの後に現れる WORD の最初の文字を探す。
'b カーソルの前に現れる word の最初の文字を探す。
'B カーソルの前に現れる WORD の最初の文字を探す。
'e カーソルの後に現れる word の最後の文字を探す。
'E カーソルの後に現れる WORD の最後の文字を探す。
'ge カーソルの前に現れる word の最後の文字を探す。
'gE カーソルの前に現れる WORD の最後の文字を探す。
'j 上方に移動する。
'k 下方に移動する。
'n 前方検索。
'N 後方検索。

いろいろありますが、ぶっちゃけ、'w 'b 'j 'k だけ覚えとけば用は足りると思います。

easymotion の欠点

大変便利な easymotion ですが、いくつか不満もあります。

2 バイト文字がずれる

'w などの単語移動をしようとすると、全角文字では大幅に位置がずれてしまいます。これはどうしようもない感じ。

ビジュアルモードやオペレータコマンドで使えない!

V でビジュアルモードに入った後に、範囲指定に 'w などのコマンドを使おうとしてもうまくいきません。同様に、オペレータコマンド(c 変更、d 削除など)と同時にも使えません。

この辺は割り切って、最初に上げた相対行番号を使ってしのぎましょう。

One thought on “【Vim】目的の行に素早く移動する(相対行番号と easymotion プラグイン)

  1. Pingback: vimの設定ファイル(.vimrc)を晒してみる | Kitchen Garden Blog

コメントを残す