昨天看了某 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_1
, a_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 功能本身进行增强的插件?