diff --git a/src/selectors.hh b/src/selectors.hh index bf2a6450..3aaf11f1 100644 --- a/src/selectors.hh +++ b/src/selectors.hh @@ -148,39 +148,24 @@ Selection select_word(const Buffer& buffer, const Selection& selection, int count, ObjectFlags flags) { Utf8Iterator first{buffer.iterator_at(selection.cursor()), buffer}; + if (not is_word(*first) and + not skip_while(first, buffer.end(), [](Codepoint c) + { return not is_word(c); })) + return selection; + Utf8Iterator last = first; - if (is_word(*first)) + if (flags & ObjectFlags::ToBegin) { - if (flags & ObjectFlags::ToBegin) - { - skip_while_reverse(first, buffer.begin(), is_word); - if (not is_word(*first)) - ++first; - } - if (flags & ObjectFlags::ToEnd) - { - skip_while(last, buffer.end(), is_word); - if (not (flags & ObjectFlags::Inner)) - skip_while(last, buffer.end(), is_horizontal_blank); - --last; - } + skip_while_reverse(first, buffer.begin(), is_word); + if (not is_word(*first)) + ++first; } - else if (not (flags & ObjectFlags::Inner)) + if (flags & ObjectFlags::ToEnd) { - if (flags & ObjectFlags::ToBegin) - { - skip_while_reverse(first, buffer.begin(), is_horizontal_blank); - if (not is_word(*first)) - return selection; - skip_while_reverse(first, buffer.begin(), is_word); - if (not is_word(*first)) - ++first; - } - if (flags & ObjectFlags::ToEnd) - { + skip_while(last, buffer.end(), is_word); + if (not (flags & ObjectFlags::Inner)) skip_while(last, buffer.end(), is_horizontal_blank); - --last; - } + --last; } return (flags & ObjectFlags::ToEnd) ? utf8_range(first, last) : utf8_range(last, first); diff --git a/test/unit/around/next-word/cmd b/test/unit/around/next-word/cmd new file mode 100644 index 00000000..b11a4948 --- /dev/null +++ b/test/unit/around/next-word/cmd @@ -0,0 +1 @@ +w diff --git a/test/unit/around/next-word/in b/test/unit/around/next-word/in new file mode 100644 index 00000000..3b0e7a0e --- /dev/null +++ b/test/unit/around/next-word/in @@ -0,0 +1 @@ +foo%( )bar baz diff --git a/test/unit/around/next-word/selections b/test/unit/around/next-word/selections new file mode 100644 index 00000000..efe82b7c --- /dev/null +++ b/test/unit/around/next-word/selections @@ -0,0 +1 @@ +bar