2

当只有一个唯一选项时,如何编写自动完成代码以立即触发?(或者,当有多个选项,但它们都具有相同的基数时)

(eval-exp_[point-is-here]_)

自动完成提供:

(eval-expression
(eval-expression-print-format)

现在,当它遇到一个独特的选项时,如果它立即完成到(eval-expression,然后如果我们输入"-"它会立即选择打印格式,那不是很好吗?

即使有 2 个选项,您也可以在以下示例中看到您只需要"-p"完成:

(eval-expression-print-format)
(eval-expression-something-else)

这种行为在 Emacs 中是否可行?

4

2 回答 2

2

它实现了所需的行为:

(defadvice ac-inline-show (after eab-ac-expand activate)
  (if (> (length ac-candidates) 1)
      (let ((ac-common-part (try-completion ac-prefix ac-candidates)))
        (ac-expand-common))
    (progn
      (ac-expand-string ac-common-part)
      (ac-inline-hide)))
  (setq eab-last-selected-candidate ac-selected-candidate))

对于停用:

(ad-remove-advice 'ac-inline-show 'after 'eab-ac-expand)
(ad-deactivate 'ac-inline-show)

编辑:

我尝试了工作流程并找到了一种取消错误书写的方法。作为示例,您打印lam并扩展为,但您意外lambda添加了额外内容并获取. 所以我设置bdlambdabd

(global-set-key (kbd "C-<tab>") '(lambda () (interactive) (flet ((ac-candidates () `(,eab-last-selected-candidate))) (ac-fuzzy-complete)) (ac-expand)))

并使用它:lambdabd变成lambda,你可以像往常一样继续。

编辑2:

该解决方案有一个缺点:“它在模糊时会变慢一点”。它是通过缩小ac-candidateseab-last-selected-candidatefor来固定的ac-fuzzy-complete。现在它很快!

于 2013-01-19T09:05:27.017 回答
0

如果只有少数候选人,您可以通过M-1M-2等选择每个候选人。它适用于 2-7 名候选人(与-p您的示例中的击键比较)。您不能允许单一候选人的情况 -M-<number>在候选人仍然很少时尽早使用。

M-<number>是函数的键绑定ac-complete-<number>

此外,函数ac-isearch( C-s) 也很有用。在开始eva_[point]_时,您可以搜索字符串foprC-s,然后从缩小的列表中进行选择。

于 2013-01-18T14:18:51.873 回答