自从知道 fish 之后,就一直很眼红 fish 的补全和高亮功能。 之前也有过一次短暂迁移的经历,配置好了基本的 fish 和 oh-my-fish 环境,然后就放弃了。。。 理由是,fish 不兼容 bash,现有的一些脚本没法用。而且用的 VIM 插件中有依赖 posix shell 的, 换了 fish 导致插件不可用(虽然当晚就找到解决方案并解决了。。。解决方案见文末。。。

记录一下这次迁移中遇到的一些状况好了。

首先,fish 要装 2.x 版(之前装的,怎么装忘了,大概就是 brew install 一下),oh-my-fish 直接上github 仓库复制、粘贴一下就好。 我用的主题是zish,挺好的!

然后就是插件的配置了。 我用到的插件有

brew git balias theme percol python autojump

说明
balias是 alias 的增强版,实现了 alias 命令的自动补全。
theme是浏览和变更主题 用的,方便随时看厌主题了换一个。
percol是查询命令行历史用的(就是其他 shell 都有的ctrl+r功能,原生是不带的。。。然后还要在命令行把percol装上)。
python提供了一些常用的 Python 快捷键(开一个临时 HTTP 服务什么的,暂时还没用上)。
autojump就是在 bash 版的 autojump 上包了一层。

为什么要用 autojump 而不是看起来更加厉害的z,是因为 z 在下列目录结构下的操作方式超出了我智商的上限,无能为力了。

path/hello
path/hello/llo

因为两个目录拥有一样的前缀,所以前者权重始终大于后者,这个没有问题。 但是。。。

说好的z llo llo不好使,在path/hello下用z llo始终停留在同一目录下。。。 更不用说实际的目录结构是path/hello/hello/llo了。。。 而 autojump 就做的好多了。在path/hello下敲j llo就会跳转到下一级hello去。

fish 环境下 python 的 virtualenvwrapper 不可用,替代品是virtualfish,clone 下来把配置贴到config.fish里就好了。
要说坑的话,就是在把当前 env 状态加到 prompt 中的时候,修改并保存了fish_prompt函数,但其实 zish 主题的这个函数还有一个 helper 函数用来判断当前目录的 git 状态, 用自带提供的 funcsave 就会漏掉这个函数,导致每加载一次配置就报一次错。。。

oh-my-fish 没有 git 相关的别名设置,我从 oh-my-zsh 的设置中抄了几个简单常用的,带变量名展开啊命令行展开啊之类的“高级”别名因为语法不兼容,暂时没时间去修。 因此,bash 版自动给 iterm2 的 tab 设置颜色的脚本也没有迁移过来,惨惨惨。

结尾:
上文中提到的 VIM 插件的问题,其实只要在.vimrc中添加一行set shell=/bin/bash之类的语句指定 VIM 环境中的 shell 就好了。

最后,这次短暂折腾中遇到、想到但还没解决的问题有:

  1. TODO git 相关别名设置还不完整,有些怨念
  2. TODO vim 的 StripWhitespace 设置有问题,写函数处理失败,对 vimscript 理解不能
  3. DONE 给 jekyll 换了一个解析器,感觉好多了