善工需利器 – Linux 指挥棒终端优化


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 设为系统默认终端

  1. 确认特定桌面环境的调用终端相关文件的优先级;
  2. 修改对应的高优先级文件中的调用终端内容;

将 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 非常适合在管道中使用:用交互式界面处理来自管道上游的文本流,并将结果推送给管道下游。

pic-1

0x041 基本能力

fzf 提供了强大的查询能力,这里针对其基本能力进行梳理,全面的功能可以查询 man 说明。

0x0411 默认动作

直接在命令行执行 fzf,不加任何额外参数,会触发 fzf 的默认动作。fzf 的默认动作会获取其当前目录下所有的子目录及文件,以交互界面形式提供。

此外,fzf 提供了修改其默认动作的配置参数,

环境变量名称 说明
FZF_DEFAULT_COMMAND 修改 fzf 的默认指令
FZF_DEFAULT_OPTS 修改 fzf 的默认参数

0x0412 TUI 交互界面

fzf 提供了交互界面,通过搜索框输入关键词,可进行模糊查询。

pic-2

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 界面典型要素的配置参数。

pic-3

0x0413 预览功能

为了方便检索,fzf 在其交互界面上提供了一个预览功能的框架。基于这个预览框架,用户可以通过各种指令来定制预览的内容。

预览功能基本格式如下,

find . -type f | fzf --preview='command {}'
  • command 是预览内容的生成指令,如 catlstree 等等;
  • { } 是占位符(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>

Reference

  1. A Practical Guide to fzf: Building a File Explorer
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇