diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2016-08-27 11:19:07 +0100 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2016-08-27 11:20:38 +0100 |
| commit | b934bcd4e19f0ae3f740f9cc293b8c662aa1e1d0 (patch) | |
| tree | 8c58676c228c6ef0e8fd9e935cda530b21d37ee6 /src | |
| parent | 093d3bd0dfa766007d0efae414f1b464d7b2a189 (diff) | |
Support merging consecutive selections with <a-m>
Fixes #773
Diffstat (limited to 'src')
| -rw-r--r-- | src/normal.cc | 7 | ||||
| -rw-r--r-- | src/selection.cc | 12 | ||||
| -rw-r--r-- | src/selection.hh | 1 |
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; } |
