Reputation: 14895
I would like vim to color "long" lines for me. Using 80 columns as an example, I would like to highlight lines that exceed that length. Here is roughly what I think the .vimrc file should contain, although it (1) doesn't work, and (2) uses Perl's regex syntax to illustrate my point, because I don't know Vim's well enough:
...
highlight Excess ctermbg=0
au Syntax * syn match Excess /.{80,}$/
...
This (in my mind at least) should mark lines that exceed 80 columns. What I would ideally like is the ability to color only the part of the line that exceeds 80 columns, so if a line is 85 columns, then the 81st through the 85th columns would be highlighted.
I'm sure Vim can do this, just not with me at the helm.
Upvotes: 20
Views: 12480
Reputation: 16034
I love the other answers, but also wanted to be able to toggle them on and off. I don't really know what I'm doing, but after much wrestling with it this morning, I have something that seems to work:
highlight OverLength ctermbg=darkgrey ctermfg=white guibg=#292929
fun! LongLineHighlightInit()
if !exists("w:llh")
call LongLineHighlightOn()
endif
endfunction
fun! LongLineHighlightOn()
let w:llh = matchadd("OverLength", '\%80v.')
endfunction
fun! LongLineHighlightOff()
call matchdelete(w:llh)
let w:llh = 0
endfunction
fun! LongLineHighlightToggle()
if !exists("w:llh") || w:llh == 0
call LongLineHighlightOn()
else
call LongLineHighlightOff()
endif
endfunction
augroup LongLineHighlight
autocmd BufWinEnter * call LongLineHighlightInit()
augroup end
nnoremap <silent> <Leader>8 :call LongLineHighlightToggle()<CR>
Using matchadd and matchdelete (instead of plain 'match') means the highlights don't interfere with anything else that uses match highlighting.
But it also requires that we store the returned match group IDs at a scope which matches the highlighting mechanism, which turns out to be window scope (i.e. two windows on the same buffer can independently use match/matchadd/matchdelete to set different highlights). Hence the "w:" scope variable.
When a new window is created (detected by BufWinEnter event, then checking to see the 'w:llh' variable is undefined), we turn the highlight on by default.
Upvotes: 1
Reputation: 117018
This uses an autocommand to adjust the OverLength value to match your file type.
" highlight lines longer than `textwidth` size for each filetype
autocmd FileType *
\ if &textwidth |
\ exec 'match OverLength /\%' . string(&textwidth+2) . 'v.*/' |
\ endif
Upvotes: 1
Reputation: 17261
Since I do not like the Vim 7.3 column marker, I just use the highlight text after column 80... at least that is what I want 95% of the time.
For the other 5% of the time, I wrote this small extension to also have a quick way to disable the highlight:
https://gist.github.com/fgarcia/9704429#file-long_lines-vim
Upvotes: 3
Reputation: 382870
I needed the autocomand to work for me:
augroup vimrc_autocmds
autocmd BufEnter * highlight OverLength ctermbg=darkgrey guibg=#111111
autocmd BufEnter * match OverLength /\%75v.*/
augroup END
Also like the idea of using 75 if you are aiming at 80 columns in average.
Taken from:
http://blog.ezyang.com/2010/03/vim-textwidth/
Possible reason why it fails without BufEnter
: highlight + match can only be used once. Multiple usage means that old ones are overridden. How to add multiple highlights
Upvotes: 32
Reputation: 2615
I have this in my vimrc.
I found it here: Vim 80 column layout concerns
highlight OverLength ctermbg=darkred ctermfg=white guibg=#FFD9D9
match OverLength /\%81v.*/
You might want to adjust the colors to your preferences.
Upvotes: 17
Reputation: 14462
I use the following method:
hi gitError ctermbg=Red
match gitError /^.*\s$/
2match gitError /^.\{120\}.*$/
(These match some git pre-commit hooks)
The second line should be of interrest to you.
Upvotes: 1