【问题标题】:Vim: disable autocmd BufRead (modeline)Vim: 禁用 autocmd BufRead (modeline)
【发布时间】:2021-01-29 17:44:39
【问题描述】:

从这个answer我执行了:

:set modeline | doautocmd BufRead

从那以后,我无法禁用 BufRead

我可以打开一个文件并取消设置模式线

:set nomodeline
:e!
:wq

但是当我重新打开同一个文件时,它的 modeline 会再次自动执行。

我试过noautocmd - autocmd-remove

:noautocmd w BufRead
:noautocmd BufRead
:exe "au! BufRead *"
:au! BufRead

请注意,由于 BufRead,我想禁用所有自动执行,而不仅仅是由它设置的单个 事件,如下所述:https://stackoverflow.com/a/40173033/9391770

【问题讨论】:

  • 我认为您对BufRead 有点困惑-该事件仅被创造性地重用于:doautocmd(任何事件都可以),以便在不重新加载缓冲区的情况下重新执行模式行-什么链接的问题是关于。现在您似乎在要求 opposite - 防止加载模式线。
  • 我认为你从:set nomodeline 得到的结果好坏参半,因为它是一个缓冲区本地选项——只有从当前缓冲区打开的缓冲区才会观察到这一点。要坚持这一点,必须将命令放入您的~/.vimrc 文件中,或使用:setglobal nomodeline。要完全关闭模式线,您也可以:set modelines=0 - 此选项是全局选项,因此更易于处理。
  • 非常感谢@IngoKarkat!很好的解释。我一点一点地尝试,但是在:set modeline | doautocmd BufRead 之前执行的文件中,我只能阻止在.vimrc 中运行一次模式行,我将您的代码:set modelines=0:setglobal nomodeline 单独放在.vimrc 中是不够的。
  • 此外@Ingo,我创建了一个仅在受信任文件中运行模式行的映射,您可以检查一下吗?请。 nnoremap <leader>mdl <Esc>:set modelines=5<space><bar><space>:set modeline<space><bar><space>:e<space><bar><space>:set modelines=0<space><bar><space>:set nomodeline<CR>

标签: vim disable autocmd modeline


【解决方案1】:

在链接的问题中,BufRead 事件仅被创造性地重用于:doautocmd(任何事件都可以),以便在不重新加载缓冲区的情况下重新执行模式行。现在你要求的是相反的 - 阻止加载模式。

对应的选项是'modeline''modelines' - 如果前者关闭或后者设置为0,则忽略模式行。

您给定的映射对我来说看起来不错;它可以简化一点;你不需要拼出<space>(只有<bar>),并且:可以去掉,除了前面,它用于从普通模式到命令行模式的转换。前置 <C-u> 将清除所有计数(如果您不小心提供了一些)。

:nnoremap <leader>mdl :<C-u>set modelines=5<bar>set modeline<bar>edit <bar>set modelines=0<bar>set nomodeline<CR>

插件简化

anwolib plugin 有一个漂亮的:With {setlocal-args} Do {cmd} 命令;如果您只是针对 (buffer-local) 'modeline' 切换选项(至少对我来说就足够了),则整个映射可以写为

:nnoremap <leader>mdl :<C-u>With modeline Do edit<CR>

这非常清晰易懂,您几乎不再需要映射!

模式的安全影响

模式只能更改 Vim 选项 - 有些甚至被禁止更改,因为它们可能会被利用;无法通过它们执行任意 Vim 命令。尽管可以想象一些攻击(特别是如果您有一些插件或自定义作用于更改的缓冲区选项),但模式线通常是安全的。因此,除非您对安全性有偏执或在具有严格安全要求的环境中工作,否则您通常不需要采取此类预防措施。当然,如果您根本不亲自使用模型,关闭它们会减少攻击面。但至少对我来说,认识到模式行会很方便地执行然后切换设置并重新加载缓冲区的努力会比它们带来的最小风险更糟糕。

【讨论】:

  • 优秀的答案!!对于有同样问题的期货新手,还要检查问题本身中的 Karkat cmets 先生,有人指出,为了持久效果,这些设置选项(modelinemodelines)应该出现在 $MYVIMRC(通常是 ~/.vimrc)中.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-04
  • 1970-01-01
  • 2016-10-15
相关资源
最近更新 更多