diff options
Diffstat (limited to 'data/vim/patches/8.1.0655')
-rw-r--r-- | data/vim/patches/8.1.0655 | 407 |
1 files changed, 0 insertions, 407 deletions
diff --git a/data/vim/patches/8.1.0655 b/data/vim/patches/8.1.0655 deleted file mode 100644 index 661d93b5c..000000000 --- a/data/vim/patches/8.1.0655 +++ /dev/null @@ -1,407 +0,0 @@ -To: vim_dev@googlegroups.com -Subject: Patch 8.1.0655 -Fcc: outbox -From: Bram Moolenaar <Bram@moolenaar.net> -Mime-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit ------------- - -Patch 8.1.0655 -Problem: When appending a line text property flags are not added. -Solution: Add text properties to a newly added line. -Files: src/memline.c, src/testdir/test_textprop.vim, src/textprop.c - - -*** ../vim-8.1.0654/src/memline.c 2018-12-28 21:59:24.508993022 +0100 ---- src/memline.c 2018-12-28 22:55:57.259280353 +0100 -*************** -*** 2568,2573 **** ---- 2568,2633 ---- - return (curbuf->b_ml.ml_flags & ML_LINE_DIRTY); - } - -+ #ifdef FEAT_TEXT_PROP -+ static void -+ add_text_props_for_append( -+ buf_T *buf, -+ linenr_T lnum, -+ char_u **line, -+ int *len, -+ char_u **tofree) -+ { -+ int round; -+ int new_prop_count = 0; -+ int count; -+ int n; -+ char_u *props; -+ int new_len; -+ char_u *new_line; -+ textprop_T prop; -+ -+ // Make two rounds: -+ // 1. calculate the extra space needed -+ // 2. allocate the space and fill it -+ for (round = 1; round <= 2; ++round) -+ { -+ if (round == 2) -+ { -+ if (new_prop_count == 0) -+ return; // nothing to do -+ new_len = *len + new_prop_count * sizeof(textprop_T); -+ new_line = alloc((unsigned)new_len); -+ if (new_line == NULL) -+ return; -+ mch_memmove(new_line, *line, *len); -+ new_prop_count = 0; -+ } -+ -+ // Get the line above to find any props that continue in the next -+ // line. -+ count = get_text_props(buf, lnum, &props, FALSE); -+ for (n = 0; n < count; ++n) -+ { -+ mch_memmove(&prop, props + n * sizeof(textprop_T), sizeof(textprop_T)); -+ if (prop.tp_flags & TP_FLAG_CONT_NEXT) -+ { -+ if (round == 2) -+ { -+ prop.tp_flags |= TP_FLAG_CONT_PREV; -+ prop.tp_col = 1; -+ prop.tp_len = *len; -+ mch_memmove(new_line + *len + new_prop_count * sizeof(textprop_T), &prop, sizeof(textprop_T)); -+ } -+ ++new_prop_count; -+ } -+ } -+ } -+ *line = new_line; -+ *tofree = new_line; -+ *len = new_len; -+ } -+ #endif -+ - /* - * Append a line after lnum (may be 0 to insert a line in front of the file). - * "line" does not need to be allocated, but can't be another line in a -*************** -*** 2622,2633 **** - ml_append_int( - buf_T *buf, - linenr_T lnum, // append after this line (can be 0) -! char_u *line, // text of the new line - colnr_T len_arg, // length of line, including NUL, or 0 - int newfile, // flag, see above - int mark) // mark the new line - { -! colnr_T len = len_arg; // length of line, including NUL, or 0 - int i; - int line_count; // number of indexes in current block - int offset; ---- 2682,2694 ---- - ml_append_int( - buf_T *buf, - linenr_T lnum, // append after this line (can be 0) -! char_u *line_arg, // text of the new line - colnr_T len_arg, // length of line, including NUL, or 0 - int newfile, // flag, see above - int mark) // mark the new line - { -! char_u *line = line_arg; -! colnr_T len = len_arg; - int i; - int line_count; // number of indexes in current block - int offset; -*************** -*** 2641,2656 **** - DATA_BL *dp; - PTR_BL *pp; - infoptr_T *ip; - -- /* lnum out of range */ - if (lnum > buf->b_ml.ml_line_count || buf->b_ml.ml_mfp == NULL) -! return FAIL; - - if (lowest_marked && lowest_marked > lnum) - lowest_marked = lnum + 1; - - if (len == 0) - len = (colnr_T)STRLEN(line) + 1; // space needed for the text - space_needed = len + INDEX_SIZE; // space needed for text + index - - mfp = buf->b_ml.ml_mfp; ---- 2702,2727 ---- - DATA_BL *dp; - PTR_BL *pp; - infoptr_T *ip; -+ #ifdef FEAT_TEXT_PROP -+ char_u *tofree = NULL; -+ #endif -+ int ret = FAIL; - - if (lnum > buf->b_ml.ml_line_count || buf->b_ml.ml_mfp == NULL) -! return FAIL; // lnum out of range - - if (lowest_marked && lowest_marked > lnum) - lowest_marked = lnum + 1; - - if (len == 0) - len = (colnr_T)STRLEN(line) + 1; // space needed for the text -+ -+ #ifdef FEAT_TEXT_PROP -+ if (curbuf->b_has_textprop && lnum > 0) -+ // Add text properties that continue from the previous line. -+ add_text_props_for_append(buf, lnum, &line, &len, &tofree); -+ #endif -+ - space_needed = len + INDEX_SIZE; // space needed for text + index - - mfp = buf->b_ml.ml_mfp; -*************** -*** 2663,2669 **** - */ - if ((hp = ml_find_line(buf, lnum == 0 ? (linenr_T)1 : lnum, - ML_INSERT)) == NULL) -! return FAIL; - - buf->b_ml.ml_flags &= ~ML_EMPTY; - ---- 2734,2740 ---- - */ - if ((hp = ml_find_line(buf, lnum == 0 ? (linenr_T)1 : lnum, - ML_INSERT)) == NULL) -! goto theend; - - buf->b_ml.ml_flags &= ~ML_EMPTY; - -*************** -*** 2694,2700 **** - --(buf->b_ml.ml_locked_lineadd); - --(buf->b_ml.ml_locked_high); - if ((hp = ml_find_line(buf, lnum + 1, ML_INSERT)) == NULL) -! return FAIL; - - db_idx = -1; /* careful, it is negative! */ - /* get line count before the insertion */ ---- 2765,2771 ---- - --(buf->b_ml.ml_locked_lineadd); - --(buf->b_ml.ml_locked_high); - if ((hp = ml_find_line(buf, lnum + 1, ML_INSERT)) == NULL) -! goto theend; - - db_idx = -1; /* careful, it is negative! */ - /* get line count before the insertion */ -*************** -*** 2708,2716 **** - - if ((int)dp->db_free >= space_needed) /* enough room in data block */ - { -! /* -! * Insert new line in existing data block, or in data block allocated above. -! */ - dp->db_txt_start -= len; - dp->db_free -= space_needed; - ++(dp->db_line_count); ---- 2779,2788 ---- - - if ((int)dp->db_free >= space_needed) /* enough room in data block */ - { -! /* -! * Insert the new line in an existing data block, or in the data block -! * allocated above. -! */ - dp->db_txt_start -= len; - dp->db_free -= space_needed; - ++(dp->db_line_count); -*************** -*** 2756,2770 **** - } - else /* not enough space in data block */ - { -- /* -- * If there is not enough room we have to create a new data block and copy some -- * lines into it. -- * Then we have to insert an entry in the pointer block. -- * If this pointer block also is full, we go up another block, and so on, up -- * to the root if necessary. -- * The line counts in the pointer blocks have already been adjusted by -- * ml_find_line(). -- */ - long line_count_left, line_count_right; - int page_count_left, page_count_right; - bhdr_T *hp_left; ---- 2828,2833 ---- -*************** -*** 2783,2788 **** ---- 2846,2859 ---- - PTR_BL *pp_new; - - /* -+ * There is not enough room, we have to create a new data block and -+ * copy some lines into it. -+ * Then we have to insert an entry in the pointer block. -+ * If this pointer block also is full, we go up another block, and so -+ * on, up to the root if necessary. -+ * The line counts in the pointer blocks have already been adjusted by -+ * ml_find_line(). -+ * - * We are going to allocate a new data block. Depending on the - * situation it will be put to the left or right of the existing - * block. If possible we put the new line in the left block and move -*************** -*** 2826,2832 **** - /* correct line counts in pointer blocks */ - --(buf->b_ml.ml_locked_lineadd); - --(buf->b_ml.ml_locked_high); -! return FAIL; - } - if (db_idx < 0) /* left block is new */ - { ---- 2897,2903 ---- - /* correct line counts in pointer blocks */ - --(buf->b_ml.ml_locked_lineadd); - --(buf->b_ml.ml_locked_high); -! goto theend; - } - if (db_idx < 0) /* left block is new */ - { -*************** -*** 2951,2963 **** - ip = &(buf->b_ml.ml_stack[stack_idx]); - pb_idx = ip->ip_index; - if ((hp = mf_get(mfp, ip->ip_bnum, 1)) == NULL) -! return FAIL; - pp = (PTR_BL *)(hp->bh_data); /* must be pointer block */ - if (pp->pb_id != PTR_ID) - { - IEMSG(_("E317: pointer block id wrong 3")); - mf_put(mfp, hp, FALSE, FALSE); -! return FAIL; - } - /* - * TODO: If the pointer block is full and we are adding at the end ---- 3022,3034 ---- - ip = &(buf->b_ml.ml_stack[stack_idx]); - pb_idx = ip->ip_index; - if ((hp = mf_get(mfp, ip->ip_bnum, 1)) == NULL) -! goto theend; - pp = (PTR_BL *)(hp->bh_data); /* must be pointer block */ - if (pp->pb_id != PTR_ID) - { - IEMSG(_("E317: pointer block id wrong 3")); - mf_put(mfp, hp, FALSE, FALSE); -! goto theend; - } - /* - * TODO: If the pointer block is full and we are adding at the end -*************** -*** 3014,3020 **** - { - hp_new = ml_new_ptr(mfp); - if (hp_new == NULL) /* TODO: try to fix tree */ -! return FAIL; - pp_new = (PTR_BL *)(hp_new->bh_data); - - if (hp->bh_bnum != 1) ---- 3085,3091 ---- - { - hp_new = ml_new_ptr(mfp); - if (hp_new == NULL) /* TODO: try to fix tree */ -! goto theend; - pp_new = (PTR_BL *)(hp_new->bh_data); - - if (hp->bh_bnum != 1) -*************** -*** 3119,3126 **** - if (buf->b_write_to_channel) - channel_write_new_lines(buf); - #endif - -! return OK; - } - - /* ---- 3190,3202 ---- - if (buf->b_write_to_channel) - channel_write_new_lines(buf); - #endif -+ ret = OK; - -! theend: -! #ifdef FEAT_TEXT_PROP -! vim_free(tofree); -! #endif -! return ret; - } - - /* -*** ../vim-8.1.0654/src/testdir/test_textprop.vim 2018-12-28 21:59:24.512992993 +0100 ---- src/testdir/test_textprop.vim 2018-12-28 23:18:00.504921000 +0100 -*************** -*** 257,262 **** ---- 257,272 ---- - call assert_equal([expect_short], prop_list(4)) - bwipe! - -+ " Test appending a line below the text prop start. -+ call Setup_three_line_prop() -+ let expect2 = {'col': 4, 'length': 4, 'type': 'comment', 'start': 1, 'end': 0, 'id': 0} -+ call assert_equal([expect2], prop_list(2)) -+ call append(2, "new line") -+ call assert_equal([expect2], prop_list(2)) -+ let expect3 = {'col': 1, 'length': 9, 'type': 'comment', 'start': 0, 'end': 0, 'id': 0} -+ call assert_equal([expect3], prop_list(3)) -+ bwipe! -+ - call prop_type_delete('comment') - endfunc - -*** ../vim-8.1.0654/src/textprop.c 2018-12-25 23:15:41.795966567 +0100 ---- src/textprop.c 2018-12-28 23:19:17.068318767 +0100 -*************** -*** 17,30 **** - * Text properties have a type, which can be used to specify highlighting. - * - * TODO: -! * - mismatch in column 1 being the first column -! * - Let props overrule syntax HL. -! * - When deleting a line where a prop ended, adjust flag of previous line. -! * - When deleting a line where a prop started, adjust flag of next line. -! * - When inserting a line add props that continue from previous line. -! * - Adjust property column and length when text is inserted/deleted -! * - Add an arrray for global_proptypes, to quickly lookup a proptype by ID -! * - Add an arrray for b_proptypes, to quickly lookup a proptype by ID - * - Also test line2byte() with many lines, so that ml_updatechunk() is taken - * into account. - * - add mechanism to keep track of changed lines. ---- 17,28 ---- - * Text properties have a type, which can be used to specify highlighting. - * - * TODO: -! * - Perhaps we only need TP_FLAG_CONT_NEXT ? -! * - Adjust text property column and length when text is inserted/deleted -! * - Add an arrray for global_proptypes, to quickly lookup a prop type by ID -! * - Add an arrray for b_proptypes, to quickly lookup a prop type by ID -! * - Checking the text length to detect text properties is slow. Use a flag in -! * the index, like DB_MARKED? - * - Also test line2byte() with many lines, so that ml_updatechunk() is taken - * into account. - * - add mechanism to keep track of changed lines. -*** ../vim-8.1.0654/src/version.c 2018-12-28 21:59:24.512992993 +0100 ---- src/version.c 2018-12-28 22:58:21.238154315 +0100 -*************** -*** 801,802 **** ---- 801,804 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 655, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -71. You wonder how people walk - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ an exciting new programming language -- http://www.Zimbu.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |