emmet 和 snippet 之间的冲突如何解决?

我为自己的atom设置了模板语法的snippet(snippets.cson),例如:

'.text.html.basic':
  'tp3_foreach':
    'prefix': 'fore'
    'body': """
    <foreach name=\"${1:test1}\" item=\"vo\" key=\"k\" >
      $2
    </foreach>
    """

在 html文件 中输入 fore 即可得到 body 中的自动补全。

但是在emmet插件开启的时候,snippet无法被触发(原因是emmet被优先触发了)。
于是我只好关闭了emmet。
虽然autocomplete已经很强大,但是emmet的功能还是用的很习惯,如果哪位有了解决方案,期待分享一下,谢谢大家。 :smile:

虽然我不用 emmet 也不用 snippet, 但也帮你想了一个不是很优雅的办法,在 keymap.cson 中添加:

'atom-text-editor.autocomplete-active[data-grammar="text html basic"]:not([mini])':
  'tab': 'autocomplete-plus:confirm'

这样的话,(在 html 文件中)只要 autocomplete-plus 的提示框出现了,那么 tab 键执行的就是 autocomplete-plus:confirm, 只有没有提示框的情况下,执行的才是 emmet:expand-abbreviation-with-tab, 符合你的要求,不过我估计实际用起来应该不是很方便,因为基本上你输入什么字符,提示框都会出现(或者你可以考虑用其他的快捷键,比如 cmd-shift-e 来触发 emmet)。

至于原因,我认为是 emmet 的选择器用了 data-grammar="text html basic", 比 autocomplete-plus 的规则更具体,所以 emmet 先执行。

2赞

谢谢了,我试了你提供的方法。
在开启 autocomplete-snippets 插件,并在 keymap.cson 添加了你的代码,测试发现有效果 。
emmet 和 snippet 都能使用了。
初步体验,感觉还不错。 :smile: