@@ -162,3 +162,7 @@ Lisp editorDelRow_L(Lisp args, LispError *e, LispContext ctx) {
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
Lisp editorFind_L(Lisp args, LispError *e, LispContext ctx) {
|
||||
editorFind();
|
||||
return lisp_null();
|
||||
}
|
||||
|
||||
@@ -110,3 +110,21 @@ void editorSave() {
|
||||
free(buf);
|
||||
editorSetStatusMessage("Can't save! I/O error: %s", strerror(errno));
|
||||
}
|
||||
|
||||
void editorFind() {
|
||||
char *query = editorPrompt("Search: %s (ESC to cancel)");
|
||||
if (query == NULL) return;
|
||||
int i;
|
||||
for (i = 0; i < E.numrows; i++) {
|
||||
erow *row = &E.row[i];
|
||||
char *match = strstr(row->render, query);
|
||||
if (match) {
|
||||
E.cursor_y = i;
|
||||
E.cursor_x = editorRowRxToCx(row, match - row->render);
|
||||
E.row_offset = E.numrows;
|
||||
break;
|
||||
}
|
||||
}
|
||||
free(query);
|
||||
}
|
||||
|
||||
|
||||
@@ -33,6 +33,7 @@ void initBuiltins() {
|
||||
registerBuiltin("EDITOR-INSERT-CHAR", editorPrintC);
|
||||
registerBuiltin("ADD-PACKAGE", addPackage);
|
||||
registerBuiltin("EDITOR-DEL-ROW", editorDelRow_L);
|
||||
registerBuiltin("EDITOR-FIND", editorFind_L);
|
||||
}
|
||||
|
||||
void initEditor() {
|
||||
|
||||
@@ -18,6 +18,18 @@ int editorRowCxToRx(erow *row, int cursor_x) {
|
||||
return render_x;
|
||||
}
|
||||
|
||||
int editorRowRxToCx(erow *row, int rx) {
|
||||
int cur_rx = 0;
|
||||
int cx;
|
||||
for (cx = 0; cx < row->size; cx++) {
|
||||
if (row->chars[cx] == '\t')
|
||||
cur_rx += (E.constantes.TAB_LENGTH - 1) - (cur_rx % E.constantes.TAB_LENGTH);
|
||||
cur_rx++;
|
||||
if (cur_rx > rx) return cx;
|
||||
}
|
||||
return cx;
|
||||
}
|
||||
|
||||
/**
|
||||
* \fn editorUpdateRow(erow *row)
|
||||
* \brief Copy content of \p row in \p row->render.
|
||||
|
||||
Reference in New Issue
Block a user