如何使 Sublime Text 的 "Improved Native for-loop" 像普通的 for 循环一样递增?
How can I make Sublime Text's "Improved Native for-loop" increment like a normal for-loop?
前提
在 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。但这样做意味着每个基于数组的操作都必须向后执行,并且会导致代码的可读性降低。在大多数情况下,所有这些麻烦只是为了实现最小的性能改进。
不幸的是,“改进的本机 For-Loop”是第一个建议,如果不小心选择而不是正常的、可读的循环,可能会导致一些烦人的情况不会混乱具有典型的数组迭代约定。
问题
- 那么,如何改变 Sublime Text 的行为使其不自动添加这些奇怪的 for 循环呢?即,如何删除该片段建议?
- 有没有办法在使用更传统的 for 循环结构的同时保持轻微的性能提升?我如何将其用作 Sublime Text 片段?
清除异端片段
要删除“Improved”for 循环片段,请在包文件夹(首选项>浏览包)中创建一个名为 "JavaScript" 的文件夹,然后创建一个JavaScript 文件夹中名为 "for-()-{}-(faster).sublime-snippet" 的文件。在此文件中,放置以下内容:
<snippet>
<content><![CDATA[]]></content>
</snippet>
保存并重启 Sublime。这将禁用内置的 bass-ackwards“Improved”循环片段建议。此时,只有正常的 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>
前提
在 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。但这样做意味着每个基于数组的操作都必须向后执行,并且会导致代码的可读性降低。在大多数情况下,所有这些麻烦只是为了实现最小的性能改进。
不幸的是,“改进的本机 For-Loop”是第一个建议,如果不小心选择而不是正常的、可读的循环,可能会导致一些烦人的情况不会混乱具有典型的数组迭代约定。
问题
- 那么,如何改变 Sublime Text 的行为使其不自动添加这些奇怪的 for 循环呢?即,如何删除该片段建议?
- 有没有办法在使用更传统的 for 循环结构的同时保持轻微的性能提升?我如何将其用作 Sublime Text 片段?
清除异端片段
要删除“Improved”for 循环片段,请在包文件夹(首选项>浏览包)中创建一个名为 "JavaScript" 的文件夹,然后创建一个JavaScript 文件夹中名为 "for-()-{}-(faster).sublime-snippet" 的文件。在此文件中,放置以下内容:
<snippet>
<content><![CDATA[]]></content>
</snippet>
保存并重启 Sublime。这将禁用内置的 bass-ackwards“Improved”循环片段建议。此时,只有正常的 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>