commits 76aaa44 - c8d8dab
Key::ArrowRight == Key::None - fixed. Both were -999. None moved to -9999. Right arrow now works in keybindings.char[4096] render buffer silently truncated on large terminals. Replaced with std::string that grows as needed.current_node->action after current_node was reset to root_node. Always printed nothing. Fixed by capturing the name first.keybinds.moon was missing. All standard Emacs bindings are now embedded in the binary. The file still overrides defaults on load.Tab/ShiftTab now indents or dedents the whole block. Was a TODO before.ConfigFileTest fixture with SetUp/TearDown. ScopedEnv RAII prevents env mutation from leaking between tests. TempFile validates writes..clang-format (LLVM base, 4-space indent, 100 col).15 files changed, 1278 insertions(+), 32 deletions(-)
138K → 81K uncompressed / 37K packed
std::string output_buffer with a char[4096] stack buffer. The frame is built entirely on the stack, flushed in one write() syscall.<fstream> entirely. All file I/O (4 files: buffer, config, keybinds, history) replaced with raw POSIX open/read/write/close. No more basic_filebuf vtables.std::map + std::function → enum + switch. Action dispatch is now a flat array lookup and a jump table. No red-black tree, no type-erased function wrappers.std::shared_ptr<KeyNode> → raw linked list. The key trie uses raw pointers. No atomic reference counting on every keystroke.<ranges> → manual loops. std::views::split / drop / take replaced with index arithmetic. 6K of <ranges> template instantiations removed from .text.std::string clipboard → char* + malloc. No SSO, no std::string copy/move overhead.std::vector<Key> → Key[16] + counter. Max keychord depth is 4. Why was this a vector.constexpr C arrays. Menus, color tables, action names all baked into .rodata at compile time.std::stringstream → memchr + while loops. Config and keybind parsing now runs on raw char* buffers.<iostream> → write() syscalls. No locale init at startup. No static initializers.std::stoi + try/catch → strtol. No exception tables needed for parsing integers.color_theme, scroll_offset, font_size (stored but never used) eliminated from the Config struct.Flags used: -fno-exceptions, -fno-plt, -fno-rtti, -fno-unwind-tables, -fmerge-all-constants, -fno-unroll-loops, --icf=all, --hash-style=sysv, --gc-sections.
Sections eviscerated: .plt (624→20 bytes), .got.plt (328→20 bytes), .rela.plt (912→0 bytes), .gcc_except_table (3.4K→0 bytes), .eh_frame (5.5K→48 bytes).
10 files changed, 422 insertions(+), 356 deletions(-)
commit 6815087
Editor : private Config, private UndoHistory<>)~/.config/honeymoon/config.moon with XDG-aware path resolution and automatic directory creationtab_width, show_line_numbers, syntax_highlighting, color_theme, scroll_offset, font_size) serializes as clean key value pairs with # comment supporthello is one undo step)cut, yank, kill_line, kill_word, transpose_chars/words, indent/dedent, delete_forward/backward, newline)delete_range(0, size()) + insert_string (O(n) restore, O(1) snapshot)C-/ → undo, M-/ → redocommit 2721aac
dlopen at runtime (C, C++ grammars)transpose_words and dedent implemented (were stubs)docs/updates.html changelog pageinternals.html with std::variant state machine and tree-sitter docseditor_test.hppcommit a2a48ee
cc_library (honeymoon_lib) + cc_binary.bazelrc with build presets: fast, release, debug, asan, ubsan, tsanWORKSPACE file, added MODULE.bazel.lockcommit c1c8afd
editor.hppkeybinds.moon - all 50+ bindings in one config fileM- prefix parsing (write M-w instead of Esc w)C-x C-s)add_binding() calls removed from C++commit f38c2e5
WORKSPACE, MODULE.bazel, BUILD, .bazelrc for Bazel 9.bazelrcstd::variant + std::visitstd::views::split for line rendering