Як вийти з провідника файлів Ranger назад до командного рядка, але зберегти поточний каталог?


28

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

user@/home/user $ ranger

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

/media/ubuntu/sdf675d7sf5sdfs7/some_directory

Якщо я натиснув q, щоб вийти з рейнджера, я повернувся до тієї ж папки, з якої запустив рейнджер. тобто

user@/home/user $

Чи можна вийти з рейнджера і залишитися в каталозі, в якому я був із рейнджером, я.

user@/media/ubuntu/sdf675d7sf5sdfs7/some_directory $  

Відповіді:


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

І рекомендується вводити цей псевдонім у реквізит вашої прихильної оболонки.


2
Уау, це досить розумно, мені ніколи не прийшло в голову, що ви можете надати команду програмі, припинити її з a, ;а потім вказати більше команд після напівколонки, яка - я припускаю, що виконується в точці, яку ви закриваєте ranger, спасибі!
the_velour_fog

1
Поміркуйте .rangerdirзамість цього, щоб зробити його прихованим. Або видалити його в кінці rm -d $HOME/rangerdir.
Матін Ульхак

Це чудово, але якщо я правильно це розумію, це означатиме, що ти маєш таку поведінку постійно. Якщо було б добре, якби був спосіб мати можливість вийти в поточний каталог рейнджера АБО до каталогу, в якому ви знаходилися, коли ви запускали рейнджер.
neverfox

neverfox Як тільки ви створите псевдонім, ви вирішите запропонувати вибір каталогу для розміщення всередині цього псевдоніма. Вибір може бути здійснений до виклику двійкового файлу або після його закінчення.
Гомбай Сандор

Дякую за це приголомшливе рішення! Я fish_configranger --choosedir="$HOME/.rangerdir"; cd (cat $HOME/.rangerdir)
випадково

24

S

Якщо ви потрапили S, він відкриє нову оболонку в поточному каталозі.

Тоді якщо ви потрапите Ctrl + Dна снаряд, він повернеться до ranger.

Цей спосіб вирішення часто досить хороший.


7

Я знайшов простіше рішення. Коли ви встановите рейнджер, він помістить скрипт у вашу папку біна, який, якщо він буде виконаний, запустить програму. Але якщо ви його джерело, с

$ джерело рейнджера

він запустить рейнджер і перенесе вас в останню відвідувану папку при виході.

тому, якщо ви хочете, щоб ця поведінка була за замовчуванням, просто зробіть

$ alias ranger = 'джерело рейнджера'

а ще краще помістіть його у свій .bashrc файл.

Щоб переглянути документацію та реалізацію цієї функції, прочитайте сценарій рейнджера у папці бін.


Мабуть, ця методика (яку можна скоротити лише до виконання . ranger) згадується у вікі
cjauvin

4

Щоб підказати відповідь Гомбая Сандора, пропоную внести незначні зміни в псевдонім:

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

Змінюючи "$ Home / rangerdir" на "$ Home / .rangerdir", ви створюєте файл, створений псевдонімом, прихованим. просто робить це так, що це не дратує захаращувати домашню папку. це не має функціональної різниці в тому, як це працює.


2

Я натрапив на подібне питання в іншому місці з кращою відповіддю порівняно з Гамбай та іншими запропонованими ним варіантами. Так краще.

  1. він подбає про створений файл, помістивши його в папку tmp, щоб його можна було видалити системою
  2. це більш чистий код (хоча відповідь Гамбаї можна перетворити на функцію)

У файлі оболонки функція вже знаходиться в рейнджері git repo:

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

Ви можете помістити цю функцію у ваш улюблений ~/.zshrcфайл оболонки rc (наприклад ) та створити псевдонім та / або прив'язати його до комбінації клавіш (знову обоє можуть увійти у файл 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


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щоб вийти та змінити каталог.


(1) Схоже, у вас є деякі проблеми з цитуванням. (2) Що ви маєте на увазі під «запитом»?
Скотт
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.