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

时间:2017-01-25 09:34:35

标签: replace indentation atom-editor

当我开始使用Atom文本编辑器时,我使用了tab-indentation但希望更改为4-space-indentation。

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

最简单的方法是什么?

5 个答案:

答案 0 :(得分:62)

Atom有一个内置的工具

在Mac上激活命令选项板( Shift Cmd P Ctrl Shift P 在Windows / Linux上)并搜索"转换空间"或"转换标签"。你应该找到这三个命令:

  • 空格:将空格转换为标签
  • 空白:将标签转换为空格
  • 空白:将所有标签转换为空格

转换标签与转换所有标签

在评论中您观察到使用"将标签转换为空格"会破坏Python中的缩进,但是"将所有标签转换为空格"工作正常。你问两者之间的区别是什么。

我不知道答案,所以我去看了。这是在"空白"中定义的。包,其源可以在atom/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)

所以在"转换所有"变体,正则表达式并不关心被锚定到行的开头(^未被使用),并且每个选项卡都是自己的替换(而不是将一组制表符作为单个替换 - { {1}}与\t)。

为什么它打破了Python缩进

我不知道您使用的是哪个文件,但我使用了一个非常简单的测试文件,完全缩进了标签字符。

\t+

使用"将标签转换为空格"它看起来像这样:

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 ,如果该行用1,2,8,24个标签缩进,则无关紧要......它们都被一个缩进级别替换,但由空格组成。 / p>

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

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

这就是你想要的那个。

一个警告:它不再局限于左边距(没有^\t+锚点),因此如果您在其他地方嵌入了制表符,那么这些字符也将被转换。根据我的经验,这不是代码中的常规做法,但仅供参考,以防对您来说很重要。

答案 1 :(得分:11)

我在一些研究后发现的一个简单的解决方案是使用"全部替换"工具。

打开每个文件,然后在Mac中打开“查找面板”( cmd F )。

Screenshot showing replacement of tabs by spaces

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

\t

替换当前缓冲区:

    #that being just four spaces

答案 2 :(得分:0)

如果要替换适当的制表符,则需要指定长度,否则它也将匹配单词之间的单个空格。

ctrl + F 并在第一行中输入 [\ t] {4} ,在第二行中输入 4个空格 ctrl-f

之后,我还将建议安装软件包 python-indent 来根据PEP8

处理缩进

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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