VSCode Snippets 功能拓展?

2019-06-30 22:44:36 +08:00
 hourann

昨天看了某 V 友翻译的用 Vim 和 LaTeX 在数学课上跟上授课速度并记下笔记,寻思着能不能把这套工作流迁移到 VSCode 上来,并拥有不输于原工作流的体验。

随后我就发现 VSCode 的 snippets 功能局限性很大。原文中介绍了 Vim 中的UltiSnips 插件,不但提供了更精细的控制,而且还可编程(Python)。

比如

snippet beg "begin{} / end{}" bA
\begin{$1}	
	$0
\end{$1}
endsnippet

这里第一行的末尾的 b 表示只在行首展开,A 表示自动展开(不需要按 Tab )。

文中还有一些其它的控制 flag, 如:

w: 只在单词边界触发,如触发关键字为mk时,hellomk不会拓展,但是hello mk会。

r: 支持通过正则表达式指定触发条件。

支持跟 python 交互,如文中展示了一种自动将 a1 改成 a_1a_12 改成 a_{12}的 snippet:

snippet '([A-Za-z])(\d)' "auto subscript" wrA
`!p snip.rv = match.group(1)`_`!p snip.rv = match.group(2)`
endsnippet

snippet '([A-Za-z])_(\d\d)' "auto subscript2" wrA
`!p snip.rv = match.group(1)`_{`!p snip.rv = match.group(2)`}
endsnippet

其中被`!p ... `包起来的是 Python 代码,这个 block 会被 snip.rv 的值替换。

文中还展示了一个很有意思的 snippet,把一段文字包括在一个框中:

snippet box "Box"
`!p snip.rv = '┌' + '─' * (len(t[1]) + 2) + '┐'`
│ $1 │
`!p snip.rv = '└' + '─' * (len(t[1]) + 2) + '┘'`
$0
endsnippet

效果如下:

拿 VSCode 也能写一个蹩脚的仿制品:

"Box": {
	"prefix": "box",
	"body": [
		"┌${1/./-/g}┐",
		"|$1|",
		"└${1/./-/g}┘"
	],
}

输入完按 Tab 就能完成替换。

所以 VSCode 有没有 UltiSnips 的替代品,或者什么对 Snippets 功能本身进行增强的插件?

1256 次点击
所在节点    问与答
0 条回复

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/578813

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX