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

582
asmeurer

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

/$ls ... ec/$echo 

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

Кажется, это работает достаточно хорошо, но, похоже, есть странная проблема. По моему .inputrc, у меня

"\ep": history-search-backward 

чтобы позволить мне печатать, M-pчтобы вернуться назад (iTerm 2 отображает опцию для корректного выхода).

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

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

0

1 ответ на вопрос

1
chepner

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

PS1='\rstuff' 

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

PS1='\[\r\]stuff' 

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

Аааа, я не знал, что Баш делал какую-то короткую арифметику. asmeurer 10 лет назад 0