在ObjC缓冲区中,自动完成模式不会自动打开

时间:2011-03-14 11:46:12

标签: emacs autocomplete

我像这样加载自动完成模式:

(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会以某种方式覆盖它。有办法解决这个问题吗?

感谢。

3 个答案:

答案 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的两个参数,这是必要的,如果添加未加引号的函数,它们可能无效。