zoukankan      html  css  js  c++  java
  • 快速开发

    Code Snippet

    Code Snippet,与其称其为代码片段(Code Block),将它翻译成代码模板(Code Template)可能更合适一些。

    任何一段代码都可以叫做代码片段,我们这里要讲的不是这种随性的东西,而是一种快速生成代码的快捷方式,通过它可以有效地提高我们的编程效率。

    举个例子,假如你在C#代码编辑器中输入propfull,再连续摁俩下Tab键进行代码补全,将会自动为你生成以下代码段:

    private int myVar;
    
    public int MyProperty
    {
    	get { return myVar; }
    	set { myVar = value; }
    }
    

    编辑器里是这样子的:

    代码模板生成

    此时光标处于第一个int位置,键入任何其他类型都会置换int,并且你可以通过Tab键位跳到下一个可修改的地方(背景色为黄色),这个模板里提供了3个可修改的位置,intmyVar以及MyProperty

    当你修改myVar的时候,你可以通过"Alt+Enter"或者"Ctrl+."将其他引用了myVar的地方进行快速替换。

    你仅仅通过输入几个字符,就完成了一大段代码的创建,为你省下不少时间,试想一下你创建过的封装属性何其的多,仅这一项就可以大大的提高你的工作效率。

    你也通过其他的第三方扩展或者通过"快速操作->封装字段"也可以实现类似的效果。

    Microsoft为你内置了不少语言的不少代码模板,如下图所示是C#内置的Code Snippet:

    默认模板

    我们可以按位置在本地找到相应的代码片段,都是.snippet文件,我们用记事本打开propfull.snippet文件,里面的内容如下所示:

    <?xml version="1.0" encoding="utf-8"?>
    <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    	<CodeSnippet Format="1.0.0">
    		<Header>
    			<Title>propfull</Title>
    			<Shortcut>propfull</Shortcut>
    			<Description>属性和支持字段的代码片段</Description>
    			<Author>Microsoft Corporation</Author>
    			<SnippetTypes>
    				<SnippetType>Expansion</SnippetType>
    			</SnippetTypes>
    		</Header>
    		<Snippet>
    			<Declarations>
    				<Literal>
    					<ID>type</ID>
    					<ToolTip>属性类型</ToolTip>
    					<Default>int</Default>
    				</Literal>
    				<Literal>
    					<ID>property</ID>
    					<ToolTip>属性名</ToolTip>
    					<Default>MyProperty</Default>
    				</Literal>
    				<Literal>
    					<ID>field</ID>
    					<ToolTip>支持此属性的变量</ToolTip>
    					<Default>myVar</Default>
    				</Literal>
    			</Declarations>
    			<Code Language="csharp"><![CDATA[private $type$ $field$;
    
    	public $type$ $property$
    	{
    		get { return $field$;}
    		set { $field$ = value;}
    	}
    	$end$]]>
    			</Code>
    		</Snippet>
    	</CodeSnippet>
    </CodeSnippets>
    

    虽然你也可以通过直接修改这个xml文档来修改代码模板,但我们更推荐使用Visual Studio的一个可视化扩展,叫Snippet Designer。它可以让你更加容易地进行代码模板的编辑,至于上面的内容每一段具体都是什么意思我们将在后面一一介绍。

    Snippet Designer 安装

    你可以通过以下的方法安装Snippet Designer:

    注意你需要在"菜单->工具->选项->扩展"中勾选上"允许同步自动加载扩展",如果不勾,我的VS2019完全用不了这个扩展,不知道其它版本的VS如何。

    允许自动同步加载扩展

    Snippet Designer 特性

    按照Github上的介绍文档说的是:

    Access it by opening any .snippet file or going to File -> New -> File -> Code Snippet File.

    也就是说,首先你可以通过新建文件的时候创建snippet文件,本来应该这样子的:

    正常的创建文件

    而事实上我的是这样子的,啥也没有:

    根本找不到snippet

    It uses the native Visual Studio code editor so that you can write the snippets in the same enviorment you write your code.

    嗯,这点倒是可以,后续你就可以看到,就跟普通文档一样编写代码。

    It lets you easily mark replacements by a convenient right click menu.

    这点也没问题,就是编辑模板的时候,选中一块你想替换的内容,右键菜单里有个Make Replacement选项,如下所示:

    创建占位符

    It displays properties of the snippet inside the Visual Studio properties window.

    确实,也提供了一个属性窗口,如下所示:

    Snippet文件的属性窗口

    It is located under View -> Other Windows -> Snippet Explorer.

    你可以打开"菜单->视图->其它窗口->Snippet Explorer",如下图所示:

    打开Snippet Explorer

    本来应该长这样子的:

    正常的情况

    而我在VS2019下打开的是这样子,啥都没有:

    失败的情况

    This tool window contains a code preview window which lets to peek inside the snippet to see what it is without opening the file.

    说的是"菜单->工具->代码片段管理器"窗口,提供了一个快速预览的功能,但跟这个扩展没啥关系。

    Maintains an index of snippets on your computer for quick searching.

    在你机器上为所有的snippets文件创建了索引以便快速访问,感觉不出来有没有这效果。

    Provides a quick way to find a code snippet to use, edit or delete.

    应该说的是"Snippet Explorer"功能,反正我这没有,安装完成后先是提示了"Visual Studio无法同步加载某些扩展",然后我手动去工具选项那勾选了允许同步加载,又提示"VS在加载扩展的过程中无法调用已经过时了的API"。

    The Snippet Designer supports Visual Studio 2015, 2017, 2019.

    不是说好的支持VS2019吗?难道我装的是假的VS2019企业版。

    开心

    Snippet Designer 详细介绍

    虽然我的VS2019并不能用到上面介绍的所有特性,但不代表在座各位帅哥美女不行,又或者其它版本的VS能稳定支持也说不一定呢。

    我的目标始终是编写代码模板来加快自己的编程效率,他提供的那些特性为什么在我的这个机器环境基本用不了,我也不接着折腾了,假如有那位大佬解决了这个问题,请告诉我一声,我学习一下。

    但有一个没提到的功能它是肯定能用的,而接下来我也将用这个功能来演示如何创建代码模板,以及我在查看系统内置模板后总结出来的一点点心得。

    你可以在任意一个代码文件里选中一段代码,然后右键菜单中选择"Export as Snippet":

    选中代码

    这意味着你打算将这段代码转成代码模板,然后就会跳转到这样的一个窗口:

    Snippet

    我先稍作修改,然后我们再解释:

    实际所做的修改

    红框部分和绿底部分都是我们做了修改的,通过"代码片段管理器",你可以很轻松的对应上相应的描述字段,这些我们不用多做解释,大家都懂,值得一提的是,你存储Snippet的文件名可以是任何名字,不过建议和快捷方式(shortcut)一致,这样子容易找。接下来我们解释最重要的部分:

    • shortcut:快捷方式,这里是tryccf,也就是说你通过在代码编辑器里敲击这个tryccf快捷方式,再通过两次Tab补全,就能完全显示与上面一样的内容。假如你定义的快捷方式和其他快捷方式重了,你在代码编辑器里使用的时候,会弹出选择框让你选择想要的代码模板。
    • $selected$:当你通过"选中一段代码->右键菜单->片段->外部代码->选中相应的代码片段后",被选中的代码会被包裹在$selected$定义的位置里。
    • $end$:假如没有任何可编辑(Editable)的区域,代码片段生成后,光标会处于这个$end$定义的位置。
    • ID:与模板内包括在$内的占位符一一对应,只是这里不需要写$符号而已。
    • Tooltip:相应位置的具体说明。
    • Defaults to:假如没有定义Function或者Function计算不出值,就会将相应的占位符替换成这里的字符串。
    • Function:这里我只找到两种,一个是ClassName(),用来将占位符替换成代码所在的类名,一个是SimplyTypeName(global::完整类名),用来将占位符替换成相应的类,例如,这里我们用的是SimpleTypeName(global::System.OverflowException)
    • Editable:勾上代表该区域可编辑,生成代码片段后,可以通过Tab键快速跳转到相应占位符的区域,背景色为黄色,不选则代表不可编辑,如下图所示:

    自定义的代码模板生成

    • Replacement Delimiter:默认是$,你也可以使用其它的符号,被两个此符号包裹的一串字符被认为是占位符。

    修改完成后,就可以保存这个Snippet文件,注意默认会保存到MyCode Snippets对应的目录下,因此保存完成后代码片段管理器直接就能看到,代码编辑器里也可以直接通过你定义的shortcut进行使用。你也可以保存到你喜欢的目录下,再通过导入功能将其添加进来。

    我们可以用记事本打开我们创建好的新Snippet文件,内容如下:

    <?xml version="1.0" encoding="utf-8"?>
    <CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
      <CodeSnippet Format="1.0.0">
        <Header>
          <Keywords>
            <Keyword>
            </Keyword>
          </Keywords>
          <SnippetTypes>
            <SnippetType>Expansion</SnippetType>
          </SnippetTypes>
          <AlternativeShortcuts>
          </AlternativeShortcuts>
          <Title>代码模板示例</Title>
          <Author>青梅酒熟凭卿醉</Author>
          <Description>本示例演示了所有内容</Description>
          <HelpUrl>
          </HelpUrl>
          <Shortcut>tryccf</Shortcut>
        </Header>
        <Snippet>
          <Declarations>
            <Literal Editable="true">
              <ID>Program</ID>
              <ToolTip>代码所在类名</ToolTip>
              <Default>DefaultClassName</Default>
              <Function>ClassName()</Function>
            </Literal>
            <Literal Editable="false">
              <ID>ConsoleWriteLine</ID>
              <ToolTip>在控制台输出信息</ToolTip>
              <Default>Console.WriteLine</Default>
              <Function>
              </Function>
            </Literal>
            <Literal Editable="true">
              <ID>OverflowException</ID>
              <ToolTip>溢出异常</ToolTip>
              <Default>Exception</Default>
              <Function>SimpleTypeName(global::System.OverflowException)</Function>
            </Literal>
            <Literal Editable="true">
              <ID>Exception</ID>
              <ToolTip>通用异常类</ToolTip>
              <Default>Exception</Default>
              <Function>
              </Function>
            </Literal>
          </Declarations>
          <Code Language="csharp" Delimiter="$" Kind="method body"><![CDATA[try
                {
                    // Do something
                    $selected$
                }
                catch ($OverflowException$ ex)
                {
                    $ConsoleWriteLine$(nameof($Program$));
                    $ConsoleWriteLine$(ex.StackTrace);
                }
                catch ($Exception$ ex)
                {
                    $ConsoleWriteLine$(ex.Message);
                }
                finally
                {
                    // Dispose
                    $end$
                }]]></Code>
        </Snippet>
      </CodeSnippet>
    </CodeSnippets>
    
  • 相关阅读:
    数据链路层
    补码加减法
    matlab函数
    HDU2159_二维完全背包问题
    HDU2844买表——多重背包初探
    HDU1025贫富平衡
    最大m段子段和
    01背包浮点数情况
    第K大01背包
    HDU2955 01背包
  • 原文地址:https://www.cnblogs.com/zenronphy/p/FastDevelopByCodeSnippet.html
Copyright © 2011-2022 走看看