我正在尝试write a snippet of VimL,以允许用户使用热键切换不需要的尾随空白的高亮显示。 (这是我有史以来第一个Vim脚本,除了将粘贴内容复制到.vimrc
中之外,…有点烦人了:P)
我希望“我们当前是否正在尾随空白?”是特定于缓冲区的状态;但是我在弄清楚自动命令如何与缓冲区交互方面遇到很多麻烦。
例如,here's是我在缓冲区本地augroup
s的autocmd
上的第一个刺:
augroup ExtraWhitespace
au!
au BufEnter <buffer=abuf> match ExtraWhitespace /\s\+$/
au InsertEnter <buffer=abuf> match ExtraWhitespace /\s\+\%#\@<!$/
au InsertLeave <buffer=abuf> match ExtraWhiteSpace /\s\+$/
augroup END
……不幸的是,这在调用时立即跳闸:
Error detected while processing function ToggleExtraWhitespace:
line 19:
E680: <buffer=0>: invalid buffer number
line 20:
E680: <buffer=0>: invalid buffer number
line 21:
E680: <buffer=0>: invalid buffer number
No matching autocommands
我不明白为什么
<abuf>
是0
,为什么 bufnr('%')
是1
,或者不知道如何获取自动命令来执行缓冲区1
。 (0
当然是无效的!)目前,I've swapped out
<buffer=abuf>
表示*
;但这会在加载多个缓冲区且那很糟糕时使该功能的功能变糟。因此,欢迎您提供任何帮助。 /=
最佳答案
首先,我不知道<buffer=abuf>
是如何工作的。它的文档似乎有冲突。看来<buffer=abuf>
的行为已被patch 7.4.637更改/修复,即使使用不当也会引起问题。 <buffer=abuf>
必须仅在运行autocmd时使用。因此,如果您在VimEnter或BufAdd中调用函数,则该函数可能会起作用。
以下是您尝试的不使用<buffer=abuf>
的修改版本
augroup ExtraWhitespace
autocmd! * <buffer>
autocmd BufEnter <buffer> match ExtraWhitespace /\s\+$/
autocmd InsertEnter <buffer> match ExtraWhitespace /\s\+\%#\@<!$/
autocmd InsertLeave <buffer> match ExtraWhitespace /\s\+$/
augroup END
您应该注意的第一件事是
au!
已替换为autocmd! * <buffer>
。 au!
不应存在,因为这将从所有缓冲区中删除ExtraWhitespace组中的所有autocmd。这意味着您只能在一个缓冲区中定义它。 (autocmd! * <buffer>
仅删除当前缓冲区中的autocmds)您应该注意的第二件事是使用了
<buffer>
。这意味着在调用函数时,只会为当前缓冲区创建autocmd。必须为每个要定义的缓冲区调用缓冲区本地autocmd。其他杂项评论
你有
fun! HighlightExtraWhitespace()
if exists('b:ews') && b:ews == 1
"echom "-- Adding ExtraWhitespace hilighting"
highlight ExtraWhitespace ctermbg=red guibg=red
else
"echom "-- Removing ExtraWhitespace hilighting"
highlight clear ExtraWhitespace
endif
endfun
au ColorScheme * call HighlightExtraWhitespace()
高亮显示是全局的,因此在一个缓冲区中对其进行清除将在所有位置删除高亮显示组。因此,最好将突出显示保留在原处,并在每次颜色方案更改时重新定义它。
autocmd ColorScheme * highlight ExtraWhitespace ctermbg=red guibg=red
建议在脚本中使用命令名的长格式。 (仅用于键入的短格式)。长格式更易读且易于识别,因此
au
将成为autocmd
。关于vim - 如何在VimScript中使用局部缓冲区自动命令?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31820529/