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, XXX
specialmente se hai un prompt più elaborato del genere. Influisce anche sul posizionamento del cursore, causando problemi di visualizzazione quando si sposta il cursore.
zsh
aggira 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 zsh
ti consente di disabilitare quella funzione:
unsetopt prompt_cr prompt_sp
In questo modo, zsh
si comporta più come conchiglie tradizionali.
Puoi anche cambiare quel segno con la $PROMPT_EOL_MARK
variabile.
print -n "this is a test"
quindiprint "this is a test"