我如何在 vscode / Ultisnips(vim) 中制作一个可以具有可变数量参数(选项卡触发器)的代码片段,如下所示:

问题描述 投票:0回答:1

如果我输入

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;
    }
}

我想知道如何访问代码前缀(代码片段的触发器名称)并据此调整输出代码

vim code-snippets vscode-snippets ultisnips
1个回答
0
投票

可悲的是,这是不可能的。尽管您可以获得选定的文本,它可以创建类似于第二个片段请求的内容。首先,您必须为每个变体创建一个新的代码片段。虽然不方便,但也不难。

遗憾的是,据我所知,您无法从代码片段名称创建逻辑。这不是您有权访问的变量。

对于第二个,虽然它不能来自代码片段名称,但如果您同意的话,您可以从所选文本中获取这些数字。这是相当困难的,也是使用正则表达式的高级主题。如果你只有两个变量,最后输出在最后,我就有了答案。

如果您仍然愿意创建一个工作方式稍有不同的代码片段,以下内容在某种程度上回答了您的第二个问题。为了确认,工作流程将写入

_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+_)//}
将为您提供选择中的第二个数字

© www.soinside.com 2019 - 2024. All rights reserved.