2011-08-11 21 views
20

Niedawno odkryłem M-x ielm (Emacs self-REPL) i byłem mile zaskoczony, że w tym trybie jest działająca funkcja uzupełniania kart. Załóżmy, że mogę zacząć pisać: ecb-, a następnie nacisnąć TAB, a ielm pokaże mi funkcje, które są dostępne dla EBC. Bardzo wygodne do eksploracji!emacs - autouzupełnianie w trybie Empsa Lisp

Jednak, gdy zaczynam edytować jeden z moich plików *.el (w trybie Emacs Lisp major), TAB nie działa już jako autouzupełnianie i wykonuje wcięcia, co uważam za niefortunne.

Próbowałem dowiedzieć się, jak działa autouzupełnianie w obrębie ielm, aby ewentualnie przeszczepić go do trybu Emacs Lisp. Jednak najwyraźniej autouzupełnianie w ielm używa comint-dynamic-complete, które, o ile rozumiem, działa tylko w buforach opartych na comint. Chyba to oznacza, że ​​nie mam szczęścia.

Więc, jak mogę włączyć autouzupełnianie dla Emacs Lisp?

Odpowiedz

28

W ostatnich wersjach Emacs, można użyć mało znany kawałek wbudowaną funkcjonalność, która umożliwia realizację zakładka:

(setq tab-always-indent 'complete) 
(add-to-list 'completion-styles 'initials t) 

Przy tej konfiguracji TAB - co jest zwykle związany indent-for-tab-command - próbuje najpierw aby dostosować wcięcie zgodnie z ustawieniami trybu, ale jeśli wcięcie jest już poprawne, wyzwalane jest zakończenie. Zazwyczaj jest to pożądane zachowanie, a IMHO działa lepiej niż wtyczki innych firm, takie jak smart-tab.

Należy jednak zauważyć, że w niektórych trybach TAB nie jest związany z indent-for-tab-command, więc dalsze ponowne wiązanie jest konieczne dla tych trybów, np. z smart-tab. Ponadto, gdy tryby mają "odbicie wcięcia" (np. python-mode), ta technika również nie zadziała.

2

znaleźć zarówno wcięcia i ukończenie pomocne w czasach, więc mam funkcję, która wybiera w oparciu o czy ostatnią rzeczą, jaką zrobiłem było wstawianie tekstu lub nie:

(global-set-key [tab] 'indent-or-expand) 
(defun indent-or-expand() 
    "Either indent according to mode, or expand the word preceding point." 
    (interactive) 
    (if (or 
     (eq last-command 'self-insert-command) 
     (eq last-command 'dabbrev-expand)) 
     (progn 
     (setq this-command 'dabbrev-expand) 
     (dabbrev-expand nil)) 
    (indent-according-to-mode))) 

Prawdopodobnie można użyć comint-dynamic-complete zamiast dabbrev jeśli chcesz, ale uważam, że dabbrev działa świetnie na emacs-seplp - szczególnie w połączeniu z completer.el, który może rozwinąć nawet f-f-r-o w find-file-read-only.

+0

Inteligentny pomysł. Przypadkowe wywołanie zakończenia, gdy po prostu chciałeś wciskać, nigdy nie jest dobrą rzeczą. – phils

Powiązane problemy