Merge #2492 'vim-patch:7.4.710-712'

This commit is contained in:
Justin M. Keyes 2015-04-27 04:59:45 -04:00
commit d9441444af
7 changed files with 129 additions and 14 deletions

View File

@ -4440,31 +4440,35 @@ A jump table for the options with a short description can be found at |Q_op|.
{not in Vi} {not in Vi}
Strings to use in 'list' mode and for the |:list| command. It is a Strings to use in 'list' mode and for the |:list| command. It is a
comma separated list of string settings. comma separated list of string settings.
*lcs-eol* *lcs-eol*
eol:c Character to show at the end of each line. When eol:c Character to show at the end of each line. When
omitted, there is no extra character at the end of the omitted, there is no extra character at the end of the
line. line.
*lcs-tab* *lcs-tab*
tab:xy Two characters to be used to show a tab. The first tab:xy Two characters to be used to show a tab. The first
char is used once. The second char is repeated to char is used once. The second char is repeated to
fill the space that the tab normally occupies. fill the space that the tab normally occupies.
"tab:>-" will show a tab that takes four spaces as "tab:>-" will show a tab that takes four spaces as
">---". When omitted, a tab is show as ^I. ">---". When omitted, a tab is show as ^I.
*lcs-trail* *lcs-space*
space:c Character to show for a space. When omitted, spaces
are left blank.
*lcs-trail*
trail:c Character to show for trailing spaces. When omitted, trail:c Character to show for trailing spaces. When omitted,
trailing spaces are blank. trailing spaces are blank. Overrides the "space"
*lcs-extends* setting for trailing spaces.
*lcs-extends*
extends:c Character to show in the last column, when 'wrap' is extends:c Character to show in the last column, when 'wrap' is
off and the line continues beyond the right of the off and the line continues beyond the right of the
screen. screen.
*lcs-precedes* *lcs-precedes*
precedes:c Character to show in the first column, when 'wrap' precedes:c Character to show in the first column, when 'wrap'
is off and there is text preceding the character is off and there is text preceding the character
visible in the first column. visible in the first column.
*lcs-conceal* *lcs-conceal*
conceal:c Character to show in place of concealed text, when conceal:c Character to show in place of concealed text, when
'conceallevel' is set to 1. 'conceallevel' is set to 1.
*lcs-nbsp* *lcs-nbsp*
nbsp:c Character to show for a non-breakable space (character nbsp:c Character to show for a non-breakable space (character
0xA0, 160). Left blank when omitted. 0xA0, 160). Left blank when omitted.
@ -4477,7 +4481,7 @@ A jump table for the options with a short description can be found at |Q_op|.
:set lcs=tab:>-,eol:<,nbsp:% :set lcs=tab:>-,eol:<,nbsp:%
:set lcs=extends:>,precedes:< :set lcs=extends:>,precedes:<
< The "NonText" highlighting will be used for "eol", "extends" and < The "NonText" highlighting will be used for "eol", "extends" and
"precedes". "SpecialKey" for "nbsp", "tab" and "trail". "precedes". "SpecialKey" for "nbsp", "space", "tab" and "trail".
|hl-NonText| |hl-SpecialKey| |hl-NonText| |hl-SpecialKey|
*'lpl'* *'nolpl'* *'loadplugins'* *'noloadplugins'* *'lpl'* *'nolpl'* *'loadplugins'* *'noloadplugins'*

View File

@ -998,6 +998,7 @@ EXTERN int lcs_eol INIT(= '$');
EXTERN int lcs_ext INIT(= NUL); EXTERN int lcs_ext INIT(= NUL);
EXTERN int lcs_prec INIT(= NUL); EXTERN int lcs_prec INIT(= NUL);
EXTERN int lcs_nbsp INIT(= NUL); EXTERN int lcs_nbsp INIT(= NUL);
EXTERN int lcs_space INIT(= NUL);
EXTERN int lcs_tab1 INIT(= NUL); EXTERN int lcs_tab1 INIT(= NUL);
EXTERN int lcs_tab2 INIT(= NUL); EXTERN int lcs_tab2 INIT(= NUL);
EXTERN int lcs_trail INIT(= NUL); EXTERN int lcs_trail INIT(= NUL);

View File

@ -1450,6 +1450,9 @@ void msg_prt_line(char_u *s, int list)
} else if (c == ' ' && trail != NULL && s > trail) { } else if (c == ' ' && trail != NULL && s > trail) {
c = lcs_trail; c = lcs_trail;
attr = hl_attr(HLF_8); attr = hl_attr(HLF_8);
} else if (c == ' ' && list && lcs_space != NUL) {
c = lcs_space;
attr = hl_attr(HLF_8);
} }
} }

View File

@ -4502,6 +4502,7 @@ static char_u *set_chars_option(char_u **varp)
{&lcs_ext, "extends"}, {&lcs_ext, "extends"},
{&lcs_nbsp, "nbsp"}, {&lcs_nbsp, "nbsp"},
{&lcs_prec, "precedes"}, {&lcs_prec, "precedes"},
{&lcs_space, "space"},
{&lcs_tab2, "tab"}, {&lcs_tab2, "tab"},
{&lcs_trail, "trail"}, {&lcs_trail, "trail"},
{&lcs_conceal, "conceal"}, {&lcs_conceal, "conceal"},

View File

@ -3165,11 +3165,11 @@ win_line (
} }
++ptr; ++ptr;
/* 'list' : change char 160 to lcs_nbsp. */ // 'list': change char 160 to lcs_nbsp and space to lcs_space.
if (wp->w_p_list && (c == 160 if (wp->w_p_list
|| (mb_utf8 && mb_c == 160) && (((c == 160 || (mb_utf8 && mb_c == 160)) && lcs_nbsp)
) && lcs_nbsp) { || (c == ' ' && lcs_space && ptr <= line + trailcol))) {
c = lcs_nbsp; c = (c == ' ') ? lcs_space : lcs_nbsp;
if (area_attr == 0 && search_attr == 0) { if (area_attr == 0 && search_attr == 0) {
n_attr = 1; n_attr = 1;
extra_attr = hl_attr(HLF_8); extra_attr = hl_attr(HLF_8);

View File

@ -67,6 +67,16 @@ static char *features[] = {
// clang-format off // clang-format off
static int included_patches[] = { static int included_patches[] = {
712,
711,
710,
//709,
//708,
//707,
//706,
//705,
//704,
//703,
702, 702,
//701, //701,
//700, //700,

View File

@ -0,0 +1,96 @@
-- Tests for 'listchars' display with 'list' and :list.
local helpers = require('test.functional.helpers')
local feed, insert, source = helpers.feed, helpers.insert, helpers.source
local clear, execute, expect = helpers.clear, helpers.execute, helpers.expect
describe("'listchars'", function()
before_each(clear)
it("works with 'list'", function()
source([[
function GetScreenCharsForLine(lnum)
return join(map(range(1, virtcol('$')), 'nr2char(screenchar(a:lnum, v:val))'), '')
endfunction
nnoremap <expr> GG ":call add(g:lines, GetScreenCharsForLine(".screenrow()."))\<CR>"
]])
insert([[
start:
aa
bb
cccc
dd ee
]])
execute('let g:lines = []')
-- Set up 'listchars', switch on 'list', and use the "GG" mapping to record
-- what the buffer lines look like.
execute('set listchars+=tab:>-,space:.,trail:<')
execute('set list')
execute('/^start:/')
execute('normal! jzt')
feed('GG<cr>')
feed('GG<cr>')
feed('GG<cr>')
feed('GG<cr>')
feed('GGH')
-- Repeat without displaying "trail" spaces.
execute('set listchars-=trail:<')
feed('GG<cr>')
feed('GG<cr>')
feed('GG<cr>')
feed('GG<cr>')
feed('GG')
-- Delete the buffer contents and :put the collected lines.
execute('%d')
execute('put =g:lines', '1d')
-- Assert buffer contents.
expect([[
>-------aa>-----$
..bb>---<<$
...cccc><$
dd........ee<<>-$
<$
>-------aa>-----$
..bb>---..$
...cccc>.$
dd........ee..>-$
.$]])
end)
it('works with :list', function()
insert([[
start:
fff
gg
h
iii ]])
-- Set up 'listchars', switch 'list' *off* (:list must show the 'listchars'
-- even when 'list' is off), then run :list and collect the output.
execute('set listchars+=tab:>-,space:.,trail:<')
execute('set nolist')
execute('/^start:/')
execute('redir! => g:lines')
execute('+1,$list')
execute('redir END')
-- Delete the buffer contents and :put the collected lines.
execute('%d')
execute('put =g:lines', '1d')
-- Assert buffer contents.
expect([[
..fff>--<<$
>-------gg>-----$
.....h>-$
iii<<<<><<$]])
end)
end)