Visual studio code VSCode高级自定义代码段 上下文

Visual studio code VSCode高级自定义代码段 上下文,visual-studio-code,latex,vscode-snippets,Visual Studio Code,Latex,Vscode Snippets,在过去的18个月里,我一直在使用VSCode的LaTeX Workshop扩展来满足我所有的后期需求。到目前为止,我主要将其用于较长形式的文章和报告,偶尔也用于课堂笔记。到目前为止,我已经能够通过几个自定义宏(线性代数字体非常容易)使它实时工作得很好。然而,当我转到不同的类时,我希望通过在VSCode中实现来扩展我的实时能力。不幸的是,VSCode似乎模糊或(默认情况下)缺少Castel使用的大量特性(特别是和代码片段相关的特性) 我的问题 为了这篇文章的目的,我想把重点放在他的身上(我相信如果

在过去的18个月里,我一直在使用VSCode的LaTeX Workshop扩展来满足我所有的后期需求。到目前为止,我主要将其用于较长形式的文章和报告,偶尔也用于课堂笔记。到目前为止,我已经能够通过几个自定义宏(线性代数字体非常容易)使它实时工作得很好。然而,当我转到不同的类时,我希望通过在VSCode中实现来扩展我的实时能力。不幸的是,VSCode似乎模糊或(默认情况下)缺少Castel使用的大量特性(特别是和代码片段相关的特性)

我的问题 为了这篇文章的目的,我想把重点放在他的身上(我相信如果我能让这篇文章发挥作用,我就能让它的其余部分发挥作用)。基本上,问题似乎是VSCode已经完成了,特别是与Vim相比。Castel使用UltiSnips定义了一个自动扩展宏(我不确定VSCode是否支持自动扩展代码段),当键入
/
时,该宏会将前面的单词(或括号中的单词)转换为LaTeX分数格式。例如:

//             --> \frac{}{}
3/             --> \frac{3}{}
4\pi^2/        --> \frac{4\pi^2}{}
(1 + 2 + 3)/   --> \frac{1 + 2 + 3}{}
(1 + (2 + 3)/) --> (1 + \frac{2 + 3}{})
(1 + (2 + 3))/ --> \frac{1 + (2 + 3)}{}
如何在VSCode中实现此行为?

我的线索 我花了大量的时间研究这一点,我有充分的理由相信这是可能的,同样有充分的理由相信任何对我的问题的成功答案都必须要对我说——这种软件定制并不完全是我的拿手好戏,但我绝对愿意学习

首先,有两个很有希望的VSCode扩展可以实现UltiSNIP:和。Vsnips看起来不错,但它似乎依赖于对UltiSnips的熟悉程度以及如何为您的特定计算机配置UltiSnips(如果这一点非常重要,我使用的是2019年的MacBook Pro,我的软件是最新的[macOS Catalina 10.15.5截至本文])。关于HyperSNIP,我甚至还没能弄明白那么多——两者都没有很好的文档记录,而且没有一个文档是为我这个级别的读者编写的

虽然我说过VSCode的内部代码片段引擎似乎相当有限,但我可能错了。它似乎与另一个名为的代码段引擎接口

这就是我现在所能想到的。如果有任何进一步的信息,我可以提供,请让我知道!谢谢

安装后,使用其命令
HyperSnips:opensnippets目录
打开要放置代码段的目录

all.hsnips
中的代码片段将在所有语言文件中提供。您还可以将代码片段放入同一目录中的类似
latex.hsnips
latex.hsnips
的内容中,这两个版本对我都适用


从中修改代码将其放入所选的
.hsnips
文件:

snippet // "Fraction simple" A
\frac{$1}{$2}$0
endsnippet

snippet `((\d+)|(\d*)(\\)?([A-Za-z]+)((\^|_)(\{\d+\}|\d))*)/` "Fraction no ()" A
\frac{``rv = m[1]``}{$1}$0
endsnippet
请注意,插入的代码进入双反勾“``”,并且该代码中的值必须分配给
rv
(返回值)。分配给
rv
的内容将出现在代码段输出中。请注意,在上述代码段中还有额外的选项卡
$1、$2和$0
——可以通过
t
数组中的插值代码访问这些值,但此处不需要这些值

然后这里是最后一段代码,它适用于“前缀”中嵌入括号的较难情况,如
(1+(2+3))/
。我认为
(1+(2+3))/
就像传统的vscode代码片段前缀一样,只是您可以使用正则表达式作为前缀!!正则表达式前缀/触发器必须在backticks内

snippet `^.*\)/` "Fraction with ()" A
``
    let str = m[0];
    str = str.slice(0, -1);
    let lastIndex = str.length - 1;

    let depth = 0;
    let i = str.length - 1;

    while (true) {
        if (str[i] == ')') depth += 1;
        if (str[i] == '(') depth -= 1;
        if (depth == 0) break;
        i -= 1;
    }

    let results = str.slice(0, i) + "\\frac{" + str.slice(i+1, -1) + "}";
    results += "{$1}$0";
    rv = results;
    ``
endsnippet
这里
^.*\)/
是前缀/触发器。当您键入该模式时,扩展名会查看所有代码,该模式基本上在
/
之前至少有一个
,然后将这些模式之前的所有内容与前面的单词边界匹配。然后,匹配信息在匹配的代码中可用,如
m[0]
。您可以使用前缀/触发器创建捕获组,并在
m[1]
等中访问它们,但此处不需要这样做

如您所见,要使此扩展正常工作,要插入的代码必须是javascript

第一组反勾号的位置很重要!这里

snippet `^.*\)/` "Fraction with ()" A
``
   <other code indented here>
   ``  <indented or flush left, didn't seem to matter in my testing>
endsnippet
snippet`^.*\)/`“分数加上()”A
``

``嘿!刚刚开始工作,真高兴!想知道在Hypersnips中是否可以在中执行此操作。Castel有一长串的东西,所以这些math-y片段只能在LaTeX的数学模式下扩展。这可能吗?我真的怀疑它的上下文-我不熟悉乳胶,更不用说它的模式。您可以避免使用自动标志,而需要使用选项卡来插入更改以提供帮助。