Vim: disable autocmd BufRead (modeline)



根据这个答案,我执行了:

:set modeline | doautocmd BufRead

从那时起,我无法禁用BufRead

我可以打开一个文件并取消设置modeline:

:set nomodeline
:e!
:wq

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

我尝试了noautocmd-autocmd删除:

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

注意,我想禁用所有自动执行的,因为BufRead,而不仅仅是它设置的一个事件(如这里所解释的(:https://stackoverflow.com/a/40173033/9391770

在链接的问题中,BufRead事件只被创造性地重新用于:doautocmd(任何事件都可以(,这样模型线就可以在不重新加载缓冲区的情况下重新执行。现在你要求的恰恰相反——阻止modelines加载。

相应的选项是'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插件有一个漂亮的:With {setlocal-args} Do {cmd}命令;如果你只针对(缓冲区本地('modeline'选项进行切换(至少对我来说已经足够了(,那么整个映射可以写成

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

这是如此清晰易懂,以至于您几乎不再需要映射了!

modelines的安全影响

Modelines只能更改Vim选项,有些甚至被禁止更改,因为这些选项可能会被利用;不可能通过它们执行任意Vim命令。尽管有些攻击是可以想象的(尤其是如果你有一些插件或自定义,它们对更改的缓冲区选项起作用(,但建模通常是安全的。因此,除非你对安全有偏执狂,或者在有严格安全要求的环境中工作,否则你通常不需要采取这样的预防措施。当然,如果你个人根本不使用modelines,那么关闭它们会减少攻击面。但至少对我来说,认识到modelines执行起来很方便,然后切换设置并重新加载缓冲区,这将比它们带来的最小风险更糟糕。

相关内容

  • 没有找到相关文章

最新更新