Jak wyjść z eksploratora plików Ranger z powrotem do wiersza poleceń, ale zachować bieżący katalog?

28

Korzystam z eksploratora plików terminali Ranger z poziomu terminala Linux.
Powiedzmy, że zaczynam od wiersza poleceń w katalogu domowym i uruchamiam komandosa

user@/home/user $ ranger

ranger otwiera się ..... w ramach programu rangerów eksploruję:

/media/ubuntu/sdf675d7sf5sdfs7/some_directory

Jeśli następnie naciśniesz q, aby wyjść z Rangera, nastąpi powrót do tego samego folderu, z którego uruchomiłem Rangera. to znaczy

user@/home/user $

Czy można wyjść z Rangera i pozostać w katalogu, w którym byłem z Rangerem, tj.

user@/media/ubuntu/sdf675d7sf5sdfs7/some_directory $  
the_velour_fog
źródło

Odpowiedzi:

29

Zgodnie z instrukcją

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

Wystarczy więc utworzyć taki alias:

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

I zaleca się wpisanie tego aliasu w rc ulubionej powłoki.

Gombai Sándor
źródło
2
wow, to całkiem sprytne. Nigdy nie przyszło mi do głowy, że możesz wydać polecenie programowi, zakończyć je za pomocą a, ;a następnie podać więcej poleceń po średniku, które - Zakładam, że są uruchamiane w miejscu, w którym zamykasz ranger, dzięki!
the_velour_fog
1
Rozważ użycie .rangerdirzamiast tego, aby ukryć. Lub usunąć go na końcu rm -d $HOME/rangerdir.
Mateen Ulhaq
To świetnie, ale jeśli dobrze to zrozumiem, oznacza to, że masz takie zachowanie na stałe. Byłoby miło, gdyby istniała możliwość wyjścia z bieżącego katalogu ranger LUB do katalogu, w którym byłeś, kiedy zacząłeś ranger.
neverfox
neverfox Po utworzeniu aliasu od Ciebie zależy, czy wybierzesz katalog, w którym znajdziesz się w tym aliasie. Wyboru można dokonać przed wywołaniem pliku binarnego lub po jego zakończeniu.
Gombai Sándor
Dziękujemy za to niesamowite rozwiązanie! Zdarza się, że używam skorupy ryby, więc aby ustawić swój alias, użyłem fish_configi dodałem skrót dla ranger --choosedir="$HOME/.rangerdir"; cd (cat $HOME/.rangerdir)
rockzombie2
24

S.

Jeśli naciśniesz S, otwiera nową powłokę w bieżącym katalogu.

Jeśli trafisz Ctrl + Dpocisk, wraca do ranger.

To obejście jest często wystarczające.

Ciro Santilli
źródło
7

Znalazłem łatwiejsze rozwiązanie. Po zainstalowaniu ranger umieści skrypt w folderze bin, który, jeśli zostanie wykonany, uruchomi program. Ale jeśli to zrobisz, z

Źródło ranger

po wyjściu uruchomi strażnika i wrzuci cię do ostatnio odwiedzanego folderu.

więc jeśli chcesz to zachowanie domyślnie, po prostu zrób

$ alias ranger = 'source ranger'

lub nawet lepiej umieścić go w pliku .bashrc.

Aby zobaczyć dokumentację i implementację tej funkcji, przeczytaj skrypt rangera w folderze bin.

Ogino Knaus
źródło
Najwyraźniej ta technika (którą można skrócić do samego wykonania . ranger) jest wspomniana na wiki
cjauvin
4

Aby w skrócie odpowiedzieć na odpowiedź Gombai Sándor, sugeruję drobną korektę aliasu:

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

Zmieniając „$ Home / rangerdir” na „$ Home / .rangerdir”, ukrywasz plik utworzony przez alias. po prostu sprawia, że ​​nie jest denerwująco zaśmiecający folder domowy. nie ma żadnej funkcjonalnej różnicy w tym, jak to działa.

dduxx
źródło
2

Natknąłem się na podobne pytanie gdzie indziej z lepszą odpowiedzią w porównaniu do Gambai i jego innych proponowanych wariantów. Od tego czasu jest lepiej.

  1. zajmie się utworzonym plikiem, umieszczając go w folderze tmp, aby mógł zostać usunięty przez system
  2. jest to bardziej przejrzysty kod (chociaż odpowiedź Gambai można przekonwertować na funkcję)

W pliku powłoki jest już funkcja w repozytorium git Rangera:

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

Możesz umieścić tę funkcję w ~/.zshrcpliku rc powłoki ulubionego (na przykład ) i albo utworzyć alias i / lub powiązać go z kombinacją klawiszy (znowu oba mogą przejść do pliku rc):

alias nav=ranger-cd

i / lub

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

Wsparcie na bindkeypowyższe prace w zsh i należy ją zmienić na podstawie preferowanego muszli

Mehrad Mahmoudian
źródło
1

Dziękuję Gombai za inspirację, ale w Ubuntu 14.04 LTS stwierdziłem, że rozwiązanie nie do końca działało. Po nieznacznym zmodyfikowaniu go i zapisaniu jako aliasu w moim rangerdirpliku .bashrc następujące działania działały idealnie (po utworzeniu pliku):

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

Poniższy post na askubuntu pomógł mi, gdy próbowałem dowiedzieć się, dlaczego różne rozwiązania, które próbowałem, nie działały: /ubuntu/404141/why-cant-i-pipe-into-cd

Try431
źródło
1

czy mogę się pojedynkować? przekazywanie innych argumentów może być przydatne, więc umieść to w swoim shellrc

function ranger () {
    /usr/bin/ranger --choosedir=$HOME/.rangerdir $@
    LASTDIR=`cat $HOME/.rangerdir` 
    cd $LASTDIR
    echo -n > $HOME/.rangerdir
}
Michael Kraume
źródło
0

Oto bardziej elegancki sposób na to, pisząc opakowanie funkcji. Wystarczy użyć polecenia ranger, a jeśli chcesz zsynchronizować katalog, przejdź z powrotem do głównej powłoki, porzuć komandosa z kapitałem Q.

(Poniższe kody to test z Bash i 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
}

Umożliwi to zsynchronizowanie zmiany katalogu na żądanie . Użyj, :qaby wyjść normalnie, Qaby wyjść i zmienić katalog.

Simba
źródło
(1) Wygląda na to, że masz problemy z cytowaniem. (2) Co rozumiesz przez „na żądanie”?
Scott