macOS 環境では,$TERM_PROGRAM
という環境変数にターミナル名が入っています.
- Terminal.app
$ echo $TERM_PROGRAM
# => Apple_Terminal
- iTerm2.app
$ echo $TERM_PROGRAM
# => iTerm.app
普段は気にする必要はないのですが,24bit 色サポートが iTerm のみなので Vim の設定で現在のターミナルを知る必要が生じました.
僕は日頃から tmux を常用しているのですが,ここで問題が1つあります.tmux は環境変数をクリアしてしまい,iTerm2 上であっても tmux 起動後は $TERM_PROGRAM
が Apple_Terminal
になってしまいます.これは iTerm2 が起動時に行っている $TERM_PROGRAM
の上書きが行われないためです.なので,.tmux.conf に明示的に「$TERM_PROGRAM
を tmux 起動後のシェルに forward してね」という設定を書く必要があります.tmux は ssh 関連の環境変数や $DISPLAY
などいくつかはデフォルトで環境変数をセットしてくれますが,それ以外は手で .tmux.conf に指定する必要があるようです.
tmux 内のシェルにセットされる環境変数を起動時や attach 時に更新するには update-environment
にスペース区切りの環境変数を指定する必要があります.デフォルト値を壊すといけないので -a
オプションを使って追記します.
set -ga update-environment " TERM_PROGRAM"
セットされている環境変数は下記のコマンドで一覧できます
$ tmux show-environment
これで Vim の設定も下記のように書けば良くなりました.
if has('termguicolors') && $TERM_PROGRAM ==# 'iTerm.app'
let &t_8f = "\<Esc>[38;2;%lu;%lu;%lum"
let &t_8b = "\<Esc>[48;2;%lu;%lu;%lum"
set termguicolors
endif