[关闭]
@no13bus 2014-12-25T12:45:32.000000Z 字数 2112 阅读 3453

Zsh向左 Fish向右

fish oh-my-zsh on-my-fish 翻译


原文连接

不久以前我听说了fish这个交互性极强的shell, 我觉得他非常值得玩耍一番。我本人有一个很棒的zsh的配置环境,当然这要归功于Oh My Zsh这个碉堡的开源项目。但是我决定要取消我大多数的配置文件(dotfiles), 因为这些配置文件虽然优雅但是它也是我的拖延症的借口。所以虽然可能会失掉一些特性,但是我还是决定将fish作为我的主力shell,这还是因为Fish具有很多优良的特性。


开启Fish之旅

在Ubuntu下,你可以使用ppa来安装最新的fish:

  1. sudo add-apt-repository -y ppa:fish-shell/nightly-master
  2. sudo apt-get update
  3. sudo apt-get install -y fish
  4. chsh -s /usr/bin/fish

译者注: 如果重启shell的时候发现启动不是fish界面,执行下面的命令。
grep -q '^/usr/local/bin/fish$' /etc/shells; or echo '/usr/local/bin/fish' | sudo tee -a /etc/shells
chsh -s /usr/local/bin/fish

下面打开fish,耍起来。语法高亮和历史记录自动完成会让你会觉得fish美的不可方物。自动完成有点不太一样,他不像zhs那样有那么多插件和配置选项,做不到zhs那么好,但是也差不多够用了,并且更nice些。fish的语法更nice但是他和一些流行的shell以及POSIX一点也不兼容(译者注:有性格的shell,让我想起了另一个有性格的语言: go)。名字很难搜索到并且他的文档和社区还不够大,但是我利用此文档教程将我所有的函数全都转化为了fish可用。理解bash的每个特性然后我将其转化为fish可用的code,这比仅学习fish要难的多,即使这样,我还是搞定了。(真爱呀!)


Oh My Fish!

fish的配置文件(fish_cofig 命令)是个非常优雅的设计思想,这其中包含一个非常cool的可视化命令提示器(打败了我的xterm opener),但是非常失望,我没有发现任何值得配置的。感觉应该是缺了点啥,我搜索Oh My Fish这个关键词,然后我我发现了我需要执行下面的东东:
curl -L https://github.com/bpinto/oh-my-fish/raw/master/tools/install.sh | bash
不用设置~/.fishrc文件,fish的配置的路径是~/.config/fish/config.fish.

  1. set fish_path $HOME/.oh-my-fish
  2. . $fish_path/oh-my-fish.fish

提示/主题

我还是想搞一个比较好点的提示信息,不想用以前oh-my-zsh的fino主题。Numist这个oh-my-fish应该是最接近他的了。但是这个主题不能显示ruby版本。我将我修改后的numist主题加入ruby 版本配置。代码清单如下:

  1. set -l ruby_info
  2. if which rvm-prompt >/dev/null ^&1
  3. set ruby_info (rvm-prompt i v g)
  4. else
  5. if which rbenv >/dev/null ^&1
  6. set ruby_info (rbenv version-name)
  7. end
  8. end
  9. test $ruby_info; and set ruby_info "$normal""using $magenta‹$ruby_info›"

工具

有时oh-my-fish的一些插件已经足够满足我的需求了。我不知道为什么,但是rbenv rake bundler这些插件跟以前在oh-my-zsh上一样运行良好。此外node插件也能正常工作,但是自动完成看起来是由node和npm的手册自动产生的,其实不然。其中一个自动完成的插件heroku cli,他并没有手册(heroku真是丢人)。
然而大多数工具和fish并不兼容,那么问题来了,那咋整?这个时候,我想试试一个新玩具(nvm),它是为那些没有fish插件的情况准备的。受这个POSIX/bash配置文件的启发,我决定编写下自己的source函数,它们能执行bash代码并且能够重新产生或者模拟fish上面的函数的变量的变化。


结论

我的fish的配置文件是下面这个样子:

  1. # Oh My Fish!
  2. set fish_path $HOME/.oh-my-fish
  3. set fish_theme my
  4. set fish_plugins rbenv rake bundler node
  5. . $fish_path/oh-my-fish.fish
  6. # nvm
  7. . $HOME/.config/fish/source.fish
  8. source --bash $HOME/.nvm/nvm.sh
  9. . $HOME/.config/fish/functions.fish

译者注:
- fish有时候使用vi的时候会出错,下面是修改方法或者看这里

  1. if &shell =~# 'bin/fish$'
  2. set shell=/bin/sh
  3. endif
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注