Zastanawiam się dlaczego Shift+ Arrow Keywynik w jednym z A
, B
, C
lub D
liter.
Dlaczego nie inne litery? Dlaczego w ogóle jakiś list?
command-line
Dan
źródło
źródło
Shift + Arrow Keys
nic nie robi.Odpowiedzi:
Emulatory terminali, takich jak
gnome-terminal
( „Terminal” w Ubuntu), ale takżexterm
iurxvt
są nazywane „emulatory”, ponieważ odtworzyć zachowanie starszych terminali, które były tylko wyświetlacz komputera. Takie terminale komunikowały się z komputerem za pomocą protokołu tekstowego i początkowo zostały zaprojektowane tak, aby odbierać tylko tekst. Szybko potrzebna była większa kontrola: jak usunąć linię? Używasz kolorów? Lub zmienić pozycję kursora?Źródło: The Art of Unix Usability - Interfejsy wiersza poleceń
Sekwencje specjalne zostały zaprojektowane dla każdego terminalu, aby robić takie rzeczy. Są one nazwane ucieczka ponieważ zaczynają się kodem ASCII ucieczki:
33
. Nie ma sposobu, aby wydrukować taki znak bezpośrednio, co sprawia, że dobrze pasuje do takich sekwencji. Kiedy nadal chcemy wyświetlać ten znak,^[[
jest używany i tego właśnie użyję w moich objaśnieniach.Kiedy terminal otrzymał
^[[A
, nie oznaczało to „print ^ [[A”, ale „użytkownik nacisnął klawisz strzałki w górę”). „A” tutaj jest całkowicie arbitralne: to akurat list, na który wszyscy się zgodzili, ponieważ właśnie tego używał DEC VT-52 i jego następca popularny terminal VT-100.Źródło: DEC VT-52 Maintenance Manual 1976
Jest to nadal sposób, w jaki dziś działają emulatory terminali: w zależności od
$TERM
zmiennej nazwa bazy danychterminfo
odpowiada za określenie , jakie kody należy wysłać do powłoki (bash, sh, zsh ...), która jest następnie odpowiedzialna za ich zrozumienie i zareagowanie do nich.Teraz kod Shift+ upjest następujący
^[[1;2A
: emulator terminala wysyła ten kod do powłoki, która próbuje interpretować,^[[1;2
ale niczego nie wyświetla, ponieważ nie wie o tej sekwencji ucieczki. AleA
jest pozostawiony i wyświetlony.źródło
^[[A
mają sens, kiedy klikam klawisze strzałek, gdy proces jest uruchomiony na terminalu.cat >/dev/null
a następnie wpisać i nacisnąć Ctrl + C (lub Enter, a następnie Ctrl + D) po zakończeniu.