Phím Home hoạt động lạ trong bash (tty và X) trên chuỗi đầu vào dài


10

Khi tôi nhấn Homenếu đầu vào hiện tại của tôi đủ ngắn (giả sử <36 ký tự), nó hoạt động tốt. Tuy nhiên, khi tôi đã gõ một lệnh dài hơn và sau đó muốn quay lại từ đầu, có vẻ như nó thực hiện công việc của mình, nhưng lệnh không được hiển thị đúng nữa. Có vẻ như tôi không phải lúc đầu nhưng khoảng 10 ký tự. Mặc dù nếu tôi gõ "mù", nó hoạt động tốt, nhưng có vẻ như là một mớ hỗn độn, như thể toàn bộ đầu vào được chuyển sang bên phải, nhưng không được vẽ lại. Vì vậy, tôi gõ vào nó, nhưng "thực tế" thì không, bởi vì nơi tôi đang "xóa" là "thực sự" 10 ký tự bên phải. Theo đó, nếu tôi cố xóa lệnh, 10 ký tự đầu tiên vẫn được hiển thị, nhưng nếu tôi nhấn, Enternó chỉ hiển thị một dấu nhắc khác như thể đầu vào trước đó trống.

Tôi biết đó không phải là lời giải thích tốt nhất từ ​​trước đến nay, nhưng vấn đề là bash nhận ra nó và cố gắng làm điều đúng, nhưng thường thất bại.

Tôi tái tạo điều này cả trong tty và trong một thiết bị đầu cuối trong một phiên X. Khi tôi nhấn Ctrl+ Vvà sau đó Hometôi thấy các chuỗi khác nhau ( ^[OHtrong X, ^[[1~trong tty), nhưng cả hai dường như nằm trong /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 $TERMhiển thị linuxtrong tty và xtermtrong phiên X.

nó là

GNU bash, phiên bản 4.2.24 (2) -release (i686-pc-linux-gnu)

Bất cứ ai cũng có manh mối về điều này?


1
Bao lâu là lời nhắc của bạn? Việc gõ một dòng lệnh dài khoảng 36 ký tự có lấp đầy một dòng của thiết bị đầu cuối của bạn và do đó gây ra cuộn bên? Nó vẫn xảy ra nếu bạn sử dụng lời nhắc này? PS1='$ '
Mikel

@Mikel Tôi không biết bạn đang nghĩ gì, nhưng có lẽ bạn đang ở gần đúng đường. Nó dường như không xảy ra khi tôi sử dụng dấu nhắc tối giản. Cái tôi đã sử dụng được sửa đổi một chút so với cái mặc định : PS1="\e[0;36m[\u@\h \W]\$ \e[m". Có điều gì sai với nó? Nhập 36 ký tự không điền một dòng (cho đến nay). Ngoài ra, tôi không có cuộn bên trong tty :)
Lev Levitsky

@Mikel Tôi đã làm theo lời khuyên của jw013 và điều chỉnh lời nhắc, điều đó dường như để giải quyết nó. Có lẽ bạn có thể giải thích vấn đề là gì để tôi có thể thưởng cho bạn một số đại diện như là người đầu tiên giải quyết nó :)
Lev Levitsky

Câu trả lời:


12

Bạn cần bao quanh các phần không in của lời nhắc của bạn (bao gồm nhưng không giới hạn ở các chuỗi thoát để thay đổi màu sắc) với \[\].

Lời nhắc ban đầu của bạn: Đã sửa lỗi \e[0;36m[\u@\h \W]\$ \e[m
nhắc:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

Các \[\]nói bashrằng tất cả mọi thứ ở giữa không thực sự in ra màn hình, tức là có số không dài. Độ dài lời nhắc được tính là cần thiết để biết nơi lặp lại ký tự bạn nhập. Loại bỏ các \[ \]nguyên nhân bashđể tính toán độ dài lời nhắc không chính xác, điều này thường dẫn đến hành vi phụ thuộc hình học đầu cuối lạ do bashý tưởng về nơi con trỏ không khớp với thực tế.


Cảm ơn, điều này giải quyết vấn đề. Tuy nhiên, tôi đánh giá cao một số lời giải thích: lý do của hành vi đó là gì, dấu ngoặc vuông làm gì, v.v. Thật tốt khi có tất cả trên một trang và có thể giúp đỡ người khác trong tương lai.
Lev Levitsky

@LevLevitsky Tôi đã thêm một lời giải thích ngắn cho câu trả lời.
jw013

Cảm ơn rất nhiều! Điều đó có ý nghĩa hơn với tôi bây giờ.
Lev Levitsky
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.