Vs code添加自定义snippet(代码段)

前言

​ 代码段能够帮助输入重复代码模式,在智能感知下可以帮我们快速补全代码,节省时间方便之余更利于代码格式的统一规范化。

1. Vs code代码段配置

1.1 配置方法

进入配置方法:

1.File--Preferences--User Snippets--

我们选择新建一个全局的代码段配置文件 New Globar Snippers File

2.通过快捷键「Ctrl + Shift + P」打开命令窗口,输入「snippet」,点选「Preferences: Config User Snippets」,然后同上;

wh.code-snippets

{
// Place your global snippets here. Each snippet is defined under a snippet name and has a scope, prefix, body and
// description. Add comma separated ids of the languages where the snippet is applicable in the scope field. If scope
// is left empty or omitted, the snippet gets applied to all languages. The prefix is what is
// used to trigger the snippet and the body will be expanded and inserted. Possible variables are:
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
// Placeholders with the same ids are connected.
// Example:
// "Print to console": {
// "scope": "javascript,typescript",
// "prefix": "log",
// "body": [
// "console.log('$1');",
// "$2"
// ],
// "description": "Log output to console"
// }
"create a new c source file": {
"prefix": "filec",
"body": [
"/**\n * @file ${TM_FILENAME}",
" * @brief $1",
" * @author wangh (wanghuan3037@fiberhome.com)",
" * @version 1.0",
" * @date $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE",
" * @copyright Copyright (c) $CURRENT_YEAR 烽火通信",
" ***************************************************************",
" * @par 修改日志:",
" * <table>",
" * <tr><th>Date <th>Version <th>Author <th>Description",
" * <tr><td>2019-11-17 <td>1.0 <td>wangh <td>内容",
" * </table>",
" */",
"\n\n\n\n",
"/*********** (C) COPYRIGHT $CURRENT_YEAR FiberHome *****END OF FILE****/\n"
]
},
"create a new c head file": {
"prefix": "fileh",
"body": [
"/**\n * @file ${TM_FILENAME}",
" * @brief ",
" * @author wangh (wanghuan3037@fiberhome.com)",
" * @version 1.0",
" * @date $CURRENT_YEAR-$CURRENT_MONTH-$CURRENT_DATE",
" * @copyright Copyright (c) $CURRENT_YEAR 烽火通信",
" */",
"#ifndef __${1:${TM_FILENAME/(.*)\\.h$/${1:/upcase}_H/i}}",
"#define __$1",
"\n\n\n\n",
"#endif\t // __$1 \n",
"/*********** (C) COPYRIGHT $CURRENT_YEAR FiberHome *****END OF FILE****/\n"
],
},
"Define a struct": {
"prefix": "defstruct",
"body": "typedef struct \n{\n\t$2\n\t$3\n} ${1:name_t};"
},
"Define a enum": {
"prefix": "defenum",
"body": "typedef enum \n{\n\t$2\n\t$3\n} ${1:name_t};"
},
"main()": {
"prefix": "main",
"body": [
"int main(int argc, char const *argv[])",
"{\n\t$1\n\treturn 0;\n}"
]
},
"For loop": {
"prefix": "for",
"body": [
"for (${1:i} = 0; ${1:i} < ${2:count}; ${1:i}${3:++})",
"{\n\t$4\n}"
]
},
"Do while loop": {
"prefix": "do",
"body": "do {\n\t$0\n} while($1);"
},
"While loop": {
"prefix": "while",
"body": "while ($1)\n{\n\t$2\n}"
},
"Switch case": {
"prefix": "switch",
"body": [
"switch ($1) {",
"case $2:\n\t$3\n\tbreak;\n",
"default:\n\tbreak;\n}$0"
]
},
"printf()": {
"prefix": "printf",
"body": "printf(\"${1:%s }\\n\", $2);$3"
},
}

1.2 使用效果

新建一个 test.c 文件

输入 "filec" 一般右侧会弹出匹配项,上下键选择 filec 回车,效果如下:

/**
* @file test.c
* @brief 测试文件
* @author wangh (wanghuan3037@fiberhome.com)
* @version 1.0
* @date 2019-11-17
* @copyright Copyright (c) 2019 烽火通信
***************************************************************
* @par 修改日志:
* <table>
* <tr><th>Date <th>Version <th>Author <th>Description
* <tr><td>2019-11-17 <td>1.0 <td>wangh <td>内容
* </table>
*/ /*********** (C) COPYRIGHT 2019 FiberHome *****END OF FILE****/

新建一个 test.h 文件

输入 "filec" 一般右侧会弹出匹配项,上下键选择 filec 回车,效果如下:

/**
* @file test.h
* @brief
* @author wangh (wanghuan3037@fiberhome.com)
* @version 1.0
* @date 2019-11-17
* @copyright Copyright (c) 2019 烽火通信
*/
#ifndef __TEST_H
#define __TEST_H #endif // __TEST_H /*********** (C) COPYRIGHT 2019 FiberHome *****END OF FILE****/

其他代码段可根据自己设置的名称予以测试。

2. 代码段配置语法

官方教程

下面主要是基于官方文档的翻译及总结。

2.1 json格式

我们以一个简单的示例来说明组成

{
"For Loop": {
"prefix": ["for", "for-const"],
"body": ["for (const ${2:element} of ${1:array}) {", "\t$0", "}"],
"description": "A for loop."
}
}

在上面的示例中:

  • “ For Loop”是代码段名称。
  • prefix定义一个或多个触发词,这些触发词在IntelliSense中显示摘要。子字符串匹配在前缀上执行,因此在这种情况下,“ fc”可以匹配“ for-const”。
  • body是一或多个内容行,插入时将作为多行加入。换行符和嵌入的选项卡将根据插入代码段的上下文进行格式化。
  • description 是IntelliSense显示的代码段的可选描述。
  • scope在使用全局配置时有用,可以配置其适用语言,不填则代表适用于所有语言。

另外,所述body的例子中的上述具有三个占位符(在遍历顺序列出): ,${1:array}${2:element}$0。您可以使用Tab快速跳到下一个占位符,此时您可以编辑占位符或再次跳到下一个占位符。冒号之后的字符串是默认的文本,例如element${2:element}。占位符遍历顺序从数字开始递增,从1开始;零是一种可选的特殊情况,它总是最后出现,并在光标位于指定位置时退出摘要模式。

2.2 语法

涉及到语法的主要时 body 段,可以使用特殊的结构来控制插入光标和文字。以下是受支持的功能及其语法:

制表符

使用制表符,可以使编辑器光标在摘要中移动。使用$1$2指定游标的位置,是按Tab键访问的顺序,$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 当前文档的完整文件路径
  • CLIPBOARD 剪贴板中的内容
  • WORKSPACE_NAME 打开的工作空间或文件夹的名称

要插入当前日期和时间:

  • CURRENT_YEAR 本年度
  • CURRENT_YEAR_SHORT 本年度的最后两位数字
  • CURRENT_MONTH 以两位数表示的月份(例如“ 02”)
  • CURRENT_MONTH_NAME 月的全名(例如“july”)
  • CURRENT_MONTH_NAME_SHORT 该月的简称(例如“ Jul”)
  • CURRENT_DATE 一个月中的某天
  • CURRENT_DAY_NAME 一天的名称(例如“周一”)
  • CURRENT_DAY_NAME_SHORT 一天的简称(例如“ Mon”)
  • CURRENT_HOUR 当前小时(24小时制)
  • CURRENT_MINUTE 当前分钟
  • CURRENT_SECOND 当前秒
  • CURRENT_SECONDS_UNIX 自Unix时代以来的秒数

要插入行或块注释,请遵循当前语言:

  • BLOCK_COMMENT_START输出示例:用PHP /*或HTML<!--
  • BLOCK_COMMENT_END输出示例:用PHP */或HTML-->
  • LINE_COMMENT输出示例:用PHP //或HTML<!-- -->

以下代码段可插入/* Hello World */JavaScript文件和<!-- Hello World -->HTML文件中:

{
"hello": {
"scope": "javascript,html", // 限定作用语言
"prefix": "hello",
"body": "$BLOCK_COMMENT_START Hello World $BLOCK_COMMENT_END"
}
}

可变变换

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

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

关于正则表达式可以参考 JavaScript RegExp 对象

以下示例是我们头文件定义时使用的,以此为例进行说明

${1:${TM_FILENAME/(.*)\\.h$/${1:/upcase}_H/i}}
  • TM_FILENAME:本文件名 test.c
  • (.*)\.h$ :正则表达式 ()里面表示TM_FILENAME除去 .h的部分
  • ${1:/upcase}_H:${1:/upcase}表示正则表达式第一个()大写,然后在加上 _H
  • i:不区分大小写

以下示例插入了当前文件的名称而没有结尾,因此从foo.txt该名称开始foo

${TM_FILENAME/(.*)\\..+$/$1/}
| | | |
| | | |-> 选项
| | |
| | |-> 第一个正则匹配捕获的内容
| |
| |-> 正则表达式
|
|-> 待转换的变量值

占位符转换

与变量转换一样,占位符的转换允许在移至下一个制表位时更改占位符的插入文本。插入的文本与正则表达式匹配,并且一个或多个匹配项(取决于选项)将替换为指定的替换格式文本。每次出现占位符都可以使用第一个占位符的值独立定义其自己的转换。占位符转换的格式与变量转换的格式相同。

转换示例

这些示例在双引号中显示,因为它们将出现在摘要正文中,以说明需要对某些字符进行两次转义。样本转换和文件名的结果输出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 删除非字母数字字符

语法

以下是摘要的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 ::= .*

Vs code添加自定义snippet的更多相关文章

  1. 如何在 VS Code 中搭建 Qt 开发环境

    前言 VS Code 高大上的界面.强大的智能联想和庞大的插件市场,着实让人对他爱不释手.虽然可以更改 Qt Creator 的主题,但是 Qt Creator 的代码体验实在差劲.下面就来看看如何在 ...

  2. C# 使用 Code Snippet 简化 Coding

    在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符一个字符敲还是使用 Visual Studio 提 ...

  3. VS Code 列编辑功能说明

    新版本v1.13.1或者附近的版本中的列编辑功能已经调整. 一.多光标插入功能 Alt+鼠标左键,添加多光标输入 二.自由多行选择 Alt键+鼠标左键拖动选择各行的部分内容 三.列选择 Shift+A ...

  4. VS中自定义代码段

    如果数据属性的数量比较多,那么输入总是要花费较多的时间,这里有个小技巧,就是使用快捷的输入方法,但是VS自身提供的代码段是有限的,幸运的是我们可以通过:工具> 代码段管理器>添加来添加自定 ...

  5. Xamarin+Prism开发详解八:自动化测试之NUnit实践

    自动化测试很重要!很重要!以前多是手动测试,没有写过测试用例.这样的结果就是发现bug改了之后关联的其他功能又要从新测一遍.这样既浪费时间与成本,而且很无聊.之所以选择NUnit是公司需要,现在.ne ...

  6. Python日常实践(1)——SQL Prompt的Snippets批量整理

    引言 个人平时在写sql脚本的时候会使用到SQL Prompt这款插件,除了强大的智能提示和格式化sql语句功能,我还喜欢使用Snippets代码段功能.比如我们可以在查下分析器输入ssf后按Tab键 ...

  7. python 分词库jieba

    算法实现: 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG) 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合 对于未登录词,采用了基于汉字 ...

  8. C++ 实现Golang里的defer

    不多说了,直接贴代码.就一个hpp文件. 1 #include <functional> 2 3 #define CONCAT_(a, b) a##b 4 #define CONCAT(a ...

  9. latex在vim中的代码片段

    Gilles Castel写的vim中使用的代码片段,质量很高,原文:https://github.com/gillescastel 下载后,存放到 ~/.vim/plugged/ultisnips/ ...

随机推荐

  1. 【剑指offer】53 - II. 0~n-1中缺失的数字

    剑指 Offer 53 - II. 0-n-1中缺失的数字 知识点:数组,二分查找: 题目描述 统计一个数字在排序数组中出现的次数. 示例 输入: nums = [5,7,7,8,8,10], tar ...

  2. 浏览器中hook对象属性

    先获取window对象属性 来源: 夜幕爬虫安全论坛 原文链接: http://bbs.nightteam.cn/thread-485.htm?orderby=desc&user=7

  3. 记录21.07.26 —— Vue/cil

    VUE搭载脚手架 搭载环境 下载node node.js下载地址 控制台输入 npm install -g @vue/cil 查看版本 创建vue项目 创建完后会显示启动服务的指令 这个指令可以在pa ...

  4. 记录21.07.23 —— Vue.js基础(二)

    Vue基础(二) 过滤器 过滤器作用 全局过滤器 输出结果 私有过滤器 输出结果 把其中一个做点修改 错误信息 自定义指令 全局自定义指令 私有自定义指令 钩子函数 注意:fond-weight是粗细 ...

  5. charles抓取https设置

    第一步:打开charles,查看电脑ip,手机设置代理(需要手机和电脑在同一网络) 手机下载证书不要用自带的下,会失败 1.查看电脑ip 2.手机设置代理,修改网络,保存 3.手机访问"看图 ...

  6. Github连接远程仓库详细操作

    首先 咱们需要配置ssh密钥   如何生成密钥呢    我们先来看下命令 在桌面新建一个文件夹,命名规范尽量不要使用中文,然后在文件夹内  新建测试文本: 如图   在文件夹内空白处右击进入GIt b ...

  7. Cookie和Session得使用理解

    Cookie 饼干 什么是Cokkie? 1.Cookie 翻译过来是饼干的意思. 2.Cookie 是服务器通知客户端保存键值对的一种技术. 3.客户端有了 Cookie 后,每次请求都发送给服务器 ...

  8. dubbo学习实践(5)之Dubbo-Admin元数据中心配置(zookeeper&Redis&Consul)

    1.Dubbo2.7.8元数据中心配置zookeeper版 前面文章已经写到了dubbo-admin管理平台的docker版配置及dubbo服务注册与调用,这篇文章记录dubbo元数据中心配置 翻开d ...

  9. const变量通过指针修改问题

    const的变量在特定情况下可以通过指针修改,但是在另一些情况下是不能通过指针修改. 以下是VC6下才测试. 1. 不能修改的情况 #include int const a = 10; void ma ...

  10. minio设置永久访问链接

    1.通过minio分享的链接只能支持7天. 解决方案是设置对应的bucket 可通过路径直接访问.(必须通过minio client才能设置下载策略) wget https://dl.min.io/c ...