7

проблема

Я использую oh-my-zsh и Antigen для управления моим Zsh.

Иногда я случайно ввожу неправильную / неудачную команду в Zsh, и это очень раздражает, когда плагин zsh-autosuggestions выдает эти команды.

Например, скажем, я набрал gut status а не git status .

Теперь, когда я пытаюсь ввести правильную команду еще раз, после того, как я набрал g , плагин autosuggestion gut status как это самое близкое совпадение в недавней истории. Но это неудачная команда!

То, что я хочу сделать, это не допустить, чтобы эти ошибочные команды "загрязнили" мою историю, чтобы плагин autosuggestion не предлагал их.

Что я сделал

Я искал это, и самым близким соответствием для исключения записей из истории является установка HIST_IGNORE_SPACE, или методов игнорирования определенных команд, или удаления команд вручную после их ввода. Смотрите это и это. Но, как заметил @Adaephon 52, это происходит после того, как дело сделано.

Что я собираюсь сделать

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


Примечание о принятом решении

Для тех, кто интересуется этой проблемой, принятое решение работает в том смысле, что неудачные команды не сохраняются в файле истории. fc -l или history подтверждает это.

Однако, похоже, что плагин zsh-autosuggestions выполняет свое собственное локальное кэширование (или генерирует предложения, используя другой механизм), поэтому он по-прежнему будет предлагать неудачные команды, но только если сеанс не закончен. Когда пользователь запускает новый экземпляр оболочки, когда предположительно плагин должен загрузить кэшированную историю, он больше не предлагает ошибочные команды (если, конечно, вы не введете их снова).

Предлагаемое решение является технически правильным, так как я (по ошибке) сформулировал свой вопрос таким образом, что для него требуется только ответ, который не дает Zsh сохранить ошибочные команды, а принятое решение делает это (хотя и ограниченным образом; см. Ссылку в решении для подробности).

Любой, кто знаком со сценариями оболочки (я не знаю) и достаточно мотивирован, может проверить скрипт zsh-autosuggestions.

3 ответа3

8

Барт Шефер предложил следующий подход к тому же вопросу в списке рассылки пользователей zsh :

 zshaddhistory() { whence ${${(z)1}[1]} >| /dev/null || return 1 }

Эта функция выполняется перед записью командной строки в историю. Если он возвращает 1, текущая командная строка не добавляется ни в файл истории, ни в локальный стек истории. Однако проверка, если команда вызовет ошибку « команда не найдена», охватывает только простые случаи. Например, эта строка будет в истории:

echo foo; echooo bar

Но это прекрасно работает для вашего примера

gut status

Пожалуйста, имейте в виду, что неправильная команда будет отображаться после UP-ARROW (так что вы можете исправить ее!), Но не в стеке истории; проверьте с помощью fc -l .

0

Встроенная команда fc поддерживает редактирование вашей истории. Если вы набрали, например, предыдущую команду, вы можете ввести следующее:

$ fc -e nano -1

Вы можете заменить nano командой предпочитаемого вами редактора. Также вы можете установить переменную EDITOR (параметр) в вашей конфигурации zsh. (См. Ссылку на страницу SO)

Вам нужно сохранить файл (тот, который создан в системной временной папке, с помощью fc). После этого вы получите отредактированные строки. Enter запустит его или вы можете нажать Ctrl+C чтобы закончить редактирование.

Подробнее см. Документацию zsh: Zsh: история редактирования


Если вы хотите редактировать всю историю

$ fc -W; nano "$HISTFILE"; fc -R

... снова замените нано, если хотите

Он просто записывает историю, включая кеш, а затем открывает файл в редакторе.

Обратите внимание, что zsh знает три типа истории:

  • Внутренний: команды, которые вы вводили с момента входа
  • Локальный: доступный в активной оболочке - [HISTFILE + Internal]
  • "Глобальный": зависит, но, скажем, это набор файлов в HISTFILE

Пожалуйста, имейте в виду, что если ваш файл истории является общим (SHARE_HISTORY), и у вас есть более одной оболочки zsh, открытой для данного пользователя, то вам лучше сначала выполнить команду fc -W в этих оболочках. Когда вы закончите редактирование, запустите fc -R . В противном случае команды, введенные в этих оболочках, не будут сохранены, а затем распознают ваше ручное редактирование HISTFILE .

-2

не знаю, как его запускает omz, но как в bash, так и в обычном префиксе zsh с пробелом он не попадает в .history, а отныне также и в автозаполнение / предложить

т.е.

<space>ll -ahZ  /home/%USER

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .