1

Как именно я бы взял значение $ PS1 и поставил разделитель первым с текстом на заднем плане? Я получил предложение вывести текст в терминал, а затем отправить len(extended_PS1) неразрушающие пробелы. (желательно, чтобы он также очищался после ввода текста и, возможно, даже отображался, если подсказка очищена)

1 ответ1

3

Вы можете ( неправильно ) использовать 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:)} раскрывается в строку пробелов той же ширины, что и терминал. Это гарантирует, что всегда будет достаточно пробелов.

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