hamacs/ha-irc.org
Howard Abrams d216ba8149 Convert to ERC from Circe
The PART suppression, the colored nick support, and the ability to
fill the buffer window with the messages got me to convert.
2022-04-04 10:27:11 -07:00

5.3 KiB

IRC and Bitlbee Interface

A literate programming configuration file for IRC communiction.

Introduction

My IRC needs are basic, but I'm not sure which I want to use.

ERC

  (use-package erc-hl-nicks
    :after erc)

  (use-package erc-image
    :after erc)

  (use-package erc
    :commands erc
    :config
    (setq
        erc-nick "howard-abrams"
        erc-user-full-name "Howard Abrams"
        erc-prompt ">>"
        erc-prompt-for-nickserv-password nil
        erc-auto-query 'bury
        erc-join-buffer 'bury
        erc-interpret-mirc-color t
        erc-rename-buffers t
        erc-hide-list '("JOIN" "PART" "QUIT")
        erc-track-enable-keybindings nil
        erc-track-visibility nil ; Only use the selected frame for visibility
        erc-fill-column 120
        erc-fill-function 'erc-fill-static
        erc-fill-static-center 20
        erc-autojoin-channels-alist '(("howardabrams.com" "#emacs" "#org-mode"))
        erc-quit-reason (lambda (s) (or s "Fading out..."))
        erc-modules
        '(autoaway autojoin button completion fill irccontrols keep-place
            list match menu move-to-prompt netsplit networks noncommands
            readonly ring stamp track hl-nicks)))

  (defun ha-erc-connect-irc ()
    "Connect to my favorite IRC server with ERC."
    (interactive)
    (let* ((auth-results (auth-source-search :host "howardabrams.com" :port 7777 :max 1))
           (auth-first   (first auth-results))
           (username     (plist-get auth-first :user))
           (password     (funcall (plist-get auth-first :secret))))
      (erc :server "howardabrams.com" :port 7777)
      (sit-for 1)
      (erc-cmd-QUOTE (format "PASS %s:%s" username password))))

I like to make sure the text formats to the size of the window:

  (defun ha-erc-resize-text ()
    "Resize the ERC text to fill the current window."
    (interactive)
    (setq erc-fill-column (1- (window-width))))

ZNC Server

I'm using my own ZNC server, and I need to log in with a password stored in my GPG auth storage:

  (defun ha-erc-reconnect-password ()
    "Send the reconnection password string."
    (interactive)

    (let* ((auth-results (auth-source-search :host "howardabrams.com" :port 7777 :max 1))
           (auth-first   (first auth-results))
           (username     (plist-get auth-first :user))
           (password     (funcall (plist-get auth-first :secret))))
      (erc-cmd-QUOTE (format "PASS %s:%s" username password))))

Key Bindings

Quick way to start and jump to my IRC world.

  (defun ha-irc-persp-start ()
    "Create an IRC workspace and start my IRC client."
    (interactive)
    (persp-switch "irc")
    (ha-erc-connect-irc))

  (defun ha-irc-persp-switch ()
    "Switch to the IRC workspace and load the next buffer."
    (interactive)
    (persp-switch "irc")
    (call-interactively 'erc-track-switch-buffer))

And some global keys to display them:

(ha-leader
  "a i" '("irc switch" . ha-irc-persp-switch)
  "a I" '("irc start"  . ha-irc-persp-start))

Let's create a leader for this mode:

  (general-create-definer ha-irc-leader
      :states '(normal visual motion)
      :keymaps '(erc-mode-map)
      :prefix "SPC m"
      :global-prefix "<f17>"
      :non-normal-prefix "S-SPC")

And a quick shortcut to call it:

  (ha-irc-leader
   "o" '("next channel" . erc-track-switch-buffer)
   "w" '("resize text" . ha-erc-resize-text)
   "r" '("reconnect" . ha-erc-connect-irc)
   "p" '("send password" . ha-erc-reconnect-password))

Display Configuration

Using the Doom Modeline to add notifications:

  (setq doom-modeline-irc t
        doom-modeline-irc-stylize 'identity)