当我开始使用Atom文本编辑器时,我使用了tab-indentation但是想要更改为4-space-indentation.
我有几个文件应该相应更新
最简单的方法是什么?
激活命令面板(ShiftCmdP在Mac上,CtrlShiftP在Windows/Linux上)并搜索"转换空间"或"转换选项卡".您应该找到以下三个命令:
空格:将空格转换为制表符
空格:将标签转换为空格
空白:将所有选项卡转换为空格
在评论中你观察到使用"将标签转换为空格"会破坏Python中的缩进,但"将所有标签转换为空格"可以正常工作.你问两者之间的区别是什么.
我不知道答案,所以我去看了.这是在"whitespace"包中定义的,其源可以在原子/空白的 Github上找到.
在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
,区别在于正则表达式是根据这个布尔参数的状态而改变的.
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
vs. \t+
).
我不知道你使用了什么文件,但是我使用了这样一个非常简单的测试文件,用tab字符完全缩进.
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个空格,即使它与另一个选项卡字符相邻).
这就是你可能想要的那个.
一个警告:它不再局限于左边距(没有^
锚点),因此如果您在其他地方嵌入了制表符,那么这些字符也将被转换.根据我的经验,这不是代码中的常规做法,但仅供参考,以防对您来说很重要.
我在一些研究后发现的一个简单的解决方案是使用"全部替换"工具.
只需打开每个文件,然后打开查找面板(cmdF在Mac中).
在当前缓冲区中查找(use regex
激活选项):
\t
替换当前缓冲区:
#that being just four spaces