From 696db111e2a23549924b12f62970e51c363226f6 Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Mon, 26 Sep 2016 23:33:28 +0100 Subject: [PATCH] Selecting 'around' word when on spaces after word now selects next word --- src/selectors.hh | 41 +++++++++------------------ test/unit/around/next-word/cmd | 1 + test/unit/around/next-word/in | 1 + test/unit/around/next-word/selections | 1 + 4 files changed, 16 insertions(+), 28 deletions(-) create mode 100644 test/unit/around/next-word/cmd create mode 100644 test/unit/around/next-word/in create mode 100644 test/unit/around/next-word/selections 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