基于 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
sudo pacman -S xh
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 --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)速查表
输入缩写后按 Space 或 Enter 自动展开为完整命令。
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
z pro web
zi
z -
direnv(目录环境自动加载)
cd ~/projects/myapp
echo 'source venv/bin/activate' > .envrc
echo 'export API_KEY="sk-xxx"' >> .envrc
direnv allow
cd ~/projects/myapp
cd ..
yazi(文件管理器)
yy
done(桌面通知)
make -j$(nproc)
🎨 美化效果一览
| 命令 |
效果 |
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 |
🚀 一日典型工作流
z pro web
gs
gd
gaa
gcm "fix: login"
gp
gco
gsh
v
c
pac
make -j$(nproc)
sudo paman -S neovim
f
Ctrl + R
top
get api.github.com/users/octocat
md
jl
⚙️ 配置调优建议
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 |
📌 核心哲学:减少记忆负担,增加上下文感知 —— 工具记住你访问过的目录、执行过的命令、项目环境,你只需要模糊输入,让机器去匹配。