qemacs-commit
[Top][All Lists]
Advanced

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

[Qemacs-commit] qemacs qe.h qe.c buffer.c extras.c markdown.c o...


From: Charlie Gordon
Subject: [Qemacs-commit] qemacs qe.h qe.c buffer.c extras.c markdown.c o...
Date: Fri, 21 Mar 2014 20:49:31 +0000

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        14/03/21 20:49:30

Modified files:
        .              : qe.h qe.c buffer.c extras.c markdown.c 
                         orgmode.c 

Log message:
        add tabify / untabify support
        
        * add tabify-buffer and tabify-region
        * add untabify-buffer and untabify-region
        * make eb_delete and eb_delete_range return actual number of bytes 
removed
        * simplify some deletions with better use of eb_delete_xxx functions

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.h?cvsroot=qemacs&r1=1.154&r2=1.155
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.c?cvsroot=qemacs&r1=1.160&r2=1.161
http://cvs.savannah.gnu.org/viewcvs/qemacs/buffer.c?cvsroot=qemacs&r1=1.77&r2=1.78
http://cvs.savannah.gnu.org/viewcvs/qemacs/extras.c?cvsroot=qemacs&r1=1.24&r2=1.25
http://cvs.savannah.gnu.org/viewcvs/qemacs/markdown.c?cvsroot=qemacs&r1=1.7&r2=1.8
http://cvs.savannah.gnu.org/viewcvs/qemacs/orgmode.c?cvsroot=qemacs&r1=1.15&r2=1.16

Patches:
Index: qe.h
===================================================================
RCS file: /sources/qemacs/qemacs/qe.h,v
retrieving revision 1.154
retrieving revision 1.155
diff -u -b -r1.154 -r1.155
--- qe.h        19 Mar 2014 19:42:31 -0000      1.154
+++ qe.h        21 Mar 2014 20:49:30 -0000      1.155
@@ -893,7 +893,7 @@
                      EditBuffer *src, int src_offset,
                      int size);
 int eb_insert(EditBuffer *b, int offset, const void *buf, int size);
-void eb_delete(EditBuffer *b, int offset, int size);
+int eb_delete(EditBuffer *b, int offset, int size);
 void eb_replace(EditBuffer *b, int offset, int size,
                 const void *buf, int size1);
 void log_reset(EditBuffer *b);

Index: qe.c
===================================================================
RCS file: /sources/qemacs/qemacs/qe.c,v
retrieving revision 1.160
retrieving revision 1.161
diff -u -b -r1.160 -r1.161
--- qe.c        19 Mar 2014 19:42:30 -0000      1.160
+++ qe.c        21 Mar 2014 20:49:30 -0000      1.161
@@ -637,7 +637,7 @@
             /* first word: preserve spaces */
             col += space_size + word_size;
         } else {
-            /* insert space single space then word */
+            /* insert space single space the word */
             if (offset == par_end
             ||  (col + 1 + word_size > s->b->fill_column)) {
                 eb_delete_uchar(s->b, chunk_start);
@@ -736,15 +736,14 @@
 
 void do_delete_char(EditState *s, int argval)
 {
-    int endpos, i, offset1;
+    int endpos, i;
 
     if (s->b->flags & BF_READONLY)
         return;
 
     if (argval == NO_ARG) {
         if (s->qe_state->last_cmd_func != (CmdFunc)do_append_next_kill) {
-            eb_nextc(s->b, s->offset, &offset1);
-            eb_delete(s->b, s->offset, offset1 - s->offset);
+            eb_delete_uchar(s->b, s->offset);
             return;
         }
         argval = 1;
@@ -785,7 +784,7 @@
         if (s->qe_state->last_cmd_func != (CmdFunc)do_append_next_kill) {
             eb_prevc(s->b, s->offset, &offset1);
             if (offset1 < s->offset) {
-                s->offset = eb_delete_range(s->b, offset1, s->offset);
+                eb_delete_range(s->b, offset1, s->offset);
                 /* special case for composing */
                 if (s->compose_len > 0)
                     s->compose_len--;
@@ -6549,7 +6548,8 @@
 
     eb_delete(s->b, is->found_offset, is->found_end - is->found_offset);
     is->found_offset += eb_insert_utf8_buf(s->b, is->found_offset,
-                                           is->replace_bytes, 
is->replace_bytes_len);
+                                           is->replace_bytes,
+                                           is->replace_bytes_len);
     is->nb_reps++;
 }
 

Index: buffer.c
===================================================================
RCS file: /sources/qemacs/qemacs/buffer.c,v
retrieving revision 1.77
retrieving revision 1.78
diff -u -b -r1.77 -r1.78
--- buffer.c    15 Mar 2014 23:15:53 -0000      1.77
+++ buffer.c    21 Mar 2014 20:49:30 -0000      1.78
@@ -370,20 +370,24 @@
     return size;
 }
 
-/* We must have : 0 <= offset <= b->total_size */
-void eb_delete(EditBuffer *b, int offset, int size)
+/* We must have : 0 <= offset <= b->total_size,
+ * return actual number of bytes removed.
+ */
+int eb_delete(EditBuffer *b, int offset, int size)
 {
-    int n, len;
+    int n, len, size0;
     Page *del_start, *p;
 
     if (b->flags & BF_READONLY)
-        return;
+        return 0;
+
+    if (offset < 0 || offset >= b->total_size || size <= 0)
+        return 0;
 
-    if (offset + size > b->total_size)
+    if (size > b->total_size - offset)
         size = b->total_size - offset;
 
-    if (offset < 0 || size <= 0)
-        return;
+    size0 = size;
 
     /* dispatch callbacks before buffer update */
     eb_addlog(b, LOGOP_DELETE, offset, size);
@@ -432,6 +436,8 @@
 
     /* the page cache is no longer valid */
     b->cur_page = NULL;
+
+    return size0;
 }
 
 /* flush the log */
@@ -1214,17 +1220,19 @@
 /* delete one character at offset 'offset', return number of bytes removed */
 int eb_delete_uchar(EditBuffer *b, int offset)
 {
-    int offset1, size = 0;
+    int offset1;
     
     eb_nextc(b, offset, &offset1);
     if (offset < offset1) {
-        size = offset1 - offset;
-        eb_delete(b, offset, size);
+        return eb_delete(b, offset, offset1 - offset);
+    } else {
+        return 0;
     }
-    return size;
 }
 
-/* return number of bytes deleted */
+/* return number of bytes deleted. n can be negative to delete
+ * characters before offset
+ */
 int eb_delete_chars(EditBuffer *b, int offset, int n)
 {
     int offset1 = eb_skip_chars(b, offset, n);
@@ -1236,8 +1244,7 @@
         size = -size;
     }        
 
-    eb_delete(b, offset, size);
-    return size;
+    return eb_delete(b, offset, size);
 }
 
 /* XXX: only stateless charsets are supported */
@@ -1453,7 +1460,7 @@
 }
 
 /* delete a range of bytes from the buffer, bounds in any order, return
- * lower bound.
+ * number of bytes removed.
  */
 int eb_delete_range(EditBuffer *b, int p1, int p2)
 {
@@ -1462,8 +1469,7 @@
         p1 = p2;
         p2 = tmp;
     }
-    eb_delete(b, p1, p2 - p1);
-    return p1;
+    return eb_delete(b, p1, p2 - p1);
 }
 
 /* replace 'size' bytes at offset 'offset' with 'size1' bytes from 'buf' */

Index: extras.c
===================================================================
RCS file: /sources/qemacs/qemacs/extras.c,v
retrieving revision 1.24
retrieving revision 1.25
diff -u -b -r1.24 -r1.25
--- extras.c    18 Mar 2014 08:20:04 -0000      1.24
+++ extras.c    21 Mar 2014 20:49:30 -0000      1.25
@@ -164,6 +164,140 @@
     eb_delete_range(b, from, offset);
 }
 
+void eb_tabify(EditBuffer *b, int p1, int p2)
+{
+    /* We implement a complete analysis of the region instead of
+     * scanning for certain space patterns (such as / [ \t]/).  It is
+     * fast enough, sometimes even faster, more concise and more
+     * correct for pathological case where initial space falls on tab
+     * column.
+     */
+    /* XXX: should extend for language modes to not replace spaces
+     * inside character constants, strings, regex, comments,
+     * preprocessor, etc.  Implementation is not too difficult with a
+     * new buffer reader eb_nextc_style() using with colorizer and a
+     * one line cache.
+     */
+    int tw = b->tab_width > 0 ? b->tab_width : 8;
+    int start = max(0, min(p1, p2));
+    int stop = min(b->total_size, max(p1, p2));
+    int col;
+    int offset, offset1, offset2, delta;
+
+    col = 0;
+    offset = eb_goto_bol(b, start);
+
+    for (; offset < stop; offset = offset1) {
+        int c = eb_nextc(b, offset, &offset1);
+        if (c == '\r' || c == '\n') {
+            col = 0;
+            continue;
+        }
+        if (c == '\t') {
+            col += tw - col % tw;
+            continue;
+        }
+        col += unicode_glyph_tty_width(c);
+        if (c != ' ' || offset < start || col % tw == 0)
+            continue;
+        while (offset1 < stop) {
+            c = eb_nextc(b, offset1, &offset2);
+            if (c == ' ') {
+                col += unicode_glyph_tty_width(c);
+                offset1 = offset2;
+                if (col % tw == 0) {
+                    delta = eb_delete_range(b, offset, offset1);
+                    delta = eb_insert_uchar(b, offset, '\t') - delta;
+                    offset1 += delta;
+                    stop += delta;
+                    break;
+                }
+                continue;
+            } else
+            if (c == '\t') {
+                col += tw - col % tw;
+                delta = -eb_delete_range(b, offset, offset1);
+                offset1 = offset2;
+                offset1 += delta;
+                stop += delta;
+            }
+            break;
+        }
+    }
+}
+
+void do_tabify_buffer(EditState *s)
+{
+    /* deactivate region hilite */
+    s->region_style = 0;
+
+    eb_tabify(s->b, 0, s->b->total_size);
+}
+
+void do_tabify_region(EditState *s)
+{
+    /* deactivate region hilite */
+    s->region_style = 0;
+
+    eb_tabify(s->b, s->b->mark, s->offset);
+}
+
+void eb_untabify(EditBuffer *b, int p1, int p2)
+{
+    /* We implement a complete analysis of the region instead of
+     * potentially faster scan for '\t'.  It is fast enough and even
+     * faster if there are lots of tabs.
+     */
+    int tw = b->tab_width > 0 ? b->tab_width : 8;
+    int start = max(0, min(p1, p2));
+    int stop = min(b->total_size, max(p1, p2));
+    int col, col0;
+    int offset, offset1, offset2, delta;
+
+    col = 0;
+    offset = eb_goto_bol(b, start);
+
+    for (; offset < stop; offset = offset1) {
+        int c = eb_nextc(b, offset, &offset1);
+        if (c == '\r' || c == '\n') {
+            col = 0;
+            continue;
+        }
+        if (c != '\t') {
+            col += unicode_glyph_tty_width(c);
+            continue;
+        }
+        col0 = col;
+        col += tw - col % tw;
+        if (offset < start)
+            continue;
+        while (eb_nextc(b, offset1, &offset2) == '\t') {
+            col += tw;
+            offset1 = offset2;
+        }
+        delta = eb_delete_range(b, offset, offset1);
+        delta = eb_insert_spaces(b, offset, col - col0) - delta;
+        offset1 += delta;
+        stop += delta;
+    }
+}
+
+void do_untabify_buffer(EditState *s)
+{
+    /* deactivate region hilite */
+    s->region_style = 0;
+
+    eb_untabify(s->b, 0, s->b->total_size);
+}
+
+void do_untabify_region(EditState *s)
+{
+    /* deactivate region hilite */
+    s->region_style = 0;
+
+    eb_untabify(s->b, s->b->mark, s->offset);
+}
+
 void do_show_date_and_time(EditState *s, int argval)
 {
     time_t t = argval;
@@ -866,6 +1000,15 @@
           "delete-horizontal-space", do_delete_horizontal_space, ES, "*")
     CMD2( KEY_CTRLX(KEY_CTRL('o')), KEY_NONE,
           "delete-blank-lines", do_delete_blank_lines, ES, "*")
+    CMD2( KEY_NONE, KEY_NONE,
+          "tabify-region", do_tabify_region, ES, "*")
+    CMD2( KEY_NONE, KEY_NONE,
+          "tabify-buffer", do_tabify_buffer, ES, "*")
+    CMD2( KEY_NONE, KEY_NONE,
+          "untabify-region", do_untabify_region, ES, "*")
+    CMD2( KEY_NONE, KEY_NONE,
+          "untabify-buffer", do_untabify_buffer, ES, "*")
+
     CMD2( KEY_CTRLX('t'), KEY_NONE,
           "show-date-and-time", do_show_date_and_time, ESi, "ui")
 

Index: markdown.c
===================================================================
RCS file: /sources/qemacs/qemacs/markdown.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -b -r1.7 -r1.8
--- markdown.c  18 Mar 2014 08:20:05 -0000      1.7
+++ markdown.c  21 Mar 2014 20:49:30 -0000      1.8
@@ -614,9 +614,11 @@
     } else {
         offset = offset0;
     }        
-    while (eb_nextc(s->b, offset, &offset1) == ' ') {
-        eb_delete_uchar(s->b, offset);
-    }
+    offset1 = offset;
+    while (eb_match_uchar(s->b, offset1, ' ', &offset1))
+        continue;
+    eb_delete(s->b, offset, offset1 - offset);
+
     while (level-- > 0) {
         offset += eb_insert_uchar(s->b, offset, '#');
     }

Index: orgmode.c
===================================================================
RCS file: /sources/qemacs/qemacs/orgmode.c,v
retrieving revision 1.15
retrieving revision 1.16
diff -u -b -r1.15 -r1.16
--- orgmode.c   18 Mar 2014 08:20:05 -0000      1.15
+++ orgmode.c   21 Mar 2014 20:49:30 -0000      1.16
@@ -517,9 +517,11 @@
     } else {
         offset = offset0;
     }        
-    while (eb_nextc(s->b, offset, &offset1) == ' ') {
-        eb_delete_uchar(s->b, offset);
-    }
+    offset1 = offset;
+    while (eb_match_uchar(s->b, offset1, ' ', &offset1))
+        continue;
+    eb_delete(s->b, offset, offset1 - offset);
+
     while (level-- > 0) {
         offset += eb_insert_uchar(s->b, offset, '*');
     }



reply via email to

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