mirror of
https://github.com/chylex/IntelliJ-IdeaVim.git
synced 2025-07-31 03:59:07 +02:00
Handle op-pending for space and backspace
This commit is contained in:
parent
d185672e2f
commit
00fd4cd491
src/test/java/org/jetbrains/plugins/ideavim/action/motion/leftright
vim-engine/src/main
kotlin/com/maddyhome/idea/vim/action/motion/leftright
resources/ksp-generated
@ -85,4 +85,33 @@ class MotionBackspaceActionTest : VimTestCase() {
|
||||
enterCommand("set whichwrap=b")
|
||||
}
|
||||
}
|
||||
|
||||
@TestWithoutNeovim(SkipNeovimReason.OPTION)
|
||||
@Test
|
||||
fun `test backspace motion with operator`() {
|
||||
doTest(
|
||||
"d<BS>",
|
||||
"""
|
||||
lorem ${c}ipsum dolor sit amet
|
||||
""".trimIndent(),
|
||||
"""
|
||||
lorem${c}ipsum dolor sit amet
|
||||
""".trimIndent(),
|
||||
)
|
||||
}
|
||||
|
||||
@TestWithoutNeovim(SkipNeovimReason.OPTION)
|
||||
@Test
|
||||
fun `test backspace motion with operator at start of line`() {
|
||||
doTest(
|
||||
"d<BS>",
|
||||
"""
|
||||
lorem ipsum dolor sit amet
|
||||
${c}lorem ipsum dolor sit amet
|
||||
""".trimIndent(),
|
||||
"""
|
||||
lorem ipsum dolor sit amet${c}lorem ipsum dolor sit amet
|
||||
""".trimIndent(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -85,4 +85,35 @@ class MotionSpaceActionTest : VimTestCase() {
|
||||
enterCommand("set whichwrap=s")
|
||||
}
|
||||
}
|
||||
|
||||
@Suppress("SpellCheckingInspection")
|
||||
@TestWithoutNeovim(SkipNeovimReason.OPTION)
|
||||
@Test
|
||||
fun `test space motion with operator`() {
|
||||
doTest(
|
||||
"d<Space>",
|
||||
"""
|
||||
lorem ${c}ipsum dolor sit amet
|
||||
""".trimIndent(),
|
||||
"""
|
||||
lorem ${c}psum dolor sit amet
|
||||
""".trimIndent(),
|
||||
)
|
||||
}
|
||||
|
||||
@TestWithoutNeovim(SkipNeovimReason.OPTION)
|
||||
@Test
|
||||
fun `test space motion with operator at end of line`() {
|
||||
doTest(
|
||||
"d<Space>",
|
||||
"""
|
||||
lorem ipsum dolor sit ame${c}t
|
||||
lorem ipsum dolor sit amet
|
||||
""".trimIndent(),
|
||||
"""
|
||||
lorem ipsum dolor sit am${c}e
|
||||
lorem ipsum dolor sit amet
|
||||
""".trimIndent(),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -20,8 +20,8 @@ import com.maddyhome.idea.vim.command.OperatorArguments
|
||||
import com.maddyhome.idea.vim.handler.Motion
|
||||
import com.maddyhome.idea.vim.handler.MotionActionHandler
|
||||
|
||||
@CommandOrMotion(keys = ["<BS>", "<C-H>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
|
||||
class MotionBackspaceAction : MotionActionHandler.ForEachCaret() {
|
||||
@CommandOrMotion(keys = ["<BS>", "<C-H>"], modes = [Mode.NORMAL, Mode.VISUAL])
|
||||
open class MotionBackspaceAction(private val allowPastEnd: Boolean = false) : MotionActionHandler.ForEachCaret() {
|
||||
override fun getOffset(
|
||||
editor: VimEditor,
|
||||
caret: ImmutableVimCaret,
|
||||
@ -30,24 +30,15 @@ class MotionBackspaceAction : MotionActionHandler.ForEachCaret() {
|
||||
operatorArguments: OperatorArguments,
|
||||
): Motion {
|
||||
val allowWrap = injector.options(editor).whichwrap.contains("b")
|
||||
return injector.motion.getHorizontalMotion(editor, caret, -operatorArguments.count1, allowPastEnd = false, allowWrap)
|
||||
return injector.motion.getHorizontalMotion(editor, caret, -operatorArguments.count1, allowPastEnd, allowWrap)
|
||||
}
|
||||
|
||||
override val motionType: MotionType = MotionType.EXCLUSIVE
|
||||
}
|
||||
|
||||
@CommandOrMotion(keys = ["<Space>"], modes = [Mode.NORMAL, Mode.VISUAL, Mode.OP_PENDING])
|
||||
class MotionSpaceAction : MotionActionHandler.ForEachCaret() {
|
||||
override fun getOffset(
|
||||
editor: VimEditor,
|
||||
caret: ImmutableVimCaret,
|
||||
context: ExecutionContext,
|
||||
argument: Argument?,
|
||||
operatorArguments: OperatorArguments,
|
||||
): Motion {
|
||||
val allowWrap = injector.options(editor).whichwrap.contains("s")
|
||||
return injector.motion.getHorizontalMotion(editor, caret, operatorArguments.count1, allowPastEnd = false, allowWrap)
|
||||
}
|
||||
|
||||
override val motionType: MotionType = MotionType.EXCLUSIVE
|
||||
}
|
||||
// When the motion is used with an operator, the EOL character is counted.
|
||||
// This allows e.g., `d<BS>` to delete the end of line character on the previous line when wrap is active
|
||||
// ('whichwrap' contains "b")
|
||||
// See `:help whichwrap`. This says a delete or change operator, but it appears to apply to all operators
|
||||
@CommandOrMotion(keys = ["<BS>", "<C-H>"], modes = [Mode.OP_PENDING])
|
||||
class MotionBackspaceOpPendingModeAction : MotionBackspaceAction(allowPastEnd = true)
|
||||
|
@ -0,0 +1,41 @@
|
||||
/*
|
||||
* Copyright 2003-2024 The IdeaVim authors
|
||||
*
|
||||
* Use of this source code is governed by an MIT-style
|
||||
* license that can be found in the LICENSE.txt file or at
|
||||
* https://opensource.org/licenses/MIT.
|
||||
*/
|
||||
|
||||
package com.maddyhome.idea.vim.action.motion.leftright
|
||||
|
||||
import com.intellij.vim.annotations.CommandOrMotion
|
||||
import com.intellij.vim.annotations.Mode
|
||||
import com.maddyhome.idea.vim.api.ExecutionContext
|
||||
import com.maddyhome.idea.vim.api.ImmutableVimCaret
|
||||
import com.maddyhome.idea.vim.api.VimEditor
|
||||
import com.maddyhome.idea.vim.api.injector
|
||||
import com.maddyhome.idea.vim.api.options
|
||||
import com.maddyhome.idea.vim.command.Argument
|
||||
import com.maddyhome.idea.vim.command.MotionType
|
||||
import com.maddyhome.idea.vim.command.OperatorArguments
|
||||
import com.maddyhome.idea.vim.handler.Motion
|
||||
import com.maddyhome.idea.vim.handler.MotionActionHandler
|
||||
|
||||
@CommandOrMotion(keys = ["<Space>"], modes = [Mode.NORMAL, Mode.VISUAL])
|
||||
open class MotionSpaceAction(private val allowPastEnd: Boolean = false) : MotionActionHandler.ForEachCaret() {
|
||||
override fun getOffset(
|
||||
editor: VimEditor,
|
||||
caret: ImmutableVimCaret,
|
||||
context: ExecutionContext,
|
||||
argument: Argument?,
|
||||
operatorArguments: OperatorArguments,
|
||||
): Motion {
|
||||
val allowWrap = injector.options(editor).whichwrap.contains("s")
|
||||
return injector.motion.getHorizontalMotion(editor, caret, operatorArguments.count1, allowPastEnd, allowWrap)
|
||||
}
|
||||
|
||||
override val motionType: MotionType = MotionType.EXCLUSIVE
|
||||
}
|
||||
|
||||
@CommandOrMotion(keys = ["<Space>"], modes = [Mode.OP_PENDING])
|
||||
class MotionSpaceOpPendingModeAction : MotionSpaceAction(allowPastEnd = true)
|
@ -117,7 +117,12 @@
|
||||
{
|
||||
"keys": "<BS>",
|
||||
"class": "com.maddyhome.idea.vim.action.motion.leftright.MotionBackspaceAction",
|
||||
"modes": "NXO"
|
||||
"modes": "NX"
|
||||
},
|
||||
{
|
||||
"keys": "<BS>",
|
||||
"class": "com.maddyhome.idea.vim.action.motion.leftright.MotionBackspaceOpPendingModeAction",
|
||||
"modes": "O"
|
||||
},
|
||||
{
|
||||
"keys": "<BS>",
|
||||
@ -252,7 +257,12 @@
|
||||
{
|
||||
"keys": "<C-H>",
|
||||
"class": "com.maddyhome.idea.vim.action.motion.leftright.MotionBackspaceAction",
|
||||
"modes": "NXO"
|
||||
"modes": "NX"
|
||||
},
|
||||
{
|
||||
"keys": "<C-H>",
|
||||
"class": "com.maddyhome.idea.vim.action.motion.leftright.MotionBackspaceOpPendingModeAction",
|
||||
"modes": "O"
|
||||
},
|
||||
{
|
||||
"keys": "<C-Home>",
|
||||
@ -872,7 +882,12 @@
|
||||
{
|
||||
"keys": "<Space>",
|
||||
"class": "com.maddyhome.idea.vim.action.motion.leftright.MotionSpaceAction",
|
||||
"modes": "NXO"
|
||||
"modes": "NX"
|
||||
},
|
||||
{
|
||||
"keys": "<Space>",
|
||||
"class": "com.maddyhome.idea.vim.action.motion.leftright.MotionSpaceOpPendingModeAction",
|
||||
"modes": "O"
|
||||
},
|
||||
{
|
||||
"keys": "<Tab>",
|
||||
|
Loading…
Reference in New Issue
Block a user