VSCode API: 预期或合并文档文本更改

VSCode API: Anticipate or combine document text changes

假设我想做一个扩展来侦听文档更改并始终应用它们两次。如果用户键入 'w',结果将是 'ww',如果用户退格一次,实际上应该退格两次。如果用户粘贴东西,应该粘贴两次。 (我的真实用例比较复杂,不过和这个差不多)

我可以使用

监听文档更改
vscode.workspace.onDidChangeTextDocument(event => {
    // Do something
});

并使用 event.contentChanges 查看发生了什么变化,然后使用

activeEditor.edit((editBuilder: vscode.TextEditorEdit) => {
    // Do something
});

再次对文档进行相同的编辑。

问题在于,这实际上对文档进行了两次更改,因此用户需要按两次 ctrl+z 才能撤消从用户角度来看被视为单个操作的操作。

如果我可以通过 vscode.workspace.onWillChangeTextDocument 之类的方法预测文本更改(然后只是附加更多更改),那将会很棒,但这不存在(vscode 问题 #74381, #44771). I also described my problem there .

我看到有些人覆盖 vscode 中的 'type' 命令以在进行任何编辑之前执行 (example)。但这并不能让我访问我想要更改的编辑,也不能捕获退格键或 copy/paste 命令。

我也尝试过使用 formatter 但这似乎会覆盖其他格式化程序,并且用户将需要启用“按类型格式化”(手动?)以使其根据需要经常更新。这也会让不必要的用户感到困惑 settings/workflows/extensions.

知道如何实现吗?

可以通过将 options 对象传递给 activeEditor.edit 以防止在我的第二个 edit/change/action 之前添加“撤消停止”来减轻 undo/redo 的不良行为.像这样:

activeEditor.edit((editBuilder: vscode.TextEditorEdit) => {
    // Do something
}, {undoStopBefore: false, undoStopAfter: false});

undoStopAfter 似乎可以是 truefalse,现在产生相同的行为。