Жил визначив вашу головну проблему, але я хотів спробувати пояснити її по-іншому.
Bash інтерпретує спеціальні запити проскакувань лише перед розширенням будь-яких змінних у підказці. Це означає, що використання \e
змінної, розширеної з підказки, не працює, навіть якщо вона працює безпосередньо в PS1
.
Наприклад, це працює, як очікувалося, і дає червоний текст:
PS1='\e[1;31m this is in red '
Але це не робить, він просто ставить буквальне \e
в підказку:
RED='\e[1;31m'
PS1="$RED not in red "
Якщо ви хочете зберегти кольорові кольори у змінних, ви можете використовувати ANSI-C quoiting ( $'...'
), щоб поставити буквальний символ втечі у змінну.
Щоб зробити це, ви можете змінити своє визначення GREEN
, RED
і NONE
, таким чином , їх значення є фактичною послідовністю виходу.
GREEN=$'\033[1;32m'
RED=$'\033[1;31m'
NONE=$'\033[m'
Якщо ви це зробите, ваш перший PS1
з цитатами повинен працювати:
PS1='${RED}\h $(get_path) ${exitStatus}${NONE} '
Однак тоді у вас виникне друга проблема.
Спробуйте виконати це, потім натисніть Up Arrow, а потім Homeваш курсор не повернеться до початку рядка.
Щоб виправити це, змініть, PS1
щоб включити \[
і \]
навколо послідовностей виділення кольорів, наприклад
PS1='\[${RED}\]\h $(get_path) $?\[${NONE}\] '
Тут не можна get_exit_status
правильно використовувати , оскільки його вихід містить як друкуючу (код виходу), так і недрукувальну символів (кольорові коди), і немає ніякого способу правильно позначити її у запиті. Розміщення \[...\]
позначило б це недруком у повному обсязі, що невірно. Вам доведеться змінити функцію, щоб вона друкувала лише належний кольоровий код, а потім оточувала їх \[...\]
у запиті.
\[
є\1
, і\[
є\2
. Кому відповідаєRL_PROMPT_{START,END}_IGNORE
те, що вимагає, щоб вона ігнорувала байти під час підрахунку довжини запиту на екрані. Див. Списки.gnu.org/archive/html/bug-bash/2015-08/msg00027.html .