1

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

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

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

这非常适合完成。

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

有可能两者都做吗?

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

我该怎么做呢?

4

1 回答 1

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)))

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

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

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

该解决方案有两个缺点:

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

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

于 2012-05-10T07:10:51.447 回答