Dlaczego ZSH kończy linię podświetlonym symbolem procentu?


46

Zauważyłem to przy różnych aplikacjach. Często myślałem, że dzieje się tak, ponieważ wynik został wcześniej anulowany (na przykład ctrl + c) lub coś podobnego, a zsh wypełnia nowy znak wiersza. Ale teraz ciekawość zwyciężyła we mnie, ponieważ wydaje się, że nie robi tego w bash.

zsh

zsh

grzmotnąć

wprowadź opis zdjęcia tutaj

SequenceProgram jest coś wyciągnąłem z książki podczas czytania na certyfikaty Java i po prostu chciałem zobaczyć, czy to skompilować i uruchomić. Zauważyłem, że nie używa println()metody z System.outpakietu / klasy. Zamiast tego używa zwykłego starego print().

Czy brak nowego znaku linii powoduje, że otrzymuję ten symbol?

Odpowiedzi:


57

Tak, dzieje się tak, ponieważ jest to „linia częściowa”. Domyślnie zsh przechodzi do następnego wiersza, aby uniknąć pokrycia go pytaniem .

Gdy zachowana jest linia częściowa, domyślnie na końcu linii częściowej widoczny jest znak odwrotny + pogrubiony: „%” dla zwykłego użytkownika lub „#” dla użytkownika root. Jeśli jest ustawiony, parametr powłoki PROMPT_EOL_MARK można wykorzystać do dostosowania sposobu wyświetlania końca linii częściowych.


3
Aby przetestować, zrób to: print -n "this is a test"następnieprint "this is a test"
SergioAraujo

5
Teraz PROMPT_EOL_MARK=''wstawiłem do mojego .zshrc, aby ukryć różnicę między końcowym znakiem nowej linii lub brakiem wyniku polecenia.
geekQ

14

Jest to specyficzna cecha zsh(i teraz fishtakże), abyś mógł wyraźnie zobaczyć niezakończone linie w danych wyjściowych polecenia.

W tradycyjnych powłokach, jeśli polecenie wyświetla jakieś dane po ostatnim znaku nowego wiersza lub, innymi słowy, jeśli pozostawia kursor końcowy poza początkiem wiersza, następne zapytanie powłoki jest dopisywane do tego ostatniego niezakończonego wiersza jak w:

bash-4.4$ printf XXX
XXXbash-4.4$

To zniekształca podpowiedź i łatwo ją przeoczyć, XXXszczególnie jeśli masz bardziej fantazyjne podpowiedzi. Wpływa również na położenie kursora, co powoduje usterki wyświetlacza podczas przesuwania kursora.

zshdziała w ten sposób, pokazując, że wyjście ma nieskończoną linię ze %znakiem pogrubionym i odwróconym wideo, i wydaje następny monit na początku następnego wiersza:

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

Robi to, wysyłając odwrócone wideo %na końcu każdego polecenia (przed każdym monitem), ale po nim następuje 79 spacji (przy założeniu, że terminal ma szerokość 80 znaków), znak CR (ten, który powoduje powrót kursora do pierwszego kolumna) oraz sekwencję, którą należy usunąć do końca wiersza (a następnie monit).

W ten sposób, jeśli istniała linia niezakończona, ponieważ kursor nie znajduje się na pierwszej pozycji, te 80 znaków spowoduje przesunięcie kursora do następnej linii (i %pozostanie). Jeśli nie, to tamto %i te 79 spacji będzie w jednym wierszu, który zostanie później usunięty.

Teraz działa to tylko wtedy, gdy terminal zawija linie (na przykład, że nie będzie działał poprawnie po tput rmam). Jeśli masz wolny terminal (jak na linii szeregowej 9600 bodów), możesz faktycznie zobaczyć te %wyświetlane, a następnie usuwane po każdym poleceniu, więc zshmożesz wyłączyć tę funkcję:

unsetopt prompt_cr prompt_sp

W ten sposób zshzachowuje się bardziej jak tradycyjne muszle.

Możesz także zmienić ten znak za pomocą $PROMPT_EOL_MARKzmiennej.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.