Использование \r в bash PS1

Я немного устал от своих печатающих головок в Bash от того, что испортил PS1. Например, я бы выполнил команду, как lsи, пока он работает, начните вводить следующую команду, например, echoи напечатать для echo появится перед PS1, как

/$ls
...
ec/$echo

(Вот /$ это PS1). Мое решение для этого было добавить \r к передней части PS1, чтобы он сначала очистил линию.

Кажется, это работает достаточно хорошо, но, похоже, есть странная проблема. В моем .inputrc, Я имею

"\ep": history-search-backward

позволить мне напечатать M-p идти назад (iTerm 2 карты Вариант для правильного побега).

Проблема в том, что иногда, когда я набираю некоторые вещи, а затем M-p чтобы получить предыдущую команду, тогда я делаю C-u C-k чтобы очистить строку, первый символ остается и становится частью PS1 (он удаляется из выполненной строки, но отображается на PS1). Он исчезает, когда я выполняю команду, но всякий раз, когда я нажимаю на этот элемент в истории, даже с помощью обычной стрелки вверх, первый персонаж снова застревает там. Кажется, что это происходит только с командами определенной длины. Неважно, если \r на самом деле очищает любой текст, чтобы это произошло.

Я бью странную ошибку в bash и / или iTerm? Добавляет \r перед PS1 правильный способ очистить перед ним?

1 ответ

Решение

Сигнал к bash что \r является непечатаемым символом, поэтому вычисляется правильная длина строки приглашения, то есть вместо

PS1='\rstuff'

использование

PS1='\[\r\]stuff'

Я думаю с \r находится в начале подсказки, это всегда символ нулевой длины, а не символ отрицательной ширины переменной длины, как это можно было бы рассмотреть, если это происходит в середине сома где, так что это должно работать.

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