2009-07-17 2 views
7

Я работаю над реализацией autocompletion в emacs для языка программирования haxe.Как отображать варианты автозаполнения в emacs?

Я уже понял, как получить список автозаполнений, которые я хочу представить. Список в формате:

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

Я хочу, чтобы отобразить в списке пользователей, содержащий текст в формате «name1 type1» после позиции курсора (как в автозаполнения режиме) и по алфавиту для выбранного элемента в минибуфере. Пользователь должен иметь возможность выбирать завершение или сдавать, как в режиме автозаполнения.

Когда пользователь выбирает что-то, имя1 следует вставить в позицию курсора.

Каков наилучший/простой способ сделать это? Есть ли какой-то стандартный способ emacs сделать это, или я должен что-то написать самостоятельно?

EDIT: У меня есть функции, чтобы получить список кандидатов на автозаполнение на основе буфера. Теперь я пытаюсь интегрировать это в автозаполненный режим. Поскольку get-completes - тяжелая операция, я хотел бы вызвать ее только в том случае, если курсор включен. персонаж.

Вот код, который у меня есть.

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

ответ

7

Я хотел бы предложить отличный пакет автозаполнение: http://www.emacswiki.org/emacs/AutoComplete

Вы можете определить собственные источники для автозаполнения и, кажется, довольно прямо вперед.

+0

Я видел это, но не мог понять, как отображать всплывающие подсказки и документы с ним. Все, что он предлагает, это vim, как автозаполнение, чего я не хочу. – Marko

+1

Похоже, что в режиме автопотока функция ac-select-кандидат используется для отображения текущего выбора кандидата, вы можете определить совет для этой функции, чтобы показать desc в минибуфере – user49117

1

Идо-заполнение-чтение из ido.el - это еще один способ сделать это.

Полезной особенностью этого является то, что вы можете использовать регулярные выражения для фильтрации кандидатов, и вы можете включать и выключать эту функцию на лету. Подробнее см. Ido.el.

1

Идо пакет имеет удобную функциональность завершения, называемую «ido-completeting-read». Например, вот простой твик, чтобы сделать его показать списки в линию за линией основе:

(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

Внутри кода yasnippet, доступный от Google код, они используют «выпадающий-list.el» по Jaeyoun Chung для отображения возможных фрагментов, которые могут использоваться в точке. Это дает всплывающее меню (в виде подсказки) в позиции курсора, которую вы можете выбрать с помощью клавиш со стрелками, и введите или вы можете выбрать по номеру.

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

+0

Отлично, если бы можно было избавиться от selid на правой стороне :) – Marko

3

Зачем держать изобретать колесо? компания-режим поддерживает несколько языков

+0

Это путь. Я не знаю, почему я пропустил режим компании и потратил впустую время с явно неполным автозаполнением. Возможно, уродливое имя;) – Marko

+1

Единственная проблема - документация для корпоративного режима. Его далеко не ясно, как его использовать, и я получил много писем от людей, которые спрашивают о моей компании.Это можно увидеть в конфигурационных файлах, связанных с здесь: http://richardriley.net/projects/emacs/dotemacs – RichieHH

Смежные вопросы