список переходов в bash как в vim

Вопрос или проблема

Я хочу переназначить комбинации клавиш ctrl + i / ctrl + o в bash для переключения между рабочими директориями, то есть директориями, в которые я зашел (с помощью cd), и после этого выполнил другие команды, кроме простого cd или ls. Я думаю, что самый простой способ – это добавить папку в список, возможно, используя pushd и popd, но я не хочу вызывать эти команды вручную, это должно решаться с помощью какого-то хуки, возможно? Это или что-то подобное возможно в bash? Если да, то как?

(На минуту забудем, что ctrl+i также переназначит мою клавишу tab, я сам этим займусь)

Ответ или решение

Для реализации функционала, аналогичного "jumplist" в Vim, в оболочке Bash, можно воспользоваться дополнительными переменными для хранения путей к директориям. Основное решение будет заключаться в использовании хуков для автоматического добавления директорий в список при использовании команды cd.

Шаги реализации:

  1. Создадим массив для хранения директорий.
  2. Определим функции, которые будут добавлять и выбирать директории из нашего списка.
  3. Используем хук PROMPT_COMMAND для обновления массива при каждом переходе в новую директорию.

Ниже приведен пример реализации:

# Объявляем массив для хранения директорий
declare -a dir_stack

# Функция для обновления стека директорий
update_dir_stack() {
    if [[ $1 != "${dir_stack[-1]}" ]]; then
        dir_stack+=("$1")
    fi
}

# Функция для перехода в предыдущую директорию
jump_back() {
    if [ ${#dir_stack[@]} -gt 1 ]; then
        # Удаляем текущую директорию из стека
        unset 'dir_stack[-1]'
        # Переходим в последнюю добавленную директорию
        cd "${dir_stack[-1]}"
    else
        echo "Нет ни одной директории для перехода."
    fi
}

# Функция для перехода в следующую директорию
jump_forward() {
    if [ ${#dir_stack[@]} -gt 1 ]; then
        local last_dir=${dir_stack[-1]}
        # Переход к предпоследней директории
        if [ "${#dir_stack[@]}" -gt 2 ]; then
            cd "${dir_stack[-2]}"
        fi
        unset 'dir_stack[-2]'
    else
        echo "Нет ни одной директории для перехода."
    fi
}

# Обновляем стек директорий при каждой смене директории
PROMPT_COMMAND='update_dir_stack "$PWD"'

# Привязываем клавиши Ctrl+i и Ctrl+o к функциям
bind -x '"\C-i": jump_back'
bind -x '"\C-o": jump_forward'

# Сброс стека на старте
dir_stack=("$PWD")

Как это работает:

  • Массив dir_stack хранит путь к директориям, в которые вы переходите.
  • Функция update_dir_stack добавляет текущую директорию в стек, если она отличается от последней.
  • Функции jump_back и jump_forward реализуют функционал перехода назад и вперед по стеку директорий.
  • Команда PROMPT_COMMAND настроена на вызов функции обновления стека каждый раз, когда появляется новая подсказка.
  • bind -x используется для привязки комбинаций клавиш Ctrl+i и Ctrl+o к соответствующим функциям.

Замечания:

  • Учтите, что использование Ctrl+i может вызывать конфликты с клавишей Tab. Вам необходимо решить эту проблему, например, переопределив Tab для автоматического дополнения или выбрав другую комбинацию.
  • Этот код необходимо разместить в файле ~/.bashrc и выполнить команду source ~/.bashrc, чтобы изменения вступили в силу.

Таким образом, вы сможете удобно переключаться между директориями, сокращая время на навигацию и работу в Bash, аналогично возможностям Vim.

Оцените материал
Добавить комментарий

Капча загружается...