You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

从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

火山引擎 最新活动