Comment quitter l'explorateur de fichiers Ranger pour revenir à l'invite de commande mais conserver le répertoire actuel?


28

J'utilise l' explorateur de fichiers du terminal Ranger à partir d'un terminal Linux.
Dis que je démarre à partir de l'invite de commande dans le répertoire personnel et lance ranger

user@/home/user $ ranger

ranger ouvre ..... et dans le programme de ranger j'explore pour:

/media/ubuntu/sdf675d7sf5sdfs7/some_directory

Si je frappe ensuite q pour quitter Ranger, je suis renvoyé dans le même dossier que celui d'où j'ai lancé Ranger. c'est à dire

user@/home/user $

Est-il possible de quitter Ranger et de rester dans le répertoire dans lequel j'étais avec Ranger, i.

user@/media/ubuntu/sdf675d7sf5sdfs7/some_directory $  

Réponses:


29

Selon son manuel

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

Il vous suffit donc de créer un alias comme celui-ci:

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

Et il est recommandé d'écrire cet alias dans le rc de votre shell préféré.


2
wow thats assez intelligent, il ne m'est jamais venu à l'esprit que vous pouviez émettre une commande à un programme, le terminer avec un ;et ensuite spécifier plus de commandes après le point-virgule qui - je suppose que sont exécutées au moment où vous fermez ranger, merci!
the_velour_fog

1
Envisagez d'utiliser à la .rangerdirplace pour le masquer. Ou supprimez-le à la fin rm -d $HOME/rangerdir,.
Mateen Ulhaq

C'est génial mais si je le comprends bien, cela signifierait que vous avez ce comportement en permanence. Ce serait bien s'il y avait un moyen d'avoir la possibilité de quitter dans le répertoire courant du ranger OU le répertoire dans lequel vous vous trouviez lorsque vous avez commencé le ranger.
neverfox

Neverfox Une fois que vous avez créé un alias, c'est à vous de décider si vous proposez la sélection du répertoire à atterrir à l'intérieur de cet alias. La sélection peut être effectuée avant l'appel du binaire ou après sa fin.
Gombai Sándor

Merci pour cette solution géniale! Il se trouve que j'utilise la coquille de poisson, donc pour définir mon alias, j'ai utilisé fish_configet ajouté une abréviation pour ranger --choosedir="$HOME/.rangerdir"; cd (cat $HOME/.rangerdir)
rockzombie2


7

J'ai trouvé une solution plus simple. Lorsque vous installez ranger, il mettra un script dans votre dossier bin qui, s'il est exécuté, démarrera le programme. Mais si vous le sourcez, avec

$ source ranger

il lancera ranger et vous déposera dans le dernier dossier visité lorsque vous quitterez.

donc si vous voulez ce comportement par défaut, faites

$ alias ranger = 'source ranger'

ou encore mieux le mettre dans votre fichier .bashrc.

Pour voir la documentation et l'implémentation de cette fonctionnalité, lisez le script ranger dans votre dossier bin.


Apparemment, cette technique (qui peut être raccourcie pour simplement être . ranger
exécutée

4

Pour reprendre la réponse de Gombai Sándor, je suggère de faire un ajustement mineur à l'alias:

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

En remplaçant «$ Home / rangerdir» par «$ Home / .rangerdir», vous masquez le fichier créé par l'alias. fait en sorte qu'il n'encombre pas le dossier de base de manière ennuyeuse. cela ne fait aucune différence fonctionnelle dans son fonctionnement.


2

Je suis tombé sur une question similaire ailleurs avec une meilleure réponse par rapport à Gambai et ses autres variantes proposées. C'est mieux depuis.

  1. il prendra soin du fichier créé en le plaçant dans le dossier tmp afin qu'il puisse être supprimé par le système
  2. c'est un code plus propre (bien que la réponse de Gambai puisse être convertie en fonction)

Il y a une fonction dans un fichier shell déjà dans le dépôt git de ranger:

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

Vous pouvez mettre cette fonction dans le ~/.zshrcfichier shell rc (par exemple ) de votre favori et créer un alias et / ou le lier à une combinaison de touches (encore une fois, les deux peuvent aller dans le fichier rc):

alias nav=ranger-cd

et / ou

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

Avis de non-responsabilité: ce qui bindkeyprécède fonctionne dans ZSH et vous devez le modifier en fonction de votre shell préféré


1

Merci pour Gombai pour l'inspiration, mais sur Ubuntu 14.04 LTS, j'ai trouvé que la solution ne fonctionnait pas tout à fait. En le modifiant légèrement et en l'enregistrant en tant qu'alias dans mon .bashrc, les éléments suivants ont parfaitement fonctionné (après la création du rangerdirfichier):

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

Le post suivant sur askubuntu m'a aidé lorsque j'essayais de comprendre pourquoi les différentes solutions que j'essayais ne fonctionnaient pas: /ubuntu/404141/why-cant-i-pipe-into-cd


1

puis-je un-up vous tous? passer par les autres arguments peut être utile, alors mettez cela dans votre shellrc

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

0

Voici une manière plus élégante d'y écrire en écrivant un wrapper de fonction. Utilisez simplement la commande ranger, et si vous voulez synchroniser le changement de répertoire vers le shell principal, quittez ranger avec des majuscules Q.

(Les codes ci-dessous sont testés avec Bash et 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
}

Cela vous permettra de synchroniser le changement de répertoire sur demande . Utilisez :qpour quitter normalement, Qpour quitter et modifier votre répertoire.


(1) Il semble que vous ayez des problèmes avec les devis. (2) Qu'entendez-vous par «à la demande»?
Scott
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.