editor_core.hpp 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. #pragma once
  2. #include "lumacs/buffer.hpp"
  3. #include "lumacs/window.hpp"
  4. #include "lumacs/theme.hpp"
  5. #include "lumacs/config.hpp"
  6. #include "lumacs/keybinding.hpp"
  7. #include "lumacs/modeline.hpp"
  8. #include "lumacs/minibuffer_manager.hpp"
  9. #include "lumacs/completion_system.hpp"
  10. #include "lumacs/ui_interface.hpp"
  11. #include "lumacs/i_command_target.hpp"
  12. #include "lumacs/plugin_manager.hpp"
  13. #include "lumacs/buffer_manager.hpp"
  14. #include "lumacs/window_manager.hpp"
  15. #include "lumacs/kill_ring_manager.hpp"
  16. #include "lumacs/register_manager.hpp"
  17. #include "lumacs/macro_manager.hpp"
  18. #include "lumacs/rectangle_manager.hpp"
  19. #include "lumacs/layout_node.hpp"
  20. #include "lumacs/i_editor_notifier.hpp"
  21. #include "lumacs/i_window_manager.hpp"
  22. #include <memory>
  23. #include <functional>
  24. namespace lumacs {
  25. class LuaApi;
  26. class CommandSystem;
  27. class PluginManager;
  28. class EditorCore : public ICommandTarget, public IEditorNotifier, public IWindowManager {
  29. public:
  30. EditorCore();
  31. ~EditorCore();
  32. EditorCore(const EditorCore&) = delete;
  33. EditorCore& operator=(const EditorCore&) = delete;
  34. EditorCore(EditorCore&&) noexcept = default;
  35. EditorCore& operator=(EditorCore&&) noexcept = default;
  36. // === ICommandTarget Implementation ===
  37. // Buffer Management (Delegated to BufferManager)
  38. [[nodiscard]] const Buffer& buffer() const noexcept override { return *buffer_manager_->active_buffer(); }
  39. [[nodiscard]] Buffer& buffer() noexcept override { return *buffer_manager_->active_buffer(); }
  40. bool load_file(const std::filesystem::path& path) override { return buffer_manager_->load_file(path); }
  41. void new_buffer(std::string name = "*scratch*") override { buffer_manager_->new_buffer(std::move(name)); }
  42. [[nodiscard]] std::vector<std::string> get_buffer_names() const override { return buffer_manager_->get_buffer_names(); }
  43. [[nodiscard]] std::shared_ptr<Buffer> get_buffer_by_name(const std::string& name) override { return buffer_manager_->get_buffer_by_name(name); }
  44. bool switch_buffer_in_window(const std::string& name) override { return buffer_manager_->switch_buffer_in_window(name); }
  45. bool close_buffer(const std::string& name) override { return buffer_manager_->close_buffer(name); }
  46. // Window Management (Delegated to WindowManager)
  47. [[nodiscard]] std::shared_ptr<Window> active_window() const override { return window_manager_->active_window(); }
  48. bool set_active_window(std::shared_ptr<Window> window) override { return window_manager_->set_active_window(window); }
  49. void split_horizontally() override { window_manager_->split_horizontally(); }
  50. void split_vertically() override { window_manager_->split_vertically(); }
  51. void close_active_window() override { window_manager_->close_active_window(); }
  52. void next_window() override { window_manager_->next_window(); }
  53. // IWindowManager implementation (helpers)
  54. void collect_windows(LayoutNode* node, std::vector<std::shared_ptr<Window>>& windows) override;
  55. std::shared_ptr<LayoutNode> root_layout() const override { return window_manager_->root_layout(); }
  56. [[nodiscard]] Position cursor() const noexcept override;
  57. void set_cursor(Position pos) override;
  58. // Basic Editing
  59. void move_up() override;
  60. void move_down() override;
  61. void move_left() override;
  62. void move_right() override;
  63. void move_to_line_start() override;
  64. void move_to_line_end() override;
  65. void move_forward_word() override;
  66. void move_backward_word() override;
  67. void page_up() override;
  68. void page_down() override;
  69. void goto_beginning() override;
  70. void goto_end() override;
  71. void goto_line(size_t line) override;
  72. // Kill Ring (Delegated to KillRingManager)
  73. void kill_line() override;
  74. void kill_region() override;
  75. void copy_region_as_kill() override;
  76. void yank() override;
  77. void yank_pop() override;
  78. void kill_word() override;
  79. void backward_kill_word() override;
  80. // Message Display
  81. void set_message(std::string msg, MessageSeverity severity = MessageSeverity::Info) override;
  82. // Quit
  83. void request_quit() override;
  84. // Configuration
  85. Config& config() override { return config_; }
  86. const Config& config() const override { return config_; }
  87. // Theme Management
  88. ThemeManager& theme_manager() override { return theme_manager_; }
  89. const ThemeManager& theme_manager() const override { return theme_manager_; }
  90. void set_theme(const std::string& theme_name); // Sets theme and emits event
  91. // Registers (Delegated to RegisterManager)
  92. void copy_to_register(char register_name, const std::string& text) override;
  93. bool insert_register(char register_name) override;
  94. void copy_region_to_register(char register_name) override;
  95. bool yank_from_register(char register_name) override;
  96. // Keyboard Macros (Delegated to MacroManager)
  97. void start_kbd_macro() override;
  98. void end_kbd_macro_or_call() override;
  99. void record_key_sequence(const std::string& key_sequence) override;
  100. [[nodiscard]] bool is_recording_macro() const noexcept override;
  101. // Rectangles (Delegated to RectangleManager)
  102. void kill_rectangle() override;
  103. void yank_rectangle() override;
  104. void string_rectangle(const std::string& text) override;
  105. // === Original EditorCore methods not part of ICommandTarget ===
  106. const std::string& last_message() const { return last_message_; }
  107. MessageSeverity last_message_severity() const { return last_message_severity_; }
  108. void check_and_clear_message();
  109. // Message history navigation (M-p/M-n)
  110. void previous_message(); // Show previous message from history
  111. void next_message(); // Show next message in history
  112. void exit_message_history(); // Exit history browsing mode
  113. [[nodiscard]] bool is_browsing_message_history() const { return message_history_index_.has_value(); }
  114. [[nodiscard]] size_t message_history_size() const { return message_history_.size(); }
  115. void enter_command_mode();
  116. void enter_buffer_switch_mode();
  117. void enter_kill_buffer_mode();
  118. void enter_find_file_mode();
  119. void enter_theme_selection_mode();
  120. void enter_isearch_mode();
  121. void enter_isearch_backward_mode();
  122. [[nodiscard]] std::vector<BufferManager::BufferInfo> get_all_buffer_info() const { return buffer_manager_->get_all_buffer_info(); }
  123. const Viewport& viewport() const noexcept;
  124. void set_viewport_size(int width, int height);
  125. void adjust_scroll();
  126. std::pair<size_t, size_t> visible_line_range() const;
  127. using EventCallback = std::function<void(EditorEvent)>;
  128. void on_event(EventCallback callback) { event_callbacks_.push_back(std::move(callback)); }
  129. void clear_event_callbacks() { event_callbacks_.clear(); }
  130. bool undo();
  131. bool redo();
  132. bool can_undo() const;
  133. bool can_redo() const;
  134. [[nodiscard]] KillRingManager& kill_ring_manager() noexcept { return *kill_ring_manager_; }
  135. [[nodiscard]] const KillRingManager& kill_ring_manager() const noexcept { return *kill_ring_manager_; }
  136. [[nodiscard]] RegisterManager& register_manager() noexcept { return *register_manager_; }
  137. [[nodiscard]] const RegisterManager& register_manager() const noexcept { return *register_manager_; }
  138. [[nodiscard]] MacroManager& macro_manager() noexcept { return *macro_manager_; }
  139. [[nodiscard]] const MacroManager& macro_manager() const noexcept { return *macro_manager_; }
  140. [[nodiscard]] RectangleManager& rectangle_manager() noexcept { return *rectangle_manager_; }
  141. [[nodiscard]] const RectangleManager& rectangle_manager() const noexcept { return *rectangle_manager_; }
  142. [[nodiscard]] KeyBindingManager& keybinding_manager() noexcept { return *keybinding_manager_; }
  143. [[nodiscard]] const KeyBindingManager& keybinding_manager() const noexcept { return *keybinding_manager_; }
  144. [[nodiscard]] LuaApi* lua_api() const { return lua_api_.get(); }
  145. [[nodiscard]] CommandSystem& command_system() noexcept { return *command_system_; }
  146. [[nodiscard]] const CommandSystem& command_system() const noexcept { return *command_system_; }
  147. [[nodiscard]] CompletionSystem& completion_system() noexcept { return *completion_system_; }
  148. [[nodiscard]] const CompletionSystem& completion_system() const noexcept { return *completion_system_; }
  149. [[nodiscard]] ModelineManager& modeline_manager() noexcept { return modeline_manager_member_; }
  150. [[nodiscard]] const ModelineManager& modeline_manager() const noexcept { return modeline_manager_member_; }
  151. [[nodiscard]] MinibufferManager& minibuffer_manager() noexcept { return *minibuffer_manager_; }
  152. [[nodiscard]] const MinibufferManager& minibuffer_manager() const noexcept { return *minibuffer_manager_; }
  153. [[nodiscard]] PluginManager& plugin_manager() noexcept { return *plugin_manager_; }
  154. [[nodiscard]] const PluginManager& plugin_manager() const noexcept { return *plugin_manager_; }
  155. [[nodiscard]] BufferManager& buffer_manager() noexcept { return *buffer_manager_; }
  156. [[nodiscard]] const BufferManager& buffer_manager() const noexcept { return *buffer_manager_; }
  157. [[nodiscard]] WindowManager& window_manager() noexcept { return *window_manager_; }
  158. [[nodiscard]] const WindowManager& window_manager() const noexcept { return *window_manager_; }
  159. /// @brief Set extended echo area lines (for packages like which-key)
  160. /// These lines appear above the main minibuffer line
  161. void set_echo_area_lines(const std::vector<std::string>& lines);
  162. /// @brief Clear extended echo area lines
  163. void clear_echo_area_lines();
  164. /// @brief Get extended echo area lines
  165. [[nodiscard]] const std::vector<std::string>& echo_area_lines() const { return echo_area_lines_; }
  166. /// @brief Check idle state and run idle hooks
  167. /// Called by UI frontends during idle time
  168. void check_idle_hooks();
  169. /// @brief Notify that user input occurred (resets idle timer)
  170. void notify_user_activity();
  171. /// @brief Get time since last user activity (milliseconds)
  172. [[nodiscard]] int64_t idle_time_ms() const;
  173. void emit_event(EditorEvent event) override;
  174. private:
  175. Position calculate_forward_word_pos(Position start_pos);
  176. Position calculate_backward_word_pos(Position start_pos);
  177. std::string last_message_;
  178. MessageSeverity last_message_severity_ = MessageSeverity::Info;
  179. std::optional<std::chrono::steady_clock::time_point> message_clear_time_;
  180. std::vector<EventCallback> event_callbacks_;
  181. // Message history for M-p/M-n navigation
  182. static constexpr size_t MAX_MESSAGE_HISTORY = 50;
  183. std::vector<std::string> message_history_;
  184. std::optional<size_t> message_history_index_; // nullopt = not browsing history
  185. // Subsystems - Order matters for initialization based on dependencies
  186. // Declared in dependency order
  187. ThemeManager theme_manager_; // No dependencies
  188. Config config_; // No dependencies
  189. ModelineManager modeline_manager_member_; // Direct member, declared here
  190. std::unique_ptr<LuaApi> lua_api_; // Depends on nothing
  191. std::unique_ptr<CompletionSystem> completion_system_; // Depends on EditorCore (this)
  192. std::unique_ptr<MinibufferManager> minibuffer_manager_; // Depends on EditorCore, LuaApi, CompletionSystem
  193. std::unique_ptr<CommandSystem> command_system_; // Depends on EditorCore, MinibufferManager
  194. std::unique_ptr<KeyBindingManager> keybinding_manager_; // Depends on CommandSystem
  195. std::unique_ptr<PluginManager> plugin_manager_; // Depends on EditorCore, LuaApi
  196. std::unique_ptr<BufferManager> buffer_manager_; // Depends on EditorCore
  197. std::unique_ptr<WindowManager> window_manager_; // Depends on EditorCore, BufferManager
  198. std::unique_ptr<KillRingManager> kill_ring_manager_; // No dependencies
  199. std::unique_ptr<RegisterManager> register_manager_; // No dependencies
  200. std::unique_ptr<MacroManager> macro_manager_; // Depends on EditorCore
  201. std::unique_ptr<RectangleManager> rectangle_manager_; // Depends on EditorCore
  202. // Extended echo area for packages like which-key
  203. std::vector<std::string> echo_area_lines_;
  204. // Idle tracking for Lua hooks
  205. std::chrono::steady_clock::time_point last_activity_time_;
  206. };
  207. } // namespace lumacs