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 ... Я протестировал эти вещи в KDE Konsole, который ведет себя как xterm, и на консоли Linux.

1 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .