如果我输入
input5
,那么它会生成如下代码:
cin >> $1 >> $2 >> $3 >> $4 >> $5;$0
如果我输入
input2
,那么它会生成如下代码:
cin >> $1 >> $2;$0
另一个例子: 如果我输入
arrinputmn
(其中 m 和 n 是 mxn 矩阵的大小),那么它会生成如下代码:
${1:"int"} {$2:"arr"}[m][n] = {${3:"0"}};
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
int x;
cin >> x;
$2[i][j] = x;
}
}
我想知道如何访问代码前缀(代码片段的触发器名称)并据此调整输出代码
可悲的是,这是不可能的。尽管您可以获得选定的文本,它可以创建类似于第二个片段请求的内容。首先,您必须为每个变体创建一个新的代码片段。虽然不方便,但也不难。
遗憾的是,据我所知,您无法从代码片段名称创建逻辑。这不是您有权访问的变量。
对于第二个,虽然它不能来自代码片段名称,但如果您同意的话,您可以从所选文本中获取这些数字。这是相当困难的,也是使用正则表达式的高级主题。如果你只有两个变量,最后输出在最后,我就有了答案。
如果您仍然愿意创建一个工作方式稍有不同的代码片段,以下内容在某种程度上回答了您的第二个问题。为了确认,工作流程将写入
_m_n
,例如,如果 m=13 且 n=52_13_52
,选择该文本,然后输入 arrinputnm。为了清楚起见,这是此行为的 gif
如本问题及其链接Wrap Selection Snippet on Visual Studio Code (vscode)所示,您可以将之前的选择作为代码片段中的变量获取。
使用此处的变量“TM_SELECTED_TEXT”:https://code.visualstudio.com/docs/editor/userdefinedsnippets#_variables
以及这里的变量转换:https://code.visualstudio.com/docs/editor/userdefinesnippets#_variable-transforms为了只得到我们需要的东西,我们可以创建一些有用的东西。
我们可以创建类似的东西。
在这种情况下,我们想要输入类似
_12_34
的内容,选择该文本,然后将其替换为 arrinputmn
从而触发我们的代码片段
首先,我们需要找到所有不是第一次出现的数字的所有内容,然后将其替换为空。在正则表达式中,这是
/(_(?:[^_\\r]*)$|_)/g
。或者,完全地,在 vscode 变量转换中,这将是 ${TM_SELECTED_TEXT/(_(?:[^_\\r]*)$|_)//g}
其次,我们需要替换原来的下划线,任何数字,然后是第二个下划线。其正则表达式是
/(_\\d+_)//
或者完全是 ${TM_SELECTED_TEXT/(_\\d+_)//}
所以,总而言之,您的代码片段的最终输出将是这样的:
{
"arrinputnm": {
"prefix" : "arrinputnm",
"body": [
"${1:int} ${2:arr}[${TM_SELECTED_TEXT/(_(?:[^_\\r]*)$|_)//g}][${TM_SELECTED_TEXT/(_\\d+_)//}] = {${3:0}};",
"for (int i = 0; i < ${TM_SELECTED_TEXT/(_(?:[^_\\r]*)$|_)//g}; i++) { ",
"\tfor (int j = 0; j < ${TM_SELECTED_TEXT/(_\\d+_)//}; j++) {",
"\t\tint x;",
"\t\tcin >> x;",
"\t\t$2[i][j] = x;",
"\t}",
"}"
],
"description": "css comment"
}
}
抱歉,我无法为您提供 utilisnips 输出,我使用 luasnip,它允许在片段中使用 textmate (vscode) 语法。
如果您想使用另一个片段再次执行此操作,代码
${TM_SELECTED_TEXT/(_(?:[^_\\r]*)$|_)//g}
将为您提供选择中的第一个数字,代码 ${TM_SELECTED_TEXT/(_\\d+_)//}
将为您提供选择中的第二个数字