tvi: case switching commands - neatvi - [fork] simple vi-type editor with UTF-8… | |
git clone git://src.adamsgaard.dk/neatvi | |
Log | |
Files | |
Refs | |
README | |
--- | |
commit 34c48c51241cd630685f387cef89b41cb4415d69 | |
parent 88ed01cab8edeb1c8eb4ea39bba066dac00f161c | |
Author: Ali Gholami Rudi <[email protected]> | |
Date: Fri, 29 May 2015 13:27:41 +0430 | |
vi: case switching commands | |
Diffstat: | |
M vi.c | 53 +++++++++++++++++++++++++++++… | |
1 file changed, 52 insertions(+), 1 deletion(-) | |
--- | |
diff --git a/vi.c b/vi.c | |
t@@ -603,6 +603,44 @@ static void vi_change(int r1, int o1, int r2, int o2, int… | |
free(post); | |
} | |
+static void vi_case(int r1, int o1, int r2, int o2, int lnmode, int cmd) | |
+{ | |
+ char *pref, *post; | |
+ char *region, *s; | |
+ region = lbuf_region(xb, r1, lnmode ? 0 : o1, r2, lnmode ? -1 : o2); | |
+ s = region; | |
+ while (*s) { | |
+ int c = (unsigned char) s[0]; | |
+ if (c <= 0x7f) { | |
+ if (cmd == 'u') | |
+ s[0] = tolower(c); | |
+ if (cmd == 'U') | |
+ s[0] = toupper(c); | |
+ if (cmd == '~') | |
+ s[0] = islower(c) ? toupper(c) : tolower(c); | |
+ } | |
+ s = uc_next(s); | |
+ } | |
+ pref = lnmode ? uc_dup("") : uc_sub(lbuf_get(xb, r1), 0, o1); | |
+ post = lnmode ? uc_dup("\n") : uc_sub(lbuf_get(xb, r2), o2, -1); | |
+ lbuf_rm(xb, r1, r2 + 1); | |
+ if (!lnmode) { | |
+ struct sbuf *sb = sbuf_make(); | |
+ sbuf_str(sb, pref); | |
+ sbuf_str(sb, region); | |
+ sbuf_str(sb, post); | |
+ lbuf_put(xb, r1, sbuf_buf(sb)); | |
+ sbuf_free(sb); | |
+ } else { | |
+ lbuf_put(xb, r1, region); | |
+ } | |
+ xrow = r2; | |
+ xoff = lnmode ? lbuf_indents(xb, r2) : o2; | |
+ free(region); | |
+ free(pref); | |
+ free(post); | |
+} | |
+ | |
static void vi_pipe(int r1, int r2) | |
{ | |
char *text; | |
t@@ -684,6 +722,8 @@ static int vc_motion(int cmd) | |
vi_delete(r1, o1, r2, o2, lnmode); | |
if (cmd == 'c') | |
vi_change(r1, o1, r2, o2, lnmode); | |
+ if (cmd == '~' || cmd == 'u' || cmd == 'U') | |
+ vi_case(r1, o1, r2, o2, lnmode, cmd); | |
if (cmd == '!') | |
vi_pipe(r1, r2); | |
if (cmd == '>' || cmd == '<') | |
t@@ -909,7 +949,7 @@ static void vi(void) | |
xcol = vi_pcol; | |
} else if (mv == 0) { | |
int c = vi_read(); | |
- int z; | |
+ int z, g; | |
if (c <= 0) | |
continue; | |
switch (c) { | |
t@@ -1016,6 +1056,12 @@ static void vi(void) | |
} | |
redraw = 1; | |
break; | |
+ case 'g': | |
+ g = vi_read(); | |
+ if (g == '~' || g == 'u' || g == 'U') | |
+ if (!vc_motion(g)) | |
+ redraw = 1; | |
+ break; | |
case 'x': | |
vi_back(' '); | |
if (!vc_motion('d')) | |
t@@ -1055,6 +1101,11 @@ static void vi(void) | |
if (!vc_motion('y')) | |
redraw = 1; | |
break; | |
+ case '~': | |
+ vi_back(' '); | |
+ if (!vc_motion('~')) | |
+ redraw = 1; | |
+ break; | |
default: | |
continue; | |
} |