diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2011-10-25 18:46:14 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2011-10-25 18:46:14 +0000 |
| commit | 2c8f3229c040c5c11f4e4d47efee25300691f95f (patch) | |
| tree | 974ab67f1646465fc4e0f454334b3dd5515b09b5 /src/selectors.cc | |
| parent | 97a279e22975aa71fdf67c7e6157b175e0eeb20b (diff) | |
Selectors: add selectors for WORDs
WORDs are the same as vim's ones, i.e. a group of contiguous non blank
characters. They are bound as alt + word selector key.
Diffstat (limited to 'src/selectors.cc')
| -rw-r--r-- | src/selectors.cc | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/src/selectors.cc b/src/selectors.cc index a30e1fe2..e54704e6 100644 --- a/src/selectors.cc +++ b/src/selectors.cc @@ -41,6 +41,7 @@ enum class CharCategories Punctuation, }; +template<bool punctuation_is_not_word = true> static CharCategories categorize(char c) { if (is_word(c)) @@ -49,7 +50,8 @@ static CharCategories categorize(char c) return CharCategories::EndOfLine; if (is_blank(c)) return CharCategories::Blank; - return CharCategories::Punctuation; + return punctuation_is_not_word ? CharCategories::Punctuation + : CharCategories::Word; } template<typename T> @@ -66,7 +68,6 @@ void skip_while_reverse(BufferIterator& it, T condition) --it; } - Selection select_to_next_word(const BufferIterator& cursor) { BufferIterator begin = cursor; @@ -124,6 +125,54 @@ Selection select_to_previous_word(const BufferIterator& cursor) return Selection(begin, end+1); } +Selection select_to_next_WORD(const BufferIterator& cursor) +{ + BufferIterator begin = cursor; + if (categorize<false>(*begin) != categorize<false>(*(begin+1))) + ++begin; + + skip_while(begin, is_eol); + + BufferIterator end = begin+1; + + skip_while(end, [] (char c) { return !is_blank(c) and !is_eol(c); }); + skip_while(end, is_blank); + + return Selection(begin, end-1); +} + +Selection select_to_next_WORD_end(const BufferIterator& cursor) +{ + BufferIterator begin = cursor; + if (categorize<false>(*begin) != categorize<false>(*(begin+1))) + ++begin; + + skip_while(begin, is_eol); + + BufferIterator end = begin+1; + + skip_while(end, is_blank); + skip_while(end, [] (char c) { return !is_blank(c) and !is_eol(c); }); + + return Selection(begin, end-1); +} + +Selection select_to_previous_WORD(const BufferIterator& cursor) +{ + BufferIterator begin = cursor; + if (categorize<false>(*begin) != categorize<false>(*(begin+1))) + ++begin; + + skip_while_reverse(begin, is_eol); + + BufferIterator end = begin+1; + + skip_while_reverse(end, is_blank); + skip_while_reverse(end, [] (char c) { return !is_blank(c) and !is_eol(c); }); + + return Selection(begin, end+1); +} + Selection select_line(const BufferIterator& cursor) { BufferIterator first = cursor; |
