我正在为旧版命令行工具编写一种comint模式。 我想为其添加基本的自动补全功能。
假设我有以下工具使用的关键字列表:
(defconst my-keywords '("export" "extract" "display"))
如何根据此列表将自动完成功能添加到我的模式?
我到目前为止发现的内容: 我知道在shell.el或comint.el中有此示例,但是我没有足够了解代码以回答这个基本问题。我确实了解我可以使用我的关键字构建一个正则表达式列表,如下所示:
(regexp-opt my-keywords)
;; output:
"\\(?:display\\|ex\\(?:\\(?:por\\|trac\\)t\\)\\)"
除此之外,我收集到可以同时使用pcomplete,或company或同时使用这两者的方法-可以使用任何解决方案,但是我该怎么做?
答案 0 :(得分:1)
感谢ergoemacs,我找到了第一个解决方案:
(start end my-keywords . nil)
的列表,其中 start 和 end 界定实体在点处的完成。我对第一个关键字进行了调整,以考虑程序提示。(defconst my-keywords '("export" "extract" "display"))
;; 1 - custom completion function
(defun my-completion-at-point ()
"This is the function to be used for the hook `completion-at-point-functions'."
(interactive)
(let* (
(bds (bounds-of-thing-at-point 'symbol))
(start (max (car bds) (comint-line-beginning-position)))
(end (cdr bds)))
(list start end xyz-keywords . nil )))
;; 2 - adding it to my-completion-at-point
(define-derived-mode my-comint-mode comint-mode "My comint mode"
;; your code....
(add-hook 'completion-at-point-functions 'my-completion-at-point nil 'local))
;; 3 - add a tab shortcut in the map of the mode
(defvar my-mode-map
(let ((map (nconc (make-sparse-keymap) comint-mode-map)))
;; your code...
(define-key map "\t" 'completion-at-point)
map))
答案 1 :(得分:1)
Comint还从其comint-dynamic-complete-functions
函数调用可自定义的comint-completion-at-point
。派生模式通常会向此挂钩添加功能(请参见shell-dynamic-complete-functions
),例如。
(defconst my-keywords '("export" "extract" "display"))
(defun my-comint-dynamic-completion-function ()
(when-let* ((bds (bounds-of-thing-at-point 'symbol))
(beg (car bds))
(end (cdr bds)))
(when (> end beg)
(list beg end my-keywords :annotation-function (lambda (_) "my-keywords")))))
(define-derived-mode my-comint-mode comint-mode "my mode"
(add-hook 'comint-dynamic-complete-functions
#'my-comint-dynamic-completion-function nil 'local)
(make-local-variable 'company-backends)
(cl-pushnew 'company-capf company-backends))
通过在您的company-capf
中添加company-backends
,您还将从点功能的完成中获得公司的支持(有关显示帮助/位置/的其他公司特定符号的示例,请参见elisp-completion-at-point
完成候选人等。