¿Cómo salir del explorador de archivos Ranger de vuelta al símbolo del sistema pero mantener el directorio actual?


28

Estoy usando el explorador de archivos de terminal Ranger desde un terminal de Linux.
Digamos que comienzo desde el símbolo del sistema en el directorio de inicio y ejecuto el guardabosques

user@/home/user $ ranger

el guardabosques se abre ..... y dentro del programa de exploradores exploro para:

/media/ubuntu/sdf675d7sf5sdfs7/some_directory

Si luego presiono q para salir de Ranger, vuelvo a la misma carpeta desde la que inicié Ranger. es decir

user@/home/user $

¿Es posible salir del guardabosques y permanecer en el directorio en el que estaba con el guardabosques? I.

user@/media/ubuntu/sdf675d7sf5sdfs7/some_directory $  

Respuestas:


29

De acuerdo con su manual

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

Entonces, todo lo que necesita hacer es crear un alias como este:

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

Y se recomienda escribir este alias en el rc de su shell favorito.


2
wow, eso es bastante inteligente, nunca se me ocurrió que podría emitir un comando a un programa, terminarlo con un ;y luego especificar más comandos después del punto y coma que, supongo que se ejecutan en el momento en que cierra ranger, ¡gracias!
the_velour_fog

1
Considere usar en su .rangerdirlugar para ocultarlo. O bórrelo al final rm -d $HOME/rangerdir,.
Mateen Ulhaq

Esto es genial, pero si lo entiendo correctamente, esto significaría que tienes ese comportamiento de forma permanente. Sería bueno si hubiera una manera de tener la opción de salir al directorio actual del guardabosques O al directorio en el que estaba cuando inició el guardabosques.
neverfox

neverfox Una vez que creas un alias, depende de ti si ofreces la selección del directorio para aterrizar dentro de ese alias. La selección se puede hacer antes de que se llame al binario o después de que haya terminado.
Gombai Sándor

¡Gracias por esta increíble solución! Estoy usando la concha de pescado, así que para establecer mi alias, usé fish_configy agregué una abreviatura para ranger --choosedir="$HOME/.rangerdir"; cd (cat $HOME/.rangerdir)
rockzombie2


7

Encontré una solución más fácil. Cuando instalas Ranger, colocará un script en tu carpeta bin que, si se ejecuta, iniciará el programa. Pero si lo obtienes, con

$ fuente guardabosques

lanzará Ranger y lo colocará en la última carpeta visitada cuando salga.

así que si quieres este comportamiento por defecto, solo hazlo

$ alias ranger = 'guardabosques de origen'

o incluso mejor ponerlo en su archivo .bashrc.

Para ver la documentación y la implementación de esta función, lea el script del guardabosques en su carpeta bin.


Aparentemente, esta técnica (que se puede acortar a solo ejecutar . ranger) se menciona en la wiki
cjauvin

4

Para aprovechar la respuesta de Gombai Sándor, sugiero hacer un pequeño ajuste al alias:

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

Al cambiar "$ Home / rangerdir" a "$ Home / .rangerdir", oculta el archivo creado por el alias. solo lo hace para que no moleste la carpeta de inicio. no hace ninguna diferencia funcional en cómo funciona.


2

Me encontré con una pregunta similar en otro lugar con una mejor respuesta en comparación con Gambai y sus otras variantes propuestas. Es mejor desde entonces.

  1. se encargará del archivo creado colocándolo en la carpeta tmp para que el sistema pueda eliminarlo
  2. es un código más limpio (aunque la respuesta de Gambai se puede convertir en una función)

Ya hay una función en un archivo de shell en el repositorio 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"
}

Puede poner esta función en el ~/.zshrcarchivo rc de shell de su favorito (por ejemplo ) y crear un alias y / o vincularlo a una combinación de teclas (de nuevo, ambos pueden ir en el archivo rc):

alias nav=ranger-cd

y / o

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

Descargo de responsabilidad: lo bindkeyanterior funciona en ZSH y debe cambiarlo en función de su shell preferido


1

Gracias a Gombai por la inspiración, pero en Ubuntu 14.04 LTS encontré que la solución no funcionaba del todo. Modificándolo ligeramente y guardándolo como un alias en mi .bashrc, lo siguiente funcionó perfectamente (después de crear el rangerdirarchivo):

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

La siguiente publicación en askubuntu me ayudó cuando estaba tratando de descubrir por qué las diferentes soluciones que estaba tratando no funcionaban: /ubuntu/404141/why-cant-i-pipe-into-cd


1

¿puedo unirlos? pasar por los otros argumentos puede ser útil, así que pon esto en tu shellrc

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

0

Aquí hay una manera más elegante de hacerlo escribiendo un contenedor de funciones. Simplemente use el comando ranger, y si desea sincronizar el cambio de directorio al shell principal, salga de ranger con capital Q.

(Los siguientes códigos son de prueba con Bash y 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
}

Esto le permitirá sincronizar el cambio de directorio bajo demanda . Use :qpara salir normalmente, Qpara salir y cambiar su directorio.


(1) Parece que tienes algunos problemas con las citas. (2) ¿Qué quiere decir con "bajo demanda"?
Scott
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.