[英]Auto-complete mode doesn't turn on automatically in ObjC buffers
我加載這樣的自動完成模式:
(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
以某種方式覆蓋它。 有沒有辦法解決這個問題?
謝謝。
在查看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
下行添加到.emacs
文件為我解決了此問題。
; add this line after the auto-complete mode has been loaded
(add-to-list 'ac-modes 'objc-mode)
使用以下內容:
(defun my-objc-mode-hook ()
(auto-complete-mode 1))
(add-hook 'objc-mode-hook 'my-objc-mode-hook)
注1:當不帶參數調用時,功能auto-complete-mode
為切換功能。
注意2:可以使用lambda
添加匿名函數,但這有一些缺點。 最重要的是:修改函數並重新評估表達式將在早期版本的基礎上添加修改后的函數,而Ch v xxx
將打印完整的未格式化lambda函數,這通常是無法閱讀和理解的。
(add-hook 'objc-mode-hook 'auto-complete-mode)
如果您使用的是自動完成模式,則應該這樣做。 您可以通過執行以下操作將更多復雜的事情添加到模式掛鈎:
(add-hook 'objc-mode-hook '(lambda ()
(something-with arguments)))
請注意,add-hook的兩個參數都用引號引起來,這是必需的,如果添加未引號的函數,則它們可能無法工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.