下面是forJavaScript 循环片段的示例:
// in file 'Code/User/snippets/javascript.json'
{
"For Loop": {
"prefix": ["for", "for-const"],
"body": ["for (const ${2:element} of ${1:array}) {", " $0", "}"],
"description": "A for loop."
}
}
在上面的例子中:
-
“For Loop”是片段名称。如果未
description提供,则通过 IntelliSense 显示。 -
prefix定义一个或多个在 IntelliSense 中显示代码段的触发词。子串匹配是在前缀上执行的,所以在这种情况下,“fc”可以匹配“for-const”。 -
body是一行或多行内容,插入时将连接为多行。换行符和嵌入的选项卡将根据插入片段的上下文进行格式化。 -
description是 IntelliSense 显示的片段的可选描述。
另外,所述body的例子中的上述具有三个占位符(在遍历顺序列出): ,${1:array},${2:element}和$0。您可以使用Tab快速跳转到下一个占位符,此时您可以编辑占位符或再次跳转到下一个。冒号后面的字符串(如果有)是默认文本,例如element在${2:element}. 占位符遍历顺序是按数字升序,从一开始;零是一个可选的特殊情况,它总是最后出现,并在光标位于指定位置时退出片段模式。
片段范围
片段是有范围的,因此只建议相关片段。片段可以通过以下任一方式确定范围:
-
片段范围内的语言(可能是所有)
-
该项目(S) ,其片段的作用域(可能是所有)
语言片段范围
根据是否在以下位置定义,每个代码段都适用于一种、几种或所有(“全局”)语言:
-
一个语言片断文件
-
一个全球性片段文件
单语言用户定义代码段在特定语言的代码段文件(例如javascript.json)中定义,您可以通过Preferences: Configure User Snippets通过语言标识符访问该文件。片段仅在编辑为其定义的语言时才可访问。
多语言和全局用户定义片段都定义在“全局”片段文件(带有文件后缀的 JSON .code-snippets)中,也可以通过Preferences: Configure User Snippets 访问。在全局代码段文件中,代码段定义可能有一个附加scope属性,该属性采用一个或多个语言标识符,这使得代码段仅可用于那些指定的语言。如果未提供任何scope属性,则全局代码段可用于所有语言。
大多数用户定义的片段都限定在一种语言内,因此在特定于语言的片段文件中定义。
项目片段范围
您还可以将全局片段文件(带有文件后缀的 JSON .code-snippets)限定在您的项目范围内。项目文件夹片段是使用“新片段”文件创建的'...选项中的首选项:配置用户段下拉菜单中,并位于项目的根.vscode文件夹中。项目片段文件可用于与在该项目中工作的所有用户共享片段。项目文件夹片段类似于全局片段,可以通过scope属性将范围限定为特定语言。
片段语法
该body片段可以使用特殊的结构来控制插入光标和文字。以下是支持的功能及其语法:
标签
使用制表位,您可以使编辑器光标在片段内移动。使用$1,$2指定光标位置。数字是访问制表位的顺序,而$0表示最终光标位置。同一制表位的多次出现会同步链接和更新。
占位符
占位符是带有值的制表符,例如${1:foo}. 占位符文本将被插入和选择,以便可以轻松更改。占位符可以嵌套,例如${1:another ${2:placeholder}}.
选择
占位符可以有选择作为值。语法是以逗号分隔的值枚举,用竖线字符括起来,例如${1|one,two,three|}。当插入片段并选择占位符时,选择将提示用户选择其中一个值。
变量
使用$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当前文档的相对(相对于打开的工作区或文件夹)文件路径 -
CLIPBOARD剪贴板的内容 -
WORKSPACE_NAME打开的工作区或文件夹的名称 -
WORKSPACE_FOLDER打开的工作区或文件夹的路径
插入当前日期和时间:
-
CURRENT_YEAR本年度 -
CURRENT_YEAR_SHORT当前年份的最后两位数字 -
CURRENT_MONTH月份为两位数(例如“02”) -
CURRENT_MONTH_NAME月份的全名(例如“七月”) -
CURRENT_MONTH_NAME_SHORT月份的简称(例如“Jul”) -
CURRENT_DATE一个月中的哪一天 -
CURRENT_DAY_NAME -
CURRENT_DAY_NAME_SHORT一天的简称(例如“星期一”) -
CURRENT_HOUR24 小时制的当前小时 -
CURRENT_MINUTE当前分钟 -
CURRENT_SECOND当前秒 -
CURRENT_SECONDS_UNIX自 Unix 纪元以来的秒数
插入随机值:
-
RANDOM6 位随机 Base-10 数字 -
RANDOM_HEX6 位随机 Base-16 数字 -
UUID版本 4 UUID
对于插入行或块注释,遵循当前语言:
-
BLOCK_COMMENT_START示例输出:PHP/*或 HTML<!-- -
BLOCK_COMMENT_END示例输出:PHP*/或 HTML--> -
LINE_COMMENT示例输出:在 PHP 中//
下面的代码片段插入/* Hello World */JavaScript 文件和<!-- Hello World -->HTML 文件:
{
"hello": {
"scope": "javascript,html",
"prefix": "hello",
"body": "$BLOCK_COMMENT_START Hello World $BLOCK_COMMENT_END"
}
}
变量变换
转换允许您在插入变量之前修改它的值。转换的定义由三部分组成:
-
与变量值匹配的正则表达式,或者当变量无法解析时为空字符串。
-
允许从正则表达式引用匹配组的“格式字符串”。格式字符串允许有条件的插入和简单的修改。
-
传递给正则表达式的选项。
下面的示例插入当前文件的名称而没有结尾,因此从foo.txt它生成foo.
${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
占位符转换
与变量转换一样,占位符的转换允许在移动到下一个制表位时更改占位符的插入文本。插入的文本与正则表达式匹配,匹配项或匹配项(取决于选项)将替换为指定的替换格式文本。占位符的每次出现都可以使用第一个占位符的值独立定义自己的转换。Placeholder-Transforms 的格式与 Variable-Transforms 的格式相同。
转换示例
这些示例显示在双引号内,因为它们将出现在片段正文中,以说明对某些字符进行双重转义的需要。示例转换和文件名的结果输出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-9^a-z]//gi}" |
example123456TESTjs |