我正在使用emacs中的haxe编程语言自动完成实现。
我已经想出了如何获取我想要呈现的自动填充列表。列表格式为:
'((name1 type1 desc1)
(name2 type2 desc2) ...
我希望在光标位置之后显示格式为“name1 type1”的文本的用户列表(如自动完成模式)和用于迷你缓冲区中当前所选项目的desc。用户应该能够选择完成或放弃自动完成模式。
当用户选择某些内容时,应在光标位置插入name1。
最好/最简单的方法是什么?是否有一些标准的emacs方法可以做到这一点,或者我应该自己编写代码?
编辑:我有基于缓冲区获取自动完成候选列表的函数。现在我正在努力如何将其集成到自动完成模式。由于get-completion是繁重的操作,我想只在游标“on”时触发它。字符。
这是我的代码。
(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))
答案 0 :(得分:7)
我建议使用优秀的自动整理软件包:http://www.emacswiki.org/emacs/AutoComplete
您可以为自动填充定义自定义来源,而且看起来相当简单。
答案 1 :(得分:3)
为什么要重新发明轮子? company-mode支持几种语言
答案 2 :(得分:1)
来自ido.el的ido-completed-read是另一种方法。
它的一个有用功能是您可以使用正则表达式来过滤候选者,并且您可以动态地打开和关闭此功能。有关详细信息,请参阅ido.el。
答案 3 :(得分:1)
ido包具有称为“ido-completed-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)))
答案 4 :(得分:1)
在yasnippet代码中,可以从谷歌代码获得,他们使用Jaeyoun Chung的'dropdown-list.el'来显示可能在点使用的可能片段。这会在光标位置提供一个弹出(类似工具提示)菜单,您可以使用箭头键选择并输入,或者您可以按编号选择。