From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: "J.P." Newsgroups: gmane.emacs.bugs Subject: bug#56340: Change erc dependencies Date: Sat, 16 Jul 2022 07:17:31 -0700 Message-ID: <877d4d9m6c.fsf__25251.6017457069$1657981103$gmane$org@neverwas.me> References: <87fsjk6eml.fsf@dick> <87o7y71yr1.fsf@gnus.org> <87czekcuxj.fsf@neverwas.me> <87sfng83n8.fsf_-_@neverwas.me> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="37197"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/29.0.50 (gnu/linux) Cc: Lars Ingebrigtsen , 56340@debbugs.gnu.org, Amin Bandali , emacs-erc@gnu.org To: dick.r.chiang@gmail.com Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Sat Jul 16 16:18:17 2022 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oCica-0009TL-GS for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 16 Jul 2022 16:18:16 +0200 Original-Received: from localhost ([::1]:54120 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1oCicZ-0005uv-2k for geb-bug-gnu-emacs@m.gmane-mx.org; Sat, 16 Jul 2022 10:18:15 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:50852) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1oCicN-0005uM-0P for bug-gnu-emacs@gnu.org; Sat, 16 Jul 2022 10:18:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:47894) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1oCicM-0003zg-Nl for bug-gnu-emacs@gnu.org; Sat, 16 Jul 2022 10:18:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1oCicM-0006xS-J8 for bug-gnu-emacs@gnu.org; Sat, 16 Jul 2022 10:18:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: "J.P." Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Sat, 16 Jul 2022 14:18:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 56340 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: patch Original-Received: via spool by 56340-submit@debbugs.gnu.org id=B56340.165798107126720 (code B ref 56340); Sat, 16 Jul 2022 14:18:02 +0000 Original-Received: (at 56340) by debbugs.gnu.org; 16 Jul 2022 14:17:51 +0000 Original-Received: from localhost ([127.0.0.1]:45649 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCic8-0006ws-PN for submit@debbugs.gnu.org; Sat, 16 Jul 2022 10:17:50 -0400 Original-Received: from mail-108-mta166.mxroute.com ([136.175.108.166]:43967) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1oCic5-0006we-8D for 56340@debbugs.gnu.org; Sat, 16 Jul 2022 10:17:47 -0400 Original-Received: from filter006.mxroute.com ([140.82.40.27] filter006.mxroute.com) (Authenticated sender: mN4UYu2MZsgR) by mail-108-mta166.mxroute.com (ZoneMTA) with ESMTPSA id 182075f38750000261.001 for <56340@debbugs.gnu.org> (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256); Sat, 16 Jul 2022 14:17:37 +0000 X-Zone-Loop: cd17f2de2ee8eee98c8ad13d9f2cb40fbaf94455c81d X-Originating-IP: [140.82.40.27] DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=neverwas.me ; s=x; h=Content-Type:MIME-Version:Message-ID:In-Reply-To:Date:References: Subject:Cc:To:From:Sender:Reply-To:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Id:List-Help:List-Unsubscribe:List-Subscribe: List-Post:List-Owner:List-Archive; bh=d9bULpqaeok3QlpV17rBnqFZdX4CcVERCrb2jVH2kas=; b=DRANpixS8wNvQ8L5X7hCF1u3e2 j0w241F7oSW3SChHm7Qj4P3XHRiNn/iP6tqm9HuV5pl7xCjBUZDCddubHaMNuQo1CIGE+oFmG3zIU EaxahArN8NX1aaXgK0t0RZZPlU05jR0VuNXzx5iAsE6qopXBF/OSx6aYqp5erTw8jP1rRY8ZcZPEO gnxoAJ3ztnaXw+bmfl8XV0RtDZL5UkrAZt7xRaDt3B5T7DEOIrHrAatJ7TvF2zdINrdTFpQXIIA5b LIlh2p6UdXT5mRI0i8Vxq5yK7NQM8pb71B/fP1G/NiS3nRfucEgQQXTy76zwPQhw+4jCr/zQiRlfa u2iS17GA==; In-Reply-To: <87sfng83n8.fsf_-_@neverwas.me> (J. P.'s message of "Mon, 04 Jul 2022 23:39:07 -0700") X-AuthUser: masked@neverwas.me X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane-mx.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.io gmane.emacs.bugs:237196 Archived-At: --=-=-= Content-Type: text/plain As an experiment, I've tried rearranging things into a more traditional layout, with most of the compile-time dependencies moved to a dedicated file [1]. This is mainly for show and does nothing for the close coupling and hard dependencies that have long plagued ERC from a design standpoint [2]. (There's definitely still something to be said for just having it all live in erc-backend.) Still, part of the impetus for collecting all the heavy stuff in one place was to avoid having to constantly check for hidden snags down the line. For example, AFAIK, the byte compiler doesn't catch stuff like the following, which are present in the original, "Don't do this" patch: Running $ emacs -Q -batch -f batch-byte-compile ./lisp/erc/erc-goodies.el and inspecting the output reveals missing inline expansions for calls to `erc-log', which are numerous, and which normally resemble something like (require 'erc) (byte-compile (macroexpand `(lambda (msg) ,(funcall (get 'erc-log 'compiler-macro) nil 'msg)))) The same goes for other files as well. For example, after doing $ emacs -Q -batch -f batch-byte-compile ./lisp/erc/erc-networks.el notice the missing expansions for `erc--target' accessors in lisp/erc/erc-networks.elc. Again, where we'd normally expect to see (require 'erc) (byte-compile (macroexpand `(lambda (targ) ,(funcall (get 'erc--target-string 'compiler-macro) 'erc--target 'targ)))) we're instead left with normal function calls. FWIW, the layout in the attached patch doesn't suffer from these complications. Of course, that's only one way to confront this stuff, perhaps even the dumbest. People at home with a clue, please chime in with your insights and shade (or be haunted 'til your dying day). Thanks! Overflow ~~~~~~~~ [1] If we did stick with a new file, what's the best name for such a thing? I just went with `erc-common', for now, but perhaps something ending in -macs or -core would be more faithful to the platform? [2] However, I was really hoping to start inching toward eventually making headway on a goal that's been with ERC since the old CVS days, and that's decoupling protocol handling from the display machinery, likely by abstracting away the particulars of network processes and I/O. This would open the door for "pluggable backends" supporting IRC-adjacent client protocols, such as those in use by WeeChat and Quassel (or even commercial entities, like IrcCloud). Or, at the very least, it'd allow us to start exploring proxy protocols, like IRC over WebSockets and bouncer multiplexing schemes. But erc-backend.el in its current form is the opposite of modular. It's hardwired to speak IRC over stream sockets. And while I'd really wanted to hold off on shuffling things around until we had a solid plan in place, I've come to accept the futility of that delusion. As such, I'm hoping we can use whatever shake up emerges from this bug report as a somewhat stable stepping stone to nudge things in a more modular direction over the next few minor releases. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-Move-ERC-s-core-dependencies-to-separate-file.patch >From 103c6f646d6aef18468dd3dae719dd11afa0f8a8 Mon Sep 17 00:00:00 2001 From: dickmao Date: Fri, 1 Jul 2022 11:06:51 -0400 Subject: [PATCH] Move ERC's core dependencies to separate file Asking people to order require's is about as effective as asking kids to keep off the grass. * lisp/erc/erc-backend.el (erc--target, erc-auto-query, erc-channel-list, erc-channel-users, erc-default-nicks, erc-default-recipients, erc-format-nick-function, erc-format-query-as-channel-p, erc-hide-prompt, erc-input-marker, erc-insert-marker, erc-invitation, erc-join-buffer, erc-kill-buffer-on-part, erc-kill-server-buffer-on-quit, erc-log-p, erc-minibuffer-ignored, erc-networks--id, erc-nick, erc-nick-change-attempt-count, erc-prompt-for-channel-key, erc-prompt-hidden, erc-reuse-buffers, erc-verbose-server-ping, erc-whowas-on-nosuchnick): Forward-declare variables. (erc--open-target, erc--target-from-string, erc-active-buffer, erc-add-default-channel, erc-banlist-update, erc-buffer-filter, erc-buffer-list-with-nick, erc-channel-begin-receiving-names, erc-channel-end-receiving-names, erc-channel-p, erc-channel-receive-names, erc-cmd-JOIN, erc-connection-established, erc-current-nick, erc-current-nick-p, erc-current-time, erc-default-target, erc-delete-default-channel, erc-display-error-notice, erc-display-server-message, erc-emacs-time-to-erc-time, erc-format-message, erc-format-privmessage, erc-get-buffer, erc-handle-login, erc-handle-user-status-change, erc-ignored-reply-p, erc-ignored-user-p, erc-is-message-ctcp-and-not-action-p, erc-is-message-ctcp-p, erc-log-irc-protocol, erc-login, erc-make-notice, erc-network, erc-networks--id-given, erc-networks--id-reload, erc-nickname-in-use, erc-parse-user, erc-process-away, erc-process-ctcp-query, erc-query-buffer-p, erc-remove-channel-member, erc-remove-channel-users, erc-remove-user, erc-sec-to-time, erc-server-buffer, erc-set-active-buffer, erc-set-current-nick, erc-set-modes, erc-time-diff, erc-trim-string, erc-update-mode-line, erc-update-mode-line-buffer, erc-wash-quit-reason, erc-display-message, erc-get-buffer-create, erc-process-ctcp-reply, erc-update-channel-topic, erc-update-modes, erc-update-user-nick, erc-open, erc-update-channel-member): Forward-declare functions. (erc-response, erc--with-memoization): Move to lisp/erc/erc-common.el. * lisp/erc/erc-common.el: New file. Change indentation for `erc-with-all-buffers-of-server' from 1 to 2. * lisp/erc/erc-goodies.el: Require `erc-common' instead of `erc'. (erc-controls-highlight-regexp, erc-controls-remove-regexp, erc-input-marker, erc-insert-marker, erc-server-process, erc-modules, erc-log-p): Forward declare variables. (erc-buffer-list, erc-error, erc-extract-command-from-line): Forward-declare functions. * lisp/erc/erc-networks.el (erc--target, erc-insert-marker, erc-kill-buffer-hook, erc-kill-server-hook, erc-modules, erc-rename-buffers, erc-reuse-buffers, erc-server-announced-name, erc-server-connected, erc-server-parameters, erc-server-process, erc-session-server): Forward declare variables. (erc--default-target, erc--get-isupport-entry, erc-buffer-filter, erc-current-nick, erc-display-error-notice, erc-downcase, erc-error, erc-get-buffer, erc-server-buffer, erc-server-process-alive): Forward-declare functions. (erc-obsolete-var): Also suppress free-variable warnings. * lisp/erc/erc.el: Require `erc-networks', `erc-goodies', and `erc-backend' at top of file. (erc--server-last-reconnect-count, erc--server-reconnecting, erc-channel-members-changed-hook, erc-network, erc-networks--id, erc-server-367-functions, erc-server-announced-name, erc-server-connect-function, erc-server-connected, erc-server-current-nick, erc-server-lag, erc-server-last-sent-time, erc-server-process, erc-server-quitting, erc-server-reconnect-count, erc-server-reconnecting, erc-session-client-certificate, erc-session-connector, erc-session-port, erc-session-server, erc-session-user-full-name) Remove superfluous forward declarations. (erc-message-parsed, tabbar--local-hlf, motif-version-string): Relocate forward declares to central location. (erc-session-password): Move to `erc-backend'. (erc-with-server-buffer, erc-server-user, erc-channel-user, erc-get-channel-user, erc-get-server-user): Move to lisp/erc/erc-common.el. (erc-add-server-user, erc-remove-server-user, erc-channel-user-owner-p, erc-channel-user-admin-p, erc-channel-user-op-p, erc-channel-user-halfop-p, erc-channel-user-voice-p): Convert from inline functions to normal functions. (define-erc-module, erc--target, erc--target-channel, erc--target-channel-local, erc-log, erc-log-aux, erc-with-buffer, erc-with-all-buffers-of-server): Move to lisp/erc/erc-common.el. (erc-channel-members-changed-hook): Relocate option to avoid compiler warning. (erc-input, erc--input-split): Move to lisp/erc/erc-common.el. (erc-controls-strip): Remove forward declaration temporarily until this file stops requiring `erc-goodies'. * test/lisp/erc/erc-networks-tests.el: Require `erc' instead of `erc-networks'. * test/lisp/erc/erc.el (erc--meta--backend-dependencies): Remove unused test. --- lisp/erc/erc-backend.el | 127 ++++++++-- lisp/erc/erc-common.el | 264 +++++++++++++++++++++ lisp/erc/erc-goodies.el | 17 +- lisp/erc/erc-networks.el | 29 ++- lisp/erc/erc.el | 346 ++++------------------------ test/lisp/erc/erc-networks-tests.el | 2 +- test/lisp/erc/erc-tests.el | 21 -- 7 files changed, 457 insertions(+), 349 deletions(-) create mode 100644 lisp/erc/erc-common.el diff --git a/lisp/erc/erc-backend.el b/lisp/erc/erc-backend.el index 8be4894ecb..b4c9d538b7 100644 --- a/lisp/erc/erc-backend.el +++ b/lisp/erc/erc-backend.el @@ -99,24 +99,117 @@ ;;; Code: (eval-when-compile (require 'cl-lib)) -;; There's a fairly strong mutual dependency between erc.el and erc-backend.el. -;; Luckily, erc.el does not need erc-backend.el for macroexpansion whereas the -;; reverse is true: -(require 'erc) +(require 'erc-common) + +(defvar erc--target) +(defvar erc-auto-query) +(defvar erc-channel-list) +(defvar erc-channel-users) +(defvar erc-default-nicks) +(defvar erc-default-recipients) +(defvar erc-format-nick-function) +(defvar erc-format-query-as-channel-p) +(defvar erc-hide-prompt) +(defvar erc-input-marker) +(defvar erc-insert-marker) +(defvar erc-invitation) +(defvar erc-join-buffer) +(defvar erc-kill-buffer-on-part) +(defvar erc-kill-server-buffer-on-quit) +(defvar erc-log-p) +(defvar erc-minibuffer-ignored) +(defvar erc-networks--id) +(defvar erc-nick) +(defvar erc-nick-change-attempt-count) +(defvar erc-prompt-for-channel-key) +(defvar erc-prompt-hidden) +(defvar erc-reuse-buffers) +(defvar erc-verbose-server-ping) +(defvar erc-whowas-on-nosuchnick) + +(declare-function erc--open-target "erc" (target)) +(declare-function erc--target-from-string "erc" (string)) +(declare-function erc-active-buffer "erc" nil) +(declare-function erc-add-default-channel "erc" (channel)) +(declare-function erc-banlist-update "erc" (proc parsed)) +(declare-function erc-buffer-filter "erc" (predicate &optional proc)) +(declare-function erc-buffer-list-with-nick "erc" (nick proc)) +(declare-function erc-channel-begin-receiving-names "erc" nil) +(declare-function erc-channel-end-receiving-names "erc" nil) +(declare-function erc-channel-p "erc" (channel)) +(declare-function erc-channel-receive-names "erc" (names-string)) +(declare-function erc-cmd-JOIN "erc" (channel &optional key)) +(declare-function erc-connection-established "erc" (proc parsed)) +(declare-function erc-current-nick "erc" nil) +(declare-function erc-current-nick-p "erc" (nick)) +(declare-function erc-current-time "erc" (&optional specified-time)) +(declare-function erc-default-target "erc" nil) +(declare-function erc-delete-default-channel "erc" (channel &optional buffer)) +(declare-function erc-display-error-notice "erc" (parsed string)) +(declare-function erc-display-server-message "erc" (_proc parsed)) +(declare-function erc-emacs-time-to-erc-time "erc" (&optional specified-time)) +(declare-function erc-format-message "erc" (msg &rest args)) +(declare-function erc-format-privmessage "erc" (nick msg privp msgp)) +(declare-function erc-get-buffer "erc" (target &optional proc)) +(declare-function erc-handle-login "erc" nil) +(declare-function erc-handle-user-status-change "erc" (type nlh &optional l)) +(declare-function erc-ignored-reply-p "erc" (msg tgt proc)) +(declare-function erc-ignored-user-p "erc" (spec)) +(declare-function erc-is-message-ctcp-and-not-action-p "erc" (message)) +(declare-function erc-is-message-ctcp-p "erc" (message)) +(declare-function erc-log-irc-protocol "erc" (string &optional outbound)) +(declare-function erc-login "erc" nil) +(declare-function erc-make-notice "erc" (message)) +(declare-function erc-network "erc-networks" nil) +(declare-function erc-networks--id-given "erc-networks" (arg &rest args)) +(declare-function erc-networks--id-reload "erc-networks" (arg &rest args)) +(declare-function erc-nickname-in-use "erc" (nick reason)) +(declare-function erc-parse-user "erc" (string)) +(declare-function erc-process-away "erc" (proc away-p)) +(declare-function erc-process-ctcp-query "erc" (proc parsed nick login host)) +(declare-function erc-query-buffer-p "erc" (&optional buffer)) +(declare-function erc-remove-channel-member "erc" (channel nick)) +(declare-function erc-remove-channel-users "erc" nil) +(declare-function erc-remove-user "erc" (nick)) +(declare-function erc-sec-to-time "erc" (ns)) +(declare-function erc-server-buffer "erc" nil) +(declare-function erc-set-active-buffer "erc" (buffer)) +(declare-function erc-set-current-nick "erc" (nick)) +(declare-function erc-set-modes "erc" (tgt mode-string)) +(declare-function erc-time-diff "erc" (t1 t2)) +(declare-function erc-trim-string "erc" (s)) +(declare-function erc-update-mode-line "erc" (&optional buffer)) +(declare-function erc-update-mode-line-buffer "erc" (buffer)) +(declare-function erc-wash-quit-reason "erc" (reason nick login host)) + +(declare-function erc-display-message "erc" + (parsed type buffer msg &rest args)) +(declare-function erc-get-buffer-create "erc" + (server port target &optional tgt-info id)) +(declare-function erc-process-ctcp-reply "erc" + (proc parsed nick login host msg)) +(declare-function erc-update-channel-topic "erc" + (channel topic &optional modify)) +(declare-function erc-update-modes "erc" + (tgt mode-string &optional _nick _host _login)) +(declare-function erc-update-user-nick "erc" + (nick &optional new-nick host login full-name info)) +(declare-function erc-open "erc" + (&optional server port nick full-name connect passwd tgt-list + channel process client-certificate user id)) +(declare-function erc-update-channel-member "erc" + (channel nick new-nick + &optional add voice halfop op admin owner host + login full-name info update-message-time)) ;;;; Variables and options +(defvar-local erc-session-password nil + "The password used for the current session.") + (defvar erc-server-responses (make-hash-table :test #'equal) "Hash table mapping server responses to their handler hooks.") -(cl-defstruct (erc-response (:conc-name erc-response.)) - (unparsed "" :type string) - (sender "" :type string) - (command "" :type string) - (command-args '() :type list) - (contents "" :type string) - (tags '() :type list)) - ;;; User data (defvar-local erc-server-current-nick nil @@ -1673,16 +1766,6 @@ erc--parse-isupport-value (split-string value ",") (list value))))) -(defmacro erc--with-memoization (table &rest forms) - "Adapter to be migrated to erc-compat." - (declare (indent defun)) - `(cond - ((fboundp 'with-memoization) - (with-memoization ,table ,@forms)) ; 29.1 - ((fboundp 'cl--generic-with-memoization) - (cl--generic-with-memoization ,table ,@forms)) - (t ,@forms))) - (defun erc--get-isupport-entry (key &optional single) "Return an item for \"ISUPPORT\" token KEY, a symbol. When a lookup fails return nil. Otherwise return a list whose diff --git a/lisp/erc/erc-common.el b/lisp/erc/erc-common.el new file mode 100644 index 0000000000..0e63615b17 --- /dev/null +++ b/lisp/erc/erc-common.el @@ -0,0 +1,264 @@ +;;; erc-common.el --- Macros and types for ERC -*- lexical-binding:t -*- + +;; Copyright (C) 2022 Free Software Foundation, Inc. +;; +;; Maintainer: Amin Bandali , F. Jason Park +;; Keywords: comm, IRC, chat, client, internet +;; +;; This file is part of GNU Emacs. +;; +;; GNU Emacs is free software: you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published +;; by the Free Software Foundation, either version 3 of the License, +;; or (at your option) any later version. +;; +;; GNU Emacs is distributed in the hope that it will be useful, but +;; WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;; General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with GNU Emacs. If not, see . + +;;; Commentary: +;;; Code: + +(eval-when-compile (require 'cl-lib) (require 'subr-x)) + +(defvar erc-channel-users) +(defvar erc-dbuf) +(defvar erc-log-p) +(defvar erc-server-users) +(defvar erc-session-server) + +(declare-function erc-downcase "erc" (string)) +(declare-function erc-get-buffer "erc" (target &optional proc)) +(declare-function erc-server-buffer "erc" nil) + +(cl-defstruct erc-input + string insertp sendp) + +(cl-defstruct (erc--input-split (:include erc-input)) + lines cmdp) + +(cl-defstruct (erc-server-user (:type vector) :named) + ;; User data + nickname host login full-name info + ;; Buffers + ;; + ;; This is an alist of the form (BUFFER . CHANNEL-DATA), where + ;; CHANNEL-DATA is either nil or an erc-channel-user struct. + (buffers nil)) + +(cl-defstruct (erc-channel-user (:type vector) :named) + voice halfop op admin owner + ;; Last message time (in the form of the return value of + ;; (current-time) + ;; + ;; This is useful for ordered name completion. + (last-message-time nil)) + +(cl-defstruct erc--target + (string "" :type string :documentation "Received name of target.") + (symbol nil :type symbol :documentation "Case-mapped name as symbol.")) + +;; At some point, it may make sense to add a query type with an +;; account field, which may help support reassociation across +;; reconnects and nick changes (likely requires v3 extensions). +;; +;; These channel variants should probably take on a `joined' field to +;; track "joinedness", which `erc-server-JOIN', `erc-server-PART', +;; etc. should toggle. Functions like `erc--current-buffer-joined-p' +;; may find it useful. + +(cl-defstruct (erc--target-channel (:include erc--target))) +(cl-defstruct (erc--target-channel-local (:include erc--target-channel))) + +(cl-defstruct (erc-response (:conc-name erc-response.)) + (unparsed "" :type string) + (sender "" :type string) + (command "" :type string) + (command-args '() :type list) + (contents "" :type string) + (tags '() :type list)) + +(defmacro define-erc-module (name alias doc enable-body disable-body + &optional local-p) + "Define a new minor mode using ERC conventions. +Symbol NAME is the name of the module. +Symbol ALIAS is the alias to use, or nil. +DOC is the documentation string to use for the minor mode. +ENABLE-BODY is a list of expressions used to enable the mode. +DISABLE-BODY is a list of expressions used to disable the mode. +If LOCAL-P is non-nil, the mode will be created as a buffer-local +mode, rather than a global one. + +This will define a minor mode called erc-NAME-mode, possibly +an alias erc-ALIAS-mode, as well as the helper functions +erc-NAME-enable, and erc-NAME-disable. + +Example: + + ;;;###autoload(autoload \\='erc-replace-mode \"erc-replace\") + (define-erc-module replace nil + \"This mode replaces incoming text according to `erc-replace-alist'.\" + ((add-hook \\='erc-insert-modify-hook + #\\='erc-replace-insert)) + ((remove-hook \\='erc-insert-modify-hook + #\\='erc-replace-insert)))" + (declare (doc-string 3) (indent defun)) + (let* ((sn (symbol-name name)) + (mode (intern (format "erc-%s-mode" (downcase sn)))) + (group (intern (format "erc-%s" (downcase sn)))) + (enable (intern (format "erc-%s-enable" (downcase sn)))) + (disable (intern (format "erc-%s-disable" (downcase sn))))) + `(progn + (define-minor-mode + ,mode + ,(format "Toggle ERC %S mode. +With a prefix argument ARG, enable %s if ARG is positive, +and disable it otherwise. If called from Lisp, enable the mode +if ARG is omitted or nil. +%s" name name doc) + ;; FIXME: We don't know if this group exists, so this `:group' may + ;; actually just silence a valid warning about the fact that the var + ;; is not associated with any group. + :global ,(not local-p) :group (quote ,group) + (if ,mode + (,enable) + (,disable))) + (defun ,enable () + ,(format "Enable ERC %S mode." + name) + (interactive) + (add-to-list 'erc-modules (quote ,name)) + (setq ,mode t) + ,@enable-body) + (defun ,disable () + ,(format "Disable ERC %S mode." + name) + (interactive) + (setq erc-modules (delq (quote ,name) erc-modules)) + (setq ,mode nil) + ,@disable-body) + ,(when (and alias (not (eq name alias))) + `(defalias + ',(intern + (format "erc-%s-mode" + (downcase (symbol-name alias)))) + #',mode)) + ;; For find-function and find-variable. + (put ',mode 'definition-name ',name) + (put ',enable 'definition-name ',name) + (put ',disable 'definition-name ',name)))) + +(defmacro erc-with-buffer (spec &rest body) + "Execute BODY in the buffer associated with SPEC. + +SPEC should have the form + + (TARGET [PROCESS]) + +If TARGET is a buffer, use it. Otherwise, use the buffer +matching TARGET in the process specified by PROCESS. + +If PROCESS is nil, use the current `erc-server-process'. +See `erc-get-buffer' for details. + +See also `with-current-buffer'. + +\(fn (TARGET [PROCESS]) BODY...)" + (declare (indent 1) (debug ((form &optional form) body))) + (let ((buf (make-symbol "buf")) + (proc (make-symbol "proc")) + (target (make-symbol "target")) + (process (make-symbol "process"))) + `(let* ((,target ,(car spec)) + (,process ,(cadr spec)) + (,buf (if (bufferp ,target) + ,target + (let ((,proc (or ,process + (and (processp erc-server-process) + erc-server-process)))) + (if (and ,target ,proc) + (erc-get-buffer ,target ,proc)))))) + (when (buffer-live-p ,buf) + (with-current-buffer ,buf + ,@body))))) + +(defmacro erc-with-server-buffer (&rest body) + "Execute BODY in the current ERC server buffer. +If no server buffer exists, return nil." + (declare (indent 0) (debug (body))) + (let ((buffer (make-symbol "buffer"))) + `(let ((,buffer (erc-server-buffer))) + (when (buffer-live-p ,buffer) + (with-current-buffer ,buffer + ,@body))))) + +(defmacro erc-with-all-buffers-of-server (process pred &rest forms) + "Execute FORMS in all buffers which have same process as this server. +FORMS will be evaluated in all buffers having the process PROCESS and +where PRED matches or in all buffers of the server process if PRED is +nil." + (declare (indent 2) (debug (form form body))) + (macroexp-let2 nil pred pred + `(erc-buffer-filter (lambda () + (when (or (not ,pred) (funcall ,pred)) + ,@forms)) + ,process))) + +(defun erc-log-aux (string) + "Do the debug logging of STRING." + (let ((cb (current-buffer)) + (point 1) + (was-eob nil) + (session-buffer (erc-server-buffer))) + (if session-buffer + (progn + (set-buffer session-buffer) + (if (not (and erc-dbuf (bufferp erc-dbuf) (buffer-live-p erc-dbuf))) + (progn + (setq erc-dbuf (get-buffer-create + (concat "*ERC-DEBUG: " + erc-session-server "*"))))) + (set-buffer erc-dbuf) + (setq point (point)) + (setq was-eob (eobp)) + (goto-char (point-max)) + (insert (concat "** " string "\n")) + (if was-eob (goto-char (point-max)) + (goto-char point)) + (set-buffer cb)) + (message "ERC: ** %s" string)))) + +(define-inline erc-log (string) + "Logs STRING if logging is on (see `erc-log-p')." + (inline-quote + (when erc-log-p + (erc-log-aux ,string)))) + +(define-inline erc-get-channel-user (nick) + "Find NICK in the current buffer's `erc-channel-users' hash table." + (inline-quote (gethash (erc-downcase ,nick) erc-channel-users))) + +(define-inline erc-get-server-user (nick) + "Find NICK in the current server's `erc-server-users' hash table." + (inline-letevals (nick) + (inline-quote (erc-with-server-buffer + (gethash (erc-downcase ,nick) erc-server-users))))) + +;; FIXME move this to erc-compat +(defmacro erc--with-memoization (table &rest forms) + "Adapter to be migrated to erc-compat." + (declare (indent defun)) + `(cond + ((fboundp 'with-memoization) + (with-memoization ,table ,@forms)) ; 29.1 + ((fboundp 'cl--generic-with-memoization) + (cl--generic-with-memoization ,table ,@forms)) + (t ,@forms))) + +(provide 'erc-common) + +;;; erc-common.el ends here diff --git a/lisp/erc/erc-goodies.el b/lisp/erc/erc-goodies.el index 8fef23945d..59b5f01f23 100644 --- a/lisp/erc/erc-goodies.el +++ b/lisp/erc/erc-goodies.el @@ -29,10 +29,23 @@ ;;; Code: -(require 'erc) - ;;; Imenu support +(require 'erc-common) + +(defvar erc-controls-highlight-regexp) +(defvar erc-controls-remove-regexp) +(defvar erc-input-marker) +(defvar erc-insert-marker) +(defvar erc-server-process) +(defvar erc-modules) +(defvar erc-log-p) + +(declare-function erc-buffer-list "erc" (&optional predicate proc)) +(declare-function erc-error "erc" (&rest args)) +(declare-function erc-extract-command-from-line "erc" (line)) +(declare-function erc-beg-of-input-line "erc" nil) + (defun erc-imenu-setup () "Setup Imenu support in an ERC buffer." (setq-local imenu-create-index-function #'erc-create-imenu-index)) diff --git a/lisp/erc/erc-networks.el b/lisp/erc/erc-networks.el index 091b8aa92d..186fbca18f 100644 --- a/lisp/erc/erc-networks.el +++ b/lisp/erc/erc-networks.el @@ -39,8 +39,33 @@ ;;; Code: -(require 'erc) (eval-when-compile (require 'cl-lib)) +(require 'erc-common) + +(defvar erc--target) +(defvar erc-insert-marker) +(defvar erc-kill-buffer-hook) +(defvar erc-kill-server-hook) +(defvar erc-modules) +(defvar erc-rename-buffers) +(defvar erc-reuse-buffers) +(defvar erc-server-announced-name) +(defvar erc-server-connected) +(defvar erc-server-parameters) +(defvar erc-server-process) +(defvar erc-session-server) + +(declare-function erc--default-target "erc" nil) +(declare-function erc--get-isupport-entry "erc-backend" (key &optional single)) +(declare-function erc-buffer-filter "erc" (predicate &optional proc)) +(declare-function erc-current-nick "erc" nil) +(declare-function erc-display-error-notice "erc" (parsed string)) +(declare-function erc-downcase "erc" (string)) +(declare-function erc-error "erc" (&rest args)) +(declare-function erc-get-buffer "erc" (target &optional proc)) +(declare-function erc-server-buffer "erc" nil) +(declare-function erc-server-process-alive "erc-backend" (&optional buffer)) +(declare-function erc-set-active-buffer "erc" (buffer)) ;; Variables @@ -813,7 +838,7 @@ erc-networks--id-given (erc-networks--id-symbol nid)) (cl-generic-define-context-rewriter erc-obsolete-var (var spec) - `((with-suppressed-warnings ((obsolete ,var)) ,var) ,spec)) + `((with-suppressed-warnings ((obsolete ,var) (free-vars ,var)) ,var) ,spec)) ;; As a catch-all, derive the symbol from the unquoted printed repr. (cl-defgeneric erc-networks--id-create (id) diff --git a/lisp/erc/erc.el b/lisp/erc/erc.el index 0a16831fba..d97e8a65f5 100644 --- a/lisp/erc/erc.el +++ b/lisp/erc/erc.el @@ -60,6 +60,9 @@ (load "erc-loaddefs" 'noerror 'nomessage) +(require 'erc-networks) +(require 'erc-goodies) +(require 'erc-backend) (require 'cl-lib) (require 'format-spec) (require 'pp) @@ -130,29 +133,12 @@ erc-scripts "Running scripts at startup and with /LOAD." :group 'erc) -;; Defined in erc-backend -(defvar erc--server-last-reconnect-count) -(defvar erc--server-reconnecting) -(defvar erc-channel-members-changed-hook) -(defvar erc-network) -(defvar erc-networks--id) -(defvar erc-server-367-functions) -(defvar erc-server-announced-name) -(defvar erc-server-connect-function) -(defvar erc-server-connected) -(defvar erc-server-current-nick) -(defvar erc-server-lag) -(defvar erc-server-last-sent-time) -(defvar erc-server-process) -(defvar erc-server-quitting) -(defvar erc-server-reconnect-count) -(defvar erc-server-reconnecting) -(defvar erc-session-client-certificate) -(defvar erc-session-connector) -(defvar erc-session-port) -(defvar erc-session-server) -(defvar erc-session-user-full-name) -(defvar erc-session-username) +;; Forward declarations +(defvar erc-message-parsed) + +(defvar tabbar--local-hlf) +(defvar motif-version-string) +(defvar gtk-version-string) ;; tunable connection and authentication parameters @@ -347,9 +333,6 @@ erc-channel-hide-list :group 'erc-ignore :type 'erc-message-type) -(defvar-local erc-session-password nil - "The password used for the current session.") - (defcustom erc-disconnected-hook nil "Run this hook with arguments (NICK IP REASON) when disconnected. This happens before automatic reconnection. Note, that @@ -449,54 +432,14 @@ erc-downcase erc--casemapping-rfc1459)) (buffer-string))))) -(defmacro erc-with-server-buffer (&rest body) - "Execute BODY in the current ERC server buffer. -If no server buffer exists, return nil." - (declare (indent 0) (debug (body))) - (let ((buffer (make-symbol "buffer"))) - `(let ((,buffer (erc-server-buffer))) - (when (buffer-live-p ,buffer) - (with-current-buffer ,buffer - ,@body))))) - -(cl-defstruct (erc-server-user (:type vector) :named) - ;; User data - nickname host login full-name info - ;; Buffers - ;; - ;; This is an alist of the form (BUFFER . CHANNEL-DATA), where - ;; CHANNEL-DATA is either nil or an erc-channel-user struct. - (buffers nil) - ) - -(cl-defstruct (erc-channel-user (:type vector) :named) - voice halfop op admin owner - ;; Last message time (in the form of the return value of - ;; (current-time) - ;; - ;; This is useful for ordered name completion. - (last-message-time nil)) - -(define-inline erc-get-channel-user (nick) - "Find NICK in the current buffer's `erc-channel-users' hash table." - (inline-quote (gethash (erc-downcase ,nick) erc-channel-users))) - -(define-inline erc-get-server-user (nick) - "Find NICK in the current server's `erc-server-users' hash table." - (inline-letevals (nick) - (inline-quote (erc-with-server-buffer - (gethash (erc-downcase ,nick) erc-server-users))))) - -(define-inline erc-add-server-user (nick user) +(defun erc-add-server-user (nick user) "This function is for internal use only. Adds USER with nickname NICK to the `erc-server-users' hash table." - (inline-letevals (nick user) - (inline-quote - (erc-with-server-buffer - (puthash (erc-downcase ,nick) ,user erc-server-users))))) + (erc-with-server-buffer + (puthash (erc-downcase nick) user erc-server-users))) -(define-inline erc-remove-server-user (nick) +(defun erc-remove-server-user (nick) "This function is for internal use only. Removes the user with nickname NICK from the `erc-server-users' @@ -504,10 +447,8 @@ erc-remove-server-user `erc-channel-users' lists of other buffers. See also: `erc-remove-user'." - (inline-letevals (nick) - (inline-quote - (erc-with-server-buffer - (remhash (erc-downcase ,nick) erc-server-users))))) + (erc-with-server-buffer + (remhash (erc-downcase nick) erc-server-users))) (defun erc-change-user-nickname (user new-nick) "This function is for internal use only. @@ -578,55 +519,45 @@ erc-remove-channel-users erc-channel-users) (clrhash erc-channel-users))) -(define-inline erc-channel-user-owner-p (nick) +(defun erc-channel-user-owner-p (nick) "Return non-nil if NICK is an owner of the current channel." - (inline-letevals (nick) - (inline-quote - (and ,nick - (hash-table-p erc-channel-users) - (let ((cdata (erc-get-channel-user ,nick))) - (and cdata (cdr cdata) - (erc-channel-user-owner (cdr cdata)))))))) - -(define-inline erc-channel-user-admin-p (nick) + (and nick + (hash-table-p erc-channel-users) + (let ((cdata (erc-get-channel-user nick))) + (and cdata (cdr cdata) + (erc-channel-user-owner (cdr cdata)))))) + +(defun erc-channel-user-admin-p (nick) "Return non-nil if NICK is an admin in the current channel." - (inline-letevals (nick) - (inline-quote - (and ,nick + (and nick (hash-table-p erc-channel-users) - (let ((cdata (erc-get-channel-user ,nick))) + (let ((cdata (erc-get-channel-user nick))) (and cdata (cdr cdata) - (erc-channel-user-admin (cdr cdata)))))))) + (erc-channel-user-admin (cdr cdata)))))) -(define-inline erc-channel-user-op-p (nick) +(defun erc-channel-user-op-p (nick) "Return non-nil if NICK is an operator in the current channel." - (inline-letevals (nick) - (inline-quote - (and ,nick + (and nick (hash-table-p erc-channel-users) - (let ((cdata (erc-get-channel-user ,nick))) + (let ((cdata (erc-get-channel-user nick))) (and cdata (cdr cdata) - (erc-channel-user-op (cdr cdata)))))))) + (erc-channel-user-op (cdr cdata)))))) -(define-inline erc-channel-user-halfop-p (nick) +(defun erc-channel-user-halfop-p (nick) "Return non-nil if NICK is a half-operator in the current channel." - (inline-letevals (nick) - (inline-quote - (and ,nick + (and nick (hash-table-p erc-channel-users) - (let ((cdata (erc-get-channel-user ,nick))) + (let ((cdata (erc-get-channel-user nick))) (and cdata (cdr cdata) - (erc-channel-user-halfop (cdr cdata)))))))) + (erc-channel-user-halfop (cdr cdata)))))) -(define-inline erc-channel-user-voice-p (nick) +(defun erc-channel-user-voice-p (nick) "Return non-nil if NICK has voice in the current channel." - (inline-letevals (nick) - (inline-quote - (and ,nick + (and nick (hash-table-p erc-channel-users) - (let ((cdata (erc-get-channel-user ,nick))) + (let ((cdata (erc-get-channel-user nick))) (and cdata (cdr cdata) - (erc-channel-user-voice (cdr cdata)))))))) + (erc-channel-user-voice (cdr cdata)))))) (defun erc-get-channel-user-list () "Return a list of users in the current channel. @@ -1375,96 +1306,6 @@ erc-debug-log-file (defvar-local erc-dbuf nil) -(defmacro define-erc-module (name alias doc enable-body disable-body - &optional local-p) - "Define a new minor mode using ERC conventions. -Symbol NAME is the name of the module. -Symbol ALIAS is the alias to use, or nil. -DOC is the documentation string to use for the minor mode. -ENABLE-BODY is a list of expressions used to enable the mode. -DISABLE-BODY is a list of expressions used to disable the mode. -If LOCAL-P is non-nil, the mode will be created as a buffer-local -mode, rather than a global one. - -This will define a minor mode called erc-NAME-mode, possibly -an alias erc-ALIAS-mode, as well as the helper functions -erc-NAME-enable, and erc-NAME-disable. - -Example: - - ;;;###autoload(autoload \\='erc-replace-mode \"erc-replace\") - (define-erc-module replace nil - \"This mode replaces incoming text according to `erc-replace-alist'.\" - ((add-hook \\='erc-insert-modify-hook - #\\='erc-replace-insert)) - ((remove-hook \\='erc-insert-modify-hook - #\\='erc-replace-insert)))" - (declare (doc-string 3) (indent defun)) - (let* ((sn (symbol-name name)) - (mode (intern (format "erc-%s-mode" (downcase sn)))) - (group (intern (format "erc-%s" (downcase sn)))) - (enable (intern (format "erc-%s-enable" (downcase sn)))) - (disable (intern (format "erc-%s-disable" (downcase sn))))) - `(progn - (define-minor-mode - ,mode - ,(format "Toggle ERC %S mode. -With a prefix argument ARG, enable %s if ARG is positive, -and disable it otherwise. If called from Lisp, enable the mode -if ARG is omitted or nil. -%s" name name doc) - ;; FIXME: We don't know if this group exists, so this `:group' may - ;; actually just silence a valid warning about the fact that the var - ;; is not associated with any group. - :global ,(not local-p) :group (quote ,group) - (if ,mode - (,enable) - (,disable))) - (defun ,enable () - ,(format "Enable ERC %S mode." - name) - (interactive) - (add-to-list 'erc-modules (quote ,name)) - (setq ,mode t) - ,@enable-body) - (defun ,disable () - ,(format "Disable ERC %S mode." - name) - (interactive) - (setq erc-modules (delq (quote ,name) erc-modules)) - (setq ,mode nil) - ,@disable-body) - ,(when (and alias (not (eq name alias))) - `(defalias - ',(intern - (format "erc-%s-mode" - (downcase (symbol-name alias)))) - #',mode)) - ;; For find-function and find-variable. - (put ',mode 'definition-name ',name) - (put ',enable 'definition-name ',name) - (put ',disable 'definition-name ',name)))) - -;; The rationale for favoring inheritance here (nicer dispatch) is -;; kinda flimsy since there aren't yet any actual methods. - -(cl-defstruct erc--target - (string "" :type string :documentation "Received name of target.") - (symbol nil :type symbol :documentation "Case-mapped name as symbol.")) - -;; These should probably take on a `joined' field to track joinedness, -;; which should be toggled by `erc-server-JOIN', `erc-server-PART', -;; etc. Functions like `erc--current-buffer-joined-p' (bug#48598) may -;; find it useful. - -(cl-defstruct (erc--target-channel (:include erc--target))) - -(cl-defstruct (erc--target-channel-local (:include erc--target-channel))) - -;; At some point, it may make sense to add a query type with an -;; account field, which may help support reassociation across -;; reconnects and nick changes (likely requires v3 extensions). - (defun erc--target-from-string (string) "Construct an `erc--target' variant from STRING." (funcall (if (erc-channel-p string) @@ -1514,12 +1355,6 @@ erc-once-with-server-event (add-hook hook fun nil t) fun)) -(define-inline erc-log (string) - "Logs STRING if logging is on (see `erc-log-p')." - (inline-quote - (when erc-log-p - (erc-log-aux ,string)))) - (defun erc-server-buffer () "Return the server buffer for the current buffer's process. The buffer-local variable `erc-server-process' is used to find @@ -1575,29 +1410,7 @@ erc-ison-p (if erc-online-p "" "not ")) erc-online-p)))) -(defun erc-log-aux (string) - "Do the debug logging of STRING." - (let ((cb (current-buffer)) - (point 1) - (was-eob nil) - (session-buffer (erc-server-buffer))) - (if session-buffer - (progn - (set-buffer session-buffer) - (if (not (and erc-dbuf (bufferp erc-dbuf) (buffer-live-p erc-dbuf))) - (progn - (setq erc-dbuf (get-buffer-create - (concat "*ERC-DEBUG: " - erc-session-server "*"))))) - (set-buffer erc-dbuf) - (setq point (point)) - (setq was-eob (eobp)) - (goto-char (point-max)) - (insert (concat "** " string "\n")) - (if was-eob (goto-char (point-max)) - (goto-char point)) - (set-buffer cb)) - (message "ERC: ** %s" string)))) + ;; Last active buffer, to print server messages in the right place @@ -1838,40 +1651,6 @@ erc-member-ignore-case (throw 'result list) (setq list (cdr list)))))) -(defmacro erc-with-buffer (spec &rest body) - "Execute BODY in the buffer associated with SPEC. - -SPEC should have the form - - (TARGET [PROCESS]) - -If TARGET is a buffer, use it. Otherwise, use the buffer -matching TARGET in the process specified by PROCESS. - -If PROCESS is nil, use the current `erc-server-process'. -See `erc-get-buffer' for details. - -See also `with-current-buffer'. - -\(fn (TARGET [PROCESS]) BODY...)" - (declare (indent 1) (debug ((form &optional form) body))) - (let ((buf (make-symbol "buf")) - (proc (make-symbol "proc")) - (target (make-symbol "target")) - (process (make-symbol "process"))) - `(let* ((,target ,(car spec)) - (,process ,(cadr spec)) - (,buf (if (bufferp ,target) - ,target - (let ((,proc (or ,process - (and (processp erc-server-process) - erc-server-process)))) - (if (and ,target ,proc) - (erc-get-buffer ,target ,proc)))))) - (when (buffer-live-p ,buf) - (with-current-buffer ,buf - ,@body))))) - (defun erc-get-buffer (target &optional proc) "Return the buffer matching TARGET in the process PROC. If PROC is not supplied, all processes are searched." @@ -1918,18 +1697,6 @@ erc-buffer-list (setq predicate (lambda () t))) (erc-buffer-filter predicate proc)) -(defmacro erc-with-all-buffers-of-server (process pred &rest forms) - "Execute FORMS in all buffers which have same process as this server. -FORMS will be evaluated in all buffers having the process PROCESS and -where PRED matches or in all buffers of the server process if PRED is -nil." - (declare (indent 1) (debug (form form body))) - (macroexp-let2 nil pred pred - `(erc-buffer-filter (lambda () - (when (or (not ,pred) (funcall ,pred)) - ,@forms)) - ,process))) - (define-obsolete-function-alias 'erc-iswitchb #'erc-switch-to-buffer "25.1") (defun erc--switch-to-buffer (&optional arg) (read-buffer "Switch to ERC buffer: " @@ -2874,8 +2641,6 @@ erc-lurker-cleanup-interval consumption of lurker state during long Emacs sessions and/or ERC sessions with large numbers of incoming PRIVMSGs.") -(defvar erc-message-parsed) - (defun erc-lurker-update-status (_message) "Update `erc-lurker-state' if necessary. @@ -4089,9 +3854,6 @@ erc-cmd-SERVER t) (put 'erc-cmd-SERVER 'process-not-needed t) -(defvar motif-version-string) -(defvar gtk-version-string) - (defun erc-cmd-SV () "Say the current ERC and Emacs version into channel." (erc-send-message (format "I'm using ERC %s with GNU Emacs %s (%s%s)%s." @@ -5347,6 +5109,12 @@ erc-parse-prefix (setq i (1+ i))) alist)))) +(defcustom erc-channel-members-changed-hook nil + "This hook is called every time the variable `channel-members' changes. +The buffer where the change happened is current while this hook is called." + :group 'erc-hooks + :type 'hook) + (defun erc-channel-receive-names (names-string) "This function is for internal use only. @@ -5390,13 +5158,6 @@ erc-channel-receive-names name name t voice halfop op admin owner))))) (run-hooks 'erc-channel-members-changed-hook))) - -(defcustom erc-channel-members-changed-hook nil - "This hook is called every time the variable `channel-members' changes. -The buffer where the change happened is current while this hook is called." - :group 'erc-hooks - :type 'hook) - (defun erc-update-user-nick (nick &optional new-nick host login full-name info) "Update the stored user information for the user with nickname NICK. @@ -6006,12 +5767,6 @@ erc-user-input (defvar erc-command-regexp "^/\\([A-Za-z']+\\)\\(\\s-+.*\\|\\s-*\\)$" "Regular expression used for matching commands in ERC.") -(cl-defstruct erc-input - string insertp sendp) - -(cl-defstruct (erc--input-split (:include erc-input)) - lines cmdp) - (defun erc--discard-trailing-multiline-nulls (state) "Ensure last line of STATE's string is non-null. But only when `erc-send-whitespace-lines' is non-nil. STATE is @@ -6957,9 +6712,6 @@ erc-format-lag-time (t "")))) ;; erc-goodies is required at end of this file. -(declare-function erc-controls-strip "erc-goodies" (str)) - -(defvar tabbar--local-hlf) (defun erc-update-mode-line-buffer (buffer) "Update the mode line in a single ERC buffer BUFFER." @@ -7457,12 +7209,4 @@ erc-handle-irc-url (provide 'erc) -(require 'erc-backend) - -;; Deprecated. We might eventually stop requiring the goodies automatically. -;; IMPORTANT: This require must appear _after_ the above (provide 'erc) to -;; avoid a recursive require error when byte-compiling the entire package. -(require 'erc-goodies) -(require 'erc-networks) - ;;; erc.el ends here diff --git a/test/lisp/erc/erc-networks-tests.el b/test/lisp/erc/erc-networks-tests.el index 66a334b709..32bdfa11ff 100644 --- a/test/lisp/erc/erc-networks-tests.el +++ b/test/lisp/erc/erc-networks-tests.el @@ -20,7 +20,7 @@ ;;; Code: (require 'ert-x) ; cl-lib -(require 'erc-networks) +(require 'erc) (defun erc-networks-tests--create-dead-proc (&optional buf) (let ((p (start-process "true" (or buf (current-buffer)) "true"))) diff --git a/test/lisp/erc/erc-tests.el b/test/lisp/erc/erc-tests.el index 4971d0e194..39b65fd5e1 100644 --- a/test/lisp/erc/erc-tests.el +++ b/test/lisp/erc/erc-tests.el @@ -48,27 +48,6 @@ erc--read-time-period (cl-letf (((symbol-function 'read-string) (lambda (&rest _) "1d"))) (should (equal (erc--read-time-period "foo: ") 86400)))) -(ert-deftest erc--meta--backend-dependencies () - (with-temp-buffer - (insert-file-contents-literally - (concat (file-name-sans-extension (symbol-file 'erc)) ".el")) - (let ((beg (search-forward ";; Defined in erc-backend")) - (end (search-forward "\n\n")) - vars) - (save-excursion - (save-restriction - (narrow-to-region beg end) - (goto-char (point-min)) - (with-syntax-table lisp-data-mode-syntax-table - (condition-case _ - (while (push (cadr (read (current-buffer))) vars)) - (end-of-file))))) - (should (= (point) end)) - (dolist (var vars) - (setq var (concat "\\_<" (symbol-name var) "\\_>")) - (ert-info (var) - (should (save-excursion (search-forward-regexp var nil t)))))))) - (ert-deftest erc-with-all-buffers-of-server () (let (proc-exnet proc-onet -- 2.36.1 --=-=-=--