vis

a vi-like editor based on Plan 9's structural regular expressions

git clone https://9o.is/git/vis.git

commit 6ef0aad4d620d269dcabfc8d47f054ccd8a16d19
parent 29b60314b9239bf82fbf0c69ad1947469f42299d
Author: Marc André Tanner <mat@brain-dump.org>
Date:   Fri,  2 Jan 2015 11:32:31 +0100

Make getkey read one UTF-8 character at a time

Diffstat:
Mvis.c | 22+++++++++++++++-------
1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/vis.c b/vis.c @@ -1770,20 +1770,28 @@ static void keypress(Key *key) { static Key getkey(void) { Key key = { .str = "", .code = 0 }; - int keycode = getch(), len = 0; + int keycode = getch(), cur = 0; if (keycode == ERR) return key; if (keycode >= KEY_MIN) { key.code = keycode; } else { - char keychar = keycode; - key.str[len++] = keychar; - - if (!ISASCII(keychar) || keychar == '\e') { + key.str[cur++] = keycode; + int len = 1; + unsigned char keychar = keycode; + if (ISASCII(keychar)) len = 1; + else if (keychar == '\e' || keychar >= 0xFC) len = 6; + else if (keychar >= 0xF8) len = 5; + else if (keychar >= 0xF0) len = 4; + else if (keychar >= 0xE0) len = 3; + else if (keychar >= 0xC0) len = 2; + len = MIN(len, LENGTH(key.str)); + + if (cur < len) { nodelay(stdscr, TRUE); - for (int t; len < LENGTH(key.str) && (t = getch()) != ERR; len++) - key.str[len] = t; + for (int t; cur < len && (t = getch()) != ERR; cur++) + key.str[cur] = t; nodelay(stdscr, FALSE); } }