漫谈 Visual Studio 中最熟悉的“陌生人” - Code Snippets

Code Snippets - 代码段 ,vs2005 引入的功能。作为程序员,也许你每天都在用,然而可能你并不知道这个功能就叫这个东西。今天,笔者就跟大家简单的聊一聊它,说说你们或熟悉或将要熟悉的那个它。

1. 熟悉的陌生人

情景一:

我想把一堆代码分割成一块一块的,方便整理整顿代码,就像这样:


也许你会很快给出答案:“ 谁不会呀,就是快捷键 Ctrl+k、Ctrl+s 然后选中 #region 呗!”

但也许你并不知道,这么好用的功能,他就是 Code Snippets ,本文主角!
你写一些宏逻辑时用到的 #if 。同样是本文主角,就不多哔哔赖赖了。

情景二:

经常感慨大佬指点的神奇小技巧,几个字符就把程序写好了的那种:

  1. 写下 ctor 按2下 Tab 就能自动生成构造函数
  2. 写下 prop 按2下Tab就能自动生成属性
  3. ...

当然还有自己“潜移默化”就被IDE教会了的小技巧:

  1. 写 for 循环时,写完 for 一对 Tab 一敲便完成了for语法。
  2. 写 foreach 时,一对Tab,巴拉巴拉 ... ...
  3. 写出 try 时,一对Tab,巴拉巴拉 ... ...
  4. 写出 do 时,一对Tab,巴拉巴拉... ...
  5. 写出 switch 时,一对 Tab,就出现了 Switch case 的语法结构,更神奇的是当你往switch的括号里面输入一个枚举参数时,敲一个回车或一个 ↓ 下键 过去,哇喔,case 都帮你写好了喂。

其实呢,这些都是 Code Snippets 带来的便捷。
而且 Ctrl+K、Ctrl+S 还有个兄弟 : Ctrl + K 、Ctrl+X ,前者唤起 IDE 自带 Snippets 而后者则唤起用户自定义 Snippets ,看动图演示:


从以往的经验来看,我们大都是直接在代码上下文 key 几个关键字得到咱们想要的 snippet,就比如咱们写 for 语法时。
而且还可以在智能感知菜单中使用 Snippets 过滤条件,只显示 Snippets,演示如下:
笔者使用 Ctrl+J 唤起智能感知菜单,使用菜单右下角按钮筛选出所有 Snippets

所以 Ctrl + K 、Ctrl+X 没用过,也无需唏嘘,觉着IDE也没鼓励咱这么用~

2. 新的征途

总在用着却不知道它是个啥。现在,是不是能理解笔者为啥说这个功能是一个熟悉的“陌生人”了?
好的,接下来笔者给出2个典型,看看如何自定义 code snippets 来方便我们开发的。

示例一:

背景:
.Net4.x 新增的语法中,$ 符号 代替 string.Format 带来的便利令人耳目一新,省去了容易出错的 {0}、{1} ...占位符,同时也简化了相关API的调用。
在以前可能还会用上形如 UnityEngine.Debug.LogFormat() 的API: (笔者是Unity程序员)


而如今的他们,竟一不小心全部作古,有了 $ log 输出就变成下面这样子咯,变量想怎么在log中穿插就怎么穿插,爽的飞起!。

而且,还可以把上下文的变量拿来做逻辑运算,只需要用小括号括起来即可。

痛点:
虽然有了 $ 加持, 调试时输出 log 更顺手了,可是,每次想要输出一个log来,不管你输出的内容复杂与否,你都不可避免的写完下面这些东西:

Debug.Log($"{you field} ")

不难发现此时手指要敲一堆星罗棋布的标点符号:$()"";{} ,外加一个 Shift!
可我要的只是一个 log 啊,这他喵的才几个字符,却让我的手指爬满了整个键盘,上上下下左左右右,这个痛点必须被解决。
那究竟有没有快捷方式可以很快写出 Debug.Log($"{}") 来呢?
自定义 Code Snippets 就可以啦~

实现:

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Title>Debug.Log($"")(完全限定)</Title>
      <Author>Bian Shanghai</Author>
      <Description>UnityEngine.Debug.Log 的代码片段</Description>
      <HelpUrl>
      </HelpUrl>
      <Shortcut>log</Shortcut>
    </Header>
    <Snippet>
      <Declarations>
        <Literal Editable="false">
          <ID>UnityLog</ID>
          <ToolTip>
          </ToolTip>
          <Default>
          </Default>
          <Function>SimpleTypeName(global::UnityEngine.Debug)</Function>
        </Literal>
      </Declarations>
      <Code Language="csharp" Delimiter="$"><![CDATA[$UnityLog$.Log($$"{GetType()}: $end$");]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

Tips :GetType() 在静态方法中直接调用会报错,可以使用 nameof() 代替。

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Title>Debug.Log($"")(完全限定)</Title>
      <Author>Bian Shanghai</Author>
      <Description>UnityEngine.Debug.Log 的代码片段</Description>
      <HelpUrl>
      </HelpUrl>
      <Shortcut>log</Shortcut>
    </Header>
    <Snippet>
            <Declarations>
                <Literal Editable="false">
                    <ID>UnityLog</ID>
                    <Function>SimpleTypeName(global::UnityEngine.Debug)</Function>
                </Literal>
                <Literal Editable="false">
                    <ID>name</ID>
                    <Function>ClassName()</Function>
                </Literal>
            </Declarations>
            <Code Language="csharp">
                <![CDATA[$UnityLog$.Log($$"{nameof($name$)}: $end$");]]>
            </Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>
VS下使用快捷键: Ctrl+K 、Ctrl+B 唤起

上面 xml 代码段保存图示路径所在文件夹,改后缀为 .snippet ,回到 vs 中就可以看效果咯:

有了这个 Snippets ,Debug时只需要无脑的敲出 log 即可 ,舒坦! 。
现在,我们只需聚焦到程序调试本身,而无需费神耗时爬满键盘打那些可恶的字符了,节省的这几秒长远来看省的不仅仅是大把时间,更是提高了解决问题时的专注度呢。

示例二:

背景:
现在写代码多关注版权或者说协同作业的责任分担,也为了表现的更专业,往往类型的上方都会写上注释,标明创建人、创建时间、类型的作用(等等):

实现:
可以使用修改脚本模板的方式(本文不做赘述)。
更可以使用本文主角 snippet 实现:

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
  <CodeSnippet Format="1.0.0">
    <Header>
      <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
      </SnippetTypes>
      <Keywords />
      <Title>doc the class </Title>
      <Author>BianShanghai</Author>
      <Description>用于对 类型 署名的代码片段</Description>
      <HelpUrl>
      </HelpUrl>
      <Shortcut>docc</Shortcut>
    </Header>
    <Snippet>
      <References />
      <Imports />
      <Declarations>
        <Literal Editable="true">
          <ID>Description</ID>
          <ToolTip>类型描述</ToolTip>
          <Default>描述构建此类型的意图</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="true">
          <ID>Author</ID>
          <ToolTip>作者</ToolTip>
          <Default>BianShanghai</Default>
          <Function>
          </Function>
        </Literal>
        <Literal Editable="true">
          <ID>Date</ID>
          <ToolTip>中文输入法快捷键: SJ可输入今天日期</ToolTip>
          <Default>录入当前日期</Default>
          <Function>
          </Function>
        </Literal>
      </Declarations>
      <Code Language="csharp" Kind="type decl" Delimiter="$"><![CDATA[/* 
*Author: $Author$
*Date: $Date$
*Porpurs:$Description$
*/]]></Code>
    </Snippet>
  </CodeSnippet>
</CodeSnippets>

使用方法跟第一个示例一样,下面看下效果就行:



可以看到

  1. 只需要输入 docc (doc + class 的简称)就能很快的出来这个类的描述模板。
  2. 每一个需要用户输入的地方都可以设置 tips 做友情提示
  3. 可以使用 Tab 键在这几个需要自定义内容的地方导航。

3. 结语:

通过本文,童靴们现在应该对这个 snippet 有了更深刻的了解了,虽然本文只是泛泛而谈,没有教程那种过于精细的细节指导,但是笔者认为篇幅限制之下,科普的目的应该已是达到了罢~
觉得示例可能对你有帮助,鼓励动手试试,想要进一步了解一下的,可以看看扩展阅读。

4. 扩展阅读:

5. 番外:

我用的VS 2019 居然对格式说明符有了Tips,好像更方便了耶!鼓励尝试VS新版本。


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,451评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,172评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,782评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,709评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,733评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,578评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,320评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,241评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,686评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,878评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,992评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,715评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,336评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,912评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,040评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,173评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,947评论 2 355