;;; editor/fold/config.el -*- lexical-binding: t; -*- (defcustom +fold-ellipsis " [...] " "The ellipsis to show for ellided regions (folds). `org-ellipsis', `truncate-string-ellipsis', and `ts-fold-replacement' are set to this." :type 'string :group '+fold) (defface +fold-hideshow-folded-face `((t (:inherit font-lock-comment-face :weight light))) "Face to hightlight `hideshow' overlays." :group 'doom-themes) ;; ;;; Global config (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))) (after! org (setq org-ellipsis +fold-ellipsis)) (after! mule-util (setq truncate-string-ellipsis +fold-ellipsis)) ;; ;;; 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 "\\|]*[^/]>" "