• 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

    参考资料

  • 相关阅读:
    linux常用指令
    Can't create session svn: Unable to connect to a repository at URL “...”的解决方案
    Web前端之iframe详解
    html和js实现滚动条效果
    升级API证书(权威CA颁发)
    公众号生成带推荐码(场景id)的二维码
    小程序生成带推荐码(场景id)的二维码
    MySQL TEXT数据类型的最大长度
    微信退款全款退,退一部分,分开退一次以上区别跳坑[订单金额或退款金额与之前请求不一致]
    php RSA公钥私钥加解密和验证用法
  • 原文地址:https://www.cnblogs.com/gshang/p/16389339.html
Copyright © 2020-2023  润新知