diff --git a/src/client_manager.cc b/src/client_manager.cc index fc95c118..0cf05967 100644 --- a/src/client_manager.cc +++ b/src/client_manager.cc @@ -1,10 +1,12 @@ #include "client_manager.hh" -#include "event_manager.hh" #include "buffer_manager.hh" -#include "command_manager.hh" -#include "file.hh" #include "color_registry.hh" +#include "command_manager.hh" +#include "event_manager.hh" +#include "file.hh" +#include "user_interface.hh" +#include "window.hh" namespace Kakoune { diff --git a/src/commands.cc b/src/commands.cc index 72b6d347..63ec8ddc 100644 --- a/src/commands.cc +++ b/src/commands.cc @@ -1,26 +1,28 @@ #include "commands.hh" -#include "command_manager.hh" -#include "buffer_manager.hh" -#include "option_manager.hh" -#include "context.hh" #include "buffer.hh" -#include "window.hh" +#include "buffer_manager.hh" +#include "client_manager.hh" +#include "color_registry.hh" +#include "command_manager.hh" +#include "completion.hh" +#include "context.hh" +#include "debug.hh" +#include "event_manager.hh" #include "file.hh" -#include "input_handler.hh" -#include "string.hh" +#include "filter.hh" #include "highlighter.hh" #include "highlighters.hh" -#include "filter.hh" -#include "register_manager.hh" -#include "completion.hh" -#include "shell_manager.hh" -#include "event_manager.hh" -#include "color_registry.hh" -#include "client_manager.hh" -#include "parameters_parser.hh" -#include "utf8_iterator.hh" +#include "input_handler.hh" +#include "option_manager.hh" #include "option_types.hh" +#include "parameters_parser.hh" +#include "register_manager.hh" +#include "shell_manager.hh" +#include "string.hh" +#include "user_interface.hh" +#include "utf8_iterator.hh" +#include "window.hh" #include #include diff --git a/src/context.cc b/src/context.cc new file mode 100644 index 00000000..30c56e20 --- /dev/null +++ b/src/context.cc @@ -0,0 +1,152 @@ +#include "context.hh" + +#include "input_handler.hh" +#include "user_interface.hh" +#include "window.hh" + +namespace Kakoune +{ + +Context::Context() = default; + +Context::Context(Editor& editor) + : m_editor(&editor) {} + +Context::Context(InputHandler& input_handler, UserInterface& ui) + : m_input_handler(&input_handler), m_ui(&ui) {} + +Context::~Context() = default; + +Buffer& Context::buffer() const +{ + if (not has_buffer()) + throw runtime_error("no buffer in context"); + return m_editor->buffer(); +} + +Editor& Context::editor() const +{ + if (not has_editor()) + throw runtime_error("no editor in context"); + return *m_editor.get(); +} + +Window& Context::window() const +{ + if (not has_window()) + throw runtime_error("no window in context"); + return *dynamic_cast(m_editor.get()); +} + +bool Context::has_window() const +{ + return (bool)m_editor and dynamic_cast(m_editor.get()); +} + +InputHandler& Context::input_handler() const +{ + if (not has_input_handler()) + throw runtime_error("no input handler in context"); + return *m_input_handler; +} + +UserInterface& Context::ui() const +{ + if (not has_ui()) + throw runtime_error("no user interface in context"); + return *m_ui; +} + +OptionManager& Context::options() const +{ + if (has_window()) + return window().options(); + if (has_buffer()) + return buffer().options(); + return GlobalOptions::instance(); +} + +HookManager& Context::hooks() const +{ + if (has_window()) + return window().hooks(); + if (has_buffer()) + return buffer().hooks(); + return GlobalHooks::instance(); +} + +void Context::print_status(const DisplayLine& status) const +{ + if (has_ui()) + ui().print_status(status); +} + +void Context::push_jump() +{ + const SelectionList& jump = editor().selections(); + if (m_current_jump != m_jump_list.end()) + { + auto begin = m_current_jump; + if (&editor().buffer() != &begin->buffer() or + (const SelectionList&)(*begin) != jump) + ++begin; + m_jump_list.erase(begin, m_jump_list.end()); + } + m_jump_list.erase(std::remove(begin(m_jump_list), end(m_jump_list), jump), + end(m_jump_list)); + m_jump_list.push_back({editor().buffer(), jump}); + m_current_jump = m_jump_list.end(); +} + +const SelectionList& Context::jump_forward() +{ + if (m_current_jump != m_jump_list.end() and + m_current_jump + 1 != m_jump_list.end()) + return *++m_current_jump; + throw runtime_error("no next jump"); +} + +const SelectionList& Context::jump_backward() +{ + if (m_current_jump != m_jump_list.begin()) + { + if (m_current_jump == m_jump_list.end()) + { + push_jump(); + --m_current_jump; + } + return *--m_current_jump; + } + throw runtime_error("no previous jump"); +} + +void Context::forget_jumps_to_buffer(Buffer& buffer) +{ + for (auto it = m_jump_list.begin(); it != m_jump_list.end();) + { + if (&it->buffer() == &buffer) + { + if (it < m_current_jump) + --m_current_jump; + else if (it == m_current_jump) + m_current_jump = m_jump_list.end()-1; + + it = m_jump_list.erase(it); + } + else + ++it; + } +} + +void Context::change_editor(Editor& editor) +{ + m_editor.reset(&editor); + if (has_window()) + { + if (has_ui()) + window().set_dimensions(ui().dimensions()); + window().hooks().run_hook("WinDisplay", buffer().name(), *this); + } +} + +} diff --git a/src/context.hh b/src/context.hh index b4442e5f..1217df3a 100644 --- a/src/context.hh +++ b/src/context.hh @@ -1,13 +1,17 @@ #ifndef context_hh_INCLUDED #define context_hh_INCLUDED -#include "window.hh" -#include "user_interface.hh" +#include "dynamic_selection_list.hh" namespace Kakoune { +class Editor; +class Window; +class Buffer; class InputHandler; +class UserInterface; +class DisplayLine; // A Context is used to access non singleton objects for various services // in commands. @@ -17,151 +21,45 @@ class InputHandler; // a hook execution or a macro replay. struct Context { - Context() {} - explicit Context(Editor& editor) - : m_editor(&editor) {} - Context(InputHandler& input_handler, UserInterface& ui) - : m_input_handler(&input_handler), m_ui(&ui) {} + Context(); + explicit Context(Editor& editor); + Context(InputHandler& input_handler, UserInterface& ui); + ~Context(); Context(const Context&) = delete; Context& operator=(const Context&) = delete; - Buffer& buffer() const - { - if (not has_buffer()) - throw runtime_error("no buffer in context"); - return m_editor->buffer(); - } + Buffer& buffer() const; bool has_buffer() const { return (bool)m_editor; } - Editor& editor() const - { - if (not has_editor()) - throw runtime_error("no editor in context"); - return *m_editor.get(); - } + Editor& editor() const; bool has_editor() const { return (bool)m_editor; } - Window& window() const - { - if (not has_window()) - throw runtime_error("no window in context"); - return *dynamic_cast(m_editor.get()); - } - bool has_window() const { return (bool)m_editor and dynamic_cast(m_editor.get()); } + Window& window() const; + bool has_window() const; - InputHandler& input_handler() const - { - if (not has_input_handler()) - throw runtime_error("no input handler in context"); - return *m_input_handler; - } + InputHandler& input_handler() const; bool has_input_handler() const { return (bool)m_input_handler; } - UserInterface& ui() const - { - if (not has_ui()) - throw runtime_error("no user interface in context"); - return *m_ui; - } + UserInterface& ui() const; bool has_ui() const { return (bool)m_ui; } - void change_editor(Editor& editor) - { - m_editor.reset(&editor); - if (has_window()) - { - if (has_ui()) - window().set_dimensions(ui().dimensions()); - window().hooks().run_hook("WinDisplay", buffer().name(), *this); - } - } + void change_editor(Editor& editor); - OptionManager& options() const - { - if (has_window()) - return window().options(); - if (has_buffer()) - return buffer().options(); - return GlobalOptions::instance(); - } + OptionManager& options() const; + HookManager& hooks() const; - HookManager& hooks() const - { - if (has_window()) - return window().hooks(); - if (has_buffer()) - return buffer().hooks(); - return GlobalHooks::instance(); - } + void print_status(const DisplayLine& status) const; - void print_status(const DisplayLine& status) const - { - if (has_ui()) - ui().print_status(status); - } - - void push_jump() - { - const SelectionList& jump = editor().selections(); - if (m_current_jump != m_jump_list.end()) - { - auto begin = m_current_jump; - if (&editor().buffer() != &begin->buffer() or - (const SelectionList&)(*begin) != jump) - ++begin; - m_jump_list.erase(begin, m_jump_list.end()); - } - m_jump_list.erase(std::remove(begin(m_jump_list), end(m_jump_list), jump), - end(m_jump_list)); - m_jump_list.push_back({editor().buffer(), jump}); - m_current_jump = m_jump_list.end(); - } - - const SelectionList& jump_forward() - { - if (m_current_jump != m_jump_list.end() and - m_current_jump + 1 != m_jump_list.end()) - return *++m_current_jump; - throw runtime_error("no next jump"); - } - - const SelectionList& jump_backward() - { - if (m_current_jump != m_jump_list.begin()) - { - if (m_current_jump == m_jump_list.end()) - { - push_jump(); - --m_current_jump; - } - return *--m_current_jump; - } - throw runtime_error("no previous jump"); - } - - void forget_jumps_to_buffer(Buffer& buffer) - { - for (auto it = m_jump_list.begin(); it != m_jump_list.end();) - { - if (&it->buffer() == &buffer) - { - if (it < m_current_jump) - --m_current_jump; - else if (it == m_current_jump) - m_current_jump = m_jump_list.end()-1; - - it = m_jump_list.erase(it); - } - else - ++it; - } - } + void push_jump(); + const SelectionList& jump_forward(); + const SelectionList& jump_backward(); + void forget_jumps_to_buffer(Buffer& buffer); int& numeric_param() { return m_numeric_param; } private: safe_ptr m_editor; - InputHandler* m_input_handler = nullptr; + safe_ptr m_input_handler; safe_ptr m_ui; int m_numeric_param = 0; diff --git a/src/highlighters.cc b/src/highlighters.cc index ae0591f0..0e56d1e2 100644 --- a/src/highlighters.cc +++ b/src/highlighters.cc @@ -1,13 +1,14 @@ #include "highlighters.hh" + #include "assert.hh" #include "color_registry.hh" -#include "register_manager.hh" #include "context.hh" +#include "option_types.hh" +#include "register_manager.hh" #include "string.hh" #include "utf8.hh" #include "utf8_iterator.hh" - -#include "option_types.hh" +#include "window.hh" #include #include diff --git a/src/input_handler.cc b/src/input_handler.cc index a8b161cb..c8a1466f 100644 --- a/src/input_handler.cc +++ b/src/input_handler.cc @@ -1,11 +1,13 @@ #include "input_handler.hh" +#include "color_registry.hh" #include "context.hh" #include "editor.hh" -#include "register_manager.hh" #include "event_manager.hh" +#include "register_manager.hh" +#include "user_interface.hh" #include "utf8.hh" -#include "color_registry.hh" +#include "window.hh" #include diff --git a/src/input_handler.hh b/src/input_handler.hh index 7b2d771f..5dccced1 100644 --- a/src/input_handler.hh +++ b/src/input_handler.hh @@ -1,11 +1,13 @@ #ifndef input_handler_hh_INCLUDED #define input_handler_hh_INCLUDED -#include "keys.hh" +#include "color.hh" #include "completion.hh" -#include "utils.hh" -#include "string.hh" #include "context.hh" +#include "editor.hh" +#include "keys.hh" +#include "string.hh" +#include "utils.hh" namespace Kakoune {