1
0
mirror of https://github.com/chylex/IntelliJ-IdeaVim.git synced 2025-08-02 09:59:07 +02:00

Add savemodefor option

This commit is contained in:
Alex Plate 2019-10-23 13:17:02 +03:00
parent 586979644c
commit c9bb160291
No known key found for this signature in database
GPG Key ID: 0B97153C8FFEC09F
3 changed files with 75 additions and 7 deletions
src/com/maddyhome/idea/vim

View File

@ -52,6 +52,7 @@ import com.maddyhome.idea.vim.helper.vimSelectionStartClear
import com.maddyhome.idea.vim.listener.SelectionVimListenerSuppressor
import com.maddyhome.idea.vim.listener.VimListenerManager
import com.maddyhome.idea.vim.option.OptionsManager
import com.maddyhome.idea.vim.option.SaveModeFor
import com.maddyhome.idea.vim.option.SelectModeOptionData
/**
@ -137,6 +138,11 @@ class VisualMotionGroup {
if (initialMode?.hasVisualSelection == true || editor.caretModel.allCarets.any(Caret::hasSelection)) {
if (editor.caretModel.allCarets.any(Caret::hasSelection)) {
val commandState = CommandState.getInstance(editor)
if (editor.isTemplateActive() && SaveModeFor.saveTemplate(editor) ||
selectionSource == VimListenerManager.SelectionSource.OTHER && SaveModeFor.saveRefactoring(editor)) {
SaveModeFor.correctSelection(editor)
return@singleTask
}
logger.info("Some carets have selection. State before adjustment: ${commandState.toSimpleString()}")
while (commandState.mode != CommandState.Mode.COMMAND) {
commandState.popState()

View File

@ -44,6 +44,7 @@ import com.maddyhome.idea.vim.group.visual.moveCaretOneCharLeftFromSelectionEnd
import com.maddyhome.idea.vim.helper.EditorDataContext
import com.maddyhome.idea.vim.helper.inNormalMode
import com.maddyhome.idea.vim.option.OptionsManager
import com.maddyhome.idea.vim.option.SaveModeFor
import com.maddyhome.idea.vim.option.SelectModeOptionData
import java.beans.PropertyChangeEvent
import java.beans.PropertyChangeListener
@ -109,12 +110,17 @@ object IdeaSpecifics {
override fun templateStarted(state: TemplateState) {
val editor = state.editor ?: return
notifySelectmode(state, editor.project)
if (!editor.selectionModel.hasSelection()) {
// Enable insert mode if there is no selection in template
// Template with selection is handled by [com.maddyhome.idea.vim.group.visual.VisualMotionGroup.controlNonVimSelectionChange]
if (editor.inNormalMode) {
VimPlugin.getChange().insertBeforeCursor(editor, EditorDataContext(editor))
KeyHandler.getInstance().reset(editor)
if (SaveModeFor.saveTemplate(editor)) {
SaveModeFor.correctSelection(editor)
} else {
if (!editor.selectionModel.hasSelection()) {
// Enable insert mode if there is no selection in template
// Template with selection is handled by [com.maddyhome.idea.vim.group.visual.VisualMotionGroup.controlNonVimSelectionChange]
if (editor.inNormalMode) {
VimPlugin.getChange().insertBeforeCursor(editor, EditorDataContext(editor))
KeyHandler.getInstance().reset(editor)
}
}
}
}

View File

@ -18,15 +18,20 @@
package com.maddyhome.idea.vim.option
import com.intellij.codeInsight.lookup.LookupManager
import com.intellij.codeInsight.lookup.impl.LookupImpl
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.diagnostic.debug
import com.intellij.openapi.editor.Editor
import com.maddyhome.idea.vim.VimPlugin
import com.maddyhome.idea.vim.ex.ExOutputModel
import com.maddyhome.idea.vim.extension.VimExtension
import com.maddyhome.idea.vim.helper.EditorHelper
import com.maddyhome.idea.vim.helper.MessageHelper
import com.maddyhome.idea.vim.helper.Msg
import com.maddyhome.idea.vim.helper.inInsertMode
import com.maddyhome.idea.vim.helper.inNormalMode
import com.maddyhome.idea.vim.helper.inSelectMode
import com.maddyhome.idea.vim.helper.inVisualMode
import org.jetbrains.annotations.Contract
import java.util.*
import kotlin.math.ceil
@ -72,6 +77,7 @@ object OptionsManager {
val visualbell = addOption(ToggleOption("visualbell", "vb", false))
val wrapscan = addOption(ToggleOption("wrapscan", "ws", true))
val visualEnterDelay = addOption(NumberOption("visualdelay", "visualdelay", 100, 0, Int.MAX_VALUE))
val saveModeFor = addOption(BoundListOption(SaveModeFor.name, SaveModeFor.name, arrayOf(), SaveModeFor.availableOptions))
fun isSet(name: String): Boolean {
val option = getOption(name)
@ -426,3 +432,53 @@ object IgnoreCaseOptionsData {
const val name = "ignorecase"
const val abbr = "ic"
}
object SaveModeFor {
const val name = "savemodefor"
const val refactoring = SelectModeOptionData.refactoring
const val iRefactoring = "i-"+SelectModeOptionData.refactoring
const val nRefactoring = "n-"+SelectModeOptionData.refactoring
const val vRefactoring = "v-"+SelectModeOptionData.refactoring
const val sRefactoring = "s-"+SelectModeOptionData.refactoring
const val template = SelectModeOptionData.template
const val iTemplate = "i-"+SelectModeOptionData.template
const val nTemplate = "n-"+SelectModeOptionData.template
const val vTemplate = "v-"+SelectModeOptionData.template
const val sTemplate = "s-"+SelectModeOptionData.template
val availableOptions = arrayOf(
refactoring, iRefactoring, nRefactoring, vRefactoring, sRefactoring,
template, iTemplate, nTemplate, vTemplate, sTemplate
)
fun saveTemplate(editor: Editor): Boolean {
return when {
template in OptionsManager.saveModeFor -> true
nTemplate in OptionsManager.saveModeFor && editor.inNormalMode -> true
iTemplate in OptionsManager.saveModeFor && editor.inInsertMode -> true
vTemplate in OptionsManager.saveModeFor && editor.inVisualMode -> true
sTemplate in OptionsManager.saveModeFor && editor.inSelectMode -> true
else -> false
}
}
fun saveRefactoring(editor: Editor): Boolean {
return when {
refactoring in OptionsManager.saveModeFor -> true
nRefactoring in OptionsManager.saveModeFor && editor.inNormalMode -> true
iRefactoring in OptionsManager.saveModeFor && editor.inInsertMode -> true
vRefactoring in OptionsManager.saveModeFor && editor.inVisualMode -> true
sRefactoring in OptionsManager.saveModeFor && editor.inSelectMode -> true
else -> false
}
}
fun correctSelection(editor: Editor) {
if (!editor.inSelectMode && !editor.inVisualMode) {
val lookup = LookupManager.getActiveLookup(editor) as? LookupImpl
lookup?.performGuardedChange { editor.selectionModel.removeSelection() }
}
}
}