Ich schreibe einen abgeleiteten Modus, der auf dem comint-mode basiert. Der Modus ist eine Schnittstelle zu einem Kommandozeilenprogramm (GRASS gis), und die Vervollständigung des comint-Modus funktioniert für die Programme. Ich versuche, Unterstützung für die Vervollständigung der Argumente für das Programm hinzuzufügen, über completion-at-point-functions
. Ein Beispiel ist ein Spielzeug:
(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)
Das funktioniert fast. Ich erhalte eine normale Vervollständigung der Programmnamen. Wenn ich jedoch eingegeben habe ls
in der Befehlszeile, mit der Tabulatortaste wird my-completion-
und bietet die beiden Optionen nicht an. Erneutes Drücken von Tabulator fügt ein my-completion-
ein zweites Mal, so dass ich jetzt ls my-completion-mycompletion-
.
Mein aktueller Code enthält ein paar Zeilen, um auf mehrzeilige Befehle zu prüfen, nimmt aber keine Änderungen am Vervollständigungscode vor. Bei dieser Version des Codes drücke ich die Tabulatortaste in einer Zeile, die mit einem der Programmnamen in my-commands
Ich erhalte eine Liste der möglichen Argumente, mit denen ich den Befehl vervollständigen kann, aber es wird nichts in den Puffer eingefügt, und die Liste wird nicht eingegrenzt, wenn ich die ersten Buchstaben eines Arguments eingebe.
Ich habe mir das Handbuch angesehen, aber ich kann nicht herausfinden, wie man eine completion-at-point
Funktion. Hat jemand eine Idee, was ich übersehe?
Ich habe kurz nachgeschaut pcomplete
aber sie haben die "Dokumentation" nicht wirklich verstanden und sind nicht weitergekommen.