Sublime Text 3,将空格转换为制表符

227

我知道有很多关于这个的帖子,但我无法让它起作用。
我使用制表符进行编码。是否有一种方法可以始终将空格转换为制表符?即在打开和保存文件时?有人有想法吗?

// 编辑:
我的愿望是以自动的方式实现!->打开、保存或即时转换 有人知道如何做到这一点吗?


我尝试了这个

import sublime, sublime_plugin, os

class ExpandTabsOnSave(sublime_plugin.EventListener):
  # Run ST's 'expand_tabs' command when saving a file
  def on_pre_save(self, view):
    if view.settings().get('expand_tabs_on_save') == 1:
      view.window().run_command('expand_tabs')

这是我的用户设置:

{
    "auto_complete_selector": "source - comment, meta.tag - punctuation.definition.tag.begin",
    "auto_indent": true,
    "detect_indentation": true,
    "draw_white_space": "all",
    "ensure_newline_at_eof_on_save": true,
    "expand_tabs_on_save": true,
    "font_face": "SourceCodePro-Regular",
    "font_size": 10,
    "format_on_save": true,
    "ignored_packages":
    [
        "Vintage"
    ],
    "indent_to_bracket": true,
    "open_files_in_new_window": false,
    "smart_indent": true,
    "tab_size": 4,
    "translate_tabs_to_spaces": false,
    "trim_automatic_white_space": true,
    "trim_trailing_white_space_on_save": true,
    "use_tab_stops": false,
    "word_wrap": false
}

你发布的插件在我这里在ST3,3059版本上运行良好。你能否使用Ctrl + ~打开控制台并查看是否有任何插件错误?如果你已经安装了Package Control,你能否查看ExpandTabsOnSave是否被列为已安装的插件? - angerson
疯狂的程序似乎已经安装了(列在软件包列表中),但是在控制台中我找不到任何错误 :-( - chris
尝试在插件中添加print("debug")或类似的语句,以查看它是否在保存时执行。 - angerson
哇,它终于可以工作了!原来是在 Windows 机器上错误的目录,包列表在 user/.../AppData/Roaming/SublimeText3/Packages 中。非常感谢! - chris
在运行命令之前,请确保将该视图设置为窗口的活动视图。虽然可能性不大,但由于您发布了它,它有可能会扩展不同页面的选项卡而不是您尝试保存的页面。即使使用了焦点视图,我想仍有可能保存到错误的文件,但至少可以将风险降至最低。 - skuroda
11个回答

478

在您的 Sublime Text 窗口右下角,您会看到一个缩进指示符,它看起来非常像这样:

Indentation options menu

点击它会打开一个菜单,其中包含调整缩进偏好设置以及更重要的「将缩进转换为制表符/空格」选项。

enter image description here

相同的菜单也列在「View(视图)」下的「Indentation(缩进)」下面。


48
是的,我知道。我的愿望是让这个自动化......你有什么想法? - chris
3
@chrisツ 啊,你能重新格式化你的问题让它更加明显吗?我错过了你的意思,其他人可能也会错过。 - angerson
我底部没有那个状态栏 - 我该怎么办才能得到它? - geoidesic
1
这将在整个文件上执行,并且不能仅在选择部分上执行。 - not2qubit
非常好。我也使用了“command-a”选择全部,“command-[”取消缩进,然后使用“edit > line > reindent”修复文件。我相信这可以构建成一个宏。 - Brooks DuBois
1
这里值得注意的是,在Sublime中,当您选择代码中的缩进时,如果它是制表符,则应该看到一条直线----,如果是空格,则会看到点号.... - Shahroq

134

在Sublime窗口底部,你会看到代表tab/空格设置的内容。

然后你会得到一个下拉菜单,其中包含许多选项。你关心的选项有:

  • 将缩进转换为空格
  • 将缩进转换为制表符

将所需的设置应用于整个文档。


3
希望所有打开的文件都可以自动进行排版格式转换,将空格缩进转为制表符,且希望这个过程是在加载时自动完成的 :-) - Filip OvertoneSinger Rydlo
1
我明白你的意思。我更喜欢使用制表符,但我理解为什么很多代码是用空格编写的。使用空格可以避免IDE之间的不一致性 - 空格就是空格。制表符在IDE之间可能占据可变数量的空格,使代码看起来很奇怪。 - erier
你好 @Green - 它有什么问题?让我们解决这个问题... - erier

92

就像您可能已经知道的那样,您可以在Preferences.sublime-settings中自定义缩进设置,例如:

"detect_indentation": true,
"tab_size": 4,
"translate_tabs_to_spaces": false

这将设置你的编辑器使用4个空格宽的制表符,并覆盖默认行为,使Sublime匹配你正在编辑的文件的缩进。使用这些设置,重新缩进文件将导致任何空格被替换为制表符。

至于在打开文件时自动重新缩进,这并不那么容易(但可能不是一个好主意,因为空白更改会对文件差异造成破坏)。更好的做法是:你可以映射重新缩进的快捷方式,只有当你打开需要修复的新文件时才调用该功能。


只是一个提醒如何进入设置。按下 command + shift + P,然后输入“settings”,它会出现两个窗口,在右侧的选项卡中放置 @justin 的答案中的代码,确保它仍然是有效的 JSON。 - dss

15
您可以使用命令面板来解决此问题。
步骤1:按下Ctrl + Shift + P(以激活命令面板)。
步骤2:键入“缩进”,选择"Indentation: Convert to Tabs"

最佳解决方案。谢谢! - Matthew K

8
在我的情况下,这行代码解决了问题:
"translate_tabs_to_spaces": false

5

以下是一个解决方案,每当您打开文件时,它会自动转换为选项卡。

创建此文件:.../Packages/User/on_file_load.py

import sublime
import sublime_plugin

class OnFileLoadEventListener(sublime_plugin.EventListener):

    def on_load_async(self, view):
        view.run_command("unexpand_tabs")

注意:即使没有进行实际的空格转制表符操作,该操作会导致文件在打开后处于未保存状态...也许有人可以帮忙解决这个问题...


我认为你是指 .../Packages/User/on_file_load.py,而不是 .php - Pranav Nutalapati
@PranavNutalapati 谢谢你发现了这个问题。 - TheStoryCoder
没问题,当然可以。 - Pranav Nutalapati
请尝试使用 on_load 而不是 on_load_async - Pedro Góes

4
为了在保存时自动将空格转换为制表符,请在“$SUBLIME_HOME$\Packages\”中新建名为“UnexpandTabsOnSave”的子文件夹,并添加以下Python脚本:
import sublime, sublime_plugin, os

class ConvertSpacesToTabsOnSave( sublime_plugin.EventListener ):
  # Run Sublime's 'unexpand_tabs' command when saving any file
  def on_pre_save( self, view ):
    view.window().run_command( 'unexpand_tabs' )

感谢您提供的初步资源。

0

如果您使用的是 Mac,只需使用帮助选项(通常在 Mac 菜单栏中的最后一个选项),然后键入:“tab indentation”,选择制表符缩进宽度即可。

但一般来说,您可以按照以下路径操作: 视图 -> 缩进


0

您可以通过以下方式将所有项目文件中的制表符替换为空格:

  1. 进行替换全部操作 Ctrl+Shif+F
  2. 设置正则表达式搜索 ^\A(.*)$
  3. 设置目录为 您的目录
  4. 替换为 \1

    输入图像描述

  5. 这将导致所有项目文件被打开,并标记其缓冲区为脏。有了这个,您现在可以选择启用下一个 Sublime Text 设置,以删除所有文件尾随空格并确保每个文件末尾都有一个新行。

    您可以通过进入菜单 Preferences -> Settings 并将以下内容添加到您的设置文件中来启用这些设置:

    1. "ensure_newline_at_eof_on_save": true,
    2. "trim_trailing_white_space_on_save": true,
  6. 通过进入菜单 View -> Show Console (Ctrl+`) 打开 Sublime Text 控制台,并运行以下命令: import threading; threading.Thread( args=(set(),), target=lambda counterset: [ (view.run_command( "expand_tabs", {"set_translate_tabs": True} ), print( "Processing {:>5} view of {:>5}, view id {} {}".format( len( counterset ) + 1, len( window.views() ), view.id(), ( "Finished converting!" if len( counterset ) > len( window.views() ) - 2 else "" ) ) ), counterset.add( len( counterset ) ) ) for view in window.views() ] ).start()
  7. 现在,通过进入菜单 File -> Save All 来保存所有更改的文件

-1

这个程序的作用相反。它将制表符转换为空格。 - Illya Moskvin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接