在缩进时让Vim忽略第一个字符

And*_*Gil 5 vim perl indentation mason

每当我必须编辑Perl Mason文件时,由于Perl代码的开头,我总是会出现缩进行的问题%.例如:

<div>
    <div>
%       if( !$something ) {
            <strong><% $title %></strong>
%       }
    </div>
</div>
Run Code Online (Sandbox Code Playgroud)

任何想法我怎么能告诉Vim忽略%线的开头和缩进,就像它不存在?

我正在使用https://github.com/aming/vim-mason来支持混合的Perl/HTLM语法,但我认为它不会改变任何东西.

Ing*_*kat 3

这是嵌入 HTML 中的 Perl 代码,因此缩进来自$VIMRUNTIME/indent/html.vim. 这定义了一个'indentexpr',由 实现HtmlIndent()

您需要修改该实现以%在第一列中忽略;每当它访问缓冲区(getline()prevnonblank()shiftwidth())时,您都需要拦截,找到具有此类%标志的上一行,然后返回该值。(如果这些特殊行还可以包含 HTML 标记,您可能必须从 Perl 代码中提取这些标记并仅返回这些标记。)这将获得您想要的缩进。

不幸的是,这并不是一件小事,你必须分叉原始的实现。但是,如果您设法实现一个干净的解决方案,您可以建议向indent/html.vim. 如果除了 Mason 之外还有其他语言在 HTML 之上使用这些前缀,那么这将是添加此类支持的额外参数(甚至可能是您的包装函数)。

  • 请不要在不发表评论的情况下投反对票。如果您不喜欢所提出的解决方案(因为需要付出很大的努力),我可以理解,但不要开枪射击信使! (3认同)