2017-09-04 52 views
2

我製作了一個自定義語言擴展,我想啓用「轉到符號」功能。我試圖按照指導here,但我仍然有點失落。如何使用vscode中的自定義語言啓用「轉到符號」?

我認爲我需要做的只是實現一個DocumentSymbolProvider,但我不確定如何去做。

UPDATE

example language server docs點到被棄用repo。它被替換爲this one,這更復雜。我認爲我能找到的最簡單的例子是lsp-sample,但它不使用DocumentSymbolProvider

我發現其他使用符號提供者的回購,但他們有點壓倒性。我無法弄清楚需要去哪些地方(例如,我是否需要客戶端和服務器?有些軟件包似乎只使用extension.ts而沒有客戶端和服務器文件夾)。

我真的想用我的語言來做的就是檢測以@開頭的行,並在Go to Symbol窗格中顯示它們。我很想看到這個簡單的教程。

+0

你能成爲一個更具體一點關於這部分你確切地掙扎?您鏈接的文檔有一個實現示例。我不認爲有必要特別爲「Go to symbol」支持修改'package.json',但是您需要在那裏爲您的自定義語言定義一個ID。 – Gama11

+0

@ Gama11我已經更新它更加精確。 – nachocab

回答

1

我是否需要客戶端和服務器?

不一定。如language support docs you linked所示,通常有兩種選擇:「直接實現」和使用語言服務器協議的選項。對於前者,您不需要客戶端/服務器架構。語言服務器具有編輯無關的優點,理論上可以在任何實現該協議的編輯器中使用它們。直接實現僅限於在VSCode中使用。

我真的想用我的語言來做的就是檢測以@開頭的行,並在Go to Symbol窗格中顯示它們。

這裏的extension.ts爲「直接執行」這個非常簡單的例子:

'use strict'; 
import * as vscode from 'vscode'; 

export function activate(context: vscode.ExtensionContext) { 
    context.subscriptions.push(vscode.languages.registerDocumentSymbolProvider(
     {language: "foo"}, new FooDocumentSymbolProvider() 
    )); 
} 

class FooDocumentSymbolProvider implements vscode.DocumentSymbolProvider { 
    public provideDocumentSymbols(document: vscode.TextDocument, 
      token: vscode.CancellationToken): Thenable<vscode.SymbolInformation[]> { 
     return new Promise((resolve, reject) => { 
      var symbols = []; 

      for (var i = 0; i < document.lineCount; i++) { 
       var line = document.lineAt(i); 
       if (line.text.startsWith("@")) { 
        symbols.push({ 
         name: line.text.substr(1), 
         kind: vscode.SymbolKind.Field, 
         location: new vscode.Location(document.uri, line.range) 
        }) 
       } 
      } 

      resolve(symbols); 
     }); 
    } 
} 

你還需要把它添加到由VSCode擴展模板產生的package.json。它註冊foo語言並激活時與.foo擴展名的文件被打開擴展:

"activationEvents": [ 
    "onLanguage:foo" 
], 
"contributes": { 
    "languages": [{ 
     "id": "foo", 
     "extensions": [".foo"] 
    }] 
} 

這是在行動:

+0

非常感謝!不幸的是,它似乎並沒有在我的系統中工作。我已將代碼上傳到此[回購](https://github.com/nachocab/vscode-foo)。我使用'yo code'生成並選擇'Language support',然後粘貼你的代碼。(我也不得不添加' 「依賴」:{ 「vscode」: 「^ 1.1.5」 }, 「腳本」:{ 「安裝後」: 「節點./node_modules/vscode/bin/install」 }'to'package.json'因爲'vscode'沒有被識別 – nachocab

+0

看起來我沒有提及激活事件的需要,我更新了我的答案 – Gama11

+0

非常感謝!!!你完全救了我。對於我的教育,爲什麼不提供[SymbolInformation]中的containerName(https://code.visualstudio.com/docs/extensionAPI/vscode-api#_a-namesymbolinformationaspan-classcodeitem-id597symbolinformationspan)對象? – nachocab