Alexander-Miller/treemacs@a6f9e9f1ce -> Alexander-Miller/treemacs@63e2bc207a Silex/docker.el@9bcefbe54d -> Silex/docker.el@4fc69969b1 akermu/emacs-libvterm@2b1392cb2b -> akermu/emacs-libvterm@2681120b77 bdarcus/bibtex-actions@6e3a194c3a -> bdarcus/bibtex-actions@08c6ca0e5b dash-docs-el/dash-docs@dafc8fc9f1 -> dash-docs-el/dash-docs@29848b6b34 dgutov/diff-hl@992559f98a -> dgutov/diff-hl@40c89a7b0d dimitri/switch-window@2801d9b3a9 -> dimitri/switch-window@8d9fe251d8 editorconfig/editorconfig-emacs@e10fa22b13 -> editorconfig/editorconfig-emacs@2ab86dc9a8 ema2159/centaur-tabs@9c7c936e4e -> ema2159/centaur-tabs@8b4249c405 emacs-circe/circe@d6f1fa1864 -> emacs-circe/circe@77e16de3b9 emacs-lsp/lsp-treemacs@905cc74726 -> emacs-lsp/lsp-treemacs@d82df44d63 emacsorphanage/osx-trash@0f1dc052d0 -> emacsorphanage/osx-trash@af74a2055a emacsorphanage/quickrun@35e91f4b6c -> emacsorphanage/quickrun@78317951cd flycheck/flycheck@21d52264aa -> flycheck/flycheck@784f184cdd hlissner/emacs-doom-themes@9e2680b918 -> hlissner/emacs-doom-themes@65fb964f36 https://git.savannah.gnu.org/git/emms.git@6e0aaaf4c559 -> https://git.savannah.gnu.org/git/emms.git@c42fab572846 ideasman42/emacs-spell-fu@1abcb5594e -> ideasman42/emacs-spell-fu@10823ae58f ideasman42/emacs-undo-fu@e0ad06b5ef -> ideasman42/emacs-undo-fu@34b27c01da joostkremers/writeroom-mode@b648b34017 -> joostkremers/writeroom-mode@7f4ec92404 kidd/org-gcal.el@4c2616a4f8 -> kidd/org-gcal.el@80e6f9501f magnars/expand-region.el@4b8322774d -> magnars/expand-region.el@95a773bd8f millejoh/emacs-ipython-notebook@09af85821e -> millejoh/emacs-ipython-notebook@0600c286bd mohkale/consult-eglot@a6aeb6fa07 -> mohkale/consult-eglot@28a09cc839 noctuid/link-hint.el@09ba5727d8 -> noctuid/link-hint.el@d3c5bacc9c rolandwalker/nav-flash@55786c9582 -> rolandwalker/nav-flash@2e31f32085 skeeto/elfeed@243add9e74 -> skeeto/elfeed@162d7d545e szermatt/emacs-bash-completion@65e54c6f9c -> szermatt/emacs-bash-completion@c5eaeed156 tarsius/hl-todo@5ac0076cfe -> tarsius/hl-todo@42f744ffb5 tecosaur/emacs-everywhere@64ba2e3f30 -> tecosaur/emacs-everywhere@da88fa2d04 tkf/emacs-request@f3a5b4352e -> tkf/emacs-request@2b68b3ca54 tmalsburg/helm-bibtex@a0d32ab167 -> tmalsburg/helm-bibtex@b85662081d yoshiki/yaml-mode@3a57058468 -> yoshiki/yaml-mode@63b637f846 yqrashawn/fd-dired@c223aee30a -> yqrashawn/fd-dired@458464771b
app/irc
Table of Contents TOC
Description
This module turns Emacs into an IRC client, capable of OS notifications.
Module Flags
This module provides no flags.
Plugins
Prerequisites
This module requires gnutls
for secure IRC connections to work.
macOS
brew install gnutls
Debian / Ubuntu
apt install gnutls-bin
Arch Linux
pacman -S gnutls
NixOS
environment.systemPackages = [ pkgs.gnutls ];
Features
An IRC Client in Emacs
To connect to IRC you can invoke the =irc
function using M-x
or your own
custom keybinding.
command | description |
---|---|
=irc |
Connect to IRC and all configured servers |
When in a circe buffer these keybindings will be available.
command | key | description |
---|---|---|
+irc/tracking-next-buffer |
SPC m a |
Switch to the next active buffer |
circe-command-JOIN |
SPC m j |
Join a channel |
+irc/send-message |
SPC m m |
Send a private message |
circe-command-NAMES |
SPC m n |
List the names of the current channel |
circe-command-PART |
SPC m p |
Part the current channel |
+irc/quit |
SPC m Q |
Kill the current circe session and workgroup |
circe-reconnect |
SPC m R |
Reconnect the current server |
Configuration
Use set-irc-server! SERVER PLIST
to configure IRC servers. Its second argument (a plist)
takes the same arguments as circe-network-options
.
;; if you omit =:host=, ~SERVER~ will be used instead.
(after! circe
(set-irc-server! "irc.libera.chat"
`(:tls t
:port 6697
:nick "doom"
:sasl-username "myusername"
:sasl-password "mypassword"
:channels ("#emacs"))))
However, it is a obviously a bad idea to store your password in plaintext, so here are ways to avoid that:
Pass: the unix password manager
Pass is my tool of choice. I use it to manage my passwords. If you activate the :tools pass module you get an elisp API through which to access your password store.
set-irc-server!
accepts a plist can use functions instead of strings.
+pass-get-user
and +pass-get-secret
can help here:
(set-irc-server! "irc.libera.chat"
`(:tls t
:port 6697
:nick "doom"
:sasl-username ,(+pass-get-user "irc/libera.chat")
:sasl-password ,(+pass-get-secret "irc/libera.chat")
:channels ("#emacs")))
But wait, there's more! This stores your password in a public variable which could be accessed or appear in backtraces. Not good! So we go a step further:
(set-irc-server! "irc.libera.chat"
`(:tls t
:port 6697
:nick "doom"
:sasl-username ,(+pass-get-user "irc/libera.chat")
:sasl-password (lambda (&rest _) (+pass-get-secret "irc/libera.chat"))
:channels ("#emacs")))
And you're good to go!
Note that +pass-get-user
tries to find your username by looking for the fields
listed in +pass-user-fields
(by default login
, user=
, username=
and
email
)=). An example configuration looks like
mysecretpassword username: myusername
Emacs' auth-source API
auth-source
is built into Emacs. As suggested in the circe wiki, you can store
(and retrieve) encrypted passwords with it.
(setq auth-sources '("~/.authinfo.gpg"))
(defun my-fetch-password (&rest params)
(require 'auth-source)
(let ((match (car (apply #'auth-source-search params))))
(if match
(let ((secret (plist-get match :secret)))
(if (functionp secret)
(funcall secret)
secret))
(error "Password not found for %S" params))))
(defun my-nickserv-password (server)
(my-fetch-password :user "forcer" :host "irc.libera.chat"))
(set-irc-server! "irc.libera.chat"
'(:tls t
:port 6697
:nick "doom"
:sasl-password my-nickserver-password
:channels ("#emacs")))