如何在VimScript中使用缓冲区本地自动命令?

ELL*_*BLE 3 vim autocmd vim-syntax-highlighting

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

我希望'我们目前正在追踪空白吗?' 是缓冲特定的状态; 但我在弄清楚自动命令如何与缓冲区交互时遇到了很多麻烦.

例如,这是augroup缓冲区本地 autocmd s的第一次尝试:

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
Run Code Online (Sandbox Code Playgroud)

...不幸的是,这在调用时会立即绊倒:

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
Run Code Online (Sandbox Code Playgroud)

我不明白,为什么<abuf>0,当bufnr('%')1,或如何让自动命令缓冲区执行1代替.(当然0无效!)


就目前而言,我已经换出 <buffer=abuf>*; 但是当加载了多个缓冲区时,这会搞砸这个功能的功能.因此,欢迎任何帮助解决这个问题./=

FDi*_*off 5

首先,我不知道如何<buffer=abuf>运作.它的文档似乎是相互矛盾的.在使用正确使用它导致问题之前,<buffer=abuf>使用补丁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
Run Code Online (Sandbox Code Playgroud)

您应该注意的第一件事是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()
Run Code Online (Sandbox Code Playgroud)

突出显示是全局的,因此在一个缓冲区中清除它将在任何地方删除突出显示组.因此,只要将高亮显示放在适当的位置并在每次颜色方案发生变化时重新定义它都会更好.

autocmd ColorScheme * highlight ExtraWhitespace ctermbg=red guibg=red
Run Code Online (Sandbox Code Playgroud)

建议在脚本中使用长形式的命令名称.(仅用于打字的简短形式).长形式更易读,易于识别,所以au会出现autocmd.