EMACS-DOCUMENT

=============>集思广益

EmacsWiki: Programmable Completion

文本会讲解的Emacs标准库中的 `pcomplete.el’ 及其相关库. 要看`pcomplete.el’的相关例子,请移步 PcompleteExamples.

注意: `pcomplete.el’的意思是“programmable completion”,它与 EmacsLisp manual (dynamic-completion-table) 中所说的“programmed completion”没有任何关系. 后者的意思是使用函数来生成补全后选项而不是直接提供一个明确的后选项列表.

Adding programmable completion using pcomplete

编写setup函数,并将之加到你的mode hook中

下面是个例子:

(defun pcomplete-erc-setup () 
  "Setup erc-mode to use pcomplete." 
  (set (make-local-variable 'pcomplete-parse-arguments-function) 
       'pcomplete-parse-erc-arguments) 
  (set (make-local-variable 'pcomplete-command-completion-function)  
       'pcomplete/erc-mode/complete-command)
  (set (make-local-variable 'pcomplete-command-name-function) 
       'pcomplete-erc-command-name)
  (set (make-local-variable 'pcomplete-default-completion-function)
       (lambda () (pcomplete-here (pcomplete-erc-nicks))))
  (set (make-local-variable 'pcomplete-suffix-list) '(?  ?:)) 
  )                 
(add-hook 'erc-mode-hook 'pcomplete-erc-setup)                                                                                                                                                         

补齐你需要的那些函数

  • pcomplete-parse-arguments-function

    pcomplete-parse-arguments-function 不接参数. 它应该返回当前命令的参数列表.

  • pcomplete-command-name-function

    返回命令的规范名. 会根据该名称来查找对应的补全函数. 例如,假设该函数返回值为 “MSG” 且当前的 major mode 为 “erc-mode” 的话, pcomplete会使用 pcomplete/erc-mode/MSGpcomplete/MSG 这两个函数来进行补全.

  • pcomplete-default-completion-function

    在没有为该命令定义补全函数的情况下,会调用 pcomplete-default-completion-function 所指向的函数. 该函数的函数体应该是这样的 (pcomplete-here (… list of completions …))

  • pcomplete-command-completion-function

    该函数的函数体应该是这样的 (pcomplete-here (… list of completions …))