kenban nikki    archives   tags   

SSH時にターミナルの色を変える

2025-01-03

SSHでリモートサーバに接続するときに、ターミナルの色を変える方法をメモしておきます。

iTerm2を使っていた時分にはプロフィールの切り替えで結構簡単にできたのですが、Alacrittyに移行してからは簡単にできる方法がなさそうだったのでずっと手つかずでした。この度まあまあ使えそうな設定にたどり着いたので、記録しておきます。数日前からGhosttyを試しているので、これにも対応できるようにしてみました。

各ツールのバージョンは以下の通りです。

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接続時のターミナルだけではなく、他に開いているターミナルの色もすべて変わってしまうので、そこをコントロールする方法を模索中です。