Вопрос или проблема
Я хочу переназначить комбинации клавиш ctrl + i / ctrl + o в bash для переключения между рабочими директориями, то есть директориями, в которые я зашел (с помощью cd
), и после этого выполнил другие команды, кроме простого cd
или ls
. Я думаю, что самый простой способ – это добавить папку в список, возможно, используя pushd и popd, но я не хочу вызывать эти команды вручную, это должно решаться с помощью какого-то хуки, возможно? Это или что-то подобное возможно в bash? Если да, то как?
(На минуту забудем, что ctrl+i также переназначит мою клавишу tab, я сам этим займусь)
Ответ или решение
Для реализации функционала, аналогичного "jumplist" в Vim, в оболочке Bash, можно воспользоваться дополнительными переменными для хранения путей к директориям. Основное решение будет заключаться в использовании хуков для автоматического добавления директорий в список при использовании команды cd
.
Шаги реализации:
- Создадим массив для хранения директорий.
- Определим функции, которые будут добавлять и выбирать директории из нашего списка.
- Используем хук
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.