Po naciśnięciu AltUp, A
drukowane na ekranie terminala. To samo stało się, gdy nacisnąłem, AltDownale B
zamiast tego jest drukowane.
Inne postacie, które zrozumiałem;
AltLeft= D
i AltRight=C
Jaki jest cel tych poleceń?
źródło
Po naciśnięciu AltUp, A
drukowane na ekranie terminala. To samo stało się, gdy nacisnąłem, AltDownale B
zamiast tego jest drukowane.
Inne postacie, które zrozumiałem;
AltLeft= D
i AltRight=C
Jaki jest cel tych poleceń?
W zależności od konfiguracji terminala pisanie Alt+Keyprzypomina sekwencję klawiszy Esci Key, więc wysyła znak ESC (aka \e
lub ^[
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[A
albo w \033OA
zależ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 bar
napisane po foo
jednym rzędzie. Jeśli zrobisz:
stty -echoctl; tput rmkx; read foo
Zobaczysz, że klawisze strzałek poruszają kursorem.
Gdy aplikacja lubi zsh
lub vi
odczytuje tę sekwencję znaków z terminala, interpretuje ją jako akcję „w górę”, ponieważ wie z bazy danych terminfo ( kcuu1
możliwość), że jest to sekwencja ucieczki wysłana po naciśnięciu Up.
Teraz, Alt-Uppewne zaciski, jak rxvt
i jego pochodne, takie jak eterm
wysyłanie \033
następnie przez sekwencję ewakuacji Up(czyli \033\033[A
albo \033\033OA
), podczas gdy inne, takie jak xterm
i gnome-terminal
oddzielne sekwencje ucieczki dla tego rodzaju kluczy, gdy stosuje się mieszaninę, przycisków Alt, Shift, Ctrl.
Ci zazwyczaj wysyłać \033[1;3A
na 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[A
czy \033[1;3A
wiele 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ę. bash
na przykład będzie interpretować \033[1;3
jako 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[1
więc pominie to i przeczyta resztę: ;3A
i wstawi to do edytora liniowego.
Wiele aplikacji takich jak vi
, zsh
lub readline
te, oparte podobne gdb
lub bash
(choć uwaga bash
używa zmodyfikowanej wersji readline
) pozwalają na dodawanie wiązania dla dowolnego ciągu znaków.
Na przykład w zsh
moż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ń.
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 [[B
wartoś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;3C
jest 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
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, bash
oczekują, ż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ć jakosmm
irmm
.
bash
też 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 xterm
wprowadzenia 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 xterm
tworzony 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:
Niewiele programów zrobiłoby pierwsze; Niektóre edytory tekstowe zrobi drugi (rzeczywiście, zrobiłem to dla ded
na koniec 1980 ). Deweloperzy aplikacji, takich jak bash
trzecia, 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. xterm
robi to dla funkcji zapytania tcap , zapewniając vim
faktyczne przypisania klawiszy funkcyjnych.
Ponieważ żaden z łańcuchów, który bash
porównuje z pasującymi do nich ciągami, może się pomylić, przyjmując częściowe dopasowania (takie jak sam znak ucieczki).
Dalsza lektura: