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

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

user@/home/user $ ranger

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

/media/ubuntu/sdf675d7sf5sdfs7/some_directory

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

user@/home/user $

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

user@/media/ubuntu/sdf675d7sf5sdfs7/some_directory $  

12 ответов

Решение

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

--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 вашей любимой оболочки.

S

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

Тогда, если вы нажмете Ctrl + D на оболочке, это восходит к ranger,

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

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

$ source ranger

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

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

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

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

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

Я наткнулся на похожий вопрос в другом месте с лучшим ответом по сравнению с 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, и вы должны изменить его в зависимости от предпочитаемой оболочки

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

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

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

Вот более элегантный способ написания функциональной оболочки. Просто используйте команду 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 выйти и изменить свой каталог.

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

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

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

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

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

Вики-страница рейнджера объясняет несколько различных подходов , в зависимости от ваших предпочтений и оболочки.

Краткое содержание представлено в первом абзаце:

Если вы хотите, чтобы ваша оболочка запомнила каталог, в который вы перешли с помощью Ranger, вы можете запустить. rangerвместо того, чтобы простоrangerили запустите Ranger с помощью этой функции . Подробности см. в #1414. Обратите внимание, что это работает только в Bash-совместимых оболочках, то есть не в Fish.

Вы можете переназначить свой q, следуя спинетам ниже в вашем rc.conf. В следующий раз, когда вы нажмете q, вы сохраните путь в терминале.

      map q shell $SHELL

Сейчас это немного устарело, но я оказался здесь с той же проблемой. Сиро Сантилли сказал выше, что если вы нажмете "S" в рейнджере, он откроется в новой оболочке. В моей системе, нажав "S" в каталоге, откроется каталог в текущей оболочке, именно то, что я хотел. Надеюсь, что это помогает другим людям.

  1. Создавать~/.config/ranger/plugins/quit_cd_wd.pyи добавьте в файл следующее
      import ranger.api
from ranger.api.commands import *
import os

QUIT_CD_WD_FILE = '$HOME/.ranger_quit_cd_wd'

class quit_cd_wd(Command):
    """:chdir to working directory of ranger after quiting on ranger.
    """
    def _exit_no_work(self):
        if self.fm.loader.has_work():
            self.fm.notify('Not quitting: Tasks in progress: Use `quit!` to force quit')
        else:
            self.fm.exit()

    def execute(self):
        if len(self.fm.tabs) >= 2:
            self.fm.tab_close()
        else:
            os.system('echo $PWD > ' + QUIT_CD_WD_FILE)
            self._exit_no_work()

class quitall_cd_wd(Command):
    """:chdir to working directory of ranger after quitalling on ranger.
    """
    def _exit_no_work(self):
        if self.fm.loader.has_work():
            self.fm.notify('Not quitting: Tasks in progress: Use `quitall!` to force quit')
        else:
            self.fm.exit()

    def execute(self):
        os.system('echo $PWD > ' + QUIT_CD_WD_FILE)
        self._exit_no_work()
  1. Добавьте следующее сопоставление в rc.conf
      map     x quit_cd_wd
map     X quitall_cd_wd
  1. Добавьте следующее в rc-файл оболочки (например, .bashrc, .zshrc)
      function ranger_func {
    ranger $*
    local quit_cd_wd_file="$HOME/.ranger_quit_cd_wd"
    local quit_cd_wd="$(cat $quit_cd_wd_file)"
    if [ -n $quit_cd_wd ]; then
        cd $quit_cd_wd
        true > $quit_cd_wd_file
    fi
}

alias ranger='ranger_func'

Теперь вы можете использовать x, Xярлыки в рейнджере, чтобы выйти из рейнджера, но сохранить рабочий каталог.

Другие вопросы по тегам