## 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
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);
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;
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);
}