如何使Sublime Text的“改进的Native for循环”增量像普通的for循环一样?

时间:2015-07-11 00:56:40

标签: javascript for-loop sublimetext3 code-snippets

前提

在Sublime Text 3中,当编写JavaScript时,输入“for”会触发插入两个可能的代码片段之一:

for (... {... (Improved Native For-Loop)

for (var i = Things.length - 1; i >= 0; i--) {
    Things[i]
};

for (...) {...}

for (var i = 0; i < Things.length; i++) {
    Things[i]
};

因为原因

有一段时间人们都知道reverse iteration through for loops has better performance。但这样做意味着每个基于数组的操作都必须向后完成,这会导致代码的可读性降低。所有这些麻烦都只是为了在大多数情况下提高性能。

不幸的是,“改进的Native For-Loop ”是第一个建议,并且可能导致一些恼人的情况,当意外选择而不是正常,可读的循环,不会混淆典型的数组约定迭代。

问题

  • 那么,如何更改Sublime Text的行为以不自动为循环添加这些奇怪的东西?即,如何删除该片段建议?
  • 使用更传统的for循环结构时,有没有办法保持轻微的性能提升?如何将其用作Sublime Text片段?

1 个答案:

答案 0 :(得分:6)

清除邪教片段

要删除“改进的”for-loop代码段,请在packages文件夹(Preferences&gt; Browse Packages)中创建一个名为“JavaScript”的文件夹,然后创建一个名为"for-()-{}-(faster).sublime-snippet"的文件在JavaScript文件夹中。在此文件中,放置以下内容:

<snippet>
    <content><![CDATA[$1]]></content>
</snippet>

保存并重新启动Sublime。这将禁用内置的bass-ackwards“改进”循环片段建议。此时,只有正常的 for (...) {...} 代码段才会生效。

关于反向For循环

减少不会提供任何性能提升。性能提高仅仅是因为减少了必须计算数组长度的次数:使用for(i=0;i<Things.length;++i),计算每次迭代的Things.length;使用for(i=Things.length-1; i>=0; --i)Things.length只计算一次。 (见here。)

通过使用以下语法声明一个新变量来保存Things.length的值,可以获得这种温和的性能提升:

for (var i = 0, l = Things.length; i < l; ++i) {}

创建替换代码段

要替换默认的捆绑“改进的”for循环,我们将上述语法添加到for-()-{}-(faster).sublime-snippet文件中。为确保选中Things个占位符,我们使用${1:Things}。新的代码段文件内容应如下所示:

<snippet>
    <content><![CDATA[for (var i=0, il=${1:Things}.length; i<il; ++i) {
    ${1:Things}[i];
}]]>
    </content>
    <tabTrigger>for</tabTrigger>
    <scope>source.js</scope>
    <description>for (... {... Custom Improved For-Loop</description>
</snippet>

请确保该代码段为properly indented请注意,您必须使用制表符而不是空格来缩进。保存并重新启动Sublime。

如果要为另一种语言创建类似的循环,请将内容复制到新文件,并使内容和范围适应该语言。快乐的编码。

编辑:更多高级代码段

这些是我目前使用的一些片段,它们更高级,因为它们使用多个字段(按Tab键在字段之间切换)。此外,还可以通过键入forfor来访问嵌套的循环片段。

文件名:for-()-{}-(faster).sublime-snippet

<snippet>
    <content><![CDATA[for (var ${1:i}=0, ${1:i}l=${2:Things}.length; ${1:i}<${1:i}l; ++${1:i}) {
    ${2:Things}[${1:i}];
}]]>
    </content>
    <tabTrigger>for</tabTrigger>
    <scope>source.js</scope>
    <description>for (... {... Custom Improved For-Loop</description>
</snippet>

文件名:for-nested-js-(faster).sublime-snippet

<snippet>
    <content><![CDATA[for (var ${1:i}=0, ${1:i}l=${2:condition}; ${1:i}<${1:i}l; ++${1:i}) {
     for (var ${3:j}=0, ${3:j}l=${4:condition}; ${3:j}<${3:j}l; ++${3:j}) {
        ${5:statement};
     }
}]]>
    </content>
    <tabTrigger>forfor</tabTrigger>
    <scope>source.js</scope>
    <description>for(..){for... Faster Nested For-Loop</description>
</snippet>