company和smartparens的配合问题

大家好!觉得emacs china的讨论氛围非常赞!本人第一次在这里发帖,请教大家一个问题:

我的emacs配置文件使用了company做自动补全,但是其会打断def关键字的自动生成匹配结尾end,这个功能据我测试应该是我配置文件里面的smartparen的。

我能想到的一种不太完美的解决办法是配置company,来使其排除掉def关键字的补全。但是不知道company的配置如何实现这个。

大家有遇到类似的问题吗?

16

一般 def 这种框架我都是用 yasnippet 生成,这样还有一个好处是补全后可以立即跳到预先设定的位置。然后内部再用 company


我其实也不大清楚具体的smartparens默认的行为,不过在我把我常使用的插件组合到一块之后,刚好发现了有这个补全,class,def,do,关键字都可以补全。这种补全在smartparens里面实现我觉得是非常自然的事情其实,因为这些本身就很像是括号的对应模式。yasnippet我其实不太常用,不过我感觉类似我这种声明,是非常语法式的,就类似说,用yasnippet来做大中小括号的定义一样,会不会感觉很奇怪。


这个不是很类似吧?yasnippet 的函数补全模板经常把函数参数,以及函数文档等空都预留出来,tab移动到下一个空,然后修改比较符合我的习惯。因为有的时候自己会忘记函数定义的这些要素。括号(字面意思)就用 smartparens,这才是大多数人的用法吧?当然,符合自己习惯就好。


我其实不太熟悉smartparens,但是像我提到的这种匹配,却也不是我特意定义出来的。另外的是,在ruby里面,像do end这种的语句,是等价于 { }的。

我记得关注company-mode的issues的时候,曾经看到过这个问题。你去里面搜索下应该在的。要么就是在smartparens的issues list里。

按楼上说的去翻了一下:Smartparens and Company in Elixir-Mode not pairing 'def' · Issue #723 · Fuco1/smartparens · GitHub

smartparens作者说,在def end这个pair的predicates里面加上company-active时输入空格执行的命令(看大写部分):

(sp-local-pair "defmodule" "end"
                 :when '(("SPC" "RET" "<evil-ret>" PUT-EXTRA-COMMANDS-OR-CALLBACKS-HERE))
                 :post-handlers '(sp-elixir-do-block-post-handler))

但是issue里没说这个命令是什么,我看了下company-mode-mapcompany-active-map里面都没有空格键的绑定,应该就是self-insert-command,和没有company时一样啊。也许是company-abort?

我用自己的配置没有问题, 应该是你配置的问题吧。


我在我的配置文件里里面反复删除排除过很多次,只要company呼出了候选项,再按空格smartparens就没有办法匹配生成补全结尾。

方便把你的配置文件链接给出来我看一下是我遗漏了什么吗?