Zsh

完成時在顯示屏上重複顯示的命令的第一個字元

  • February 2, 2021

當我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,它由環境變數LANGUAGELC_ALLLC_CTYPELANG設置的第一個適用)確定。該命令locale | grep LC_CTYPE會告訴您目前的設置。通常避免語言環境問題的最好方法是讓終端模擬器設置LC_CTYPE,因為它知道它期望什麼編碼;但如果這對您不起作用,請確保設置LC_CTYPE.

當上一個命令顯示一些未以換行符結尾的輸出時,可能會出現相同的症狀,因此提示符顯示在行的中間,但 shell 沒有意識到這一點。在這種情況下,這只會在執行這樣的命令後發生,而不是持久地發生。

如果一行沒有正確顯示,命令redisplayclear-screen(預設綁定到Ctrl+ L)將修復它。

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