readline / bash: Как отобразить клавиши Escape и клавиши со стрелками?

6

Из другой части программного обеспечения, управляемого командной строкой, я привык к следующему поведению: стрелки вверх / вниз пролистывают историю команд, сопоставляя строки, соответствующие символам, набранным до сих пор в текущей строке, а 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.

А. Донда
источник

Ответы:

4

Если вы используете 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, но я не знаю, где вы могли бы втиснуть их в восьмибитную последовательность кодирования. Я чувствую вашу боль, хотя :)

RICi
источник
Спасибо! Приятно знать, но я не думаю, что сделаю это. Повсеместно ломать привязки клавиш - слишком много, чтобы заставить bash выполнять мои поручения ... Я так понимаю, что разграничение по времени - это то, чего не делает readline? Хотя другие консольные программы, такие как vim, должны делать что-то подобное, поскольку Esc и Arrows работают одновременно.
А. Донда
@ A.Donda: Это правильно: Vim различается по времени, что иногда имеет неприятные последствия, когда ssh'ing в сеансе vim по медленной ссылке. (Это также означает, что ESC немного не отвечает, но vimites учатся жить с этим.)
rici