vscodeプラグインファーストフードのチュートリアル(5) - コード補完

vscodeプラグインファーストフードのチュートリアル(5) - コード補完

セクションでは、我々は、3ウェイハンドシェイクと契約LSPの基本的な枠組みを導入しました。
vscodeに通知を送信:私たちは最初のプロトコルの最も簡単な機能を検討してみましょう。

LSPメッセージウィンドウ

LSPプロトコルでは、窓と関連する3つの協定があります。

  • ウィンドウ/ ShowMessage通知
  • ウィンドウ/ showMessageリクエスト
  • ウィンドウ/ LogMessageに通知

私たちは、Connection.window.sendxxxMessage機能を使用してクライアントにメッセージを送ることができます。
情報の程度に応じて、情報、警告、およびエラー3つのレベルに分け。

例えば、我々はonInitializedは、すべての準備が整った後にそれは、クライアントとサーバー側の3ウェイハンドシェイクで、クライアントにメッセージを送信することができます。

connection.onInitialized(() => {
    connection.window.showInformationMessage('Hello World! form server side');
});

結果は以下のことを示しています。
showMessage

コード補完

私たちは、不当なを通じて、リンクをテストするために、窓の通知を温めます。コード補完:ここでは、我々が最も興味を持っているテーマの一つに直行します。

コード補完も非常に単純な形で、TextDocumentPositionParamsを入力し、出力は、この関数はでconnection.onCompletionに登録されているCompletionItemアレイです。

connection.onCompletion(
    (_textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => {});

以下に示すようにメインデータ構造に使用されるコードの完了:
コード補完

前記種類を列挙属性によって定義されます。
CompletionItemKind

怖がってはいけないしてください、私たちは簡単な例を見て、実際には、この方法の基本的な実現は非常に簡単です:

connection.onCompletion(
    (_textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => {
        connection.console.log('[xulun]Position:' + _textDocumentPosition.textDocument);

        return [
            {
                label: 'TextView',
                kind: CompletionItemKind.Text,
                data: 1
            },
            {
                label: 'Button',
                kind: CompletionItemKind.Text,
                data: 2
            },
            {
                label: 'ListView',
                kind: CompletionItemKind.Text,
                data: 3
            }
        ];
    }
)

の完全な補完の詳細

補足情報textDocument /完了添加に加えて、LSPがcompletionItem /解決要求をサポートし、入力と出力はCompletionItemは、さらなる情報を返されます。
あなたはconnection.onCompletionResolve法によるcompletionItem /解決要求のサポートを登録することができます。

connection.onCompletionResolve(
    (item: CompletionItem): CompletionItem => {
        if (item.data === 1) {
            item.detail = 'TextView';
            item.documentation = 'TextView documentation';
        } else if (item.data === 2) {
            item.detail = 'Button';
            item.documentation = 'JavaScript documentation';
        } else if (item.data === 3) {
            item.detail = 'ListView';
            item.documentation = 'ListView documentation';
        }
        return item;
    }
)

次のように業績は以下のとおりです。
_1

パラメータ終了位置情報を使用します

位置情報と入力パラメータは、アプリケーションを完了するために送信されます、我々は、この情報に基づいて情報の補足を制御することができます。
私たちは、次を説明するために例があります。

connection.onCompletion(
    (_textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => {
        
        return [
            {
                label: 'TextView' + _textDocumentPosition.position.character,
                kind: CompletionItemKind.Text,
                data: 1
            },
            {
                label: 'Button' + _textDocumentPosition.position.line,
                kind: CompletionItemKind.Text,
                data: 2
            },
            {
                label: 'ListView',
                kind: CompletionItemKind.Text,
                data: 3
            }
        ];
    }
)

この時点で、我々は現在の行番号または列数を増加させるコントロール名を補完するだけでなく。
ここでは完全に補完の操作ボタンは、現在の行番号は、我々は934ラインを補完トリガー、情報を補完するために増加しているので、情報の完全な補完をButton933に求められます。
_

おすすめ

転載: yq.aliyun.com/articles/704290