Клавиша home действует странно в bash (tty и X) на длинных строках ввода

11

Когда я нажимаю, 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) -релиз (i686-pc-linux-gnu)

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

Лев Левицкий
источник
1
Как долго ваша подсказка? Заполняет ли командная строка длиной около 36 символов одну строку вашего терминала и, таким образом, вызывает боковую прокрутку? Это все еще происходит, если вы используете эту подсказку? PS1='$ '
Микель
@Mikel Я не знаю, что ты имеешь в виду, но, скорее всего, ты на правильном пути. Кажется, этого не происходит, когда я использую минималистическое приглашение. Один я был немного изменен по сравнению с установленным по умолчанию: PS1="\e[0;36m[\u@\h \W]\$ \e[m". Что-то не так с этим? Ввод 36 символов не заполняет одну строку (безусловно). Кроме того, у меня нет боковой прокрутки в tty :)
Лев Левицкий
@Mikel Я последовал совету jw013 и скорректировал подсказку, которая, похоже, решает эту проблему. Может быть, вы могли бы уточнить, в чем заключалась проблема, чтобы я мог наградить вас каким-нибудь представителем, как первым, чтобы выяснить это :)
Лев Левицкий,

Ответы:

13

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

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

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

jw013
источник
Спасибо, это решает проблему. Тем не менее, я был бы признателен за некоторые пояснения: что послужило причиной такого поведения, что делают квадратные скобки и т. Д. Было бы хорошо, если бы все это было на одной странице и могло бы помочь кому-то еще в будущем.
Лев Левицкий
@LevLevitsky Я добавил краткое объяснение к ответу.
jw013
Большое спасибо! Это имеет больше смысла для меня сейчас.
Лев Левицкий