;;; acdw-erc.el -*- lexical-binding: t; coding: utf-8-unix -*- ;; Author: Case Duckworth ;; Created: 24 May 2021 ;; Keywords: configuration ;; URL: https://tildegit.org/acdw/emacs ;; This file is NOT part of GNU Emacs. ;;; License: ;; Everyone is permitted to do whatever with this software, without ;; limitation. This software comes without any warranty whatsoever, ;; but with two pieces of advice: ;; - Don't hurt yourself. ;; - Make good choices. ;;; Commentary: ;; `acdw-erc' is a dumping ground for functions and stuff for ERC, so they ;; don't clutter up `init.el'. ;;; Code: (defgroup acdw-erc nil "Customizations for ERC." :group 'erc) ;;; Show a different header-line face when ERC is disconnected. ;; https://www.emacswiki.org/emacs/ErcModeline#h5o-1 (defface erc/header-line-disconnected '((t (:foreground "black" :background "indianred"))) "Face to use when ERC has been disconnected.") (defun erc/update-header-line-show-disconnected () "Use a different face in the header-line when disconnected." (erc-with-server-buffer (cond ((erc-server-process-alive) 'erc-header-line) (t 'erc/header-line-disconnected)))) ;;; Convenience functions ;; from Prelude: ;; https://github.com/bbatsov/prelude/blob/master/modules/prelude-erc.el#L114 (defcustom erc/servers nil "The list of IRC servers to connect to with `erc/connect'." :type '(list string)) (defcustom erc/bye-message "See You Space Cowpokes." "Quit message sent when calling `erc/disconnect'." :type 'string) (defun connect-to-erc (server &optional use-tls port nick) "Connects to IRC SERVER at PORT with NICK. If USE-TLS is non-nil, use TLS." (let* ((use-tls (or use-tls t)) (erc-fn (if use-tls #'erc-tls #'erc)) (port (or port (if use-tls 6697 6667))) (nick (or nick erc-nick))) (funcall erc-fn :server server :port port :nick nick))) (defun erc/connect () "Connect to all the servers in `erc/servers'." (interactive) (require 'erc) (mapcar #'connect-to-erc erc/servers)) (defun filter-server-buffers () (delq nil (mapcar (lambda (x) (and (erc-server-buffer-p x) x)) (buffer-list)))) (defun erc/reconnect () "Reconnect to all IRC servers." (interactive) (dolist (buffer (filter-server-buffers)) (with-message (format "Reconnecting to server: %s" (buffer-name buffer)) (with-current-buffer buffer (erc-server-reconnect))))) (defun erc/disconnect () "Disconnect from all IRC servers." (interactive) (dolist (buffer (filter-server-buffers)) (with-message (format "Killing server buffer: %s" (buffer-name buffer)) (with-current-buffer buffer (erc-quit-server erc/bye-message)))) ;; TODO: kill all channel buffers (force-mode-line-update)) (defun acdw-erc/prompt () "The prompt to show for ERC." ;; Rewrite s-truncate to avoid dependency. (let ((name (buffer-name)) (ellipsis "~") (len erc-fill-static-center)) (if (and len (> (length name) (- len 2))) (format "%s%s>" (substring name 0 (- len 2 (length ellipsis))) ellipsis) (format "%s%s>" name (let ((ss) ; Rewrite s-repeat to avoid dependency. (num (- len 2 (length name)))) (while (> num 0) (setq ss (cons " " ss)) (setq num (1- num))) (apply #'concat ss)))))) (defcustom erc-nick-truncate nil "The width at which to truncate a nick with `erc-format-truncate-@nick'." :group 'erc :type 'integer) (defalias 'erc-propertize 'propertize) ; I guess...taken out in 28 ? (defun erc-format-truncate-@nick (&optional user channel-data) "Format the nickname of USER as in `erc-format-@nick', with truncation. Truncation is customized using the `erc-nick-truncate' variable. See also `erc-format-nick-function'." (when user (let* ((nick (erc-server-user-nickname user)) (ellipsis "~") (max-len (- erc-nick-truncate 2 (length ellipsis)))) (concat (erc-propertize (erc-get-user-mode-prefix nick) 'font-lock-face 'erc-nick-prefix-face) (if (and max-len (> (length nick) max-len)) (format "%s%s" (substring nick 0 max-len) ellipsis) nick))))) ;;; Uh (defun acdw-erc/erc-switch-to-buffer (&optional arg) "Prompt for ERC buffer to switch to. Reverse prefix argument from `erc-switch-to-buffer'." (interactive "P") (erc-switch-to-buffer (not arg))) (provide 'acdw-erc) ;;; acdw-erc.el ends here