如何在 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

处理缩进

-> 空格 -> 将所有制表符转换为空格

包 -> 空格 -> 将所有制表符转换为空格