打造一套“现代”终端环境需要做些什么?
原文由 Julia Evans 于 发布,订阅该博客
你好!最近我做了一项关于终端的问卷调查,询问大家在使用中有哪些困扰。有人这样留言:
想要获得现代化的终端体验,需要拼凑的东西太多了。真希望它能开箱即用。
我的第一反应是“哦,要获得现代化的终端体验没那么难,你只要……”,但越想,这个“只要……”后面的清单就越长,而且各种例外和注意事项也越来越多。
所以我想写下一些笔记,聊聊对我个人而言“现代化”的终端体验到底意味着什么,以及我认为是什么让人们难以实现它。
什么是“现代化的终端体验”?
以下是对我来说很重要的几点,以及系统中负责实现它们的组件:
- 多行复制粘贴支持:如果你在 shell 里粘贴了 3 条命令,它不应该立刻全部执行!这太吓人了!(shell、终端模拟器)
- 无限的 shell 历史记录:如果我在 shell 里运行了一条命令,它应该被永久保存,而不是在 500 条之后就被删掉之类的。而且我希望命令在执行后就立刻写入历史记录,而不是要等到退出 shell 会话时才保存(shell)
- 实用的提示符:没有当前目录和当前 git 分支的提示符,我根本没法用(shell)
- 24 位真彩色:这对我很重要,因为相比只有 256 色的终端,有了 24 位真彩色支持,给 neovim 配主题要容易得多(终端模拟器)
- 剪贴板集成,让 vim 和操作系统之间互通,这样我在 Firefox 里复制后,就能在 vim 里直接按
p粘贴(文本编辑器,可能还涉及操作系统/终端模拟器) - 好用的自动补全:比如 git 这类命令应该有针对具体命令的自动补全(shell)
- 让
ls带上颜色(shell 配置) - 我喜欢的终端主题:我在终端里要待很长时间,希望它看起来舒服,而且主题要和终端编辑器的主题一致。(终端模拟器、文本编辑器)
- 自动修复终端:如果某个程序输出了奇怪的转义字符把终端弄乱了,我希望它能自动重置,别让终端一直处于错乱状态(shell)
- 按键绑定:我希望
Ctrl+left arrow能正常工作(shell 或应用程序) - 能在
less这类程序里用滚轮滚动:(终端模拟器和应用程序)
终端上还有成千上万其他便利功能,不同的人看重的东西也不一样,但上面这些是我一旦缺失就会非常难受的。
我是如何实现“现代化”体验的
我的基本做法是:
- 使用
fishshell。基本不做配置,除了:- 把
EDITOR环境变量设为我最喜欢的终端编辑器 - 把
ls设为ls --color=auto的别名
- 把
- 使用任意支持 24 位真彩色的终端模拟器。过去我用过 GNOME Terminal、Terminator 和 iTerm,但在这方面我并不挑剔。除了选个字体外,基本不做其他配置。
- 使用
neovim,配置是我在过去大约 9 年里慢慢搭起来的(上一次把 vim 配置删掉重来就是 9 年前) - 使用 base16 framework 来统一所有主题
有几点影响了我的选择:
- 我不需要经常 SSH 到其他机器上
- 我宁愿稍微用一下鼠标,也不愿为所有操作都去想一套纯键盘的方案
- 我做的多是许多小项目,而不是一个大项目
一些开箱即用的“现代化”体验方案
如果你想要不错的体验,又不想花太多时间去配置,该怎么办呢?要把 vim 配置到让我满意的状态,真的花了我大概十年时间,这可不短!
对于如何用最少的配置获得一个还不错的终端体验,我最好的建议是:
- shell:要么用
fish,要么用zsh加 oh-my-zsh - 终端模拟器:几乎任何支持 24 位真彩色的都可以,比如下面这些都很流行:
- linux:GNOME Terminal、Konsole、Terminator、xfce4-terminal
- mac:iTerm(Terminal.app 不支持 256 色)
- 跨平台:kitty、alacritty、wezterm 或 ghostty
- shell 配置:
- 把
EDITOR环境变量设为你最喜欢的终端文本编辑器 - 也许可以把
ls设为ls --color=auto的别名
- 把
- 文本编辑器:这个比较难选,也许可以试试 micro 或 helix?我没有深入用过它们,但它们看起来都是非常棒的项目,我觉得能在 micro 里直接使用所有常见的图形界面编辑器快捷键(
Ctrl-C复制、Ctrl-V粘贴、Ctrl-A全选)并且表现符合预期,这一点非常了不起。我本来可能会尝试换成 helix,只是要重新训练我的 vim 肌肉记忆实在太难了。而且 helix 目前还没有图形界面和插件系统。
就我个人而言,我不会把 xterm、rxvt 或 Terminal.app 当作终端模拟器,因为以我过去的经验,它们缺少一些核心功能(比如 Terminal.app 就不支持 24 位真彩色),会让终端用起来更费劲。
不过,我也不想假装获得“现代化”的终端体验比实际更容易——我认为有几个问题让这件事变难。我们来聊聊它们!
实现“现代化”体验的难题 1:shell
bash 和 zsh 无疑是迄今为止最流行的两种 shell,但开箱即用的默认体验都不能让我满意,例如:
- 你得自己定制提示符
- 默认不带 git 补全,得自己去配置
- 默认情况下,bash 只保存 500(!)行历史记录,而(至少在 Mac OS 上)zsh 也只配置为保存 2000 行,这仍然不算多
- 我觉得 bash 的 Tab 补全非常让人抓狂,如果有多个匹配项,你没法用 Tab 在它们之间轮流切换
尽管我很喜欢 fish,但它不兼容 POSIX,这也让很多人难以切换过去。
当然,完全可以去学怎么在 bash 之类的 shell 里定制提示符,而且也不一定很复杂(在 bash 里我可能会先试试像 export PS1='[\u@\h \W$(__git_ps1 " (%s)")]\$ ' 这样的配置,或者干脆用 starship)。但每一个这种“不复杂”的小事累积起来就不少了,尤其是当你需要在多台机器间同步配置时,就更麻烦了。
要获得“现代化”的 shell 体验,一个极其流行的解决方案是 oh-my-zsh。它看起来是个很棒的项目,我也知道很多人用得很开心,但我过去在使用这类配置系统时遇到过困难——现在光是基础的 oh-my-zsh 就会增加大约 3000 行配置,而且我常常发现,多了一层配置系统会让出问题时更难排查到底发生了什么。就我个人而言,我总是忍不住用它来加一堆额外插件,把系统弄得很慢,然后又因为太慢而感到沮丧,最后干脆全部删掉、从头重写一份配置。
实现“现代化”体验的难题 2:文本编辑器
在我最近做的终端问卷调查中,最受欢迎的终端文本编辑器毫无疑问是 vim、emacs 和 nano。
我认为终端文本编辑器的主要选择有:
- 使用 vim 或 emacs 并按喜好配置,只要肯花功夫,基本上想要什么功能都能实现
- 使用 nano 并接受体验会比较受限(比如我觉得在 nano 里好像没法用鼠标选中文本然后“剪切”)
- 使用
micro或helix,它们似乎提供了相当不错的开箱即用体验,只是偶尔可能会因为编辑器比较小众而遇到一些问题 - 尽量避免使用终端文本编辑器,也许就用 VSCode,用 VSCode 自带的终端来满足所有终端需求,基本不在终端里编辑文件。或者我知道很多人会在终端里把
code设为EDITOR。
难题 3:单个应用程序
最后一个问题是,有时我用的个别程序会有点烦人。比如在我的 Mac OS 机器上,/usr/bin/sqlite3 就不支持 Ctrl+Left Arrow 快捷键。为了在 SQLite 里获得一个还算合理的终端体验,修复这个问题有点麻烦,我不得不:
- 弄清楚为什么会这样(Mac OS 不会自带 GNU 工具,而“Ctrl-Left arrow”的支持来自 GNU readline)
- 找到变通办法(从 homebrew 安装 sqlite,它是带 readline 支持的)
- 调整我的环境(把 Homebrew 的 sqlite3 放到 PATH 里)
我发现调试这类特定于应用的问题真的不容易,而且常常感觉“不值得”——很多时候我最后就忍受各种小小的不便算了,因为不想花上好几个小时去排查。之所以这次居然能弄明白,完全是因为我最近花了大量时间在琢磨终端这件事。
使用终端程序时,获得“现代化”体验很大一部分就在于使用更新的终端程序,比如我才懒得去记 top 里给列排序的快捷键,但在 htop 里我只要用鼠标点一下列标题就能排序。所以我就改用 htop 了!不过,要发现那些更新、更“现代”的命令行工具并不容易(虽然我在这里整理过一份清单),找到真正用着顺手的也需要时间,而且如果你 SSH 到另一台机器上,那些工具还不一定有。
牵一发而动全身
在配置终端、想把一切都弄得“顺手”的过程中,我觉得棘手的一点是,工作流中看似微小的一个改动,都可能影响到其他所有环节。比如我现在不用 tmux。但如果我又需要用 tmux 了(比如因为要经常 SSH 到另一台机器上干活),就得考虑几件事,例如:
- 如果我想让 tmux 的复制内容通过 SSH 与系统剪贴板同步,就得确保我的终端模拟器支持 OSC 52 support
- 如果我想用 iTerm 的 tmux 集成(它能把 tmux 标签页变成 iTerm 标签页),就得改变我配置颜色的方式——现在我是在 shell 启动时运行一个shell 脚本来设置颜色,但这意味着在恢复 tmux 会话时颜色会丢失。
而且可能还有更多我没想到的事。“用了 tmux 就得改变我管理颜色的方式”听起来有点不可思议,但这的确就发生在我身上,而我的决定是“好吧,我现在不想改变管理颜色的方式,所以这个功能还是不用了!”
要记住自己到底依赖了哪些功能也很难——比如也许我现在的终端确实支持 OSC 52,而因为通过 SSH 从 tmux 复制一直都能正常工作,我甚至意识不到这是自己需要的功能,然后换了个终端后它就莫名其妙地失效了。
慢慢改
就我个人而言,虽然我觉得自己的配置并不算很复杂,但走到今天这一步也花了我 20 年!因为终端配置的改动很容易带来意想不到且难以理解的后果,我发现如果一下子改动太多终端配置,一旦出问题就更难弄明白到底哪里错了,这会让人非常迷茫。
所以我通常更喜欢做一些很小的改动,并接受自己可能需要非常长的时间来适应这些变化。比如一两年前我从 ls 换成了 eza,虽然我挺喜欢它(因为 eza -l 默认就会打印人类可读的文件大小),但我至今仍不太确定这个选择。不过有时候做一次大的改变也是值得的,比如 10 年前我从 bash 换到 fish,就非常庆幸自己这么做了。
获得一个“现代”的终端并不那么容易
试图去解释配置终端有多“容易”,反而让我觉得这事其实挺难的,而且我到现在有时还是会感到困惑。
我发现,终端里从来没有一种完美的配置方式能与所有其他东西完全兼容。我只能不断尝试,摸索出一种对自己管用、局部稳定的状态,并接受一旦开始使用新工具,就可能会打破这种平衡,需要重新考虑一切。
随机一篇博客
评论
登录后参与讨论