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
*** ../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
+ ï¼¹
+ 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
+ }
+
*** ../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,
/**/