mirror of
https://github.com/neovim/neovim.git
synced 2025-09-26 04:58:33 +00:00
API: Implement buffer updates
Originally written by @phodge in https://github.com/neovim/neovim/pull/5269.
This commit is contained in:
@@ -35,6 +35,7 @@
|
||||
#include "nvim/fold.h"
|
||||
#include "nvim/getchar.h"
|
||||
#include "nvim/indent.h"
|
||||
#include "nvim/liveupdate.h"
|
||||
#include "nvim/main.h"
|
||||
#include "nvim/mark.h"
|
||||
#include "nvim/mbyte.h"
|
||||
@@ -279,7 +280,7 @@ void ex_align(exarg_T *eap)
|
||||
new_indent = 0;
|
||||
(void)set_indent(new_indent, 0); /* set indent */
|
||||
}
|
||||
changed_lines(eap->line1, 0, eap->line2 + 1, 0L);
|
||||
changed_lines(eap->line1, 0, eap->line2 + 1, 0L, true);
|
||||
curwin->w_cursor = save_curpos;
|
||||
beginline(BL_WHITE | BL_FIX);
|
||||
}
|
||||
@@ -612,7 +613,7 @@ void ex_sort(exarg_T *eap)
|
||||
} else if (deleted < 0) {
|
||||
mark_adjust(eap->line2, MAXLNUM, -deleted, 0L, false);
|
||||
}
|
||||
changed_lines(eap->line1, 0, eap->line2 + 1, -deleted);
|
||||
changed_lines(eap->line1, 0, eap->line2 + 1, -deleted, true);
|
||||
|
||||
curwin->w_cursor.lnum = eap->line1;
|
||||
beginline(BL_WHITE | BL_FIX);
|
||||
@@ -745,7 +746,7 @@ void ex_retab(exarg_T *eap)
|
||||
if (curbuf->b_p_ts != new_ts)
|
||||
redraw_curbuf_later(NOT_VALID);
|
||||
if (first_line != 0)
|
||||
changed_lines(first_line, 0, last_line + 1, 0L);
|
||||
changed_lines(first_line, 0, last_line + 1, 0L, true);
|
||||
|
||||
curwin->w_p_list = save_list; /* restore 'list' */
|
||||
|
||||
@@ -806,6 +807,7 @@ int do_move(linenr_T line1, linenr_T line2, linenr_T dest)
|
||||
*/
|
||||
last_line = curbuf->b_ml.ml_line_count;
|
||||
mark_adjust_nofold(line1, line2, last_line - line2, 0L, true);
|
||||
changed_lines(last_line - num_lines + 1, 0, last_line + 1, num_lines, false);
|
||||
if (dest >= line2) {
|
||||
mark_adjust_nofold(line2 + 1, dest, -num_lines, 0L, false);
|
||||
FOR_ALL_TAB_WINDOWS(tab, win) {
|
||||
@@ -828,6 +830,12 @@ int do_move(linenr_T line1, linenr_T line2, linenr_T dest)
|
||||
curbuf->b_op_start.col = curbuf->b_op_end.col = 0;
|
||||
mark_adjust_nofold(last_line - num_lines + 1, last_line,
|
||||
-(last_line - dest - extra), 0L, true);
|
||||
changed_lines(last_line - num_lines + 1, 0, last_line + 1, -extra, false);
|
||||
|
||||
// send live update regarding the new lines that were added
|
||||
if (kv_size(curbuf->liveupdate_channels)) {
|
||||
liveupdate_send_changes(curbuf, dest + 1, num_lines, 0, true);
|
||||
}
|
||||
|
||||
/*
|
||||
* Now we delete the original text -- webb
|
||||
@@ -858,9 +866,14 @@ int do_move(linenr_T line1, linenr_T line2, linenr_T dest)
|
||||
last_line = curbuf->b_ml.ml_line_count;
|
||||
if (dest > last_line + 1)
|
||||
dest = last_line + 1;
|
||||
changed_lines(line1, 0, dest, 0L);
|
||||
changed_lines(line1, 0, dest, 0L, false);
|
||||
} else {
|
||||
changed_lines(dest + 1, 0, line1 + num_lines, 0L);
|
||||
changed_lines(dest + 1, 0, line1 + num_lines, 0L, false);
|
||||
}
|
||||
|
||||
// send LiveUpdate regarding lines that were deleted
|
||||
if (kv_size(curbuf->liveupdate_channels)) {
|
||||
liveupdate_send_changes(curbuf, line1 + extra, 0, num_lines, true);
|
||||
}
|
||||
|
||||
return OK;
|
||||
@@ -2428,6 +2441,7 @@ int do_ecmd(
|
||||
goto theend;
|
||||
}
|
||||
u_unchanged(curbuf);
|
||||
liveupdate_unregister_all(curbuf);
|
||||
buf_freeall(curbuf, BFA_KEEP_UNDO);
|
||||
|
||||
// Tell readfile() not to clear or reload undo info.
|
||||
@@ -3154,7 +3168,8 @@ static char_u *sub_parse_flags(char_u *cmd, subflags_T *subflags,
|
||||
/// The usual escapes are supported as described in the regexp docs.
|
||||
///
|
||||
/// @return buffer used for 'inccommand' preview
|
||||
static buf_T *do_sub(exarg_T *eap, proftime_T timeout)
|
||||
static buf_T *do_sub(exarg_T *eap, proftime_T timeout,
|
||||
bool send_liveupdate_changedtick)
|
||||
{
|
||||
long i = 0;
|
||||
regmmatch_T regmatch;
|
||||
@@ -4000,7 +4015,14 @@ skip:
|
||||
* the line number before the change (same as adding the number of
|
||||
* deleted lines). */
|
||||
i = curbuf->b_ml.ml_line_count - old_line_count;
|
||||
changed_lines(first_line, 0, last_line - i, i);
|
||||
changed_lines(first_line, 0, last_line - i, i, false);
|
||||
|
||||
if (kv_size(curbuf->liveupdate_channels)) {
|
||||
int64_t num_added = last_line - first_line;
|
||||
int64_t num_removed = num_added - i;
|
||||
liveupdate_send_changes(curbuf, first_line, num_added, num_removed,
|
||||
send_liveupdate_changedtick);
|
||||
}
|
||||
}
|
||||
|
||||
xfree(sub_firstline); /* may have to free allocated copy of the line */
|
||||
@@ -6246,7 +6268,7 @@ void ex_substitute(exarg_T *eap)
|
||||
{
|
||||
bool preview = (State & CMDPREVIEW);
|
||||
if (*p_icm == NUL || !preview) { // 'inccommand' is disabled
|
||||
(void)do_sub(eap, profile_zero());
|
||||
(void)do_sub(eap, profile_zero(), true);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -6270,7 +6292,7 @@ void ex_substitute(exarg_T *eap)
|
||||
// Don't show search highlighting during live substitution
|
||||
bool save_hls = p_hls;
|
||||
p_hls = false;
|
||||
buf_T *preview_buf = do_sub(eap, profile_setlimit(p_rdt));
|
||||
buf_T *preview_buf = do_sub(eap, profile_setlimit(p_rdt), false);
|
||||
p_hls = save_hls;
|
||||
|
||||
if (save_changedtick != curbuf->b_changedtick) {
|
||||
|
Reference in New Issue
Block a user