| To: vim-dev@vim.org |
| Subject: Patch 7.2.301 |
| Fcc: outbox |
| From: Bram Moolenaar <Bram@moolenaar.net> |
| Mime-Version: 1.0 |
| Content-Type: text/plain; charset=UTF-8 |
| Content-Transfer-Encoding: 8bit |
| |
| |
| NOTE: some mail and patch programs may have a problem with the non-ASCII |
| characters in this patch. You can fetch the patch from |
| ftp://ftp.vim.org/pub/vim/patches/7.2/7.2.301 and/or fetch the updated |
| files from CVS. http://www.vim.org/cvs.php |
| |
| |
| Patch 7.2.301 |
| Problem: Formatting is wrong when 'tw' is set to a small value. |
| Solution: Fix it and add tests. Also fix behavior of "1" in 'fo'. (Yukihiro |
| Nakadaira) |
| Files: src/edit.c, src/testdir/Makefile, src/testdir/test68.in, |
| src/testdir/test68.ok, src/testdir/test69.in, |
| src/testdir/test69.ok |
| |
| |
| |
| |
| |
| *** 181,187 **** |
| static void ins_ctrl_v __ARGS((void)); |
| static void undisplay_dollar __ARGS((void)); |
| static void insert_special __ARGS((int, int, int)); |
| ! static void internal_format __ARGS((int textwidth, int second_indent, int flags, int format_only)); |
| static void check_auto_format __ARGS((int)); |
| static void redo_literal __ARGS((int c)); |
| static void start_arrow __ARGS((pos_T *end_insert_pos)); |
| --- 181,187 ---- |
| static void ins_ctrl_v __ARGS((void)); |
| static void undisplay_dollar __ARGS((void)); |
| static void insert_special __ARGS((int, int, int)); |
| ! static void internal_format __ARGS((int textwidth, int second_indent, int flags, int format_only, int c)); |
| static void check_auto_format __ARGS((int)); |
| static void redo_literal __ARGS((int c)); |
| static void start_arrow __ARGS((pos_T *end_insert_pos)); |
| |
| *** 2164,2170 **** |
| int i, c; |
| int actual_len; /* Take multi-byte characters */ |
| int actual_compl_length; /* into account. */ |
| ! int *wca; /* Wide character array. */ |
| int has_lower = FALSE; |
| int was_letter = FALSE; |
| |
| --- 2164,2170 ---- |
| int i, c; |
| int actual_len; /* Take multi-byte characters */ |
| int actual_compl_length; /* into account. */ |
| ! int *wca; /* Wide character array. */ |
| int has_lower = FALSE; |
| int was_letter = FALSE; |
| |
| |
| *** 5558,5564 **** |
| } |
| if (do_internal) |
| #endif |
| ! internal_format(textwidth, second_indent, flags, c == NUL); |
| } |
| |
| if (c == NUL) /* only formatting was wanted */ |
| --- 5558,5564 ---- |
| } |
| if (do_internal) |
| #endif |
| ! internal_format(textwidth, second_indent, flags, c == NUL, c); |
| } |
| |
| if (c == NUL) /* only formatting was wanted */ |
| |
| *** 5738,5748 **** |
| * Format text at the current insert position. |
| */ |
| static void |
| ! internal_format(textwidth, second_indent, flags, format_only) |
| int textwidth; |
| int second_indent; |
| int flags; |
| int format_only; |
| { |
| int cc; |
| int save_char = NUL; |
| --- 5738,5749 ---- |
| * Format text at the current insert position. |
| */ |
| static void |
| ! internal_format(textwidth, second_indent, flags, format_only, c) |
| int textwidth; |
| int second_indent; |
| int flags; |
| int format_only; |
| + int c; /* character to be inserted (can be NUL) */ |
| { |
| int cc; |
| int save_char = NUL; |
| |
| *** 5763,5769 **** |
| * When 'ai' is off we don't want a space under the cursor to be |
| * deleted. Replace it with an 'x' temporarily. |
| */ |
| ! if (!curbuf->b_p_ai) |
| { |
| cc = gchar_cursor(); |
| if (vim_iswhite(cc)) |
| --- 5764,5774 ---- |
| * When 'ai' is off we don't want a space under the cursor to be |
| * deleted. Replace it with an 'x' temporarily. |
| */ |
| ! if (!curbuf->b_p_ai |
| ! #ifdef FEAT_VREPLACE |
| ! && !(State & VREPLACE_FLAG) |
| ! #endif |
| ! ) |
| { |
| cc = gchar_cursor(); |
| if (vim_iswhite(cc)) |
| |
| *** 5789,5797 **** |
| char_u *saved_text = NULL; |
| #endif |
| colnr_T col; |
| |
| ! virtcol = get_nolist_virtcol(); |
| ! if (virtcol < (colnr_T)textwidth) |
| break; |
| |
| #ifdef FEAT_COMMENTS |
| --- 5794,5804 ---- |
| char_u *saved_text = NULL; |
| #endif |
| colnr_T col; |
| + colnr_T end_col; |
| |
| ! virtcol = get_nolist_virtcol() |
| ! + char2cells(c != NUL ? c : gchar_cursor()); |
| ! if (virtcol <= (colnr_T)textwidth) |
| break; |
| |
| #ifdef FEAT_COMMENTS |
| |
| *** 5831,5842 **** |
| coladvance((colnr_T)textwidth); |
| wantcol = curwin->w_cursor.col; |
| |
| ! curwin->w_cursor.col = startcol - 1; |
| ! #ifdef FEAT_MBYTE |
| ! /* Correct cursor for multi-byte character. */ |
| ! if (has_mbyte) |
| ! mb_adjust_cursor(); |
| ! #endif |
| foundcol = 0; |
| |
| /* |
| --- 5838,5844 ---- |
| coladvance((colnr_T)textwidth); |
| wantcol = curwin->w_cursor.col; |
| |
| ! curwin->w_cursor.col = startcol; |
| foundcol = 0; |
| |
| /* |
| |
| *** 5847,5857 **** |
| || curwin->w_cursor.lnum != Insstart.lnum |
| || curwin->w_cursor.col >= Insstart.col) |
| { |
| ! cc = gchar_cursor(); |
| if (WHITECHAR(cc)) |
| { |
| /* remember position of blank just before text */ |
| ! end_foundcol = curwin->w_cursor.col; |
| |
| /* find start of sequence of blanks */ |
| while (curwin->w_cursor.col > 0 && WHITECHAR(cc)) |
| --- 5849,5862 ---- |
| || curwin->w_cursor.lnum != Insstart.lnum |
| || curwin->w_cursor.col >= Insstart.col) |
| { |
| ! if (curwin->w_cursor.col == startcol && c != NUL) |
| ! cc = c; |
| ! else |
| ! cc = gchar_cursor(); |
| if (WHITECHAR(cc)) |
| { |
| /* remember position of blank just before text */ |
| ! end_col = curwin->w_cursor.col; |
| |
| /* find start of sequence of blanks */ |
| while (curwin->w_cursor.col > 0 && WHITECHAR(cc)) |
| |
| *** 5871,5877 **** |
| /* do not break after one-letter words */ |
| if (curwin->w_cursor.col == 0) |
| break; /* one-letter word at begin */ |
| ! |
| col = curwin->w_cursor.col; |
| dec_cursor(); |
| cc = gchar_cursor(); |
| --- 5876,5886 ---- |
| /* do not break after one-letter words */ |
| if (curwin->w_cursor.col == 0) |
| break; /* one-letter word at begin */ |
| ! #ifdef FEAT_COMMENTS |
| ! /* do not break "#a b" when 'tw' is 2 */ |
| ! if (curwin->w_cursor.col <= leader_len) |
| ! break; |
| ! #endif |
| col = curwin->w_cursor.col; |
| dec_cursor(); |
| cc = gchar_cursor(); |
| |
| *** 5880,5905 **** |
| continue; /* one-letter, continue */ |
| curwin->w_cursor.col = col; |
| } |
| ! #ifdef FEAT_MBYTE |
| ! if (has_mbyte) |
| ! foundcol = curwin->w_cursor.col |
| ! + (*mb_ptr2len)(ml_get_cursor()); |
| ! else |
| ! #endif |
| ! foundcol = curwin->w_cursor.col + 1; |
| ! if (curwin->w_cursor.col < (colnr_T)wantcol) |
| break; |
| } |
| #ifdef FEAT_MBYTE |
| ! else if (cc >= 0x100 && fo_multibyte |
| ! && curwin->w_cursor.col <= (colnr_T)wantcol) |
| { |
| /* Break after or before a multi-byte character. */ |
| foundcol = curwin->w_cursor.col; |
| - if (curwin->w_cursor.col < (colnr_T)wantcol) |
| - foundcol += (*mb_char2len)(cc); |
| end_foundcol = foundcol; |
| ! break; |
| } |
| #endif |
| if (curwin->w_cursor.col == 0) |
| --- 5889,5948 ---- |
| continue; /* one-letter, continue */ |
| curwin->w_cursor.col = col; |
| } |
| ! |
| ! inc_cursor(); |
| ! |
| ! end_foundcol = end_col + 1; |
| ! foundcol = curwin->w_cursor.col; |
| ! if (curwin->w_cursor.col <= (colnr_T)wantcol) |
| break; |
| } |
| #ifdef FEAT_MBYTE |
| ! else if (cc >= 0x100 && fo_multibyte) |
| { |
| /* Break after or before a multi-byte character. */ |
| + if (curwin->w_cursor.col != startcol) |
| + { |
| + #ifdef FEAT_COMMENTS |
| + /* Don't break until after the comment leader */ |
| + if (curwin->w_cursor.col < leader_len) |
| + break; |
| + #endif |
| + col = curwin->w_cursor.col; |
| + inc_cursor(); |
| + /* Don't change end_foundcol if already set. */ |
| + if (foundcol != curwin->w_cursor.col) |
| + { |
| + foundcol = curwin->w_cursor.col; |
| + end_foundcol = foundcol; |
| + if (curwin->w_cursor.col <= (colnr_T)wantcol) |
| + break; |
| + } |
| + curwin->w_cursor.col = col; |
| + } |
| + |
| + if (curwin->w_cursor.col == 0) |
| + break; |
| + |
| + col = curwin->w_cursor.col; |
| + |
| + dec_cursor(); |
| + cc = gchar_cursor(); |
| + |
| + if (WHITECHAR(cc)) |
| + continue; /* break with space */ |
| + #ifdef FEAT_COMMENTS |
| + /* Don't break until after the comment leader */ |
| + if (curwin->w_cursor.col < leader_len) |
| + break; |
| + #endif |
| + |
| + curwin->w_cursor.col = col; |
| + |
| foundcol = curwin->w_cursor.col; |
| end_foundcol = foundcol; |
| ! if (curwin->w_cursor.col <= (colnr_T)wantcol) |
| ! break; |
| } |
| #endif |
| if (curwin->w_cursor.col == 0) |
| |
| *** 5926,5939 **** |
| orig_col = startcol; /* Will start backspacing from here */ |
| else |
| #endif |
| ! replace_offset = startcol - end_foundcol - 1; |
| |
| /* |
| * adjust startcol for spaces that will be deleted and |
| * characters that will remain on top line |
| */ |
| curwin->w_cursor.col = foundcol; |
| ! while (cc = gchar_cursor(), WHITECHAR(cc)) |
| inc_cursor(); |
| startcol -= curwin->w_cursor.col; |
| if (startcol < 0) |
| --- 5969,5983 ---- |
| orig_col = startcol; /* Will start backspacing from here */ |
| else |
| #endif |
| ! replace_offset = startcol - end_foundcol; |
| |
| /* |
| * adjust startcol for spaces that will be deleted and |
| * characters that will remain on top line |
| */ |
| curwin->w_cursor.col = foundcol; |
| ! while ((cc = gchar_cursor(), WHITECHAR(cc)) |
| ! && (!fo_white_par || curwin->w_cursor.col < startcol)) |
| inc_cursor(); |
| startcol -= curwin->w_cursor.col; |
| if (startcol < 0) |
| |
| *** 8509,8515 **** |
| if (mode == BACKSPACE_LINE |
| && (curbuf->b_p_ai |
| #ifdef FEAT_CINDENT |
| ! || cindent_on() |
| #endif |
| ) |
| #ifdef FEAT_RIGHTLEFT |
| --- 8553,8559 ---- |
| if (mode == BACKSPACE_LINE |
| && (curbuf->b_p_ai |
| #ifdef FEAT_CINDENT |
| ! || cindent_on() |
| #endif |
| ) |
| #ifdef FEAT_RIGHTLEFT |
| |
| |
| |
| *** 22,28 **** |
| test48.out test49.out test51.out test52.out test53.out \ |
| test54.out test55.out test56.out test57.out test58.out \ |
| test59.out test60.out test61.out test62.out test63.out \ |
| ! test64.out test65.out test66.out test67.out |
| |
| SCRIPTS_GUI = test16.out |
| |
| --- 22,29 ---- |
| test48.out test49.out test51.out test52.out test53.out \ |
| test54.out test55.out test56.out test57.out test58.out \ |
| test59.out test60.out test61.out test62.out test63.out \ |
| ! test64.out test65.out test66.out test67.out test68.out \ |
| ! test69.out |
| |
| SCRIPTS_GUI = test16.out |
| |
| |
| |
| |
| |
| --- 1,56 ---- |
| + Test for text formatting. |
| + |
| + Results of test68: |
| + |
| + STARTTEST |
| + :so small.vim |
| + /^{/+1 |
| + :set noai tw=2 fo=t |
| + gRa b |
| + ENDTEST |
| + |
| + { |
| + |
| + |
| + } |
| + |
| + STARTTEST |
| + /^{/+1 |
| + :set ai tw=2 fo=tw |
| + gqgqjjllab |
| + ENDTEST |
| + |
| + { |
| + a b |
| + |
| + a |
| + } |
| + |
| + STARTTEST |
| + /^{/+1 |
| + :set tw=3 fo=t |
| + gqgqo |
| + a |
| + ENDTEST |
| + |
| + { |
| + a |
| + } |
| + |
| + STARTTEST |
| + /^{/+1 |
| + :set tw=2 fo=tcq1 comments=:# |
| + gqgqjgqgqo |
| + a b |
| + #a b |
| + ENDTEST |
| + |
| + { |
| + a b |
| + #a b |
| + } |
| + |
| + STARTTEST |
| + :g/^STARTTEST/.,/^ENDTEST/d |
| + :1;/^Results/,$wq! test.out |
| + ENDTEST |
| |
| |
| |
| |
| --- 1,35 ---- |
| + Results of test68: |
| + |
| + |
| + { |
| + a |
| + b |
| + } |
| + |
| + |
| + { |
| + a |
| + b |
| + |
| + a |
| + b |
| + } |
| + |
| + |
| + { |
| + a |
| + |
| + |
| + a |
| + |
| + } |
| + |
| + |
| + { |
| + a b |
| + #a b |
| + |
| + a b |
| + #a b |
| + } |
| + |
| |
| |
| |
| |
| --- 1,139 ---- |
| + Test for multi-byte text formatting. |
| + |
| + STARTTEST |
| + :so mbyte.vim |
| + :set encoding=utf-8 |
| + ENDTEST |
| + |
| + Results of test69: |
| + |
| + STARTTEST |
| + /^{/+1 |
| + :set tw=2 fo=t |
| + gqgqjgqgqo |
| + XYZ |
| + abc XYZ |
| + ENDTEST |
| + |
| + { |
| + XYZ |
| + abc XYZ |
| + } |
| + |
| + STARTTEST |
| + /^{/+1 |
| + :set tw=1 fo=tm |
| + gqgqjgqgqjgqgqjgqgqjgqgqo |
| + X |
| + Xa |
| + X a |
| + XY |
| + X Y |
| + ENDTEST |
| + |
| + { |
| + X |
| + Xa |
| + X a |
| + XY |
| + X Y |
| + } |
| + |
| + STARTTEST |
| + /^{/+1 |
| + :set tw=2 fo=tm |
| + gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo |
| + X |
| + Xa |
| + X a |
| + XY |
| + X Y |
| + aX |
| + abX |
| + abcX |
| + abX c |
| + abXY |
| + ENDTEST |
| + |
| + { |
| + X |
| + Xa |
| + X a |
| + XY |
| + X Y |
| + aX |
| + abX |
| + abcX |
| + abX c |
| + abXY |
| + } |
| + |
| + STARTTEST |
| + /^{/+1 |
| + :set ai tw=2 fo=tm |
| + gqgqjgqgqo |
| + X |
| + Xa |
| + ENDTEST |
| + |
| + { |
| + X |
| + Xa |
| + } |
| + |
| + STARTTEST |
| + /^{/+1 |
| + :set noai tw=2 fo=tm |
| + gqgqjgqgqo |
| + X |
| + Xa |
| + ENDTEST |
| + |
| + { |
| + X |
| + Xa |
| + } |
| + |
| + STARTTEST |
| + /^{/+1 |
| + :set tw=2 fo=cqm comments=n:X |
| + gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo |
| + X |
| + Xa |
| + XaY |
| + XY |
| + XYZ |
| + X Y |
| + X YZ |
| + XX |
| + XXa |
| + XXY |
| + ENDTEST |
| + |
| + { |
| + X |
| + Xa |
| + XaY |
| + XY |
| + XYZ |
| + X Y |
| + X YZ |
| + XX |
| + XXa |
| + XXY |
| + } |
| + |
| + STARTTEST |
| + /^{/+1 |
| + :set tw=2 fo=tm |
| + RXa |
| + ENDTEST |
| + |
| + { |
| + |
| + } |
| + |
| + STARTTEST |
| + :g/^STARTTEST/.,/^ENDTEST/d |
| + :1;/^Results/,$wq! test.out |
| + ENDTEST |
| |
| |
| |
| |
| --- 1,142 ---- |
| + Results of test69: |
| + |
| + |
| + { |
| + XYZ |
| + abc |
| + XYZ |
| + |
| + XYZ |
| + abc |
| + XYZ |
| + } |
| + |
| + |
| + { |
| + X |
| + X |
| + a |
| + X |
| + a |
| + X |
| + ï¼¹ |
| + X |
| + ï¼¹ |
| + |
| + X |
| + X |
| + a |
| + X |
| + a |
| + X |
| + ï¼¹ |
| + X |
| + ï¼¹ |
| + } |
| + |
| + |
| + { |
| + X |
| + X |
| + a |
| + X |
| + a |
| + X |
| + ï¼¹ |
| + X |
| + ï¼¹ |
| + a |
| + X |
| + ab |
| + X |
| + abc |
| + X |
| + ab |
| + X |
| + c |
| + ab |
| + X |
| + ï¼¹ |
| + |
| + X |
| + X |
| + a |
| + X |
| + a |
| + X |
| + ï¼¹ |
| + X |
| + ï¼¹ |
| + a |
| + X |
| + ab |
| + X |
| + abc |
| + X |
| + ab |
| + X |
| + c |
| + ab |
| + X |
| + ï¼¹ |
| + } |
| + |
| + |
| + { |
| + X |
| + X |
| + a |
| + |
| + X |
| + X |
| + a |
| + } |
| + |
| + |
| + { |
| + X |
| + X |
| + a |
| + |
| + X |
| + X |
| + a |
| + } |
| + |
| + |
| + { |
| + X |
| + Xa |
| + Xa |
| + XY |
| + XY |
| + XY |
| + XZ |
| + X Y |
| + X Y |
| + X Z |
| + XX |
| + XXa |
| + XXY |
| + |
| + X |
| + Xa |
| + Xa |
| + XY |
| + XY |
| + XY |
| + XZ |
| + X Y |
| + X Y |
| + X Z |
| + XX |
| + XXa |
| + XXY |
| + } |
| + |
| + |
| + { |
| + X |
| + a |
| + } |
| + |
| |
| |
| |
| *** 683,684 **** |
| --- 683,686 ---- |
| { /* Add new patch number below this line */ |
| + /**/ |
| + 301, |
| /**/ |