2009-07-17 25 views
7

Estoy trabajando en la implementación de autocompletado en emacs para el lenguaje de programación haxe.¿Cómo se muestran las opciones de autocompletar en emacs?

Ya descubrí cómo obtener la lista de autocomplementos que deseo presentar. La lista está en formato:

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

Quiero mostrar a la lista de usuario que contiene texto en formato "tipo1 nombre1" después de la posición del cursor (como en la función Autocompletar-mode) y la descripción para el elemento seleccionado en ese momento en el minibúfer. El usuario debería poder seleccionar completar o renunciar como en el modo de autocompletar.

Cuando el usuario selecciona algo, el nombre1 debe insertarse en la posición del cursor.

¿Cuál es la mejor/más fácil manera de hacer esto? ¿Hay alguna forma estándar de emacs para hacer esto, o debería codificar algo por mi cuenta?

EDITAR: Tengo funciones para obtener la lista de candidatos de autocompletar en función del búfer. Ahora estoy luchando por cómo integrar eso al modo autocompletar. Como get-completa es una operación pesada, me gustaría dispararlo solo si el cursor está en "." personaje.

Aquí está el código que tengo.

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

Respuesta

7

me gustaría sugerir el excelente paquete de Autocompletar: http://www.emacswiki.org/emacs/AutoComplete

Puede definir fuentes personalizadas para autocompletar y parece bastante sencillo.

+0

Vi eso, pero no pude encontrar la manera de mostrar información sobre herramientas y documentos con él. Todo lo que ofrece es como autocompletar, que no es lo que quiero. – Marko

+1

Parece que en el modo automplete, la función ac-select-candidate se usa para mostrar la selección actual de candidatos, puede definir un consejo para esa función para mostrar el desc en minibúfer – user49117

1

La ido-completar-leer de ido.el es otra manera de hacerlo.

Una característica útil de esto es que puede usar expresiones regulares para filtrar los candidatos, y puede activar y desactivar esta función sobre la marcha. Ver ido.el para más detalles.

1

El paquete ido tiene una funcionalidad de terminación conveniente llamada 'ido-completing-read'. Por ejemplo, aquí hay un truco sencillo para hacer que se muestre las listas en una base de línea por línea:

(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

dentro del código yasnippet, disponible en Google Code, utilizan 'desplegable-list.el' por Jaeyoun Chung para mostrar los posibles fragmentos que podrían usarse en el punto. Esto le da un menú emergente (tipo tooltip) en la posición del cursor que puede seleccionar con las teclas de flecha e ingrese o puede seleccionar por número.

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

+0

Genial, si solo fuera posible deshacerse de selid en el lado derecho :) – Marko

3

¿Por qué mantener reinventar ruedas? compañía-modo tiene soporte para algunos idiomas

+0

Este es el camino a seguir. No sé por qué perdí el modo de compañía y perdí tiempo con el modo de autocompletar claramente inferior. Tal vez el nombre feo;) – Marko

+1

El único problema es la documentación para el modo de empresa. No está claro cómo usarlo y recibí muchos correos electrónicos de personas que me preguntaron por mi configuración de empresa.Se puede ver en los archivos de configuración vinculados aquí: http://richardriley.net/projects/emacs/dotemacs – RichieHH

Cuestiones relacionadas