なんのこっちゃとお思いでしょうが、「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専用のブラウザ画面まで表示されます。
こんなシェル、素敵だと思いません?
ピンバック: autojump | VivaFan通信
ピンバック: 「fish」シェルを実際に使うために | VivaFan通信