Як вийти з провідника файлів 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.