Vim 本体に取り込まれました (2018/08/24追記)
k-takata さんが書かれているように、タイトルスタックを利用したタイトルの保存/復元機能が Vim 8.1.0253 で取り込まれました。Vim 8.1.0253 以降を使う場合は後述の設定を行わなくてもタイトルスタックに対応した端末でタイトルの復元が行われます。
これによって、他の端末でもタイトルスタックに対応してくれると嬉しいのですが。
Vim を使ってくれてありがとう
Vim には、端末上で使う時にファイル名等の情報を端末ウィンドウのタイトルに表示する機能があります。標準では無効になっていますが、以下の設定を .vimrc に追加するとこの機能が有効になります。
set title
この機能を有効にすると Vim を終了した時にタイトルが「Vim を使ってくれてありがとう」に変わるようになります。
でも、出来れば Vim を起動する前の状態に戻したいですよね? その為にはどうすればよいのでしょうか。
タイトル変更の仕組み
Common Desktop Environment (CDE) と呼ばれるデスクトップ環境の標準端末である dtterm にはウィンドウタイトル変更機能があります。dtterm のウィンドウタイトル変更機能では、 OSC と呼ばれる制御文字列を端末に送りつける事でタイトルを指定した文字列に変更します。現在一般的に使われている端末エミュレータの多くでは、この OSC 文字列を利用したタイトル変更機能に対応しています。
Vim も通常はこの dtterm の拡張機能を利用してウィンドウタイトルを変更するようになっています。しかしこの機能では新しいタイトルを送りつけるだけなので、古いタイトルの情報は判りません。Vim は起動時のタイトルがどうなっているかを知らないので、苦肉の策?として終了時にタイトルを「Vim を使ってくれてありがとう」に変更します。
現在のタイトルがどうなっているか調べられないの?
タイトルが判らないので元に戻せないのならば、タイトルを調べられればいいという事になりますよね。端末には現在のタイトルを調べる機能は無いのでしょうか?
実は有ります。dtterm の拡張機能に、ウィンドウタイトルの問い合わせ機能が有ります。この機能では端末に対してウィンドウタイトルを要求すると、端末が現在のウィンドウタイトルを返すようになっています。
しかし、この dtterm のウィンドウタイトル問い合わせ機能には
- xterm のタイトル変更に比べて対応している端末が少ない
- セキュリティ上の問題がある為、対応している端末でも標準では無効になっている事が多い
という問題があります。その為か Vim はこの機能に対応していません。
タイトルを戻す別の方法
ところで、タイトルを元に戻すのに古いタイトルを知る必要があるのでしょうか。
ちょっと考えてみると、例えば以下のような機能があれば Vim 自体は古いタイトルを知らなくてもタイトルを元に戻せそうです。
- 現在のタイトルを端末に覚えさせる命令
- 端末が覚えていたタイトルに変更させる命令
この二つの機能があれば、Vim 起動時に端末にタイトルを記憶させ、終了時にそのタイトルに戻す命令を送れば、ウィンドウタイトルが起動前の状態に戻るようになります。
xterm にはタイトルスタックと呼ばれる上記の機能があり、Tera Term などの一部の端末エミュレータでもこのタイトルスタックをサポートしています。
さようなら「Vim を使ってくれてありがとう」
タイトルスタックを使って終了時にウィンドウタイトルを元に戻すには .vimrc に以下の設定を追加します。
" Vim 8.1.0253 でタイトルスタックに対応したため、8.1.0253 のパッチが含まれていない時のみ設定を行う
if ! has("patch-8.1.0253")
let &t_ti .= "\e[22;0t"
let &t_te .= "\e[23;0t"
endif
&t_ti は Vim 起動時に送られる文字列で、&t_te は Vim 終了時に送られる文字列です。ここにそれぞれ "ウィンドウタイトルの記録命令"と"ウィンドウタイトルの復元命令"を追加します。これで set title をしていても、Vim 終了時にウィンドウタイトルが起動前の状態に戻るようになります。
問題点としては、タイトルスタックに対応していない端末がまだ結構ある事です。しかし、その場合でも上記の命令が端末に無視されて効果が無いだけで、他には悪影響はありません。
なので、タイトルスタックに対応している端末を使っている人だけではなく、対応していない端末を使っている人も設定してみてはどうでしょうか。
追記: タイトルスタック対応端末
2018年8月現在、自分の知っている範囲では以下の端末がタイトルスタックに対応しています。
- Windows用
- Tera Term
- RLogin
- mintty
- Unix用
- xterm
- mlterm
- gnome-terminal 等の libvte を利用した端末 1
- Mac用
- iTerm2 2
-
libvte では2018年3月に対応しました。バージョンでいうと vte-0.53.0 以降に含まれているようです。比較的最近に対応した為、多くのディストリビューションで利用できるようになるには少し時間がかかりそうです。 ↩