Сделайте так, чтобы режимы автозаполнения и yasnippet работали вместе для редактирования конкретного файла в GNU / Emacs - PullRequest
1 голос
/ 16 сентября 2011

Я использую Emacs 24 с нуля с последней версией yasnippet и с автозаполнением, установленной и номинально работающейТеперь, как пользователь emacs и разработчик Android, я бы хотел использовать свой любимый редактор и автоматизировать некоторые задачи для разработки под Android.Я почти ничего не знаю об elisp.

Моя первая задача - использовать пользовательские фрагменты для добавления тега Use-SDK в AndroidManifest.xml.Это нормально с yasnippet, но я бы хотел использовать автозаполнение для интерактивного предложения и автозаполнения специфичных для Android тегов.Проблема в том, что основным режимом для AndroidManifest.xml является nxml, и я не хочу предлагать особенности Android для всех буферов, связанных с режимом nxml.Как следствие, я использую условие для имени буфера в определении фрагмента.Теперь я хотел бы добавить пользовательский хук к 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.

Любая помощь будетс благодарностью.

1 Ответ

0 голосов
/ 16 сентября 2011

Хорошо работает с

;; 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)
...