在 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'; }; };
},
);
},
我很确定我已经弄明白了。我以前不明白的是范围界定是如何工作的。我仍然没有完全理解它,但我现在知道的足以为每种语法类型的 begin
和 end
创建嵌套定义(正则表达式)。
范围界定让事情变得容易得多!以前我想做像 (?<=\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'
,所以我不知道为什么它被覆盖了)
就评论的本质而言,这可能没有意义。
另一方面,我想要实现的与转义字符没有太大区别。
作为一个简单的例子,我想要
# 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'; }; };
},
);
},
我很确定我已经弄明白了。我以前不明白的是范围界定是如何工作的。我仍然没有完全理解它,但我现在知道的足以为每种语法类型的 begin
和 end
创建嵌套定义(正则表达式)。
范围界定让事情变得容易得多!以前我想做像 (?<=\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'
,所以我不知道为什么它被覆盖了)