Как отобразить варианты автозаполнения в Emacs? - PullRequest
7 голосов
/ 17 июля 2009

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

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

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

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

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

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

РЕДАКТИРОВАТЬ: У меня есть функции, чтобы получить список кандидатов автозаполнения на основе буфера. Сейчас я пытаюсь интегрировать это в режим автозаполнения. Поскольку get-complete - это сложная операция, я бы хотел запускать ее только если курсор включен. характер.

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

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

Ответы [ 5 ]

7 голосов
/ 17 июля 2009

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

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

3 голосов
/ 14 августа 2009

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

1 голос
/ 23 июля 2009

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

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

1 голос
/ 21 июля 2009

Пакет ido имеет удобную функцию завершения, называемую «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 голос
/ 20 июля 2009

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

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

...