点击左下角的设置javascript
点击"用户代码片断"->新建全局代码片断css
能够定义本身的代码段,全局代码段或特定语言的代码段。 html
要打开片断文件进行编辑,请选择“ 文件” > “首选项” ( 代码 > “ macOS上的首选项 ”)下的“ 用户代码段 ” ,而后选择要显示片断的语言(按语言标识符 )或建立新的全局片断( 新的全局片断文件 ) 。html5
片断以JSON格式定义。 java
举例 git
prefix :这个参数是使用代码段的快捷入口,好比这里的log在使用时输入log会有智能感知。github
zyx456:就是输入的关键字。
body:这个是代码段的主体。正则表达式
须要设置的代码放在这里,字符串间换行的话使用rn换行符隔开。typescript
注意若是值里包含特殊字符须要进行转义。json
多行语句的以,隔开。
$1 :这个为光标的所在位置。
$2 :使用这个参数后会光标的下一位置将会另起一行,按tab键可进行快速切换,还能够有$3,$4,$5。。。。。
description :代码段描述,在使用智能感知时的描述。
结果
HTML5模板举例
"html5": { "prefix": "html5", "body": [ "<!DOCTYPE html>", "<html lang=\"zh-CN\">", "\t<head>", "\t\t<title>测试页</title>", "\t\t<meta charset=\"UTF-8\">", "\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">", "\t\t<link href=\"css/style.css\" rel=\"stylesheet\">", "\t</head>", "\t<body>", "\t$2", "\t</body>", "</html>" ], "description": "HTML - Defines a template for a html5 document", },
t表明空格。
“要用斜杠转义。
有一些新的代码段变量能够插入行或块注释,以描述当前语言。
使用BLOCK_COMMENT_START
和BLOCK_COMMENT_END
用于块注释等LINE_COMMENT
。
下面的代码段插入/* Hello World */
JavaScript文件和<!-- Hello World -->
HTML文件中
{ "hello": { "scope": "javascript,html", "prefix": "hello", "body": "$BLOCK_COMMENT_START Hello World $BLOCK_COMMENT_END" } }
VS Code Marketplace上的许多扩展包括代码段。
若是您找到了要使用的设备,请安装它并从新启动VS Code并使用新的代码段。
文件类型和名称用于定义片断是全局的仍是特定于语言的。
存储在以语言标识符 ( <languageId>.json
)命名的JSON文件中的代码段是特定于语言的。 例如,仅限JavaScript的代码段放在javascript.json
文件中。
编辑时适用的全局代码段,并存储在<name>.code-snippets
MyGlobal.code-snippets
文件中,例如MyGlobal.code-snippets
。
全局代码段的JSON模式容许您定义scope属性,该属性能够过滤适用于该代码段的语言(基于语言标识符 )。
下面的示例再次是For Loop
,但此次它的范围是JavaScript 和 TypeScript。
{ "For_Loop": { "prefix": "for", "scope": "javascript,typescript", "body": [ "for (const ${2:element} of ${1:array}) {", "\t$0", "}" ], "description": "For Loop" } }
添加新代码段后,您能够当即尝试,无需从新启动。
代码段的body
可使用特殊构造来控制游标和插入的文本。
如下是支持的功能及其语法:
使用tabstops,您可使编辑器光标在代码段内移动。 使用$1
, $2
指定游标位置。
数字是访问tabstops的顺序,而$0
表示最终光标位置。
同一个tabstop的屡次出现被连接并同步更新。
zyx456:就是tab按键。
占位符是带有值的tabstops,例如${1:foo}
。 将插入并选择占位符文本,以即可以轻松更改。 占位符能够嵌套,例如${1:another ${2:placeholder}}
。
zyx456:就是带有默认值的插糟。
占位符能够做为值进行选择。 语法是逗号分隔的值枚举,用管道字符括起来,例如${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
当前文档的完整文件路径CLIPBOARD
剪贴板的内容用于插入当前日期和时间:
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
当天的简称(例如'Mon')CURRENT_HOUR
24小时制格式的当前小时CURRENT_MINUTE
当前分钟CURRENT_SECOND
当前秒转换容许您在插入变量以前修改变量的值。 转型的定义包括三个部分:
下面的示例插入当前文件的名称而不是其结尾,所以从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^az]//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' '}' | '${' 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 ::= .*
您能够建立自定义键绑定以插入特定代码段。
打开keybindings.json
( 首选项:打开键盘快捷键文件 ),它定义了全部的键绑定,并添加了一个键盘绑定,将"snippet"
做为额外参数传递:
{ "key": "cmd+k 1", "command": "editor.action.insertSnippet", "when": "editorTextFocus", "args": { "snippet": "console.log($1)$0" } }
键绑定将调用Insert Snippet命令,但不会提示您选择片断,而是会插入提供的片断。 您能够像往常同样使用键盘快捷键,命令ID和可选的when子句上下文定义自定义键绑定 ,以启用键盘快捷键。
此外,您可使用langId
和name
参数引用现有代码段,而不是使用snippet
参数值来定义内联代码段:
{ "key": "cmd+k 1", "command": "editor.action.insertSnippet", "when": "editorTextFocus", "args": { "langId": "csharp", "name": "myFavSnippet" } }
使用Preferences: Configure User Snippets命令建立和测试您的片断。
snippets.json
package.json
{ "contributes": { "snippets": [ { "language": "javascript", "path": "./snippets.json" } ] } }
您能够在如下位置找到完整的源代码:https://github.com/Microsoft/vscode-extension-samples/tree/master/snippet-sample
实例
snippets.json
{ "Print to console": { "prefix": "log", "body": [ "console.log('$1');", "$2" ], "description": "Log output to console" } }
package.json
{ "name": "snippet-sample", "displayName": "Snippet Sample", "description": "Snippet Sample", "version": "0.0.1", "publisher": "vscode-samples", "engines": { "vscode": "^1.28.0" }, "categories": [ "Snippets" ], "contributes": { "snippets": [ { "language": "javascript", "path": "./snippets.json" } ] } }