根据这个答案,我执行了:
: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执行起来很方便,然后切换设置并重新加载缓冲区,这将比它们带来的最小风险更糟糕。