Vim, split windows breaks length highlight - linux

I set this up in my .vimrc to highlight a line over 80 characters.
highlight OverLength ctermbg=darkred ctermfg=darkred guibg=darkred
match OverLength /\%>80v.\+/
Now then, if I open (one buffer) a file with lines that are too long, they'll highlight. Fine, but if I open a different file and then use NERDTree to open a vsplit of the original file, the long line will no longer highlight. What am I doing wrong?
Edit: I'm using gvim on GNU/Linux.
Edit: After you open the original file in a split long lines will not highlight FOR ANY FILE until you restart vim and open the file in a single buffer.

The :match command only applies to the current window. So any :split won't inherit the highlighting. This is documented under :help :match:
Define a pattern to highlight in the current window.
You can automatically install the matching for any window via :autocmd:
autocmd VimEnter,WinEnter * match OverLength /\%>80v.\+/
But I'd recommend to switch to the 'colorcolumn' setting, which is available in Vim 7.3+; this only highlights a single column (and also in shorter lines), but you can simply :set colorcolumn=81 in your ~/.vimrc and it applies to all windows, and you get to keep the :match highlighting for other uses.

Related

Highlight ^M(CR) in vim

I'm looking for a way to highlight ^M(CR) in vim.
Make sure fileformat is set=unix or mac mine is:
set fileformats=unix,mac
If it is DOS you will not see it
I have a mapping in my .vimrc that will remove them, but this response here explains it best.
https://stackoverflow.com/a/3852892/2869058
You can view all terminal line endings and characters by enabling
:set list
one way you can highlight them is like this in your .vimrc:
syntax on
set list listchars=trail:_
set listchars=tab:·\ ,trail:·,extends:»,precedes:«
:highlight SpecialKey ctermfg=darkgrey ctermbg=yellow

Run a command each time a file opens, or general syntax

I have a syntax rule that highlights trailing whitespace:
highlight Badspace ctermfg=red ctermbg=red
match Badspace /\s\+$/
This is in my .vimrc. It works fine, but the problem is I use splits a lot, and it seems that the match is only run on the first file you open, as well it should because the .vimrc should only run once.
Anyway, how can I get the above syntax to match any file that is opened? Is there a "general" syntax file? Is there any other way to run match each time a file opens rather than just once? I'd like to know both because I could end up using either one in the future.
The :match command applies the highlighting to a window, so you can use the WinEnter event to define an :autocmd.
:autocmd WinEnter * match Badspace /\s\+$/
Note that there are already a number of plugins for this purpose, most based on this VimTip: http://vim.wikia.com/wiki/Highlight_unwanted_spaces
They handle all that for you, and turn off the highlighting in insert mode; some can also automatically delete the whitespace. In fact, I have written a set of plugins for that, too: ShowTrailingWhitespace plugin.
You could accomplish this by using an autocmd:
highlight Badspace ctermfg=red ctermbg=red
autocmd BufEnter * match Badspace /\s\+$/
However, there's another way to accomplish your specific goal of marking trailing whitespace. Vim has a built-in feature for highlighting "special" whitespace, which includes tabs (to differentiate from spaces), trailing whitespace, and non-breaking spaces (character 160, which looks like a normal space but isn't).
See :help list and :help listchars. Here's what I use:
set list listchars=tab:>·,trail:·,nbsp:·,extends:>
listchars has the benefit of working with any file type, and marking up multiple whitespace types that are of interest. It is also a lot faster (match will be noticeably slow on giant files) and built-in already.
(Note that those are funky non-ASCII dot characters, which should work fine for you if you cut-and-paste into a UTF8-capable Vim. If they don't work for you, you can use any characters you like there, such as periods or underscores).
Here's what it looks like for me:
The correct approach to this problem is actually to use :syntax to define a custom syn-match.
Try putting this in your vimrc:
augroup BadWhitespace
au!
au Syntax * syn match customBadWhitespace /\s\+$/ containedin=ALL | hi link customBadWhitespace Error
augroup END
Edit: It should also be noted that there is built-in support for highlighting trailing whitespace with the 'list' option; see :help 'listchars' and :h hl-SpecialKey (SpecialKey is the highlight group used to highlight trailing whitespace characters when 'list' is on).
This is accomplished using autocmd. The events you're looking for are BufWinEnter and VimEnter. From the Vim manual:
BufWinEnter
After a buffer is displayed in a window. This
can be when the buffer is loaded (after
processing the modelines) or when a hidden
buffer is displayed in a window (and is no
longer hidden).
Does not happen for |:split| without
arguments, since you keep editing the same
buffer, or ":split" with a file that's already
open in a window, because it re-uses an
existing buffer. But it does happen for a
":split" with the name of the current buffer,
since it reloads that buffer.
VimEnter
After doing all the startup stuff, including
loading .vimrc files, executing the "-c cmd"
arguments, creating all windows and loading
the buffers in them.
Try putting this in your vimrc:
augroup BadWhitespace
au!
au VimEnter,BufWinEnter * match Badspace /\s\+$/
augroup END
Do :help autocmd for more info.
This is completely wrong because :match is window-local, not buffer-local. Ingo Karkat has the right idea. Unfortunately, there is no good way to avoid triggering the autocmd every time you enter the window.
More to the point, though, this is a job for a custom syntax, not match.

vim: Highlight quickfix selected line with color different than 'Search'

What is the highlight group for the currently selected line in the quickfix window?
The selected line in the quickfix window uses Search for highlighting. I'd like to continue using yellow for Search highlighting, but use blue for quickfix selected line.
Ingo Karkat's answer is right. It's indeed hard-coded in vim code.
I have created a patch - QuickFixCurrentLine.patch for vim8.
Patch is long enough to be posted here. Plus, it has mix of tabs and spaces. So, providing a link-only-answer.
EDIT:
The patch has got upstreamed in the latest vim code.
The name of the highlight has been changed to quickfixline instead of quickfixcurrentline.
The currently selected quickfix item is hard-coded to Search. You'd have to change the Vim source code and recompile to change this.
I see only limited ways to work around this with Vimscript. You could try to override the highlighting for the current line via :match / matchadd() (it has higher priority), but it would only cover the length of the text, not the entire line the original highlighting. Also, I think the currently selected item cannot be easily queried from Vim, so you'd have to hook into the quickfix-local <CR> mapping to update it, and stop using :cnext etc. to move to different errors.
:highlight BlueLine guibg=Blue
:autocmd BufReadPost quickfix match BlueLine /\%1l/
:autocmd BufReadPost quickfix nnoremap <buffer> <CR> :execute 'match BlueLine /\%' . line('.') . 'l/'<CR><CR>

VIM Highlight the whole current line

What is the best way to highlight the whole current line in VIM? In some IDEs I am able to set some sort of 20% opacity of the line I am editing, this is great to find where I am rather quickly.
To highlight the current line use
:set cursorline
To highlight the current column use
:set cursorcolumn
The visual appearance of this can be modified. Have a look around :help hl-CursorLine or hl-CursorColumn.
See the Vim wiki on this subject for the complete story.
I especially found the following bit handy (when working with more than one window).
autocmd WinEnter * setlocal cursorline
autocmd WinLeave * setlocal nocursorline
Only highlight the current line in the active window.
Shift + V puts you in visual mode, highlighting the entire line.

mvim highlighting long text works sporadically

I am using mvim. I have following lines in my vimrc .
"highlight text that goes over 80 columns
highlight OverLength ctermbg=red ctermfg=white guibg=#592929
match OverLength /\%81v.*/
Sometimes in my project I see the extra characters highlighted and sometimes I don't . I mean once vim is displaying extra characters then it will continue to display extra characters. However if I get out of vim and start vim instance it might not highlight extra characters. To fix that I type
match OverLength /\%81v.*/
I am puzzled by why it is happening. Is it possible that some plugin is messing with these settings?
It's possible that a plugin is undoing it by setting its own match. It's also possible that you're creating a new window. match is per-window (not per-buffer, and not global) so it only applies to the window that was active when the match command was executed.
You can try creating an autocmd to set up the match on new windows:
au! WinEnter match OverLength /\%81v.*/
Note that this is not executed on the first window.
Well I had the same problem when using new Tabs in MacVim 7.3 (Snapshot 56). When opening a new window the highlighting worked, but when I opened a new Tab it did not work anymore. So I added the following autocommand to my .vimrc file:
autocmd BufWinEnter,BufRead * match OverLength /\%81v.\+/
Now it works for me, in any new window or tab and buffer.
I hope this will help!

Resources