Skip to content

Instantly share code, notes, and snippets.

@pleasetrythisathome
Created March 12, 2015 20:57
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 pleasetrythisathome/98953eabd98b147b7da3 to your computer and use it in GitHub Desktop.
Save pleasetrythisathome/98953eabd98b147b7da3 to your computer and use it in GitHub Desktop.
clojure-repls for component systems. automatically eval in correct buffer
;;; clojure-repls.el --- Assign repls for clj and cljs eval
;; Copyright (C) 2015 Dylan Butman
(require 'cider)
(require 'dash)
(defvar clojure-repls-clj-con-buf nil)
(defvar clojure-repls-cljs-con-buf nil)
(defun clojure-repls-clear-con-bufs ()
(setq clojure-repls-clj-con-buf nil)
(setq clojure-repls-cljs-con-buf nil))
(add-hook 'nrepl-disconnected-hook #'clojure-repls-clear-con-bufs)
(defun clojure-repls-set-clj-buffer ()
(interactive)
(setq clojure-repls-clj-con-buf (current-buffer)))
(defun clojure-repls-set-cljs-buffer ()
(interactive)
(setq clojure-repls-cljs-con-buf (-buffer)))
(defun clojure-repls-bound-truthy-p (s)
(and (boundp s) (symbol-value s)))
(defun clojure-repls-buffer-extension (buffer)
(let ((name (buffer-name buffer)))
(-when-let (p-loc (string-match-p "\\." name))
(substring name (1+ p-loc) nil))) )
(defun clojure-repls-set-connection (f h)
(let ((ext (clojure-repls-buffer-extension (current-buffer))))
(if (and (clojure-repls-bound-truthy-p 'clojure-repls-clj-con-buf)
(clojure-repls-bound-truthy-p 'clojure-repls-cljs-con-buf)
ext
(or (string= ext "clj") (string= ext "boot") (string= ext "cljs")))
(progn
(if (string= ext "cljs")
(nrepl-make-connection-default clojure-repls-cljs-con-buf)
(nrepl-make-connection-default clojure-repls-clj-con-buf))
(when f
(funcall f)))
(when h
(funcall h)))))
(defun clojure-repls-switch-to-relevant-repl (arg)
(interactive)
(lexical-let ((a arg))
(clojure-repls-set-connection (lambda () (cider-switch-to-current-repl-buffer a))
(lambda () (cider-switch-to-relevant-repl-buffer a)))))
(if (version< emacs-version "24.4")
(progn
(defadvice cider-interactive-eval (before clojure-repls-nrepl-current-session activate)
(clojure-repls-set-connection nil nil))
(defadvice cider-tooling-eval (before clojure-repls-nrepl-current-session activate)
(clojure-repls-set-connection nil nil))
(defadvice cider-complete-at-point (before clojure-repls-nrepl-current-session activate)
(clojure-repls-set-connection nil nil)))
(defun clojure-repls-nrepl-current-session (&optional arg1 arg2)
(clojure-repls-set-connection nil nil))
(advice-add 'cider-interactive-eval :before #'clojure-repls-nrepl-current-session)
(advice-add 'cider-tooling-eval :before #'clojure-repls-nrepl-current-session)
(advice-add 'cider-complete-at-point :before #'clojure-repls-nrepl-current-session))
(global-set-key (kbd "C-c C-s c") 'clojure-repls-set-clj-buffer)
(global-set-key (kbd "C-c C-s b") 'clojure-repls-set-cljs-buffer)
(provide 'clojure-repls)
(defun cider-insert (buff fs)
(save-some-buffers)
(with-current-buffer (or buff (cider-current-repl-buffer))
(goto-char (point-max))
(insert fs)
(cider-repl-return)))
(defun cider-repl-reset ()
(interactive)
(clojure-repls-set-connection nil nil)
(cider-insert nil "(boot-component.reloaded/reset)"))
(defun cider-brepl ()
(interactive)
(cider-insert clojure-repls-cljs-con-buf "(start-repl)"))
(defun cider-brepl-stop ()
(interactive)
(cider-insert clojure-repls-cljs-con-buf ":cljs/quit"))
(global-set-key (kbd "C-c r") 'cider-repl-reset)
(global-set-key (kbd "C-c M-b") 'cider-brepl)
(global-set-key (kbd "C-c q") 'cider-brepl-stop)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment