Sdílet prostřednictvím


Přizpůsobení chování editoru pomocí konfigurace jazyka

Vlastní syntaxi specifickou pro jazyk můžete implementovat v editoru sady Visual Studio pomocí konfigurace jazyka a povolit operace syntaxe specifické pro jazyk. Ve srovnání s používáním jazykového serveru může použití konfigurace jazyka zlepšit výkon, protože všechny jeho operace jsou místní.

Co je konfigurace jazyka

Visual Studio nabízí inteligentní možnosti úprav pro různé programovací jazyky prostřednictvím jazykových rozšíření. Konfigurace jazyka doplňuje servery používající protokol LSP (Language Server Protocol) a poskytuje deklarativní data, která editoru sady Visual Studio umožňují provádět formátování, zabarvení a dokončování rozhodnutí bez zpoždění provádění asynchronního dotazu na server LSP. Funkce deklarativního jazyka jsou definovány v konfiguračních souborech. Například rozšíření HTML, CSS a typescript-basic, která jsou součástí sady Visual Studio, nabízejí podmnožinu následujících deklarativních jazykových funkcí:

  • Zvýrazňování syntaxe
  • Dokončení fragmentu kódu
  • Párování závorek
  • Automatické vytváření závorek
  • Přepínání komentářů
  • Automatické zápisy

Visual Studio poskytuje možnosti rozšíření pro definování konfigurace jazyka pro libovolný programovací jazyk. Konfigurační soubor jazyka řídí základní funkce úprav, jako je přepínání komentářů a porovnávání závorek a okolí.

Použití konfigurace jazyka pomáhá s:

  • Synchronní práce s psaním uživatelů
  • Jednoduchost: Krátké soubory JSON s regulárními výrazy se snadněji spravují než složitý algoritmus.
  • Přenositelnost: Vyžadování žádných nebo minimálních změn mezi editorem Visual Studio Code a sadou Visual Studio

Konfigurační soubory jazyka také poskytují snadný způsob, jak rozšířit Sadu Visual Studio tak, aby podporovala některé základní funkce refaktoringu prostřednictvím snadno čitelného souboru JSON.

Přidání podpory konfigurace jazyka do rozšíření sady Visual Studio

Přidání podpory konfigurace jazyka do rozšíření sady Visual Studio má tři části:

  1. Vytvoření projektu VSIX
  2. Vytvoření souboru konfigurace jazyka
  3. Přidání gramatického souboru
  4. Aktualizace souboru pkgdef

Můžete prozkoumat funkční ukázku v ukázce konfigurace jazyka.

Vytvoření projektu VSIX

Pokud chcete vytvořit rozšíření jazykové služby pomocí konfigurace jazyka, nejprve se ujistěte, že máte nainstalovanou úlohu vývoje rozšíření sady Visual Studio pro vaši instanci sady VS.

Dále vytvořte nový projekt VSIX tak, že přejdete na Soubor>nový projekt, vyhledáte "vsix" a vyhledejte projekt VSIX:

Screenshot showing how to create a VSIX project.

Vytvoření konfiguračního souboru jazyka

Při vytváření vlastního konfiguračního souboru jazyka můžete zvolit, které aspekty se mají připojit do souboru JSON. Můžete například podporovat přepínání komentářů, automatické zakládání složených závorek nebo libovolnou kombinaci dostupných funkcí popsaných v této části.

Pokud chcete do rozšíření přidat podporu, nejprve vytvoříte konfigurační soubor jazyka. Název souboru musí být standardní: pomocí pomlček oddělte slova v názvu souboru a ujistěte se, že končí language-configuration.json.

Následující kód ukazuje ukázkový konfigurační soubor jazyka.

{
    "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*[\\)\\}\\]].*$"
    }
  }

Nastavení konfigurace

Následující části popisují nastavení, která jsou k dispozici v konfiguračním souboru jazyka.

Přepínání komentářů

Konfigurační soubory jazyka nabízejí dva příkazy pro přepínání komentářů. Přepnout komentář řádku a přepnout blokový komentář. Můžete určit comments.blockComment , comments.lineComment jak má Visual Studio okomentovat řádky nebo bloky.

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

Toto nastavení ovlivňuje chování textového editoru sady Visual Studio při stisknutí kláves Ctrl+K, Ctrl+C.

Definice závorek

Když přesunete kurzor na závorku definovanou tady, Visual Studio zvýrazní tuto závorku společně s odpovídající dvojicí.

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

Relevantní nastavení v dialogovém okně Možnosti nástrojů sady Visual Studio, v Textovém editoru, Obecné, Zobrazení, je zaškrtávací políčko Povolit zabarvení páru závorek.>

Automatické seznamy

Když zadáte ', Visual Studio vytvoří dvojici jednoduchých uvozovek a umístí kurzor doprostřed: '|'. Tato část definuje tyto páry.

{
  "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"] }
  ]
}

Klíč notIn tuto funkci zakáže v určitých oblastech kódu. Například při psaní následujícího kódu:

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

Jednoduchá uvozovka není automatická.

Páry, které nevyžadují notIn vlastnost, můžou také použít jednodušší syntaxi:

{
  "autoClosingPairs": [ ["{", "}"], ["[", "]"] ]
}
Automatické seznamy před

Ve výchozím nastavení visual Studio automaticky zakřesí jenom páry, pokud je po kurzoru prázdné znaky. Takže když zadáte { následující kód JSX, nebudete mít automatické zakódy:

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

Tato definice však toto chování přepíše:

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

Když teď zadáte { přímo před >, Visual Studio ho automaticky zakřesí .}

Automatické zajištění

Když vyberete oblast v sadě Visual Studio a zadáte levou závorku, Visual Studio uzavře vybraný obsah do dvojice závorek. Tato funkce se nazývá Automatické zajištění a tady můžete definovat páry automatického zajištění pro konkrétní jazyk:

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

Relevantní nastavení v možnostech nástrojů sady Visual Studio je v textovém editoru, obecné, zobrazení zaškrtávacího políčka Automaticky obklopovat výběry při psaní uvozovek nebo hranatých závorek.>

Vzor wordu

wordPattern definuje, co se považuje za slovo v programovacím jazyce. Funkce návrhu kódu používají toto nastavení k určení hranic slov, pokud wordPattern jsou nastavené.

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

Pravidla odsazení

indentationRulesdefinuje, jak má editor upravit odsazení aktuálního řádku nebo dalšího řádku při psaní, vkládání a přesouvání řádků nebo při formátování textu pomocí Ctrl+K, Ctrl+D (Formát dokumentu) a Ctrl+K, Ctrl+F (Formát výběru).

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

if (true) { Například odpovídá increaseIndentPattern, pak pokud po otevřené závorce {stisknete Enter , editor se automaticky odsadí a váš kód skončí takto:

if (true) {
  console.log();

Kromě increaseIndentPattern a decreaseIndentPatter, existují dvě další pravidla odsazení:

  • indentNextLinePattern - Pokud řádek odpovídá tomuto vzoru, měl by být odsazený pouze další řádek za ním.
  • unIndentedLinePattern – Pokud řádek odpovídá tomuto vzoru, jeho odsazení by se nemělo měnit a nemělo by se vyhodnocovat podle ostatních pravidel.

Pokud pro programovací jazyk neexistuje žádná sada pravidel odsazení, editor se odsadí, když čára končí otevřenou závorkou a jednondenty při zadávání uzavírací závorky. Hranatá závorka zde je definována .brackets

Stisknutím klávesy Enter

onEnterRules definuje seznam pravidel, která se mají vyhodnotit při stisknutí klávesy Enter v editoru.

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

Při stisknutí klávesy Enter se text před, za nebo jedním řádkem nad kurzorem zkontroluje následující vlastnosti:

  • beforeText (povinné). Regulární výraz, který odpovídá textu před kurzorem (omezený na aktuální řádek).
  • afterText. Regulární výraz, který odpovídá textu za kurzorem (omezený na aktuální řádek).
  • previousLineText. Regulární výraz, který odpovídá textu o jeden řádek nad kurzorem.

Pokud se shodují všechny zadané vlastnosti, pravidlo se považuje za odpovídající a nevyhodnotí se.onEnterRules Může onEnterRule zadat následující akce:

  • indent (povinné). Jeden z none, indent, outdent, indentOutdent.
    • none znamená, že nový řádek dědí odsazení aktuálního řádku.
    • indent znamená, že nový řádek je odsazený vzhledem k aktuálnímu řádku.
    • outdent znamená, že nový řádek je nesrovnaný vzhledem k aktuálnímu řádku.
    • indentOutdent znamená, že se vloží dva nové řádky, jeden odsazený a druhý jeden je jedno.
  • appendText. Řetězec, který se připojí za nový řádek a za odsazení.
  • removeText. Počet znaků, které se mají odebrat z odsazení nového řádku

Nastavení vlastností

V projektu rozšíření se ujistěte, že soubor language-configuration.json má následující nastavení vlastnosti:

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

(volitelné) Přidání gramatického souboru

Kromě toho můžete přidat gramatický soubor TextMate, který zajistí barvu syntaxe pro jazyk. Gramatiky TextMate jsou strukturovaná kolekce regulárních výrazů a zapisují se jako soubory plist (XML) nebo JSON. Viz Gramatiky jazyka. Pokud nezadáte gramatický soubor specifický pro jazyk, použije se integrované výchozí nastavení.

Pokud chcete přidat vlastní gramatické nebo motivové soubory TextMate, postupujte takto:

  1. Ve svém rozšíření vytvořte složku s názvem Grammars (nebo může být jakýkoli název, který zvolíte).

  2. Do složky Grammars (Gramatika) zahrňte všechny soubory *.tmlanguage, *.plist, *.tmtheme nebo *.json soubory, které chcete použít pro vlastní zabarvení.

    Tip

    Soubor .tmtheme definuje, jak se obory mapují na klasifikace sady Visual Studio (pojmenované barevné klíče). Pokyny najdete v globálním souboru .tmtheme v adresáři %ProgramFiles(x86)%\Microsoft Visual Studio\<version>\<SKU>\Common7\IDE\CommonExtensions\Microsoft\TextMate\Starterkit\Themesg .

Vytvoření souboru pkgdef

Dále vytvořte .pkgdef soubor. Soubor .pkgdef obsahuje všechny informace o registraci, které by jinak byly přidány do systémového registru. Další informace o souborech naleznete v pkgdef tématu Registrace balíčku VSPackages a Co je pkgdef soubor? A proč? pkgdef V souboru byste měli mít cestu k language-configuration.json souboru a cestu pro gramatiku jazyka. Jazykové služby, jako je LSP, si vyžádat typ obsahu editoru a získat je prostřednictvím konfigurace jazyka. Tyto informace poskytují inteligentní funkce specifické pro jazyk uvnitř serveru, který může komunikovat s vývojářskými nástroji. Pokud služba jazyka neexistuje, modul Konfigurace jazyka se vrátí do gramatiky TextMate. Soubor .pkgdef by měl vypadat takto:

[$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

Ujistěte se, že jsou vlastnosti pkgdef souboru nastaveny takto:

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

Aby byly informace o konfiguraci jazyka přístupné pro Visual Studio, zahrňte language-configuration soubor do balíčku VSIX. Zahrnutí tohoto souboru znamená, že se dodává s příponou sady Visual Studio. Soubor umožňuje sadě Visual Studio vědět, že je k dispozici konfigurace jazyka. Pokud chcete soubor přidat, upravte vsixmanifest soubor PKGDEF def, například:

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