summaryrefslogtreecommitdiff
path: root/src/debug.cc
diff options
context:
space:
mode:
authorMaxime Coste <mawww@kakoune.org>2024-08-10 11:26:26 +1000
committerMaxime Coste <mawww@kakoune.org>2024-08-12 20:02:11 +1000
commit560e3631ec57d34c679e6b0faec1e0efdd18d915 (patch)
tree4b4e00ab1fefaaa4a98b3d6a7c46fab50120fd8b /src/debug.cc
parent6ed01f402b3a54495c8d9e462b7674864fbbe402 (diff)
Move debug utils to debug.hh/debug.cc
Lots of code includes buffer_utils.hh just for write_to_debug_buffer which pulls many unnecessary dependencies. Reorganise to reduce compile times.
Diffstat (limited to 'src/debug.cc')
-rw-r--r--src/debug.cc39
1 files changed, 39 insertions, 0 deletions
diff --git a/src/debug.cc b/src/debug.cc
new file mode 100644
index 00000000..55f7e4d3
--- /dev/null
+++ b/src/debug.cc
@@ -0,0 +1,39 @@
+#include "debug.hh"
+
+#include "buffer_manager.hh"
+#include "buffer_utils.hh"
+#include "utils.hh"
+
+namespace Kakoune
+{
+
+void write_to_debug_buffer(StringView str)
+{
+ if (not BufferManager::has_instance())
+ {
+ write(2, str);
+ write(2, "\n");
+ return;
+ }
+
+ constexpr StringView debug_buffer_name = "*debug*";
+ // Try to ensure we keep an empty line at the end of the debug buffer
+ // where the user can put its cursor to scroll with new messages
+ const bool eol_back = not str.empty() and str.back() == '\n';
+ if (Buffer* buffer = BufferManager::instance().get_buffer_ifp(debug_buffer_name))
+ {
+ buffer->flags() &= ~Buffer::Flags::ReadOnly;
+ auto restore = on_scope_end([buffer] { buffer->flags() |= Buffer::Flags::ReadOnly; });
+
+ buffer->insert(buffer->back_coord(), eol_back ? str : str + "\n");
+ }
+ else
+ {
+ String line = str + (eol_back ? "\n" : "\n\n");
+ create_buffer_from_string(
+ debug_buffer_name.str(), Buffer::Flags::NoUndo | Buffer::Flags::Debug | Buffer::Flags::ReadOnly,
+ line);
+ }
+}
+
+}