Emacs 除了 YASnippet 之外还有没有更好一点的片段插件?

这两天终于耐下心来把 spacemacs 的文档扫了一遍,尝试着真正用起来。

配置了一半,发现 YASnippet 貌似也太弱了点吧?因为之前曾用过 ultisnips ,这个差距特明显。

但是网上初步搜了下,貌似 emacs 用的都是这个 …… 难道我搞错了什么东西?

个人特别依赖于 snippet ,请问下有用 spacemacs 的嘛?麻烦推荐下别的插件,提前感谢~ :pray:

这两个我都没用过,但是你说前者弱,最好说明一下依据,或许你对前者还有不了解的地方。

1 个赞

瞥了一眼ultisnips,没目测出和yasnippet的区别 (眼拙 :sweat_smile:

同意楼上,请指出弱在什么地方?个人觉得还蛮好的啊。 另外更强一点的话, abo-aboauto-yasnippet 可能是你想要的?

请问弱在哪?

我进 GitHub - SirVer/ultisnips: UltiSnips - The ultimate snippet solution for Vim. Send pull requests to SirVer/ultisnips! 看了一下动图,感觉 ultisnips 有一个功能很有趣:当用户输入函数的参数的时候,可以自动在下方插入相应的文档和赋值语句。

这是官方的示例

这个功能可以在yasnippet中实现吗?

可以使用 emacs-lisp 完成

说一下我体验到的差异:

  1. YASnippet 的 snippet 源貌似好久不更新了, ultisnips 更新就很勤快;只好去看文档尝试自己写。
  2. ultisnips 文档更详细,有例子说明,甚至还有动图。
  3. ultisnips 可以用 vimscript 、 shell 、 python 来写, YASnippet 只能 Lisp 。真心不想为这多学门语言。
  4. ultisnips 可以根据上下文展开,比如只有在行首才展开,比如上一行满足某条件才展开。
  5. ultisnips 有 visual placeholder ,比如你选择某个词语后展开 snippet ,它会自动帮你把选择的词语放到展开后的 snippet 某位置;
  6. ultisnips 可以即时创建匿名 snippet ,还可以定义展开前/展开后的动作。这俩特性可以做很多事情。比如我就发现用它可以实现 snippet “参数”的功能,比如你输入 table3x4 ,给你展开一个 3 行 4 列的 table ,而输入 table4x5 ,给你展开一个 4 行 5 列的 table 。
  7. 有时候你需要多个 snippet 源在一份文档中生效。比如写 html 就希望 js 、 css 甚至 md 的 snippet 都能同时用, ultisnips 很简单添加下文件类型就行, YASnippet 我还不清楚咋搞。

对照着文档目录,暂时就看到这些。另外,想请教下: Lisp 学起来简单不?

2 个赞

我只说一下我知道的 3。讲道理vimscript比lisp更没有学习意义……不过支持shell和python确实比较方便 4。应该可以吧不过我没用过这么高级的展开(:joy:) 6。我前面提到的auto-yasnippet可以 7。yasnippet也不难。比如你试试 web-mode

这个东西 Sublime Text 2 的时候就有,反正挺早的事儿了。

刚搜索到个 yas 的视频介绍,yas 也有这个的。但是不知道为啥 spacemacs 就没有,瞅了下自带的 snippet,全是最基本的应用,高级应用没有。

我并不会 vimscript,到现在我也不知道怎么定义数组。python 也基本不会的状态。 但是没关系呀,ultisnips 文档有例子,还有很多别人写的现成的 snippet 例子,照猫画虎就行。多个特性一起用,产生的效果就很惊人。 前面提到的 snippet 参数,生成自定义 table(同时加上相应数量的 tabstop)的例子就是我写的,已经提交合并到主分支了。

yas 问题是目前我看到的 snippet 全是最基本的例子,想抄都没地方抄。

谢谢回复。 6. 那只是举个例子,emmet 现在多普遍呐。 7. .yas-parents 看到了,这个问题算是解决了。得空试一下去。 随便多问一句,yas 有没有对全局生效的 snippet?比如 ultisnips 就有个 all.snippet 文件,这样就能在所有文件类型里面插入版权信息、时间日期等等 snippet。 yas 有这个的话,省得还得专门设置下了。

  1. yasnippet的snippets多数是第三方的作者贡献的,只自带最基本的例子;
  2. 觉得yas的文档不够详细,是因为不懂emacs lisp,至少我写过的没有文档里找不到的;
  3. 愿意学vimscript, shell, python…却不愿意学emacs lisp,这个没人帮到你;至于你想在snippet里调用vimscript, shell, python生成snippet也是秒秒钟的事;
  4. yasnippet一样可以指定展开条件,想什么时候展开就什么时候展开,什么时候不展开就不展开,也是一行的emacs lisp;比如,在org bable里使用src里面的snippet展开,在org bable外面使用org snippet展开,在这个context展开而不在另一个context展开;
  5. yas也可以;
  6. auto snippet或yasnippet一样也可以实现,比如我输入si1n可以展开成LaTeX的\sum_{i = 1}^{n},也可以用sj0m展开成\sum_{j = 0}^{m};
  7. .yas-parent;

总结:不会也真心不想学emacs lisp,也没人帮到忙。其它editor是个editor,emacs是个“操作系统”,不想写操作系统的代码,至少也得学个系统API call别的代码。所以用emacs不懂emacs lisp通常只能吃亏。所以会看到很多拿emacs写作文、做org的,也会写emacs lisp。至少,emacs lisp比vimscript正常得多。。

1 个赞

ultisnips 的 snippets 其实也是第三方的,貌似是对另一个插件 snipmate 做了兼容,继承了一部分。插件引擎和 snippets 源是完全分开的。 我对 vimscript、shell、python 都不通,不过对我搞一些看似复杂的 snippets 并没影响,因为有很多例子可以参考啊。 lisp 肯定要比 vimscript 功能强大得多。

但是目前,我只想要些例子来抄。快速找到感觉,能迁移过来才比较重要吧。

大家有没有比较好的源推荐呢? ispinfx 把你的 snippet 借我抄抄吧 :joy:

应该是这个。 刚我又仔细看了一下,这个和 ST3、vim 的实现还是有区别的,没有根据参数个数产生新行。

fundamental-mode 具体咋用呢?刚试了下,设为这个模式后 yas 菜单不见了。 spacemacs 默认配置,基本没任何改动呢。

fundamental-mode 那个 我大概明白咋做了,:grin:

Ul­tiSnips是NB了一点