Vs code添加自定义snippet
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"
}
}
可变变换
转换允许您在插入变量之前修改变量的值。转换的定义包括三个部分:
- 与变量值匹配的正则表达式,或者在无法解析变量时为空字符串。
- 一个“格式字符串”,它允许从正则表达式中引用匹配的组,格式字符串允许条件插入和简单修改。
- 传递给正则表达式的选项。
关于正则表达式可以参考 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的更多相关文章
- 如何在 VS Code 中搭建 Qt 开发环境
前言 VS Code 高大上的界面.强大的智能联想和庞大的插件市场,着实让人对他爱不释手.虽然可以更改 Qt Creator 的主题,但是 Qt Creator 的代码体验实在差劲.下面就来看看如何在 ...
- C# 使用 Code Snippet 简化 Coding
在开发的项目的时候,你是否经常遇到需要重复编写一些类似的代码,比如是否经常会使用 for.foreach ? 在编写这两个循环语句的时候,你是一个字符一个字符敲还是使用 Visual Studio 提 ...
- VS Code 列编辑功能说明
新版本v1.13.1或者附近的版本中的列编辑功能已经调整. 一.多光标插入功能 Alt+鼠标左键,添加多光标输入 二.自由多行选择 Alt键+鼠标左键拖动选择各行的部分内容 三.列选择 Shift+A ...
- VS中自定义代码段
如果数据属性的数量比较多,那么输入总是要花费较多的时间,这里有个小技巧,就是使用快捷的输入方法,但是VS自身提供的代码段是有限的,幸运的是我们可以通过:工具> 代码段管理器>添加来添加自定 ...
- Xamarin+Prism开发详解八:自动化测试之NUnit实践
自动化测试很重要!很重要!以前多是手动测试,没有写过测试用例.这样的结果就是发现bug改了之后关联的其他功能又要从新测一遍.这样既浪费时间与成本,而且很无聊.之所以选择NUnit是公司需要,现在.ne ...
- Python日常实践(1)——SQL Prompt的Snippets批量整理
引言 个人平时在写sql脚本的时候会使用到SQL Prompt这款插件,除了强大的智能提示和格式化sql语句功能,我还喜欢使用Snippets代码段功能.比如我们可以在查下分析器输入ssf后按Tab键 ...
- python 分词库jieba
算法实现: 基于Trie树结构实现高效的词图扫描,生成句子中汉字所有可能成词情况所构成的有向无环图(DAG) 采用了动态规划查找最大概率路径, 找出基于词频的最大切分组合 对于未登录词,采用了基于汉字 ...
- C++ 实现Golang里的defer
不多说了,直接贴代码.就一个hpp文件. 1 #include <functional> 2 3 #define CONCAT_(a, b) a##b 4 #define CONCAT(a ...
- latex在vim中的代码片段
Gilles Castel写的vim中使用的代码片段,质量很高,原文:https://github.com/gillescastel 下载后,存放到 ~/.vim/plugged/ultisnips/ ...
随机推荐
- 从零开始学习JAVA(入门基础)
目录 博主从零开始学习JAVA(入门基础) 1.搭建JAVA开发环境 卸载JDK(未安装的请忽略) 安装JDK 2.编程语言中,何为编译型与解释型 编译型 解释型 3.第一个JAVA应用程序 4.JA ...
- 记一次 .NET 某智慧水厂API 非托管内存泄漏分析
一:背景 1. 讲故事 七月底的时候有位朋友在wx上找到我,说他的程序内存占用8G,托管才占用1.5G,询问剩下的内存哪里去了?截图如下: 从求助内容看,这位朋友真的太客气了,动不动就谈钱,真伤感情, ...
- 2019-07-06 sql 连续出现次数
由手机通讯记录界面想到的问题 SELECT CASE WHEN AA.num=1 THEN AA.Tel ELSE AA.Tel+'('+CASt(AA.num AS VARCHAR(4))+')' ...
- Java流程控制05——循环结构
循环结构 while 循环 while(布尔表达式){ //循环语句 } 只要布尔表达式为true,循环就会一直执行下去. 我们为你大多数情况是会让循环停止下来的,我们需要让一个表达式时效的方式 ...
- 【网站公告】避免反对百度的限制措施:百度搜索过来的访问会自动禁用js权限
今天下午百度联系我们,发现通过百度搜索访问我们网站的博文时会出现下面反对百度的画面,让我们今天彻底处理好,保证不再出现这种情况. 我们排查后发现是这位博主申请了js权限,添加了下面的反对百度的脚本: ...
- [TensorFow2.0]-MNIST手写数字识别
本人人工智能初学者,现在在学习TensorFlow2.0,对一些学习内容做一下笔记.笔记中,有些内容理解可能较为肤浅.有偏差等,各位在阅读时如有发现问题,请评论或者邮箱(右侧边栏有邮箱地址)提醒. 若 ...
- Spring IOC容器核心流程源码分析
简单介绍 Spring IOC的核心方法就在于refresh方法,这个方法里面完成了Spring的初始化.准备bean.实例化bean和扩展功能的实现. 这个方法的作用是什么? 它是如何完成这些功能的 ...
- 001 PCI Express体系结构(一)
一 .PCI总线的基本知识 PCI总线作为处理器系统的局部总线,主要目的是为了连接外部设备,而不是作为处理器的系统总线连接Cache和主存储器.但是PCI总线.系统总线和处理器体系结构之间依然存在着紧 ...
- 一个tomcat配置多个不同端口的项目
1.将要同时启动的项目放入不同的webapps文件夹中 2.修改tomcat安装目录下的conf-->setting.xml文件 <?xml version="1.0" ...
- Django 模版语法 测试环境 ORM单表查询
模版语法 传值 视图函数向前端html页面传值,基本上所有的数据类型都可以渲染在前端页面上. views.py from django.shortcuts import render, redirec ...