Bash

為什麼 ZSH 以突出顯示的百分比符號結束一行?

  • August 11, 2016

我偶爾會在各種應用程序中註意到這一點。我經常認為這是因為輸出被提前取消(例如 ctrl+c)或類似的東西,並且 zsh 正在填充一個換行符。但是現在我的好奇心已經佔了上風,因為它似乎並沒有在 bash 中做到這一點。

zsh

zsh

重擊

在此處輸入圖像描述

Sequence程序是我在閱讀 Java 認證時從書中提取的,只是想看看它是否可以編譯和執行。我確實注意到它不使用包/類中的println()方法。System.out相反,它使用普通的 old print()

我得到這個符號的原因是缺少換行符嗎?

是的,這是因為它是“偏線”。預設情況下,zsh 會轉到下一行以避免用 prompt 覆蓋它

保留部分行時,預設情況下,您將在部分行的末尾看到一個反加粗字元:普通使用者為“%”,root 使用者為“#”。如果設置,shell 參數 PROMPT_EOL_MARK 可用於自定義部分行結尾的顯示方式。

zsh這是(現在也是)的一個特定功能,fish可以讓您清楚地看到命令輸出中未終止的行。

在傳統的 shell 中,如果命令在最後一個換行符之後輸出一些數據,或者換句話說,如果它使終端游標不在行的開頭,那麼 shell 的下一個提示最終會附加到最後一個未終止的行如:

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變數更改該標記。

引用自:https://unix.stackexchange.com/questions/167582