summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2016-08-27 11:19:07 +0100
committerMaxime Coste <frrrwww@gmail.com>2016-08-27 11:20:38 +0100
commitb934bcd4e19f0ae3f740f9cc293b8c662aa1e1d0 (patch)
tree8c58676c228c6ef0e8fd9e935cda530b21d37ee6 /src
parent093d3bd0dfa766007d0efae414f1b464d7b2a189 (diff)
Support merging consecutive selections with <a-m>
Fixes #773
Diffstat (limited to 'src')
-rw-r--r--src/normal.cc7
-rw-r--r--src/selection.cc12
-rw-r--r--src/selection.hh1
3 files changed, 20 insertions, 0 deletions
diff --git a/src/normal.cc b/src/normal.cc
index 117d681c..00250c2c 100644
--- a/src/normal.cc
+++ b/src/normal.cc
@@ -1590,6 +1590,12 @@ void ensure_forward(Context& context, NormalParams)
context.selections().check_invariant();
}
+void merge_consecutive(Context& context, NormalParams params)
+{
+ ensure_forward(context, params);
+ context.selections().merge_consecutive();
+}
+
void force_redraw(Context& context, NormalParams)
{
if (context.has_client())
@@ -1663,6 +1669,7 @@ static NormalCmdDesc cmds[] =
{ ';', "reduce selections to their cursor", clear_selections },
{ alt(';'), "swap selections cursor and anchor", flip_selections },
{ alt(':'), "ensure selection cursor is after anchor", ensure_forward },
+ { alt('m'), "merge consecutive selections", merge_consecutive },
{ 'w', "select to next word start", repeated<&select<SelectMode::Replace, select_to_next_word<Word>>> },
{ 'e', "select to next word end", repeated<select<SelectMode::Replace, select_to_next_word_end<Word>>> },
diff --git a/src/selection.cc b/src/selection.cc
index e9e30ca9..9922e851 100644
--- a/src/selection.cc
+++ b/src/selection.cc
@@ -445,6 +445,18 @@ void SelectionList::merge_overlapping()
m_main, overlaps), end());
}
+void SelectionList::merge_consecutive()
+{
+ if (size() == 1)
+ return;
+
+ auto touches = [this](const Selection& lhs, const Selection& rhs) {
+ return m_buffer->char_next(lhs.max()) >= rhs.min();
+ };
+ m_selections.erase(Kakoune::merge_overlapping(begin(), end(),
+ m_main, touches), end());
+}
+
void SelectionList::sort_and_merge_overlapping()
{
sort();
diff --git a/src/selection.hh b/src/selection.hh
index 31ed41da..29c3ffdc 100644
--- a/src/selection.hh
+++ b/src/selection.hh
@@ -126,6 +126,7 @@ struct SelectionList
void sort();
void merge_overlapping();
+ void merge_consecutive();
void sort_and_merge_overlapping();
Buffer& buffer() const { return *m_buffer; }