我从头开始使用 Emacs 24,并安装了最新的 yasnippet 和自动完成功能,并且名义上可以正常工作。现在,作为 emacs 用户和 android 开发人员,我想使用我最喜欢的编辑器并自动执行一些来自 android 开发的任务。我对 elisp 几乎一无所知。
我的第一个任务是使用自定义代码片段在 AndroidManifest.xml 中添加 uses-sdk 标签。yasnippet 没问题,但我想使用自动完成来交互式地提出和自动完成 android 特定标签。问题是 AndroidManifest.xml 的主要模式是 nxml,我不想向所有与 nxml 模式相关的缓冲区提出 android 细节。因此,我在片段定义中对缓冲区名称使用了条件。现在,我想向 nxml-mode-hook 添加一个自定义挂钩,但我未能启用自动完成模式。
我的片段:
#contributor : Me, Myself and I
#name : <uses-sdk ... />
#condition : (string= (buffer-name) "AndroidManifest.xml")
# --
<uses-sdk android:minSdkVersion="$0" />
惨遭失败的 .emacs 部分:
;; yasnippet
(add-to-list 'load-path "~/.emacs.d/yasnippet")
(require 'yasnippet)
(setq yas/trigger-key (kbd "C-c <kp-multiply>"))
(yas/initialize)
;; Develop in ~/emacs.d/mysnippets, but also
;; try out snippets in ~/Downloads/interesting-snippets
(setq yas/root-directory '("~/.emacs.d/snippets"
"~/.emacs.d/external-snippets"))
;; Map `yas/load-directory' to every element
(mapc 'yas/load-directory yas/root-directory)
;; auto-complete
(add-to-list 'load-path "~/.emacs.d/auto-complete")
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/auto-complete/ac-dict")
(setq-default ac-sources '(ac-source-yasnippet ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
(add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup)
(add-hook 'c-mode-common-hook 'ac-cc-mode-setup)
(add-hook 'ruby-mode-hook 'ac-ruby-mode-setup)
(add-hook 'css-mode-hook 'ac-css-mode-setup)
(add-hook 'auto-complete-mode-hook 'ac-common-setup)
(global-auto-complete-mode t)
;; android specific settings
;; AndroidManifest.xml
(defun ac-android-manifest-nxml-setup()
""
(when (string= (buffer-name) "AndroidManifest.xml")
(setq ac-sources '(ac-source-yasnippet ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))))
(add-hook 'nxml-mode-hook 'ac-android-manifest-nxml-setup)
该代码段按预期工作,但如果我使用M-x auto-complete-mode
.
任何帮助将不胜感激。