Fix lazy loading of elisp-mode config

elisp-mode is loaded at startup, so the usual methods won't work.
Instead, we tie a transient advice to the emacs-lisp-mode
function, *however*, this function is commonly called by various
packages to parse elisp code! So we have to make sure the emacs lisp
module only initializes the first time it is used interactively.
This commit is contained in:
Henrik Lissner 2018-06-27 18:48:01 +02:00
parent ca5ff92192
commit d55c7896f1
No known key found for this signature in database
GPG key ID: 5F6C0EA160557395

View file

@ -2,66 +2,72 @@
(add-to-list 'auto-mode-alist '("\\.Cask\\'" . emacs-lisp-mode)) (add-to-list 'auto-mode-alist '("\\.Cask\\'" . emacs-lisp-mode))
(defun +emacs-lisp|init () (add-hook! 'emacs-lisp-mode-hook
(set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl) #'(;; 3rd-party functionality
(set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval) auto-compile-on-save-mode doom|enable-delete-trailing-whitespace
(set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol) ;; fontification
(set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp") rainbow-delimiters-mode highlight-quoted-mode highlight-numbers-mode +emacs-lisp|extra-fontification
(set-pretty-symbols! 'emacs-lisp-mode :lambda "lambda") ;; initialization
(set-rotate-patterns! 'emacs-lisp-mode +emacs-lisp|init-imenu +emacs-lisp|disable-flycheck-maybe))
:symbols '(("t" "nil")
("let" "let*")
("when" "unless")
("append" "prepend")
("advice-add" "advice-remove")
("add-hook" "remove-hook")
("add-hook!" "remove-hook!")))
(add-hook! 'emacs-lisp-mode-hook (defun +emacs-lisp|init (&rest _)
#'(;; 3rd-party functionality ;; Some plugins will run `emacs-lisp-mode' with `emacs-lisp-mode-hook' set to
auto-compile-on-save-mode doom|enable-delete-trailing-whitespace ;; nil (cough yasnippet cough) or its mode hooks delayed. This prematurely
;; fontification ;; fires this function. Most of these setters affect emacs-lisp-mode-hook, so
rainbow-delimiters-mode highlight-quoted-mode highlight-numbers-mode +emacs-lisp|extra-fontification ;; they'd be swallowed up if it's letbound to nil, causing a half-initialized
;; initialization ;; elisp-mode in some sessions.
+emacs-lisp|init-imenu +emacs-lisp|disable-flycheck-maybe)) (when (and emacs-lisp-mode-hook (not delay-mode-hooks))
(set-repl-handler! 'emacs-lisp-mode #'+emacs-lisp/repl)
(set-eval-handler! 'emacs-lisp-mode #'+emacs-lisp-eval)
(set-lookup-handlers! 'emacs-lisp-mode :documentation 'info-lookup-symbol)
(set-docset! '(lisp-mode emacs-lisp-mode) "Emacs Lisp")
(set-pretty-symbols! 'emacs-lisp-mode :lambda "lambda")
(set-rotate-patterns! 'emacs-lisp-mode
:symbols '(("t" "nil")
("let" "let*")
("when" "unless")
("append" "prepend")
("advice-add" "advice-remove")
("add-hook" "remove-hook")
("add-hook!" "remove-hook!")))
;;
(advice-remove #'emacs-lisp-mode #'+emacs-lisp|init)))
(advice-add #'emacs-lisp-mode :before #'+emacs-lisp|init)
;; (defun +emacs-lisp|extra-fontification ()
(defun +emacs-lisp|extra-fontification () "Display lambda as a smybol and fontify doom module functions."
"Display lambda as a smybol and fontify doom module functions." (font-lock-add-keywords
(font-lock-add-keywords nil `(;; Highlight custom Doom cookies
nil `(;; Highlight custom Doom cookies ("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t))
("^;;;###\\(autodef\\|if\\)[ \n]" (1 font-lock-warning-face t)) ;; Highlight doom/module functions
;; Highlight doom/module functions ("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 font-lock-keyword-face)))))
("\\(^\\|\\s-\\|,\\)(\\(\\(doom\\|\\+\\)[^) ]+\\|[^) ]+!\\)[) \n]" (2 font-lock-keyword-face)))))
(defun +emacs-lisp|init-imenu () (defun +emacs-lisp|init-imenu ()
"Improve imenu support with better expression regexps and Doom-specific forms." "Improve imenu support with better expression regexps and Doom-specific forms."
(setq imenu-generic-expression (setq imenu-generic-expression
'(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1) '(("Evil Commands" "^\\s-*(evil-define-\\(?:command\\|operator\\|motion\\) +\\(\\_<[^ ()\n]+\\_>\\)" 1)
("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1) ("Unit tests" "^\\s-*(\\(?:ert-deftest\\|describe\\) +\"\\([^\")]+\\)\"" 1)
("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1) ("Package" "^\\s-*(\\(?:def-\\)?package! +\\(\\_<[^ ()\n]+\\_>\\)" 1)
("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1) ("Settings" "^\\s-*(def-setting! +\\([^ ()\n]+\\)" 1)
("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1) ("Major modes" "^\\s-*(define-derived-mode +\\([^ ()\n]+\\)" 1)
("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1) ("Modelines" "^\\s-*(def-modeline! +\\([^ ()\n]+\\)" 1)
("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1) ("Modeline Segments" "^\\s-*(def-modeline-segment! +\\([^ ()\n]+\\)" 1)
("Advice" "^\\s-*(def\\(?:\\(?:ine-\\)?advice\\))") ("Advice" "^\\s-*(def\\(?:\\(?:ine-\\)?advice\\))")
("Modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-minor\\|generic\\|minor\\)-mode +\\([^ ()\n]+\\)" 1) ("Modes" "^\\s-*(define-\\(?:global\\(?:ized\\)?-minor\\|generic\\|minor\\)-mode +\\([^ ()\n]+\\)" 1)
("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1) ("Macros" "^\\s-*(\\(?:cl-\\)?def\\(?:ine-compile-macro\\|macro\\) +\\([^ )\n]+\\)" 1)
("Inline Functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\n]+\\)" 1) ("Inline Functions" "\\s-*(\\(?:cl-\\)?defsubst +\\([^ )\n]+\\)" 1)
("Functions" "^\\s-*(\\(?:cl-\\)?def\\(?:un\\|un\\*\\|method\\|generic\\|-memoized!\\) +\\([^ ,)\n]+\\)" 1) ("Functions" "^\\s-*(\\(?:cl-\\)?def\\(?:un\\|un\\*\\|method\\|generic\\|-memoized!\\) +\\([^ ,)\n]+\\)" 1)
("Variables" "^\\s-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2) ("Variables" "^\\s-*(\\(def\\(?:c\\(?:onst\\(?:ant\\)?\\|ustom\\)\\|ine-symbol-macro\\|parameter\\)\\)\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2)
("Variables" "^\\s-*(defvar\\(?:-local\\)?\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)[[:space:]\n]+[^)]" 1) ("Variables" "^\\s-*(defvar\\(?:-local\\)?\\s-+\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)[[:space:]\n]+[^)]" 1)
("Types" "^\\s-*(\\(cl-def\\(?:struct\\|type\\)\\|def\\(?:class\\|face\\|group\\|ine-\\(?:condition\\|error\\|widget\\)\\|package\\|struct\\|t\\(?:\\(?:hem\\|yp\\)e\\)\\)\\)\\s-+'?\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2)))) ("Types" "^\\s-*(\\(cl-def\\(?:struct\\|type\\)\\|def\\(?:class\\|face\\|group\\|ine-\\(?:condition\\|error\\|widget\\)\\|package\\|struct\\|t\\(?:\\(?:hem\\|yp\\)e\\)\\)\\)\\s-+'?\\(\\(?:\\sw\\|\\s_\\|\\\\.\\)+\\)" 2))))
(defun +emacs-lisp|disable-flycheck-maybe () (defun +emacs-lisp|disable-flycheck-maybe ()
"Disable flycheck-mode if in emacs.d." "Disable flycheck-mode if in emacs.d."
(when (or (not buffer-file-name) (when (or (not buffer-file-name)
(cl-loop for dir in (list doom-emacs-dir doom-private-dir) (cl-loop for dir in (list doom-emacs-dir doom-private-dir)
if (file-in-directory-p buffer-file-name dir) if (file-in-directory-p buffer-file-name dir)
return t)) return t))
(flycheck-mode -1)))) (flycheck-mode -1)))
(add-transient-hook! 'emacs-lisp-mode (+emacs-lisp|init))
;; ;;