tvi: distinct keymap for insert mode and command prompt - neatvi - [fork] simpl… | |
git clone git://src.adamsgaard.dk/neatvi | |
Log | |
Files | |
Refs | |
README | |
--- | |
commit 6f05dff38aadda562cfbcf7532af2119a0e8d998 | |
parent 685cdd8a70a01377e93fb1e49a6674200c92a5cd | |
Author: Ali Gholami Rudi <[email protected]> | |
Date: Wed, 20 May 2015 15:58:12 +0430 | |
vi: distinct keymap for insert mode and command prompt | |
Diffstat: | |
M led.c | 35 +++++++++++++++--------------… | |
M vi.c | 19 +++++++++++-------- | |
M vi.h | 6 +++--- | |
3 files changed, 31 insertions(+), 29 deletions(-) | |
--- | |
diff --git a/led.c b/led.c | |
t@@ -6,22 +6,22 @@ | |
#include "kmap.h" | |
static char **kmaps[] = {kmap_en, kmap_fa}; | |
-static char **led_kmap = kmap_en; | |
static char **kmap_find(char *name) | |
{ | |
int i; | |
for (i = 0; i < LEN(kmaps); i++) | |
- if (kmaps[i][0] && !strcmp(name, kmaps[i][0])) | |
+ if (name && kmaps[i][0] && !strcmp(name, kmaps[i][0])) | |
return kmaps[i]; | |
return kmap_en; | |
} | |
-static char *kmap_map(char **kmap, int c) | |
+static char *kmap_map(char *kmap, int c) | |
{ | |
static char cs[4]; | |
+ char **keymap = kmap_find(kmap); | |
cs[0] = c; | |
- return kmap[c] ? kmap[c] : cs; | |
+ return keymap[c] ? keymap[c] : cs; | |
} | |
/* map cursor horizontal position to terminal column number */ | |
t@@ -30,9 +30,9 @@ int led_pos(char *s, int pos) | |
return dir_context(s) >= 0 ? pos : xcols - pos - 1; | |
} | |
-char *led_keymap(int c) | |
+char *led_keymap(char *kmap, int c) | |
{ | |
- return c >= 0 ? kmap_map(led_kmap, c) : NULL; | |
+ return c >= 0 ? kmap_map(kmap, c) : NULL; | |
} | |
static char *led_render(char *s0) | |
t@@ -112,7 +112,7 @@ static int led_lastword(char *s) | |
return r - s; | |
} | |
-static void led_printparts(char *ai, char *pref, char *main, char *post) | |
+static void led_printparts(char *ai, char *pref, char *main, char *post, char … | |
{ | |
struct sbuf *ln; | |
int off, pos; | |
t@@ -125,7 +125,7 @@ static void led_printparts(char *ai, char *pref, char *mai… | |
/* cursor position for inserting the next character */ | |
if (*pref || *main || *ai) { | |
int len = sbuf_len(ln); | |
- sbuf_str(ln, kmap_map(led_kmap, 'a')); | |
+ sbuf_str(ln, kmap_map(kmap, 'a')); | |
sbuf_str(ln, post); | |
idir = ren_pos(sbuf_buf(ln), off) - | |
ren_pos(sbuf_buf(ln), off - 1) < 0 ? -1 : +1; | |
t@@ -138,7 +138,7 @@ static void led_printparts(char *ai, char *pref, char *mai… | |
sbuf_free(ln); | |
} | |
-static char *led_line(char *pref, char *post, char *ai, int ai_max, int *key, … | |
+static char *led_line(char *pref, char *post, char *ai, int ai_max, int *key, … | |
{ | |
struct sbuf *sb; | |
int ai_len = strlen(ai); | |
t@@ -149,14 +149,14 @@ static char *led_line(char *pref, char *post, char *ai, … | |
if (!post) | |
post = ""; | |
while (1) { | |
- led_printparts(ai, pref, sbuf_buf(sb), post); | |
+ led_printparts(ai, pref, sbuf_buf(sb), post, *kmap); | |
c = term_read(-1); | |
switch (c) { | |
case TK_CTL('f'): | |
- *kmap = kmap_find(conf_kmapalt()); | |
+ *kmap = conf_kmapalt(); | |
continue; | |
case TK_CTL('e'): | |
- *kmap = kmap_en; | |
+ *kmap = kmap_en[0]; | |
continue; | |
case TK_CTL('h'): | |
case 127: | |
t@@ -194,12 +194,11 @@ static char *led_line(char *pref, char *post, char *ai, … | |
} | |
/* read an ex command */ | |
-char *led_prompt(char *pref, char *post) | |
+char *led_prompt(char *pref, char *post, char **kmap) | |
{ | |
- char **kmap = kmap_en; | |
char *s; | |
int key; | |
- s = led_line(pref, post, "", 0, &key, &kmap); | |
+ s = led_line(pref, post, "", 0, &key, kmap); | |
if (key == '\n') | |
return s; | |
free(s); | |
t@@ -207,13 +206,13 @@ char *led_prompt(char *pref, char *post) | |
} | |
/* read visual command input */ | |
-char *led_input(char *pref, char *post, char *ai, int ai_max) | |
+char *led_input(char *pref, char *post, char *ai, int ai_max, char **kmap) | |
{ | |
struct sbuf *sb = sbuf_make(); | |
char *first_ai = NULL; | |
int key; | |
while (1) { | |
- char *ln = led_line(pref, post, ai, ai_max, &key, &led_kmap); | |
+ char *ln = led_line(pref, post, ai, ai_max, &key, kmap); | |
if (pref) | |
first_ai = uc_dup(ai); | |
if (!pref) | |
t@@ -221,7 +220,7 @@ char *led_input(char *pref, char *post, char *ai, int ai_m… | |
sbuf_str(sb, ln); | |
if (key == '\n') | |
sbuf_chr(sb, '\n'); | |
- led_printparts(ai, pref ? pref : "", ln, key == '\n' ? "" : po… | |
+ led_printparts(ai, pref ? pref : "", ln, key == '\n' ? "" : po… | |
if (key == '\n') | |
term_chr('\n'); | |
pref = NULL; | |
diff --git a/vi.c b/vi.c | |
t@@ -19,6 +19,7 @@ static char vi_charlast[8]; /* the last character sea… | |
static int vi_charcmd; /* the character finding command */ | |
static int vi_arg1, vi_arg2; /* the first and second arguments */ | |
static int vi_ybuf; /* current yank buffer */ | |
+static char *vi_kmap; /* current insertion keymap */ | |
static void vi_drawmsg(void) | |
{ | |
t@@ -56,14 +57,14 @@ static void vi_back(int c) | |
static char *vi_char(void) | |
{ | |
int key = vi_read(); | |
- return TK_INT(key) ? NULL : led_keymap(key); | |
+ return TK_INT(key) ? NULL : led_keymap(vi_kmap, key); | |
} | |
-static char *vi_prompt(char *msg) | |
+static char *vi_prompt(char *msg, char **kmap) | |
{ | |
term_pos(xrows, led_pos(msg, 0)); | |
term_kill(); | |
- return led_prompt(msg, ""); | |
+ return led_prompt(msg, "", kmap); | |
} | |
char *ex_read(char *msg) | |
t@@ -71,7 +72,7 @@ char *ex_read(char *msg) | |
struct sbuf *sb; | |
char c; | |
if (xled) { | |
- char *s = led_prompt(msg, ""); | |
+ char *s = led_prompt(msg, "", &vi_kmap); | |
if (s) | |
term_chr('\n'); | |
return s; | |
t@@ -225,7 +226,7 @@ static int vi_search(int cmd, int cnt, int *row, int *col) | |
char *off = ""; | |
if (cmd == '/' || cmd == '?') { | |
char sign[4] = {cmd}; | |
- char *kw = vi_prompt(sign); | |
+ char *kw = vi_prompt(sign, &vi_kmap); | |
if (!kw) | |
return 1; | |
vi_finddir = cmd == '/' ? +1 : -1; | |
t@@ -685,7 +686,7 @@ static char *vi_input(char *pref, char *post, int *row, in… | |
int last, off; | |
if (xai) | |
pref += indentscopy(ai, pref, sizeof(ai)); | |
- rep = led_input(pref, post, ai, xai ? sizeof(ai) - 1 : 0); | |
+ rep = led_input(pref, post, ai, xai ? sizeof(ai) - 1 : 0, &vi_kmap); | |
if (!rep) | |
return NULL; | |
sb = sbuf_make(); | |
t@@ -741,7 +742,8 @@ static void vi_pipe(int r1, int r2) | |
{ | |
char *text; | |
char *rep; | |
- char *cmd = vi_prompt("!"); | |
+ char *kmap = NULL; | |
+ char *cmd = vi_prompt("!", &kmap); | |
if (!cmd) | |
return; | |
if (r2 < r1) | |
t@@ -1005,6 +1007,7 @@ static void vi(void) | |
{ | |
int mark; | |
char *ln; | |
+ char *kmap = NULL; | |
term_init(); | |
xtop = 0; | |
xrow = 0; | |
t@@ -1080,7 +1083,7 @@ static void vi(void) | |
redraw = 1; | |
break; | |
case ':': | |
- ln = vi_prompt(":"); | |
+ ln = vi_prompt(":", &kmap); | |
if (ln && ln[0]) { | |
ex_command(ln); | |
redraw = 1; | |
diff --git a/vi.h b/vi.h | |
t@@ -109,10 +109,10 @@ void term_commit(void); | |
#define TK_ESC (TK_CTL('[')) | |
/* line-oriented input and output */ | |
-char *led_prompt(char *pref, char *post); | |
-char *led_input(char *pref, char *post, char *ai, int ai_max); | |
+char *led_prompt(char *pref, char *post, char **kmap); | |
+char *led_input(char *pref, char *post, char *ai, int ai_max, char **kmap); | |
void led_print(char *msg, int row); | |
-char *led_keymap(int c); | |
+char *led_keymap(char *kmap, int c); | |
int led_pos(char *s, int pos); | |
/* ex commands */ |