10
votes

I have Vim documents that have codeblock regions that use 'syntax include' regions to have different syntax highlighting from the main document. For example, I have a syntax region named 'pyregion' defined that I use when I input Python code. The pyregion areas of the document are then highlighted using setup in Python's syntax file, while the area outside the region uses the syntax file of the main document.

I want to have the entire background in the Python region be shaded a different color to distinguish it from the non-Python areas of the document. I can get part of the way there by entering a background for the entire python region:

:highlight pyregion guibg=#555555

But the command above changes the background only for areas that have text characters on them, not for entire background of the region, which seems still to be governed like rest of document by the background color defined for the 'Normal' group. This is okay -- it does draw attention to the region, but it has a blotchy look because only the code characters themselves have different background, not the entire band of the region across the screen.

Is there some way to get a uniform band of a different background color across the whole region, not just portion of region where there are characters?

There's related question and answer in following link, but so far as I can tell that answer also changes background only where there is text: Highlight Code Block Backgrounds with Vim

Thanks for any help.

2

2 Answers

7
votes

I don't believe that this is possible without a ridiculous bodge (see below). If you try this:

:match Error /\%3l/

It highlights what Vim considers to be the whole of line 3. The highlighting only extends to the the end of the characters. This makes me suspect that there will be no way to highlight non-existent characters.


Stop reading now.

Purely as an exercise in the ridiculous, you could of course append a massive number of spaces to the end of every line and then remove them when you save. This would be daft, but it's the only thing I can think of.

" Add spaces to the end of every line (you could also do
" this selectively for lines that don't already have lots
" of spaces and you could do it on reading a file or whatever)
:exe '%s/$/' . repeat(' ', 1000) . '/'
" Automatically remove spaces at the end of every line when saving
:autocmd BufWritePre %s/ *$//
" Make 'A' append at the end of the non-space characters on the line
:nmap A / *$<CR>i
" Make '$' go to the end of the non-space characters on the line
:nmap $ /.\? *$<CR>

Disclaimer: don't do this.

3
votes

Yes, you can do this using the sign command.

http://vimdoc.sourceforge.net/htmldoc/sign.html

sign define 1 linehl=Error
sign place 1 name=er1 line=1 file=file.txt

Will highlight the first line of file.txt all the way to the edge of the terminal.