Skip to content

Instantly share code, notes, and snippets.

@hugoduncan
Last active October 1, 2015 05:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save hugoduncan/1934037 to your computer and use it in GitHub Desktop.
Save hugoduncan/1934037 to your computer and use it in GitHub Desktop.
.emacs fragment for slime setup with ritz
;;;; slime setup
;;; Setup the hooks for loading customisations
;; one-off slime configuration
(add-hook 'slime-load-hook 'my-slime-setup)
;; per slime connection
(add-hook 'slime-connected-hook 'my-slime-connection-setup)
(add-hook 'slime-clj-connected-hook 'my-slime-clj-connection-setup)
;; per buffer
(add-hook 'slime-clj-repl-mode-hook 'my-clojure-repl-setup)
(add-hook 'lisp-mode-hook 'my-lisp-mode-setup)
(add-hook 'clojure-mode-hook 'my-clojure-mode-setup)
(add-hook 'nrepl-interaction-mode-hook 'my-nrepl-mode-setup)
(setq clojure-swank-command
(if (or (locate-file "lein"
exec-path) (locate-file "lein.bat" exec-path))
"lein ritz-in %s"
"echo \"lein ritz-in %s\" | $SHELL -l"))
;;; slime configurations
(defun my-slime-setup ()
(setq slime-protocol-version 'ignore)
(setq slime-net-coding-system 'utf-8-unix)
(setq sldb-initial-restart-limit 8)
(slime-setup '(slime-repl
slime-fuzzy
;; slime-asdf
;; slime-hyperdoc
slime-autodoc
slime-presentations
;; slime-media
))
(setq slime-complete-symbol-function 'slime-fuzzy-complete-symbol)
(global-set-key [(control f10)] 'slime-selector)
;; various common lisp implementations
(setq slime-lisp-implementations
(append
slime-lisp-implementations
'((sbcl ("/Users/duncan/src/clbuild/target/bin/sbcl"))
(ecl ("/Users/duncan/ecl"))
(ccl ("/Users/duncan/src/ccl/scripts/openmcllime"))
(ccl64 ("/Users/duncan/src/ccl/scripts/openmcll64"))))))
(defun my-slime-connection-setup ()
(when (slime-inferior-process)
(slime-redirect-inferior-output))
(define-key slime-mode-map (kbd "<return>") 'newline-and-indent)
(define-key slime-mode-map (kbd "C-j") 'newline)
(define-key slime-mode-map (kbd "<tab>") 'slime-indent-and-complete-symbol)
;; this function resets the default connections
;; - useful mainly when developping swank backends
(defun slime-reset-connections ()
(interactive)
(setq slime-dispatching-connection nil)
(setq slime-default-connection nil)))
(defun my-slime-clj-connection-setup ()
)
(defun my-base-lisp-mode-setup ()
(whitespace-mode t)
(add-hook 'write-file-functions 'whitespace-write-file-hook t)
(setq whitespace-action '(auto-cleanup))
(require 'undo-tree)
(undo-tree-mode t)
(flyspell-prog-mode)
(setq indent-tabs-mode nil)
(paredit-mode t)) ;; this last, in case it fails
(defun my-lisp-mode-setup ()
(cond ((not (featurep 'slime))
(require 'slime)
(require 'gist)
(normal-mode)))
(my-base-lisp-mode-setup))
(setq clojure-swank-command "~/bin/lein ritz-in %s")
(defun my-clojure-mode-setup ()
(possibly-enable-clojure-test-mode)
(define-key clojure-mode-map (kbd "C-c t") 'my-clojure-jump-to-test)
;; (slime-mode t)
;; (midje-mode)
;; (require 'slime)
(my-base-lisp-mode-setup)
(when (boundp 'slime-connected-p)
(when (slime-connected-p)
(slime-javadoc-local-paths
(list (concat (expand-file-name "~") "/lisp/docs/java"))))
(def-slime-selector-method ?j
"most recently visited clojure-mode buffer."
(slime-recently-visited-buffer 'clojure-mode)))
(put-clojure-indent 'fresh 1)
(put-clojure-indent 'project 1)
(put-clojure-indent 'run* 1)
(put-clojure-indent 'when-feature 1)
(put-clojure-indent 'build-actions 1)
(put-clojure-indent 'phase-context 2)
(put-clojure-indent 'wrap-pipeline 1)
(put-clojure-indent 'pipeline-when 1)
(put-clojure-indent 'pipeline-when-not 1)
(put-clojure-indent 'm-when 1)
(put-clojure-indent 'm-when-not 1)
(put-clojure-indent 'plan-fn 'defun)
(put-clojure-indent 'delayed 1)
(put-clojure-indent 'test-for 1)
(put-clojure-indent 'test-nodes 1)
(put-clojure-indent 'with-session 1)
(put-clojure-indent 'defmethod-version-plan 3)
(put-clojure-indent 'add-plan-method-to-multi 2))
(defun my-nrepl-mode-setup ()
;; no session here...
(message "my-nrepl-mode-setup")
(require 'nrepl-ritz)
(setq nrepl-ritz-javadoc-local-paths
(list (concat (expand-file-name "~") "/lisp/docs/java")))
;; (my-base-lisp-mode-setup)
(message "my-nrepl-mode-setup done"))
(eval-after-load 'clojure-test-mode
'(progn
(define-key clojure-test-mode-map (kbd "C-c t")
'my-clojure-test-jump-to-implementation)))
;; (add-hook 'paredit-mode-hook
;; (lambda ()
;; (when (>= paredit-version 21)
;; (define-key slime-repl-mode-map "{" 'paredit-open-curly)
;; (define-key slime-repl-mode-map "}" 'paredit-close-curly))))
(defun my-clojure-repl-setup ()
(require 'clojure-mode)
(set-syntax-table clojure-mode-syntax-table)
(clojure-mode-font-lock-setup)
(setq slime-ritz-javadoc-local-paths
(list (concat (expand-file-name "~") "/lisp/docs/java")))
(require 'durendal)
(durendal-enable-slime-repl-font-lock)
(durendal-slime-repl-paredit)
(define-key slime-mode-map (kbd "C-.") 'find-tag)
(define-key slime-repl-mode-map (kbd "C-.") 'find-tag)
(define-key slime-repl-mode-map (kbd "M-r") 'slime-repl-previous-matching-input)
(define-key slime-repl-mode-map (kbd "M-s") 'slime-repl-next-matching-input)
(define-key slime-repl-mode-map "{" 'paredit-open-curly)
(define-key slime-repl-mode-map "}" 'paredit-close-curly)
(when (slime-inferior-process)
(slime-redirect-inferior-output))
(paredit-mode t))
(defun possibly-enable-clojure-test-mode ()
(save-excursion
(goto-char (point-min))
(if (search-forward "(deftest" nil t)
(clojure-test-mode t))))
;;; Mapping from implementation namespace/file to test namespace/file
(defun my-clojure-test-for (namespace)
(let* ((namespace (clojure-underscores-for-hyphens namespace))
(segments (split-string namespace "\\.")))
(concat (mapconcat 'identity segments "/") "_test")))
(defun my-clojure-jump-to-test ()
"Jump from implementation to test file. Overide clojure-mode's default mapping
to add \"-test\" to test namespace."
(interactive)
(find-file
(format
"%s/test/%s.clj"
(expand-file-name (locate-dominating-file buffer-file-name "src/"))
(my-clojure-test-for (clojure-find-ns)))))
(defun my-clojure-test-implementation-for (namespace)
"Overide clojure-mode's default mapping to add \"-test\" to test namespace."
(let* ((namespace (replace-regexp-in-string "-test" "" namespace))
(namespace (clojure-underscores-for-hyphens namespace))
(segments (split-string namespace "\\.")))
(mapconcat 'identity segments "/")))
(defun my-clojure-test-jump-to-implementation ()
"Jump from test file to implementation. Overide clojure-mode's default mapping."
(interactive)
(find-file (format "%s/src/%s.clj"
(locate-dominating-file buffer-file-name "src/")
(my-clojure-test-implementation-for (clojure-find-package)))))
;;; paredit
(eval-after-load 'paredit
'(progn
(define-key paredit-mode-map (kbd ";") 'self-insert-command)))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment