Emacs:如何在自动完成模式下使用RET进行完成,而不会破坏正常的返回键功能?

时间:2012-05-10 06:55:44

标签: emacs autocomplete elisp

我正在使用自动完成模式。它在许多主要模式下都能正常工作。但我不喜欢使用TAB来选择候选人。

用户手册有这个lisp示例行,用于使用RET选择完成:

(define-key ac-mode-map (kbd "RET") 'auto-complete)

这非常适合完成。

但是,现在我可以使用RET选择候选项,我不能再使用RET来插入换行符了。

可以同时做到吗?

理想情况下,我想使用RET从完成列表中选择候选项,但是当没有列表时,我想正常使用RET - 插入换行符。

我该怎么做?

1 个答案:

答案 0 :(得分:1)

你不能简单地重新映射RET键,因为正如你所说,你失去了默认行为。你必须建立一个函数,检查你是否在一个单词的末尾进行自动完成,否则做正常的事情:

(defun complete-or-newline (arg)
  (if (and
        (or (bobp) (= ?w (char-syntax (char-before))))
        (or (eobp) (not (= ?w (char-syntax (char-after))))))
      (auto-complete)
    (newline-and-indent)))

此代码段是此post的修改。

然后你将重新映射RET以使用该函数:

(define-key ac-mode-map (kbd "RET") 'complete-or-newline)

此解决方案有两个缺点:

  • 您无法将参数传递给auto-complete。这可以使用interactive完成,但我不确切知道它是如何工作的。

  • 如果在一行的末尾按RET,它将尝试运行auto-complete而不是插入新行。你不得不改善病情,虽然我不知道如何。