Se i caratteri sulla riga di comando vengono talvolta visualizzati con un offset, ciò è spesso dovuto al fatto che zsh ha calcolato la larghezza errata per il prompt. I sintomi sono che il display sembra a posto fintanto che aggiungi caratteri o sposti carattere per carattere ma diventa confuso (con alcuni caratteri che appaiono più a destra di quanto dovrebbero) quando usi altri comandi che spostano il cursore ( Home, completamento, ecc. ) o quando il comando si sovrappone a una seconda riga.
Zsh deve conoscere la larghezza del prompt per sapere dove sono posizionati i caratteri del comando. Presuppone che ogni personaggio occupi una posizione se non diversamente indicato.
Una possibilità è che il tuo prompt contenga sequenze di escape che non sono delimitate correttamente. Le sequenze di escape che cambiano il colore o altri aspetti di formattazione del testo, o che cambiano il titolo della finestra o altri effetti, hanno larghezza zero. Devono essere inclusi in un costrutto con parentesi graffe%{…%}
. Più in generale, una sequenza di escape come %42{…%}
dice a zsh di supporre che ciò che è dentro le parentesi graffe sia largo 42 caratteri.
Quindi, verificare le impostazioni del prompt ( PS1
, PROMPT
, o le variabili che fanno riferimento) e fare in modo che tutte le sequenze di escape (ad esempio \e[…m
per modificare gli attributi di testo - nota che può essere presente con alcune variabili come $fg[red]
) sono all'interno %{…%}
. Poiché stai usando oh-my-zsh, controlla sia le tue impostazioni che le definizioni che stai usando da oh-my-zsh.
Lo stesso problema si presenta in bash. È necessario racchiudere sequenze di larghezza zero in un prompt\[…\]
.
Un'altra possibilità è che il tuo prompt contenga caratteri non ASCII e che zsh (o qualsiasi altra applicazione) e il tuo terminale abbiano un'idea diversa di quanto siano ampi. Ciò può accadere se esiste una discrepanza tra la codifica del terminale e la codifica dichiarata nella shell e le due codifiche determinano larghezze diverse per determinate sequenze di byte. In genere è possibile riscontrare questo problema quando si utilizza un terminale non Unicode ma si dichiara una locale Unicode o viceversa.
Le applicazioni si basano su variabili di ambiente per conoscere le impostazioni locali; l'impostazione è rilevante LC_CTYPE
, che viene determinato dalle variabili di ambiente LANGUAGE
, LC_ALL
, LC_CTYPE
e LANG
(il primo di questi che è impostato vale). Il comando locale | grep LC_CTYPE
indica l'impostazione corrente. Di solito il modo migliore per evitare problemi di localizzazione è lasciare che l'emulatore di terminale sia impostato LC_CTYPE
, poiché sa quale codifica si aspetta; ma se non funziona per te, assicurati di impostare LC_CTYPE
.
Gli stessi sintomi possono verificarsi quando il comando precedente visualizzava un output che non terminava con una nuova riga, in modo che il prompt fosse visualizzato al centro della riga ma la shell non se ne rendeva conto. In questo caso ciò accadrebbe solo dopo aver eseguito un comando di questo tipo, non in modo persistente.
Se una riga non viene visualizzata correttamente, il comando redisplay
o clear-screen
(associato a Ctrl+ Lper impostazione predefinita) lo risolverà.