2015-06-06 15 views
18

C'è un modo per estendere le lingue/grammatiche supportate in Visual Studio Code? Vorrei aggiungere una sintassi della lingua personalizzata, ma non sono riuscito a trovare alcuna informazione su come vengono forniti i servizi linguistici.Crea lingua personalizzata nel codice di Visual Studio

Qualcuno può indicare riferimenti o persino esempi di implementazioni linguistiche esistenti?

+0

check out Essentials Web repository di Mads Kristensen su github. –

+0

Questo vale per VS, ma non per VS Code. –

+0

Scusa, ho perso quella parte della tua domanda. ~ AppData \ Local \ Code \ app-0.1.0 \ resources \ app \ plugins contiene plug-in di lingua, è possibile utilizzarli. –

risposta

0

È not possible in questo momento, ma è coming soon.

+0

Sebbene, come suggerito da Emre Senturk, è possibile provare a giocare con alcuni dei file sorgente del codice VS. – zlumer

+11

Questa risposta è obsoleta e dovrebbe ora essere ignorata. A partire da 0.9.0 questo è ora possibile. – wheredidthatnamecomefrom

2

Utilizzando il reverse engineering è possibile aggiungere una nuova lingua a VSCode. Puoi dare un'occhiata a come il dattiloscritto è implementato come plugin JavaScript e come comunica con node.exe tramite pipe. Ma è una cosa difficile visto che è tutto senza documentazione Fornirò una documentazione molto breve qui:

È possibile definire un nuovo plug-in nella cartella plug-in C:\Users\USER\AppData\Local\Code\app-0.3.0\resources\app\plugins.

Copia la cartella del dattiloscritto e rinomina le estensioni di file menzionate e i nomi di lingua in tutti i file nella nuova lingua, in modo che il nuovo plug-in venga utilizzato quando viene aperto un file .mylang.

In typescriptServiceClient.js si vede che un processo figlio viene biforcato e che il suo stdout è accoppiato a new WireProtocol.Reader. Associa il tuo mylanguage.exe (probabilmente dovrai scrivere quel file exe da solo). VSCode chiede che il binario ottenga più informazioni specifiche della lingua.

In typescriptMain.js si trova la registrazione della funzione per la lingua. Elimina ogni chiamata a monaco.Modes.XXXXXXSupport.register eccetto monaco.Modes.DeclarationSupport.register.

Ora aprire una directory in VSCode che contiene i file .mylang e aprirne uno tramite CTRL+P + FileName. Fare clic con il tasto destro su un identificatore e selezionare Go to Definition. VSCode invia ora una richiesta del genere tramite StdIn al vostro exe

{"seq":1,"type":"request","command":"definition","arguments":{"file":"d:/Projects/MyProj/Source/MyFile.mylang","line":45,"offset":9}} 

VSCode si aspetta una risposta come questa:

Content-Length: 251 
[LINE BREAK] 
{ "seq" : 1, "type" : "response", "command" : "definition", "request_seq" : 1, "success" : true, "body" : [{ "file" : "d:/Projects/MyProj/Source/MyOtherFile.mylang", "start" : { "line" : 125, "offset" : 3 }, "end" : { "line" : 145, "offset" : 11} }] } 

Se tutto funziona VSCode aprirà MyOtherFile.mylang e impostare il cursore alla riga 124 in colonna 3.

provarlo sul proprio ;-)

37

E 'possibile con la nuova versione 0.9.0. C'è una documentazione ufficiale su come aggiungere una lingua personalizzata: https://github.com/Microsoft/vscode-docs/blob/0.9.0/release-notes/latest.md

È necessario un file .tmLanguage per la lingua che si desidera aggiungere. Puoi trovare i file esistenti, ad es. su GitHub o puoi definire il tuo file di lingua. Guarda qui per avere un'idea di come crearne uno:

Dopo aver trovato un file .tmLanguage hai due modi per creare un'estensione basata su di esso.

Opzione 1: Utilizzo di un generatore di Yeoman

  • Installare nodo.js (se non l'avete già fatto)
  • Installare anni (se non l'avete già fatto) eseguendo npm install -g yo
  • Installare il generatore di Yo per il codice: npm install -g generator-code
  • Run yo code e selezionare New language support
  • Segui le istruzioni (definire il file .tmLangauge, definire il nome del plug-in, le estensioni dei file ecc.)
  • Il generatore crea una directory per l'estensione con il nome del plug-in nella directory di lavoro corrente.

Opzione 2: Creare la directory sul proprio

  • Creare una directory con il nome del plug-in (solo lettere minuscole). Diciamo che lo chiamiamo mylang.
  • Aggiungere una sottocartella syntaxes e inserire il file .tmlanguage all'interno di esso
  • Creare un file package.json all'interno della radice della cartella di estensione con contenuti di questo tipo

    { 
        "name": "mylang", 
        "version": "0.0.1", 
        "engines": { 
         "vscode": ">=0.9.0-pre.1" 
        }, 
        "publisher": "me", 
        "contributes": { 
         "languages": [{ 
          "id": "mylang", 
          "aliases": ["MyLang", "mylang"], 
          "extensions": [".mylang",".myl"] 
         }], 
         "grammars": [{ 
          "language": "mylang", 
          "scopeName": "source.mylang", 
          "path": "./syntaxes/mylang.tmLanguage" 
         }] 
        } 
    } 
    

Infine aggiungere l'estensione a Codice Visual Studio

Copia la cartella dell'interno nella directory dell'interno. Si tratta di:

  • su di Windows%USERPROFILE%\.vscode\extensions

  • su Mac/Linux$HOME/.vscode/extensions

Riavvia Codice. Ora la tua estensione verrà eseguita automaticamente ogni volta che apri un file con l'estensione di file specificata. Puoi vedere il nome del plugin utilizzato nell'angolo in basso a destra. Puoi cambiarlo facendo clic sul nome dell'estensione. Se la tua estensione non è l'unica registrata per una specifica estensione di file, allora Code potrebbe scegliere quella sbagliata.

+1

Ricevo un errore languageFileName. Hai mai visto quello? –

+0

Si può notare che 'scopeName' deve essere lo stesso del file' .tmLanguage' – gr4nt3d

2

Per estendere la risposta di Wosis, l'utilizzo di un file .tmLanguage è facoltativo. L'utilizzo di un normale .json è un'alternativa perfettamente valida e, a mio parere, più leggibile.

Per un esempio vedere GitHub VSCode_SQF: sqf.json

All'interno del package.json si avrebbe solo bisogno di modificare il percorso ./syntaxes/mylang.tmLanguage-./syntaxes/mylang.json

Problemi correlati