8 static char **led_kmap
= kmap_def
;
10 static char *keymap(char **kmap
, int c
)
14 return kmap
[c
] ? kmap
[c
] : cs
;
17 /* map cursor horizontal position to terminal column number */
18 int led_pos(char *s
, int pos
)
20 return dir_context(s
) >= 0 ? pos
: xcols
- pos
- 1;
23 char *led_keymap(int c
)
25 return c
>= 0 ? keymap(led_kmap
, c
) : NULL
;
28 static char *led_render(char *s0
)
31 int *pos
; /* pos[i]: the screen position of the i-th character */
32 int *off
; /* off[i]: the character at screen position i */
33 char **chrs
; /* chrs[i]: the i-th character in s1 */
37 s1
= ren_translate(s0
? s0
: "");
38 chrs
= uc_chop(s1
, &n
);
39 pos
= ren_position(s0
);
40 off
= malloc(xcols
* sizeof(off
[0]));
41 memset(off
, 0xff, xcols
* sizeof(off
[0]));
42 for (i
= 0; i
< n
; i
++) {
43 int curpos
= led_pos(s0
, pos
[i
]);
44 if (curpos
>= 0 && curpos
< xcols
) {
51 for (i
= 0; i
<= maxcol
; i
++) {
52 if (off
[i
] >= 0 && uc_isprint(chrs
[off
[i
]]))
53 sbuf_mem(out
, chrs
[off
[i
]], uc_len(chrs
[off
[i
]]));
61 return sbuf_done(out
);
64 void led_print(char *s
, int row
)
66 char *r
= led_render(s
);
73 static int led_lastchar(char *s
)
75 char *r
= *s
? strchr(s
, '\0') : s
;
81 static int led_lastword(char *s
)
83 char *r
= *s
? uc_beg(s
, strchr(s
, '\0') - 1) : s
;
85 while (r
> s
&& uc_isspace(r
))
87 kind
= r
> s
? uc_kind(r
) : 0;
88 while (r
> s
&& uc_kind(uc_beg(s
, r
- 1)) == kind
)
93 static void led_printparts(char *ai
, char *pref
, char *main
, char *post
)
101 off
= uc_slen(sbuf_buf(ln
));
103 /* cursor position for inserting the next character */
105 pos
= ren_cursor(sbuf_buf(ln
), ren_pos(sbuf_buf(ln
), off
));
107 int len
= sbuf_len(ln
);
108 sbuf_str(ln
, keymap(led_kmap
, 'a'));
109 pos
= ren_cursor(sbuf_buf(ln
), ren_pos(sbuf_buf(ln
), off
));
112 led_print(sbuf_buf(ln
), -1);
113 term_pos(-1, led_pos(sbuf_buf(ln
), pos
));
117 static char *led_line(char *pref
, char *post
, char *ai
, int ai_max
, int *key
, char ***kmap
)
120 int ai_len
= strlen(ai
);
128 led_printparts(ai
, pref
, sbuf_buf(sb
), post
);
140 sbuf_cut(sb
, led_lastchar(sbuf_buf(sb
)));
146 sbuf_chr(sb
, term_read(-1));
150 sbuf_cut(sb
, led_lastword(sbuf_buf(sb
)));
161 if (c
== '\n' || TK_INT(c
))
163 sbuf_str(sb
, keymap(*kmap
, c
));
165 if (c
== '\n' || TK_INT(c
))
169 return sbuf_done(sb
);
172 /* read an ex command */
173 char *led_prompt(char *pref
, char *post
)
175 char **kmap
= kmap_def
;
178 s
= led_line(pref
, post
, "", 0, &key
, &kmap
);
185 /* read visual command input */
186 char *led_input(char *pref
, char *post
, char *ai
, int ai_max
)
188 struct sbuf
*sb
= sbuf_make();
189 char *first_ai
= NULL
;
192 char *ln
= led_line(pref
, post
, ai
, ai_max
, &key
, &led_kmap
);
194 first_ai
= uc_dup(ai
);
200 led_printparts(ai
, pref
? pref
: "", ln
, key
== '\n' ? "" : post
);
208 while (ai_max
&& post
[0] && (post
[0] == ' ' || post
[0] == '\t'))
211 strcpy(ai
, first_ai
);
214 return sbuf_done(sb
);