diff options
| author | Maxime Coste <mawww@kakoune.org> | 2019-06-05 23:19:27 +1000 |
|---|---|---|
| committer | Maxime Coste <mawww@kakoune.org> | 2019-06-23 12:05:09 +1000 |
| commit | e613292568e9f66628135b5a1f468cc9ae85106d (patch) | |
| tree | 17d5074e6cb17528baaf38ff3acaf817e221a1a2 /src/normal.cc | |
| parent | a9e778fcc7f06a27f2d06da225f08110c9e2dca9 (diff) | |
Use register to store prompt history
Diffstat (limited to 'src/normal.cc')
| -rw-r--r-- | src/normal.cc | 79 |
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); |
