3

Language Server Extension を取得して新しいファイルの作成をトリガーし、それを編集して、接続されたクライアントのワークスペースに表示するにはどうすればよいですか?

onExecuteCommand を介してサーバー上でコマンドを実行する node.js に vscode-languageserver で記述された LSP 拡張機能があります。このサーバー側のコマンドで、クライアントが新しいテキスト ファイルを作成し、テキストを入力して、開いているファイルのクライアントのワークスペース リストに表示されるようにします。

https://github.com/microsoft/vscode-languageserver-node/blob/master/client-tests/src/helpers.test.tsを見ると、WorkspaceChange オブジェクトを作成し、createFile() を実行する必要があると思います。 、いくつかの変更 (.insert) を適用し、connection.workspace.applyEdit() を介して編集を適用するようにクライアントに指示しますが、これは機能しません - ファイルは作成されず、デバッガーでエラーはスローされません。

サーバーの onExecuteCommand 内のコードは次のとおりです。

//add some text
const textToAdd: string = "test string";

//create new WorkspaceChange obj
let workspaceChange = new WorkspaceChange();

//uri of the file we want to create
let newuri = 'file:///c:/temp/create.txt';

//make a TextEditChange obj. Fails if you do not supply version
let change = workspaceChange.getTextEditChange({ uri: newuri, version: 10 });

// give it some text 
change.insert(Position.create(0, 1), textToAdd);

// add a createFile documentChange to the workspaceChange
workspaceChange.createFile(newuri);

// pass these edits to the client to apply:
let reply = connection.workspace.applyEdit(workspaceChange.edit);
console.log(reply); //always <Pending>

存在しないファイル名を指定すると、プロセスは失敗します。ファイルは作成されず、ワークスペースで開かれません。

ただし、既存のファイル名を指定すると、編集が適用され、期待どおりにファイルがワークスペースで開かれます。

createFile の前に編集を提供していたためだと思いましたが、createFile()の前にgetTextEditChange( ) を実行すると、プロセスはエラー「ドキュメントの変更に対してワークスペースの編集が構成されていません」で失敗します。

4

2 に答える 2