Emacs:如何在自动完成模式下使用 RET 完成,而不会破坏正常的返回键函数



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

用户手册中有这个 lisp 示例行,用于使用 RET 选择补全:

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

这对于完成非常有用。

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

可以同时做到这两点吗?

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

我该怎么做?

你不能

简单地重新映射 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)))

此片段是对这篇文章的修改。

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

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

此解决方案有两个缺点:

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

  • 如果在行尾按 RET,它将尝试运行auto-complete而不是插入新行。你必须改善病情,虽然我不知道怎么做。

最新更新