レンジャーファイルエクスプローラを終了してコマンドプロンプトに戻り、現在のディレクトリを保持する方法


28

Linuxターミナル内からRangerターミナルファイルエクスプローラーを使用しています
ホームディレクトリのコマンドプロンプトから起動し、レンジャーを起動するとします

user@/home/user $ ranger

レンジャーが開く.....そして、私が探検するレンジャープログラム内で:

/media/ubuntu/sdf675d7sf5sdfs7/some_directory

その後、qを押してレンジャーを終了すると、レンジャーを起動したフォルダーと同じフォルダーに戻ります。すなわち

user@/home/user $

レンジャーを終了し、レンジャーと一緒にいたディレクトリに残ることは可能ですか?

user@/media/ubuntu/sdf675d7sf5sdfs7/some_directory $  

回答:


29

そのマニュアルによると

--choosedir=targetfile    
    Allows you to pick a directory with ranger. When you exit ranger, it will write the last visited directory into targetfile.

したがって、次のようなエイリアスを作成するだけです。

alias ranger='ranger --choosedir=$HOME/.rangerdir; LASTDIR=`cat $HOME/.rangerdir`; cd "$LASTDIR"'

そして、このエイリアスをお気に入りのシェルのrcに書き込むことをお勧めします。


2
うわー、かなり賢いです。プログラムにコマンドを発行し、aで終了し、;セミコロンの後にさらにコマンドを指定することはできませんrangerでした。
the_velour_fog

1
.rangerdir代わりに使用して非表示にすることを検討してください。または、最後に削除しrm -d $HOME/rangerdirます。
マティーンウルハク

これは素晴らしいことですが、私がそれを正しく理解していれば、これはあなたがその振る舞いを永続的に持っているということです。現在のレンジャーディレクトリ、またはレンジャーを起動したときに使用していたディレクトリに戻るオプションがある方法があればいいと思います。
ネバーフォックス

neverfoxエイリアスを作成したら、そのエイリアス内に着くディレクトリの選択を提供するかどうかはあなた次第です。選択は、バイナリが呼び出される前または終了後に行うことができます。
ゴンバイサンドル

この素晴らしいソリューションをありがとう!私はたまたま魚の貝を使用しているので、エイリアスを設定するために、次を使用fish_configして略語を追加しました ranger --choosedir="$HOME/.rangerdir"; cd (cat $HOME/.rangerdir)
rockzombie2


7

もっと簡単な解決策を見つけました。レンジャーをインストールすると、binフォルダーにスクリプトが配置され、実行されるとプログラムが起動します。しかし、あなたがそれを調達した場合、

$ソースレンジャー

レンジャーが起動し、終了すると最後にアクセスしたフォルダーにドロップされます。

したがって、デフォルトでこの動作が必要な場合は、

$ alias ranger = 'source ranger'

または、.bashrcファイルに配置することをお勧めします。

この機能のドキュメントと実装を確認するには、binフォルダーのレンジャースクリプトを読んでください。


どうやらこの手法(実行するだけに短縮できる. ranger)はwikiで
cjauvin

4

GombaiSándorの答えに便乗して、エイリアスを少し調整することをお勧めします。

alias ranger='ranger --choosedir=$HOME/.rangerdir; LASTDIR=`cat $HOME/.rangerdir`; cd "$LASTDIR"'

「$ Home / rangerdir」を「$ Home / .rangerdir」に変更すると、エイリアスによって作成されたファイルが非表示になります。迷惑なようにホームフォルダを散らかさないようにするだけです。動作に機能的な違いはありません。


2

私は他の場所で同様の問題につまずい良い答えに比べGambaiやそのほかの提案の変種。より良いです。

  1. システムが削除できるように、作成されたファイルをtmpフォルダーに入れることで処理します
  2. よりクリーンなコードです(ただし、Gambaiの答えは関数に変換できます)

既にレンジャーのgitリポジトリにあるシェルファイルに関数があります。

https://github.com/ranger/ranger/blob/master/examples/bash_automatic_cd.sh

function ranger-cd {
    # create a temp file and store the name
    tempfile="$(mktemp -t tmp.XXXXXX)"

    # run ranger and ask it to output the last path into the
    # temp file
    ranger --choosedir="$tempfile" "${@:-$(pwd)}"

    # if the temp file exists read and the content of the temp
    # file was not equal to the current path
    test -f "$tempfile" &&
    if [ "$(cat -- "$tempfile")" != "$(echo -n `pwd`)" ]; then
        # change directory to the path in the temp file
        cd -- "$(cat "$tempfile")"
    fi

    # its not super necessary to have this line for deleting
    # the temp file since Linux should handle it on the next
    # boot
    rm -f -- "$tempfile"
}

この関数をお気に入りのシェルrc(たとえば~/.zshrc)ファイルに入れて、エイリアスを作成したり、キーの組み合わせにバインドしたりすることができます(両方ともrcファイルに入れることができます)。

alias nav=ranger-cd

および/または

# This will run the function by Ctrl+O through returning
# the string "ranger-cd" in addition to a new-line character
# to act as Enter key-press
bindkey -s "^o" "ranger-cd\n"

免責事項:bindkey ZSHで上記の作品とあなたはお好みのシェルに基づいて、それを変更する必要があります


1

インスピレーションを与えてくれたGombaiに感謝しますが、Ubuntu 14.04 LTSでは、解決策がうまくいかないことがわかりました。それをわずかに変更して、私の.bashrcにエイリアスとして保存すると、以下が完全に機能しました(rangerdirファイルの作成後):

alias ranger='ranger --choosedir=$HOME/rangerdir;cd "$(cat $HOME/rangerdir)"'

次のaskubuntuの投稿は、私が試みていたさまざまな解決策が機能しなかった理由を理解しようとしたときに役立ちました:https : //askubuntu.com/questions/404141/why-cant-i-pipe-in​​to-cd


1

ワンアップできますか?他の引数を渡すことは便利かもしれませんので、これをあなたのshellrcに入れてください

function ranger () {
    /usr/bin/ranger --choosedir=$HOME/.rangerdir $@
    LASTDIR=`cat $HOME/.rangerdir` 
    cd $LASTDIR
    echo -n > $HOME/.rangerdir
}

0

関数ラッパーを記述することで、よりエレガントな方法を紹介します。コマンドを使用するだけで、rangerディレクトリの変更をメインシェルに同期したい場合は、大文字でレンジャーを終了しますQ

(以下のコードは、BashとZSHを使用したテストです。)

function ranger {
  local IFS=$'\t\n'
  local tempfile="$(mktemp -t tmp.XXXXXX)"
  local ranger_cmd=(
    command
    ranger
    --cmd="map Q chain shell echo %d > \"$tempfile\"; quitall"
  )

  ${ranger_cmd[@]} "$@"
  if [[ -f "$tempfile" ]] && [[ "$(cat -- "$tempfile")" != "$PWD" ]]; then
    cd -- "$(cat -- "$tempfile")" || return
  fi
  command rm -f -- "$tempfile" 2>/dev/null
}

これにより、ディレクトリの変更をオンデマンドで同期できます。ディレクトリを終了して変更するに:qは、通常の終了に使用しQます。


(1)引用に問題があるようです。(2)「オンデマンド」とはどういう意味ですか?
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.