Na przykład:
"\e[1;5C"
"\e[Z"
"\e-1\C-i"
Znam tylko bity i fragmenty, takie jak \e
stand for escape i C-
for Ctrl, ale jakie są te liczby ( 1
) i litery ( Z
)? Jakie są ;
, [
i -
znaki dla?
Czy jest tylko próba i błąd, czy też jest pełna lista kodów kluczy bash i wyjaśnienie ich składni?
bind -p
.Odpowiedzi:
Są to sekwencje znaków wysyłane przez twój terminal po naciśnięciu danego klawisza. Nie ma nic wspólnego z bashem lub readline per se, ale będziesz chciał wiedzieć, jaką sekwencję znaków wysyła dany klawisz lub kombinacja klawiszy, jeśli chcesz skonfigurować
readline
działanie po naciśnięciu danego klawisza.Po naciśnięciu Aklawisza generalnie terminale wysyłają
a
znak (0x61). Jeśli naciśniesz<Ctrl-I>
lub<Tab>
, wtedy ogólnie wyślij^I
znak znany również jakoTAB
lub\t
(0x9). Większość klawiszy funkcyjnych i nawigacyjnych generalnie wysyła ciąg znaków rozpoczynający się od^[
(control- [), znany również jakoESC
lub\e
(0x1b, ósemkowy 033), ale dokładna sekwencja różni się w zależności od terminalu.Najlepszym sposobem, aby dowiedzieć się, co klawisz lub kombinacja klawiszy wysyła do terminala, jest uruchomiona
sed -n l
i wpisz ją, a następnie wpisz Enterna klawiaturze. Wtedy zobaczysz coś takiego:Pierwsza linia jest spowodowana przez lokalny terminal
echo
wykonany przez urządzenie końcowe (może nie być wiarygodny, ponieważ wpłyną na to ustawienia urządzenia końcowego).Drugi wiersz jest wyprowadzany przez
sed
.$
Nie ma być włączone, to tylko, aby pokazać, gdzie koniec linii jest.Powyżej Oznacza to, że Ctrl-Up(co mam wciśnięty) wysłać 6 znaków
ESC
,[
,1
,;
,5
iA
(0x1b 0x5b 0x31 0x35 0x41 0x3b)Baza
terminfo
danych rejestruje szereg sekwencji dla wielu wspólnych kluczy dla pewnej liczby terminali (na podstawie$TERM
wartości).Na przykład:
Powie Ci, jaką sekwencję ucieczki wysyła się
rxvt
po naciśnięciu Deleteklawisza.Możesz sprawdzić, który klucz odpowiada danej sekwencji z bieżącym terminalem za pomocą
infocmp
(tutaj przy założeniuncurses
infocmp):Kombinacje klawiszy, takie jak Ctrl-Up, nie mają odpowiednich wpisów w
terminfo
bazie danych, więc aby dowiedzieć się, co wysyłają, przeczytaj źródło lub dokumentację odpowiedniego terminala lub wypróbuj je za pomocąsed -n l
metody opisanej powyżej.źródło
\e-1\C-i
jest to zakładka do tyłu, ponieważcontrol
ii
wstawia zakładkę, aescape
następnie-1
mówi bash, aby zrobić to raz do tyłu (przeszukałem to i znalazłem kilka rzeczy na tematdigit-arguments
).$ sed -n 1
sed: -e expression #1, char 1: missing command
tput smkx
, twój terminal wysyła\e[OD
(kcub1
) i potput rmkx
,\e[D
(cub1
ten sam kod co sekwencja, która przesuwa kursor w lewo, tak że echo tych klawiszy porusza kursorem. Spróbujstty -echoctl; tput rmkx; sleep inf
i zobaczysz klawisze strzałek poruszają kursorem, gdy nie są w trybie klawiatury ).Jest on dostarczany za pośrednictwem biblioteki readline gnu. powinieneś zajrzeć do read3 man 3, aby znaleźć jego opis.
Wygląda na to, że potrzebujesz również informacji o tym, co oznaczają kody escspe
\[A
. Te informacje można znaleźć w Wikipedii ANSI esacape code article.źródło
\[A
znajduje się w tabeli „Kody CSI” w wierszu: „CSI n A”[Z
,[1;5C
albo-1
?Czy te kody pochodzą z tego samego źródła? Ostatni wygląda jak powiązanie readline GNU. To jest to, co użytkownik wysyła na bash (patrz odpowiedź Rusha). Pierwsze dwa wyglądają jednak bardziej jak końcowe sekwencje kontrolne (chociaż pierwsza byłaby źle sformułowana). To właśnie bash lub inny program odsyła z powrotem do emulatora terminala w celu kontrolowania ruchów kursora, kolorów tekstu i tym podobnych.
źródło
Najłatwiejszym sposobem, jaki udało mi się sprawdzić, która sekwencja Escape jest generowana przez klawisz lub kombinację klawiszy, jest naciśnięcie Ctrl+ vw terminalu, a następnie naciśnięcie klawisza / kombinacji, o której chcesz wiedzieć.
Dostaniesz sekwencję jak
^[Oa
i będziesz musiał tłumaczyć^[
się\e
lub\033
lub\x1b
lub jakiejkolwiek innej reprezentacji swoich kombinacja klawiszy oczekuje systemowe dla znaku ucieczki.Zaczęło się od nazwanej funkcji Emacsa,
quoted-insert
a ponieważ domyślne skróty klawiszowe dla Bash i Zsh naśladują Emacsa, również ją skopiowali.Bash pobiera to poprzez bibliotekę wejściową GNU Readline, z której korzystają także inne rzeczy, takie jak
import rlcompleter
ulepszenie Pythona .Oto opis z podręcznika Readline :
To powinno działać we wszystkim opartym na GNU Readline.
Jeśli chodzi o Zsh, który korzysta z własnej alternatywy o nazwie ZLE, to honoruje tylko oryginalne
C-q
wiązanie Emacsa w trybie Vi, wystarczająco ironicznie, aleC-v
nadal działa w domyślnym trybie wprowadzania podobnym do Emacsa. (Szukajquoted-insert
wzshzle
lub zshall` manpages i thesecond parę wyników powinna domyślnej listy keybinds).Jeśli chodzi o mnemonik, radzę myśleć o Ctrl+ vjako pytaniu o to v erbatim.
źródło