diff options
| author | Maxime Coste <frrrwww@gmail.com> | 2011-11-26 18:32:57 +0000 |
|---|---|---|
| committer | Maxime Coste <frrrwww@gmail.com> | 2011-11-26 18:32:57 +0000 |
| commit | 957446dee480ddd3cc4454a60b718bda35d9dbf6 (patch) | |
| tree | 72e72c70e223af766dfc54512759f4055fbd35c9 /src | |
| parent | 417802cbdfaa06bb3071fd648ad0536b64fcda21 (diff) | |
Add a Context parameter to commands
Diffstat (limited to 'src')
| -rw-r--r-- | src/command_manager.cc | 16 | ||||
| -rw-r--r-- | src/command_manager.hh | 10 | ||||
| -rw-r--r-- | src/context.hh | 23 | ||||
| -rw-r--r-- | src/main.cc | 36 |
4 files changed, 63 insertions, 22 deletions
diff --git a/src/command_manager.cc b/src/command_manager.cc index cbe2a1cb..7c3606a7 100644 --- a/src/command_manager.cc +++ b/src/command_manager.cc @@ -57,7 +57,8 @@ struct command_not_found : runtime_error : runtime_error(command + " : no such command") {} }; -void CommandManager::execute(const std::string& command_line) +void CommandManager::execute(const std::string& command_line, + const Context& context) { TokenList tokens = split(command_line); if (tokens.empty()) @@ -78,7 +79,18 @@ void CommandManager::execute(const std::string& command_line) it->second - it->first)); } - command_it->second.command(params); + command_it->second.command(params, context); +} + +void CommandManager::execute(const std::string& command, + const CommandParameters& params, + const Context& context) +{ + auto command_it = m_commands.find(command); + if (command_it == m_commands.end()) + throw command_not_found(command); + + command_it->second.command(params, context); } Completions CommandManager::complete(const std::string& command_line, size_t cursor_pos) diff --git a/src/command_manager.hh b/src/command_manager.hh index c3d5fca4..852c7d67 100644 --- a/src/command_manager.hh +++ b/src/command_manager.hh @@ -13,13 +13,16 @@ namespace Kakoune { +struct Context; + struct wrong_argument_count : runtime_error { wrong_argument_count() : runtime_error("wrong argument count") {} }; typedef std::vector<std::string> CommandParameters; -typedef std::function<void (const CommandParameters&)> Command; +typedef std::function<void (const CommandParameters&, + const Context& context)> Command; typedef std::function<CandidateList (const CommandParameters&, size_t, size_t)> CommandCompleter; @@ -50,7 +53,10 @@ private: class CommandManager : public Singleton<CommandManager> { public: - void execute(const std::string& command_line); + void execute(const std::string& command_line, const Context& context); + void execute(const std::string& command, const CommandParameters& params, + const Context& context); + Completions complete(const std::string& command_line, size_t cursor_pos); void register_command(const std::string& command_name, diff --git a/src/context.hh b/src/context.hh new file mode 100644 index 00000000..6ad5bf73 --- /dev/null +++ b/src/context.hh @@ -0,0 +1,23 @@ +#ifndef context_hh_INCLUDED +#define context_hh_INCLUDED + +#include "window.hh" + +namespace Kakoune +{ + +struct Context +{ + Window* window; + Buffer* buffer; + + Context() + : window(nullptr), buffer(nullptr) {} + Context(Window& window) + : window(&window), buffer(&window.buffer()) {} + Context(Buffer& buffer) + : window(nullptr), buffer(&buffer) {} +}; + +} +#endif // context_hh_INCLUDED diff --git a/src/main.cc b/src/main.cc index d51ed348..744f654f 100644 --- a/src/main.cc +++ b/src/main.cc @@ -353,7 +353,7 @@ void do_go(Window& window, int count) } } -Window* current_window; +Context main_context; Buffer* open_or_create(const std::string& filename) { @@ -370,21 +370,21 @@ Buffer* open_or_create(const std::string& filename) return buffer; } -void edit(const CommandParameters& params) +void edit(const CommandParameters& params, const Context& context) { if (params.size() != 1) throw wrong_argument_count(); std::string filename = params[0]; - current_window = open_or_create(filename)->get_or_create_window(); + main_context = Context(*open_or_create(filename)->get_or_create_window()); } -void write_buffer(const CommandParameters& params) +void write_buffer(const CommandParameters& params, const Context& context) { if (params.size() > 1) throw wrong_argument_count(); - Buffer& buffer = current_window->buffer(); + Buffer& buffer = context.window->buffer(); std::string filename = params.empty() ? buffer.name() : params[0]; write_buffer_to_file(buffer, filename); @@ -394,7 +394,7 @@ void write_buffer(const CommandParameters& params) bool quit_requested = false; template<bool force> -void quit(const CommandParameters& params) +void quit(const CommandParameters& params, const Context& context) { if (params.size() != 0) throw wrong_argument_count(); @@ -413,7 +413,7 @@ void quit(const CommandParameters& params) quit_requested = true; } -void show_buffer(const CommandParameters& params) +void show_buffer(const CommandParameters& params, const Context& context) { if (params.size() != 1) throw wrong_argument_count(); @@ -422,10 +422,10 @@ void show_buffer(const CommandParameters& params) if (not buffer) print_status("buffer " + params[0] + " does not exists"); else - current_window = buffer->get_or_create_window(); + main_context = Context(*buffer->get_or_create_window()); } -void add_filter(const CommandParameters& params) +void add_filter(const CommandParameters& params, const Context& context) { if (params.size() < 1) throw wrong_argument_count(); @@ -434,7 +434,7 @@ void add_filter(const CommandParameters& params) { FilterRegistry& registry = FilterRegistry::instance(); FilterParameters filter_params(params.begin()+1, params.end()); - registry.add_filter_to_window(*current_window, params[0], + registry.add_filter_to_window(*context.window, params[0], filter_params); } catch (runtime_error& err) @@ -443,12 +443,12 @@ void add_filter(const CommandParameters& params) } } -void rm_filter(const CommandParameters& params) +void rm_filter(const CommandParameters& params, const Context& context) { if (params.size() != 1) throw wrong_argument_count(); - current_window->remove_filter(params[0]); + context.window->remove_filter(params[0]); } void do_command() @@ -459,7 +459,7 @@ void do_command() &CommandManager::instance(), _1, _2)); - CommandManager::instance().execute(cmdline); + CommandManager::instance().execute(cmdline, main_context); } catch (prompt_aborted&) {} } @@ -657,7 +657,7 @@ int main(int argc, char* argv[]) command_manager.register_command(std::vector<std::string>{ "rf", "rmfilter" }, rm_filter, PerArgumentCommandCompleter { [&](const std::string& prefix, size_t cursor_pos) - { return current_window->complete_filterid(prefix, cursor_pos); } + { return main_context.window->complete_filterid(prefix, cursor_pos); } }); register_filters(); @@ -665,9 +665,9 @@ int main(int argc, char* argv[]) try { auto buffer = (argc > 1) ? open_or_create(argv[1]) : new Buffer("*scratch*", Buffer::Type::Scratch); - current_window = buffer->get_or_create_window(); + main_context = Context(*buffer->get_or_create_window()); - draw_window(*current_window); + draw_window(*main_context.window); int count = 0; while(not quit_requested) { @@ -699,8 +699,8 @@ int main(int argc, char* argv[]) if (active_keymap.find(c) != active_keymap.end()) { - active_keymap[c](*current_window, count); - draw_window(*current_window); + active_keymap[c](*main_context.window, count); + draw_window(*main_context.window); } count = 0; } |
