使 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 之上使用这些前缀,那将是添加此类支持的附加参数(甚至可能是您的包装函数)。
每当我必须编辑 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 之上使用这些前缀,那将是添加此类支持的附加参数(甚至可能是您的包装函数)。