commit 35c35da81ed642bc71e3af822a71bbb6574d5e61 parent d43db4d02d995dc61b1e0e2bf155b43dfa43f3c1 Author: andsy10 <andsy1016@gmail.com> Date: Tue, 8 Sep 2026 03:50:26 +0800 Add ielm REPL switching commands and Lisp mode enhancements Diffstat:
| M | lisp/init-prog.el | | | 73 | ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++- |
1 file changed, 72 insertions(+), 1 deletion(-)
diff --git a/lisp/init-prog.el b/lisp/init-prog.el @@ -5,6 +5,62 @@ ;;; Code: +;; from Purcell's Emacs configuration +;; enable some features for lisp files +(defun my-maybe-set-bundled-elisp-readonly () + "If this elisp appears to be part of Emacs, then disallow editing." + (when (and (buffer-file-name) + (string-match-p "\\.el\\.gz\\'" (buffer-file-name))) + (read-only-mode 1))) +(add-hook 'emacs-lisp-mode-hook 'my-maybe-set-bundled-elisp-readonly) + +(defun my-enable-check-parens-on-save () + "Run `check-parens' when the current buffer is saved." + (add-hook 'after-save-hook #'check-parens nil t)) + +(defvar my-lispy-modes-hook + '(my-enable-check-parens-on-save) + "Hook run in all Lisp modes.") + +(defun my-lisp-setup () + "Enable features useful in any Lisp mode." + (run-hooks 'my-lispy-modes-hook)) + +(require 'derived) +(dolist (mode '(emacs-lisp-mode ielm-mode lisp-mode inferior-lisp-mode lisp-interaction-mode)) + (add-hook (derived-mode-hook-name mode) 'my-lisp-setup)) +(when (boundp 'eval-expression-minibuffer-setup-hook) + (add-hook 'eval-expression-minibuffer-setup-hook #'eldoc-mode)) + +(use-package ielm + :straight nil + :autoload (my-switch-to-ielm my-repl-switch-back) + :config + ;; jump between ielm and elisp file + (defvar-local my-repl-original-buffer nil + "Buffer from which we jumped to this REPL.") + + (defvar my-repl-switch-function 'switch-to-buffer) + + (defun my-switch-to-ielm () + (interactive) + (let ((orig-buffer (current-buffer))) + (if (get-buffer "*ielm*") + (funcall my-repl-switch-function "*ielm*") + (ielm)) + (setq my-repl-original-buffer orig-buffer))) + + (defun my-repl-switch-back () + "Switch back to the buffer from which we reached this REPL." + (interactive) + (if my-repl-original-buffer + (funcall my-repl-switch-function my-repl-original-buffer) + (error "No original buffer"))) + + :init + (general-def emacs-lisp-mode-map "C-c C-z" #'my-switch-to-ielm) + (general-def ielm-map "C-c C-z" #'my-repl-switch-back)) + ;; hideshow (use-package hideshow :straight nil @@ -28,7 +84,22 @@ (setq eglot-send-changes-idle-time 0.25)) ;; syntax checking -(use-package flycheck) +(use-package flycheck + :init + ;; from Purcell's Emacs configuration + (defun my-headerise-elisp () + "Add minimal header and footer to an elisp buffer in order to placate flycheck." + (interactive) + (let ((fname (if (buffer-file-name) + (file-name-nondirectory (buffer-file-name)) + (error "This buffer is not visiting a file")))) + (save-excursion + (goto-char (point-min)) + (insert ";;; " fname " --- Insert description here -*- lexical-binding: t -*-\n" + ";;; Commentary:\n" + ";;; Code:\n\n") + (goto-char (point-max)) + (insert ";;; " fname " ends here\n"))))) (use-package flycheck-guile :hook