我正在使用自动完成模式。它在许多主要模式下都能正常工作。但我不喜欢使用 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
而不是插入新行。你必须改善病情,虽然我不知道怎么做。