具有零寬度控製字元的 Bash 提示符

具有零寬度控製字元的 Bash 提示符

為了防止提示符號從右到左的文字扭曲,我想在 bash 提示字元 (U200e) 中插入零寬度 LRM。由於這是一個零寬度字符,我的直覺是用 包裹它\[<200e>\]。事實證明,這實際上導致 bash 在錯誤的位置換行。當我不用任何東西包裹它時然後看起來效果很好。

我不明白。即使 bash 自動偵測到這個字元的寬度為零,在它\[...\]周圍包裹 a 也不應該有任何傷害。

編輯:所以問題是:何時\[...\]實際需要轉義,如果轉義的字元實際上為零寬度,它怎麼可能有害。

答案1

看貼文 在 bash 中轉義零長度字符。特別是 麥可艾倫的回答 我將其複製如下:

\[一些實用程式(包括 PS1)使用這些序列來表示\001\002控製程式碼:

\[=>\x01\001

\]=>\x02\002

printf 和 echo 不會進行從\[到 的轉換\001

所以解決方案是我自己進行轉換。而不是將零長度字元包裝在\[

echo "\[\033[1;30m\]foo\[\033[0m\]"

這會輸出\[foo\]

我改為輸出實際的控制碼:

echo "\x01\033[1;30m\x02foo\x01\033[0m\x02"

foo它在 PS1 printf 和 echo 上輸出。

具體範例請參見此提交在 git-radar 上。

相關內容