Sulla base delle informazioni che ho trovato qui sono stato in grado di scoprire una soluzione più semplice per l'allineamento a destra, adattando al contempo il contenuto a lunghezza variabile a destra o a sinistra, incluso il supporto per il colore. Aggiunto qui per comodità ...
Nota sui colori: l' utilizzo \033
dell'evasione a favore di alternative, senza \[\]
raggruppamenti, risulta il più compatibile e quindi consigliato.
Il trucco è di scrivere prima il lato destro, quindi utilizzare il ritorno \r
a capo ( ) per tornare all'inizio della riga e continuare a sovrascrivere il contenuto del lato sinistro sopra, come segue:
prompt() {
PS1=$(printf "%*s\r%s\n\$ " "$(tput cols)" 'right' 'left')
}
PROMPT_COMMAND=prompt
Sto usando tput cols
su Mac OS X per recuperare la larghezza del terminale / console dal terminfo
momento che il mio $COLUMNS
var non è popolato env
ma puoi sostituire il " *
" valore sostituibile %*s
, fornendo " ${COLUMNS}
", o qualsiasi altro valore che preferisci, invece.
L'esempio seguente utilizza $RANDOM
per generare contenuti di diversa lunghezza, compresi i colori e mostra come è possibile estrarre funzioni per trasformare l'implementazione in funzioni riutilizzabili.
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
Poiché printf
supponiamo che la lunghezza della stringa sia il numero di caratteri che dobbiamo compensare per la quantità di caratteri richiesti per il rendering dei colori, la troverai sempre a corto di fine schermo a causa dei caratteri ANSI non stampati senza compensazione. I caratteri richiesti per il colore rimangono costanti e scoprirai che anche printf tiene conto del cambio di lunghezza, come restituito $RANDOM
per esempio ', che mantiene il nostro giusto allineamento in tatto.
Questo non è il caso con particolare bash sequenze di escape rapida (es. \u
, \w
, \h
, \t
) Se, come questi saranno registrare soltanto una lunghezza di 2 perché bash tradurrà solamente quando viene visualizzata la richiesta, dopo printf ha reso la stringa. Ciò non influisce sul lato sinistro, ma è meglio evitarli a destra.
Non ha alcuna conseguenza se il contenuto generato rimarrà comunque costante. Come con l' \t
opzione time che renderà sempre la stessa quantità di caratteri (8) per 24 volte. Abbiamo solo bisogno di considerare la compensazione richiesta per tener conto della differenza tra 2 caratteri contati che risulta in 8 casi quando viene stampato, in questi casi.
Tieni presente che potresti dover triplicare \\\
alcune sequenze di escape che altrimenti hanno significato per le stringhe. Come nell'esempio seguente, l'attuale escape della directory di lavoro \w
non ha alcun significato, quindi funziona come previsto, ma il tempo \t
, che significa un carattere di tabulazione, non funziona come previsto senza prima averlo salvato tre volte.
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!