Viusal Studio 代码片段管理
什么是代码片段?
所谓代码片段,指的是一小段可以重复拿来修改使用的代码块。
比如一些常见的 for 循环、类的定义等等。
// for 循环
for(size_t i = 0; i < length; i++)
{
}
// 类的定义
class MyClass
{
public:
MyClass();
~MyClass();
private:
};
MyClass::MyClass()
{
}
MyClass::~MyClass()
{
}
在 Visual Studio 中,提供了一种快速生成代码片段的快捷方式,具体用法如下:
当你在编辑器中输入 for 之后,IDE 会弹出相关的代码片段,如 “for” 、"foreach"、 “forr” 等,首选项为 “for”,并为其提供了提示文字:for,“for”循环的代码片段。
然后按下 Tab 时,自动生成 for 循环代码片段:
同理,当你输入 class 时,按下 Tab 也会自动生成相应的代码片段:
代码片段从哪读取的?
在 VS 的顶部功能栏,选择 工具 > 代码片段管理:
弹出如下界面:
这里记录了所有语言的代码片段集合、以及对应的存储位置,并且提供了自定义代码片段功能,此处的 “My CSS Snippets” 就是用来读取用户自定义的代码片段的。
我们选择在语言中下拉选择 “Visual C++”,然后选择左下角窗口中的 Visual C++ 文件夹,找到 for:
可以看到这里记录了 for 这个代码片段,右侧对其进行了解释。
注意到上方提供了位置路径,我们打开它,并找到 "for.snippet",文件内容如下:
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>for</Title>
<Shortcut>for</Shortcut>
<Description>“for”循环的代码片段</Description>
<Author>Microsoft Corporation</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
<SnippetType>SurroundsWith</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>type</ID>
<Default>size_t</Default>
<ToolTip>控制变量类型</ToolTip>
</Literal>
<Literal>
<ID>index</ID>
<Default>i</Default>
<ToolTip>索引</ToolTip>
</Literal>
<Literal>
<ID>max</ID>
<Default>length</Default>
<ToolTip>最大长度</ToolTip>
</Literal>
</Declarations>
<Code Language="cpp"><![CDATA[for ($type$ $index$ = 0; $index$ < $max$; $index$++)
{
$selected$ $end$
}]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
该文件使用的是 xml 语法,定义了 for 循环代码片段。
代码片段是如何被定义的?
xml 语言具有层级关系,下面按照标签包裹关系分析以下 for 循环代码片段是如何被定义的。
一个代码片段被定义在一组 CodeSnippet
中,其内部又分为 Header
和 Snippet
。
Header 中定义了代码片段的标题(Title)、快捷方式(Shortcut)、说明(Description)、作者(Author)、以及代码片段的类型(SnippetType)。以上代码内容编号后与界面元素对应关系如下:
类型(SnippetType)中有两种可选类型:
- SurroundsWith表示代码片段可以将已有的代码包裹进代码片段中。
- Expansion表示代码片段可以在光标处插入。
这部分代码主要定义了快捷方式的基本信息,负责输出代码片段内容的在 Snippet
中。
Snippet 中,将代码片段分成变量申明(Declarations) 和代码块(Code)。
Declarations 中由 Literal
包裹着的为一个变量。变量具有 ID、提示语(ToolTip)、默认值(Default)。当需要申明多个变量时,可以在 Declarations 中写入多组 Literal 。
Code 中,需要指明语言类型 Language="cpp",然后开始定义代码内容。
这里语法是这样的:
<![CDATA[你的代码内容]]>
在Literal 中申明的变量可以用一对美元符号包裹起来,放在代码内容里,自行转换成其值。
其中 $selected$
表示的是被选中的已有代码,与SurroundsWith类型对应,实现已有片段的包裹。$end$
表示代码插入后,光标停留的位置。
假设我想把 int a=10; 这段代码包裹一层 for 循环。那么选择代码,右键>外侧代码>Visual C++>for,双击for(或者按下回车)即可。
写一个自己的代码片段
掌握上面的规则后,我们可以自己DIY代码片段了。
假设我现在要实现一个函数代码功能快速注释的功能,希望输入 funcdef
时,自动给我生成以下格式的注释模板
/**
* @brief
*
* @param[in]
* @param[out]
* @return
*/
则可在自定义文件夹中写入自己的 snippets 文件
内容如下:
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>funcdef</Title>
<Shortcut>funcdef</Shortcut>
<Description>函数功能注释</Description>
<Author>GShang</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Code Language="cpp">
<![CDATA[/**
* @brief $end$
*
* @param[in]
* @param[out]
* @return
*/]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
注意代码片段最左边为左对齐
效果如下:
参考资料
- 代码片段 - Visual Studio (Windows) | Microsoft Docs
- 建议该章节全部看一遍,了解整个代码片段的来龙去脉
- 用VS2005为自定义代码段而制作代码段来定义代码段