[devel] Xterm #21731 -- ^H или ^?

Sergey Vlasov vsu на altlinux.ru
Вт Сен 21 14:19:29 UTC 2010


On Tue, Sep 21, 2010 at 12:43:16PM +0400, George V. Kouryachy wrote:
> Разгребая баги (да-да, меня не было в этой реальности quite a lot)
> наткнулся вот на такую, доставшуюся мне по наследству вместе с XTerm.
> 
> https://bugzilla.altlinux.org/show_bug.cgi?id=21731
> 
> Обсуждение можно не читать, суть такая, что в Linux xterm почему-то
> обязан при нажатии клавиши BackSpace возвращать не символ BackSpace
> (^H), а Delete (^?).
> 
> Это прописано в terminfo (см infocmp xterm): соответственно, экранные
> программы ожидают, что KBS будет ^?. Это устанавливается в терминальной
> линии (см. stty -a). Один только xterm не желает с этим считаться, и по
> умолчанию при нажатии на BaskSpace посылает BackSpace. Потому что так
> делается во всём цивилизованном мире :).
> 
> Способы лечения.
> 1. Нажимать вместо BaskSpace Ctrl+BaskSpace :)
> 2. stty erase=^H
> 3. Ctrl+левая кнопка мыши -> BackArrow key (BS/DEL)
> 4. Перебить системный ресурс backArrowKey, чтобы всегда был ^?
>    Потеряется совместимость с другими системами
> 5. Перебить системный ресурс backarrowKeyIsErase, чтобы при старте
>    XTerm-а backarrow принимала значение, равное stty-му erase.

На самом деле поведение ещё зависит от ресурса ptyInitialErase: если
там false (как стоит по умолчанию), xterm читает данные terminfo для
указанного типа терминала и выполняет stty erase в соответствии с
прочитанным значением; если же поставить ptyInitialErase: true, xterm
читает настройки псевдотерминала в момент запуска и (при включении ещё
и backarrowKeyIsErase) устанавливает в соответствии с прочитанным
значением поведение клавиши BackSpace.

В Debian по каким-то причинам ставят оба ресурса:

http://patch-tracker.debian.org/patch/series/view/xterm/261-1/900_debian_xterm.diff

+! Debian package customizations follow.
+*backarrowKeyIsErase: true
+*ptyInitialErase: true

Однако, на мой взгляд, более правильное поведение - установка только
backarrowKeyIsErase: true, и оставление ptyInitialErase: false
(значение по умолчанию).  В этом случае xterm выполняет stty erase ^H,
если такое значение указано в данных terminfo для выбранного типа
терминала; в результате, например, в xterm -tn xterm-color -e sh
клавиша BackSpace работает ожидаемым образом, как и при использовании
обычного типа терминала xterm, несмотря на разные значения kbs для
этих типов.  (При использовании zsh у меня где-то принудительно
выставляется stty erase ^? даже для xterm-color, в результате
BackSpace ломается, но со стандартным типом xterm всё работает
правильно.)

>    Потеряется совместимость с другими системами, появится момент
>    неопределённости

Непонятно, с какими системами в данном случае нужно поддерживать
совместимость.  Вроде бы большинство реализаций эмуляторов терминала в
настоящее время по умолчанию используют вариант BackSpace = ^?; а вот
многие коммутаторы при управлении через telnet/ssh хотят ^H.

> Лично я за последний вариант. Мало ли что. А если кому-то хочется, чтобы
> Erase был всё-таки ^H, используйте xterm -tn xterm-color, для него в
> terminfo kbs=^H. А stty делайте сами :).

Если не трогать ptyInitialErase, и нет особо умных программ, даже stty
делать не понадобится - т.е., xterm -tn xterm-color -e <prog> для
запуска программы, требующей kbs=^H, будет сразу работать правильно.

> У меня стоит в .zshrc: stty erase `echotc kb`
> 
> Если никто не против, я попатчу app-defaults/XTerm.

Поддерживаю (а в крайнем случае ~/.Xresources никто не отменял).
----------- следующая часть -----------
Было удалено вложение не в текстовом формате...
Имя     : отсутствует
Тип     : application/pgp-signature
Размер  : 189 байтов
Описание: Digital signature
Url     : <http://lists.altlinux.org/pipermail/devel/attachments/20100921/00fdd252/attachment-0001.bin>


Подробная информация о списке рассылки Devel