読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

コード入力量を更に減らす!VisualC#のコードスニペットを作成する方法

前回

コード入力量を減らす!VisualC#で使えるコードスニペットまとめ - がりらぼ

という記事を書きましたが、それだけでは俺の仕事はおわらないぜ!!って人のためにオリジナルコードスニペットの作り方を紹介します。 コードスニペットとはなんぞという人は前回の記事をご参考にしてもらうとして、実際に作っていきましょう。

コードスニペットのファイル形式

VisualStudioのコードスニペットは基本的に「.snippet」拡張子xmlファイルです。 このテンプレート通りにxmlを作ったらだれでも作成できます。

コードスニペットのテンプレート

以下がpropfullコードスニペットの中身になります。コレを参考にしながら読み進めて行きましょう。

<?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>

CodeSnippetsタグ

XMLの一番外側はCodeSnippetsタグで囲まれ、その中にCodeSnippetタグがネストされます。

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
              
        </CodeSnippet>
<CodeSnippets>

Headerタグ

CodeSnippetタグ内にはまずコードスニペットの基本的な情報を含むHeaderタグが存在します。

<Header>
    <Title>propfull</Title>
    <Shortcut>propfull</Shortcut>
    <Description>プロパティとバッキング フィールド用のコード スニペット</Description>
    <Author>Microsoft Corporation</Author>
    <SnippetTypes>
        <SnippetType>Expansion</SnippetType>
    </SnippetTypes>
</Header>

Titleタグはスニペットのタイトル Shortcutはスニペットを使うときにTab2回入力する前の入力文字列 Descriptionは説明 Authorは作者 SnippetTypesはよくわかんないので放置します。(なくても動く)

Snippetタグ

Headerタグ同じようにもう一つSnippetタグがCodeSnippetタグ内にネストしています。

<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>

Declarationsタグ内にLiteralタグが複数個ありますが、このLiteralタグが、スニペットを挿入したあとにTabキーでフォーカスできる変更点となります。 そしてCodeタグ内に<![CDATA[ ]]>タグでスニペットの本体を記述します。 CDATAタグ内で$id$と記述したものは、Literalとして扱われ、LiteralタグのIDと$id$が関連付けられます。

コードスニペットを追加する

コードスニペット作成ができたら、「.snippet」という拡張子でファイルを保存します。 文字コードUTF-8

f:id:garicchi:20140328094728p:plain

VisualStudioから、メニューバー→[ツール]→[コードスニペットマネージャー]を開きます。

f:id:garicchi:20140328094943p:plain

ダイアログがでるので、言語をVisualC#、そしてインポートを押します。

f:id:garicchi:20140328095005p:plain

インポート先はMyCodeSnippetフォルダがいいと思います。

f:id:garicchi:20140328095111p:plain

これでインポート完了!Shortcutタグで指定した文字列を入力し、Tabキーを2回押すとスニペットを挿入できます。

オリジナルスニペットを作ってみる

というわけでpropfullを改造してMVVMLightというライブラリのRaisePropertyChanged付きプロパティのスニペットを作ってみました。

<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>RaisePropertyChanged</Title>
            <Shortcut>propraise</Shortcut>
            <Description>RaisePropertyChanged付きプロパテイを作成する</Description>
            <Author>garicchi</Author>
        </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; RaisePropertyChanged("$property$");}
          }
          $end$]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

f:id:garicchi:20140328095356p:plain

f:id:garicchi:20140328095404p:plain

これは捗る