首页 > 其他分享 >VisualStudio2019创建Code Snippet

VisualStudio2019创建Code Snippet

时间:2023-12-20 18:23:44浏览次数:37  
标签:片段 Code 代码 Snippet VisualStudio2019 可以 模板

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>

标签:片段,Code,代码,Snippet,VisualStudio2019,可以,模板
From: https://www.cnblogs.com/zenronphy/p/17917188.html

相关文章

  • Leetcode—旋转矩阵
    48. 旋转图像给定一个 n × n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转90度。你必须在 原地 旋转图像,这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。示例1:输入:matrix=[[1,2,3],[4,5,6],[7,8,9]]输出:[[7,......
  • Leetcode 71. 简化路径
    https://leetcode.cn/problems/simplify-path/description/给你一个字符串path,表示指向某一文件或目录的Unix风格绝对路径(以'/'开头),请你将其转化为更加简洁的规范路径。在Unix风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点(..)表示将目录切换到上一级(指向父目......
  • Codeforces Round 916 (Div. 3)
    A.ProblemsolvingLogmap枚举字母#include<bits/stdc++.h>usingnamespacestd;voidsolve(){ intn; strings; cin>>n>>s; intans=0; s=""+s; map<char,int>mp; for(inti=1;i<=n;i++){ mp[s[i]]++; } for(autoc:mp)......
  • Amazon Toolkit — CodeWhisperer 使用
    tFragment-->官网:https://aws.amazon.com/cn/codewhisperer/?trk=cndc-detail最近学习了亚马逊云科技的代码工具,感慨颇多。下面是安装和使用的分享。CodeWhisperer,亚马逊推出的实时AI编程助手,是一项基于机器学习的服务,它可以分析开发者在集成开发环境(IDE)中的注释和代码,并根......
  • Codeforce Round 916(div3)
    CodeforcesRound916(div3)[Problem-A-Codeforces]:ProblemsolvingLogA.题直接看样例进行分析,发现每一次出现的字符代表着用了1分钟来看这道题,每道题都有固定的解题时间,只要达到了这个解题时间,就可以将这题解出来,答案就要加上1;同时要注意将解决过的问题要标记一下;#in......
  • Codeforces Round 916 (Div. 3)(A~E2)
    A统计一下每个字母的出现次数然后输出即可#include<bits/stdc++.h>#definerep(i,a,b)for(registerinti=(a);i<=(b);++i)#definefep(i,a,b)for(registerinti=(a);i>=(b);--i)#definelsp<<1#definersp<<1|1#definePIIpair<int,int&......
  • [Troubleshooting] kubectl cp exit code 255 - exec: \"tar\": executable file no
    0.背景kubectlcpcontainer文件到本地host报错:$kubectlcptest/po-test-pod-0:/tmp./-cctr-test-containertime="2023-12-20T02:17:29Z"level=errormsg="execfailed:unabletostartcontainerprocess:exec:\"tar\":executablefile......
  • [LeetCode22-中等-DFS] 括号生成
    这道题考使用回溯(递归的一种)进行深度优先算法,题目是这样的数字n代表生产括号的对数,写一个算法,返回所有有效的括号组合比如 n=1代表生成1对括号,显然答案就是“()"n=2,代表生成2对括号, 答案就是"()()","(())"n=3代表生成3对括号,答案就是"((()))","()()()","(()())......
  • Derivative norm vector repect to time 《PBM by Pixar》 Appendix D.2 code
    目录1Derivativenormalvectorrepecttotime1.1DerivativevectornormrepecttotimeXRefVectorCalculus1DerivativenormalvectorrepecttotimeLet'sdenotetheunitnormalvectoras:\[\mathbf{n}=\frac{\mathbf{e}_a\times\mathbf{e}_b}{......
  • [LeetCode] LeetCode81. 搜索旋转排序数组II
    题目描述思路:是lc33.搜索旋转排序数组的延伸,允许包含重复元素起初:当nums[left]<=nums[mid]时,区间[left,mid]有序当nums[left]>nums[mid]时,区间[mid,right]有序但是这个题目当nums[left]==nums[mid]时,无法判断哪个区间是有序的,无法判断target位于左侧还是右侧,此时无......