Я немного устал от своих печатающих головок в 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 ответ1

1

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

PS1='\rstuff'

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

PS1='\[\r\]stuff'

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .