follow searched file
authorLaurent Mazet <mazet@softndesign.org>
Sun, 16 Mar 2025 22:36:13 +0000 (23:36 +0100)
committerLaurent Mazet <mazet@softndesign.org>
Sun, 16 Mar 2025 22:36:13 +0000 (23:36 +0100)
display.c
fm.c
function.c
function.h

index 5b61c0609b163bbf71fa679c5703a31c91e017d5..da4b1825e773da37661fb4aaec2caf8b4d7cfe33 100644 (file)
--- 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 416d17e3542a0d842f954e09b0386799c60498a0..8437c917de3535777a89571ef3ef88925326fb92 100644 (file)
--- 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: */
index 927a0cd0610c3a02823bcca994de79f9812c61dc..1a44353f56f79beafb81e136e7d2a06d9ed15a12 100644 (file)
@@ -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: */
index 20d20d63f6403ce54991ed916a33d18fbee22113..8c65bcbfca3267eb30c6037976cce394f081fda6 100644 (file)
@@ -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: */