* 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