大家好!觉得emacs china的讨论氛围非常赞!本人第一次在这里发帖,请教大家一个问题:
我的emacs配置文件使用了company做自动补全,但是其会打断def
关键字的自动生成匹配结尾end
,这个功能据我测试应该是我配置文件里面的smartparen
的。
我能想到的一种不太完美的解决办法是配置company,来使其排除掉def
关键字的补全。但是不知道company的配置如何实现这个。
大家有遇到类似的问题吗?
大家好!觉得emacs china的讨论氛围非常赞!本人第一次在这里发帖,请教大家一个问题:
我的emacs配置文件使用了company做自动补全,但是其会打断def
关键字的自动生成匹配结尾end
,这个功能据我测试应该是我配置文件里面的smartparen
的。
我能想到的一种不太完美的解决办法是配置company,来使其排除掉def
关键字的补全。但是不知道company的配置如何实现这个。
大家有遇到类似的问题吗?
一般 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-map
和company-active-map
里面都没有空格键的绑定,应该就是self-insert-command
,和没有company时一样啊。也许是company-abort
?
我用自己的配置没有问题, 应该是你配置的问题吧。
我在我的配置文件里里面反复删除排除过很多次,只要company呼出了候选项,再按空格smartparens就没有办法匹配生成补全结尾。
方便把你的配置文件链接给出来我看一下是我遗漏了什么吗?