To: vim-dev@vim.org Subject: Patch 7.2.301 Fcc: outbox From: Bram Moolenaar 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 *** ../vim-7.2.300/src/edit.c 2009-11-11 13:22:32.000000000 +0100 --- src/edit.c 2009-11-17 15:34:47.000000000 +0100 *************** *** 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 *** ../vim-7.2.300/src/testdir/Makefile 2009-11-17 17:36:13.000000000 +0100 --- src/testdir/Makefile 2009-11-17 15:11:26.000000000 +0100 *************** *** 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 *** ../vim-7.2.300/src/testdir/test68.in 2009-11-17 17:39:36.000000000 +0100 --- src/testdir/test68.in 2009-11-17 15:39:09.000000000 +0100 *************** *** 0 **** --- 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 *** ../vim-7.2.300/src/testdir/test68.ok 2009-11-17 17:39:36.000000000 +0100 --- src/testdir/test68.ok 2009-11-17 15:11:26.000000000 +0100 *************** *** 0 **** --- 1,35 ---- + Results of test68: + + + { + a + b + } + + + { + a + b + + a + b + } + + + { + a +  + + a +  + } + + + { + a b + #a b + + a b + #a b + } + *** ../vim-7.2.300/src/testdir/test69.in 2009-11-17 17:39:36.000000000 +0100 --- src/testdir/test69.in 2009-11-17 15:11:26.000000000 +0100 *************** *** 0 **** --- 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 *** ../vim-7.2.300/src/testdir/test69.ok 2009-11-17 17:39:36.000000000 +0100 --- src/testdir/test69.ok 2009-11-17 15:11:26.000000000 +0100 *************** *** 0 **** --- 1,142 ---- + Results of test69: + + + { + XYZ + abc + XYZ + + XYZ + abc + XYZ + } + + + { + X + X + a + X + a + X + Y + X + Y + + X + X + a + X + a + X + Y + X + Y + } + + + { + X + X + a + X + a + X + Y + X + Y + a + X + ab + X + abc + X + ab + X + c + ab + X + Y + + X + X + a + X + a + X + Y + X + Y + a + X + ab + X + abc + X + ab + X + c + ab + X + Y + } + + + { + 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 + } + *** ../vim-7.2.300/src/version.c 2009-11-17 17:37:34.000000000 +0100 --- src/version.c 2009-11-17 17:26:35.000000000 +0100 *************** *** 683,684 **** --- 683,686 ---- { /* Add new patch number below this line */ + /**/ + 301, /**/