是否可以在rc文件中创建自定义的“ set”命令并从modeline调用它们?


10

最近我问了一个问题,我知道除了:set在vim模式行中传递参数外,什么都不可能传递。我了解安全问题,但是我想知道是否还没有其他解决方法。关于SO最近一个有关设置大批参数以符合编码标准的问题使我开始思考-是否可以在rc文件中定义可以通过modeline打开或关闭的一组事物?

请问伪代码,但是有没有办法创建从设置参数触发的函数?

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: codestyle=psr-2

在某些方面,这类似于文件类型匹配,但允许手动覆盖。它还将以其他预定义的方式设置环境,避免了使文件在vim中运行其他任意命令的安全问题,但允许使用更自定义的环境。有没有办法做到这一点?


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

@Carpetsmoker这是否意味着这个问题的答案是vimscript无法包装或扩展内置函数?
卡雷布(Caleb)2015年

Answers:


10

您有几种选择。

  1. 第一个:您可以编写自己的Modeline解码器,即插件。这与我回答您其他问题的答案非常相似。

    确实,我们不能添加新的vim选项(可以使用设置:set),但是可以添加新的变量。而且,除了设置vim选项,我们不能使用标准模式行做更多的事情。

  2. 第二种可能性:可以通过回调功能利用let-modeline来调用一个或另一个函数。您可以在您的(或自动加载?)插件中使用函数,然后使文件包含:CodeStyle().vimrc

    # VIM: let b:codestyle='psr-2' b:ModeLine_CallBack='CodeStyle'
    

    但是,如果您的需求如此精确,并且您确实不希望使用诸如local_vimrc之类的插件,则可以编写自己的类似于Modeline的解码器。

  3. 在这种情况下,第三个(也是IMO)更好的选择是定义一个新文件类型,并使用以下方式将其设置'ft'为该文件类型:# vim: set ft=php.psr2。随着php作为全球平常的文件类型(我不知道这一个),以及psr2作为专门的文件类型是会符合您的编码风格。您必须定义两个ftplugins:ftplugin / psr2.vim和ftplugin / drupal7.vim,您将在其中:setlocal(而不是:set)进行呼叫。


6
支持选项3。我认为这是最语义上最合适,最适合Vim的方法。
tommcdo
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.