5

我正在尝试编写一段 VimL以允许用户使用热键切换不需要的尾随空格的高亮显示。(这是我的第一个 Vim 脚本,除了将内容复制粘贴到我的.vimrc, 所以......盐粒:P)

我希望'我们目前是否正在突出尾随空格?成为特定于缓冲区的状态;但是我在弄清楚自动命令如何与缓冲区交互时遇到了很多麻烦。

例如,这是augroup我对缓冲区本地 的第一次尝试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是无效的!)


目前,我已经换成 <buffer=abuf>*; 但是当加载了多个缓冲区时,这会破坏此函数的功能,这很糟糕。因此,欢迎任何帮助解决这个问题。/=

4

1 回答 1

7

首先,我不知道如何<buffer=abuf>工作。它的文档似乎有冲突。它的行为似乎已通过补丁 7.4.637<buffer=abuf>更改/修复,即使使用正确也会导致问题。只能在运行 autocmd 时使用。因此,如果您在 VimEnter 或 BufAdd 中调用它,您的函数可能会起作用。<buffer=abuf>


以下是您尝试的未使用的修改版本<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>仅删除当前缓冲区中的自动命令)

您应该注意的第二件事<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

于 2015-08-05T02:01:28.263 回答