2012-05-18 12 views
5

To s-wyrażenie w moim pliku .emacs nie przynosi pożądanego rezultatu:Jak powiązać C- = w emacs?

(define-key global-map (kbd "C-=") 'djhaskin987-untab-to-tab-stop) 

Dlaczego nie mogę powiązać polecenie do Ctrl + =?

EDIT dla wyjaśnienia:

Używam emacs23-nox na standardowej kompilacji urxvt-256colors dla Debiana, oprócz tego, że mam zrekompilowane z --disable-iso405776 (lub coś w tym rodzaju) to tak, że Ctrl + Przesunięcie nie robi dziwnego "wstawiania znaków". Nie wiem, czy to wpływa na cokolwiek. Na przykład C-M-i wysyła M-TAB, którego nie rozumiem.

EDIT II:

przepraszam, że nie czyni to oczywiste. Funkcja djhaskin987-untab-to-tab-stop ma w sobie linię (interactive). Ta część działa.

+1

C-i jest zwykle tłumaczone jako 'TAB' w emacs. Więc nie dziwię się, że 'C-M-i' jest tłumaczone jako' M-TAB' – kindahero

Odpowiedz

6

W terminalu TAB reprezentuje tę samą sekwencję jak bajt C-i. Zwykle terminal nie ma specjalnej sekwencji bajtów dla C- =, więc wyśle ​​tylko =. Nic nie może na to poradzić Emacs. Ale możesz być w stanie nauczyć emulator terminala wysłać wybraną sekwencję bajtów (sprawdź w dokumentacji emulatora terminala), po czym możesz nauczyć Emacsa rozpoznawania go jako C- = (z czymś jak (define-key input-decode-map "...thebytes..." [?\C-=])).

+1

dziękuje Stefan .. to bardzo przydatne .. Dla np .. w tym pakiecie niektóre miały dużo bólu, aby xterm działał lepiej z emacs. http://www.dur.ac.uk/p.j.heslin/Software/Emacs/Download/xterm-extras.el (patrz komentarz do pliku .Xresource) – kindahero

+0

+1 Dziękuję za pomoc w rozwiązaniu mojego problemu. Widzę, że to jest droga. – djhaskin987

+0

Może lepiej jest edytować w rzeczywistym rozwiązaniu - połączony plik jest skompresowany, a link może się łatwo zepsuć. Czy 'C- =' jest specjalne w terminalach? Ogólna strategia wydaje się tłumaczeniem kluczy X na nieużywane końcowe sekwencje specjalne, a następnie definiowanie kluczy emacs dla tych i innych wcześniej nieokreślonych ucieczek terminala (a następnie przypisywanie tych klawiszy do funkcji). –

0

Funkcja, którą chcesz powiązać, musi być interaktywna. Wypróbuj:

(define-key global-map (kbd "C-=") 
    (lambda() (interactive) (djhaskin987-untab-to-tab-stop))) 
+0

Obawiam się, że nie, ale dzięki za napiwek. Kiedy używam tej linii (lub mojej) i wciskam CTRL + =, po prostu wypisuje "=" do bufora. – djhaskin987

1

Problem polega na tym, że używasz emacs w terminalu. Terminal nie zezwala na "C- =". Wypróbuj swoją funkcję w graficznych emacach i to zadziała. Będziesz musiał znaleźć inny skrót klawiaturowy dla terminala.

+1

Zdaję sobie z tego sprawę, ale dla celów osobistych preferencji (tak, że mogę uzyskać dostęp do emacs nawet przez SSH, a więc wszystkie moje rzeczy są w terminalu), chcę, aby C- = działało nawet w terminalu. – djhaskin987

5

Przyjęta odpowiedź w połączeniu z link in the first comment to it wystarczy, aby rozpocząć kompletne rozwiązanie. Kroki są:

  1. dokonać terminali kodów wyjścia ewakuacyjne na klucz
  2. zrobić Emacs rozpoznaje kody ucieczki jako standardowy naciśnięciem klawisza
  3. wiążą naciśnięcia klawisza w trybie mapy

Pierwszy jest bardzo terminalny i/lub zależy od systemu operacyjnego.

Łącze w pierwszym komentarzu pokazuje kilka przykładów dla X Window System. Kluczowe nazwy są dostępne w /usr/X11R6/include/X11/keysymdef.h (lub spróbuj locate keysymdef.h), z prefiksem XK_ (które powinny zostać usunięte do naszych celów).Czytałem, że symboliczne nazwy są preferowane w stosunku do literałów.

Nie mam aktualnie prowadzony X, ale myślę, że powinno to wyglądać w przypadku:

XTerm.VT100.Translations: #override \ 
Ctrl ~Meta ~Shift <Key> equal:   string(0x1b) string("[emacs-C-=")\n 

Pierwszy ciąg jest ucieczka, drugi jest od wybranego przez użytkownika.

W iTerm można użyć Preferences->Keys i wybrać Send Escape Sequence jako Action. Na przykład mam:

iTerm key mappings

Emacs Wiki lists some configuration methods dla innych terminali.

Teraz możesz nauczyć Emacsa rozpoznawania go jako C- =. Najpierw define-key w input-decode-map. Mam kilka funkcji pomocniczych:

(defun my/global-map-and-set-key (key command &optional prefix suffix) 
    "`my/map-key' KEY then `global-set-key' KEY with COMMAND. 
PREFIX or SUFFIX can wrap the key when passing to `global-set-key'." 
    (my/map-key key) 
    (global-set-key (kbd (concat prefix key suffix)) command)) 

(defun my/map-key (key) 
    "Map KEY from escape sequence \"\e[emacs-KEY\." 
    (define-key function-key-map (concat "\e[emacs-" key) (kbd key))) 

Więc:

(my/global-map-and-set-key "C-=" 'some-function-to-bind-to) 

niektóre klawisze (aktualnie: ()\|;'`"#.,) będzie potrzeba ucieczki w ciągu, jak C-\..

Powiązane problemy