Primi caratteri del comando ripetuti sul display al completamento


21

I primi due caratteri sono stati ripetuti mentre io uso Tabper completare. Nello screenshot qui sotto, cdviene ripetuto.

inserisci qui la descrizione dell'immagine

Ho provato rxvt-unicdoe, xterm, terminator. Tutti questi emulatori di terminali hanno questo problema.

Zsh versione 5.0.2, file di configurazione su-my-zsh


I caratteri vengono ripetuti nel comando che zsh esegue o vengono semplicemente visualizzati? Il numero di caratteri cambia se il comando è più lungo di due caratteri? Il numero cambia quando cambia la directory corrente?
Gilles 'SO- smetti di essere malvagio' il

@Gilles Il carattere ripetuto non esiste nel comando. Posso eseguire il comando.
jilen,

Risposte:


32

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[…mper 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_CTYPEe LANG(il primo di questi che è impostato vale). Il comando locale | grep LC_CTYPEindica 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 redisplayo clear-screen(associato a Ctrl+ Lper impostazione predefinita) lo risolverà.


Suppongo che probabilmente mi manca il carattere correlato, noto che il primo carattere è strano. ->Penso che dovrebbe essere
jilen,

@jilen Ah, questo potrebbe essere un altro problema che ho dimenticato di menzionare: forse il tuo prompt contiene caratteri non ASCII in una codifica diversa dal tuo terminale, con una o entrambe le codifiche essendo multibyte. Se vuoi aiuto con questo, pubblica l'output di localee di echo $PS1 | od -t x1(e la stessa cosa con qualsiasi altra variabile utilizzata da $PS1).
Gilles 'SO- smetti di essere malvagio' il

2
Ho dimenticato di impostare le impostazioni internazionali (sto usando archlinux, le impostazioni locali non vengono impostate per impostazione predefinita). Dopo aver impostato le impostazioni internazionali, questo problema è stato risolto. Grazie mille, ragazzo !!!!
jilen,

L'ho votato perché, beh, è ​​davvero fantastico. Ma le escape non devono assolutamente essere incluse tra parentesi quadre se altrimenti gestisci il conteggio del cursore da solo. la chiamata di una funzione subshelling ha funzionato per me in passato - o i reindirizzamenti che ancora atterrano su / dev / tty senza coinvolgere stdout potrebbero funzionare. Altri metodi che hanno funzionato - usando \e{7,8}per salvare / ripristinare gli stati del cursore.
Mikeserv,

È stato quello LC_CTYPEche l'ha riparato per me. L'ho impostato su C, quando l'ho disattivato, tutto ha funzionato. Grazie.
jmaloney,

14

Ho avuto lo stesso problema e ho trovato la mia soluzione qui: https://github.com/robbyrussell/oh-my-zsh/issues/5157#issuecomment-226031519 . Inserisci semplicemente quanto segue nel tuo ~/.zshrc.

export LC_CTYPE=en_US.UTF-8


1
Grazie per il tuo suggerimento! Tuttavia, ho dovuto ripristinare tutto quello che localestavo usando, ma ha funzionato per me. Questa risposta fornisce i passaggi necessari per Ubuntu.
massimo

Grazie mille! Mi ha salvato un sacco di aggravamento
Moshe,

1

Ho riscontrato questo problema in iTerm 2 su macOS. Ho finito per risolverlo andando su Preferenze -> Profili -> Testo e spuntando "Usa larghezza Unicode versione 9".


Caspita, in realtà ha funzionato. Grazie!
Paul Calabro,

1

Ho questo problema usando ubuntu lts docker image ( ubuntu:latest). L'ho corretto con le istruzioni fornite nella pagina corrispondente: https://hub.docker.com/_/ubuntu

apt-get update && \
apt-get install -y locales && \
rm -rf /var/lib/apt/lists/* && \
localedef -i en_US -c -f UTF-8 -A /usr/share/locale/locale.alias en_US.UTF-8
echo 'export LANG=en_US.utf8' >> ~/.zshrc
zsh
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.