Допустим, я хочу сделать расширение, которое прослушивает изменения документа и всегда применяет их дважды. Если пользователь вводит «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). Я же описал свою проблему там.
Я вижу, что некоторые люди переопределяют команду «тип» в vscode для выполнения до внесения каких-либо изменений (пример). Но это не дает мне доступа к редактированию, которое я хочу изменить, и не захватывает символы возврата или команды копирования/вставки.
Я также пытался использовать форматер, но это, по-видимому, переопределит другие средства форматирования, и пользователям нужно будет включить «форматирование по типу» (вручную?), чтобы оно обновлялось так часто, как я хочу. Это также приведет к путанице с ненужными пользовательскими настройками/рабочими процессами/расширениями.
Любая идея о том, как я могу достичь этого?
Нежелательное поведение с отменой/повтором можно смягчить, передав объект options
в activeEditor.edit
, который предотвращает добавление «остановки отмены» перед моим вторым редактированием/изменением/действием. Как это:
activeEditor.edit((editBuilder: vscode.TextEditorEdit) => {
// Do something
}, {undoStopBefore: false, undoStopAfter: false});
undoStopAfter
кажется, что это может быть либо true
, либо false
, что на данный момент приводит к идентичному поведению.