Jakie znaki są drukowane po naciśnięciu klawiszy Alt + Strzałka?

13

Po naciśnięciu AltUp, Adrukowane na ekranie terminala. To samo stało się, gdy nacisnąłem, AltDownale Bzamiast tego jest drukowane.

Inne postacie, które zrozumiałem;

AltLeft= Di AltRight=C

Jaki jest cel tych poleceń?

yfklon
źródło

Odpowiedzi:

14

W zależności od konfiguracji terminala pisanie Alt+Keyprzypomina sekwencję klawiszy Esci Key, więc wysyła znak ESC (aka \elub ^[lub \033), a następnie znak lub sekwencję znaków wysyłanych po naciśnięciu Key.

Po naciśnięciu Upwiększość emulatorów terminali wysyła albo trzy znaki, \033[Aalbo w \033OAzależności od tego, czy są one w trybie klawiatury aplikacji, czy nie.

Pierwszy odpowiada sekwencji ucieczki, która po wysłaniu do terminala przesuwa kursor w górę. Jeśli zrobisz:

printf '\nfoo\033[Abar\n\n'

Zobaczysz barnapisane po foojednym rzędzie. Jeśli zrobisz:

stty -echoctl; tput rmkx; read foo

Zobaczysz, że klawisze strzałek poruszają kursorem.

Gdy aplikacja lubi zshlub viodczytuje tę sekwencję znaków z terminala, interpretuje ją jako akcję „w górę”, ponieważ wie z bazy danych terminfo ( kcuu1możliwość), że jest to sekwencja ucieczki wysłana po naciśnięciu Up.

Teraz, Alt-Uppewne zaciski, jak rxvti jego pochodne, takie jak etermwysyłanie \033następnie przez sekwencję ewakuacji Up(czyli \033\033[Aalbo \033\033OA), podczas gdy inne, takie jak xtermi gnome-terminaloddzielne sekwencje ucieczki dla tego rodzaju kluczy, gdy stosuje się mieszaninę, przycisków Alt, Shift, Ctrl.

Ci zazwyczaj wysyłać \033[1;3Ana Alt-Up.

Po wysłaniu do terminala sekwencja ta spowoduje również przesunięcie kursora w górę (drugi parametr (3) jest ignorowany). Nie ma odpowiedniego klawisza klawiatury , więc jest to ta sama sekwencja wysyłana Alt-Upw trybie klawiatury aplikacji lub poza nią .

Teraz, czy to jest, \033\033[Aczy \033[1;3Awiele aplikacji nie wie, do czego służą te sekwencje. Baza danych terminfo nie pomoże im, ponieważ nie ma takiej możliwości, która określa, jakie znaki wysyłają te kombinacje klawiszy.

Postarają się jak najlepiej zinterpretować tę sekwencję. bashna przykład będzie interpretować \033[1;3jako sekwencję ucieczki, nic o tym nie wie, więc nic nie robi, a następnie A. zsh, przestanie czytać, gdy tylko dowie się, że nie ma znanej pasującej sekwencji znaków. Nie ma sekwencji ucieczki, o której wie, że zaczyna się od, \033[1więc pominie to i przeczyta resztę: ;3Ai wstawi to do edytora liniowego.

Wiele aplikacji takich jak vi, zshlub readlinete, oparte podobne gdblub bash(choć uwaga bashużywa zmodyfikowanej wersji readline) pozwalają na dodawanie wiązania dla dowolnego ciągu znaków.

Na przykład w zshmożesz chcieć powiązać Alt-Up, na Alt-Downprzykład:

bindkey '\e[1;3A' history-beginning-search-backward
bindkey '\e[1;3B' history-beginning-search-forward

Mają one przeszukiwać historię do tyłu i do przodu w poszukiwaniu linii poleceń, które zaczynają się od bieżącej aż do bieżącej pozycji kursora, co jest całkiem przydatne do przywołania poprzednich poleceń.

Stéphane Chazelas
źródło
3

Możesz użyć Crtl+, vaby zwrócić kody wejściowe klawiatury. Jeśli to zrobisz, za pomocą klawiszy strzałek, dostaniesz [[D^, [[C^, [[A^i [[Bwartości. Nie ma żadnych domyślnych powiązań dla Altklawiszy strzałek +, więc wygląda na to, że wykonane działanie powoduje wydrukowanie samego kodu literowego. Jednak jeśli utworzysz lokalną wersję pliku konfiguracyjnego biblioteki readline:

$ cp /etc/inputrc ~/.inputrc

I dodaj linię:

"\e[1;3C": "sometexthere"

Gdzie [1;3Cjest kod wejściowy Alt+ (można go uzyskać tak samo, jak przed użyciem skrótu Crtl+ v) i zrestartować terminal, Crtl+ skrót zwróci ci tekst „gdzieś”, a inne Altskróty + przestaną zwracać znaki.

Zamiast tekstu możesz przekazać wiążące polecenie z http://www.gnu.org/software/bash/manual/html_node/Bindable-Readline-Commands.html#Bindable-Readline-Commands jak

"\e[1;3C": unix-line-discard

aby mieć taki sam efekt jak Crtl+ u(usuń wiersz).

Więcej informacji tutaj: http://cnswww.cns.cwru.edu/php/chet/readline/readline.html

Nykakin
źródło
3

AltKlucz jest często używany jako meta modyfikatora. Klawisze kursora i klawisze funkcyjne są nazywane klawiszami specjalnymi, ponieważ mogą wysyłać wiele znaków, a wysyłane znaki można zmieniać.

Niektórzy użytkownicy, na przykład, bashoczekują, że naciśnięcie Altspowoduje wysłanie klawisza poprzedzonego znakiem zmiany znaczenia. Udokumentowana funkcja „meta” (patrz terminfo(5)) dotyczy ósmego bitu:

Jeśli terminal ma „meta-klawisz”, który działa jak klawisz Shift, ustawiając 8-ty bit dowolnego przesyłanego znaku, fakt ten można wskazać za pomocą km. W przeciwnym razie oprogramowanie przyjmie, że ósmy bit jest parzysty i zwykle zostanie wyczyszczony. Jeśli istnieją ciągi do włączania i wyłączania tego „trybu meta” , można je podać jako smmi rmm.

bashteż o tym wie (patrz FAQ ncurses ), ale niewielu jego użytkowników jest zainteresowanych tą funkcją. Niemniej jednak są przyzwyczajeni do określania się Altmianem „meta”, nawet jeśli tryb meta jest wyłączony. Zarówno rxvt, jak i xterm mają tę funkcję od (przynajmniej) wczesnych lat 90.

Inni użytkownicy (od momentu xtermwprowadzenia funkcji w łatce # 94, 1999 ) mogą oczekiwać, że informacje o modyfikatorze zostaną zakodowane jako parametr w sekwencji znaków wysyłanych przez specjalny klucz. Dokumentacja XTerm określała te zmodyfikowane klawisze jako klawisze funkcyjne typu „PC” , aby odróżnić je od „stylu VT220” (który nie miał modyfikatorów). Niezmodyfikowany klawisz kursora może wysłać ESC[A, ale dopuszcza się także parametr , np. ESC[5AKtóry aplikacja powinna rozumieć jako powtarzanie go pięć razy. Pierwsza wersja xterm„S typu PC klucze używane, że«5»do oznaczeniacontrol, a późniejsza wersja zmieniła go, aby uniknąć pomyłek z liczbą powtórzeń. Więc...

ESC[5A

sugeruje, że aplikacja przesuwa kursor w górę o 5 wierszy, natomiast

ESC[1;5A

sugeruje, aby przesunął się o jeden wiersz w górę, informując aplikację o controlnaciśnięciu klawisza.

Przydatne kombinacje znajdują się w bazie danych terminfo ncurses od 2004 roku :

# 2004-07-17
#       * add xterm-pc-fkeys -TD

Baza danych terminfo pokazuje aktualną wersję xterm + pcfkeys z komentarzem pokazującym sposób kodowania modyfikatorów:

# This fragment describes as much of XFree86 xterm's "pc-style" function
# keys as will fit into terminfo's 60 function keys.
# From ctlseqs.ms:
#    Code     Modifiers
#  ---------------------------------
#     2       Shift
#     3       Alt
#     4       Shift + Alt
#     5       Control
#     6       Shift + Control
#     7       Alt + Control
#     8       Shift + Alt + Control
#  ---------------------------------
# The meta key may also be used as a modifier in this scheme, adding another
# bit to the parameter.

(Alt i meta niekoniecznie są tym samym kluczem). Jest to blok konstrukcyjny (z kolei złożony z innych bloków konstrukcyjnych), z którego xtermtworzony jest opis terminala. Wykorzystuje rozszerzenie dostarczone w ncurses od 1999 roku, które pozwala na nazwy zdefiniowane przez użytkownika. Ponieważ termcap obsługuje tylko nazwy 2-znakowe i 1023-bajtowe opisy, nie było powodu, aby udostępniać te rozszerzone nazwy za pośrednictwem interfejsu termcap . Są łatwo dostępne dla aplikacji korzystających z interfejsu terminfo .

Teraz pojawia się trudność: istnieje kilka sposobów na określenie przez aplikację, co reprezentuje taka sekwencja klawiszy:

  1. całkowicie przeanalizuj sekwencję znaków
  2. częściowo go przeanalizuj i wyrzuć controlmodyfikator, jeśli nie jest potrzebny
  3. po prostu porównaj sekwencję znaków ze słownikiem, mając nadzieję na określenie znaczenia w ten sposób.

Niewiele programów zrobiłoby pierwsze; Niektóre edytory tekstowe zrobi drugi (rzeczywiście, zrobiłem to dla dedna koniec 1980 ). Deweloperzy aplikacji, takich jak bashtrzecia, wybrali trzecią trasę, zakładając, że większość informacji znajduje się w termcap . Alternatywnie mogliby zrobić tabelę z informacjami termcap / terminfo i użyć interfejsu, który dał najlepsze informacje. xtermrobi to dla funkcji zapytania tcap , zapewniając vimfaktyczne przypisania klawiszy funkcyjnych.

Ponieważ żaden z łańcuchów, który bashporównuje z pasującymi do nich ciągami, może się pomylić, przyjmując częściowe dopasowania (takie jak sam znak ucieczki).

Dalsza lektura:

Thomas Dickey
źródło