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;