Idiomdrottning’s homepage

Detach rcirc channel to soju

Here’s how to detach an rcirc channel when using soju:

(defun-rcirc-command detach (channel)
  "Detach channel to soju."
  (interactive "sPart channel: ")
  (let ((channel (if (> (length channel) 0) channel target)))
     process "BouncerServ"
      "channel update %s -detached true -reattach-on highlight" channel))))

Soju/rcirc already lets you reattached detached channels with /join, and this lets you type /detach in a channel to detach it. This makes it easy to attach and detach channels. This method works by talking to BouncerServ, if there’s instead some fancy Modern IRC way to do it that’s better, let me know!

Also, rcirc parts the channel when you kill the buffer or change the major mode. To instead detach, change rcirc-clean-up-buffer to this (after definining detach as per above):

(defun rcirc-clean-up-buffer (reason)
  (let ((buffer (current-buffer)))
    (rcirc-clear-activity buffer)
    (when (and (rcirc-buffer-process)
	       (rcirc--connection-open-p (rcirc-buffer-process)))
	(setq rcirc-buffer-alist
	      (rassq-delete-all buffer rcirc-buffer-alist)))
      (when (rcirc-channel-p rcirc-target)
	(rcirc-cmd-detach rcirc-target)))
    (setq rcirc-target nil)))

This means that whenever you kill a channel buffer, you’ll just detach it and still be idling in it; when you actually do wanna leave a channel, /part it before you kill it.