我编写了一个 Vim 脚本,用于自动完成 Fortran 程序单元、类型定义等,从 vim-latex 插件中得到启发。
目前,如果我在光标位于单词program
上时按<F5>
,我会得到以下内容
PROGRAM <+program_name+>
USE <+used_module_name+>
IMPLICIT NONE
<++>
END PROGRAM <+program_name+>
第一个<+program_name+>
视觉选择,Vim 处于选择模式。这对我来说是完美的。
当我使用这样的占位符作为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+>
这就是为什么我认为灵魂必须存在并且没有那么复杂。
我决定以"肮脏"的方式解决问题,即通过在生成IF...THEN...ELSE...END IF
和DO...END DO
结构的命令序列中的适当位置插入空格。这不是一个优雅的解决方案,但我认为它没有那么多缺点。唯一要更改的是要根据shiftwidth
手动添加到命令序列中的空格数。
正如@SatoKatsura在评论中建议的那样,最好放弃这条路并使用现有的代码段解决方案。