
Проблема
Я использую oh-my-zsh и Antigen для управления своим Zsh.
Иногда я случайно ввожу неправильную/неудачную команду в Zsh, и это очень раздражает, когдаплагин zsh-автопредложениявыдает эти команды.
Например, предположим, что я набрал
gut status
вместо git status
.
Теперь, когда я снова пытаюсь ввести правильную команду, как только я ввел g
, плагин автопредложения выдает сообщение gut status
, что это самое близкое совпадение в недавней истории. Но это неудачная команда!
Что яхочу сделать так, чтобы эти неудачные команды не «загрязняли» мою историюпоэтому плагин автопредложения не будет их предлагать.
Что я наделал
Я искал это, и наиболее близким соответствием для удаления записей из истории является настройка HIST_IGNORE_SPACE или методы игнорирования определенных команд или ручного удаления команд после их ввода. Смотритеэтотиэтот. Но как заметил @Adaephon 52, это происходитпоследело сделано.
Что я собираюсь сделать
Сейчас я думаю о том, чтобы написать функцию, которая будет срабатывать каждый раз, когда в Zsh вводится неудачная команда, чтобы удалить последнюю запись из истории. Однако я недостаточно знаком с Zsh, чтобы знать, существует ли такой триггер или как это сделать.
Примечание к принятому решению
Для тех, кто интересуется этой проблемой, принятое решение работает в том смысле, что невыполненные команды не сохраняются в файле истории. fc -l
или history
подтверждает это.
Однако, похоже, что плагин zsh-autosuggestions делает свое дело.местныйкэширование (или генерация предложений с использованием другого механизма), поэтому он все равно будет предлагать невыполненные команды, нотолько если сессия не окончена. Когда пользователь запускает новый экземпляр оболочки, когда плагин, предположительно, должен загрузить кэшированную историю, он больше не предлагает невыполненные команды (конечно, если вы не введете их снова).
Предложенное решение технически верно, поскольку я (ошибочно) сформулировал свой вопрос таким образом, что он требует только ответа, который не позволяет Zsh сохранять невыполненные команды, а принятое решение делает это (хотя и ограниченно; подробности см. по ссылке в решении).
Любой, кто знаком с написанием сценариев оболочки (я не знаком) и достаточно мотивирован, может проверитьскрипт zsh-autosuggestions.
решение1
Барт Шеферпредложил следующий подходна тот же вопрос напользователи zshсписок рассылки:
zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }
Эта функция выполняется до того, как командная строка будет записана в историю. Если она возвращает 1, текущая командная строка не добавляется ни в файл истории, ни в локальный стек истории. Однако проверка того, вызовет ли командакоманда не найденаошибка охватывает только простые случаи. Например, эта строка будет в истории:
echo foo; echooo bar
Но для вашего примера это работает отлично.
gut status
Обратите внимание, что неправильная команда будет отображена UP-ARROW
(чтобы вы могли ее исправить!), но ее нет в стеке истории; проверьте с помощью fc -l
.
Одним из возможных расширений этой базовой функции является учет установки переменных окружения в командной строке, например, как DEBUG=1 ./some_prog
. Здесь функция проверяет, содержит ли слово в командной строке знак равенства, и если да, то проверяет следующее слово на допустимость команды:
zshaddhistory() {
local j=1
while ([[ ${${(z)1}[$j]} == *=* ]]) {
((j++))
}
whence ${${(z)1}[$j]} >| /dev/null || return 1
}
решение2
Встроенная fc
команда поддерживает редактирование истории. Если вы неправильно набрали, например, предыдущую команду, вы можете ввести следующее:
$ fc -e nano -1
Вы можете заменить nano
на команду вашего любимого редактора. Также вы можете задать EDITOR
переменную (параметр) в вашей конфигурации zsh. (См. страницу со ссылкой SO)
Вам нужно сохранить файл (тот, который создан в системной временной папке с помощью fc). После этого вы получите отредактированную строку(и). Enter
запустите его или нажмите , Ctrl+C
чтобы завершить редактирование.
Более подробную информацию смотрите в документации zsh:Zsh: история редактирования
Если вы хотите отредактировать всю историю
$ fc -W; nano "$HISTFILE"; fc -R
...снова замените nano, если хотите
Он просто записывает историю, включая кэш, а затем открывает файл в редакторе.
Обратите внимание, чтозшзнает три типа истории:
- Внутренний: команды, которые вы ввели с момента входа в систему
- Местный: тот, который доступен в активной оболочке - [HISTFILE + Internal]
- "Глобальный": это зависит, но предположим, что это файл, установленный в HISTFILE
Пожалуйста, имейте в виду, что в случае, если ваш файл истории будет передан (SHARE_HISTORY
) и у вас открыто более одной оболочки zsh с соответствующим пользователем, то вам лучше fc -W
сначала запустить команду в этих оболочках. После того, как вы закончили редактирование, запустите fc -R
. В противном случае команды, введенные в этих оболочках, не будут сохранены, а затем распознаны как ручное редактирование HISTFILE
.
решение3
не уверен, как omz это делает, но и в bash, и в обычном zsh префикс в виде пробела исключает его из .history и, следовательно, из автозаполнения/предложения
то есть
<space>ll -ahZ /home/%USER