VS code 创建代码片段

开始

点击左下角的设置

img

点击"用户代码片段"->新建全局代码片段

img

创建自己的代码段

可以定义自己的代码段,全局代码段或特定语言的代码段。

要打开片段文件进行编辑,请选择“ 文件” > “首选项” ( 代码 > “ macOS上的首选项 ”)下的“ 用户代码段 ” ,然后选择要显示片段的语言(按语言标识符 )或创建新的全局片段( 新的全局片段文件 ) 。

片段以JSON格式定义。

片段下拉列表

语法

举例

img

prefix :这个参数是使用代码段的快捷入口,比如这里的log在使用时输入log会有智能感知。

吃码小妖:就是输入的关键字。

body:这个是代码段的主体。

需要设置的代码放在这里,字符串间换行的话使用\r\n换行符隔开。

注意如果值里包含特殊字符需要进行转义。

多行语句的以,隔开。

$1 :这个为光标的所在位置。

2 :使用这个参数后会光标的下一位置将会另起一行,按tab键可进行快速切换,还可以有3,4,5。。。。。

description :代码段描述,在使用智能感知时的描述。

img

结果

img

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代表空格。

“要用斜杠转义。

转义网址(+随机搜的)

http://www.bejson.com/


代码片段设置评论

有一些新的代码段变量可以插入行或块注释,以描述当前语言。

使用BLOCK_COMMENT_STARTBLOCK_COMMENT_END用于块注释等LINE_COMMENT

下面的代码段插入/* Hello World */JavaScript文件和``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的多次出现被链接并同步更新。

吃码小妖:就是tab按键。

占位符

占位符是带有值的tabstops,例如${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当前文档的完整文件路径
  • 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当前秒

变量变换

转换允许您在插入变量之前修改变量的值。 转型的定义包括三个部分:

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

下面的示例插入当前文件的名称而不是其结尾,因此从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子句上下文定义自定义键绑定 ,以启用键盘快捷键。

此外,您可以使用langIdname参数引用现有代码段,而不是使用snippet参数值来定义内联代码段:

{
  "key": "cmd+k 1",
  "command": "editor.action.insertSnippet",
  "when": "editorTextFocus",
  "args": {
    "langId": "csharp",
    "name": "myFavSnippet"
  }
}

将自己的代码片段转为共享扩展

地址:contributes.snippets

使用Preferences: Configure User Snippets命令创建和测试您的片段。

img
  • 对代码段感到满意后,将整个JSON文件复制到扩展文件夹中,例如 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"
            }
        ]
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,968评论 6 482
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,601评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 153,220评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,416评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,425评论 5 374
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,144评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,432评论 3 401
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,088评论 0 261
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,586评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,028评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,137评论 1 334
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,783评论 4 324
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,343评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,333评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,559评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,595评论 2 355
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,901评论 2 345

推荐阅读更多精彩内容