Como sair do gerenciador de arquivos do Ranger de volta ao prompt de comando, mas manter o diretório atual?

28

Estou usando o explorador de arquivos do terminal Ranger de dentro de um terminal linux.
Digamos que eu inicie no prompt de comando no diretório inicial e inicie o ranger

user@/home/user $ ranger

o ranger abre ..... e dentro do programa do ranger eu exploro para:

/media/ubuntu/sdf675d7sf5sdfs7/some_directory

Se eu pressionar q para sair do ranger, retornarei à mesma pasta em que o ranger foi lançado. ie

user@/home/user $

É possível sair do ranger e permanecer no diretório em que eu estava com o ranger, i.

user@/media/ubuntu/sdf675d7sf5sdfs7/some_directory $  
the_velour_fog
fonte

Respostas:

29

De acordo com o manual

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

Então, tudo que você precisa fazer é criar um alias como este:

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

E escrever esse alias no rc do seu shell favorito é recomendado.

Gombai Sándor
fonte
2
uau, isso é muito inteligente. Nunca me ocorreu que você poderia emitir um comando para um programa, finalizá-lo com ;ae especificar mais comandos após o ponto-e-vírgula que - Estou assumindo que são executados no ponto em que você fecha ranger, obrigado!
the_velour_fog 22/02
1
Considere usar .rangerdirpara torná-lo oculto. Ou exclua no final rm -d $HOME/rangerdir.
Mateen Ulhaq
Isso é ótimo, mas se eu entendi direito, isso significa que você tem esse comportamento permanentemente. Seria bom se houvesse uma maneira de ter a opção de sair para o diretório atual do ranger OU o diretório em que você estava quando iniciou o ranger.
23818 neverfox
neverfox Depois de criar um alias, você decide se oferece a seleção do diretório para aterrá-lo dentro desse alias. A seleção pode ser feita antes que o binário seja chamado ou após sua conclusão.
Gombai Sándor 26/03
Obrigado por esta solução incrível! Acontece que eu estar usando o shell de peixe, de modo a definir o meu apelido, eu usei fish_confige acrescentou uma abreviação para ranger --choosedir="$HOME/.rangerdir"; cd (cat $HOME/.rangerdir)
rockzombie2
24

S

Se você clicar S, ele abre um novo shell no diretório atual.

Então, se você acertar Ctrl + Da casca, ela voltará para ranger.

Essa solução alternativa geralmente é boa o suficiente.

Ciro Santilli adicionou uma nova foto
fonte
7

Encontrei uma solução mais fácil. Quando você instala o ranger, ele coloca um script em sua pasta bin que, se executado, iniciará o programa. Mas se você o buscar, com

$ source ranger

ele iniciará o ranger e o deixará na última pasta visitada quando você sair.

portanto, se você deseja esse comportamento por padrão, basta

$ alias ranger = 'fonte ranger'

ou melhor ainda, coloque-o no seu arquivo .bashrc.

Para ver a documentação e implementação deste recurso, leia o script da guarda florestal na sua pasta bin.

Ogino Knaus
fonte
Aparentemente, esta técnica (que pode ser reduzida para apenas ser executada . ranger) é mencionada no wiki
cjauvin
4

Para acompanhar a resposta de Gombai Sándor, sugiro fazer um pequeno ajuste no alias:

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

Alterando "$ Home / rangerdir" para "$ Home / .rangerdir", você oculta o arquivo criado pelo alias. apenas faz com que não seja desordenadamente a pasta inicial. não faz diferença funcional em como funciona.

dduxx
fonte
2

Eu me deparei com uma pergunta semelhante em outro lugar com melhor resposta em comparação com Gambai e suas outras variantes propostas. É melhor desde então.

  1. ele cuidará do arquivo criado colocando-o na pasta tmp para que possa ser excluído pelo sistema
  2. é um código mais limpo (embora a resposta do Gambai possa ser convertida em uma função)

Já existe uma função em um arquivo shell no repositório git do 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"
}

Você pode colocar essa função no ~/.zshrcarquivo shell rc do seu favorito (por exemplo ) e criar um alias e / ou vinculá-lo a uma combinação de teclas (novamente os dois podem ir no arquivo rc):

alias nav=ranger-cd

e / 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"

Isenção de responsabilidade: o bindkeyacima funciona em ZSH e você deve alterá-lo com base no seu shell preferido

Mehrad Mahmoudian
fonte
1

Obrigado por Gombai pela inspiração, mas no Ubuntu 14.04 LTS eu achei a solução não funcionou muito bem. Modificando-o um pouco e salvando como um alias no meu .bashrc, o seguinte funcionou perfeitamente (após a criação do rangerdirarquivo):

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

A seguinte postagem no askubuntu me ajudou quando eu estava tentando descobrir por que as diferentes soluções que eu estava tentando não estavam funcionando: /ubuntu/404141/why-cant-i-pipe-into-cd

Try431
fonte
1

posso one-up de vocês? passar os outros argumentos pode ser útil, então coloque isso no seu shellrc

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

Aqui está uma maneira mais elegante de escrever um wrapper de função. Basta usar o comando rangere, se você quiser sincronizar o diretório, volte para o shell principal, saia do ranger com capital Q.

(Os códigos abaixo são testados com Bash e 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
}

Isso permitirá que você sincronize novamente a alteração de diretório sob demanda . Use :qpara sair normalmente, Qpara sair e alterar seu diretório.

Simba
fonte
(1) Parece que você tem alguns problemas com a citação. (2) O que você quer dizer com "sob demanda"?
Scott