summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCraig Jennings <c@cjennings.net>2025-10-20 14:47:52 -0500
committerCraig Jennings <c@cjennings.net>2025-10-20 14:47:52 -0500
commit736a6008fde8306f151bd15984779316d9ec885d (patch)
tree444068c42171d211baa55b1343af7ce6326a14e0
parent8edaf02481bd61b35d82f2be62e521d9aaf64d2a (diff)
feat(modules): Enhance Common Lisp and Scheme setup
Added detailed setup instructions and configuration for Common Lisp (SBCL, Quicklisp, SLIME) and Scheme (Guile) in Emacs. Introduced new variables for specifying paths to Lisp implementations and modified hooks for consistent Lisp editing preferences. Included support for SLIME and Geiser with necessary bindings and configurations. Enhanced readability and maintainability by restructuring and adding informative comments.
-rw-r--r--modules/prog-lisp.el120
1 files changed, 79 insertions, 41 deletions
diff --git a/modules/prog-lisp.el b/modules/prog-lisp.el
index 11dc7851..7693c253 100644
--- a/modules/prog-lisp.el
+++ b/modules/prog-lisp.el
@@ -2,48 +2,70 @@
;; author Craig Jennings <c@cjennings.net>
;;; Commentary:
+;; Configuration for Emacs Lisp, Common Lisp (SLIME), and Scheme (Guile).
+
+;; ==== Common Lisp Setup (SLIME + Quicklisp) ====
+;;
+;; Install SBCL:
+;; sudo pacman -S sbcl # arch
+;; doas pkg install sbcl # bsd
+;; sudo apt-get install sbcl # debian
+;;
+;; Install Quicklisp (Common Lisp package manager):
+;; curl -O http://beta.quicklisp.org/quicklisp.lisp
+;; sbcl --load quicklisp.lisp --eval "(quicklisp-quickstart:install)" --quit
+;; sbcl --load ~/quicklisp/setup.lisp --eval "(ql:add-to-init-file)" --quit
+;;
+;; Install SLIME via Quicklisp:
+;; sbcl --eval "(ql:quickload :quicklisp-slime-helper)" --quit
+;;
+;; Readline support for SBCL REPL (outside Emacs):
+;; rlwrap sbcl
-;; ==== Setting up Quicklisp ====
-;; Quicklisp is a library manager for Common Lisp. It works with your existing Common Lisp
-;; implementation to download, install, and load any of over 1,500 libraries with a few
-;; simple commands.
-;; https://www.quicklisp.org/beta/
+;;; Code:
-;; mostly from: https://gist.github.com/jteneycke/7947353
-;; * Install SBCL
-;; sudo pacman -S sbcl # arch
-;; doas pkg install sbcl # bsd
-;; sudo apt-get install sbcl # debian
+(defvar common-lisp-program "/usr/bin/sbcl"
+ "Path to Common Lisp implementation (SBCL, CCL, etc.).")
-;; * Install QuickLisp
-;; curl -O http://beta.quicklisp.org/quicklisp.lisp
-;; sbcl --load quicklisp.lisp --eval "(quicklisp-quickstart:install)" --quit
-;; sbcl --load ~/quicklisp/setup.lisp --eval "(ql:add-to-init-file)" --quit
+(defvar quicklisp-helper-path (expand-file-name "~/quicklisp/slime-helper.el")
+ "Path to Quicklisp's SLIME helper file.")
-;; * Emacs Config
-;; (load (expand-file-name "~/quicklisp/slime-helper.el"))
-;; ;; Replace "sbcl" with the path to your implementation
-;; (setq inferior-lisp-program "/usr/bin/sbcl")
+(defvar guile-program "/usr/bin/guile"
+ "Path to Guile Scheme implementation.")
-;; to get readline support in SBCL's REPL, install rlwrap and run it
-;; before sbcl like so:
+;; Forward declarations for SLIME variables
+(defvar inferior-lisp-program)
+(defvar slime-contribs)
+(defvar slime-repl-history-size)
+(defvar slime-repl-history-file)
-;; $ rlwrap sbcl
+;; Forward declarations for Geiser variables
+(defvar geiser-guile-binary)
-;;; Code:
-(require 'ert)
+;; Forward declarations for flycheck-package
+(declare-function flycheck-package-setup "flycheck-package")
;; -------------------------------- Elisp Setup --------------------------------
-;; run this on editing an elisp file
+;; preferences for Emacs Lisp editing
(defun cj/elisp-setup ()
- "My default code preferences for emacs-lisp."
- (setq-default tab-width 4) ;; set the tab width to 4 spaces
- (setq-default indent-tabs-mode -1) ;; disable tab characters
- (setq-default fill-column 120) ;; wrap code at this column
+ "Default code preferences for Emacs Lisp."
+ (setq-local tab-width 4) ;; set the tab width to 4 spaces
+ (setq-local indent-tabs-mode nil) ;; disable tab characters (use spaces)
+ (setq-local fill-column 120) ;; wrap code at this column
(display-fill-column-indicator-mode)) ;; show where the fill-column is
(add-hook 'emacs-lisp-mode-hook 'cj/elisp-setup)
+;; ---------------------------- Common Lisp Setup ------------------------------
+;; preferences for Common Lisp editing
+
+(defun cj/common-lisp-setup ()
+ "Default code preferences for Common Lisp."
+ (setq-local tab-width 2) ;; Common Lisp standard is 2 spaces
+ (setq-local indent-tabs-mode nil) ;; use spaces, not tabs
+ (setq-local fill-column 100)) ;; wrap at 100 columns
+(add-hook 'lisp-mode-hook 'cj/common-lisp-setup)
+
;; ------------------------------ Emacs Lisp REPL ------------------------------
(use-package ielm
@@ -67,40 +89,36 @@
;; or: [[info:ert#User Input]]
(use-package ert
- :ensure nil ;; built-into emacs
- :defer 1)
+ :ensure nil) ;; built-into emacs
;; ---------------------------------- El-Mock ----------------------------------
(use-package el-mock
- :defer 1) ;; mock/stub framework
+ :commands (with-mock mocklet mocklet-function)) ;; mock/stub framework
;; --------------------------------- Elisp Lint --------------------------------
(use-package elisp-lint
- :defer 1)
+ :commands (elisp-lint-file elisp-lint-directory))
;; ------------------------------ Package Tooling ------------------------------
(use-package package-lint
- :defer 1)
+ :commands (package-lint-current-buffer package-lint-batch-and-exit))
(use-package flycheck-package
- :defer 1
:after (flycheck package-lint)
:config
(flycheck-package-setup))
(use-package package-build
- :defer 1)
+ :commands (package-build-archive package-build-current-recipe))
;; ----------------------------- Rainbow Delimiters ----------------------------
(use-package rainbow-delimiters
- :defer .5
:hook
- (emacs-lisp-mode . rainbow-delimiters-mode)
- (lisp-mode . rainbow-delimiters-mode)
+ ((emacs-lisp-mode lisp-mode scheme-mode) . rainbow-delimiters-mode)
:config
(set-face-foreground 'rainbow-delimiters-depth-1-face "#c66") ;; red
(set-face-foreground 'rainbow-delimiters-depth-2-face "#6c6") ;; green
@@ -112,15 +130,35 @@
(set-face-foreground 'rainbow-delimiters-depth-8-face "#999") ;; medium gray
(set-face-foreground 'rainbow-delimiters-depth-9-face "#666")) ;; dark gray
+;; ----------------------------------- SLIME -----------------------------------
+;; Superior Lisp Interaction Mode for Emacs (Common Lisp REPL/debugger)
+
+(use-package slime
+ :commands (slime slime-mode)
+ :bind ("C-c L" . slime)
+ :config
+ ;; Load Quicklisp's SLIME helper if it exists
+ (when (file-exists-p quicklisp-helper-path)
+ (load quicklisp-helper-path))
+
+ ;; Set Common Lisp implementation
+ (setq inferior-lisp-program common-lisp-program)
+
+ ;; Enable commonly-used SLIME contribs
+ (setq slime-contribs '(slime-fancy slime-quicklisp slime-asdf))
+
+ ;; Better REPL history
+ (setq slime-repl-history-size 1000)
+ (setq slime-repl-history-file (expand-file-name "~/.emacs.d/slime-history.eld")))
+
;; -------------------------------- Geiser Guile -------------------------------
-;; Guile support in Emacs
+;; Scheme support in Emacs (Guile implementation)
(use-package geiser-guile
- :defer 1
:commands (geiser-guile)
:bind ("C-c G" . geiser-guile)
:config
- (setq geiser-guile-binary "/usr/bin/guile"))
+ (setq geiser-guile-binary guile-program))
(provide 'prog-lisp)
;;; prog-lisp.el ends here