Fix regex search/select not restoring initial selections on abort
And incrementally set the search register for select/split as well
This commit is contained in:
parent
66ad1ff122
commit
c24a636cb9
|
@ -676,19 +676,24 @@ void search(Context& context, NormalParams params)
|
||||||
: (direction == Forward ? "search:" : "reverse search:");
|
: (direction == Forward ? "search:" : "reverse search:");
|
||||||
|
|
||||||
const char reg = to_lower(params.reg ? params.reg : '/');
|
const char reg = to_lower(params.reg ? params.reg : '/');
|
||||||
|
const int count = params.count;
|
||||||
|
|
||||||
auto reg_content = RegisterManager::instance()[reg].values(context);
|
auto reg_content = RegisterManager::instance()[reg].values(context);
|
||||||
Vector<String> saved_reg{reg_content.begin(), reg_content.end()};
|
Vector<String> saved_reg{reg_content.begin(), reg_content.end()};
|
||||||
int main_index = context.selections().main_index();
|
const int main_index = context.selections().main_index();
|
||||||
int count = params.count;
|
|
||||||
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 ex, PromptEvent event, Context& context) {
|
||||||
|
if (event == PromptEvent::Abort)
|
||||||
|
{
|
||||||
|
RegisterManager::instance()[reg] = saved_reg;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (ex.empty())
|
if (ex.empty())
|
||||||
ex = Regex{saved_reg[main_index]};
|
ex = Regex{saved_reg[main_index]};
|
||||||
if (event == PromptEvent::Abort)
|
RegisterManager::instance()[reg] = ex.str();
|
||||||
RegisterManager::instance()[reg] = saved_reg;
|
|
||||||
else
|
|
||||||
RegisterManager::instance()[reg] = ex.str();
|
|
||||||
|
|
||||||
if (not ex.empty() and not ex.str().empty())
|
if (not ex.empty() and not ex.str().empty())
|
||||||
{
|
{
|
||||||
|
@ -754,14 +759,25 @@ void use_selection_as_search_pattern(Context& context, NormalParams params)
|
||||||
void select_regex(Context& context, NormalParams params)
|
void select_regex(Context& context, NormalParams params)
|
||||||
{
|
{
|
||||||
const char reg = to_lower(params.reg ? params.reg : '/');
|
const char reg = to_lower(params.reg ? params.reg : '/');
|
||||||
unsigned capture = (unsigned)params.count;
|
const unsigned capture = (unsigned)params.count;
|
||||||
auto prompt = capture ? format("select (capture {}):", (int)capture) : "select:"_str;
|
auto prompt = capture ? format("select (capture {}):", (int)capture) : "select:"_str;
|
||||||
|
|
||||||
|
auto reg_content = RegisterManager::instance()[reg].values(context);
|
||||||
|
Vector<String> saved_reg{reg_content.begin(), reg_content.end()};
|
||||||
|
const int main_index = context.selections().main_index();
|
||||||
|
|
||||||
regex_prompt(context, std::move(prompt),
|
regex_prompt(context, std::move(prompt),
|
||||||
[reg, capture](Regex ex, PromptEvent event, Context& context) {
|
[reg, capture, saved_reg, main_index](Regex ex, PromptEvent event, Context& context) {
|
||||||
|
if (event == PromptEvent::Abort)
|
||||||
|
{
|
||||||
|
RegisterManager::instance()[reg] = saved_reg;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (ex.empty())
|
if (ex.empty())
|
||||||
ex = Regex{context.main_sel_register_value(reg)};
|
ex = Regex{saved_reg[main_index]};
|
||||||
else if (event == PromptEvent::Validate)
|
RegisterManager::instance()[reg] = ex.str();
|
||||||
RegisterManager::instance()[reg] = ex.str();
|
|
||||||
if (not ex.empty() and not ex.str().empty())
|
if (not ex.empty() and not ex.str().empty())
|
||||||
select_all_matches(context.selections(), ex, capture);
|
select_all_matches(context.selections(), ex, capture);
|
||||||
});
|
});
|
||||||
|
@ -772,12 +788,23 @@ void split_regex(Context& context, NormalParams params)
|
||||||
const char reg = to_lower(params.reg ? params.reg : '/');
|
const char reg = to_lower(params.reg ? params.reg : '/');
|
||||||
unsigned capture = (unsigned)params.count;
|
unsigned capture = (unsigned)params.count;
|
||||||
auto prompt = capture ? format("split (on capture {}):", (int)capture) : "split:"_str;
|
auto prompt = capture ? format("split (on capture {}):", (int)capture) : "split:"_str;
|
||||||
|
|
||||||
|
auto reg_content = RegisterManager::instance()[reg].values(context);
|
||||||
|
Vector<String> saved_reg{reg_content.begin(), reg_content.end()};
|
||||||
|
const int main_index = context.selections().main_index();
|
||||||
|
|
||||||
regex_prompt(context, std::move(prompt),
|
regex_prompt(context, std::move(prompt),
|
||||||
[reg, capture](Regex ex, PromptEvent event, Context& context) {
|
[reg, capture, saved_reg, main_index](Regex ex, PromptEvent event, Context& context) {
|
||||||
|
if (event == PromptEvent::Abort)
|
||||||
|
{
|
||||||
|
RegisterManager::instance()[reg] = saved_reg;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (ex.empty())
|
if (ex.empty())
|
||||||
ex = Regex{context.main_sel_register_value(reg)};
|
ex = Regex{saved_reg[main_index]};
|
||||||
else if (event == PromptEvent::Validate)
|
RegisterManager::instance()[reg] = ex.str();
|
||||||
RegisterManager::instance()[reg] = ex.str();
|
|
||||||
if (not ex.empty() and not ex.str().empty())
|
if (not ex.empty() and not ex.str().empty())
|
||||||
split_selections(context.selections(), ex, capture);
|
split_selections(context.selections(), ex, capture);
|
||||||
});
|
});
|
||||||
|
@ -844,8 +871,8 @@ template<bool matching>
|
||||||
void keep(Context& context, NormalParams)
|
void keep(Context& context, NormalParams)
|
||||||
{
|
{
|
||||||
constexpr const char* prompt = matching ? "keep matching:" : "keep not matching:";
|
constexpr const char* prompt = matching ? "keep matching:" : "keep not matching:";
|
||||||
regex_prompt(context, prompt, [](const Regex& ex, PromptEvent, Context& context) {
|
regex_prompt(context, prompt, [](const Regex& ex, PromptEvent event, Context& context) {
|
||||||
if (ex.empty())
|
if (ex.empty() or event == PromptEvent::Abort)
|
||||||
return;
|
return;
|
||||||
const Buffer& buffer = context.buffer();
|
const Buffer& buffer = context.buffer();
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue
Block a user