自从知道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换了一个解析器,感觉好多了