SSH時にターミナルの色を変える
2025-01-03
SSHでリモートサーバに接続するときに、ターミナルの色を変える方法をメモしておきます。
iTerm2を使っていた時分にはプロフィールの切り替えで結構簡単にできたのですが、Alacrittyに移行してからは簡単にできる方法がなさそうだったのでずっと手つかずでした。この度まあまあ使えそうな設定にたどり着いたので、記録しておきます。数日前からGhosttyを試しているので、これにも対応できるようにしてみました。
各ツールのバージョンは以下の通りです。
- macOS: Sonoma 14.6.1
- Alacritty: 0.14.0 (22a4475)
- Ghostty: 1.0.1
- zsh: 5.9
- tmux: 3.5a
Alacrittyの設定
~/.config/alacritty/
以下に設定ファイルを置いていますが、以下のように配置します。colors/
に入っている色の設定ファイルはここから入手します。
.
├── alacritty.toml
├── base.toml
└── colors
├── Cobalt2.toml
├── Mariana.toml
...
└── zenburn.toml
alacritty.toml
[general]
import = [
"./base.toml",
"./colors/wombat.toml"
]
base.toml
[env]
TERM = "xterm-256color"
TERM_PROGRAM = "alacritty"
[font]
size = 14
[font.bold]
family = "CaskaydiaCove Nerd Font Mono"
style = "SemiBold"
[font.italic]
family = "CaskaydiaCove Nerd Font Mono"
style = "SemiLight Italic"
[font.normal]
family = "CaskaydiaCove Nerd Font Mono"
style = "SemiLight"
[font.offset]
x = 0
y = 2
[[keyboard.bindings]]
action = "SpawnNewInstance"
key = "N"
mods = "Command"
[selection]
save_to_clipboard = true
[window]
decorations = "full"
dynamic_padding = true
opacity = 0.95
[window.padding]
x = 5
y = 6
Ghosttyの設定
同じく、~/.config/ghostty/
以下に設定ファイルを置いています。こちらの構成はこんな感じ。
.
├── config
└── ssh
config
shell-integration = zsh
font-size = 14
font-family = CaskaydiaCove Nerd Font Mono
font-family = Utatane
font-family = Cascadia Next SC Bold
quit-after-last-window-closed = true
config-file = ?theme
ssh
theme = Cyberdyne
私の環境だけかもしれませんが、日本語のフォールバックフォントが変になるので(名前順に一番上のフォントを読み込んでいる模様)、font-family
にいくつかフォントを指定して、日本語や中国語簡体字に対応できるようにしています。
シェルの設定
ここがこの設定のポイントですが、AlacrittyとGhosttyでは若干異なる戦略を取っています。
AlacrittyではSSH接続前にmsg config
で設定を上書きし、切断後にリセットしています。GhosttyではSSH接続前にssh
ファイルをtheme
にリンクし、切断後にシンボリックリンクを削除しています。
Alacrittyは自動的に変更後の設定を読み込んでくれますが、Ghosttyでは手動で読み込む必要があります。
.zshrc
# change terminal color in SSH for Alacritty
function ssh_alacritty() {
# change color
alacritty msg config "$(cat ~/.config/alacritty/colors/catppuccin_latte.toml)"
alacritty msg config "window.opacity=1"
# run SSH
command ssh "$@"
# reset color
alacritty msg config --reset
}
# change terminal color in SSH for Ghostty
function ssh_ghostty() {
# change color
if [[ ! -e ~/.config/ghostty/theme ]]; then
ln -s ~/.config/ghostty/ssh ~/.config/ghostty/theme
fi
# Command + Shift + , to reload config
# run SSH
command ssh "$@"
# reset color
if [[ -e ~/.config/ghostty/theme ]]; then
rm ~/.config/ghostty/theme
fi
# Command + Shift + , to reload config
}
# change terminal color in SSH
function ssh() {6
if [[ $TERM_PROGRAM == "ghostty" ]]; then
ssh_ghostty "$@"
elif [[ $TERM_PROGRAM == "alacritty" ]]; then
ssh_alacritty "$@"
else
command ssh "$@"
fi
}
tmuxを使っている場合
上記のスクリプトでは$TERM_PROGRAM
でターミナルの種類を判定していますが、tmuxを使っているとこの環境変数が継承されないことがあるので、tmuxの設定ファイルに以下の行を追加します。
tmux.conf
set-option -ga update-environment " TERM_PROGRAM"
その上で、tmuxの環境変数をシェルに反映させるために、以下の行を.zshrc
に追加します。
.zshrc
# propagate tmux environment variables in the shell
if [[ -n "$TMUX" ]]; then
eval $(tmux showenv -s)
fi
おわりに
以上で、SSH接続時にターミナルの色を変えることができるようになりました。
ただ、この設定だとSSH接続時のターミナルだけではなく、他に開いているターミナルの色もすべて変わってしまうので、そこをコントロールする方法を模索中です。