mirror of
https://github.com/neovim/neovim.git
synced 2025-09-29 22:48:34 +00:00
nsmarks: initial commit
This commit is contained in:
@@ -91,7 +91,9 @@
|
||||
#include "nvim/fileio.h"
|
||||
#include "nvim/fold.h"
|
||||
#include "nvim/buffer_updates.h"
|
||||
#include "nvim/pos.h" // MAXLNUM
|
||||
#include "nvim/mark.h"
|
||||
#include "nvim/mark_extended.h"
|
||||
#include "nvim/memline.h"
|
||||
#include "nvim/message.h"
|
||||
#include "nvim/misc1.h"
|
||||
@@ -106,6 +108,7 @@
|
||||
#include "nvim/types.h"
|
||||
#include "nvim/os/os.h"
|
||||
#include "nvim/os/time.h"
|
||||
#include "nvim/lib/kvec.h"
|
||||
|
||||
#ifdef INCLUDE_GENERATED_DECLARATIONS
|
||||
# include "undo.c.generated.h"
|
||||
@@ -384,6 +387,7 @@ int u_savecommon(linenr_T top, linenr_T bot, linenr_T newbot, int reload)
|
||||
* up the undo info when out of memory.
|
||||
*/
|
||||
uhp = xmalloc(sizeof(u_header_T));
|
||||
kv_init(uhp->uh_extmark);
|
||||
#ifdef U_DEBUG
|
||||
uhp->uh_magic = UH_MAGIC;
|
||||
#endif
|
||||
@@ -2249,10 +2253,10 @@ static void u_undoredo(int undo, bool do_buf_event)
|
||||
xfree((char_u *)uep->ue_array);
|
||||
}
|
||||
|
||||
/* adjust marks */
|
||||
// Adjust marks
|
||||
if (oldsize != newsize) {
|
||||
mark_adjust(top + 1, top + oldsize, (long)MAXLNUM,
|
||||
(long)newsize - (long)oldsize, false);
|
||||
(long)newsize - (long)oldsize, false, kExtmarkNOOP);
|
||||
if (curbuf->b_op_start.lnum > top + oldsize) {
|
||||
curbuf->b_op_start.lnum += newsize - oldsize;
|
||||
}
|
||||
@@ -2285,6 +2289,23 @@ static void u_undoredo(int undo, bool do_buf_event)
|
||||
newlist = uep;
|
||||
}
|
||||
|
||||
// Adjust Extmarks
|
||||
ExtmarkUndoObject undo_info;
|
||||
if (undo) {
|
||||
for (i = (int)kv_size(curhead->uh_extmark) - 1; i > -1; i--) {
|
||||
undo_info = kv_A(curhead->uh_extmark, i);
|
||||
extmark_apply_undo(undo_info, undo);
|
||||
}
|
||||
// redo
|
||||
} else {
|
||||
for (i = 0; i < (int)kv_size(curhead->uh_extmark); i++) {
|
||||
undo_info = kv_A(curhead->uh_extmark, i);
|
||||
extmark_apply_undo(undo_info, undo);
|
||||
}
|
||||
}
|
||||
// finish Adjusting extmarks
|
||||
|
||||
|
||||
curhead->uh_entry = newlist;
|
||||
curhead->uh_flags = new_flags;
|
||||
if ((old_flags & UH_EMPTYBUF) && BUFEMPTY()) {
|
||||
@@ -2828,6 +2849,9 @@ u_freeentries(
|
||||
u_freeentry(uep, uep->ue_size);
|
||||
}
|
||||
|
||||
// TODO(timeyyy): is this the correct place? ...
|
||||
kv_destroy(uhp->uh_extmark);
|
||||
|
||||
#ifdef U_DEBUG
|
||||
uhp->uh_magic = 0;
|
||||
#endif
|
||||
@@ -3022,3 +3046,28 @@ list_T *u_eval_tree(const u_header_T *const first_uhp)
|
||||
|
||||
return list;
|
||||
}
|
||||
|
||||
// Given the buffer, Return the undo header. If none is set, set one first.
|
||||
// NULL will be returned if e.g undolevels = -1 (undo disabled)
|
||||
u_header_T *force_get_undo_header(buf_T *buf)
|
||||
{
|
||||
u_header_T *uhp = NULL;
|
||||
if (buf->b_u_curhead != NULL) {
|
||||
uhp = buf->b_u_curhead;
|
||||
} else if (buf->b_u_newhead) {
|
||||
uhp = buf->b_u_newhead;
|
||||
}
|
||||
// Create the first undo header for the buffer
|
||||
if (!uhp) {
|
||||
// TODO(timeyyy): there would be a better way to do this!
|
||||
u_save_cursor();
|
||||
uhp = buf->b_u_curhead;
|
||||
if (!uhp) {
|
||||
uhp = buf->b_u_newhead;
|
||||
if (get_undolevel() > 0) {
|
||||
assert(uhp);
|
||||
}
|
||||
}
|
||||
}
|
||||
return uhp;
|
||||
}
|
||||
|
Reference in New Issue
Block a user