summaryrefslogtreecommitdiff
path: root/src/selection.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2017-01-01 17:31:47 +0000
committerMaxime Coste <mawww@kakoune.org>2017-01-01 17:31:47 +0000
commitcdb2c766a5480cf2352e7db9b57cc9fcb9a81df2 (patch)
treec8fc513f303ec14fd046bcd2cff7ff13ea6d424d /src/selection.cc
parent69789d4793f91daab4f489147338ed593f34093d (diff)
Refactor SelectionList::insert a bit
Diffstat (limited to 'src/selection.cc')
-rw-r--r--src/selection.cc44
1 files changed, 20 insertions, 24 deletions
diff --git a/src/selection.cc b/src/selection.cc
index 6b74a6ab..48446253 100644
--- a/src/selection.cc
+++ b/src/selection.cc
@@ -513,7 +513,7 @@ BufferCoord prepare_insert(Buffer& buffer, const Selection& sel, InsertMode mode
}
void SelectionList::insert(ConstArrayView<String> strings, InsertMode mode,
- bool select_inserted)
+ Vector<BufferCoord>* out_insert_pos)
{
if (strings.empty())
return;
@@ -525,43 +525,39 @@ void SelectionList::insert(ConstArrayView<String> strings, InsertMode mode,
auto& sel = m_selections[index];
sel.anchor() = changes_tracker.get_new_coord(sel.anchor());
- kak_assert(m_buffer->is_valid(sel.anchor()));
sel.cursor() = changes_tracker.get_new_coord(sel.cursor());
- kak_assert(m_buffer->is_valid(sel.cursor()));
-
- auto pos = prepare_insert(*m_buffer, sel, mode);
- changes_tracker.update(*m_buffer, m_timestamp);
+ kak_assert(m_buffer->is_valid(sel.anchor()) and
+ m_buffer->is_valid(sel.cursor()));
const String& str = strings[std::min(index, strings.size()-1)];
- if (mode == InsertMode::Replace)
- pos = replace(*m_buffer, sel, str);
- else
- pos = m_buffer->insert(pos, str);
+ const auto pos = (mode == InsertMode::Replace) ?
+ replace(*m_buffer, sel, str)
+ : m_buffer->insert(prepare_insert(*m_buffer, sel, mode), str);
+
+ if (out_insert_pos)
+ out_insert_pos->push_back(pos);
- auto& change = m_buffer->changes_since(m_timestamp).back();
changes_tracker.update(*m_buffer, m_timestamp);
m_timestamp = m_buffer->timestamp();
- if (select_inserted or mode == InsertMode::Replace)
+ if (mode == InsertMode::Replace)
{
if (str.empty())
- {
sel.anchor() = sel.cursor() = m_buffer->clamp(pos);
- continue;
+ else
+ {
+ // we want min and max from *before* we do any change
+ auto& min = sel.min();
+ auto& max = sel.max();
+ auto& change = m_buffer->changes_since(0).back();
+ min = change.begin;
+ max = m_buffer->char_prev(change.end);
}
-
- // we want min and max from *before* we do any change
- auto& min = sel.min();
- auto& max = sel.max();
- min = change.begin;
- max = m_buffer->char_prev(change.end);
}
- else
+ else if (not str.empty())
{
- if (str.empty())
- continue;
-
+ auto& change = m_buffer->changes_since(0).back();
sel.anchor() = m_buffer->clamp(update_insert(sel.anchor(), change.begin, change.end));
sel.cursor() = m_buffer->clamp(update_insert(sel.cursor(), change.begin, change.end));
}