Fish Shell 完整配置指南

0. 安装 Fish Shell

0.1 Ubuntu/Debian 安装

1. 方法一:使用官方 PPA(推荐,获取最新版本)
sudo apt-add-repository ppa:fish-shell/release-3
sudo apt update
sudo apt install fish

1. 方法二:使用默认仓库(版本可能较旧)
sudo apt update
sudo apt install fish

0.2 其他系统安装

1. macOS (使用 Homebrew)
brew install fish

1. Fedora
sudo dnf install fish

1. Arch Linux
sudo pacman -S fish

1. CentOS/RHEL 8+
sudo dnf install fish

0.3 验证安装

1. 检查版本
fish --version

1. 临时进入 Fish
fish

0.4 设置 Fish 为默认 Shell

添加到可用 Shell 列表

1. 查看 Fish 安装路径
which fish

1. 检查是否已在 shell 列表中
cat /etc/shells

1. 如果没有,添加 Fish 到列表(使用实际路径)
echo /usr/bin/fish | sudo tee -a /etc/shells

更改默认 Shell

1. 方法一:使用 chsh(推荐)
chsh -s $(which fish)

1. 方法二:使用 usermod(需要 root)
sudo usermod -s /usr/bin/fish $USER

注意:更改后需要完全退出并重新登录才能生效。

验证更改

1. 重新登录后检查
echo $SHELL

1. 基础环境设置

1.1 创建配置文件

1. 创建配置目录
mkdir -p ~/.config/fish

1. 创建主配置文件
touch ~/.config/fish/config.fish

1.2 基础配置

~/.config/fish/config.fish 中添加:

1. 设置默认编辑器
set -gx EDITOR vim  # 或 nano, code 等

1. 配置PATH(fish_add_path会自动去重)
fish_add_path ~/bin
fish_add_path ~/.local/bin

1. 设置语言环境
set -gx LANG zh_CN.UTF-8
set -gx LC_ALL zh_CN.UTF-8

1. 取消欢迎信息
set -g fish_greeting ""

1. 启用24位真彩色
set -gx fish_term24bit 1

2. Fisher 插件管理器

2.1 安装 Fisher

curl -sL https://raw.githubusercontent.com/jorgebucaran/fisher/main/functions/fisher.fish | source && fisher install jorgebucaran/fisher

2.2 Fisher 常用命令

fisher list                  # 列出已安装插件
fisher install owner/plugin  # 安装插件
fisher update               # 更新所有插件
fisher remove owner/plugin  # 移除插件

3. 必备插件

3.1 fzf.fish – 模糊搜索增强

1. 首先安装 fzf 二进制文件
1. Ubuntu/Debian
sudo apt install fzf

1. 或使用 git 安装最新版
git clone --depth 1 https://github.com/junegunn/fzf.git ~/.fzf
~/.fzf/install

1. 然后安装 Fish 插件
fisher install PatrickF1/fzf.fish

配置快捷键(在 config.fish 中添加):

1. Ctrl+R: 搜索历史
1. Ctrl+T: 搜索文件
1. Alt+C: 搜索目录
1. Ctrl+G: 搜索 git log
1. Ctrl+S: 搜索 git status
fzf_configure_bindings --history=\cr --variables=\cv --directory=\cf --git_log=\cg --git_status=\cs

3.2 z – 快速目录跳转

fisher install jethrokuan/z

使用示例:

cd ~/projects/my-project  # 首次访问
z proj                    # 之后可以快速跳转
z -l                      # 查看记录的目录
z -c proj                 # 限制在当前目录子目录中搜索
z -r proj                 # 按访问时间排序

3.3 其他实用插件

1. 自动匹配括号
fisher install laughedelic/pisces

1. Git 缩写支持
fisher install jhillyerd/plugin-git

1. 运行 bash 脚本
fisher install edc/bass

1. 更好的提示符(可选)
fisher install IlanCosman/tide@v6

4. 实用配置

4.1 命令缩写(Abbreviations)

1. 系统命令
abbr -a ll 'ls -lah'
abbr -a la 'ls -A'
abbr -a l 'ls -CF'

1. Git 命令
abbr -a g 'git'
abbr -a gs 'git status'
abbr -a ga 'git add'
abbr -a gc 'git commit'
abbr -a gp 'git push'
abbr -a gpl 'git pull'
abbr -a gco 'git checkout'
abbr -a gb 'git branch'
abbr -a gd 'git diff'
abbr -a gl 'git log --oneline --graph'

1. 其他常用
abbr -a .. 'cd ..'
abbr -a ... 'cd ../..'
abbr -a df 'df -h'
abbr -a du 'du -h'
abbr -a cls 'clear'

4.2 实用函数

1. 创建并进入目录
function mkcd -d "创建目录并进入"
    mkdir -p $argv && cd $argv
end

1. 备份文件
function backup -d "备份文件"
    cp $argv[1] $argv[1].bak.(date +%Y%m%d_%H%M%S)
end

1. 静默启动程序(后台运行)
function s -d "静默启动程序"
    command $argv >/dev/null 2>&1 & disown
end

1. 提取压缩文件
function extract -d "解压文件"
    if test -f $argv
        switch $argv
            case '*.tar.bz2'
                tar xjf $argv
            case '*.tar.gz' '*.tgz'
                tar xzf $argv
            case '*.tar.xz'
                tar xJf $argv
            case '*.bz2'
                bunzip2 $argv
            case '*.gz'
                gunzip $argv
            case '*.tar'
                tar xf $argv
            case '*.zip'
                unzip $argv
            case '*.rar'
                unrar x $argv
            case '*.7z'
                7z x $argv
            case '*'
                echo "不支持的文件格式"
        end
    else
        echo "文件不存在"
    end
end

1. 查看端口占用
function port -d "查看端口占用"
    if test (count $argv) -eq 0
        echo "用法: port <端口号>"
        return 1
    end
    sudo lsof -i :$argv
end

1. 快速查找进程
function psg -d "grep 进程"
    ps aux | grep -v grep | grep -i $argv
end

5. 环境变量管理

5.1 通用环境变量

1. 代理设置函数(根据实际端口修改)
function proxy_on -d "启用代理"
    set -gx http_proxy http://127.0.0.1:7890
    set -gx https_proxy http://127.0.0.1:7890
    set -gx all_proxy socks5://127.0.0.1:7890
    set -gx no_proxy localhost,127.0.0.1,::1
    echo "代理已开启 (端口: 7890)"
end

function proxy_off -d "关闭代理"
    set -e http_proxy
    set -e https_proxy
    set -e all_proxy
    set -e no_proxy
    echo "代理已关闭"
end

1. 查看当前代理状态
function proxy_status -d "查看代理状态"
    if set -q http_proxy
        echo "代理已开启: $http_proxy"
    else
        echo "代理未开启"
    end
end

5.2 开发环境配置

1. Node.js (使用 nvm)
if test -e ~/.nvm
    fisher install jorgebucaran/nvm.fish
end

1. Python 虚拟环境自动激活
function __auto_source_venv --on-variable PWD --description "自动激活Python虚拟环境"
    if test -e .venv/bin/activate.fish
        source .venv/bin/activate.fish
    else if test -e venv/bin/activate.fish
        source venv/bin/activate.fish
    else if test -e env/bin/activate.fish
        source env/bin/activate.fish
    end
end

1. Go 环境
if test -d $HOME/go
    set -gx GOPATH $HOME/go
    fish_add_path $GOPATH/bin
end

1. Rust 环境
if test -d $HOME/.cargo
    fish_add_path $HOME/.cargo/bin
end

6. 性能优化

6.1 条件加载

1. 只在交互式会话中加载
if status is-interactive
    1. 命令缩写、键绑定等
    source ~/.config/fish/abbreviations.fish

    1. 主题和提示符设置
    1. 如果使用 tide,它会自动处理
end

1. 只在登录会话中设置
if status is-login
    1. PATH 和其他环境变量
    1. 避免重复添加 PATH
end

6.2 延迟加载示例

1. 延迟加载 rbenv
if command -q rbenv
    function ruby -d "延迟加载 rbenv"
        functions -e ruby
        status --is-interactive; and rbenv init - | source
        ruby $argv
    end
end

1. 延迟加载 pyenv
if command -q pyenv
    function python -d "延迟加载 pyenv"
        functions -e python
        pyenv init - | source
        python $argv
    end
end

7. 自定义键绑定

1. 在 config.fish 中添加
function fish_user_key_bindings
    1. Ctrl+Delete 删除到词尾
    bind \e\[3\;5~ kill-word

    1. Ctrl+Backspace 删除到词首
    bind \cH backward-kill-word

    1. Ctrl+Left/Right 按词移动
    bind \e\[1\;5C forward-word
    bind \e\[1\;5D backward-word

    1. Alt+上下箭头 在目录历史中导航
    bind \e\[1\;3A nextd-or-forward-word
    bind \e\[1\;3B prevd-or-backward-word
end

8. 实用技巧

8.1 命令历史

1. 搜索历史(除了 Ctrl+R)
history search --prefix "git"  # 搜索以 git 开头的命令
history search --contains "push" # 搜索包含 push 的命令
history merge                  # 合并所有会话的历史

1. 清除重复历史
history delete --duplicates

8.2 调试配置

1. 查看函数定义
functions mkcd

1. 查看函数文件位置
functions -D mkcd

1. 查看变量值
set -S PATH  # 显示 PATH 的详细信息

1. 检查命令类型
type ls      # 显示 ls 是什么(别名、函数还是命令)

1. 重新加载配置
source ~/.config/fish/config.fish
1. 或简单地
exec fish

8.3 Fish 特有功能

1. Web 配置界面
fish_config  # 打开浏览器配置界面

1. 更新自动补全
fish_update_completions

1. 生成网页版本的手册
help git  # 在浏览器中打开 git 的手册

9. 备份配置

创建备份脚本:

function fish_backup -d "备份 fish 配置"
    set backup_dir ~/dotfiles/fish/(date +%Y%m%d)
    mkdir -p $backup_dir

    1. 备份配置文件
    cp ~/.config/fish/config.fish $backup_dir/
    cp -r ~/.config/fish/functions $backup_dir/
    cp ~/.config/fish/fish_plugins $backup_dir/ 2>/dev/null
    cp -r ~/.config/fish/completions $backup_dir/ 2>/dev/null

    1. 导出缩写
    abbr -s > $backup_dir/abbreviations.fish

    echo "配置已备份到: $backup_dir"
end

function fish_restore -d "恢复 fish 配置"
    if test (count $argv) -eq 0
        echo "用法: fish_restore <备份目录>"
        return 1
    end

    set backup_dir $argv[1]

    if test -d $backup_dir
        cp $backup_dir/config.fish ~/.config/fish/
        cp -r $backup_dir/functions ~/.config/fish/ 2>/dev/null
        cp $backup_dir/fish_plugins ~/.config/fish/ 2>/dev/null

        1. 恢复缩写
        if test -f $backup_dir/abbreviations.fish
            source $backup_dir/abbreviations.fish
        end

        1. 重新安装插件
        fisher update

        echo "配置已恢复"
    else
        echo "备份目录不存在"
    end
end

10. 故障排除

10.1 常见问题

  1. 函数未找到

    1. 确保配置文件已加载
    source ~/.config/fish/config.fish
    
    1. 或将函数保存到独立文件
    funcsave <函数名>
  2. PATH 重复

    1. 使用 fish_add_path 而不是直接设置 PATH
    1. fish_add_path 会自动去重
  3. 插件未生效

    1. 检查插件列表
    fisher list
    
    1. 重新安装
    fisher update
  4. 主题问题

    1. 重置为默认提示符
    fish_config prompt choose default

快速配置清单

  1. 安装 Fish Shell (Ubuntu: sudo apt install fish)
  2. 设置为默认 Shell (chsh -s $(which fish))
  3. 安装 Fisher 插件管理器
  4. 安装基础插件:fzf.fish、z、pisces
  5. 配置常用缩写和函数
  6. 设置环境变量和代理函数
  7. 根据需要添加开发工具集成
  8. 备份配置文件

记住:Fish 的设计理念是开箱即用,很多功能(语法高亮、自动建议、智能补全)都是默认启用的,无需额外配置。

发表回复

Your email address will not be published. Required fields are marked *.

*
*