你第一次用 Fish 的时候,会疑惑:为什么其他 Shell 连自动补全都要自己配?
Fish(Friendly Interactive Shell)是一个为交互式使用设计的 Shell。它默认自带语法高亮、自动补全、模糊搜索,完全不需要像 Zsh 那样装 Oh-My-Zsh 和几十个个插件。
安装#
NixOS:
users.defaultUserShell = pkgs.fish;
programs.fish.enable = true;或者 Home Manager:
programs.fish = {
enable = true;
interactiveShellInit = ''
set -g fish_greeting
'';
};为什么从 Zsh 换到 Fish#
| 功能 | Zsh (默认) | Fish (默认) |
|---|---|---|
| 语法高亮 | ❌ 需插件 | ✅ 内置 |
| 自动建议 | ❌ 需插件 | ✅ 内置 |
| 模糊补全 | ❌ 需插件 | ✅ 内置 |
| Man Page 补全 | ❌ | ✅ 自动生成 |
| 配置语法 | Bash 兼容 | 简洁直观 |
| 启动速度 | 慢(插件多) | 快 |
Fish 的哲学是「默认就应该是最好的」。
日常使用#
自动建议#
输入命令时,Fish 会根据历史记录和当前路径,在灰色文字中显示建议:
$ git comm
↑ 灰色显示 "git commit -m "
→ 按 → 或 Ctrl+F 接受建议Tab 补全#
按 Tab 自动列出所有可能选项,支持模糊匹配:
$ cd pro<Tab>
projects/ proposals/ prometheus/语法高亮#
命令正确时绿色,错误时红色,路径存在时蓝色,不存在时红色下划线:
$ ech hello # "ech" 红色(命令不存在)
$ cat /tmp/test # "/tmp/test" 红色下划线(文件不存在)配置#
Fish 的配置在 ~/.config/fish/:
~/.config/fish/
├── config.fish # 主配置
├── conf.d/ # 自动加载的脚本
│ ├── abbr.fish
│ ├── aliases.fish
│ └── path.fish
└── functions/ # 自定义函数我的 config.fish#
# 去掉欢迎语
set -g fish_greeting
# 环境变量
set -gx EDITOR emacsclient -c
set -gx VISUAL emacsclient -c
set -gx LANG en_US.UTF-8
# PATH
fish_add_path ~/.cargo/bin
fish_add_path ~/.local/bin
fish_add_path /nix/var/nix/profiles/default/bin缩写(abbr)vs 别名#
Fish 推荐用 abbr 代替 alias,因为缩写会在输入时自动展开,你可以看到实际执行的命令:
abbr -a g git
abbr -a ga 'git add'
abbr -a gc 'git commit'
abbr -a gp 'git push'
abbr -a gs 'git status'
abbr -a l 'ls -la'
abbr -a .. 'cd ..'
abbr -a ... 'cd ../..'效果:输入 gs 按空格,自动展开为 git status。
自定义函数#
# ~/.config/fish/functions/ll.fish
function ll
ls -lah $argv
end# ~/.config/fish/functions/mkcd.fish
function mkcd
mkdir -p $argv[1]
cd $argv[1]
endNixOS 特有的技巧#
nix-shell 自动进入 Fish#
# config.fish
if test -n "$IN_NIX_SHELL"
set -g fish_greeting "📦 nix-shell"
end用 direnv + nix-direnv#
# home.nix
programs.direnv = {
enable = true;
nix-direnv.enable = true;
};进入带 .envrc 的目录时自动加载开发环境,退出时自动卸载。
不兼容 Bash 的注意事项#
Fish 的语法和 Bash 不同,如果你写脚本,建议:
- 脚本文件头部用
#!/usr/bin/env bash— 保持 Bash 写脚本的习惯 - Fish 只用于交互式使用 — 不要拿 Fish 写脚本
- 复制粘贴网上的 Bash 命令时 — 大部分简单命令兼容,复杂管道可能需要调整
总结#
如果你厌倦了配置 Zsh,Fish 是最省心的选择。它不会让你成为一个「Shell 配置专家」,但它会让你每天打开终端时心情更好一点。
NixOS 工具链系列至此暂告一段落,接下来可能会写一些具体的 Nix 配置技巧。