使 Vim 在缩进时忽略行中的第一个字符

Make Vim ignore first character in line while indenting

每当我必须编辑 Perl Mason 文件时,由于 Perl 代码以 % 开头,我总是在缩进行时遇到问题。例如:

<div>
    <div>
%       if( !$something ) {
            <strong><% $title %></strong>
%       }
    </div>
</div>

知道如何告诉 Vim 忽略行首的 % 并像它不存在一样缩进吗?

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

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

您需要修改该实现以忽略第一列中的 %;每当它访问缓冲区(getline()prevnonblank()shiftwidth())时,你需要拦截,找到前一行确实有这样的 % 印记,和 return 取而代之的价值。 (如果这些特殊行也可以包含 HTML 标记,您可能必须从 Perl 代码中提取这些标记,而只提取 return 标记。)这会让您获得所需的缩进。

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