我正在尝试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/

10-14 13:13
查看更多