From ee5bffed515baa1a9fa819f1e355222d3bdfd775 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Thu, 20 Dec 2018 11:55:00 -0500 Subject: [PATCH] fix copy indent logic to copy indent upto cursor pos --- TODO.md | 1 - inc/edit.h | 1 + src/lib/buf.c | 8 ++++++++ src/lib/view.c | 9 +++++---- 4 files changed, 14 insertions(+), 5 deletions(-) diff --git a/TODO.md b/TODO.md index 8d8922e..8c3b7e3 100644 --- a/TODO.md +++ b/TODO.md @@ -2,7 +2,6 @@ ## STAGING -* copy indent copies indent of previous line instead of current line * selecting last insert no longer handles intermediate edits * Ctrl+D should not pass tag name as arg when executing tag commands * 'Get' tag with argument currently segfaults diff --git a/inc/edit.h b/inc/edit.h index 027a1ad..f8b80b6 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -47,6 +47,7 @@ void buf_putc(Buf* buf, int c); void buf_puts(Buf* buf, char* s); int buf_getc(Buf* buf); char* buf_gets(Buf* buf); +char* buf_getsat(Buf* buf, size_t beg, size_t end); void buf_del(Buf* buf); void buf_undo(Buf* buf); diff --git a/src/lib/buf.c b/src/lib/buf.c index 1bbb7a2..23a91c9 100644 --- a/src/lib/buf.c +++ b/src/lib/buf.c @@ -406,6 +406,14 @@ char* buf_gets(Buf* buf) { return str; } +char* buf_getsat(Buf* buf, size_t beg, size_t end) { + Sel sel = buf_getsel(buf); + buf->selection = (Sel){ .beg = beg, .end = end }; + char* str = buf_gets(buf); + buf->selection = sel; + return str; +} + void buf_del(Buf* buf) { Sel sel = buf_getsel(buf); size_t nbytes = sel.end - sel.beg; diff --git a/src/lib/view.c b/src/lib/view.c index e505621..f87ac82 100644 --- a/src/lib/view.c +++ b/src/lib/view.c @@ -267,11 +267,12 @@ void view_insert(View* view, Rune rune) { for (; n > 0; n--) buf_putc(BUF, ' '); } else if (CopyIndent && rune == '\n') { size_t off = buf_selbeg(BUF); - size_t beg = buf_bol(BUF, off-1), end = beg; - for (; end < buf_end(BUF) && (' ' == buf_getrat(BUF, end) || '\t' == buf_getrat(BUF, end)); end++); + size_t beg = buf_bol(BUF, off), end = beg; + for (; end < buf_end(BUF) && end < off && (' ' == buf_getrat(BUF, end) || '\t' == buf_getrat(BUF, end)); end++); + char* str = buf_getsat(BUF, beg, end); buf_putc(BUF, '\n'); - for (; beg < end; beg++) - buf_putc(BUF, buf_getrat(BUF, beg)); + buf_puts(BUF, str); + free(str); } else { buf_putc(BUF, rune); } -- 2.52.0