Я немного устал от своих печатающих головок в 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правильного способа очистить перед ним фекалию?
1 ответ на вопрос
1
chepner
Сигнал к bashтому, что \rэто непечатаемый символ, так что вычисляется правильная длина строки приглашения, то есть вместо
PS1='\rstuff'
использование
PS1='\[\r\]stuff'
Я думаю, что поскольку он \rнаходится в начале приглашения, это всегда символ нулевой длины, а не символ отрицательной ширины переменной длины, как это можно было бы рассмотреть, если бы оно происходило в середине подсказки где, так что это должно Работа.
Аааа, я не знал, что Баш делал какую-то короткую арифметику.
asmeurer 10 лет назад
0