Ranger cd в папку?

Использование sed

for file in *_*
do 
    echo mv $file $( sed 's/\(.*\)_/\1\./' <<< $file)
done

Удалите echo, если вас это устраивает.

27
30.12.2018, 02:13
6 ответов

Я нашел ответ на этот вопрос на страницах руководства :

S Открыть оболочку в текущем каталоге

Да, вероятно, следует прочитал это, прежде чем спрашивать здесь.

47
27.01.2020, 19:39

Вы также можете сделать это другим способом и использовать ranger-cd для автоматического изменения каталога в bash после закрытия ranger с помощью этого сценария .

function ranger-cd {
    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")" != "$(echo -n `pwd`)" ]]; then
        cd -- "$(cat "$tempfile")" || return
    fi
    command rm -f -- "$tempfile" 2>/dev/null
}

Ваша оболочка изменяет каталог только тогда, когда вы выходите из рейнджера с заглавной буквой Q (см. карту Q , если вы хотите это изменить).

Я использую его с

alias r=ranger-cd

Вы можете адаптировать этот сценарий и для других целей, например выйдите из рейнджера и переключитесь на сеанс vim в этом каталоге.

7
27.01.2020, 19:39

Вы также можете использовать :cd /path/to/folder, если вы уже находитесь в Ranger.

12
27.01.2020, 19:39
rangercd () {
    tmp="$(mktemp)"
    ranger --choosedir="$tmp" "$@"
    if [ -f "$tmp" ]; then
        dir="$(cat "$tmp")"
        rm -f "$tmp"
        if [ -d "$dir" ]; then
            if [ "$dir" != "$(pwd)" ]; then
                cd "$dir"
            fi
        fi
    fi
}

bindkey -s '^o' 'rangercd\n'
1
02.03.2020, 21:46

Другой подход заключается в том, чтобы базовая оболочка «следила»ranger(1)за файловой системой, чтобы после перехода в новый каталог и ranger(1)закрывалась (или приостанавливалась; обычно ctrl + z)базовая оболочка уже будет находиться в том же каталоге ranger(1), в котором был завершен выход.

Чтобы сделать это, используйте оболочку "source" ranger(1)либо предварив команду словом .(, т. е. символом точки или точки ), либо словомsourceна какие-то ракушки.

. ranger

Теперь ваша оболочка будет "следовать" ranger(1)по всей файловой системе.

Это работает, потому что команда ranger(, которая является скриптом Python ), имеет встроенныйbash(1)скрипт, который считывается при поиске файла. Обратите внимание, что это работает только наbash(1)совместимых оболочках.

Из блока комментария скрипта:

This embedded bash script can be executed by sourcing this file. It will cd to ranger's last location after you exit it. The first argument specifies the command to run ranger, the default is simply "ranger". (Not this file itself!) The other arguments are passed to ranger.

Если вы предпочитаете использовать ranger(1)в этом режиме, добавьте его как aliasв сценарий инициализации вашей оболочки.

alias ranger='. ranger'
21
02.03.2020, 23:49

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

Идея в том,когда пользователь нажимаетS(типичную привязку для «оболочки» ), сопоставьте ее с командой рейнджера, которая записывает текущий каталог во временный файл.

Затем оберните рейнджер в (, в моем случае zsh, но он должен работать и с bash, а также с )функцией оболочки, которая проверяет, существует ли этот временный файл. Если это так, он cdпереходит в этот каталог, а затем удаляет этот файл.

Поскольку функции оболочки выполняются в текущей оболочке, они действительно изменяют ваш текущий каталог.

Хотя это немного сложнее, чем другие ответы здесь, он не оставляет зависшего экземпляра rangerи работает хорошо.

Итак, в rc.confдобавляем строку:

map S quit_and_cd

Вcommands.py(файле, где вы можете создавать пользовательские команды рейнджера ), создайте эту команду:

import os
from ranger.api.commands import Command

class quit_and_cd(Command):
    def execute(self):
        with open("/tmp/cd_ranger", "w") as f:
            f.write(os.path.abspath(self.fm.thisdir.path))
        # same as quitall_bang (:quitall!)
        self.fm.exit()

Затем при запуске оболочки(.zshrcили.bashrc)создайте функцию с именем ranger:

ranger () {
        local LOGFILE='/tmp/cd_ranger'
        # `command ranger` to launch ranger itself,
        # instead of causing an infinite loop with
        # this function calling itself
        command ranger "$@" || exit $?
        if [[ -f "${LOGFILE}" ]]
        then
                cd "$(cat "${LOGFILE}")"
                rm -f "${LOGFILE}"
        fi
}

Я синхронизировал их с моими точками, см. здесь и здесь .

0
13.12.2020, 00:45

Теги

Похожие вопросы