From 678699caac82f1cb5829879b646c9f9e61a3965c Mon Sep 17 00:00:00 2001 From: Laurent Mazet Date: Sun, 16 Mar 2025 23:36:13 +0100 Subject: [PATCH] follow searched file --- display.c | 21 +++------------------ fm.c | 50 ++++++++++++++++++++++++++++++++++++++++---------- function.c | 15 +++++++++++++++ function.h | 2 ++ 4 files changed, 60 insertions(+), 28 deletions(-) diff --git a/display.c b/display.c index 5b61c06..da4b182 100644 --- a/display.c +++ b/display.c @@ -567,21 +567,6 @@ void errorwindow (char *msg, window_t *win) } } -int _find (char **lines, int nblines, int skip, char *search) -{ - int len = strlen (search); - int i, j; - for (i = skip; i < nblines; i++) { - for (j = 0; lines[i][j] != 0; j++) { - if (strncmp (lines[i] + j, search, len) == 0) { - return i; - } - } - } - - return -1; -} - char *filewindow (char *name, window_t *win) { static char *_help = @@ -716,7 +701,7 @@ char *filewindow (char *name, window_t *win) pt = getwindow ("Search", win, 12, MAXLEN, search); free (search); search = pt; - sskip = _find (lines, len, skip, search); + sskip = find (lines, len, skip, search); break; case 'h': helpwindow (_help, (win->xsize - strmaxlen (_help, '\n')) / 2, 3 * win->yoffset); @@ -743,9 +728,9 @@ char *filewindow (char *name, window_t *win) break; case 'n': if (search) { - sskip = _find (lines, len, GETSKIP (skip, sskip) + 1, search); + sskip = find (lines, len, GETSKIP (skip, sskip) + 1, search); if (sskip == -1) { - sskip = _find (lines, len, 0, search); + sskip = find (lines, len, 0, search); } } break; diff --git a/fm.c b/fm.c index 416d17e..8437c91 100644 --- a/fm.c +++ b/fm.c @@ -237,6 +237,31 @@ int main (int argc, char *argv[]) } /* display panel */ + if ((mode) && (search[i])) { + int n = (list[i]->nb + windir[i]->nbcols - 1) / windir[i]->nbcols; + int skip = index_x[i] * n + index_y[i]; + char **_list = (char **) calloc (list[i]->nb, sizeof (char *)); + CHECKALLOC (_list); + int j; + for (j = 0; j < list[i]->nb; j++) { + _list[j] = (list[i]->tab + j)->name; + } + skip = find (_list, list[i]->nb, skip, search[i]); + if (skip != -1) { + index_x[i] = skip / n; + index_y[i] = skip % n; + if (n > windir[i]->ysize) { + page[i] = index_y[i]; + if (page[i] + windir[i]->ysize > n) { + page[i] = n - windir[i]->ysize; + index_y[i] -= page[i]; + } else { + index_y[i] = 0; + } + } + } + free (_list); + } displaywindow (windir[i], list[i], page[i], &index_x[i], &index_y[i], &index_f[i], search[i]); /* display info */ @@ -277,13 +302,17 @@ int main (int argc, char *argv[]) case ALT_H: helpwindow (help1, (width - strmaxlen (help0, '\n')) / 2, 3 * yoffset); break; + case ALT_N: + break; + case ALT_P: + break; case ALT_Q: mode = 0; free (search[panel]); search[panel] = NULL; break; case ALT_R: - *search[panel] = '\0'; + search[panel][0] = '\0'; break; #ifndef PDCURSES } @@ -293,7 +322,7 @@ int main (int argc, char *argv[]) search[panel] = (char *) realloc (search[panel], len + 2); CHECKALLOC (search[panel]); search[panel][len] = ch; - search[panel][len + 1] = 0; + search[panel][len + 1] = '\0'; break; } continue; @@ -365,21 +394,21 @@ int main (int argc, char *argv[]) break; case KEY_UP: case 'i': - if (index_y[panel]> 0) { + if (index_y[panel] > 0) { index_y[panel]--; - } else if (page[panel]> 0) { + } else if (page[panel] > 0) { page[panel]--; } break; case KEY_LEFT: case 'j': - if (index_x[panel]> 0) { + if (index_x[panel] > 0) { index_x[panel]--; } break; case KEY_DOWN: case 'k': - if (index_y[panel]< min (windir[panel]->ysize, (list[panel]->nb + windir[panel]->nbcols - 1) / windir[panel]->nbcols) - 1) { + if (index_y[panel] < min (windir[panel]->ysize, (list[panel]->nb + windir[panel]->nbcols - 1) / windir[panel]->nbcols) - 1) { index_y[panel]++; } else if (page[panel]+ windir[panel]->ysize < (list[panel]->nb + windir[panel]->nbcols - 1) / windir[panel]->nbcols) { page[panel]++; @@ -387,7 +416,7 @@ int main (int argc, char *argv[]) break; case KEY_RIGHT: case 'l': - if (index_x[panel]< min (windir[panel]->nbcols, list[panel]->nb) - 1) { + if (index_x[panel] < min (windir[panel]->nbcols, list[panel]->nb) - 1) { index_x[panel]++; } break; @@ -630,7 +659,7 @@ int main (int argc, char *argv[]) /* Filter and selection */ /* test: { sleep 1; echo -en '\ef'; sleep 1; echo -n ' .*\.c'; sleep 1; echo; sleep 1; echo -en 'kkk\esl'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe */ /* test: { sleep 1; echo -en '\ef'; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe */ -/* test: { sleep 1; echo -en '\ef'; sleep 1; echo -n 123456789012345678901234567890123; sleep 1; echo -en '\b\b'; sleep 1; echo -ne '\e'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe */ +/* test: { sleep 1; echo -en '\ef'; sleep 1; echo -n 123456789012345678901234567890123; sleep 1; echo -en '\b\b'; sleep 1; echo -en '\e'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe */ /* New directory */ /* test: { sleep 1; echo -en '\en'; sleep 1; echo -n foobar; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rmdir foobar */ @@ -666,7 +695,7 @@ int main (int argc, char *argv[]) /* test: ln -s .b .a && { sleep 1; echo -en 'k\es'; sleep 1; echo -en '\ex'; sleep 1; echo; sleep 1; echo ; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe && rm .a */ /* View */ -/* test: echo -ne 'Begin\n This is a test\nEnd' > .a && { sleep 1; echo -n 'k'; sleep 1; echo; sleep 1; echo -n kkk; sleep 1; echo -n iii; sleep 1; echo -n h; sleep 1; echo; sleep 1; echo -n m; sleep 1; echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */ +/* test: echo -en 'Begin\n This is a test\nEnd' > .a && { sleep 1; echo -n 'k'; sleep 1; echo; sleep 1; echo -n kkk; sleep 1; echo -n iii; sleep 1; echo -n h; sleep 1; echo; sleep 1; echo -n m; sleep 1; echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */ /* test: cp fm.c .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; for i in $(seq 1 1000); do echo -n k; done; sleep 1; for i in $(seq 1 1000); do echo -n i; done; sleep 1; sleep 1; echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */ /* test: cp fm.c .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; echo -n KKKK; sleep 1; echo -n IIII; sleep 1; echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */ /* test: cp debug.o .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; for i in $(seq 1 100); do echo -n k; done; sleep 1; for i in $(seq 1 100); do echo -n i; done; sleep 1; echo -n m; sleep 1; echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */ @@ -674,9 +703,10 @@ int main (int argc, char *argv[]) /* test: ln -s .b .a && { sleep 1; echo -n 'k'; sleep 1; echo -en '\ev'; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */ /* Search in view */ -/* test: cp debug.o .a && { sleep 1; echo -ne 'k\ev'; sleep 1; echo -n f; sleep 1; echo -n ELF; sleep 1; echo ; sleep 1; echo -n n; sleep 1; echo -n n; sleep 1; echo -n kkkkkkk; sleep 1; echo -n iii; sleep 1; echo -n m ; sleep 1; echo -n kkkkkkkkkkkk; sleep 1; echo -n f; sleep 1; echo -ne '\b\b\b 00 00 00'; sleep 1; echo; sleep 1; for i in $(seq 1 20); do echo -n n; sleep 1; done; echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */ +/* test: cp debug.o .a && { sleep 1; echo -en 'k\ev'; sleep 1; echo -n f; sleep 1; echo -n ELF; sleep 1; echo ; sleep 1; echo -n n; sleep 1; echo -n n; sleep 1; echo -n kkkkkkk; sleep 1; echo -n iii; sleep 1; echo -n m ; sleep 1; echo -n kkkkkkkkkkkk; sleep 1; echo -n f; sleep 1; echo -en '\b\b\b 00 00 00'; sleep 1; echo; sleep 1; for i in $(seq 1 20); do echo -n n; sleep 1; done; echo -n q; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 && rm .a */ /* Search in panel */ +/* test: { sleep 1; echo -n fde; sleep 1; echo -en '\eh'; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 */ /* test: { sleep 1; echo -n fde; sleep 1; echo -n bug; sleep 1; echo -n .h; sleep 1; echo; sleep 1; echo -en '\eq'; sleep 1; echo -n y; } | fm.exe -x 60 -y 20 */ /* vim: set ts=4 sw=4 et: */ diff --git a/function.c b/function.c index 927a0cd..1a44353 100644 --- a/function.c +++ b/function.c @@ -789,4 +789,19 @@ char **splithexalines (char *buffer, int length, int width) return lines; } +int find (char **lines, int nblines, int skip, char *search) +{ + int len = strlen (search); + int i, j; + for (i = skip; i < nblines; i++) { + for (j = 0; lines[i][j] != 0; j++) { + if (strncmp (lines[i] + j, search, len) == 0) { + return i; + } + } + } + + return -1; +} + /* vim: set ts=4 sw=4 et: */ diff --git a/function.h b/function.h index 20d20d6..8c65bcb 100644 --- a/function.h +++ b/function.h @@ -69,6 +69,8 @@ void freelines (char **lines); char **splithexalines (char *buffer, int length, int width); +int find (char **lines, int nblines, int skip, char *search); + #endif /* __FUNCTION_H__ */ /* vim: set ts=4 sw=4 et: */ -- 2.30.2