2013年10月2日星期三

切换到 fish shell

打算从 bash 切换到 fish shell
之所以不是 zsh,是因为 zsh 不能开箱即用,虽然 fish 的社区没有 zsh 成熟。
Fish 有许多现代化的功能,如更高级的 Tab 补全、自动分析 man page 来提供命令行帮助、历史记录补全等。
缺点也很明显:语法不兼容 bash。
装好之后先 fish_update_completions 来分析 man page 并创建缓存。
然后打算迁移曾经的 bash 配置。
~/.bash_history 已经被 fish 自动迁移到了 ~/.config/fish/fish_history
可是还有 ~/.bashrc,这也是最要命的。Fish 的语法不兼容 bash,于是 ~/.bashrc 不能直接拿去用。
我的 ~/.bashrc 里主要是 exportalias,还有 alias ssss="export http_proxy=http://localhost:8118 https_proxy=http://localhost:8118" 这样使用了 aliasexport 两者的快捷命令。
Fish 已经有 alias 了,据说是在内部转换成函数来处理。而 fish 里等价于 export variable=value 的是 set -x variable value
干脆把 export 移植过来吧。写在 ~/.config/fish/functions/export.fish 里:
function export
    for i in $argv
        set -l __export_var (echo -n $i | grep -o '^[^=]*')
        if test $__export_var = $i
            set -g -x $__export_var $$__export_var
        else
            set -g -x $__export_var (echo -n $i | sed -e 's/^[^=]*=//')
        end
    end
end
再写一行到 ~/.config/fish/config.fish 里,这是等价于 ~/.bashrc 的启动文件,让他执行 ~/.bashrc 里的有关行:
cat ~/.bashrc | grep '^alias \|^export ' | .
就这样,配置完成了!