Definitelytyped: 制表符与空格?

创建于 2014-02-18  ·  44评论  ·  资料来源: DefinitelyTyped/DefinitelyTyped

If 正在针对定义运行一些代码,并且对 repo 是如何混用制表符和空格感到震惊。

我们可以组织一场战斗来决定标签还是空格,但没有人会赢。

也许我们应该坚持使用原始创建的任何风格并强制执行它?

我认为我们可以在测试器中将检测缩进与 TSLint 结合起来(当我们有 #1314 时)。

Discussion Infrastructure

最有用的评论

没有战斗。 使用选项卡。

所有44条评论

没有战斗。 使用选项卡。

我投票空间!

让内战开始吧! :微笑:

哈哈。 我们不需要那个。 但是你知道......如果我们使用制表符,我们就不会进行这种对话,并且每个开发人员仍然可以按照他/她想要的方式(2 个空格或 4 个空格)完美地对齐他/她的代码。 就是说。

我喜欢标签。
但我认为我们应该坚持 VisualStudio 的默认设置。

缩进大小为 4 的空格(VS 默认值)。
将您的 IDE 设置为为您和每个人都感到高兴的虚拟选项卡。
我只是不喜欢看到 [tab] [tab] [space] [space] [space] 想要与上面一行中的单词对齐的代码。

如果有人想编写 TSLint 规则来强制执行一致的样式(例如:制表符或 4 个空格但不是两者),那么我们将在新测试器中运行它(它具有 TSLint 支持)。

另见https://github.com/palantir/tslint/issues/122

空间! FWIW JS 库使用空格(angular / jquery)

这可能是因为 Crockford: http :

缩进的单位是四个空格。 应避免使用制表符,因为(截至本文撰写于 21 世纪)仍然没有制表位放置的标准。 使用空格可以产生更大的文件大小,但大小在本地网络上并不显着,并且通过缩小消除差异。

既然 TS 是 JS,我们真的应该遵守。

好吧,克罗克福德是一个脾气暴躁的老家伙,所以我对他持保留态度。

不久前,Reddit 上有一个统计数据,有人分析了相当一部分 Github,其中 60% / 40% 支持空格。 我自己和到目前为止我工作的所有地方都是标签(尽管其中很大一部分是 AS3)。 它工作得很好。 代码对齐是浪费时间,但如果需要,智能选项卡在那里也能正常工作。

我想要摆脱的真正祸根是混合_缩进_。 在我们对整个 repo 中的一个或另一个进行热核之前,至少它必须_每个文件_保持一致。

在某些时候,我们会做 #2228,但这是相当大的一步(搞砸了很多归因,所以我们可以让@dt-bot 来做)。

好吧,克罗克福德是一个脾气暴躁的老家伙,所以我对他持保留态度。

同意

如果您感到无聊,我建议您阅读对 JSON.js 的拉取请求。 总是由那些不知道道格略显古怪的方式的人提交的。 他们都被直接拒绝了:-)

刚刚看到这个: https :

    export class EditorOptions {
        public IndentSize: number = 4;
        public TabSize: number = 4;
        public NewLineCharacter: string = "\r\n";
        public ConvertTabsToSpaces: boolean = true;

        public static clone(objectToClone: EditorOptions): EditorOptions {
            var editorOptions = new EditorOptions();
            editorOptions.IndentSize = objectToClone.IndentSize;
            editorOptions.TabSize = objectToClone.TabSize;
            editorOptions.NewLineCharacter = objectToClone.NewLineCharacter;
            editorOptions.ConvertTabsToSpaces = objectToClone.ConvertTabsToSpaces;
            return editorOptions;
        }
    }

多么令人满意@basarat!

CRLF 有点愚蠢,但无论如何。

也许我们应该去做。 我将尝试在所有内容上运行 typescript-formatter,看看会发生什么。

亲爱的主啊,真是个屠宰场……总共 562 个 .d.ts 文件,其中 446 个文件已更改。

https://github.com/Bartvds/DefinitelyTyped/tree/34907936bfc22562f30bb09ee82282ca0515b8b3

https://github.com/Bartvds/DefinitelyTyped/commit/34907936bfc22562f30bb09ee82282ca0515b8b3

抱歉,我们无法显示整个差异,因为更改了太多文件 (446)

呵呵。

也做了测试:

https://github.com/Bartvds/DefinitelyTyped/tree/46f9d17b2b074c887bff35b06112070b28924248

https://github.com/Bartvds/DefinitelyTyped/commit/46f9d17b2b074c887bff35b06112070b28924248

抱歉,我们无法显示整个差异,因为更改了太多文件 (442)。

好的。 所以我们拥有技术,这是最容易的部分。 但是现在需要决定这是否是我们想要的东西,因为它会产生一些严重的影响。

一方面,归因将走向地狱。 如果我们接受这一点,那么我们可能应该在测试器中强制执行格式。 我在测试器中设置了 TSLint(但它已禁用),因此可以做很多事情。

也许我们应该将测试器改进为可以运行格式化程序并执行测试的 CLI 实用程序,以一种很好用的方式(它现在可以在本地工作,但应该使用干净的 CLI api 等进行改进)。

我说越快越好。 但好消息是你不会丢失过错历史。 我希望 GitHub 在他们的差异视图中也实现了这个功能。

是的,但它糟糕的是git blame -w -M不能在线工作。 我刚刚通过电子邮件向 Github 支持人员发送了邮件。

@Bartvds ,GitHub 有什么回应吗?!

目前无法忽略 GitHub 指责视图上的空格,但我们可能会在未来添加它。 感谢您的建议,我会将其添加到功能请求列表中,以便团队可以看到。

所以可能需要一段时间,如果有的话。

我不在乎任何所谓的“万事通”或“风格指南”怎么说——缩进的制表符是在涉及对齐时保留开发人员意图的唯一方法。 请参阅我的博客文章

use-tabs-for-indentation-spaces-for-alignment-anim

代码对齐(在您的情况下在var=上对齐)概念很好。 但是在重构中很难维护。 所以我只是不使用它。 自动格式化工具也不尊重它,例如TypeScript 中的自动格式化代码

也为

  public string FirstName { get; set; }        =>  public  string  FirstName { get; set; }    
  public string Surname { get; set; }          =>  public  string  Surname   { get; set; }
  public int Age { get; private set; }         =>  public  int     Age       { get; private set; }
  private Address Address { get;  set; }       =>  private Address Address   { get; set; } 

添加一个新属性,您需要 _reformat_ 所有这些行。 不是一个好的代码更改来审查。

您的工作流程可能有所不同,并且可能允许这样做。 它确实让阅读变得更容易(代码即艺术),但我还没有设法体验团队移动它。

这是最奇怪的事情。 我对混合制表符和空格的想法的本能反应是颤抖并认为“这太肮脏了!”

我知道这完全不合理——但完全是真诚的。 人类真是奇怪...

@johnnyreilly你是一个普遍误解的受害者。 使用制表符进行缩进和使用空格进行对齐与 _mixing_ 制表符与空格不同。 您显然没有阅读博客文章。

使用选项卡进行对齐是为什么这么多人完全关闭选项卡的原因,因为人们做错了。 如果他们一开始就做得正确,那么当他们改变编辑器的偏好以显示不同大小的选项卡宽度时,没有人会注意到。 这就是上面的动画 gif 试图展示的,人们是如何做错的。

@basarat ,我完全同意你的看法。 我很少在代码对齐的项目上工作,但我不时看到它。 如果你能以某种方式强制你的项目的开发人员根本不使用对齐,那么我会说去吧。 否则,对于缩进的空间,除了将代码解析为 CST(方式矫枉过正)之外,除其他外,linting 工具无法区分用于缩进的内容与用于对齐的内容。

当然,在这个现代时代,不使用空格作为缩进还有许多其他原因。 编辑器很好地处理制表符,但他们从来没有处理过空格。 箭头键导航、删除、退格——他们只是不把一个空格缩进当作一个单位。 我使用过 Visual Studio、Sublime、PHPStorm 和 Notepad++,但它们都存在缩进空格的基本问题。

箭头键导航、删除、退格——他们只是不把一个空格缩进当作一个单位。

导航:我使用 ctrl + 箭头键。 他们跳空格(实际上都是空格)+单词。

对于删除/退格:对于单词选择,我使用扩展单词(来自 resharper 默认值的 ctrl+w)和取消扩展选择(ctrl+shift+w)。 我很少需要选择 _inside_ 空格,只需使用制表符(增加缩进)和移位制表符(减少缩进)。

@jedmao实际上我理解你的意思——我只是在分享我的本能(和非理性)反应。 我没有说这是有道理的 :smile:

@johnnyreilly问题。

@basarat我在您的一些空白场景中使用HomeEnd键。 我曾尝试使用Ctrl + arrow key导航,但它并不总是有效。 这就是为什么我很少出于心理一致性而使用它。 考虑以下示例:

for (var i = 0; i < 10; i++) {
    if (i > 5) {
        console.log('I am greater than 5');
    }
}

假设我的光标在第 3 行的开头,我想导航到第 2 行的开头。

在 Sublime 中使用您的技术,我可以通过以下两种方式之一进行操作:

  • UpHold CtrlLeftRelease Ctrl (4 个逻辑步骤)
  • Hold Ctrl , Left , Release Ctrl , Up , Hold Ctrl , Right , Left , Release Ctrl (8 个逻辑步骤)

在 Visual Studio 中,第二个场景可以减少到 7 个逻辑步骤。

  • Hold Ctrl , Left , Release Ctrl , Up , Hold Ctrl , Right , Release Ctrl (7逻辑步骤)

对于实际的制表符,最短路径只有 2 个逻辑步骤,没有修饰键。 不能更简单。

  • Left , Up

我看不出单词选择将如何帮助删除或退格间隔缩进。 我正在 Visual Studio 中尝试,但没有成功。 这就是我为 Visual Studio创建

对于实际的制表符,它始终是没有修饰键的 2 个逻辑步骤。 不能更简单

:+1: 我看到了你的优势。 但是,当我编辑此评论时,ctrl 等的工作方式与我的 VS 相同,因此我的习惯得以延续;)

我看不到单词选择将如何帮助删除或退格间隔缩进

我的不好,我的描述令人困惑。 忽略“字”选择位。 只关注I rarely need to select inside whitespace though, just use tab (increase indent) and shift tab (decrease indent).它适用于间隔缩进就好了。

对于实际的制表符,它始终是没有修饰键的 2 个逻辑步骤。

关于什么 :

public  string  FirstName { get; set; }    
public  string  Surname   { get; set; }
public  int     Age       { get; private set; }
private Address Address   { get; set; } 

Age的开头到更改Surname的类型,即前一行的string不会与Ctrl场景相同吗?

@basaratTabShift+Tab ; 不过,通常用于多行代码。 我想您可能会说Shift+Tab是选项卡上backspace按键的一个很好的别名,但它显然不像backspace那样简单或直观。

Ctrl+Delete将是最接近Delete键的别名,但它有可能删除多个缩进; 而选项卡上的一个简单的Delete键只会删除一个缩进。 有时工作而不是其他人是我根本不使用它的原因(心理一致性)。

我和你一样,也很少(如果有的话)需要选择内部空白。 我从来没有建议过我会这样做。 我不是选择空白,而是通过它导航到某个地方。 上面的对齐示例绝对是我使用Ctrl + arrow key导航的时候。 这就是为什么,正如我之前所说,我很少使用Ctrl + arrow key导航,因为您指出的场景可能是我使用它的唯一情况。

归根结底,最让我烦恼的是,在带有用于缩进的制表符和用于缩进的空格的文件之间切换时,您必须完全改变您的肌肉记忆。 在带有用于缩进的制表符的文件中什么是有效的(最少的逻辑步骤)在带有用于缩进的空格的文件中根本不起作用。 你可以责怪编辑没有给你无缝的体验,但这不公平,因为编辑几乎不可能(没有 CST)在一个文件中做出假设,在文件中有缩进空格,什么是缩进,什么是对齐。

更令人沮丧的是,人们很难认出它。 缩进的空间是纯粹的邪恶......带有角。

定论? 我只是想贡献,你到底在用什么?

定论? 我只是想贡献,你到底在用什么

每个文件一致。 不要将这些混合在一个文件中

@basarat漫画错了。 我们都知道苹果公司的人会使用空格,而微软的人会使用制表符。

@jedmao我是 ms 人,我使用空格 :)

我认为#4211 是个不错的提议。

我建议使用 2 个空格,就像在airbnb/javascript styleguide 中所做的那样......

建议:使用被输入的图书馆规定的编码标准。 如果正在键入的库使用空格、单引号和 LF,则在类型定义中执行相同的操作。 这样我们就可以避免空格与制表符的争论。

唯一的问题是执行这条规则并不容易。 如果您需要强制执行它并具有完全一致性,那么我建议您使用最流行的约定。 根据这个网站,它是空格和单引号。

我的个人偏好是空格 (4) 和 _double_ 引号,但如果单引号意味着一切都是一致的,我也可以使用单引号。

pro-tab 和 pro-tab-space 用户能否接受类似的妥协?

我个人的偏好是空格 (4) 和双引号,但如果单引号意味着一切都是一致的,我也可以使用单引号。

@glen-84 纯粹是为了您的娱乐......这里为什么编译器团队使用双引号: https :

  • JSON
  • 适用于所有语言,因此减少了认知负担

我个人使用单引号,因为我发现自己专门做越来越多的 TypeScript :rose:

我认为它也更清晰一点,它是 57% 对 43%(差别不大),但我想你必须在某处划清界限。 =)

我喜欢@jedmao在制表符上的点用于缩进和用于对齐的空格。

完全公开:我来自 Go-land,我们有go fmt并且从来没有讨论过关于制表符或空格的讨论。它是用于缩进的制表符和用于对齐的空格,它工作得非常好:+1:

当然是空格。 因为如果它们在其他地方使用,没有人知道如何在不同的编辑器中准确呈现选项卡。

@hinell为什么选项卡在不同编辑器中的呈现方式不同很重要? 它不应该,只要制表符“仅”用于缩进。

我更喜欢标签,特别是因为这个: http :

此页面是否有帮助?
0 / 5 - 0 等级