История zsh (или, может быть, oh-my-zsh) путается с многострочными командами

Если я использую стрелку вверх в сеансе zsh, как и следовало ожидать, я получу предыдущие команды, от самых новых до самых старых. Теперь (будь то zsh или oh-my-zsh, я не знаю), но если я наберу начало строки и нажму стрелку вверх, я получу строки из моей истории, которые начинаются с того, что я напечатал. Пока все хорошо.

Проблема возникает, если я набираю многострочную команду, например:

for i in foo bar
echo $i

затем, если я позже нажму стрелку вверх, как только он попадет в многострочную команду, он будет отображать только результаты, начиная с for, Так что если моя история похожа на:

touch foo
rm foo
for i in foo bar
echo $i
ls

и я нажму стрелку вверх, я получаю ls затем команда многострочная for команда, и с тех пор я вижу только for команды, которые в моей истории, а не rm или же touch команды.

Есть ли какой-нибудь способ иметь возможность поиска в хронологическом порядке, не застревая, когда история попадает в многострочную команду?

1 ответ

Решение

Описанное поведение связано с использованием up-line-or-search, который будет перемещаться вверх по строке команды и в первой строке команды будет искать в истории строки, начинающиеся с первого слова.

Объяснение вашей проблемы: начиная с пустой строки, любая строка в истории будет совпадать. Пока найдены только однострочные команды, нет различий в поведении up-history или же up-line-or-history, Но при достижении многострочной команды он больше не ищет, а проходит по строкам. Когда верхняя строка достигнута, начинается новый поиск, но теперь он ищет первое слово в этой строке вместо того, чтобы продолжить старый поиск любой строки.

По умолчанию Up отображается на up-line-or-history, который идет назад через записи истории и в случае многострочных команд через каждую строку. up-history также будет проходить историю, но обрабатывать многострочные команды так же, как однострочные. Оба обеспечат ожидаемое поведение.

Я бы посоветовал поискать в вашей конфигурации zsh и Oh-my-ZSH, где up-line-or-search связан и заменить его up-line-or-history или удалите привязку как up-line-or-history в любом случае по умолчанию.

Кроме того, в зависимости от используемого терминала, последовательность клавиш для Up ^[OA или же ^[[A, Чтобы получить согласованное поведение от вашей оболочки, обе команды должны быть настроены на одни и те же команды.

Другие вопросы по тегам