Fix handling of main selection when copying selection to next/previous lines
Fixes #1095
This commit is contained in:
parent
5763cbb927
commit
4295736c97
|
@ -1100,12 +1100,17 @@ void copy_selections_on_next_lines(Context& context, NormalParams params)
|
||||||
auto& buffer = context.buffer();
|
auto& buffer = context.buffer();
|
||||||
const ColumnCount tabstop = context.options()["tabstop"].get<int>();
|
const ColumnCount tabstop = context.options()["tabstop"].get<int>();
|
||||||
Vector<Selection> result;
|
Vector<Selection> result;
|
||||||
|
size_t main_index = 0;
|
||||||
for (auto& sel : selections)
|
for (auto& sel : selections)
|
||||||
{
|
{
|
||||||
|
const bool is_main = (&sel == &selections.main());
|
||||||
auto anchor = sel.anchor();
|
auto anchor = sel.anchor();
|
||||||
auto cursor = sel.cursor();
|
auto cursor = sel.cursor();
|
||||||
ColumnCount cursor_col = get_column(buffer, tabstop, cursor);
|
ColumnCount cursor_col = get_column(buffer, tabstop, cursor);
|
||||||
ColumnCount anchor_col = get_column(buffer, tabstop, anchor);
|
ColumnCount anchor_col = get_column(buffer, tabstop, anchor);
|
||||||
|
|
||||||
|
if (is_main)
|
||||||
|
main_index = result.size();
|
||||||
result.push_back(std::move(sel));
|
result.push_back(std::move(sel));
|
||||||
for (int i = 0; i < std::max(params.count, 1); ++i)
|
for (int i = 0; i < std::max(params.count, 1); ++i)
|
||||||
{
|
{
|
||||||
|
@ -1123,11 +1128,15 @@ void copy_selections_on_next_lines(Context& context, NormalParams params)
|
||||||
|
|
||||||
if (anchor_byte != buffer[anchor_line].length() and
|
if (anchor_byte != buffer[anchor_line].length() and
|
||||||
cursor_byte != buffer[cursor_line].length())
|
cursor_byte != buffer[cursor_line].length())
|
||||||
|
{
|
||||||
|
if (is_main)
|
||||||
|
main_index = result.size();
|
||||||
result.emplace_back(BufferCoord{anchor_line, anchor_byte},
|
result.emplace_back(BufferCoord{anchor_line, anchor_byte},
|
||||||
BufferCoordAndTarget{cursor_line, cursor_byte, cursor.target});
|
BufferCoordAndTarget{cursor_line, cursor_byte, cursor.target});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
selections = std::move(result);
|
}
|
||||||
|
selections.set(std::move(result), main_index);
|
||||||
selections.sort_and_merge_overlapping();
|
selections.sort_and_merge_overlapping();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -101,12 +101,18 @@ struct SelectionList
|
||||||
|
|
||||||
SelectionList& operator=(Vector<Selection> list)
|
SelectionList& operator=(Vector<Selection> list)
|
||||||
{
|
{
|
||||||
|
set(std::move(list), list.size()-1);
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
void set(Vector<Selection> list, size_t main)
|
||||||
|
{
|
||||||
|
kak_assert(main < list.size());
|
||||||
m_selections = std::move(list);
|
m_selections = std::move(list);
|
||||||
m_main = size()-1;
|
m_main = main;
|
||||||
sort_and_merge_overlapping();
|
sort_and_merge_overlapping();
|
||||||
update_timestamp();
|
update_timestamp();
|
||||||
check_invariant();
|
check_invariant();
|
||||||
return *this;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
using iterator = Vector<Selection>::iterator;
|
using iterator = Vector<Selection>::iterator;
|
||||||
|
|
Loading…
Reference in New Issue
Block a user