Skip to content

Latest commit

 

History

History
182 lines (150 loc) · 5.96 KB

starter-kit-lisp.org

File metadata and controls

182 lines (150 loc) · 5.96 KB

Starter Kit Lisp

This is part of the Emacs Starter Kit.

Starter Kit Lisp

Support for editing list dialects including Emacs Lisp, Scheme, Common Lisp, and Clojure.

Define keys

Install Lisp packages

(setq install-packages (list 'clojure-mode))
(dolist (package install-packages) (package-install package))
(define-key read-expression-map (kbd "TAB") 'lisp-complete-symbol)
;; (define-key lisp-mode-shared-map (kbd "C-c l") "lambda")
(define-key lisp-mode-shared-map (kbd "RET") 'reindent-then-newline-and-indent)
(define-key lisp-mode-shared-map (kbd "C-\\") 'lisp-complete-symbol)
;; (define-key lisp-mode-shared-map (kbd "C-c v") 'eval-buffer)

Paredit

Paredit might seem weird at first, but it really makes writing lisp a much more comfortable experience. This is especially useful in combination with the sexp movement functions (C-M-f forward, C-M-b back, C-M-u up, C-M-d down)
;; (eval-after-load 'paredit
;;      ;; Not sure why paredit behaves this way with comments; it's annoying
;;   '(define-key paredit-mode-map (kbd ";")   'self-insert-command))

Non-obtrusive parenthesis faces

(defface starter-kit-paren-face
   '((((class color) (background dark))
      (:foreground "grey50"))
     (((class color) (background light))
      (:foreground "grey55")))
   "Face used to dim parentheses."
   :group 'starter-kit-faces)

Emacs Lisp

(add-hook 'emacs-lisp-mode-hook 'turn-on-eldoc-mode)
(add-hook 'emacs-lisp-mode-hook 'run-coding-hook)
(add-hook 'emacs-lisp-mode-hook 'starter-kit-remove-elc-on-save)
(define-key emacs-lisp-mode-map (kbd "C-c v") 'eval-buffer)

(defun starter-kit-remove-elc-on-save ()
  "If you're saving an elisp file, likely the .elc is no longer valid."
  (make-local-variable 'after-save-hook)
  (add-hook 'after-save-hook
            (lambda ()
              (if (file-exists-p (concat buffer-file-name "c"))
                  (delete-file (concat buffer-file-name "c"))))))

(ont-lock-add-keywords 'emacs-lisp-mode
                         '(("(\\|)" . 'starter-kit-paren-face)))

Clojure

(require 'clojure-mode)

(add-hook 'clojure-mode-hook 'run-coding-hook)

(font-lock-add-keywords 'clojure-mode
                        '(("(\\|)" . 'starter-kit-paren-face)))

(define-key clojure-mode-map (kbd "C-c v") 'slime-eval-buffer)
(define-key clojure-mode-map (kbd "C-c C-v") 'slime-eval-buffer)

(defface starter-kit-clojure-trace-face
   '((((class color) (background dark))
      (:foreground "grey50"))
     (((class color) (background light))
      (:foreground "grey55")))
   "Face used to dim parentheses."
   :group 'starter-kit-faces)

(setq starter-kit-clojure-trace-face 'starter-kit-clojure-trace-face)

;; This will make relevant lines stand out more in stack traces
(defun sldb-font-lock ()
  (font-lock-add-keywords nil
                          '(("[0-9]+: \\(clojure\.\\(core\\|lang\\).*\\)"
                             1 starter-kit-clojure-trace-face)
                            ("[0-9]+: \\(java.*\\)"
                             1 starter-kit-clojure-trace-face)
                            ("[0-9]+: \\(swank.*\\)"
                             1 starter-kit-clojure-trace-face)
                            ("\\[\\([A-Z]+\\)\\]"
                             1 font-lock-function-name-face))))

(add-hook 'sldb-mode-hook 'sldb-font-lock)

(defun clojure-project (path)
  "Setup classpaths for a clojure project and starts a new SLIME session.

Kills existing SLIME session, if any."
  (interactive (list
                (ido-read-directory-name
                 "Project root: "
                 (locate-dominating-file default-directory "pom.xml"))))
  (when (get-buffer "*inferior-lisp*")
    (kill-buffer "*inferior-lisp*"))
  (add-to-list 'swank-clojure-extra-vm-args
               (format "-Dclojure.compile.path=%s"
                       (expand-file-name "target/classes/" path)))
  (setq swank-clojure-binary nil
        swank-clojure-jar-path (expand-file-name "target/dependency/" path)
        swank-clojure-extra-classpaths
        (append (mapcar (lambda (d) (expand-file-name d path))
                        '("src/" "target/classes/" "test/"))
                (let ((lib (expand-file-name "lib" path)))
                  (if (file-exists-p lib)
                      (directory-files lib t ".jar$"))))
        slime-lisp-implementations
        (cons `(clojure ,(swank-clojure-cmd) :init swank-clojure-init)
              (remove-if #'(lambda (x) (eq (car x) 'clojure))
                         slime-lisp-implementations)))
  (save-window-excursion
    (slime)))

Pretty lambda

(add-hook 'lisp-mode-hook (lambda () (push '("(\\(fn\\>\\)" . ) prettify-symbols-alist)))

Scheme

(add-hook 'scheme-mode-hook 'run-coding-hook)
(font-lock-add-keywords 'scheme-mode
                        '(("(\\|)" . 'starter-kit-paren-face)))

Common Lisp

(add-hook 'lisp-mode-hook 'run-coding-hook)
(font-lock-add-keywords 'lisp-mode
                        '(("(\\|)" . 'starter-kit-paren-face)))
(message "------ Starter Kit Lisp loaded ------")