selectrum: refactor +irc/selectrum-jump-to-channel

This commit is contained in:
Itai Y. Efrat 2021-05-21 18:28:38 +03:00
parent 49a5c51615
commit 24f2efd8ca
3 changed files with 32 additions and 24 deletions

View file

@ -72,6 +72,16 @@ argument) is non-nil only show channels in current server."
((featurep! :completion selectrum) #'+irc/selectrum-jump-to-channel) ((featurep! :completion selectrum) #'+irc/selectrum-jump-to-channel)
((user-error "No jump-to-channel backend is enabled. Enable selectrum or ivy!"))))) ((user-error "No jump-to-channel backend is enabled. Enable selectrum or ivy!")))))
;;;###autoload
(defun +irc--circe-all-buffers ()
(cl-loop with servers = (circe-server-buffers)
for server in servers
collect server
nconc
(with-current-buffer server
(cl-loop for buf in (circe-server-chat-buffers)
collect buf))))
;;;###autoload ;;;###autoload
(defun +irc/tracking-next-buffer () (defun +irc/tracking-next-buffer ()
"Disables switching to an unread buffer unless in the irc workspace." "Disables switching to an unread buffer unless in the irc workspace."

View file

@ -2,24 +2,22 @@
;;;###if (featurep! :completion selectrum) ;;;###if (featurep! :completion selectrum)
;;;###autoload ;;;###autoload
(defun +irc/selectrum-jump-to-channel (&optional this-server) (defun +irc/selectrum-jump-to-channel ()
"Jump to an open channel or server buffer with selectrum. If THIS-SERVER (universal "Jump to an open channel or server buffer with selectrum."
argument) is non-nil only show channels in current server." (interactive)
(interactive "P") (require 'consult)
(if (not (circe-server-buffers)) (consult--multi (list (plist-put +irc--consult-circe-source
(message "No circe buffers available") :hidden nil))
(when (and this-server (not circe-server-buffer)) :narrow nil
(setq this-server nil)) :require-match t
(when-let :prompt "Jump to:"
((buffer (completing-read :sort nil))
(format "Jump to%s: " (if this-server (format " (%s)" (buffer-name circe-server-buffer)) ""))
(cl-loop with servers = (if this-server (list circe-server-buffer) (circe-server-buffers)) ;;;###autoload
with current-buffer = (current-buffer) (defvar +irc--consult-circe-source
for server in servers `(:name "circe"
collect (buffer-name server) :hidden t
nconc :narrow ?c
(with-current-buffer server :category buffer
(cl-loop for buf in (circe-server-chat-buffers) :state ,#'consult--buffer-state
unless (eq buf current-buffer) :items ,(lambda () (mapcar #'buffer-name (+irc--circe-all-buffers)))))
collect (buffer-name buf)))))))
(switch-to-buffer buffer))))

View file

@ -141,9 +141,9 @@ playback.")
;; Fail gracefully if not in a circe buffer ;; Fail gracefully if not in a circe buffer
(global-set-key [remap tracking-next-buffer] #'+irc/tracking-next-buffer) (global-set-key [remap tracking-next-buffer] #'+irc/tracking-next-buffer)
(after! marginalia (when (featurep! :completion selectrum)
(when (featurep! :completion selectrum) (after! consult
(add-to-list 'marginalia-command-categories '(+irc/selectrum-jump-to-channel . buffer)))) (add-to-list 'consult-buffer-sources '+irc--consult-circe-source 'append)))
(map! :localleader (map! :localleader
(:map circe-mode-map (:map circe-mode-map