From 6c200f77642ddd9ffd6d0eaeb151fc5c2b25b352 Mon Sep 17 00:00:00 2001 From: Krzosa Karol Date: Thu, 15 Jan 2026 23:26:14 +0100 Subject: [PATCH] plugin_basic_commands.cpp --- src/text_editor/plugin_basic_commands.cpp | 290 ++++++++++++++++++++++ 1 file changed, 290 insertions(+) create mode 100644 src/text_editor/plugin_basic_commands.cpp diff --git a/src/text_editor/plugin_basic_commands.cpp b/src/text_editor/plugin_basic_commands.cpp new file mode 100644 index 0000000..13e75b4 --- /dev/null +++ b/src/text_editor/plugin_basic_commands.cpp @@ -0,0 +1,290 @@ +void MoveCursorByPageSize(Window *window, int direction, bool shift = false) { + Assert(direction == DIR_UP || direction == DIR_DOWN); + BSet set = GetBSet(window); + + Rect2I visible_cells_rect = GetVisibleCells(window); + Int y = GetSize(visible_cells_rect).y - 2; + if (direction == DIR_UP) y = -y; + + For(set.view->carets) { + XY xy = PosToXY(set.buffer, GetFront(it)); + if (direction == DIR_DOWN && xy.line == set.buffer->line_starts.len - 1) { + Range line_range = GetLineRange(set.buffer, xy.line); + xy.col = line_range.max - line_range.min; + } else if (direction == DIR_UP && xy.line == 0) { + xy.col = 0; + } + xy.line += y; + + Int pos = XYToPos(set.buffer, xy); + if (shift) { + it = SetFront(it, pos); + } else { + it = MakeCaret(pos); + } + } +} + +void CMD_Redo() { + BSet active = GetBSet(ActiveWindowID); + RedoEdit(active.buffer, &active.view->carets); +} RegisterCommand(CMD_Redo, "ctrl-shift-z", "Redo after undoing changes to the buffer"); + +void CMD_Undo() { + BSet active = GetBSet(ActiveWindowID); + UndoEdit(active.buffer, &active.view->carets); +} RegisterCommand(CMD_Undo, "ctrl-z", "Undo last change you made to the buffer"); + +void CMD_EncloseLine() { + BSet active = GetBSet(ActiveWindowID); + EncloseLine(active.view); +} RegisterCommand(CMD_EncloseLine, "ctrl-l", "Select the entire line on which your caret is placed"); + +void CMD_SelectAll() { + BSet active = GetBSet(ActiveWindowID); + SelectEntireBuffer(active.view); + active.view->update_scroll = false; +} RegisterCommand(CMD_SelectAll, "ctrl-a", "Select the entire buffer"); + +void CMD_KillSelectedLines() { + BSet active = GetBSet(ActiveWindowID); + KillSelectedLines(active.view); +} RegisterCommand(CMD_KillSelectedLines, "ctrl-shift-k"); + +void CMD_IndentSelectedLines() { + BSet active = GetBSet(ActiveWindowID); + IndentSelectedLines(active.view); +} RegisterCommand(CMD_IndentSelectedLines, "ctrl-rightbracket | tab"); + +void CMD_DedentSelectedLines() { + BSet active = GetBSet(ActiveWindowID); + IndentSelectedLines(active.view, true); +} RegisterCommand(CMD_DedentSelectedLines, "ctrl-leftbracket | shift-tab"); + +void CMD_DuplicateLineDown() { + BSet active = GetBSet(ActiveWindowID); + DuplicateLine(active.view, DIR_DOWN); +} RegisterCommand(CMD_DuplicateLineDown, "ctrl-alt-down"); + +void CMD_CreateCursorDown() { + BSet active = GetBSet(ActiveWindowID); + CreateCursorVertical(active.view, DIR_DOWN); +} RegisterCommand(CMD_CreateCursorDown, "alt-shift-down"); + +void CMD_SelectDownToEmptyLine() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_DOWN, CTRL_PRESSED, SHIFT_PRESS); +} RegisterCommand(CMD_SelectDownToEmptyLine, "ctrl-shift-down"); + +void CMD_MoveLineDown() { + BSet active = GetBSet(ActiveWindowID); + MoveCaretsLine(active.view, DIR_DOWN); +} RegisterCommand(CMD_MoveLineDown, "alt-down"); + +void CMD_MoveDownToEmptyLine() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_DOWN, CTRL_PRESSED); +} RegisterCommand(CMD_MoveDownToEmptyLine, "ctrl-down"); + +void CMD_SelectDown() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_DOWN, false, SHIFT_PRESS); +} RegisterCommand(CMD_SelectDown, "shift-down"); + +void CMD_MoveDown() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_DOWN); +} RegisterCommand(CMD_MoveDown, "down"); + +void CMD_DuplicateLineUp() { + BSet active = GetBSet(ActiveWindowID); + DuplicateLine(active.view, DIR_UP); +} RegisterCommand(CMD_DuplicateLineUp, "ctrl-alt-up"); + +void CMD_CreateCursorUp() { + BSet active = GetBSet(ActiveWindowID); + CreateCursorVertical(active.view, DIR_UP); +} RegisterCommand(CMD_CreateCursorUp, "alt-shift-up"); + +void CMD_SelectUpToEmptyLine() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_UP, CTRL_PRESSED, SHIFT_PRESS); +} RegisterCommand(CMD_SelectUpToEmptyLine, "ctrl-shift-up"); + +void CMD_MoveLineUp() { + BSet active = GetBSet(ActiveWindowID); + MoveCaretsLine(active.view, DIR_UP); +} RegisterCommand(CMD_MoveLineUp, "alt-up"); + +void CMD_MoveUpToEmptyLine() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_UP, CTRL_PRESSED); +} RegisterCommand(CMD_MoveUpToEmptyLine, "ctrl-up"); + +void CMD_SelectUp() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_UP, false, SHIFT_PRESS); +} RegisterCommand(CMD_SelectUp, "shift-up"); + +void CMD_MoveUp() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_UP); +} RegisterCommand(CMD_MoveUp, "up"); + +void CMD_BoundarySelectLeft() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_LEFT, CTRL_PRESSED, SHIFT_PRESS); +} RegisterCommand(CMD_BoundarySelectLeft, "ctrl-shift-left"); + +void CMD_BoundaryMoveLeft() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_LEFT, CTRL_PRESSED); +} RegisterCommand(CMD_BoundaryMoveLeft, "ctrl-left"); + +void CMD_SelectLeft() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_LEFT, false, SHIFT_PRESS); +} RegisterCommand(CMD_SelectLeft, "shift-left"); + +void CMD_MoveLeft() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_LEFT); +} RegisterCommand(CMD_MoveLeft, "left"); + +void CMD_BoundarySelectRight() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_RIGHT, CTRL_PRESSED, SHIFT_PRESS); +} RegisterCommand(CMD_BoundarySelectRight, "ctrl-shift-right"); + +void CMD_BoundaryMoveRight() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_RIGHT, CTRL_PRESSED); +} RegisterCommand(CMD_BoundaryMoveRight, "ctrl-right"); + +void CMD_SelectRight() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_RIGHT, false, SHIFT_PRESS); +} RegisterCommand(CMD_SelectRight, "shift-right"); + +void CMD_MoveRight() { + BSet active = GetBSet(ActiveWindowID); + MoveCarets(active.view, DIR_RIGHT); +} RegisterCommand(CMD_MoveRight, "right"); + +void CMD_MoveUpAPage() { + BSet active = GetBSet(ActiveWindowID); + MoveCursorByPageSize(active.window, DIR_UP); +} RegisterCommand(CMD_MoveUpAPage, "pageup"); + +void CMD_SelectUpPage() { + BSet active = GetBSet(ActiveWindowID); + MoveCursorByPageSize(active.window, DIR_UP, SHIFT_PRESS); +} RegisterCommand(CMD_SelectUpPage, "shift-pageup"); + +void CMD_MoveToStart() { + BSet active = GetBSet(ActiveWindowID); + SelectRange(active.view, MakeRange(0)); +} RegisterCommand(CMD_MoveToStart, "ctrl-pageup"); + +void CMD_SelectDownPage() { + BSet active = GetBSet(ActiveWindowID); + MoveCursorByPageSize(active.window, DIR_DOWN, SHIFT_PRESS); +} RegisterCommand(CMD_SelectDownPage, "shift-pagedown"); + +void CMD_MoveToEnd() { + BSet active = GetBSet(ActiveWindowID); + SelectRange(active.view, MakeRange(active.buffer->len)); +} RegisterCommand(CMD_MoveToEnd, "ctrl-pagedown"); + +void CMD_MoveDownPage() { + BSet active = GetBSet(ActiveWindowID); + MoveCursorByPageSize(active.window, DIR_DOWN); +} RegisterCommand(CMD_MoveDownPage, "pagedown"); + +void CMD_SelectToLineStart() { + BSet active = GetBSet(ActiveWindowID); + MoveCursorToSide(active.view, DIR_LEFT, SHIFT_PRESS); +} RegisterCommand(CMD_SelectToLineStart, "shift-home"); + +void CMD_MoveToLineStart() { + BSet active = GetBSet(ActiveWindowID); + MoveCursorToSide(active.view, DIR_LEFT); +} RegisterCommand(CMD_MoveToLineStart, "home"); + +void CMD_MoveToLineEnd() { + BSet active = GetBSet(ActiveWindowID); + MoveCursorToSide(active.view, DIR_RIGHT); +} RegisterCommand(CMD_MoveToLineEnd, "end"); + +void CMD_SelectToLineEnd() { + BSet active = GetBSet(ActiveWindowID); + MoveCursorToSide(active.view, DIR_RIGHT, SHIFT_PRESS); +} RegisterCommand(CMD_SelectToLineEnd, "shift-end"); + +void CMD_DeleteCharacter() { + BSet active = GetBSet(ActiveWindowID); + Delete(active.view, DIR_LEFT); +} RegisterCommand(CMD_DeleteCharacter, "shift-backspace | backspace"); + +void CMD_DeleteBoundary() { + BSet active = GetBSet(ActiveWindowID); + Delete(active.view, DIR_LEFT, SHIFT_PRESS); +} RegisterCommand(CMD_DeleteBoundary, "ctrl-backspace"); + +void CMD_DeleteForward() { + BSet active = GetBSet(ActiveWindowID); + Delete(active.view, DIR_RIGHT); +} RegisterCommand(CMD_DeleteForward, "shift-delete | delete"); + +void CMD_DeleteForwardBoundary() { + BSet active = GetBSet(ActiveWindowID); + Delete(active.view, DIR_RIGHT, SHIFT_PRESS); +} RegisterCommand(CMD_DeleteForwardBoundary, "ctrl-delete"); + +void CMD_InsertNewLineUp() { + BSet active = GetBSet(ActiveWindowID); + SaveCaretHistoryBeforeBeginEdit(active.buffer, active.view->carets); + MoveCursorToSide(active.view, DIR_LEFT); + IndentedNewLine(active.view); + MoveCarets(active.view, DIR_UP); +} RegisterCommand(CMD_InsertNewLineUp, "ctrl-shift-enter"); + +void CMD_InsertNewLineDown() { + BSet active = GetBSet(ActiveWindowID); + SaveCaretHistoryBeforeBeginEdit(active.buffer, active.view->carets); + MoveCursorToSide(active.view, DIR_RIGHT); + IndentedNewLine(active.view); +} RegisterCommand(CMD_InsertNewLineDown, "ctrl-enter"); + +void CMD_NewLine() { + BSet active = GetBSet(ActiveWindowID); + IndentedNewLine(active.view); +} RegisterCommand(CMD_NewLine, "enter | shift-enter"); + +void CMD_CreateCaretOnNextFind() { + BSet active = GetBSet(ActiveWindowID); + String16 string = GetString(active.buffer, active.view->carets[0].range); + Caret caret = FindNext(active.buffer, string, active.view->carets[0]); + Insert(&active.view->carets, caret, 0); + MergeCarets(active.buffer, &active.view->carets); +} RegisterCommand(CMD_CreateCaretOnNextFind, "ctrl-d"); + +void CMD_ClearCarets() { + BSet active = GetBSet(ActiveWindowID); + active.view->carets.len = 1; + active.view->carets[0] = MakeCaret(GetFront(active.view->carets[0])); + + if (active.window->lose_focus_on_escape && active.window->id == ActiveWindowID) { + if (active.window->primary) { + // + } else { + NextActiveWindowID = PrimaryWindowID; + } + } + + For (Windows) { + if (it->lose_visibility_on_escape && it->visible) { + it->visible = false; + } + } +} RegisterCommand(CMD_ClearCarets, "escape", "Clear all carets and reset to 1 caret, also do some windowing stuff that closes things on escape");