完成時在顯示屏上重複顯示的命令的第一個字元
當我
Tab
用來完成時,前兩個字元被重複。在下面的螢幕截圖中,cd
重複。我試過 rxvt-unicdoe、xterm、終結者。所有這些終端仿真器都有這個問題。
Zsh 版本 5.0.2,配置文件on-my-zsh
如果你的命令行上的字元有時顯示在偏移處,這通常是因為 zsh 為提示計算了錯誤的寬度。症狀是,只要您添加字元或逐個字元移動,顯示看起來就很好,但是當您使用其他移動游標的命令(
Home
、完成等) 或當命令與第二行重疊時。zsh 需要知道提示符的寬度,才能知道命令的字元放在哪裡。它假定每個字元佔據一個位置,除非另有說明。
一種可能性是您的提示包含未正確分隔的**轉義序列。更改文本顏色或其他格式方面,或更改視窗標題或其他效果的轉義序列具有零寬度。它們需要包含在 percent-braces 構造
%{…%}
**中。更一般地說,像這樣的轉義序列%42{…%}
告訴 zsh 假設大括號內的內容是 42 個字元寬。因此,請檢查您的提示設置(
PS1
,PROMPT
或它們引用的變數)並確保所有轉義序列(例如\e[…m
更改文本屬性 - 請注意它可能通過某些變數存在,例如$fg[red]
)都在裡面%{…%}
。由於您使用的是 oh-my-zsh,請檢查您自己的設置和您從 oh-my-zsh 使用的定義。同樣的問題也出現在 bash 中。提示中的零寬度序列需要包含在
\[…\]
.另一種可能性是您的提示包含非 ASCII 字元,並且 zsh(或任何其他應用程序)和您的終端對它們的寬度有不同的想法。如果終端的編碼與 shell 中聲明的編碼不匹配,並且這兩種編碼導致某些字節序列的寬度不同,則可能會發生這種情況。通常,在使用非 Unicode 終端但聲明 Unicode 語言環境時,您可能會遇到此問題,反之亦然。
應用程序依賴環境變數來了解語言環境;相關設置是
LC_CTYPE
,它由環境變數LANGUAGE
、LC_ALL
和LC_CTYPE
(LANG
設置的第一個適用)確定。該命令locale | grep LC_CTYPE
會告訴您目前的設置。通常避免語言環境問題的最好方法是讓終端模擬器設置LC_CTYPE
,因為它知道它期望什麼編碼;但如果這對您不起作用,請確保設置LC_CTYPE
.當上一個命令顯示一些未以換行符結尾的輸出時,可能會出現相同的症狀,因此提示符顯示在行的中間,但 shell 沒有意識到這一點。在這種情況下,這只會在執行這樣的命令後發生,而不是持久地發生。
如果一行沒有正確顯示,命令
redisplay
或clear-screen
(預設綁定到Ctrl
+L
)將修復它。