sh1’s diary

プログラミング、読んだ本、資格試験、ゲームとか私を記録するところ

VisualStudio コードスニペットの作り方

C# 開発環境を Visual Studio 2019 に切り替えたので、いままで使っていたコードスニペットの移行を機に、コードスニペットの作り方などを整理しました。

コードスニペットって、どんなもの?

f:id:shikaku_sh:20191003112917g:plain
コードのブロックをパッと入力!

code(コード) snippet(断片・切れ端)です。見ての通り、コードの断片を使いまわして、コード入力の手間を減らそうというアプローチです。

なんで、「再利用可能な小さなコードのブロック」のみたいな名前になっていて、繰り返し書くようなコードのブロックがコードスニペットの候補になりますよ、と。

たとえば、初期状態でも「prop」とコードディングしてから tab を押すと、登録されているコードスニペットに置換されます。(いくつか最初から登録してあります)

f:id:shikaku_sh:20191003113321p:plain
「prop」のコードスニペット。プロパティの作成を補助します。

コードスニペットは、特殊な独自コーディング手法のように感じるかもしれないけど「ReactiveProperty」のような有名なパッケージにも用意されています。ひと手間減らすためのもの、くらいの認識がいいかと。1

コードスニペットの構成

項目テンプレートと違って、コードスニペットはファイルを (.zip) 形式に圧縮しません。.snippet という変わった拡張子のテキストファイルを指定のフォルダに配置すれば、登録できます。(Visual Studio の「ツール>コードスニペット マネージャ」からインポートでもよい)

設定ファイル (.snippet)

上で Gif アニメーションで示していた「notifyproperty」(.snippet) ファイルの作成例がこちら。

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>notifyproperty</Title>
            <Shortcut>notifyproperty</Shortcut>
            <Description>Code snippet for property and backing field with NotifyPropertyChanged</Description>
            <Author>sh1ch</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal>
                    <ID>type</ID>
                    <ToolTip>Property type</ToolTip>
                    <Default>int</Default>
                </Literal>
                <Literal>
                    <ID>property</ID>
                    <ToolTip>Property name</ToolTip>
                    <Default>MyProperty</Default>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[private $type$ _$property$;
  public $type$ $property$
  {
      get { return _$property$; }
      set
      {
          _$property$ = value;
          PropertyChanged.Raise(this, nameof($property$));
      }
  }$end$]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

「notifyproperty」とコードディングしてから tab を押すと、置換される省略はつぎのとおり。(int と MyProperty は置換しやすい)

private int _MyProperty;

public int MyProperty
{
    get { return _MyProperty; }
    set
    {
        _MyProperty = value;
        PropertyChanged.Raise(this, nameof(MyProperty));
    }
}

f:id:shikaku_sh:20191003114635p:plain
このコードブロックを展開するコードスニペットを作ります。

スキーマの設定

コードスニペットスキーマ (XML)、<CodeSnippet> タグ以下は次のような構成になっています。

  • Header
    • Title
    • Shortcut
    • Description
    • Author
    • SnippetTypes (Snippet Type を n 個持てる)
      • Snippet Type
  • Snippet
    • Declarations (Literal を n 個持てる)
      • Literal
        • ID
        • ToolTip
        • Default
    • Code

ざっくりと Header 要素と Snippet 要素の2つに分類し、コードを読んで考えるとわかりやすいと思います。

この構成項目は、Windows PowerShellスニペットファイルに標準設定されている内容と一緒です。設定方法が共通だったりします。2

ファイル:%ProgramFiles%\WindowsPowerShell\Modules\Pester\3.4.0\Snippets


Header 要素

Header 要素」は、IntelliSense コードの一般的な情報を指定してあります。上の例は、つぎの表のようになっています。

要素 説明
Title 必須の要素。作成したコードスニペットの表示名を設定します。
Shortcut コードスニペットの挿入に使用するショートカット テキスト。Title や Keyword と同じテキストが設定されやすい。
Description 作成したコードスニペットの説明。
Author コードスニペットを作成した人・会社の名前。
Snippet Types コードスニペットをどのように挿入するかを指定する SnippetType 要素の親要素。Expansion はカーソル位置にコード スニペットを挿入。

Snippet 要素

Snippet 要素」は、展開するコードと展開後に編集するリテラル(オブジェクト)の設定ブロックです。

要素 説明
Code 必須の要素。使いまわしをするコードブロック。
Declarations Code ブロックで使うリテラルとオブジェクトなどの設定。

なので、Code が一番の主要素で、Declarations がそれを補助する要素。サンプルだと $property$ のようにドル記号で示されるプロパティを Declaration の要素でリテラルとして宣言しています。 3

リテラルの要素は、Gif アニメーションの黄色の背景色で着色されたテキスト部分(int > string と MyProperty > SampleText)になっていて、まとめて書き換えができるので便利です。

サンプル

GitHub にて公開しています。

参考

Effective C# 6.0/7.0

Effective C# 6.0/7.0

徹底解説Visual Studio Code

徹底解説Visual Studio Code

  • 作者:本間咲来
  • 発売日: 2019/09/27
  • メディア: 単行本

Visual Studio パーフェクトガイド

Visual Studio パーフェクトガイド


  1. 作者より慣れると快適だともコメントあり

  2. 設定する xmlns 名前空間が異なります。ちなみに、vs codejson 形式なので、方法が異なる。

  3. ドル記号 (Dollar sign) が、なんでこんなところで採用されるのかは、「wiki - Use in computer software」も参考になります。