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 для запуска программы, требующей kbs=^H, будет сразу работать правильно. > У меня стоит в .zshrc: stty erase `echotc kb` > > Если никто не против, я попатчу app-defaults/XTerm. Поддерживаю (а в крайнем случае ~/.Xresources никто не отменял).