OFFSET偏移
← 文章目录OFFSET / FIELD NOTESNO. 048

Fish:从键位到可编辑的命令行

保留 Emacs / Vi 键位、补全、缩写、PATH、事件与提示符配置。

所在专题Shell、终端与会话 ↗
约 12 分钟阅读开始阅读

Fish 4.x:开箱即用的智能 shell,含语法高亮、自动补全、历史提示。默认 Emacs 键位,可选 vi 模式。快捷键按 Fish 4.x 笔记整理;终端和自定义绑定可能覆盖默认值,用 bind 与 fish_key_reader 核对。


核心特性速览#

特性 说明
语法高亮 输入时实时着色:有效命令蓝色、无效红色、路径下划线、引号黄色
自动建议 (Autosuggestion) 灰色文字提示历史匹配命令,按 → 或 Ctrl+f 接受
Tab 补全 可导航、可搜索的菜单式补全列表
缩写 (Abbr) 输入缩写 → 空格后自动展开为完整命令
Web 配置 fish_config 在浏览器中选主题、改提示符
Man page 快捷 Alt+h 打开当前命令的手册

通用快捷键(Emacs 和 Vi 模式共享)#

补全

快捷键 动作
Tab / Ctrl+i 补全当前 token
Shift+Tab 补全并打开搜索结果
Ctrl+Space 插入空格但不展开缩写

光标移动

快捷键 动作
← / → 移动一个字符;在行末按 → 接受自动建议
Alt+← / Alt+→ 移动一个参数/单词;空行时浏览目录历史
Ctrl+← / Ctrl+→ 移动一个单词;在行末接受一个单词的建议
Shift+← / Shift+→ 移动一个"大词"(不含标点停顿)

历史搜索

快捷键 动作
↑ / ↓ / Ctrl+p / Ctrl+n 按当前输入内容搜索历史
Alt+↑ / Alt+↓ 按光标所在的 token 搜索历史
Shift+Delete 从历史中删除当前项/自动建议

删除与剪切

快捷键 动作
Ctrl+u 从行首删到光标(→ kill ring)
Ctrl+w 删除前一个路径组件(以 / : @ 为界 → kill ring)
Alt+d 删除下一个单词(→ kill ring)
Ctrl+Delete 删除下一个单词(→ kill ring,macOS 上是下一个参数)
Alt+Delete 删除下一个参数(→ kill ring,macOS 上是下一个单词)

剪贴板

快捷键 动作
Ctrl+x 复制当前命令行到系统剪贴板
Ctrl+v 从系统剪贴板粘贴
Ctrl+y 从 kill ring 粘贴(yank)
Alt+y 粘贴后轮转到 kill ring 前一项(yank-pop)

实用操作

快捷键 动作
Alt+h / F1 显示当前命令的 man page
Alt+l 列出当前目录;光标在目录参数上则列出该目录
Alt+o 在 pager 中打开光标处的文件;光标在脚本命令上则用 $EDITOR 打开该脚本
Alt+p 在光标处的任务后追加 `&
Alt+w 显示光标处命令的简短描述(whatis)
Alt+e / Alt+v 在外部编辑器中编辑当前命令行
Alt+s 在命令前添加 sudo(空行则添加到上一条命令)
Alt+Enter 在光标处插入换行
Ctrl+c 中断当前命令
Ctrl+d 删除光标右字符;空行时退出 fish
Ctrl+l 清屏

Emacs 模式(默认)#

行内移动与编辑

快捷键 动作
Home / Ctrl+a 移到行首
End / Ctrl+e 移到行尾;在行末接受自动建议
Ctrl+b 左移一个字符
Ctrl+f 右移一个字符/接受自动建议
Alt+b 左移一个单词/接受一个单词;空行时向前浏览目录历史
Alt+f 右移一个单词/接受一个单词;空行时向后浏览目录历史
Alt+< 移到命令行开头
Alt+> 移到命令行末尾

删除

快捷键 动作
Backspace / Ctrl+h 删除前一个字符
Delete 删除后一个字符
Ctrl+Backspace 删除前一个单词(macOS 上是前一个参数)
Alt+Backspace 删除前一个参数(macOS 上是前一个单词)
Ctrl+k 删到行尾

大小写转换

快捷键 动作
Alt+c 当前单词首字母大写
Alt+u 当前单词全大写

字符/单词交换

快捷键 动作
Ctrl+t 交换最后两个字符
Alt+t 交换最后两个单词

撤销/重做

快捷键 动作
Ctrl+z / Ctrl+_ / Ctrl+/ 撤销最近的编辑
Alt+/ / Ctrl+Shift+z 重做

历史搜索

快捷键 动作
Ctrl+r 打开历史 pager;重复按下搜索更旧条目
Ctrl+s 在 pager 中跳到更新条目(非 pager 中切换搜索)

取消

快捷键 动作
Escape / Ctrl+g 取消当前操作;撤销自动补全

Vi 模式#

在 config.fish 中启用:

fish_vi_key_bindings

启动后通常进入 Insert 模式;以下按三个子模式组织:Normal(按 Escape 进入)、Insert(i/a/o 等)、Visual(v)。

Normal 模式

移动

快捷键 动作
h 左移一个字符
l 右移一个字符
k 搜索上一条历史命令(多行时光标上移)
j 搜索下一条历史命令(多行时光标下移)
0 移到行首
Backspace 左移一个字符
g,g 移到命令行开头
G 移到命令行末尾

进入 Insert 模式

快捷键 动作
i 在光标处插入
I 在行首插入
a 在光标后插入
A 在行尾插入
o 在下方插入新行
O 在上方插入新行

删除与粘贴

快捷键 动作
d,d 删除整行(→ kill ring)
D 删到行尾
p 粘贴 kill ring 内容

撤销/重做

快捷键 动作
u 撤销
Ctrl+r 重做

大小写

快捷键 动作
~ 切换当前字符大小写,光标前进
g,u 到词尾全部转小写
g,U 到词尾全部转大写

历史搜索

快捷键 动作
[ 按光标 token 搜索前一条历史
] 按光标 token 搜索后一条历史
/ 打开历史 pager

退出

快捷键 动作
:,q 退出 fish

Insert 模式

快捷键 动作
Escape 进入 Normal 模式
Backspace 删除前一个字符
Ctrl+n 接受自动建议

Visual 模式

快捷键 动作
h / l 扩展选中(左右一个字符)
k / j 扩展选中(上下行)
b / w 扩展选中(单词级)
d / x 删除选中 → kill ring,回到 Normal
c / s 删除选中 → Insert 模式
y 复制选中 → kill ring,回到 Normal
",*,y 复制选中到系统剪贴板,回到 Normal
X 删除整行 → kill ring,回到 Normal
~ 切换选中区域大小写,回到 Normal
g,u 选中区域转小写,回到 Normal
g,U 选中区域转大写,回到 Normal
Escape / Ctrl+c 回到 Normal 模式

Tab 补全系统#

基本操作

快捷键 动作
Tab 触发补全/展开建议
Shift+Tab 补全并打开 pager 搜索
Ctrl+s 在补全 pager 中搜索

补全规则示例

# 列出 systemctl 子命令补全
systemctl <Tab>          # → enable, disable, start, stop, status...

# 路径补全
ls ~/Doc<Tab>            # → ~/Documents/

# Git 分支/文件补全
git checkout <Tab>       # → 列出所有分支

# 命令选项补全
git commit -<Tab>        # → -m, -a, --amend, --no-verify...

# 进程 PID 补全
kill <Tab>               # → 列出所有进程 PID + 命令名

常用配置 (~/.config/fish/config.fish)#

别名 → 缩写

# 别名适合函数式包装
alias ga="git add"

# 缩写在输入时展开,展开后可见且可编辑;别名仍然有效
abbr -a ga "git add"
abbr -a gc "git commit"
abbr -a gco "git checkout"
abbr -a gp "git push"
abbr -a gst "git status"

模式切换

# Vi 模式(vim 用户推荐)
fish_vi_key_bindings

# 改回 Emacs
# fish_default_key_bindings

# Vi 模式下光标形状
set -g fish_cursor_default block
set -g fish_cursor_insert line
set -g fish_cursor_replace_one underscore
set -g fish_cursor_visual block

自定义补全颜色

# 让自动建议更低调
set -g fish_color_autosuggestion brblack

Greeting

# 禁用欢迎语
set -g fish_greeting

PATH 管理

# 前置新目录(自动去重)
fish_add_path ~/.local/bin

# 明确追加到 fish_user_paths 的尾部
fish_add_path --append ~/bin

# 已有目录也移到所选位置,而不是保持原位置
fish_add_path --move ~/bin

事件钩子

# 退出时执行
function on_exit --on-event fish_exit
    echo "Goodbye from" (hostname)
end

私有模式#

# 启动私有 session(不记录历史,不影响其他 session)
fish --private
# 或
fish -P

# 在运行中检查
echo $fish_private_mode   # 1 表示私有模式

自定义快捷键#

# 查看某个按键的转义序列名
fish_key_reader

# 绑定新快捷键
bind \cg 'echo "Ctrl+G pressed"'

# 在 Vi 模式特定子模式下绑定
bind --mode insert \cf 'echo "Insert mode specific"'

# 查看所有当前绑定
bind

# 恢复默认
bind --erase \cg

常用内置命令速查#

命令 用途
fish_config Web UI 配置(主题、提示符、快捷键)
fish_key_reader 按键序列诊断
fish_add_path PATH 管理(自动去重)
fish_update_completions 重建补全缓存
fish_default_key_bindings 切换到 Emacs 键位
fish_vi_key_bindings 切换到 Vi 键位
abbr -a 添加缩写
bind 查看/设置键位绑定
set -Ux 设置通用变量
set -gx 设置全局变量
string 字符串处理
functions 查看/管理函数
funced 交互式编辑函数
funcsave 保存函数
type 显示命令类型(函数/内置/外部)

prompt 管理#

# 在终端选择内置提示符
fish_config prompt choose disco

# 查看可用提示符
fish_config prompt show

# 保存选择
fish_config prompt save

参考与延伸

  1. Fish 交互文档 ↗
  2. fish_add_path 的顺序与 move 行为 ↗

根据技术笔记重新整理,示例使用通用名称。

沿专题继续阅读

Shell、终端与会话

  1. 01Fish:从键位到可编辑的命令行
  2. 02Foot:搜索、选择与配置的边界
  3. 03Zellij:窗口关了,会话还在吗?
CONTINUE READING / 下一篇Foot:搜索、选择与配置的边界

区分键盘模式、primary selection、字号和配置生命周期,保留完整键位表。