[patch] fixed misalignments when using tabs with concealed char prior to the tab

79 views
Skip to first unread message

Dominique Pellé

unread,
Mar 17, 2012, 7:52:49 PM3/17/12
to vim_dev
Hi

The conceal feature is messing up alignment when using tabs.

For example, content of ":help :index" looks misaligned and ugly
with ":set conceallevel=3" but looks well aligned with ":set conceallevel=0"
as shows in these 2 screenshots:

http://dominique.pelle.free.fr/pic/help_conceallevel=0.png (good)
http://dominique.pelle.free.fr/pic/help_conceallevel=3.png (bad)

You can reproduce the misaligned help page with:

$ vim -u NONE -c 'set nocp conceallevel=3|syntax on|help :index'

Attached patch fixes it. Patch extends length of tabs to compensate
for concealed chars before the tab on the line, so that text after the
tab is always aligned in the same way regardless of 'conceallevel'.
Note that this means that a tab can be longer than 'tabstop' to
compensate previous concealed chars.

Regards
-- Dominique

tab-alignement-with-conceal-7.3.475.patch

Bram Moolenaar

unread,
Mar 18, 2012, 4:53:52 PM3/18/12
to Dominique Pellé, vim_dev

Dominique Pelle wrote:

There have been various problems with conceal mode. I'm afraid that
another change might break this again. Can you please write a test for
this problem? It should fail without the patch.

Aligning might still be wrong when spaces are used instead of tabs, but
that is impossible to make both work with concealing enabled and
disabled.

--
hundred-and-one symptoms of being an internet addict:
213. Your kids start referring to you as "that guy in front of the monitor."

/// Bram Moolenaar -- Br...@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 ///

Dominique Pellé

unread,
Mar 19, 2012, 1:49:45 PM3/19/12
to Bram Moolenaar, vim_dev
Bram Moolenaar wrote:

> Dominique Pelle wrote:
>
>> The conceal feature is messing up alignment when using tabs.
>>
>> For example, content of ":help :index" looks misaligned and ugly
>> with ":set conceallevel=3" but looks well aligned with ":set conceallevel=0"
>> as shows in these 2 screenshots:
>>
>> http://dominique.pelle.free.fr/pic/help_conceallevel=0.png (good)
>> http://dominique.pelle.free.fr/pic/help_conceallevel=3.png (bad)
>>
>> You can reproduce the misaligned help page with:
>>
>> $ vim -u NONE -c 'set nocp conceallevel=3|syntax on|help :index'
>>
>> Attached patch fixes it. Patch extends length of tabs to compensate
>> for concealed chars before the tab on the line, so that text after the
>> tab is always aligned in the same way regardless of 'conceallevel'.
>> Note that this means that a tab can be longer than 'tabstop' to
>> compensate previous concealed chars.
>
> There have been various problems with conceal mode.  I'm afraid that
> another change might break this again.  Can you please write a test for
> this problem?  It should fail without the patch.

A test would be good. Give me so time as I will be busy in the next few
weeks. I'm also not sure yet how it can be tested but I'll try to find out.

Besides fixing alignment, I also found that the patch fixes another
problem in Vim-7.3.475. If you type...

$ vim -u NONE -c 'set nocp hls cole=3 cocu=n|syntax on|he :index|/rint'

... then press n to jump to all matches of the searched string, observe
that cursor jumps to the wrong locations. With the proposed patch, cursor
jumps to correct locations.

Regards
-- Dominique

Dominique Pellé

unread,
Mar 24, 2012, 5:51:20 AM3/24/12
to vim_dev
Dominique Pellé wrote:


I'm afraid that I have not found a way to add an automated test for the
patch. I thought of using virtcol('.') but it gives the same results
before & after patch: virtcol() returns the virtual column as if there
was no concealed characters. This is by design I think: everything
in Vim behaves as if characters were not concealed. It would be good
to indicate it in :help virtcol().

Perhaps someone else has ideas to be able to test the patch. If not,
I hope that the patch can still be accepted without automated test.

I remind that it fixes two problems:

- misalignments in help page (ex: at line 1065 after ":Print...") when doing:


$ vim -u NONE -c 'set nocp conceallevel=3|syntax on|help :index'

- cursor at wrong position after tabs when doing:


$ vim -u NONE -c 'set nocp hls cole=3 cocu=n|syntax on|he :index|/rint'

(then press n to go to next matches)

Regards
-- Dominique

Christian Brabandt

unread,
Mar 24, 2012, 8:33:07 AM3/24/12
to vim_dev
Hi Dominique!

On Sa, 24 M�r 2012, Dominique Pell� wrote:

> - cursor at wrong position after tabs when doing:
> $ vim -u NONE -c 'set nocp hls cole=3 cocu=n|syntax on|he :index|/rint'
> (then press n to go to next matches)

This is probably the same error, I reported some time ago:
http://groups.google.com/group/vim_dev/browse_thread/thread/50b3ad720d3232b3/b36a94dd486b2287?lnk=gst&q=christian+brabandt+conceal#b36a94dd486b2287

regards,
Christian

Dominique Pellé

unread,
Mar 24, 2012, 9:53:37 AM3/24/12
to vim_dev
Christian Brabandt wrote:

> Hi Dominique!


>
> On Sa, 24 Mär 2012, Dominique Pellé wrote:
>
>> - cursor at wrong position after tabs when doing:
>>   $ vim -u NONE -c 'set nocp hls cole=3 cocu=n|syntax on|he :index|/rint'
>>   (then press  n  to go to next matches)
>
> This is probably the same error, I reported some time ago:
> http://groups.google.com/group/vim_dev/browse_thread/thread/50b3ad720d3232b3/b36a94dd486b2287?lnk=gst&q=christian+brabandt+conceal#b36a94dd486b2287
>
> regards,
> Christian


Hi Christian

Thanks for the link. Your patch (Oct 7, 2011) and my patch (Mar 18, 2012)
touch indeed the same lines of code in "screen.c".

However, your patch fixes jumping to the correct char when doing
"norm! fC" in the test case that you described, but it does not fix
the 2 issues that I described in this thread (misalignment with tabs
and search jumping to wrong locations).

The patch that I proposed in the thread fixes all issues so far:
the 2 issues described in this thread and also the issue you found
with "norm! fC".

Regards
-- Dominique

Bram Moolenaar

unread,
Mar 28, 2012, 8:20:57 AM3/28/12
to Dominique Pellé, vim_dev

Dominique Pell� wrote:

Being able to test this is important enough to justify adding a function
to get the screen column. The question is how to get it. Perhaps
screen_cur_col best reflects the actual cursor position. However, it is
internal in screen.c. We don't want it to be set in another file, thus
adding a function in screen.c to get the value would be best.

The name could be screencol(). Might as well add screenrow() then.
The documentation should explain when this differs from virtcol('.').
And it should be mentioned that updating the screen position may be
postponed until a redraw.

--
ARTHUR: This new learning amazes me, Sir Bedevere. Explain again how sheep's
bladders may be employed to prevent earthquakes.
"Monty Python and the Holy Grail" PYTHON (MONTY) PICTURES LTD

Reply all
Reply to author
Forward
0 new messages