2015-06-06 14 views
18

Czy istnieje sposób na rozszerzenie obsługiwanych języków/gramatyk w kodzie Visual Studio? Chciałbym dodać niestandardową składnię języka, ale nie udało mi się znaleźć żadnych informacji o tym, w jaki sposób świadczone są usługi językowe.Tworzenie niestandardowego języka w kodzie Visual Studio Kod

Czy ktoś może wskazać odniesienia lub przykłady istniejących wdrożeń językowych?

+0

wymeldowania Essentials Web repozytorium Mads Kristensen jest na github. –

+0

To jest dla VS, ale nie dla kodu VS. –

+0

Przepraszamy, tęskniłem za tą częścią twojego pytania. ~ AppData \ Local \ Code \ app-0.1.0 \ resources \ app \ plugins Katalog zawiera wtyczki językowe, możesz z nich korzystać. –

Odpowiedz

0

Teraz jest not possible, ale jest coming soon.

+0

Chociaż, jak zasugerował Emre Senturk, możesz spróbować manipulować niektórymi plikami źródłowymi kodu VS. – zlumer

+11

Ta odpowiedź jest nieaktualna i powinna zostać zignorowana. Od wersji 0.9.0 jest to teraz możliwe. – wheredidthatnamecomefrom

2

Przy użyciu inżynierii odwrotnej można dodać nowy język do VSCode. Możesz rzucić okiem na to, jak zaimplementowany jest skrypt maszynowy jako wtyczka JavaScript i jak komunikuje się z node.exe przez potok. Ale to trudne, ponieważ nadchodzi bez dokumentacji. Dostarczę tutaj naprawdę krótką dokumentację:

Możesz zdefiniować nową wtyczkę w folderze wtyczek C:\Users\USER\AppData\Local\Code\app-0.3.0\resources\app\plugins.

Skopiuj folder wtyczki maszynopisu i zmień nazwy wymienionych rozszerzeń plików i nazw języków we wszystkich plikach na nowy język, aby nowa wtyczka była używana po otwarciu pliku .mylang.

W pliku typescriptServiceClient.js widać, że proces potomny jest rozwidlany, a jego numer stdout jest połączony z new WireProtocol.Reader. Zwiąż swoją własną mylanguage.exe (prawdopodobnie będziesz musiał napisać ten plik exe na własną rękę). VSCode prosi binarnego, aby uzyskać więcej informacji specyficznych dla języka.

W typescriptMain.js znajduje się rejestracja funkcji dla tego języka. Usuń każde połączenie do numeru monaco.Modes.XXXXXXSupport.register z wyjątkiem numeru monaco.Modes.DeclarationSupport.register.

Teraz otwórz katalog w VSCode zawierający pliki .mylang i otwórz jeden z nich przez CTRL+P + FileName. Kliknij prawym przyciskiem myszy na identyfikator i wybierz Go to Definition. VSCode teraz wysyła żądanie takiego pośrednictwem standardowego wejścia do exe

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

VSCode spodziewa odpowiedź tak:

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

Jeśli wszystko działa VSCode otworzy MyOtherFile.mylang i ustawić kursor w linii 124 kolumna 3.

Wypróbuj go na własną rękę ;-)

37

jest to możliwe dzięki nowej wersji 0.9.0. Istnieje oficjalna dokumentacja dotycząca dodawania języka niestandardowego: https://github.com/Microsoft/vscode-docs/blob/0.9.0/release-notes/latest.md

Potrzebujesz pliku .tmLanguage dla języka, który chcesz dodać. Możesz znaleźć istniejące pliki, np. na GitHub lub możesz zdefiniować swój własny plik językowy. Zajrzyj tutaj, aby dowiedzieć się, jak je utworzyć: http://manual.macromates.com/en/language_grammars

Po znalezieniu pliku .tmLanguage masz dwa sposoby na utworzenie rozszerzenia na jego podstawie.

Opcja 1: Stosując Yeoman generator

  • Instalacja węzła.js (jeśli jeszcze tego nie zrobiłeś)
  • Install yo (jeśli jeszcze tego nie zrobiłeś), realizując npm install -g yo
  • zainstalować generator Yo dla kodu: npm install -g generator-code
  • Run yo code i wybierz New language support
  • Obserwuj instrukcje (zdefiniuj plik .tmLangauge, zdefiniuj nazwę wtyczki, rozszerzenia plików itp.)
  • Generator utworzy katalog dla twojego rozszerzenia z nazwą wtyczki w twoim bieżącym katalogu roboczym.

Opcja 2: Tworzenie katalogu na własny

  • Utwórz katalog z nazwą swojej wtyczki (tylko małe litery). Powiedzmy, że nazywamy to mylang.
  • Dodaj podfolder syntaxes i umieść plik .tmlanguage wewnątrz to
  • Utwórz plik package.json wewnątrz głównym folderze przedłużacza z tego typu treści

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

Wreszcie dodać rozszerzenie Kod Visual Studio Code

Skopiuj folder rozszerzenia do katalogu dodatkowego. To jest:

  • na systemu Windows%USERPROFILE%\.vscode\extensions

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

Kod Restart. Teraz twoje rozszerzenie uruchomi się automatycznie za każdym razem, gdy otworzysz plik z określonym rozszerzeniem. Możesz zobaczyć nazwę używanej wtyczki w prawym dolnym rogu. Możesz go zmienić, klikając nazwę rozszerzenia. Jeśli twoje rozszerzenie nie jest jedynym zarejestrowanym dla określonego rozszerzenia pliku, kod może wybrać niewłaściwy.

+1

Otrzymuję languageFileName nie jest zdefiniowany błąd. Widziałeś to kiedyś? –

+0

Można zauważyć, że 'scopeName' musi być takie samo jak w pliku' .tmLanguage' – gr4nt3d

2

Aby rozszerzyć odpowiedź Wosis, użycie pliku .tmLanguage jest opcjonalne. Używanie zwykłego .json jest całkowicie poprawną i moim zdaniem lepszą czytelną alternatywą.

Na przykład patrz GitHub VSCode_SQF: sqf.json

Wewnątrz package.json będzie trzeba tylko zmienić ścieżkę z ./syntaxes/mylang.tmLanguage do ./syntaxes/mylang.json

Powiązane problemy