Как именно я бы взял значение $ PS1 и поставил разделитель первым с текстом на заднем плане? Я получил предложение вывести текст в терминал, а затем отправить len(extended_PS1) неразрушающие пробелы. (желательно, чтобы он также очищался после ввода текста и, возможно, даже отображался, если подсказка очищена)
1 ответ
Вы можете ( неправильно ) использовать RPROMPT
вместо PROMPT
(он же PS1
) для достижения этого или, по крайней мере, что-то подобное
RPROMPT
отображается с выравниванием вправо на той же строке, что и подсказка. Если введенная вами команда достаточно длинна, чтобы ее достичь, RPROMPT
будет автоматически скрыт (а также появится снова, если вы удалите достаточно).
Таким образом, вы можете настроить PROMPT
чтобы он содержал только символ подсказки, а все остальное поместили в RPROMPT
. Затем вы RPROMPT
пробелами до тех пор, пока он не заполнит остальную часть строки, так что он почти коснется PROMPT
. Например
setopt PROMPT_SUBST
PROMPT='%# '
RPROMPT='%$((COLUMNS-4))>> %n@%m %~${(r:$COLUMNS:)}'
Это должно показать что-то вроде
% ▒ user@machine ~
где ▒
- позиция курсора. Как только вы начнете печатать все, после этого оно будет скрыто. Например
% echo foo▒
Объяснение:
setopt PROMPT_SUBST
включает подстановку параметров в подсказке каждый раз, когда подсказка отображается.RPROMPT
должен быть определен в одинарных кавычках, чтобы параметры в нем не раскрывались сразу после определения, а только после отображения приглашения (с включеннымPROMPT_SUBST
). Это гарантирует, что заполнение работает правильно, даже когда размер окна терминала изменен.%#
- символ приглашения:#
для root%
для всех остальных.$COLUMNS
- текущая ширина терминала.%n>>
усекает все справа от него доn
символов, вырезая с правой стороны.$((COLUMNS-4))
вычисляет оставшуюся ширину после левой подсказки (PROMPT
). В дополнение к двум символам вPROMPT
вам нужно вычесть один для курсора, а другой - потому чтоRPROMPT
не охватывает самый последний столбец в строке. (Если вы хотите использоватьPROMPT
переменной длины, вам придется динамически вычислять его длину.)%n@%m %~
является лишь примером и показывает имя пользователя (%n
), имя компьютера (%m
) и текущий каталог (%~
).${(r:$COLUMNS:)}
раскрывается в строку пробелов той же ширины, что и терминал. Это гарантирует, что всегда будет достаточно пробелов.