120 lines
4.5 KiB
EmacsLisp
120 lines
4.5 KiB
EmacsLisp
;;; app/irc/autoload/email.el -*- lexical-binding: t; -*-
|
|
|
|
(defvar +irc--workspace-name "*IRC*")
|
|
|
|
(defun +irc-setup-wconf (&optional inhibit-workspace)
|
|
(when (and (featurep! :ui workspaces)
|
|
(+workspace-exists-p +irc--workspace-name)
|
|
(not inhibit-workspace))
|
|
(+workspace-switch +irc--workspace-name 'auto-create))
|
|
(let ((buffers (doom-buffers-in-mode 'circe-mode nil t)))
|
|
(if buffers
|
|
(ignore (switch-to-buffer (car buffers)))
|
|
(require 'circe)
|
|
(delete-other-windows)
|
|
(switch-to-buffer (doom-fallback-buffer))
|
|
t)))
|
|
|
|
;;;###autoload
|
|
(defun =irc (&optional inhibit-workspace)
|
|
"Connect to IRC and auto-connect to all registered networks.
|
|
|
|
If INHIBIT-WORKSPACE (the universal argument) is non-nil, don't spawn a new
|
|
workspace for it."
|
|
(interactive "P")
|
|
(+irc-setup-wconf inhibit-workspace)
|
|
(cond ((doom-buffers-in-mode 'circe-mode (doom-buffer-list) t)
|
|
(message "Circe buffers are already open"))
|
|
(circe-network-options
|
|
(mapc #'circe (mapcar #'car circe-network-options)))
|
|
((call-interactively #'circe))))
|
|
|
|
;;;###autoload
|
|
(defun +irc/connect (&optional inhibit-workspace)
|
|
"Connect to a specific registered server.
|
|
|
|
If INHIBIT-WORKSPACE (the universal argument) is non-nil, don't spawn a new
|
|
workspace for it."
|
|
(interactive "P")
|
|
(and (+irc-setup-wconf inhibit-workspace)
|
|
(call-interactively #'circe)))
|
|
|
|
;;;###autoload
|
|
(defun +irc/send-message (who what)
|
|
"Send WHO a message containing WHAT."
|
|
(interactive "sWho: \nsWhat: ")
|
|
(circe-command-MSG who what))
|
|
|
|
;;;###autoload
|
|
(defun +irc/quit ()
|
|
"Kill current circe session and workgroup."
|
|
(interactive)
|
|
(unless (y-or-n-p "Really kill IRC session?")
|
|
(user-error "Aborted"))
|
|
(let (circe-channel-killed-confirmation
|
|
circe-server-killed-confirmation)
|
|
(when +irc--defer-timer
|
|
(cancel-timer +irc--defer-timer))
|
|
(disable-circe-notifications)
|
|
(mapc #'kill-buffer (doom-buffers-in-mode 'circe-mode (buffer-list) t))
|
|
(when (featurep! :ui workspaces)
|
|
(when (equal (+workspace-current-name) +irc--workspace-name)
|
|
(+workspace/delete +irc--workspace-name)))))
|
|
|
|
;;;###autoload
|
|
(defun +irc/ivy-jump-to-channel (&optional this-server)
|
|
"Jump to an open channel or server buffer with ivy. 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))
|
|
(ivy-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 (format " %s" (buffer-name buf)))))
|
|
:action #'+irc--ivy-switch-to-buffer-action
|
|
:preselect (buffer-name (current-buffer))
|
|
:keymap ivy-switch-buffer-map
|
|
:caller '+irc/ivy-jump-to-channel)))
|
|
|
|
(defun +irc--ivy-switch-to-buffer-action (buffer)
|
|
(when (stringp buffer)
|
|
(ivy--switch-buffer-action (string-trim-left buffer))))
|
|
|
|
;;;###autoload
|
|
(defun +irc/tracking-next-buffer ()
|
|
"Disables switching to an unread buffer unless in the irc workspace."
|
|
(interactive)
|
|
(when (derived-mode-p 'circe-mode)
|
|
(tracking-next-buffer)))
|
|
|
|
|
|
;;
|
|
;;; Hooks/fns
|
|
|
|
;;;###autoload
|
|
(defun +circe-buffer-p (buf)
|
|
"Return non-nil if BUF is a `circe-mode' buffer."
|
|
(with-current-buffer buf
|
|
(derived-mode-p 'circe-mode)))
|
|
|
|
;;;###autoload
|
|
(defun +irc--add-circe-buffer-to-persp-h ()
|
|
(when (and (bound-and-true-p persp-mode)
|
|
(+workspace-exists-p +irc--workspace-name))
|
|
(let ((persp (get-current-persp))
|
|
(buf (current-buffer)))
|
|
;; Add a new circe buffer to irc workspace when we're in another workspace
|
|
(unless (eq (safe-persp-name persp) +irc--workspace-name)
|
|
;; Add new circe buffers to the persp containing circe buffers
|
|
(persp-add-buffer buf (persp-get-by-name +irc--workspace-name))
|
|
;; Remove new buffer from accidental workspace
|
|
(persp-remove-buffer buf persp)))))
|