fishfish

なんのこっちゃとお思いでしょうが、「fish」というシェルのお話。

インストールはHomebrewでできますが、現在フォーミュラは「fish」と「fishfish」の2種類あり、個人的には「fishfish」がお勧めってなわけで、

$ brew install fishfish
# ログインシェルに登録する場合は以下の3行を実行
$ sudo su
$ echo /usr/local/bin/fish >> /etc/shells
$ exit

「fish」というシェルは対話を重視した設計で、端末を使っていて気持ちが明るくなります。
「zsh」も機能豊富ですが何となく男性的なのに対し、fishは女性的とでも言いましょうか。
例えば、プロンプト一つとっても、

〜@〜〜 /O/L/etc> |

みたいな感じで、長くなったらさりげな〜く短くしておいてくれる優しさ。
今時TABキー補完は当たり前、「fish」はさらにその先を行きます。

〜@〜〜 /O/L/etc> cd |/opt/local/share

雰囲気わかりますか?
cd まで入力するだけで、次の入力を予測して淡い色合いで表示してくれます。
このままで良ければカーソル右を入力するだけです。
繰り返し編集している時にはとっても楽です。
また、存在しないコマンドは赤色で表示され、存在するコマンドは緑色で表示されます。入力中にリアルタイムで。だから何かする前に間違いがわかります。

そんな「fish」の設定ファイルは「~/.comfig/fish/config.fish」で、シェルの起動時には必ず読み込まれますので、ログインシェルかどうかの判断をして処理を分離します。

if status --is-login
    〜〜〜ここにログインシェルの時の設定を書く〜〜〜
else
    〜〜〜ここにログインシェル以外の時の設定を書く〜〜〜
end
〜〜〜ここに共通の設定を書く〜〜〜

ブロック分けするとこんな感じです。
「fish」の文法は「bash」系でもなく「csh」系でもなく、どちらかと言えば「csh」系かな。
まずはPATHの設定から。実はこれが一番の難関。

# PATHを一度保存
set -l path_list
for i in $PATH
   if not contains $i $path_list
       set path_list $path_list $i
   end
end

# path_helperで本来のPATHを取得
set -l path_helper (echo (/usr/libexec/path_helper -c) | sed -e "/\:/s// /g" -e "/\"/s///g" -e "/\;/s///g")
eval $path_helper

# fishのPATHを追加する
for i in $path_list
   if not contains $i $PATH
       if test -d $i
           set PATH $PATH $i
       end
   end
end

何をやってるかと言うと、このconfig.fishに制御がくる前に、大方のシェルと同じく勝手にPATHを決めてくるので、それを生かしつつも、こちらの都合に合わせた設定に書き換えています。
元の処理そのものを書き換える方法は、バージョンアップの時とかに面倒なので個人的にはお勧めしません。

最初のブロックは、set -l path_listでローカル変数を宣言し、if not contains 〜のところで、現時点でのPATHの内容をコピーしています。

次のブロックは、MAC標準のpath_helperを使って、本来のPATHを生成していますが、「fish」のリストは空白区切りなので「-c」オプションをつけています。
お気づきかもしれませんが、「(・・・)」は bashやcshでいうところの「`・・・`」と同じです。

最後のブロックは、元のPATHに入っていて今入っていないPATHを追加しています。
存在していないディレクトリを追加する事が許されないので、逐一「if -d」でディレクトリの存在をチェックしています。

環境変数の設定は、「set -gx」で宣言します。
(実はsetenvというfunctionもありますのでcsh的な宣言もできます)

set -gx PATH ~/bin $PATH

この例では、環境変数PATHに「~/bin」を前置きしています。
エイリアスを設定する場合は、「fish」はalias宣言ではなくfunctionで設定します。
(実はaliasというfunctionもありますので簡単なものならaliasでもOK)
毎度おなじみの「FDclone」の例で恐縮ですが、

# for fdclone
set -gx FD_LAST_PATH_FILE ~/.fd_last_path_file
function fd
    fd $argv; cd (cat $FD_LAST_PATH_FILE)
end

見た目、CのようなCでないような、でもわかりやすい文法だと思います。
困った時、helpと打ち込めばHELP専用のブラウザ画面まで表示されます。
こんなシェル、素敵だと思いません?

 

fishfish」への2件のフィードバック

  1. ピンバック: autojump | VivaFan通信

  2. ピンバック: 「fish」シェルを実際に使うために | VivaFan通信

コメントをどうぞ