Browse code

Implement Control+q+f (search) and Control+l (search next)

Dario Rodriguez authored on 22/10/2020 21:55:58
Showing 1 changed files
... ...
@@ -29,7 +29,8 @@
29 29
 #define COMMANDBUFSIZE 1024
30 30
 
31 31
 #define COMMAND_WARNING "(!)"
32
-#define COMMAND_GOTOLINE "Go to line: "
32
+#define COMMAND_GOTOLINE "Go to line:"
33
+#define COMMAND_SEARCHFORWARD "Search:"
33 34
 #define COMMAND_QUESTION "(?)"
34 35
 #define COMMAND_EXIT "Exit"
35 36
 
... ...
@@ -58,6 +59,7 @@ typedef struct re_t {
58 59
         int command_first_key;
59 60
         char *command;
60 61
         char commandbuf[COMMANDBUFSIZE];
62
+        char cachelastsearch[COMMANDBUFSIZE];
61 63
         question_t *question;
62 64
         int showingwarning;
63 65
         int ignorenkeys;
... ...
@@ -621,6 +623,22 @@ fprintf(stderr,"re_processkey(): received Control+z\n");
621 623
                 re_fixorigin(re);
622 624
                 re->headerdirty=1;
623 625
                 re->contentsdirty=1;
626
+        } else if(event->key.keysym.sym==SDLK_l && (SDL_GetModState()&KMOD_CTRL)!=0 && re->cachelastsearch[0]!='\0') {
627
+                long newpos;
628
+fprintf(stderr,"re_processkey(): received Control+l\n");
629
+                /* search next (forward) */
630
+                if((newpos=redata_searchforward(re->data,re->cursorpos+1,re->cachelastsearch,strlen(re->cachelastsearch)))==-1) {
631
+                        re->command=COMMAND_WARNING;
632
+                        snprintf(re->commandbuf,sizeof(re->commandbuf),"String not found");
633
+                        re->commandbuf[sizeof(re->commandbuf)-1]='\0';
634
+                        re->headerdirty=1;
635
+                        return(-1);
636
+                }
637
+                re->cursorpos=newpos;
638
+                redata_pos2linecol(re->data,re->cursorpos,&(re->curline),&(re->curcol));
639
+                re_fixorigin_center(re);
640
+                re->headerdirty=1;
641
+                re->contentsdirty=1;
624 642
         }
625 643
         return(0);
626 644
 }
... ...
@@ -638,6 +656,11 @@ re_processkey_commandwait(re_t *re, SDL_Event *event)
638 656
                 re->command=COMMAND_GOTOLINE;
639 657
                 re->commandbuf[0]='\0';
640 658
                 re->headerdirty=1;
659
+        } else if(re->command_first_key=='q' && event->key.keysym.sym==SDLK_f) {
660
+                re->command=COMMAND_SEARCHFORWARD;
661
+                strncpy(re->commandbuf,re->cachelastsearch,sizeof(re->commandbuf));
662
+                re->commandbuf[sizeof(re->commandbuf)-1]='\0';
663
+                re->headerdirty=1;
641 664
         } else if(re->command_first_key=='k' && event->key.keysym.sym==SDLK_q) {
642 665
                 re->command=COMMAND_EXIT;
643 666
                 re->commandbuf[0]='\0';
... ...
@@ -717,6 +740,22 @@ re_processcommand(re_t *re)
717 740
                 re->originline=line-(re->maxrow/2);
718 741
                 re->headerdirty=1;
719 742
                 re->contentsdirty=1;
743
+        } else if(strcmp(re->command,COMMAND_SEARCHFORWARD)==0) {
744
+                long newpos;
745
+                if((newpos=redata_searchforward(re->data,re->cursorpos,re->commandbuf,strlen(re->commandbuf)))==-1) {
746
+                        re->command=COMMAND_WARNING;
747
+                        snprintf(re->commandbuf,sizeof(re->commandbuf),"String not found");
748
+                        re->commandbuf[sizeof(re->commandbuf)-1]='\0';
749
+                        re->headerdirty=1;
750
+                        return(-1);
751
+                }
752
+                strncpy(re->cachelastsearch,re->commandbuf,sizeof(re->cachelastsearch));
753
+                re->cachelastsearch[sizeof(re->cachelastsearch)-1]='\0';
754
+                re->cursorpos=newpos;
755
+                redata_pos2linecol(re->data,re->cursorpos,&(re->curline),&(re->curcol));
756
+                re_fixorigin_center(re);
757
+                re->headerdirty=1;
758
+                re->contentsdirty=1;
720 759
         } else if(strcmp(re->command,COMMAND_QUESTION)==0) {
721 760
                 /* validate reply */
722 761
                 if(!(atoi(re->commandbuf)>0 && atoi(re->commandbuf)<=re->question->nopts)) {