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 a89957e52..a365e8778 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 @@ -1592,29 +1592,44 @@ abstract class VimSearchHelperBase : VimSearchHelper { // Inner object. Whitespace is not included in a move, but included as a separate (counted) move // // Selection ends on whitespace: Move to end of current character type or end of line. + // Or: move to one char before next word // "${s} ${se} word" -> "${s} ${se}word" // "${s} ${se} \n word" -> "${s} ${se}\n word" // Selection ends on end of whitespace: Move to end of next character type. + // Or: move to end of next word // "${s} ${se}word" -> "${s} word${se}" // "${s} ${se}\nword " -> "${s} \nword${se} " - // "${s} ${se}\n word" -> "${s} \n ${se}word" + // "${s} ${se}\n word" -> "${s} \n ${se}word" // End of next word doesn't work here // Selection ends on word: Move to end of current character type. + // Or: move to end of current word // "${s}wo${se}rd word" -> "${s}word${se} word" // "${s}wo${se}rd, word" -> "${s}word${se}, word" // Selection ends on end of word: Move to end of next character type or end of line. + // Or: move to one before next word, or end of line // "${s}word${se} word " -> "${s}word ${se}word " - // "${s}word${se}, word " -> "${s}word,${se} word " + // "${s}word${se}, word " -> "${s}word,${se} word " // One before next word doesn't work here // "${s}word${se} \n word " -> "${s}word ${se}\n word " // Selection ends on word char at end of line: Move to end of next character type SKIPPING NEWLINE! + // Or: move to end of next word // "${s}word${se}\nword " -> "${s}word\nword${se} " // "${s} word${se}\nword " -> "${s} word\nword${se} " - // "${s}word${se}\n word " -> "${s}word\n ${se}word " + // "${s}word${se}\n word " -> "${s}word\n ${se}word " // End of next word doesn't work here // Selection ends on whitespace at end of line: Move to end of next character type SKIPPING NEWLINE! + // Or: move to one before next word // "${s}word ${se}\n word" -> "${s}word \n ${se}word" - // "${s}word ${se}\nword " -> "${s}word \nword${se} " + // "${s}word ${se}\nword " -> "${s}word \nword${se} " // Doesn't work // // This can be generalised to move forward on character, skip again if it's a newline, then move to end of // the now current character type. + // NEW: I think we can generalise to the same algorithm as outer motions, but flipped + // Move forward one char, and again if we land on newline + // If on whitespace, move to one char before start of next word (skipping following whitespace) + // If on word, move to end of current word (no preceding whitespace to skip) + // The trick is that we're deciding based on the moved offset, not the original offset. That's why the + // examples in the table above have some that don't work. + // Unfortunately, this doesn't work, possibly because findNextWord needs to be rewritten. E.g. we don't have a + // way of telling it to stop at the end of line + // TODO: Rewrite findNextWord and then try to rewrite this object to work the same for inner+outer motions // Increment, and skip the newline char, unless we've just landed on an empty line end++