我想使用 VIM 突出显示额外的空格和固定长度的列(例如,一行 80 个字符)
.vimrc
我在我的文件中创建了两个 vimrc 规则
highlight ExtraWhitespacea ctermbg=darkred guibg=#382424
match ExtraWhitespacea /\s\+$/
highlight OverLength ctermbg=green ctermfg=white guibg=#592929
match OverLength /\%81v.\+/
现在,问题是 - 如果单独应用,这些规则完全按照我想要的方式运行,但不能一起工作。
我在这里错过了什么吗?我该如何调试这个?
答案1
问题是每个:match
命令都会覆盖前一个命令的模式;它们不是累积的!正因为如此,存在:2match
各种:3match
变体。使用其中之一:
highlight ExtraWhitespace ctermbg=darkred guibg=#382424
match ExtraWhitespace /\s\+$/
highlight OverLength ctermbg=red guibg=#525252
2match OverLength /\%81v.\+/
可以使用matchadd()
Vimscript 函数创建其他变体。
笔记
- 自 Vim 7.3 起,有一个内置
'colorcolumn'
选项可以突出显示列。 - 您的设置
~/.vimrc
仅适用于第一个窗口;即 a:split
将创建一个没有这些突出显示的窗口。您可以通过 autocmds(或使用该'colorcolumn'
选项)修复该问题。 - 有更强大和更复杂的解决方案来突出显示尾随空白,例如我的ShowTrailingWhitespace 插件。 (插件页面有替代插件的链接。)
答案2
可能是您的颜色方案覆盖了您的配置。您可以在末尾添加这些行.vimrc
以防止覆盖,或者只需将这些行添加到您的.vimrc
:
" Highlight trailing white spaces
highlight ExtraWhitespace ctermbg=darkred guibg=#382424
match ExtraWhitespace /\s\+$/
autocmd BufWinEnter * match ExtraWhitespace /\s\+$/
autocmd InsertEnter * match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave * match ExtraWhitespace /\s\+$/
autocmd BufWinLeave * call clearmatches()
" Highlight long lines
highlight OverLength ctermbg=green ctermfg=white guibg=#592929
match OverLength /\%81v.\+/
autocmd BufWinEnter * match OverLength /\%81v.\+/
autocmd InsertEnter * match OverLength /\%81v.\+/
autocmd InsertLeave * match OverLength /\%81v.\+/
autocmd BufWinLeave * call clearmatches()