当我开始使用 Atom 文本编辑器时,我使用制表符缩进,但想更改为 4 个空格缩进。
我有几个文件需要相应更新
最简单的方法是什么?
请您参考如下方法:
Atom 有一个内置工具可以实现此目的
激活命令面板(Mac 上为 ShiftCmdP,CtrlShiftP(在 Windows/Linux 上)并搜索“转换空格”或“转换制表符”。您应该会发现这三个命令可用:
- 空白:将空格转换为制表符
- 空白:将制表符转换为空格
- 空白:将所有制表符转换为空格
转换选项卡与转换所有选项卡
在评论中,您观察到使用“将制表符转换为空格”会破坏 Python 中的缩进,但“将所有制表符转换为空格”可以正常工作。您问这两者有什么区别。
我不知道答案,所以我去寻找。这是在“whitespace”包中定义的,其源代码可以在 Github 上找到 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
。在“全部转换”变体中,唯一的区别是传递了第二个(可选)参数,并将其设置为 true
。
return this.convertTabsToSpaces(editor, true)
查看 convertTabsToSpaces
的定义,不同之处在于正则表达式根据此 bool 参数的状态进行更改。
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)
因此,在“全部转换”变体中,正则表达式不关心锚定到行的开头(不使用 ^
),并且每个选项卡都是自己的替换(而不是制表符组被视为单个替换 - \t
与 \t+
)。
为什么它破坏了 Python 缩进
我不知道您使用的是什么文件,但我使用了一个非常简单的测试文件,如下所示,完全用制表符缩进。
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
使用“将制表符转换为空格”后,它看起来像这样:
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
哇哦!现在这是一个SyntaxError
。重试“将所有选项卡转换为空格”:
import foo
class Foo():
def __init__(self):
self.foo = True
def bar(self, a, b):
return a + b
发生这种情况是因为在第一种情况下,左侧边距上的制表符组作为一个集合减少为基于空格的缩进。由于正则表达式是 ^\t+
,因此该行是否缩进 1、2、8、24 个制表符并不重要...它们都被替换为单个缩进级别,但由空格。
老实说,我不知道这有什么意义......这看起来像是一个错误。
在第二种情况下,每个制表符都会转换为等效的基于空格的宽度(即每个制表符都会转换为 4 个空格,即使它与另一个制表符相邻)。
这就是您可能想要的。
需要注意的是:它不再限于左边距(没有 ^
anchor ),因此如果您在其他地方嵌入了制表符,这些字符也会被转换。根据我的经验,这不是代码中的正常做法,但仅供引用,以防它对您很重要。