Использование \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
находится в начале подсказки, это всегда символ нулевой длины, а не символ отрицательной ширины переменной длины, как это можно было бы рассмотреть, если это происходит в середине сома где, так что это должно работать.