On 12-Jun-2014 12:51 +0200, Bram Moolenaar wrote:

> Christian wrote:
> 
>> On Di, 10 Jun 2014, Ingo Karkat wrote:
>>
>>> Hello Vim developers,
>>>
>>> a question on Super User
>>> (http://superuser.com/questions/766817/hide-non-printable-characters-in-vim/)
>>> asks to show all non-printable (control) characters with a single
>>> display cell. One (hacky, and arguably not perfect) way to do this is by
>>> including all ASCII characters in 'isprint':
>>>
>>>     :set isprint=0-255
>>>
>>> However, this yields "E474: Invalid argument". It only works by
>>> excluding ^@ = 0 (via :set isprint=1-255). Also, other variants such as
>>> :set isprint^=0 and :set isprint=0,1-255 and :set
>>> isprint=<C-v><C-@>,1-255 do not work (verified up to current version
>>> 7.4.316).
>>>
>>> The same applies to the similar 'isfname' setting, even though its
>>> documentation (and 'isprint' refers to that, too) explicitly mentions
>>> the number 0:
>>>
>>> ,----[ :help 'isfname' excerpt ]----
>>> | The format of this option is a list of parts, separated with commas.
>>> | Each part can be a single character number or a range.  A range is two
>>> | character numbers with '-' in between.  A character number can be a
>>> | decimal number between 0 and 255 or the ASCII character itself (does
>>> | not work for digits).
>>> `----
>>>
>>> I see this as a bug in the :set command, or, if technical reasons
>>> prevent the use of ^@ in those option values, a bug in the
>>> documentation. (Preferably, to address the issue in the mentioned
>>> question, the first. :-)
>>
>> I don't know if it is a bug or it was done intentionally and I even 
>> don't know what :set isprint=0-255 is supposed to be doing. But here is 
>> a patch:
>>
>> diff --git a/src/charset.c b/src/charset.c
>> --- a/src/charset.c
>> +++ b/src/charset.c
>> @@ -197,7 +197,7 @@ buf_init_chartab(buf, global)
>>  #endif
>>                     c2 = *p++;
>>             }
>> -           if (c <= 0 || c >= 256 || (c2 < c && c2 != -1) || c2 >= 256
>> +           if (c < 0 || c >= 256 || (c2 < c && c2 != -1) || c2 >= 256
>>                                                  || !(*p == NUL || *p == 
>> ','))
>>                 return FAIL;
> 
> Well, this allows having a zero in the option value, but I very much
> doubt it actually works.  In C the zero is used to terminate a string,
> thus sending a zero to the terminal just won't work.

Well, at least I can do this in a terminal:

    $ printf "foo\0bar\n"
    foobar

Seems like Bash handles this somehow, and the NUL is skipped / prints as
nothing.

> If you want to *display* control characters you need to do something
> else anyway, since sending a BS or other control character won't result
> in displaying anything.

The OP's use case is representing every character by a single display
cell. Obviously, BS will mess up things. But probably, a (binary) file
won't contain many of those (in the area of interest), but possibly a
lot of NULs. Skipping those in the output might be okay for his use.

-- regards, ingo

-- 
-- 
You received this message from the "vim_dev" maillist.
Do not top-post! Type your reply below the text you are replying to.
For more information, visit http://www.vim.org/maillist.php

--- 
You received this message because you are subscribed to the Google Groups 
"vim_dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Raspunde prin e-mail lui