diff options
Diffstat (limited to 'src/nvim/mark_extended.h')
-rw-r--r-- | src/nvim/mark_extended.h | 293 |
1 files changed, 52 insertions, 241 deletions
diff --git a/src/nvim/mark_extended.h b/src/nvim/mark_extended.h index ee1da26875..f809148d9b 100644 --- a/src/nvim/mark_extended.h +++ b/src/nvim/mark_extended.h @@ -1,236 +1,57 @@ #ifndef NVIM_MARK_EXTENDED_H #define NVIM_MARK_EXTENDED_H +#include "nvim/buffer_defs.h" #include "nvim/mark_extended_defs.h" -#include "nvim/buffer_defs.h" // for buf_T +#include "nvim/marktree.h" +EXTERN int extmark_splice_pending INIT(= 0); -// Macro Documentation: FOR_ALL_? -// Search exclusively using the range values given. -// Use MAXCOL/MAXLNUM for the start and end of the line/col. -// The ns parameter: Unless otherwise stated, this is only a starting point -// for the btree to searched in, the results being itterated over will -// still contain extmarks from other namespaces. - -// see FOR_ALL_? for documentation -#define FOR_ALL_EXTMARKLINES(buf, l_lnum, u_lnum, code)\ - kbitr_t(extmarklines) itr;\ - ExtmarkLine t;\ - t.lnum = l_lnum;\ - if (!kb_itr_get(extmarklines, &buf->b_extlines, &t, &itr)) { \ - kb_itr_next(extmarklines, &buf->b_extlines, &itr);\ - }\ - ExtmarkLine *extmarkline;\ - for (; kb_itr_valid(&itr); kb_itr_next(extmarklines, \ - &buf->b_extlines, &itr)) { \ - extmarkline = kb_itr_key(&itr);\ - if (extmarkline->lnum > u_lnum) { \ - break;\ - }\ - code;\ - } - -// see FOR_ALL_? for documentation -#define FOR_ALL_EXTMARKLINES_PREV(buf, l_lnum, u_lnum, code)\ - kbitr_t(extmarklines) itr;\ - ExtmarkLine t;\ - t.lnum = u_lnum;\ - if (!kb_itr_get(extmarklines, &buf->b_extlines, &t, &itr)) { \ - kb_itr_prev(extmarklines, &buf->b_extlines, &itr);\ - }\ - ExtmarkLine *extmarkline;\ - for (; kb_itr_valid(&itr); kb_itr_prev(extmarklines, \ - &buf->b_extlines, &itr)) { \ - extmarkline = kb_itr_key(&itr);\ - if (extmarkline->lnum < l_lnum) { \ - break;\ - }\ - code;\ - } - -// see FOR_ALL_? for documentation -#define FOR_ALL_EXTMARKS(buf, ns, l_lnum, l_col, u_lnum, u_col, code)\ - kbitr_t(markitems) mitr;\ - Extmark mt;\ - mt.ns_id = ns;\ - mt.mark_id = 0;\ - mt.line = NULL;\ - FOR_ALL_EXTMARKLINES(buf, l_lnum, u_lnum, { \ - mt.col = (extmarkline->lnum != l_lnum) ? MINCOL : l_col;\ - if (!kb_itr_get(markitems, &extmarkline->items, mt, &mitr)) { \ - kb_itr_next(markitems, &extmarkline->items, &mitr);\ - } \ - Extmark *extmark;\ - for (; \ - kb_itr_valid(&mitr); \ - kb_itr_next(markitems, &extmarkline->items, &mitr)) { \ - extmark = &kb_itr_key(&mitr);\ - if (extmark->line->lnum == u_lnum \ - && extmark->col > u_col) { \ - break;\ - }\ - code;\ - }\ - }) - - -// see FOR_ALL_? for documentation -#define FOR_ALL_EXTMARKS_PREV(buf, ns, l_lnum, l_col, u_lnum, u_col, code)\ - kbitr_t(markitems) mitr;\ - Extmark mt;\ - mt.mark_id = sizeof(uint64_t);\ - mt.ns_id = ns;\ - FOR_ALL_EXTMARKLINES_PREV(buf, l_lnum, u_lnum, { \ - mt.col = (extmarkline->lnum != u_lnum) ? MAXCOL : u_col;\ - if (!kb_itr_get(markitems, &extmarkline->items, mt, &mitr)) { \ - kb_itr_prev(markitems, &extmarkline->items, &mitr);\ - } \ - Extmark *extmark;\ - for (; \ - kb_itr_valid(&mitr); \ - kb_itr_prev(markitems, &extmarkline->items, &mitr)) { \ - extmark = &kb_itr_key(&mitr);\ - if (extmark->line->lnum == l_lnum \ - && extmark->col < l_col) { \ - break;\ - }\ - code;\ - }\ - }) - - -#define FOR_ALL_EXTMARKS_IN_LINE(items, l_col, u_col, code)\ - kbitr_t(markitems) mitr;\ - Extmark mt;\ - mt.ns_id = 0;\ - mt.mark_id = 0;\ - mt.line = NULL;\ - mt.col = l_col;\ - colnr_T extmarkline_u_col = u_col;\ - if (!kb_itr_get(markitems, &items, mt, &mitr)) { \ - kb_itr_next(markitems, &items, &mitr);\ - } \ - Extmark *extmark;\ - for (; kb_itr_valid(&mitr); kb_itr_next(markitems, &items, &mitr)) { \ - extmark = &kb_itr_key(&mitr);\ - if (extmark->col > extmarkline_u_col) { \ - break;\ - }\ - code;\ - } - - -typedef struct ExtmarkNs { // For namespacing extmarks - PMap(uint64_t) *map; // For fast lookup - uint64_t free_id; // For automatically assigning id's -} ExtmarkNs; - - -typedef kvec_t(Extmark *) ExtmarkArray; - - -// Undo/redo extmarks - -typedef enum { - kExtmarkNOOP, // Extmarks shouldn't be moved - kExtmarkUndo, // Operation should be reversable/undoable - kExtmarkNoUndo, // Operation should not be reversable - kExtmarkUndoNoRedo, // Operation should be undoable, but not redoable -} ExtmarkOp; - +typedef struct +{ + uint64_t ns_id; + uint64_t mark_id; + int row; + colnr_T col; +} ExtmarkInfo; -// adjust line numbers only, corresponding to mark_adjust call -typedef struct { - linenr_T line1; - linenr_T line2; - long amount; - long amount_after; -} Adjust; +typedef kvec_t(ExtmarkInfo) ExtmarkArray; -// adjust columns after split/join line, like mark_col_adjust -typedef struct { - linenr_T lnum; - colnr_T mincol; - long col_amount; - long lnum_amount; -} ColAdjust; // delete the columns between mincol and endcol typedef struct { - linenr_T lnum; - colnr_T mincol; - colnr_T endcol; - int eol; -} ColAdjustDelete; - -// adjust linenumbers after :move operation + int start_row; + colnr_T start_col; + int oldextent_row; + colnr_T oldextent_col; + int newextent_row; + colnr_T newextent_col; +} ExtmarkSplice; + +// adjust marks after :move operation typedef struct { - linenr_T line1; - linenr_T line2; - linenr_T last_line; - linenr_T dest; - linenr_T num_lines; - linenr_T extra; -} AdjustMove; - -// TODO(bfredl): reconsider if we really should track mark creation/updating -// itself, these are not really "edit" operation. -// extmark was created -typedef struct { - uint64_t ns_id; - uint64_t mark_id; - linenr_T lnum; - colnr_T col; -} ExtmarkSet; + int start_row; + int start_col; + int extent_row; + int extent_col; + int new_row; + int new_col; +} ExtmarkMove; // extmark was updated typedef struct { - uint64_t ns_id; - uint64_t mark_id; - linenr_T old_lnum; + uint64_t mark; // raw mark id of the marktree + int old_row; colnr_T old_col; - linenr_T lnum; - colnr_T col; -} ExtmarkUpdate; - -// copied mark before deletion (as operation is destructive) -typedef struct { - uint64_t ns_id; - uint64_t mark_id; - linenr_T lnum; + int row; colnr_T col; -} ExtmarkCopy; - -// also used as part of :move operation? probably can be simplified to one -// event. -typedef struct { - linenr_T l_lnum; - colnr_T l_col; - linenr_T u_lnum; - colnr_T u_col; - linenr_T p_lnum; - colnr_T p_col; -} ExtmarkCopyPlace; - -// extmark was cleared. -// TODO(bfredl): same reconsideration as for ExtmarkSet/ExtmarkUpdate -typedef struct { - uint64_t ns_id; - linenr_T l_lnum; - linenr_T u_lnum; -} ExtmarkClear; - +} ExtmarkSavePos; typedef enum { - kLineAdjust, - kColAdjust, - kColAdjustDelete, - kAdjustMove, - kExtmarkSet, - kExtmarkDel, + kExtmarkSplice, + kExtmarkMove, kExtmarkUpdate, - kExtmarkCopy, - kExtmarkCopyPlace, + kExtmarkSavePos, kExtmarkClear, } UndoObjectType; @@ -238,42 +59,32 @@ typedef enum { struct undo_object { UndoObjectType type; union { - Adjust adjust; - ColAdjust col_adjust; - ColAdjustDelete col_adjust_delete; - AdjustMove move; - ExtmarkSet set; - ExtmarkUpdate update; - ExtmarkCopy copy; - ExtmarkCopyPlace copy_place; - ExtmarkClear clear; + ExtmarkSplice splice; + ExtmarkMove move; + ExtmarkSavePos savepos; } data; }; -// For doing move of extmarks in substitutions typedef struct { - lpos_T startpos; - lpos_T endpos; - linenr_T lnum; - int sublen; -} ExtmarkSubSingle; + int start_row; + int start_col; + int end_row; + int end_col; + int attr_id; + VirtText *virt_text; +} HlRange; -// For doing move of extmarks in substitutions typedef struct { - lpos_T startpos; - lpos_T endpos; - linenr_T lnum; - linenr_T newline_in_pat; - linenr_T newline_in_sub; - linenr_T lnum_added; - lpos_T cm_start; // start of the match - lpos_T cm_end; // end of the match - int eol; // end of the match -} ExtmarkSubMulti; + MarkTreeIter itr[1]; + kvec_t(HlRange) active; + int top_row; + int row; + int col_until; + int current; + VirtText *virt_text; +} DecorationState; -typedef kvec_t(ExtmarkSubSingle) extmark_sub_single_vec_t; -typedef kvec_t(ExtmarkSubMulti) extmark_sub_multi_vec_t; #ifdef INCLUDE_GENERATED_DECLARATIONS # include "mark_extended.h.generated.h" |