tAllow different find direction - ve - a minimal text editor (work in progress) (HTM) git clone git://src.adamsgaard.dk/ve (DIR) Log (DIR) Files (DIR) Refs (DIR) README (DIR) LICENSE --- (DIR) commit c25ff23d7f5f66ccd5b8053de791388c3a6b311a (DIR) parent eedc7316f2cb4c4964aff43cef6055ce428158cb (HTM) Author: Anders Damsgaard <anders@adamsgaard.dk> Date: Wed, 7 Aug 2019 09:32:47 +0200 Allow different find direction Diffstat: M find.c | 64 ++++++++++++++++++++++++------- M find.h | 3 ++- M input.c | 11 ++++++++++- M terminal.c | 1 + M ve.h | 2 ++ 5 files changed, 66 insertions(+), 15 deletions(-) --- (DIR) diff --git a/find.c b/find.c t@@ -1,29 +1,67 @@ +/* add feature test macro for strdup compatibility */ +#define _DEFAULT_SOURCE +#define _BSD_SOURCE +#define _GNU_SOURCE + #include <stdlib.h> #include <string.h> #include "input.h" #include "ve.h" #include "row.h" +#include "output.h" +/* find E.find_query from current cursor position moving in E.direction + * if opposite_direction = 0, and opposite E.direction if + * opposite_direction = 1 */ void -editor_find() +editor_find_next_occurence(int opposite_direction) { - char *query, *match; int i; eRow *row; - - query = editor_prompt("/%s"); - if (query == NULL) + char *match; + + if (!E.find_query) return; - for (i=0; i<E.num_rows; ++i) { - row = &E.row[i]; - match = strstr(row->rchars, query); - if (match) { - E.cursor_y = i; - E.cursor_x = editor_row_cursor_rx_to_x(row, match - row->rchars); - /* E.row_offset = E.num_rows; */ /* put line to top of screen */ - break; + if ((E.find_direction && !opposite_direction) || + (!E.find_direction && opposite_direction)) { + for (i=0; i<E.num_rows; ++i) { + row = &E.row[i]; + match = strstr(row->rchars, E.find_query); + if (match) + break; + } + } else { + for (i=E.num_rows-1; i>=0; --i) { + row = &E.row[i]; + match = strstr(row->rchars, E.find_query); + if (match) + break; } } + if (match) { + E.cursor_y = i; + E.cursor_x = editor_row_cursor_rx_to_x(row, match - row->rchars); + /* E.row_offset = E.num_rows; */ /* put line to top of screen */ + } +} + +/* direction = 1 is forward, 0 is backward */ +void +editor_find(int direction) +{ + char *query; + + if (direction) + query = editor_prompt("/%s"); + else + query = editor_prompt("?%s"); + if (query == NULL) + return; + + E.find_direction = direction; + free(E.find_query); + E.find_query = strdup(query); + editor_find_next_occurence(0); free(query); } (DIR) diff --git a/find.h b/find.h t@@ -1,6 +1,7 @@ #ifndef FIND_H_ #define FIND_H_ -void editor_find(); +void editor_find_next_occurence(int opposite_direction); +void editor_find(int direction); #endif (DIR) diff --git a/input.c b/input.c t@@ -213,7 +213,16 @@ editor_process_keypress() break; case '/': - editor_find(); + editor_find(1); + break; + case '?': + editor_find(0); + break; + case 'n': + editor_find_next_occurence(0); + break; + case 'N': + editor_find_next_occurence(1); break; } } else if (E.mode == 1) { /* insert mode */ (DIR) diff --git a/terminal.c b/terminal.c t@@ -122,6 +122,7 @@ init_editor() { E.status_msg_time = 0; E.show_status = 0; E.file_changed = 0; + E.find_query = NULL; if (get_window_size(&E.screen_rows, &E.screen_columns) == -1) die("get_window_size"); (DIR) diff --git a/ve.h b/ve.h t@@ -31,6 +31,8 @@ struct editor_config { char status_msg[80]; time_t status_msg_time; int file_changed; + char *find_query; + int find_direction; }; extern struct editor_config E;