Vim:禁用 autocmd BufRead(模式行)

Vim: disable autocmd BufRead (modeline)

从这个answer我执行了:

:set modeline | doautocmd BufRead

从那以后,我无法禁用 BufRead

我可以打开文件并取消设置 模式行:

:set nomodeline
:e!
:wq

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

我试过了noautocmd - autocmd-remove:

:noautocmd w BufRead
:noautocmd BufRead
:exe "au! BufRead *"
:au! BufRead

请注意,由于 BufRead,我想禁用所有自动执行,而不仅仅是它设置的单个 event,如下所述:

在链接的问题中,BufRead 事件仅创造性地重用于 :doautocmd(任何事件都可以),因此模式行 re-executed 无需重新加载缓冲区。现在你要求相反 - 阻止模式行加载。

对应的选项是'modeline' and 'modelines'——如果前者关闭或后者设置为0,modelines将被忽略。

我觉得你给的映射没问题;它可以简化一点;你不需要拼出<space>(只有<bar>),:可以去掉,除了前面,它用于从正常模式到[=的转换42=] 模式。前置 <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 命令。尽管可以想象到一些攻击(特别是如果您有一些插件或自定义项会作用于更改的缓冲区选项),但模式行通常是安全的。因此,除非您对安全有偏执或在具有严格安全要求的环境中工作,否则您通常不需要采取此类预防措施。当然,如果您根本不亲自使用模式行,将它们关闭会减少攻击面。但至少对我来说,认识到模式行很容易执行然后切换设置并重新加载缓冲区的努力比它们带来的最小风险更糟糕。