web-dev-qa-db-ja.com

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

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

user@/home/user $ ranger

レンジャーが開く.....そして私が探求するレンジャープログラムの中で:

/media/ubuntu/sdf675d7sf5sdfs7/some_directory

次にqを押してレンジャーを終了すると、レンジャーを起動したときと同じフォルダーに戻ります。つまり.

user@/home/user $

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

user@/media/ubuntu/sdf675d7sf5sdfs7/some_directory $  
34
the_velour_fog

そのマニュアルによると

--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に書き込むことをお勧めします。

34
Gombai Sándor

[〜#〜] s [〜#〜]

Sを押すと、現在のディレクトリに新しいシェルが開きます。

次に、Ctrl + Dシェルでは、rangerに戻ります。

この回避策は、多くの場合十分です。

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

$ソースレンジャー

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

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

$エイリアスranger = 'source ranger'

または、それを.bashrcファイルに追加します。

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

9
Ogino Knaus

GombaiSándorの回答を元に戻すために、エイリアスを少し調整することをお勧めします。

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

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

4
dduxx

Gambai およびその他の提案されたバリアントと比較して、 より良い答え を使用して他の場所で同様の質問に遭遇しました。それ以来良いです。

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

レンジャーのgitリポジトリにあるShellファイルに関数があります:

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で機能し、優先シェルに基づいて変更する必要があります

2

インスピレーションを与えてくれた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- into-cd

1
Try431

ワンアップしてもいい?他の引数を渡すと便利な場合があるので、これをshellrcに入れてください

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

これは、関数ラッパーを作成することによる、よりエレガントな方法です。コマンド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は終了してディレクトリを変更します。

0
Simba

これは少し古いですが、同じ問題でここに行きました。 Ciro Santilliは、レンジャーにいるときに「S」を押すと新しいシェルで開くと述べました。私のシステムでは、ディレクトリで "S"を押すと、現在のシェルでそのディレクトリが開きます。まさに、私がやりたいことです。これが他の人の役に立つことを願っています。

0
girvain