注释子类型的不同语法高亮(?)

时间:2015-08-15 00:55:30

标签: syntax-highlighting text-editor textmate2

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

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

这些报告的聪明部分是它们区分R(#)中的标准注释符号和以下内容:

  1. #'表示降价,例如roxygen
  2. #+表示knitr code chunk will follow
  3. 我很擅长编辑TextMate2包。我设法将热键设置为使用#'#+注释掉行,并使用适当的缩进来执行此操作。现在,我希望我可以编辑我的主题(我在TextMate1中设计)来制作其中一个" special"评论不同的颜色。

    我编辑了R bundle的语言语法(这就是文件的启动方式):

    {   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';
                };
    },
    

    到目前为止,我无法在以#开头的行与以#'开头的行的语法高亮显示方面有任何差异。我可以让两者都改变​​,但不能独立。任何有关如何为这两者实现不同语法高亮的帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

TextMate更喜欢自定义语法的第一个范围comment.line.number-sign.r。我所做的只是将您的代码粘贴到我的comment.line.number-sign.r定义之上,而不是按照您的指示粘贴,并扩展您现有的语法/主题。

以下是我所拥有的:

在捆绑编辑器中 - > R - >语言语法 - > [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,所以我只是用谷歌搜索了一个包含所有3种评论的快速示例。 Here's the file I used to test

我所看到的截图: screenshot