vim/7.2.301
2009-12-02 16:38:43 +00:00

778 lines
14 KiB
Plaintext
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
+
+ abc 
+ ENDTEST
+
+ {
+
+ abc
+ }
+
+ STARTTEST
+ /^{/+1
+ :set tw=1 fo=tm
+ gqgqjgqgqjgqgqjgqgqjgqgqo
+
+ a
+ a
+
+ 
+ ENDTEST
+
+ {
+
+ a
+ a
+
+
+ }
+
+ STARTTEST
+ /^{/+1
+ :set tw=2 fo=tm
+ gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo
+
+ a
+ a
+
+
+ a
+ ab
+ abc
+ ab c
+ ab
+ ENDTEST
+
+ {
+
+ a
+ a
+
+
+ a
+ ab
+ abc
+ ab c
+ ab
+ }
+
+ STARTTEST
+ /^{/+1
+ :set ai tw=2 fo=tm
+ gqgqjgqgqo
+
+ a
+ ENDTEST
+
+ {
+
+ a
+ }
+
+ STARTTEST
+ /^{/+1
+ :set noai tw=2 fo=tm
+ gqgqjgqgqo
+
+ a
+ ENDTEST
+
+ {
+
+ a
+ }
+
+ STARTTEST
+ /^{/+1
+ :set tw=2 fo=cqm comments=n:
+ gqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqjgqgqo
+
+ a
+ a
+
+
+
+
+
+ a
+ 
+ ENDTEST
+
+ {
+
+ a
+ a
+
+
+
+
+
+ a
+
+ }
+
+ STARTTEST
+ /^{/+1
+ :set tw=2 fo=tm
+ Ra
+ 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:
+
+
+ {
+
+ abc
+
+
+
+ abc
+
+ }
+
+
+ {
+
+
+ a
+
+ a
+
+
+
+
+
+
+
+ a
+
+ a
+
+
+
+
+ }
+
+
+ {
+
+
+ a
+
+ a
+
+
+
+
+ a
+
+ ab
+
+ abc
+
+ ab
+
+ c
+ ab
+
+
+
+
+
+ a
+
+ a
+
+
+
+
+ a
+
+ ab
+
+ abc
+
+ ab
+
+ c
+ ab
+
+
+ }
+
+
+ {
+
+
+ a
+
+
+
+ a
+ }
+
+
+ {
+
+
+ a
+
+
+
+ a
+ }
+
+
+ {
+
+ a
+ a
+
+
+
+
+
+
+
+
+ a
+
+
+
+ a
+ a
+
+
+
+
+
+
+
+
+ a
+
+ }
+
+
+ {
+
+ 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,
/**/