【背景】
最近、fish-shellを利用するようになりました。
その際に困ったのは、.bashrc
で作っていた設定が使えなくなったことです。
(当たり前ですけどね笑)
その中の一つがranger-cd
です。
私は普段からrangerを使用しており、rangerを閉じた際にそのディレクトリにcdしていてほしいため、ranger-cd
を使用していました。
ですが、fish-shellでは.bashrc
ではなくfish.sh
を使用するため、そっちに移行すべく調べたのでここに残します。
【ranger-cdとは?】
ranger-cdとは、ファイルマネージャーであるrangerを使った後に、シェル(ターミナル)で作業していたディレクトリを自動的に変更するためのシェル関数です。
この関数は、rangerを終了した後に最後に訪れたディレクトリに自動的に移動します。
この関数を.zshrc、.bashrcなどのシェル設定ファイルに追加するか、あるいはシェル設定からこのファイルを読み込むことができます。
【ranger-cd 元スクリプト】
# .bashrc
function ranger-cd {
temp_file="$(mktemp -t tmp.XXXXXX)"
/usr/bin/ranger --choosedir="$temp_file" "${@:-$(pwd)}"
test -f "$temp_file" &&
if [ "$(cat -- "$temp_file")" != "$(echo -n $(pwd))" ]; then
cd -- "$(cat "$temp_file")"
fi
rm -f -- "$temp_file"
}
【Fishシェルへ書き換え】
Fishシェルの構文はBashとは異なります。
例えば、変数の代入にはset
コマンドを使用し、&&
や;
でのコマンドの連結は異なる方法で行います。
また、条件分岐にはif
文が使われますが、Bashとは書き方が少し異なります。
以下は、提供されたBash関数をFishシェルに移植した例です:
# fish.sh
function ranger-cd
# 一時ファイルを作成
set temp_file (mktemp -t tmp.XXXXXX)
# rangerを実行
/usr/bin/ranger --choosedir="$temp_file" $argv; or pwd
# 一時ファイルが存在し、かつ現在のディレクトリが一時ファイルに書かれているディレクトリと異なる場合
if test -f "$temp_file"
set selected_dir (cat $temp_file)
if test "$selected_dir" != (pwd)
cd $selected_dir
end
end
# 一時ファイルを削除
rm -f $temp_file
end
このスクリプトでは以下の変更を行っております。
- 一時ファイルの作成に
set
を使用して変数を代入しています。 -
test
コマンドを使用してファイルの存在を確認しています。 - Fishでは
&&
の代わりに; and
を、||
の代わりに; or
を使用します。 -
if
文の構文が変わり、Bashの[ ... ]
の代わりにtest
コマンドを使用し、条件ブロックはend
で終了させる必要があります。
上記の例がFishシェルにおけるranger-cd
関数の移植版となります。
※/usr/bin/ranger
の箇所は、使用している環境に合わせて変更してください。
※fish-shellへの変換はChatGPTにやってもらいました。
こう言う置換はChatGPTは強いですね。
※私の環境で動作確認済みです。