This works, I have been testing this code for over a year across three
networks, all with the same "<server>" name in the car position. I've
also tested the autodetaching through all kinds of buffer killing and
Emacs crashing. I've had this up at a blog post since October 2022.
---
contrib/clients.md | 42 ++++++++++++++++++++++++++++++++++++++++++
1 file changed, 42 insertions(+)
diff --git a/contrib/clients.md b/contrib/clients.md
index fc35e56..97e515e 100644
--- a/contrib/clients.md
+++ b/contrib/clients.md
@@ -48,6 +48,48 @@ The only thing needed here is the general config:
Then run `M-x irc`.
+Here, `"<server>"` means the server that is running soju. You can have multiple
+entries for different networks, just set the user-name correspondingly (and the
+`"<nick>"` if that's different). Even though the var is called
+`rcirc-server-alist`, it's not really an alist, it's just a list, and it's OK
+that multiple entries have the same `"<server>"`.
+
+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)))
+ (rcirc-send-privmsg
+ process "BouncerServ"
+ (format
+ "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.
+
+Also, rcirc parts the channel when you kill the buffer or change the major mode.
+To instead detach the channel when you do that, change `rcirc-clean-up-buffer`
+to this (after definining detach 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)))
+ (with-rcirc-server-buffer
+ (setq rcirc-buffer-alist
+ (rassq-delete-all buffer rcirc-buffer-alist)))
+ (rcirc-update-short-buffer-names)
+ (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 want to leave a channel, `/part` it
+before you kill it.
+
# [gamja]
gamja has been designed together with soju, so should have excellent
--
2.39.2