diff --git a/src/test/java/org/jetbrains/plugins/ideavim/action/motion/object/MotionInnerBigWordActionTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/action/motion/object/MotionInnerBigWordActionTest.kt index 1ff1f6c00..2c80e332a 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/action/motion/object/MotionInnerBigWordActionTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/action/motion/object/MotionInnerBigWordActionTest.kt @@ -124,6 +124,54 @@ class MotionInnerBigWordActionTest : VimTestCase() { ) } + @Test + fun `test select WORD from whitespace at end of line with multiple lines`() { + doTest( + "viW", + """ + |Lorem Ipsum....${c}.... + | + |Lorem ipsum dolor sit amet + |consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + """ + |Lorem Ipsum${s}.......${c}.${se} + | + |Lorem ipsum dolor sit amet + |consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + Mode.VISUAL(SelectionType.CHARACTER_WISE), + ) + } + + @Test + fun `test select WORD from whitespace at end of line with multiple lines 2`() { + doTest( + "viW", + """ + |Lorem Ipsum + | + |Lorem ipsum dolor sit amet....${c}.... + |....consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + """ + |Lorem Ipsum + | + |Lorem ipsum dolor sit amet${s}.......${c}.${se} + |....consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + Mode.VISUAL(SelectionType.CHARACTER_WISE), + ) + } + @Test fun `test select WORD ignores punctuation`() { doTest( @@ -154,6 +202,64 @@ class MotionInnerBigWordActionTest : VimTestCase() { ) } + @Test + fun `test select WORD with existing left-to-right selection in whitespace selects trailing whitespace at end of file`() { + doTest( + listOf("v", "l", "iW"), + "Lorem ipsum dolor sit amet ${c} ", + "Lorem ipsum dolor sit amet ${s} ${c} ${se}", + Mode.VISUAL(SelectionType.CHARACTER_WISE), + ) + } + + @Test + fun `test select WORD from whitespace at end of line with multiple lines and existing left-to-right selection`() { + doTest( + listOf("v", "h", "iW"), + """ + |Lorem Ipsum...${c}..... + | + |Lorem ipsum dolor sit amet + |consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + """ + |Lorem Ipsum${s}${c}....${se}.... + | + |Lorem ipsum dolor sit amet + |consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + Mode.VISUAL(SelectionType.CHARACTER_WISE), + ) + } + + @Test + fun `test select WORD from whitespace at end of line with multiple lines and existing left-to-right selection 2`() { + doTest( + listOf("v", "h", "iW"), + """ + |Lorem Ipsum + | + |Lorem ipsum dolor sit amet...${c}..... + | consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + """ + |Lorem Ipsum + | + |Lorem ipsum dolor sit amet${s}${c}....${se}.... + | consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + Mode.VISUAL(SelectionType.CHARACTER_WISE), + ) + } + @Test fun `test select WORD with existing right-to-left selection selects start of word`() { doTest( @@ -421,18 +527,6 @@ class MotionInnerBigWordActionTest : VimTestCase() { ) } - // TODO: Fix this bug - @VimBehaviorDiffers(originalVimAfter = - """ - |Lorem Ipsum - | - |Lorem ipsum dolor sit amet, - |consectetur ${s}adipiscing elit.......${c}.${se} - |Sed in orci mauris. - |Cras id tellus in ex imperdiet egestas. - """, - description = "Caret placement is incorrect, but the selection is correct - it should not select the final newline char" - ) @Test fun `test repeated text object expands selection to whitespace at end of line`() { doTest( @@ -449,7 +543,7 @@ class MotionInnerBigWordActionTest : VimTestCase() { |Lorem Ipsum | |Lorem ipsum dolor sit amet, - |consectetur ${s}adipiscing elit........${c}${se} + |consectetur ${s}adipiscing elit.......${c}.${se} |Sed in orci mauris. |Cras id tellus in ex imperdiet egestas. """.trimMargin().dotToSpace(), @@ -576,25 +670,14 @@ class MotionInnerBigWordActionTest : VimTestCase() { """.trimMargin(), """ |Lorem ${s}Ipsum - | |${c}${se} + | |Lorem ipsum dolor sit amet, """.trimMargin(), Mode.VISUAL(SelectionType.CHARACTER_WISE), ) } - @VimBehaviorDiffers(originalVimAfter = - """ - |Lorem ${s}Ipsum - |.......${c}.${se} - |Lorem ipsum dolor sit amet, - |consectetur adipiscing elit - |Sed in orci mauris. - |Cras id tellus in ex imperdiet egestas. - """, - description = "Caret placement is incorrect, but selection is correct. It should not select trailing new line char" - ) @Test fun `test repeated text object expands to whitespace on following blank line`() { doTest( @@ -609,7 +692,7 @@ class MotionInnerBigWordActionTest : VimTestCase() { """.trimMargin().dotToSpace(), """ |Lorem ${s}Ipsum - |........${c}${se} + |.......${c}.${se} |Lorem ipsum dolor sit amet, |consectetur adipiscing elit |Sed in orci mauris. @@ -652,8 +735,8 @@ class MotionInnerBigWordActionTest : VimTestCase() { """ |Lorem ${s}Ipsum | - |........ - |${c}${se} + |.......${c}.${se} + | |Lorem ipsum dolor sit amet, |consectetur adipiscing elit |Sed in orci mauris. diff --git a/src/test/java/org/jetbrains/plugins/ideavim/action/motion/object/MotionInnerWordActionTest.kt b/src/test/java/org/jetbrains/plugins/ideavim/action/motion/object/MotionInnerWordActionTest.kt index 6a2c2ceda..81b6d4567 100644 --- a/src/test/java/org/jetbrains/plugins/ideavim/action/motion/object/MotionInnerWordActionTest.kt +++ b/src/test/java/org/jetbrains/plugins/ideavim/action/motion/object/MotionInnerWordActionTest.kt @@ -124,6 +124,54 @@ class MotionInnerWordActionTest : VimTestCase() { ) } + @Test + fun `test select word from whitespace at end of line with multiple lines`() { + doTest( + "viw", + """ + |Lorem Ipsum....${c}.... + | + |Lorem ipsum dolor sit amet + |consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + """ + |Lorem Ipsum${s}.......${c}.${se} + | + |Lorem ipsum dolor sit amet + |consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + Mode.VISUAL(SelectionType.CHARACTER_WISE), + ) + } + + @Test + fun `test select word from whitespace at end of line with multiple lines 2`() { + doTest( + "viw", + """ + |Lorem Ipsum + | + |Lorem ipsum dolor sit amet....${c}.... + |....consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + """ + |Lorem Ipsum + | + |Lorem ipsum dolor sit amet${s}.......${c}.${se} + |....consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + Mode.VISUAL(SelectionType.CHARACTER_WISE), + ) + } + @Test fun `test select word selects up to punctuation`() { doTest( @@ -154,6 +202,64 @@ class MotionInnerWordActionTest : VimTestCase() { ) } + @Test + fun `test select word with existing left-to-right selection in whitespace selects trailing whitespace at end of file`() { + doTest( + listOf("v", "l", "iw"), + "Lorem ipsum dolor sit amet ${c} ", + "Lorem ipsum dolor sit amet ${s} ${c} ${se}", + Mode.VISUAL(SelectionType.CHARACTER_WISE), + ) + } + + @Test + fun `test select word from whitespace at end of line with multiple lines and existing left-to-right selection`() { + doTest( + listOf("v", "h", "iw"), + """ + |Lorem Ipsum...${c}..... + | + |Lorem ipsum dolor sit amet + |consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + """ + |Lorem Ipsum${s}${c}....${se}.... + | + |Lorem ipsum dolor sit amet + |consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + Mode.VISUAL(SelectionType.CHARACTER_WISE), + ) + } + + @Test + fun `test select word from whitespace at end of line with multiple lines and existing left-to-right selection 2`() { + doTest( + listOf("v", "h", "iw"), + """ + |Lorem Ipsum + | + |Lorem ipsum dolor sit amet...${c}..... + | consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + """ + |Lorem Ipsum + | + |Lorem ipsum dolor sit amet${s}${c}....${se}.... + | consectetur adipiscing elit + |Sed in orci mauris. + |Cras id tellus in ex imperdiet egestas. + """.trimMargin().dotToSpace(), + Mode.VISUAL(SelectionType.CHARACTER_WISE), + ) + } + @Test fun `test select word with existing right-to-left selection selects start of word`() { doTest( @@ -421,18 +527,6 @@ class MotionInnerWordActionTest : VimTestCase() { ) } - // TODO: Fix this bug - @VimBehaviorDiffers(originalVimAfter = - """ - |Lorem Ipsum - | - |Lorem ipsum dolor sit amet, - |consectetur ${s}adipiscing elit.......${c}.${se} - |Sed in orci mauris. - |Cras id tellus in ex imperdiet egestas. - """, - description = "Caret placement is incorrect, but the selection is correct - it should not select the final newline char" - ) @Test fun `test repeated text object expands selection to whitespace at end of line`() { doTest( @@ -449,7 +543,7 @@ class MotionInnerWordActionTest : VimTestCase() { |Lorem Ipsum | |Lorem ipsum dolor sit amet, - |consectetur ${s}adipiscing elit........${c}${se} + |consectetur ${s}adipiscing elit.......${c}.${se} |Sed in orci mauris. |Cras id tellus in ex imperdiet egestas. """.trimMargin().dotToSpace(), @@ -576,25 +670,14 @@ class MotionInnerWordActionTest : VimTestCase() { """.trimMargin(), """ |Lorem ${s}Ipsum - | |${c}${se} + | |Lorem ipsum dolor sit amet, """.trimMargin(), Mode.VISUAL(SelectionType.CHARACTER_WISE), ) } - @VimBehaviorDiffers(originalVimAfter = - """ - |Lorem ${s}Ipsum - |.......${c}.${se} - |Lorem ipsum dolor sit amet, - |consectetur adipiscing elit - |Sed in orci mauris. - |Cras id tellus in ex imperdiet egestas. - """, - description = "Caret placement is incorrect, but selection is correct. It should not select trailing new line char" - ) @Test fun `test repeated text object expands to whitespace on following blank line`() { doTest( @@ -609,7 +692,7 @@ class MotionInnerWordActionTest : VimTestCase() { """.trimMargin().dotToSpace(), """ |Lorem ${s}Ipsum - |........${c}${se} + |.......${c}.${se} |Lorem ipsum dolor sit amet, |consectetur adipiscing elit |Sed in orci mauris. @@ -652,8 +735,8 @@ class MotionInnerWordActionTest : VimTestCase() { """ |Lorem ${s}Ipsum | - |........ - |${c}${se} + |.......${c}.${se} + | |Lorem ipsum dolor sit amet, |consectetur adipiscing elit |Sed in orci mauris. diff --git a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt index aabe7698f..3ba2b0f75 100644 --- a/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt +++ b/vim-engine/src/main/kotlin/com/maddyhome/idea/vim/api/VimSearchHelperBase.kt @@ -421,9 +421,11 @@ abstract class VimSearchHelperBase : VimSearchHelper { res = pos } found = true - } - else if (newChar == '\n' && newChar == lastChar) { - res = if (step < 0) pos + 1 else pos + } else if (newChar == '\n' + && (newChar == lastChar + || (spaceWords && charType(editor, lastChar, bigWord) === CharacterHelper.CharacterType.WHITESPACE)) + ) { + res = if (step < 0) pos + 1 else pos - 1 found = true } lastChar = newChar