1

从这个答案我执行:

:set modeline | doautocmd BufRead

从那时起,我无法禁用BufRead

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

:set nomodeline
:e!
:wq

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

我试过noautocmd - autocmd-remove

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

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

4

1 回答 1

1

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

相应的选项是'modeline'and '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'针对切换的 (buffer-local) 选项(至少对我来说就足够了),则整个映射可以写为

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

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

模型的安全影响

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

于 2020-10-15T16:58:33.183 回答