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
似乎可以是 true
或 false
,现在产生相同的行为。
假设我想做一个扩展来侦听文档更改并始终应用它们两次。如果用户键入 '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
似乎可以是 true
或 false
,现在产生相同的行为。