注释子类型的不同语法突出显示(?)

Different syntax highlighting for sub-types of comments (?)

我在 TextMate2 工作,但这个问题可能也适用于其他文本编辑器。

我的脚本在 R 中。我打算在脚本上使用 rmarkdown::render() 创建一个 "report"

这些报告的巧妙之处在于它们区分了 R 中的标准注释符号 (#) 和以下内容:

  1. #' 表示降价,如 roxygen
  2. #+表示一个knitr code chunk will follow

我不擅长编辑 TextMate2 包。我设法将热键设置为注释掉带有 #'#+ 的行,并使用适当的缩进来完成。现在,我希望我可以编辑我的主题(我在 TextMate1 中设计的),使其中一个 "special" 评论具有不同的颜色。

我编辑了 R 包的语言语法(这是文件的开头):

{   patterns = (
        {   name = 'comment.line.pragma-mark.r';
            match = '^(#pragma[ \t]+mark)[ \t](.*)';
            captures = {
                1 = { name = 'comment.line.pragma.r'; };
                2 = { name = 'entity.name.pragma.name.r'; };
            };
        },
        {   begin = '(^[ \t]+)?(?=#)';
            end = '(?!\G)';
            beginCaptures = { 1 = { name = 'punctuation.whitespace.comment.leading.r'; }; };
            patterns = (
                {   name = 'comment.line.number-sign.r';
                    begin = '#';
                    end = '\n';
                    beginCaptures = { 0 = { name = 'punctuation.definition.comment.r'; }; };
                },
            );
        },

并在中间插入以下内容,希望它能让我指定一个新的语法高亮范围:

        # START MY STUFF
        {   begin = '(^[ \t]+)?(?=#'')';
            end = '(?!\G)';
            beginCaptures = { 1 = { name = 'punctuation.whitespace.comment.leading.r'; }; };
            patterns = (
                {   name = 'comment.line.number-sign-tick.r';
                    begin = "#'";
                    end = '\n';
                    beginCaptures = { 0 = { name = 'punctuation.definition.comment.r'; }; };
                },
            );
        },
        # END MY STUFF

如果有帮助,我可以提供其余的语言语法,但我不确定它在这里是否相关。

我在重新定义主题中的评论时尝试更具体(之前只是comment,我改为comment.line.number-sign.r)。以下是(我认为是)主题的相关行:

{   name = 'Comment';
            scope = 'comment.line.number-sign.r';
            settings = {
                fontStyle = 'italic';
                foreground = '#279797';
            };
        },
        {   name = 'Comment';
            scope = 'comment.line.number-sign-tick.r';
            settings = {
                fontStyle = 'italic';
                foreground = '#C5060B';
            };
},

到目前为止,我无法在以 # 开头的行与以 #' 开头的行的语法突出显示方面取得任何区别。我可以让两者都改变​​,但不能独立改变。任何有助于弄清楚如何为这两者实现不同语法突出显示的帮助都会很棒。

TextMate 更喜欢第一个范围,comment.line.number-sign.r 而不是您的自定义语法。我所做的只是将您的代码粘贴到我的 comment.line.number-sign.r 定义之上,而不是像您指出的那样粘贴到之后,并扩展您现有的 grammar/theme.

这是我得到的:

在 Bundle Editor -> R -> Language Grammars -> R

{   patterns = (
        //default block
        {   name = 'comment.line.pragma-mark.r';
            match = '^(#pragma[ \t]+mark)[ \t](.*)';
            captures = {
                1 = { name = 'comment.line.pragma.r'; };
                2 = { name = 'entity.name.pragma.name.r'; };
            };
        },
        //your block
        {   begin = '(^[ \t]+)?(?=#'')';
            end = '(?!\G)';
            beginCaptures = { 1 = { name = 'punctuation.whitespace.comment.leading.r'; }; };
            patterns = (
                {   name = 'comment.line.number-sign-tick.r';
                    begin = "#'";
                    end = '\n';
                    beginCaptures = { 0 = { name = 'punctuation.definition.comment.r'; }; };
                },
            );
        },
        //my block
        {   begin = '(^[ \t]+)?(?=#\+)';
            end = '(?!\G)';
            beginCaptures = { 1 = { name = 'punctuation.whitespace.comment.leading.r'; }; };
            patterns = (
                {   name = 'comment.line.number-sign-plus.r';
                    begin = '#\+';
                    end = '\n';
                    beginCaptures = { 0 = { name = 'punctuation.definition.comment.r'; }; };
                },
            );
        },
        //default caption block
        {   begin = '(^[ \t]+)?(?=#)';
            end = '(?!\G)';
            beginCaptures = { 1 = { name = 'punctuation.whitespace.comment.leading.r'; }; };
            patterns = (
                {   name = 'comment.line.number-sign.r';
                    begin = '#';
                    end = '\n';
                    beginCaptures = { 0 = { name = 'punctuation.definition.comment.r'; }; };
                },
            );
        },
        //... 

然后,在我的主题中:

        //...
        {   name = 'Comment';
            scope = 'comment.line.number-sign.r';
            settings = {
                fontStyle = 'italic';
                foreground = '#279797';
            };
        },
        {   name = 'Comment';
            scope = 'comment.line.number-sign-tick.r';
            settings = {
                fontStyle = 'italic';
                foreground = '#C5060B';
            };
        },
        {   name = 'Comment';
            scope = 'comment.line.number-sign-plus.r';
            settings = {
                fontStyle = 'italic';
                foreground = '#ff00ff';//fix this color(!)
            };
        },
    );
}

我不使用 R,所以我只是用 Google 搜索了一个包含所有 3 种评论的简单示例。 Here's the file I used to test.

我所看到的屏幕截图: