Chcę sprawić, by Control-i
grała indent-region
(w zasadzie odkąd Xcode już zbudował tę pamięć mięśniową).
Zdaję sobie z tego sprawę Control-i
i tab
są nierozróżnialne w sensie Ascii, ale są w sensie klucza.
Próbowałem oczywistego:
(global-unset-key (kbd "C-i"))
(global-set-key (kbd "C-i") 'indent-region)
bezskutecznie - naciśnięcie Control-i
nadal robi tylko to, co tab
robi klawisz w bieżącym kontekście. Czy jest coś, co mogę zrobić, aby pomóc Emacsowi potraktować przycisk Tab inaczej niż Control-i
?
Aktualizacja: Wydaje mi się, że równoważny wynik zostałby osiągnięty dzięki możliwości zmiany mapowania działania prasy tab
/ Control-i
po wybraniu regionu.
Odpowiedzi:
Nie sądzę, że można to osiągnąć z terminala, ale w trybie GUI można spróbować:
Robię to samo,
C-m
aby można było je odróżnićRET
EDYTOWAĆ:
Poniższe czynności powinny działać niezależnie od tego, czy jesteś w trybie GUI czy TTY:
To nie jest ładne, ale wydaje się, że wykonuje swoją pracę. Z zadowoleniem przyjmuję wszelkie poprawki lub zmiany w tym kodzie, jeśli to konieczne.
źródło
<C-i>
i[C-i]
mógł być dowolnym identyfikatorem, takim jak<foobar>
i[foobar]
, i nadal działałoby; po prostu nie nazywaj tegotab
lubbackspace
.emacs
pliku, ale zarównoTAB
iC-i
jest remapped :-( @nispio(window-system)
wróciłnil
w momencie.emacs
załadowania. Może to być spowodowane tym, że korzystasz z graficznej instancji Emacsa lub z powodu demona Emacsa.Ramki GUI
W ramkach GUI (X11, Windows, OSX,…) Emacs odczytuje Tabklawisz jako
tab
klawisz funkcyjny. Ponieważ jednak Tabklawisz terminali tradycyjnie wysyła znak^I
( Control + I), Emacs tłumaczytab
klawisz funkcyjny na znak Control + I (znak 9), który jest wyświetlany jakoTAB
. Tłumaczenie odbywa się za pośrednictwemfunction-key-map
.Podobne tłumaczenie dzieje się z niektórymi innymi klawiszami funkcyjnymi. ( Backspacei Deletesą drażliwą sprawą, której nie będę tutaj szczegółowo omawiać).
Jeśli chcesz całkowicie oddzielić Tabod Ctrl+ I, usuń powiązanie z
function-key-map
:Nie jest to jednak bardzo przydatne, ponieważ wpisy w
function-key-map
są zastępowane przez powiązania w mapach klawiszy specyficznych dla trybu lub na mapie globalnej. Więc jeśli chcesz zdefiniować inne wiązanietab
, po prostu zrób to (w Elisp, nie interaktywnie, ponieważ monit o odczytanie klucza stosujefunction-key-map
tłumaczenie, aby skończyć wiązanie,TAB
a nietab
):Wszystkie standardowe tryby, które modyfikują działanie Tabklawisza, robią to poprzez modyfikację
TAB
klawisza, który jest pseudonimem dlaC-i
znaku generowanego przez kombinację klawiszy Ctrl+ I. Jeśli chcesz zastosować standardowe powiązaniatab
zamiastC-i
, pozostaw klawiszefunction-key-map
klawiszy trybu i pozostaw w spokoju, a zamiast tego przekieruj Ctrl+ Ido innego klucza.Teraz Emacs zgłosi Ctrl+ Ijako „
<control-i>
(przetłumaczone zTAB
)”. To nie jest ładne, ale jest nieuniknione: ładne drukowanie znaku 9, takiego jakTAB
wbudowany w kod źródłowy Emacsa.Ramy terminali
W ramkach terminali problem jest trudniejszy i często niemożliwy. Terminale nie przesyłają kluczy, przesyłają znaki (a dokładniej, w rzeczywistości bajty). TabKlucz jest przekazywana jako znak - co jest zakładka Control + I, a tym samym, co kombinacja klawiszy Ctrl+ Igeneruje. Klawisze funkcyjne, które nie mają odpowiedniego znaku (takie jak klawisze kursora) są przesyłane jako sekwencje specjalne, tj. Sekwencje znaków rozpoczynające się od
ESC
= Control + [(dlatego Emacs definiuje escapejako klawisz prefiksu -ESC
musi być prefiksem). Zobacz Jak działa wprowadzanie za pomocą klawiatury i tekst? po więcej tła.Istnieje kilka terminali, które można skonfigurować do wysyłania różnych sekwencji klawiszy dla klawiszy funkcyjnych, ale nie wiele. Zarówno libtermkey / libtickit LeoNerda, jak i xterm Thomasa Dickeya (od wersji 216) obsługują to. W Xterm funkcja jest opcjonalna i aktywowana przez
modifyOtherKeys
zasób. Jednak nie znam żadnego popularnego emulatora terminali innego niż xterm, który to obsługuje, w szczególności wielu emulatorów zbudowanych na libvte . Niektóre emulatory terminali pozwalają to zrobić ręcznie poprzez zdefiniowaną przez użytkownika korespondencję od słów kluczowych do sekwencji ucieczkowych.Ten mechanizm pozwala na rozróżnienie wielu kombinacji klawiszy, nie tylko tab / Ci, return / Cm i escape / C- [. Aby uzyskać bardziej szczegółowy opis, zobacz Problemy ze skrótami klawiszowymi podczas korzystania z terminala .
Podstawowa funkcja xterm jest obsługiwana od Emacsa 24.4. Jednak podstawy (w szczególności Tab, Return, Escape, Backspace) nadal wysyłać tradycyjne znaki sterujące, bo to właśnie aplikacje spodziewać. Istnieje tryb, w którym Ctrl+ letterwysyła sekwencję zmiany znaczenia zamiast znaku sterującego. Aby odróżnić klawisze funkcyjne od Ctrlkombinacji w Emacsie 24.4, zmodyfikuj jego obsługę dla
modifyOtherKeys
używania tego trybu, ustawiając zasób na 2 zamiast 1.źródło