2009-07-17 11 views
7

Sto lavorando all'implementazione di completamento automatico in emacs per il linguaggio di programmazione haxe.Come visualizzare le scelte di completamento automatico in emacs?

Ho già capito come ottenere l'elenco dei completamenti automatici che desidero presentare. La lista è in formato:

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

voglio visualizzare all'elenco degli utenti che contiene testo in formato "nome1 tipo1" dopo la posizione del cursore (come nel completamento automatico-mode) e disc per la voce selezionata in minibuffer. L'utente dovrebbe essere in grado di selezionare il completamento o rinunciare come nella modalità di completamento automatico.

Quando l'utente seleziona qualcosa, nome1 deve essere inserito nella posizione del cursore.

Qual è il modo migliore/più semplice per farlo? C'è qualche modo standard emacs per farlo, o dovrei codificare qualcosa da solo?

MODIFICA: Ho le funzioni per ottenere l'elenco dei candidati a completamento automatico basato sul buffer. Ora sto lottando su come integrarlo in modalità autocomplete. Dal momento che il completamento è un'operazione pesante, vorrei attivarla solo se il cursore è su "." carattere.

Ecco il codice che ho.

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

risposta

7

Io suggerirei l'eccellente pacchetto di completamento automatico: http://www.emacswiki.org/emacs/AutoComplete

È possibile definire fonti personalizzati per il completamento automatico e sembra abbastanza semplice.

+0

L'ho visto, ma non riuscivo a capire come visualizzare descrizioni e documenti con esso. Tutto ciò che offre è come l'autocompletamento, che non è quello che voglio. – Marko

+1

Sembra nella modalità di completamento automatico, la funzione di selezione dei candidati viene utilizzata per mostrare la selezione corrente del candidato, è possibile definire un consiglio per quella funzione per mostrare la descrizione nel minibuffer – user49117

1

L'ido-completamento-lettura da ido.el è un altro modo per farlo.

Una funzione utile è che è possibile utilizzare le espressioni regolari per filtrare i candidati ed è possibile attivare e disattivare questa funzione al volo. Vedi ido.el per maggiori dettagli.

1

il pacchetto ido ha funzionalità di completamento convenienti chiamate 'ido-completing-read'. Ad esempio, ecco un semplice tweak per renderlo mostrare elenchi in base riga per riga:

(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

all'interno del codice yasnippet, disponibile da Google Code, usano 'discesa-list.el' di Jaeyoun Chung per visualizzare i possibili frammenti che potrebbero essere utilizzati al punto. Questo dà un menu popup (simile a un tooltip) nella posizione del cursore che puoi selezionare con i tasti freccia e inserisci o puoi selezionare per numero.

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

+0

Grande, se solo fosse possibile sbarazzarsi di selid sul lato destro :) – Marko

3

Perché continuare a reinventare ruote? modalità azienda ha il supporto per alcune lingue

+0

Questa è la strada da percorrere. Non so perché mi sono perso la modalità aziendale e ho perso tempo con modalità di autocomplete chiaramente inferiore. Forse il brutto nome;) – Marko

+1

L'unico problema è la documentazione per la modalità azienda. È tutt'altro che chiaro come usarlo e ho ricevuto molte e-mail da persone che chiedono il mio setup aziendale.Può essere visto nei file di configurazione collegati qui: http://richardriley.net/projects/emacs/dotemacs – RichieHH

Problemi correlati