LoginSignup
7
5

More than 5 years have passed since last update.

tmux で $TERM_PROGRAM が受け継がれず iTerm2 かどうか判別がつかなくて困った時の解決法

Last updated at Posted at 2016-12-16

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_PROGRAMApple_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
7
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
5