Вопрос или проблема
Согласно этой странице: https://zsh.sourceforge.io/Doc/Release/Zsh-Line-Editor.html
history-search-backward
: “Искать назад в истории строку, начинающуюся с первого слова в буфере.”
Но когда команда имеет префикс sudo
, это все ломает. Могу ли я сделать так, чтобы zsh игнорировал sudo
для этой команды?
Также хочу применить то же самое для history-search-forward
.
Ответ или решение
Для того чтобы нормально функционировать в командной строке, особенно в интерактивной оболочке, такой как Zsh, эффективное управление историей команд может значительно повысить вашу продуктивность. В контексте задания команды history-search-backward
и history-search-forward
играют важную роль в поиске предыдущих команд, которые начинаются с той же строки, что и введенная вами. Однако, когда команды предваряются префиксом sudo
, это может нарушить ожидаемое поведение команды поиска в истории, поскольку оболочка будет рассматривать sudo
как первую строку буфера. В этом случае возникает задача сделать так, чтобы Zsh игнорировал префикс sudo
при выполнении этих команд.
Теоретические основы
Когда вы вводите команды в Zsh, оболочка сохраняет каждую введенную вами команду в специальный файл истории. Это позволяет вам в дальнейшем легко управлять вашими предыдущими командами без необходимости их повторного ввода. Классические сочетания клавиш, такие как <Ctrl+R>
, помогают быстро находить ранее введенные команды. Однако стандартный механизм поиска будет учитывать каждое введенное слово, включая такие префиксы, как sudo
.
История выполнения команд и префиксы
history-search-backward
и history-search-forward
позволяют эффективно проходить по истории выполнения команд, начиная с команд, которые совпадают с введенным словом. Однако дефолтно их работа такова, что любое первое слово в буфере, включая sudo
, будет считаться основной строкой поиска. Это может быть неудобно, так как общие команды, запускаемые с sudo
, как правило, имеют одну и ту же раскладку, но ранее использованное содержание часто теряется внутри истории под таким префиксом.
Применение решения
Для того чтобы игнорировать sudo
при поиске в истории команд, вам необходимо внести изменения в конфигурацию Zsh через файл настройки (обычно это .zshrc
). Это можно сделать, написав пользовательскую функцию, которая будет переопределять стандартное поведение поиска и игнорировать слово sudo
, если оно стоит в начале.
Пример функции и ключевых шагов
Ниже приведен пример пользовательской функции, которую можно добавить к вашему .zshrc
, чтобы игнорировать слово sudo
в начале команды:
# Функция для поиска без учета "sudo"
zle_history_search_backward() {
local cur
cur=${BUFFER}
if [[ $cur == sudo\ * ]]; then
cur=${cur#sudo }
fi
LBUFFER=$cur
zle history-search-backward
}
zle_history_search_forward() {
local cur
cur=${BUFFER}
if [[ $cur == sudo\ * ]]; then
cur=${cur#sudo }
fi
LBUFFER=$cur
zle history-search-forward
}
# Переприсвоение горячих клавиш
zle -N zle_history_search_backward
zle -N zle_history_search_forward
bindkey '^[[A' zle_history_search_backward # Устанавливаем стрелку вверх для предыдущего
bindkey '^[[B' zle_history_search_forward # Устанавливаем стрелку вниз для следующего
Применение
-
Добавление в .zshrc: Откройте файл
.zshrc
в вашем домашнем каталоге, используя любой текстовый редактор, напримерnano
илиvim
, и добавьте вышеуказанный код. -
Перезапуск оболочки: Чтобы изменения вступили в силу, перезапустите вашу Zsh оболочку с помощью команды
source ~/.zshrc
, или просто закройте и откройте терминал снова. -
Тестирование: После этого, попробуйте ввести команду с
sudo
, например,sudo apt-get update
, и затем используйте стрелки вверх или вниз, чтобы убедиться, что Zsh ищет команды, начиная послеsudo
.
Заключение
С использованием вышеописанного подхода можно добиться более согласованного и интуитивного поиска команд в истории, игнорируя распространенные, но не столь значимые префиксы, такие как sudo
. Это делает работу в терминале более гладкой и удобной, особенно для пользователей, которым часто приходится переключаться между задачами и использовать множество привилегированных команд. Настройка Zsh через .zshrc
позволяет создать персонализированную и эффективную среду, отвечающую вашим конкретным требованиям.