Обратный поиск по истории в bash с последующими клавишами со стрелками вызывает отображение курсора в неправильном месте

10

Я заметил, что много раз, когда я выполняю обратный поиск в истории из командной строки с помощью CTRL+ r, если я хочу отредактировать команду, иногда курсор переходит на неправильную позицию, когда я нажимаю клавишу со стрелкой или вводу CTRL+ aили CTRL+ e, Конкретная позиция, на которую он переходит, кажется смещением, равным размеру моей командной строки, как указано в PS1.

Это вызывает трудности, потому что фактическое расположение курсора отличается от того, что отображается на экране; будущие изменения команды отображаются так, как будто курсор находится там, где она была перемещена, но фактическая команда сохраняет правильное положение без какого-либо перехода.

Кто-нибудь знает, что вызывает это или как это исправить?

РЕДАКТИРОВАТЬ: Если я добавляю новую строку в конце PS1проблемы, кажется, уходит. Однако я бы предпочел ввести команду в той же строке, что и приглашение.

jonderry
источник

Ответы:

6

Это часто вызывается командами в вашей истории, которые длиннее 1 строки. Когда вы выбираете более короткий элемент из истории, он, похоже, не учитывает ширину приглашения при повторном рендеринге командной строки, поэтому все, что после этой длинной команды является ошибочным.

Простое решение, которое я нашел, - нажать клавишу home, вставить «echo» и нажать enter. Затем вспомните последнюю команду и отредактируйте оттуда. (Сначала убрав эхо. :)

cabbey
источник
Спасибо, я попробовал это совсем недавно. В моем случае я был неосторожен и сдул файл, потому что в команде была труба, которая поглотила эхо. Вы правы, похоже, это влияет только на длинные команды в соответствии с моими экспериментами.
Jonderry
Лучшее решение, чем эхо, которое я только что нашел: добавьте «#» в начало строки, а не эхо. Таким образом, bash рассматривает всю строку как комментарий.
Jonderry
1
Еще лучше: проблема, похоже, исчезнет, ​​если текущая строка будет перерисована. Либо Cl, чтобы очистить экран и перерисовать текущую строку, либо создать привязку клавиш для несвязанной функции redraw-current-line.
Джондерри
Я забыл упомянуть решение Cl, так как очень не хочу потерять буфер прокрутки, но да, это временный сбой рендеринга из истории навигации, поэтому принудительное перерисовывание исправит его. перерисовка текущей строки звучит как еще лучшее решение!
Кэбби
13

Возможно, у вас есть непечатаемые escape-последовательности в PS1, которые не заключены в \ [и \].

Убедитесь, что вы вложили их все так:

\[\e[33m\]\w\[\e[31m\] $ \[\e[0m\]
Александр Сомов
источник
1
Прекрасно работает, если вы заключаете только \[\]
непечатные