qemacs-commit
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemacs-commit] qemacs TODO.org qe.h qeconfig.h search.c


From: Charlie Gordon
Subject: [Qemacs-commit] qemacs TODO.org qe.h qeconfig.h search.c
Date: Sat, 31 Dec 2016 06:25:25 -0500 (EST)

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        16/12/31 06:25:25

Modified files:
        .              : TODO.org qe.h qeconfig.h search.c 

Log message:
        search: improvements
        - C-u C-s selects regex searching (not yet implemented)
        - `do_isearch()` takes extra argument for argval
        - cycle hex and unihex isearch modes on M-C-b instead of C-b and M-b
        - toggle regex incremental searching on C-t and M-r
        - C-j no longer needs quoting in isearch
        - no longer keep lingering search matches after search exits

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/TODO.org?cvsroot=qemacs&r1=1.19&r2=1.20
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.h?cvsroot=qemacs&r1=1.232&r2=1.233
http://cvs.savannah.gnu.org/viewcvs/qemacs/qeconfig.h?cvsroot=qemacs&r1=1.60&r2=1.61
http://cvs.savannah.gnu.org/viewcvs/qemacs/search.c?cvsroot=qemacs&r1=1.9&r2=1.10

Patches:
Index: TODO.org
===================================================================
RCS file: /sources/qemacs/qemacs/TODO.org,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -b -r1.19 -r1.20
--- TODO.org    27 Dec 2016 11:40:42 -0000      1.19
+++ TODO.org    31 Dec 2016 11:25:25 -0000      1.20
@@ -1,13 +1,12 @@
 ; TODO list for qemacs
 ;
 ; Author: Charles Gordon
-; Updated: 2016-12-23
+; Updated: 2016-12-31
 
 * Needed for release version 5
 
 * Priority 0
 
-** basic: remove some hotkeys in incremental search: C-b
 ** basic: reset last command when executing macro
 ** completion: fix electric behavior
 ** files: check file date to detect asynchronous modifications on disk
@@ -152,7 +151,6 @@
 ** search: add low-level accelerator function
 ** search: use do_isearch to input string for do_search_string
 ** search: use do_isearch to input string for do_query_replace (might need 
recursive edit)
-** search: count-matches
 ** search: count-words, wc
 ** search: stats command for word count and mode specific stats
 ** search: improve speed finally

Index: qe.h
===================================================================
RCS file: /sources/qemacs/qemacs/qe.h,v
retrieving revision 1.232
retrieving revision 1.233
diff -u -b -r1.232 -r1.233
--- qe.h        31 Dec 2016 11:12:16 -0000      1.232
+++ qe.h        31 Dec 2016 11:25:25 -0000      1.233
@@ -776,6 +776,11 @@
 #define COLORED_MAX_LINE_SIZE  4096
 
 /* colorize & transform a line, lower level then ColorizeFunc */
+/* XXX: should return `len`, the number of valid codepoints copied to 
+ * destination excluding the null terminator and newline if present.
+ * Truncation can be detected by testing if a newline is present 
+ * at this offset.
+ */
 typedef int (*GetColorizedLineFunc)(EditState *s,
                                     unsigned int *buf, int buf_size,
                                     int offset, int *offsetp, int line_num);
@@ -1878,7 +1883,7 @@
 void do_write_region(EditState *s, const char *filename);
 void isearch_colorize_matches(EditState *s, unsigned int *buf, int len,
                               int offset);
-void do_isearch(EditState *s, int dir);
+void do_isearch(EditState *s, int dir, int argval);
 void do_query_replace(EditState *s, const char *search_str,
                       const char *replace_str);
 void do_replace_string(EditState *s, const char *search_str,

Index: qeconfig.h
===================================================================
RCS file: /sources/qemacs/qemacs/qeconfig.h,v
retrieving revision 1.60
retrieving revision 1.61
diff -u -b -r1.60 -r1.61
--- qeconfig.h  23 Dec 2016 13:00:55 -0000      1.60
+++ qeconfig.h  31 Dec 2016 11:25:25 -0000      1.61
@@ -188,10 +188,10 @@
           "s{Count Matches: }|search|"
           "v")
     /* passing argument should switch to regex incremental search */
-    CMD1( KEY_CTRL('r'), KEY_NONE,
-          "isearch-backward", do_isearch, -1 )
-    CMD1( KEY_CTRL('s'), KEY_NONE,
-          "isearch-forward", do_isearch, 1 )
+    CMD3( KEY_CTRL('r'), KEY_NONE,
+          "isearch-backward", do_isearch, ESii, -1, "vui" )
+    CMD3( KEY_CTRL('s'), KEY_NONE,
+          "isearch-forward", do_isearch, ESii, 1, "vui" )
     CMD2( KEY_META('%'), KEY_NONE,
           "query-replace", do_query_replace, ESss,
           "*" "s{Query replace: }|search|"
@@ -471,8 +471,8 @@
 CmdDef less_commands[] = {
     CMD0( 'q', KEY_CTRL('g'),
           "less-exit", do_less_exit)
-    CMD1( '/', KEY_NONE,
-          "less-isearch", do_isearch, 1)
+    CMD3( '/', KEY_NONE,
+          "less-isearch", do_isearch, ESii, 1, "vui" )
     CMD_DEF_END,
 };
 

Index: search.c
===================================================================
RCS file: /sources/qemacs/qemacs/search.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -b -r1.9 -r1.10
--- search.c    23 Dec 2016 19:51:48 -0000      1.9
+++ search.c    31 Dec 2016 11:25:25 -0000      1.10
@@ -30,6 +30,7 @@
 #define SEARCH_FLAG_WRAPPED    0x0008
 #define SEARCH_FLAG_HEX        0x0010
 #define SEARCH_FLAG_UNIHEX     0x0020
+#define SEARCH_FLAG_REGEX      0x0040
 
 /* should separate search string length and number of match positions */
 #define SEARCH_LENGTH  256
@@ -51,9 +52,11 @@
     unsigned int search_u32[SEARCH_LENGTH];
 };
 
+/* XXX: should store to screen */
 ISearchState isearch_state;
 
-/* store last searched string */
+/* last searched string */
+/* XXX: should store in a buffer as a list */
 static unsigned int last_search_u32[SEARCH_LENGTH];
 static int last_search_u32_len = 0;
 static int last_search_u32_flags = 0;
@@ -212,6 +215,22 @@
     }
 }
 
+static void buf_disp_search_flags(buf_t *out, int search_flags) {
+    if (search_flags & SEARCH_FLAG_UNIHEX)
+        buf_puts(out, "Unihex ");
+    if (search_flags & SEARCH_FLAG_HEX)
+        buf_puts(out, "Hex ");
+    if (search_flags & SEARCH_FLAG_IGNORECASE)
+        buf_puts(out, "Folding ");
+    else
+    if (!(search_flags & SEARCH_FLAG_SMARTCASE))
+        buf_puts(out, "Exact ");
+    if (search_flags & SEARCH_FLAG_REGEX)
+        buf_puts(out, "Regex ");
+    if (search_flags & SEARCH_FLAG_WORD)
+        buf_puts(out, "Word ");
+}
+
 static void isearch_run(ISearchState *is)
 {
     EditState *s = is->s;
@@ -301,18 +320,7 @@
         buf_puts(out, "Wrapped ");
         is->search_flags &= ~SEARCH_FLAG_WRAPPED;
     }
-    if (is->search_flags & SEARCH_FLAG_UNIHEX)
-        buf_puts(out, "Unihex ");
-    if (is->search_flags & SEARCH_FLAG_HEX)
-        buf_puts(out, "Hex ");
-    if (is->search_flags & SEARCH_FLAG_WORD)
-        buf_puts(out, "Word ");
-    if (is->search_flags & SEARCH_FLAG_IGNORECASE)
-        buf_puts(out, "Folding ");
-    else
-    if (!(is->search_flags & SEARCH_FLAG_SMARTCASE))
-        buf_puts(out, "Exact ");
-
+    buf_disp_search_flags(out, is->search_flags);
     buf_puts(out, "I-search");
     if (is->dir < 0)
         buf_puts(out, " backward");
@@ -363,10 +371,15 @@
     switch (ch) {
     case KEY_DEL:
     case KEY_BS:
+        /* cancel last input item from search string */
         if (is->pos > 0)
             is->pos--;
         break;
     case KEY_CTRL('g'):
+        /* XXX: when search has failed should cancel input back to what has 
been
+         * found successfully.
+         * when search is successful aborts and moves point to starting point.
+         */
         s->b->mark = is->saved_mark;
         s->offset = is->start_offset;
         s->region_style = 0;
@@ -390,7 +403,7 @@
     case KEY_CTRL('r'):         /* previous match */
         is->dir = -1;
     addpos:
-        /* use last seached string if no input */
+        /* use last searched string if no input */
         if (is->search_u32_len == 0 && is->dir == curdir) {
             int len = min(last_search_u32_len, SEARCH_LENGTH - is->pos);
             memcpy(is->search_u32_flags + is->pos, last_search_u32,
@@ -448,8 +461,7 @@
             isearch_grab(is, qs->yank_buffers[qs->yank_current], 0, -1);
         }
         break;
-    case KEY_META('b'):
-    case KEY_CTRL('b'):
+    case KEY_META(KEY_CTRL('b')):
         /* cycle unihex, hex, normal search */
         if (is->search_flags & SEARCH_FLAG_UNIHEX)
             is->search_flags ^= SEARCH_FLAG_HEX | SEARCH_FLAG_UNIHEX;
@@ -469,11 +481,16 @@
         }
         is->search_flags &= ~SEARCH_FLAG_SMARTCASE;
         break;
+    case KEY_META('r'):
+    case KEY_CTRL('t'):
+        is->search_flags ^= ~SEARCH_FLAG_REGEX;
+        break;
     case KEY_CTRL('l'):
         do_center_cursor(s, 1);
         break;
     default:
-        if ((KEY_IS_SPECIAL(ch) || KEY_IS_CONTROL(ch)) && ch != '\t') {
+        if ((KEY_IS_SPECIAL(ch) || KEY_IS_CONTROL(ch)) &&
+            ch != '\t' && ch != KEY_CTRL('j')) {
             /* exit search mode */
 #if 0
             // FIXME: behaviour from qemacs-0.3pre13
@@ -488,9 +505,9 @@
             s->region_style = 0;
             put_status(s, "Mark saved where search started");
             /* repost key */
-            if (ch != KEY_RET) {
-                /* keep search matches lingering if exit via RET */
+            /* do not keep search matches lingering */
                 s->isearch_state = NULL;
+            if (ch != KEY_RET) {
                 unget_key(ch);
             }
             goto the_end;
@@ -506,7 +523,7 @@
 }
 
 /* XXX: handle busy */
-void do_isearch(EditState *s, int dir)
+void do_isearch(EditState *s, int dir, int argval)
 {
     ISearchState *is = &isearch_state;
     EditState *e;
@@ -530,6 +547,9 @@
         else
             flags |= SEARCH_FLAG_HEX;
     }
+    if (argval != NO_ARG)
+        flags |= SEARCH_FLAG_REGEX;
+
     is->search_flags = flags;
 
     qe_grab_keys(isearch_key, is);
@@ -688,18 +708,7 @@
     }
     /* display prompt string */
     out = buf_init(&outbuf, ubuf, sizeof(ubuf));
-    if (is->search_flags & SEARCH_FLAG_UNIHEX)
-        buf_puts(out, "Unihex ");
-    if (is->search_flags & SEARCH_FLAG_HEX)
-        buf_puts(out, "Hex ");
-    if (is->search_flags & SEARCH_FLAG_WORD)
-        buf_puts(out, "Word ");
-    if (is->search_flags & SEARCH_FLAG_IGNORECASE)
-        buf_puts(out, "Folding ");
-    else
-    if (!(is->search_flags & SEARCH_FLAG_SMARTCASE))
-        buf_puts(out, "Exact ");
-
+    buf_disp_search_flags(out, is->search_flags);
     buf_puts(out, "Query replace ");
     buf_encode_search_str(out, is->search_str);
     buf_puts(out, " with ");



reply via email to

[Prev in Thread] Current Thread [Next in Thread]