readline / bash: Как отобразить клавиши Escape и клавиши со стрелками?
Из другой части программного обеспечения, управляемого командной строкой, я привык к следующему поведению: стрелки вверх / вниз пролистывают историю команд, сопоставляя строки, соответствующие символам, набранным до сих пор в текущей строке, а Esc удаляет все, что было напечатано до сих пор. на текущей строке. Я пытаюсь заставить bash (через readline) сделать то же самое. Вот что я положил в свой.bashrc:
bind 'Escape: kill-whole-line'
bind '"\e[A": history-search-backward'
bind '"\e[B": history-search-forward'
Поведение не соответствует назначению из-за взаимодействия отображения Escape="\e" с отображением escape-последовательностей "\e[A" и "\e[B".
Мой вопрос: есть ли способ сделать эту работу? Одна возможность может быть основана на синхронизации, то есть, если за \ e быстро следует другой ключ, он обрабатывается как часть последовательности, но если во время некоторой небольшой задержки ничего не происходит, он рассматривается как ключ сам по себе. Однако, читая документацию по bash и readline, я не смог придумать такую вещь.
Дополнительный вопрос: существует ли современный терминальный "эмулятор", который на самом деле не пытается эмулировать запутанное поведение исторических машин, но предоставляет работающим в нем программам однозначную информацию о нажатых клавишах? Который также позволил бы такие вещи, как различие между CTRL-A и CTRL-SHIFT-A... Я тестировал эти вещи в Konsole KDE, которая ведет себя как xterm, и на консоли Linux.
1 ответ
Если вы используете xterm
Вы можете получить его, чтобы отправить CSI
(0x9B) вместо последовательности \e[
установив логический ресурс eightBitControl. Например, запустите xterm так:
xterm -xrm '*eightBitControl:true'
Вы можете навсегда установить этот ресурс, отредактировав файл ресурсов приложения XTerm (Ubuntu, кажется, помещает это в /etc/X11/app-defaults
но я думаю /usr/share/X11/app-defaults
является более стандартным.)
Но будьте осторожны: это в основном сломает ваш терминал, пока вы не исправите все свои сочетания клавиш.
Что касается более общего вопроса, я думаю, что это сложнее, чем может показаться на первый взгляд. Консоль Linux довольно хорошо разработана для генерации восьмибитных кодов символов (поэтому она может работать с UTF-8). С реальной консоли (то есть без использования X) вы можете получить "сырые" коды сканирования, но тогда вам придется самостоятельно выполнять всю логику сопоставления клавиш (что на самом деле делает X). Возможно, вы сможете использовать средства сопоставления клавиш X, чтобы сгенерировать некоторые конкретные коды для комбинаций alt + ctrl + letter, но я не знаю, где вы могли бы втиснуть их в восьмибитную последовательность кодирования. Я чувствую вашу боль, хотя:)