Vimで行番号を表示する(number / relativenumber)
行番号の表示はset numberで足りますが、「8行下に移動したい」と思ったとき、その行数を1行ずつ数えるのは面倒です。相対行番号を表示すれば、カーソルからの距離がそのまま数字で見えるようになり、{数字}jのようなカウント付き移動が驚くほど使いやすくなります。
目次(11項目)
| 設定 | 表示 |
|---|---|
numberのみ | 絶対行番号 |
relativenumberのみ | 相対行番号(カーソル行は0) |
| 両方 | カーソル行だけ絶対、他は相対 |
行番号を表示する設定
set relativenumber
この1行を設定ファイルに書くだけで、カーソル行を基準に上下の行番号が相対値で表示されるようになります。カーソル行自体の番号は、通常は0または実際の行番号(後述の組み合わせ設定次第)で表示されます。
set relativenumber だけを有効にした状態。カーソル行が0になる絶対行番号と組み合わせる
set number
set relativenumber
両方を同時に有効にすると、カーソル行だけは実際の行番号(絶対値)、それ以外の行は相対値、というハイブリッド表示になります。
1 foo()
2 bar()
3 baz()
4 qux()
5 end
:set number relativenumber2 foo()
1 bar()
3 baz()
1 qux()
2 end
今何行目にいるかを把握しつつ、周囲への移動距離も一目で分かるため、この組み合わせで使っている人が多くいます。
使い方の実例
相対行番号が見えている状態で、8行下に見えている行へ移動したいなら8j、5行上なら5kと打つだけで済みます。目で見た数字をそのままカウントとして打ち込めるので、暗算する必要がなくなります。
挿入モードでは絶対番号に戻す
autocmd InsertEnter * set norelativenumber
autocmd InsertLeave * set relativenumber
文章を打っている最中は移動距離より現在地の方が気になることが多いため、インサートモードに入ったら自動的に絶対行番号へ切り替える設定を組んでいる人もいます。編集と入力それぞれに合った表示を自動化できます。
一時的に切り替える
:set relativenumber! " トグル
文章を書いているときは絶対行番号だけのほうが読みやすく、コードを編集するときは相対表示が便利、というように場面で使い分けたいなら、トグル用のマッピングを用意しておくと切り替えがスムーズになります。
nnoremap <Leader>n :set relativenumber!<CR>
numberとrelativenumberを両方有効にすると、現在地の把握と距離感の両立ができます。カウント付きの縦移動を多用する人ほど恩恵が大きくなります。
相対行番号を知る前は、目的の行までひたすらjを連打するか、目分量で大体の回数を打って微調整していました。設定してからは見えている数字をそのまま打つだけで正確に移動できるようになり、特に長い関数の中を行き来する作業で体感速度が大きく変わりました。インサートモードで自動的に絶対番号へ戻す設定を足してからは、違和感なく使い分けられています。
慣れるまでは違和感があるかもしれない
普通のエディタに慣れた目には、行番号が動くたびに変わって見えるこの表示は最初は違和感があります。とはいえ数日使い続ければ「上の数字」「下の数字」として自然に読めるようになることが多くあります。合わなければすぐset norelativenumberで戻せるので、まずは短期間試すとよいでしょう。
行番号の桁で幅を固定する
相対行番号は1桁から2桁の数字しか出ないので、既定では左の余白が狭く、絶対行番号と切り替えたときに本文の位置が動きます。numberwidth で最小の幅を決めておくと、切り替えても本文がずれません。
set numberwidth=4 " 最小4桁ぶんの幅を確保する
数字が右寄せで表示されるので、幅を広げても読みにくくはなりません。表示を頻繁に切り替える人ほど効いてきます。
大きなファイルで重くなることがある
相対行番号はカーソルが動くたびに画面全体の数字を計算し直します。行数の多いファイルや、構文ハイライトの重いファイルでは、縦移動が引っかかるように感じることがあります。
遅いと感じたら、いったん :set norelativenumber にして比べてみてください。これが原因なら、行数の多いファイルだけ自動で切るという設定にできます。
autocmd BufReadPost * if line('$') > 10000 | setlocal norelativenumber | endif
数えずに飛ぶ手段も持っておく
相対行番号があると 8j のような移動が正確に打てますが、目で数字を読んで打つという手順自体に時間がかかります。距離が離れているときは、検索で飛ぶほうが速いことが多くあります。
目安として、画面に見えていて数字が一目で読めるなら相対行番号、画面の外や数字を探すのに時間がかかるなら検索や行番号指定です。どちらか一方に寄せる必要はなく、両方を使い分けるほうが実際の作業には合います。移動の手段はスクロールとジャンプの記事にまとめています。
まとめ
相対行番号はVimの縦移動を強化する定番の設定です。絶対行番号と組み合わせることで、現在地の把握と移動距離の両方を同時に扱えるようになります。