Add C and alt-C for 'copy selection to next/previous line'

This commit is contained in:
Maxime Coste 2015-02-05 21:25:04 +00:00
parent 5339f94eb8
commit 622919bafd
2 changed files with 30 additions and 0 deletions

View File

@ -334,6 +334,9 @@ _alt-k_ allows you to enter a regex and keep only the selections that
contains a match for this regex. using _alt-K_ you can keep the selections contains a match for this regex. using _alt-K_ you can keep the selections
not containing a match. not containing a match.
_C_ copies the current selection to the next line (or lines if a count is given)
_alt-C_ does the same to previous lines.
_$_ allows you to enter a shell command and pipe each selections to it. _$_ allows you to enter a shell command and pipe each selections to it.
Selections whose shell command returns 0 will be kept, other will be dropped. Selections whose shell command returns 0 will be kept, other will be dropped.

View File

@ -971,6 +971,30 @@ void scroll(Context& context, NormalParams)
window.set_position(position); window.set_position(position);
} }
template<Direction direction>
void copy_selections_on_next_lines(Context& context, NormalParams params)
{
auto& selections = context.selections();
auto& buffer = context.buffer();
Vector<Selection> result;
for (auto& sel : selections)
{
auto anchor = sel.anchor();
auto cursor = sel.cursor();
result.push_back(std::move(sel));
for (int i = 0; i < std::max(params.count, 1); ++i)
{
LineCount offset = (direction == Forward ? 1 : -1) * (i + 1);
ByteCoord new_anchor{anchor.line + offset, anchor.column};
ByteCoordAndTarget new_cursor{cursor.line + offset, cursor.column, cursor.target};
if (buffer.is_valid(new_anchor) and buffer.is_valid(new_cursor))
result.emplace_back(new_anchor, new_cursor);
}
}
selections = std::move(result);
selections.sort_and_merge_overlapping();
}
void rotate_selections(Context& context, NormalParams params) void rotate_selections(Context& context, NormalParams params)
{ {
context.selections().rotate_main(params.count != 0 ? params.count : 1); context.selections().rotate_main(params.count != 0 ? params.count : 1);
@ -1466,6 +1490,9 @@ KeyMap keymap =
{ '@', { "convert tabs to spaces in selections", tabs_to_spaces } }, { '@', { "convert tabs to spaces in selections", tabs_to_spaces } },
{ alt('@'), { "convert spaces to tabs in selections", spaces_to_tabs } }, { alt('@'), { "convert spaces to tabs in selections", spaces_to_tabs } },
{ 'C', { "copy selection on next lines", copy_selections_on_next_lines<Forward> } },
{ alt('C'), { "copy selection on previous lines", copy_selections_on_next_lines<Backward> } },
{ ',', { "user mappings", exec_user_mappings } }, { ',', { "user mappings", exec_user_mappings } },
{ Key::Left, { "move left", move<CharCount, Backward> } }, { Key::Left, { "move left", move<CharCount, Backward> } },