From a0ccb6b95b357a578287b9727cc68549713962e6 Mon Sep 17 00:00:00 2001 From: Henrik Lissner Date: Fri, 28 Oct 2022 02:44:27 +0200 Subject: [PATCH] feat(emacs-lisp,lispy): recognize ;;* outline headings Permit `;;* ...` be recognized by imenu and outline-minor-mode (and outline's commands). This also patches Lispy to reflect this new configuration (if :lang emacs-lisp is active). Close: #6732 Co-authored-by: LemonBreezes --- modules/editor/lispy/config.el | 10 +++++++++- modules/lang/emacs-lisp/autoload.el | 8 +++++++- modules/lang/emacs-lisp/config.el | 5 +++-- 3 files changed, 19 insertions(+), 4 deletions(-) diff --git a/modules/editor/lispy/config.el b/modules/editor/lispy/config.el index 810a7d859..1fc9b2f02 100644 --- a/modules/editor/lispy/config.el +++ b/modules/editor/lispy/config.el @@ -22,7 +22,15 @@ (local-set-key (vector 'remap (lookup-key lispy-mode-map (kbd "TAB"))) #'completion-at-point))) :config (setq lispy-close-quotes-at-end-p t) - (add-hook 'lispy-mode-hook #'turn-off-smartparens-mode)) + (add-hook 'lispy-mode-hook #'turn-off-smartparens-mode) + + (when (modulep! :lang emacs-lisp) + (setq lispy-outline + (concat + ;; `lispy-mode' requires `lispy-outline' start with ^ + (unless (string-prefix-p "^" +emacs-lisp-outline-regexp) "^") + +emacs-lisp-outline-regexp)) + (advice-add #'lispy-outline-level :override #'+emacs-lisp-outline-level))) (use-package! lispyville diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el index 158178376..e08c63bdb 100644 --- a/modules/lang/emacs-lisp/autoload.el +++ b/modules/lang/emacs-lisp/autoload.el @@ -28,6 +28,12 @@ to a pop up buffer." (kill-buffer buffer)))) (current-buffer))) +;;;###autoload +(defun +emacs-lisp-outline-level () + "Return outline level for comment at point. +Intended to replace `lisp-outline-level'." + (- (match-end 1) (match-beginning 1))) + ;; ;;; Handlers @@ -232,7 +238,7 @@ https://emacs.stackexchange.com/questions/10230/how-to-indent-keywords-aligned" (defun +emacs-lisp-extend-imenu-h () "Improve imenu support in `emacs-lisp-mode' for Doom's APIs." (setq imenu-generic-expression - `(("Section" "^[ \t]*;;;;*[ \t]+\\([^\n]+\\)" 1) + `(("Section" "^[ \t]*;;;*\\**[ \t]+\\([^\n]+\\)" 1) ("Evil commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1) ("Package" "^\\s-*\\(?:;;;###package\\|(\\(?:package!\\|use-package!?\\|after!\\)\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 3cf3c522e..d6798ddc0 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -3,7 +3,7 @@ (defvar +emacs-lisp-enable-extra-fontification t "If non-nil, highlight special forms, and defined functions and variables.") -(defvar +emacs-lisp-outline-regexp "[ \t]*;;;;* [^ \t\n]" +(defvar +emacs-lisp-outline-regexp "[ \t]*;;;\\(;*\\**\\) [^ \t\n]" "Regexp to use for `outline-regexp' in `emacs-lisp-mode'. This marks a foldable marker for `outline-minor-mode' in elisp buffers.") @@ -60,7 +60,8 @@ See `+emacs-lisp-non-package-mode' for details.") mode-name "Elisp" ;; Don't treat autoloads or sexp openers as outline headers, we have ;; hideshow for that. - outline-regexp +emacs-lisp-outline-regexp) + outline-regexp +emacs-lisp-outline-regexp + outline-level #'+emacs-lisp-outline-level) ;; Fixed indenter that intends plists sensibly. (advice-add #'calculate-lisp-indent :override #'+emacs-lisp--calculate-lisp-indent-a)