summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2014-03-31 21:46:47 +0100
committerMaxime Coste <frrrwww@gmail.com>2014-03-31 21:46:47 +0100
commitac90839c3dfe9537276324935f00bd2e9e111c55 (patch)
tree189d6d6c900e29457925b261bab820c91bf6129d
parent968922055bae8321e59f70ac0c015b6fa6fc2e65 (diff)
Select previous sentence or paragraph if selecting backward from the first char
[s and [p on the first char of a sentence or paragraph will select the previous sentence or paragraph.
-rw-r--r--src/selectors.cc17
1 files changed, 16 insertions, 1 deletions
diff --git a/src/selectors.cc b/src/selectors.cc
index d2090141..fddb5767 100644
--- a/src/selectors.cc
+++ b/src/selectors.cc
@@ -226,6 +226,16 @@ static bool is_end_of_sentence(char c)
Selection select_whole_sentence(const Buffer& buffer, const Selection& selection, ObjectFlags flags)
{
BufferIterator first = buffer.iterator_at(selection.cursor());
+
+ if (not (flags & ObjectFlags::ToEnd))
+ {
+ BufferIterator prev_non_blank = first-1;
+ skip_while_reverse(prev_non_blank, buffer.begin(),
+ [](char c) { return is_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)
@@ -277,9 +287,14 @@ Selection select_whole_sentence(const Buffer& buffer, const Selection& selection
Selection select_whole_paragraph(const Buffer& buffer, const Selection& selection, ObjectFlags flags)
{
BufferIterator first = buffer.iterator_at(selection.cursor());
+
+ if (not (flags & ObjectFlags::ToEnd) and buffer.offset(first.coord()) > 1 and
+ *(first-1) == '\n' and *(first-2) == '\n')
+ --first;
+
BufferIterator last = first;
- if (flags & ObjectFlags::ToBegin and first != buffer.begin())
+ if ((flags & ObjectFlags::ToBegin) and first != buffer.begin())
{
skip_while_reverse(first, buffer.begin(), is_eol);
if (flags & ObjectFlags::ToEnd)