mode_activator.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143
  1. #include "lumacs/mode_activator.hpp"
  2. #include "lumacs/editor_core.hpp"
  3. #include "lumacs/minibuffer_manager.hpp"
  4. #include "lumacs/lua_api.hpp"
  5. #include <algorithm>
  6. namespace lumacs {
  7. ModeActivator::ModeActivator(EditorCore& core)
  8. : core_(core) {}
  9. bool ModeActivator::handle_mode_event(EditorEvent event, QuitCallback quit_callback) {
  10. switch (event) {
  11. case EditorEvent::CommandMode:
  12. activate_command_mode(quit_callback);
  13. return true;
  14. case EditorEvent::BufferSwitchMode:
  15. activate_buffer_switch_mode();
  16. return true;
  17. case EditorEvent::KillBufferMode:
  18. activate_kill_buffer_mode();
  19. return true;
  20. case EditorEvent::FindFileMode:
  21. activate_find_file_mode();
  22. return true;
  23. case EditorEvent::ThemeSelectionMode:
  24. activate_theme_selection_mode();
  25. return true;
  26. case EditorEvent::ISearchMode:
  27. activate_isearch_mode(true);
  28. return true;
  29. case EditorEvent::ISearchBackwardMode:
  30. activate_isearch_mode(false);
  31. return true;
  32. default:
  33. return false;
  34. }
  35. }
  36. void ModeActivator::activate_command_mode(QuitCallback quit_callback) {
  37. core_.minibuffer_manager().activate_minibuffer(
  38. MinibufferMode::Command, "M-x ",
  39. [this, quit_callback](const std::string& input) {
  40. if (input == "q" || input == "quit") {
  41. if (quit_callback) {
  42. quit_callback();
  43. }
  44. } else {
  45. auto result = core_.minibuffer_manager().parse_and_execute_command_string(input);
  46. core_.set_message(result.message);
  47. }
  48. },
  49. [this]() { core_.set_message("Cancelled"); }
  50. );
  51. }
  52. void ModeActivator::activate_buffer_switch_mode() {
  53. core_.minibuffer_manager().activate_minibuffer(
  54. MinibufferMode::BufferName, "Switch to buffer: ",
  55. [this](const std::string& input) {
  56. if (core_.switch_buffer_in_window(input)) {
  57. core_.set_message("Switched to: " + input);
  58. // Trigger major mode auto-activation
  59. if (core_.lua_api()) {
  60. core_.lua_api()->execute("auto_activate_major_mode()");
  61. }
  62. } else {
  63. core_.set_message("Buffer not found: " + input);
  64. }
  65. },
  66. [this]() { core_.set_message("Cancelled"); }
  67. );
  68. }
  69. void ModeActivator::activate_kill_buffer_mode() {
  70. core_.minibuffer_manager().activate_minibuffer(
  71. MinibufferMode::BufferName, "Kill buffer: ",
  72. [this](const std::string& input) {
  73. if (core_.close_buffer(input)) {
  74. core_.set_message("Killed buffer: " + input);
  75. } else {
  76. core_.set_message("Failed to kill buffer: " + input);
  77. }
  78. },
  79. [this]() { core_.set_message("Cancelled"); }
  80. );
  81. }
  82. void ModeActivator::activate_find_file_mode() {
  83. core_.minibuffer_manager().activate_minibuffer(
  84. MinibufferMode::FilePath, "Find file: ",
  85. [this](const std::string& input) {
  86. if (core_.load_file(input)) {
  87. core_.set_message("Loaded: " + input);
  88. // Trigger major mode auto-activation
  89. if (core_.lua_api()) {
  90. core_.lua_api()->execute("auto_activate_major_mode()");
  91. }
  92. } else {
  93. core_.set_message("Failed to load: " + input);
  94. }
  95. },
  96. [this]() { core_.set_message("Cancelled"); }
  97. );
  98. }
  99. void ModeActivator::activate_theme_selection_mode() {
  100. core_.minibuffer_manager().activate_minibuffer(
  101. MinibufferMode::ThemeName, "Set theme: ",
  102. [this](const std::string& input) {
  103. auto theme_names = core_.theme_manager().theme_names();
  104. auto it = std::find(theme_names.begin(), theme_names.end(), input);
  105. if (it != theme_names.end()) {
  106. core_.theme_manager().set_active_theme(input);
  107. core_.set_message("Switched to theme: " + input);
  108. } else {
  109. core_.set_message("Theme not found: " + input);
  110. }
  111. },
  112. [this]() { core_.set_message("Cancelled"); }
  113. );
  114. }
  115. void ModeActivator::activate_isearch_mode(bool forward) {
  116. std::string prompt = forward ? "I-search: " : "I-search backward: ";
  117. std::string cancel_msg = forward ? "Cancelled I-search" : "Cancelled I-search backward";
  118. core_.minibuffer_manager().activate_minibuffer(
  119. MinibufferMode::ISearch, prompt,
  120. [](const std::string&) { /* Submit handled by return key in isearch */ },
  121. [this, cancel_msg]() { core_.set_message(cancel_msg); }
  122. );
  123. core_.minibuffer_manager().start_isearch(forward);
  124. }
  125. } // namespace lumacs