问题描述
我从这个answer执行:
:set modeline | doautocmd BufRead
从那时起,我无法禁用 BufRead 。
我可以打开一个文件并取消设置 modeline :
:set nomodeline
:e!
:wq
但是当我重新打开同一文件时,其 modeline 会再次自动执行。
我尝试了noautocmd-autocmd-remove:
:noautocmd w BufRead
:noautocmd BufRead
:exe "au! BufRead *"
:au! BufRead
请注意,由于 BufRead ,我想禁用所有自动执行的功能,而不仅仅是像它解释的那样设置的单个 event :https://stackoverflow.com/a/40173033/9391770
解决方法
在链接的问题中,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命令。尽管可以想象会发生一些攻击(特别是如果您有一些对更改的缓冲区选项起作用的插件或自定义项),但总体而言,安全模式是安全的。因此,除非您对安全性抱有幻想或在具有严格安全性要求的环境中工作,否则通常无需采取此类预防措施。当然,如果您根本不亲自使用模式线,请将其关闭会减少攻击面。但是至少对于我来说,认识到模式行将很容易执行,然后切换设置并重新加载缓冲区的工作要比它们带来的最小风险差。