読者です 読者をやめる 読者になる 読者になる

反省はしても後悔はしない

Vim とか備忘録とか。それと関数型言語勉強中

'set relativenumber' で Vim のカーソルの縦移動とかを改善する

Vim

この記事は Vim Advent Calendar の 311 日目の記事です。昨日は id:osyo-manga さんの unite.vim の action の設定方法いろいろ でした。

set relativenumber

みなさん、Vim で行番号を表示していますか?行番号の表示は vimrcset number ですね。行番号を表示する機能はほとんどのテキストエディタでありますね。ところで、Vim にはちょっと変わった行番号の表示をさせることができます。

vimrcset relativenumber という記述を追加してみましょう。

f:id:cohama:20131007014842g:plain

上のように、現在のカーソルがある行からの相対行数を表示させることができます。なんか気持ち悪いですね。これがなにの役に立つのでしょうか?

j, k を使って目的の行へ素早く移動する

下のスクリーンショットで、hogehoge と書かれた行に移動したいとしましょう。

f:id:cohama:20131007014758g:plain

j 連打する方法や }L のあとで j k で微調整する方法、/ で検索する方法などが思いつきますね。ところで set relativenumber が有効になっているので、目的の行のところはカーソルから 10 行分下方にあることが分かります。この情報を使って 10j とすれば目的の行へ即座にジャンプすることができるようになります。

もちろん、通常の行数を表示させて <行数>G のように移動することもできます。が、この方法だと 1000 行くらいある場合に数字の入力が辛くなってしまいます。relativenumber を使った場合では入力する数字が高々 2 桁程度に収まるのでこちらの方が打ちやすいです。

オペレータとの合わせ技

下のスクリーンショットfoo の行から bar の行までを削除したいとしましょう。

f:id:cohama:20131007015013g:plain

relativenumber で表示されている行数を使うと、これは d6j で一発で削除することができます。6j が 6 行下に移動するモーションコマンドなので現在行と合わせて 7 行分が一気に削除されます。もちろん、削除以外のオペレータと組み合わせることもできます。

Ex コマンドでも

下のスクリーンショットhoge の行をカーソル行の下の行に移動させたいとしましょう。

f:id:cohama:20131007015202g:plain

さて普通に考えれば 4k で移動したあと yy4j で戻って p ですね。実は Ex コマンドを使う別の方法があります。:-4t.<CR> と打つだけです。:t:copy と同じ効果の Ex コマンドで、範囲で指定した行を引数で指定した行の下にコピーします。ここでは範囲として -4 つまり 4 行上の1行分、引数として . つまり現在行をしていしています。

relativenumber の仕様とか

さて、以上で relativenumber の紹介は終わりなんですが、実はこいつは Vim のバージョンによって微妙に仕様が異なります。それをすこしまとめておきます。

  • Vim 7.2 以前: relativenumberVim 7.3 から追加されたオプションなので 7.2 以前の Vim では使えません。諦めるか最新の Vim をビルドしましょう

  • Vim 7.3.786 以前: relativenumber が使えます。カーソル行の表示は常に 0 になります。

  • Vim 7.3.1114 以前: カーソル行の表示が絶対行数の表示になります。

  • Vim 7.3.1115 以降 (Vim 7.4 とか): numberrelativenumber の組み合わせでカーソル行の表示が変わります。nonumber のときはカーソル行の表示が 0 に、number のときは絶対行数の表示になります。

便利だけど、たまに絶対行数も表示したいんだ!

relativenumber は編集には便利なんですが、コードレビューなんかをする際にはやっぱり絶対行数の表示のほうが良かったりします。うーん、どっちも使いたい。

こういう時は表示をトグルさせるようなコマンドを作ってしまいましょう。

nnoremap <F3> :<C-u>setlocal relativenumber!<CR>

Vim 7.3.1115 以降でかつ set number している場合は <F3> を押下するだけで相対行数と絶対行数の表示を切り替えられるようになります。 それ以外の環境だとちょっと工夫する必要がありますが、そんなに難しくないので挑戦してみましょう。

まとめ

  • relativenumber を使うと相対行数の表示ができる
  • j k と相対行の指定を組み合わせて目的の行へ一気に移動できる
  • オペレータとの組み合わせや Ex コマンドでも活用できる

明日は @tek_koc さんです。