如何在 Github 中使用语法高亮编写差异代码

Eas*_*ang 8 markdown github

Github 支持语法高亮如下:

```javascript
let message = 'hello world!'
```
Run Code Online (Sandbox Code Playgroud)

它支持如下差异:(但没有语法高亮)

```diff
-let message = 'hello world!'
+let message = 'hello stackoverflow!'
```
Run Code Online (Sandbox Code Playgroud)

我怎样才能同时获得“语法亮点”和“差异”?

Way*_*lan 8

不,目前不支持此功能。

GitHub 在github/markup中记录了他们对轻量级标记语言(包括 Markdown 等)的处理。注意步骤3:

  1. 语法高亮是在代码块上执行的。有关语法突出显示的更多信息,请参阅github/linguist 。

如果我们点击该链接,我们会在 GitHub 上找到 Linguist 用于提供语法突出显示的语法列表。语言学家一次只能将该列表中的一种语法应用于一段代码。当然,语法之一是Diff. 但是,该语法对所比较的代码语言一无所知,因此您无法获得语法突出显示。

当然,还有其他经常组合的语言。例如,HTML 通常包含在模板语言中。因此,除了HTML语法之外,我们还找到HTML+DjangoHTML+ECR HTML+EEXHTML+ERB、 和的语法HTML+PHP。在每种情况下,单一语法都识别两种语言。特定的模板语言和散布在模板中的 HTML。

要使用 diff 完成同样的事情,您需要为列出的每种语言使用单独的“diff”语法。换句话说,语法的数量将增加一倍。当然,避免这种情况的一种方法可能是diff区别对待。当diff指定时,他们可以通过语法突出显示器运行该块两次,一次针对diff源语言,一次针对源语言。然而,至少在处理轻量级标记语言的代码块时,他们还没有实现这样的功能。

如果他们将来要实现这样的功能,可能会比简单地运行代码块两次更复杂。毕竟,diff 的每一行都有 diff 特定的内容,这会混淆其他语言的语法。因此,每个语法都需要了解差异,或者需要将每一行单独输入到语法中,并删除差异部分。后者的问题是语法不会有每行的上下文,并且更有可能出错。这样的解决方案是否可行超出了这个答案的范围,但要点是,由于所涉及的复杂性,可以合理地预期这样的功能的支持优先级要低得多。

那么为什么 GitHub 在其网站的其他地方要做语法高亮呢?因为,在这些情况下,它可以访问正在比较的两个源文件,并自行生成差异。首先突出显示每个源(避免上述复杂性),然后从两个突出显示的源文件创建差异。然而,当 GitHub 第一次看到 Markdown 代码块中包含的 diff 时,它就已经是 diff 了。他们无法首先突出显示预差异代码。换句话说,他们当前使用的流程将无法转移到支持所请求的功能。


Von*_*onC 2

您需要对 git diff 的输出进行后处理,以便为正在比较的文件的正确语言添加语法突出显示。

但由于您要求使用 GitHub,因此后处理不在您的控制范围内,并且 GitHub 目前在其GFM (GitHub Flavored Markdown Spec)中也未提供此功能。

它支持源文件,在像这样的常规差异PR 中:GitHub 对文件的两个版本进行语法突出显示,然后计算差异。

常规Markdown 围栏代码块不支持它,其中diff 的+/-会抛出语法突出显示引擎,考虑到这里没有完成“diff”操作(只是作者试图添加 diff +/-符号)

  • 所以这确实是 Github 尚未提供的功能。谢谢! (3认同)