Add SmartNewline command with tests and editor integration

- Introduced `CommandId::SmartNewline` for auto-indented newlines, enhancing text editing workflows.
- Added `cmd_smart_newline` to implement indentation-aware newline logic.
- Integrated SmartNewline with keymaps, mouse/keyboard input handlers, and terminal/editor commands.
- Wrote comprehensive tests in `test_smart_newline.cc` to validate behavior for spaces, tabs, and no-indentation cases.
- Updated `Command.h` and `CMakeLists.txt` to register and build the new command.
This commit is contained in:
2026-02-26 13:08:56 -08:00
parent 690c51b0f3
commit bc3433e988
8 changed files with 206 additions and 38 deletions

View File

@@ -0,0 +1,79 @@
#include "Test.h"
#include "Buffer.h"
#include "Editor.h"
#include "Command.h"
#include <string>
TEST (SmartNewline_AutoIndent)
{
Editor editor;
InstallDefaultCommands();
Buffer &buf = editor.Buffers().emplace_back();
// Set up initial state: " line1"
buf.insert_text(0, 0, " line1");
buf.SetCursor(7, 0); // At end of line
// Execute SmartNewline
bool ok = Execute(editor, CommandId::SmartNewline);
ASSERT_TRUE(ok);
// Should have two lines now
ASSERT_EQ(buf.Nrows(), 2);
// Line 0 remains " line1"
ASSERT_EQ(buf.GetLineString(0), " line1");
// Line 1 should have " " (two spaces)
ASSERT_EQ(buf.GetLineString(1), " ");
// Cursor should be at (2, 1)
ASSERT_EQ(buf.Curx(), 2);
ASSERT_EQ(buf.Cury(), 1);
}
TEST (SmartNewline_TabIndent)
{
Editor editor;
InstallDefaultCommands();
Buffer &buf = editor.Buffers().emplace_back();
// Set up initial state: "\tline1"
buf.insert_text(0, 0, "\tline1");
buf.SetCursor(6, 0); // At end of line
// Execute SmartNewline
bool ok = Execute(editor, CommandId::SmartNewline);
ASSERT_TRUE(ok);
// Should have two lines now
ASSERT_EQ(buf.Nrows(), 2);
// Line 1 should have "\t"
ASSERT_EQ(buf.GetLineString(1), "\t");
// Cursor should be at (1, 1)
ASSERT_EQ(buf.Curx(), 1);
ASSERT_EQ(buf.Cury(), 1);
}
TEST (SmartNewline_NoIndent)
{
Editor editor;
InstallDefaultCommands();
Buffer &buf = editor.Buffers().emplace_back();
// Set up initial state: "line1"
buf.insert_text(0, 0, "line1");
buf.SetCursor(5, 0); // At end of line
// Execute SmartNewline
bool ok = Execute(editor, CommandId::SmartNewline);
ASSERT_TRUE(ok);
// Should have two lines now
ASSERT_EQ(buf.Nrows(), 2);
// Line 1 should be empty
ASSERT_EQ(buf.GetLineString(1), "");
// Cursor should be at (0, 1)
ASSERT_EQ(buf.Curx(), 0);
ASSERT_EQ(buf.Cury(), 1);
}