diff --git a/modules/lang/emacs-lisp/autoload.el b/modules/lang/emacs-lisp/autoload.el new file mode 100644 index 000000000..8a795d95c --- /dev/null +++ b/modules/lang/emacs-lisp/autoload.el @@ -0,0 +1,66 @@ +;;; lang/emacs-lisp/autoload.el + +;; ---- emacs-lisp --------------------------------------------------- + +;;;###autoload (autoload 'doom:byte-compile "lang/emacs-lisp/autoload" nil t) +(evil-define-command +emacs-lisp:byte-compile (&optional bang) + (interactive "") + (if bang (doom-byte-compile) (byte-compile-file buffer-file-name))) + +;;;###autoload +(defun +emacs-lisp/find-function-at-pt () + (interactive) + (let ((func (function-called-at-point))) + (if func (find-function func)))) + +;;;###autoload +(defun +emacs-lisp/find-function-at-pt-other-window () + (interactive) + (let ((func (function-called-at-point))) + (if func (find-function-other-window func)))) + +;;;###autoload +(defun +emacs-lisp/repl () + (interactive) + (ielm) + (let ((buf (current-buffer))) + (bury-buffer) + (pop-to-buffer buf))) + + +;; ---- ert --------------------------------------------------- + +(defsubst +ert--pre () + (save-buffer) (eval-buffer)) + +;;;###autoload +(defun +ert/run-test () + (interactive) + (let (case-fold-search thing) + (+ert--pre) + (setq thing (thing-at-point 'defun t)) + (if thing + (if (string-match "(ert-deftest \\([^ ]+\\)" thing) + (ert-run-tests-interactively + (substring thing (match-beginning 1) (match-end 1))) + (user-error "Invalid test at point")) + (user-error "No test found at point")))) + +;;;###autoload +(defun +ert/rerun-test () + (interactive) + (let (case-fold-search thing) + (+ert--pre) + (setq thing (car-safe ert--selector-history)) + (if thing + (ert-run-tests-interactively thing) + (message "No test found in history, looking for test at point") + (+ert-run-test)))) + +;;;###autoload +(defun +ert/run-all-tests () + (interactive) + (ert-delete-all-tests) + (+ert--pre) + (ert-run-tests-interactively t)) + diff --git a/modules/lang/emacs-lisp/config.el b/modules/lang/emacs-lisp/config.el index 0fc8be0e6..9db980c5e 100644 --- a/modules/lang/emacs-lisp/config.el +++ b/modules/lang/emacs-lisp/config.el @@ -1,120 +1,34 @@ -;;; module-elisp --- all things lisp +;;; lang/emacs-lisp/config.el -(associate! emacs-lisp-mode :match "\\(/Cask\\|\\.\\(el\\|gz\\)\\)$") -(add-hook! emacs-lisp-mode '(eldoc-mode highlight-numbers-mode)) +(add-hook! emacs-lisp-mode + '(+emacs-lisp|init + highlight-quoted-mode + auto-compile-on-save-mode)) -(add-hook 'emacs-lisp-mode-hook 'doom/elisp-init) -(defun doom/elisp-init () - (def-company-backend! emacs-lisp-mode (elisp yasnippet)) - (def-repl! emacs-lisp-mode doom/elisp-inf-ielm) - (def-rotate! emacs-lisp-mode - :symbols (("t" "nil") - ("let" "let*") - ("when" "unless") - ("append" "prepend") - ("advice-add" "advice-remove") - ("add-hook" "add-hook!" "remove-hook"))) - - (def-popup! "*ert*" :align below :size 20 :noselect t) - - ;; Don't affect lisp indentation (only `tab-width') - (setq editorconfig-indentation-alist - (delq (assq 'emacs-lisp-mode editorconfig-indentation-alist) - editorconfig-indentation-alist)) - - ;; Real go-to-definition for elisp - (map! :map emacs-lisp-mode-map :m "gd" 'doom/elisp-find-function-at-pt) - - (remove-hook 'emacs-lisp-mode-hook 'doom/elisp-init)) - -(add-hook 'emacs-lisp-mode-hook 'doom/elisp-hook) -(defun doom/elisp-hook () +(defun +emacs-lisp|init () (setq mode-name "Elisp") ; [pedantry intensifies] + (add-hook 'before-save-hook 'delete-trailing-whitespace nil t) (font-lock-add-keywords - nil `(("(\\(lambda\\)" (1 (doom/show-as ?λ))) - ("(\\(\\(doom\\)\\([-:/|][^) ]*\\)?\\)[) \n]" (1 font-lock-builtin-face)) + nil `(("(\\(lambda\\)" (1 (ignore (compose-region (match-beginning 1) (match-end 1) ?λ 'decompose-region)))) + ("(\\(\\(doom\\)\\([-:/|!][^) ]*\\)?\\)[) \n]" (1 font-lock-builtin-face)) ;; Highlight doom macros (macros are fontified in emacs 25+) - (,(concat - "(\\(def-" - (regexp-opt '("electric" "project-type" "company-backend" - "builder" "repl" "text-obj" "tmp-excmd" "rotate" - "repeat" "yas-mode" "version-cmd" "docset" "popup" - "open-with")) - "!\\)") - (1 font-lock-keyword-face append)) - (,(concat - "(\\(" - (regexp-opt '("λ" "in" "map" "after" "shut-up" "add-hook" - "associate" "define-org-link" "ex" "ex-local" - "define-org-section" "set" "noop")) - "!\\)") + ("(\\([^ ]+!\\)" (1 font-lock-keyword-face append)) ;; Ert - (,(concat - "(" - (regexp-opt '("ert-deftest") t) - " \\([^ ]+\\)") + ("(\\(ert-deftest\\) \\([^ ]+\\)" (1 font-lock-keyword-face) (2 font-lock-function-name-face)))) - (add-hook 'before-save-hook 'delete-trailing-whitespace nil t) - - (dolist (i '(("Evil Command" "\\(^\\s-*(evil-define-command +\\)\\(\\_<.+\\_>\\)" 2) - ("Evil Operator" "\\(^\\s-*(evil-define-operator +\\)\\(\\_<.+\\_>\\)" 2) - ("Package" "\\(^\\s-*(use-package +\\)\\(\\_<[^ \n]+\\_>\\)" 2) + (dolist (i '(("Evil Command" "\\(^\\s-*(evil-define-command +\\)\\(\\_<[^ ]+\\_>\\)" 2) + ("Evil Operator" "\\(^\\s-*(evil-define-operator +\\)\\(\\_<[^ ]+\\_>\\)" 2) + ("Package" "\\(^\\s-*(\\(use-package\\|package!\\) +\\)\\(\\_<[^ \n]+\\_>\\)" 3) ("Spaceline Segment" "\\(^\\s-*(spaceline-define-segment +\\)\\(\\_<.+\\_>\\)" 2))) (push i imenu-generic-expression))) -;; Add new colors to helm-imenu -(after! helm-imenu - (defun helm-imenu-transformer (candidates) - (cl-loop for (k . v) in candidates - for types = (or (helm-imenu--get-prop k) - (list "Function" k)) - for bufname = (buffer-name (marker-buffer v)) - for disp1 = (mapconcat - (lambda (x) - (propertize - x 'face (cond ((string= x "Variables") - 'font-lock-variable-name-face) - ((or (string= x "Function") - (string-prefix-p "Evil " x t)) - 'font-lock-function-name-face) - ((string= x "Types") - 'font-lock-type-face) - ((string= x "Package") - 'font-lock-negation-char-face) - ((string= x "Spaceline Segment") - 'font-lock-string-face)))) - types helm-imenu-delimiter) - for disp = (propertize disp1 'help-echo bufname) - collect - (cons disp (cons k v))))) +(after! auto-compile + (setq auto-compile-display-buffer nil + auto-compile-use-mode-line nil)) - -;; -(use-package highlight-quoted - :commands (highlight-quoted-mode) - :init (add-hook 'emacs-lisp-mode-hook 'highlight-quoted-mode)) - -(use-package slime :defer t - :config (setq inferior-lisp-program "clisp")) - -(use-package auto-compile - :commands auto-compile-on-save-mode - :init (add-hook 'emacs-lisp-mode-hook 'auto-compile-on-save-mode) - :config (setq auto-compile-display-buffer nil)) - -;; -(def-project-type! emacs-ert "ert" - :modes (emacs-lisp-mode) - :match "/test/.+-test\\.el$" - :bind (:localleader - :n "tr" 'doom/ert-rerun-test - :n "ta" 'doom/ert-run-all-tests - :n "ts" 'doom/ert-run-test) - (add-hook 'ert-results-mode-hook 'doom-hide-mode-line-mode)) - -(provide 'module-elisp) -;;; module-elisp.el ends here +(after! slime + (setq inferior-lisp-program "clisp")) diff --git a/modules/lang/emacs-lisp/packages.el b/modules/lang/emacs-lisp/packages.el new file mode 100644 index 000000000..6065cc9ee --- /dev/null +++ b/modules/lang/emacs-lisp/packages.el @@ -0,0 +1,9 @@ +;;; lang/emacs-lisp/packages.el + +(associate! emacs-lisp-mode :match "\\(/Cask\\|\\.elc?\\(.gz\\)?\\)$") + +(package! highlight-quoted :commands highlight-quoted-mode) + +(package! auto-compile :commands auto-compile-on-save-mode) + +(package! slime)