制表符与空格-在任何情况下,每种情况下正确的缩进字符是什么?[关闭]


84

drupal.org中托管的代码的编码标准建议使用两个空格来缩进代码。其他网站建议使用制表符来缩进代码。

在每种情况下,每种情况下适当的缩进特征是什么?请解释您给出的答案。



13
IDE默认的FTW-只需按Tab键即可查看发生的情况
user281377 2010年

无论您选择什么,整个团队都必须使用它,但是当一个选项卡使用其他空格时,则不能使用。
徒弟

1
我试图对其进行编辑,以更正制表符/空格是缩进代码的唯一方法的含意。编辑已删除,但希望此注释会保留:为什么不使用缩进字符,而不使用左边界?-编辑器可以完全自动化,并且文字处理程序已经做到了数十年。
pgfearo

4
我真的不认为这里应该有一个“可接受的”答案。事实是,票数少的答案实际上首先证明了这一点:为什么问询者仅由于提出了问题,就应该获得特殊的权力(即能够将自己喜欢的答案放在第一位)?
迪恩·哈丁

Answers:


129

空间

根据您的环境,选项卡的列数可以不同,但​​是空格始终是一列。

就构成缩进的空格(或制表符)而言,在整个代码中保持一致比使用任何特定的制表符停止值更为重要。


42
您的第二段是错误的;答案是4!
Daenyth

5
@Daenyth-也许如果您使用的是花括号语言。大多数Pascal / Delphi使用
2。– Gerry

72
当可以动态设置TAB并指示单个缩进级别时,为什么要强制您使用2到4个缩进空间?
JE队列

3
@MGOwen现在,使用css / javascript上的源代码最小化和HTML上的空格删除功能,可以轻松解决网站编码的下载时间参数。看到mod_pagespeed明白我的意思。
Evan Plaice

42
“根据您的环境,一个选项卡可能具有不同的列数”是的,这正是优点。每个人都可以按照自己的喜好设置它并感到高兴。
Andrea

249

标签

现在,当然,一致性比任何一个都重要,而且良好的IDE使差异可以忽略不计。就是说,此线索的重点是一场神圣的战争,因此:

我更喜欢标签:

  • 它们是专门用于缩进的字符
  • 它们允许具有不同缩进大小首选项的开发人员在不更改代码的情况下更改代码的外观(数据和表示形式的分离,以赢得胜利!)
  • 用制表符半缩进是不可能的。因此,当您从某个使用3个空格的网站复制代码到4个空格的缩进文件中时,就不必处理对齐问题。

12
将那3个空格的缩进代码复制到制表符缩进的文件中,该制表符设置为3个空格,该怎么办?当您将代码发送给您的同胞时,他们想知道为什么该函数具有如此糟糕的缩进!
韦恩·沃纳

27
制表符本来不是用于缩进的,它们是用于制表的,并且对此做了可怕的工作……
Timwi 2010年

14
@Timwi:维基百科似乎说它们是用来将光标移到一组固定列的下一个。听起来列表不是主要功能。另外,我指的是后打字机时代。
Fishtoaster

40
加上许多程序员花费大量时间编写html,css等,实际上,具有4个空格而不是制表符的文件的大小实际上是5-15%,这实际上是很重要的。示例:由于SE团队使用了空格,因此您现在所处的页面的加载速度比应加载的速度至少慢10%。检查自己。
MGOwen

23
这种方法的另一个好处-使用箭头键进行左右导航时,按键次数更少。
妮可

117

使用选项卡可以缩进行的开头,每个缩进级别一个选项卡,然后让每个人都选择他们想要的宽度。

如果要一行中对齐字符,请使用空格,因此无论制表符大小如何,它们始终会对齐。

并找到并打败所有早期让这些愚蠢的事情成为问题的软件作者。
(严重的是,为什么还要讨论这个问题?接下来,您将告诉我您也想使用多个字符作为换行符!)


33
是是是是是是。百分之一百是。这样,每个人都可以在保留表格格式的同时设置自己的标签宽度。如果您担心要保留在80列之内(您可能应该这样做!),则只需选择一个任意的最大预期制表符大小(例如4),并在该宽度的制表符边距内。老实说,这是如此困难吗?
乔恩·普迪

是的,但不要在一行中使用空格对齐。您的同事可能正在使用比例字体,因此您的ASCII艺术作品在屏幕上看起来会很奇怪。
paperjam 2012年

3
这是这里唯一正确的答案
J.Ashworth 2012年

76

标签

  • 让错误更明显,对空间进行微管理很烦人。
  • 是一致的,除非注释错误,否则它们仅用于缩进。
  • 是可定制的,您可以在编辑器的选项中指定它们的宽度。
  • 更有效率,为什么要在可以点击1个标签时键入4个空格。
  • 占用的空间少于多个空间。
  • 占用比空间更多的空间。
  • 花更少的时间来完成
  • 倾向于在IDE中更好地工作。

制表符完全无用的地方应使用空格

即使用于对齐参数和注释,选项卡仍然可以更好地工作


24
wrt“生产力更高”,我个人点击了TAB,让IDE进行转换以引入适当数量的空格字符。也许您需要升级:p?
Matthieu M. 2010年

3
-1:更明显的错误:不正确;一致:几乎不是因为可定制:是的,但同时也有缺点;生产力更高:并非如此,几乎所有想法都可以将制表符转换为空格;较小的尺寸:是的,但是实用吗?没有; 更少的时间:没有合理的IDE;往往会工作得更好:如果您使用多种环境和工具
根本就不行

@MaR:明显的错误是正确的,选项卡的宽度更大。还有... Python!制表符是一致的,因为单个制表符是一个缩进,否则您必须定义一个缩进将使用多少个空格。定制是一个优势。您首先使用的是标签页,因此效率更高。似乎您甚至无法给出一个很好的理由,为什么它不切实际,讨厌的人会讨厌...;)
Tamara Wijsman

@TomWij:制表符比等效的空格数大吗?Python实际上是唯一一种正确使用空格来安全使用制表符的语言(但仍然-与“插入空格”相比,它几乎没有优势)。还可以尝试其他语言,旧版环境,差异/合并,终端,sccs,以查看选项卡为何仍然是理想的“理想”。
2011年

@MaR:我在哪里注明“等值空格”?我已经尝试了所有这些选项卡,它们在其中完美地工作了!
Tamara Wijsman

41

制表符的所有参数在理论上都是很好的。但...

在理论上,实践和理论是相同的。实际上,事实并非如此。

是的,使用标签可以确定缩进级别。是的,您可以结合使用制表符和空格来对齐内容。在理想的世界中

实际上,您看不到空格和制表符之间的区别,在移动代码时它们似乎总是混杂在一起,而在另一个将制表符设置为8列的程序中查看代码是很麻烦的。

我曾经使用标签。然后,我开始作为团队的一部分工作并共享代码。我很快成为空间的拥护者。因此,尽管我可以同情标签的乌托邦,但我无法想象不使用空格。


6
您可以得到像Kate这样的编辑器,该编辑器以“ ghost”字符显示标签-在编码时,我可以轻松看到标签与空格。
HorusKol 2011年

8
现在每个编辑器都有一个“显示空白”选项,而Visual Studio则有一个“ tabify”选项
克里斯·S,

2
好理由。这就是我放弃尝试说服人们标签更加合乎逻辑的原因。即使是应该习惯抽象思维的程序员也似乎混淆了制表符和空格(“如果看起来像四个空格,那么它一定是四个空格!”)。对我而言,棺材里的钉子是似乎无法将Emacs配置为仅使用制表符缩进。
Martin Vilcans 2011年

3
+1制表符的乌托邦很棒,但是每次我在不同制表符宽度的编辑器之间移动代码时,代码都会被弄乱和对齐。用制表符默默地做错事太容易了。
Mankarse 2011年

我也曾经使用过选项卡,但是我遇到了一些IDE的麻烦,这些IDE不能为续行插入空格,我讨厌用空格替换所有这些自动插入的选项卡(Visual Studio是其中之一)。所以我只是坚持使用空格。加号空格使您可以对public:C ++类声明中的内容使用一半大小的缩进,以便它们看起来更漂亮(尤其是在嵌套类中)。
szx

31

105
仅仅因为你出名就不能使你正确。
JE队列

@Xepoch:您是否已阅读其基本原理:)?
Matthieu M. 2010年

5
@Matthieu M.,是的,我读过,但仍然不同意。我也不喜欢橄榄,但也不会因为别人喜欢而使我错。我觉得可笑,人们不会用缩进的标签,但是这就是为什么他们称他们CS的圣战......
JE队列

2
@Xepoch:是的,我想每个人都有自己的见解:)我确实认为,尽管Guido指出了主要问题:将制表符和空格混合是有害的,因为它们在用户看来都是“空白”。
Matthieu M.

3
@Fishtoaster:当您说Joel用空格表示时,链接不应该链接到Joel的实际报价吗?该链接仅转到JoelOnSoftware论坛,一些ppl(很可能不是代表Joel发言)讨论制表符与空格。
安德烈亚斯·马格努森


20

I.绝对。讨厌。4.空格。

为什么?主要是因为我厌倦了使用键盘浏览代码并不得不不断点击left left left left以缩进一个缩进的麻烦。这是从早期版本的Notepad ++甚至普通的Windows记事本中诞生的,这些记事本中没有格式按钮。当我在其他所有地方都使用4时,人们只使用3时,我遇到了很多问题。

另一个原因是制表符专门用于缩进,后来才被用于导航。space space space space当简单的tab方法可行时,我们为什么要这样做?当简单的选项卡和首选项可以工作时,为什么IDE必须正确处理2-5个间隔的代码和格式?

不幸的是我是少数。


31
您在浏览键盘代码方面效率低下。您应该使用CTRL + LEFT和CTRL + RIGHT来跳过空白和标记。因此,缩进无关紧要。
Wizard79 2010年

7
这种误解的根源是“存在专门用于缩进的选项卡”?制表符之所以被称为制表符(制表符),是因为制表符是为了制表而不是缩进而创建的,它们在两者上都做得很糟糕。
Timwi's

7
@Lorenzo:您在键盘代码浏览方面效率低下。您应该使用wb(或ege)跳过空白和标记:P
R. Martinho Fernandes 2010年

6
为了进行恶性宣传,请不要对您认为不合格的编辑器施加格式错误的代码。使用标签。
乔恩·普迪

11
@Timwi:抱歉,坏死了,但是计算机制表键并不是为制表而发明的。该键的TYPEWRITER版本是,但是在键盘逐渐演变为可与计算机一起使用时,使用tab键进行缩进的方式超过了制表法,并且“ tab”一词已成为缩进的同义词。COMPUTERS的标签应缩进,并且只有按照惯例,键的名称才能与打字机的名称匹配。您的论点类似于声称计算机返回键旨在开始新行并将光标移至最左端,因为这正是打字机所需要的:)
Beofett

12

我个人喜欢在所有内容中使用制表符,因为每个开发人员都可以控制每个制表符的缩进量。这样,您就可以灵活地进行显示。

话虽如此,我通常会模仿文件中的任何编码样式(因为我花了大量时间进行维护工作)。


3
一旦开始缩进除语句嵌套以外的任何内容,该操作就会中断。例如,如果要在同一列上对齐函数参数,则每行一个。通过混合制表符和空格是可能的,但是非常乏味。
finnw 2010年

2
这一点都不繁琐,因为这意味着您可以在其中的大部分地方使用制表符,然后仅使用几个空格,而不必键入数十个空格即可到达正确的列。
Jordan Reiter

1
@finnw,您假设每个人都在使用等宽字体-2012年,大量开发人员使用比例字体。如果第一个参数的左边有非空格字符,则无法保证后续行上的参数对每个人都对齐。
paperjam 2012年

您从未尝试编写HAML,对吧。
alt

2
我讨厌这样说,但是我无法想象使用可变宽度字体进行编程。它的绝对错误使括号标准,制表符与空格,所有内容…… 相形见 ...。(当您收到带有行号和列号的错误消息时会发生什么?)
Lunchmeat317

10

我认为没有适当的缩进(至少在没有小小的战争的情况下)。

我个人喜欢四个空间。它们使我能够更快地阅读代码,并且在每个编辑器(甚至是Vi)中看起来都一样。


9
vi(或更确切地说,vim)是使用选项卡的更好的编辑器之一,除了能够设置选项卡的宽度并自动扩展到空格(就像大多数编辑器一样)之外,您还可以softtabstop选择和retabretab!命令。
finnw

如果我们只说四个地方,到处都是,总是别无选择,然后继续前进,婴儿真的会死吗?
MGOwen

2
四个空间到处看起来都不一样。现在,越来越多的程序员在其IDE中选择比例字体,以获得更愉快,更高效的编码体验。在这种情况下,四个空格看起来像是一个很小的缩进。
paperjam 2012年

8

空格,因为当您在代码,函数参数列表,复杂的多行表达式或类似性质的右边对齐注释时,您希望您的漂亮作品适合所有人。如果您使用制表符,并且允许人们以不同的方式设置其制表符,则除了最简单的代码缩进以外,其他所有制表符都将中断对齐。

此外,显而易见的是,世界上每个人都应该使用vim,这使得缩进,缩进和浏览“制表位”变得很简单,即使在缩进空间的文件中也是如此。


这是许多编辑人员真正的好功能-能够快速遍历多个土墩和多个土墩。
克里斯汀·曼

18
听起来您是在绘制ASCII艺术而不是编码。
rmac

3
我要补充:制表符不得用于对齐。如果您是制表符用户并想要对齐,则必须首先键入正确数量的制表符以进行缩进,然后键入正确数量的空格以进行对齐。只有这样,您才能看到所有用户和编辑者之间使用标签格式的代码。
2011年

6

制表符是自然的和正统的选择,因为按定义它们用于缩进。

不幸的是,制表符的实现不均匀,因此唯一的现实解决方案是4个空格。


8
由于何时按定义将制表符(制表符)用于缩进?按照他们的定义,他们是为制表而发明的(尽管他们在制表方面也做得很糟糕)。
Timwi's

2
从技术上讲,发明了回车键可以将打字机头移到生产线的前部,而移动到下一行是通过旋转滚轴进行的。之后,返回键也将自动使滚筒前进。您不会看到人们全都挂在回车键上。Tab键显然已添加到计算机以执行缩进。这是制表位的数字模拟,这是我在旧的非电动打字机上安装的。可以将制表位设置为将滚轮移动到您选择的任何位置,这几乎与制表键当前在压痕中的作用相同。
Jordan Reiter

@JordanReiter RE:“虽然您看不到有人将所有人都挂在回车键上。”:您从未遇到过CR(代表将打字机头移到生产线的前端)/ LF(代表旋转滚轮)到下一行)的问题?
Max Nanasy 2012年

1
是的,但这确实是操作系统问题,而不是键盘问题。无论您使用的是哪种计算机,都希望按Enter键或Return键将您带到下一个链接。您无需使用一个键来发布换行符,也无需使用键来返回回车符。
Jordan Reiter 2012年

4

您显然需要一种组合方法。

如果要与其他开发人员共享代码,则需要进行标准化,并且由于这是不可能的(koff koff),因此需要使每个人都做四个空格。

然后,您需要一个足够聪明的编辑器,不要对此感到愚蠢,要知道它应该像缩进一样对待前面带有四个空格的行。任何现代的IDE或程序员的编辑器都可以使用空格而不是制表符来自动处理代码。


4

为什么有人不能实现这一点:

  • 代码以紧凑的格式存储,对相关系统有利
  • 当每个开发人员打开代码时,都会按照他们想要的格式进行格式化
  • 当他们完成后,回到紧凑格式

每个人都很高兴,因为他们都看到了自己的“格式”

这样难吗?


2
因为我没有足够的空闲时间来修复人们使用的所有现有编辑器和IDE,而且即使我这样做,也很难说服所有人进行升级。
彼得·布顿

我确信他们可以将其内置到SVN中,或者找到其他方法将最终工具排除在其中。
阿道夫·大蒜

13
听起来有点像标签。每个开发人员打开文件并获得他们想要的缩进宽度。
rmac

1
您已经可以设置RCS或CVS来使用该indent程序。
JE队列

3
谨慎使用缩进来强制缩进/代码以实现标准化,以免所有格式更改都怪罪 / 注释具有滑稽间距思想的开发人员
Tim Williscroft 2010年

3

空格或制表符-Atwood真正说的是选择一件事并在您的项目中保持一致。代码格式化的唯一圣杯是确保其格式一致,以便在您之后维护您的代码的精神病患者不会被迫永久解决这种情况。

就是说,如果您使用的是Python或其他任何将空格作为实际编程构造的语言,那么使用制表符就无法想象。


4
我使用标签。我不知道您是否完成了任何Python编程,但是相对缩进才是重要的。如果第1行是x的缩进,而第2行是x +1的缩进,则它被认为是更多的缩进。缩进可以是双倍空格,4个空格,制表符,只要您保持一致即可。
Macha 2010年

@Macha-感谢您的反馈。我从来没有从事过Python开发工作,但是我所有的人都告诉我他们使用空格,所以结识使用Tab的人很有趣。
诺亚·古德里奇

3
我在工作中使用python选项卡。它是可怕的。
rhettg

3

我是一个4位数的家伙,制表符不一致。


5
它们如何“不一致”?它们始终是表示单个缩进级别的单个字符。这就是一致的缩进方案的确切定义。(而且您个人可以在不影响其他任何人的情况下,以视觉方式呈现您选择的任何方式都是加号。)
Lightness Races in Orbit 2012年

3

显然,制表符在Delphi中弄乱了东西,所以我不在Delphi中使用制表符。

但是,我使用Emacs进行其他所有操作,并且始终使用制表符,因为制表符正好位于我希望它们移到的位置。


你能提供一个例子吗?我真的很好奇,因为我已经使用Delphi 15年了,从未见过。
GrandmasterB 2010年

1
edn.embarcadero.com/article/10280#4.3这只是样式指南,但是由于选项卡,我们有些无法解释的奇怪错误。也可能是由于Visual Source Safe。我无法解释,这只是我们公司绝杀的一部分。
彼得·特纳

1
问题是(至少)某些版本的Delphi的安装默认设置与通常的Delphi惯用语不匹配。因此,您最终得到了同时具有两者的代码。
格里

3

答案是,在每种情况下都不可能有一个适当的缩进字符。使用字符进行格式化是不灵活的,并且在团队中使用不同样式时可能导致冲突。

使用不同的格式化样式完美而灵活地格式化代码的唯一方法是虚拟地进行编码,即没有任何缩进字符。我知道唯一支持此功能的代码编辑器是以下示例中使用的代码编辑器:

为了证明虚拟格式,下面的截图是从使用这种压痕法的XSLT编辑器*(也有一个简短的视频在这里)。为了说明起见,XSLT中的每个字符都以黄色突出显示,以使内容中唯一的制表符或空格字符清晰可见。代码缩进由编辑器的渲染系统调整左边界(背景为白色)来处理。

在此处输入图片说明

唯一的前导空格字符在Books行之前,因为这是文字文本内容,而不是代码,因此必须保留这些空格字符。

使用虚拟格式时,您可以选择缩进宽度以适合环境和缩进样式,而不会影响源文件中的任何字符。如果需要平整的代码视图,甚至可以将缩进宽度设置为0,如下所示:

在此处输入图片说明

为了与空格字符格式进行对比,在编辑器中打开的没有虚拟格式的同一XSLT将由该编辑器的自动格式化程序转换为以下格式:

在此处输入图片说明

上方屏幕截图中较大的空白黄色块清楚地显示了常规编辑器的格式化程序添加的空格字符。不幸的是,现在无法将它们与实际内容区分开,因此必须修改XSLT才能更正此问题。

摘要

XSLT可能是一个极端的情况,但是该原理对于许多编程语言都适用:字符应用于内容,格式化时应寻求替代方法。

**披露:具有虚拟格式的XSLT编辑器是由我自己的公司开发的*


1
可悲的是,您可能要提前50年。坦率地说,程序是字符序列是一种荒谬的想法,在大多数程序员的脑海中仍然根深蒂固。
汤姆·安德森

3

到目前为止尚未提到:缩进很重要的语言(Python,Haskell)。但是1个字符会算作1个字符,无论是空格还是制表符,因此如果使用制表符,编译器看到的缩进可能与屏幕上显示的缩进不同。

因此,在像Haskell这样的语言中,必须有空格。在Makefile中,必须使用TABS。在其他所有方面,这都是个人喜好问题,如今已不算什么-每个体面的编辑器都具有“(将空格引至空格”和“将空格引至空格”)命令。


2

我曾经使用空格,但是最近我一直在使用制表符,纯粹是因为这是我最终注意到时设置的Eclipse。我们团队中的所有其他开发人员都使用Eclipse,因此当我们意识到我们已经使用它们很久了并且没有理由去更改空间时,对选项卡进行标准化是有意义的。我对未发行的书多少感到惊讶。

在IDE中将显示的制表符大小设置为3或5个字符可以极大地简化区分空格的代码段(目前几乎总是4个)和区分空格的代码段。


1

已经提出了很多论据,但是没有人提到我们将来的发展方向

制表符或空格!

理想情况下,代码应被视为数据,而不应以任何特定的文本格式存储。任何开发人员都可以应用自己的首选视图。此外,该视图不应仅局限于文本,还可以包括表格,颜色选择器和数学公式。

这个想法不是太牵强。是JetBrain的面向语言的编程编辑器元编程系统(MPS)首先使我意识到,这解决了整个讨论,同时增加了许多其他可能性。(是的,这可以通过编辑器插件来实现,但是与MPS所采用的方法相反,直接处理文本会增加很多不必要的复杂性。)

与制表符和空格相反,直接在抽象语法树上工作几乎没有缺点。为了使该技术成熟到商业上可行的产品,需要的只是这些。这种现象的最初迹象正在显现。Realaxy很大程度上建立在商业动作脚本编辑器MPS的基础上,因此被创建。

我希望看到其中一个大公司跳上这项技术的概念,看看会发生什么!


0

都不是更好,也不是更坏。唯一重要的是要保持一致。

如果您是一个团队,请选择您个人喜欢的任何东西。考虑您喜欢的编辑器的默认行为,但是请选择您喜欢的任何东西。

如果您在团队中,请执行团队的工作。期。

在我的各种工作中,我使用了两个空格,四个空格,八个空格,制表符,空格和制表符,我想我可能也使用了一个空格。我告诉编辑器该怎么做,然后我再也不考虑它了,编辑器会确定细节。

唯一的另一件事是确保您选择一个智能编辑器。Emacs还是VI?现在这是一场圣战,我愿意打仗:-)

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.