Skip to main content
 首页 » 编程设计

replace之如何在 Atom 中用空格替换制表符

2024年06月20日158mate10pro

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

我有几个文件需要相应更新

最简单的方法是什么?

请您参考如下方法:

Atom 有一个内置工具可以实现此目的

激活命令面板(Mac 上为 ShiftCmdPCtrlShiftP(在 Windows/Linux 上)并搜索“转换空格”或“转换制表符”。您应该会发现这三个命令可用:

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

转换选项卡与转换所有选项卡

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

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

如您所见,这里的相关函数是convertTabsToSpaces。在“全部转换”变体中,唯一的区别是传递了第二个(可选)参数,并将其设置为 true

return this.convertTabsToSpaces(editor, true) 

查看 convertTabsToSpaces 的定义,不同之处在于正则表达式根据此 bool 参数的状态进行更改。

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 

哇哦!现在这是一个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 个空格,即使它与另一个制表符相邻)。

这就是您可能想要的。

需要注意的是:它不再限于左边距(没有 ^ anchor ),因此如果您在其他地方嵌入了制表符,这些字符也会被转换。根据我的经验,这不是代码中的正常做法,但仅供引用,以防它对您很重要。