在 Ghostty 中用 SSH 远程连接到服务器,user@ubuntu:~$ 没有颜色,但是在 iTerm2 中是可以正常显示颜色的。
问题根源
这是因为在 Ghostty 里用 SSH 登录后,远程 shell 没有正确识别终端类型(TERM)、颜色能力,或者 shell 配置没有生效;而 iTerm2 默认兼容性更强,所以颜色正常。
先在 Ghostty 里执行 echo $TERM ,大概率会看到 xterm-ghostty 。但很多 Linux 服务器(尤其旧 Ubuntu/CentOS)没有这个 terminfo,所以 bash/zsh 不知道如何支持颜色。而 iTerm2 一般是 xterm-256color ,服务器认识它,所以颜色正常。
解决方法
解决方法很简单,打开 Ghostty 的配置文件,添加如下的内容,然后重启 Ghostty 即可。
term=xterm-256color
设计缘由
Ghostty 这么设计,其实是现代终端的一种趋势:
它希望"准确描述自己的能力",而不是继续假装自己是 xterm-256color。
所以它默认:
term=xterm-ghostty
而不是:
term=xterm-256color
核心原因是:
传统 TERM 的历史问题
Linux/Unix 终端有几十年历史。
以前所有终端都冒充:
xterm
xterm-256color
screen
vt100
但现代终端已经远远超出了这些能力,比如:
- 真彩色(24-bit color)
- GPU 渲染
- Unicode 宽字符
- kitty graphics protocol
- 下划线样式
- RGB 光标颜色
- OSC 8 hyperlinks
- image protocol
- emoji 渲染
- synchronized updates
问题是:
TERM=xterm-256color
根本无法准确表达这些能力。
于是现代终端作者开始说:
"我们不要再假装自己是 xterm 了。"
Ghostty 的理念
Ghostty 作者(Mitchell Hashimoto)有一个很明确的目标:
终端应该像浏览器一样,
明确声明自己的 capability。
所以 Ghostty:
- 使用自己的 terminfo
- 提供自己的 feature set
- 不伪装成 xterm
- 不为了兼容性牺牲规范
这其实和:
- Kitty
- WezTerm
是一类思路。
比如:
| 终端 | 默认 TERM |
|---|---|
| iTerm2 | xterm-256color |
| Alacritty | alacritty |
| Kitty | xterm-kitty |
| Ghostty | xterm-ghostty |
| WezTerm | wezterm |
那为什么 iTerm2 不这么干?
iTerm2 更偏向:
"兼容第一。"
因为 macOS 开发者大量依赖:
- SSH
- 老服务器
- tmux
- vim
- 企业环境
所以它默认继续:
bash
xterm-256color
用户几乎不会踩坑。
但代价是:
- 无法精确表达 capability
- 很多高级功能只能 hack
- 历史包袱重
为什么 Ghostty 在 SSH 上容易出问题
因为 SSH 会把本地 TERM 传给远程:
term=xterm-ghostty
远程服务器必须:
- 有对应 terminfo
- ncurses 支持
- shell 配置兼容
但现实世界:
- 很多服务器几年没升级
- 很多 Docker 镜像极简
- 很多 HPC 环境特别老
- 很多云主机没有 terminfo
于是:
bash
xterm-ghostty
没人认识。
结果 shell 退回基础模式。
Ghostty 作者的真实态度
Ghostty 的哲学其实是:
"错误应该暴露,而不是隐藏。"
也就是说:
如果服务器不支持现代 terminal capability:
- 那是服务器环境问题
- 不应该靠 terminal 模拟器伪装解决
这是很"工程师理想主义"的设计。
现实中的最佳实践
所以很多人最终会:
本地 GUI terminal:
ini
term=xterm-256color
尤其:
- SSH-heavy 用户
- DevOps
- tmux
- 远程 Linux
- Kubernetes
- HPC
因为兼容性收益太大。
一个很有意思的现象
现代 terminal 世界正在分裂成两派:
保守兼容派
- iTerm2
- Windows Terminal
- GNOME Terminal
特点:
- 永远兼容
- 默认 xterm
- SSH 稳
capability 派
- Ghostty
- Kitty
- WezTerm
特点:
- 自定义 TERM
- 更现代
- feature 更强
- 更"规范"
- 但远程兼容容易踩坑
所以这个问题,本质上不是 Ghostty 出错了,而是:
现代 terminal capability 模型
和 Unix 历史兼容体系之间的冲突。