| Summary: | terminfo khome/kend mismatch with default xterm behavior | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | Anton Farygin <rider> |
| Component: | terminfo | Assignee: | Fr. Br. George <george> |
| Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
| Severity: | blocker | ||
| Priority: | P4 | CC: | damir, george, ldv, php-coder, stanv, vsu, wrar, zerg |
| Version: | unstable | ||
| Hardware: | all | ||
| OS: | Linux | ||
|
Description
Anton Farygin
2007-01-25 09:46:44 MSK
на $ date Птн Апр 20 09:58:34 MSD 2007 С выполненным dist-upgrade, ошибка не воспроизводится нажатия клавиш home/end, CTRL+S отрабатываются нормально. $uname -m x86_64 rpmquery -f /usr/bin/konsole kdebase-wm-3.5.6-alt6 Это под новым пользователем ? метод воспроизведения - запустить less, попробовать понажимать home/end Действительно: в less не обрабатываются коректно клавиши Home/End.
В konsole в меню Настройка->Клавиатура выбран пункт "XTerm (XFree 4.x.x)" (по
умолчанию).
Решением установить по умолчанию другой выбор, например "Xterm (XFree 3.x.x)"
или "Консоль Linux" не целесобразно так как: перестанет работать передача
информации о модификаторах (например в ноутбуках есть модификаторы подобно NumLock).
Из
$ldd /usr/bin/less
libtinfo.so.5 => /lib64/libtinfo.so.5 (0x00002b71e5578000)
...
видно что less _НЕ_ использует библиотеку libreadline. Из чего следует что
файлы /etc/inputrc и ~/.inputrc не оказывают никакого влияния на приложения типа
less (которые самостоятельно напрямик работают с terminfo).
strace показал что что в ответ на нажатие клавишы End konsole (XTerm (XFree
4.x.x)) посылает less ескейп-последовательность: ^[OF (\EOF).
Нетрудно заметить что такая ескейп последовательность определена в:
/usr/share/apps/konsole/README.default.Keytab
...
key Home -AnyMod -AppCuKeys : "\E[H"
key End -AnyMod -AppCuKeys : "\E[F"
key Home -AnyMod +AppCuKeys : "\EOH"
key End -AnyMod +AppCuKeys : "\EOF"
key Home +AnyMod : "\E[1;*H"
key End +AnyMod : "\E[1;*F"
...
То есть со стороны konsole все впорядке.
Less прочитав переменную $TERM сама пытается интерпретировать ескейп
последовательность \EOH согласно с:
$infocmp xterm
оно же:
/usr/share/terminfo/x/xterm
и не находит действия которое нужно предпринять для ескейп-последовательности \EOH.
Земетим, что в базе terminfo для $TERM==xterm определены:
kend=\E[4~
khome=\E[1~
Тут-то и ошибка.
Определения kend и khome для пакета terminfo опрделяются:
$ pwd
/home/stanv/RPM/ncurses/BUILD/ncurses-5.6
$ tar -tf ../../SOURCES/ncurses-alt.tar
alt/
alt/rxvt.ti
alt/screen.ti
alt/xterm.ti
Т.е. нужно обновить alt/xterm.ti в пакете terminfo (ncurses) до актуального
состояния, или поправить kend/khome.
Из слов vsu:
1.
<vsu> выяснили, что в debian там \EOF в terminfo
2.
<vsu> xterm.ti происходит из какой-то версии xterm
Предлагаю перевесить багу на пакет terminfo.
(In reply to comment #4) > Решением установить по умолчанию другой выбор, например "Xterm (XFree 3.x.x)" > или "Консоль Linux" не целесобразно так как: перестанет работать передача > информации о модификаторах (например в ноутбуках есть модификаторы подобно > NumLock). На самом деле имелись в виду комбинации типа Ctrl+F5 и т.п. - в варианте "XTerm (XFree 4.x.x)" для таких комбинаций выдаются коды вида ^[[15;5~, где передаётся информация о нажатии Ctrl или Shift. > Земетим, что в базе terminfo для $TERM==xterm определены: > kend=\E[4~ > khome=\E[1~ > > Тут-то и ошибка. Более того, эти коды не соответствуют даже поведению xterm (без дополнительных настроек translations или keyboardType), и в нём Home/End в less точно так же не работает из коробки. перевешивайте конечно. Точнее - перевешиваю конечно. Наверное стоит пофиксить kconsole. Нечего изображать из себя xterm, если ты xterm не являешься. Кстати в некоторых дистрибутивах я наблюдал, что для kconsole есть отдельная запись в terminfo. (In reply to comment #5) > (In reply to comment #4) > > Решением установить по умолчанию другой выбор, например "Xterm (XFree 3.x.x)" > > или "Консоль Linux" не целесобразно так как: перестанет работать передача > > информации о модификаторах (например в ноутбуках есть модификаторы подобно > > NumLock). > > На самом деле имелись в виду комбинации типа Ctrl+F5 и т.п. - в варианте "XTerm > (XFree 4.x.x)" для таких комбинаций выдаются коды вида ^[[15;5~, где передаётся > информация о нажатии Ctrl или Shift. > > > Земетим, что в базе terminfo для $TERM==xterm определены: > > kend=\E[4~ > > khome=\E[1~ > > > > Тут-то и ошибка. > > Более того, эти коды не соответствуют даже поведению xterm (без дополнительных > настроек translations или keyboardType), и в нём Home/End в less точно так же не > работает из коробки. А почему у меня сейчас less работает? Система не очень давно установленная. Видимо в xterm есть отдельный мешок хаков на эту тему ;) Уточняю: у Ingera работают End/Home в less в xterm а не в konsole. Это потому что: $ strace less /usr/share/doc/lilo-22.7.3/README.raid1 2>log read(3, "\33", 1) = 1 write(1, "\33[35;1H\33[K \33[KESC\10\10\10ESC", 23) = 23 read(3, "[", 1) = 1 write(1, "\33[K[\10[", 6) = 6 read(3, "4", 1) = 1 write(1, "\33[K4\0104", 6) = 6 read(3, "~", 1) = 1 ЧИТАЕТ: \E[4~ у нас старый xterm.... xterm то у нас новый, но видимо он либо так собран, либо где-то так запатчен Оказывается, в /etc/X11/Xresources у нас написано:
! Suppr support.
*VT100.Translations: #override \
<Key>BackSpace: string(0x7F)\n\
<Key>Delete: string("\033[3~")\n\
<Key>Home: string("\033[1~")\n\
<Key>End: string("\033[4~")
BackSpace вроде бы лучше настраивать через *VT100.backarrowKeyIsErase: true;
Delete ведёт себя так по умолчанию; настройки Home и End таким образом портят их
работу совместно с модификаторами (в частности, kEND=\E[1;2F, kHOM=\E[1;2H,
описанные в terminfo, после этого уже не получить).
В принципе можно объявить, что Home и End в xterm у нас обязаны выдавать \033[1~
и \033[4~ (как было по умолчанию в каких-то старых версиях xterm), только тогда
лучше писать
*VT100.Translations: #override \
~Ctrl ~Shift ~Meta <Key>Home: string("\033[1~")\n\
~Ctrl ~Shift ~Meta <Key>End: string("\033[4~")
(чтобы при использовании модификаторов выдавались коды вида \033[1;2H).
В этом случае нужно патчить все остальные эмуляторы терминалов, заявляющие по
умолчанию тип xterm, и после xrdb /dev/null клавиши Home/End в настоящем xterm
не будут работать правильно.
видимо всё-таки надо патчить terminfo и xterm чем все остальные терминалы Патчить xterm как раз не надо - надо оторвать лишнее из app-defaults, после чего поведение xterm в области Home/End будет совпадать с konsole (при выбранном типе терминала "XTerm (XFree 4.x.x)"). Кстати, в bug #11067 всплыла информация о том, что новый xterm-225 может быть собран так, чтобы получать информацию о том, какие коды от него ожидаются, из базы terminfo (хотя установка translations всё равно это сломает). Неприятность только в том, что в таком режиме фактически отламывается переключение normal/application mode для таких клавиш. Помимо xterm и konsole, TERM=xterm также выставляется в gnome-terminal; там libvte берёт коды клавиш из описания terminfo, поэтому проблема с несоответствием описания реальности отсутствует. Впрочем, Shift+Home и Shift+End там не передаются в терминал, прочие модификаторы игнорируются. Стас, видимо всё-таки надо обновлять terminfo. Посмотрю, поэкспериментирую. Вообще последняя ремарка про gnome-terminal в очередной раз подтверждает что kde - остой и самое лучшее решение - отдельный терминал. Или мы так и будем всё время с ним мучаться? кажется это было исправлено (In reply to comment #19) > кажется это было исправлено Проверил работу клавиш Home/End -- у меня работает (проверял проматывая man в aterm/xterm в bash/zsh). Единственно, что у меня less последний и не из Сизифа: [c0der@rock ~]$ rpm -q xterm aterm less terminfo xterm-229-alt2 aterm-1.0.0-alt4 less-409-alt0 terminfo-5.6-alt4 bash-3.1.17-alt2 zsh-4.3.4-alt3 Локаль CP1251, если это важно. |