Как выйти из файлового менеджера 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 и его другими предложенными вариантами. Так лучше.
- он позаботится о созданном файле, поместив его в папку tmp, чтобы он мог быть удален системой
- это более чистый код (хотя ответ 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" в каталоге, откроется каталог в текущей оболочке, именно то, что я хотел. Надеюсь, что это помогает другим людям.
- Создавать
~/.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()
- Добавьте следующее сопоставление в rc.conf
map x quit_cd_wd
map X quitall_cd_wd
- Добавьте следующее в 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
ярлыки в рейнджере, чтобы выйти из рейнджера, но сохранить рабочий каталог.