- Make `+fold/close-all` work for outline-minor-mode.
- Distinguish between `zo` and `zO` for outline-minor-mode alone, by
binding `zO` to a new function `+fold/open-rec`. `zO` will now trigger
`outline-show-subtree` in outline-minor-mode, while `zo` will only
trigger `outline-show-branches`, keeping the subheadings folded. This
matches the behavior in org-mode.
- Fix a bug in `+fold/open-all`, introduced in
7b9d00d661
, that makes it only operate
on vimish-fold folds.
Note that outline-minor-mode is still not enabled by default anywhere.
These changes are only to prevent incorrect behavior for users who
decide to turn it on themselves.
100 lines
3.8 KiB
EmacsLisp
100 lines
3.8 KiB
EmacsLisp
;;; editor/fold/config.el -*- lexical-binding: t; -*-
|
|
|
|
(when (modulep! :editor evil)
|
|
;; Add vimish-fold, outline-mode & hideshow support to folding commands
|
|
(define-key! 'global
|
|
[remap evil-toggle-fold] #'+fold/toggle
|
|
[remap evil-close-fold] #'+fold/close
|
|
[remap evil-open-fold] #'+fold/open
|
|
[remap evil-open-fold-rec] #'+fold/open-rec
|
|
[remap evil-close-folds] #'+fold/close-all
|
|
[remap evil-open-folds] #'+fold/open-all)
|
|
(after! evil
|
|
(evil-define-key* 'motion 'global
|
|
"zj" #'+fold/next
|
|
"zk" #'+fold/previous
|
|
"zf" #'evil-vimish-fold/create
|
|
"zF" #'evil-vimish-fold/create-line
|
|
"zd" #'vimish-fold-delete
|
|
"zE" #'vimish-fold-delete-all)))
|
|
|
|
|
|
;;
|
|
;; Packages
|
|
|
|
(use-package! hideshow ; built-in
|
|
:commands (hs-toggle-hiding
|
|
hs-hide-block
|
|
hs-hide-level
|
|
hs-show-all
|
|
hs-hide-all)
|
|
:config
|
|
(setq hs-hide-comments-when-hiding-all nil
|
|
;; Nicer code-folding overlays (with fringe indicators)
|
|
hs-set-up-overlay #'+fold-hideshow-set-up-overlay-fn)
|
|
|
|
(defadvice! +fold--hideshow-ensure-mode-a (&rest _)
|
|
"Ensure `hs-minor-mode' is enabled when we need it, no sooner or later."
|
|
:before '(hs-toggle-hiding hs-hide-block hs-hide-level hs-show-all hs-hide-all)
|
|
(unless (bound-and-true-p hs-minor-mode)
|
|
(hs-minor-mode +1)))
|
|
|
|
;; extra folding support for more languages
|
|
(unless (assq 't hs-special-modes-alist)
|
|
(setq hs-special-modes-alist
|
|
(append
|
|
'((vimrc-mode "{{{" "}}}" "\"")
|
|
(yaml-mode "\\s-*\\_<\\(?:[^:]+\\)\\_>"
|
|
""
|
|
"#"
|
|
+fold-hideshow-forward-block-by-indent-fn nil)
|
|
(haml-mode "[#.%]" "\n" "/" +fold-hideshow-haml-forward-sexp-fn nil)
|
|
(ruby-mode "class\\|d\\(?:ef\\|o\\)\\|module\\|[[{]"
|
|
"end\\|[]}]"
|
|
"#\\|=begin"
|
|
ruby-forward-sexp)
|
|
(matlab-mode "if\\|switch\\|case\\|otherwise\\|while\\|for\\|try\\|catch"
|
|
"end"
|
|
nil (lambda (_arg) (matlab-forward-sexp)))
|
|
(nxml-mode "<!--\\|<[^/>]*[^/]>"
|
|
"-->\\|</[^/>]*[^/]>"
|
|
"<!--" sgml-skip-tag-forward nil)
|
|
(latex-mode
|
|
;; LaTeX-find-matching-end needs to be inside the env
|
|
("\\\\begin{[a-zA-Z*]+}\\(\\)" 1)
|
|
"\\\\end{[a-zA-Z*]+}"
|
|
"%"
|
|
(lambda (_arg)
|
|
;; Don't fold whole document, that's useless
|
|
(unless (save-excursion
|
|
(search-backward "\\begin{document}"
|
|
(line-beginning-position) t))
|
|
(LaTeX-find-matching-end)))
|
|
nil))
|
|
hs-special-modes-alist
|
|
'((t))))))
|
|
|
|
|
|
(use-package! evil-vimish-fold
|
|
:when (modulep! :editor evil)
|
|
:commands (evil-vimish-fold/next-fold evil-vimish-fold/previous-fold
|
|
evil-vimish-fold/delete evil-vimish-fold/delete-all
|
|
evil-vimish-fold/create evil-vimish-fold/create-line)
|
|
:init
|
|
(setq vimish-fold-dir (concat doom-cache-dir "vimish-fold/")
|
|
vimish-fold-indication-mode 'right-fringe)
|
|
:config
|
|
(vimish-fold-global-mode +1))
|
|
|
|
(use-package! ts-fold
|
|
:when (modulep! :tools tree-sitter)
|
|
:after tree-sitter
|
|
:config
|
|
;; we want to use our own face so we nullify this one to have no effect and
|
|
;; make it more similar to hideshows
|
|
(custom-set-faces! '(ts-fold-replacement-face :foreground unspecified
|
|
:box nil
|
|
:inherit font-lock-comment-face
|
|
:weight light))
|
|
(setq ts-fold-replacement " [...] ")
|
|
(ts-fold-mode +1))
|