Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vim:禁用autocmd BufRead(modeline)_Vim_Disable_Autocmd_Modeline - Fatal编程技术网

Vim:禁用autocmd BufRead(modeline)

Vim:禁用autocmd BufRead(modeline),vim,disable,autocmd,modeline,Vim,Disable,Autocmd,Modeline,据此,我执行: :set modeline | doautocmd BufRead 从那时起,我无法禁用BufRead 我可以打开一个文件并取消设置模型线: 但当我重新打开同一个文件时,它的modeline再次自动执行 我试过-: 注意:我想禁用所有自动执行的BufRead,而不是像这里解释的那样由它设置的单个事件:在链接的问题中,BufRead事件只被创造性地重用为:doautocmd(任何事件都可以),以便在不重新加载缓冲区的情况下重新执行modeline。现在,您的要求正好相反——防止加

据此,我执行:

:set modeline | doautocmd BufRead
从那时起,我无法禁用BufRead

我可以打开一个文件并取消设置模型线:

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

我试过-:


注意:我想禁用所有自动执行的BufRead,而不是像这里解释的那样由它设置的单个事件:

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

相应的选项为和-如果前者关闭或后者设置为
0
,则忽略模型线

你给出的映射在我看来很好;它可以简化一点;您不需要拼写
(仅
),并且可以删除
,但前面除外,它用于从正常模式过渡到命令行模式。预设的
将清除任何计数(如果您意外提供了一些计数)

这是如此清晰和易懂,你几乎不再需要一个映射了

modelines的安全影响
Modelines只能更改Vim选项-有些甚至被禁止更改,因为这些选项可能被利用;不可能通过它们执行任意Vim命令。尽管有些攻击是可以想象的(特别是当您有一些插件或自定义项作用于更改的缓冲区选项时),但Modeline通常是安全的。因此,除非您对安全性有偏执心理,或者工作环境有严格的安全要求,否则您通常不需要采取此类预防措施。当然,如果您个人根本不使用modeline,那么关闭它们会减少攻击面。但至少对我来说,认识到modelines可以方便地执行,然后切换设置并重新加载缓冲区的努力比它们所带来的最小风险更糟糕。

我想你被
BufRead
弄糊涂了-该事件只被创造性地重用为
:doautocmd
(任何事件都可以)这样就可以在不重新加载缓冲区的情况下重新执行Modeline—链接的问题是关于什么的。现在,您似乎要求的是相反的结果—阻止加载模型线。我认为您从
:set nomodeline
中得到的结果是混合的,因为它是一个缓冲区本地选项—只有从当前缓冲区打开的缓冲区才会观察到这一点。要保持这种状态,必须将命令放入
~/.vimrc
文件中,或使用
:setglobal nomodeline
。要完全关闭modelines,您还可以
:设置modelines=0
-此选项是全局选项,因此更易于处理。非常感谢@IngoKarkat!很好的解释。我一点一点地尝试,但是在我之前执行的文件中,我只能阻止运行模型线一次。vimrc我把你的代码
:set modelines=0
,就像
:setglobal nomodeline
单独放在。vimrc是不够的。此外@Ingo,我创建了一个仅在受信任文件中运行modeline的映射,您能检查它吗?求你了
nnoremap mdl:set modeline=5:set modeline:e:set modeline=0:set nomodeline
回答得很好!!对于具有相同问题的期货Noobie,也可以查看Karkat先生在问题本身中的评论,有人指出,为了持续有效,这些集合选项(
modeline
modeline
)应该出现在$MYVIMRC中(通常~/.vimrc)。
:set nomodeline
:e!
:wq
:noautocmd w BufRead
:noautocmd BufRead
:exe "au! BufRead *"
:au! BufRead
:nnoremap <leader>mdl :<C-u>set modelines=5<bar>set modeline<bar>edit <bar>set modelines=0<bar>set nomodeline<CR>
:nnoremap <leader>mdl :<C-u>With modeline Do edit<CR>