首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >禁用autocmd BufRead (modeline)

禁用autocmd BufRead (modeline)
EN

Stack Overflow用户
提问于 2020-10-15 09:03:29
回答 1查看 406关注 0票数 1

我从这个回答中执行了:

代码语言:javascript
复制
:set modeline | doautocmd BufRead

从那时起,我就不能禁用BufRead。

我可以打开一个文件并撤销modeline

代码语言:javascript
复制
:set nomodeline
:e!
:wq

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

我试过noautocmd - 自动remove删除

代码语言:javascript
复制
:noautocmd w BufRead
:noautocmd BufRead
:exe "au! BufRead *"
:au! BufRead

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-15 16:58:33

在链接问题中,BufRead事件只被创造性地重用为:doautocmd (任何事件都可以),这样就可以在不重新加载缓冲区的情况下重新执行模型。现在,您要求的是相反的--防止模型加载。

对应的选项是'modeline''modelines' --如果前者为off或后者设置为0,则将忽略modelines。

在我看来,给定的映射很好;它可以简化一点;您不需要拼写<space> (只有<bar>),除了前面,:可以删除,它用于从正常模式到命令行模式的转换。一个预置的<C-u>将清除任何计数(如果您不小心提供了一些)。

代码语言:javascript
复制
: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'选项进行切换(至少对我来说是足够的),则整个映射可以编写为

代码语言:javascript
复制
:nnoremap <leader>mdl :<C-u>With modeline Do edit<CR>

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

模型的安全影响

Modelines只能更改Vim选项--有些甚至被禁止更改,因为这些选项可能被利用;无法通过它们执行任意的Vim命令。虽然有些攻击是可以想象的(特别是如果您有一些插件或自定义来操作更改的缓冲区选项),但一般情况下,模型都是安全的。因此,除非你偏执于安全问题,或者在安全要求严格的环境中工作,否则你通常不需要采取这样的预防措施。当然,如果您根本不使用模型,关闭它们可以减少攻击面。但是至少对我来说,认识到modelines在执行时很方便,然后切换设置并重新加载缓冲区的努力会比它们所带来的最小风险更糟糕。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64368210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档