Почему ZSH заканчивает строку выделенным символом процента?

46

Я заметил это в разных случаях. Я часто думал, что это потому, что вывод был отменен рано (например, Ctrl + C) или что-то подобное, и zsh заполняет символ новой строки. Но теперь любопытство взяло верх над мной, так как в bash оно этого не делает.

ЗШ

ЗШ

удар

введите описание изображения здесь

SequenceПрограмма что - то я вытащил из книги во время чтения на Java сертификации и просто хотел , чтобы увидеть , если он будет скомпилировать и запустить. Я заметил, что он не использует println()метод из System.outпакета / класса. Вместо этого он использует старый добрый print().

Является ли отсутствие символа новой строки причиной получения этого символа?

jktravis
источник

Ответы:

57

Да, это происходит потому, что это «частичная линия». И по умолчанию zsh переходит на следующую строку, чтобы не накрывать ее подсказкой .

Когда частичная строка сохранена, по умолчанию вы увидите знак + + жирный в конце частичной строки: «%» для обычного пользователя или «#» для root. Если установлено, параметр оболочки PROMPT_EOL_MARK можно использовать для настройки отображения конца частичных строк.

Leiaz
источник
3
Для проверки сделайте это: print -n "this is a test"тогдаprint "this is a test"
SergioAraujo
5
Теперь я положил PROMPT_EOL_MARK=''в свой .zshrc, чтобы скрыть разницу между завершающим символом новой строки или нет при выводе команды.
geekQ
14

Это особенность zsh(и теперь fishтоже), позволяющая вам четко видеть неопределенные строки в выводе команды.

В традиционных оболочках, если команда выводит некоторые данные после последнего символа новой строки, или, другими словами, если она оставляет курсор терминала не в начале строки, следующее приглашение оболочки завершается добавлением к этой последней неопределенной строке как в:

bash-4.4$ printf XXX
XXXbash-4.4$

Это искажает подсказку, и это легко пропустить, XXXособенно если у вас есть такая необычная подсказка. Это также влияет на позиционирование курсора, что вызывает сбои дисплея при перемещении курсора.

zshобходит это, показывая, что вывод имеет неопределенную строку с %символом в жирном и обратном видео, и выдает следующее приглашение в начале следующей строки:

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

Это достигается путем вывода этого обратного видео %в конце каждой команды (перед каждым приглашением), за которым следуют 79 пробелов (при условии, что терминал шириной 80 символов), символ CR (тот, который заставляет курсор возвращаться к первому столбец) и последовательность, которую необходимо удалить до конца строки (а затем подсказка).

Таким образом, если была неопределенная строка, так как курсор находится не на первой позиции, эти 80 символов заставят курсор переместиться на следующую строку (и это %останется). Если нет, то эти %и те 79 пробелов будут в одной строке, которая будет впоследствии удалена.

Теперь это работает, только если терминал выполняет перенос строк (например, после этого он не будет работать должным образом tput rmam). Если у вас медленный терминал (как, например, на последовательной линии 9600 бод), вы можете увидеть те, %которые отображаются, а затем удаляются после каждой команды, поэтому zshвы можете отключить эту функцию:

unsetopt prompt_cr prompt_sp

Таким образом, zshведет себя больше как традиционные оболочки.

Вы также можете изменить эту отметку с помощью $PROMPT_EOL_MARKпеременной.

Стефан Шазелас
источник