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 $  

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.


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.


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.


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.


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


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


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
}

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.


(1) Wygląda na to, że masz problemy z cytowaniem. (2) Co rozumiesz przez „na żądanie”?
— Scott
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.