diff options
author | zeertzjq <zeertzjq@outlook.com> | 2023-09-03 11:12:53 +0800 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-09-03 11:12:53 +0800 |
commit | f32a69630d0360cd73db6e7507bceb4104ec790d (patch) | |
tree | 4e92716817425aa9e7f1310375480f0d526da30f | |
parent | 517dfdf0fcf5c9c88c83dbb77a931b8e940b7472 (diff) | |
download | rneovim-f32a69630d0360cd73db6e7507bceb4104ec790d.tar.gz rneovim-f32a69630d0360cd73db6e7507bceb4104ec790d.tar.bz2 rneovim-f32a69630d0360cd73db6e7507bceb4104ec790d.zip |
refactor(marks): don't set timestamp twice with :delmarks (#24994)
refactor(mark): don't set same timestamp twice
-rw-r--r-- | src/nvim/buffer.c | 8 | ||||
-rw-r--r-- | src/nvim/mark.c | 43 | ||||
-rw-r--r-- | src/nvim/mark.h | 4 |
3 files changed, 16 insertions, 39 deletions
diff --git a/src/nvim/buffer.c b/src/nvim/buffer.c index 9c061269f1..8eacec4d5e 100644 --- a/src/nvim/buffer.c +++ b/src/nvim/buffer.c @@ -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); diff --git a/src/nvim/mark.c b/src/nvim/mark.c index 06d0295c3d..0dc1be526b 100644 --- a/src/nvim/mark.c +++ b/src/nvim/mark.c @@ -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; diff --git a/src/nvim/mark.h b/src/nvim/mark.h index 8c72579d0f..d84f6a8bb0 100644 --- a/src/nvim/mark.h +++ b/src/nvim/mark.h @@ -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 { \ |