diff --git a/modules/app/irc/autoload/irc.el b/modules/app/irc/autoload/irc.el index 85f9f36c7..cc739fb78 100644 --- a/modules/app/irc/autoload/irc.el +++ b/modules/app/irc/autoload/irc.el @@ -72,6 +72,16 @@ argument) is non-nil only show channels in current server." ((featurep! :completion selectrum) #'+irc/selectrum-jump-to-channel) ((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 (defun +irc/tracking-next-buffer () "Disables switching to an unread buffer unless in the irc workspace." diff --git a/modules/app/irc/autoload/selectrum.el b/modules/app/irc/autoload/selectrum.el index 5bd5532a2..db343950f 100644 --- a/modules/app/irc/autoload/selectrum.el +++ b/modules/app/irc/autoload/selectrum.el @@ -2,24 +2,22 @@ ;;;###if (featurep! :completion selectrum) ;;;###autoload -(defun +irc/selectrum-jump-to-channel (&optional this-server) - "Jump to an open channel or server buffer with selectrum. If THIS-SERVER (universal -argument) is non-nil only show channels in current server." - (interactive "P") - (if (not (circe-server-buffers)) - (message "No circe buffers available") - (when (and this-server (not circe-server-buffer)) - (setq this-server nil)) - (when-let - ((buffer (completing-read - (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)) - with current-buffer = (current-buffer) - for server in servers - collect (buffer-name server) - nconc - (with-current-buffer server - (cl-loop for buf in (circe-server-chat-buffers) - unless (eq buf current-buffer) - collect (buffer-name buf))))))) - (switch-to-buffer buffer)))) +(defun +irc/selectrum-jump-to-channel () + "Jump to an open channel or server buffer with selectrum." + (interactive) + (require 'consult) + (consult--multi (list (plist-put +irc--consult-circe-source + :hidden nil)) + :narrow nil + :require-match t + :prompt "Jump to:" + :sort nil)) + +;;;###autoload +(defvar +irc--consult-circe-source + `(:name "circe" + :hidden t + :narrow ?c + :category buffer + :state ,#'consult--buffer-state + :items ,(lambda () (mapcar #'buffer-name (+irc--circe-all-buffers))))) diff --git a/modules/app/irc/config.el b/modules/app/irc/config.el index 2cb073adc..d301fc0db 100644 --- a/modules/app/irc/config.el +++ b/modules/app/irc/config.el @@ -141,9 +141,9 @@ playback.") ;; Fail gracefully if not in a circe buffer (global-set-key [remap tracking-next-buffer] #'+irc/tracking-next-buffer) - (after! marginalia - (when (featurep! :completion selectrum) - (add-to-list 'marginalia-command-categories '(+irc/selectrum-jump-to-channel . buffer)))) + (when (featurep! :completion selectrum) + (after! consult + (add-to-list 'consult-buffer-sources '+irc--consult-circe-source 'append))) (map! :localleader (:map circe-mode-map