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

Автор: Александр Михновец

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

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

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

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

IntelliSense предлагает дополнить текст до "Console"
IntelliSense предлагает дополнить текст до "Console.WriteLine"

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

Этот значок указывает на snippet (в английской редакции) или фрагмент кода (в русской редакции)

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

Диспетчер фрагментов кода в меню
Выбираем опцию CSharp

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

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

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

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

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

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

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

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

Папка Visual C#

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<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($"{}");

Last updated

Was this helpful?