Чому ZSH закінчує рядок із виділеним символом відсотків?


46

Я це помічав при нагоді з різними програмами. Я часто думав, що це тому, що вихід було скасовано рано (наприклад, ctrl + c) або щось подібне, і zsh заповнює новий символ рядка. Але зараз цікавість у мене вийшла найкращою, оскільки, здається, це не робиться нахабно.

зш

зш

баш

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

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

Чи відсутність нового символу рядка є причиною того, що я отримую цей символ?

Відповіді:


57

Так, це відбувається тому, що це "часткова лінія". І за замовчуванням zsh переходить до наступного рядка, щоб уникнути його покриття підказкою .

Коли частковий рядок буде збережено, за замовчуванням ви побачите зворотний + жирний символ в кінці часткового рядка: "%" для звичайного користувача або "#" для root. Якщо встановлено, параметр оболонки PROMPT_EOL_MARK можна використовувати для налаштування того, як відображаються кінці часткових рядків.


3
Для того, щоб перевірити, зробіть це: print -n "this is a test"тодіprint "this is a test"
SergioAraujo

5
Тепер я поклав PROMPT_EOL_MARK=''у свій.
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змінної.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.