关于Emacs中的自动完成和yasnippet功能

8

我正在使用Emacs中的自动完成和yasnippet,对它们的设置感到困惑。我将以下代码放置在我的.emacs文件中:

(add-to-list 'load-path "~/.emacs.d/plugins/yasnippet")
(require 'yasnippet)
(yas/global-mode 1)
(global-set-key (kbd "C-i") 'yas/expand)
(setq yas/also-auto-indent-first-line t)

(add-to-list 'load-path "~/.emacs.d/plugins/autocomplete/")
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/plugins/autocomplete/ac-dict")
(ac-config-default)
(setq ac-use-menu-map t)
(define-key ac-menu-map "\C-n" 'ac-next)
(define-key ac-menu-map "\C-p" 'ac-previous)

(defun ac-js-mode()
(setq ac-sources '(ac-source-yasnippet
                 ac-source-symbols
                 ac-source-words-in-buffer
                 ac-source-words-in-same-mode-buffers
                 ac-source-files-in-current-dir
                 )))
(add-hook 'js-mode-hook 'ac-js-mode)

我正在尝试将yasnippet设置为自动完成弹出菜单中的第一个候选项。然而,如下面的示例所示,我的当前设置无法实现:当我输入单词for时,formatItem在第一位置,for在第二位置。formatItem只是当前缓冲区中的一个本地函数。

 for_____________
|formatItem      |
|for            a|
|for            s|
|force          s|
|foreachv       s|
 ----------------

所以我的问题是:如何使yasnippet成为自动完成中的第一个候选项?我的.emacs配置是否有缺失?
感谢任何帮助。

我不知道答案,但是自动完成有一个内置的学习系统,所以你选择候选项的次数越多,下一次它就会排得更高。因此,你可能只需要使用它一段时间,所有经常使用的片段都会自动浮现到顶部。 - Tom
1个回答

5
ac-config-default会安装钩子来设置合理的默认ac-sources值。这些钩子(尤其是ac-common-setup)可能会干扰您的设置。
您可以通过查看js-mode缓冲区中C-h vac-sources的实际值来检查这一点,以比较它是否已被修改为自定义值。
如果是这种情况,我看到两个解决方案:
  • 停止使用ac-config-default并指定所有autocomplete设置,
  • 建议有故障的钩子在运行后将ac-source-yasnippet放在ac-sources的开头。假设确实是ac-common-setup造成了问题,则应如下所示:
(defadvice ac-common-setup (after give-yasnippet-highest-priority activate)
  (setq ac-sources (delq 'ac-source-yasnippet ac-sources))
  (add-to-list 'ac-sources 'ac-source-yasnippet))

谢谢你的回答。正如你所描述的那样。但是我并不清楚上面提到的方法2。你能再多给我讲解一些吗?谢谢。 - Boris
1
嗨,我把你的代码放到我的.emacs文件中后,在js文件中运行C-h v命令输出的ac-sources值似乎是正确的:它的值为(ac-source-yasnippet ac-source-filename ac-source-symbols ac-source-words-in-buffer ac-source-words-in-same-mode-buffers ac-source-files-in-current-dir)。在set.js缓冲区中本地设置;但是当我输入单词“for”时,弹出菜单仍然显示我在问题中给出的图形。我对此一无所知。 - Boris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接