Jin*_*Yan 7 code-snippets visual-studio-code vscode-snippets
我想知道是否可以在 VSCode 用户定义代码段中的代码段中引用另一个代码段。
说我有
"Test1": {
"prefix": "snippet_test1",
"body":
"something"
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在另一个片段中插入snippet_test1,比如
"Test2": {
"prefix": "snippet_test2",
"body":
"${1:snippet_test1}"
}
Run Code Online (Sandbox Code Playgroud)
现在snippet_test2 只是输出snippet_test1而不是snippet_test1 的内容。
@Mark 提供了使用宏的一个很好的答案,我为感兴趣的人提供了另一个可能的答案。
"Test1": {
"prefix": "snippet_test1",
"body":
"something"
}
"Test2": {
"prefix": "snippet_test2",
"body":
"${1:snippet_test1}"
}
Run Code Online (Sandbox Code Playgroud)
对于 Test2,它只显示而不是 Test1 内容的 snippet_test1,但如果您点击ctrl+spacesnippet_test1,它将显示可用的可用代码片段列表,并且您可以将 snippet_test2 中的文本扩展为 snippet_test1 中的完整内容。
我认为相互包含或嵌套片段的唯一方法是使用宏或其他编程方式。这是使用宏扩展的解决方案multi-command。
假设您有这三个片段(在某些片段文件中):
"Master Snippet": {
"prefix": "master_snippet",
"body": [
"body of master",
"snippet2 = $2",
"$1",
"some other stuff",
"$1",
],
"description": "build the multi-snippet"
},
"snippet1": {
"prefix": "sn1",
"body": [
"body of snippet1",
],
"description": "insert1"
},
"snippet2": {
"prefix": "sn2",
"body": [
"I am snippet2",
],
"description": "insert2"
},
Run Code Online (Sandbox Code Playgroud)
然后你的宏将Master Snippet首先打印,然后无论光标在哪里 - 光标最初将位于两个 $1 制表位位置 - 宏将插入 snippet1。
然后使用"jumpToNextSnippetPlaceholder",宏中的命令,您将跳转到下一个制表符 $2,它可以在任何位置 - 我将其放在 $1 之前(插入 snippet1 的位置),而 snippet2 将插入到制表符 $2 处。
您可以看到,这Master Snippet是您构建用于插入其他片段的结构的地方 -根据 tabstops。
该宏看起来像这样(在你的settings.json中):
"multiCommand.commands": [
{
"command": "multiCommand.insertMultipleSnippets",
"sequence": [
{
"command": "editor.action.insertSnippet",
"args": {
"name": "Master Snippet",
}
},
{
"command": "editor.action.insertSnippet",
"args": {
"name": "snippet1",
}
},
"jumpToNextSnippetPlaceholder",
{
"command": "editor.action.insertSnippet",
"args": {
"name": "snippet2",
}
},
]
}
],
Run Code Online (Sandbox Code Playgroud)
然后用一些键绑定(keybindings.json)触发宏:
{
"key": "alt+m", // or whichever keybinding you choose
"command": "extension.multiCommand.execute",
"args": { "command": "multiCommand.insertMultipleSnippets" },
"when": "editorTextFocus"
},
Run Code Online (Sandbox Code Playgroud)
您不能使用任何代码段前缀来触发整个宏,但如果您愿意,您仍然可以使用单独的代码段前缀来单独触发每个代码段。
有了上面的内容Master Snippet,运行宏的结果将是:snippet1snippet2
body of master snippet
snippet2 = I am snippet2
body of snippet1
some other stuff
body of snippet1
Run Code Online (Sandbox Code Playgroud)
您确实会失去一些功能,例如无法像占位符文本那样预先选择插入的代码片段 - 如果像这样使用${1:howdy},则占位符文本howdy只会被插入的第一个代码片段覆盖。
| 归档时间: |
|
| 查看次数: |
2336 次 |
| 最近记录: |