Merge remote-tracking branch 'krobelus/textobject-count'

This commit is contained in:
Maxime Coste 2020-08-03 18:58:06 +10:00
commit 34baa56891
58 changed files with 182 additions and 82 deletions

View File

@ -494,58 +494,63 @@ select_sentence(const Context& context, const Selection& selection,
auto& buffer = context.buffer(); auto& buffer = context.buffer();
BufferIterator first = buffer.iterator_at(selection.cursor()); 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; if (not (flags & ObjectFlags::ToEnd) and first != buffer.begin())
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 (flags & ObjectFlags::ToBegin)
{
bool saw_non_blank = false;
while (first != buffer.begin())
{ {
char cur = *first; BufferIterator prev_non_blank = first-1;
char prev = *(first-1); skip_while_reverse(prev_non_blank, buffer.begin(),
if (not is_horizontal_blank(cur)) [](char c) { return is_horizontal_blank(c) or is_eol(c); });
saw_non_blank = true; if (is_end_of_sentence(*prev_non_blank))
if (is_eol(prev) and is_eol(cur) and first + 1 != buffer.end()) first = prev_non_blank;
}
if (last == BufferIterator{})
last = first;
if (flags & ObjectFlags::ToBegin)
{
bool saw_non_blank = false;
while (first != buffer.begin())
{ {
++first; char cur = *first;
break; char prev = *(first-1);
} if (not is_horizontal_blank(cur))
else if (is_end_of_sentence(prev)) saw_non_blank = true;
{ if (is_eol(prev) and is_eol(cur) and first + 1 != buffer.end())
if (saw_non_blank) {
++first;
break; 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)
}
if (flags & ObjectFlags::ToEnd)
{
while (last != buffer.end())
{ {
char cur = *last; while (last != buffer.end())
if (is_end_of_sentence(cur) or {
(is_eol(cur) and (last+1 == buffer.end() or is_eol(*(last+1))))) char cur = *last;
break; if (is_end_of_sentence(cur) or
++last; (is_eol(cur) and (last+1 == buffer.end() or is_eol(*(last+1)))))
} break;
if (not (flags & ObjectFlags::Inner) and last != buffer.end()) ++last;
{ }
++last; if (not (flags & ObjectFlags::Inner) and last != buffer.end())
skip_while(last, buffer.end(), is_horizontal_blank); {
--last; ++last;
skip_while(last, buffer.end(), is_horizontal_blank);
--last;
}
} }
} }
return (flags & ObjectFlags::ToEnd) ? Selection{first.coord(), last.coord()} return (flags & ObjectFlags::ToEnd) ? Selection{first.coord(), last.coord()}
@ -558,51 +563,55 @@ select_paragraph(const Context& context, const Selection& selection,
{ {
auto& buffer = context.buffer(); auto& buffer = context.buffer();
BufferIterator first = buffer.iterator_at(selection.cursor()); BufferIterator first = buffer.iterator_at(selection.cursor());
BufferIterator last;
if (not (flags & ObjectFlags::ToEnd) and first.coord() > BufferCoord{0,1} and for (++count; count > 0; --count)
is_eol(*(first-1)) and first-1 != buffer.begin() and is_eol(*(first-2)))
--first;
else if ((flags & ObjectFlags::ToEnd) and
first != buffer.begin() and (first+1) != buffer.end() and
is_eol(*(first-1)) and is_eol(*first))
++first;
BufferIterator last = first;
if ((flags & ObjectFlags::ToBegin) and first != buffer.begin())
{ {
skip_while_reverse(first, buffer.begin(), if (not (flags & ObjectFlags::ToEnd) and first.coord() > BufferCoord{0,1} and
[](Codepoint c){ return is_eol(c); }); is_eol(*(first-1)) and first-1 != buffer.begin() and is_eol(*(first-2)))
if (flags & ObjectFlags::ToEnd)
last = first;
while (first != buffer.begin())
{
char cur = *first;
char prev = *(first-1);
if (is_eol(prev) and is_eol(cur))
{
++first;
break;
}
--first; --first;
} else if ((flags & ObjectFlags::ToEnd) and
} first != buffer.begin() and (first+1) != buffer.end() and
if (flags & ObjectFlags::ToEnd) is_eol(*(first-1)) and is_eol(*first))
{ ++first;
if (last != buffer.end() and is_eol(*last)) if (last == BufferIterator{})
++last; last = first;
while (last != buffer.end())
if ((flags & ObjectFlags::ToBegin) and first != buffer.begin())
{ {
if (last != buffer.begin() and is_eol(*last) and is_eol(*(last-1))) skip_while_reverse(first, buffer.begin(),
{
if (not (flags & ObjectFlags::Inner))
skip_while(last, buffer.end(),
[](Codepoint c){ return is_eol(c); }); [](Codepoint c){ return is_eol(c); });
break; if (flags & ObjectFlags::ToEnd)
last = first;
while (first != buffer.begin())
{
char cur = *first;
char prev = *(first-1);
if (is_eol(prev) and is_eol(cur))
{
++first;
break;
}
--first;
} }
++last;
} }
--last; if (flags & ObjectFlags::ToEnd)
{
if (last != buffer.end() and is_eol(*last))
++last;
while (last != buffer.end())
{
if (last != buffer.begin() and is_eol(*last) and is_eol(*(last-1)))
{
if (not (flags & ObjectFlags::Inner))
skip_while(last, buffer.end(),
[](Codepoint c){ return is_eol(c); });
break;
}
++last;
}
--last;
}
} }
return (flags & ObjectFlags::ToEnd) ? Selection{first.coord(), last.coord()} return (flags & ObjectFlags::ToEnd) ? Selection{first.coord(), last.coord()}
: Selection{last.coord(), first.coord()}; : Selection{last.coord(), first.coord()};

View File

@ -0,0 +1 @@
2}p

View File

@ -0,0 +1,7 @@
%(a
b)
c
d
e

View File

@ -0,0 +1,7 @@
'a
b
c
d
'

View File

@ -0,0 +1 @@
2}s

View File

@ -0,0 +1 @@
%(a b) c. d e. f.

View File

@ -0,0 +1 @@
'a b c. d e. '

View File

@ -0,0 +1 @@
2]p

View File

@ -0,0 +1,7 @@
%(a)
b
c
d
e

View File

@ -0,0 +1,7 @@
'a
b
c
d
'

View File

@ -0,0 +1 @@
9]p

View File

@ -0,0 +1,4 @@
%(a)
b
c

View File

@ -0,0 +1,5 @@
'a
b
c
'

View File

@ -0,0 +1 @@
<a-;>2]s

View File

@ -0,0 +1 @@
%(a b) c. d e. f g.

View File

@ -0,0 +1 @@
'a b c. d e. '

View File

@ -0,0 +1 @@
9]s

View File

@ -0,0 +1,3 @@
a b.
c d.

View File

@ -0,0 +1 @@
'a b.'

View File

@ -0,0 +1 @@
<a-;>2{p

View File

@ -0,0 +1,7 @@
a
b
c
%(d
e)

View File

@ -0,0 +1,5 @@
'b
c
d
e'

View File

@ -0,0 +1 @@
<a-;>2{s

View File

@ -0,0 +1 @@
a b. c d. e %(f g)

View File

@ -0,0 +1 @@
'c d. e f g'

View File

@ -0,0 +1 @@
2[p

View File

@ -0,0 +1,8 @@
a
b
c
d
%(e)
f

View File

@ -0,0 +1,5 @@
'b
c
d
e'

View File

@ -0,0 +1 @@
2[s

View File

@ -0,0 +1 @@
a b. c d. e %(f)

View File

@ -0,0 +1 @@
'c d. e f'

View File

@ -0,0 +1 @@
9[s

View File

@ -0,0 +1,3 @@
a b.
c d. %(e) f.

View File

@ -0,0 +1,3 @@
'a b.
c d.'