Настройка поведения редактора с помощью языковой конфигурации

Вы можете реализовать настраиваемый синтаксис для конкретного языка в редакторе Visual Studio с помощью языковой конфигурации для включения операций синтаксиса для конкретного языка. По сравнению с использованием языкового сервера с помощью языковой конфигурации можно повысить производительность, так как все его операции являются локальными.

Что такое конфигурация языка

Visual Studio предлагает интеллектуальные возможности редактирования для различных языков программирования с помощью расширений языка. Конфигурация языка дополняет серверы, использующие протокол LSP и предоставляющие декларативные данные, позволяющие редактору Visual Studio принимать решения о форматировании, цветовой раскраски и завершения без задержки выполнения асинхронного запроса на сервер LSP. Декларативные языковые функции определяются в файлах конфигурации. Например, расширения HTML, CSS и typescript-basic, упакованные в Visual Studio, предлагают подмножество следующих декларативных языковых функций:

  • Выделение синтаксиса
  • Завершение фрагмента кода
  • Сопоставление скобок
  • Автоклонирование квадратных скобок
  • Переключение примечаний
  • Автоматическая отступка

Visual Studio предоставляет возможности расширения для определения конфигурации языка для любого языка программирования. Файл конфигурации языка управляет основными функциями редактирования, такими как переключение примечаний, а также сопоставление с скобками и окружающее его содержимое.

Использование языковой конфигурации помогает:

  • Синхронная работа с вводом пользователем
  • Простота. Короткие JSON-файлы с регулярными выражениями проще поддерживать, чем сложный алгоритм.
  • Переносимость. Требовать никаких или минимальных изменений между Visual Studio Code и Visual Studio

Кроме того, файлы конфигурации языка предоставляют простой способ расширения Visual Studio для поддержки некоторых основных функций рефакторинга с помощью простого JSON-файла.

Добавление поддержки языковой конфигурации в расширение Visual Studio

Существует три части для добавления поддержки языковой конфигурации в расширение Visual Studio:

  1. Создание проекта VSIX
  2. Создание файла конфигурации языка
  3. Добавление файла грамматики
  4. Обновление pkgdef-файла

Вы можете изучить рабочий пример в примере конфигурации языка.

Создание проекта VSIX

Чтобы создать расширение языковой службы с помощью языковой конфигурации, сначала убедитесь, что для вашего экземпляра VS установлена рабочая нагрузка разработки расширений Visual Studio.

Затем создайте проект VSIX, перейдя к >файлу нового проекта, найдите vsix и найдите проект VSIX:

Screenshot showing how to create a VSIX project.

Создание файла конфигурации языка

При создании собственного файла конфигурации языка можно выбрать, какие аспекты необходимо подключить в JSON-файле. Например, можно выбрать поддержку переключения комментариев, автоклиментирования фигурных скобок или любого сочетания доступных функций, описанных в этом разделе.

Чтобы добавить поддержку в расширение, сначала создайте файл конфигурации языка. Имя файла должно соответствовать стандарту: используйте дефисы для разделения слов в имени файла и убедитесь, что он заканчивается language-configuration.json.

В следующем коде показан пример файла конфигурации языка.

{
    "comments": {
      "lineComment": "***",
      "blockComment": ["{*", "*}"]
    },
    "brackets": [
      ["@", "@"],
      ["#", "#"],
      ["$", "$"],
      ["(", ")"]
    ],
    "autoClosingPairs": [
      { "open": "{", "close": "}" },
      { "open": "@", "close": "@" },
      { "open": "#", "close": "#" },
      { "open": "$", "close": "$" },
      { "open": "(", "close": ")" },
      { "open": "'", "close": "'", "notIn": ["string", "comment"] },
      { "open": "\"", "close": "\"", "notIn": ["string"] },
    ],
    "autoCloseBefore": ";:.,=}])>` \n\t",
    "surroundingPairs": [
      ["@", "@"],
      ["#", "#"],
      ["$", "$"],
      ["[", "]"],
      ["(", ")"],
      ["'", "'"],
      ["\"", "\""],
      ["`", "`"]
    ],
    "wordPattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\#\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\?\\s]+)",
    "indentationRules": {
      "increaseIndentPattern": "^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$",
      "decreaseIndentPattern": "^((?!.*?\\/\\*).*\\*/)?\\s*[\\)\\}\\]].*$"
    }
  }

Параметры конфигурации

В следующих разделах описаны параметры, доступные в файле конфигурации языка.

Переключение примечаний

Файлы конфигурации языка предлагают две команды для переключения комментариев. Переключение примечаний строки и переключение блокировок. Вы можете указать и comments.lineComment управлять тем, как Visual Studio должна комментировать comments.blockComment строки или блоки.

{
  "comments": {
    "lineComment": "//",
    "blockComment": ["/*", "*/"]
  }
}

Этот параметр влияет на поведение текстового редактора Visual Studio при нажатии клавиш CTRL+K, CTRL+C.

Определение квадратных скобок

При перемещении курсора в скобку, определенную здесь, Visual Studio выделяет эту скобку вместе с соответствующей парой.

{
  "brackets": [["{", "}"], ["[", "]"], ["(", ")"]]
}

Соответствующий параметр в диалоговом окне "Параметры инструментов Visual Studio" в текстовом редакторе, "Общие", "Экран" является проверка box Enable brace pair colorization.>

Автозакрытие

При вводе 'Visual Studio создает пару отдельных кавычки и помещает курсор в середину: '|' В этом разделе определяются такие пары.

{
  "autoClosingPairs": [
    { "open": "{", "close": "}" },
    { "open": "[", "close": "]" },
    { "open": "(", "close": ")" },
    { "open": "'", "close": "'", "notIn": ["string", "comment"] },
    { "open": "\"", "close": "\"", "notIn": ["string"] },
    { "open": "`", "close": "`", "notIn": ["string", "comment"] },
    { "open": "/**", "close": " */", "notIn": ["string"] }
  ]
}

Ключ notIn отключает эту функцию в определенных диапазонах кода. Например, при написании следующего кода:

// ES6's Template String
`ES6's Template String`;

Одинарный кавычки не заклонирован.

Пары, которые не требуют notIn свойства, также могут использовать более простой синтаксис:

{
  "autoClosingPairs": [ ["{", "}"], ["[", "]"] ]
}
Автоматическое заполнение до

По умолчанию Visual Studio использует только пары автоклосов, если после курсора есть пробелы. Поэтому при вводе { в следующий код JSX не будет автоматически выполняться:

const Component = () =>
  <div className={>
                  ^ Does not get autoclosed by default
  </div>

Однако это определение переопределяет это поведение:

{
  "autoCloseBefore": ";:.,=}])>` \n\t"
}

Теперь, когда вы войдете { прямо перед >, Visual Studio автоматически заклоняет его с }помощью.

Автоматическое автозаверение

При выборе диапазона в Visual Studio и вводе открывающей скобки Visual Studio окружает выбранное содержимое парой квадратных скобок. Эта функция называется autosurrounding, и здесь можно определить пары автосборов для определенного языка:

{
  "surroundingPairs": [
    ["{", "}"],
    ["[", "]"],
    ["(", ")"],
    ["'", "'"],
    ["\"", "\""],
    ["`", "`"]
  ]
}

Соответствующий параметр в параметрах инструментов > Visual Studio находится в текстовом редакторе, общие, отображение поля проверка box автоматически окружает выделения при вводе кавычки или квадратных скобок.

Шаблон Word

wordPattern определяет, что считается словом на языке программирования. Функции предложения кода используют этот параметр, чтобы определить границы слов, если wordPattern задано.

{
  "wordPattern": "(-?\\d*\\.\\d\\w*)|([^\\`\\~\\!\\@\\#\\%\\^\\&\\*\\(\\)\\-\\=\\+\\[\\{\\]\\}\\\\\\|\\;\\:\\'\\\"\\,\\.\\<\\>\\/\\?\\s]+)"
}

Правила отступа

indentationRulesопределяет, как редактор должен настраивать отступ текущей или следующей строки при вводе, вставке и перемещении строк или при форматировании текста с помощью CTRL+K, CTRL+D (формат документа) и CTRL K, CTRL++F (выбор формата).

{
  "indentationRules": {
    "increaseIndentPattern": "^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$",
    "decreaseIndentPattern": "^((?!.*?\\/\\*).*\\*/)?\\s*[\\)\\}\\]].*$"
  }
}

Например, совпадения, if (true) { а если нажать клавишу ВВОД после открытой скобки{, редактор автоматически отступит один раз, и код будет отображаться следующим increaseIndentPatternобразом:

if (true) {
  console.log();

В дополнение к increaseIndentPattern и decreaseIndentPatterесть два других правила отступа:

  • indentNextLinePattern— Если строка соответствует этому шаблону, то только следующая строка после того, как она должна быть отступена один раз.
  • unIndentedLinePattern — Если строка соответствует этому шаблону, то его отступы не должны быть изменены, и его не следует оценивать в соответствии с другими правилами.

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

Нажатие клавиши ВВОД

onEnterRules определяет список правил для оценки нажатия клавиши ВВОД в редакторе.

{
  "onEnterRules": [{
    "beforeText": "^\\s*(?:def|class|for|if|elif|else|while|try|with|finally|except|async).*?:\\s*$",
    "action": { "indent": "indent" }
  }]
}

При нажатии клавиши ВВОД текст перед, после или одной строкой над курсором проверка со следующими свойствами:

  • beforeText (обязательно). Регулярное выражение, соответствующее тексту перед курсором (ограничено текущей строкой).
  • afterText. Регулярное выражение, соответствующее тексту после курсора (ограничено текущей строкой).
  • previousLineText. Регулярное выражение, соответствующее тексту одной строке над курсором.

Если все указанные свойства соответствуют, правило считается соответствующим и не вычисляется.onEnterRules Можно onEnterRule указать следующие действия:

  • indent (обязательно). Один из none, indent, outdent, indentOutdent.
    • none означает, что новая строка наследует отступ текущей строки.
    • indent означает, что новая строка отступена относительно текущей строки.
    • outdent означает, что новая строка неустанно связана с текущей строкой.
    • indentOutdent означает, что две новые строки вставляются, одна отступная и вторая одна неиндендирована.
  • appendText. Строка, которая добавляется после новой строки и после отступа.
  • removeText. Число символов, которые нужно удалить из отступа новой строки.

Параметры свойств

В проекте расширения убедитесь, что файл language-configuration.json имеет следующие параметры свойств:

Build Action = Content
Include in VSIX = True
Copy to output = Copy always 

(необязательно) Добавление файла грамматики

Кроме того, можно добавить файл грамматики TextMate, чтобы обеспечить цвет синтаксиса для языка. Грамматики TextMate — это структурированная коллекция регулярных выражений и записывается как plist (XML) или JSON-файлы. См . грамматику языка. Если вы не предоставляете файл грамматики для конкретного языка, используется встроенный параметр по умолчанию.

Чтобы добавить пользовательские файлы грамматики TextMate или темы, выполните следующие действия.

  1. Создайте папку с именем "Грамматики" внутри расширения (или это может быть любое имя, выбранное вами).

  2. В папку "Грамматики" включайте все файлы *.tmlanguage, *.plist, *.tmtheme или *.json файлы, которые обеспечивают настраиваемую цветовую настройку.

    Совет

    Файл .tmtheme определяет, как область s сопоставляется с классификациями Visual Studio (именованные цветовые ключи). Для получения рекомендаций можно ссылаться на глобальный файл tmtheme в каталоге %ProgramFiles(x86)%\Microsoft Visual Studio<\version<>\SKU>\Common7\IDE\CommonExtensions\Microsoft\TextMate\Starterkit\Themesg.

Создание PKGDEF-файла

Затем создайте .pkgdef файл. Файл .pkgdef содержит все сведения о регистрации, которые в противном случае будут добавлены в системный реестр. Дополнительные сведения о файлах см. в pkgdef разделе "Регистрация VSPackages " и "Что такое pkgdef-файл? И почему?. pkgdef В файле должен быть путь к language-configuration.json файлу и путь к грамматике языка. Языковые службы, такие как LSP, запрашивают тип контента редактора и получают это с помощью языковой конфигурации. Эта информация предоставляет аналитику, связанную с языком, на сервере, который может взаимодействовать с инструментами разработки. Если языковая служба не существует, подсистема конфигурации языка возвращается к грамматике TextMate. Файл .pkgdef должен выглядеть следующим образом:

[$RootKey$\TextMate\Repositories]
"AspNetCoreRazor="$PackageFolder$\Grammars

// Defines where the language configuration file for a given
// grammar name is (value of the ScopeName tag in the tmlanguage file).
[$RootKey$\TextMate\LanguageConfiguration\GrammarMapping]
"text.aspnetcorerazor"="$PackageFolder$\language-configuration.json"

// Defines where the language configuration file for a given
// language name is (partial value of the content type name).
[$RootKey$\TextMate\LanguageConfiguration\ContentTypeMapping]
"RazorLSP"="$PackageFolder$\language-configuration.json"

[$RootKey$\TextMate\LanguageConfiguration\GrammarMapping]
"text.html.basic"="$PackageFolder$\html-language-configuration.json"
"source.js"="$PackageFolder$\javascript-language-configuration.json"
"source.css"="$PackageFolder$\css-language-configuration.json"
"source.cs"="$PackageFolder$\csharp-language-configuration.json

Убедитесь, что свойства pkgdef файла заданы следующим образом:

Build Action = Content
Include in VSIX = True
Copy to output = Copy always 

Чтобы сделать сведения о конфигурации языка доступными для Visual Studio, включите language-configuration файл в пакет VSIX. В том числе этот файл означает, что он поставляется с расширением Visual Studio. Файл позволяет Visual Studio знать, что языковая конфигурация доступна для использования. Чтобы добавить файл, измените файл vsixmanifest , чтобы добавить PKGDEF-файл def, например:

<Asset Type="Microsoft.VisualStudio.VsPackage" Path="Test.pkgdef"/>