qemacs-commit
[Top][All Lists]
Advanced

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

[Qemacs-commit] qemacs qe.h shell.c qe.c buffer.c


From: Charlie Gordon
Subject: [Qemacs-commit] qemacs qe.h shell.c qe.c buffer.c
Date: Sat, 15 Mar 2014 22:52:51 +0000

CVSROOT:        /sources/qemacs
Module name:    qemacs
Changes by:     Charlie Gordon <chqrlie>        14/03/15 22:52:51

Modified files:
        .              : qe.h shell.c qe.c buffer.c 

Log message:
        fix tab behaviour
        
        * add eb_insert_spaces(b, offset, count)
        * add qe_mode_set_key(m, keystr, cmdname)
        * removed duplicated pager_commands, register bindings instead
        * use undo to remove spaces inserted by tab if !indent_tabs_mode
        * change do_tab to insert indentation with spaces depending on 
          indent_tabs_mode and indent_size

CVSWeb URLs:
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.h?cvsroot=qemacs&r1=1.150&r2=1.151
http://cvs.savannah.gnu.org/viewcvs/qemacs/shell.c?cvsroot=qemacs&r1=1.87&r2=1.88
http://cvs.savannah.gnu.org/viewcvs/qemacs/qe.c?cvsroot=qemacs&r1=1.157&r2=1.158
http://cvs.savannah.gnu.org/viewcvs/qemacs/buffer.c?cvsroot=qemacs&r1=1.75&r2=1.76

Patches:
Index: qe.h
===================================================================
RCS file: /sources/qemacs/qemacs/qe.h,v
retrieving revision 1.150
retrieving revision 1.151
diff -u -b -r1.150 -r1.151
--- qe.h        12 Mar 2014 05:50:23 -0000      1.150
+++ qe.h        15 Mar 2014 22:52:51 -0000      1.151
@@ -943,6 +943,7 @@
 int eb_delete_uchar(EditBuffer *b, int offset);
 int eb_encode_uchar(EditBuffer *b, char *buf, unsigned int c);
 int eb_insert_uchar(EditBuffer *b, int offset, int c);
+int eb_insert_spaces(EditBuffer *b, int offset, int n);
 int eb_insert_utf8_buf(EditBuffer *b, int offset, const char *buf, int len);
 int eb_insert_str(EditBuffer *b, int offset, const char *str);
 int eb_match_uchar(EditBuffer *b, int offset, int c, int *offsetp);
@@ -1768,7 +1769,9 @@
 void do_set_emulation(EditState *s, const char *name);
 void do_set_trace(EditState *s);
 void do_cd(EditState *s, const char *name);
-void do_set_key(EditState *s, const char *keystr, const char *cmd_name, int 
local);
+int qe_mode_set_key(ModeDef *m, const char *keystr, const char *cmd_name);
+void do_set_key(EditState *s, const char *keystr, const char *cmd_name,
+                int local);
 //void do_unset_key(EditState *s, const char *keystr, int local);
 void do_bof(EditState *s);
 void do_eof(EditState *s);

Index: shell.c
===================================================================
RCS file: /sources/qemacs/qemacs/shell.c,v
retrieving revision 1.87
retrieving revision 1.88
diff -u -b -r1.87 -r1.88
--- shell.c     4 Mar 2014 00:36:58 -0000       1.87
+++ shell.c     15 Mar 2014 22:52:51 -0000      1.88
@@ -476,10 +476,8 @@
     for (; x > 0; x--) {
         c = eb_nextc(s->b, offset, &offset1);
         if (c == '\n') {
-            for (; x > 0; x--) {
                 /* duplicate style of last char */
-                offset += eb_insert_uchar(s->b, offset, ' ');
-            }
+            offset += eb_insert_spaces(s->b, offset, x);
             break;
         } else {
             offset = offset1;
@@ -1907,19 +1905,6 @@
     CMD_DEF_END,
 };
 
-/* pager mode specific commands */
-static CmdDef pager_commands[] = {
-    CMD1( KEY_DEL, KEY_NONE,
-          "scroll-down", do_scroll_up_down, -2 ) /* u? */
-    CMD1( KEY_SPC, KEY_NONE,
-          "scroll-up", do_scroll_up_down, 2 ) /* u? */
-    CMD3( '/', KEY_NONE,
-          "search-forward", do_search_string, ESsi, 1,
-         "s{/}|search|"
-         "v")
-    CMD_DEF_END,
-};
-
 /* shell global commands */
 static CmdDef shell_global_commands[] = {
     CMD2( KEY_CTRLXRET('\r'), KEY_NONE,
@@ -1999,6 +1984,9 @@
     qe_register_mode(&shell_mode);
     qe_register_cmd_table(shell_commands, &shell_mode);
 
+    /* global shell related commands and default keys */
+    qe_register_cmd_table(shell_global_commands, NULL);
+
     /* populate and register pager mode and commands */
     memcpy(&pager_mode, &text_mode, sizeof(ModeDef));
     pager_mode.name = "pager";
@@ -2007,10 +1995,10 @@
     pager_mode.mode_flags |= MODEF_NOCMD;
 
     qe_register_mode(&pager_mode);
-    qe_register_cmd_table(pager_commands, &pager_mode);
 
-    /* global shell related commands and default keys */
-    qe_register_cmd_table(shell_global_commands, NULL);
+    qe_mode_set_key(&pager_mode, "DEL", "scroll-down");
+    qe_mode_set_key(&pager_mode, "SPC", "scroll-up");
+    qe_mode_set_key(&pager_mode, "/", "search-forward");
 
     return 0;
 }

Index: qe.c
===================================================================
RCS file: /sources/qemacs/qemacs/qe.c,v
retrieving revision 1.157
retrieving revision 1.158
diff -u -b -r1.157 -r1.158
--- qe.c        15 Mar 2014 13:48:53 -0000      1.157
+++ qe.c        15 Mar 2014 22:52:51 -0000      1.158
@@ -294,23 +294,27 @@
     return qe_register_binding2(key, qe_find_cmd(cmd_name), m);
 }
 
-void do_set_key(EditState *s, const char *keystr,
-                const char *cmd_name, int local)
+int qe_mode_set_key(ModeDef *m, const char *keystr, const char *cmd_name)
 {
     unsigned int keys[MAX_KEYS];
     int nb_keys;
-    CmdDef *d;
 
     nb_keys = strtokeys(keystr, keys, MAX_KEYS);
     if (!nb_keys)
-        return;
+        return -2;
 
-    d = qe_find_cmd(cmd_name);
-    if (!d) {
-        put_status(s, "No command %s", cmd_name);
-        return;
-    }
-    qe_register_binding1(keys, nb_keys, d, local ? s->mode : NULL);
+    return qe_register_binding1(keys, nb_keys, qe_find_cmd(cmd_name), m);
+}
+
+void do_set_key(EditState *s, const char *keystr,
+                const char *cmd_name, int local)
+{
+    int res = qe_mode_set_key(local ? s->mode : NULL, keystr, cmd_name);
+
+    if (res == -2)
+        put_status(s, "Invalid keys: %s", keystr);
+    if (res == -1)
+        put_status(s, "Invalid command: %s", cmd_name);
 }
 
 void do_toggle_control_h(EditState *s, int set)
@@ -640,14 +644,12 @@
                 chunk_start += eb_insert_uchar(s->b, chunk_start, '\n');
                 if (offset < par_end) {
                     /* indent */
-                    for (n = indent_size; n > 0; n--) {
-                        int nb = eb_insert_uchar(s->b, chunk_start, ' ');
+                    int nb = eb_insert_spaces(s->b, offset, indent_size);
                         chunk_start += nb;
                         word_start += nb;
                         offset += nb;
                         par_end += nb;
                     }
-                }
                 col = word_size + indent_size;
             } else {
                 eb_delete_uchar(s->b, chunk_start);
@@ -774,6 +776,12 @@
     s->region_style = 0;
 
     if (argval == NO_ARG) {
+        if (s->qe_state->last_cmd_func == (CmdFunc)do_tab
+        &&  !s->indent_tabs_mode) {
+            /* Delete tab or indentation? */
+            do_undo(s);
+            return;
+        }
         if (s->qe_state->last_cmd_func != (CmdFunc)do_append_next_kill) {
             eb_prevc(s->b, s->offset, &offset1);
             if (offset1 < s->offset) {
@@ -1440,7 +1448,29 @@
 void do_tab(EditState *s, int argval)
 {
     /* CG: should do smart complete, smart indent, insert tab */
+    if (s->indent_tabs_mode) {
     do_char(s, 9, argval);
+    } else {
+        int offset = s->offset;
+        int offset0 = eb_goto_bol(s->b, offset);
+        int col = 0;
+        int tw = s->b->tab_width > 0 ? s->b->tab_width : 8;
+        int indent = s->indent_size > 0 ? s->indent_size : tw;
+
+        while (offset0 < offset) {
+            int c = eb_nextc(s->b, offset0, &offset0);
+            if (c == '\t') {
+                col += tw - col % tw;
+            } else {
+                col += unicode_glyph_tty_width(c);
+            }
+        }
+        if (argval == NO_ARG)
+            argval = 1;
+
+        s->offset += eb_insert_spaces(s->b, s->offset,
+                                      indent * argval - (col % indent));
+    }
 }
 
 void do_return(EditState *s, int move)

Index: buffer.c
===================================================================
RCS file: /sources/qemacs/qemacs/buffer.c,v
retrieving revision 1.75
retrieving revision 1.76
diff -u -b -r1.75 -r1.76
--- buffer.c    3 Mar 2014 23:35:46 -0000       1.75
+++ buffer.c    15 Mar 2014 22:52:51 -0000      1.76
@@ -1777,6 +1777,23 @@
     return eb_insert(b, offset, buf, len);
 }
 
+int eb_insert_spaces(EditBuffer *b, int offset, int n)
+{
+    char buf1[1024];
+    int size, size1;
+
+    size = size1 = 0;
+    while (n-- > 0) {
+        int clen = eb_encode_uchar(b, buf1 + size1, ' ');
+        size1 += clen;
+        if (size1 > ssizeof(buf1) - MAX_CHAR_BYTES || n == 0) {
+            size += eb_insert(b, offset + size, buf1, size1);
+            size1 = 0;
+        }
+    }
+    return size;
+}
+
 /* Insert buffer with utf8 chars according to buffer encoding */
 /* Return number of bytes inserted */
 int eb_insert_utf8_buf(EditBuffer *b, int offset, const char *buf, int len)
@@ -1892,10 +1909,7 @@
             break;
         i++;
     }
-    while (i < n) {
-        eb_insert_uchar(b, b->total_size, ' ');
-        i++;
-    }
+    eb_insert_spaces(b, b->total_size, n - i);
 }
 #endif
 



reply via email to

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