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”循环的代码片段。

image

然后按下 Tab 时,自动生成 for 循环代码片段:

image

同理,当你输入 class 时,按下 Tab 也会自动生成相应的代码片段:

image

代码片段从哪读取的?

在 VS 的顶部功能栏,选择 工具 > 代码片段管理:

image

弹出如下界面:

image

这里记录了所有语言的代码片段集合、以及对应的存储位置,并且提供了自定义代码片段功能,此处的 “My CSS Snippets” 就是用来读取用户自定义的代码片段的。

我们选择在语言中下拉选择 “Visual C++”,然后选择左下角窗口中的 Visual C++ 文件夹,找到 for:

image

可以看到这里记录了 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 中,其内部又分为 HeaderSnippet

Header 中定义了代码片段的标题(Title)、快捷方式(Shortcut)、说明(Description)、作者(Author)、以及代码片段的类型(SnippetType)。以上代码内容编号后与界面元素对应关系如下:
image

类型(SnippetType)中有两种可选类型:

  • SurroundsWith表示代码片段可以将已有的代码包裹进代码片段中。
  • Expansion表示代码片段可以在光标处插入。

这部分代码主要定义了快捷方式的基本信息,负责输出代码片段内容的在 Snippet 中。

Snippet 中,将代码片段分成变量申明(Declarations) 和代码块(Code)。

image

Declarations 中由 Literal 包裹着的为一个变量。变量具有 ID、提示语(ToolTip)、默认值(Default)。当需要申明多个变量时,可以在 Declarations 中写入多组 Literal 。

Code 中,需要指明语言类型 Language="cpp",然后开始定义代码内容。

这里语法是这样的:

<![CDATA[你的代码内容]]>

在Literal 中申明的变量可以用一对美元符号包裹起来,放在代码内容里,自行转换成其值。

其中 $selected$ 表示的是被选中的已有代码,与SurroundsWith类型对应,实现已有片段的包裹。$end$ 表示代码插入后,光标停留的位置。

假设我想把 int a=10; 这段代码包裹一层 for 循环。那么选择代码,右键>外侧代码>Visual C++>for,双击for(或者按下回车)即可。

image

image

image

写一个自己的代码片段

掌握上面的规则后,我们可以自己DIY代码片段了。

假设我现在要实现一个函数代码功能快速注释的功能,希望输入 funcdef 时,自动给我生成以下格式的注释模板

/**
 * @brief 
 * 
 * @param[in]
 * @param[out]
 * @return
 */

则可在自定义文件夹中写入自己的 snippets 文件
image

内容如下:

<?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>

注意代码片段最左边为左对齐
效果如下:
image
image

参考资料

posted @ 2022-06-18 21:37  GShang  阅读(443)  评论(0编辑  收藏  举报