我像这样加载自动完成模式:
(let ((ac-path "path/to/auto-complete"))
(add-to-list 'load-path ac-path)
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories (concat ac-path "ac-dict"))
(ac-config-default))
它在C大调模式下工作正常,但在打开ObjC文件时无法自动打开。我仍然可以手动打开它,它将与ObjC主模式一起正常工作。
以下是关于ObjC主要模式的文档片段:
The hook `c-mode-common-hook' is run with no args
at mode initialization, then `objc-mode-hook'.
如果我理解正确,自动完成会为c-mode-common-hook
添加一个钩子,但objc-mode-hook
会以某种方式覆盖它。有办法解决这个问题吗?
感谢。
答案 0 :(得分:4)
在浏览auto-complete.el
的源代码时,我偶然发现了这个定义
(defcustom ac-modes
'(emacs-lisp-mode
lisp-interaction-mode
c-mode cc-mode c++-mode
java-mode clojure-mode scala-mode
scheme-mode
ocaml-mode tuareg-mode
perl-mode cperl-mode python-mode ruby-mode
ecmascript-mode javascript-mode js-mode js2-mode php-mode css-mode
makefile-mode sh-mode fortran-mode f90-mode ada-mode
xml-mode sgml-mode)
"Major modes `auto-complete-mode' can run on."
:type '(repeat symbol)
:group 'auto-complete)
事实证明auto-complete
没有真正的全局模式。它仅对ac-modes
变量中包含的主要模式启用。
因此,将以下行添加到.emacs
文件已解决了我的问题。
; add this line after the auto-complete mode has been loaded
(add-to-list 'ac-modes 'objc-mode)
答案 1 :(得分:1)
使用以下内容:
(defun my-objc-mode-hook ()
(auto-complete-mode 1))
(add-hook 'objc-mode-hook 'my-objc-mode-hook)
注1:当没有参数调用时,函数auto-complete-mode
是一个切换函数。
注2:可以使用lambda
添加匿名函数,但这有几个缺点。最重要的是:修改函数并重新评估表达式会将修改后的函数加上添加到早期版本中,而C-h v xxx
将打印完整的无格式lambda函数,这通常是没有希望的。阅读并理解。
答案 2 :(得分:0)
(add-hook 'objc-mode-hook 'auto-complete-mode)
如果您使用自动完成模式,那应该这样做。您可以通过执行以下操作向模式挂钩添加更复杂的内容:
(add-hook 'objc-mode-hook '(lambda ()
(something-with arguments)))
请注意,引用了add-hook的两个参数,这是必要的,如果添加未加引号的函数,它们可能无效。