Wie kann ich den Ranger-Dateiexplorer verlassen, um zur Eingabeaufforderung zurückzukehren, aber das aktuelle Verzeichnis beizubehalten?


28

Ich verwende den Ranger-Terminal-Dateiexplorer in einem Linux-Terminal.
Angenommen, ich starte über die Eingabeaufforderung im Ausgangsverzeichnis und starte Ranger

user@/home/user $ ranger

Ranger öffnet ..... und innerhalb des Ranger-Programms erkunde ich:

/media/ubuntu/sdf675d7sf5sdfs7/some_directory

Wenn ich dann q drücke, um Ranger zu beenden, werde ich wieder in denselben Ordner verschoben, aus dem ich Ranger gestartet habe. dh

user@/home/user $

Ist es möglich, Ranger zu beenden und in dem Verzeichnis zu bleiben, in dem ich mich mit Ranger befand?

user@/media/ubuntu/sdf675d7sf5sdfs7/some_directory $  

Antworten:


29

Nach seinem Handbuch

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

Sie müssen also nur einen Alias ​​wie diesen erstellen:

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

Es wird empfohlen, diesen Alias ​​in das RC Ihrer bevorzugten Shell zu schreiben.


2
Wow, das ist ziemlich clever. Mir ist nie aufgefallen, dass Sie einem Programm einen Befehl erteilen, ihn mit einem beenden ;und dann nach dem Semikolon weitere Befehle angeben können. Ich gehe davon aus, dass sie an dem Punkt ausgeführt werden, an dem Sie schließen ranger. Danke!
the_velour_fog

1
Verwenden Sie .rangerdirstattdessen, um es auszublenden. Oder löschen Sie es am Ende rm -d $HOME/rangerdir.
Mateen Ulhaq

Das ist großartig, aber wenn ich es richtig verstehe, würde dies bedeuten, dass Sie dieses Verhalten dauerhaft haben. Wäre schön, wenn es eine Möglichkeit gäbe, in das aktuelle Ranger-Verzeichnis ODER in das Verzeichnis zu wechseln, in dem Sie sich befanden, als Sie Ranger gestartet haben.
Neverfox

neverfox Sobald Sie einen Alias ​​erstellt haben, können Sie festlegen, in welchem ​​Verzeichnis dieser Alias ​​gespeichert werden soll. Die Auswahl kann vor dem Aufrufen der Binärdatei oder nach deren Abschluss erfolgen.
Gombai Sándor

Vielen Dank für diese großartige Lösung! Ich benutze zufällig die Fischschale. fish_configranger --choosedir="$HOME/.rangerdir"; cd (cat $HOME/.rangerdir)
Um

24

S

Wenn Sie drücken S, wird eine neue Shell im aktuellen Verzeichnis geöffnet.

Wenn Sie dann Ctrl + Dauf die Muschel schlagen , geht es zurück zu ranger.

Diese Problemumgehung ist häufig ausreichend.


7

Ich habe eine einfachere Lösung gefunden. Wenn Sie Ranger installieren, legt es ein Skript in Ihrem Bin-Ordner ab, das das Programm startet, wenn es ausgeführt wird. Aber wenn Sie es beschaffen, mit

$ source ranger

Beim Beenden wird Ranger gestartet und Sie werden im zuletzt besuchten Ordner abgelegt.

Wenn Sie dieses Verhalten standardmäßig möchten, tun Sie dies einfach

$ alias ranger = 'source ranger'

oder noch besser in Ihre .bashrc-Datei einfügen.

Lesen Sie das Ranger-Skript in Ihrem bin-Ordner, um die Dokumentation und Implementierung für diese Funktion anzuzeigen.


Anscheinend wird diese Technik (die auf die Ausführung abgekürzt werden kann . ranger) im Wiki erwähnt
cjauvin

4

Als Ausgleich zu Gombai Sándors Antwort schlage ich vor, den Alias ​​geringfügig anzupassen:

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

Indem Sie "$ Home / rangerdir" in "$ Home / .rangerdir" ändern, wird die vom Alias ​​erstellte Datei ausgeblendet. macht es nur so, dass es den Home-Ordner nicht nervt. Es macht keinen funktionalen Unterschied, wie es funktioniert.


2

Ich bin auf eine ähnliche Frage gestoßen, die im Vergleich zu Gambai und den anderen vorgeschlagenen Varianten besser beantwortet werden kann . Es ist besser da.

  1. Es kümmert sich um die erstellte Datei, indem es sie in den Ordner tmp legt, damit sie vom System gelöscht werden kann
  2. es ist sauberer Code (obwohl die Antwort des Gambai in eine Funktion umgewandelt werden kann)

Es gibt eine Funktion in einer Shell-Datei, die sich bereits im Git-Repo von Ranger befindet:

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"
}

Sie können diese Funktion in die Shell-RC- ~/.zshrcDatei Ihres Favoriten einfügen und entweder einen Alias ​​erstellen und / oder sie an eine Tastenkombination binden (wieder können beide in die RC-Datei aufgenommen werden):

alias nav=ranger-cd

und / oder

# 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"

Haftungsausschluss: Das bindkeyoben Genannte funktioniert in ZSH und Sie sollten es basierend auf Ihrer bevorzugten Shell ändern


1

Vielen Dank für Gombai für die Inspiration, aber auf Ubuntu 14.04 LTS fand ich, dass die Lösung nicht ganz funktioniert hat. Durch geringfügiges Ändern und Speichern als Alias ​​in meiner .bashrc- rangerdirDatei funktionierte Folgendes einwandfrei (nach dem Erstellen der Datei):

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

Der folgende Beitrag auf askubuntu hat mir geholfen, als ich herauszufinden versuchte, warum andere Lösungen, die ich versuchte, nicht funktionierten: /ubuntu/404141/why-cant-i-pipe-into-cd


1

Darf ich Sie alle allein lassen? Das Durchgehen der anderen Argumente kann nützlich sein. Geben Sie dies in Ihre Shell ein

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

0

Hier ist eine elegantere Möglichkeit, indem Sie einen Funktionswrapper schreiben. Verwenden rangerSie einfach den Befehl , und wenn Sie das Verzeichnis synchronisieren möchten, kehren Sie zur Hauptshell zurück, und beenden Sie Ranger mit Großbuchstaben Q.

(Die folgenden Codes sind Tests mit Bash und 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
}

Auf diese Weise können Sie die Verzeichnisänderung bei Bedarf zurücksynchronisieren . Verwenden Sie, :qum das Programm normal Qzu beenden und das Verzeichnis zu ändern.


(1) Sie haben anscheinend Probleme mit Zitieren. (2) Was meinen Sie mit "auf Abruf"?
Scott,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.