qemacs-commit
[Top][All Lists]
Advanced

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

[Qemacs-commit] qemacs bufed.c charset.c dired.c latex-mode.c q...


From: Charlie Gordon
Subject: [Qemacs-commit] qemacs bufed.c charset.c dired.c latex-mode.c q...
Date: Tue, 11 Aug 2015 17:45:31 +0000

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        15/08/11 17:45:31

Modified files:
        .              : bufed.c charset.c dired.c latex-mode.c qe.c 
                         qe.h qeconfig.h util.c variables.c 

Log message:
        minibuffer completion: add fuzzy matching
        
        - add extra group argument in functions add_string() and set_string()
        - group matches in completion_sort_func()
        - add const char *strmem(const char *str, const void *mem, int size);
        - add variable fuzzy-search
        - add minibuffer-insert command to handle insert triggers
        - display variable status after set-variable
        - make TAB a regular char in incremental search
        - display control chars as ^x in incremental search prompt

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/bufed.c?cvsroot=qemacs&r1=1.34&r2=1.35
http://cvs.savannah.gnu.org/viewcvs/qemacs/charset.c?cvsroot=qemacs&r1=1.38&r2=1.39
http://cvs.savannah.gnu.org/viewcvs/qemacs/dired.c?cvsroot=qemacs&r1=1.54&r2=1.55
http://cvs.savannah.gnu.org/viewcvs/qemacs/latex-mode.c?cvsroot=qemacs&r1=1.52&r2=1.53
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.c?cvsroot=qemacs&r1=1.193&r2=1.194
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.h?cvsroot=qemacs&r1=1.190&r2=1.191
http://cvs.savannah.gnu.org/viewcvs/qemacs/qeconfig.h?cvsroot=qemacs&r1=1.50&r2=1.51
http://cvs.savannah.gnu.org/viewcvs/qemacs/util.c?cvsroot=qemacs&r1=1.69&r2=1.70
http://cvs.savannah.gnu.org/viewcvs/qemacs/variables.c?cvsroot=qemacs&r1=1.15&r2=1.16

Patches:
Index: bufed.c
===================================================================
RCS file: /sources/qemacs/qemacs/bufed.c,v
retrieving revision 1.34
retrieving revision 1.35
diff -u -b -r1.34 -r1.35
--- bufed.c     1 Jun 2014 13:54:58 -0000       1.34
+++ bufed.c     11 Aug 2015 17:45:30 -0000      1.35
@@ -63,7 +63,7 @@
     free_strings(&bs->items);
     for (b = qs->first_buffer; b != NULL; b = b->next) {
         if (!(b->flags & BF_SYSTEM) || (bs->flags & BUFED_ALL_VISIBLE))
-            add_string(&bs->items, b->name);
+            add_string(&bs->items, b->name, 0);
     }
 
     /* build buffer */

Index: charset.c
===================================================================
RCS file: /sources/qemacs/qemacs/charset.c,v
retrieving revision 1.38
retrieving revision 1.39
diff -u -b -r1.38 -r1.39
--- charset.c   31 May 2014 00:26:26 -0000      1.38
+++ charset.c   11 Aug 2015 17:45:30 -0000      1.39
@@ -1143,14 +1143,14 @@
 
     for (charset = first_charset; charset != NULL; charset = charset->next) {
         if (strxstart(charset->name, cp->current, NULL))
-            add_string(&cp->cs, charset->name);
+            add_string(&cp->cs, charset->name, 0);
         if (charset->aliases) {
             for (q = p = charset->aliases;; q++) {
                 if (*q == '\0' || *q == '|') {
                     if (q > p) {
                         pstrncpy(name, sizeof(name), p, q - p);
                         if (strxstart(name, cp->current, NULL))
-                            add_string(&cp->cs, name);
+                            add_string(&cp->cs, name, 0);
                     }
                     if (*q == '\0')
                         break;

Index: dired.c
===================================================================
RCS file: /sources/qemacs/qemacs/dired.c,v
retrieving revision 1.54
retrieving revision 1.55
diff -u -b -r1.54 -r1.55
--- dired.c     10 Aug 2015 19:44:19 -0000      1.54
+++ dired.c     11 Aug 2015 17:45:30 -0000      1.55
@@ -773,7 +773,7 @@
             ds->nfiles++;
             ds->total_bytes += st.st_size;
         }
-        item = add_string(&ds->items, line);
+        item = add_string(&ds->items, line, 0);
         if (item) {
             DiredItem *dip;
             int plen = strlen(p);

Index: latex-mode.c
===================================================================
RCS file: /sources/qemacs/qemacs/latex-mode.c,v
retrieving revision 1.52
retrieving revision 1.53
diff -u -b -r1.52 -r1.53
--- latex-mode.c        5 Apr 2015 18:31:01 -0000       1.52
+++ latex-mode.c        11 Aug 2015 17:45:30 -0000      1.53
@@ -223,7 +223,7 @@
 
     for (func = latex_funcs; func->name; func++) {
         if (strxstart(func->name, cp->current, NULL))
-            add_string(&cp->cs, func->name);
+            add_string(&cp->cs, func->name, 0);
     }
 }
 

Index: qe.c
===================================================================
RCS file: /sources/qemacs/qemacs/qe.c,v
retrieving revision 1.193
retrieving revision 1.194
diff -u -b -r1.193 -r1.194
--- qe.c        10 Aug 2015 20:01:02 -0000      1.193
+++ qe.c        11 Aug 2015 17:45:30 -0000      1.194
@@ -5104,7 +5104,7 @@
          */
         if (!stat(filename, &sb) && S_ISDIR(sb.st_mode))
             pstrcat(filename, sizeof(filename), "/");
-        add_string(&cp->cs, filename);
+        add_string(&cp->cs, filename, 0);
     }
 
     find_file_close(&ffst);
@@ -5161,10 +5161,19 @@
     cp->len = eb_get_contents(s->b, cp->current, sizeof(cp->current));
 }
 
+/* XXX: should have a globbing and a case insensitive option */
 void complete_test(CompleteState *cp, const char *str)
 {
-    if (!memcmp(str, cp->current, cp->len))
-        add_string(&cp->cs, str);
+    QEmacsState *qs = &qe_state;
+    int fuzzy = 0;
+
+    if (memcmp(str, cp->current, cp->len)) {
+        if (!qs->fuzzy_search
+        ||  !strmem(str, cp->current, cp->len))
+            return;
+        fuzzy = 1;
+    }
+    add_string(&cp->cs, str, fuzzy);
 }
 
 static int completion_sort_func(const void *p1, const void *p2)
@@ -5172,6 +5181,9 @@
     StringItem *item1 = *(StringItem **)p1;
     StringItem *item2 = *(StringItem **)p2;
 
+    /* Group items by group order */
+    if (item1->group != item2->group)
+        return item1->group - item2->group;
     /* Use natural sort: keep numbers in order */
     return qe_strcollate(item1->str, item2->str);
 }
@@ -5339,6 +5351,13 @@
     }
 }
 
+static void do_minibuffer_char(EditState *s, int key, int argval)
+{
+    do_char(s, key, argval);
+    if (completion_popup_window)
+        do_completion(s);
+}
+
 /* scroll in completion popup */
 void minibuf_complete_scroll_up_down(__unused__ EditState *s, int dir)
 {
@@ -5404,7 +5423,7 @@
     if (qs->last_cmd_func != (CmdFunc)do_history) {
         /* save currently edited line */
         eb_get_contents(s->b, buf, sizeof(buf));
-        set_string(hist, hist->nb_items - 1, buf);
+        set_string(hist, hist->nb_items - 1, buf, 0);
         minibuffer_history_saved_offset = s->offset;
     }
     /* insert history text */
@@ -5462,7 +5481,7 @@
         hist->nb_items--;
         qe_free(&hist->items[hist->nb_items]);
         if (buf[0] != '\0')
-            add_string(hist, buf);
+            add_string(hist, buf, 0);
     }
 
     s->b->flags |= BF_TRANSIENT;
@@ -5546,7 +5565,7 @@
     minibuffer_history_saved_offset = 0;
     if (hist) {
         minibuffer_history_index = hist->nb_items;
-        add_string(hist, "");
+        add_string(hist, "", 0);
     }
 }
 
@@ -6581,7 +6600,12 @@
     for (i = 0; i < is->pos; i++) {
         v = is->search_string[i];
         if (!(v & FOUND_TAG)) {
-            if (!buf_putc_utf8(out, v))
+            if (v < 32 || v == 127) {
+                buf_printf(out, "^%c", (v + '@') & 127);
+            } else {
+                buf_putc_utf8(out, v);
+            }
+            if (buf_avail(out) <= 0)
                 break;
         }
     }
@@ -6691,7 +6715,7 @@
         is->search_flags &= ~SEARCH_FLAG_SMARTCASE;
         break;
     default:
-        if (KEY_SPECIAL(ch)) {
+        if (KEY_SPECIAL(ch) && ch != '\t') {
             /* exit search mode */
 #if 0
             // FIXME: behaviour from qemacs-0.3pre13

Index: qe.h
===================================================================
RCS file: /sources/qemacs/qemacs/qe.h,v
retrieving revision 1.190
retrieving revision 1.191
diff -u -b -r1.190 -r1.191
--- qe.h        10 Aug 2015 19:44:20 -0000      1.190
+++ qe.h        11 Aug 2015 17:45:30 -0000      1.191
@@ -177,6 +177,7 @@
 typedef struct StringItem {
     void *opaque; /* opaque data that the user can use */
     char selected; /* true if selected */
+    char group;    /* used to group sorted items */
     char str[1];
 } StringItem;
 
@@ -340,6 +341,7 @@
 int memfind(const char *list, const char *p, int len);
 int strfind(const char *list, const char *s);
 int strxfind(const char *list, const char *s);
+const char *strmem(const char *str, const void *mem, int size);
 const void *memstr(const void *buf, int size, const char *str);
 
 #define stristart(str, val, ptr)   qe_stristart(str, val, ptr)
@@ -398,8 +400,8 @@
 
 /* Various string packages: should unify these but keep API simple */
 
-StringItem *set_string(StringArray *cs, int index, const char *str);
-StringItem *add_string(StringArray *cs, const char *str);
+StringItem *set_string(StringArray *cs, int index, const char *str, int group);
+StringItem *add_string(StringArray *cs, const char *str, int group);
 void free_strings(StringArray *cs);
 
 /* simple dynamic strings wrappers. The strings are always terminated
@@ -1432,6 +1434,7 @@
     int default_fill_column;    /* 70 */
     EOLType default_eol_type;  /* EOL_UNIX */
     int backup_inhibited;  /* prevent qemacs from backing up files */
+    int fuzzy_search;    /* use fuzzy search for completion matcher */
 };
 
 extern QEmacsState qe_state;

Index: qeconfig.h
===================================================================
RCS file: /sources/qemacs/qemacs/qeconfig.h,v
retrieving revision 1.50
retrieving revision 1.51
diff -u -b -r1.50 -r1.51
--- qeconfig.h  10 Aug 2015 19:44:20 -0000      1.50
+++ qeconfig.h  11 Aug 2015 17:45:31 -0000      1.51
@@ -421,6 +421,9 @@
 };
 
 CmdDef minibuffer_commands[] = {
+    CMD2( KEY_DEFAULT, KEY_NONE,
+         "minibuffer-insert", do_minibuffer_char, ESii,
+          "*" "kiui")
     CMD1( KEY_RET, KEY_NONE,
           "minibuffer-exit", do_minibuffer_exit, 0)
     CMD1( KEY_CTRL('g'), KEY_NONE,

Index: util.c
===================================================================
RCS file: /sources/qemacs/qemacs/util.c,v
retrieving revision 1.69
retrieving revision 1.70
diff -u -b -r1.69 -r1.70
--- util.c      19 Jun 2015 14:23:55 -0000      1.69
+++ util.c      11 Aug 2015 17:45:31 -0000      1.70
@@ -704,6 +704,33 @@
     }
 }
 
+const char *strmem(const char *str, const void *mem, int size)
+{
+    int c, len;
+    const char *p, *str_max, *p1 = mem;
+
+    if (size <= 0)
+        return (size < 0) ? NULL : str;
+
+    size--;
+    c = *p1++;
+    if (!c) {
+        /* cannot find chunk with embedded nuls */
+        return NULL;
+    }
+
+    len = strlen(str);
+    if (size >= len)
+        return NULL;
+
+    str_max = str + len - size;
+    for (p = str; p < str_max; p++) {
+        if (*p == c && !memcmp(p + 1, p1, size))
+            return p;
+    }
+    return NULL;
+}
+
 const void *memstr(const void *buf, int size, const char *str)
 {
     int c, len;
@@ -1219,7 +1246,7 @@
     count = nb_qe_colors;
     while (count > 0) {
         if (strxstart(def->name, cp->current, NULL))
-            add_string(&cp->cs, def->name);
+            add_string(&cp->cs, def->name, 0);
         def++;
         count--;
     }
@@ -1444,7 +1471,7 @@
 }
 
 /* set one string. */
-StringItem *set_string(StringArray *cs, int index, const char *str)
+StringItem *set_string(StringArray *cs, int index, const char *str, int group)
 {
     StringItem *v;
     int len;
@@ -1457,6 +1484,7 @@
     if (!v)
         return NULL;
     v->selected = 0;
+    v->group = group;
     memcpy(v->str, str, len + 1);
     if (cs->items[index])
         qe_free(&cs->items[index]);
@@ -1465,7 +1493,7 @@
 }
 
 /* make a generic array alloc */
-StringItem *add_string(StringArray *cs, const char *str)
+StringItem *add_string(StringArray *cs, const char *str, int group)
 {
     int n;
 
@@ -1476,7 +1504,7 @@
         cs->nb_allocated = n;
     }
     cs->items[cs->nb_items++] = NULL;
-    return set_string(cs, cs->nb_items - 1, str);
+    return set_string(cs, cs->nb_items - 1, str, group);
 }
 
 void free_strings(StringArray *cs)

Index: variables.c
===================================================================
RCS file: /sources/qemacs/qemacs/variables.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- variables.c 30 May 2014 23:13:04 -0000      1.15
+++ variables.c 11 Aug 2015 17:45:31 -0000      1.16
@@ -48,6 +48,7 @@
     S_VAR( "default-tab-width", default_tab_width, VAR_NUMBER, VAR_RW )
     S_VAR( "default-fill-column", default_fill_column, VAR_NUMBER, VAR_RW )
     S_VAR( "backup-inhibited", backup_inhibited, VAR_NUMBER, VAR_RW )
+    S_VAR( "fuzzy-search", fuzzy_search, VAR_NUMBER, VAR_RW )
 
     //B_VAR( "screen-charset", charset, VAR_NUMBER, VAR_RW )
 
@@ -309,6 +310,7 @@
 void do_set_variable(EditState *s, const char *name, const char *value)
 {
     qe_set_variable(s, name, value, 0);
+    do_show_variable(s, name);
 }
 
 /* should register this as help function */



reply via email to

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