From fb08b5fd6562a39dbbcade33ad2489092dbc888a Mon Sep 17 00:00:00 2001 From: Alex Plate Date: Mon, 15 Jul 2024 13:16:01 +0300 Subject: [PATCH] Prepare to changing the default value of the undo A notification added to give the information about what happened Related: VIM-547 --- build.gradle.kts | 9 ++++++++- .../com/maddyhome/idea/vim/config/VimState.kt | 1 + .../com/maddyhome/idea/vim/group/IjOptions.kt | 2 +- .../idea/vim/group/NotificationService.kt | 19 +++++++++++++++++++ .../idea/vim/helper/UndoRedoHelper.kt | 12 +++++++++++- 5 files changed, 40 insertions(+), 3 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index cc7f46ee6c..1711daf124 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -288,7 +288,14 @@ intellijPlatform { pluginConfiguration { name = "IdeaVim" changeNotes.set( - """Changelog""" + """ + Undo in IdeaVim now works like in Vim
+ Caret movement is no longer a separate undo step, and full insert is undoable in one step.
+ Share Feedback +
+
+ Changelog + """.trimIndent() ) ideaVersion { diff --git a/src/main/java/com/maddyhome/idea/vim/config/VimState.kt b/src/main/java/com/maddyhome/idea/vim/config/VimState.kt index 6c6da83c2d..faae4121e8 100644 --- a/src/main/java/com/maddyhome/idea/vim/config/VimState.kt +++ b/src/main/java/com/maddyhome/idea/vim/config/VimState.kt @@ -18,6 +18,7 @@ import kotlin.reflect.KProperty internal class VimState { var isIdeaJoinNotified by StateProperty("idea-join") var isIdeaPutNotified by StateProperty("idea-put") + var isNewUndoNotified by StateProperty("idea-undo") fun readData(element: Element) { val notifications = element.getChild("notifications") diff --git a/src/main/java/com/maddyhome/idea/vim/group/IjOptions.kt b/src/main/java/com/maddyhome/idea/vim/group/IjOptions.kt index f85a36f3f7..ec880cf111 100644 --- a/src/main/java/com/maddyhome/idea/vim/group/IjOptions.kt +++ b/src/main/java/com/maddyhome/idea/vim/group/IjOptions.kt @@ -139,7 +139,7 @@ object IjOptions { // Temporary feature flags during development, not really intended for external use val closenotebooks: ToggleOption = addOption(ToggleOption("closenotebooks", GLOBAL, "closenotebooks", true, isHidden = true)) val commandOrMotionAnnotation: ToggleOption = addOption(ToggleOption("commandormotionannotation", GLOBAL, "commandormotionannotation", true, isHidden = true)) - val oldundo: ToggleOption = addOption(ToggleOption("oldundo", GLOBAL, "oldundo", true, isHidden = true)) + val oldundo: ToggleOption = addOption(ToggleOption("oldundo", GLOBAL, "oldundo", false, isHidden = true)) val unifyjumps: ToggleOption = addOption(ToggleOption("unifyjumps", GLOBAL, "unifyjumps", true, isHidden = true)) val vimscriptFunctionAnnotation: ToggleOption = addOption(ToggleOption("vimscriptfunctionannotation", GLOBAL, "vimscriptfunctionannotation", true, isHidden = true)) diff --git a/src/main/java/com/maddyhome/idea/vim/group/NotificationService.kt b/src/main/java/com/maddyhome/idea/vim/group/NotificationService.kt index b9680d0ad4..0dbc8bfe6b 100644 --- a/src/main/java/com/maddyhome/idea/vim/group/NotificationService.kt +++ b/src/main/java/com/maddyhome/idea/vim/group/NotificationService.kt @@ -62,6 +62,25 @@ internal class NotificationService(private val project: Project?) { @Suppress("unused") constructor() : this(null) + fun notifyAboutNewUndo() { + val notification = Notification( + IDEAVIM_NOTIFICATION_ID, + "IdeaVim undo now works like Vim undo", + """ + Caret movement is no more a separate undo step and full insert is undoable in one step + """.trimIndent(), + NotificationType.INFORMATION, + ) + + notification.addAction(object : DumbAwareAction("Share Feedback") { + override fun actionPerformed(p0: AnActionEvent) { + BrowserUtil.browse("https://youtrack.jetbrains.com/issue/VIM-547/Undo-splits-Insert-mode-edits-into-separate-undo-chunks") + } + }) + + notification.notify(project) + } + fun notifyAboutIdeaPut() { val notification = Notification( IDEAVIM_NOTIFICATION_ID, diff --git a/src/main/java/com/maddyhome/idea/vim/helper/UndoRedoHelper.kt b/src/main/java/com/maddyhome/idea/vim/helper/UndoRedoHelper.kt index c8ba50949a..5160f03290 100644 --- a/src/main/java/com/maddyhome/idea/vim/helper/UndoRedoHelper.kt +++ b/src/main/java/com/maddyhome/idea/vim/helper/UndoRedoHelper.kt @@ -16,14 +16,16 @@ import com.intellij.openapi.components.Service import com.intellij.openapi.diagnostic.logger import com.intellij.openapi.fileEditor.TextEditor import com.intellij.openapi.fileEditor.impl.text.TextEditorProvider +import com.intellij.openapi.project.Project import com.intellij.openapi.util.registry.Registry +import com.maddyhome.idea.vim.VimPlugin import com.maddyhome.idea.vim.api.ExecutionContext import com.maddyhome.idea.vim.api.VimCaret import com.maddyhome.idea.vim.api.VimEditor import com.maddyhome.idea.vim.api.injector import com.maddyhome.idea.vim.common.ChangesListener -import com.maddyhome.idea.vim.newapi.IjVimCaret import com.maddyhome.idea.vim.common.InsertSequence +import com.maddyhome.idea.vim.newapi.IjVimCaret import com.maddyhome.idea.vim.newapi.globalIjOptions import com.maddyhome.idea.vim.newapi.ij import com.maddyhome.idea.vim.undo.UndoRedoBase @@ -75,6 +77,7 @@ internal class UndoRedoHelper : UndoRedoBase() { removeSelections(editor) } } else { + notifyAboutNewUndo(editor.ij.project) runWithBooleanRegistryOption("ide.undo.transparent.caret.movement", true) { var nextUndoNanoTime = undoManager.getNextUndoNanoTime(fileEditor) val insertInfo = (editor.primaryCaret() as IjVimCaret).getInsertSequenceForTime(nextUndoNanoTime) @@ -95,6 +98,13 @@ internal class UndoRedoHelper : UndoRedoBase() { } } + private fun notifyAboutNewUndo(project: Project?) { + if (VimPlugin.getVimState().isNewUndoNotified) return + VimPlugin.getVimState().isNewUndoNotified = true + + VimPlugin.getNotifications(project).notifyAboutNewUndo() + } + private fun hasSelection(editor: VimEditor): Boolean { return editor.primaryCaret().ij.hasSelection() }