2017-07-12 22 views
2

this VS Code extensionを開発しているうちに、vscode.window.activeTextEditor.editメソッドで作成した行にカーソルを移動しなければならなかったが、カーソルを移動しようとしたときにその行が存在しないことを認識したので、setTimeout私は、これは良い習慣ではないことを知っているように、私は道を見つけようとしている私はラインがあるコードを実行するときになることを確認することができないため、TextEditorEdit.replaceは非同期で、終了時にコードを実行する方法は?

let editor: TextEditor = vscode.window.activeTextEditor; 
let selections: Selection[] = editor.selections; 
let doc: TextDocument = editor.document; 

editor.edit(function (edit: TextEditorEdit): void { 
    selections.forEach((selection: Selection, index: number) => { 
     for (let i = selection.start.line; i <= selection.end.line; i++) { 
      let selLine: TextLine = doc.lineAt(i); 
      let insertPos: Range = selLine.range; 
      let insertLineText: string = selLine.text; 

      // This is async :(
      edit.replace(insertPos, insertSemicolon(insertLineText, newLine)); 
     } 
    }); 

    if (newLine) { 
     // Move cursor to the next line 
     setTimeout(() => { 
      vscode.commands.executeCommand("cursorMove", { 
       to: "down", 
       by: "wrappedLine", 
       select: false, 
       value: 1 
      }).then(() => { 
       vscode.commands.executeCommand("cursorMove", { 
        to: "wrappedLineEnd", 
        by: "wrappedLine", 
        select: false 
       }) 
      }); 
     }, 50); 
    } 
}); 

:カーソルを移動しようとしますすべてを置き換えるために編集が終了した場合にのみ、このコードを実行します。

答えて

2

カーソル操作を編集ブロックの外に移動する必要があります。 TextEditor.editのコールバックでは一連の編集が作成され、非同期で適用されます。 editは、編集が正常に完了したことを示すためにThenable<boolean>を返します。

let editor: TextEditor = vscode.window.activeTextEditor; 
let selections: Selection[] = editor.selections; 
let doc: TextDocument = editor.document; 

editor.edit(function (edit: TextEditorEdit): void { 
    selections.forEach((selection: Selection, index: number) => { 
     for (let i = selection.start.line; i <= selection.end.line; i++) { 
      let selLine: TextLine = doc.lineAt(i); 
      let insertPos: Range = selLine.range; 
      let insertLineText: string = selLine.text; 

      edit.replace(insertPos, insertSemicolon(insertLineText, newLine)); 
     } 
    }); 
}).then(success => { 
    if (!success) { 
     return 
    } 
    if (newLine) { 
     // Move cursor to the next line 
     ... 
    } 
}) 
+0

ありがとう:

のようなものを試してみてください!ちょうど私が欲しかったように働いた –

関連する問題