Как сделать yasnippet автозаполнением?

Я хочу сделать yasnippet серверной частью auto-complete. Однако это не работает. после поиска в Интернете я делаю следующее: получаю auto-complete-yasnippet. el, добавьте elisp в .emacs вот так:

(add-to-list 'load-path
     "~/.emacs.d/plugins/yasnippet")
(require 'yasnippet)
(yas-global-mode 1)
(yas-minor-mode nil)
(global-set-key (kbd "M-/") 'yas/expand)

;; Auto-complete settings
;; this is the code for the auto-complete
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d//ac-dict")
(ac-config-default)

;;setup for auto-complete-yasnippet
(require 'auto-complete-yasnippet)
(setq-default ac-sources
      '(
        ;; ac-source-semantic
        ac-source-yasnippet
        ac-source-abbrev
        ac-source-words-in-buffer
        ac-source-words-in-all-buffer
        ;; ac-source-imenu
        ac-source-files-in-current-dir
        ac-source-filename
        )
      )

Я смотрю на содержимое ac-sources в *scratch* с помощью C-h v, и в нем действительно есть ac-source-yasnippet. кто-то сказал, что может быть что-то не так с версией и обновлением auto-complete, а также yasnippet. Как это можно исправить? Моя версия emacs — 23.3.1, моя версия auto-complete — 1.3.1, а моя версия yasnippet — 0.8.0 (бета), которую только что скачали с github. любая помощь?


person toolchainX    schedule 13.11.2012    source источник
comment
Я использую emacs под Windows 7, и M-/ — это привязка клавиш, которую я определил, чтобы yasnippet не конфликтовала с auto-complete при использовании клавиши ‹kbd›TAB‹/kbd›   -  person toolchainX    schedule 14.11.2012


Ответы (2)


вы можете легко сделать это (require 'auto-complete-yasnippet)

а затем вы можете изменить автозаполнение следующим образом:

(defun my-ac-config ()
  (setq-default ac-sources '(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)
  (add-hook 'octave-mode-hook 'ac-octave-mode-setup)
  (global-auto-complete-mode t))
(defun my-ac-cc-mode-setup ()
  (setq ac-sources (append '(ac-source-clang ac-source-yasnippet) ac-sources)))
(add-hook 'c-mode-common-hook 'my-ac-cc-mode-setup)
;; ac-source-gtags
(my-ac-config)

Он отлично работает на моей машине.

person madper    schedule 14.11.2012
comment
Я думаю, что это может быть проблема версии yasnippet, см. мой ответ с обратной стороны. - person toolchainX; 14.11.2012

возможно, что-то не так с auto-complete-config.el при приобретении ac-yasnippet-candidates в версии auto-complete-1.3.1:

(defun ac-yasnippet-candidates ()
  (with-no-warnings
    (if (fboundp 'yas/get-snippet-tables)
        ;; >0.6.0
        (apply 'append (mapcar 'ac-yasnippet-candidate-1 (yas/get-snippet-tables major-mode)))
      (let ((table
             (if (fboundp 'yas/snippet-table)
                 ;; <0.6.0
                 (yas/snippet-table major-mode)
               ;; 0.6.0
               (yas/current-snippet-table))))
        (if table
            (ac-yasnippet-candidate-1 table))))))

приведенный выше фрагмент кода необходимо немного изменить, чтобы он был совместим с версией yasnippet-0.8.0. Я загружаю новейшую версию auto-complete-1.4.0 с github, и это решает проблему, судя по версии yasnippet и принять соответствующие меры. Как это:

(defun ac-yasnippet-candidates ()
  (with-no-warnings
    (cond (;; 0.8 onwards
           (fboundp 'yas-active-keys)
           (all-completions ac-prefix (yas-active-keys)))
          (;; >0.6.0
           (fboundp 'yas/get-snippet-tables)
           (apply 'append (mapcar 'ac-yasnippet-candidate-1
                                  (condition-case nil
                                      (yas/get-snippet-tables major-mode)
                                    (wrong-number-of-arguments
                                     (yas/get-snippet-tables))))))
          (t
           (let ((table
                  (if (fboundp 'yas/snippet-table)
                      ;; <0.6.0
                      (yas/snippet-table major-mode)
                    ;; 0.6.0
                    (yas/current-snippet-table))))
             (if table
                 (ac-yasnippet-candidate-1 table)))))))

Я скопировал auto-complete-config.el из auto-complete-1.4.0версии, скомпилировал ее и заменил те же файлы (и auto-complete-config.el, и auto-complete-config.elc) в auto-complete-1.3.1версии. это просто сработало! Я думаю, что файл конфигурации auto-complete не должен быть включен в дистрибутив, и, возможно, его следует поддерживать отдельно, чтобы упростить совместимость с его бэкэндами.

Я перенастроил yasnippet и auto-complete следующим образом:

;; setup for yasnippet
(add-to-list 'load-path
      "~/.emacs.d/plugins/yasnippet")
;; Extension and configuration of yasnippet.
(require 'yasnippet-config)
;; If you use yasnippet from 'auto-complete', add
(yas/set-ac-modes)
(yas/enable-emacs-lisp-paren-hack)
;; before 'auto-complete' settings.
;; Auto-complete settings
;; this is the code for the auto-complete
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d//ac-dict")
(ac-config-default)
person toolchainX    schedule 14.11.2012