2009-07-17 6 views
7

Pracuję nad implementacją autouzupełniania w emacs dla języka programowania haxe.Jak wyświetlić opcje autouzupełniania w emacs?

Już się dowiedziałem, jak uzyskać listę autouzupełnień, które chcę przedstawić. Lista jest w formacie:

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

chcę wyświetlić na liście użytkowników zawierającego tekst w formacie „NAME1 type1” po pozycji kursora (jak w autouzupełniania-mode) i desc dla aktualnie wybranego elementu w minibuforze. Użytkownik powinien mieć możliwość wybrania ukończenia lub zrezygnować, tak jak w trybie autouzupełniania.

Po wybraniu przez użytkownika nazwy 1 należy wstawić w pozycji kursora.

Jaki jest najlepszy/najprostszy sposób to zrobić? Czy istnieje sposób, aby to zrobić, lub powinienem napisać coś na własną rękę?

EDYCJA: Mam funkcje, aby uzyskać listę autouzupełniania kandydatów na podstawie bufora. Teraz walczę jak to zintegrować z trybem autouzupełniania. Ponieważ get-completes jest ciężką operacją, chciałbym ją wywołać tylko wtedy, gdy kursor jest włączony "." postać.

Oto kod, który mam.

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

Odpowiedz

7

Sugeruję pakietu doskonałą autouzupełniania: http://www.emacswiki.org/emacs/AutoComplete

można określić źródła niestandardowe autouzupełnianie i wydaje się dość prosta.

+0

Widziałem to, ale nie mogłem wymyślić sposobu wyświetlania podpowiedzi i dokumentów z nim. Wszystko co oferuje to vim to autouzupełnianie, co nie jest tym, czego chcę. – Marko

+1

Wygląda jak w trybie autouzupełniania, funkcja ac-select-candidate służy do pokazania aktualnej selekcji kandydata, możesz zdefiniować poradę dla tej funkcji, aby pokazać opis w minibuforze – user49117

1

Ido-completing-read z ido.el to inny sposób na zrobienie tego.

Przydatną funkcją jest możliwość użycia wyrażeń regularnych w celu odfiltrowania kandydatów, a także włączania i wyłączania tej funkcji w locie. Zobacz ido.el po więcej szczegółów.

1

Pakiet ido ma wygodną funkcję uzupełniania nazwaną "ido-completing-read". Na przykład, oto prosty uszczypnąć, aby pokazać list w zasadzie wiersz po wierszu:

(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

wewnątrz kodu yasnippet, dostępny z kodem Google, używają „rozwijaną-list.el” przez Jaeyoun Chung wyświetlać możliwe fragmenty, które można wykorzystać w punkcie. Daje to menu podręczne (podobne do narzędzi) w pozycji kursora, które można wybrać za pomocą klawiszy strzałek i wprowadzić lub można wybrać według numeru.

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

+0

Świetnie, gdyby tylko można było się pozbyć selid po prawej stronie :) – Marko

3

Dlaczego zachować wymyślania koła? tryb firmowy obsługuje kilka języków.

+0

To jest droga. Nie wiem, dlaczego opuściłem tryb firmy i straciłem czas z wyraźnie gorszym trybem autouzupełniania. Być może brzydka nazwa;) – Marko

+1

Jedynym problemem jest dokumentacja dla trybu firmowego. Daleko jej do jasności, jak z niego korzystać i otrzymałem wiele e-maili od ludzi, którzy proszą o moją firmę.Można to zobaczyć w plikach konfiguracyjnych dołączonych tutaj: http://richardriley.net/projects/emacs/dociaacs – RichieHH

Powiązane problemy