在 TextMate2 注释中间使用替代语法突出显示

Use alternate syntax highlighting in middle of TextMate2 comment

就评论的本质而言,这可能没有意义。

另一方面,我想要实现的与转义字符没有太大区别。

作为一个简单的例子,我想要 # comment :break: comment 显示得更像

#comment 
"break" 
# comment

会,但没有第二个 #,所有内容都在同一行,而不是引号,我有一些其他转义字符。虽然,像引号(而不像我熟悉的转义字符[例如,\]),我打算明确指出评论中断的开始和结束。

感谢@Graham P Heath,我得以实现 。我所追求的是对那里取得的成就的增强。在我的场景中,# 是我使用的语言 (R) 中的注释,而 #' 既用作 R 注释,又用作另一种语言的代码开头。现在,我可以让 #' 之后的所有内容都采用不同于典型 R 注释的语法高亮显示,但我试图在这种子语言中获得非常适度的语法高亮显示(#' 实际上表示降价代码的开始,我想要 "raw" 语法高亮显示在一对 ` ).

中的文本包围

我要打断的一段语言语法如下:

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

我很确定我已经弄明白了。我以前不明白的是范围界定是如何工作的。我仍然没有完全理解它,但我现在知道的足以为每种语法类型的 beginend 创建嵌套定义(正则表达式)。

范围界定让事情变得容易得多!以前我想做像 (?<=\A#'\s.*)($) 这样的正则表达式来在 #' 风格的注释中找到一个美元符号......但显然这不会起作用,因为重复 * (+ 出于同样的原因不起作用)。通过作用域,已经暗示我们必须在 \A#'\s 匹配中才能匹配 $

这是我的语言语法的相关部分:

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


                    patterns = (

                        // Markdown within Comment
                        {   name = 'comment.line.number-sign-tick-raw.r';
                            begin = '(`)(?!\s)'; // backtick not followed by whitespace
                            end = '(?<!\s)(`)'; // backtick not preceded by whitespace
                            beginCaptures = { 0 = { name = 'punctuation.definition.comment.r'; }; };
                        },

                        // Equation within comment
                        {   name = 'comment.line.number-sign-tick-eqn.r';
                            begin = '((?<!\G)([$]{1,2})(?!\s))';
                            end = '(?<!\s)([$]{1,2})';
                            beginCaptures = { 0 = { name = 'punctuation.definition.comment.r'; }; };

                            // Markdown within Equation
                            patterns = (
                                {   name = 'comment.line.number-sign-tick-raw.r';
                                    begin = '(`)(?!\s)'; // backtick not followed by whitespace
                                    end = '(?<!\s)(`)'; // backtick not preceded by whitespace
                                    beginCaptures = { 0 = { name = 'punctuation.definition.comment.r'; }; };
                                },
                            );
                        },
                    );
                },

            );
        },

这是一些 R 代码:

# below is a `knitr` (note no effect of backticks) code chunk
#+ codeChunk, include=FALSE


# normal R comment, follow by code
data <- matrix(rnorm(6,3, sd=7), nrow=2)

#' This would be recognized as markdown by `knitr::spin()`, with the preceding portion as "raw" text
`note that this doesnt go to the 'raw' format ... it is normal code!`

#+ anotherChunk
# also note how the dollar signs behave normally
data <- as.list(data)
data$blah <- "blah"
`data`[[1]] # backticks behaving

#' I can introduce a Latex-style equation, filling in values from R using `knitr` code chunks: $\frac{top}{bottom}=\frac{`r topValue`}{`r botValue`}$ then continue on with markdown.

下面是进行这些更改后 TextMate2 中的内容:

很好,除了反引号部分在等式中时会显示为斜体。我可以忍受这一点。我什至可以说服自己我想要那样 ;)(顺便说一句,我为新快递指定了 fontName='regular',所以我不知道为什么它被覆盖了)