parent
6b7200e4d5
commit
2d44712766
|
@ -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
|
select to the next sequence enclosed by matching character, see the
|
||||||
`matching_pairs` option in <<options#,`:doc options`>>
|
`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*::
|
*x*::
|
||||||
select line on which the end of each selection lies (or next line when end lies
|
select line on which the end of each selection lies (or next line when end lies
|
||||||
on an end-of-line)
|
on an end-of-line)
|
||||||
|
|
|
@ -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')}, {"extend selections to whole lines", select<SelectMode::Replace, select_lines>} },
|
||||||
{ {alt('X')}, {"crop selections to whole lines", select<SelectMode::Replace, trim_partial_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'}, {"select to matching character", select<SelectMode::Replace, select_matching<true>>} },
|
||||||
{ {'M'}, {"extend to matching character", select<SelectMode::Extend, select_matching>} },
|
{ {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>} },
|
{ {'/'}, {"select next given regex match", search<SelectMode::Replace, MatchDirection::Forward>} },
|
||||||
{ {'?'}, {"extend with next given regex match", search<SelectMode::Extend, MatchDirection::Forward>} },
|
{ {'?'}, {"extend with next given regex match", search<SelectMode::Extend, MatchDirection::Forward>} },
|
||||||
|
|
|
@ -220,6 +220,7 @@ select_to_first_non_blank(const Context& context, const Selection& selection)
|
||||||
return {it.coord()};
|
return {it.coord()};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<bool forward>
|
||||||
Optional<Selection>
|
Optional<Selection>
|
||||||
select_matching(const Context& context, const Selection& 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>>();
|
auto& matching_pairs = context.options()["matching_pairs"].get<Vector<Codepoint, MemoryDomain::Options>>();
|
||||||
Utf8Iterator it{buffer.iterator_at(selection.cursor()), buffer};
|
Utf8Iterator it{buffer.iterator_at(selection.cursor()), buffer};
|
||||||
auto match = matching_pairs.end();
|
auto match = matching_pairs.end();
|
||||||
while (it != buffer.end())
|
|
||||||
|
if (forward) while (it != buffer.end())
|
||||||
{
|
{
|
||||||
match = find(matching_pairs, *it);
|
match = find(matching_pairs, *it);
|
||||||
if (match != matching_pairs.end())
|
if (match != matching_pairs.end())
|
||||||
break;
|
break;
|
||||||
++it;
|
++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())
|
if (match == matching_pairs.end())
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
|
@ -271,6 +282,10 @@ select_matching(const Context& context, const Selection& selection)
|
||||||
}
|
}
|
||||||
return {};
|
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>
|
template<typename Iterator, typename Container>
|
||||||
Optional<std::pair<Iterator, Iterator>>
|
Optional<std::pair<Iterator, Iterator>>
|
||||||
|
|
|
@ -31,6 +31,7 @@ select_to_previous_word(const Context& context, const Selection& selection);
|
||||||
Optional<Selection>
|
Optional<Selection>
|
||||||
select_line(const Context& context, const Selection& selection);
|
select_line(const Context& context, const Selection& selection);
|
||||||
|
|
||||||
|
template<bool forward>
|
||||||
Optional<Selection>
|
Optional<Selection>
|
||||||
select_matching(const Context& context, const Selection& selection);
|
select_matching(const Context& context, const Selection& selection);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user