Почему Ctrl + M и Ctrl + Q не используются в сочетаниях клавиш Bash?

15

Недавно я просматривал сочетания клавиш bash и пытался найти подходящий для моего ключа активации tmux.

Я нахожу интересным , что ctrl + mи ctrl + qне используются в ярлыках Баш, согласно https://en.wikipedia.org/wiki/Bash_(Unix_shell) .

Почему они не используются? Я чувствую себя ctrl + mочень удобно.

Эти две комбинации предназначены для DIY (define it yourself)использования? Или есть другая история?

Zen
источник
1
Пользоваться ALT + mимхо еще удобнее.
Рольф

Ответы:

16

Ctrl + M отправляет тот же символ (RET), что и клавиша Enter на терминале. Программы не имеют возможности отличить их друг от друга, поэтому эти ключи нельзя настроить отдельно.

Ctrl + Q уже используется для XON по умолчанию, поэтому он не может быть использован Bash, но вы все равно сможете использовать его в tmux, потому что tmux использует режим необработанного ввода.

Программа с графическим интерфейсом могла прочитать с клавиатуры, что клавиша m была нажата с модификатором Ctrl и использовать Ctrl + m в качестве ярлыка, но оболочка или любая терминальная программа получает комбинации Ctrl + Key так же, как символы ascii от 0 до 26

Ctrl+@ = 0
Ctrl+A = 1
Ctrl+B = 2

и так далее. Вы можете попробовать это, чтобы увидеть значения

cat ctrlkeys <<EOF
^A^B^C^D^E^F
EOF
od -c ctrlkeys
0000000 001 002 003 004 005 006  \n

Чтобы ввести значения, нажмите Ctrl + v перед Ctrl + [af], чтобы получить их как необработанное значение.

Когда вы посмотрите на таблицу ascii (7), вы увидите контрольные коды в таблице с соответствующими символами @ .. Z слева. Например

015   13    0D    CR  '\r' (carriage ret)     115   77    4D    M

или

011   9     09    HT  '\t' (horizontal tab)   111   73    49    I

Следующий уровень, который интерпретирует управляющие коды перед bash, является изменением и распечаткой настроек терминала.

stty -a
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;

см. stty (1) для значений lnextили startи stop.

Также смотрите readline (3), так как bash и другие программы GNU cli используют эту библиотеку для управления строками ввода и, конечно же, bash (1) / READLINE, раздел readline на странице руководства bash.

Примечание: XYZ (NUM) означает страницу руководства XYZ из раздела NUM, поэтому результат man NUM XYZ.

user4098326
источник
1
Bash имеет привязку по умолчанию для Cs (XOFF), поэтому они могли бы также поставить привязку для Cq.
Жиль "ТАК - перестань быть злым"
На самом деле, по умолчанию библиотека GNU Readline, которую использует Bash, связывается C-qс тем же, что C-vи клон функции Emacs, quoted-insertкоторый полезен для выяснения escape-кодов, генерируемых ключами и комбинациями клавиш. Вот соответствующая часть руководства Readline: tiswww.case.edu/php/chet/readline/readline.html#SEC9
ssokolow