Bug 10707 - terminfo khome/kend mismatch with default xterm behavior
Summary: terminfo khome/kend mismatch with default xterm behavior
Status: CLOSED FIXED
Alias: None
Product: Sisyphus
Classification: Development
Component: terminfo (show other bugs)
Version: unstable
Hardware: all Linux
: P4 blocker
Assignee: Fr. Br. George
QA Contact: qa-sisyphus
URL:
Keywords:
Depends on:
Blocks:
 
Reported: 2007-01-25 09:46 MSK by Anton Farygin
Modified: 2007-10-31 10:33 MSK (History)
8 users (show)

See Also:


Attachments

Note You need to log in before you can comment on or make changes to this bug.
Description Anton Farygin 2007-01-25 09:46:44 MSK
в konsole из пакета kdebase-wm-3.5.5-alt5 не отрабатывают нажатия home/end, CTRL+S.
Comment 1 Andrey Rahmatullin 2007-01-28 12:14:32 MSK
Неуж опять #2900?
Comment 2 Andriy Stepanov 2007-04-20 11:12:50 MSD
на $ 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
Comment 3 Anton Farygin 2007-04-20 11:24:13 MSD
Это под новым пользователем ?

метод воспроизведения - запустить less, попробовать понажимать home/end
Comment 4 Andriy Stepanov 2007-04-23 16:52:37 MSD
Действительно: в 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.
Comment 5 Sergey Vlasov 2007-04-23 17:43:59 MSD
(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 точно так же не
работает из коробки.
Comment 6 Anton Farygin 2007-04-23 20:13:44 MSD
перевешивайте конечно. 
Comment 7 Anton Farygin 2007-04-23 20:14:39 MSD
Точнее - перевешиваю конечно.
Comment 8 inger@altlinux.org 2007-04-24 11:08:48 MSD
Наверное стоит пофиксить kconsole. Нечего изображать из себя xterm, если ты
xterm не являешься. Кстати в некоторых дистрибутивах я наблюдал, что для
kconsole есть отдельная запись в terminfo.
Comment 9 inger@altlinux.org 2007-04-24 11:10:59 MSD
(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 работает? Система не очень давно установленная.

Comment 10 Anton Farygin 2007-04-24 12:19:44 MSD
Видимо в xterm есть отдельный мешок хаков на эту тему ;)
Comment 11 Andriy Stepanov 2007-04-24 12:24:10 MSD
Уточняю: у 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....
Comment 12 Anton Farygin 2007-04-24 12:30:42 MSD
xterm то у нас новый, но видимо он либо так собран, либо где-то так запатчен
Comment 13 Sergey Vlasov 2007-04-24 12:53:49 MSD
Оказывается, в /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
не будут работать правильно.
Comment 14 Anton Farygin 2007-04-24 15:33:42 MSD
видимо всё-таки надо патчить terminfo и xterm
чем все остальные терминалы
Comment 15 Sergey Vlasov 2007-04-24 16:36:51 MSD
Патчить xterm как раз не надо - надо оторвать лишнее из app-defaults, после чего
поведение xterm в области Home/End будет совпадать с konsole (при выбранном типе
терминала "XTerm (XFree 4.x.x)").

Кстати, в bug #11067 всплыла информация о том, что новый xterm-225 может быть
собран так, чтобы получать информацию о том, какие коды от него ожидаются, из
базы terminfo (хотя установка translations всё равно это сломает). Неприятность
только в том, что в таком режиме фактически отламывается переключение
normal/application mode для таких клавиш.
Comment 16 Sergey Vlasov 2007-04-24 17:55:50 MSD
Помимо xterm и konsole, TERM=xterm также выставляется в gnome-terminal; там
libvte берёт коды клавиш из описания terminfo, поэтому проблема с
несоответствием описания реальности отсутствует. Впрочем, Shift+Home и Shift+End
там не передаются в терминал, прочие модификаторы игнорируются.
Comment 17 Anton Farygin 2007-04-25 13:32:30 MSD
Стас, видимо всё-таки надо обновлять terminfo.
Comment 18 inger@altlinux.org 2007-04-25 13:47:38 MSD
Посмотрю, поэкспериментирую. Вообще последняя ремарка про gnome-terminal в
очередной раз подтверждает что kde - остой и самое лучшее решение - отдельный
терминал. Или мы так и будем всё время с ним мучаться?
Comment 19 inger@altlinux.org 2007-10-30 17:54:07 MSK
кажется это было исправлено
Comment 20 Slava Semushin 2007-10-31 10:33:56 MSK
(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, если это важно.