如何在VSCode/UltiSnips(Vim)中创建带可变参数的代码片段
VSCode 实现可变参数代码片段
1. 动态 inputN 输入片段
VSCode 代码片段支持正则触发与变量替换,可通过解析触发词中的数字生成对应数量的输入占位符。在全局或工作区代码片段文件(如cpp.json)中添加以下配置:
{ "Dynamic Input": { "prefix": "input(\\d+)", "body": [ "cin >> ${1:var1} ${2:+>> ${2:var2}} ${3:+>> ${3:var3}} ${4:+>> ${4:var4}} ${5:+>> ${5:var5}} ${6:+>> ${6:var6}} ${7:+>> ${7:var7}} ${8:+>> ${8:var8}} ${9:+>> ${9:var9}};", "$0" ], "description": "Generate cin input with N variables", "regex": true } }
- 触发逻辑:输入
input3时,正则匹配提取数字3,渲染对应数量的占位符(${n:+...}为条件语法,未使用的占位符会自动隐藏)。 - 占位符说明:
${1:var1}是带默认值的首变量,后续${2:+>> ${2:var2}}表示仅当第2个占位符被使用时才显示>> var2。
2. 动态 arrinputMN 矩阵输入片段
通过正则触发解析矩阵的M和N维度,生成初始化与输入代码:
{ "Dynamic Matrix Input": { "prefix": "arrinput(\\d+)(\\d+)", "body": [ "vector<vector<int>> arr($1, vector<int>($2));", "for (int i = 0; i < $1; ++i) {", " for (int j = 0; j < $2; ++j) {", " cin >> arr[i][j];", " }", "}", "$0" ], "description": "Generate MxN matrix initialization and input", "regex": true } }
- 触发逻辑:输入
arrinput34时,正则提取3和4,分别替换代码中的$1和$2,生成3行4列的矩阵输入代码。
UltiSnips (Vim) 实现可变参数代码片段
UltiSnips 支持用 Python 代码解析触发词,灵活性更强,可处理任意数字的场景。在 UltiSnips C++ 代码片段文件(如cpp.snippets)中添加以下内容:
1. 动态 inputN 输入片段
snippet input(\d+) "Dynamic cin input" r `!p n = int(match.group(1)) parts = [f"${{{i}:var{i}}}" for i in range(1, n+1)] snip.rv = "cin >> " + " >> ".join(parts) + ";$0" ` endsnippet
- 触发逻辑:
r表示正则触发,输入input5时,match.group(1)提取数字5,Python 代码自动生成5个占位符拼接成目标代码。 - 优势:支持任意正整数N,无需提前写死占位符数量。
2. 动态 arrinputMN 矩阵输入片段
snippet arrinput(\d+)(\d+) "Dynamic MxN matrix input" r `!p m = int(match.group(1)) n = int(match.group(2)) code = f"vector<vector<int>> arr({m}, vector<int>({n}));\n" code += "for (int i = 0; i < {m}; ++i) {{\n for (int j = 0; j < {n}; ++j) {{\n cin >> arr[i][j];\n }}\n}}$0".format(m=m, n=n) snip.rv = code ` endsnippet
- 触发逻辑:输入
arrinput23时,match.group(1)和match.group(2)分别提取2和3,生成2行3列的矩阵初始化与循环输入代码。
内容的提问来源于stack exchange,提问作者Cosec SecCot
相关产品推荐
相关产品推荐

