src: Implement <a-m> and <a-M>

Closes #2425
This commit is contained in:
Frank LENORMAND 2018-09-30 09:41:17 +03:00
parent 6b7200e4d5
commit 2d44712766
4 changed files with 33 additions and 3 deletions

View File

@ -139,6 +139,18 @@ the Shift modifier and moving will extend each selection instead.
select to the next sequence enclosed by matching character, see the
`matching_pairs` option in <<options#,`:doc options`>>
*M*::
extend the current selection to the next sequence enclosed by matching
character, see the `matching_pairs` option in <<options#,`:doc options`>>
*<a-m>*::
select to the previous sequence enclosed by matching character, see the
`matching_pairs` option in <<options#,`:doc options`>>
*<a-M>*::
extend the current selection to the previous sequence enclosed by matching
character, see the `matching_pairs` option in <<options#,`:doc options`>>
*x*::
select line on which the end of each selection lies (or next line when end lies
on an end-of-line)

View File

@ -2215,8 +2215,10 @@ static const HashMap<Key, NormalCmd, MemoryDomain::Undefined, KeymapBackend> key
{ {alt('x')}, {"extend selections to whole lines", select<SelectMode::Replace, select_lines>} },
{ {alt('X')}, {"crop selections to whole lines", select<SelectMode::Replace, trim_partial_lines>} },
{ {'m'}, {"select to matching character", select<SelectMode::Replace, select_matching>} },
{ {'M'}, {"extend to matching character", select<SelectMode::Extend, select_matching>} },
{ {'m'}, {"select to matching character", select<SelectMode::Replace, select_matching<true>>} },
{ {alt('m')}, {"backward select to matching character", select<SelectMode::Replace, select_matching<false>>} },
{ {'M'}, {"extend to matching character", select<SelectMode::Extend, select_matching<true>>} },
{ {alt('M')}, {"backward extend to matching character", select<SelectMode::Extend, select_matching<false>>} },
{ {'/'}, {"select next given regex match", search<SelectMode::Replace, MatchDirection::Forward>} },
{ {'?'}, {"extend with next given regex match", search<SelectMode::Extend, MatchDirection::Forward>} },

View File

@ -220,6 +220,7 @@ select_to_first_non_blank(const Context& context, const Selection& selection)
return {it.coord()};
}
template<bool forward>
Optional<Selection>
select_matching(const Context& context, const Selection& selection)
{
@ -227,13 +228,23 @@ select_matching(const Context& context, const Selection& selection)
auto& matching_pairs = context.options()["matching_pairs"].get<Vector<Codepoint, MemoryDomain::Options>>();
Utf8Iterator it{buffer.iterator_at(selection.cursor()), buffer};
auto match = matching_pairs.end();
while (it != buffer.end())
if (forward) while (it != buffer.end())
{
match = find(matching_pairs, *it);
if (match != matching_pairs.end())
break;
++it;
}
else while (true)
{
match = find(matching_pairs, *it);
if (match != matching_pairs.end()
or it == buffer.begin())
break;
--it;
}
if (match == matching_pairs.end())
return {};
@ -271,6 +282,10 @@ select_matching(const Context& context, const Selection& selection)
}
return {};
}
template Optional<Selection>
select_matching<true>(const Context& context, const Selection& selection);
template Optional<Selection>
select_matching<false>(const Context& context, const Selection& selection);
template<typename Iterator, typename Container>
Optional<std::pair<Iterator, Iterator>>

View File

@ -31,6 +31,7 @@ select_to_previous_word(const Context& context, const Selection& selection);
Optional<Selection>
select_line(const Context& context, const Selection& selection);
template<bool forward>
Optional<Selection>
select_matching(const Context& context, const Selection& selection);