* References
** Awesome ELisp
Kompendium: https://github.com/p3r7/awesome-elisp
- speed-of-thought-lisp
** Elisp Tips
Recommended by https://isamert.net/2023/08/14/elisp-editing-development-tips.html
- eros-mode *ok*
- Example driven development: suggest elisp-demos *ok*
- highlight-quoted
- aggressive-indent = auto-indent Lisp-Code *ok*
- indentation in comments: https://isamert.net/2023/08/14/elisp-editing-development-tips.html#automatic-indentation-fix
* John Wiegly
- paredit ( I follow Karthink using his repeat-map)
- (use-package redshank
:diminish
:hook ((lisp-mode emacs-lisp-mode) . redshank-mode))
- ert testing
* Activating Builtins
#+begin_src emacs-lisp
(add-hook 'emacs-lisp-mode-hook #'hs-minor-mode)
(add-hook 'emacs-lisp-mode-hook #'eldoc-mode)
#+end_src
* Structural Editing Interface, Parenthesis
Karthink: "A Consistent Structural Editing Interface"
smartparens is actively maintained and offers a cheatsheet.
Use this
#+begin_src emacs-lisp
(use-package elec-pair
:config
(setq electric-pair-inhibit-predicate
`(lambda (c)
(if (char-equal c ?\<) t (,electric-pair-inhibit-predicate c))))
)
#+end_src
when not using smartparens.
#+begin_src emacs-lisp
(require 'repeat-help)
(repeat-mode 1)
(use-package smartparens
:ensure t
:diminish smartparens-mode "{}"
:hook ((emacs-lisp-mode
lisp-interaction-mode
scheme-mode
guile-mode
ielm-mode)
. smartparens-mode)
:init
(add-hook 'smartparens-enabled-hook
(lambda ()
"Disable \\[electric-pair-mode] when \[[smartparens-mode]] is enabled."
(electric-pair-local-mode -1)))
(add-hook 'smartparens-disabled-hook
(lambda ()
"Enable \\[electric-pair-mode] when \[[smartparens-mode]] is disabled."
(electric-pair-local-mode +1)))
:config
;; Repeat actions
;; Scratch buffer for: emacs-lisp-mode
(defun my/sp-duplicate-sexp (&optional arg)
(interactive "p")
(insert (string-trim-left
(buffer-substring
(save-excursion
(backward-sexp)
(point))
(point)))))
(defvar lisp-navigation-map
(let ((map (make-sparse-keymap)))
(pcase-dolist (`(,k . ,f)
'(("u" . backward-up-list)
("f" . forward-sexp)
("b" . backward-sexp)
("d" . down-list)
("n" . sp-next-sexp)
("p" . sp-previous-sexp)
("k" . sp-kill-sexp)
("K" . sp-kill-hybrid-sexp)
("]" . sp-forward-slurp-sexp)
("[" . sp-backward-slurp-sexp)
("}" . sp-forward-barf-sexp)
("{" . sp-backward-barf-sexp)
("r" . raise-sexp)
(";" . sp-comment)
("C" . sp-convolute-sexp)
("D" . my/sp-duplicate-sexp)
("J" . sp-join-sexp)
("S" . sp-split-sexp)
("R" . sp-raise-sexp)
("\\" . indent-region)
("t" . transpose-sexps)
;; ("e" . eval-last-sexp)
))
(define-key map (kbd k) f))
map))
;; (map-keymap
;; (lambda (_ cmd)
;; (put cmd 'repeat-map 'lisp-navigation-map))
;; lisp-navigation-map)
;; (put 'kill-sexp 'repeat-map 'lisp-navigation-map)
;; (require 'smartparens-config)
(sp-with-modes sp-lisp-modes
;; disable ', it's the quote character!
;; (sp-local-pair "`" "'")
(sp-local-pair "'" nil :actions nil)))
#+end_src
* Indentation/Formatting
is recommended over:
(add-hook 'emacs-lisp-mode-hook #'electric-indent-mode)
#+begin_src emacs-lisp
(use-package aggressive-indent
:ensure t
:config
(add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode)
(add-to-list 'aggressive-indent-protected-commands 'evil-undo)
)
#+end_src
#+begin_src emacs-lisp
(use-package highlight-quoted
:ensure t
:config
(add-hook 'emacs-lisp-mode-hook 'highlight-quoted-mode)
)
#+end_src
* Syntax Checker
#+begin_src emacs-lisp
(use-package flycheck
:ensure t
:config
(add-hook 'emacs-lisp-mode-hook #'flycheck-mode)
)
#+end_src
* Evaluation Result Overlay
#+begin_src emacs-lisp
(use-package eros
:ensure t
:config
(eros-mode 1)
)
#+end_src
* ELisp Examples
#+begin_src emacs-lisp
(use-package elisp-demos
:ensure t
)
(advice-add 'helpful-update :after #'elisp-demos-advice-helpful-update)
#+end_src
* Hydra
#+begin_src emacs-lisp
(major-mode-hydra-define emacs-lisp-mode nil
("Eval"
(("b" eval-buffer "buffer")
("e" eval-defun "defun")
("r" eval-region "region"))
"REPL"
(("I" ielm "ielm"))
"Test"
(("t" ert "prompt")
("T" (ert t) "all")
("F" (ert :failed) "failed"))
"Doc"
(("d" describe-foo-at-point "thing-at-pt")
("f" describe-function "function")
("v" describe-variable "variable")
("i" info-lookup-symbol "info lookup"))))
#+end_src