Большое спасибо за ваши комментарии. Возиться с приведенным выше (лучшим описанием этого, основанным на моем недостатке знаний ), это то, что я считаю поведением:
Последнее замечание, по-видимому, предполагает, что команда STOP не поддерживает перезапуск=всегда.
Вы можете попробовать ripgrep(https://github.com/BurntSushi/ripgrep)На самом деле быстрее и имеет много полезных параметров фильтрации :страница github имеет длинный список функций.
Он есть в репозиториях многих дистрибутивов.
Время от времени можно запускать history >~/.zsh_history.cache
. Затем вы можете просмотреть этот файл, а также вывод history
для тех команд, которые отсутствуют в этом файле.
Я не знаком с zsh
и поэтому не могу предоставить код для объединения содержимого файла с выводом команды.
Во-первых, если вы не делаете ничего более сложного, чем grep, ограничение совпадений с помощью history -m PATTERN
может быть быстрее, чем grep. Даже если впоследствии вы применяете сложные фильтры, попробуйте добавить простой фильтр с помощью -m
, который избавится от большинства нежелательных строк.
Если ограничивающим фактором является время, затраченное на распечатку всей истории с помощью history
, существует хакерский способ распечатать часть истории, выбранную с помощью grep (или другого фильтра ). Используйте fc -p
, чтобы начать новую историю и заставить ее читать выбранную часть истории. Не проверено:
function format_history {
fc -p -a =(cat)
fc -l 1
}
history 1 | grep curl | format_history
Это не очень удобно использовать (вам нужно что-то с обеих сторон конвейера, поэтому вы не можете просто иметь префикс magic_history_filter
). И какую скорость он выиграет, если не форматирует всю историю, он может потерять из-за более хитрой сантехники и необходимости использования временного файла (zsh может читать историю только из доступного для поиска файла, а не из конвейера ).
Вот простая функция, которая позволит вам быстро найти любую строку в вашей истории:
histgrep() {
fc -lm "*${1}*" 1 -1
}
или даже быстрее:
histgrep() {
zmodload -i zsh/parameter
print -raC2 ${(kv)history[(R)*$1*]}
}
Любой из них выводит номер строки истории перед каждой строкой, поэтому вы можете выполнить нужную строку с помощью !<number>
. Например, чтобы вставить номер строки истории 2596 в вашу командную строку, выполните
!2596
, затем нажмите Tab или Введите .
У меня около 3400 строк истории. Выполнение histgrep cd
дает мне более 220 строк, но занимает всего около 0,004 секунды с первой версией функции и вдвое меньше со второй версией.