用作构造名称的占位符会影响正确的缩进

Place-holders used as construct name compromise correct indentation

我从 vim-latex 插件中得到启发,为 Fortran 程序单元、类型定义等的自动完成编写了一个 Vim 脚本。

目前,如果我在光标位于单词 program 上时点击 <F5>,我会得到以下内容

PROGRAM <+program_name+>           

    USE <+used_module_name+>

    IMPLICIT NONE

    <++>

END PROGRAM <+program_name+>

第一个 <+program_name+> 视觉 selected 和 Vim select 模式。这对我来说是完美的。

当我使用这样的占位符作为 IF 构造的标签时,问题就出现了。当我展开 if 我得到

    <+name+>: IF (<+logical expression+>) THEN
    <++> ! this line is not indented => in turn the following are negative indented
ELSE IF (<+logical expression+>) THEN
    <++>
ELSE
    <++>
END IF <+name+>

第二行没有缩进是因为(至少我认为!)字符串 <+name+> 不是有效名称。因此,以下行向后移动(显然,当 if 在第一列时,第二行是唯一错误的行)。

DO 结构也会发生这种情况,但奇怪的是,SELECT CASE 结构不会发生这种情况:

<+name+>: SELECT CASE (<+case expression+>)
CASE (<+case selector+>)
    <++>   
CASE DEFAULT
    <++>   
END SELECT <+name+>

这就是为什么我认为灵魂必须存在并且没有那么复杂的原因。

我决定以 "dirty" 方式解决问题,即在生成 IF...THEN...ELSE...END IFDO...END DO 结构的命令序列中的适当位置插入空格。这不是一个优雅的解决方案,但我认为它没有那么多缺点。唯一要更改的是根据 shiftwidth.

手动添加到命令序列的空格数

正如@SatoKatsura 在评论中建议的那样,最好放弃这条路并使用现有的代码段解决方案。