當我點擊Home當前輸入是否足夠短(例如,<36 個字元)時,它工作正常。但是,當我輸入較長的命令然後想返回開頭時,它似乎完成了其工作,但該命令卻沒有顯示的對了。看來我不在開頭,而是落後了大約 10 個字元。雖然如果我“盲目”輸入,它工作正常,但看起來完全一團糟,就好像整個輸入向右移動,但沒有重新繪製。所以我打字覆蓋它,但“事實上”沒有,因為我“刪除”的地方“實際上”是右邊10個字符。因此,如果我嘗試刪除該命令,前 10 個字元仍會顯示,但如果我點擊Enter它,只會顯示另一個提示,就好像之前的輸入為空一樣。
我知道這不是最好的解釋,但重點是 bash 認識到它並嘗試做正確的事情,但經常失敗。
我在 tty 和 X 會話的終端機中重現了這一點。當我點擊Ctrl+V時,Home我看到不同的序列(^[OH
在 X 中,^[[1~
在 tty 中),但兩者似乎都在我的/etc/inputrc
:
# do not bell on tab-completion
#set bell-style none
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
$if mode=emacs
# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[7~": beginning-of-line
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word
# for rxvt
"\e[8~": end-of-line
# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
$endif
echo $TERM
顯示linux
在 tty 和xterm
X 會話中。
它是
GNU bash,版本 4.2.24(2)-release (i686-pc-linux-gnu)
有人有這方面的線索嗎?
答案1
您需要用 和 包圍提示的非列印部分(包括但不限於用於更改顏色的轉義序列)\[
。\]
您原來的提示:\e[0;36m[\u@\h \W]\$ \e[m
修正提示:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]
和\[
告訴\]
我們bash
之間的所有內容實際上並沒有打印到螢幕上,即長度為零。需要計算出的提示長度才能知道在哪裡回顯您鍵入的字元。忽略\[ \]
會導致bash
計算不正確的提示長度,這通常會導致奇怪的終端幾何相關行為,因為bash
's 的想法是遊標與現實不匹配。