Просмотр исходного кода

feat(core): implement *Messages* buffer for persistent logging

Updated EditorCore::set_message to append all messages to a *Messages* buffer. This ensures that minibuffer output is preserved and can be reviewed by the user, addressing visibility issues with transient messages.
Bernardo Magri 1 месяц назад
Родитель
Сommit
5198c07ecf
2 измененных файлов с 18 добавлено и 0 удалено
  1. 1 0
      documentation/PLAN.md
  2. 17 0
      src/editor_core.cpp

+ 1 - 0
documentation/PLAN.md

@@ -140,6 +140,7 @@ Lumacs/
     - **Advanced Completion UI**: Completed (Implemented popup completion window with descriptions and better visual feedback).
     - **Minibuffer & Popover Polish**: ✅ Fixed. Exposed ISearch direction control, fixed TUI rendering and Backspace, fixed GTK minibuffer double-rendering and disappearance, polished GTK Popover positioning and focus management, fixed GTK crash on completion mismatch, and fixed minibuffer cursor not moving after Tab completion.
     - [x] **GTK Completion Popover**: Disabled by default via Lua configuration (user request).
+    - [x] **Persistent Messages**: Implemented `*Messages*` buffer to log all minibuffer outputs, ensuring history is accessible via buffer switching.
 - ✅ **Theme System Refactoring**:
     - [x] Implemented `editor:create_and_register_theme` Lua API to allow theme definition from Lua.
     - [x] Factored all hardcoded C++ themes (`default`, `everforest-dark`, `dracula`, `solarized-dark`, `nord`, `gruvbox-light`) into individual Lua files (`lua/themes/*.lua`).

+ 17 - 0
src/editor_core.cpp

@@ -701,6 +701,23 @@ void EditorCore::collect_windows(LayoutNode* node, std::vector<std::shared_ptr<W
 }
 
 void EditorCore::set_message(std::string msg) {
+    // Log to *Messages* buffer
+    if (buffer_manager_) {
+        auto messages_buf = buffer_manager_->get_buffer_by_name("*Messages*");
+        if (!messages_buf) {
+            messages_buf = buffer_manager_->create_buffer_no_window("*Messages*");
+        }
+
+        if (messages_buf) {
+            size_t last_line = messages_buf->line_count() > 0 ? messages_buf->line_count() - 1 : 0;
+            size_t last_col = 0;
+            if (messages_buf->line_count() > 0) {
+                last_col = messages_buf->lines().back().length();
+            }
+            messages_buf->insert({last_line, last_col}, msg + "\n");
+        }
+    }
+
     last_message_ = std::move(msg);
     message_clear_time_ = std::chrono::steady_clock::now() + std::chrono::seconds(3);
     emit_event(EditorEvent::Message);