我最近问了一个问题,我知道在vim模式行中无法将参数以外的任何内容传递给:set。我了解安全方面的顾虑,但我想知道是否没有其他解决方法。关于SO的最近一个有关设置大批参数以符合编码标准的问题使我开始思考-是否可以在rc文件中定义可以由modeline打开或关闭的一组事物? br />
原谅伪代码,但是有一种方法可以创建一个由设置参数触发的函数吗?由诸如

set_function! codestyle()
    if &1 == 'psr-2'
        set ts=4
        set sw=4
    endfi
    if &1 == 'drupal7'
        set ts=2
        set sw=2
        iab D8 Drupal 8
    endif
endset_function
这样的模型触发,这在某些方面类似于文件类型匹配,但是允许手动覆盖。它还将以其他预定义的方式设置环境,避免了使文件在vim中运行其他任意命令的安全问题,但允许使用更自定义的环境。有办法吗?

评论

这将需要定义您自己的set选项; AFAIK,这在Vim中是不可能的...

@Carpetsmoker这是否意味着这个问题的答案是vimscript无法包装或扩展内置函数?

#1 楼

您有几种选择。



第一个:您可以编写自己的Modeline解码器,即插件。这与我对另一个问题的答案非常相似。而且,除了设置vim选项,我们不能使用标准模式行做更多的事情。


第二种可能性:可以通过回调功能利用let-modeline调用一个或另一个函数。您可以在:set中使用CodeStyle()函数,也可以使用一个(自动加载?)插件,然后文件中包含:确实不希望像local_vimrc这样的插件,然后编写您自己的类似于modeline的解码器。

第三种方法和IMO,在这种情况下,更好的选择是定义一个新文件类型并将.vimrc设置为此文件类型。在适当的情况下:'ft'# vim: set ft=php.psr2是全局通用文件类型(我不确定这一点),而php是将与您的编码样式相对应的专用文件类型。您必须定义两个ftplugins:ftplugin / psr2.vim和ftplugin / drupal7.vim,您将在其中调用psr2(而不是:setlocal)。


评论


支持选项3。我认为这是最语义上最合适且最适合Vim的方法。

–tommcdo
15年3月17日在14:49