2011-08-11 3 views
20

최근에 나는 M-x ielm (Emacs 자체 REPL)을 발견했으며 그 모드에서 작업 완료 탭이 있다는 것에 유쾌하게 놀랐다. 예를 들어, ecb-을 입력하고 TAB을 누르면 ielm이 어떤 기능을 ECB가 노출하는지 표시합니다. 탐험에 매우 편리!이맥스 Lisp 모드에서 이맥스 자동 완성

그러나 *.el 개의 파일 (Emacs Lisp 주 모드에서) 중 하나를 편집하기 시작할 때 TAB은 더 이상 자동 완성으로 작동하지 않으며 들여 쓰기를 수행합니다. 이는 불행한 일입니다.

나는 자동 완료가 ielm 안에 어떻게 작동하는지 알아 내려고 Emacs Lisp 모드로 이식하려고 시도했다. 그러나, 분명히, ielm의 자동 완성은 comint-dynamic-complete을 사용합니다. 이는 알고있는 한 comint 기반 버퍼에서만 작동합니다. 나는 이것이 내가 여기에서 운이 없다는 것을 의미한다.

그래서, 어떻게하면 Emacs Lisp에 자동 완성 기능을 사용할 수 있습니까?

답변

28

, 당신은 TAB 완성을 가능하게 내장 기능의 작은 알려진 조각을 사용할 수 있습니다 모드의 설정에 따라 들여 쓰기를 조정하지만 들여 쓰기가 이미 올바른 경우 완료가 트리거됩니다. 이것은 일반적으로 원하는 동작이며 IMHO는 smart-tab과 같은 타사 플러그인보다 잘 작동합니다.

그러나 일부 모드에서는 TABindent-for-tab-command에 바인딩되어 있지 않으므로 이러한 모드에는 추가 리 바인딩이 필요합니다. smart-tab. 또한 모드에 '들여 쓰기 바운스'가있는 경우 (예 : python-mode)이 기술은 작동하지 않습니다.

2

나는 항상 들여 쓰기 및 완료 모두 도움이, 그래서 내가했던 마지막 텍스트 여부 삽입되었는지 여부에 따라 선택하는 기능이 있습니다 당신은 아마 dabbrev 대신 comint-dynamic-complete을 사용할 수 있습니다

(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))) 

을 원한다면, dabbrev은 이맥스 리스프에 아주 잘 작동합니다 - 특히 completer.el과 결합하면 f-f-r-ofind-file-read-only으로 확장 할 수 있습니다. - 일반적으로 indent-for-tab-command에 바인딩 - 첫번째 시도이 설정으로

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

, TAB : 이맥스의 최신 버전에서

+0

멋진 아이디어. 우연히 들여 쓰기를 원했을 때 우연히 완료하는 것은 결코 좋은 일이 아닙니다. – phils