WeeChat als IRC-Client: Nicht-Standard ~/.config/weechat

Wie ich WeeChat mit ZNC und dem Lab-IRC-Stack betreibe — Bars, Buffer, Trigger, Secrets und Scripts jenseits der Defaults.
Table of contents

WeeChat ist mein IRC-Frontend: ein Prozess, viele Netzwerke, Logs auf Platte, und ein Config-Baum unter ~/.config/weechat, der seit Jahren mitwächst. Dieser Beitrag dokumentiert die Abweichungen von den Defaults — nicht die Installation, sondern das, was den Client im Alltag erträglich macht, besonders im Zusammenspiel mit dem ZNC + InspIRCd-Setup im Lab (bnc.this-is-fine.social:6697).

Platzhalter — später durch echten WeeChat-Screenshot ersetzen.

Was bewusst nicht Standard ist

BereichDefault-TendenzMein Setup
StartupLogo-Splashlook.display_logo = off, highmon-Buffer beim Start
LayoutStatus-Bar sichtbarstatus hidden; Channel-Name in title-Bar per Script-Item
BufferServer-Buffer pro Netzwerkirc.look.server_buffer = merge_with_core + autosort
RauschenAlle Joins/Parts sichtbarirc.look.smart_filter (+ account/chghost/join/quit)
SecretsKlartext in irc.confsec-Plugin + pass(1) für Passphrase und Server-Daten
HighlightsNur im ChannelExtra-highmon-Buffer via Trigger
HistoryNur WeeChat-Defaultshistman mit Patterns für sensible Commands

Alles Folgende liegt in Dateien unter ~/.config/weechat/.

Netzwerke und ZNC

Vier IRC-Server in irc.conf — drei über Bouncer, einer legacy direkt:

  • libera und hackint — gleicher ZNC-Endpunkt (${sec.data.bnc_addr_port}), verschiedene ZNC-Passwörter, TLS verify mit gepinntem Fingerprint, SASL external, ZNC-Capabilities (znc.in/server-time-iso, znc.in/self-message, …).
  • local — Lab-Bouncer unter bnc.this-is-fine.social/+6697 (siehe IRC-Lab-Post); TLS verify im LAN aus; Passwort in sec.
  • quakenet — direkt irc.quakenet.org/6667 ohne TLS; command für QuakeNet-Auth via ${sec.data.server_quakenet_q}; autojoin = #clan-rush.
flowchart LR WC[WeeChat] ZNC[ZNC TLS SASL] LAB[bnc.this-is-fine.social] INSP[InspIRCd hydra] QN[irc.quakenet.org plain] WC --> ZNC WC --> LAB LAB --> INSP WC --> QN

Gemeinsame Defaults in [server_default]: tls_cert auf User-PEM, nicks = ff0x,ff0x_,…, msg_part = “..” / msg_quit = “X_x”, part_closes_buffer = on, pv_buffer = independent.

# irc.conf (Auszug — Secrets redacted)
[server_default]
tls = on
tls_cert = "~/.local/secrets/weechat/ff0x.pem"
nicks = "ff0x,ff0x_,ffOx,ff0xy"
msg_part = ".."
msg_quit = "X_x"
part_closes_buffer = on
pv_buffer = independent

[server]
libera.addresses = "${sec.data.bnc_addr_port}"
libera.password = "ff0x/libera:"
libera.sasl_mechanism = external
libera.capabilities = "account-notify,away-notify,...,znc.in/self-message"

local.addresses = "bnc.this-is-fine.social/+6697"
local.password = "ff0x/local:…"   # verschlüsselt in sec.conf

quakenet.addresses = "irc.quakenet.org/6667"
quakenet.tls = off
quakenet.command = "/quote auth ff0x ${sec.data.server_quakenet_q}; /mode ff0x +xw"
Secrets außerhalb von irc.conf: Passphrase und ZNC-Passwörter liegen in sec.conf, entschlüsselt mit passphrase_command = "pass show apps/weechat/passphrase". Nach Rotation: pass oder sec.conf aktualisieren, dann /secure decrypt und Server reconnect.

Layout: Bars und Buffer

weechat.conf definiert ein eigenes Bar-Set — die Statuszeile unten ist absichtlich weg; Kontext steckt in der Title-Bar:

+-- buflist (oben) ----------------------------------+
| title: buffer_title | nicklist count | typing      |
+-- chat (Mitte) ---------------------+-- nicklist --+
|                                     |  (w>200)    |
+-- input (unten) --------------------+-------------+
status: hidden (Kontext aus title-Bar)
  • buflist oben.
  • title über dem Chat — u. a. buffer_title, Nicklist-Count, matrix_typing_notice (wenn das Script läuft).
  • nicklist rechts, nur wenn ${window.win_width} > 200.
  • input unten mit Search/Paste-Indikatoren.
  • status existiert, aber status.hidden = on.

Beim Start kein Logo, dafür gleich der Highlight-Monitor:

[startup]
display_logo = off
command_after_plugins = ";/buffer add highmon"

autosort.conf (v3-Regeln) hält highmon oben, Channels unten:

[v3]
rules = "["${if:${buffer.name}==highmon?100:0}", "${if:${buffer.full_name}==core.weechat?0:1}", "${if:${type}==server?0:1}", "${if:${type}==private?0:2}", "${if:${type}==channel?99}"]"

Gespeichertes Layout pinnt Server und highmon in weechat.conf [layout].

Look, Farben, Lesefluss

Wichtige look-Abweichungen:

  • read_marker = line mit als „zuletzt gelesen“-Trenner.
  • hotlist_* für merged Buffer und Relay-Clients (${info:relay_client_count,...} in Add-Conditions).
  • prefix_* rechtsbündig mit eigenen Join/Quit/Network-Glyphen (>>, <<, --).
  • nick_color_hash = djb2, leere Nick-Prefix/Suffix im Chat (Modes in der Nicklist).
  • filter blendet numerische 329 (Channel-Creation-Date) aus: irc_channel_creation_date = on;*;irc_329;*.

Die [color]-Section ist eine volle Grau/Orange-Palette (z. B. chat_highlight_bg = 202, Nick-Grautöne 238–246) — nicht das eingebaute Theme.

Highlight-Monitor (highmon)

Zwei Teile:

  1. Leerer Buffer highmon (Start + Titel via buffer_autoset.conf).
  2. Trigger highmon_like kopiert gehighlightete Channel-Privmsgs dorthin mit Server/Channel-Farben:
# trigger.conf (Konzept)
highmon_like.hook = print
highmon_like.conditions = "${tg_highlight} == 1 && ... channel ... irc_privmsg"

Pings an einem Ort — auch wenn der Ziel-Channel-Buffer in der autosort-Reihenfolge vergraben ist.

Trigger: Desktop-Notify und Passwort-Hygiene

Weitere aktive Trigger in trigger.conf:

TriggerRolle
beepDesktop-Notification via notify-send bei Highlight oder PV, nicht notify_none
cmd_pass / cmd_pass_registerNickServ/oper-/secure-Passwörter in Input und History verbergen
msg_authAuth-Substrings in ausgehenden IRC-Messages verbergen
server_passPASS und Ähnliches verbergen
oopsVersehentliches ls im Channel auf /names mappen
Trigger + histman zusammen: Ohne cmd_pass und histman-Patterns landen NickServ- und ZNC-Passwörter in Buffer-History und Log-Dateien — auch nach /secure. Beide Mechanismen aktiv halten.

Python / Perl Scripts (aus plugins.conf)

Konfigurierte Script-Optionen (script.conf: autoload an):

  • buffer_autohide — inaktive Buffer verstecken; Ausnahmen für core und BitlBee.
  • histman — Buffer-History beim Schließen; global speichern; Duplikate überspringen.
  • histsearch — farbige In-Buffer-Suche (ctrl-r in weechat.conf).
  • grep — Log-Dateien durchsuchen mit Limits.
  • text_item — eigenes chan_name-Bar-Item: ${color:243}${buffer.short_name}.
  • sysinfo (perl) — optionale Host-Stats in einer Bar (meist Legacy-Toggles).

Zusätzlich ein kleines lokales pv_info-Perl-Script unter ~/projects/weechat/weechat-pv_info/ für PV-Buffer (nicht mit WeeChat ausgeliefert).

Aliases und Keys

alias.conf kürzt Tippen — z. B. wc → ZNC clearbuffer + close, cbclean all + Buffer schließen, qauth → QuakeNet challenge auth, msgbuf → Command an anderen Buffer.

Keybindings (siehe [key] in weechat.conf):

  • meta-j-Grid springt zu Buffern *1*99 (vim-artig).
  • meta– / meta-= Filter togglen.
  • ctrl-s,ctrl-u alle Buffer unread markieren.
  • Maus auf Nicklist → query / kick / ban.

Relay und Logs

relay.conf für TLS vorbereitet (tls_cert_key unter ~/.local/secrets/weechat/relay.pem) mit IRC-Backlog-Optionen — mobile Clients an derselben Session.

logger.conf: auto_log = on, Logs unter ${weechat_data_dir}/logs, flush_delay = 120, Dateinamen lowercase.

Wartung

  • /set und /fset statt Hand-Edit an laufendem WeeChat.
  • Nach Plugin-Upgrades plugins.conf / script.conf diffen — WeeChat merged neue Defaults.
  • ZNC- oder NickServ-Rotation: sec.conf (oder pass) aktualisieren, /secure decrypt, Server reconnect.

Wenn der Platzhalter-Screenshot ersetzt wird: echtes Bar-Layout — buflist, grau/orange Transcript, Nicklist rechts, Tab highmon.