Do not merge selections on backspace in insert mode

Fixes #2861
This commit is contained in:
Maxime Coste 2019-05-29 23:12:04 +10:00
parent 7efdbb456d
commit 1ebea85e6f
6 changed files with 17 additions and 10 deletions

View File

@ -1235,6 +1235,8 @@ public:
if (not main_char.empty())
context().hooks().run_hook(Hook::InsertDelete, main_char, context());
context().selections_write_only().update(false);
}
else if (key == Key::Delete)
{

View File

@ -218,7 +218,7 @@ void clamp_selections(Vector<Selection>& selections, const Buffer& buffer)
clamp(sel, buffer);
}
void update_selections(Vector<Selection>& selections, size_t& main, Buffer& buffer, size_t timestamp)
void update_selections(Vector<Selection>& selections, size_t& main, Buffer& buffer, size_t timestamp, bool merge)
{
if (timestamp == buffer.timestamp())
return;
@ -242,20 +242,22 @@ void update_selections(Vector<Selection>& selections, size_t& main, Buffer& buff
}
kak_assert(std::is_sorted(selections.begin(), selections.end(),
compare_selections));
selections.erase(
merge_overlapping(selections.begin(), selections.end(),
main, overlaps), selections.end());
if (merge)
selections.erase(
merge_overlapping(selections.begin(), selections.end(),
main, overlaps), selections.end());
}
for (auto& sel : selections)
clamp(sel, buffer);
selections.erase(merge_overlapping(selections.begin(), selections.end(),
main, overlaps), selections.end());
if (merge)
selections.erase(merge_overlapping(selections.begin(), selections.end(),
main, overlaps), selections.end());
}
void SelectionList::update()
void SelectionList::update(bool merge)
{
update_selections(m_selections, m_main, *m_buffer, m_timestamp);
update_selections(m_selections, m_main, *m_buffer, m_timestamp, merge);
check_invariant();
m_timestamp = m_buffer->timestamp();
}

View File

@ -65,7 +65,7 @@ inline bool overlaps(const Selection& lhs, const Selection& rhs)
}
void update_selections(Vector<Selection>& selections, size_t& main,
Buffer& buffer, size_t timestamp);
Buffer& buffer, size_t timestamp, bool merge = true);
bool compare_selections(const Selection& lhs, const Selection& rhs);
void sort_selections(Vector<Selection>& selections, size_t& main);
@ -97,7 +97,7 @@ struct SelectionList
struct UnsortedTag {};
SelectionList(UnsortedTag, Buffer& buffer, Vector<Selection> s, size_t timestamp, size_t main);
void update();
void update(bool merge = true);
void check_invariant() const;

View File

@ -0,0 +1 @@
a<backspace>oo

View File

@ -0,0 +1 @@
%(fo)%(fo)%(fo)

View File

@ -0,0 +1 @@
foofoofoo