每次打开文件或一般语法时运行命令

时间:2013-04-11 00:02:58

标签: vim

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

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

这是我的.vimrc。它工作正常,但问题是我使用拆分很多,似乎match只在你打开的第一个文件上运行,因为{{1}应该只运行一次。

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

4 个答案:

答案 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中,它应该可以正常工作。如果它们不适合你,你可以使用任何字符你像那里,如句号或下划线)。

这就是我的样子:

enter image description here

答案 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-SpecialKeySpecialKey是用于在'list'启用时突出显示尾随空白字符的突出显示组。

答案 3 :(得分: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.

在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.

尝试将其放入vimrc:

augroup BadWhitespace
    au!
    au VimEnter,BufWinEnter * match Badspace /\s\+$/
augroup END

:help autocmd获取更多信息。

这是完全错误的,因为:match是窗口本地的,而非缓冲本地的。 Ingo Karkat有正确的想法。不幸的是,没有好办法避免每次进入窗口时触发autocmd。

更重要的是,这是自定义syntax的作业,而不是match