如何在 zsh 提示字元中新增換行符而不導致終端重畫問題?

如何在 zsh 提示字元中新增換行符而不導致終端重畫問題?

我正在嘗試修復 zsh 提示符的一個小(但煩人)問題。我看到的問題是,當我在 GUI OS 環境中使用終端機(例如 OS X 10.7.2 上的 Terminal.app 或 iTerm 2)並調整終端視窗大小時,終端會重新繪製並顯示額外提示。

我已在包含以下內容的乾淨 .zshrc 上重現了這個問題:

export PROMPT=">
"

需要明確的是,這是一個兩行文件。字串中有一個文字換行符,我已經讀過幾個(誠然老)地方就是要走的路。這一直有效,直到我調整終端機視窗的大小,此時我最終會得到重複的提示字串。例如,如果我打開一個新窗口,我會看到(*用作遊標的佔位符):

Last login: Wed Jan 25 19:05:06 on ttys000
>
*

然後當我調整視窗大小,使其變短時,我最終得到:

Last login: Wed Jan 25 19:05:06 on ttys000
>
>
>
>
*

額外提示列印輸出的數量似乎與我改變視窗大小的程度大致成正比——通常是垂直的。如果我從提示字串中刪除換行符,問題就會消失。

我嘗試過各種方法,例如$(print ">\n")或嘗試將換行符號包含在 中%{%}。我假設這與換行符混淆了提示字串實際長度或其他內容所繪製的內容有關。這個問題可以解決嗎還是我只能忍受它?

答案1

這個問題是由於 ZSH 如何在調整大小事件上重新列印提示而導致的,並且之前也讓我很煩惱。解決方案是使用 precmd 製作$PROMPT單行並列印提示的第一行。

所以在你的例子中,這只是:

precmd() { print ">" }
export PROMPT=""

或在 print 語句中使用提示擴充功能的更複雜的範例,請使用下列參數-rP

precmd() { print -rP "%~" }
export PROMPT="%# "

如果您註冊了多個 precmd,則需要使用add-zsh-hook precmd(請參閱 參考資料man zshcontrib)。

答案2

像這樣的事情怎麼樣:

NEWLINE=$'\n'
PROMPT="Line1${NEWLINE}LINE2"

相關內容