vim/7.4.353
2014-07-22 17:05:04 +02:00

447 lines
12 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.

To: vim_dev@googlegroups.com
Subject: Patch 7.4.353
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------
Patch 7.4.353
Problem: 'linebreak' doesn't work with the 'list' option.
Solution: Make it work. (Christian Brabandt)
Files: src/charset.c, src/screen.c,
src/testdir/Make_amiga.mak, src/testdir/Make_dos.mak,
src/testdir/Make_ming.mak, src/testdir/Make_os2.mak,
src/testdir/Make_vms.mms, src/testdir/Makefile,
src/testdir/test_listlbr.in, src/testdir/test_listlbr.ok
*** ../vim-7.4.352/src/charset.c 2014-07-02 19:37:38.462354956 +0200
--- src/charset.c 2014-07-02 19:47:21.602363892 +0200
***************
*** 1120,1126 ****
if (wp->w_p_lbr
&& vim_isbreak(c)
&& !vim_isbreak(s[1])
- && !wp->w_p_list
&& wp->w_p_wrap
# ifdef FEAT_VERTSPLIT
&& wp->w_width != 0
--- 1120,1125 ----
*** ../vim-7.4.352/src/screen.c 2014-07-02 17:16:51.330225522 +0200
--- src/screen.c 2014-07-02 19:51:42.082367883 +0200
***************
*** 2843,2848 ****
--- 2843,2849 ----
char_u extra[18]; /* "%ld" and 'fdc' must fit in here */
int n_extra = 0; /* number of extra chars */
char_u *p_extra = NULL; /* string of extra chars, plus NUL */
+ char_u *p_extra_free = NULL; /* p_extra needs to be freed */
int c_extra = NUL; /* extra chars, all the same */
int extra_attr = 0; /* attributes when n_extra != 0 */
static char_u *at_end_str = (char_u *)""; /* used for p_extra when
***************
*** 4053,4058 ****
--- 4054,4064 ----
}
else
{
+ if (p_extra_free != NULL)
+ {
+ vim_free(p_extra_free);
+ p_extra_free = NULL;
+ }
/*
* Get a character from the line itself.
*/
***************
*** 4424,4431 ****
/*
* Found last space before word: check for line break.
*/
! if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr)
! && !wp->w_p_list)
{
char_u *p = ptr - (
# ifdef FEAT_MBYTE
--- 4430,4436 ----
/*
* Found last space before word: check for line break.
*/
! if (wp->w_p_lbr && vim_isbreak(c) && !vim_isbreak(*ptr))
{
char_u *p = ptr - (
# ifdef FEAT_MBYTE
***************
*** 4433,4439 ****
# endif
1);
/* TODO: is passing p for start of the line OK? */
! n_extra = win_lbr_chartabsize(wp, p, p, (colnr_T)vcol,
NULL) - 1;
c_extra = ' ';
if (vim_iswhite(c))
--- 4438,4444 ----
# endif
1);
/* TODO: is passing p for start of the line OK? */
! n_extra = win_lbr_chartabsize(wp, line, p, (colnr_T)vcol,
NULL) - 1;
c_extra = ' ';
if (vim_iswhite(c))
***************
*** 4443,4449 ****
/* See "Tab alignment" below. */
FIX_FOR_BOGUSCOLS;
#endif
! c = ' ';
}
}
#endif
--- 4448,4455 ----
/* See "Tab alignment" below. */
FIX_FOR_BOGUSCOLS;
#endif
! if (!wp->w_p_list)
! c = ' ';
}
}
#endif
***************
*** 4483,4491 ****
*/
if (c == TAB && (!wp->w_p_list || lcs_tab1))
{
/* tab amount depends on current column */
! n_extra = (int)wp->w_buffer->b_p_ts
- vcol % (int)wp->w_buffer->b_p_ts - 1;
#ifdef FEAT_CONCEAL
/* Tab alignment should be identical regardless of
* 'conceallevel' value. So tab compensates of all
--- 4489,4538 ----
*/
if (c == TAB && (!wp->w_p_list || lcs_tab1))
{
+ int tab_len = 0;
/* tab amount depends on current column */
! tab_len = (int)wp->w_buffer->b_p_ts
- vcol % (int)wp->w_buffer->b_p_ts - 1;
+ #ifdef FEAT_LINEBREAK
+ if (!wp->w_p_lbr)
+ #endif
+ /* tab amount depends on current column */
+ n_extra = tab_len;
+ #ifdef FEAT_LINEBREAK
+ else
+ {
+ char_u *p;
+ int len = n_extra;
+ int i;
+ int saved_nextra = n_extra;
+
+ /* if n_extra > 0, it gives the number of chars, to
+ * use for a tab, else we need to calculate the width
+ * for a tab */
+ #ifdef FEAT_MBYTE
+ len = (tab_len * mb_char2len(lcs_tab2));
+ if (n_extra > 0)
+ len += n_extra - tab_len;
+ #endif
+ c = lcs_tab1;
+ p = alloc((unsigned)(len + 1));
+ vim_memset(p, ' ', len);
+ p[len] = NUL;
+ p_extra_free = p;
+ for (i = 0; i < tab_len; i++)
+ {
+ #ifdef FEAT_MBYTE
+ mb_char2bytes(lcs_tab2, p);
+ p += mb_char2len(lcs_tab2);
+ n_extra += mb_char2len(lcs_tab2)
+ - (saved_nextra > 0 ? 1 : 0);
+ #else
+ p[i] = lcs_tab2;
+ #endif
+ }
+ p_extra = p_extra_free;
+ }
+ #endif
#ifdef FEAT_CONCEAL
/* Tab alignment should be identical regardless of
* 'conceallevel' value. So tab compensates of all
***************
*** 4501,4508 ****
if (wp->w_p_list)
{
c = lcs_tab1;
! c_extra = lcs_tab2;
! n_attr = n_extra + 1;
extra_attr = hl_attr(HLF_8);
saved_attr2 = char_attr; /* save current attr */
#ifdef FEAT_MBYTE
--- 4548,4560 ----
if (wp->w_p_list)
{
c = lcs_tab1;
! #ifdef FEAT_LINEBREAK
! if (wp->w_p_lbr)
! c_extra = NUL; /* using p_extra from above */
! else
! #endif
! c_extra = lcs_tab2;
! n_attr = tab_len + 1;
extra_attr = hl_attr(HLF_8);
saved_attr2 = char_attr; /* save current attr */
#ifdef FEAT_MBYTE
***************
*** 4598,4606 ****
if ((dy_flags & DY_UHEX) && wp->w_p_rl)
rl_mirror(p_extra); /* reverse "<12>" */
#endif
- n_extra = byte2cells(c) - 1;
c_extra = NUL;
! c = *p_extra++;
if (!attr_pri)
{
n_attr = n_extra + 1;
--- 4650,4674 ----
if ((dy_flags & DY_UHEX) && wp->w_p_rl)
rl_mirror(p_extra); /* reverse "<12>" */
#endif
c_extra = NUL;
! #ifdef FEAT_LINEBREAK
! if (wp->w_p_lbr)
! {
! char_u *p;
!
! c = *p_extra;
! p = alloc((unsigned)n_extra + 1);
! vim_memset(p, ' ', n_extra);
! STRNCPY(p, p_extra + 1, STRLEN(p_extra) - 1);
! p[n_extra] = NUL;
! p_extra_free = p_extra = p;
! }
! else
! #endif
! {
! n_extra = byte2cells(c) - 1;
! c = *p_extra++;
! }
if (!attr_pri)
{
n_attr = n_extra + 1;
*** ../vim-7.4.352/src/testdir/Make_amiga.mak 2014-06-25 14:39:35.110348584 +0200
--- src/testdir/Make_amiga.mak 2014-07-02 19:47:21.610363892 +0200
***************
*** 38,43 ****
--- 38,44 ----
test104.out test105.out test106.out test107.out \
test_autoformat_join.out \
test_breakindent.out \
+ test_listlbr.out \
test_eval.out \
test_options.out
***************
*** 165,169 ****
--- 166,171 ----
test107.out: test107.in
test_autoformat_join.out: test_autoformat_join.in
test_breakindent.out: test_breakindent.in
+ test_listlbr.out: test_listlbr.in
test_eval.out: test_eval.in
test_options.out: test_options.in
*** ../vim-7.4.352/src/testdir/Make_dos.mak 2014-06-25 14:39:35.110348584 +0200
--- src/testdir/Make_dos.mak 2014-07-02 19:47:21.610363892 +0200
***************
*** 37,42 ****
--- 37,43 ----
test105.out test106.out test107.out\
test_autoformat_join.out \
test_breakindent.out \
+ test_listlbr \
test_eval.out \
test_options.out
*** ../vim-7.4.352/src/testdir/Make_ming.mak 2014-06-25 14:39:35.110348584 +0200
--- src/testdir/Make_ming.mak 2014-07-02 19:47:21.610363892 +0200
***************
*** 57,62 ****
--- 57,63 ----
test105.out test106.out test107.out \
test_autoformat_join.out \
test_breakindent.out \
+ test_listlbr.out \
test_eval.out \
test_options.out
*** ../vim-7.4.352/src/testdir/Make_os2.mak 2014-06-25 14:39:35.114348584 +0200
--- src/testdir/Make_os2.mak 2014-07-02 19:47:21.610363892 +0200
***************
*** 40,45 ****
--- 40,46 ----
test_autoformat_join.out \
test_eval.out \
test_breakindent.out \
+ test_listlbr.out \
test_options.out
.SUFFIXES: .in .out
*** ../vim-7.4.352/src/testdir/Make_vms.mms 2014-06-25 14:39:35.114348584 +0200
--- src/testdir/Make_vms.mms 2014-07-02 19:47:21.610363892 +0200
***************
*** 98,103 ****
--- 98,104 ----
test105.out test106.out test107.out \
test_autoformat_join.out \
test_breakindent.out \
+ test_listlbr.out \
test_eval.out \
test_options.out
*** ../vim-7.4.352/src/testdir/Makefile 2014-06-25 14:39:35.114348584 +0200
--- src/testdir/Makefile 2014-07-02 19:47:21.610363892 +0200
***************
*** 35,40 ****
--- 35,41 ----
test104.out test105.out test106.out test107.out \
test_autoformat_join.out \
test_breakindent.out \
+ test_listlbr.out \
test_eval.out \
test_options.out
*** ../vim-7.4.352/src/testdir/test_listlbr.in 2014-07-02 19:58:25.642374067 +0200
--- src/testdir/test_listlbr.in 2014-07-02 19:47:21.610363892 +0200
***************
*** 0 ****
--- 1,62 ----
+ Test for linebreak and list option
+
+ STARTTEST
+ :so small.vim
+ :if !exists("+linebreak") | e! test.ok | w! test.out | qa! | endif
+ :10new|:vsp|:vert resize 20
+ :put =\"\tabcdef hijklmn\tpqrstuvwxyz\u00a01060ABCDEFGHIJKLMNOP \"
+ :norm! zt
+ :set ts=4 sw=4 sts=4 linebreak sbr=+ wrap
+ :fu! ScreenChar(width)
+ : let c=''
+ : for j in range(1,4)
+ : for i in range(1,a:width)
+ : let c.=nr2char(screenchar(j, i))
+ : endfor
+ : let c.="\n"
+ : endfor
+ : return c
+ :endfu
+ :fu! DoRecordScreen()
+ : wincmd l
+ : $put =printf(\"\n%s\", g:test)
+ : $put =g:line
+ : wincmd p
+ :endfu
+ :let g:test="Test 1: set linebreak"
+ :redraw!
+ :let line=ScreenChar(winwidth(0))
+ :call DoRecordScreen()
+ :let g:test="Test 2: set linebreak + set list"
+ :set linebreak list listchars=
+ :redraw!
+ :let line=ScreenChar(winwidth(0))
+ :call DoRecordScreen()
+ :let g:test ="Test 3: set linebreak + set list + fancy listchars"
+ :exe "set linebreak list listchars=nbsp:\u2423,tab:\u2595\u2014,trail:\u02d1,eol:\ub6"
+ :redraw!
+ :let line=ScreenChar(winwidth(0))
+ :call DoRecordScreen()
+ :let g:test ="Test 4: set linebreak nolist"
+ :set nolist linebreak
+ :redraw!
+ :let line=ScreenChar(winwidth(0))
+ :call DoRecordScreen()
+ :let g:test ="Test 5: set nolinebreak list"
+ :set list nolinebreak
+ :redraw!
+ :let line=ScreenChar(winwidth(0))
+ :call DoRecordScreen()
+ :let g:test ="Test 6: set linebreak with tab and 1 line as long as screen: should break!"
+ :set nolist linebreak ts=8
+ :let line="1\t".repeat('a', winwidth(0)-2)
+ :$put =line
+ :$
+ :norm! zt
+ :redraw!
+ :let line=ScreenChar(winwidth(0))
+ :call DoRecordScreen()
+ :%w! test.out
+ :qa!
+ ENDTEST
+ dummy text
*** ../vim-7.4.352/src/testdir/test_listlbr.ok 2014-07-02 19:58:25.646374067 +0200
--- src/testdir/test_listlbr.ok 2014-07-02 19:47:21.610363892 +0200
***************
*** 0 ****
--- 1,39 ----
+
+ abcdef hijklmn pqrstuvwxyz 1060ABCDEFGHIJKLMNOP
+
+ Test 1: set linebreak
+ abcdef
+ +hijklmn
+ +pqrstuvwxyz 1060ABC
+ +DEFGHIJKLMNOP
+
+ Test 2: set linebreak + set list
+ ^Iabcdef hijklmn^I
+ +pqrstuvwxyz 1060ABC
+ +DEFGHIJKLMNOP
+
+
+ Test 3: set linebreak + set list + fancy listchars
+ ▕———abcdef
+ +hijklmn▕———
+ +pqrstuvwxyz␣1060ABC
+ +DEFGHIJKLMNOPˑ¶
+
+ Test 4: set linebreak nolist
+ abcdef
+ +hijklmn
+ +pqrstuvwxyz 1060ABC
+ +DEFGHIJKLMNOP
+
+ Test 5: set nolinebreak list
+ ▕———abcdef hijklmn▕—
+ +pqrstuvwxyz␣1060ABC
+ +DEFGHIJKLMNOPˑ¶
+ ¶
+ 1 aaaaaaaaaaaaaaaaaa
+
+ Test 6: set linebreak with tab and 1 line as long as screen: should break!
+ 1
+ +aaaaaaaaaaaaaaaaaa
+ ~
+ ~
*** ../vim-7.4.352/src/version.c 2014-07-02 19:37:38.462354956 +0200
--- src/version.c 2014-07-02 19:57:44.066373430 +0200
***************
*** 736,737 ****
--- 736,739 ----
{ /* Add new patch number below this line */
+ /**/
+ 353,
/**/
--
FATHER: You only killed the bride's father - that's all -
LAUNCELOT: Oh dear, I didn't really mean to...
FATHER: Didn't mean to? You put your sword right through his head!
LAUNCELOT: Gosh - Is he all right?
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD
/// 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 ///