Gdzie znajdę listę kodów klawiszy terminala, aby zmienić mapowanie skrótów w bash?

42

Na przykład:

"\e[1;5C"
"\e[Z"
"\e-1\C-i"

Znam tylko bity i fragmenty, takie jak \estand 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?

pluskwa
źródło
2
Dodatkową wskazówką dotyczącą wyświetlania rzeczywistych powiązań readline dla powłoki jest bind -p.
1
Większość takich kodów jest interpretowana przez twój terminal; przeczytaj o kodach ucieczki ANSI na Wikipedii, aby uzyskać dużą listę.
chepner
stty -a wyświetla ustawienia linii terminala
błąd

Odpowiedzi:

52

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ć readlinedziałanie po naciśnięciu danego klawisza.

Po naciśnięciu Aklawisza generalnie terminale wysyłają aznak (0x61). Jeśli naciśniesz <Ctrl-I>lub <Tab>, wtedy ogólnie wyślij ^Iznak znany również jako TABlub \t(0x9). Większość klawiszy funkcyjnych i nawigacyjnych generalnie wysyła ciąg znaków rozpoczynający się od ^[(control- [), znany również jako ESClub \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 li wpisz ją, a następnie wpisz Enterna klawiaturze. Wtedy zobaczysz coś takiego:

$ sed -n l
^[[1;5A
\033[1;5A$

Pierwsza linia jest spowodowana przez lokalny terminal echowykonany 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, ;, 5i A(0x1b 0x5b 0x31 0x35 0x41 0x3b)

Baza terminfodanych rejestruje szereg sekwencji dla wielu wspólnych kluczy dla pewnej liczby terminali (na podstawie $TERMwartości).

Na przykład:

TERM=rxvt tput kdch1 | sed -n l

Powie Ci, jaką sekwencję ucieczki wysyła się rxvtpo naciśnięciu Deleteklawisza.

Możesz sprawdzić, który klucz odpowiada danej sekwencji z bieżącym terminalem za pomocą infocmp(tutaj przy założeniu ncursesinfocmp):

$ infocmp -L1 | grep -F '=\E[Z'
    back_tab=\E[Z,
    key_btab=\E[Z,

Kombinacje klawiszy, takie jak Ctrl-Up, nie mają odpowiednich wpisów w terminfobazie 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 lmetody opisanej powyżej.

Stéphane Chazelas
źródło
To świetne wytłumaczenie, dzięki! Teraz wszystko układa się na swoim miejscu, \e-1\C-ijest to zakładka do tyłu, ponieważ controli iwstawia zakładkę, a escapenastępnie -1mówi bash, aby zrobić to raz do tyłu (przeszukałem to i znalazłem kilka rzeczy na temat digit-arguments).
błąd
$ sed -n 1 sed: -e expression #1, char 1: missing command
cnvzmxcvmcx
3
@vib. To mała litera L, a nie cyfra 1
Stéphane Chazelas,
1
@ user367890, to zależy od trybu klawiatury . Prawdopodobnie przekonasz się, że po tput smkx, twój terminal wysyła \e[OD( kcub1) i po tput rmkx, \e[D( cub1ten sam kod co sekwencja, która przesuwa kursor w lewo, tak że echo tych klawiszy porusza kursorem. Spróbuj stty -echoctl; tput rmkx; sleep infi zobaczysz klawisze strzałek poruszają kursorem, gdy nie są w trybie klawiatury ).
Stéphane Chazelas,
1
@ user367890, z tego co Thomas (opiekun ncurses i xterm) w odpowiedzi na link, tak, powinno działać. tryb klawiatury lub tryb aplikacji odnoszą się do tej samej rzeczy, więc (ponownie, według Thomasa) kluczowe specyfikacje w bazie danych terminfo są dostępne, gdy smkx jest włączony.
Stéphane Chazelas
4

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.

wysypka
źródło
To nie wyjaśnia moich przykładów.
błąd
Wygląda na to, że było to małe niezrozumiane. Proszę spojrzeć na aktualizację odpowiedzi.
pędzi
W artykule nie ma informacji o moich konkretnych przykładach. Wyszukiwanie strony „[A” również niczego nie zwróciło.
błąd
1
@ bug proszę uważnie przeczytać artykuł. \[Aznajduje się w tabeli „Kody CSI” w wierszu: „CSI n A”
kurs z
Dzięki spieszyć, ale gdzie mogę znaleźć wyjaśnienia na temat [Z, [1;5Calbo -1?
błąd
3

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.

Uwe
źródło
Znalazłem „\ e [1; 5C”, który ma być używany do przesuwania słów w przód i ctrl, oraz „\ e [Z” i „\ e-1 \ Ci” w przypadku menu kompletnego do tyłu w innych ćwiczeniach. Wszystkie zostały użyte w pliku .inputrc.
błąd
OK, jeśli są interpretowane przez readline, to musi istnieć emulator terminala, w którym te sekwencje kontrolne są powiązane z jakąś kombinacją ctrl, alt i / lub shift za pomocą klawiszy funkcyjnych lub strzałek. (Nie wiem, który z nich.)
Uwe
0

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 ^[Oai będziesz musiał tłumaczyć ^[się \elub \033lub \x1blub jakiejkolwiek innej reprezentacji swoich kombinacja klawiszy oczekuje systemowe dla znaku ucieczki.

Zaczęło się od nazwanej funkcji Emacsa, quoted-inserta 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 rlcompleterulepszenie Pythona .

Oto opis z podręcznika Readline :

quoted-insert( C-qlub C-v)

Dodaj kolejny wpisany znak do wiersza dosłownie. Oto jak wstawić sekwencje klawiszy C-q, na przykład.

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-qwiązanie Emacsa w trybie Vi, wystarczająco ironicznie, ale C-vnadal działa w domyślnym trybie wprowadzania podobnym do Emacsa. (Szukaj quoted-insertw zshzlelub 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.

ssokolow
źródło