【问题标题】:Auto-complete mode doesn't turn on automatically in ObjC buffers自动完成模式不会在 ObjC 缓冲区中自动打开
【发布时间】:2011-04-04 17:43:50
【问题描述】:

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

(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 主要模式的 sn-p:

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

谢谢。

【问题讨论】:

    标签: emacs autocomplete


    【解决方案1】:

    在查看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)
    

    【讨论】:

      【解决方案2】:

      使用以下内容:

      (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 函数,这通常是无望的阅读和明白。

      【讨论】:

      • 还是不行。有没有办法检查钩子本身是否工作,比如调试它的打印语句?我真的很想看看 Emacs 在打开 ObjC 文件时执行的操作序列。这可以帮助调试问题。有没有办法做到这一点?
      • 你可以在你的函数中添加一个(message "Running my-objc-mode-hook")
      【解决方案3】:
      (add-hook 'objc-mode-hook 'auto-complete-mode)
      

      如果您使用的是自动完成模式,那应该可以。您可以通过执行以下操作向模式挂钩添加更复杂的内容:

      (add-hook 'objc-mode-hook '(lambda ()
                                    (something-with arguments)))
      

      请注意,add-hook 的两个参数都被引用,这是必要的,如果您添加未引用的函数,它们可能不起作用。

      【讨论】:

      • (ac-config-default) 之后添加(add-hook 'objc-mode-hook 'auto-complete-mode) 不会使其工作。我想知道它是否可能与其他模式/插件冲突?
      猜你喜欢
      • 2015-10-06
      • 2015-03-09
      • 1970-01-01
      • 2022-07-29
      • 2015-08-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多