From 9e76a7c658e3ea68a1d5de81cb4f1cf1a0f4f6d9 Mon Sep 17 00:00:00 2001 From: Ali Gholami Rudi Date: Thu, 4 May 2017 18:08:14 +0430 Subject: [PATCH] ex: represent each keymap with its index in kmaps[] --- conf.c | 11 ++++++++--- ex.c | 20 +++++--------------- led.c | 22 +++++++++++----------- vi.c | 14 +++++++------- vi.h | 13 +++++++------ 5 files changed, 38 insertions(+), 42 deletions(-) diff --git a/conf.c b/conf.c index fb7b0cc..4de1622 100644 --- a/conf.c +++ b/conf.c @@ -75,13 +75,18 @@ int conf_highlight_revdir(int *att) return 0; } -char **conf_kmap(char *name) +char **conf_kmap(int id) +{ + return kmaps[id]; +} + +int conf_kmapfind(char *name) { int i; for (i = 0; i < LEN(kmaps); i++) if (name && kmaps[i][0] && !strcmp(name, kmaps[i][0])) - return kmaps[i]; - return kmap_en; + return i; + return 0; } char *conf_digraph(int c1, int c2) diff --git a/ex.c b/ex.c index d635964..0adbb63 100644 --- a/ex.c +++ b/ex.c @@ -19,11 +19,11 @@ int xled = 1; /* use the line editor */ int xtd = +1; /* current text direction */ int xshape = 1; /* perform letter shaping */ int xorder = 1; /* change the order of characters */ +int xkmap = 0; /* the current keymap */ +int xkmap_alt = 1; /* the alternate keymap */ static char xkwd[EXLEN]; /* the last searched keyword */ static char xrep[EXLEN]; /* the last replacement */ static int xkwddir; /* the last search direction */ -static char *xkmap = "en"; /* the current keymap */ -static char xkmap2[8] = "fa"; /* the alternate keymap */ static struct buf { char ft[32]; @@ -111,16 +111,6 @@ char *ex_filetype(void) return xhl ? bufs[0].ft : ""; } -char **ex_kmap(void) -{ - return &xkmap; -} - -char *ex_kmapalt(void) -{ - return xkmap2; -} - /* read ex command location */ static char *ex_loc(char *s, char *loc) { @@ -784,11 +774,11 @@ static int ec_cmap(char *ec) ex_cmd(ec, cmd); ex_arg(ec, arg); if (arg[0]) - snprintf(xkmap2, sizeof(xkmap2), arg); + xkmap_alt = conf_kmapfind(arg); else - ex_print(xkmap); + ex_print(conf_kmap(xkmap)[0]); if (arg[0] && !strchr(cmd, '!')) - xkmap = xkmap2; + xkmap = xkmap_alt; return 0; } diff --git a/led.c b/led.c index a08bd00..74f81b0 100644 --- a/led.c +++ b/led.c @@ -6,7 +6,7 @@ #include #include "vi.h" -static char *kmap_map(char *kmap, int c) +static char *kmap_map(int kmap, int c) { static char cs[4]; char **keymap = conf_kmap(kmap); @@ -160,7 +160,7 @@ static int led_lastword(char *s) return r - s; } -static void led_printparts(char *ai, char *pref, char *main, char *post, char *kmap) +static void led_printparts(char *ai, char *pref, char *main, char *post, int kmap) { struct sbuf *ln; int off, pos; @@ -193,7 +193,7 @@ static void led_printparts(char *ai, char *pref, char *main, char *post, char *k } /* continue reading the character starting with c */ -static char *led_readchar(int c, char *kmap) +static char *led_readchar(int c, int kmap) { static char buf[8]; int c1, c2; @@ -224,16 +224,16 @@ static char *led_readchar(int c, char *kmap) } /* read a character from the terminal */ -char *led_read(char **kmap) +char *led_read(int *kmap) { int c = term_read(); while (!TK_INT(c)) { switch (c) { case TK_CTL('f'): - *kmap = ex_kmapalt(); + *kmap = xkmap_alt; break; case TK_CTL('e'): - *kmap = "en"; + *kmap = 0; break; default: return led_readchar(c, *kmap); @@ -244,7 +244,7 @@ char *led_read(char **kmap) } /* read a line from the terminal */ -static char *led_line(char *pref, char *post, char *ai, int ai_max, int *key, char **kmap) +static char *led_line(char *pref, char *post, char *ai, int ai_max, int *key, int *kmap) { struct sbuf *sb; int ai_len = strlen(ai); @@ -260,10 +260,10 @@ static char *led_line(char *pref, char *post, char *ai, int ai_max, int *key, ch c = term_read(); switch (c) { case TK_CTL('f'): - *kmap = ex_kmapalt(); + *kmap = xkmap_alt; continue; case TK_CTL('e'): - *kmap = "en"; + *kmap = 0; continue; case TK_CTL('h'): case 127: @@ -304,7 +304,7 @@ static char *led_line(char *pref, char *post, char *ai, int ai_max, int *key, ch } /* read an ex command */ -char *led_prompt(char *pref, char *post, char **kmap) +char *led_prompt(char *pref, char *post, int *kmap) { int key; int td = td_set(+2); @@ -325,7 +325,7 @@ char *led_prompt(char *pref, char *post, char **kmap) } /* read visual command input */ -char *led_input(char *pref, char *post, char **kmap) +char *led_input(char *pref, char *post, int *kmap) { struct sbuf *sb = sbuf_make(); char ai[128]; diff --git a/vi.c b/vi.c index fd48705..520e849 100644 --- a/vi.c +++ b/vi.c @@ -118,10 +118,10 @@ static void vi_back(int c) static char *vi_char(void) { - return led_read(ex_kmap()); + return led_read(&xkmap); } -static char *vi_prompt(char *msg, char **kmap) +static char *vi_prompt(char *msg, int *kmap) { char *r, *s; term_pos(xrows, led_pos(msg, 0)); @@ -140,7 +140,7 @@ char *ex_read(char *msg) struct sbuf *sb; char c; if (xled) { - char *s = led_prompt(msg, "", ex_kmap()); + char *s = led_prompt(msg, "", &xkmap); if (s) term_chr('\n'); return s; @@ -257,7 +257,7 @@ static int vi_search(int cmd, int cnt, int *row, int *off) if (cmd == '/' || cmd == '?') { char sign[4] = {cmd}; struct sbuf *sb; - char *kw = vi_prompt(sign, ex_kmap()); + char *kw = vi_prompt(sign, &xkmap); char *re; if (!kw) return 1; @@ -655,7 +655,7 @@ static int charcount(char *text, char *post) static char *vi_input(char *pref, char *post, int *row, int *off) { - char *rep = led_input(pref, post, ex_kmap()); + char *rep = led_input(pref, post, &xkmap); if (!rep) return NULL; *row = linecount(rep) - 1; @@ -737,7 +737,7 @@ static void vi_pipe(int r1, int r2) { char *text; char *rep; - char *kmap = NULL; + int kmap = 0; char *cmd = vi_prompt("!", &kmap); if (!cmd) return; @@ -1042,7 +1042,7 @@ static void vi(void) int xcol; int mark; char *ln; - char *kmap = NULL; + int kmap = 0; xtop = MAX(0, xrow - xrows / 2); xoff = 0; xcol = vi_off2col(xb, xrow, xoff); diff --git a/vi.h b/vi.h index 4feb01d..078ca2c 100644 --- a/vi.h +++ b/vi.h @@ -129,9 +129,9 @@ char *term_cmd(int *n); #define TK_ESC (TK_CTL('[')) /* line-oriented input and output */ -char *led_prompt(char *pref, char *post, char **kmap); -char *led_input(char *pref, char *post, char **kmap); -char *led_read(char **kmap); +char *led_prompt(char *pref, char *post, int *kmap); +char *led_input(char *pref, char *post, int *kmap); +char *led_read(int *kmap); void led_print(char *msg, int row); void led_printmsg(char *s, int row); int led_pos(char *s, int pos); @@ -146,8 +146,6 @@ int ex_init(char **files); void ex_done(void); char *ex_path(void); char *ex_filetype(void); -char **ex_kmap(void); -char *ex_kmapalt(void); struct lbuf *ex_lbuf(void); int ex_kwd(char **kwd, int *dir); void ex_kwdset(char *kwd, int dir); @@ -185,7 +183,8 @@ int conf_placeholder(int idx, char **s, char **d, int *wid); int conf_highlight(int idx, char **ft, int **att, char **pat, int *end); int conf_filetype(int idx, char **ft, char **pat); int conf_highlight_revdir(int *att); -char **conf_kmap(char *name); +char **conf_kmap(int id); +int conf_kmapfind(char *name); char *conf_digraph(int c1, int c2); /* global variables */ @@ -202,3 +201,5 @@ extern int xtd; extern int xshape; extern int xorder; extern int xhl; +extern int xkmap; +extern int xkmap_alt; -- 2.11.4.GIT