Виходячи з інформації, яку я знайшов тут, я зміг знайти більш просте рішення для вирівнювання по праву під час розміщення вмісту змінної довжини праворуч або ліворуч, включаючи підтримку кольору. Додано тут для вашої зручності ...
Примітка щодо кольорів: використання \033
втечі на користь альтернатив, без \[\]
групувань, виявляється найбільш сумісним і рекомендованим для цього.
Трюк полягає в тому, щоб спочатку написати праву частину, а потім скористатися return carriage ( \r
), щоб повернутися до початку рядка і продовжувати перезапис вмісту лівої сторони поверх цього, як слід:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
Я використовую tput cols
на Mac OS X для отримання ширини терміналу / консолі, terminfo
оскільки мій $COLUMNS
var не заповнений, env
але ви можете замінити замінене значення " *
" %*s
, надаючи " ${COLUMNS}
" або будь-яке інше значення, яке ви віддаєте перевагу.
Наступний приклад використовує $RANDOM
для генерування вмісту різної довжини, включає кольори та показує, як ви можете витягувати функції для рефакторації реалізації до функцій багаторазового використання.
function prompt_right() {
echo -e "\033[0;36m$(echo ${RANDOM})\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m${RANDOM}\033[0m"
}
function prompt() {
compensate=11
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
Оскільки printf
передбачається, що довжина рядка дорівнює # символів, нам потрібно компенсувати кількість символів, необхідних для візуалізації кольорів, ви знайдете його завжди недоступним до кінця екрана через недруковані символи ANSI без компенсації. Символи, необхідні для кольору, залишаються постійними, і ви побачите, що також printf враховує зміну довжини, повернену, $RANDOM
наприклад, ', що зберігає наше правильне вирівнювання в такті.
Це не той випадок зі спеціальною Баш рядки керуючих послідовностями (тобто .. \u
, \w
, \h
, \t
) , Хоча, як це буде тільки записувати довжину 2 , тому що баш буде переводити тільки їх , коли з'явиться підказка, після Printf виніс рядок. Це не стосується лівої сторони, але краще уникати їх праворуч.
Немає наслідків, якщо створений вміст залишатиметься незмінним. Як і з \t
варіантом часу, який завжди відображатиме однакову кількість символів (8) протягом 24 разів. Нам потрібно лише врахувати компенсацію, необхідну для врахування різниці між двома символами, що підраховуються, що призводить до 8 символів при друкуванні в цих випадках.
Майте на увазі, що вам може знадобитися втричі вийти з \\\
деяких послідовностей евакуації, які інакше мають значення для рядків. Як і в наступному прикладі, поточне втечу робочого каталогу \w
не має сенсу, інакше воно працює як очікувалося, але час \t
, що означає символ вкладки, не працює так, як очікувалося, без потрійного уникнення першого.
function prompt_right() {
echo -e "\033[0;36m\\\t\033[0m"
}
function prompt_left() {
echo -e "\033[0;35m\w\033[0m"
}
function prompt() {
compensate=5
PS1=$(printf "%*s\r%s\n\$ " "$(($(tput cols)+${compensate}))" "$(prompt_right)" "$(prompt_left)")
}
PROMPT_COMMAND=prompt
nJoy!