summaryrefslogtreecommitdiff
path: root/src/editor.cc
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2013-12-12 23:56:53 +0000
committerMaxime Coste <frrrwww@gmail.com>2013-12-14 14:38:17 +0000
commitdb048a079267ecea1c0aff5080a027afed16ae46 (patch)
tree0ec1b8a0fb20d9e126372b1b9115b80d4943e252 /src/editor.cc
parent894ee0297ea60c043a711fbbb5612eff8a68c3ee (diff)
MultiSelectors now transforms the whole selection
Diffstat (limited to 'src/editor.cc')
-rw-r--r--src/editor.cc21
1 files changed, 1 insertions, 20 deletions
diff --git a/src/editor.cc b/src/editor.cc
index b3572333..2e39bacf 100644
--- a/src/editor.cc
+++ b/src/editor.cc
@@ -282,26 +282,7 @@ struct nothing_selected : public runtime_error
void Editor::multi_select(const MultiSelector& selector)
{
- SelectionList new_selections;
- for (auto& sel : m_selections)
- {
- SelectionList res = selector(*m_buffer, sel);
- new_selections.reserve(new_selections.size() + res.size());
- for (auto& new_sel : res)
- {
- // preserve captures when selectors captures nothing.
- if (new_sel.captures().empty())
- new_selections.emplace_back(new_sel.first(), new_sel.last(),
- sel.captures());
- else
- new_selections.push_back(std::move(new_sel));
- }
- }
- if (new_selections.empty())
- throw nothing_selected();
- new_selections.set_main_index(new_selections.size() - 1);
- new_selections.sort_and_merge_overlapping();
- m_selections = std::move(new_selections);
+ m_selections = selector(*m_buffer, std::move(m_selections));
check_invariant();
}