Programming Serendipity

気まぐれに大まかに生きるブログ

Visual Studio で独自スニペットを追加する

前提

ifと入力してtabを1回(C#の場合は2回)押すとif文のスニペットが現れます。
同じことはfor, rfor, while, switchなどでも可能です。
また、コードの一部を選択してCtrl + K => Ctrl + Sと押すと、スニペットで囲えます。
例えば、2行くらい選択して↑の操作を行い、#ifスニペットを選択すると、その2行が#if ~ #endifで囲われます。

続きから本題です。

本題

このスニペットスニペット定義ファイルを既定の場所に置くことで追加できます。
Ctrl+K => Ctrl+B(またはTools > Code Snippet Managers...)と押すと、スニペットマネージャーが起動するので、Language: Visual C++ を選択し、 Visual C++フォルダを選択することで、スニペットがどこにあるのか確認できます。
ちなみに、自分の場合は↓にありました。
C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\Common7\IDE\VC\Snippets\1033\Visual C++
ここに追加します。
本当は My Code Snippets の場所に置くのがいいんでしょうが、自分の場合呼び出すときに、Visual C++かMy Code Snippetsかを選択する操作が余分に必要になってしまったので、こうしています(ダブったスニペットを定義するとそれ以降解消されない?)

選択したコードを()で囲うスニペットは以下のように書くことができます。

<?xml version="1.0" encoding="utf-8" ?>
<CodeSnippets  xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>(</Title>
            <!-- <Shortcut>paren</Shortcut> -->
            <Description>Code snippet for surround with paren</Description>
            <Author>q7z.hatenablog.com</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
                <SnippetType>SurroundsWith</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Code Language="cpp"><![CDATA[($selected$ $end$)]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>

このスニペットで、カッコで囲う場所まで音ゲーばりのカーソル目押し止めに神経を使う回数を減らせます。

スニペットの書き方は単純なので、既存のものの書き方を見れば十分だと思いますが、簡単に抑えるべきポイントを列挙しすると…

<Title>がCtrl+K, Ctrl+Sと押したときに出てくる候補名で、 <Shortcut> がそのまま入力したときにIntellisenseに出てくる名前です。
今回はIntellisenseに出てくるとかえって補完の邪魔になると思ってコメントアウトしています。 CDATAの中が実際に展開されるコードですが、$selected$ $end$が展開が終わってEnterを押した後のカーソルの位置になるようなので、このようにしています。

同様に、{}で囲うスニペットなども作って使っています。スコープを分けたいときなどはこれで、{}と打って改行して、コード片をカットしてペーストして…、とせずとも、コード片を選択してこのスニペットを呼び出すだけで整形してくれるようにしました(クリップボードを汚さない)。

ついでに、classiスニペットにコピー・ムーブコンストラクタ・代入演算子を入れて置いたり、rforの左側をauto&&にしてパラメータから外したりしています。
素でも便利ですが、探せば便利な使い方がもっと見つかりそうです。