Vim の tabpage のカスタマイズ

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

だいぶ前から tabpage の前後移動において、 自分と同じ設定をしている人をみかけないので、 アウトプットしておこうと思います。

ちなみに僕はもう この設定がないとイラッとするくらい 慣れてきています。

tabpage(タブページ)

tabpage を使わずにバッファ操作だけでも使えなくはないのですが、 実際 tabpage の方が分かりやすかったので そちらをメインで使っています。 (とはいえ、バッファ操作も最低限できるようにはしてあります。出来ないと困るので。)

プロジェクト単位というか、 複数のファイルを同時に開いて切り替えながら編集するケースって、 けっこうあると思っています。 そういうときに、:tabnew filename といった形でファイルを開くと 新しい tabpage が出来ます。

tabnext, tabprevious

tabpage が複数になると、 それらの間を移動できないと困ります。

:tabnext, :tabprevious というコマンドはあるものの、 大抵は gt, gT の割り当てられたショートカットを利用します。

だがめんどくさい

tabpage に慣れてくると、徐々に gt, gT だとめんどくさくなってくるんですよね。

例えばそこそこ多くの tabpage が開いてあったときに、 4つ次のやつを開きたいなーというときは 4gt と入力すれば済むのですが、 頭では分かっていても、なかなか gt の前に数字を持ってくるのは難しいです。 開きたい tabpage がいくつ先にあるかなんてどうでもいい 情報なんですよ。数えたくない。

なんというか、ドット (.) や、セミコロン (;) のようにコマンドや検索を繰り返し ドッドッドッ・・・ と順次探していく感じで使いたいのです。 (なんか Vim のテクニックバイブルにこんな話があったような・・・?)

gtgT だと、そもそも2ストロークなので、 そういった ドッドッドッ・・・ と入力して次へ次へ、といった感じで入力できません。

そういった怠惰欲?のようなものが段々と積もってきて、 よーしどこかのキーをつぶそう、となったのでした。

CTRL-L, CTRL-H, CTRL-N の割り当て

Vim なので、 L が右で H が左というイメージ はみなさん共通で持ってます。よね?

なので、 :tabnext<C-l> を、 :tabprevious<C-h> をそれぞれ割り振ることにしました。

実際、今現在は何が割り振られているかというのは、 :h CTRL-L で見てみるとわかります。

                                                        CTRL-L
CTRL-L                  Clear and redraw the screen.  The redraw may happen
                        later, after processing typeahead.

ターミナル上では CTRL-L は使いますが、 Vim に挙動が移ったあとで CTRL-L は正直使いません。

:h CTRL-H も見てみます。

h               or                                      h
<Left>          or                                      <Left>
CTRL-H          or                                      CTRL-H <BS>
<BS>                    [count] characters to the left.  exclusive motion.
                        Note: If you prefer <BS> to delete a character, use
                        the mapping:
                                :map CTRL-V<BS>         X
                        (to enter "CTRL-V<BS>" type the CTRL-V key, followed
                        by the <BS> key)
                        See :fixdel if the <BS> key does not do what you
                        want.

h と同じ役割なので、これもつぶしても良さそうです。

ついでに、:tabnew もめんどくさくなってきたので、 Ctrl-N の入力だけで :tabnew までの入力を勝手にしてくれて、 あとはファイル名を入れるだけという状態 になってくれると良いです。

ちなみに :h CTRL-N はというと、

j               or                                      j
<Down>          or                                      <Down>
CTRL-J          or                                      CTRL-J
<NL>            or                                      <NL> CTRL-N
CTRL-N                  [count] lines downward linewise.

j と同じ役割なので、同様にこれも OK ですね。

ちなみに上記3つの vimrc を抜粋するとこんな感じです。

if v:version>=700
  nnoremap <C-H> :tabprevious<CR>
  nnoremap <C-L> :tabnext<CR>
  nnoremap <C-N> :tabnew<Space>
endif

2006 年ごろですかね? tabpage が有効になったバージョンだけで有効になるような設定になっていますが、 もうこの if 文もいらないですね。

ドッドッドッ・・・と押せる

新規ファイルは連続で開いたりしないのでいいとして、 CTRL-L, CTRL-H については連続で押せます。

2ストロークから、2つのキーの同時押しに変わったことで、 CTRLキーを押しながら L キーを連続して押す という選択肢が生まれ、 ドッドッドッ・・・ という使い方ができるようになりました。

gtgT を使っていた頃と比べると、格段に tabpage が使えるようになり、 自然と Vim にも愛着が湧いてくると思います。

割り当てによるデメリット

新たにキーを割り当てる場合、副作用も考えなくてはなりません。

一番ありうるのは、 普段の環境で割り当てていて、 割り当てられていない環境でそのキーを押してしまう ことです。

ただ、割り当てたキーをそのまま押しても、 今回のケースでは キーの位置の移動か、あるいは再描画のいずれかしか起きない ため、 割り当てられていない環境で押してしまっても、特に副作用はありません。 やったね!

まとめ

僕にとっては tabpage 操作はけっこう優先度高いので、 けっこう重要そうな H, L, N あたりのキーを優先的に割り当てて使っています。

これを設定してから数年使ってますが、デメリットもほぼなく 今まで特に困った記憶はありません。 むしろ自分の知らないこんな機能が割り当てられていて、 それが潰れてしまっていた、みたいな可能性はあるかもしれないので、 もし知らないところで不利益を被っていたら教えてくださると嬉しいです。

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

もし記事内に誤りなどございましたら、 @girigiribauer @girigiribauer.com までご一報いただけると助かります。

Related articles