关于解决Company mode和Yasnippet之间干扰的修复方案

8
< p > Emacs Wiki说:

< blockquote >

Company会干扰Yasnippet的本地行为。这里是一个快速修复方法:http://gist.github.com/265010

代码如下:

(define-key company-active-map "\t" 'company-yasnippet-or-completion)

(defun company-yasnippet-or-completion ()
  (interactive)
  (if (yas/expansion-at-point)
      (progn (company-abort)
             (yas/expand))
    (company-complete-common)))

(defun yas/expansion-at-point ()
  "Tested with v0.6.1. Extracted from `yas/expand-1'"
    (first (yas/current-key)))

我将那段代码放到了我的.emacs文件中,出现了以下信息:

Warning (initialization): An error occurred while loading `c:/Documents and Settings/Alex.AUTOINSTALL.001/Application Data/.emacs.elc':

Symbol's value as variable is void: company-active-map

To ensure normal operation, you should investigate and remove the
cause of the error in your initialization file.  Start Emacs with
the `--debug-init' option to view a complete error backtrace.

我需要把修复代码放在YASnippet的.el文件中吗?还是放在我的.emacs文件中(这会导致错误)?
2个回答

6

你提到的那段代码已经失效了。

这里有一段可以替代的代码:

(defun company-yasnippet-or-completion ()
  (interactive)
  (let ((yas-fallback-behavior nil))
    (unless (yas-expand)
      (call-interactively #'company-complete-common))))

为了确保调用此函数而不是company-complete-common,请使用:
(add-hook 'company-mode-hook (lambda ()
  (substitute-key-definition 'company-complete-common
                             'company-yasnippet-or-completion
                             company-active-map)))

背景:这会在本地更改yas-fallback-behaviour的值,如果没有找到完成项,则会导致yas调用company-complete-common


4
作为yasnippet的作者,我可以确认这是API的合法使用,而之前的代码则不是。 - joao
1
“(apply 'company-complete-common nil)” 不就是说 “(company-complete-common)” 的冗长方式吗?还是应该写成 “(quote (apply company-complete-common))”? - npostavs
@npostavs:你说得对,那里确实缺少引号。我抓住这个机会简化了代码片段。 - Clément

-3

这听起来像是加载路径的问题。符号值为空意味着Emacs找不到它的定义 - 最有可能是因为包含其定义的文件尚未被加载。

您可以尝试在您的.emacs文件中添加类似以下内容(在引起错误的代码之前):

;; where ~/.emacs.d/ is the path to a directory containing
;; additional library code you want emacs to load
(add-to-list 'load-path "~/.emacs.d/")

2
那不是问题,因为他在访问地图时没有特别加载任何东西。问题在于他在那个时候没有加载company-mode。 - RichieHH

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