如何在 Atom 中用空格替换制表符?
How to replace tabs with spaces in Atom?
当我开始使用 Atom 文本编辑器时,我使用了制表符缩进,但想更改为 4-space-缩进。
我有几个文件需要相应更新
最简单的方法是什么?
我经过一些研究发现的一个简单解决方案是使用 "Replace All" 工具。
只需打开每个文件,然后打开查找面板(cmdF in Mac)。
在当前缓冲区中查找(激活 use regex
选项):
\t
在当前缓冲区中替换:
#that being just four spaces
Atom 对此有一个 built-in 工具
激活命令面板(ShiftCmdP on Mac, CtrlShiftP on Windows/Linux) 并搜索 "convert space" 或 "convert tab"。您应该会发现这三个命令可用:
- 空白:将空格转换为制表符
- 空白:将制表符转换为空格
- 空白:将所有制表符转换为空格
转换标签与转换所有标签
在评论中您观察到使用 "Convert Tabs to Spaces" 会破坏 Python 中的缩进,但 "Convert All Tabs to Spaces" 工作正常。你问这两者有什么区别
我不知道答案,所以我去找了。这是在 "whitespace" 包中定义的,其源代码可以在 Github at atom/whitespace.
上找到
查看 lib/whitespace.js,我发现了这个:
'whitespace:convert-tabs-to-spaces': () => {
let editor = atom.workspace.getActiveTextEditor()
if (editor) {
this.convertTabsToSpaces(editor)
}
},
'whitespace:convert-spaces-to-tabs': () => {
let editor = atom.workspace.getActiveTextEditor()
if (editor) {
return this.convertSpacesToTabs(editor)
}
},
'whitespace:convert-all-tabs-to-spaces': () => {
let editor = atom.workspace.getActiveTextEditor()
if (editor) {
return this.convertTabsToSpaces(editor, true)
}
}
如您所见,这里的相关函数是convertTabsToSpaces
。在 "convert all" 变体中,唯一的区别是传递了第二个(可选)参数,并将其设置为 true
.
return this.convertTabsToSpaces(editor, true)
查看 convertTabsToSpaces
的定义,不同之处在于正则表达式根据此布尔参数的状态进行更改。
convertTabsToSpaces (editor, convertAllTabs) {
let buffer = editor.getBuffer()
let spacesText = new Array(editor.getTabLength() + 1).join(' ')
let regex = (convertAllTabs ? /\t/g : /^\t+/g)
buffer.transact(function () {
return buffer.scan(regex, function ({replace}) {
return replace(spacesText)
})
})
return editor.setSoftTabs(true)
}
这里的相关行是:
let regex = (convertAllTabs ? /\t/g : /^\t+/g)
所以在 "convert all" 变体中,正则表达式不关心锚定到行的开头(不使用 ^
),并且每个选项卡都是自己的替换(而不是制表符组被视为单个替换 - \t
与 \t+
).
为什么它打破了 Python 缩进
我不知道你用的是什么文件,但我用了一个像这样的非常简单的测试文件,完全用制表符缩进。
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
使用 "Convert Tabs to Spaces" 后,它看起来像这样:
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
哇!现在是 SyntaxError
。再试一次 "Convert All Tabs to Spaces":
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
发生这种情况是因为在第一种情况下,左边距上的制表符组作为一个集合缩进为space-based缩进。由于正则表达式是 ^\t+
,因此该行是否缩进 1、2、8、24 个制表符并不重要......它们都被替换为单个缩进级别,但由空格组成。
老实说,我不知道那是什么意思...这似乎是一个错误。
在第二种情况下,每个制表符都被转换为等效的 space-based 宽度(即每个制表符被转换为 4 个空格,即使它与另一个制表符相邻)。
这就是您可能想要的。
一个警告:它不再局限于左边距(没有 ^
锚点),因此如果您在其他地方嵌入了制表符,这些也会被转换。根据我的经验,这不是代码中的正常做法,但仅供参考,以防对您很重要。
如果要替换合适的制表符,需要指定长度,否则也会匹配单词间的单个空格。
按ctrl+F第一行输入[\t]{4}和4个空格 第二行
之后我也会推荐安装包python-indent来根据PEP8
处理缩进
包 -> 空格 -> 将所有制表符转换为空格
包 -> 空格 -> 将所有制表符转换为空格
当我开始使用 Atom 文本编辑器时,我使用了制表符缩进,但想更改为 4-space-缩进。
我有几个文件需要相应更新
最简单的方法是什么?
我经过一些研究发现的一个简单解决方案是使用 "Replace All" 工具。
只需打开每个文件,然后打开查找面板(cmdF in Mac)。
在当前缓冲区中查找(激活 use regex
选项):
\t
在当前缓冲区中替换:
#that being just four spaces
Atom 对此有一个 built-in 工具
激活命令面板(ShiftCmdP on Mac, CtrlShiftP on Windows/Linux) 并搜索 "convert space" 或 "convert tab"。您应该会发现这三个命令可用:
- 空白:将空格转换为制表符
- 空白:将制表符转换为空格
- 空白:将所有制表符转换为空格
转换标签与转换所有标签
在评论中您观察到使用 "Convert Tabs to Spaces" 会破坏 Python 中的缩进,但 "Convert All Tabs to Spaces" 工作正常。你问这两者有什么区别
我不知道答案,所以我去找了。这是在 "whitespace" 包中定义的,其源代码可以在 Github at atom/whitespace.
上找到查看 lib/whitespace.js,我发现了这个:
'whitespace:convert-tabs-to-spaces': () => {
let editor = atom.workspace.getActiveTextEditor()
if (editor) {
this.convertTabsToSpaces(editor)
}
},
'whitespace:convert-spaces-to-tabs': () => {
let editor = atom.workspace.getActiveTextEditor()
if (editor) {
return this.convertSpacesToTabs(editor)
}
},
'whitespace:convert-all-tabs-to-spaces': () => {
let editor = atom.workspace.getActiveTextEditor()
if (editor) {
return this.convertTabsToSpaces(editor, true)
}
}
如您所见,这里的相关函数是convertTabsToSpaces
。在 "convert all" 变体中,唯一的区别是传递了第二个(可选)参数,并将其设置为 true
.
return this.convertTabsToSpaces(editor, true)
查看 convertTabsToSpaces
的定义,不同之处在于正则表达式根据此布尔参数的状态进行更改。
convertTabsToSpaces (editor, convertAllTabs) {
let buffer = editor.getBuffer()
let spacesText = new Array(editor.getTabLength() + 1).join(' ')
let regex = (convertAllTabs ? /\t/g : /^\t+/g)
buffer.transact(function () {
return buffer.scan(regex, function ({replace}) {
return replace(spacesText)
})
})
return editor.setSoftTabs(true)
}
这里的相关行是:
let regex = (convertAllTabs ? /\t/g : /^\t+/g)
所以在 "convert all" 变体中,正则表达式不关心锚定到行的开头(不使用 ^
),并且每个选项卡都是自己的替换(而不是制表符组被视为单个替换 - \t
与 \t+
).
为什么它打破了 Python 缩进
我不知道你用的是什么文件,但我用了一个像这样的非常简单的测试文件,完全用制表符缩进。
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
使用 "Convert Tabs to Spaces" 后,它看起来像这样:
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
哇!现在是 SyntaxError
。再试一次 "Convert All Tabs to Spaces":
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
发生这种情况是因为在第一种情况下,左边距上的制表符组作为一个集合缩进为space-based缩进。由于正则表达式是 ^\t+
,因此该行是否缩进 1、2、8、24 个制表符并不重要......它们都被替换为单个缩进级别,但由空格组成。
老实说,我不知道那是什么意思...这似乎是一个错误。
在第二种情况下,每个制表符都被转换为等效的 space-based 宽度(即每个制表符被转换为 4 个空格,即使它与另一个制表符相邻)。
这就是您可能想要的。
一个警告:它不再局限于左边距(没有 ^
锚点),因此如果您在其他地方嵌入了制表符,这些也会被转换。根据我的经验,这不是代码中的正常做法,但仅供参考,以防对您很重要。
如果要替换合适的制表符,需要指定长度,否则也会匹配单词间的单个空格。
按ctrl+F第一行输入[\t]{4}和4个空格 第二行
之后我也会推荐安装包python-indent来根据PEP8
处理缩进包 -> 空格 -> 将所有制表符转换为空格
包 -> 空格 -> 将所有制表符转换为空格