...
|
...
|
@@ -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)) {
|