我有一个突出显示尾随空格的语法规则:
highlight Badspace ctermfg=red ctermbg=red
match Badspace /\s\+$/
这是我的.vimrc
。它工作正常,但问题是我使用拆分很多,似乎match
只在你打开的第一个文件上运行,因为{{1}应该只运行一次。
无论如何,我怎样才能获得上述语法来匹配任何打开的文件?是否有“通用”语法文件?每次文件打开时,还有其他方法可以运行.vimrc
而不是一次吗?我想知道两者,因为我最终可能会使用其中任何一个。
答案 0 :(得分:3)
:match
命令将突出显示应用于窗口,因此您可以使用WinEnter
事件来定义:autocmd
。
:autocmd WinEnter * match Badspace /\s\+$/
请注意,为此目的已经有许多插件,大多数都基于此VimTip:http://vim.wikia.com/wiki/Highlight_unwanted_spaces
他们为您处理所有这些,并在插入模式下关闭突出显示;有些人还可以自动删除空格。事实上,我也为此编写了一组插件:ShowTrailingWhitespace plugin。
答案 1 :(得分:2)
您可以使用autocmd
:
highlight Badspace ctermfg=red ctermbg=red
autocmd BufEnter * match Badspace /\s\+$/
但是,还有另一种方法可以实现标记尾随空格的特定目标。 Vim有一个内置功能,用于突出显示“特殊”空白,包括制表符(区别于空格),尾随空格和不间断空格(字符160,看起来像普通空格但不是)。
请参阅:help list
和:help listchars
。这是我使用的:
set list listchars=tab:>·,trail:·,nbsp:·,extends:>
listchars
具有使用任何文件类型并标记多个感兴趣的空白类型的好处。它也快得多(巨型文件上的匹配速度会明显变慢)并已内置。
(请注意,那些是时髦的非ASCII点字符,如果你剪切并粘贴到支持UTF8的Vim中,它应该可以正常工作。如果它们不适合你,你可以使用任何字符你像那里,如句号或下划线)。
这就是我的样子:
答案 2 :(得分:1)
解决此问题的正确方法实际上是使用:syntax
来定义自定义syn-match
。
尝试将其放入vimrc:
augroup BadWhitespace
au!
au Syntax * syn match customBadWhitespace /\s\+$/ containedin=ALL | hi link customBadWhitespace Error
augroup END
编辑:还应注意,内置支持使用'list'
选项突出显示尾随空格;请参阅:help 'listchars'
和:h hl-SpecialKey
(SpecialKey
是用于在'list'
启用时突出显示尾随空白字符的突出显示组。
答案 3 :(得分:0)
这是使用 autocmd
完成的。您要查找的活动是BufWinEnter
和VimEnter
。从Vim手册:
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.
After doing all the startup stuff, including
loading .vimrc files, executing the "-c cmd"
arguments, creating all windows and loading
the buffers in them.
尝试将其放入vimrc:
augroup BadWhitespace
au!
au VimEnter,BufWinEnter * match Badspace /\s\+$/
augroup END
请 :help autocmd
获取更多信息。
这是完全错误的,因为:match
是窗口本地的,而非缓冲本地的。 Ingo Karkat有正确的想法。不幸的是,没有好办法避免每次进入窗口时触发autocmd。
更重要的是,这是自定义syntax
的作业,而不是match
。