当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何用Atom中的空格替换制表符?》经验,为你挑选了2个好方法。

当我开始使用Atom文本编辑器时,我使用了tab-indentation但是想要更改为4-space-indentation.

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

最简单的方法是什么?



1> Dan Lowe..:

Atom有一个内置的工具

激活命令面板(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)

因此,在"全部转换"变体中,正则表达式并不关心被锚定到行的开头(^未使用),并且每个选项卡都是自己的替换(而不是将制表符字符组视为单个替换 - - \tvs. \t+).

为什么它打破了Python缩进

我不知道你使用了什么文件,但是我使用了这样一个非常简单的测试文件,用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个空格,即使它与另一个选项卡字符相邻).

这就是你可能想要的那个.

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



2> J0ANMM..:

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

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

屏幕截图显示按空格替换选项卡

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

\t

替换当前缓冲区:

    #that being just four spaces

推荐阅读
地之南_816
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有