通过首选项和 GUI 定义的缩进

Indentation defined via preferences and via GUI

我想了解通过 "transtate_tabs_to_spaces" 定义的 ST 缩进与通过 GUI(window 右下角)定义的缩进有何不同。

第 1 步。添加此首选项:

"draw_white_space": "all",
"translate_tabs_to_spaces": true,

第 2 步。确保您拥有:

而不是这个:

步骤 3. 在 ST 中用单行创建新文件并按 Ctrl-](在 Windows 上)。它将缩进 4 个空格——完全符合用户的预期:

第 4 步。现在,在 GUI 中关闭 Indent Using Spaces 前面的复选标记:

然后,重现第 3 步。您会看到,该文本缩进了制表符,而不是空格,尽管您的首选项中仍然有 "translate_tabs_to_spaces": true

因此,看起来 ST 有 2 种方法来控制缩进 - 通过 translate_tabs_to_spaces 设置和通过 GUI,并且 GUI 优先。

你的前提基本上是正确的,但幕后发生了一些你可能没有预料到的事情。

设置 translate_tabs_to_spaces 告诉 Sublime,每当任何东西试图插入文字制表符时,它都应该将制表符扩展到一定数量的空格,而空格的数量来自 tab_size设置。

只有一个设置可以控制它,但是您在缩进菜单中看到的菜单项(来自状态行中的按钮或主菜单中的 View > Indentation)使用 toggle_setting命令。

例如,如果您使用命令面板中的View Package File查看Default/Indentation.sublime-menu(状态栏中弹出的菜单的定义),菜单项中的第一个条目是这个一个(此处重新格式化为不是一长行):

{ 
    "command": "toggle_setting", 
    "args": {"setting": "translate_tabs_to_spaces"}, 
    "caption": "Indent Using Spaces", 
    "checkbox": true 
},

toggle_setting 命令以 view 特定方式更改设置;也就是说,它会修改您当前正在编辑的缓冲区中的设置,但不会修改您实际的首选项文件中的设置。

如果您查阅 documentation on settings,您会发现特定于缓冲区的设置是潜在设置来源列表中的最后一项,这使得它们优先于其他所有设置。特定于缓冲区的设置仅在您打开文件时保留;如果您关闭文件并重新打开它,原始首选项将重新生效。

您可以通过使用 Ctrl+`View > Show Console 打开 Sublime 控制台并输入以下 python 命令来验证上述两种情况你有两个文件中的每一个:

view.settings().get("translate_tabs_to_spaces")

如果你这样做,你会看到它 returns True 当复选框被选中时 False 当它没有被选中时。

一般来说,translate_tabs_to_spaces 设置的最大问题是 detect_indentation 设置,除非您将其关闭,否则默认为 true

启用该设置后,每次加载文件时,Sublime 都会自动运行与缩进菜单中的 Guess Settings From Buffer 命令关联的命令。这可能会导致您选择的缩进设置与您的预期有所不同。

实际上,设置了适当的设置后,只要您不使用菜单项故意更改设置,它就会按照您想要的方式工作。

理论上,可以使用一个简单的插件来改变该菜单项的功能,以便它可以全局切换设置,而不是仅在当前缓冲区中切换,但在那种情况下,您加载的所有其他文件都会突然拥有它设置改变了,这可以说更糟了。