Я хотел узнать, что отправляет мой терминал для 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 -rsn
bash — хороший инструмент для выполнения отладки вывода на более низком уровне, чем cat
.