Bug 10707 - terminfo khome/kend mismatch with default xterm behavior
: terminfo khome/kend mismatch with default xterm behavior
Status: CLOSED FIXED
: Sisyphus
(All bugs in Sisyphus/terminfo)
: unstable
: all Linux
: P4 blocker
Assigned To:
:
:
:
:
:
  Show dependency tree
 
Reported: 2007-01-25 09:46 by
Modified: 2007-10-31 10:33 (History)


Attachments


Note

You need to log in before you can comment on or make changes to this bug.


Description From 2007-01-25 09:46:44
в konsole из пакета kdebase-wm-3.5.5-alt5 не отрабатывают нажатия home/end,
CTRL+S.
------- Comment #1 From 2007-01-28 12:14:32 -------
Неуж опять #2900?
------- Comment #2 From 2007-04-20 11:12:50 -------
на $ 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 From 2007-04-20 11:24:13 -------
Это под новым пользователем ?

метод воспроизведения - запустить less, попробовать понажимать home/end
------- Comment #4 From 2007-04-23 16:52:37 -------
Действительно: в 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 From 2007-04-23 17:43:59 -------
(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 From 2007-04-23 20:13:44 -------
перевешивайте конечно. 
------- Comment #7 From 2007-04-23 20:14:39 -------
Точнее - перевешиваю конечно.
------- Comment #8 From 2007-04-24 11:08:48 -------
Наверное стоит пофиксить kconsole. Нечего изображать из себя xterm, если ты
xterm не являешься. Кстати в некоторых дистрибутивах я наблюдал, что для
kconsole есть отдельная запись в terminfo.
------- Comment #9 From 2007-04-24 11:10:59 -------
(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 From 2007-04-24 12:19:44 -------
Видимо в xterm есть отдельный мешок хаков на эту тему ;)
------- Comment #11 From 2007-04-24 12:24:10 -------
Уточняю: у 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 From 2007-04-24 12:30:42 -------
xterm то у нас новый, но видимо он либо так собран, либо где-то так запатчен
------- Comment #13 From 2007-04-24 12:53:49 -------
Оказывается, в /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 From 2007-04-24 15:33:42 -------
видимо всё-таки надо патчить terminfo и xterm
чем все остальные терминалы
------- Comment #15 From 2007-04-24 16:36:51 -------
Патчить xterm как раз не надо - надо оторвать лишнее из app-defaults, после
чего
поведение xterm в области Home/End будет совпадать с konsole (при выбранном
типе
терминала "XTerm (XFree 4.x.x)").

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