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:
parent
586979644c
commit
c9bb160291
src/com/maddyhome/idea/vim
@ -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()
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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() }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user