基本结构
一个代码片段通常由以下部分组成:
- Header:包含代码片段的名称、作者、描述和快捷方式。
- Code:实际的代码内容。
- Tab Stops:允许用户在插入代码片段后通过Tab键在不同的插入点之间跳转。
- Placeholders:在代码中预留的位置,用户可以在这些位置输入自定义内容。
特殊变量
特殊变量用于控制代码片段的行为。以下是一些常用的特殊变量:
- $selected$:代表当前编辑器中选中的文本。当代码片段被插入时,选中的文本将被替换。
- $end$:这是一个重要的特殊变量,它代表用户在插入代码片段后按回车键回到的地方。通常,你会在希望用户继续编写代码的位置放置$end$。
- $1, $2, $3, ...:这些是占位符,用于创建可编辑的选项。用户可以通过Tab键在这些占位符之间跳转并输入不同的值。
- $TM_SELECTED_TEXT$:与$selected$类似,但更常用于跨平台的编辑器。
- $TM_CURRENT_LINE$:代表当前光标所在的行。
- $TM_CURRENT_WORD$:代表当前光标所在位置的单词。
- $TM_LINE_INDEX$:代表当前行的索引(从0开始)。
- $TM_LINE_NUMBER$:代表当前行的行号。
- $TM_FILENAME$:代表当前文件的名称,不包含扩展名。
- $TM_FILENAME_BASE$:代表当前文件的名称,包含扩展名。
编写规范
- 简洁性:代码片段应简洁明了,避免冗余代码。
- 自包含性:代码片段应尽可能独立,不依赖外部文件或配置。
- 注释:为代码片段添加注释,说明其用途和如何使用。
- 可定制性:使用占位符和特殊变量,允许用户根据需要定制代码片段。
- 兼容性:确保代码片段在不同的项目和语言环境中都能正常工作。
Visual Studio的代码片段并没有一个官方的、全面的列表,因为一些特殊变量可能依赖于具体的环境或编辑器扩展。然而,我可以提供一个常见的C++代码片段特殊变量列表,以及如何在C++代码片段中使用它们的示例。
C++代码片段特殊变量示例
- $selected$或 $TM_SELECTED_TEXT$
std::cout << $selected$ << std::endl;
- $end$
for (int i = 0; i < 10; ++i) { // 光标将放置在这里 $end$ }
- $1, $2, ...(Tab stops)
std::pair<int, int> pair = { $1$, $2$ }; // 允许用户分别输入两个值
- $TM_CURRENT_LINE$
// 输出当前行 std::cout << "$TM_CURRENT_LINE$" << std::endl;
- $TM_CURRENT_WORD$
// 假设光标在一个变量名上 auto value = $TM_CURRENT_WORD$;
- $TM_LINE_INDEX$
// 假设你需要索引来计算 std::cout << "Line index: " << $TM_LINE_INDEX$ << std::endl;
- $TM_LINE_NUMBER$
// 输出行号 std::cout << "Line number: " << $TM_LINE_NUMBER$ << std::endl;
- $TM_FILENAME$
// 假设创建一个与文件名相同的变量名 std::string filename = "$TM_FILENAME$";
- $TM_FILENAME_BASE$
// 可能是文件路径 std::string filepath = "$TM_FILENAME_BASE$";
- $TM_DIRECTORY$
std::string directoryPath = "$TM_DIRECTORY$";
- $TM_FILEPATH$
std::string fullFilePath = "$TM_FILEPATH$";
请注意,这些变量可能不会在所有版本的Visual Studio中都可用,或者它们的行为可能会根据具体的编辑器配置有所不同。此外,代码片段的XML结构和属性替换功能允许开发者创建几乎任何类型的自定义行为,因此可能还有其他特殊变量存在。
附录
utf8.snippet
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
<CodeSnippet Format="1.0.0">
<Header>
<Title>utf8</Title>
<Shortcut>utf8</Shortcut>
<Description>utf8 编码</Description>
<Author>Zeng</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
<SnippetType>SurroundsWith</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
</Declarations>
<Code Language="cpp"><![CDATA[#if defined(_MSC_VER) && (_MSC_VER >= 1600)
# pragma execution_character_set("utf-8")
#endif
]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
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>Zeng</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
<SnippetType>SurroundsWith</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>type</ID>
<Default>int</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$ = $max$ - 1; $index$ >= 0; $index$--)
{
$selected$ $end$
}]]>
</Code>
</Snippet>
</CodeSnippet>
</CodeSnippets>
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>Zeng</Author>
<SnippetTypes>
<SnippetType>Expansion</SnippetType>
<SnippetType>SurroundsWith</SnippetType>
</SnippetTypes>
</Header>
<Snippet>
<Declarations>
<Literal>
<ID>type</ID>
<Default>int</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>