zdzy

Back

终端是每天打开次数最多的开发工具之一。它不需要炫技,但应该让路径、分支、错误状态和常用操作一眼可见,同时不能因为插件太多而拖慢每一个新窗口。

这次我把配置拆成两个文件:configs/ghostty/config 负责窗口和渲染,configs/zsh/.zshrc 负责 shell 的行为。两者都可以独立复制,配置本身不依赖 Oh My Zsh 或其他主题框架。

1. 先定义目标:少干扰,强反馈#

终端美化最容易走偏的地方是把注意力放在颜色和动画上。我的取舍是:

  • 信息密度适中:提示符显示用户、主机、当前目录和 Git 分支,不显示每次命令都在变化的冗余信息。
  • 失败可感知:上一条命令成功显示绿色 ,失败显示红色
  • 启动可控:补全是 zsh 原生能力,可选工具全部用 command -v 检测后再加载。
  • 配置可迁移:不把绝对路径、机器名称和私有 token 写进仓库。

这四条原则比“装多少插件”更重要。终端是高频工具,启动时多 200ms、每次补全多一次卡顿,累积起来都会影响体验。

2. Ghostty:把视觉设置集中在窗口层#

Ghostty 配置放在 macOS 的 ~/.config/ghostty/config。仓库里的示例使用 Catppuccin Mocha 和 JetBrains Mono:深色背景降低长时间阅读的眩光,等宽字体让日志和表格更容易对齐。

theme = Catppuccin Mocha
font-family = JetBrains Mono
font-size = 15
window-padding-x = 14
window-padding-y = 12
background-opacity = 0.94
background-blur-radius = 24
ini

透明度只保留到 0.94,避免背景图片干扰代码。window-padding-balance 让左右留白一致,代码不会贴着边框。字体大小不追求越大越好,15px 是在 14 英寸屏幕上兼顾信息量和可读性的起点,外接显示器可以按个人距离调整。

Ghostty 的 shell integration 负责同步当前目录、命令状态和窗口标题:

shell-integration-features = cursor,sudo,title
copy-on-select = clipboard
macos-option-as-alt = true
ini

macos-option-as-alt 对 Vim、tmux 和 readline 用户尤其有用;复制即选中则减少了一次 ⌘C,但仍然保留系统剪贴板行为。

最后用快捷键解决高频动作:⌘T 新建标签页,⌘⇧Enter 向右分屏,⌘⌥方向键 在分屏之间移动。快捷键只覆盖窗口级操作,编辑器内的快捷键仍由编辑器自己管理,避免冲突。

3. zsh:先把原生能力用好#

3.1 历史记录要可靠#

多标签终端最常见的问题是历史记录互相覆盖。下面几项组合起来,能让历史实时追加、跨窗口共享、重复命令自动去重,并忽略以空格开头的临时命令:

HISTSIZE=50000
SAVEHIST=50000
setopt append_history inc_append_history share_history
setopt hist_ignore_all_dups hist_ignore_space hist_reduce_blanks
zsh

历史文件放在 ~/.zsh_history,没有把它放进仓库。配置里也没有关闭历史扩展,因此需要时仍可用 !!!$

3.2 补全与提示符保持轻量#

compinit 是 zsh 自带的补全系统。把 dump 文件放进 ~/.cache/zsh,既避免污染主目录,也避免每次启动重复生成。大小写不敏感匹配对文件名和 Git 分支都很友好。

提示符使用 vcs_info 获取 Git 分支,不执行网络操作:

autoload -Uz vcs_info
precmd() { vcs_info }
PROMPT='%F{cyan}%n@%m%f %F{blue}%~%f${vcs_info_msg_0_} %(?.%F{green}❯%f.%F{red}✗%f) '
zsh

它的关键信息顺序是“我是谁、在哪台机器、当前目录、哪个分支、上一条命令是否成功”。进入深层目录时 zsh 会自动缩短路径,长路径不会把命令输入区挤没。

3.3 别名解决重复动作,函数解决带参数动作#

简单命令用别名:gs 查看状态、gd 查看差异、gl 查看最近提交。ezabatrg 只是增强项,只有检测到命令存在才创建别名,因此新机器上不会出现 command not found

带参数的动作使用函数更清楚。例如 mkcd project 会创建目录并进入,extract archive.zip 会根据扩展名选择解压命令。函数对参数数量和文件存在性做校验,错误会返回非零状态,适合放进脚本或组合命令中。

4. 可选工具的加载策略#

fzf 提供历史搜索和文件搜索,zoxide 改善目录跳转,direnv 为项目注入环境变量。这些工具都不是基础依赖,配置采用同一个模式:

command -v zoxide >/dev/null && eval "$(zoxide init zsh)"
command -v direnv >/dev/null && eval "$(direnv hook zsh)"
zsh

这样配置可以在个人电脑、CI 容器和远程服务器之间共享。需要注意,direnv 会执行项目里的 .envrc,只应对自己信任的目录执行 direnv allow

5. 安装、验证与回滚#

先备份本地文件。Ghostty 配置可以直接替换;如果已有 nvm、Homebrew 或其他环境初始化,请把 zsh 示例中的增强段合并到现有 ~/.zshrc,不要无条件覆盖:

mkdir -p ~/.config/ghostty
cp ~/.zshrc ~/.zshrc.backup.$(date +%Y%m%d-%H%M%S)
cp configs/ghostty/config ~/.config/ghostty/config
# 将 configs/zsh/.zshrc 中的内容合并到 ~/.zshrc
shell

打开新的 Ghostty 窗口,依次验证补全、Git 分支提示、mkcd /tmp/demoextract。如果某个可选工具行为不符合预期,删除对应的 command -v ... 行即可,不会影响 zsh 主体。

这套配置的重点不是“看起来像某个主题”,而是让终端在高频使用下保持稳定:颜色服务于状态,留白服务于阅读,插件服务于明确的工作流。把配置放进仓库后,换电脑只需要复制两个文件,就能恢复同样的工作台。

把终端变成可靠的工作台:Ghostty 与 zsh 配置实践
https://blog.zdzy.xyz/blog/ghostty-zsh-setup
Author Easton
Published at September 19, 2026