3

我有一个突出尾随空格的语法规则:

highlight Badspace ctermfg=red ctermbg=red
match Badspace /\s\+$/

这是在我的.vimrc. 它工作正常,但问题是我经常使用 splits 而且似乎match只在您打开的第一个文件上运行,因为它.vimrc应该只运行一次。

无论如何,我怎样才能获得上述语法来匹配任何打开的文件?是否有“通用”语法文件?match每次打开文件而不是只运行一次时,是否还有其他方法可以运行?我想知道这两个,因为我将来可能会使用其中任何一个。

4

4 回答 4

3

:match命令将突出显示应用于窗口,因此您可以使用WinEnter事件来定义:autocmd.

:autocmd WinEnter * match Badspace /\s\+$/

请注意,已经有许多用于此目的的插件,大多数基于此 VimTip:http: //vim.wikia.com/wiki/Highlight_unwanted_spaces

他们为您处理所有这些,并在插入模式下关闭突出显示;有些还可以自动删除空格。事实上,我也为此编写了一组插件:ShowTrailingWhitespace plugin

于 2013-04-11T06:22:24.130 回答
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 中,它们应该可以正常工作。如果它们不适合您,您可以在那里使用您喜欢的任何字符,例如句点或下划线)。

这对我来说是这样的:

在此处输入图像描述

于 2013-04-11T00:27:11.657 回答
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-SpecialKeySpecialKey是用于突出显示尾随空白字符的突出显示组'list')。

于 2013-04-11T14:44:32.247 回答
0

这是使用autocmd. 您要查找的事件是BufWinEnterVimEnter。来自 Vim 手册:

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.

输入法

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.

于 2013-04-11T14:02:06.723 回答