【问题标题】:How do you use buffer-local autocommands in VimScript?如何在 VimScript 中使用缓冲区本地自动命令?
【发布时间】:2015-08-04 22:34:38
【问题描述】:

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

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

例如,here's 我第一次尝试 buffer-local autocmds 的 augroup

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

我不明白为什么&lt;abuf&gt;0,而bufnr('%')1,或者如何让自动命令执行缓冲区1。 (当然0无效!)


目前,I've swapped out &lt;buffer=abuf&gt;*;但是当加载了多个缓冲区时,这会破坏此函数的功能,这很糟糕。因此,欢迎任何帮助解决这个问题。 /=

【问题讨论】:

  • 你有什么理由需要&lt;buffer=abuf&gt;吗?从 sn-ps 你应该只需要 &lt;buffer&gt; 。另外你是如何加载论文的?它是在你的 vimrc 期间加载的吗?
  • 抱歉没有查看所有链接。最后两个的答案是在 VimEnter 期间加载的。
  • 你让它变得比现在复杂得多。看看trailertrash 了解更简单的方法。

标签: vim vim-syntax-highlighting autocmd


【解决方案1】:

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


以下是您尝试的修改版本,不使用&lt;buffer=abuf&gt;

  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! * &lt;buffer&gt; 替换。 au! 不应该存在,因为这将从所有缓冲区中删除 ExtraWhitespace 组中的所有 autocmd。这意味着您只能在一个缓冲区中定义它。 (autocmd! * &lt;buffer&gt; 只删除当前缓冲区中的自动命令)

您应该注意的第二件事是使用了&lt;buffer&gt;。这意味着当调用该函数时,将只为当前缓冲区创建 autocmd。必须为要定义的每个缓冲区调用缓冲区本地 autocmd。


其他杂项cmets

你有

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

【讨论】:

  • 如何“使用 (仅在执行自动命令时)”冲突?当您在 vimrc 中执行 au event &lt;buffer=abuf&gt; 时,您执行自动命令。你正在执行你的 vimrc。当然,这是行不通的。您需要使用au event pattern :au event &lt;buffer=abuf&gt;
  • @ZyX 那么:help &lt;buffer=abuf&gt;的帮助需要改一下。那里的示例用法是:au CursorHold &lt;buffer=abuf&gt; echo 'hold',但也有E680。我还尝试了您使用:au BufEnter * :au BufEnter &lt;buffer=abuf&gt; 建议的行并得到相同的E680。 (我尝试发帖到 vim_use 但我认为我的帖子被垃圾邮件过滤器吃掉了)
  • 看起来你编译的 Vim 没有这个特性。具体来说,与abuf 一起确实 工作的vim 在au CursorHold &lt;buffer=tty&gt; :echo 'hold' 上发出相同的错误消息。注意:echo +"tty" 发射为零,这是您和我观察到的最可能的原因。 (在 autocmd 之外使用此功能时,我也有相同的 E680,但内部一切都很好。)
  • 虽然 hg annotate 表明这个功能是在 vim-7.0024 中添加的(或者,至少当时有文档记录)。
  • @ZyX 我敢打赌ftp.vim.org/vim/patches/7.4/7.4.637 是我们看到差异的原因。我正在运行补丁 7.4.622。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
相关资源
最近更新 更多