当前,Stack Exchange的Markdown解析器仅允许四个空格的缩进来表示代码块: t要求缩进每行代码:

    // some code
    // another line of code


这更加方便键入。如果Stack Exchange支持此语法,则将非常有用。


通过扩展,该语法还允许您在打开```之后指定源语言:

```
// some code
// another line of code
```


…然后将启用该特定语言的语法突出显示。尽管它是有趣的元数据,但我认为Stack Overflow不需要此功能,因为语法突出显示库对于​​各种语言都可以很好地工作。 ```language,这将大大提高我在Stack Exchange上的生产率。

您怎么看?

主持人当前正在收集有关此功能的反馈,因此请与的想法。好主意?馊主意?真的不在乎吗?您认为好处/缺点是什么?经验?让他们知道!谢谢!

评论

+1我认为这会很棒。在编辑代码时不必担心多余的4位缩进,文本框将使它不必再拉出到外部编辑器中,然后再粘贴回去。

@ BoltClock'saUnicorn:此功能不适用于偶然偶然发现它的人,但对于真正知道它存在并发现比用四个空格缩进缩进更方便的方法(我可能会使用它)。

这是一个合理的建议,我们正在考虑中。一个很好的副作用是这种代码块不会出现“放在列表后面”的问题。

添加它时,请考虑像处理常规的三反栅栏一样处理四反栅栏的“栅栏”。在德语键盘上,输入奇数个反引号非常烦人,因为它是一个死键,您不能无副作用地更改它。

@Chichiray:单击比拖动要容易,因为后者要求您将目标对准正确的文本,而`是单个键,而Ctrl + K不是;因此,单击```单击```可以更快地执行。

我无法计算经过多少次并在剪贴板上放置4个空格,然后反复按Ctrl + V,DownArrow,Home缩进整个代码行以缩进整个块。
@gobernador您使用的是什么文本编辑器?,通常可以对整个内容进行缩进(如果选中),然后插入一些选项卡。或在此网站的编辑器中,只需选择整个内容,然后单击“代码”图标,即可为您缩进

@balpha鉴于此语法现已在CommonMark中标准化,是否可以重新考虑?

新的文档系统(当前处于私人Beta版)正在使用不同的基于CommonMark的解析器,并支持受防护的代码块。文档应在一两个月内退出测试版。经过一段时间的分析,也许我们会看到该解析器在网站的其他地方使用。

这花了很长时间而且很烦人!请,它不需要符合CommonMark规范,只需添加三个反引号即可。

就导入而言,这并不多,但这是我对SO的绝对#1功能要求。就像我唯一能想到的我一样。

我想知道推迟这一现象的原因是什么,也许是一些NIH综合征?这是一个非常受欢迎的请求,易于实施且风险低。为什么不花100倍的精力尝试新的编写和托管文档的方式。

这里的大多数评论都是关于评论者输入内容的难易程度。我不太在乎我知道有足够的技巧可以使缩进正确,如果担心,可以查看预览。但是,该网站的新手对此并不了解。关于带有代码块的SO的问题至少有一半缩进不好,这在​​python标签中尤其明显。现在,由于缩进不一致,我不知道代码实际上在说什么,我想回答一个问题,而且我不打算为此责怪提问者。

我将购买Stack Overflow工程师的啤酒(或更多)来解决此问题。在Stack Overflow上编写代码时,我经常在编辑器中编写代码并将其复制到答案中。我希望可以解决这一可怕的经历。请!

我只是将其留在这里;)“作为一种社会现象,这种哲学可能表现为不愿意采用一种想法或产品,因为它源于另一种文化,一种部落主义形式” — en.wikipedia.org/wiki/Not_invented_here

#1 楼

代码防护栏现在可以使用。

 function DeepThought(task) {
    this.task = task;
}
DeepThought.prototype.answer = function () {
    switch (this.task) {
        case "life, universe, and everything": return 42;
        default: throw "not implemented";
    }
}
 


(查看此答案的源代码)

它们尽可能地支持部分功能,它们符合CommonMark 0.28。这意味着:


代码围栏由三个或更多反引号```或波浪号~~~组成,中间用零到三个空格缩进。 。在Stack Exchange上,这可以是Prettify模块名称(例如```lang-cxx)或已配置了语法突出显示的标签(例如```c++)。 ```none禁用语法突出显示。
关闭代码围栏必须使用相同的字符,并且至少与开始代码围栏使用相同的数字。

该代码块将以缩进了开头的代码围栏,因此留出了很多空间。所以,这:

 See this:
  ~~~
  foo
    bar
  ~~~
 


变成了:


参见:

foo
  bar



未封闭的带栅栏的代码块继续到块的末尾(例如,块引用)或发布。

最后一点也是现有内容唯一真正的边缘破损的原因。如果有人在帖子中用~~~~~~~~~~~~~~之类的东西创建了一条水平线,那么现在将打开一个代码块。与往常一样,当我们进行markdown更改时,除非对帖子进行编辑,否则问题和答案视图将不会受到此影响,而且这种情况极为罕见,因此我对此不必太担心。

评论


哇酷!你们这星期火了。

–jscs
19年1月8日在17:17

@JoshCaswell 10周年影响。

– Nog Shine
19年1月8日在18:39

嗨,balpha。我们什么时候要更改帮助信息?例如。提问右侧的“如何格式化”等。

– iBug说恢复莫妮卡
19年1月9日,下午5:56

我刚刚更新了如何格式化代码块?

–user289905
19年1月9日,14:47

我们还应该更新“使所有代码缩进4个空格”错误。它可能不会在三重反围栏上触发,但是会在~~~围栏上触发吗?此外,它还应提及受保护的代码块作为替代。

–user289905
19年1月9日15:06



@Xufox在“未格式化代码”检测器上调用良好。解决该问题的方法正在酝酿中。另一方面,建议在很多地方使用缩进。一旦代码围栏工作了一段时间,我们可能会重新考虑应该采用哪种方式创建代码块。

– balpha
19年1月10日在10:45

我只是告诉某人,三行反引号在主行上不起作用,然后在我尝试并行之有效时不得不吃我的话。能否请您发表这篇文章或发布单独的公告?考虑到较大的先前格式错误但现在有效的发布率,这是重要的信息。也谢谢你

–安德拉斯·迪克(Andras Deak)
19年1月10日在18:04



您为什么决定要求lang-js,而不是像栅栏代码块的其他常见实现那样的js?

–马蒂亚斯·拜恩斯(Mathias Bynens)
19年1月11日在21:06

@MathiasBynens在SO上指定语法突出显示语言时,总是这样,这就是我在示例中所做的。您可以不使用lang-,这也将起作用。

– balpha
19年1月11日在21:10

我只是在事发7天后意外地注意到了这一点。有一阵子我以为我发疯了-“为什么我的GFM突然对SO有效?!!?”

– Binki
19年1月16日在19:16

另一个受害者。 (有人试图将工作格式更改为等效的工作格式;这只能是由于缺乏信息而引起的。)

–安德拉斯·迪克(Andras Deak)
19年1月17日在10:20



#2 楼

好处


与GitHub-Flavored Markdown以及其他支持该事实标准(可能还有其变体)的Markdown库的兼容性。这样就可以从存储库中的摘要或Markdown文件复制粘贴,这在与编程相关的站点(如Stack Overflow)上很有用。
也在数据库中节省一些存储空间! ;)

以上所有优点都适用于新语法,即使没有指定编程语言的附加功能也是如此。使用该功能,我将添加另一个(巨大)好处:


由于使用这种语法(与当前语法相比)来指定代码块的语言要容易得多,如果此更改使更多的人显式声明编程语言,则不会感到惊讶,这样语法突出显示可以更准确。这对于包括例如单独的HTML和CSS代码块。

缺点

老实说,我想不出什么。由于它不起作用,很可能目前没有人在使用三重反引号语法。所以我怀疑它不会破坏任何东西。如果您不喜欢新语法,请继续使用旧语法。

经验

自从GitHub启用此语法以来,我已经习惯了它。我♥三重反引号语法,每当我被迫回到四空格缩进语法时,都会感到尴尬。

评论


159个地方有三次反引号(不过,我很害怕搜索双重反引号):data.stackexchange.com/stackoverflow/query/edit/76842据我所知,实现它们不会破坏任何地方这个。

– Ry-
2012年8月9日15:20

@minitech感谢您的查询。我看到了一些可能会引起问题的信息,但是只有159个结果,因此要手动验证每个正确或固定(如果已实施)的可能性不超出范围。

–服务
2012年8月9日15:23

@Servy我什至会自愿尝试手动验证这些,以确保获得此功能!

–迈克尔·加斯基尔
16年5月21日在1:52

@MichaelGaskill我会帮助!

– Doktor J
18年5月17日在17:46

#3 楼

我真的不在乎这是否得以实现:这是Markdown的多余扩展(与内联HTML,扰流器markdown或尚未在堆栈交换表中实现的表语法不同),但是它确实是确实,栅栏代码块已添加到几乎每个Markdown库中,而这些库不仅遵循原始规范。据我所知,Mathias Bynens将其描述为。
据我所知,有防护的代码块首先在PHP Markdown Extra库中引入如下:

有防护的代码块就像Markdown的常规代码一样块,只是它们没有缩进,而是依靠开始和结束栅栏线来界定代码块。代码块以包含三个或更多波浪号〜字符的行开头,以具有波浪号〜的相同数量的第一行结束。例如:
This is a paragraph introducing:

~~~~~~~~~~~~~~~~~~~~~
a one-line code block
~~~~~~~~~~~~~~~~~~~~~


其他实现也紧随其后,要么仅支持3+波浪号,要么同时支持3+波浪号和3+反引号。我浏览了我所知道的实现,以及Wikipedia的(不完整的)实现列表(在GitHub崩溃之前),发现:
仅支持3+波浪号语法:

PHP Markdown Extra
Python Markdown
折扣
Pegdown

仅支持三重反引号语法:

ByWord
元素

PEG Markdown Highlight(和派生的Qarkdown)

R Markdown(仅文档三重反引号,但基于同时支持两者的Sundown)
markdown-clj
Showdown

同时支持:

CommonMark规范

标记的应用程序

日落(和衍生的红地毯)

/> GitHub(仅记录了三次反引号,但都可以很好地解析)
Blackfriday
Doxygen
Pandoc
Parsedown
Markdown-it

都不支持或未指定:

mm2pdf

peg-markdown和peg-multimarkdown

MarkdownSharp
libupskirt
MarkdownJ
Txtmark
Pagedown

Dillinger (将三重反引号代码块作为内联代码处理)

基于此,我认为Stack Exchange应该支持波浪号语法,三重反引号语法和3+反引号语法。奖励:支持波浪号语法或3+反引号语法应可解决死键问题。
语法工具栏应按照原始Markdown规范继续缩进4个空格的代码,否则,应该使用tilde语法,该语法具有原始版本的优势,与GitHub兼容,并且现有实现稍加支持。

评论


优秀的研究!支持语法的所有变体以消除死键问题的好处。

–马蒂亚斯·拜恩斯(Mathias Bynens)
2012年8月16日上午8:09

感谢您的出色研究。我仍然不是100%肯定我们应该这样做,但是此答案包含了很好的信息,可以作为决策依据。

– balpha
2012年8月17日在9:49

“奖励:支持波浪号语法或3+反引号语法应该可以解决死键问题。”:虽然我同意你的说法,但最后一个是错误的。在我的标准葡萄牙语键盘中,`和〜都是死键。

– JMCF125
14年2月16日在18:49

代字号和反引号在瑞典语键盘上也都是死键。

–埃米尔·维克斯特伦(EmilVikström)
2014年4月2日在18:00

@ JMCF125:如果您按两次死键会发生什么?是的,它好像没有死,两次。

–重复数据删除器
2015年11月3日,1:11

@ user149432,问题是Github占人口的90%,因此,如果Github支持它...。

–起搏器
16-2-18在20:22



是的,我必须同意@Pacerier。这样列出库,使〜和```同样受欢迎。实际上,Github庞大,而且并非所有库都同样受欢迎。

– Timmmm
17年9月25日在14:06

Doxygen支持波浪号和反引号语法

–阿尔伯特
18-10-2在8:51

死键问题链接回此答案。意向?

–lucidbrot
18-11-19在13:58

除非kb布局不正确,否则死键不会有太大的问题-两次输入死键应产生一个字符。是的,芬兰布局与瑞典布局共享这两种布局(但我们也有一种布局带有数以百万计的固定键)

–安蒂·哈帕拉(Antti Haapala)
19年1月14日在6:53

#4 楼

在Stack Overflow上,我一直看到这种情况发生在不了解语法的人身上。

class Foo {

public static void main(String[] args) {
    // y my code no is working
    Sytem.out.println(qrew3r);
}


}

有些人停在那儿,因为它已经足够近了,所以从不修复它。其他人则发现,第一行和最后一行不是代码块的一部分,因为它们没有缩进。因此,他们缩进了这两行-仅缩进了这两行-因为编辑器没有提供明显的缩进整个块的方法。

class Foo {

public static void main(String[] args) {
    // y my code no is working
    Sytem.out.println(qrew3r);
}
}


有一个站点会系统地使新手发布格式错误的问题。无论您是否喜欢受防护的代码块,当您查看用户犯的所有错误时,您都必须意识到当前的UX已损坏。

评论


...“编辑器没有提供明显的方式来缩进整个块”。尽管不明显,但有一个:选择块后,按Ctrl + k。 (在Mac上为⌘+ k)

–于富兰
16 Sep 17 '23:53



@FranklinYu哦,我不知道。谢谢。

–ArchNoob
17年4月13日在17:49

在Python中,情况甚至更糟,在Python中,您通常实际上无法分辨代码应该做什么。在大括号分隔的语言中,您可以克服错误的格式。

–丹尼尔·H
17年12月19日,1:12

是的,这确实很烦和不直观。我必须用谷歌搜索如何解决这个问题,然后回到StackOverflow写下答案。与列表和长行代码结合使用时,问题将变得更大。

–aldok
18年1月23日在2:28

#5 楼

您当前可以指定要突出显示语法的语言。

示例:

<!-- language: lang-js -->

    //JS code...


这不应该阻止这个问题,甚至是加上因为他们不再需要对该功能进行编码。 />

评论


很高兴知道-谢谢!听起来像是将三重反引号语法转换为幕后的现有语法的正则表达式可能是一种快速解决方案。

–马蒂亚斯·拜恩斯(Mathias Bynens)
2012-03-10 8:14



但是,这不如三次反引号语法好。

– ThiefMaster
2012年3月23日在7:26

github例如使用```php支持相同的功能

– pocesar
13年4月11日在20:35

@ThiefMaster,是的。键入(或什至使用UI)很麻烦,通常我只是不打扰并以“旧方式”进行操作。

–起搏器
16-2-18在20:22

这种<!-语言:lang-js->太可怕了!我总是需要去Google记住确切的语法

– Yves M.
18年5月9日在9:16

#6 楼

包含此语法的另一个原因:有些人已经在使用它。 > This is what it looks like when you put triple backticks above and below multiple lines of text.

By contrast, this is 
a multi-line code block
created by indenting text four spaces.


评论


在1000万个问题上,这个数字相当低:data.stackexchange.com/stackoverflow/query/488893?year = -1

–rene
16年5月20日在20:15

@rene如果您添加了人们同时修复的旧版本,该怎么办?

–吉尔斯'所以-不再是邪恶的'
16年5月20日在20:44

@Gilles uuugghh,可能会杀死SEDE;)我待会再试

–rene
16年5月20日在20:45

@rene您的查询是否包含帖子历史记录中的每个版本?我一直都在查找并修复三重反引号帖子,使其使用正确的语法,并且我想知道“低”数字是否仅由于人为因素而很少。就个人而言,我不介意这样做,但是如果我和其他人不再需要修复这些帖子,我们可以将这段时间用于更有用的事情。

–丹·洛(Dan Lowe)
17年1月14日在22:01

@DanLowe不,该查询未考虑后史。这样做确实可以,但是我限制了日期范围和行数,因为对后历史表进行全表扫描会降低性能,并且如果我获取更多的行则会超时。

–rene
17年1月14日在23:03

#7 楼

另一个主要好处是在列表中标记代码时。在列表中创建阻止代码通常是一个主要的烦恼,对比:

- Bullet 1

 Lorem Ipsum (paragraph 1).

 Lorem Ipsum (paragraph 2).

        var foo1 = bar1;
        var foo2 = bar2;
        var foo3 = bar3;

 Lorem Ipsum (paragraph 3).


到:烦恼的原因是编辑器无法像CtrlK取消缩进一样执行8空格缩进,而不能将4空格转换成8。 “还有空白7个空格还是9个空格?”对比度:

- Bullet 1

 Lorem Ipsum (paragraph 1).

 Lorem Ipsum (paragraph 2).
```javascript
var foo1 = bar1;
var foo2 = bar2;
var foo3 = bar3;
```

 Lorem Ipsum (paragraph 3).


到:

- Bullet 1
 - Bullet 1.1

     Lorem Ipsum (paragraph 1).

     Lorem Ipsum (paragraph 2).

            var foo1 = bar1;
            var foo2 = bar2;
            var foo3 = bar3;

     Lorem Ipsum (paragraph 3).


双嵌套列表会变得更糟。对比度:

- Bullet 1
  - Bullet 1.1

   Lorem Ipsum (paragraph 1).

   Lorem Ipsum (paragraph 2).
```javascript
var foo1 = bar1;
var foo2 = bar2;
var foo3 = bar3;
```

   Lorem Ipsum (paragraph 3).


到:

- Bullet 1
 - Bullet 1.1
     - Bullet 1.1.1

         Lorem Ipsum (paragraph 1).

         Lorem Ipsum (paragraph 2).

                var foo1 = bar1;
                var foo2 = bar2;
                var foo3 = bar3;

         Lorem Ipsum (paragraph 3).


希望在列表中插入块代码将减少耗时更新后。

#8 楼

另一个(非常)小的好处是您可以使用此语法来拆分代码块。例如,此代码(呈现在引擎中)将创建三个单独的块,这些块之间的中断非常紧密:

缩进样式为无缩进线(无论您插入了多少)都不会破坏盒子:

```
block1
```
```
block2
```
```
block3
```


评论


只需在代码块之间插入<!->。我很想编辑您的答案以显示它,但是最好自己尝试一下。

– Glorfindel
17年8月2日在20:16



<!>就足够了。还有<?>(这是三个相邻的键,但是顺序不对)和许多其他变体。我喜欢。

–斯科特
19年2月13日在7:00



我总是根据情况使用空注释<!-->或水平线-

–phuclv
19年5月24日在5:01



#9 楼

我只能看到的缺点是不清楚哪种方法是正确的。但是总的来说,对于像我这样不想使用上方按钮或空格的人来说,这是一个很棒的功能。

评论


但是没有“正确的方法”。所有可行的方法都是正确的。

–埃米尔·维克斯特伦(EmilVikström)
2014年4月2日在18:01

#10 楼

我从中看到的主要好处是,您无需包装即可在编辑框中看到更多代码。使得指定语言更容易一点也很不错,但是我发现标签在大多数情况下都可以解决。它将使修复代码格式变得更加容易。您已经可以选择行并单击“代码示例”按钮以添加第一级缩进。从那里开始,添加额外的缩进量是相同的工作-复制四个空格并使用CTRL-V作为每行的Tab键,或者复制到编辑器中,修复然后复制回去。我认为能够选择多行并多次缩进/缩进将比这有用得多。至少对我而言,确实没有所见即所得的感觉。使用相同的顺序来开始和结束格式化的部分也可能会造成一些混乱,特别是在帖子中有多个代码块的情况下。或自定义html标签(例如```),或仅允许{{{标签跨越多行以创建一个块。或者,与指定语言结合使用,例如:}}}

评论


当您同时使用制表符和空格时,这也很有帮助。

– Ry-
2012年8月9日15:36



@bemace我知道您可以选择行,然后单击“代码”按钮,但是作为沉重的键盘用户,我发现键入三个反引号,一个换行符,Cmd + V,另一个换行符和三个关闭反引号会更快。

–马蒂亚斯·拜恩斯(Mathias Bynens)
2012年8月9日15:36

我喜欢语言标记 的想法。

– gobernador
2012年8月9日17:35

但是,当几个现有的Markdown实现已经支持三重反勾号语法时,为什么要发明一种新的语法呢?与其他Markdown版本的互操作性(以及复制粘贴性)是恕我直言的一大优点!

–马蒂亚斯·拜恩斯(Mathias Bynens)
2012年8月9日19:05

正如我所解释的,@ MathiasBynens带有多个以```分隔的代码块,这些代码块由一行或两行文本分隔开(这在Stack Overflow中很常见),试图确定哪个```正在开始一个代码块会变得非常混乱,并且哪些结束了代码块-或者更确切地说,哪些行是代码,哪些行是文本。

–布拉德·梅斯(Brad Mace)
2012年8月9日19:08



@bemace如果遵循支持该语法的现有Markdown实现,将不会造成混淆。三重反引号代码块需要前后两个换行符(除非它们在输入的开头或结尾)。

–马蒂亚斯·拜恩斯(Mathias Bynens)
2012年8月16日在8:06

@BradMace,如果没有实质性的改进,发明新语法实际上甚至会更加令人困惑。使用Github的人比SE的人更多,跟随它没有害处。

–起搏器
16-2-18在20:22