【问题标题】:Automatic completion when unique (Emacs auto-complete)唯一时自动完成(Emacs 自动完成)
【发布时间】:2013-01-18 10:41:32
【问题描述】:

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

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

自动完成优惠:

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

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

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

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

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

【问题讨论】:

  • 我见过这种叫做“闪电补全”的补全,在这个名称下有一个包用于 Emacs 的 minibuffer 补全。

标签: emacs autocomplete


【解决方案1】:

它实现了所需的行为:

(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,但您意外添加了额外的bd 并获得lambdabd。所以我设置了

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

并使用它:lambdabd 变为 lambda,您可以照常继续。

EDIT2:

该解决方案有一个缺点:“它在进行模糊处理时会变慢一点”。通过将ac-candidates 缩小为eab-last-selected-candidate 来修复ac-fuzzy-complete。现在速度很快!

【讨论】:

  • 我想尝试构建一个非常短的“块”来过度输入字符,即阻止包含在该部分中的字符,你认为这可能吗?另外,“你的环境”是什么意思,你是指使用这个例子,还是你通常使用的?
  • 为了澄清,在示例中,(eval-e) 触发 eval-expression(干得好!),是否可以在之后立即阻止 'xpr' 输入?
  • 是的,它是为了使用这个例子。我对(setq ac-sources '(ac-source-words-in-buffer ac-source-symbols)) 有一些问题。现在没关系了。我不认为这种阻止'xpr' 键入具有两个函数eval-expreval-exprxpr 的假设示例是正常行为。
  • 天哪,这真是太棒了。我真的会建议其他人对此答案 +1,因为这比最初要求的要多。它只有两个缺点:在我的电脑上,当它进行模糊处理时它会变慢一点(我试图在之后自动模糊完成,绑定到 SPC,同时还插入一个空格)。另外,请尝试输入(beginning-of-line)然后模糊完成:它会变成(beginning-of-buffer)。这怎么可能?
  • 这是因为(ac-expand)(ac-fuzzy-complete) 之后的工作方式与ac-next 类似,以防字符串没有打印错误。我只有在打印错误的情况下才使用这样的功能。如果您尝试将其应用于正确的字符串,例如beginning-of-line,您会从列表中获得下一个候选人。
【解决方案2】:

如果只有少数候选人,您可以通过M-1M-2 等选择每个候选人。它适用于 2-7 名候选人(与您的示例中的击键 -p 相比)。你不能允许只有一个候选人的情况 - 早点使用M-&lt;number&gt;,当候选人仍然很少时。

M-&lt;number&gt; 是函数ac-complete-&lt;number&gt; 的键绑定。

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

【讨论】:

  • 我知道 M-1 到 M-9 键,但我不想计算选择哪个选项。
  • 我同意你的看法。我宁愿使用像ace-jump 这样的视觉效果。最好使用ido-modeido-enable-flex-matching 来缩小候选人范围。但是没有人不会通过自动完成来跨越它们。 ) 另外,在您的示例中:如果字符串expression 立即完成,那么在打印错误的情况下如何取消它?我必须取消已完成的错误字符串。这会很烦人。我认为 ac-inline 是“无声”显示的,是一个很好的折衷方案。
  • 错写不会有补全?如果你完成了你不想要的东西,你可以向后退格,然后快速写下你的意思。我很确定从长远来看它会得到回报。不要忘记,我们只讨论可以立即完成的独特项目。
猜你喜欢
  • 2011-05-04
  • 2013-11-01
  • 1970-01-01
  • 2023-03-12
  • 2023-03-10
  • 2012-02-06
  • 2012-12-10
  • 2013-03-24
  • 2010-10-14
相关资源
最近更新 更多