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个可修改的位置,int
,myVar
以及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:
-
在Visual Studio的扩展管理器里,直接通过联网搜索下载Snippet Designer,安装完后需要重启。
-
在https://marketplace.visualstudio.com/items?itemName=vs-publisher-2795.SnippetDesigner上下载SnippetDesigner.vsix,下载完成后双击进行安装,注意安装时不能有打开的VS实例。
-
你也可以在Github上下载其解决方案然后自己编译安装,仓库地址为:https://github.com/mmanela/SnippetDesigner。
注意你需要在"菜单->工具->选项->扩展"中勾选上"允许同步自动加载扩展",如果不勾,我的VS2019完全用不了这个扩展,不知道其它版本的VS如何。
Snippet Designer 特性
按照Github上的介绍文档说的是:
Access it by opening any .snippet file or going to File -> New -> File -> Code Snippet File.
也就是说,首先你可以通过新建文件的时候创建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.
确实,也提供了一个属性窗口,如下所示:
It is located under View -> Other Windows -> 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的文件名可以是任何名字,不过建议和快捷方式(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>
标签:片段,Code,代码,Snippet,VisualStudio2019,可以,模板
From: https://www.cnblogs.com/zenronphy/p/17917188.html