2009-07-17 9 views
7

Ich arbeite an Autovervollständigung Implementierung in Emacs für die Programmiersprache haxe.Wie wird die automatische Vervollständigung in Emacs angezeigt?

Ich habe bereits herausgefunden, wie eine Liste von Autovervollständigungen erhalten, die ich präsentieren möchte. Die Liste ist im Format: mit Text im Format „name1 Typ1“ nach Cursorposition (wie in der automatischen Vervollständigung-Modus) und ab für aktuell ausgewähltes Element in Minipuffer

'((name1 type1 desc1) 
    (name2 type2 desc2) ... 

Ich mag Benutzerliste anzuzeigen. Der Benutzer sollte in der Lage sein, die Fertigstellung zu wählen oder aufzugeben, wie im Modus für die automatische Vervollständigung.

Wenn Benutzer etwas auswählen, sollte name1 an der Cursorposition eingefügt werden.

Was ist der beste/einfachste Weg, dies zu tun? Gibt es eine Standard-Emacs-Methode, oder sollte ich etwas selbst programmieren?

EDIT: Ich habe Funktionen, um die Liste der Autocomplete-Kandidaten basierend auf Puffer zu erhalten. Jetzt habe ich Probleme damit, das in den Autocomplete-Modus zu integrieren. Da Get-Complets eine schwere Operation ist, möchte ich es nur auslösen, wenn der Cursor auf "." Charakter.

Hier ist der Code, den ich habe.

(defun get-completes-from-haxe (hxml-file file pos) 
    (let* ((completion-buffer (get-buffer-create "*haxe-completions*")) 
     (cmd (concat "cd " (file-name-directory hxml-file) "; haxe " hxml-file " --display " file "@" (number-to-string pos)))) 
    (ignore-errors 
     (shell-command cmd completion-buffer) 
     (let ((clist (xml-parse-region 1 (buffer-size completion-buffer) completion-buffer)) 
      (completes nil)) 
     (dolist (s (cddar clist)) 
      (when (listp s) 
      (let* ((item (cdr s)) 
        (name (cdaar item)) 
        (type (car (cddadr item))) 
        (desc (cdddr item))) 
       (setf completes (cons name completes))))) 
     completes)))) 

(defun file-find-upwards (buffer file-name) 
    ;; Chase links in the source file and search in the dir where it points. 
    (setq dir-name (or (and (buffer-file-name buffer) 
          (file-name-directory (file-chase-links 
               (buffer-file-name buffer)))) 
        default-directory)) 
    ;; Chase links before visiting the file. This makes it easier to 
    ;; use a single file for several related directories. 
    (setq dir-name (file-chase-links dir-name)) 
    (setq dir-name (expand-file-name dir-name)) 
    ;; Move up in the dir hierarchy till we find a change log file. 
    (let ((file1 (concat dir-name file-name)) 
     parent-dir) 
    (while (and (not (file-exists-p file1)) 
       (progn (setq parent-dir 
          (file-name-directory 
           (directory-file-name 
           (file-name-directory file1)))) 
         ;; Give up if we are already at the root dir. 
         (not (string= (file-name-directory file1) 
            parent-dir)))) 
     ;; Move up to the parent dir and try again. 
     (setq file1 (expand-file-name file-name parent-dir))) 
    ;; If we found the file in a parent dir, use that. Otherwise, 
    ;; return nil 
    (if (or (get-file-buffer file1) (file-exists-p file1)) 
     file1 
     nil))) 


(defun get-candidate-list (buffer pos) 
    (get-completes-from-haxe 
    (file-find-upwards buffer "compile.hxml") 
    (buffer-file-name buffer) 
    pos)) 

Antwort

7

würde ich das ausgezeichnete Paket Auto-Vervollständigen vorschlagen: http://www.emacswiki.org/emacs/AutoComplete

Sie benutzerdefinierte Quellen für die automatische Vervollständigung definieren, und es scheint ziemlich geradlinig.

+0

Ich sah das, aber konnte nicht herausfinden, wie Tooltips und Dokumente damit angezeigt werden. Alles, was es bietet, ist vim wie Autovervollständigung, was ich nicht will. – Marko

+1

Sieht aus wie im automatischen Modus, ac-select-candidate-Funktion wird verwendet, um die aktuelle Auswahl von Kandidaten anzuzeigen, können Sie einen Hinweis für diese Funktion definieren, um die desc im Minibuffer anzuzeigen – user49117

1

Das Ido-Completing-Read von ido.el ist eine andere Möglichkeit, es zu tun.

Eine nützliche Funktion davon ist, dass Sie reguläre Ausdrücke verwenden können, um die Kandidaten herauszufiltern, und Sie können diese Funktion während des Betriebs ein- und ausschalten. Weitere Informationen finden Sie unter ido.el.

1

Das ido-Paket verfügt über eine komfortable Vervollständigungsfunktion namens "ido-completing-read". Zum Beispiel, hier ist eine einfache zwicken, um es Listen in einer Zeile-für-Zeile-Basis zeigen zu machen:

(defun x-ido-completing-read 
    (prompt choices &optional predicate require-match initial-input hist def) 
    (let* ((indent (concat "\n" (make-string (length prompt) ?))) 
     (ido-decorations 
     `("" "" ,indent ,(concat indent "...") 
      "[" "]" " [No match]" " [Matched]" " [Not readable]" " [Too big]"))) 
    (ido-completing-read prompt choices predicate require-match initial-input hist def))) 
1

Innerhalb des yasnippet Code, das von Google Code, verwenden sie ‚Drop-Down-list.el‘ von Jaeyoun Chung um die möglichen Snippets anzuzeigen, die am Punkt verwendet werden können. Dies ergibt ein Popup-Menü (Tooltip-ähnliches Menü) an der Cursorposition, die Sie mit den Pfeiltasten auswählen und eingeben können oder Sie können nach Nummer wählen.

http://www.emacswiki.org/emacs/dropdown-list.el

+0

Großartig, wenn es nur möglich wäre, loszuwerden Selid auf der rechten Seite :) – Marko

3

Warum Räder neu erfinden halten? Firmenmodus hat Unterstützung für einige Sprachen

+0

Dies ist der Weg zu gehen. Ich weiß nicht, warum ich den Company-Modus vermisst habe und Zeit mit deutlich schlechterem Autocomplete-Modus verschwendet habe. Vielleicht der hässliche Name;) – Marko

+1

Das einzige Problem ist die Dokumentation für den Firmenmodus. Es ist alles andere als klar, wie man es benutzt und ich habe viele E-Mails von Leuten bekommen, die nach meinem Firmen-Setup gefragt haben.Es kann in den Config-Dateien gesehen werden, die hier verlinkt sind: http://richardriley.net/projects/emacs/dotemacs – RichieHH

Verwandte Themen