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

时间:2015-08-04 22:34:38

标签: vim vim-syntax-highlighting autocmd

我正在尝试write a snippet of VimL允许用户使用热键切换不需要的尾随空格的hilighting。 (这是我有史以来的第一个Vim脚本,除了将事物复制粘贴到我的.vimrc之外,所以......一点点盐:P)

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

例如,here's我第一次尝试缓冲区本地<{em> augroup的{​​{1}}:

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

我不明白为什么<abuf>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 bufnr('%')0,或者如何让缓冲区1执行自动命令。 (当然1无效!)

目前0 <buffer=abuf>代表*;但是当加载了多个缓冲区时,这会搞砸这个功能的功能。因此,欢迎任何帮助解决这个问题。的 /=

1 个答案:

答案 0 :(得分:5)

首先,我不知道<buffer=abuf>是如何运作的。它的文档似乎是冲突的。 <buffer=abuf>的行为似乎已被patch 7.4.637更改/修复,即使正确使用它也会导致问题。只有在autocmd运行时才能使用<buffer=abuf>。因此,如果您在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