C# 開発環境を Visual Studio 2019 に切り替えたので、いままで使っていたコードスニペットの移行を機に、コードスニペットの作り方などを整理しました。
コードスニペットって、どんなもの?
code(コード) snippet(断片・切れ端)です。見ての通り、コードの断片を使いまわして、コード入力の手間を減らそうというアプローチです。
なんで、「再利用可能な小さなコードのブロック」のみたいな名前になっていて、繰り返し書くようなコードのブロックがコードスニペットの候補になりますよ、と。
たとえば、初期状態でも「prop」とコードディングしてから tab を押すと、登録されているコードスニペットに置換されます。(いくつか最初から登録してあります)
コードスニペットは、特殊な独自コーディング手法のように感じるかもしれないけど「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)); } }
スキーマの設定
コードスニペットのスキーマ (XML)、<CodeSnippet>
タグ以下は次のような構成になっています。
- Header
- Title
- Shortcut
- Description
- Author
- SnippetTypes (Snippet Type を n 個持てる)
- Snippet Type
- Snippet
- Declarations (Literal を n 個持てる)
- Literal
- ID
- ToolTip
- Default
- Literal
- Code
- Declarations (Literal を n 個持てる)
ざっくりと 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 にて公開しています。
参考
- 作者:BillWagner
- 発売日: 2018/09/05
- メディア: Kindle版
- 作者:本間咲来
- 発売日: 2019/09/27
- メディア: 単行本
-
作者より慣れると快適だともコメントあり。↩
-
ドル記号 (Dollar sign) が、なんでこんなところで採用されるのかは、「wiki - Use in computer software」も参考になります。↩