Клавиша Home ведет себя странно в bash (tty и X) при длинных входных строках

Клавиша Home ведет себя странно в bash (tty и X) при длинных входных строках

Когда я нажимаю, Homeесли мой текущий ввод достаточно короткий (скажем, <36 символов), он работает нормально. Однако, когда я набрал более длинную команду, а затем хочу вернуться к началу, он, кажется, делает свою работу, но команда неотображаетсябольше не правильно. Похоже, что я не в начале, а примерно на 10 символов не в порядке. Хотя если я печатаю "вслепую", это работает нормально, но выглядит как полный беспорядок, как будто весь ввод смещен вправо, но не перерисован. Поэтому я печатаю поверх, но "на самом деле" нет, потому что место, которое я "стираю", находится "на самом деле" на 10 символов правее. Соответственно, если я пытаюсь стереть команду, первые 10 символов все еще отображаются, но если я нажимаю на Enterнее, отображается просто другая подсказка, как будто предыдущий ввод был пустым.

I know it's not the best explanation ever, but the point is that bash recognizes it and tries to do the right thing, but often fails.

Я воспроизводю это как в 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)-релиз (i686-pc-linux-gnu)

У кого-нибудь есть информация по этому поводу?

решение1

Вам необходимо заключить непечатаемые части вашего приглашения (включая, помимо прочего, управляющие последовательности для смены цветов) в скобки \[и \].

Ваш исходный запрос: \e[0;36m[\u@\h \W]\$ \e[m
Исправленный запрос:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

Символы \[и \]говорят bashо том, что все, что находится между ними, на самом деле не выводится на экран, т. е. имеет нулевую длину. Вычисленная длина подсказки необходима для того, чтобы знать, где отображать вводимые символы. Если ее не вывести, то \[ \]будет bashвычислена неверная длина подсказки, что часто приводит к странному поведению, зависящему от геометрии терминала, из-за того, что bashпредставление о том, где находится курсор, не совпадает с реальностью.

Связанный контент