私は、Mac 環境で「fish」と呼ばれるシェルを使用してシステム開発をしています。
fish は、スマートでユーザーフレンドリーなコマンドラインシェルです。
他にも、旧 Mac 標準の「bash」や macOS Catalina からデフォルトシェルになった「zsh」もあります。
たまに案件によって使用禁止というところもありますので、3つのシェルを使えるようにカスタマイズしています。
一度「fish」を使用してみると、快適すぎて他のシェルに戻れなくなってしまいました(苦笑)
この note を読んでいるってことは、大多数がエンジニアさんだと思いますので、その魅力を少しでもお伝えできれば幸いです。
#目次
#fish とは
普通に読めば”お魚”と思いますが、**”Friendly interactive shell”**の略称だそうです。
デフォルトで強力な機能が備わっているので、インストールしただけでも十分に活用できます。
メリットはたくさんありますが、ブレット的に書くとこんな感じ。
✓ カラフルでわかりやすい(24bit カラーのサポート)
✓ シンタックスハイライトが効く
✓ ブラウザから細かな設定ができる
✓ コマンドやパスなどのオートサジェスチョン機能の搭載
✓ タブ補完ができる
✓ コマンドエラー判定がある
✓ 存在しないコマンドやディレクトリの場合は赤文字で表示される
✓ grep に 色がつく
など
実際に使用してみるのがわかりやすいので、まずはインストールしてみましょう❗
#事前準備
##Xcode:
まずは事前準備として、Xcode をインストールしましょう。
お好きな方からインストールしてください。
###App store から Xcode をインストールする場合
###コマンドラインからインストールする場合
$ xcode-select --install
###Homebrew からインストールする場合
# Homebrewをインストール
$ /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# Homebrewインストール完了確認
$ brew doctor
###Powerline フォント(お好み)
お好みになるので必須ではないですが、テーマによっては文字化けすることがあるため、私は powerline フォントをインストールしています。
ターミナルのほか、iTerm2 にもフォントを変更しております。
# Gitでクローン
$ git clone https://github.com/powerline/fonts.git --depth=1
# インストール
$ cd fonts
$ ./install.sh
# 要らないファイルを削除
$ cd ..
$ rm -rf fonts/
###iTerm2(お好み)
こちらもお好みですが、いざ乗り換えてみると細かい環境設定や便利な機能があったりと、意外と Hotkey が便利だったりします。
私のまわりでも iTerm2 を使用しているエンジニアは多いです。
詳細は、過去の note に書いていますのでご覧ください。
こちらの記事も Qiita にまとめる予定です。
もうしばらくお待ちください。
ということで、iTerm2 のインストールは、上記の記事に書いていますので、今回は省きます。
iTerm2 のフォント変更は、以下になります。
「Profiles > Text > Font」を選択し、フォントを変更します。
私の場合は、"Hack Nerd Font" を使用しています。
#fish のインストール
公式サイトからインストールしてください。
画像の通り、インストール方法はいろいろあります。
###Homebrew の場合
# インストール
$ brew install fish
# バージョンが表示されることを確認
$ fish -v
fish, version 3.1.2
インストール後、デフォルトシェルを変更をします。
$ chsh -s /usr/local/bin/fish
もし fish をインストールしても ”/etc/shells” に ”/usr/local/bin/fish” が追加されていない場合は、次のコマンドで追加してください。
$ echo /usr/local/bin/fish | sudo tee -a /etc/shells
設定後、シェルを再起動すると fish が起動されるようになります。
#設定
fish 上で、以下のコマンドを入力すると各種設定や履歴などが確認できるページがブラウザで表示されます。
$ fish_config
こんな感じ。
カラーバリエーションが豊富ですよね。
※ iTerm2 を使っている場合、配色の変更は iTerm2 側に依存するため反映されません。
デフォルトの設定でカラーやプロンプトを変更してみましょう。
プロンプトで表示する情報を増やすことで、業務効率の向上に繋がります。
プロンプトに気に入ったものがない場合は、後述するプラグインを導入してカスタマイズすることができます。
#ドキュメント
fish 上で、以下のコマンドを入力すると、本家ドキュメントがブラウザで表示されます。
$ help document
こんな感じ。
日本語のドキュメントを見たい方は、全訳!fishシェル普及計画さんのページをご覧ください。
fish2.4日本語ドキュメント:すぐ使える25の便利機能と実例
ここまででも充分に便利ですが、更に便利にするためプラグインを導入してみましょう。
できれば、紹介しているプラグインをすべてインストールするのではなく、機能を理解したうえで自分に合ったものだけインストールするようにしましょう。
#プラグイン管理ツールのインストール
Jorge Bucaran さんが、fish 情報をまとめて下さっていますので、こちらを参考に進めてもいいと思います。
##Fisher:
fisher は fish のパッケージ管理ツールです。
昔は、fisherman という名前でした。
プラグイン導入に必須ですので、インストールしましょう。
###fisher のインストール
※隠れている文字もありますのですべてコピーしてね。
$ curl https://git.io/fisher --create-dirs -sLo ~/.config/fish/functions/fisher.fish
###fisher でプラグイン追加
fisher でプラグインを追加するには、次のように ”fisher add” を使用します。
$ fisher add <パッケージ名>
###ヘルプの表示
コマンドは install、update、remove、list、help のみです。
$ fisher help
fisher: unknown flag or command "help"
usage: fisher add <package...> Add packages
fisher rm <package...> Remove packages
fisher Update all packages
fisher ls [<regex>] List installed packages matching <regex>
fisher --help Show this help
fisher --version Show the current version
fisher self-update Update to the latest version
fisher self-uninstall Uninstall from your system
examples:
fisher add jethrokuan/z rafaelrinaldi/pure
fisher add gitlab.com/foo/bar@v2
fisher add ~/path/to/local/pkg
fisher add <file
fisher rm rafaelrinaldi/pure
fisher ls | fisher rm
fisher ls fish-\*
コマンドを忘れてしまっても help さえ覚えておけば問題ないと思います。
英語も簡単なので親切ですね。
#プラグインのインストール
##〜 oh-my-fish 編 〜
###【oh-my-fish/plugin-balias】
alias の代わりに balias と書くことで、alias を補間してくれます。
エイリアスを定義した上で、なおかつ登録したエイリアスも他のコマンドと同じように補完できます。
####インストール
$ fisher add oh-my-fish/plugin-balias
####設定
~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。
$ vim ~/.config/fish/config.fish
# 例:git のエイリアスを追加する場合
# git コマンドを g で打てるように登録
# 下記を追記
balias g git
以上
###【oh-my-fish/plugin-expand】
cd を冒頭につけなくてもディレクトリ移動ができるようになります。
####インストール
$ fisher add oh-my-fish/plugin-expand
以上
###【oh-my-fish/plugin-peco】
使い勝手の良いフィルタリングツールです。
コマンドの実行履歴の絞り込みには peco、もしくは、後述の fzf のどちらか一方で良いと思います。
以下、2つの機能を提供してくれます。
- peco_kill ・・・ プロセスキル
- peco_select_history ・・・ コマンド履歴
####インストール
$ brew install peco
$ fisher add oh-my-fish/plugin-peco
####設定
~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。
peco_select_history と peco_kill をそれぞれキーバインド設定しています。
$ vim ~/.config/fish/config.fish
# 下記を追記
function fish_user_key_bindings
bind \cr 'peco_select_history (commandline -b)' # control + R
bind \cx\ck peco_kill # control + X からの control + K
end
peco を使ってヒストリーをフィルタリングできるようにしています。
$ vim ~/.config/fish/config.fish
# 下記を追記
function peco_select_history_order
if test (count $argv) = 0
set peco_flags --layout=top-down
else
set peco_flags --layout=bottom-up --query "$argv"
end
history|peco $peco_flags|read foo
if [ $foo ]
commandline $foo
else
commandline ''
end
end
function fish_user_key_bindings
bind /cr 'peco_select_history_order' # control + R
end
以上
###【oh-my-fish/plugin-extract】
どんな圧縮ファイルも解凍してくれる extract コマンドです。
####インストール
$ fisher add oh-my-fish/plugin-extract
以上
###【jethrokuan/fzf】
よく使うプラグインで、ファイル検索や実行コマンド検索を、あいまい検索で絞り込みができるコマンドラインツールです。
control + R で実行履歴を表示し、コマンドが選択できます。
上へ移動する場合 ・・・ control + K or ↑
下へ移動する場合 ・・・ control + J or ↓
####インストール
$ brew install fzf
$ fisher add jethrokuan/fzf
####設定
~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。
$ vim ~/.config/fish/config.fish
# 下記を追記
set -U FZF_LEGACY_KEYBINDINGS 0
set -U FZF_REVERSE_ISEARCH_OPTS "--reverse --height=100%"
####FZF_LEGACY_KEYBINDINGS:
新しいキーバインドを使用するのに必要
####FZF_REVERSE_ISEARCH_OPTS:
”–reverse”オプション ・・・ 入力欄をターミナル上部に表示させる
”–height”オプション ・・・ フルスクリーンで表示させる
もし、peco を設定している場合は、キーバインドが重複しないように注意ください。
以上
###【sijad/gitignore】
.gitignore を作成できます。
####インストール
$ fisher add sijad/gitignore
以上
###【jorgebucaran/fish-bax】
時間がかかる処理のときクルクル回るアイコンを表示されます。
####インストール
$ fisher add jorgebucaran/fish-bax
以上
###【jethrokuan/z】
よく使うプラグインで、過去に訪れたディレクトリを記憶・移動できるコマンドです。
スペースの後にタブで補完することができるので、ディレクトリの移動が楽になります。
z + -l でトラックしているディレクトリのリストを表示したり、z + 文字列 で履歴から移動するディレクトリの候補を表示してくれます。
####インストール
$ fisher add jethrokuan/z
以上
###【ghq】
git repository を置いているディレクトリを設定します。
ghq は、Go 言語で作成されたツールで、リポジトリを一元管理してくれるツールです。
少しややこしいので、GitHubのページをよく読んでインストールと設定をしましょう。
####インストール
$ brew install go
$ brew install ghq
# git repositoryを置いているディレクトリを設定
# 例:~/dev
$ git config --global ghq.root ~/dev
$ fisher add decors/fish-ghq
クローンしたリポジトリを一括管理できます。
ghq.root を設定することで、保存先のディレクトリを意識せず手軽にクローンできます。
$ ghq get <リポジトリURL>
clone したリポジトリは、~/.ghq/github.com で管理されているので、peco または fzf でリポジトリ一覧をフィルタリングし、選択したディレクトリに cd するようにすれば、リポジトリへの移動が非常に楽になります。
Go をインストールしたら、”~/.config/fish/config.fish” で GOPATH を設定します。
# Golang
set -x GOPATH $HOME/dev
set -x PATH $PATH $GOPATH/bin
go get を実行して ghq をインストールします。
$ go get github.com/motemen/ghq
$ source ~/.config/fish/config.fish
以降は peco または fzf で使いたい方を設定してください。
ghq + peco の設定:
~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。
# ghq + peco
function ghq_peco_repo
set selected_repository (ghq list -p | peco --query "$LBUFFER")
if [ -n "$selected_repository" ]
cd $selected_repository
echo " $selected_repository "
commandline -f repaint
end
end
# fish key bindings
function fish_user_key_bindings
bind /cg ghq_peco_repo
end
####ghq + fzf の設定
fisher でプラグインを追加します。
$ fisher add decors/fish-ghq
~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。
# ghq + fzf
function ghq_fzf_repo -d 'Repository search'
ghq list --full-path | fzf --reverse --height=100% | read select
[ -n "$select" ]; and cd "$select"
echo " $select "
commandline -f repaint
end
# fish key bindings
function fish_user_key_bindings
bind \cg ghq_fzf_repo
end
以上
###【hub】
GitHub に対する操作をコマンドラインから簡単に行うためのツール。
####インストール
$ brew install hub
$ hub version
git version 2.27.0
hub version 2.14.2
~/.config/fish/config.fish ファイルを編集して以下のように設定を追記します。
eval (hub alias -s)
以上
#その他
###【edc/bass】
Bash の文法を fish シェルでも使えるようにしてくれる。
####インストール
$ fisher add edc/bass
以上
###【0rax/fish-bd】
ディレクトリを遡ることができます。
$ cd ../../../ のような相対パスを打たなくてよくなります。
####インストール
$ fisher add 0rax/fish-bd
以上
###【yoshiori/fish-peco_select_ghq_repository】
ghq コマンドと peco の連携ができます。
ghq リポジトリ群を peco で選択して移動できる。
yoshiori/fish-peco_select_ghq_repository
####インストール
$ fisher add yoshiori/fish-peco_select_ghq_repository
####設定
~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。
# yoshiori/fish-peco_select_ghq_repository
function fish_user_key_bindings
bind \c] 'stty sane; peco_select_ghq_repository'
end
以上
###【tsu-nera/fish-peco_open_gh_repository】
ghq コマンドと peco の連携ができます。
ghq リポジトリ群を peco で選択して gh-open コマンドで開くことができます。
tsu-nera/fish-peco_open_gh_repository
####インストール
$ fisher add tsu-nera/fish-peco_open_gh_repository
####設定
~/.config/fish/config.fish ファイルを編集して、以下のように設定を追記します。
function fish_user_key_bindings
bind \cx\cl peco_open_gh_repository
end
以上
###【franciscolourenco/done】
通知を表示する秒数を変更する。
####インストール
$ brew install terminal-notifier
$ fisher add franciscolourenco/done
####設定
指定した時間を超えたときに通知をするように変更するには、~/.config/fish/config.fish に __done_min_cmd_duration をセットします。
# デフォルトの設定であれば、実行に5秒以上掛かる場合に通知が表示されます
set -U __done_min_cmd_duration 5000 # default: 5000 ms
end
以上
#プログラミング環境
詳細は、過去の note に書いていますのでご覧ください。
こちらの記事も Qiita にまとめる予定です。
もうしばらくお待ちください。
ちなみに、こんな感じになります。
他にもいじっているので、同じようにはなりませんが・・・
以上です。
プラグインの内容は、過去にメモったものをまとめただけなので、もしかしたら古くなっている可能性がありますので、GitHubのページを確認しながらインストールや設定をしてください。