summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/selectors.cc89
-rw-r--r--test/normal/object/end-extending/sentence/count/cmd1
-rw-r--r--test/normal/object/end-extending/sentence/count/in1
-rw-r--r--test/normal/object/end-extending/sentence/count/kak_quoted_selections1
-rw-r--r--test/normal/object/end/sentence/count/cmd1
-rw-r--r--test/normal/object/end/sentence/count/in1
-rw-r--r--test/normal/object/end/sentence/count/kak_quoted_selections1
-rw-r--r--test/normal/object/end/sentence/to-buffer-end/cmd1
-rw-r--r--test/normal/object/end/sentence/to-buffer-end/in3
-rw-r--r--test/normal/object/end/sentence/to-buffer-end/kak_quoted_selections1
-rw-r--r--test/normal/object/start-extending/sentence/count/cmd1
-rw-r--r--test/normal/object/start-extending/sentence/count/in1
-rw-r--r--test/normal/object/start-extending/sentence/count/kak_quoted_selections1
-rw-r--r--test/normal/object/start/sentence/count/cmd1
-rw-r--r--test/normal/object/start/sentence/count/in1
-rw-r--r--test/normal/object/start/sentence/count/kak_quoted_selections1
-rw-r--r--test/normal/object/start/sentence/to-buffer-begin/cmd1
-rw-r--r--test/normal/object/start/sentence/to-buffer-begin/in3
-rw-r--r--test/normal/object/start/sentence/to-buffer-begin/kak_quoted_selections3
19 files changed, 71 insertions, 42 deletions
diff --git a/src/selectors.cc b/src/selectors.cc
index 58311689..a77a2379 100644
--- a/src/selectors.cc
+++ b/src/selectors.cc
@@ -494,58 +494,63 @@ select_sentence(const Context& context, const Selection& selection,
auto& buffer = context.buffer();
BufferIterator first = buffer.iterator_at(selection.cursor());
+ BufferIterator last;
- if (not (flags & ObjectFlags::ToEnd) and first != buffer.begin())
+ for (++count; count > 0; --count)
{
- BufferIterator prev_non_blank = first-1;
- skip_while_reverse(prev_non_blank, buffer.begin(),
- [](char c) { return is_horizontal_blank(c) or is_eol(c); });
- if (is_end_of_sentence(*prev_non_blank))
- first = prev_non_blank;
- }
+ if (not (flags & ObjectFlags::ToEnd) and first != buffer.begin())
+ {
+ BufferIterator prev_non_blank = first-1;
+ skip_while_reverse(prev_non_blank, buffer.begin(),
+ [](char c) { return is_horizontal_blank(c) or is_eol(c); });
+ if (is_end_of_sentence(*prev_non_blank))
+ first = prev_non_blank;
+ }
- BufferIterator last = first;
+ if (last == BufferIterator{})
+ last = first;
- if (flags & ObjectFlags::ToBegin)
- {
- bool saw_non_blank = false;
- while (first != buffer.begin())
+ if (flags & ObjectFlags::ToBegin)
{
- char cur = *first;
- char prev = *(first-1);
- if (not is_horizontal_blank(cur))
- saw_non_blank = true;
- if (is_eol(prev) and is_eol(cur) and first + 1 != buffer.end())
- {
- ++first;
- break;
- }
- else if (is_end_of_sentence(prev))
+ bool saw_non_blank = false;
+ while (first != buffer.begin())
{
- if (saw_non_blank)
+ char cur = *first;
+ char prev = *(first-1);
+ if (not is_horizontal_blank(cur))
+ saw_non_blank = true;
+ if (is_eol(prev) and is_eol(cur) and first + 1 != buffer.end())
+ {
+ ++first;
break;
- else if (flags & ObjectFlags::ToEnd)
- last = first-1;
+ }
+ else if (is_end_of_sentence(prev))
+ {
+ if (saw_non_blank)
+ break;
+ else if (flags & ObjectFlags::ToEnd)
+ last = first-1;
+ }
+ --first;
}
- --first;
+ skip_while(first, buffer.end(), is_horizontal_blank);
}
- skip_while(first, buffer.end(), is_horizontal_blank);
- }
- if (flags & ObjectFlags::ToEnd)
- {
- while (last != buffer.end())
- {
- char cur = *last;
- if (is_end_of_sentence(cur) or
- (is_eol(cur) and (last+1 == buffer.end() or is_eol(*(last+1)))))
- break;
- ++last;
- }
- if (not (flags & ObjectFlags::Inner) and last != buffer.end())
+ if (flags & ObjectFlags::ToEnd)
{
- ++last;
- skip_while(last, buffer.end(), is_horizontal_blank);
- --last;
+ while (last != buffer.end())
+ {
+ char cur = *last;
+ if (is_end_of_sentence(cur) or
+ (is_eol(cur) and (last+1 == buffer.end() or is_eol(*(last+1)))))
+ break;
+ ++last;
+ }
+ if (not (flags & ObjectFlags::Inner) and last != buffer.end())
+ {
+ ++last;
+ skip_while(last, buffer.end(), is_horizontal_blank);
+ --last;
+ }
}
}
return (flags & ObjectFlags::ToEnd) ? Selection{first.coord(), last.coord()}
diff --git a/test/normal/object/end-extending/sentence/count/cmd b/test/normal/object/end-extending/sentence/count/cmd
new file mode 100644
index 00000000..072603cb
--- /dev/null
+++ b/test/normal/object/end-extending/sentence/count/cmd
@@ -0,0 +1 @@
+2}s
diff --git a/test/normal/object/end-extending/sentence/count/in b/test/normal/object/end-extending/sentence/count/in
new file mode 100644
index 00000000..847784ae
--- /dev/null
+++ b/test/normal/object/end-extending/sentence/count/in
@@ -0,0 +1 @@
+%(a b) c. d e. f.
diff --git a/test/normal/object/end-extending/sentence/count/kak_quoted_selections b/test/normal/object/end-extending/sentence/count/kak_quoted_selections
new file mode 100644
index 00000000..794843b3
--- /dev/null
+++ b/test/normal/object/end-extending/sentence/count/kak_quoted_selections
@@ -0,0 +1 @@
+'a b c. d e. '
diff --git a/test/normal/object/end/sentence/count/cmd b/test/normal/object/end/sentence/count/cmd
new file mode 100644
index 00000000..1fdb928e
--- /dev/null
+++ b/test/normal/object/end/sentence/count/cmd
@@ -0,0 +1 @@
+<a-;>2]s
diff --git a/test/normal/object/end/sentence/count/in b/test/normal/object/end/sentence/count/in
new file mode 100644
index 00000000..db224594
--- /dev/null
+++ b/test/normal/object/end/sentence/count/in
@@ -0,0 +1 @@
+%(a b) c. d e. f g.
diff --git a/test/normal/object/end/sentence/count/kak_quoted_selections b/test/normal/object/end/sentence/count/kak_quoted_selections
new file mode 100644
index 00000000..794843b3
--- /dev/null
+++ b/test/normal/object/end/sentence/count/kak_quoted_selections
@@ -0,0 +1 @@
+'a b c. d e. '
diff --git a/test/normal/object/end/sentence/to-buffer-end/cmd b/test/normal/object/end/sentence/to-buffer-end/cmd
new file mode 100644
index 00000000..a2d3cd58
--- /dev/null
+++ b/test/normal/object/end/sentence/to-buffer-end/cmd
@@ -0,0 +1 @@
+9]s
diff --git a/test/normal/object/end/sentence/to-buffer-end/in b/test/normal/object/end/sentence/to-buffer-end/in
new file mode 100644
index 00000000..7b2bc302
--- /dev/null
+++ b/test/normal/object/end/sentence/to-buffer-end/in
@@ -0,0 +1,3 @@
+a b.
+
+c d.
diff --git a/test/normal/object/end/sentence/to-buffer-end/kak_quoted_selections b/test/normal/object/end/sentence/to-buffer-end/kak_quoted_selections
new file mode 100644
index 00000000..38726836
--- /dev/null
+++ b/test/normal/object/end/sentence/to-buffer-end/kak_quoted_selections
@@ -0,0 +1 @@
+'a b.'
diff --git a/test/normal/object/start-extending/sentence/count/cmd b/test/normal/object/start-extending/sentence/count/cmd
new file mode 100644
index 00000000..c732db03
--- /dev/null
+++ b/test/normal/object/start-extending/sentence/count/cmd
@@ -0,0 +1 @@
+<a-;>2{s
diff --git a/test/normal/object/start-extending/sentence/count/in b/test/normal/object/start-extending/sentence/count/in
new file mode 100644
index 00000000..765e3c6f
--- /dev/null
+++ b/test/normal/object/start-extending/sentence/count/in
@@ -0,0 +1 @@
+a b. c d. e %(f g)
diff --git a/test/normal/object/start-extending/sentence/count/kak_quoted_selections b/test/normal/object/start-extending/sentence/count/kak_quoted_selections
new file mode 100644
index 00000000..7142771f
--- /dev/null
+++ b/test/normal/object/start-extending/sentence/count/kak_quoted_selections
@@ -0,0 +1 @@
+'c d. e f g'
diff --git a/test/normal/object/start/sentence/count/cmd b/test/normal/object/start/sentence/count/cmd
new file mode 100644
index 00000000..0d60a64b
--- /dev/null
+++ b/test/normal/object/start/sentence/count/cmd
@@ -0,0 +1 @@
+2[s
diff --git a/test/normal/object/start/sentence/count/in b/test/normal/object/start/sentence/count/in
new file mode 100644
index 00000000..b8356c65
--- /dev/null
+++ b/test/normal/object/start/sentence/count/in
@@ -0,0 +1 @@
+a b. c d. e %(f)
diff --git a/test/normal/object/start/sentence/count/kak_quoted_selections b/test/normal/object/start/sentence/count/kak_quoted_selections
new file mode 100644
index 00000000..592a862e
--- /dev/null
+++ b/test/normal/object/start/sentence/count/kak_quoted_selections
@@ -0,0 +1 @@
+'c d. e f'
diff --git a/test/normal/object/start/sentence/to-buffer-begin/cmd b/test/normal/object/start/sentence/to-buffer-begin/cmd
new file mode 100644
index 00000000..c5d20d0a
--- /dev/null
+++ b/test/normal/object/start/sentence/to-buffer-begin/cmd
@@ -0,0 +1 @@
+9[s
diff --git a/test/normal/object/start/sentence/to-buffer-begin/in b/test/normal/object/start/sentence/to-buffer-begin/in
new file mode 100644
index 00000000..7842b120
--- /dev/null
+++ b/test/normal/object/start/sentence/to-buffer-begin/in
@@ -0,0 +1,3 @@
+a b.
+
+c d. %(e) f.
diff --git a/test/normal/object/start/sentence/to-buffer-begin/kak_quoted_selections b/test/normal/object/start/sentence/to-buffer-begin/kak_quoted_selections
new file mode 100644
index 00000000..f0beb97d
--- /dev/null
+++ b/test/normal/object/start/sentence/to-buffer-begin/kak_quoted_selections
@@ -0,0 +1,3 @@
+'a b.
+
+c d.'