从Zsh迁移至Fish Shell:如何正确配置并对配置进行版本控制?
嘿,我当初从Zsh转Fish的时候也纠结过这些问题,刚好踩过的坑能给你参考参考:
1. 要不要把整个~/.config/fish加入版本控制?
完全可以!这个文件夹里的所有配置(除了自动生成的缓存和敏感文件)都适合放进dotfiles。不过要注意两个点:
- 排除
local子文件夹:Fish会把缓存、历史记录、自动生成的补全放在~/.config/fish/local/里,这些没必要版本控制,在你的dotfiles仓库里加个.gitignore,写上config/fish/local/就行。 - 排除敏感文件:如果你的
fish_variables里存了API密钥、密码这类敏感信息,或者你单独用variables.fish存这些,记得把它们也加入.gitignore,别不小心提交到公开仓库里。
2. 环境变量该放哪儿?能不能直接编辑fish_variables?
别直接碰fish_variables!这个文件是Fish自动管理的配置数据库,手动修改很容易被Shell覆盖,而且格式也不适合手写。正确的做法是:
- 全局可版本控制的变量:放在
~/.config/fish/config.fish里,用set -x命令定义,比如:set -x PATH $PATH ~/.local/bin set -x EDITOR nvim - 敏感/无需版本控制的变量:你说的用
~/variables.fish来存完全可行!在config.fish末尾加一行source ~/variables.fish,然后在variables.fish里同样用set -x定义敏感变量(比如set -x AWS_ACCESS_KEY_ID xxx),最后把variables.fish加入你的全局.gitignore或者dotfiles的.gitignore就行。
3. 用exa/ripgrep覆盖ls/grep,能不能像Zsh/Bash那样设别名?
必须可以!而且Fish给了你两种选择:
- 传统别名:和Zsh一样,直接在
config.fish里写:alias ls='exa --icons --group-directories-first' alias grep='rg --color=auto' - 缩写(abbr):更推荐这个!Fish的
abbr会在你输入命令时自动展开成原命令,方便你编辑修改,比如:
比如你输入abbr ls 'exa --icons --group-directories-first' abbr grep 'rg --color=auto'ls,按回车前会看到它变成exa --icons...,如果想修改参数直接编辑就行,比alias更灵活。
4. Fish的Vi键位绑定和Neovim会冲突吗?能不能只在外部启用?
默认情况下完全不会冲突!Neovim是运行在Fish的子进程里的,Fish的键位绑定只作用于Shell的交互模式,不会影响Neovim内部的操作。不过如果你确实遇到了奇怪的冲突(比如某些快捷键被拦截),可以通过判断环境变量来只在非Neovim环境启用Vi绑定:
# 在config.fish里加入这段 if not set -q NVIM fish_vi_key_bindings end
当你在Neovim里打开终端时,Neovim会自动设置NVIM环境变量,Fish就不会加载Vi绑定了。
5. Fish原生功能之外的实用技巧和必装插件?
Fish的原生功能已经够强了,但有几个技巧和插件能让体验更丝滑:
原生实用技巧
- 输入
fish_config打开网页版配置工具,可视化设置主题、键位绑定、函数,新手友好到爆! - 用
funced 函数名临时编辑函数(比如funced ls),改完输入funcsave ls就能保存到~/.config/fish/functions/里,不用手动找文件。 - 定期输入
fish_update_completions更新自动补全脚本,Fish会自动下载很多工具的补全,比Zsh的补全更省心。 - 按
Ctrl+R搜索历史命令,Fish的搜索是实时的,输入关键词就能看到匹配的历史,比Zsh的搜索直观多了。
必装插件(推荐用fisher管理,轻量无冗余)
先装插件管理器fisher:
curl -sL https://git.io/fisher | source && fisher install jorgebucaran/fisher
然后装这些插件:
- z:目录跳转工具,记住你常去的目录,输入
z 项目名就能直接跳过去,比cd快多了:fisher install jethrokuan/z - pure:极简风格的提示符,显示Git分支、状态,还会提示命令执行时间,颜值和实用性拉满:
fisher install rafaelrinaldi/pure - fish-ssh-agent:自动管理SSH代理,不用每次开Shell都手动
ssh-add,重启Shell也能保持代理状态:fisher install danhper/fish-ssh-agent - exa-completions:给exa提供更完整的自动补全,虽然Fish原生有,但这个补全参数更全:
fisher install ilancosman/exa-completions
内容的提问来源于stack exchange,提问作者Augusto




