;;; emacs-lisp.el -*- lexical-binding: t; -*- (require 'syd-handle-repl) (require 'syd-handle-lookup) (require 'syd-handle-eval) (require 'syd-lisp-lib) ;; (require 'handle) ;; Don't `use-package' `ielm', since it's loaded by Emacs. You'll get weird ;; autoload errors if you do. ;; https://www.reddit.com/r/emacs/comments/q7fjbi/comment/lml127d (use-package emacs :custom ((ielm-history-file-name ; Stay out of my config dir! (file-name-concat syd-cache-dir "ielm-history.eld")))) ;;;###autoload (defun syd/open-emacs-lisp-repl () (interactive) (pop-to-buffer (or (get-buffer "*ielm*") (progn (ielm) ; Creates the *ielm* buffer. (let ((b (get-buffer "*ielm*"))) ;; We leave it to the enclosing `pop-to-buffer' to display the ;; buffer. (bury-buffer b) b))))) ;;;###autoload (defun syd-emacs-lisp-lookup-documentation (identifier) "Lookup IDENTIFIER with `describe-symbol'" ;; HACK: Much to my frustration, `describe-symbol' has no defined return ;; value. To test if the call was successful or not, we check if any window ;; is displaying the help buffer. This probably breaks if ;; `syd-emacs-lisp-lookup-documentation' is called while the help buffer is ;; already open. (describe-symbol (intern identifier)) (let ((buffer (get-buffer (help-buffer)))) (and (get-buffer-window-list buffer) buffer))) ;;;###autoload (defun syd-emacs-lisp-eval (beg end) "Evaluate a region and print it to the echo area (if one line long), otherwise to a pop up buffer." (syd-eval-display-results (string-trim-right (let ((buffer (generate-new-buffer " *eval-output*")) (debug-on-error t)) (unwind-protect (condition-case-unless-debug e (progn (eval-region beg end buffer load-read-function) (with-current-buffer buffer (let ((pp-max-width nil)) (require 'pp) (pp-buffer) (replace-regexp-in-string "\\\\n" "\n" (string-trim-left (buffer-string)))))) (error (format "ERROR: %s" e))) (kill-buffer buffer)))) :source-buffer (current-buffer) :force-popup current-prefix-arg)) (set-repl-handler! 'emacs-lisp-mode #'syd/open-emacs-lisp-repl) (set-eval-handler! 'emacs-lisp-mode #'syd-emacs-lisp-eval) (add-hook 'emacs-lisp-mode-hook #'syd-lisp-mode) (defun syd-emacs-set-handlers-h () (setq-local syd-lookup-documentation-handlers (list #'syd-emacs-lisp-lookup-documentation))) (add-hook 'emacs-lisp-mode-hook #'syd-emacs-set-handlers-h) (add-hook 'help-mode-hook #'syd-emacs-set-handlers-h) ;; Semantic highlighting for Elisp. (use-package highlight-defined :hook (emacs-lisp-mode-hook . highlight-defined-mode)) ;; Automatically and inteligently expand abbreviations. E.g. `wcb` will be ;; expanded to `(with-current-buffer)`, but only where it makes sense for a ;; function/macro call to be. (use-package sotlisp :straight (:host github :repo "Malabarba/speed-of-thought-lisp") :hook (emacs-lisp-mode . speed-of-thought-mode)) ;; Give different pairs of delimiters different colours. (use-package rainbow-delimiters :hook (emacs-lisp-mode . rainbow-delimiters-mode)) (provide 'syd-lang-emacs-lisp)