缩进-如何用Atom中的空格替换制表符?

在开始使用Atom文本编辑器时,我使用了制表符缩进,但想更改为4空格缩进。

我有几个文件应该相应地更新

最简单的方法是什么?

J0ANMM asked 2020-07-24T22:49:06Z
2个解决方案
70 votes

Atom为此提供了一个内置工具

激活命令面板(在Mac上为ShiftCmdP,在Windows / Linux上为CtrlShiftP),然后搜索“转换空间”或“转换选项卡”。 您应该发现这三个命令可用:

  • 空格:将空格转换为制表符
  • 空格:将制表符转换为空格
  • 空格:将所有制表符转换为空格

转换标签页与转换所有标签页

在评论中,您观察到在Python中使用“将选项卡转换为空格”会破坏缩进,但是“将所有选项卡转换为空格”可以正常工作。 您问两者之间的区别是什么。

我不知道答案,所以我去找了。 这是在“空白”包中定义的,其源代码可以在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)
  }
}

如您所见,此处的相关功能是^。在“全部转换”变体中,唯一的区别是传递了第二个(可选)参数,并将其设置为\t

return this.convertTabsToSpaces(editor, true)

查看^的定义,不同之处在于基于此布尔参数的状态更改了正则表达式。

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

哇! 现在是^。使用“将所有选项卡转换为空格”重试:

import foo

class Foo():
    def __init__(self):
        self.foo = True

    def bar(self, a, b):
        return a + b

发生这种情况的原因是,在第一种情况下,作为集合,将左边缘的选项卡组缩小为基于空间的缩进。 由于正则表达式为^,所以该行是否用1、2、8、24个制表符缩进都没关系...它们全部被单个缩进级别代替,但由空格组成。

老实说,我不知道这是什么意思……这似乎是一个错误。

在第二种情况下,每个制表符都转换为基于空格的等效宽度(即,即使每个制表符与另一个制表符相邻,也都转换为4个空格)。

这就是您可能想要的那个。

一个警告:它不再局限于左边距(没有^锚点),因此,如果您在其他位置嵌入了制表符,则这些字符也会被转换。 根据我的经验,这不是代码的常规做法,但仅供参考,以防万一。

Dan Lowe answered 2020-07-24T22:50:54Z
13 votes

经过研究后,我发现一个简单的解决方案是使用“全部替换”工具。

只需打开每个文件,然后打开“查找面板”(在Mac中为cmdF)。

Screenshot showing replacement of tabs by spaces

在当前缓冲区中查找(已激活use regex选项):

\t

替换当前缓冲区:

    #that being just four spaces
J0ANMM answered 2020-07-24T22:51:27Z
translate from https://stackoverflow.com:/questions/41848002/how-to-replace-tabs-with-spaces-in-atom