diff options
-rw-r--r-- | src/nvim/change.c | 222 | ||||
-rw-r--r-- | src/nvim/misc1.c | 114 |
2 files changed, 100 insertions, 236 deletions
diff --git a/src/nvim/change.c b/src/nvim/change.c index 18d7af5099..03ecf2539f 100644 --- a/src/nvim/change.c +++ b/src/nvim/change.c @@ -525,140 +525,118 @@ ins_char(int c) ins_char_bytes(buf, n); } - void -ins_char_bytes(char_u *buf, int charlen) +void ins_char_bytes(char_u *buf, size_t charlen) { - int c = buf[0]; - int newlen; // nr of bytes inserted - int oldlen; // nr of bytes deleted (0 when not replacing) - char_u *p; - char_u *newp; - char_u *oldp; - int linelen; // length of old line including NUL - colnr_T col; - linenr_T lnum = curwin->w_cursor.lnum; - int i; - - // Break tabs if needed. - if (virtual_active() && curwin->w_cursor.coladd > 0) - coladvance_force(getviscol()); - - col = curwin->w_cursor.col; - oldp = ml_get(lnum); - linelen = (int)STRLEN(oldp) + 1; - - // The lengths default to the values for when not replacing. - oldlen = 0; - newlen = charlen; - - if (State & REPLACE_FLAG) - { - if (State & VREPLACE_FLAG) - { - colnr_T new_vcol = 0; // init for GCC - colnr_T vcol; - int old_list; - - // Disable 'list' temporarily, unless 'cpo' contains the 'L' flag. - // Returns the old value of list, so when finished, - // curwin->w_p_list should be set back to this. - old_list = curwin->w_p_list; - if (old_list && vim_strchr(p_cpo, CPO_LISTWM) == NULL) - curwin->w_p_list = FALSE; - - // In virtual replace mode each character may replace one or more - // characters (zero if it's a TAB). Count the number of bytes to - // be deleted to make room for the new character, counting screen - // cells. May result in adding spaces to fill a gap. - getvcol(curwin, &curwin->w_cursor, NULL, &vcol, NULL); - new_vcol = vcol + chartabsize(buf, vcol); - while (oldp[col + oldlen] != NUL && vcol < new_vcol) - { - vcol += chartabsize(oldp + col + oldlen, vcol); - // Don't need to remove a TAB that takes us to the right - // position. - if (vcol > new_vcol && oldp[col + oldlen] == TAB) - break; - oldlen += (*mb_ptr2len)(oldp + col + oldlen); - // Deleted a bit too much, insert spaces. - if (vcol > new_vcol) - newlen += vcol - new_vcol; - } - curwin->w_p_list = old_list; - } - else if (oldp[col] != NUL) - { - // normal replace - oldlen = (*mb_ptr2len)(oldp + col); - } - + // Break tabs if needed. + if (virtual_active() && curwin->w_cursor.coladd > 0) { + coladvance_force(getviscol()); + } - // Push the replaced bytes onto the replace stack, so that they can be - // put back when BS is used. The bytes of a multi-byte character are - // done the other way around, so that the first byte is popped off - // first (it tells the byte length of the character). - replace_push(NUL); - for (i = 0; i < oldlen; ++i) - { - if (has_mbyte) - i += replace_push_mb(oldp + col + i) - 1; - else - replace_push(oldp[col + i]); - } + size_t col = (size_t)curwin->w_cursor.col; + linenr_T lnum = curwin->w_cursor.lnum; + char_u *oldp = ml_get(lnum); + size_t linelen = STRLEN(oldp) + 1; // length of old line including NUL + + // The lengths default to the values for when not replacing. + size_t oldlen = 0; // nr of bytes inserted + size_t newlen = charlen; // nr of bytes deleted (0 when not replacing) + + if (State & REPLACE_FLAG) { + if (State & VREPLACE_FLAG) { + // Disable 'list' temporarily, unless 'cpo' contains the 'L' flag. + // Returns the old value of list, so when finished, + // curwin->w_p_list should be set back to this. + int old_list = curwin->w_p_list; + if (old_list && vim_strchr(p_cpo, CPO_LISTWM) == NULL) { + curwin->w_p_list = false; + } + // In virtual replace mode each character may replace one or more + // characters (zero if it's a TAB). Count the number of bytes to + // be deleted to make room for the new character, counting screen + // cells. May result in adding spaces to fill a gap. + colnr_T vcol; + getvcol(curwin, &curwin->w_cursor, NULL, &vcol, NULL); + colnr_T new_vcol = vcol + chartabsize(buf, vcol); + while (oldp[col + oldlen] != NUL && vcol < new_vcol) { + vcol += chartabsize(oldp + col + oldlen, vcol); + // Don't need to remove a TAB that takes us to the right + // position. + if (vcol > new_vcol && oldp[col + oldlen] == TAB) { + break; + } + oldlen += (size_t)(*mb_ptr2len)(oldp + col + oldlen); + // Deleted a bit too much, insert spaces. + if (vcol > new_vcol) { + newlen += (size_t)(vcol - new_vcol); + } + } + curwin->w_p_list = old_list; + } else if (oldp[col] != NUL) { + // normal replace + oldlen = (size_t)(*mb_ptr2len)(oldp + col); } - newp = alloc_check((unsigned)(linelen + newlen - oldlen)); - if (newp == NULL) - return; - // Copy bytes before the cursor. - if (col > 0) - mch_memmove(newp, oldp, (size_t)col); + /* Push the replaced bytes onto the replace stack, so that they can be + * put back when BS is used. The bytes of a multi-byte character are + * done the other way around, so that the first byte is popped off + * first (it tells the byte length of the character). */ + replace_push(NUL); + for (size_t i = 0; i < oldlen; i++) { + if (has_mbyte) { + i += (size_t)replace_push_mb(oldp + col + i) - 1; + } else { + replace_push(oldp[col + i]); + } + } + } - // Copy bytes after the changed character(s). - p = newp + col; - if (linelen > col + oldlen) - mch_memmove(p + newlen, oldp + col + oldlen, - (size_t)(linelen - col - oldlen)); + char_u *newp = xmalloc((size_t)(linelen + newlen - oldlen)); - // Insert or overwrite the new character. - mch_memmove(p, buf, charlen); - i = charlen; + // Copy bytes before the cursor. + if (col > 0) { + memmove(newp, oldp, (size_t)col); + } - // Fill with spaces when necessary. - while (i < newlen) - p[i++] = ' '; + // Copy bytes after the changed character(s). + char_u *p = newp + col; + if (linelen > col + oldlen) { + memmove(p + newlen, oldp + col + oldlen, + (size_t)(linelen - col - oldlen)); + } - // Replace the line in the buffer. - ml_replace(lnum, newp, FALSE); + // Insert or overwrite the new character. + memmove(p, buf, charlen); - // mark the buffer as changed and prepare for displaying - inserted_bytes(lnum, col, newlen - oldlen); - - // If we're in Insert or Replace mode and 'showmatch' is set, then briefly - // show the match for right parens and braces. - if (p_sm && (State & INSERT) - && msg_silent == 0 -#ifdef FEAT_INS_EXPAND - && !ins_compl_active() -#endif - ) - { - if (has_mbyte) - showmatch(mb_ptr2char(buf)); - else - showmatch(c); - } + // Fill with spaces when necessary. + for (size_t i = charlen; i < newlen; i++) { + p[i] = ' '; + } -#ifdef FEAT_RIGHTLEFT - if (!p_ri || (State & REPLACE_FLAG)) -#endif - { - // Normal insert: move cursor right - curwin->w_cursor.col += charlen; - } + // Replace the line in the buffer. + ml_replace(lnum, newp, false); + + // mark the buffer as changed and prepare for displaying + changed_bytes(lnum, (colnr_T)col); + + /* + * If we're in Insert or Replace mode and 'showmatch' is set, then briefly + * show the match for right parens and braces. + */ + if (p_sm && (State & INSERT) + && msg_silent == 0 + && !ins_compl_active() + ) { + showmatch(utf_ptr2char(buf)); + } - // TODO: should try to update w_row here, to avoid recomputing it later. + if (!p_ri || (State & REPLACE_FLAG)) { + // Normal insert: move cursor right + curwin->w_cursor.col += (int)charlen; + } + /* + * TODO: should try to update w_row here, to avoid recomputing it later. + */ } /* diff --git a/src/nvim/misc1.c b/src/nvim/misc1.c index 76c861e97c..bcb1b47e2d 100644 --- a/src/nvim/misc1.c +++ b/src/nvim/misc1.c @@ -1398,120 +1398,6 @@ void ins_char(int c) ins_char_bytes(buf, n); } -void ins_char_bytes(char_u *buf, size_t charlen) -{ - // Break tabs if needed. - if (virtual_active() && curwin->w_cursor.coladd > 0) { - coladvance_force(getviscol()); - } - - size_t col = (size_t)curwin->w_cursor.col; - linenr_T lnum = curwin->w_cursor.lnum; - char_u *oldp = ml_get(lnum); - size_t linelen = STRLEN(oldp) + 1; // length of old line including NUL - - // The lengths default to the values for when not replacing. - size_t oldlen = 0; // nr of bytes inserted - size_t newlen = charlen; // nr of bytes deleted (0 when not replacing) - - if (State & REPLACE_FLAG) { - if (State & VREPLACE_FLAG) { - // Disable 'list' temporarily, unless 'cpo' contains the 'L' flag. - // Returns the old value of list, so when finished, - // curwin->w_p_list should be set back to this. - int old_list = curwin->w_p_list; - if (old_list && vim_strchr(p_cpo, CPO_LISTWM) == NULL) { - curwin->w_p_list = false; - } - // In virtual replace mode each character may replace one or more - // characters (zero if it's a TAB). Count the number of bytes to - // be deleted to make room for the new character, counting screen - // cells. May result in adding spaces to fill a gap. - colnr_T vcol; - getvcol(curwin, &curwin->w_cursor, NULL, &vcol, NULL); - colnr_T new_vcol = vcol + chartabsize(buf, vcol); - while (oldp[col + oldlen] != NUL && vcol < new_vcol) { - vcol += chartabsize(oldp + col + oldlen, vcol); - // Don't need to remove a TAB that takes us to the right - // position. - if (vcol > new_vcol && oldp[col + oldlen] == TAB) { - break; - } - oldlen += (size_t)(*mb_ptr2len)(oldp + col + oldlen); - // Deleted a bit too much, insert spaces. - if (vcol > new_vcol) { - newlen += (size_t)(vcol - new_vcol); - } - } - curwin->w_p_list = old_list; - } else if (oldp[col] != NUL) { - // normal replace - oldlen = (size_t)(*mb_ptr2len)(oldp + col); - } - - - /* Push the replaced bytes onto the replace stack, so that they can be - * put back when BS is used. The bytes of a multi-byte character are - * done the other way around, so that the first byte is popped off - * first (it tells the byte length of the character). */ - replace_push(NUL); - for (size_t i = 0; i < oldlen; i++) { - if (has_mbyte) { - i += (size_t)replace_push_mb(oldp + col + i) - 1; - } else { - replace_push(oldp[col + i]); - } - } - } - - char_u *newp = xmalloc((size_t)(linelen + newlen - oldlen)); - - // Copy bytes before the cursor. - if (col > 0) { - memmove(newp, oldp, (size_t)col); - } - - // Copy bytes after the changed character(s). - char_u *p = newp + col; - if (linelen > col + oldlen) { - memmove(p + newlen, oldp + col + oldlen, - (size_t)(linelen - col - oldlen)); - } - - // Insert or overwrite the new character. - memmove(p, buf, charlen); - - // Fill with spaces when necessary. - for (size_t i = charlen; i < newlen; i++) { - p[i] = ' '; - } - - // Replace the line in the buffer. - ml_replace(lnum, newp, false); - - // mark the buffer as changed and prepare for displaying - changed_bytes(lnum, (colnr_T)col); - - /* - * If we're in Insert or Replace mode and 'showmatch' is set, then briefly - * show the match for right parens and braces. - */ - if (p_sm && (State & INSERT) - && msg_silent == 0 - && !ins_compl_active() - ) { - showmatch(utf_ptr2char(buf)); - } - - if (!p_ri || (State & REPLACE_FLAG)) { - // Normal insert: move cursor right - curwin->w_cursor.col += (int)charlen; - } - /* - * TODO: should try to update w_row here, to avoid recomputing it later. - */ -} - /* * Insert a string at the cursor position. * Note: Does NOT handle Replace mode. |