Perché ZSH termina una linea con un simbolo percentuale evidenziato?


46

L'ho notato a volte con una varietà di applicazioni. Ho spesso pensato che fosse perché l'output è stato cancellato in anticipo (ctrl + c, per esempio) o qualcosa di simile, e zsh sta compilando un nuovo carattere di linea. Ma ora la curiosità ha ottenuto il meglio di me, dal momento che non sembra farlo in bash.

zsh

zsh

bash

inserisci qui la descrizione dell'immagine

Il Sequenceprogramma è qualcosa che ho preso da un libro mentre leggevo le certificazioni Java e volevo solo vedere se sarebbe stato compilato ed eseguito. Ho notato che non utilizza il println()metodo dal System.outpacchetto / classe. Invece usa semplicemente vecchio print().

La mancanza di un nuovo carattere di linea è la ragione per cui ottengo questo simbolo?

Risposte:


57

Sì, questo accade perché è una "linea parziale". E per impostazione predefinita zsh passa alla riga successiva per evitare di coprirlo con il prompt .

Quando viene mantenuta una linea parziale, per impostazione predefinita vedrai un carattere inverso + grassetto alla fine della linea parziale: un "%" per un utente normale o un "#" per il root. Se impostato, il parametro della shell PROMPT_EOL_MARK può essere utilizzato per personalizzare la modalità di visualizzazione della fine delle linee parziali.


3
Per fare questo prova: print -n "this is a test"quindiprint "this is a test"
SergioAraujo,

5
Ora ho inserito il PROMPT_EOL_MARK=''mio .zshrc per nascondere la differenza tra il newline finale o meno sull'output del comando.
geekQ

14

Questa è una caratteristica specifica di zsh(e anche adesso fish) per farti vedere chiaramente le linee non terminate nell'output di un comando.

Nelle shell tradizionali, se un comando restituisce alcuni dati dopo l'ultimo carattere di nuova riga o, in altre parole, se lascia il cursore terminale non all'inizio della riga, il prompt successivo della shell finisce aggiunto a quest'ultima riga non terminata come in:

bash-4.4$ printf XXX
XXXbash-4.4$

Ciò rovina il prompt, ed è facile non vederlo, XXXspecialmente se hai un prompt più elaborato del genere. Influisce anche sul posizionamento del cursore, causando problemi di visualizzazione quando si sposta il cursore.

zshaggira questo, mostrando che l'output ha una linea non terminata con un %carattere in grassetto e video inverso, ed emette il prompt successivo all'inizio della riga successiva:

zsh-5.1.1$ printf XXX
XXX%
zsh-5.1.1$

Lo fa emettendo quel video inverso %alla fine di ogni comando (prima di ogni prompt), ma seguito da 79 spazi (assumendo un terminale largo 80 caratteri), un carattere CR (quello che fa tornare il cursore al primo colonna) e la sequenza da cancellare alla fine della riga (e quindi al prompt).

In questo modo, se c'era una linea non terminata, poiché il cursore non si trova nella prima posizione, quegli 80 caratteri faranno spostare il cursore sulla riga successiva (e %rimarrà). In caso contrario, allora quello %e quei 79 spazi saranno su una riga che verrà eliminata in seguito.

Ora, funziona solo se il terminale esegue il wrapping delle linee (ad esempio, dopo non funzionerà correttamente tput rmam). Se hai un terminale lento (come sulla linea seriale 9600 baud), potresti effettivamente vedere quelli che %vengono visualizzati e quindi rimossi dopo ogni comando, quindi zshti consente di disabilitare quella funzione:

unsetopt prompt_cr prompt_sp

In questo modo, zshsi comporta più come conchiglie tradizionali.

Puoi anche cambiare quel segno con la $PROMPT_EOL_MARKvariabile.

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.