summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-05-27 09:50:12 +0100
committerMaxime Coste <frrrwww@gmail.com>2014-05-27 09:50:12 +0100
commit72d6ed3575126d91cfc944d186bb65f4dc8fdae6 (patch)
treed3e517035c2ba75e8596a196317bb03466e41672 /src
parent9aa38a1ea072f78cb5a1f099b7b4db241de6d96d (diff)
Add 'n' for number object (inner number does not recognise '.')
Diffstat (limited to 'src')
-rw-r--r--src/normal.cc1
-rw-r--r--src/selectors.cc25
-rw-r--r--src/selectors.hh14
3 files changed, 35 insertions, 5 deletions
diff --git a/src/normal.cc b/src/normal.cc
index 882fbc3a..3c78e1f2 100644
--- a/src/normal.cc
+++ b/src/normal.cc
@@ -918,6 +918,7 @@ void select_object(Context& context, int param)
{ 's', select_sentence },
{ 'p', select_paragraph },
{ 'i', select_indent },
+ { 'n', select_number },
};
for (auto& sel : selectors)
{
diff --git a/src/selectors.cc b/src/selectors.cc
index 94c4fac7..ee1bf680 100644
--- a/src/selectors.cc
+++ b/src/selectors.cc
@@ -218,6 +218,31 @@ Selection select_to_eol_reverse(const Buffer& buffer, const Selection& selection
return utf8_range(begin, end == buffer.begin() ? end : end+1);
}
+Selection select_number(const Buffer& buffer, const Selection& selection, ObjectFlags flags)
+{
+ auto is_number = [&](char c) {
+ return (c >= '0' and c <= '9') or
+ (not (flags & ObjectFlags::Inner) and c == '.');
+ };
+
+ BufferIterator first = buffer.iterator_at(selection.cursor());
+ if (flags & ObjectFlags::ToBegin)
+ {
+ skip_while_reverse(first, buffer.begin(), is_number);
+ if (not is_number(*first) or not *first == '-')
+ ++first;
+ }
+ BufferIterator last = buffer.iterator_at(selection.cursor());
+ if (flags & ObjectFlags::ToEnd)
+ {
+ skip_while(last, buffer.end(), is_number);
+ --last;
+ }
+
+ return (flags & ObjectFlags::ToEnd) ? Selection{first.coord(), last.coord()}
+ : Selection{last.coord(), first.coord()};
+}
+
static bool is_end_of_sentence(char c)
{
return c == '.' or c == ';' or c == '!' or c == '?';
diff --git a/src/selectors.hh b/src/selectors.hh
index e6a3022a..d96adf97 100644
--- a/src/selectors.hh
+++ b/src/selectors.hh
@@ -134,10 +134,8 @@ Selection select_to_previous_word(const Buffer& buffer, const Selection& selecti
return utf8_range(begin, with_end ? end : end+1);
}
-Selection select_line(const Buffer& buffer,
-const Selection& selection);
-Selection select_matching(const Buffer& buffer,
- const Selection& selection);
+Selection select_line(const Buffer& buffer, const Selection& selection);
+Selection select_matching(const Buffer& buffer, const Selection& selection);
Selection select_to(const Buffer& buffer, const Selection& selection,
Codepoint c, int count, bool inclusive);
@@ -159,7 +157,9 @@ constexpr ObjectFlags operator|(ObjectFlags lhs, ObjectFlags rhs)
{ return (ObjectFlags)((int)lhs | (int) rhs); }
template<WordType word_type>
-Selection select_word(const Buffer& buffer, const Selection& selection, ObjectFlags flags)
+Selection select_word(const Buffer& buffer,
+ const Selection& selection,
+ ObjectFlags flags)
{
Utf8Iterator first = buffer.iterator_at(selection.cursor());
Utf8Iterator last = first;
@@ -200,6 +200,10 @@ Selection select_word(const Buffer& buffer, const Selection& selection, ObjectFl
: utf8_range(last, first);
}
+Selection select_number(const Buffer& buffer,
+ const Selection& selection,
+ ObjectFlags flags);
+
Selection select_sentence(const Buffer& buffer,
const Selection& selection,
ObjectFlags flags);