refactor(marks): don't set timestamp twice with :delmarks (#24994)

refactor(mark): don't set same timestamp twice
This commit is contained in:
zeertzjq
2023-09-03 11:12:53 +08:00
committed by GitHub
parent 517dfdf0fc
commit f32a69630d
3 changed files with 16 additions and 39 deletions

View File

@@ -858,9 +858,9 @@ static void free_buffer(buf_T *buf)
xfree(buf->b_prompt_text);
callback_free(&buf->b_prompt_callback);
callback_free(&buf->b_prompt_interrupt);
clear_fmark(&buf->b_last_cursor);
clear_fmark(&buf->b_last_insert);
clear_fmark(&buf->b_last_change);
clear_fmark(&buf->b_last_cursor, 0);
clear_fmark(&buf->b_last_insert, 0);
clear_fmark(&buf->b_last_change, 0);
for (size_t i = 0; i < NMARKS; i++) {
free_fmark(buf->b_namedm[i]);
}
@@ -1910,7 +1910,7 @@ buf_T *buflist_new(char *ffname_arg, char *sfname_arg, linenr_T lnum, int flags)
buf->b_flags |= BF_DUMMY;
}
buf_clear_file(buf);
clrallmarks(buf); // clear marks
clrallmarks(buf, 0); // clear marks
fmarks_check_names(buf); // check file marks for this file
buf->b_p_bl = (flags & BLN_LISTED) ? true : false; // init 'buflisted'
kv_destroy(buf->update_channels);

View File

@@ -77,11 +77,12 @@ void free_xfmark(xfmark_T fm)
}
/// Free and clear fmark_T item
void clear_fmark(fmark_T *fm)
void clear_fmark(fmark_T *const fm, const Timestamp timestamp)
FUNC_ATTR_NONNULL_ALL
{
free_fmark(*fm);
*fm = (fmark_T)INIT_FMARK;
fm->timestamp = timestamp;
}
// Set named mark "c" to position "pos".
@@ -763,20 +764,20 @@ bool mark_check_line_bounds(buf_T *buf, fmark_T *fm, const char **errormsg)
/// Used mainly when trashing the entire buffer during ":e" type commands.
///
/// @param[out] buf Buffer to clear marks in.
void clrallmarks(buf_T *const buf)
void clrallmarks(buf_T *const buf, const Timestamp timestamp)
FUNC_ATTR_NONNULL_ALL
{
for (size_t i = 0; i < NMARKS; i++) {
clear_fmark(&buf->b_namedm[i]);
clear_fmark(&buf->b_namedm[i], timestamp);
}
clear_fmark(&buf->b_last_cursor);
clear_fmark(&buf->b_last_cursor, timestamp);
buf->b_last_cursor.mark.lnum = 1;
clear_fmark(&buf->b_last_insert);
clear_fmark(&buf->b_last_change);
clear_fmark(&buf->b_last_insert, timestamp);
clear_fmark(&buf->b_last_change, timestamp);
buf->b_op_start.lnum = 0; // start/end op mark cleared
buf->b_op_end.lnum = 0;
for (int i = 0; i < buf->b_changelistlen; i++) {
clear_fmark(&buf->b_changelist[i]);
clear_fmark(&buf->b_changelist[i], timestamp);
}
buf->b_changelistlen = 0;
}
@@ -925,24 +926,7 @@ void ex_delmarks(exarg_T *eap)
if (*eap->arg == NUL && eap->forceit) {
// clear all marks
const Timestamp timestamp = os_time();
for (size_t i = 0; i < NMARKS; i++) {
curbuf->b_namedm[i].mark.lnum = 0;
curbuf->b_namedm[i].timestamp = timestamp;
}
curbuf->b_last_cursor.timestamp = timestamp;
CLEAR_FMARK(&curbuf->b_last_cursor);
curbuf->b_last_cursor.mark.lnum = 1;
curbuf->b_last_insert.timestamp = timestamp;
CLEAR_FMARK(&curbuf->b_last_insert);
curbuf->b_last_change.timestamp = timestamp;
CLEAR_FMARK(&curbuf->b_last_change);
curbuf->b_op_start.lnum = 0; // start/end op mark cleared
curbuf->b_op_end.lnum = 0;
for (int i = 0; i < curbuf->b_changelistlen; i++) {
clear_fmark(&curbuf->b_changelist[i]);
}
curbuf->b_changelistlen = 0;
clrallmarks(curbuf, os_time());
} else if (eap->forceit) {
emsg(_(e_invarg));
} else if (*eap->arg == NUL) {
@@ -990,16 +974,13 @@ void ex_delmarks(exarg_T *eap)
} else {
switch (*p) {
case '"':
curbuf->b_last_cursor.timestamp = timestamp;
CLEAR_FMARK(&curbuf->b_last_cursor);
clear_fmark(&curbuf->b_last_cursor, timestamp);
break;
case '^':
curbuf->b_last_insert.timestamp = timestamp;
CLEAR_FMARK(&curbuf->b_last_insert);
clear_fmark(&curbuf->b_last_insert, timestamp);
break;
case '.':
curbuf->b_last_change.timestamp = timestamp;
CLEAR_FMARK(&curbuf->b_last_change);
clear_fmark(&curbuf->b_last_change, timestamp);
break;
case '[':
curbuf->b_op_start.lnum = 0; break;

View File

@@ -34,10 +34,6 @@
SET_FMARK(fmarkp___, mark_, fnum_, view_); \
} while (0)
/// Clear given fmark
#define CLEAR_FMARK(fmarkp_) \
RESET_FMARK(fmarkp_, ((pos_T) { 0, 0, 0 }), 0, ((fmarkv_T)INIT_FMARKV))
/// Set given extended mark (regular mark + file name)
#define SET_XFMARK(xfmarkp_, mark_, fnum_, view_, fname_) \
do { \