From 6bafd0d45f63a7618d7822f31b01da7443d9c5e8 Mon Sep 17 00:00:00 2001 From: Leo Tenenbaum Date: Sat, 2 Jan 2021 18:10:09 -0500 Subject: select all --- buffer.c | 20 ++++++++++++-------- command.c | 3 +++ command.h | 4 +++- ted.cfg | 3 ++- 4 files changed, 20 insertions(+), 10 deletions(-) diff --git a/buffer.c b/buffer.c index d964f50..0e13ee5 100644 --- a/buffer.c +++ b/buffer.c @@ -144,12 +144,12 @@ char32_t buffer_char_at_pos(TextBuffer *buffer, BufferPos p) { } } -BufferPos buffer_pos_start_of_file(TextBuffer *buffer) { +BufferPos buffer_start_of_file(TextBuffer *buffer) { (void)buffer; return (BufferPos){.line = 0, .index = 0}; } -BufferPos buffer_pos_end_of_file(TextBuffer *buffer) { +BufferPos buffer_end_of_file(TextBuffer *buffer) { return (BufferPos){.line = buffer->nlines - 1, .index = buffer->lines[buffer->nlines-1].len}; } @@ -220,7 +220,7 @@ static BufferPos buffer_pos_advance(TextBuffer *buffer, BufferPos pos, size_t nc index = 0; ++line; } - return buffer_pos_end_of_file(buffer); + return buffer_end_of_file(buffer); } @@ -834,7 +834,7 @@ i64 buffer_pos_move_horizontally(TextBuffer *buffer, BufferPos *p, i64 by) { } else if (by > 0) { i64 by_start = by; if (p->line >= buffer->nlines) - *p = buffer_pos_end_of_file(buffer); // invalid position; move to end of buffer + *p = buffer_end_of_file(buffer); // invalid position; move to end of buffer Line *line = &buffer->lines[p->line]; while (by > 0) { if (by <= line->len - p->index) { @@ -1081,11 +1081,11 @@ void buffer_cursor_move_to_end_of_line(TextBuffer *buffer) { } void buffer_cursor_move_to_start_of_file(TextBuffer *buffer) { - buffer_cursor_move_to_pos(buffer, buffer_pos_start_of_file(buffer)); + buffer_cursor_move_to_pos(buffer, buffer_start_of_file(buffer)); } void buffer_cursor_move_to_end_of_file(TextBuffer *buffer) { - buffer_cursor_move_to_pos(buffer, buffer_pos_end_of_file(buffer)); + buffer_cursor_move_to_pos(buffer, buffer_end_of_file(buffer)); } // insert `number` empty lines starting at index `where`. @@ -1243,11 +1243,11 @@ void buffer_select_to_end_of_line(TextBuffer *buffer) { } void buffer_select_to_start_of_file(TextBuffer *buffer) { - buffer_select_to_pos(buffer, buffer_pos_start_of_file(buffer)); + buffer_select_to_pos(buffer, buffer_start_of_file(buffer)); } void buffer_select_to_end_of_file(TextBuffer *buffer) { - buffer_select_to_pos(buffer, buffer_pos_end_of_file(buffer)); + buffer_select_to_pos(buffer, buffer_end_of_file(buffer)); } // select the word the cursor is inside of @@ -1269,6 +1269,10 @@ void buffer_select_line(TextBuffer *buffer) { buffer_select_to_pos(buffer, buffer_pos_start_of_line(buffer, line)); } +void buffer_select_all(TextBuffer *buffer) { + buffer_cursor_move_to_pos(buffer, buffer_start_of_file(buffer)); + buffer_select_to_pos(buffer, buffer_end_of_file(buffer)); +} static void buffer_shorten_line(Line *line, u32 new_len) { assert(line->len >= new_len); diff --git a/command.c b/command.c index 5d1a4d4..8e210f0 100644 --- a/command.c +++ b/command.c @@ -87,6 +87,9 @@ void command_execute(Ted *ted, Command c, i64 argument) { case CMD_SELECT_END_OF_FILE: buffer_select_to_end_of_file(buffer); break; + case CMD_SELECT_ALL: + buffer_select_all(buffer); + break; case CMD_BACKSPACE: buffer_backspace_at_cursor(buffer, argument); diff --git a/command.h b/command.h index 1057b4b..5f69369 100644 --- a/command.h +++ b/command.h @@ -1,7 +1,7 @@ ENUM_U16 { CMD_UNKNOWN, CMD_NOOP, - // movement commands + // movement and selection commands CMD_LEFT, CMD_RIGHT, CMD_UP, @@ -22,6 +22,7 @@ ENUM_U16 { CMD_END_OF_FILE, CMD_SELECT_START_OF_FILE, CMD_SELECT_END_OF_FILE, + CMD_SELECT_ALL, // scrolling CMD_PAGE_UP, @@ -67,6 +68,7 @@ static CommandName const command_names[CMD_COUNT] = { {"end-of-file", CMD_END_OF_FILE}, {"select-start-of-file", CMD_SELECT_START_OF_FILE}, {"select-end-of-file", CMD_SELECT_END_OF_FILE}, + {"select-all", CMD_SELECT_ALL}, {"page-up", CMD_PAGE_UP}, {"page-down", CMD_PAGE_DOWN}, {"backspace", CMD_BACKSPACE}, diff --git a/ted.cfg b/ted.cfg index aecf14e..4132f6e 100644 --- a/ted.cfg +++ b/ted.cfg @@ -6,7 +6,7 @@ cursor-width = 1 undo-save-time = 6 [keyboard] -# motion keys +# motion and selection Left = :left Shift+Left = :select-left Ctrl+Left = :left-word @@ -31,6 +31,7 @@ End = :end-of-line Shift+End = :select-end-of-line Ctrl+End = :end-of-file Ctrl+Shift+End = :select-end-of-file +Ctrl+a = :select-all # deletion Delete = :delete -- cgit v1.2.3