论终端模拟器的优劣
develop
这应该是全网第一篇终端模拟器比较的文章。
闲话少说:
终端模拟器比较 | 系统自带 | 跨平台(支持 Linux ) | 跨平台(支持 macOS ) | 跨平台(支持 win32 ) | 跨平台(支持 Android ) | 支持连字 | GPU 加速 | 背景透明(X11) | 背景透明(Wayland) | 鼠标支持(URL) | 触控屏支持(单指滚动) | 触控屏支持(双指缩放) | 显示图像 | 配置语言 | 开发语言 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
(u)xterm | × | ✓ | ✓ | × | × | × | × | × | × | × | 拖动 | × | × | × | C |
gnome-terminal | gnome | ✓ | × | × | × | × | × | ✓ | ✓ | × | 拖动 | × | × | dconf | C |
konsole | KDE | ✓ | × | × | × | ✓ | × | Not test | × | × | 拖动 | × | × | dosini | C++ |
xfce4-terminal | xfce | ✓ | × | × | × | × | × | Not test | × | × | 长按拖动 | × | × | xfconf | C |
qterminal | LXQt | ✓ | ✓ | × | × | ✓ | × | ✓ | ✓ | × | 拖动 | × | × | dosini | C++ |
kitty | × | ✓ | ✓ | × | × | ✓ | ✓ | ✓ | ✓ | ✓ | × | × | ✓ | kitty conf | C++ |
alacritty | × | ✓ | ✓ | ✓ | × | × | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | × | yaml | rust |
wezterm | × | ✓ | ✓ | ✓ | × | ✓ | ✓ | ✓ | × | ✓ | × | × | ✓ | lua | rust |
termux | termux | × | × | × | ✓ | ✓ | × | - | - | × | ✓ | ✓ | × | properties | Java |
mintty | cygwin/msys2 | × | × | ✓ | × | × | × | - | - | × | ? | ? | × | dosini | C |
windows-terminal | Windows 10 1903 | × | × | ✓ | × | ✓ | ✓ | - | - | ✓ | ? | ? | ? | json | C++ |
conhost | Windows | × | × | ✓ | × | × | × | - | - | × | ? | ? | × | × | C++ |
解释之前的温馨提醒:
- 关于终端、终端模拟器和伪终端看这篇文章就够了
- 如果没有看懂,记住:
- 没有 GUI 界面的是终端
- 有 GUI 界面的是终端模拟器
- 终端模拟器(终端复用器也是)连接了伪终端
开始解释:
系统自带
在 桌面环境 中已经知道:
桌面环境通常包含:
- 终端模拟器
所以四大桌面都有自己的终端模拟器。除此之外,某些操作系统和软件发行版 (termux, cygwin, msys2) 也会预装终端模拟器。
跨平台
- 某些终端模拟器会使用跨平台的 GUI 库开发
- gtk: gnome, xfce
- qt: KDE, LXQt
- 某些不会
- WinRT: windows-terminal 不会支持 Linux
- 在
图形化用户界面
中,已经讨论过支持 GNU/Linux/X 的软件基本都可以通过
- Cygwin/X 支持 Windows
- termux/X 支持 Android
- kitty 因为使用 GLFW 对输入法的支持配置比较麻烦
连字
支持连字需要满足 2 个条件:
- 终端模拟器支持
- alacritty 因为连字影响性能选择不支持 据说 alacritty 比 kitty 和 wezterm 性能快一倍就是因为放弃了连字
- 字体支持
- Firacode 是第一个支持连字的字体
- 笔者目前在用 JetBrainsMono
- 建议选用有 nerd-fonts 补丁过的字体
GPU 加速
可以通过以下方式查看终端模拟器是否使用了 GPU :
- intel_gpu_top: intel GPU
- nvidia-smi: nvidia GPU
背景透明
coding 时可以看到后面的窗口:
- 参考网页浏览器上的代码
- 写 HTML,LaTeX 时看输出的效果
注意, window_background_opacity cannot work on wayland 指出同时在以下条件下因为设计原因无法透明:
- 使用 Wayland
- 全屏
鼠标支持
- 当鼠标移动到某个 URL 时改变鼠标形状
- 当鼠标移动到某个 URL 时可以用 Shift + 单击之类的快捷键打开该 URL 。
触控屏支持
触控屏不是触控板。
支持触控屏需要满足 2 个条件:
- 终端模拟器支持触控屏(不仅仅是鼠标)
- 终端软件支持鼠标,例如:
配置语言
- 不少终端模拟器使用 dosini, json, yaml, properties 之类的数据描述语言。
- 优点:可以轻易的提供一个图形化用户界面的配置按钮来修改配置。但注意 alacritty 没有提供图形化用户界面的配置按钮
- 缺点:不能使用条件逻辑
- Kitty 使用 kitty config(一门 DSL )来配置
- 缺点:不能使用常见数据描述语言的语言服务器,语法高亮,必须另造轮子:
- 优点:有一个
include
语法,可以在各个平台包含不同的文件 (这个文件需要被 gitignore )实现不同平台统一一份点文件
- wezerm 使用 lua
- 优点:可以用
if
/else
/end
实现不同平台统一一份点文件。例如,笔者希望在笔记本电脑和台式电脑上使用不同的字体(两台电脑屏幕大小不一样,字体自然也要不一样)
- 优点:可以用
local wezterm = require 'wezterm'
local hostname = wezterm.hostname()
local font_size
if hostname == 'desktop' then -- 2560x2880
font_size = 16
elseif hostname == 'laptop' then -- 3120x2080
font_size = 12
else
font_size = 12
end
开发语言
不说了,会挨打。
其它
笔者根本不关心以下功能:
- 分屏:这是终端复用器的工作
- 选择模式:选择终端上的某些字符。这是终端复用器的工作
- 下拉模式:有些终端模拟器可以按一个快捷键在显示和隐藏间切换,比如:
- guake
- 笔者早年也用过,但后来随着时间推移,笔者基本上大多数情况下电脑只会开 2 个软件
- 终端模拟器。在里面运行所有 TUI 软件,包括文本编辑器 (neovim) ,邮件客户端 (neomutt) ,版本控制 (git)
- 网页浏览器
- 所以直接 Alt + Tab 切换就可以了
终端复用器一般有如下功能:
- 分屏
- attach/detach: 把某个伪终端放在后台运行。嗯,笔者的惨痛教训:
- 当年在图书馆
ssh
服务器跑深度学习模型,大概训练了一天到最后一个 epoch 了,然后图书馆关门就抱着笔记本电脑刚离开图书馆,网就断了,于是ssh
失败,shell
向所有子进程发送HUP
信号,笔者辛苦训练一天的结果就全没了。然后笔者就学会了怎么开tmux
在后台detach
一个进程了
- 当年在图书馆
- 选择模式:通常会提供 vi 和 emacs 两种键盘映射
终端复用器目前的选择有如下:
- abduco: 只支持 attach/detach 。通常和 dvtm 一起使用
- dvtm: 只支持分屏。通常和 abduco 一起使用
-
screen: 最早的终端复用器
- 默认使用 Ctrl + A 做前缀键
-
tmux: 目前最流行的终端复用器
- 有一门 DSL
- 拥有大量的插件生态。笔者也贡献了不少插件
- 默认使用 Ctrl + B 做前缀键
-
zellij: rust 派的作品
- 支持 wasm 格式的插件,插件开发门槛高于 tmux ,插件生态不如 tmux
- 支持一个非常惊艳的分屏算法,比如 tmux 里先左右二等分屏再左右两边都上下二等分屏,这时增加左上屏的宽度,左下屏的宽度也会随之增加。因为在 tmux 的“认知”里,左边 2 个屏幕是一个整体,增加的是这个整体的宽度。相对的,增加左上屏的高度,右上屏的高度不会增加,因为它们不是一个整体。
zellij
用一个奇特的算法解决了这个问题。 - 默认使用 Ctrl + G 做前缀键
为了不影响终端程序,终端复用器通常只有在一个前缀键按下的情况下才会通过等待第二个键来执行相对应的操作(分屏、attach/detach 等)。 这是常见设定,例如
- docker 拿 Ctrl + p 做前缀键,按 Ctrl + P, Ctrl + Q 或暂停。
- ssh 按 CR, Ctrl + Z 暂停。
笔者本人选择前缀键为 Ctrl + Q ,原因如下:
-
Ctrl + Q 用左手按方便。
tmux
的 Ctrl + A 也是同样的原因 -
Ctrl + Q 是用途最少的键。例如:
-
Ctrl + A:
- 支持 readline 的软件:移动光标到行首
- vi 风格软件:光标下的数字增加
-
Ctrl + B
- 支持 readline 的软件:光标前移
- vi 风格软件:向前翻页
-
Ctrl + Q
- 支持 readline 的软件:解除屏幕冻结。默认 Ctrl + S 是屏幕冻结,但使用
tmux
后可以用:- 前缀键, \[ 屏幕冻结
-
q
解除屏幕冻结 - 所以建议直接在
zsh
中setopt noflowcontrol
取消屏幕冻结相关的原生功能
- vi 风格软件:功能与 Ctrl + V 相同,都是进入块选择模式。
- 所以笔者使用一个功能都有重复的快捷键做前缀键不过分吧?
- 支持 readline 的软件:解除屏幕冻结。默认 Ctrl + S 是屏幕冻结,但使用
-
Ctrl + A:
总结
笔者目前选择如下:
- Android 手机上只能选 termux
- 虚拟机里的 Windows 上使用默认的 Windows terminal 即可
- 没有触控屏的 GNU/Linux 使用 wezterm
- 有触控屏的 GNU/Linux 使用 alacritty
撒花!