У меня сейчас проблема с терминалом. Кажется, сочетание bash (или, скорее, readline) и Terminal.app каким-то образом запутывается, когда я нажимаю клавишу курсора-вправо, чтобы выйти из режима «reverse-i-search» (Control-R). После этого символы справа от курсора дублируются. Vim, будучи более сложным приложением, реагирует, дублируя символы в неправильном порядке.

Я покажу вам несколько скриншотов, чтобы проиллюстрировать проблему.

Прежде всего, это новое окно терминала, в котором выполняется «GNU bash, версия 3.2.48(1)-релиз (x86_64-apple-darwin10.0)» (OSX 10.6.4). Подсказка довольно сложная, вы можете найти код на GitHub. Я понятия не имею, вызывает ли мое приглашение проблемы, но в Linux это не так. Для полноты, я объясню это до некоторой степени: голубая часть показывает состояние Git для текущего каталога и генерируется PROMPT_COMMAND . Пример $PS1 выглядит так:

\[\e]0;\u@\h:\w\a\]\[\e[1;32m\]\u\[\e[0;32m\]@\[\e[1;30m\]\h\[\e[1;34m\] \w \[\e[0;36m\]di ~? \[\e[1;30m\]\[\e[0;37m\]\A \[\e[0;33m\]\[\e[1;31m\]1\$\[\e[0m\]

Для справки это вывод stty:

speed 9600 baud; 50 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
 -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
 -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
 -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
 -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
 eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
 min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
 stop = ^S; susp = ^Z; time = 0; werase = ^W;

Здесь не должно быть никаких нестандартных настроек. На тестовом примере:

Я ввожу echo 126 , затем нажимаю «курсор влево» один раз, затем набираю 345, затем нажимаю «возврат». Затем я нажимаю Control-R и ввожу «p». Вот когда я сделал этот первый скриншот:

находясь в режиме ^ R

Теперь, после нажатия «курсора вправо» для выхода из режима обратного поиска, терминал подает звуковой сигнал и начинает портиться:

после нажатия курсора вправо

Чтобы продемонстрировать проблему, я делаю то же echo что и раньше: я набираю echo 126 , перемещаю один символ влево и набираю 345 , а затем return.

испортил командную строку

Как видите, для каждого набираемого символа справа от курсора отображается еще «6». Ситуация становится еще хуже, когда я вхожу в Vim. Это мой недавно запущенный Vim после входа в режим вставки и ввода пробела:

испортил Вим

(Пробел, показанный как подчеркивание, является нормальным, это опция 'list' в действии.)

Видите, как приветственное сообщение странным образом перемещается вправо? Другой пример: свежий Vim после ввода i126<Left>345<Esc>:

Vim после i126 <Слева> 345 <Esc>

Теперь есть идеи, что здесь происходит? Совершенно очевидно, что работать таким образом практически невозможно. Использование reset работает, но делать это каждый раз не самая удобная вещь.

Если вам нужна дополнительная информация, я буду рад предоставить ее. Кроме того, я довольно опытный пользователь CLI, так что вам не нужно объяснять все, что нужно.

2 ответа2

2

Я не могу сказать, что в данный момент, но в строке приглашения PS1, которую вы используете, определенно что-то не так, что заставляет терминал работать, когда он использует эмуляцию "xterm-color". У меня та же версия BASH и MacOS, что и у вас здесь, и я запускаю свой терминал под эмуляцией xterm-color. В тот момент, когда я экспортировал переменную PS1 со значением, которое вы указали в вопросе, и выполнил трюк, который вы упомянули в режиме обратного поиска, я увидел то же поведение на моем терминале, что и на вашем.

1

Я не смог воспроизвести это. Я использую Pro-профиль в Terminal.app, и я устанавливаю 'Объявить терминал как' в rxvt. Может быть, это помогает.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .