Как узнать, какие коды выхода отправляет мой терминал для определенных специальных событий, которые cat не отображает?

Как узнать, какие коды выхода отправляет мой терминал для определенных специальных событий, которые cat не отображает?

Я хотел узнать, что отправляет мой терминал для Ctrl+Backspace и Alt+Backspace. Стандартный способ сделать это — запустить catтерминал и набрать текст, что обычно срабатывает, но с определенными выводами, подобными этим, результаты оказываются сложными.

Я предполагаю, что Alt+Backspace отправляет \x1b\x7f(то есть escape backspace), но что происходит, если я запускаю catи нажимаю Ctrl+V и Alt+Backspace, или просто Alt+Backspace, происходит то, что escape будет "набран", а затем немедленно удален с backspace, так что это выглядит так, как будто ничего не происходит. Я понял это только один раз, увидев, как мой компьютер отрисовывает один кадр escape, ^[который там есть.

Пока я не уверен, как понять, что именно отправляет Ctrl+Backspace. Это не Ctrl+W, хотя оба они удаляют слово в командной строке bash, потому что в этом случае catничего не происходит, а Ctrl+W удаляет слово!

решение1

Просто используйте эту команду:

showkey -a

решение2

В zsh, с:

$ STTY='raw -echo min 0 time 40' cat -vte
^[^?

Или с bash:

$ s=$(stty -g); stty raw -echo min 0 time 40; cat -vte; stty "$s"
^[^?

Вы увидите необработанный ввод терминала, как он его отправляет, и как он визуализируется cat -vte. Не вводите ничего в течение 4 секунд (40 децисекунд), чтобы остановить.

Например, можно заменить cat -vteна od -An -w1 -tu1 -tx1 -to1 -ta(предполагается, что GNU или совместимо), чтобы увидеть каждое значение байта в десятичном, шестнадцатеричном, восьмеричном виде или в виде символа.od

  27
  1b
 033
 esc
 127
  7f
 177
 del

решение3

Я нашел трюк в другом месте, чтобы показать один символ в bash, используя read -rsn1 key && echo "$key" | xxd. Это было 90% пути, но я застрял на этом на некоторое время, потому что я просто получал 0x1b (Escape), что не было полной картиной.

Затем я изменил его на read -rsn2 key && echo "$key" | xxdи это масштабируется до любого количества символов, которые есть в вашей последовательности выхода, немного экспериментов делают свое дело. Так что на моем терминале у меня былообаCtrl+ и Alt+Backspace в прошлом отображались на 0x1b, 0x7f (мета-Backspace, если хотите) из соображений удобства. Я иду по этому пути в первую очередь потому, что хочу настроить новый эмулятор терминала, чтобы он позволял мне удалять слова с помощью обеих комбинаций, но работает только одна из них. В read -rsnbash — хороший инструмент для выполнения отладки вывода на более низком уровне, чем cat.

Связанный контент