diff --git a/.emacs.d/lisp/init-sly-selector.el b/.emacs.d/lisp/init-sly-selector.el index 9f5f6692..2a4469cc 100644 --- a/.emacs.d/lisp/init-sly-selector.el +++ b/.emacs.d/lisp/init-sly-selector.el @@ -1,6 +1,7 @@ (require 'sly-mrepl) ; For `sly-mrepl--find-buffer'. (defvar ambrevar/sly-connection-name "sbcl-ambrevar") + (defun ambrevar/helm-sly-buffer-p (buffer) "Return non-nil if BUFFER has a SLY connection matching `ambrevar/sly-connection-name'." @@ -11,17 +12,41 @@ (string-prefix-p ambrevar/sly-connection-name (sly-connection-name sly-buffer-connection))))) +(defun ambrevar/helm-sly-buffer-non-ambrevar-p (buffer) + "Return non-nil if BUFFER has a SLY connection not matching +`ambrevar/sly-connection-name'." + (with-current-buffer buffer + (and (derived-mode-p 'sly-mrepl-mode) + sly-buffer-connection + (sly-process sly-buffer-connection) + (not (string-prefix-p ambrevar/sly-connection-name + (sly-connection-name sly-buffer-connection)))))) + +(defun ambrevar/helm-sly-mini-sources (name predicate) + (list (helm-sly--c-source-connection + (helm-sly--repl-buffer-candidates + nil predicate) + name) + helm-sly-new + (helm-sly-lisp-buffer-source) + (helm-sly-build-buffers-source))) + (defun ambrevar/helm-sly-mini () "Helm for Lisp connections and buffers using the `ambrevar/sly-connection-name' connection." (interactive) - (helm :sources (list (helm-sly--c-source-connection - (helm-sly--repl-buffer-candidates - nil #'ambrevar/helm-sly-buffer-p) - "Ambrevar's Lisp connections") - helm-sly-new - (helm-sly-lisp-buffer-source) - (helm-sly-build-buffers-source)) + (helm :sources (ambrevar/helm-sly-mini-sources + "Ambrevar's Lisp connections" + #'ambrevar/helm-sly-buffer-p) + :buffer "*ambrevar/helm-sly-mini*")) + +(defun ambrevar/helm-sly-mini-non-ambrevar () + "Helm for Lisp connections and buffers not using the +`ambrevar/sly-connection-name' connection." + (interactive) + (helm :sources (ambrevar/helm-sly-mini-sources + "Other Lisp connections" + #'ambrevar/helm-sly-buffer-non-ambrevar-p) :buffer "*ambrevar/helm-sly-mini*")) (defun ambrevar/helm-selector-sly () @@ -51,4 +76,27 @@ (let ((current-prefix-arg t)) (call-interactively #'helm-selector-sly))) +(defun ambrevar/helm-selector-sly-non-ambrevar () + "Helm for `sly' buffers not using the `ambrevar/sly-connection-name' connection." + (interactive) + (helm-selector + "SLY-REPL for all but Ambrevar's shells." + :predicate #'ambrevar/helm-sly-buffer-non-ambrevar-p + :make-buffer-fn (lambda () ; Copied from helm-selector-sly.el. + (interactive) + (if (and (null sly-net-processes) + (< 1 (length sly-lisp-implementations))) + (let ((current-prefix-arg '-)) + (call-interactively #'sly)) + ;; Make sure to call interactively so that last + ;; connection is reused. + (call-interactively #'sly))) + :helm-sources #'ambrevar/helm-sly-mini-non-ambrevar)) + +(defun ambrevar/helm-selector-sly-non-ambrevar-other-window () + "Like `ambrevar/helm-selector-sly-non-ambrevar' but raise buffer in other window." + (interactive) + (let ((current-prefix-arg t)) + (call-interactively #'helm-selector-sly))) + (provide 'init-sly-selector)