基于 Fish Shell + Starship + Atuin + Zoxide + fzf 的现代化终端配置,
涵盖所有快捷键、无感集成函数、工具链及安装命令。


📋 配置总览

工具 作用 状态
Fish Shell 环境 ✅ 核心
Starship 智能提示符(Git/时间/错误码) ✅ 已启用
Atuin 加密历史同步与搜索 ✅ 已启用
Zoxide 智能目录跳转(记忆访问记录) ✅ 已启用
fzf 模糊查找(文件/历史/目录/进程) ✅ 已启用
eza ls 现代化替代(彩色、图标、树状) ✅ 已启用
bat cat 增强版(语法高亮、行号) ✅ 已启用
fastfetch 终端系统信息展示 ✅ 已启用
direnv 目录级环境变量自动加载 ✅ 已启用
pay-respects 命令纠错(f 键自动修正) ✅ 已启用
git-delta git diff 美化(语法高亮、并排对比) ✅ 已配置
done 长时间命令完成后桌面通知 ✅ 已启用
tldr man 速查替代 ✅ 已集成
xh 现代化 HTTP 客户端 ✅ 已集成
jless JSON 交互式查看器 ✅ 已集成
glow Markdown 终端渲染器 ✅ 已集成
bottom 系统监控器(htop 替代) ✅ 已集成
procs 现代化进程查看 ✅ 已集成
sd 现代化 sed ✅ 推荐
dust 图形化 du ✅ 推荐
tokei 代码统计 ✅ 推荐
onefetch Git 仓库信息展示 ✅ 推荐
dog 现代化 dig ✅ 推荐
gping 图形化 ping ✅ 推荐
ouch 万能压缩解压 ✅ 推荐

🚀 一键安装命令

核心依赖(Arch / CachyOS)

# 基础工具链
sudo pacman -S fish starship atuin zoxide fzf fd eza bat fastfetch direnv pay-respects git-delta

# 系统监控与网络
sudo pacman -S bottom procs dog gping

# 数据处理与查看
sudo pacman -S tldr jless glow sd dust tokei onefetch

# HTTP 客户端
sudo pacman -S xh

# AUR 工具
paru -S ouch

可选增强

# 文件操作增强
sudo pacman -S xcp

# 终端图片查看
sudo pacman -S viu

# 跨设备传输
sudo pacman -S croc

# 十六进制查看
sudo pacman -S hexyl

# 列提取工具
sudo pacman -S choose

Git Delta 配置(执行一次永久生效)

git config --global core.pager delta
git config --global interactive.diffFilter "delta --color-only"
git config --global delta.line-numbers true
git config --global delta.side-by-side true
git config --global delta.syntax-theme Dracula

🎨 主题配置

Dracula 主题(bat / delta)

# 确认 bat 支持 Dracula
bat --list-themes | grep -i dracula

# 如果未显示,手动安装:
mkdir -p "$(bat --config-dir)/themes"
curl -fsSL https://raw.githubusercontent.com/dracula/sublime/master/Dracula.tmTheme \
  -o "$(bat --config-dir)/themes/Dracula.tmTheme"
bat cache --build

config.fish 中设置:

set -gx BAT_THEME "Dracula"

⌨️ 快捷键完全指南

Fish 原生编辑

快捷键 功能 说明
Ctrl + A 光标移到行首 同 Emacs
Ctrl + E 光标移到行尾 同 Emacs
Ctrl + W 删除前一个单词 比 Backspace 快
Alt + D 删除后一个单词
Ctrl + U 删除整行
Ctrl + K 删除光标到行尾
Ctrl + Y 粘贴刚才删除的内容
Ctrl + L 清屏(保留当前输入) clear 优雅
Ctrl + C 取消当前输入
Ctrl + D 退出 Fish / 关闭终端 输入为空时

自动补全与建议

快捷键 功能 说明
接受右侧灰色建议 Fish 自动显示灰色建议,按右方向键直接补全
Alt + → 接受建议的一个单词 只补全到下一个空格
Tab 触发补全菜单 按多次循环选择
Shift + Tab fzf 模糊补全 候选很多时,用 fzf 过滤选择
Ctrl + F 接受建议并执行 相当于 + Enter

历史命令

快捷键 功能 说明
搜索以当前输入开头的历史 输入 git 后按 ,只显示 git 相关历史
反向搜索历史
Alt + ↑ 从历史中提取参数 快速复用之前命令的参数

Bang-Bang 扩展

快捷键 功能 示例
! 插入上一条完整命令 输入 ! 自动展开为 sudo pacman -Syu
$ 插入上条命令的最后一个参数 输入 cd $ 自动展开为 cd /usr/share

fzf 快捷键

快捷键 功能 场景
Ctrl + T 当前目录下模糊搜索文件 vim <Ctrl+T> → 搜索文件 → 回车自动填入路径
Alt + C 模糊搜索目录并 cd 进入 Alt + C → 输入 proj → 选中 ~/projects/webapp → 自动 cd
Ctrl + R Atuin 历史搜索(覆盖原生) 输入关键词模糊搜索历史命令

fzf 界面内操作

按键 功能
↑ / ↓ 上下选择候选
Ctrl + N / P 下/上选择(同 Vim)
Ctrl + J / K 下/上选择(同 Vim)
Tab 多选标记
Ctrl + A 全选
Ctrl + D 取消选择
Enter 确认选择
Ctrl + G / Esc 取消退出
Ctrl + / 切换预览窗口位置
? 查看所有快捷键帮助

Atuin 界面操作

按键 功能
↑ / ↓ 选择历史命令
Ctrl + R 切换过滤模式(全局 / 当前目录 / 当前会话)
Tab 选中命令但不执行(可编辑后执行)
Enter 选中并执行
Ctrl + D 删除选中的历史记录
Ctrl + G / Esc 退出
直接输入 实时模糊搜索历史

pay-respects 纠错

触发方式 功能 示例
f + Enter 修正并执行上一条错误命令 git sttaus → 报错 → f → 自动执行 git status

📝 Abbreviation(abbr)速查表

输入缩写后按 SpaceEnter 自动展开为完整命令。

Git 工作流

输入 展开为 场景
gs git status 查看工作区状态
ga git add 添加文件
gaa git add --all 添加所有修改
gc git commit 打开编辑器写提交信息
gcm git commit -m 直接写提交信息:gcm "fix bug"
gca git commit --amend 修改上次提交
gp git push 推送
gpf git push --force-with-lease 安全强制推送
gpl git pull 拉取
gcb git checkout -b 创建并切换分支:gcb feature
gb git branch 查看分支
gd git diff 查看修改(带 delta 美化)
gds git diff --staged 查看暂存区修改
gl git log --oneline --graph -15 简洁图形化日志
grh git reset --hard 硬重置
grs git restore --staged 取消暂存

目录导航

输入 展开为
.. cd ..
... cd ../..
.... cd ../../..
..... cd ../../../..

系统管理

输入 展开为 场景
update sudo pacman -Syu 系统更新
cleanup sudo pacman -Rns (pacman -Qtdq) 清理孤儿包
mirror sudo cachyos-rate-mirrors 刷新镜像源
jctl journalctl -p 3 -xb 查看错误日志
fixpacman sudo rm /var/lib/pacman/db.lck 修复 pacman 锁
grubup sudo grub-mkconfig -o /boot/grub/grub.cfg 更新 GRUB
please sudo 礼貌提权:please pacman -S neovim
hw hwinfo --short 查看硬件信息
mkdirp mkdir -p 递归创建目录

压缩解压

输入 展开为 示例
tarnow tar -acf tarnow backup.tar.gz file1 file2
untar tar -zxvf untar backup.tar.gz

HTTP 请求(xh)

输入 展开为 示例
req xh req api.example.com
get xh GET get api.github.com/users/octocat
post xh POST post api.example.com/users name=john
put xh PUT put api.example.com/users/1 name=jane
del xh DELETE del api.example.com/users/1
patch xh PATCH patch api.example.com/users/1 age=25

其他工具

输入 展开为 说明
top btm 系统监控器
top-basic btm --basic 简化模式
pst procs --tree 进程树状视图
psw procs --watch 实时刷新进程
loc tokei 代码统计
repo onefetch Git 仓库信息
compress ouch compress 万能压缩
extract ouch decompress 万能解压
compress-list ouch list 预览压缩包内容

💡 abbr 的优势:展开后的完整命令会写入历史记录,换机器后 回放也能直接执行。


🔄 Alias(CachyOS 预设)

命令 实际执行 说明
ls eza -al --color=always --group-directories-first --icons 详细列表,带图标
la eza -a --color=always --group-directories-first --icons 所有文件(含隐藏)
ll eza -l --color=always --group-directories-first --icons 长格式
lt eza -aT --color=always --group-directories-first --icons 树状结构
l. `eza -a grep -e ‘^.‘`
psmem `ps auxf sort -nr -k 4`
psmem10 `ps auxf sort -nr -k 4
big `expac -H M ‘%m\t%n’ sort -h
gitpkg `pacman -Q grep -i “-git”
rip `expac –timefmt=’%Y-%m-%d %T’ ‘%l\t%n %v’ sort
wget wget -c 断点续传
dir / vdir --color=auto
grep / fgrep / egrep --color=auto

🧠 无感集成函数详解

核心设计:用函数覆盖常用命令,不带参数时自动弹出 fzf,带参数时直接执行原功能
你不需要记任何快捷键,像平常一样输入命令即可。

文件编辑:v / e

function v -d "用 fzf 选文件并编辑"
    if count $argv >/dev/null
        $EDITOR $argv        # 有参数 → 直接打开
    else if type -q fzf
        set file (fzf --preview 'bat --color=always --line-range :500 {}' --preview-window right:50% --prompt "Edit> ")
        if test -n "$file"
            $EDITOR "$file"   # 无参数 → fzf 选文件 → 打开
        end
    end
end
用法 效果
v 弹出 fzf 选文件 → 选中后用 $EDITOR 打开
v ~/.config/fish/config.fish 直接 nvim ~/.config/fish/config.fish,不弹 fzf

目录跳转:c / fcd

function c -d "用 fzf 选目录并 cd"
    if count $argv >/dev/null
        cd $argv              # 有参数 → 直接 cd
    else if type -q fzf; and type -q fd
        set dir (fd --type d --hidden --follow --exclude .git | fzf --preview 'eza -T --level=2 --color=always {} | head -200' --preview-window right:50% --prompt "Cd> ")
        if test -n "$dir"
            cd "$dir"          # 无参数 → fzf 选目录 → cd
        end
    end
end
用法 效果
c 弹出 fzf 选目录 → 选中后自动 cd
c ~/Downloads 直接 cd ~/Downloads,不弹 fzf

进程管理:k / fkill

function k -d "用 fzf 选进程并 kill"
    if count $argv >/dev/null
        kill $argv            # 有参数 → 直接 kill
    else if type -q fzf
        set pid (ps aux | sed 1d | fzf --multi --header "[Ctrl+A 全选 | Tab 多选 | Enter 确认]" --prompt "Kill> " | awk '{print $2}')
        if test -n "$pid"
            kill $pid          # 无参数 → fzf 选进程 → kill
        end
    end
end
用法 效果
k 弹出 fzf 进程列表(支持 Tab 多选)→ 选中后 kill
k 12345 直接 kill 12345,不弹 fzf

SSH 连接:s / fssh

function s -d "用 fzf 选 SSH 主机并连接"
    if count $argv >/dev/null
        ssh $argv             # 有参数 → 直接 ssh
    else if type -q fzf
        set hosts (cat ~/.ssh/known_hosts 2>/dev/null | awk '{print $1}' | sed 's/\[//g; s/\]//g; s/:.*//g' | sort -u)
        set config_hosts (awk '/^Host / && !/\*/ {print $2}' ~/.ssh/config 2>/dev/null)
        set all_hosts (echo $hosts $config_hosts | tr ' ' '\n' | sort -u | string collect)
        set target (echo $all_hosts | fzf --prompt "SSH> ")
        if test -n "$target"
            ssh "$target"      # 无参数 → fzf 选主机 → ssh
        end
    end
end
用法 效果
s known_hosts~/.ssh/config 中选主机 → 连接
s user@192.168.1.1 直接 ssh user@192.168.1.1,不弹 fzf

Git 分支切换:gco

function gco -d "用 fzf 选 Git 分支并 checkout"
    if count $argv >/dev/null
        git checkout $argv    # 有参数 → 直接 checkout
    else if type -q fzf
        set branch (git branch -a --format='%(refname:short)' 2>/dev/null | fzf --prompt "Checkout> " --preview 'git log --oneline --color=always {1} | head -20' --preview-window right:50%)
        if test -n "$branch"
            git checkout "$branch"  # 无参数 → fzf 选分支 → checkout
        end
    end
end
用法 效果
gco 弹出所有分支(含远程),右侧预览最近 20 条提交 → 选中后 checkout
gco main 直接 git checkout main,不弹 fzf

Git 查看提交:gsh

function gsh -d "用 fzf 浏览 Git 提交并 show"
    if count $argv >/dev/null
        git show $argv        # 有参数 → 直接 show
    else if type -q fzf
        set commit (git log --oneline --all --color=always | fzf --ansi --prompt "Show> " --preview 'git show --color=always {1} | delta' --preview-window right:60% | awk '{print $1}')
        if test -n "$commit"
            git show "$commit"  # 无参数 → fzf 选提交 → show(带 delta 美化)
        end
    end
end
用法 效果
gsh 弹出提交历史,右侧 delta 美化 diff → 选中后 show
gsh HEAD~3 直接 git show HEAD~3,不弹 fzf

Pacman 包管理:pac / pacr

function pac -d "用 fzf 搜索包并安装"
    if count $argv >/dev/null
        sudo pacman -S $argv  # 有参数 → 直接安装
    else
        set pkg (pacman -Slq 2>/dev/null | fzf --multi --prompt "Install> " --preview 'pacman -Si {1} 2>/dev/null | head -30' --preview-window right:50%)
        if test -n "$pkg"
            sudo pacman -S $pkg  # 无参数 → fzf 搜仓库包 → 安装
        end
    end
end

function pacr -d "用 fzf 搜索已安装包并卸载"
    if count $argv >/dev/null
        sudo pacman -Rns $argv  # 有参数 → 直接卸载
    else
        set pkg (pacman -Qq 2>/dev/null | fzf --multi --prompt "Remove> " --preview 'pacman -Qi {1} 2>/dev/null | head -30' --preview-window right:50%)
        if test -n "$pkg"
            sudo pacman -Rns $pkg  # 无参数 → fzf 搜已装包 → 卸载
        end
    end
end
用法 效果
pac 弹出 fzf 搜索所有仓库包,右侧预览包信息 → 选中后 sudo pacman -S
pac neovim 直接 sudo pacman -S neovim,不弹 fzf
pacr 弹出已安装包列表,右侧预览 → 选中后 sudo pacman -Rns
pacr firefox 直接 sudo pacman -Rns firefox,不弹 fzf

环境变量查看:envf

function envf -d "用 fzf 搜索环境变量"
    if type -q fzf
        set var (env | fzf --prompt "Env> " --preview 'echo $ {1}' | cut -d= -f1)
        if test -n "$var"
            echo "$$var = "$$var
        end
    end
end
用法 效果
envf 弹出 fzf 搜索所有环境变量 → 选中后显示变量名和值

历史命令直接执行:fh

function fh -d "用 fzf 搜索历史并执行"
    if type -q fzf
        set cmd (history | fzf --tac --prompt "History> " --preview 'echo {}' --preview-window down:3)
        if test -n "$cmd"
            eval $cmd  # 无参数 → fzf 搜历史 → 直接执行(不编辑)
        end
    end
end
用法 效果
fh 弹出 fzf 搜索历史 → 选中后直接执行(与 Atuin 的 Ctrl+R 互补:Atuin 插入命令,fh 直接执行)

JSON 查看:jl

function jl -d "用 jless 查看 JSON,无参数时 fzf 选择"
    if count $argv >/dev/null
        jless $argv           # 有参数 → 直接打开
    else if type -q fzf; and type -q fd
        set file (fd --type f --extension json --hidden --follow --exclude .git | fzf --prompt "JSON> " --preview 'bat --language json --color=always --line-range :50 {}' --preview-window right:50%)
        if test -n "$file"
            jless "$file"      # 无参数 → fzf 选 JSON 文件 → jless 打开
        end
    end
end
用法 效果
jl 弹出 fzf 搜索所有 JSON 文件 → 选中后 jless 交互式查看(支持折叠、搜索)
jl data.json 直接 jless data.json,不弹 fzf

Markdown 查看:md

function md -d "用 glow 查看 Markdown,无参数时 fzf 选择"
    if count $argv >/dev/null
        glow $argv            # 有参数 → 直接打开
    else if type -q fzf; and type -q fd
        set file (fd --type f --extension md --hidden --follow --exclude .git | fzf --prompt "Markdown> " --preview 'bat --language markdown --color=always --line-range :30 {}' --preview-window right:50%)
        if test -n "$file"
            glow "$file"       # 无参数 → fzf 选 MD 文件 → glow 渲染
        end
    end
end
用法 效果
md 弹出 fzf 搜索所有 Markdown 文件 → 选中后 glow 漂亮渲染
md README.md 直接 glow README.md,不弹 fzf

tldr 覆盖 man

function man -d "优先 tldr,fallback 到系统 man"
    if count $argv >/dev/null
        if test (count $argv) -eq 1
            if tldr $argv[1] >/dev/null 2>&1
                tldr $argv[1]   # 单参数 → 先尝试 tldr 速查表
                return 0
            end
        end
        command man $argv       # 多参数或 tldr 没有 → 回退系统 man
    else
        command man
    end
end
用法 效果
man tar 先显示 tldr 速查表(常用示例),没有才显示传统 man
man 3 printf 多参数直接走系统 man,不受影响

🏗️ 其他智能工具

Zoxide(智能 cd)

z down        # 跳转到 ~/Downloads
z pro web     # 跳转到 ~/projects/webapp
zi            # 交互式选择(调用 fzf 选历史目录)
z -           # 跳转到上一个目录

direnv(目录环境自动加载)

# 在项目根目录创建 .envrc
cd ~/projects/myapp
echo 'source venv/bin/activate' > .envrc
echo 'export API_KEY="sk-xxx"' >> .envrc

# 授权(安全机制,防止恶意脚本)
direnv allow

# 以后自动生效
cd ~/projects/myapp     # 自动激活虚拟环境,API_KEY 可用
cd ..                   # 自动退出虚拟环境,API_KEY 消失

yazi(文件管理器)

yy            # 启动 yazi,按 q 退出后自动 cd 到当前所在目录

done(桌面通知)

make -j$(nproc)  # 编译大项目,完成后桌面弹出通知:「✅ make 已完成(耗时 2:34)」

🎨 美化效果一览

命令 效果
ls / la / ll eza 彩色图标列表
cat bat 语法高亮 + 行号 + Dracula 主题
man xxx bat 渲染的彩色 man 页面
git diff delta 并排对比 + 语法高亮 + Dracula 主题
长命令完成 done 桌面通知
man tar tldr 速查表(常用示例)
md README.md glow 漂亮渲染 Markdown
jl data.json jless 交互式折叠查看 JSON

🚀 一日典型工作流

# 1. 打开终端,自动显示 fastfetch 系统信息

# 2. 进入项目目录(zoxide 自动补全)
z pro web          # 跳转到 ~/projects/webapp

# 3. 环境自动加载(direnv)
# 虚拟环境已激活,环境变量已设置

# 4. 查看 Git 状态
gs                 # 展开为 git status

# 5. 查看修改(delta 美化)
gd                 # 展开为 git diff

# 6. 添加文件并提交
gaa                # git add --all
gcm "fix: login"   # git commit -m "fix: login"
gp                 # git push

# 7. 切换分支(无感集成)
gco                # fzf 选分支 → 自动 checkout

# 8. 查看某次提交
gsh                # fzf 选提交 → 自动 show(带 delta 美化)

# 9. 编辑文件(无感集成)
v                  # fzf 选文件 → 自动 nvim 打开

# 10. 进入另一个目录(无感集成)
c                  # fzf 选目录 → 自动 cd

# 11. 安装新包(无感集成)
pac                # fzf 搜包 → 自动 sudo pacman -S

# 12. 长时间编译,切出去等通知
make -j$(nproc)
# ... 桌面通知弹出 ...

# 13. 打错命令快速修正
sudo paman -S neovim    # 报错
f                       # 自动修正为 sudo pacman -S neovim

# 14. 查找之前用过的命令
Ctrl + R              # Atuin 搜索历史
# 输入 "docker" → 找到之前复杂的 docker run 命令

# 15. 查看系统状态
top                   # 展开为 btm,美观的系统监控

# 16. 测试 API
get api.github.com/users/octocat   # 展开为 xh GET ...

# 17. 查看 Markdown 文档
md                    # fzf 选 MD 文件 → glow 渲染

# 18. 查看 JSON 数据
jl                    # fzf 选 JSON 文件 → jless 交互查看

⚙️ 配置调优建议

1. 禁用 fish_greeting(不显示 fastfetch)

function fish_greeting
    # 空函数 = 不显示任何内容
end

2. 修改 pay-respects 触发词为 fuck

set -gx PAY_RESPECTS_ALIAS "fuck"

3. 调整 done 通知阈值

set -U __done_min_cmd_duration 5000    # 改为 5 秒
set -U __done_notification_urgency_level normal

4. 调整 fzf 预览窗口宽度

set -gx FZF_CTRL_T_OPTS "--preview 'bat --color=always --line-range :500 {}' --preview-window right:40%"

5. Starship 性能排查

starship timings    # 查看哪些模块耗时最长

🆘 故障排查

问题 原因 解决
Ctrl+T 没反应 fzf 未安装或未绑定 sudo pacman -S fzf && source ~/.config/fish/config.fish
f 没反应 pay-respects 未安装 paru -S pay-respects
z 命令找不到 zoxide 未初始化 检查 `zoxide init fish
yy 报错 yazi 未安装 sudo pacman -S yazi
direnv 提示未允许 安全机制 在项目目录执行 direnv allow
git diff 没有颜色 delta 未配置 执行 git config 命令(见上文)
man 页面没有颜色 bat 未安装 sudo pacman -S bat
abbr 不展开 输入后没有按 Space abbr 需要按 Space 或 Enter 触发
Atuin 搜索为空 数据库未初始化 执行 atuin import auto 导入历史
gco 弹出 fzf 失败 之前 gco 是 abbr 删除 abbr -a -- gco 'git checkout' 这一行
v/c/k 报错 fzf 或 fd 未安装 sudo pacman -S fzf fd

📌 核心哲学:减少记忆负担,增加上下文感知 —— 工具记住你访问过的目录、执行过的命令、项目环境,你只需要模糊输入,让机器去匹配。