V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
hourann
V2EX  ›  问与答

VSCode Snippets 功能拓展?

  •  
  •   hourann · 2019-06-30 22:44:36 +08:00 · 1253 次点击
    这是一个创建于 1777 天前的主题,其中的信息可能已经有所发展或是发生改变。

    昨天看了某 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
    

    效果如下: box

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

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

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

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

    目前尚无回复
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2664 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 05:11 · PVG 13:11 · LAX 22:11 · JFK 01:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.