VSCode API: прогнозируйте или комбинируйте изменения текста документа

Допустим, я хочу сделать расширение, которое прослушивает изменения документа и всегда применяет их дважды. Если пользователь вводит «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 для выполнения до внесения каких-либо изменений (пример). Но это не дает мне доступа к редактированию, которое я хочу изменить, и не захватывает символы возврата или команды копирования/вставки.

Я также пытался использовать форматер, но это, по-видимому, переопределит другие средства форматирования, и пользователям нужно будет включить «форматирование по типу» (вручную?), чтобы оно обновлялось так часто, как я хочу. Это также приведет к путанице с ненужными пользовательскими настройками/рабочими процессами/расширениями.

Любая идея о том, как я могу достичь этого?

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
69
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нежелательное поведение с отменой/повтором можно смягчить, передав объект options в activeEditor.edit, который предотвращает добавление «остановки отмены» перед моим вторым редактированием/изменением/действием. Как это:

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

undoStopAfter кажется, что это может быть либо true, либо false, что на данный момент приводит к идентичному поведению.

Другие вопросы по теме