
























kirigami 只管前端,实际折叠操作需要后端来执行。原文给每种后端指明了适用的语言。
**重要提醒**:每个 buffer 同时只能激活一个折叠后端。如果把钩子挂到 prog-mode-hook 或 text-mode-hook 这种大类上,多个后端可能冲突。所以要挂到具体的语言 mode 钩子上(如 ~emacs-lisp-mode-hook~)。
outline-minor-mode(内置): 基于层级标题来折叠。适合有明确标题结构的文件,比如 Elisp(以 ;;; 标题分级)和conf文件:
(add-hook 'emacs-lisp-mode-hook #'outline-minor-mode) (add-hook 'conf-mode-hook #'outline-minor-mode)
hs-minor-mode(内置,即 Hideshow): 通过解析语法来识别代码块(函数、if/else 等)。最适合用花括号 {} 分块的 C 系语言,也支持 shell 脚本:
(add-hook 'c-mode-hook #'hs-minor-mode) (add-hook 'c++-mode-hook #'hs-minor-mode) (add-hook 'java-mode-hook #'hs-minor-mode) (add-hook 'rust-mode-hook #'hs-minor-mode) (add-hook 'go-mode-hook #'hs-minor-mode) (add-hook 'js-mode-hook #'hs-minor-mode) (add-hook 'typescript-mode-hook #'hs-minor-mode) (add-hook 'sh-mode-hook #'hs-minor-mode)
Hideshow 的局限是每次只折叠一层(比如只能折叠整个函数,不能单独折叠函数内部的 if 块)。这对 C/Java 这种花括号语言影响不大,但对 Python、YAML 这种需要多层折叠的语言就不够用了。
outline-indent(第三方包): 基于缩进层级来折叠,支持无限层级。这正是 Python、Haskell、YAML 这种靠缩进表示结构的语言需要的——你可以折叠整个函数,也可以只折叠函数里某个 if 块:
(use-package outline-indent :commands outline-indent-minor-mode :custom (outline-indent-ellipsis " ▼")) (add-hook 'python-mode-hook #'outline-indent-minor-mode) (add-hook 'python-ts-mode-hook #'outline-indent-minor-mode) (add-hook 'yaml-mode-hook #'outline-indent-minor-mode) (add-hook 'yaml-ts-mode-hook #'outline-indent-minor-mode) (add-hook 'haskell-mode-hook #'outline-indent-minor-mode)
除了折叠,outline-indent 还能移动缩进块、调整缩进层级、插入同级缩进的新行——这些都是缩进敏感语言经常需要的操作。
treesit-fold(第三方包): 利用 tree-sitter 的语法树来识别可折叠区域(函数、类、注释、文档字符串等)。传统折叠方式靠正则或缩进来猜,treesit-fold 靠真正的语法分析来判断,准确度更高。需要 Emacs 29.1+ 和对应语言的 tree-sitter 语法:
(use-package treesit-fold :commands (treesit-fold-close treesit-fold-close-all treesit-fold-open treesit-fold-toggle treesit-fold-open-all treesit-fold-mode global-treesit-fold-mode treesit-fold-open-recursively treesit-fold-line-comment-mode) :custom (treesit-fold-line-count-show t) (treesit-fold-line-count-format " ▼") :config (set-face-attribute 'treesit-fold-replacement-face nil :foreground "#808080" :box nil :weight 'bold)) (add-hook 'c-ts-mode-hook #'treesit-fold-mode) (add-hook 'c++-ts-mode-hook #'treesit-fold-mode) (add-hook 'java-ts-mode-hook #'treesit-fold-mode) (add-hook 'rust-ts-mode-hook #'treesit-fold-mode) (add-hook 'go-ts-mode-hook #'treesit-fold-mode) (add-hook 'js-ts-mode-hook #'treesit-fold-mode) (add-hook 'typescript-ts-mode-hook #'treesit-fold-mode) (add-hook 'bash-ts-mode-hook #'treesit-fold-mode)
treesit-fold 适合有 -ts-mode 的语言(Emacs 29+ 内置的 tree-sitter major mode)。
markdown-mode: Markdown 文件用 outline-minor-mode 做折叠,因为 Markdown 的标题层级(~#~、~##~)天然就是 outline 结构:
(use-package markdown-mode :mode (("\\.markdown\\'" . markdown-mode) ("\\.md\\'" . markdown-mode) ("README\\.md\\'" . gfm-mode))) (add-hook 'markdown-mode-hook #'outline-minor-mode)
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。