Linux 终端是用户指挥机器的核心抓手,高效的终端工具库,是提升用户管理机器效率的关键。现在 Linux 发行版默认提供了很多终端工具,这些工具大多诞生于计算机发展早期阶段,工具执行效率与彼时计算机发展水平相适应,在 Linux 的发展过程中发挥了重要作用;现代计算机各方面性能有了大幅提升,产生了一系列既秉承早期终端工具定位与理念、又能充分发挥现代计算机性能优势、与早期终端工具对位的新终端工具。这些工具提供了更优的执行效率、更美观的执行结果展示界面,进一步提升了计算机的管理效率。
0x01 kitty – 基于GPU的终端模拟器
0x011 参数配置设置
与绝大多数软件一样,可以通过配置文件,对 kitty 的各项参数进行定制化的调整。kitty 的配置信息存储在文件 kitty.conf 中,可以找到文件直接修改相关参数;另外,也可以在 kitty 软件中,执行 Shift + Ctrl + F2 快捷键,也可以进入 kitty 的配置页面。
典型配置样例,
# 字体
font_family MesloLGS NF
font_size 16.0
# Catppuccin Mocha 配色
background #1e1e2e
foreground #cdd6f4
selection_background #585b70
color0 #45475a color8 #585b70 # 黑色系
color1 #f38ba8 color9 #f38ba8 # 红色
color2 #a6e3a1 color10 #a6e3a1 # 绿色
color3 #f9e2af color11 #f9e2af # 黄色
color4 #89b4fa color12 #89b4fa # 蓝色
color5 #f5c2e7 color13 #f5c2e7 # 紫色
color6 #94e2d5 color14 #94e2d5 # 青色
color7 #bac2de color15 #a6adc8 # 白色
# 窗口:自适应大小,内边距,不透明度
remember_window_size no
initial_window_width 100c
initial_window_height 30c
window_padding_width 8
background_opacity 0.92
# 光标
cursor_shape block
shell_integration enabled no-cursor
# 滚动 + 性能
scrollback_lines 10000
repaint_delay 6
0x012 内置界面主题选择
kitty +kitten themes
0x013 设为系统默认终端
- 确认特定桌面环境的调用终端相关文件的优先级;
- 修改对应的高优先级文件中的调用终端内容;
将 kitty 设置为默认终端后,文件管理器 “Open in Terminal” 菜单选项自动调用 kitty。
0x0131 GNOME 桌面
# GNOME 桌面
gsettings set org.gnome.desktop.default-applications.terminal exec 'kitty'
# 系统级 x-terminal-emulator 备选
sudo update-alternatives --set x-terminal-emulator /usr/bin/kitty
0x0132 Linux Mint 设置
- 查看系统默认终端设置
gsettings get org.cinnamon.desktop.default-applications.terminal exec - 设置系统默认终端为 kitty
gsettings set org.cinnamon.desktop.default-applications.terminal exec 'kitty'
0x014 常见问题
0x0141 终端提示光标为竖线
如果配置了 cursor_shape block 但光标在进入 Shell 提示符时依然变成竖线,是因为 Kitty 的 Shell 集成(Shell Integration)会自动控制光标形状。
在 kitty.conf 中修改 shell_integration 配置来禁用它,
shell_integration no-cursor
或者保留其他集成功能,仅禁用光标控制,
shell_integration enabled no-cursor
0x0142 zsh 的 powerlevel10k 的 resize 出现空行
使用 kitty,可以规避 zsh 的 powerlevel10k 的 resize 空行问题。
0x0143 kitty 终端连接 ssh ,输入字符出现重复现象
使用 kitty 终端,连接 ssh 后,输入字符时,总会出现重复现象,比如输入 l,终端会自动出现两个 ll,而且用 backspace 也无法删除的现象。
1. 原因
此类”方向键 / 退格键 / 功能键失灵“的问题,共同根因都是远程机器上没有 kitty 的 terminfo 文件,即远程服务器不识别 kitty 的终端类型 xterm-kitty。本质是本地 kitty(协议先进)和远程终端栈(太老/缺少 kitty terminfo)之间不匹配。
- 字符重复(双字符):kitty 默认启用它自研的键盘协议(CSI-u / extended keyboard protocol),会把”按键按下+释放“等完整事件一并编码发送。远程 shell 的 readline(尤其是版本较老、或没识别出 kitty 终端的)不能正确解析这套 CSI-u 序列时,就会把同一按键解码成两次,于是 l 变 ll。已知的”退格删两个字符、按一次回车变两次“等“双字符“现象,都是这套键盘协议解码异常导致的。
-
退格删不掉:远程终端因为不认识 xterm-kitty,stty/readline 里的 erase 键定义错乱(退格键的字节被当成普通字符,或被映射成了 DELETE/空格),所以按退格不回删,甚至显示一个空格。
2. 解决方案
解决方式有多种,常见方式是使用 kitty 自带的 kitten 指令,即用 kitten ssh 代替传统的 ssh 指令连接远程主机,
kitten ssh user@host
kitty 自带的 kitten ssh 会自动把 terminfo 拷贝到远程,并自动开启 shell 集成。
从保持兼容性及提高普适性角度考虑,尽量不对传统的 ssh 指令进行变更,比较简单的方式是将 kitten ssh 直接别名为 ssh。典型脚本(zsh)如下,
# ~/.zshrc
# 若当前终端是 kitty 且 kitten 命令可用,则 SSH 走 kitten ssh;
# 若当前终端不是 kitty,则 SSH 走传统方式;
if [[ -n "$KITTY_WINDOW_ID" ]] && command -v kitten >/dev/null 2>&1; then
alias ssh='kitten ssh'
fi
0x02 bat – cat 的彩色平替
bat 自称为 “带翅膀的 cat(A cat clone with wings)”,相对 cat 平淡的单色调文本信息显示,bat 提供了更为丰富的语法高亮的彩色显示、分页、标行等多种显示能力。
0x03 eza – ls 的现代版
eza (主页, github) 是经典的命令行文件列表程序 ls 的现代替代品。eza 提供了更多功能和更优的默认设置。它使用颜色来区分文件类型和元数据,支持符号链接、扩展属性和 Git。它体积小、速度快,只有一个二进制文件。
0x031 无感替换 ls
.zshrc 文件末尾添加,
# ============ eza 无感替换 ============
export EZA_STRICT=1 # 严格模式:完整支持 ls 参数,未知参数报错
export EZA_ICONS_AUTO=t # 图标(需终端安装 Nerd Font)
alias ls='eza --group-directories-first'
alias l='eza --group-directories-first'
alias ll='eza -l --git --group-directories-first'
alias la='eza -la --git --group-directories-first'
alias lla='eza -la'
alias lt='eza -l --tree'
alias lt1='eza --tree --level=1'
alias lt2='eza --tree --level=2'
alias lS='eza -l --sort=size'
alias lT='eza -l --sort=modified'
alias lsd='eza -lD'
# 若想完全无感,让 eza 也能用 dircolors(可选)
export EZA_COLORS="${LS_COLORS:-}"
# # 补全:让 eza 有 ls 级别的 tab 补全
autoload -Uz compinit && compinit
# 强制调用原始 ls 的方式保留:\ls 或 command ls
使用 alias 无感替换,在 eza v0.23.5 版本中会出现
Option binary is useless without option long错误,降级其他版本无问题。
0x04 fzf
fzf(官网,Github),全名 fuzzy finder,顾名思义,是一个命令行的模糊查找器。它的核心处理目标是列表,任何种类的列表(确切的说,用换行符 newlines,即 \n 分隔的文本列表),作为输入给到 fzf,fzf 可以提供一种交互式的界面,并采用其创新的模糊算法在列表中搜索我们想要的目标集合并输出。
终端中提供的交互式的界面,称为 TUI,即 Terminal User Interface。如 fzf、htop 等工具,都可以提供 TUI。
fzf 可以接收来自 stdin 的输入,并且将处理结果发送至 stdout,因此,fzf 非常适合在管道中使用:用交互式界面处理来自管道上游的文本流,并将结果推送给管道下游。

0x041 基本能力
fzf 提供了强大的查询能力,这里针对其基本能力进行梳理,全面的功能可以查询 man 说明。
0x0411 默认动作
直接在命令行执行 fzf,不加任何额外参数,会触发 fzf 的默认动作。fzf 的默认动作会获取其当前目录下所有的子目录及文件,以交互界面形式提供。
此外,fzf 提供了修改其默认动作的配置参数,
| 环境变量名称 | 说明 |
|---|---|
| FZF_DEFAULT_COMMAND | 修改 fzf 的默认指令 |
| FZF_DEFAULT_OPTS | 修改 fzf 的默认参数 |
0x0412 TUI 交互界面
fzf 提供了交互界面,通过搜索框输入关键词,可进行模糊查询。

1、模糊查找的关键词语法
fzf 模糊搜索的关键词决定了查询的效率,默认情况下,fzf 以字符为基础单元进行分隔,对输入字符串自行全量组合,用组合后的内容进行搜索。
例如,搜索关键词为 abc,则 fzf 默认搜索找出字符 a、b、c 同时出现的所有组合,包括
- a、b、c 不相连;
- ab相连、c 不相连;
- a 不相连,bc 相连;
- abc 相连;
此外,fzf 还提供了类似正则表达式的元字符,支持多样化需求查询,
| 元字符 | 说明 |
|---|---|
| $ | 行尾标识符 |
| ^ | 行首标识符 |
| | | OR 标识符 |
| 空格 | AND 标识符 |
| ! | NOT 标识符 |
| ‘ | 精准匹配标识符 |
2、TUI 界面定制
使用不同参数配置,可以对 fzf 的 TUI 界面进行个性化定制,如图列出 fzf TUI 界面典型要素的配置参数。

0x0413 预览功能
为了方便检索,fzf 在其交互界面上提供了一个预览功能的框架。基于这个预览框架,用户可以通过各种指令来定制预览的内容。
预览功能基本格式如下,
find . -type f | fzf --preview='command {}'
command是预览内容的生成指令,如cat、ls、tree等等;{ }是占位符(placeholder),代表使用 fzf 选出的结果,这个选出的结果传递给command;
对于预览界面也可以定制化,--preview-label、--preview-label-pos 等选项都可以用来定制化 fzf 的预览界面。
0x042 Shell 整合
fzf 善于处理列表的特点,与流行的 shell 整合,可以进一步通过交互式的方式提升 shell 指令的构建效率。
0x0421 shell 的设置
在 shell 的配置文件中加入指令,
- bash (~/.bashrc)
eval "$(fzf --bash)" - zsh (~/.zshrc)
source <(fzf --zsh) - fish (~/.config/fish/config.fish)
fzf --fish | source
0x0421 快捷键绑定
fzf 进行 shell 整合后,绑定了 3 个 shell 命令行的快捷键,
| 快捷键 | 说明 |
|---|---|
| Ctrl + R | 交互方式选择“历史指令” |
| Ctrl + T | 交互方式选择“当前文件夹下文件和子文件夹” |
| Alt + T | 交互方式选择“当前文件夹下子文件夹并进入”,类似 cd 指令 |
0x0422自动补全
1、文件和目录补全
遇到需要文件名称或路径的相关指令,在指令中加入 ** 占位符,交互方式选择指令中所需的文件或路径。
Tab 键进行多选。
# 当前目录下补全
vim **<TAB>
cd **<TAB>
# 父目录下文件补全
vim ../**<TAB>
# 特定目录下文件补全
vim ../fzf**<TAB>
vim ~/**<TAB>
cd ~/github/fzf**<TAB>
2、进程信息补全
遇到需要进程信息的相关指令,在指令中加入 ** 占位符,交付方式选择指令中所需进程。
Tab 键进行多选。
kill -9 **<TAB>
3、主机名称补全
遇到需要主机名称的相关指令,在指令中加入 ** 占位符,交付方式选择指令中所需主机名称。
ssh **<TAB>
telnet **<TAB>
4、环境变量补全
遇到需要环境变量的相关指令,在指令中加入 ** 占位符,交付方式选择指令中所需环境变量。
unset **<TAB>
export **<TAB>