Измените escape-последовательность, сгенерированную xterm, для комбинаций клавиш.

Моя цель - настроить терминал, в котором программа с интерфейсом командной строки будет вести себя так, как ожидается, для ввода с клавиатуры (программа изначально написана в xharbour для Windows, но теперь я хотел бы перенести ее на Linux). Для начала я выбрал xterm, так как он проще, нет необходимости отключать комбинации клавиш терминала по умолчанию.

С замазкой большинство персонажей работают хорошо, а для тех, кто этого не делает, я использую автогорячую клавишу, скрипт ahk, и это делает свою работу. Например, для Ctrl+F1: ^F1::SendInput ^[O5P

Я пробовал и модифицировал, перекомпилировал terminfo, изменил его и изменил типы клавиатуры, но не смог получить ответ ^[O5P для нажатия Ctrl + F1 в терминале. Если вы знаете какой-либо способ сделать это изменение, пожалуйста, скажите мне... Я прочитал сотни страниц, которые якобы делают это, но все эти изменения не дали никакого эффекта или не дали ожидаемого эффекта.

Поэтому я оставил попытку изменить настройки терминала, чтобы достичь моей цели Ctrl+F1 to ^[O5P, и попробовал некоторые команды и программы, которые будут делать что-то похожее на автогорячую клавишу:

  • xmodmap, но для комбинаций клавиш не работает
  • xdotool windowactivate xyz type ^[O5P, это возвращает коды символов отдельных символов
  • xmacro, он не отправляет нажатия клавиш в другое окно
  • ironahk, я получаю сообщение об ошибке в самом начале при попытке запустить example.ahk и не могу найти нужные мне команды в его легком руководстве.
  • bind '\e[1;5P":"\e[O5P"', здесь первый код клавиши - это то, что я сейчас получаю при нажатии ctrl+f1 и после того, который я хочу получить этой комбинацией. Нет эффекта.
  • xbindkeys + xvkbd тоже не помогло.

Пожалуйста, помогите мне, если вы уже знаете, удалось как-то добиться этого (изменить код клавиши, возвращаемый для комбинации клавиш).

Я использую последнюю версию CentOS и Ubuntu для тестирования.


person obeliksz    schedule 07.08.2012    source источник
comment
Я не понял, что вы делаете, но если вы хотите изменить escape-последовательность, сгенерированную xterm для ключа, вам нужно изменить его таблицу перевода. Я нашел хороший пример на in-ulm.de/~mascheck/X11/. xterm/XTerm   -  person Alan Curry    schedule 07.08.2012
comment
Таблица переводов в вашей ссылке выглядит интересно... Мне нужно выяснить, где это находится в Centos... Возможно, я сложно рассказал, что я делаю, но вы поняли, что я хотел бы сделать: изменить escape-последовательность, сгенерированная xterm для КОМБИНАЦИИ КЛАВИШ.   -  person obeliksz    schedule 07.08.2012
comment
Файл примера, на который я ссылаюсь, представляет собой файл ресурсов X. Обычно они помещаются в /etc/X11/app-defaults/ для общесистемной конфигурации или $HOME/.Xresources или $HOME/.Xdefaults для индивидуальной пользовательской конфигурации. Если вы поместите его в правильное место (каким бы оно ни было для Centos), файл будет загружен в начале вашего X-сеанса, и вы сможете перезагрузить его в середине сеанса с помощью xrdb -merge filename.   -  person Alan Curry    schedule 07.08.2012
comment
И еще один вариант: вы можете добавить переводы в один конкретный экземпляр xterm, указав ресурс таблицы переводов в качестве опции -xrm. Используя небольшой фрагмент файла примера для демонстрации: xterm -xrm 'XTerm.VT100.translations: #override Ctrl<Key>Left: string(0x1b) string("b") \n Ctrl<Key>Right: string(0x1b) string("f")'   -  person Alan Curry    schedule 07.08.2012
comment
Почему бы не использовать последовательность символов, которую на самом деле генерирует xterm, и не интерпретировать ее в вашей программе как Ctrl+F1? Это ограничение терминальной библиотеки xHarbour?   -  person echristopherson    schedule 08.08.2012
comment
Так проще, иначе сгенерированная последовательность xterm может варьироваться в зависимости от дистрибутива, и я бы предпочел оставить код с минимальными изменениями и немного настроить систему/среду.   -  person obeliksz    schedule 09.08.2012


Ответы (2)


xterm можно настроить для отправки пользовательских строк при нажатии определенных клавиш, изменив его таблицу перевода. Таблица перевода является частью базы данных ресурсов X, управляемой командой xrdb.

Хороший пример пользовательской таблицы перевода для xterm приведен здесь. Его можно скопировать в ваш $HOME/.Xdefaults или $HOME/.Xresources, и он будет загружен при следующем входе в систему. Чтобы сразу загрузить его в текущий сеанс, xrdb -merge $HOME/.Xresources. Это не повлияет на уже запущенные xterms. (Возможно, вы сможете изменить таблицу перевода работающего xterm с помощью editres, но это больше проблем, чем пользы.)

Чтобы предоставить пользовательскую таблицу перевода для одного экземпляра xterm, используйте параметр -xrm, как в

xterm -xrm 'XTerm.VT100.translations: #override Ctrl<Key>Left: string(0x1b) string("b") \n Ctrl<Key>Right: string(0x1b) string("f")'
person Alan Curry    schedule 07.08.2012
comment
И есть идеи, как настроить это для Putty? - person obeliksz; 13.08.2012
comment
Лучше сделать это отдельным вопросом. Я не оптимистичен в отношении ответа. xterm обязан своей гибкостью набору инструментов Xt, который предоставляет сложный язык привязки клавиш. (xterm просто предоставляет функции действия, в данном случае строку). Никакой другой набор графических инструментов не является настолько настраиваемым. Xt: большое улучшение по сравнению с его преемниками - person Alan Curry; 14.08.2012
comment
stackoverflow.com/questions/11966534/ вот это отдельный вопрос :) - person obeliksz; 15.08.2012

Не напрямую отвечая на вопрос, но ESC O 5 P это совершенно неправильная вещь для отправки терминалом.

Вкратце: ESC O, иначе называемая SS3, сокращение от Single Shift 3, представляет собой последовательность, которая изменяет следующий отправленный символ, помещая его в графическую область G3 вместо стандартной. Это изменит 5 и отправит P напрямую. Это не является и никогда не было хорошей идеей.

Правильная вещь для отправки Ctrl-F1 будет CSI 1;5 P, формой CSI P (являющейся клавишей F1) со вторым параметром, установленным на 5 (являющимся битовой маской модификатора).

person LeoNerd    schedule 13.08.2012
comment
Спасибо, но я не специалист по терминалам, и моя забота состоит в том, чтобы сделать терминал таким, чтобы программа xharbour понимала мои комбинации клавиш, а с 1; 5P это не так. - person obeliksz; 14.08.2012