使自动完成和 yasnippet 模式协同工作以在 GNU/Emacs 中编辑特定文件

Posted

技术标签:

【中文标题】使自动完成和 yasnippet 模式协同工作以在 GNU/Emacs 中编辑特定文件【英文标题】:Make auto-complete and yasnippet modes work together to edit a specific file in GNU/Emacs 【发布时间】:2011-09-15 20:53:50 【问题描述】:

我从头开始使用 Emacs 24,并安装了最新的 yasn-p 和自动完成功能,并且名义上可以正常工作。现在,作为 emacs 用户和 android 开发人员,我想使用我最喜欢的编辑器并自动化一些来自 android 开发的任务。 我对 elisp 几乎一无所知。

我的第一个任务是使用自定义sn-ps在AndroidManifest.xml中添加uses-sdk标签。 yasn-p 没问题,但我想使用自动完成来交互式地提出和自动完成 android 特定标签。问题是 AndroidManifest.xml 的主要模式是 nxml,我不想向所有与 nxml 模式相关的缓冲区提出 android 细节。因此,我在 sn-p 定义中对缓冲区名称使用了条件。现在,我想在 nxml-mode-hook 中添加一个自定义挂钩,但我未能启用自动完成模式。

我的sn-p:

#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)

sn-p 可以按预期工作,但如果我使用 M-x auto-complete-mode 启用自动完成功能,自动完成功能将无法完成。

任何帮助将不胜感激。

【问题讨论】:

您能澄清您要解决的问题吗?是sn-p的问题吗?好像不是,因为你说的是​​The snippet works as intended...。在那种情况下,您为什么还要在这个问题中提到sn-p?说the completion don't though the auto-completion works... 是什么意思。完成是否有效?你还在你的问题中加入了这样的陈述:I failed to enable the auto-complete mode.是真正的问题吗?也许你可以多用几句话。澄清你在问什么。 另外,如果你想用给定的模板自动填充文件,你可以试试emacswiki.org/emacs/DefaultContent 我提到 yasn-p 因为我想自动完成 yasn-p 键。我的意思是,当我手动启用自动完成模式时,自动完成效果很好。问题是我未能使用 nxml-mode 上的钩子自动启用自动完成功能。我确认我不需要文件模板(这是题外话,但 android 项目确实初始化了 AndroidManifest 文件,我为活动、权限等提供了模板) 最后一句的一部分已被我的安卓手机损坏(和母语完成):我需要活动模板,权限。 【参考方案1】:

很好用

;; 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")
(ac-config-default)

;; 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))
    ((lambda () (auto-complete-mode 1)))))
(add-hook 'nxml-mode-hook 'ac-android-manifest-nxml-setup)

【讨论】:

ac-sources 应该适应...

以上是关于使自动完成和 yasnippet 模式协同工作以在 GNU/Emacs 中编辑特定文件的主要内容,如果未能解决你的问题,请参考以下文章

接口自动化之协同办公自动化平台二(ScriptManagement)

协同oa办公的主要功能和作用有哪些?

Jquery UI 和 Bootstrap JS 冲突使自动完成停止工作

Angular 和 Spring Boot:使它们有效协同工作的配置

设计模式之中介者模式

在创建超类和子类时,父类和子类的类字段是不是需要公开才能使它们协同工作? [复制]