2016/11/27 Sun
ちまたで(?)話題の fish を使ってみた。
長年使ってきた zsh のかわりにはならないだろうなーと思いながら・・・。
・・・が、いざ使ってみると非常に使いやすい!
zsh のかわりになるどころか置き換えてしまった。
(つまり、自分は結局そこまで zsh を使いこなしていなかったんだろう・・・。)
fish のチュートリアルは、以下にある。
日本語でもqiitaとかにいっぱい解説記事があるので難しいことはないと思う。
唯一はまったのは、上記tutorialにある、 hybrid_bindings 。
vi っぽいキーバインドで、 insert モードの場合は emacs っぽくするって感じなんだろうけど、使用できなかった。 なんか issue 上がってたりしたので、そのうち修正されるのかもしれない。
とりあえずは、必要なキーバインドのみを自分で再定義してやることで要望は満たせた。
fish では、 fisherman というプラグインマネージャーが存在しており、これを使って各種プラグインを管理する。
日本語での解説も書いてあるので導入は簡単。
$ curl -Lo ~/.config/fish/functions/fisher.fish --create-dirs git.io/fisher
上記を実行するだけ。
自分が入れたパッケージはとりあえずこんだけ。
simple :
シンプルなテーマomf/gi :
gitignore を管理できるやつ。2個だけ。 fish が単体で色々出来るやつだからこそかも。
fish は、設定を ~/.config/fish 配下で管理する。
こんな感じ。
$ tree fish
fish
├── completions
├── conf.d
├── config.fish -> /Users/yukimemi/.dotfiles/.config/fish/config.fish
├── fishd.xxxxxxxxxxxx
├── fishfile -> /Users/yukimemi/.dotfiles/.config/fish/fishfile
├── functions
└── my_functions -> /Users/yukimemi/.dotfiles/.config/fish/my_functions
$ tree my_functions
my_functions
├── __cdup.fish
├── __filter_command.fish
├── __filter_command_execute.fish
├── __filter_command_history_execute.fish
├── __filter_command_history_select.fish
├── __filter_command_select.fish
└── fish_user_key_bindings.fish
それから、上記 fisherman を使っている場合、 ~/.config/fish/functions 配下がどんどん侵されていくので、自分で作成した function は my_functions というディレクトリ配下で管理することにした。
(シンボリックリンクが嫌な場合、それを解決した fresco というものもあるらしい。)
config.fish から、 my_functions の内容を読み込む。
~/.config/fish/config.fish# Load my_functions.
for func in ~/.config/fish/my_functions/*.fish
source $func
end
かんたん♪
あとは、 peco や fzf などのフィルター系コマンドが使えるようにする。
zsh の時は、fzf を使っていたんだけど、 fzy ってのがあって、 enhancd でおすすめって書いてあったから、とりあえずそれを使ってみる。
まずは、コマンド定義。
~/.config/fish/my_functions/__filter_command.fishfunction __filter_command
fzy -l 200
end
fzy を使うよってだけ。 -l オプションは表示する候補数。
それから、これを使って、選択だけするやつと、実行するやつを定義。
~/.config/fish/my_functions/__filter_command_select.fishfunction __filter_command_select
__filter_command | read -l line
and commandline $line
end
~/.config/fish/my_functions/__filter_command_execute.fishfunction __filter_command_execute
__filter_command | read -l line
and echo "
------
Running command: $line
------"
and eval $line
commandline -f repaint
end
今度はこれで履歴検索するやつを作る。
~/.config/fish/my_functions/__filter_command_history_select.fishfunction __filter_command_history_select
history | sort -u | __filter_command_select
end
~/.config/fish/my_functions/__filter_command_history_execute.fishfunction __filter_command_history_execute
history | sort -u | __filter_command_execute
end
こんな感じ。 簡単でわかりやすい。
あとはこれをキーに割り当てる。
fish では、キーバインドは fish_user_key_bindings という関数で行うのが通例っぽい。
~/.config/fish/my_functions/fish_user_key_bindings.fishfunction fish_user_key_bindings
bind -M insert \cf accept-autosuggestion
bind -M insert \cn down-or-search
bind -M insert \cp up-or-search
# TODO: Not work.
bind -M insert \c\^ __cdup
# filter command.
bind -M insert \cr __filter_command_history_select
bind sul __filter_command_history_execute
end
-M オプションでモードを指定できる。
べんりー!
あとは、前使ってた enhancd を使いたい。
それから、 C-^ で親ディレクトリに移動するってのを zsh のときにやってたんだけど、それが fish だとうまくできない。
どうやってやればいいんだろ・・・。知ってる人いたら教えてください。
初心者がShellを知りFish〜Fishermanを導入するまで