custom Il prompt di Bash personalizzato sta sovrascrivendo se stesso



linux change bash colors (3)

1) Mi piacerebbe sapere perché sta sovrascrivendo il mio prompt

Poiché ogni carattere non stampabile deve essere sfuggito da \[ e \] altrimenti readline non può tenere traccia della posizione del cursore correttamente.

È necessario inserire \[ e \] attorno a qualsiasi sequenza di escape non stampabile nel prompt.
Senza il \[ \] bash penserà che i byte che costituiscono le sequenze di escape per i codici colore occuperanno effettivamente spazio sullo schermo, quindi bash non sarà in grado di sapere dove si trova effettivamente il cursore.

\[ Inizia una sequenza di caratteri non stampabili. (come sequenze di fuga di colore). Ciò consente a bash di calcolare correttamente il word wrapping.

\] Termina una sequenza di caratteri non stampabili. - BashFAQ

... notare gli escape per i caratteri non stampabili, questi garantiscono che readline possa tenere traccia della posizione del cursore correttamente. - ss64.com

2) Come risolvere questo problema quando viene utilizzata la funzione

Se hai davvero bisogno / vuoi impostare i colori all'interno della funzione il cui output è usato in PS hai 2 opzioni:

echo -e non è a conoscenza di bash \[ \] quindi devi sostituirli con i codici di controllo ASCII \001 e \002 per delimitare i caratteri non stampabili da stampabile:

function formattedGitBranch { echo -e "\001\e[0;91m\002 ($_branch)"; }
PS1='$(formattedGitBranch) '

https://src-bin.com

Sto usando il prompt bash personalizzato per mostrare il ramo git.

Tutto è in /etc/bash/bashrc :

function formattedGitBranch {
    _branch="$(git branch 2>/dev/null | sed -e "/^\s/d" -e "s/^\*\s//")"
    # tried these:
    echo -e "\e[0;91m ($_branch)"                       
    echo -e "\e[0;91m ($_branch) \e[m"                  
    echo -e $'\e[0;91m'"($_branch)"
    echo "($_branch)"                                   
    echo "$(tput setaf 2) ($_branch) $(tput setaf 9)"
    printf "\e[0;91m ($_branch)"
}

# color is set before function call
PS1='\[\033[01;34m\] \[\033[0;91m\]$(formattedGitBranch) \$\[\033[00m\] '
# color is set inside function
PS1='\[\033[01;34m\] $(formattedGitBranch) \$\[\033[00m\] '

Il problema è che quando imposto il colore per $_branch nella funzione, il mio prompt verrà sovrascritto al raggiungimento di EOL:

tput provato tutte le varianti possibili tput , printf , $'' notazione.

Ho risolto il problema impostando il colore solo in PS1 :

Ma..

  1. Mi piacerebbe sapere perché sta sovrascrivendo il mio prompt
  2. Come risolvere questo problema quando viene utilizzata la funzione

Sto usando Gentoo Linux. GNU bash, verze 4.2.37(1)-release (i686-pc-linux-gnu)


Answer #1

Devi occuparti del carattere non stampabile all'interno di [\ e /] altrimenti potresti trovare il cursore direttamente sopra il prompt dei comandi come condiviso nella domanda stessa, quindi ho trovato qualcosa e lo ho semplicemente condiviso: -

Per ottenere il cursore dopo l'uscita PS1 sulla stessa riga:

alcuni esempi:

PS1='[\[email protected]\h:\w]\$
PS1='[\[\033[0;32m\]\[email protected]\h:\[\033[36m\]\W\[\033[0m\]]\$ '

Refer Link: sintassi per bash PS1


Answer #2

Le stringhe come \e[0;91m bisogno di \e[0;91m aggiuntive, per evitare che bash calcoli la sua lunghezza.

Racchiudi queste stringhe da formattedGitBranch in \[ & \] come, \[\e[0;91m\]

Lo hai fatto correttamente in altri posti. L'ho appena perso in formattatoGitBranch.





gentoo