Change n behaviour to only select next match for main selection

Select next match for all selections is still available as /<ret>
Fixes #1173
This commit is contained in:
Maxime Coste 2017-02-01 20:00:05 +00:00
parent 30d8641e78
commit 65bbc19d6f

View File

@ -493,43 +493,6 @@ void insert_output(Context& context, NormalParams)
}); });
} }
template<Direction direction, SelectMode mode>
void select_next_match(const Buffer& buffer, SelectionList& selections,
const Regex& regex, bool& main_wrapped)
{
const int main_index = selections.main_index();
bool wrapped = false;
if (mode == SelectMode::Replace)
{
for (int i = 0; i < selections.size(); ++i)
{
auto& sel = selections[i];
sel = keep_direction(find_next_match<direction>(buffer, sel, regex, wrapped), sel);
if (i == main_index)
main_wrapped = wrapped;
}
}
if (mode == SelectMode::Extend)
{
for (int i = 0; i < selections.size(); ++i)
{
auto& sel = selections[i];
sel.merge_with(find_next_match<direction>(buffer, sel, regex, wrapped));
if (i == main_index)
main_wrapped = wrapped;
}
}
else if (mode == SelectMode::Append)
{
auto sel = keep_direction(
find_next_match<direction>(buffer, selections.main(), regex, main_wrapped),
selections.main());
selections.push_back(std::move(sel));
selections.set_main_index(selections.size() - 1);
}
selections.sort_and_merge_overlapping();
}
void yank(Context& context, NormalParams params) void yank(Context& context, NormalParams params)
{ {
const char reg = params.reg ? params.reg : '"'; const char reg = params.reg ? params.reg : '"';
@ -688,23 +651,33 @@ void search(Context& context, NormalParams params)
regex_prompt(context, prompt.str(), regex_prompt(context, prompt.str(),
[reg, count, saved_reg, main_index] [reg, count, saved_reg, main_index]
(Regex ex, PromptEvent event, Context& context) { (Regex regex, PromptEvent event, Context& context) {
if (event == PromptEvent::Abort) if (event == PromptEvent::Abort)
{ {
RegisterManager::instance()[reg] = saved_reg; RegisterManager::instance()[reg] = saved_reg;
return; return;
} }
if (ex.empty()) if (regex.empty())
ex = Regex{saved_reg[main_index]}; regex = Regex{saved_reg[main_index]};
RegisterManager::instance()[reg] = ex.str(); RegisterManager::instance()[reg] = regex.str();
if (not ex.empty() and not ex.str().empty()) if (not regex.empty() and not regex.str().empty())
{ {
bool main_wrapped = false;
int c = count; int c = count;
auto& selections = context.selections();
auto& buffer = context.buffer();
do { do {
select_next_match<direction, mode>(context.buffer(), context.selections(), ex, main_wrapped); bool wrapped = false;
for (int i = 0; i < selections.size(); ++i)
{
auto& sel = selections[i];
if (mode == SelectMode::Replace)
sel = keep_direction(find_next_match<direction>(buffer, sel, regex, wrapped), sel);
if (mode == SelectMode::Extend)
sel.merge_with(find_next_match<direction>(buffer, sel, regex, wrapped));
}
selections.sort_and_merge_overlapping();
} while (--c > 0); } while (--c > 0);
} }
}); });
@ -717,11 +690,26 @@ void search_next(Context& context, NormalParams params)
StringView str = context.main_sel_register_value(reg); StringView str = context.main_sel_register_value(reg);
if (not str.empty()) if (not str.empty())
{ {
Regex ex{str}; Regex regex{str};
auto& selections = context.selections();
auto& buffer = context.buffer();
bool main_wrapped = false; bool main_wrapped = false;
do { do {
bool wrapped = false; bool wrapped = false;
select_next_match<direction, mode>(context.buffer(), context.selections(), ex, wrapped); if (mode == SelectMode::Replace)
{
auto& sel = selections.main();
sel = keep_direction(find_next_match<direction>(buffer, sel, regex, wrapped), sel);
}
else if (mode == SelectMode::Append)
{
auto sel = keep_direction(
find_next_match<direction>(buffer, selections.main(), regex, wrapped),
selections.main());
selections.push_back(std::move(sel));
selections.set_main_index(selections.size() - 1);
}
selections.sort_and_merge_overlapping();
main_wrapped = main_wrapped or wrapped; main_wrapped = main_wrapped or wrapped;
} while (--params.count > 0); } while (--params.count > 0);