}
void buf_lastins(Buf* buf) {
- Sel sel = buf_getsel(buf);
- // Set selection to last inserted text
+ Log* log = buf->undo;
+ if (!log) return;
+ Sel sel = {.beg = log->beg, .end = log->end };
+ size_t delsize = 0;
+ /* try and expand the selected region to encompass related inserts */
+ for (; log; log = log->next) {
+ if (!log->data) {
+ size_t ibeg = log->beg, iend = log->end - delsize;
+ if (iend < ibeg || ibeg > sel.beg || iend < sel.beg) break;
+ if (ibeg < sel.beg && iend > sel.end) break;
+ sel.beg = ibeg, delsize = 0;
+ } else {
+ /* bail if the delete doesnt overlap */
+ if(log->beg != sel.beg) break;
+ delsize = strlen(log->data);
+ }
+ }
buf->selection = sel;
}