summaryrefslogtreecommitdiff
path: root/main.c
diff options
context:
space:
mode:
Diffstat (limited to 'main.c')
-rw-r--r--main.c40
1 files changed, 22 insertions, 18 deletions
diff --git a/main.c b/main.c
index a7f63e3..102a773 100644
--- a/main.c
+++ b/main.c
@@ -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;