【问题标题】:How to make the yasnippet as the auto-complete backend?如何使 yasnippet 作为自动完成后端?
【发布时间】:2012-11-01 21:28:09
【问题描述】:

我想让yasnippet 作为auto-complete 的后端。但是,它不起作用。我在网上搜索后的操作如下: 获取auto-complete-yasnippet.el,在.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
        )
      )

我用 C-h v 查看 *scratch* 中 ac-sources 中的内容,它确实有 ac-source-yasnippet。有人saidauto-completeyasnippet 的版本和升级可能有问题。如何修复? 我的 emacs 版本是 23.3.1 我的 auto-complete 版本是 1.3.1 而我的 yasnippet 版本是 0.8.0(beta),这是刚刚从 github 下载的。有什么帮助吗?

【问题讨论】:

  • 我在Windows 7下使用emacs,M-/是我定义的键绑定,使yasnippet在使用TAB键时与auto-complete不冲突 kbd>

标签: emacs autocomplete yasnippet


【解决方案1】:

您可以通过(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)

它在我的机器上运行良好。

【讨论】:

  • 我认为这可能是yasnippet 版本的问题,请参阅我的答案。
【解决方案2】:

auto-complete-1.3.1 版本中获取ac-yasnippet-candidates 时,auto-complete-config.el 可能有问题:

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

上面的代码 sn-p 必须稍作更改以与yasnippet-0.8.0version 兼容。我从github下载了最新版本的auto-complete-1.4.0,解决了问题判断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-1.4.0version 复制了auto-complete-config.el,对其进行了字节编译,并在auto-complete-1.3.1version 中替换了相同的文件(auto-complete-config.elauto-complete-config.elc)。它刚刚奏效!我认为auto-complete 的配置文件可能不应该包含在发行版中,也许应该单独维护以使其易于与其后端兼容。

我像这样重新配置了yasnippetauto-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)

【讨论】:

    猜你喜欢
    • 2013-03-24
    • 2013-11-22
    • 1970-01-01
    • 2012-04-09
    • 2015-08-07
    • 1970-01-01
    • 2016-06-10
    • 2021-08-28
    • 2016-07-05
    相关资源
    最近更新 更多