Visual Studio Code 中的摘要
代码片段是模板,方便输入重复的代码模式,如循环或条件语句。
在Visual Studio Code中,摘要会出现在IntelliSense(Windows,Linux的Ctrl+Space)中,混合其他建议,以及专用的片段选择器(在命令面板中插入片段)。还支持制表表补全:启用以下方式“editor.tabCompletion”: “开”输入一个片段前缀(触发文本),然后按Tab插入摘要。
该片段语法遵循TextMate的片段语法,但“插值壳代码”和使用\u;这两种方式都不支持。

内置片段
VS Code 内置了多种语言的摘要,如:JavaScript、TypeScript、Markdown 和 PHP。

您可以通过在命令调色板中运行“插入片段”命令,查看该语言可用的片段列表,以获取当前文件语言的摘要列表。不过请记住,这个列表还包括你定义的用户片段,以及你安装的扩展所提供的片段。
安装市场中的片段
VS Code 市场上的许多扩展都包含了片段。你可以在扩展视图中搜索包含片段的扩展(⇧⌘X(Windows,Linux Ctrl+Shift+X)),使用@category:“片段”过滤。

如果你找到想用的扩展,安装它,然后重启 VS Code,新的代码片段就会出现。
创建你自己的片段
你可以很轻松地定义自己的片段,无需扩展。要创建或编辑自己的片段,请在“文件>偏好设置”中选择配置片段,然后选择摘要应显示的语言标识符,或者如果代码在所有语言中都显示,则选择“新的全局摘要文件”选项。VS Code 负责管理底层摘要文件的创建和刷新。

Snippets 文件以 JSON 编写,支持 C 风格注释,并可定义无限数量的 snippets。摘要支持大多数TextMate语法以实现动态行为,智能地根据插入上下文格式化空白,并允许轻松多行编辑。
下面是一个示例对于JavaScript 循环摘要:
// in file 'Code/User/snippets/javascript.json'
{
"For Loop": {
"prefix": ["for", "for-const"],
"body": ["for (const ${2:element} of ${1:array}) {", "\t$0", "}"],
"description": "A for loop."
}
}
在上面的例子中:
- “For Loop”是该片段的名称。如果没有,则通过IntelliSense显示
描述提供。 前缀定义一个或多个触发词,用于在IntelliSense中显示该片段。子字符串匹配是对前缀进行的,因此在这种情况下,“fc” 可以匹配“for-const”。身体是一条或多行内容,插入时会以多行方式连接。换行和嵌入的标签页将根据插入摘要的上下文进行格式化。描述是IntelliSense显示的片段的可选描述。
此外,身体上述示例有三个占位符(按遍历顺序列出):${1:array},${2:element}, 和0美元.你可以用 Tab 快速跳到下一个占位符,然后编辑占位符或跳到下一个。冒号后的弦:例如,(如果有)是默认文本元素在${2:element}.占位符遍历顺序按数字递增,从一开始;零是一个可选的特殊情况,总是最后出现,并且在光标停留在指定位置时退出片段模式。
文件模板摘要
你可以添加isFile模板如果该摘要旨在填充或替换文件内容,请将它归于你的摘要定义中。当你在新建或已有文件中运行“片段:用片段填充文件”命令时,文件模板片段会以下拉菜单显示。
摘录示波器
片段被限定为只推荐相关片段。片段可以通过以下方式进行范围:
- 摘要所适用的语言(可能是全部)
- 被指派到的项目(大概全部)
语言片段范围
每个摘要根据其定义是否包含以下方式,被范围限定为一种、多种或全部(“全局”)语言:
- 语言片段文件
- 全局片段文件
单语言用户自定义的片段在特定语言的片段文件中定义(例如)javascript.json),您可以通过Snippets:配置Snippets按语言标识符访问。摘要只有在编辑其定义的语言时才能访问。
多语言和全局用户自定义的摘要都定义在“全局”片段文件中(JSON 带文件后缀).code-snippets),也可以通过 Snippets: 配置 Snippets 访问。在全局剪辑文件中,摘录定义可能包含额外的范围该属性可获取一个或多个语言标识符,因此该片段仅适用于指定的语言。如果没有范围给定了属性,则全局片段可在所有语言中获得。
大多数用户自定义的摘要都针对单一语言,因此定义在特定语言的片段文件中。
项目片段范围
你也可以有一个全局摘要文件(JSON 带文件后缀).code-snippets)被聚焦到你的项目。项目文件夹的片段通过“新片段文件”中的“<folder-name>...选项创建,位于项目根部的.vscode文件夹。项目片段文件对于与该项目中所有用户分享片段非常有用。项目文件夹的剪辑类似于全局剪辑,可以通过范围财产。
文件模式范围
你还可以通过使用可选的包括以及排除属性以指定文件模式。这些属性既适用于特定语言的文件,也适用于全局的片段文件,并且可以与范围Property,以便更精准地控制片段建议。
包括- 一个球状模式或数组球状,指定该片段应出现在哪些文件中。排除- 一个球状模式或数组球状,指定该片段不应出现在哪些文件中。
图案匹配的运作方式如下:
- 仅文件名模式(例如,
*.test.ts)根据文件名匹配,无论文件在项目中的位置如何。 - 基于路径的模式(例如,
**/*.test.ts或**/dist/**)与完整文件路径匹配。 - 如果一个文件同时匹配
包括以及排除模式,排除模式优先。 - 如果这两个属性都未指定,该片段会出现在所有基于
范围财产。
示例
示例:测试片段
以下摘要仅出现在 TypeScript 测试文件中:
{
"Test Block": {
"prefix": "test",
"body": ["test('${1:description}', () => {", "\t${0}", "});"],
"description": "Insert a test block",
"scope": "typescript",
"include": ["**/*.test.ts", "**/*.spec.ts"]
}
}
示例:排除目录
该摘要出现在所有JavaScript文件中,唯独以下文件除外。分区或node_modules目录:
{
"Console Log": {
"prefix": "log",
"body": "console.log(${0});",
"description": "Insert console.log",
"scope": "javascript",
"exclude": ["**/dist/**", "**/node_modules/**"]
}
}
示例:配置文件摘要
本片段仅出现在travis.yml文件,使用仅文件名模式:
{
"Travis CI Node": {
"prefix": "travis-node",
"body": ["language: node_js", "node_js:", " - ${1:18}"],
"description": "Travis CI Node.js configuration",
"scope": "yaml",
"include": ["travis.yml"]
}
}
使用包括以及排除模式通过仅在相关处显示片段,有助于减少IntelliSense中的杂乱。
片段语法
该身体片段可以用特殊结构来控制光标和插入的文本。以下支持的功能及其语法:
标签停顿器
通过停tab,你可以让编辑器光标在片段内移动。用途1美元,2美元用来指定光标位置。数字表示访问标签停止器的顺序,而0美元表示最终光标位置。同一个制表停止键的多次出现会同步链接和更新。
占位符
占位符是带有值的制表位,比如${1:foo}.占位文本将入并选择,以便易于更改。占位符可以嵌套,比如${1:另一个 ${2:占位符}}.
选择
占位符可以将选择作为数值。语法是用逗号分隔的数值枚举,例如用管道字符包围${1|一,二,三|}.当插入摘要并选择占位符时,选项会提示用户选择其中一个值。
变量
其中$name或${name:default},你可以插入变量的值。当变量未被设置时,默认值或空字符串会入。当变量未知(即其名称未定义)时,插入该变量名称并将其转换为占位符。
可以使用以下变量:
TM_SELECTED_TEXT当前选择的文本或空字符串TM_CURRENT_LINE当前线的内容TM_CURRENT_WORD光标下或空字符串下单词的内容TM_LINE_INDEX基于零指数的行号TM_LINE_NUMBER基于一索引的行号TM_FILENAME当前文档的文件名TM_FILENAME_BASE当前文档的文件名,不含扩展名TM_DIRECTORY当前文件目录TM_FILEPATH当前文档的完整文件路径RELATIVE_FILEPATH当前文档的相对(相对于已打开的工作区或文件夹)文件路径剪贴板你夹板里的内容WORKSPACE_NAME打开的工作区或文件夹名称WORKSPACE_FOLDER打开的工作区或文件夹路径CURSOR_INDEX基于零指标的光标数CURSOR_NUMBER基于一索引的光标数
输入当前日期和时间:
CURRENT_YEAR现年CURRENT_YEAR_SHORT当前年份的最后两位数字CURRENT_MONTH月份为两位数(例如“02”)CURRENT_MONTH_NAME月份的全名(例如“七月”)CURRENT_MONTH_NAME_SHORT月份的简称(例如“Jul”)CURRENT_DATE月份的日期以两位数字表示(例如“08”)CURRENT_DAY_NAME日期名称(例如“星期一”)CURRENT_DAY_NAME_SHORT当天的简称(例如“Mon”)CURRENT_HOUR当前24小时制整点CURRENT_MINUTE当前分钟为两位数CURRENT_SECOND当前秒为两位数字CURRENT_SECONDS_UNIX自Unix时代以来的秒数CURRENT_TIMEZONE_OFFSET当前UTC时区偏移为+HH:嗯或-HH:嗯(示例)-07:00).
插入随机值时:
随机6个随机的10进制数字RANDOM_HEX6个随机的16进制数字UUIDA 版本 4 UUID
对于插入行或块评论,尊重当前语言:
BLOCK_COMMENT_START示例输出:PHP 或 HTML/*<!--BLOCK_COMMENT_END示例输出:PHP 或 HTML*/-->LINE_COMMENT示例输出:PHP//
下面的摘录插入/* 你好,世界 */在JavaScript文件中和<!-- 你好,世界——>HTML文件中:
{
"hello": {
"scope": "javascript,html",
"prefix": "hello",
"body": "$BLOCK_COMMENT_START Hello World $BLOCK_COMMENT_END"
}
}
变量变换
变换允许你在变量插入前修改其值。变换的定义包括三个部分:
- 一个正则表达式,与变量的值匹配,或当该变量无法解析时的空字符串。
- 一个“格式字符串”,允许从正则表达式中引用匹配的组。格式字符串允许条件插入和简单修改。
- 传递给正则表达式的选项。
以下示例插入当前文件名称但不带结尾,因此从foo.txt它让福.
${TM_FILENAME/(.*)\\..+$/$1/}
| | | |
| | | |-> no options
| | |
| | |-> references the contents of the first
| | capture group
| |
| |-> regex to capture everything before
| the final `.suffix`
|
|-> resolves to the filename
占位符变换
与变量变换类似,占位符的变换允许在移动到下一个制表位时更改插入的文本。插入的文本与正则表达式匹配,匹配值(根据选项)被指定的替换格式文本替代。每次占位符的出现都可以独立定义其变换,使用第一个占位符的值。占位符变换的格式与变量变换相同。
变换示例
示例以双引号表示,类似于片段正文中出现的符号,以说明某些字符需要双重转义。示例变换及文件名输出example-123.456-TEST.js.
| 示例 | 输出 | 解释 |
|---|---|---|
“${TM_FILENAME/[\\.] /_/}" |
example-123_456-TEST.js |
替换第一个.其中_ |
“${TM_FILENAME/[\\.-]/_/g}” |
example_123_456_TEST_js |
替换每一个.或-_ |
“${TM_FILENAME/(.*)/${1:/upcase}/}” |
EXAMPLE-123.456-TEST.JS |
改为全大写 |
“${TM_FILENAME/[^0-9a-z]//gi}” |
example123456TESTjs |
移除非字母数字字符 |
语法
以下是EBNF(扩展Backus-Naur形式)用于摘录。使用(反斜杠)时,你可以转义、、 和 。在选择元素中,反斜杠还能逃脱逗号和管道字符。只有需要逃脱的字符才能逃脱,因此在这些构造中不应逃脱,在选择构造中也不应逃脱。\$}\$$}
any ::= tabstop | placeholder | choice | variable | text
tabstop ::= '$' int
| '${' int '}'
| '${' int transform '}'
placeholder ::= '${' int ':' any '}'
choice ::= '${' int '|' text (',' text)* '|}'
variable ::= '$' var | '${' var '}'
| '${' var ':' any '}'
| '${' var transform '}'
transform ::= '/' regex '/' (format | text)+ '/' options
format ::= '$' int | '${' int '}'
| '${' int ':' '/upcase' | '/downcase' | '/capitalize' | '/camelcase' | '/pascalcase' | '/snakecase' | '/kebabcase' '}'
| '${' int ':+' if '}'
| '${' int ':?' if ':' else '}'
| '${' int ':-' else '}' | '${' int ':' else '}'
regex ::= JavaScript Regular Expression value (ctor-string)
options ::= JavaScript Regular Expression option (ctor-options)
var ::= [_a-zA-Z] [_a-zA-Z0-9]*
int ::= [0-9]+
text ::= .*
if ::= text
else ::= text
使用 TextMate 片段
你也可以使用现有的TextMate摘要(.tmSnippets)搭配VS Code。详情请参阅我们扩展API部分的“使用TextMate Snippets”主题。
为片段分配快捷键
你可以创建自定义快捷键来插入特定的片段。打开keybindings.json (偏好设置:打开键盘快捷键文件),它定义了你所有的键盘快捷键,并添加一个快捷键传递“片段”补充一点:
{
"key": "cmd+k 1",
"command": "editor.action.insertSnippet",
"when": "editorTextFocus",
"args": {
"snippet": "console.log($1)$0"
}
}
键盘快捷键会调用“插入片段”命令,但它不会提示你选择片段,而是插入提供的片段。你像往常一样定义自定义快捷键,包括键盘快捷键、命令 ID,以及启用键盘快捷键时的从句上下文。
此外,除了使用摘录参数值 为了在内联中定义你的片段,你可以通过使用langId(长语)以及名称争论。那个langId(长语)参数选择了该片段记为名称插入,例如下面的样本选择myFavSnippet该项目适用于查普——文件。
{
"key": "cmd+k 1",
"command": "editor.action.insertSnippet",
"when": "editorTextFocus",
"args": {
"langId": "csharp",
"name": "myFavSnippet"
}
}
下一步
- 命令行 - VS Code 拥有丰富的命令行界面,用于打开或修改文件并安装扩展名。
- 扩展API——了解其他扩展VS Code的方法。
- Snippet Guide——你可以打包片段用于VS Code。
常见问题
如果我想使用来自.tmSnippet文件的现有TextMate片段怎么办?
你可以轻松打包TextMate的摘要文件,用于VS Code。请参阅我们扩展API文档中的TextMate Snippets使用。
我该如何让片段在粘贴的脚本中放置变量?
要在粘贴脚本中有变量,你需要跳出$variable命名是为了避免被片段扩展阶段解析。
"VariableSnippet":{
"prefix": "_Var",
"body": "\\$MyVar = 2",
"description": "A basic snippet that places a variable into script with the $ prefix"
}
这会得到粘贴后的片段如下:
$MyVar = 2
我可以从IntelliSense中删除片段吗?
是的,你可以通过在“插入片段”命令下拉菜单中选择片段项目右侧的“隐藏 IntelliSense 中”按钮,隐藏特定片段,从而避免在 IntelliSense(完成列表中)显示。

你仍然可以通过“插入摘要”命令选择该摘要,但隐藏的摘要不会在IntelliSense中显示。