;; (C) Copyright Collin J. Doering 2014
;;
;; This program is free software: you can redistribute it and/or modify
;; it under the terms of the GNU General Public License as published by
;; the Free Software Foundation, either version 3 of the License, or
;; (at your option) any later version.
;;
;; This program is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
;; GNU General Public License for more details.
;;
;; You should have received a copy of the GNU General Public License
;; along with this program. If not, see .
;; File: lispy.el
;; Author: Collin J. Doering
;; Date: Oct 22, 2014
;; Set default lisp program
(setq inferior-lisp-program "/usr/bin/sbcl")
;; Since there is no support for the kawa implementation of scheme
(defun run-kawa ()
"Run Kawa Scheme in an Emacs buffer."
(interactive)
(require 'cmuscheme) ;; Built-in
(let ((scheme-program-name "/usr/bin/kawa"))
(run-scheme scheme-program-name)))
;; Set usable lisp implementations
(setq slime-lisp-implementations
'((sbcl ("/usr/bin/sbcl" ""))
(clisp ("/usr/bin/clisp" "-K base"))
(clojure ("/usr/bin/clj" ""))))
;; Function to start and/or connect to slime
(defun start-slime ()
(interactive)
(unless (slime-connected-p)
(save-excursion (slime))))
;; Setup slime mode *TODO* drop in slime from ELPA
(add-to-list 'load-path "/usr/share/emacs/site-lisp/slime/")
(require 'slime) ;; AUR: emacs-slime-cvs
(slime-setup '(slime-fancy))
;; Setup swank-clojure-mode
(add-to-list 'load-path "/usr/share/emacs/site-lisp/swank-clojure")
(require 'swank-clojure) ;; ELPA
(add-hook 'clojure-mode-hook
'(lambda ()
(define-key clojure-mode-map "\C-c\C-e" 'lisp-eval-last-sexp)
(define-key clojure-mode-map "\C-x\C-e" 'lisp-eval-last-sexp)))
;; TODO: functionality needs to be re-written; assoc library obsolete
;; (eval-after-load "slime"
;; `(progn
;; (require 'assoc) ;; Built-in (OBSOLETE)
;; (setq swank-clojure-classpath
;; (list "/usr/share/clojure/clojure.jar"
;; "/usr/share/clojure/clojure-contrib.jar"
;; "/usr/share/emacs/site-lisp/swank-clojure/src"))
;; (aput 'slime-lisp-implementations 'clojure
;; (list (swank-clojure-cmd) :init 'swank-clojure-init))))
;; Setup enhanced scheme/racket mode consisting of geiser, quack and paredit
;; Setup geiser
(require 'geiser) ;; ELPA
;; Setup auto-completion for geiser (ELPA)
(require 'ac-geiser)
(add-hook 'geiser-mode-hook 'ac-geiser-setup)
(add-hook 'geiser-repl-mode-hook 'ac-geiser-setup)
(eval-after-load "auto-complete"
'(add-to-list 'ac-modes 'geiser-repl-mode))
;; Make struct stand out in scheme-mode for racket
(defun racket-faces ()
(font-lock-add-keywords nil
'(("(struct \\(\\sw+\\)" 1 font-lock-function-name-face)
("(\\(struct\\)" 1 font-lock-keyword-face)
("(\\(λ\\)" 1 font-lock-function-name-face))))
(add-hook 'scheme-mode-hook 'racket-faces)
(add-hook 'geiser-repl-mode-hook 'racket-faces)
;; Setup scribble mode (custom .el from ~/.emacs.d/site-lisp-extra)
;; See: http://www.neilvandyke.org/scribble-emacs/
(require 'scribble)
;; Setup quack
(require 'quack) ;; ELPA
;; Setup paredit
(require 'paredit) ;; ELPA
(defvar lispy-langs-hooks '(lisp-mode-hook lisp-interaction-mode-hook emacs-lisp-mode-hook scheme-mode-hook c-mode-hook c++-mode-hook python-mode-hook geiser-repl-mode-hook))
;; Apply paredit-mode to modes listed in lispy-langs-hooks
(activate-mode-with-hooks (lambda () (paredit-mode 1)) lispy-langs-hooks)
;; Highlight sexp's in lispy languages
(activate-mode-with-hooks (lambda () (highlight-sexp-mode)) lispy-langs-hooks)
;; Paredit binds to C-j globally and thus disables the binding to
;; eval-print-last-sexp in emacs-lisp-mode (e.g *scratch*, etc..)
(add-hook 'emacs-lisp-mode-hook
'(lambda ()
(define-key emacs-lisp-mode-map "\C-xj" 'eval-print-last-sexp)))
;; Match paren's in given modes [to apply globally do (show-paren-mode 1)]
(activate-mode-with-hooks (lambda () (show-paren-mode)) lispy-langs-hooks)
;; Highlight paren's near point
(require 'highlight-parentheses)
(activate-mode-with-hooks (lambda () (highlight-parentheses-mode)) lispy-langs-hooks)
;; Setup rainbow-delimiters
(require 'rainbow-delimiters) ;; ELPA
(activate-mode-with-hooks 'rainbow-delimiters-mode-enable lispy-langs-hooks)
;;(global-rainbow-delimiters-mode) ;; breaks font coloring in erc for some reason?
;; upcomming functionallity: toggle paredit-mode due to annoying things like wrapping parens when a mistake is made
;; known issue..if paredit-mode is turned on when there are unbalanced parens an error is reported
(defun toggle-paredit-mode ()
(let ((active-minor-modes (list)))
(mapatoms (lambda (sym)
(when (and (symbolp sym) (assq sym minor-mode-alist) (symbol-value sym))
(push sym active-minor-modes))))
(if (member 'paredit-mode active-minor-modes) (paredit-mode -1) (paredit-mode 1))))
(setq geiser-repl-use-other-window nil)
(setq geiser-active-implementations '(racket guile))