Nedávno jsem kontroloval klávesové zkratky bash a snažil jsem se najít vhodnou pro můj aktivační klíč tmux.
Připadá mi zajímavé, že ctrl + m
a ctrl + q
se nepoužívají v klávesových zkratkách bash, podle https://en.wikipedia.org/wiki/Bash_(Unix_shell).
Proč se nepoužívají? Cítím ctrl + m
je docela šikovný.
Jsou tyto dvě kombinace navrženy pro DIY (define it yourself)
používání? Nebo je tu jiný příběh?
Přijatá odpověď:
Ctrl+M odešle stejný znak (RET) jako klávesa Enter v terminálu. Programy je nemají jak rozlišit, takže tyto klávesy nelze konfigurovat samostatně.
Ctrl+Q se již používá pro XON ve výchozím nastavení, takže ji nemůže používat Bash, ale měli byste ji stále moci používat v tmux, protože tmux používá režim raw input.
Program GUI mohl z klávesnice přečíst, že klávesa m byla stisknuta s modifikátorem Ctrl a použít Ctrl+m jako zkratku, ale shell nebo jakýkoli terminálový program přijímá kombinace Ctrl+Key stejně jako znaky ASCII od 0 do 26
[email protected] = 0
Ctrl+A = 1
Ctrl+B = 2
a tak dále. Můžete to zkusit a zobrazit hodnoty
cat ctrlkeys <<EOF
^A^B^C^D^E^F
EOF
od -c ctrlkeys
0000000 001 002 003 004 005 006 n
Chcete-li zadat hodnoty, stiskněte Ctrl+v před Ctrl+[a-f], aby byly neinterpretované jako nezpracovaná hodnota.
Když se podíváte na tabulku ascii(7), můžete vidět řídicí kódy v tabulce s odpovídajícími znaky @..Z vlevo. Například
015 13 0D CR 'r' (carriage ret) 115 77 4D M
nebo
011 9 09 HT 't' (horizontal tab) 111 73 49 I
Další vrstva, která interpretuje řídicí kódy před bash, je stty (změnit a vytisknout nastavení terminálu)
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;
viz stty(1) pro významy lnext
nebo start
a stop
.
Viz také readline(3), protože bash a další programy GNU cli používají tuto knihovnu k ovládání vstupních řádků a samozřejmě bash(1) /READLINE, sekci readline manuálové stránky bash.
Související:Uzavření vs neuzavření hodnoty proměnné do uvozovek v bash?
Poznámka:XYZ(NUM) znamená manuálovou stránku XYZ ze sekce NUM, takže výsledek man NUM XYZ
.