summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMaxime Coste <frrrwww@gmail.com>2012-12-05 19:22:40 +0100
committerMaxime Coste <frrrwww@gmail.com>2012-12-06 13:33:26 +0100
commitb81ea0bc9237f4a365521ff18859c369bed98dce (patch)
tree671003c6513517173047aaf8cbe97a788d2c5941 /src
parent3438ba7ec3e500f9eb442d9d07f7276a6da7aed5 (diff)
PromptHandler now call callback when edited and aborted.
Used for a new feature: incremental search
Diffstat (limited to 'src')
-rw-r--r--src/input_handler.cc4
-rw-r--r--src/input_handler.hh9
-rw-r--r--src/main.cc45
3 files changed, 41 insertions, 17 deletions
diff --git a/src/input_handler.cc b/src/input_handler.cc
index 0cf1de9a..9a582467 100644
--- a/src/input_handler.cc
+++ b/src/input_handler.cc
@@ -280,7 +280,7 @@ public:
reset_normal_mode();
// call callback after reset_normal_mode so that callback
// may change the mode
- m_callback(line, context);
+ m_callback(line, PromptEvent::Validate, context);
return;
}
else if (key == Key::Escape or key == Key { Key::Modifiers::Control, 'c' })
@@ -288,6 +288,7 @@ public:
context.ui().print_status("");
context.ui().menu_hide();
reset_normal_mode();
+ m_callback(line, PromptEvent::Abort, context);
return;
}
else if (key == Key{Key::Modifiers::Control, 'r'})
@@ -385,6 +386,7 @@ public:
}
context.ui().print_status(m_prompt + line,
m_prompt.char_length() + m_line_editor.cursor_pos());
+ m_callback(line, PromptEvent::Change, context);
}
private:
diff --git a/src/input_handler.hh b/src/input_handler.hh
index e5509c22..3d520d27 100644
--- a/src/input_handler.hh
+++ b/src/input_handler.hh
@@ -13,7 +13,14 @@ class Editor;
class Context;
using MenuCallback = std::function<void (int, Context&)>;
-using PromptCallback = std::function<void (const String&, Context&)>;
+
+enum class PromptEvent
+{
+ Change,
+ Abort,
+ Validate
+};
+using PromptCallback = std::function<void (const String&, PromptEvent, Context&)>;
using KeyCallback = std::function<void (const Key&, Context&)>;
class InputMode;
diff --git a/src/main.cc b/src/main.cc
index 6e783ddc..fa8065f1 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -107,15 +107,20 @@ void do_command(Context& context)
{
context.input_handler().prompt(
":", std::bind(&CommandManager::complete, &CommandManager::instance(), _1, _2, _3),
- [](const String& cmdline, Context& context) { CommandManager::instance().execute(cmdline, context); },
- context);
+ [](const String& cmdline, PromptEvent event, Context& context) {
+ if (event == PromptEvent::Validate)
+ CommandManager::instance().execute(cmdline, context);
+ }, context);
}
void do_pipe(Context& context)
{
context.input_handler().prompt("|", complete_nothing,
- [](const String& cmdline, Context& context)
+ [](const String& cmdline, PromptEvent event, Context& context)
{
+ if (event != PromptEvent::Validate)
+ return;
+
Editor& editor = context.editor();
std::vector<String> strings;
for (auto& sel : const_cast<const Editor&>(context.editor()).selections())
@@ -129,14 +134,22 @@ void do_pipe(Context& context)
template<SelectMode mode>
void do_search(Context& context)
{
+ SelectionList selections = context.editor().selections();
context.input_handler().prompt("/", complete_nothing,
- [](const String& str, Context& context) {
- String ex = str;
- if (ex.empty())
- ex = RegisterManager::instance()['/'].values(context)[0];
- else
- RegisterManager::instance()['/'] = ex;
+ [selections](const String& str, PromptEvent event, Context& context) {
+ context.editor().select(selections);
+
+ if (str.empty() or event == PromptEvent::Abort)
+ return;
+ String ex = str;
+ if (event == PromptEvent::Validate)
+ {
+ if (ex.empty())
+ ex = RegisterManager::instance()['/'].values(context)[0];
+ else
+ RegisterManager::instance()['/'] = ex;
+ }
context.editor().select(std::bind(select_next_match, _1, ex), mode);
}, context);
}
@@ -212,17 +225,19 @@ void do_paste(Context& context)
void do_select_regex(Context& context)
{
context.input_handler().prompt("select: ", complete_nothing,
- [](const String& ex, Context& context)
- { context.editor().multi_select(std::bind(select_all_matches, _1, ex)); },
- context);
+ [](const String& ex, PromptEvent event, Context& context) {
+ if (event == PromptEvent::Validate)
+ context.editor().multi_select(std::bind(select_all_matches, _1, ex));
+ }, context);
}
void do_split_regex(Context& context)
{
context.input_handler().prompt("split: ", complete_nothing,
- [](const String& ex, Context& context)
- { context.editor().multi_select(std::bind(split_selection, _1, ex)); },
- context);
+ [](const String& ex, PromptEvent event, Context& context) {
+ if (event == PromptEvent::Validate)
+ context.editor().multi_select(std::bind(split_selection, _1, ex));
+ }, context);
}
void do_join(Context& context)