[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, '*');
}
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemacs-commit] qemacs qe.h qe.c buffer.c extras.c markdown.c o...,
Charlie Gordon <=