fish - rangerの多重起動を避ける設定

rangerというCLIのファイラがあるのを知って最近使っている。
参考: CLI で Linux ファイルマネージャ ranger を使うことのメモ

Macならbrew install rangerで入る。homebrewほんと便利。

そんなrangerの設定というかカスタマイズで「多重起動を避ける」というのがある。
上記の参考サイトではrangerの多重起動を避けるという項目で説明されている。

ここで書かれている設定はbash/zsh向けなので、fishの場合の書き方をメモ。

rangerの多重起動を避ける

bash/zshではこうなっている。

ranger() { [ -n "$RANGER_LEVEL" ] && exit || command ranger "$@"; }

fishでは次の定義を~/.config/fish/config.fishに定義する。
(~/.config/fish/functions/配下にファイルを作っても良いんだろうけど)

# ranger->サブシェル->rangerの多重起動を避ける
function ranger
  if set -q -x RANGER_LEVEL
    exit
  else
    command ranger $argv
  end
end

参考サイトにある通りRANGER_LEVEL変数が定義されていればexitして、それ以外(初回)なら普通にrangerを起動する。
注意としてはサブシェルからranger /tmpのように引数有りで起動してもexitして元のrangerに戻るだけなので、引数で渡したディレクトリで起動しない。

rangerのサブシェルの場合はプロンプトに表示

bash/zshではこうなっている。

[ -n "$RANGER_LEVEL" ] && PS1="(RANGER) $PS1"

fishでは次の定義を~/.config/fish/config.fishに定義する。
(~/.config/fish/functions/配下にファイルを作っても良いんだろうけど)

# rangerのサブシェルから起動された場合はpromptを変更する
if set -q -x RANGER_LEVEL
  set -g _origin_prompt (fish_prompt)
  function fish_prompt
    echo "(RANGER)$_origin_prompt"
  end
end
  1. 上記と同じようにRANGER_LEVELが設定されているかどうかで、通常のシェルかrangerサブシェルかを判断
  2. (fish_prompt)の実行結果、つまり既存のプロンプト表示を変数に保持する
    • -gでグローバル定義にしないとfish_prompt関数から見れなかった。ちょっと気持ち悪い
  3. fish_promptを再定義する

これで↓のように(RANGER)が付いた状態でプロンプトが表示される。

(RANGER) ~/.config/fish ⟩