[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Qemacs-commit] qemacs qe.h shell.c qe.c buffer.c,
Charlie Gordon <=