ST2 中注释行后的命令颜色错误

Wrong coloring of commands after comment line in ST2

语法着色非常有用,但我在 Sublime Text 2 中遇到了问题。特别是,当以命令开头的行(如 Fortran 中的 A​​LLOCATE)在后面时一个或多个注释行,该命令会更改颜色,就好像它是一个变量一样。

ALLOCATE(XYZ%CC(3,NC(1),NC(2),NC(3)))
!ALLOCATE(XYZ%CV(3,NF(1),NF(2),NF(3)))
ALLOCATE(XYZ%CV(3,NC(1)+1,NC(2)+1,NC(3)+1))

这可以通过将 Packages/Fortran/Syntaxes/Fortran - Modern.tmLanguage 替换为 this version 来更正。要使用,请将要点中文件的原始版本保存为 Fortran - Modern.tmLanguage。接下来,在 Sublime 中,select Preferences → Browse Packages… 打开操作系统文件管理器中的 Packages 文件夹。打开 Fortran/Syntaxes 文件夹并将现有的 Fortran - Modern.tmLanguage 文件替换为新文件。另外,请务必删除 Fortran - Modern.tmLanguage.cache,否则更改不会生效。

那么现在的最终结果是:

与原始行为对比:


为什么需要改变,它是如何工作的

我使用 PackageDev 将基于 XML 的 .tmLanguage 文件转换为更具可读性的基于 YAML 的格式。其中,有两个部分定义评论,一个用于以 !-:

开头的评论块
- begin: (^[ \t]+)?(?=!-)
  beginCaptures:
    '1': {name: punctuation.whitespace.comment.leading.ruby}
  end: (?!\G)
  patterns:
  - name: comment.line.exclamation.mark.fortran.modern
    begin: '!-'
    beginCaptures:
      '0': {name: punctuation.definition.comment.fortran}
    end: \n
    patterns:
    - match: \\s*\n

和一个以 ! 开头的评论:

- begin: (^[ \t]+)?(?=!)
  beginCaptures:
    '1': {name: punctuation.whitespace.comment.leading.ruby}
  end: (?!\G)
  patterns:
  - name: comment.line.exclamation.fortran.modern
    begin: '!'
    beginCaptures:
      '0': {name: punctuation.definition.comment.fortran}
    end: \n
    patterns:
    - match: \\s*\n

这种额外的复杂性是不必要的和令人困惑的,甚至不是正确的做法。不需要 punctuation.whitespace.comment.leading 范围(.ruby 后缀从哪里来?),实际评论块的正则表达式过于复杂和不正确。

我删除了以上两个部分并用这个简单的部分替换它们:

- name: comment.line.exclamation.fortran.modern
  match: (!-?).*$\n?
  captures:
    '1': {name: punctuation.definition.comment.fortran}

正则表达式非常简单:捕获括号中的第一组 - ! 可选地后跟 -,并将其范围作为注释符号。然后,匹配直到行尾 ($) 的所有内容,可选择以换行符终止。我什至不完全确定以前的正则表达式是如何工作的...