나는 comint-mode에 기반하여 파생 된 모드를 쓰고있다. 이 모드는 명령 행 프로그램 (GRASS gis)에 대한 인터페이스이며, 프로그램에 대한 comint 모드 완료가 작동합니다. completion-at-point-functions
을 통해 프로그램 인수에 대한 지원을 추가하려고합니다. 장난감의 예 :Emacs completion-at-point-functions
(setq my-commands
'(("ls"
("my-completion-1")
("my-completion-2"))
("mv"
("my-completion-3")
("my-completion-4"))))
(defun my-completion-at-point()
(interactive)
(let ((pt (point)) ;; collect point
start end)
(save-excursion ;; collect the program name
(comint-bol)
(re-search-forward "\\(\\S +\\)\\s ?"))
(if (and (>= pt (match-beginning 1))
(<= pt (match-end 1)))
() ;; if we're still entering the command, pass completion on to
;; comint-completion-at-point by returning nil
(let ((command (match-string-no-properties 1)))
(when (member* command my-commands :test 'string= :key 'car)
;; If the command is one of my-commands, use the associated completions
(goto-char pt)
(re-search-backward "\\S *")
(setq start (point))
(re-search-forward "\\S *")
(setq end (point))
(list start end (cdr (assoc command my-commands)) :exclusive 'no))))))
(push 'my-completion-at-point completion-at-point-functions)
거의 작동합니다. 프로그램 이름이 정상적으로 완성됩니다. 그러나 명령 행에서 ls
을 입력하면 my-completion-
이 삽입되고 두 가지 옵션이 제공되지 않습니다. 탭을 다시 누르면 다시 my-completion-
이 삽입되어 이제 ls my-completion-mycompletion-
이됩니다.
실제 코드에는 여러 줄의 명령이 있는지 확인하는 데 몇 줄이 포함되지만 완료 코드는 변경되지 않습니다. 이 버전의 코드에서는 프로그램 이름 중 하나가 시작되는 줄에 탭이 있습니다. my-commands
명령을 완료하는 데 사용할 수있는 인수 목록이 표시되지만 버퍼에 아무 것도 삽입되지 않으며 목록에 없습니다. 인수의 처음 몇 글자를 입력하여 좁혀지지 않습니다.
설명서를 끝내 보았지만 completion-at-point
함수를 작성하는 정확한 방법을 알 수 없습니다. 내가 누락 된 아이디어가 있습니까?
나는 간단히 'pcomplete
'을 보았지만 실제로는 '문서'를 이해하지 못했으며 어떤 진전도 이루지 못했습니다.
하나 이상의 표결이 있다면 그 표를 얻을 수 있습니다! 귀하의 답변에 감사드립니다. 문서를 읽으면서, backward-rege 검색은 skip-syntax-backward와 같은 위치에 포인트를 두어야하지만, 분명히 그렇지 않습니다. 나는 또한 add-hook을 사용하여 시작했지만, 함수 이름을 반대로하고 잘못 인용했다. 이제 모든 것이 완벽하게 작동합니다. 다시 한 번 감사드립니다! – Tyler
다행이었습니다. 더 생각해 보면,'re-search-backward' 문제는 거꾸로 검색 할 때 regexp 연산자의 탐욕과 관련이 있다고 생각합니다. 물론, "\\ S *"'는 빈 문자열과 일치하지만,'*'를'+'로 바꾸어도 여전히 공백이 아닌 문자 하나를 되돌리고 멈 춥니 다. –