# Snippet или фрагмент кода

## Часть 1. Что такое Snippet или фрагмент кода?

Набирая код, очень часто приходится повторять однотипные действия – например набирать по буквам `Console.WriteLine();`

Со временем начинаем замечать подсказки для быстрого введения кода, которое предлагает IntelliSense

Параметры IntelliSense включены по умолчанию. Чтобы отключить их, перейдите в раздел *Сервис > Параметры > Текстовый редактор > Все языки* и снимите флажок Сведения о параметрах или Автоматический список участников, если вы не хотите использовать функцию Списка участников.

<figure><img src="https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FK1fOlE1x8CsdUFH9oeUU%2Fimage.png?alt=media&#x26;token=4edd4ad2-8a39-40f5-9da4-063bdddfa340" alt=""><figcaption><p>IntelliSense предлагает дополнить текст до "Console"</p></figcaption></figure>

<figure><img src="https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2Fa1I2V9yn5YdPJJbZYYMD%2Fimage.png?alt=media&#x26;token=6d299b52-b07d-4da9-99fb-2c140a28bcb8" alt=""><figcaption><p>IntelliSense предлагает дополнить текст до "Console.WriteLine"</p></figcaption></figure>

Потом узнаем, что есть комбинация клавиш для быстрого написания `Console.WriteLine();` *- **cw*** и 2 раза клавиша **Tab,** и дело идет гораздо быстрее.

<figure><img src="https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2F6TufC9SKnBDFzDWw8W6u%2Fimage.png?alt=media&#x26;token=253ffc4c-3d9f-4e70-9c5d-7e27c6f46b44" alt=""><figcaption><p>Этот значок указывает на snippet (в английской редакции) или фрагмент кода (в русской редакции)</p></figcaption></figure>

У **Microsoft Visual Studio** есть целый комплект сниппетов – часто встречающихся комбинаций клавиш для быстрого ввода. Найти их перечень можно в *Средства* – *Диспетчер фрагментов кода* или набрав сочетание **Ctrl+K, Ctrl+B**

<figure><img src="https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FJhu1CWNWeGLPKGsB3HE0%2Fimage.png?alt=media&#x26;token=50bd76e7-b583-4dc6-a2d7-2d82c3bf7cc6" alt=""><figcaption><p>Диспетчер фрагментов кода в меню</p></figcaption></figure>

<figure><img src="https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FDNOZegzF7sJVjAj9P2Zr%2Fimage.png?alt=media&#x26;token=c9ad5341-6c94-433f-ad87-5aebcc4200b1" alt=""><figcaption><p>Выбираем опцию CSharp</p></figcaption></figure>

![](https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FqD1HkSVoiNgR9ujI0JI0%2Fimage.png?alt=media\&token=c09d1244-5267-4784-874d-5d3d934be327)![](https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FJpaqvFEQvPAq6L0V07LG%2Fimage.png?alt=media\&token=151eb512-9a78-42dd-a5c9-92a760e37e0c)![](https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FUkhxG0iBrPENKBHLacwq%2Fimage.png?alt=media\&token=acfd1a40-7cec-45be-b01c-6b19ef4ad3b4)

Здесь представлены все стандартные сниппеты, которые есть для языка `C#`.

Т.е. набрав сочетание клавиш, указанное выше, например, `for` и нажав 2 раза клавишу **Tab**

Основной скелет цикла for появится в коде и его останется только заполнить:

![](https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FKW3wzhgSKFvtygy1Qht4%2Fimage.png?alt=media\&token=79a1b0ab-6004-4f82-9d2b-7888e49a2b9f)

Обратите внимание, что часть кода, которую надо заменить – сразу подсвечивается. Использование snippet’ов сокращает в разы время набора часто повторяющихся фрагментов кода.

## Часть 2. Создаем свой Snippet или фрагмент кода

Освоившись с применением snippet начинаем понимать, что стандартных маловато будет. И нам срочно нужен фрагмент кода для `Console.ReadLine();` которого нет в перечне.

Открываем диспетчер фрагментов кода:

![](https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FgjQOpKyiwSEPwsohlzck%2Fimage.png?alt=media\&token=913bdf67-4ae0-4495-8a00-e19a8cce6705)

Выбираем папку `Visual C#`:

<figure><img src="https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FpDn5mUxDNAOEKzbbpFIY%2Fimage.png?alt=media&#x26;token=9c77fcbd-3f48-46bd-93fe-52d3807f48a9" alt=""><figcaption><p>Папка Visual C#</p></figcaption></figure>

Копируем путь к папке:

<figure><img src="https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FcJhNVv0fWgO6CUNvh07h%2Fimage.png?alt=media&#x26;token=1bb94a68-3b3d-477a-aac3-6ac86117d0d6" alt=""><figcaption></figcaption></figure>

Переходим в указанное место через Проводник / Total Commander / или что там у Вас для этого:

<figure><img src="https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FX5STFJuLIcrMvokfJiXG%2Fimage.png?alt=media&#x26;token=3904d257-a5cf-4646-adc5-a4c93b9818c5" alt=""><figcaption></figcaption></figure>

Копируем `cw.snippet` в новую папку `cr`, где будем изменять файл под себя. Переименовываем файл в `cr.snippet` и открываем в текстовом редакторе:

```xml
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>cw</Title>
            <Shortcut>cw</Shortcut>
            <Description>Фрагмент кода для Console.WriteLine</Description>
            <Author>Microsoft Corporation</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal Editable="false">
                    <ID>SystemConsole</ID>
                    <Function>SimpleTypeName(global::System.Console)</Function>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[$SystemConsole$.WriteLine($end$);]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>
```

1. В строчке `<Code Language="csharp"><![CDATA[$SystemConsole$.WriteLine($end$);]]>` заменяем `Write` на `Read` и переносим `$end$` за точку с запятой. Получаем такую запись: `<Code Language="csharp"><![CDATA[$SystemConsole$.ReadLine();$end$]]>`
2. В `<Title>cw</Title>` меняем на `<Title>cr</Title>`
3. В `<Shortcut>cw</Shortcut>` меняем на `<Shortcut>cr</Shortcut>`
4. В `<Description>Фрагмент кода для Console.WriteLine</Description>`

   меняем на `<Description>Фрагмент кода для Console.ReadLine</Description>`
5. Авторство `<Author>Microsoft Corporation</Author>` меняем на себя любимого `<Author>IJunior</Author>`

Осталось импортировать новый snippets в **Microsoft visual studio**.

Средства – Диспетчер фрагментов кода или сочетание **Ctrl+K**, **Ctrl+B**:

<figure><img src="https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FTS0mOQGwAAAgpp1geH3j%2Fimage.png?alt=media&#x26;token=11858826-2d42-41e0-8f80-72f042d1816f" alt=""><figcaption></figcaption></figure>

Язык `CSharp`, расположение **MyCodeSnippets**, кнопка **Импорт**.

Указываем путь к нашему созданному файлу и нажимаем кнопку **Открыть**.

Переходим в **Microsoft Visual Studio**, запускаем проект и вводим `cr` и 2 раза клавишу **Tab**

<figure><img src="https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FdkicYvgknomKGEQJ3zQv%2Fimage.png?alt=media&#x26;token=c658a692-2ba8-4f7d-b8d4-b8787575fb16" alt=""><figcaption></figcaption></figure>

## Часть 3. Модифицируем стандартный Snippet или Фрагмент кода

Меня не устраивает стандартный snippet cw для `Console.WriteLine()`, т.к. все время использую интерполяцию. Делать новый фрагмент кода ради добавления в него `Console.WriteLine($””)` не имеет смысла, поэтому будем модифицировать стандартный snippet.

Для начала сделаем резервное копирование стандартного сниппета `cw` на случай, если что-то пойдет не так.

Переходим к месту хранения сниппетов и копируем его оттуда в свою отдельную папку резервных копий и папку для препарирования.

<figure><img src="https://2743800200-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FwxT0U6r7Plf4kYjtMJzB%2Fuploads%2FtcExiGVk8vAof2orlgvs%2Fimage.png?alt=media&#x26;token=70c8693c-54a5-4aae-a8e6-118622a66680" alt=""><figcaption></figcaption></figure>

Так выглядел код до модификации:

```xml
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>cw</Title>
            <Shortcut>cw</Shortcut>
            <Description>Фрагмент кода для Console.WriteLine</Description>
            <Author>Microsoft Corporation</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal Editable="false">
                    <ID>SystemConsole</ID>
                    <Function>SimpleTypeName(global::System.Console)</Function>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[$SystemConsole$.WriteLine($end$);]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>
```

Так после модификации:

```xml
<?xml version="1.0" encoding="utf-8"?>
<CodeSnippets xmlns="http://schemas.microsoft.com/VisualStudio/2005/CodeSnippet">
    <CodeSnippet Format="1.0.0">
        <Header>
            <Title>cw</Title>
            <Shortcut>cw</Shortcut>
            <Description>Фрагмент кода для Console.WriteLine</Description>
            <Author>OldBeliever</Author>
            <SnippetTypes>
                <SnippetType>Expansion</SnippetType>
            </SnippetTypes>
        </Header>
        <Snippet>
            <Declarations>
                <Literal Editable="false">
                    <ID>SystemConsole</ID>
                    <Function>SimpleTypeName(global::System.Console)</Function>
                </Literal>
                <Literal Editable="false">
                    <ID>Interpolation</ID>
                    <Function>SimpleTypeName($)</Function>
                </Literal>
            </Declarations>
            <Code Language="csharp"><![CDATA[$SystemConsole$.WriteLine($Interpolation$"$end$");]]>
            </Code>
        </Snippet>
    </CodeSnippet>
</CodeSnippets>
```

Единственной загвоздкой было выведение **знака $**, который воспринимался, как внутренняя команда. Пришлось сделать для него отдельный литерал.

Добавил строчки:

```xml
<Literal Editable="false">
    <ID>Interpolation</ID>
    <Function>SimpleTypeName($)</Function>
</Literal>
```

Изменил:

`<Code Language="csharp"><![CDATA[$SystemConsole$.WriteLine($end$);]]>`

На

`<Code Language="csharp"><![CDATA[$SystemConsole$.WriteLine($Interpolation$"$end$");]]>`

## Часть 4. Примеры горячих клавиш для фрагментов кода

* сс - `Console.Clear();`
* cr - `Console.ReadLine();`
* crk - `Console.ReadKey();`
* *cw -* `Console.WriteLine($"");`
* cww - `Console.WriteLine($"{}");`
