diff options
Diffstat (limited to 'main.c')
| -rw-r--r-- | main.c | 40 |
1 files changed, 22 insertions, 18 deletions
@@ -385,13 +385,25 @@ void test_edits(void) { } } +TxtLoc ins_newline(TxtLoc l) { + u32 tabs = 0; + TxtLoc start = start_of_line(l); + for (TxtLoc t = start; txt_byte(t) == '\t'; t = bnext(t)) + tabs++; + while (txt_byte(cprev(l)) == '\t') + l = txt_delete(l, 1); + l = txt_insert_c(l, '\n'); + while (tabs--) l = txt_insert_c(l, '\t'); + return l; +} + int main(int argc, const char **argv) { scratch = arena_init(128L << 20); vui_init(); vui_curs_vis(1); vui_redraw_fn(draw); - //const char *path = "test.txt"; - const char *path = "/usr/share/dict/words"; + const char *path = "test.txt"; + //const char *path = "/usr/share/dict/words"; if (argc > 1) path = argv[1]; if (txt_load(&txt, path)) err(1, "couldn't open file"); cur = txt_end(&txt); @@ -437,12 +449,13 @@ int main(int argc, const char **argv) { break; case 'o': mode = 1; - cur = end_of_line(cur); - goto ins_newline; + cur = ins_newline(end_of_line(cur)); + break; case 'O': mode = 1; - cur = bprev(start_of_line(cur)); - goto ins_newline; + cur = ins_newline(bprev(start_of_line(cur))); + if (at_start(bprev(cur))) cur = bprev(cur); + break; case 'd': { TxtLoc before = cur; if (motion(&cur, vui_key())) { @@ -516,18 +529,9 @@ int main(int argc, const char **argv) { case 0x05 /* ^E */: cur = txt_delete_range(cur, next_word(cur)); break; - case '\r': { -ins_newline:; - u32 tabs = 0; - TxtLoc start = start_of_line(cur); - for (TxtLoc l = start; txt_byte(l) == '\t'; l = bnext(l)) - tabs++; - while (txt_byte(cprev(cur)) == '\t') - cur = txt_delete(cur, 1); - cur = txt_insert_c(cur, '\n'); - while (tabs--) cur = txt_insert_c(cur, '\t'); - } break; - + case '\r': + cur = ins_newline(cur); + break; default: if ((c == '\t' || c >= ' ') && c <= KEY_UTF8_MAX) cur = txt_insert_c(cur, c); break; |
