'set relativenumber' で Vim のカーソルの縦移動とかを改善する
この記事は Vim Advent Calendar の 311 日目の記事です。昨日は id:osyo-manga さんの unite.vim の action の設定方法いろいろ でした。
set relativenumber
みなさん、Vim で行番号を表示していますか?行番号の表示は vimrc
に set number
ですね。行番号を表示する機能はほとんどのテキストエディタでありますね。ところで、Vim にはちょっと変わった行番号の表示をさせることができます。
vimrc
に set relativenumber
という記述を追加してみましょう。
上のように、現在のカーソルがある行からの相対行数を表示させることができます。なんか気持ち悪いですね。これがなにの役に立つのでしょうか?
j, k を使って目的の行へ素早く移動する
下のスクリーンショットで、hogehoge
と書かれた行に移動したいとしましょう。
j
連打する方法や }
や L
のあとで j
k
で微調整する方法、/
で検索する方法などが思いつきますね。ところで set relativenumber
が有効になっているので、目的の行のところはカーソルから 10 行分下方にあることが分かります。この情報を使って 10j とすれば目的の行へ即座にジャンプすることができるようになります。
もちろん、通常の行数を表示させて <行数>G
のように移動することもできます。が、この方法だと 1000 行くらいある場合に数字の入力が辛くなってしまいます。relativenumber
を使った場合では入力する数字が高々 2 桁程度に収まるのでこちらの方が打ちやすいです。
オペレータとの合わせ技
下のスクリーンショットで foo
の行から bar
の行までを削除したいとしましょう。
relativenumber
で表示されている行数を使うと、これは d6j
で一発で削除することができます。6j が 6 行下に移動するモーションコマンドなので現在行と合わせて 7 行分が一気に削除されます。もちろん、削除以外のオペレータと組み合わせることもできます。
Ex コマンドでも
下のスクリーンショットで hoge
の行をカーソル行の下の行に移動させたいとしましょう。
さて普通に考えれば 4k
で移動したあと yy
、4j
で戻って p
ですね。実は Ex コマンドを使う別の方法があります。:-4t.<CR>
と打つだけです。:t
は :copy
と同じ効果の Ex コマンドで、範囲で指定した行を引数で指定した行の下にコピーします。ここでは範囲として -4
つまり 4 行上の1行分、引数として .
つまり現在行をしていしています。
relativenumber の仕様とか
さて、以上で relativenumber
の紹介は終わりなんですが、実はこいつは Vim のバージョンによって微妙に仕様が異なります。それをすこしまとめておきます。
Vim 7.2 以前:
relativenumber
は Vim 7.3 から追加されたオプションなので 7.2 以前の Vim では使えません。諦めるか最新の Vim をビルドしましょうVim 7.3.786 以前:
relativenumber
が使えます。カーソル行の表示は常に 0 になります。Vim 7.3.1114 以前: カーソル行の表示が絶対行数の表示になります。
Vim 7.3.1115 以降 (Vim 7.4 とか):
number
とrelativenumber
の組み合わせでカーソル行の表示が変わります。nonumber
のときはカーソル行の表示が 0 に、number
のときは絶対行数の表示になります。
便利だけど、たまに絶対行数も表示したいんだ!
relativenumber
は編集には便利なんですが、コードレビューなんかをする際にはやっぱり絶対行数の表示のほうが良かったりします。うーん、どっちも使いたい。
こういう時は表示をトグルさせるようなコマンドを作ってしまいましょう。
nnoremap <F3> :<C-u>setlocal relativenumber!<CR>
Vim 7.3.1115 以降でかつ set number
している場合は <F3>
を押下するだけで相対行数と絶対行数の表示を切り替えられるようになります。
それ以外の環境だとちょっと工夫する必要がありますが、そんなに難しくないので挑戦してみましょう。
まとめ
relativenumber
を使うと相対行数の表示ができるj
k
と相対行の指定を組み合わせて目的の行へ一気に移動できる- オペレータとの組み合わせや Ex コマンドでも活用できる
明日は @tek_koc さんです。