🙆

ranger-cdをfish用に書き換える

2024/01/09に公開

【背景】

最近、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"
 }

引用元:bash_automatic_cd.sh

【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は強いですね。
※私の環境で動作確認済みです。

Discussion