Когда я нажимаю, 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)
У кого-нибудь есть подсказки по этому поводу?
источник
PS1='$ '
PS1="\e[0;36m[\u@\h \W]\$ \e[m"
. Что-то не так с этим? Ввод 36 символов не заполняет одну строку (безусловно). Кроме того, у меня нет боковой прокрутки в tty :)Ответы:
Вы должны окружить непечатаемые части вашей подсказки (включая , но не ограничиваясь , чтобы избежать последовательностей для изменения цвета) с
\[
и\]
.Исходное приглашение:
\e[0;36m[\u@\h \W]\$ \e[m
исправлено:
\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]
\[
И\]
сказать ,bash
что все между ними на самом деле не печатать на экране, то есть имеет нулевую длину. Рассчитанная длина подсказки необходима для того, чтобы знать, где отображаются символы, которые вы вводите. Исключение\[ \]
приводитbash
к вычислению неверной длины приглашения, что часто приводит к странному поведению терминала, зависящему от геометрии, из-заbash
представления о том, где курсор не совпадает с реальностью.источник