Я уверен, что я видел кого-то, у кого часть его приглашения выровнена по правому краю в окне терминала, а затем фактический курсор начинался со второй строки. Я знаю, что могу получить вторую строку с "\ n" в PS1, но я не могу понять, как выровнять ее часть вправо. Было ли то, что я увидел, просто добавить пробел между двумя строками?
bash
command-line
ps1
Феликс Андерсен
источник
источник
.inputrc
имеетset show-mode-in-prompt on
. Оба не рассчитывают длину непечатаемых кодов ANSI CSI , и не включают их должным образом\[
и,\]
как упоминает @Mu Mind. Смотрите этот ответ для решения.Основываясь на информации, которую я нашел здесь, я смог найти более простое решение для выравнивания по правому краю с учетом содержимого переменной длины справа или слева, включая поддержку цвета. Добавлено здесь для вашего удобства ...
Примечание по цветам: использование
\033
выхода в пользу альтернатив, без\[\]
группировок, оказывается наиболее совместимым и поэтому рекомендуемым.Хитрость заключается в том, чтобы сначала написать правую часть, а затем с помощью возврата каретки (
\r
) вернуться к началу строки и продолжить перезаписывать содержимое левой части поверх этого следующим образом:Я использую
tput cols
в Mac OS X для получения ширины терминала / консоли,terminfo
поскольку моя$COLUMNS
переменная не заполнена,env
но вы можете заменить заменяемое*
значение " "%*s
, указав "${COLUMNS}
", или любое другое значение, которое вы предпочитаете.В следующем примере
$RANDOM
показано, как генерировать содержимое различной длины, включая цвета, и показано, как можно извлечь функции для рефакторинга реализации в многократно используемые функции.Поскольку
printf
предполагается, что длина строки равна количеству символов, которое необходимо компенсировать количеством символов, требуемым для отображения цветов, вы всегда найдете его ниже конца экрана из-за непечатных символов ANSI без компенсации. Символы, необходимые для цвета, остаются постоянными, и вы обнаружите, что также printf учитывает изменение длины, как, например, возвращается$RANDOM
', что сохраняет правильное выравнивание в такте.Это не тот случай со специальной Баш строки управляющих последовательностями (т.е..
\u
,\w
,\h
,\t
) , Хотя, как это будет только записывать длину 2 , потому что баш будет переводить только их , когда появится подсказка, после Printf вынес строку. Это не влияет на левую сторону, но лучше избегать их справа.Не имеет значения, если сгенерированный контент будет оставаться постоянной длины, хотя. Как и с параметром времени,
\t
который всегда будет отображать одинаковое количество символов (8) в течение 24 раз. Нам нужно только учесть компенсацию, необходимую для учета разницы между подсчитанными 2 символами, которая в этих случаях приводит к 8 символам при печати.Имейте в виду, что вам может потребоваться тройной экранирование
\\\
некоторых escape-последовательностей, которые в противном случае содержат значение для строк. Как и в следующем примере, текущий экранирование рабочего каталога\w
не имеет никакого значения в противном случае, поэтому он работает, как и ожидалось, но время\t
, которое означает символ табуляции, не работает, как ожидалось, без тройного экранирования сначала.NJoy!
источник
Использование
printf
с$COLUMNS
работало очень хорошо, что-то вроде:Это правильно оправдало меня.
источник
Следующее поместит текущую дату и время в RED на RHS терминала.
Преимущества:
shellcheck
чистый..inputrc
имеетset show-mode-in-prompt on
.\[
и\]
так , что редактирование текста , введенный в командной строке не вызывает приглашение на перепечатку странно.Примечание : Вы должны гарантировать , что любые цветовые последовательности в
$PS1
до этого кода exeucted правильно заключены в\[
и\]
и что нет вложенности из них.источник
bash: local: can only be used in a function
, которую тривиально исправить, и после этого он ничего не показывает, потому чтоCOLUMNS
не определен: его нужно заменить на$(tput cols)
. тот же результат, если фрагмент сохраняется в другом файле, а затем поступает в.bashrc
.tput cols
если$COLUMNS
не установлен. И да, этот код должен быть внутри функции. Я используюPROMPT_COMMAND='_prompt_bash_set'
и называю функцию_prompt_bash_set
.Я просто думал, что брошу свой сюда. Это почти то же самое, что и GRML-приглашение zsh (за исключением обновлений zsh, оно немного лучше для новых строк и пробелов - что невозможно скопировать в bash ... ну, очень трудно в данный момент, по крайней мере).
Я потратил на это три дня (проверено только на ноутбуке с аркой), так что вот скриншот, а затем материал, который находится в моем ~ / .bashrc :)
предупреждение - это немного сумасшедший
важно в стороне - каждый
^[
(такой как^[[34m
) действительно является спасательным персонажем(char)27
. Единственный способ, которым я знаю, как вставить это, состоит в том, чтобы ввести ctrl+ ( [v) (то есть нажать одновременно [и, vпока ctrlудерживается нажатой.Я все еще работаю над тем, чтобы сделать цвета настраиваемыми, но я доволен цветами, какими они являются сейчас.
В настоящее время работаем над исправлением сумасшедшего
^[
персонажа и легкой сменой цвета :)источник
Вы можете использовать
printf
для правильного выравнивания:источник
Добавляя ответ Джайлза, я написал что-то, чтобы лучше обрабатывать цвета (при условии, что они должным образом заключены в
\[
и\]
. Это индивидуально для каждого случая и не обрабатывает каждый случай, но это позволяет мне установить PS1L в том же синтаксисе, что и PS1). и использует (неокрашенную) дату в качестве PS1R.Вот это на github: dbarnett / dotfiles / right_prompt.sh . Я использую его в моем .bashrc так:
Примечание: я также добавил новую строку после PS1R, которая не имеет визуального различия, но, похоже, не дает подсказке искажаться, если вы прокручиваете назад некоторые команды в своей истории команд.
Я уверен, что кто-то еще может улучшить это, и, возможно, обобщить некоторые из особых случаев.
источник
Вот решение на основе
PROMPT_COMMAND
иtput
:Волшебство выполняется:
Который разбит на:
В PS1
tput
экранируется с \ [\], поэтому он не учитывается при отображении длины.источник