diff options
author | chentau <tchen1998@gmail.com> | 2021-05-05 19:57:04 -0700 |
---|---|---|
committer | chentau <tchen1998@gmail.com> | 2021-05-09 16:22:20 -0700 |
commit | a847abc21b339a8402d39cc2736f3f73e4f2f124 (patch) | |
tree | 5b27776f0d99f43977f3d1a423967ebe3f314246 /src/nvim/ops.c | |
parent | d2be261e8d1bcf165346255ae701564a5f62bf7d (diff) | |
download | rneovim-a847abc21b339a8402d39cc2736f3f73e4f2f124.tar.gz rneovim-a847abc21b339a8402d39cc2736f3f73e4f2f124.tar.bz2 rneovim-a847abc21b339a8402d39cc2736f3f73e4f2f124.zip |
refactor nvim_buf_set_lines to use extmark_splice
Diffstat (limited to 'src/nvim/ops.c')
-rw-r--r-- | src/nvim/ops.c | 27 |
1 files changed, 20 insertions, 7 deletions
diff --git a/src/nvim/ops.c b/src/nvim/ops.c index 10b8ebdc22..569ed167d2 100644 --- a/src/nvim/ops.c +++ b/src/nvim/ops.c @@ -1676,17 +1676,14 @@ int op_delete(oparg_T *oap) curbuf_splice_pending++; pos_T startpos = curwin->w_cursor; // start position for delete - bcount_t deleted_bytes = (bcount_t)STRLEN( - ml_get(startpos.lnum)) + 1 - startpos.col; + bcount_t deleted_bytes = get_region_bytecount( + startpos.lnum, oap->end.lnum, startpos.col, + oap->end.col) - !oap->inclusive; truncate_line(true); // delete from cursor to end of line curpos = curwin->w_cursor; // remember curwin->w_cursor curwin->w_cursor.lnum++; - for (linenr_T i = 1; i <= oap->line_count - 2; i++) { - deleted_bytes += (bcount_t)STRLEN( - ml_get(startpos.lnum + i)) + 1; - } del_lines(oap->line_count - 2, false); // delete from start of line until op_end @@ -1694,7 +1691,6 @@ int op_delete(oparg_T *oap) curwin->w_cursor.col = 0; (void)del_bytes((colnr_T)n, !virtual_op, oap->op_type == OP_DELETE && !oap->is_VIsual); - deleted_bytes += n; curwin->w_cursor = curpos; // restore curwin->w_cursor (void)do_join(2, false, false, false, false); curbuf_splice_pending--; @@ -6303,3 +6299,20 @@ bool op_reg_set_previous(const char name) y_previous = &y_regs[i]; return true; } + +bcount_t get_region_bytecount(linenr_T start_lnum, linenr_T end_lnum, + colnr_T start_col, colnr_T end_col) +{ + const char *first = (const char *)ml_get(start_lnum); + bcount_t deleted_bytes = (bcount_t)STRLEN(first) - start_col + 1; + + if (start_lnum == end_lnum) { + return deleted_bytes - ((bcount_t)STRLEN(first) - end_col + 1); + } + + for (linenr_T i = 1; i <= end_lnum-start_lnum-1; i++) { + deleted_bytes += (bcount_t)STRLEN( + ml_get(start_lnum + i)) + 1; + } + return deleted_bytes + end_col + 1; +} |