vim-patch:7.4.710

Problem:    It is not possible to make spaces visibible in list mode.
Solution:   Add the "space" item to 'listchars'. (David Bürgin, issue 350)

https://github.com/vim/vim/releases/tag/v7-4-710

Closes #2485.
This commit is contained in:
David Bürgin
2015-04-23 06:58:20 +02:00
committed by Justin M. Keyes
parent ed464908e4
commit 7f07646294
5 changed files with 116 additions and 15 deletions

View File

@@ -4450,9 +4450,13 @@ A jump table for the options with a short description can be found at |Q_op|.
fill the space that the tab normally occupies.
"tab:>-" will show a tab that takes four spaces as
">---". When omitted, a tab is show as ^I.
*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,
trailing spaces are blank.
trailing spaces are blank. Overrides the "space"
setting for trailing spaces.
*lcs-extends*
extends:c Character to show in the last column, when 'wrap' is
off and the line continues beyond the right of the
@@ -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=extends:>,precedes:<
< 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|
*'lpl'* *'nolpl'* *'loadplugins'* *'noloadplugins'*

View File

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

View File

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

View File

@@ -69,7 +69,7 @@ static char *features[] = {
static int included_patches[] = {
//712,
//711,
//710,
710,
//709,
//708,
//707,

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)