История 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
, Чтобы получить согласованное поведение от вашей оболочки, обе команды должны быть настроены на одни и те же команды.