;;; emacs-lisp.el -*- lexical-binding: t; -*- (require 'syd-handle-repl) (require 'syd-handle-lookup) (require 'syd-handle-eval) ;; (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")))) (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))))) (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))) (set-repl-handler! 'emacs-lisp-mode #'syd/open-emacs-lisp-repl) ;;;###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-eval-handler! 'emacs-lisp-mode #'syd-emacs-lisp-eval) (defun syd-emacs-set-handlers () (setq-local syd-lookup-documentation-handlers (list #'syd-emacs-lisp-lookup-documentation))) (add-hook 'emacs-lisp-mode-hook #'syd-emacs-set-handlers) (provide 'syd-lang-emacs-lisp)