你好!最近,我进行了一项终端调查,询问人们是什么让他们感到沮丧。一位网友评论道:
拥有现代终端体验需要很多要素。我希望这一切都能开箱即用。
我的第一反应是“哦,获得现代终端体验并不难,你只需要……”,但我想得越多,“你只需要……”列表就越长,我保留了思考越来越多的警告。
因此,我想我应该写下一些笔记,说明拥有“现代”终端体验对我个人来说意味着什么,以及我认为什么会让人们难以到达那里。
什么是“现代终端体验”?
以下是对我来说很重要的一些事情,以及系统的哪个部分负责这些事情:
- 对复制和粘贴的多行支持:如果您在 shell 中粘贴 3 个命令,它不应该立即运行它们!太可怕了! (外壳、终端仿真器)
- 无限 shell 历史记录:如果我在 shell 中运行命令,它应该永久保存,而不是在 500 个历史记录条目或其他内容后删除。另外,我希望命令在运行时立即保存到历史记录中,而不仅仅是在退出 shell 会话 ( shell ) 时
- 一个有用的提示:如果我的提示( shell )中没有当前目录和当前 git 分支,我就无法生活
- 24 位颜色:这对我来说很重要,因为我发现使用 24 位颜色支持来主题化 Neovim 比在只有 256 色的终端(终端模拟器)中更容易
- vim 和我的操作系统之间的剪贴板集成,这样当我在 Firefox 中复制时,我只需在 vim 中按
p
即可粘贴(文本编辑器,也可能是操作系统/终端模拟器) - 良好的自动完成功能:例如像 git 这样的命令应该具有特定于命令的自动完成功能( shell )
- 在 ls ( shell 配置)
ls
有颜色 - 我喜欢的终端主题:我在终端上花了很多时间,我希望它看起来不错,并且我希望它的主题与我的终端编辑器的主题相匹配。 (终端模拟器、文本编辑器)
- 自动终端修复:如果程序打印出一些奇怪的转义码,弄乱了我的终端,我希望它自动重置,这样我的终端就不会弄乱( shell )
- 键绑定:我希望
Ctrl+left arrow
起作用( shell或应用程序) - 能够在
less
等程序中使用滚轮:(终端仿真器和应用程序)
还有一百万种其他终端便利设施,不同的人看重不同的东西,但如果没有这些,我会感到非常不高兴。
我如何获得“现代体验”
我的基本方法是:
- 使用
fish
。大多数情况下不要配置它,除非:- 将
EDITOR
环境变量设置为我最喜欢的终端编辑器 - 别名
ls
为ls --color=auto
- 将
- 使用任何支持 24 位颜色的终端模拟器。过去我使用过 GNOME Terminal、Terminator 和 iTerm,但我对此并不挑剔。除了选择字体之外,我并没有真正配置它。
- 使用
neovim
,其配置是我在过去 9 年左右的时间里非常缓慢地构建的(我上次删除我的 vim 配置并从头开始是 9 年前) - 使用base16框架来主题化一切
一些“现代”体验的“开箱即用”选项
如果您想要良好的体验,但又不想在配置上花费大量时间怎么办?弄清楚如何以我满意的方式配置 vim 确实花了我十年的时间,这是一个很长的时间!
关于如何以最少的配置获得合理的终端体验,我的最佳想法是:
- shell:
fish
或zsh
以及oh-my-zsh - 终端模拟器:几乎任何支持 24 位颜色的东西,例如所有这些都很受欢迎:
- linux:GNOME 终端、Konsole、终结者、xfce4-terminal
- mac:iTerm(Terminal.app 不支持 256 色)
- 跨平台:kitty、alacritty、wezterm 或 Ghostty
- 外壳配置:
- 将
EDITOR
环境变量设置为您最喜欢的终端文本编辑器 - 也许将
ls
别名为ls --color=auto
- 将
- 文本编辑器:这是一个艰难的问题,也许是微或螺旋?我没有认真使用过它们中的任何一个,但它们看起来都是非常酷的项目,我认为令人惊奇的是您可以使用所有常用的 GUI 编辑器命令(
Ctrl-C
进行复制,Ctrl-V
进行粘贴,Ctrl-A
进行粘贴)选择全部)在 micro 中,它们会执行您所期望的操作。我可能会尝试改用螺旋,除非重新训练我的 vim 肌肉记忆似乎太难了。 Helix 还没有 GUI 或插件系统。
就我个人而言,我不会使用 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 或其他什么中自定义提示符,甚至不需要那么复杂(在 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 的终端来满足所有终端需求,并且大多数情况下不要在终端中编辑文件
问题3:个人申请
最后一个问题是,有时我使用的个别程序有点烦人。例如,在我的 Mac OS 计算机上, /usr/bin/sqlite3
不支持Ctrl+Left Arrow
键盘快捷键。修复此问题以在 SQLite 中获得合理的终端体验有点复杂,我必须:
- 意识到为什么会发生这种情况(Mac OS 不会提供 GNU 工具,“Ctrl-左箭头”支持来自 GNU readline)
- 找到一个解决方法(从自制程序安装 sqlite,它确实有 readline 支持)
- 调整我的环境(将Homebrew的sqlite3放入我的PATH中)
我发现调试像这样的特定于应用程序的问题确实不容易,而且通常感觉不“值得”——通常我最终只会处理各种小不便,因为我不想花几个小时来调查它们。我能够弄清楚这个问题的唯一原因是我最近花了很多时间思考终端。
使用终端程序获得“现代”体验的很大一部分就是使用较新的终端程序,例如,我懒得去学习键盘快捷键来对top
中的列进行排序,但在htop
中我只需单击一列用鼠标进行排序。所以我用 htop 代替!但是发现新的更“现代”的命令行工具并不容易(尽管我在这里列出了一个列表),找到我在实践中真正喜欢使用的工具需要时间,而且如果你通过 SSH 连接到另一台机器,它们并不总是如此在那里。
一切都会影响其他一切
我发现配置终端以使一切变得“美好”的棘手之处在于,改变我的工作流程中看似很小的事情实际上可能会影响其他一切。例如现在我不使用 tmux。但如果我需要再次使用 tmux(例如,因为我正在通过 SSH 连接到另一台机器上进行大量工作),我需要考虑一些事情,例如:
- 如果我希望 tmux 的副本通过 SSH 与我的系统剪贴板同步,我需要确保我的终端模拟器 支持 OSC 52
- 如果我想使用 iTerm 的 tmux 集成(这使得 tmux 选项卡变成 iTerm 选项卡),我需要更改配置颜色的方式 – 现在我使用 shell 启动时运行的shell 脚本来设置它们,但这意味着恢复 tmux 会话时颜色会丢失。
可能还有更多我没有想到的事情。 “使用 tmux 意味着我必须改变我管理颜色的方式”听起来不太可能,但这确实发生在我身上,我决定“好吧,我现在不想改变我管理颜色的方式,所以我想我”我没有使用该功能!”。
也很难记住我所依赖的功能 – 例如,也许我当前的终端确实支持 OSC 52,并且因为通过 SSH 从 tmux 进行复制始终有效,我什至没有意识到这是我需要的东西,然后它当我切换终端时,它神秘地停止工作。
慢慢地改变事情
就我个人而言,尽管我认为我的设置并没有那么复杂,但我花了20年才达到这一点!由于终端配置更改很可能会产生意外且难以理解的后果,因此我发现,如果我一次更改大量终端配置,那么如果出现问题,就很难理解出了什么问题,这真的会让人迷失方向。
所以我更喜欢做一些很小的改变,并且接受改变可能需要我很长时间才能适应。例如,我在一两年前从使用ls
切换到eza ,虽然我认为我喜欢它,但我仍然不太确定它。
获得“现代”终端并不那么容易
试图解释配置终端是多么“容易”,实际上让我觉得这有点困难,而且有时我仍然感到困惑。
我发现从来没有一种完美的方法可以在终端中配置与其他所有事物兼容的事物。我只需要尝试一些东西,找出某种适合我的本地稳定状态,并接受如果我开始使用新工具,它可能会破坏系统,我可能需要重新考虑事情。
原文: https://jvns.ca/blog/2025/01/11/getting-a-modern-terminal-setup/