From 6d3625f62cc41bd82561bc76ffe5d7ba4b06bc05 Mon Sep 17 00:00:00 2001 From: Bojan Milevski Date: Mon, 29 Dec 2025 20:54:09 +0100 Subject: [PATCH 1/4] Added `ZQ` and `ZZ` normal mode bindings --- src/config.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/config.c b/src/config.c index 6857b4f..cd4458c 100644 --- a/src/config.c +++ b/src/config.c @@ -81,6 +81,11 @@ void normal_mode_bindings() { cmapn(".", "repeat"); cmapn("q", "record"); cmapn("@", "play"); + cmapn("ZQ", "q!"); + cmapn("ZZ", "wq"); // not quite the same as in neovim + // ZZ in neovim writes to disk only if changes are made + // whereas :wq always writes to disk + /* $, 0, w, b, e movements now handled by text object fallback */ mapn("%", buf_find_matching_bracket, "match bracket"); mapv("%", buf_find_matching_bracket, "match bracket"); From d5918faab8dd8720ef548d3de8d036f165df63ef Mon Sep 17 00:00:00 2001 From: Bojan Milevski Date: Tue, 30 Dec 2025 21:20:32 +0100 Subject: [PATCH 2/4] Implemented 3 keystrokes - `D` to delete from current position, to end of line - `C` to change text from current position, to end of line - `S` to change a line --- src/buf/buf_helpers.c | 13 +++++++++++++ src/buf/buf_helpers.h | Bin 5258 -> 5293 bytes src/config.c | 5 +++++ src/keybinds_builtins.c | 11 +++++++++++ src/keybinds_builtins.h | 1 + test/test_textobj | Bin 66936 -> 68904 bytes 6 files changed, 30 insertions(+) diff --git a/src/buf/buf_helpers.c b/src/buf/buf_helpers.c index 905cb67..0d15bba 100644 --- a/src/buf/buf_helpers.c +++ b/src/buf/buf_helpers.c @@ -771,6 +771,19 @@ void buf_change_line(void) { buf_change_selection(&sel); } +void buf_change_to_line_end(void) { + Buffer *buf = buf_cur(); + Window *win = window_cur(); + if (!PTR_VALID(buf) || !PTR_VALID(win)) + return; + + TextSelection sel; + if (!textobj_to_line_end(buf, win->cursor.y, win->cursor.x, &sel)) + return; + + buf_change_selection(&sel); + win->cursor.x = sel.start.col; +} void buf_move_cursor_key(int key) { BUFWIN(buf, win); diff --git a/src/buf/buf_helpers.h b/src/buf/buf_helpers.h index 83de9b316fc3d10bbd9631222c9fdf36b2a6cadc..2260108b35dc357233264af6270ff35afe074d31 100644 GIT binary patch delta 51 zcmeCuT&uaENkqFWKQl!ksWdGLmNrZz-IW;dOGmQ%XFE|Ai diff --git a/src/config.c b/src/config.c index cd4458c..01911ca 100644 --- a/src/config.c +++ b/src/config.c @@ -167,6 +167,11 @@ void normal_mode_bindings() { mapn("zR", kb_fold_open_all, "open all folds"); mapn("zz", buf_center_screen, "center screen"); mapn("~", kb_toggle_case, "toggle case"); + + // one-offs + mapn("D", kb_delete_to_line_end, "del to line end"); + mapn("C", buf_change_to_line_end, "change to line end"); + mapn("S", buf_change_line, "change line"); } void user_keybinds_init(void) { diff --git a/src/keybinds_builtins.c b/src/keybinds_builtins.c index 5a510b6..2d4d6ab 100644 --- a/src/keybinds_builtins.c +++ b/src/keybinds_builtins.c @@ -318,6 +318,17 @@ void kb_delete_line(void) { buf_delete_selection(&sel); } +void kb_delete_to_line_end(void) { + ASSERT_EDIT(buf, win); + + TextSelection sel; + if (!textobj_to_line_end(buf, win->cursor.y, win->cursor.x, &sel)) + return; + + buf_delete_selection(&sel); + win->cursor.x = sel.start.col > 0 ? sel.start.col - 1 : 0; +} + void kb_yank_line(void) { BUFWIN(buf, win) buf_yank_line_in(buf); diff --git a/src/keybinds_builtins.h b/src/keybinds_builtins.h index 52aad64..f6da0e6 100644 --- a/src/keybinds_builtins.h +++ b/src/keybinds_builtins.h @@ -17,6 +17,7 @@ void kb_enter_insert_mode(void); void kb_append_mode(void); void kb_enter_command_mode(void); void kb_delete_line(void); +void kb_delete_to_line_end(void); void kb_yank_line(void); void kb_paste(void); void kb_delete_char(void); diff --git a/test/test_textobj b/test/test_textobj index 21d76157688d90373c067a6057908ba5880f2439..c7cfde03d9c37d66f57b33316f665a6d94ffce9f 100755 GIT binary patch delta 17586 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 r`grcVrZpF?e;Q4%&NsDYCag(&pgNyX delta 14092 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

h2v=~;i2^faa@juHvU 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 Date: Tue, 30 Dec 2025 21:22:53 +0100 Subject: [PATCH 3/4] Properly implemented `cc`/`C` keystrokes --- src/buf/buf_helpers.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/buf/buf_helpers.c b/src/buf/buf_helpers.c index 0d15bba..07e42fb 100644 --- a/src/buf/buf_helpers.c +++ b/src/buf/buf_helpers.c @@ -769,6 +769,7 @@ void buf_change_line(void) { return; buf_change_selection(&sel); + win->cursor.x = 0; } void buf_change_to_line_end(void) { From 6ed8889847b7cc02470cc0e2cb33d4dbc49337cc Mon Sep 17 00:00:00 2001 From: Bojan Milevski Date: Thu, 1 Jan 2026 15:23:30 +0100 Subject: [PATCH 4/4] Properly implemented `O` --- src/commands/cmd_misc.c | 1 + 1 file changed, 1 insertion(+) diff --git a/src/commands/cmd_misc.c b/src/commands/cmd_misc.c index 17da287..2f67164 100644 --- a/src/commands/cmd_misc.c +++ b/src/commands/cmd_misc.c @@ -573,6 +573,7 @@ void cmd_new_line_above(const char *args) { win->cursor.x = 0; buf_insert_newline_in(buf); + win->cursor.y--; /* Cursor should now be on the new blank line above */ ed_set_mode(MODE_INSERT); }