随着 Mac 下终端的使用日益增多,系统默认的 bash 已经满足不了需求了,于是有了更为强劲的 fish 和 zsh,以及它们各自的强心剂 Oh-My-Fish 和 Oh-My-Zsh. 我的选择是 Fish 和 Oh-My-Fish。
到目前为止,最新的 fish 2.2.0 于 2015 年 7 月 12 日发布,Release notes 如下 http://fishshell.com/release_notes.html,其中显著改变有:
- Abbreviations: the new
abbr
command allows for interactively-expanded abbreviations, allowing quick access to frequently-used commands (#731). - Vi mode: run
fish_vi_mode
to switch fish into the key bindings and prompt familiar to users of the Vi editor (#65). - New inline and interactive pager, which will be familiar to users of zsh (#291).
- Underlying architectural changes: the
fishd
universal variable server has been removed as it was a source of many bugs and security problems. Notably, old fish sessions will not be able to communicate universal variable changes with new fish sessions. For best results, restart all running instances offish
. - The web-based configuration tool has been redesigned, featuring a prompt theme chooser and other improvements.
- New German, Brazilian Portuguese, and Chinese translations.
我对第二点比较感兴趣,即增加了 vi 模式,在 fish 下运行 fish_vi_mode
命令,或者在 ~/.config/fish/config.fish
中加上 fish_vi_mode
便自动进入 vi 模式。
我还没能在官方找到任何关于 fish 的 vi 模式的的说明文档,但作为一个 vi 的使用者,该自由发挥了。
如前方标识 [I] 为插入模式, [N] 为命令模式, [V] 为可视(Visual) 模式。
从 [I] 切换到 [N] 模式按 Esc 键
从 [N] 可以按 V 键切换到 [V] 模式
从 [N] 到 [I] 模式可以按 i/I, s/S, a/A
在 [N] 命令模式你可以无底线的去尝试所有的 vi 指令了,如
^ 跳到行首 (替代了默认的 ctrl + a)
$ 跳到行尾 (替代了默认的 ctrl + e)
其他移如 w/b 向后/向前移动一个字, x/dw/dd 删除当前字符,字,和行
yy 复制当前行,p 粘贴
自己多多尝试吧。
附:fish 和 Oh My Fish 的安装(Mac OS X)
1. 安装 fish:
brew install fish --HEAD
2. 安装 Oh My Fish:
curl -L https://github.com/oh-my-fish/oh-my-fish/raw/master/tools/install.fish | fish
当前 Oh My Fish 与的构建也是插件方式,似乎与当前的 fish 2.2.0 存在兼容问题,所以我手动安装的是这个分支
git clone -b commits-ahead-scorphish git://github.com/oh-my-fish/oh-my-fish.git ~/.oh-my-fish
cp ~/.oh-my-fish/templates/config.fish ~/.config/fish/config.fish
3. 设置 fish 为默认 shell:
echo "/usr/local/bin/fish" | sudo tee -a /etc/shells
chsh -s /usr/local/bin/fish
如果不想看到每次的欢迎信息在 ~/.config/fish/config.fish 中加上
set --erase fish_greeting #或 set fish_greeting ""