summaryrefslogtreecommitdiff
path: root/src/normal.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/normal.cc')
-rw-r--r--src/normal.cc79
1 files changed, 32 insertions, 47 deletions
diff --git a/src/normal.cc b/src/normal.cc
index 2fb66e49..51308e7c 100644
--- a/src/normal.cc
+++ b/src/normal.cc
@@ -456,6 +456,7 @@ void command(Context& context, EnvVarMap env_vars)
context.input_handler().prompt(
":", {}, context.main_sel_register_value(':').str(),
context.faces()["Prompt"], PromptFlags::DropHistoryEntriesWithBlankPrefix,
+ ':',
[](const Context& context, CompletionFlags flags,
StringView cmd_line, ByteCount pos) {
return CommandManager::instance().complete(context, flags, cmd_line, pos);
@@ -544,7 +545,7 @@ void pipe(Context& context, NormalParams)
const char* prompt = replace ? "pipe:" : "pipe-to:";
context.input_handler().prompt(
prompt, {}, context.main_sel_register_value("|").str(), context.faces()["Prompt"],
- PromptFlags::DropHistoryEntriesWithBlankPrefix,
+ PromptFlags::DropHistoryEntriesWithBlankPrefix, '|',
shell_complete,
[](StringView cmdline, PromptEvent event, Context& context)
{
@@ -625,7 +626,7 @@ void insert_output(Context& context, NormalParams)
const char* prompt = mode == InsertMode::Insert ? "insert-output:" : "append-output:";
context.input_handler().prompt(
prompt, {}, context.main_sel_register_value("|").str(), context.faces()["Prompt"],
- PromptFlags::DropHistoryEntriesWithBlankPrefix,
+ PromptFlags::DropHistoryEntriesWithBlankPrefix, '|',
shell_complete,
[](StringView cmdline, PromptEvent event, Context& context)
{
@@ -753,14 +754,15 @@ constexpr RegexCompileFlags direction_flags(RegexMode mode)
}
template<RegexMode mode = RegexMode::Forward, typename T>
-void regex_prompt(Context& context, String prompt, String default_regex, T func)
+void regex_prompt(Context& context, String prompt, char reg, T func)
{
static_assert(is_direction(mode));
DisplayCoord position = context.has_window() ? context.window().position() : DisplayCoord{};
SelectionList selections = context.selections();
+ auto default_regex = RegisterManager::instance()[reg].get_main(context, context.selections().main_index());
context.input_handler().prompt(
std::move(prompt), {}, default_regex, context.faces()["Prompt"],
- PromptFlags::Search,
+ PromptFlags::Search, reg,
[](const Context& context, CompletionFlags, StringView regex, ByteCount pos) -> Completions {
auto current_word = [](StringView s) {
auto it = s.end();
@@ -785,7 +787,7 @@ void regex_prompt(Context& context, String prompt, String default_regex, T func)
[&](auto&& m) { candidates.push_back(m.candidate().str()); return true; });
return {(int)(word.begin() - regex.begin()), pos, std::move(candidates) };
},
- [=](StringView str, PromptEvent event, Context& context) mutable {
+ [=, func=T(std::move(func))](StringView str, PromptEvent event, Context& context) mutable {
try
{
if (event != PromptEvent::Change and context.has_client())
@@ -879,16 +881,12 @@ void search(Context& context, NormalParams params)
const char reg = to_lower(params.reg ? params.reg : '/');
const int count = params.count;
- auto reg_content = RegisterManager::instance()[reg].get(context);
- Vector<String> saved_reg{reg_content.begin(), reg_content.end()};
- const int main_index = std::min(context.selections().main_index(), saved_reg.size()-1);
-
- regex_prompt<regex_mode>(context, prompt.str(), saved_reg[main_index],
- [reg, count, saved_reg]
+ regex_prompt<regex_mode>(context, prompt.str(), reg,
+ [reg, count, saved_reg = RegisterManager::instance()[reg].save(context)]
(const Regex& regex, PromptEvent event, Context& context) {
if (event == PromptEvent::Abort)
{
- RegisterManager::instance()[reg].set(context, saved_reg);
+ RegisterManager::instance()[reg].restore(context, saved_reg);
return;
}
RegisterManager::instance()[reg].set(context, regex.str());
@@ -907,7 +905,7 @@ template<SelectMode mode, RegexMode regex_mode>
void search_next(Context& context, NormalParams params)
{
const char reg = to_lower(params.reg ? params.reg : '/');
- StringView str = context.main_sel_register_value(reg);
+ StringView str = RegisterManager::instance()[reg].get(context).back();
if (not str.empty())
{
Regex regex{str, direction_flags(regex_mode)};
@@ -942,25 +940,21 @@ void search_next(Context& context, NormalParams params)
template<bool smart>
void use_selection_as_search_pattern(Context& context, NormalParams params)
{
- Vector<String> patterns;
- auto& sels = context.selections();
const auto& buffer = context.buffer();
- for (auto& sel : sels)
- {
- const auto beg = sel.min(), end = buffer.char_next(sel.max());
- patterns.push_back(format("{}{}{}",
- smart and is_bow(buffer, beg) ? "\\b" : "",
- escape(buffer.string(beg, end), "^$\\.*+?()[]{}|", '\\'),
- smart and is_eow(buffer, end) ? "\\b" : ""));
- }
+ auto& sel = context.selections().main();
+ const auto beg = sel.min(), end = buffer.char_next(sel.max());
+ String pattern = format("{}{}{}",
+ smart and is_bow(buffer, beg) ? "\\b" : "",
+ escape(buffer.string(beg, end), "^$\\.*+?()[]{}|", '\\'),
+ smart and is_eow(buffer, end) ? "\\b" : "");
const char reg = to_lower(params.reg ? params.reg : '/');
context.print_status({
- format("register '{}' set to '{}'", reg, fix_atom_text(patterns[sels.main_index()])),
+ format("register '{}' set to '{}'", reg, fix_atom_text(pattern)),
context.faces()["Information"] });
- RegisterManager::instance()[reg].set(context, patterns);
+ RegisterManager::instance()[reg].set(context, {pattern});
// Hack, as Window do not take register state into account
if (context.has_window())
@@ -973,15 +967,12 @@ void select_regex(Context& context, NormalParams params)
const int capture = params.count;
auto prompt = capture ? format("select (capture {}):", capture) : "select:"_str;
- auto reg_content = RegisterManager::instance()[reg].get(context);
- Vector<String> saved_reg{reg_content.begin(), reg_content.end()};
- const int main_index = std::min(context.selections().main_index(), saved_reg.size()-1);
-
- regex_prompt(context, std::move(prompt), saved_reg[main_index],
- [reg, capture, saved_reg](Regex ex, PromptEvent event, Context& context) {
+ regex_prompt(context, std::move(prompt), reg,
+ [reg, capture, saved_reg = RegisterManager::instance()[reg].save(context)]
+ (Regex ex, PromptEvent event, Context& context) {
if (event == PromptEvent::Abort)
{
- RegisterManager::instance()[reg].set(context, saved_reg);
+ RegisterManager::instance()[reg].restore(context, saved_reg);
return;
}
@@ -1000,15 +991,12 @@ void split_regex(Context& context, NormalParams params)
const int capture = params.count;
auto prompt = capture ? format("split (on capture {}):", (int)capture) : "split:"_str;
- auto reg_content = RegisterManager::instance()[reg].get(context);
- Vector<String> saved_reg{reg_content.begin(), reg_content.end()};
- const int main_index = std::min(context.selections().main_index(), saved_reg.size()-1);
-
- regex_prompt(context, std::move(prompt), saved_reg[main_index],
- [reg, capture, saved_reg](Regex ex, PromptEvent event, Context& context) {
+ regex_prompt(context, std::move(prompt), reg,
+ [reg, capture, saved_reg = RegisterManager::instance()[reg].save(context)]
+ (Regex ex, PromptEvent event, Context& context) {
if (event == PromptEvent::Abort)
{
- RegisterManager::instance()[reg].set(context, saved_reg);
+ RegisterManager::instance()[reg].restore(context, saved_reg);
return;
}
@@ -1102,16 +1090,13 @@ void keep(Context& context, NormalParams params)
constexpr StringView prompt = matching ? "keep matching:" : "keep not matching:";
const char reg = to_lower(params.reg ? params.reg : '/');
- auto saved_reg = RegisterManager::instance()[reg].get(context) | gather<Vector<String>>();
- const int main_index = std::min(context.selections().main_index(), saved_reg.size()-1);
- regex_prompt(context, prompt.str(), saved_reg[main_index],
- [saved_reg, reg]
+ regex_prompt(context, prompt.str(), reg,
+ [reg, saved_reg = RegisterManager::instance()[reg].save(context)]
(const Regex& regex, PromptEvent event, Context& context) {
-
if (event == PromptEvent::Abort)
{
- RegisterManager::instance()[reg].set(context, saved_reg);
+ RegisterManager::instance()[reg].restore(context, saved_reg);
return;
}
if (not context.history_disabled())
@@ -1144,7 +1129,7 @@ void keep_pipe(Context& context, NormalParams)
{
context.input_handler().prompt(
"keep pipe:", {}, {}, context.faces()["Prompt"],
- PromptFlags::DropHistoryEntriesWithBlankPrefix, shell_complete,
+ PromptFlags::DropHistoryEntriesWithBlankPrefix, '|', shell_complete,
[](StringView cmdline, PromptEvent event, Context& context) {
if (event != PromptEvent::Validate)
return;
@@ -1301,7 +1286,7 @@ void select_object(Context& context, NormalParams params)
context.input_handler().prompt(
"object desc:", {}, {}, context.faces()["Prompt"],
- PromptFlags::None, complete_nothing,
+ PromptFlags::None, '_', complete_nothing,
[count,info](StringView cmdline, PromptEvent event, Context& context) {
if (event != PromptEvent::Change)
hide_auto_info_ifn(context, info);