Как выйти из файлового менеджера Ranger обратно в командную строку, но сохранить текущий каталог?

28

Я использую Ranger Terminal Explorer изнутри терминала Linux.
Скажем, я запускаю из командной строки в домашнем каталоге и запускаю рейнджер

user@/home/user $ ranger

Рейнджер открывается ..... и в рамках программы Рейнджер я исследую:

/media/ubuntu/sdf675d7sf5sdfs7/some_directory

Если я затем нажму q, чтобы выйти из режима проверки, я попаду обратно в ту же папку, из которой я запустил программу проверки. т.е.

user@/home/user $

Можно ли выйти из рейнджера и остаться в каталоге, в котором я был с рейнджером, т.е.

user@/media/ubuntu/sdf675d7sf5sdfs7/some_directory $  
the_velour_fog
источник

Ответы:

29

В соответствии с его руководством

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

Поэтому все, что вам нужно сделать, это создать псевдоним, подобный этому:

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

И рекомендуется записать этот псевдоним в rc вашей любимой оболочки.

Гомбай Шандор
источник
2
вау, это довольно умно, мне никогда не приходило в голову, что вы можете ;ввести команду для программы, завершить ее с помощью символа а, а затем указать больше команд после точки с запятой, которые ... Я предполагаю, что они выполняются в точке, которую вы закрываете ranger, спасибо!
the_velour_fog
1
Попробуйте использовать .rangerdirвместо этого, чтобы сделать его скрытым. Или удалите его в конце rm -d $HOME/rangerdir.
Матеин Улхак
Это здорово, но если я правильно понимаю, это будет означать, что у вас такое поведение постоянно. Было бы неплохо, если бы был способ иметь возможность выхода в текущий каталог рейнджера ИЛИ каталог, в котором вы находились, когда запускали рейнджера.
neverfox
neverfox После того, как вы создадите псевдоним, вы можете выбрать каталог, в который вы попадете. Выбор может быть сделан до вызова двоичного файла или после его завершения.
Гомбай Шандор
Спасибо за это потрясающее решение! Я использую рыбную раковину, поэтому, чтобы установить псевдоним, я использовал fish_configи добавил аббревиатуру для ranger --choosedir="$HOME/.rangerdir"; cd (cat $HOME/.rangerdir)
rockzombie2
24

S

Если вы нажмете S, откроется новая оболочка в текущем каталоге.

Затем, если вы нажмете Ctrl + Dна оболочку, он возвращается к ranger.

Этот обходной путь часто достаточно хорош.

Ciro Santilli 新疆 改造 中心 法轮功 六四 事件
источник
7

Я нашел более простое решение. Когда вы устанавливаете Ranger, он помещает в папку bin скрипт, который, если он будет выполнен, запустит программу. Но если вы получите его, с

$ source ranger

он запустит рейнджер и высадит вас в последней посещенной папке при выходе.

так что если вы хотите это поведение по умолчанию, просто сделайте

$ alias ranger = 'источник рейнджер'

или даже лучше поместите это в свой файл .bashrc.

Чтобы увидеть документацию и реализацию этой функции, прочитайте скрипт рейнджера в папке bin.

Огино Кнаус
источник
Очевидно, эта техника (которую можно сократить до выполнения . ranger) упоминается в вики
cjauvin
4

В дополнение к ответу Гомбая Шандора, я предлагаю немного изменить псевдоним:

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

Изменяя «$ Home / rangerdir» на «$ Home / .rangerdir», вы делаете файл, созданный псевдонимом, скрытым. просто делает так, чтобы не раздражать домашнюю папку. это не имеет никакого функционального значения к тому, как это работает.

dduxx
источник
2

Я наткнулся на похожий вопрос в другом месте с лучшим ответом по сравнению с Gambai и его другими предложенными вариантами. Так лучше.

  1. он позаботится о созданном файле, поместив его в папку tmp, чтобы он мог быть удален системой
  2. это более чистый код (хотя ответ Gambai можно преобразовать в функцию)

В файле оболочки уже есть функция в git-репозитории рейнджера:

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

Вы можете поместить эту функцию в rc- ~/.zshrcфайл оболочки вашего любимого (например ) и создать псевдоним и / или связать его с комбинацией клавиш (опять-таки оба могут войти в rc-файл):

alias nav=ranger-cd

и / или

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

Отказ от ответственности: на bindkeyвышеуказанные работы в ZSH , и вы должны изменить его на основе предпочтительного оболочки

Мехрад Махмудян
источник
1

Спасибо за Gombai за вдохновение, но на Ubuntu 14.04 LTS я обнаружил, что решение не совсем работает. Слегка изменив его и сохранив в качестве псевдонима в моем .bashrc, отлично сработало следующее (после создания rangerdirфайла):

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

Следующая статья на askubuntu помогла мне, когда я пытался выяснить, почему разные решения, которые я пробовал, не работали: /ubuntu/404141/why-cant-i-pipe-into-cd

Try431
источник
1

Могу ли я один на все? передача других аргументов может быть полезна, поэтому поместите это в свой shellrc

function ranger () {
    /usr/bin/ranger --choosedir=$HOME/.rangerdir $@
    LASTDIR=`cat $HOME/.rangerdir` 
    cd $LASTDIR
    echo -n > $HOME/.rangerdir
}
Майкл Краум
источник
0

Вот более элегантный способ написания функциональной оболочки. Просто используйте команду ranger, и если вы хотите синхронизировать каталог, перейдя обратно в основную оболочку, выйдите из программы «Рейнджер» с большой буквы Q.

(Коды ниже - это тесты с Bash и 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
}

Это позволит вам синхронизировать изменение каталога по требованию . Используйте, :qчтобы выйти, Qчтобы выйти и изменить каталог.

Simba
источник
(1) Похоже, у вас есть некоторые проблемы с цитированием. (2) Что вы подразумеваете под «по требованию»?
Скотт