blob: 8f6af89364cba97a1516ee520ec9b04211a7e0e3 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
|
;;; prog-lisp --- Lisp Specific Settings and Functionality -*- lexical-binding: t; -*-
;; author Craig Jennings <c@cjennings.net>
;;; Commentary:
;; ==== 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/
;; 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
;; * 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
;; * 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")
;; to get readline support in SBCL's REPL, install rlwrap and run it
;; before sbcl like so:
;; $ rlwrap sbcl
;;; Code:
(require 'ert)
;; -------------------------------- Elisp Setup --------------------------------
;; run this on editing an elisp file
(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
(display-fill-column-indicator-mode)) ;; show where the fill-column is
(add-hook 'emacs-lisp-mode-hook 'cj/elisp-setup)
;; ------------------------------ Emacs Lisp REPL ------------------------------
(use-package ielm
:ensure nil ;; built-in
:hook (ielm-mode . eldoc-mode)
:config (setq ielm-prompt "elisp> "))
;; ----------------------------------- Eldoc -----------------------------------
(use-package eldoc
:ensure nil ;; built-in
:hook ((c-mode-common emacs-lisp-mode) . eldoc-mode)
:custom
(eldoc-echo-area-use-multiline-p 3)
(eldoc-echo-area-display-truncation-message nil))
;; -------------------------- ERT + Testing Libraries --------------------------
;; unit/regression testing framework
;; basic introduction: https://nullprogram.com/blog/2012/08/15/
;; https://www.gnu.org/software/emacs/manual/html_node/ert/
;; or: [[info:ert#User Input]]
(use-package ert
:ensure nil ;; built-into emacs
:defer 1)
;; mocking/stub framework
;; note: Find the documentation at M-x describe-function RET with-mock RET
;; and M-x describe-function RET mocklet RET.testing
(with-eval-after-load 'ert
(defun ert-all-tests ()
"Run all ert tests and display the results in a buffer."
(interactive)
(ert t))
(keymap-global-unset "C-r" t)
(keymap-global-unset "C-R" t)
(define-key emacs-lisp-mode-map (kbd "C-r") 'ert-all-tests)
(define-key emacs-lisp-mode-map (kbd "C-R") 'ert-run-tests-interactively)
(define-key lisp-interaction-mode-map (kbd "C-r") 'ert-all-tests)
(define-key lisp-interaction-mode-map (kbd "C-R") 'ert-run-tests-interactively))
(use-package el-mock) ;; mock/stub framework
(defun cj/eval-and-run-all-tests-in-buffer ()
"Delete any loaded tests, evaluate current buffer, and run loaded ERT tests."
(interactive)
(ert-delete-all-tests)
(eval-buffer)
(ert 't))
;; ------------------------------ Package Tooling ------------------------------
(use-package package-lint
:defer 1)
(use-package flycheck-package
:defer 1
:after (flycheck package-lint)
:config
(flycheck-package-setup))
(use-package package-build
:defer 1)
;; ----------------------------- Rainbow Delimiters ----------------------------
(use-package rainbow-delimiters
:defer .5
:hook
(emacs-lisp-mode . rainbow-delimiters-mode)
(lisp-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
(set-face-foreground 'rainbow-delimiters-depth-3-face "#69f") ;; blue
(set-face-foreground 'rainbow-delimiters-depth-4-face "#cc6") ;; yellow
(set-face-foreground 'rainbow-delimiters-depth-5-face "#6cc") ;; cyan
(set-face-foreground 'rainbow-delimiters-depth-6-face "#c6c") ;; magenta
(set-face-foreground 'rainbow-delimiters-depth-7-face "#ccc") ;; light gray
(set-face-foreground 'rainbow-delimiters-depth-8-face "#999") ;; medium gray
(set-face-foreground 'rainbow-delimiters-depth-9-face "#666")) ;; dark gray
;; -------------------------------- Geiser Guile -------------------------------
;; Guile support in Emacs
(use-package geiser-guile
:defer 1
:commands (geiser-guile)
:bind ("C-c G" . geiser-guile)
:config
(setq geiser-guile-binary "/usr/bin/guile"))
(provide 'prog-lisp)
;;; prog-lisp.el ends here
|