From 72351806148ff9568298e0edd7a7872bba25a17d Mon Sep 17 00:00:00 2001 From: Maxime Coste Date: Sat, 21 Jun 2014 11:31:08 +0100 Subject: [PATCH] Use main selection index as default when accessing only one register value Fixes #117 --- src/command_manager.cc | 2 +- src/context.cc | 10 ++++++++++ src/context.hh | 2 ++ src/highlighters.cc | 4 ++-- src/input_handler.cc | 2 +- src/main.cc | 2 +- src/normal.cc | 14 +++++++------- 7 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/command_manager.cc b/src/command_manager.cc index 874d0290..32fa5045 100644 --- a/src/command_manager.cc +++ b/src/command_manager.cc @@ -316,7 +316,7 @@ String eval_token(const Token& token, Context& context, return ShellManager::instance().eval(content, context, shell_params, env_vars); case Token::Type::RegisterExpand: - return RegisterManager::instance()[content].values(context)[0]; + return context.main_sel_register_value(content); case Token::Type::OptionExpand: return context.options()[content].get_as_string(); case Token::Type::ValExpand: diff --git a/src/context.cc b/src/context.cc index 4f28b596..64bf8a4c 100644 --- a/src/context.cc +++ b/src/context.cc @@ -2,6 +2,7 @@ #include "client.hh" #include "user_interface.hh" +#include "register_manager.hh" #include "window.hh" namespace Kakoune @@ -226,4 +227,13 @@ void Context::end_edition() --m_edition_level; } +StringView Context::main_sel_register_value(StringView reg) const +{ + auto strings = RegisterManager::instance()[reg].values(*this); + size_t index = m_selections ? (*m_selections).main_index() : 0; + if (strings.size() < index) + index = strings.size() - 1; + return strings[index]; +} + } diff --git a/src/context.hh b/src/context.hh index 3aa4e0cf..57780070 100644 --- a/src/context.hh +++ b/src/context.hh @@ -64,6 +64,8 @@ public: void print_status(DisplayLine status) const; + StringView main_sel_register_value(StringView reg) const; + void push_jump(); const SelectionList& jump_forward(); const SelectionList& jump_backward(); diff --git a/src/highlighters.cc b/src/highlighters.cc index c7fcb748..65b00e3e 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -358,10 +358,10 @@ HighlighterAndId highlight_search_factory(HighlighterParameters params) return ColorSpec{ { 0, &Kakoune::get_color("Search") } }; }; auto get_regex = [](const Context&){ - auto s = RegisterManager::instance()['/'].values(Context{}); + auto s = Context().main_sel_register_value("/"); try { - return s.empty() ? Regex{} : Regex{s[0].begin(), s[0].end()}; + return s.empty() ? Regex{} : Regex{s.begin(), s.end()}; } catch (boost::regex_error& err) { diff --git a/src/input_handler.cc b/src/input_handler.cc index b5b6a847..2551669e 100644 --- a/src/input_handler.cc +++ b/src/input_handler.cc @@ -374,7 +374,7 @@ public: if (m_mode == Mode::InsertReg) { - String reg = RegisterManager::instance()[key.key].values(context())[0]; + StringView reg = context().main_sel_register_value(String{key.key}); m_line_editor.insert(reg); m_mode = Mode::Default; } diff --git a/src/main.cc b/src/main.cc index 346c7cd7..91a30752 100644 --- a/src/main.cc +++ b/src/main.cc @@ -106,7 +106,7 @@ void register_env_vars() }, { "reg_.+", [](StringView name, const Context& context) -> String - { return RegisterManager::instance()[name.substr(4_byte)].values(context)[0]; } + { return context.main_sel_register_value(name.substr(4_byte)); } }, { "client_env_.+", [](StringView name, const Context& context) -> String diff --git a/src/normal.cc b/src/normal.cc index be670397..b04fc513 100644 --- a/src/normal.cc +++ b/src/normal.cc @@ -384,9 +384,9 @@ void pipe(Context& context, int) if (event != PromptEvent::Validate) return; - String real_cmd; + StringView real_cmd; if (cmdline.empty()) - real_cmd = RegisterManager::instance()['|'].values(context)[0]; + real_cmd = context.main_sel_register_value("|"); else { RegisterManager::instance()['|'] = cmdline; @@ -575,7 +575,7 @@ void search(Context& context, int) regex_prompt(context, direction == Forward ? "search:" : "reverse search:", [](Regex ex, Context& context) { if (ex.empty()) - ex = Regex{RegisterManager::instance()['/'].values(context)[0]}; + ex = Regex{context.main_sel_register_value("/").str()}; else RegisterManager::instance()['/'] = String{ex.str()}; if (not ex.empty() and not ex.str().empty()) @@ -586,12 +586,12 @@ void search(Context& context, int) template void search_next(Context& context, int param) { - const String& str = RegisterManager::instance()['/'].values(context)[0]; + StringView str = context.main_sel_register_value("/"); if (not str.empty()) { try { - Regex ex{str}; + Regex ex{str.begin(), str.end()}; do { select_next_match(context.buffer(), context.selections(), ex); } while (--param > 0); @@ -632,7 +632,7 @@ void select_regex(Context& context, int) { regex_prompt(context, "select:", [](Regex ex, Context& context) { if (ex.empty()) - ex = Regex{RegisterManager::instance()['/'].values(context)[0]}; + ex = Regex{context.main_sel_register_value("/").str()}; else RegisterManager::instance()['/'] = String{ex.str()}; if (not ex.empty() and not ex.str().empty()) @@ -644,7 +644,7 @@ void split_regex(Context& context, int) { regex_prompt(context, "split:", [](Regex ex, Context& context) { if (ex.empty()) - ex = Regex{RegisterManager::instance()['/'].values(context)[0]}; + ex = Regex{context.main_sel_register_value("/").str()}; else RegisterManager::instance()['/'] = String{ex.str()}; if (not ex.empty() and not ex.str().empty())