Mam następujący wiersz init.el
:
(global-set-key [(control \;)] 'comment-region)
Działa bardzo dobrze w oknie GUI, ale jeśli emacs
zostanie wywołane z tą -nw
opcją C-;, nie komentuje regionu, tylko wstawia ;
znak. M-x comment-region RETdziała jednak dobrze.
Próbowałem postępować zgodnie z tą odpowiedzią na podobny problem, ale C-q C-;po prostu powraca ;
i oczywiście nie chcę się wiązać ;
.
Jak osiągnąć pożądany efekt?
key-bindings
terminal
WeSenseASoulInSearchOfAnswers
źródło
źródło
C-;
kombinacji, a następnie użyj,M-x view-lossage
aby sprawdzić, czy w ogóle dociera do Emacsa.gnome-terminal
iM-x view-lossage
zwraca:ESC [ > 1 ; 2 8 0 2 ; 0 c ; ESC x v i e w - l o s s a g e RET
C-;
raczej niżc ;
(a przynajmniej dostajęC-;
).Odpowiedzi:
Po pierwsze, bardziej ogólny problem: emulatory terminali są często ograniczone w sekwencjach kontrolnych i sekwencjach ucieczki, które mogą wysłać. Tak więc: może się zdarzyć, że terminal połknie twoje znaki specjalne, zanim dotrą do Emacsa. Jako ogólną diagnostykę możesz nacisnąć
C-h l
(lubM-x view-lossage
), aby sprawdzić, czy twoje kombinacje klawiszy przekształcają się w Emacsa.Aby uzyskać więcej informacji na ten temat, zapoznaj się z tym wątkiem Przepełnienie stosu i znajdującymi się tam linkami.
Podsumowując komentarze w przód i w tył, twój konkretny problem sugeruje, że problemem jest terminal, a nie Emacs. Kiedy próbujesz,
C-;
a potemM-x view-lossage
maszblah blah blah c ; ESC v i e w - l o s s a g e RET
. To wygląda na problem końcowy: gdyby kombinacja klawiszy dotarła do Emacsa,c ;
część wyglądałaby takC-;
.źródło
W Shift + Up nie jest rozpoznawany przez Emacsa w terminalu Wyjaśniam, jak terminale tłumaczą większość klawiszy funkcyjnych na sekwencje specjalne, ponieważ interfejs między aplikacjami a terminalami przesyła znaki (a raczej bajty), a nie klucze. Tylko kilka kombinacji modyfikatora + postaci ma swój własny charakter:
@[\]^_
zamienia się w bajty 0–31 (znaki sterujące ASCII ).A co z innymi kombinacjami, takimi jak Ctrl+ ;lub Ctrl+ Shift+ letter? Ponieważ nie ma odpowiedniego znaku, terminal musi albo ponownie użyć znaku, albo wysłać sekwencję zmiany znaczenia. Wiele terminali ignoruje modyfikatory, gdy nie ma odpowiedniego znaku, więc kończy się na Ctrl+ ;wysyłaniu
;
, Ctrl+ Shift+ letterrównoważnym Ctrl+ letteritp.Dostawcy terminali przez długi czas robili tę prostą rzecz. Nie było standardu dla sekwencji ucieczki, który byłby samonapędzający się - dostawcy terminali go nie implementują, aplikacje nie obsługują go, użytkownicy tego nie oczekują. Niektóre emulatory terminali można skonfigurować tak, aby wysyłały dowolne sekwencje specjalne, więc jeśli możesz, możesz je skonfigurować i zadeklarować sekwencje specjalne Emacsowi (więcej na ten temat później).
Ostatnio sytuacja się zmienia, ponieważ pojawiły się dwie propozycje standaryzacji sekwencji ucieczki. Jednym z nich jest libtermkey LeoNerda ze składnią . Kolejnym jest xterm Thomasa Dickeya ze składnią . Obecne wersje xterm (≥216) można skonfigurować dla dowolnej składni przez ustawienie zasobu; funkcja musi zostać aktywowana poprzez ustawienie wartości niezerowej.
ESC [ codepoint ; modifier u
ESC [ 2 7 ; modifier ; codepoint ~
formatOtherKeys
modifyOtherKeys
Jeśli emulator terminala nie obsługuje tych składni, ale można go skonfigurować, wybierz jedno z nich.
Od Emacsa 24.4 Emacs automatycznie włącza tę
modifyOtherKeys
funkcję, gdy wykryje, że terminal jest w wersji xterm ≥216. Wykrywanie przez Emacsa sekwencji ucieczki do kodowania kluczy działa poprzez zmiennąlocal-function-key-map
. Począwszy od Emacsa 24.4, nie wszystkie sekwencje specjalne są obsługiwane. Możesz użyć następującego kodu w pliku init, aby ukończyć zadanie.Jeśli
TERM
zmienna środowiskowa nie jest ustawiona naxterm
lub wariant taki jakxterm-256color
, Emacs nie aktywuje tych sekwencji. Jeśli Emacs ma już wsparcie dla twojej wartościTERM
, możesz dodać wsparcie definiując funkcję podobną do powyższej, która ma być wykonywana po załadowaniu pliku Lisp, którego nazwa jest wartościąTERM
. Jeśli Emacs nie ma takiego wsparcia, możesz go dodać, tworząc podkatalog wywoływanyterm
gdzieś w twoimload-path
, i tworząc plik Lisp o nazwieterm/$TERM.el
gdzie$TERM
jest wartośćTERM
, definiując wywoływaną funkcjęterminal-init-$TERM
.Jak piszę, wydaje się, że niewiele emulatorów terminali innych niż xterm przyjęło te sekwencje specjalne. W OSX można skonfigurować iTerm2 , wybierając sekwencję zmiany znaczenia dla każdej kombinacji klawiszy, jeden po drugim.
źródło
M-C-%
być rozpoznanymESC 5
modifyOtherKeys
funkcja nie jest aktywna. Pamiętaj, że jest obsługiwany tylko w wystarczających wersjach xterm i jest aktywowany automatycznie od Emacsa 24.4. Nie wiem, czy OSX jest dostarczany z najnowszymi wersjami. Jeśli to nie działa i nie działa dla ciebie, proponuję zadać nowe pytanie. Wymień używane wersje.Odpowiedź Gillesa brzmiała:
On OSX, you can configure iTerm2 by selecting an escape sequence for each key combination, one by one.
Miałem trochę problemów z dotarciem, więc tutaj szczegółowe wyjaśnienie na wypadek, gdybyś był taki jak ja, zdezorientowany.Jeśli podczas uruchamiania Emacsa w terminalu (np. Domyślnym Terminal.app dla Maca)
C-x C-;
nie działacomment-line
i chcesz tę funkcjonalność, musisz przełączyć się na iTerm2 (Terminal.app nie ma takiej możliwości) i utworzyć mapowanie klawiszy w obszarze Profile ... Następujące klucze :Dokonuje się tego poprzez kliknięcie
+
przycisku, który wyświetla małe okno o nazwie „Skrót klawiaturowy”; to okno ma początkowo dwa pola; góra ma wartość „Kliknij, aby ustawić”, a dół ma wartość „Ignoruj”. Kliknij górny przycisk i wpiszC-;
. Ustawia to kombinację klawiszy, która uruchomi akcję i kod. Kliknij dolne pole „Akcja”, a następnie znajdź i kliknij „Wyślij sekwencję ucieczki”, która znajduje się nieco ponad połowę. Po kliknięciu pojawi się trzecie pole o nazwie „Esc +”. W tym polu wpisz:Jest
59
to dziesiętny kod ASCII przecinka i5
jest to kod dlaCtrl
. Następnie naciśnij „OK”, aby zakończyć. Prawidłowa kombinacja klawiszy do sekwencji klawiszy będzie teraz uwzględniona w preferencjach iTerm2. Po uruchomieniu Emacsa w iTerm będziesz mieć dostęp doC-x C-;
funkcjonalności.źródło