Vim:禁用autocmd BufRead模式行 使用插件简化举报线的安全影响

问题描述

我从这个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命令。尽管可以想象会发生一些攻击(特别是如果您有一些对更改的缓冲区选项起作用的插件或自定义项),但总体而言,安全模式是安全的。因此,除非您对安全性抱有幻想或在具有严格安全性要求的环境中工作,否则通常无需采取此类预防措施。当然,如果您根本不亲自使用模式线,请将其关闭会减少攻击面。但是至少对于我来说,认识到模式行将很容易执行,然后切换设置并重新加载缓冲区的工作要比它们带来的最小风险差。

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...