]> git.mdlowis.com Git - projs/tide.git/commitdiff
fix copy indent logic to copy indent upto cursor pos
authorMichael D. Lowis <mike.lowis@gentex.com>
Thu, 20 Dec 2018 16:55:00 +0000 (11:55 -0500)
committerMichael D. Lowis <mike.lowis@gentex.com>
Thu, 20 Dec 2018 16:55:00 +0000 (11:55 -0500)
TODO.md
inc/edit.h
src/lib/buf.c
src/lib/view.c

diff --git a/TODO.md b/TODO.md
index 8d8922e27ab74916ef3337465c63e0bef1540cd4..8c3b7e32681c48b963d069fda489da07ec9b866e 100644 (file)
--- 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
index 027a1ad55399d797e8d1569675acba31072b9622..f8b80b6a2166c9ff6df2050ccfc6c81870d8289b 100644 (file)
@@ -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);
index 1bbb7a23f4acba98b1473061dec74f9968da62fe..23a91c9100bb12c8bb22a11d905cd28fb877aab4 100644 (file)
@@ -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;
index e505621f8558693fbe7eb3e0f109788ccaac3b80..f87ac82732baf156aa8f3249f211c0395285a97a 100644 (file)
@@ -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);
     }