fold_by_level命令按语法层级折叠代码块,需先设对文件语法,快捷键为ctrl+k,ctrl+1~9对应不同嵌套级,但无法区分函数与其他作用域块。

Sublime Text 里 fold_by_level 命令到底怎么用?
Sublime Text 默认不提供“一键折叠所有函数”的菜单项,但内置了 fold_by_level 命令,它按语法层级(如 class、function、if、for 等)折叠代码块。关键在于:它不是按“函数名”识别折叠,而是依赖当前语言的语法高亮和作用域定义。
实操建议:
- 确保文件已正确设置语法(右下角显示如
Python或JavaScript),否则fold_by_level可能无效或只折叠缩进块 - 快捷键默认是
Ctrl+K, Ctrl+1(Windows/Linux)或Cmd+K, Cmd+1(macOS)——注意是先按Ctrl+K松开,再按Ctrl+1 - 数字 1~9 对应不同嵌套层级:比如
Ctrl+K, Ctrl+2会折叠到类/模块级,Ctrl+K, Ctrl+3折叠到函数体内部的 if/for 块 - 想“只折叠函数”,通常需配合插件(见下一条),因为原生命令无法区分“函数定义”和“其他作用域块”
用 CodeFolding 插件精准折叠函数定义
原生 fold_by_level 对 JavaScript 或 Python 的函数折叠不够干净(比如会把 if 块也一起折进去)。这时推荐安装社区维护的 CodeFolding 插件,它通过正则匹配函数声明语法(如 def 、function 、const xxx = function 等)实现语义化折叠。
安装与使用:
- 通过 Package Control 安装
CodeFolding(不是Code Folding,后者已停更) - 安装后自动启用,无需配置;快捷键仍是
Ctrl+K, Ctrl+1,但行为变为“只折叠函数/类定义头行”,不碰内部逻辑块 - 支持常见语言:Python、JS、TS、Go、Rust 等,但对 JSX 或模板字符串中的函数可能漏判
- 若折叠异常,检查是否被其他插件(如
BracketHighlighter)干扰,可临时禁用测试
fold_all 和 unfold_all 是全局开关,不是函数专用
很多人误以为 Ctrl+K, Ctrl+0(fold_all)能“折叠所有函数”,其实它只是递归折叠所有可折叠区域(包括注释块、import 区、多行字符串等),结果往往混乱且不可逆(展开时不一定恢复原状)。
真实场景中应避免滥用:
-
fold_all适合快速隐藏全部细节看文件骨架,不适合日常编码流程 - 它不区分语言特性,Python 里连三引号文档字符串都会被折掉,JS 里对象字面量也可能塌陷
- 如果误触发,用
Ctrl+K, Ctrl+J(unfold_all)能恢复,但光标位置和滚动偏移会丢失 - 真正需要的是“折叠函数 + 展开当前光标所在函数”,这得靠插件或自定义命令(见下条)
自定义命令:只折叠函数,同时展开当前函数
如果你常在多个函数间跳转,希望每次进入一个函数时自动展开它,其余函数保持折叠,可以写个简单 Python 命令注入 Sublime Text 的插件目录(Packages/User/ 下新建 fold_functions.py):
import sublime
import sublime_plugin
<p>class FoldFunctionsExceptCurrentCommand(sublime_plugin.TextCommand):
def run(self, edit):</p><h1>先展开全部</h1><pre class='brush:php;toolbar:false;'> self.view.run_command("unfold_all")
# 获取当前光标所在函数作用域
scope = self.view.scope_name(self.view.sel()[0].begin())
if "entity.name.function" not in scope and "meta.function" not in scope:
# 当前不在函数内,退回到 fold_by_level 1
self.view.run_command("fold_by_level", {"level": 1})
return
# 获取所有函数 region(依赖 syntax definition)
regions = self.view.find_by_selector("meta.function")
for r in reversed(regions): # 从后往前折,避免 region 偏移
if not self.view.is_folded(r):
self.view.fold(r)
# 展开光标所在函数
func_region = self.view.expand_by_class(
self.view.sel()[0].begin(),
sublime.CLASS_WORD_START | sublime.CLASS_WORD_END,
"entity.name.function"
)
if func_region:
self.view.unfold(func_region)然后在 Key Bindings 中绑定快捷键,例如:
[{"keys": ["ctrl+alt+f"], "command": "fold_functions_except_current"}]这个方案依赖语言包的 scope 准确性,Python 和 JS 表现较好,但 C++ 或 PHP 可能需额外调整 selector。
真正难的不是写命令,而是理解:Sublime 的折叠本质是“文本区域操作”,不是 AST 遍历。所以任何“精准折叠函数”的方案,都绕不开语言包 scope 定义的质量和一致性。










