fish
fzf
Ghq
Fisher

fish shellが結構良かった話


Fishermanは名前を変更しFisherとなったため、それにともない内容を修正しました。

Yaourtはすでに開発が終了しているため、Yayを使うよう修正しました。


「fishいいよ」みたいな話は何度かちらっと聞いていたんですけど、ちょっと調べてみたところPOSIX非互換ということで、あまり興味を持てずにいました。

しかし最近Twitterで勧められて試しに使ってみたところ、すごく良かったので導入方法とかおすすめプラグインとか紹介してみたいと思います。

僕も入門したところなので、あんまり詳しくはないですけど。

似たような内容ですが、目的を絞った記事も書いたので興味があれば読んでみてください。

こっちの方がわかりやすいかもです。

ローカルリポジトリの管理方法


fishとは

Friendly interactive shellの略称だそうです。

ユーザーフレンドリさと対話的利用、わかりやすさを重要視しているようですね。

今までのシェルと同じように直感的に使えて、かつ古い悪習(caseの終了がesacとか)を捨て去っているという感じです。

なのでPOSIX非互換となっています。

POSIXというのは、シェルスクリプトの標準仕様のようなものです。

shPOSIX互換のシェルですね。

Bourne Shellを単にshと呼んだりするそうですが、UnixやLinuxにある/bin/shshそのものであったり、bash --posixであったりするそうです。

bash --posixはBashの機能で、POSIX互換の機能のみ使用してスクリプトを動かすモードです。

shなのか別のシェルなのか気になる方はls -l $(which sh)を実行すると見られるらしいです。

ls-lオプションはリンクが張られているかを表示するために付けてます。

閑話休題。

BashとかZshとかは、POSIX互換ではなくPOSIX準拠となっています。

というのも、POSIXの仕様で決められたものは全て動かせますけど、それ以外の拡張機能もあるのです。

互換ならどちらで書いてもどちらでも動きますけど、準拠は違います。

shで書いたものはBashで動きますけど、Bashで書いたものはshで動かないかもしれません。

Bashの拡張機能を使っているとshでは動きませんからね。

fishはこのPOSIX非互換が問題になるかもと思っていたんですけど、そういうコピペしてきたスクリプトとか動かすときだけshなりBashなり使えばいいですし、プラグイン紹介に書いてますけどBash互換のスクリプトを動かせるようなプラグインもあります。

そこまで困ることもないかもしれませんね。

以上、半分以上POSIXの話になっていた気もしますけど、fishについてでした。


fishのここが良かった



  • デフォルトで色々いい感じなので、ほぼ設定いらず


  • シンタックスハイライトの機能がすごい



    • 入力中のコマンドにもシンタックスハイライトが効く

    • コマンドやオプションが合っているかがひと目でわかる



  • コマンド履歴からの補完



    • コマンド入力中にインタラクティブに補完が見える



Screenshot at 2018-04-26 22-56-57.png

スクリーンショットはちょっと見た目をいじったあとのものです。

あと公式サイトにもアピールポイントが書いてありますね。


  • 履歴から自動で補完候補を表示

  • カラフルでわかりやすい

  • シンタックスがシンプルでわかりやすい

  • ブラウザでグラフィカルに設定をいじれる

  • わざわざ補完のためのコードを書かなくてもmanページから補完できる

  • 他のシェルでも使えるTabでの補完やシンタックスハイライトを強化しているだけなので、特別に新しいことを覚える必要がない

かなり雑な意訳ですがこんな感じでしょうか。


設定

基本的には~/.config/fish/config.fishに書いていきます。

でも設定ファイルを直接書くのって不安ですよね。

そこで、fishにはブラウザで設定をいじる方法が用意されています。

fishでfish_configを実行してみてください。

Screenshot at 2018-04-27 01-53-59.png

URLが表示されているので、アクセスしてみましょう。

Screenshot at 2018-04-27 01-55-29.png

これなら簡単に設定をいじれそうですね。


Fisher

Fisherはfishのプラグインの管理ツールです。

似たようなツールとしてOh My Fishがありますけど、Fisherの方が後発のためこちらを使いたいと思います。


インストール

インストール方法はFisherのGithubのページにありますけど、ワンライナーです。

まず、それぞれのパッケージマネージャとかを使ってfishを入れてください。


ArchLinuxの例

yay -S fish


そしてfishを起動後、以下のインストール用のワンライナーを実行してください。

curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish


fishをログインシェルにする

fishをログインシェルにするかどうかは各自に任せたいと思います。

ログインシェルにしたい人は以下のスクリプトを実行してください。


sh

chsh -s $(which fish)



fish

chsh -s (which fish)


あ、Arch Linuxの人はこれやらないでくださいね。

詳しくはArchWikiのfish読んでください。

ちなみにですけど、chshchange shell$()はコマンドの実行結果を取得するものです。

fishでは()ですね。


Fisherの使い方

fisher -h(fisher --help)でサブコマンドの一覧を見ることができます。

Screenshot_2019-01-19_01-18-49.png

ちなみにですけど、fish起動してないとfisherコマンドは使えません

基本的にはfisher add user/fooでGithubで公開されているプラグインをインストールすることができます。

削除するときはfisher rm fooです。

インストール済みのプラグインの一覧はfisher lsで見られます。

プラグイン紹介でも書きますけど、僕が入れてるのはこんな感じですね。

Screenshot_2019-01-19_01-24-37.png


プラグイン紹介

僕の個人的なおすすめプラグインです。

まあまだfishを使い始めたところなので、それくらいの意識で読んでいただけるとちょうどいいかと思います。


oh-my-fish/theme-bobthefish

fisher add oh-my-fish/theme-bobthefish

VimにPowerlineというプラグインがあるんですけど、それのfish版です。

Gitのブランチとかステータスをわかりやすく表示してくれるツールですね。

Powerline Fontsを使っていますので、文字化けする人はインストールしてください。


ArchLinuxの例

yay -S powerline-fonts


また上記のリンクにもインストール方法が書かれています。

それでも文字化けするという人は、Cicaというフォントを入れてみて、それぞれのターミナルで設定してみてください。


ArchLinuxの例

yay -S ttf-cica


bobthefishの良さを知ってもらうため、少しデモを行いたいと思います。

まずGitのリポジトリのディレクトリに行きます。

Screenshot at 2018-04-27 00-05-20.png

カレントディレクトリの横に、gitでよく見かけるアイコンが見えますね。

次に、ファイルを変更してみます。

まあ面倒なのでREADME.mdを削除してしまいます。

Screenshot at 2018-04-27 00-12-35.png

表示が赤色に変わりましたね。

変更されたファイルがあるよ、という警告でしょうか。

では、先ほどの変更をステージングしてみます。

Screenshot at 2018-04-27 00-15-28.png

今度は黄色になりました。

コミットしていないステージングがあるよ、というのがひとめでわかりますね。

次はコミットを行ってみます。

Screenshot at 2018-04-27 00-17-13.png

コミットを行うと、緑色の表示に戻りましたけど、何やら+記号がついていますね。

Your branch is ahead of 'origin/master' by 1 commit.をグラフィカルに示しているんですね。

面倒なのでpushはしませんけど、こんな感じです。

便利ですね。


jethrokuan/z

fisher add jethrokuan/z

移動系のプラグインです。

簡単に言うと、カレントディレクトリ以下のディレクトリだけでなく、それ以外のディレクトリへ直接移動できます

Screenshot at 2018-04-26 23-56-46.png

原理としては、コマンドの履歴からディレクトリへのパスを検索しています。

なので行ったことあるディレクトリにしか行けないです。

あとTabでの補完もできますね。


FabioAntunes/fish-nvm

NVM使ってない人はいらないですね。

これは何のためにあるかといいますと、NVMってBashに依存している部分があるんですよね。

なので、そのままではfishでは動きません。

それに対応するためのプラグインです。

ちなみに内部ではedc/bassという、Bash互換のスクリプトを実行するためのプラグインを利用しています。


jethrokuan/fzf

そもそもfzf自体を使ったことがないという人が多そうですけど、使いましょう。

とても便利です。

fzf自体は、入力された行データからインタラクティブに曖昧検索を行ってくれるコマンド(fuzzy finder)です。

ちなみにGo製のツールです。

似たようなツールに同じくGo製のpecoがありますけど、こちらはfzfとは違い部分検索です。

最近はpecoでもあいまい検索ができるみたいです。

今回はfzfを使ってみたいと思います。

まずはfzfをそれぞれのパッケージマネージャとかで入れましょう。


ArchLinuxの例

yay -S fzf


そしてFisherでfzfを入れます。

fisher add jethrokuan/fzf

そして、~/.config/fish/config.fishがなければ作成し、以下の設定を書き込んでください。

set -U FZF_LEGACY_KEYBINDINGS 0

これはこのプラグインの古いキーバインドを使わないための設定です。

なぜキーバインドが新しくなったかというと、fish 2.4.0でキーバイドがコンフリクトしたからだそうです。

詳しい使い方はjethrokuan/fzfのREADMEに書いてあります。

Ctrl+fファイルの曖昧検索ができます。

Screenshot at 2018-04-27 00-42-44.png

これは今回の記事とかで取ったスクショですね。

Ctrl+rコマンド履歴の曖昧検索です。

Screenshot at 2018-04-27 00-44-50.png

ciと入力してるのにconfigとかひっかかってますね。

曖昧検索すごい。

最後に、Alt+oディレクトリを検索して移動ですね。

Alt+Shift+oで隠しファイルも検索できるようです。

あれ、これzの存在意義……?

Screenshot at 2018-04-27 01-04-14.png

fshなんていうタイポ検索でも安心ですね。

あとこれは余談なんですけど、fzffish関係ないところでも結構使いやすいです。

例えばホームディレクトリでls -aとかすると、ものすごい量の隠しファイルが表示されたりしますよね。

Screenshot at 2018-04-27 01-35-18.png

こういうとき、grepを使ってls -al | grep bashとする人が多いかもしれません。

Screenshot at 2018-04-27 01-37-26.png

そこでgrepの代わりにfzfを使うと……

Screenshot at 2018-04-27 01-39-40.png

インタラクティブな上にファジーに検索できますね。


decors/fish-ghq

これもそもそもghqを使ったことがないという人が多いかもしれないですね。

でもとても便利なのでぜひ使いましょう。

そしてこれもまたGo製のツールです。

Goってコマンドラインツール作るのにいい言語なんでしょうかね。

ghqgit cloneを一箇所で管理してくれるツールです。

まずはお使いのパッケージマネージャでghqを入れましょう。

Goの環境がある人はgo getしてmakeでもいいですけど。


ArchLinuxの例

yay -S ghq


そしてFisherでfish-ghqを入れます。

fisher add decors/fish-ghq

使い方は簡単です。

まずghq get url

リポジトリを持ってきます。

Screenshot at 2018-04-27 01-25-09.png

git cloneまんまです。

~/.ghq/github.com/henninltn/sushiに入っているようですね。

ちなみにですけどghq rootでクローンされるディレクトリを確認できます。

そしてfishでghqを使う利点ですけど、とりあえずCtrl+gを押してみてください。

Screenshot at 2018-04-27 01-45-47.png

見たことある表示ですね。

これはfzfでghq getしてきたリポジトリを曖昧検索しています。

decor/fish-ghqがfzfやpecoが入っていると、Ctrl+gで検索を行ってくれるようになっています。

まあようは、これを使えばCtrl+gで目的のリポジトリに素早く移動できるわけですね。


まとめ

fish、どうでしたでしょうか。

ほとんどのプラグインで設定ファイルを書いていませんでしたよね。

そして設定も簡単にいじれます

またこの記事を読みながら手を動かしてくださっていた人ならもうわかっていただけたと思いますけど、補完とサジェストとシンタックスハイライト、とても強力ですよね。

とにかく楽だ……

しばらくはfishを使っていきたいと思います。


参考文献

Public Domain Lisp Logo Set

POSIX - Wikipedia

Unixシェル - Wikipedia

Friendly interactive shell - Wikipedia

h・bash・zsh等, shellの違いでハマりやすい部分とか - 水底