Visual Studio Code 中的摘要

代码片段是模板,方便输入重复的代码模式,如循环或条件语句。

在Visual Studio Code中,摘要会出现在IntelliSense(Windows,Linux的Ctrl+Space中,混合其他建议,以及专用的片段选择器(在命令面板中插入片段)。还支持制表表补全:启用以下方式“editor.tabCompletion”: “开”输入一个片段前缀(触发文本),然后按Tab插入摘要。

该片段语法遵循TextMate的片段语法,但“插值壳代码”和使用\u;这两种方式都不支持。

Ajax 摘要

内置片段

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

内置JavaScript摘要

您可以通过在命令调色板中运行“插入片段”命令,查看该语言可用的片段列表,以获取当前文件语言的摘要列表。不过请记住,这个列表还包括你定义的用户片段,以及你安装的扩展所提供的片段。

安装市场中的片段

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模板如果该摘要旨在填充或替换文件内容,请将它归于你的摘要定义中。当你在新建或已有文件中运行“片段:用片段填充文件”命令时,文件模板片段会以下拉菜单显示。

摘录示波器

片段被限定为只推荐相关片段。片段可以通过以下方式进行范围:

  1. 摘要所适用的语言(可能是全部)
  2. 被指派到的项目(大概全部)

语言片段范围

每个摘要根据其定义是否包含以下方式,被范围限定为一种、多种或全部(“全局”)语言:

  1. 语言片段文件
  2. 全局片段文件

单语言用户自定义的片段在特定语言的片段文件中定义(例如)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"
  }
}

变量变换

变换允许你在变量插入前修改其值。变换的定义包括三个部分:

  1. 一个正则表达式,与变量的值匹配,或当该变量无法解析时的空字符串。
  2. 一个“格式字符串”,允许从正则表达式中引用匹配的组。格式字符串允许条件插入和简单修改。
  3. 传递给正则表达式的选项。

以下示例插入当前文件名称但不带结尾,因此从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按钮

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