2021-03-18 23:14:33 -04:00
|
|
|
;;; erc-speedbar.el --- Speedbar support for ERC -*- lexical-binding: t; -*-
|
2006-01-29 13:08:58 +00:00
|
|
|
|
2024-01-02 09:47:10 +08:00
|
|
|
;; Copyright (C) 2001-2004, 2006-2024 Free Software Foundation, Inc.
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
;; Author: Mario Lang <mlang@delysid.org>
|
2019-05-26 00:58:28 -07:00
|
|
|
;; Contributor: Eric M. Ludlam <zappo@gnu.org>
|
2022-01-24 10:59:05 -05:00
|
|
|
;; Maintainer: Amin Bandali <bandali@gnu.org>, F. Jason Park <jp@neverwas.me>
|
Update ERC module URLs
* lisp/erc/erc-autoaway.el, lisp/erc/erc-button.el,
lisp/erc/erc-compat.el, lisp/erc/erc-fill.el, lisp/erc/erc-imenu.el,
lisp/erc/erc-join.el, lisp/erc/erc-lang.el, lisp/erc/erc-match.el,
lisp/erc/erc-pcomplete.el, lisp/erc/erc-ring.el,
lisp/erc/erc-spelling.el, lisp/erc/erc-stamp.el,
lisp/erc/erc-track.el: Update URL to friendlier form, over https.
* lisp/erc/erc-ibuffer.el: Remove URL to nonexistent page.
* lisp/erc/erc-list.el, lisp/erc/erc-log.el, lisp/erc/erc-notify.el,
lisp/erc/erc-replace.el, lisp/erc/erc-services.el,
lisp/erc/erc-sound.el, lisp/erc/erc-speedbar.el,
lisp/erc/erc-truncate.el: Add URL to corresponding EmacsWiki page.
2020-01-24 01:09:43 -05:00
|
|
|
;; URL: https://www.emacswiki.org/emacs/ErcSpeedbar
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
;; This file is part of GNU Emacs.
|
|
|
|
|
2008-05-06 03:36:21 +00:00
|
|
|
;; GNU Emacs is free software: you can redistribute it and/or modify
|
2006-01-29 13:08:58 +00:00
|
|
|
;; it under the terms of the GNU General Public License as published by
|
2008-05-06 03:36:21 +00:00
|
|
|
;; the Free Software Foundation, either version 3 of the License, or
|
|
|
|
;; (at your option) any later version.
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
;; 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
|
2017-09-13 15:52:52 -07:00
|
|
|
;; along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
;;; Commentary:
|
|
|
|
|
|
|
|
;; This module provides integration of ERC into the Speedbar.
|
|
|
|
|
|
|
|
;;; TODO / ideas:
|
|
|
|
|
|
|
|
;; * Write intelligent update function:
|
|
|
|
;; update-channel, update-nick, remove-nick-from-channel, ...
|
|
|
|
;; * Use indicator-strings for op/voice
|
2022-08-16 13:31:49 +02:00
|
|
|
;; * Extract/convert face notes field from bbdb if available
|
2023-05-04 00:01:11 -07:00
|
|
|
;; * Write tests that run in a term-mode subprocess
|
2006-01-29 13:08:58 +00:00
|
|
|
;;
|
|
|
|
;;; Code:
|
|
|
|
|
|
|
|
(require 'erc)
|
Don't require erc-goodies in erc.el
* lisp/erc/erc-goodies.el: Obviate the need for forward declarations
by requiring `erc'. Add minor-mode autoloads for `scrolltobottom',
`readonly', `move-to-prompt', `keep-place', `noncommands',
`irccontrols', `smiley', and `unmorse'. Add Local variables footer
with `generated-autoload-file'.
(erc-controls-strip): Autoload this function.
* lisp/erc/erc-ibuffer.el: Require `erc-goodies' for
`erc-control-interpret'. The justification for the blanket `require'
is this module isn't a member of `erc-modules' by default.
* lisp/erc/erc-page.el: (erc-ctcp-query-PAGE): Require `erc-goodies'
and put forward declaration for `erc-control-interpret' atop file.
* lisp/erc/erc-speedbar.el: Require `erc-goodies' for the same reason
as erc-ibuffer.el.
* lisp/erc/erc.el: Remove `require' for `erc-goodies' at end of file
and `pp' at top of file because `pp-to-string' is autoloaded on Emacs
27. Also remove `require's for `thingatpt', `time-date', and
`iso8601'. They're all used sparingly and the latter two have only
been around for one major release, so their removal likely won't cause
much churn. And `thingatpt' already has a call-site `require', so the
top-level one is redundant, but autoload `word-at-point' anyway for
the benefit of third-party libraries like `hl-nicks'. Also wrap local
loaddefs `require' call in `eval-and-compile'.
(erc--read-time-period): Require dependencies. (Bug#60954.)
2023-01-19 21:07:27 -08:00
|
|
|
(require 'erc-goodies)
|
2023-05-04 00:01:11 -07:00
|
|
|
(require 'erc-button)
|
2006-01-29 13:08:58 +00:00
|
|
|
(require 'speedbar)
|
|
|
|
|
|
|
|
;;; Customization:
|
|
|
|
|
|
|
|
(defgroup erc-speedbar nil
|
2023-05-04 00:01:11 -07:00
|
|
|
"Speedbar integration for ERC.
|
|
|
|
To open an ERC-flavored speedbar in a separate frame, run the
|
|
|
|
command `erc-speedbar-browser'. To use a window-based proxy
|
|
|
|
instead, run \\[erc-nickbar-mode] in a connected ERC buffer or
|
|
|
|
put `nickbar' in `erc-modules' before connecting. See Info
|
|
|
|
node `(speedbar) Top' for more about the underlying integration."
|
2006-01-29 13:08:58 +00:00
|
|
|
:group 'erc)
|
|
|
|
|
2023-05-04 00:01:11 -07:00
|
|
|
(defcustom erc-speedbar-nicknames-window-width 18
|
|
|
|
"Default width of the nicknames sidebar (in columns)."
|
2023-11-07 23:51:27 -08:00
|
|
|
:package-version '(ERC . "5.6")
|
2023-05-04 00:01:11 -07:00
|
|
|
:type 'integer)
|
|
|
|
|
2006-01-29 13:08:58 +00:00
|
|
|
(defcustom erc-speedbar-sort-users-type 'activity
|
|
|
|
"How channel nicknames are sorted.
|
|
|
|
|
Prefer directed to neutral quotes
Prefer directed to neutral quotes in docstings and diagnostics.
In docstrings, escape apostrophes that would otherwise be translated
to curved quotes using the newer, simpler rules.
* admin/unidata/unidata-gen.el (unidata-gen-table):
* lisp/align.el (align-region):
* lisp/allout.el (allout-mode, allout-solicit-alternate-bullet):
* lisp/bookmark.el (bookmark-default-annotation-text):
* lisp/calc/calc-aent.el (math-read-if, math-read-factor):
* lisp/calc/calc-lang.el (math-read-giac-subscr)
(math-read-math-subscr):
* lisp/calc/calc-misc.el (report-calc-bug):
* lisp/calc/calc-prog.el (calc-fix-token-name)
(calc-read-parse-table-part):
* lisp/cedet/ede/pmake.el (ede-proj-makefile-insert-dist-rules):
* lisp/cedet/semantic/complete.el (semantic-displayor-show-request):
* lisp/dabbrev.el (dabbrev-expand):
* lisp/emacs-lisp/checkdoc.el (checkdoc-this-string-valid-engine):
* lisp/emacs-lisp/elint.el (elint-get-top-forms):
* lisp/emacs-lisp/lisp-mnt.el (lm-verify):
* lisp/emulation/viper-cmd.el (viper-toggle-search-style):
* lisp/erc/erc-button.el (erc-nick-popup):
* lisp/erc/erc.el (erc-cmd-LOAD, erc-handle-login):
* lisp/eshell/em-dirs.el (eshell/cd):
* lisp/eshell/em-glob.el (eshell-glob-regexp):
* lisp/eshell/em-pred.el (eshell-parse-modifiers):
* lisp/eshell/esh-arg.el (eshell-parse-arguments):
* lisp/eshell/esh-opt.el (eshell-show-usage):
* lisp/files-x.el (modify-file-local-variable):
* lisp/filesets.el (filesets-add-buffer, filesets-remove-buffer)
(filesets-update-pre010505):
* lisp/find-cmd.el (find-generic, find-to-string):
* lisp/gnus/auth-source.el (auth-source-netrc-parse-entries):
* lisp/gnus/gnus-agent.el (gnus-agent-check-overview-buffer)
(gnus-agent-fetch-headers):
* lisp/gnus/gnus-int.el (gnus-start-news-server):
* lisp/gnus/gnus-registry.el:
(gnus-registry--split-fancy-with-parent-internal):
* lisp/gnus/gnus-score.el (gnus-summary-increase-score):
* lisp/gnus/gnus-start.el (gnus-convert-old-newsrc):
* lisp/gnus/gnus-topic.el (gnus-topic-rename):
* lisp/gnus/legacy-gnus-agent.el (gnus-agent-unlist-expire-days):
* lisp/gnus/nnmairix.el (nnmairix-widget-create-query):
* lisp/gnus/spam.el (spam-check-blackholes):
* lisp/mail/feedmail.el (feedmail-run-the-queue):
* lisp/mpc.el (mpc-playlist-rename):
* lisp/net/ange-ftp.el (ange-ftp-shell-command):
* lisp/net/mairix.el (mairix-widget-create-query):
* lisp/net/tramp-cache.el:
* lisp/obsolete/otodo-mode.el (todo-more-important-p):
* lisp/obsolete/pgg-gpg.el (pgg-gpg-process-region):
* lisp/obsolete/pgg-pgp.el (pgg-pgp-process-region):
* lisp/obsolete/pgg-pgp5.el (pgg-pgp5-process-region):
* lisp/org/ob-core.el (org-babel-goto-named-src-block)
(org-babel-goto-named-result):
* lisp/org/ob-fortran.el (org-babel-fortran-ensure-main-wrap):
* lisp/org/ob-ref.el (org-babel-ref-resolve):
* lisp/org/org-agenda.el (org-agenda-prepare):
* lisp/org/org-bibtex.el (org-bibtex-fields):
* lisp/org/org-clock.el (org-clock-notify-once-if-expired)
(org-clock-resolve):
* lisp/org/org-feed.el (org-feed-parse-atom-entry):
* lisp/org/org-habit.el (org-habit-parse-todo):
* lisp/org/org-mouse.el (org-mouse-popup-global-menu)
(org-mouse-context-menu):
* lisp/org/org-table.el (org-table-edit-formulas):
* lisp/org/ox.el (org-export-async-start):
* lisp/play/dunnet.el (dun-score, dun-help, dun-endgame-question)
(dun-rooms, dun-endgame-questions):
* lisp/progmodes/ada-mode.el (ada-goto-matching-start):
* lisp/progmodes/ada-xref.el (ada-find-executable):
* lisp/progmodes/antlr-mode.el (antlr-options-alists):
* lisp/progmodes/flymake.el (flymake-parse-err-lines)
(flymake-start-syntax-check-process):
* lisp/progmodes/python.el (python-define-auxiliary-skeleton):
* lisp/progmodes/sql.el (sql-comint):
* lisp/progmodes/verilog-mode.el (verilog-load-file-at-point):
* lisp/server.el (server-get-auth-key):
* lisp/subr.el (version-to-list):
* lisp/textmodes/reftex-ref.el (reftex-label):
* lisp/textmodes/reftex-toc.el (reftex-toc-rename-label):
* lisp/vc/ediff-diff.el (ediff-same-contents):
* lisp/vc/vc-cvs.el (vc-cvs-mode-line-string):
* test/automated/tramp-tests.el (tramp-test33-asynchronous-requests):
Use directed rather than neutral quotes in diagnostics.
2015-08-24 23:39:33 -07:00
|
|
|
`activity' - Sort users by channel activity
|
|
|
|
`alphabetical' - Sort users alphabetically
|
|
|
|
nil - Do not sort users"
|
2006-01-29 13:08:58 +00:00
|
|
|
:type '(choice (const :tag "Sort users by channel activity" activity)
|
|
|
|
(const :tag "Sort users alphabetically" alphabetical)
|
|
|
|
(const :tag "Do not sort users" nil)))
|
|
|
|
|
2023-05-04 00:01:11 -07:00
|
|
|
(defcustom erc-speedbar-hide-mode-topic 'headerline
|
|
|
|
"Hide mode and topic lines."
|
2023-11-07 23:51:27 -08:00
|
|
|
:package-version '(ERC . "5.6")
|
2023-05-04 00:01:11 -07:00
|
|
|
:type '(choice (const :tag "Always show" nil)
|
|
|
|
(const :tag "Always hide" t)
|
|
|
|
(const :tag "Omit when headerline visible" headerline)))
|
|
|
|
|
|
|
|
(defcustom erc-speedbar-my-nick-face t
|
|
|
|
"A face to use for your nickname.
|
|
|
|
When the value is t, ERC uses `erc-current-nick-face' if
|
|
|
|
`erc-match' has been loaded and `erc-my-nick-face' otherwise.
|
|
|
|
When using the `nicks' module, you can see your nick as it
|
|
|
|
appears to others by coordinating with the option
|
|
|
|
`erc-nicks-skip-faces'."
|
2023-11-07 23:51:27 -08:00
|
|
|
:package-version '(ERC . "5.6")
|
2023-05-04 00:01:11 -07:00
|
|
|
:type '(choice face (const :tag "Current nick or own speaker face" t)))
|
|
|
|
|
2006-01-29 13:08:58 +00:00
|
|
|
(defvar erc-speedbar-key-map nil
|
|
|
|
"Keymap used when in erc display mode.")
|
|
|
|
|
|
|
|
(defun erc-install-speedbar-variables ()
|
|
|
|
"Install those variables used by speedbar to enhance ERC."
|
|
|
|
(if erc-speedbar-key-map
|
|
|
|
nil
|
|
|
|
(setq erc-speedbar-key-map (speedbar-make-specialized-keymap))
|
|
|
|
|
|
|
|
;; Basic tree features
|
2021-03-18 23:14:33 -04:00
|
|
|
(define-key erc-speedbar-key-map "e" #'speedbar-edit-line)
|
|
|
|
(define-key erc-speedbar-key-map "\C-m" #'speedbar-edit-line)
|
|
|
|
(define-key erc-speedbar-key-map "+" #'speedbar-expand-line)
|
|
|
|
(define-key erc-speedbar-key-map "=" #'speedbar-expand-line)
|
|
|
|
(define-key erc-speedbar-key-map "-" #'speedbar-contract-line))
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
(speedbar-add-expansion-list '("ERC" erc-speedbar-menu-items
|
|
|
|
erc-speedbar-key-map
|
|
|
|
erc-speedbar-server-buttons))
|
|
|
|
(speedbar-add-mode-functions-list
|
|
|
|
'("ERC" (speedbar-item-info . erc-speedbar-item-info))))
|
|
|
|
|
|
|
|
(defvar erc-speedbar-menu-items
|
|
|
|
'(["Goto buffer" speedbar-edit-line t]
|
|
|
|
["Expand Node" speedbar-expand-line
|
|
|
|
(save-excursion (beginning-of-line)
|
|
|
|
(looking-at "[0-9]+: *.\\+. "))]
|
|
|
|
["Contract Node" speedbar-contract-line
|
|
|
|
(save-excursion (beginning-of-line)
|
|
|
|
(looking-at "[0-9]+: *.-. "))])
|
|
|
|
"Additional menu-items to add to speedbar frame.")
|
|
|
|
|
|
|
|
;;; ERC hierarchy display method
|
|
|
|
;;;###autoload
|
|
|
|
(defun erc-speedbar-browser ()
|
|
|
|
"Initialize speedbar to display an ERC browser.
|
|
|
|
This will add a speedbar major display mode."
|
|
|
|
(interactive)
|
|
|
|
(require 'speedbar)
|
2023-05-04 00:01:11 -07:00
|
|
|
(erc-install-speedbar-variables)
|
2006-01-29 13:08:58 +00:00
|
|
|
;; Make sure that speedbar is active
|
|
|
|
(speedbar-frame-mode 1)
|
|
|
|
;; Now, throw us into Info mode on speedbar.
|
|
|
|
(speedbar-change-initial-expansion-list "ERC")
|
|
|
|
(speedbar-get-focus))
|
|
|
|
|
|
|
|
(defun erc-speedbar-buttons (buffer)
|
|
|
|
"Create buttons for speedbar in BUFFER."
|
|
|
|
(erase-buffer)
|
2006-01-30 00:29:49 +00:00
|
|
|
(let (serverp chanp queryp)
|
2006-01-29 13:08:58 +00:00
|
|
|
(with-current-buffer buffer
|
2023-11-23 13:30:06 -08:00
|
|
|
;; The function `dframe-help-echo' checks the default value of
|
|
|
|
;; `dframe-help-echo-function' when deciding whether to visit
|
|
|
|
;; the buffer and fire the callback. This works in normal
|
|
|
|
;; speedbar frames because the event handler runs in the
|
|
|
|
;; `window-buffer' of the active frame. But in our hacked
|
|
|
|
;; version, where the frame is hidden, `speedbar-item-info'
|
|
|
|
;; never runs without this workaround.
|
|
|
|
(setq-local dframe-help-echo-function #'ignore)
|
2023-10-15 07:22:31 -07:00
|
|
|
(setq serverp (erc--server-buffer-p))
|
2006-01-29 13:08:58 +00:00
|
|
|
(setq chanp (erc-channel-p (erc-default-target)))
|
|
|
|
(setq queryp (erc-query-buffer-p)))
|
|
|
|
(cond (serverp
|
|
|
|
(erc-speedbar-channel-buttons nil 0 buffer))
|
|
|
|
(chanp
|
|
|
|
(erc-speedbar-insert-target buffer 0)
|
|
|
|
(forward-line -1)
|
|
|
|
(erc-speedbar-expand-channel "+" buffer 0))
|
|
|
|
(queryp
|
|
|
|
(erc-speedbar-insert-target buffer 0))
|
|
|
|
(t (ignore)))))
|
|
|
|
|
2021-03-18 23:14:33 -04:00
|
|
|
(defun erc-speedbar-server-buttons (_directory depth)
|
2006-01-29 13:08:58 +00:00
|
|
|
"Insert the initial list of servers you are connected to."
|
|
|
|
(let ((servers (erc-buffer-list
|
|
|
|
(lambda ()
|
|
|
|
(eq (current-buffer)
|
|
|
|
(process-buffer erc-server-process))))))
|
|
|
|
(when servers
|
|
|
|
(speedbar-with-writable
|
|
|
|
(dolist (server servers)
|
|
|
|
(speedbar-make-tag-line
|
|
|
|
'bracket ?+ 'erc-speedbar-expand-server server
|
|
|
|
(buffer-name server) 'erc-speedbar-goto-buffer server nil
|
|
|
|
depth))
|
|
|
|
t))))
|
|
|
|
|
|
|
|
(defun erc-speedbar-expand-server (text server indent)
|
2022-07-08 04:58:26 -07:00
|
|
|
(cond ((string-search "+" text)
|
2006-01-29 13:08:58 +00:00
|
|
|
(speedbar-change-expand-button-char ?-)
|
|
|
|
(if (speedbar-with-writable
|
|
|
|
(save-excursion
|
|
|
|
(end-of-line) (forward-char 1)
|
|
|
|
(erc-speedbar-channel-buttons nil (1+ indent) server)))
|
|
|
|
(speedbar-change-expand-button-char ?-)
|
|
|
|
(speedbar-change-expand-button-char ??)))
|
2021-09-12 14:09:53 -04:00
|
|
|
(;; we have to contract this node
|
2022-07-08 04:58:26 -07:00
|
|
|
(string-search "-" text)
|
2006-01-29 13:08:58 +00:00
|
|
|
(speedbar-change-expand-button-char ?+)
|
|
|
|
(speedbar-delete-subblock indent))
|
|
|
|
(t (error "Ooops... not sure what to do")))
|
|
|
|
(speedbar-center-buffer-smartly))
|
|
|
|
|
2021-03-18 23:14:33 -04:00
|
|
|
(defun erc-speedbar-channel-buttons (_directory depth server-buffer)
|
2006-01-29 13:08:58 +00:00
|
|
|
(when (get-buffer server-buffer)
|
|
|
|
(let* ((proc (with-current-buffer server-buffer erc-server-process))
|
|
|
|
(targets (erc-buffer-list
|
|
|
|
(lambda ()
|
|
|
|
(not (eq (process-buffer erc-server-process)
|
|
|
|
(current-buffer))))
|
|
|
|
proc)))
|
|
|
|
(when targets
|
|
|
|
(speedbar-with-writable
|
|
|
|
(dolist (target targets)
|
|
|
|
(erc-speedbar-insert-target target depth))
|
|
|
|
t)))))
|
|
|
|
|
|
|
|
(defun erc-speedbar-insert-target (buffer depth)
|
2023-05-04 00:01:11 -07:00
|
|
|
(if (erc--target-channel-p (buffer-local-value 'erc--target buffer))
|
|
|
|
(progn
|
|
|
|
(speedbar-make-tag-line
|
|
|
|
'bracket ?+ 'erc-speedbar-expand-channel buffer
|
|
|
|
(erc--target-string (buffer-local-value 'erc--target buffer))
|
|
|
|
'erc-speedbar-goto-buffer buffer nil
|
|
|
|
depth)
|
|
|
|
(save-excursion
|
|
|
|
(forward-line -1)
|
|
|
|
(let ((table (buffer-local-value 'erc-channel-users buffer)))
|
|
|
|
(speedbar-add-indicator (format "(%d)" (hash-table-count table)))
|
|
|
|
(rx "(" (+ (any "0-9")) ")"))))
|
2006-01-29 13:08:58 +00:00
|
|
|
;; Query target
|
|
|
|
(speedbar-make-tag-line
|
|
|
|
nil nil nil nil
|
|
|
|
(buffer-name buffer) 'erc-speedbar-goto-buffer buffer nil
|
|
|
|
depth)))
|
|
|
|
|
2023-11-23 13:30:06 -08:00
|
|
|
(defconst erc-speedbar--fmt-sentinel (gensym "erc-speedbar-")
|
|
|
|
"Symbol for identifying a nonstandard `speedbar-token' text property.
|
|
|
|
When encountered, ERC assumes the value's tail contains
|
|
|
|
`format'-compatible args.")
|
|
|
|
|
2006-01-29 13:08:58 +00:00
|
|
|
(defun erc-speedbar-expand-channel (text channel indent)
|
|
|
|
"For the line matching TEXT, in CHANNEL, expand or contract a line.
|
|
|
|
INDENT is the current indentation level."
|
|
|
|
(cond
|
2022-07-08 04:58:26 -07:00
|
|
|
((string-search "+" text)
|
2006-01-29 13:08:58 +00:00
|
|
|
(speedbar-change-expand-button-char ?-)
|
|
|
|
(speedbar-with-writable
|
|
|
|
(save-excursion
|
|
|
|
(end-of-line) (forward-char 1)
|
2023-11-23 13:30:06 -08:00
|
|
|
(let ((modes (buffer-local-value 'erc--mode-line-mode-string channel))
|
2006-01-29 13:08:58 +00:00
|
|
|
(topic (erc-controls-interpret
|
|
|
|
(with-current-buffer channel erc-channel-topic))))
|
2023-11-23 13:30:06 -08:00
|
|
|
(when modes
|
|
|
|
(speedbar-make-tag-line
|
|
|
|
'angle ?m nil (list erc-speedbar--fmt-sentinel "Mode: %s" modes)
|
|
|
|
modes nil nil 'erc-notice-face (1+ indent)))
|
2006-01-29 13:08:58 +00:00
|
|
|
(unless (string= topic "")
|
|
|
|
(speedbar-make-tag-line
|
2023-11-23 13:30:06 -08:00
|
|
|
'angle ?t nil (list erc-speedbar--fmt-sentinel "Topic: %s" topic)
|
|
|
|
topic nil nil 'erc-notice-face
|
2006-01-29 13:08:58 +00:00
|
|
|
(1+ indent)))
|
2023-05-04 00:01:11 -07:00
|
|
|
(unless (pcase erc-speedbar-hide-mode-topic
|
|
|
|
('nil 'show)
|
|
|
|
('headerline (null erc-header-line-format)))
|
|
|
|
(save-excursion
|
|
|
|
(goto-char (point-max))
|
|
|
|
(forward-line (if (string= topic "") -1 -2))
|
|
|
|
(put-text-property (pos-bol) (point-max) 'invisible t)))
|
2006-01-29 13:08:58 +00:00
|
|
|
(let ((names (cond ((eq erc-speedbar-sort-users-type 'alphabetical)
|
|
|
|
(erc-sort-channel-users-alphabetically
|
|
|
|
(with-current-buffer channel
|
|
|
|
(erc-get-channel-user-list))))
|
|
|
|
((eq erc-speedbar-sort-users-type 'activity)
|
|
|
|
(erc-sort-channel-users-by-activity
|
|
|
|
(with-current-buffer channel
|
|
|
|
(erc-get-channel-user-list))))
|
|
|
|
(t (with-current-buffer channel
|
|
|
|
(erc-get-channel-user-list))))))
|
|
|
|
(when names
|
|
|
|
(speedbar-with-writable
|
|
|
|
(dolist (entry names)
|
2023-05-04 00:01:11 -07:00
|
|
|
(erc-speedbar-insert-user entry ?+ (1+ indent) channel)))))))))
|
2022-07-08 04:58:26 -07:00
|
|
|
((string-search "-" text)
|
2006-01-29 13:08:58 +00:00
|
|
|
(speedbar-change-expand-button-char ?+)
|
|
|
|
(speedbar-delete-subblock indent))
|
|
|
|
(t (error "Ooops... not sure what to do")))
|
|
|
|
(speedbar-center-buffer-smartly))
|
|
|
|
|
2023-05-04 00:01:11 -07:00
|
|
|
(defvar erc-speedbar--nick-face-function #'erc-speedbar--highlight-self-and-ops
|
|
|
|
"Function called when finding a face for fontifying nicks.
|
|
|
|
Called with the proposed nick, the `erc-server-user', and the
|
|
|
|
`erc-channel-user'. Should return any valid face, possibly
|
|
|
|
composed or anonymous, or nil.")
|
|
|
|
|
|
|
|
(defun erc-speedbar--highlight-self-and-ops (buffer user cuser)
|
|
|
|
"Highlight own nick and op'd users in the speedbar."
|
|
|
|
(with-current-buffer buffer
|
|
|
|
(if (erc-current-nick-p (erc-server-user-nickname user))
|
|
|
|
(pcase erc-speedbar-my-nick-face
|
|
|
|
('t (if (facep 'erc-current-nick-face)
|
|
|
|
'erc-current-nick-face
|
|
|
|
'erc-my-nick-face))
|
|
|
|
(v v))
|
|
|
|
;; FIXME overload `erc-channel-user-owner-p' and friends to
|
|
|
|
;; accept an `erc-channel-user' object and replace this unrolled
|
|
|
|
;; stuff with a single call to `erc-get-user-mode-prefix'.
|
|
|
|
(and cuser (or (erc-channel-user-owner cuser)
|
|
|
|
(erc-channel-user-admin cuser)
|
|
|
|
(erc-channel-user-op cuser)
|
|
|
|
(erc-channel-user-halfop cuser)
|
|
|
|
(erc-channel-user-voice cuser))
|
|
|
|
erc-button-nickname-face))))
|
|
|
|
|
|
|
|
(defun erc-speedbar--on-click (nick sbtoken _indent)
|
|
|
|
;; 0: finger, 1: name, 2: info, 3: buffer-name
|
|
|
|
(with-current-buffer (nth 3 sbtoken)
|
|
|
|
(erc-nick-popup (string-trim-left nick "[~&@%+]+"))))
|
|
|
|
|
|
|
|
(defun erc-speedbar-insert-user (entry exp-char indent &optional buffer)
|
2006-01-29 13:08:58 +00:00
|
|
|
"Insert one user based on the channel member list ENTRY.
|
2023-05-04 00:01:11 -07:00
|
|
|
Expect EXP-CHAR to be the expansion character to use, INDENT the
|
|
|
|
current indentation level, and BUFFER the associated channel or
|
|
|
|
query buffer. Set the `speedbar-function' text property to
|
|
|
|
`erc-speedbar--on-click', which is called with the formatted
|
|
|
|
nick, a so-called \"token\", and the indent level. The token is
|
|
|
|
a list of four items: the userhost, the GECOS, the current
|
|
|
|
`erc-server-user' info slot, and the associated buffer."
|
2006-01-29 13:08:58 +00:00
|
|
|
(let* ((user (car entry))
|
|
|
|
(cuser (cdr entry))
|
|
|
|
(nick (erc-server-user-nickname user))
|
|
|
|
(host (erc-server-user-host user))
|
|
|
|
(info (erc-server-user-info user))
|
|
|
|
(login (erc-server-user-login user))
|
|
|
|
(name (erc-server-user-full-name user))
|
2023-12-28 20:20:55 -08:00
|
|
|
(nick-str (concat (with-current-buffer (or buffer (current-buffer))
|
|
|
|
(erc-get-channel-membership-prefix cuser))
|
|
|
|
nick))
|
2006-01-29 13:08:58 +00:00
|
|
|
(finger (concat login (when (or login host) "@") host))
|
2023-05-04 00:01:11 -07:00
|
|
|
(sbtoken (list finger name info (buffer-name buffer))))
|
2006-01-29 13:08:58 +00:00
|
|
|
(if (or login host name info) ; we want to be expandable
|
|
|
|
(speedbar-make-tag-line
|
|
|
|
'bracket ?+ 'erc-speedbar-expand-user sbtoken
|
2023-05-04 00:01:11 -07:00
|
|
|
nick-str #'erc-speedbar--on-click sbtoken
|
|
|
|
(funcall erc-speedbar--nick-face-function buffer user cuser)
|
2006-01-29 13:08:58 +00:00
|
|
|
indent)
|
|
|
|
(when (equal exp-char ?-)
|
|
|
|
(forward-line -1)
|
|
|
|
(erc-speedbar-expand-user "+" (list finger name info) indent))
|
|
|
|
(speedbar-make-tag-line
|
|
|
|
'statictag ?? nil nil
|
|
|
|
nick-str nil nil nil
|
|
|
|
indent))))
|
|
|
|
|
|
|
|
(defun erc-speedbar-update-channel (buffer)
|
lisp/*.el: Fix typos and other trivial doc fixes
* lisp/allout-widgets.el (allout-widgets-auto-activation)
(allout-current-decorated-p):
* lisp/auth-source.el (auth-source-protocols):
* lisp/autorevert.el (auto-revert-set-timer):
* lisp/battery.el (battery-mode-line-limit):
* lisp/calc/calcalg3.el (math-map-binop):
* lisp/calendar/cal-dst.el (calendar-dst-find-startend):
* lisp/calendar/cal-mayan.el (calendar-mayan-long-count-to-absolute):
* lisp/calendar/calendar.el (calendar-date-echo-text)
(calendar-generate-month, calendar-string-spread)
(calendar-cursor-to-date, calendar-read, calendar-read-date)
(calendar-mark-visible-date, calendar-dayname-on-or-before):
* lisp/calendar/diary-lib.el (diary-ordinal-suffix):
* lisp/cedet/ede/autoconf-edit.el (autoconf-new-program)
(autoconf-find-last-macro, autoconf-parameter-strip):
* lisp/cedet/ede/config.el (ede-target-with-config-build):
* lisp/cedet/ede/linux.el (ede-linux--detect-architecture)
(ede-linux--get-architecture):
* lisp/cedet/semantic/complete.el (semantic-collector-calculate-cache)
(semantic-displayer-abstract, semantic-displayer-point-position):
* lisp/cedet/semantic/format.el (semantic-format-face-alist)
(semantic-format-tag-short-doc):
* lisp/cedet/semantic/fw.el (semantic-find-file-noselect):
* lisp/cedet/semantic/idle.el (semantic-idle-scheduler-work-idle-time)
(semantic-idle-breadcrumbs-display-function)
(semantic-idle-breadcrumbs-format-tag-list-function):
* lisp/cedet/semantic/lex.el (semantic-lex-map-types)
(define-lex, define-lex-block-type-analyzer):
* lisp/cedet/semantic/senator.el (senator-search-default-tag-filter):
* lisp/cedet/semantic/symref.el (semantic-symref-result)
(semantic-symref-hit-to-tag-via-db):
* lisp/cedet/semantic/symref.el (semantic-symref-tool-baseclass):
* lisp/cedet/semantic/tag.el (semantic-tag-new-variable)
(semantic-tag-new-include, semantic-tag-new-package)
(semantic-tag-set-faux, semantic-create-tag-proxy)
(semantic-tag-function-parent)
(semantic-tag-components-with-overlays):
* lisp/cedet/srecode/cpp.el (srecode-cpp-namespaces)
(srecode-semantic-handle-:c, srecode-semantic-apply-tag-to-dict):
* lisp/cedet/srecode/dictionary.el (srecode-create-dictionary)
(srecode-dictionary-add-entries, srecode-dictionary-lookup-name)
(srecode-create-dictionaries-from-tags):
* lisp/cmuscheme.el (scheme-compile-region):
* lisp/color.el (color-lab-to-lch):
* lisp/doc-view.el (doc-view-image-width)
(doc-view-set-up-single-converter):
* lisp/dynamic-setting.el (font-setting-change-default-font)
(dynamic-setting-handle-config-changed-event):
* lisp/elec-pair.el (electric-pair-text-pairs)
(electric-pair-skip-whitespace-function)
(electric-pair-string-bound-function):
* lisp/emacs-lisp/avl-tree.el (avl-tree--del-balance)
(avl-tree-member, avl-tree-mapcar, avl-tree-iter):
* lisp/emacs-lisp/bytecomp.el (byte-compile-generate-call-tree):
* lisp/emacs-lisp/checkdoc.el (checkdoc-autofix-flag)
(checkdoc-spellcheck-documentation-flag, checkdoc-ispell)
(checkdoc-ispell-current-buffer, checkdoc-ispell-interactive)
(checkdoc-ispell-message-interactive)
(checkdoc-ispell-message-text, checkdoc-ispell-start)
(checkdoc-ispell-continue, checkdoc-ispell-comments)
(checkdoc-ispell-defun):
* lisp/emacs-lisp/cl-generic.el (cl--generic-search-method):
* lisp/emacs-lisp/eieio-custom.el (eieio-read-customization-group):
* lisp/emacs-lisp/lisp.el (forward-sexp, up-list):
* lisp/emacs-lisp/package-x.el (package--archive-contents-from-file):
* lisp/emacs-lisp/package.el (package-desc)
(package--make-autoloads-and-stuff, package-hidden-regexps):
* lisp/emacs-lisp/tcover-ses.el (ses-exercise-startup):
* lisp/emacs-lisp/testcover.el (testcover-nohits)
(testcover-1value):
* lisp/epg.el (epg-receive-keys, epg-start-edit-key):
* lisp/erc/erc-backend.el (erc-server-processing-p)
(erc-split-line-length, erc-server-coding-system)
(erc-server-send, erc-message):
* lisp/erc/erc-button.el (erc-button-face, erc-button-alist)
(erc-browse-emacswiki):
* lisp/erc/erc-ezbounce.el (erc-ezbounce, erc-ezb-get-login):
* lisp/erc/erc-fill.el (erc-fill-variable-maximum-indentation):
* lisp/erc/erc-log.el (erc-current-logfile):
* lisp/erc/erc-match.el (erc-log-match-format)
(erc-text-matched-hook):
* lisp/erc/erc-netsplit.el (erc-netsplit, erc-netsplit-debug):
* lisp/erc/erc-networks.el (erc-server-alist)
(erc-networks-alist, erc-current-network):
* lisp/erc/erc-ring.el (erc-input-ring-index):
* lisp/erc/erc-speedbar.el (erc-speedbar)
(erc-speedbar-update-channel):
* lisp/erc/erc-stamp.el (erc-timestamp-only-if-changed-flag):
* lisp/erc/erc-track.el (erc-track-position-in-mode-line)
(erc-track-remove-from-mode-line, erc-modified-channels-update)
(erc-track-last-non-erc-buffer, erc-track-sort-by-importance)
(erc-track-get-active-buffer):
* lisp/erc/erc.el (erc-get-channel-user-list)
(erc-echo-notice-hook, erc-echo-notice-always-hook)
(erc-wash-quit-reason, erc-format-@nick):
* lisp/ffap.el (ffap-latex-mode):
* lisp/files.el (abort-if-file-too-large)
(dir-locals--get-sort-score, buffer-stale--default-function):
* lisp/filesets.el (filesets-tree-max-level, filesets-data)
(filesets-update-pre010505):
* lisp/gnus/gnus-agent.el (gnus-agent-flush-cache):
* lisp/gnus/gnus-art.el (gnus-article-encrypt-protocol)
(gnus-button-prefer-mid-or-mail):
* lisp/gnus/gnus-cus.el (gnus-group-parameters):
* lisp/gnus/gnus-demon.el (gnus-demon-handlers)
(gnus-demon-run-callback):
* lisp/gnus/gnus-dired.el (gnus-dired-print):
* lisp/gnus/gnus-icalendar.el (gnus-icalendar-event-from-buffer):
* lisp/gnus/gnus-range.el (gnus-range-normalize):
* lisp/gnus/gnus-spec.el (gnus-pad-form):
* lisp/gnus/gnus-srvr.el (gnus-server-agent, gnus-server-cloud)
(gnus-server-opened, gnus-server-closed, gnus-server-denied)
(gnus-server-offline):
* lisp/gnus/gnus-sum.el (gnus-refer-thread-use-nnir)
(gnus-refer-thread-limit-to-thread)
(gnus-summary-limit-include-thread, gnus-summary-refer-thread)
(gnus-summary-find-matching):
* lisp/gnus/gnus-util.el (gnus-rescale-image):
* lisp/gnus/gnus.el (gnus-summary-line-format, gnus-no-server):
* lisp/gnus/mail-source.el (mail-source-incoming-file-prefix):
* lisp/gnus/message.el (message-cite-reply-position)
(message-cite-style-outlook, message-cite-style-thunderbird)
(message-cite-style-gmail, message--send-mail-maybe-partially):
* lisp/gnus/mm-extern.el (mm-inline-external-body):
* lisp/gnus/mm-partial.el (mm-inline-partial):
* lisp/gnus/mml-sec.el (mml-secure-message-sign)
(mml-secure-message-sign-encrypt, mml-secure-message-encrypt):
* lisp/gnus/mml2015.el (mml2015-epg-key-image)
(mml2015-epg-key-image-to-string):
* lisp/gnus/nndiary.el (nndiary-reminders, nndiary-get-new-mail):
* lisp/gnus/nnheader.el (nnheader-directory-files-is-safe):
* lisp/gnus/nnir.el (nnir-search-history)
(nnir-imap-search-other, nnir-artlist-length)
(nnir-artlist-article, nnir-artitem-group, nnir-artitem-number)
(nnir-artitem-rsv, nnir-article-group, nnir-article-number)
(nnir-article-rsv, nnir-article-ids, nnir-categorize)
(nnir-retrieve-headers-override-function)
(nnir-imap-default-search-key, nnir-hyrex-additional-switches)
(gnus-group-make-nnir-group, nnir-run-namazu, nnir-read-parms)
(nnir-read-parm, nnir-read-server-parm, nnir-search-thread):
* lisp/gnus/nnmairix.el (nnmairix-default-group)
(nnmairix-propagate-marks):
* lisp/gnus/smime.el (smime-keys, smime-crl-check)
(smime-verify-buffer, smime-noverify-buffer):
* lisp/gnus/spam-report.el (spam-report-url-ping-mm-url):
* lisp/gnus/spam.el (spam-spamassassin-positive-spam-flag-header)
(spam-spamassassin-spam-status-header, spam-sa-learn-rebuild)
(spam-classifications, spam-check-stat, spam-spamassassin-score):
* lisp/help.el (describe-minor-mode-from-symbol):
* lisp/hippie-exp.el (hippie-expand-ignore-buffers):
* lisp/htmlfontify.el (hfy-optimizations, hfy-face-resolve-face)
(hfy-begin-span):
* lisp/ibuf-ext.el (ibuffer-update-saved-filters-format)
(ibuffer-saved-filters, ibuffer-old-saved-filters-warning)
(ibuffer-filtering-qualifiers, ibuffer-repair-saved-filters)
(eval, ibuffer-unary-operand, file-extension, directory):
* lisp/image-dired.el (image-dired-cmd-pngcrush-options):
* lisp/image-mode.el (image-toggle-display):
* lisp/international/ccl.el (ccl-compile-read-multibyte-character)
(ccl-compile-write-multibyte-character):
* lisp/international/kkc.el (kkc-save-init-file):
* lisp/international/latin1-disp.el (latin1-display):
* lisp/international/ogonek.el (ogonek-name-encoding-alist)
(ogonek-information, ogonek-lookup-encoding)
(ogonek-deprefixify-region):
* lisp/isearch.el (isearch-filter-predicate)
(isearch--momentary-message):
* lisp/jsonrpc.el (jsonrpc-connection-send)
(jsonrpc-process-connection, jsonrpc-shutdown)
(jsonrpc--async-request-1):
* lisp/language/tibet-util.el (tibetan-char-p):
* lisp/mail/feedmail.el (feedmail-queue-use-send-time-for-date)
(feedmail-last-chance-hook, feedmail-before-fcc-hook)
(feedmail-send-it-immediately-wrapper, feedmail-find-eoh):
* lisp/mail/hashcash.el (hashcash-generate-payment)
(hashcash-generate-payment-async, hashcash-insert-payment)
(hashcash-verify-payment):
* lisp/mail/rmail.el (rmail-movemail-variant-in-use)
(rmail-get-attr-value):
* lisp/mail/rmailmm.el (rmail-mime-prefer-html, rmail-mime):
* lisp/mail/rmailsum.el (rmail-summary-show-message):
* lisp/mail/supercite.el (sc-raw-mode-toggle):
* lisp/man.el (Man-start-calling):
* lisp/mh-e/mh-acros.el (mh-do-at-event-location)
(mh-iterate-on-messages-in-region, mh-iterate-on-range):
* lisp/mh-e/mh-alias.el (mh-alias-system-aliases)
(mh-alias-reload, mh-alias-ali)
(mh-alias-canonicalize-suggestion, mh-alias-add-alias-to-file)
(mh-alias-add-alias):
* lisp/mouse.el (mouse-save-then-kill):
* lisp/net/browse-url.el (browse-url-default-macosx-browser):
* lisp/net/eudc.el (eudc-set, eudc-variable-protocol-value)
(eudc-variable-server-value, eudc-update-variable)
(eudc-expand-inline):
* lisp/net/eudcb-bbdb.el (eudc-bbdb-format-record-as-result):
* lisp/net/eudcb-ldap.el (eudc-ldap-get-field-list):
* lisp/net/pop3.el (pop3-list):
* lisp/net/soap-client.el (soap-namespace-put)
(soap-xs-parse-sequence, soap-parse-envelope):
* lisp/net/soap-inspect.el (soap-inspect-xs-complex-type):
* lisp/nxml/rng-xsd.el (rng-xsd-date-to-days):
* lisp/org/ob-C.el (org-babel-prep-session:C)
(org-babel-load-session:C):
* lisp/org/ob-J.el (org-babel-execute:J):
* lisp/org/ob-asymptote.el (org-babel-prep-session:asymptote):
* lisp/org/ob-awk.el (org-babel-execute:awk):
* lisp/org/ob-core.el (org-babel-process-file-name):
* lisp/org/ob-ebnf.el (org-babel-execute:ebnf):
* lisp/org/ob-forth.el (org-babel-execute:forth):
* lisp/org/ob-fortran.el (org-babel-execute:fortran)
(org-babel-prep-session:fortran, org-babel-load-session:fortran):
* lisp/org/ob-groovy.el (org-babel-execute:groovy):
* lisp/org/ob-io.el (org-babel-execute:io):
* lisp/org/ob-js.el (org-babel-execute:js):
* lisp/org/ob-lilypond.el (org-babel-default-header-args:lilypond)
(org-babel-lilypond-compile-post-tangle)
(org-babel-lilypond-display-pdf-post-tangle)
(org-babel-lilypond-tangle)
(org-babel-lilypond-execute-tangled-ly)
(org-babel-lilypond-compile-lilyfile)
(org-babel-lilypond-check-for-compile-error)
(org-babel-lilypond-process-compile-error)
(org-babel-lilypond-mark-error-line)
(org-babel-lilypond-parse-error-line)
(org-babel-lilypond-attempt-to-open-pdf)
(org-babel-lilypond-attempt-to-play-midi)
(org-babel-lilypond-switch-extension)
(org-babel-lilypond-set-header-args):
* lisp/org/ob-lua.el (org-babel-prep-session:lua):
* lisp/org/ob-picolisp.el (org-babel-execute:picolisp):
* lisp/org/ob-processing.el (org-babel-prep-session:processing):
* lisp/org/ob-python.el (org-babel-prep-session:python):
* lisp/org/ob-scheme.el (org-babel-scheme-capture-current-message)
(org-babel-scheme-execute-with-geiser, org-babel-execute:scheme):
* lisp/org/ob-shen.el (org-babel-execute:shen):
* lisp/org/org-agenda.el (org-agenda-entry-types)
(org-agenda-move-date-from-past-immediately-to-today)
(org-agenda-time-grid, org-agenda-sorting-strategy)
(org-agenda-filter-by-category, org-agenda-forward-block):
* lisp/org/org-colview.el (org-columns--overlay-text):
* lisp/org/org-faces.el (org-verbatim, org-cycle-level-faces):
* lisp/org/org-indent.el (org-indent-set-line-properties):
* lisp/org/org-macs.el (org-get-limited-outline-regexp):
* lisp/org/org-mobile.el (org-mobile-files):
* lisp/org/org.el (org-use-fast-todo-selection)
(org-extend-today-until, org-use-property-inheritance)
(org-refresh-effort-properties, org-open-at-point-global)
(org-track-ordered-property-with-tag, org-shiftright):
* lisp/org/ox-html.el (org-html-checkbox-type):
* lisp/org/ox-man.el (org-man-source-highlight)
(org-man-verse-block):
* lisp/org/ox-publish.el (org-publish-sitemap-default):
* lisp/outline.el (outline-head-from-level):
* lisp/progmodes/dcl-mode.el (dcl-back-to-indentation-1)
(dcl-calc-command-indent, dcl-indent-to):
* lisp/progmodes/flymake.el (flymake-make-diagnostic)
(flymake--overlays, flymake-diagnostic-functions)
(flymake-diagnostic-types-alist, flymake--backend-state)
(flymake-is-running, flymake--collect, flymake-mode):
* lisp/progmodes/gdb-mi.el (gdb-threads-list, gdb, gdb-non-stop)
(gdb-buffers, gdb-gud-context-call, gdb-jsonify-buffer):
* lisp/progmodes/grep.el (grep-error-screen-columns):
* lisp/progmodes/gud.el (gud-prev-expr):
* lisp/progmodes/ps-mode.el (ps-mode, ps-mode-target-column)
(ps-run-goto-error):
* lisp/progmodes/python.el (python-eldoc-get-doc)
(python-eldoc-function-timeout-permanent, python-eldoc-function):
* lisp/shadowfile.el (shadow-make-group):
* lisp/speedbar.el (speedbar-obj-do-check):
* lisp/textmodes/flyspell.el (flyspell-auto-correct-previous-hook):
* lisp/textmodes/reftex-cite.el (reftex-bib-or-thebib):
* lisp/textmodes/reftex-index.el (reftex-index-goto-entry)
(reftex-index-kill, reftex-index-undo):
* lisp/textmodes/reftex-parse.el (reftex-context-substring):
* lisp/textmodes/reftex.el (reftex-TeX-master-file):
* lisp/textmodes/rst.el (rst-next-hdr, rst-toc)
(rst-uncomment-region, rst-font-lock-extend-region-internal):
* lisp/thumbs.el (thumbs-mode):
* lisp/vc/ediff-util.el (ediff-restore-diff):
* lisp/vc/pcvs-defs.el (cvs-cvsroot, cvs-force-dir-tag):
* lisp/vc/vc-hg.el (vc-hg--ignore-patterns-valid-p):
* lisp/wid-edit.el (widget-field-value-set, string):
* lisp/x-dnd.el (x-dnd-version-from-flags)
(x-dnd-more-than-3-from-flags): Assorted docfixes.
2019-09-21 00:27:53 +02:00
|
|
|
"Update the speedbar information about a ERC buffer.
|
|
|
|
The update is only done when the channel is actually expanded already."
|
2006-01-29 13:08:58 +00:00
|
|
|
;; This is only a rude hack and doesn't care about multiserver usage
|
|
|
|
;; yet, consider this a brain storming, better ideas?
|
|
|
|
(with-current-buffer speedbar-buffer
|
|
|
|
(save-excursion
|
|
|
|
(goto-char (point-min))
|
|
|
|
(when (re-search-forward (concat "^1: *.+. *"
|
|
|
|
(regexp-quote (buffer-name buffer)))
|
|
|
|
nil t)
|
|
|
|
(beginning-of-line)
|
|
|
|
(speedbar-delete-subblock 1)
|
|
|
|
(erc-speedbar-expand-channel "+" buffer 1)))))
|
|
|
|
|
|
|
|
(defun erc-speedbar-expand-user (text token indent)
|
2022-07-08 04:58:26 -07:00
|
|
|
(cond ((string-search "+" text)
|
2006-01-29 13:08:58 +00:00
|
|
|
(speedbar-change-expand-button-char ?-)
|
|
|
|
(speedbar-with-writable
|
|
|
|
(save-excursion
|
|
|
|
(end-of-line) (forward-char 1)
|
|
|
|
(let ((finger (nth 0 token))
|
|
|
|
(name (nth 1 token))
|
|
|
|
(info (nth 2 token)))
|
|
|
|
(when finger
|
|
|
|
(speedbar-make-tag-line
|
|
|
|
nil nil nil nil
|
|
|
|
finger nil nil nil
|
|
|
|
(1+ indent)))
|
|
|
|
(when name
|
|
|
|
(speedbar-make-tag-line
|
|
|
|
nil nil nil nil
|
|
|
|
name nil nil nil
|
|
|
|
(1+ indent)))
|
|
|
|
(when info
|
|
|
|
(speedbar-make-tag-line
|
|
|
|
nil nil nil nil
|
|
|
|
info nil nil nil
|
|
|
|
(1+ indent)))))))
|
2022-07-08 04:58:26 -07:00
|
|
|
((string-search "-" text)
|
2006-01-29 13:08:58 +00:00
|
|
|
(speedbar-change-expand-button-char ?+)
|
|
|
|
(speedbar-delete-subblock indent))
|
|
|
|
(t (error "Ooops... not sure what to do")))
|
|
|
|
(speedbar-center-buffer-smartly))
|
|
|
|
|
2021-03-18 23:14:33 -04:00
|
|
|
(defun erc-speedbar-goto-buffer (_text buffer _indent)
|
2006-01-29 13:08:58 +00:00
|
|
|
"When user clicks on TEXT, goto an ERC buffer.
|
|
|
|
The INDENT level is ignored."
|
|
|
|
(if (featurep 'dframe)
|
|
|
|
(progn
|
|
|
|
(dframe-select-attached-frame speedbar-frame)
|
|
|
|
(let ((bwin (get-buffer-window buffer 0)))
|
|
|
|
(if bwin
|
|
|
|
(progn
|
|
|
|
(select-window bwin)
|
|
|
|
(raise-frame (window-frame bwin)))
|
|
|
|
(if dframe-power-click
|
|
|
|
(let ((pop-up-frames t))
|
|
|
|
(select-window (display-buffer buffer)))
|
|
|
|
(dframe-select-attached-frame speedbar-frame)
|
|
|
|
(switch-to-buffer buffer)))))
|
|
|
|
(let ((bwin (get-buffer-window buffer 0)))
|
|
|
|
(if bwin
|
|
|
|
(progn
|
|
|
|
(select-window bwin)
|
|
|
|
(raise-frame (window-frame bwin)))
|
|
|
|
(if speedbar-power-click
|
|
|
|
(let ((pop-up-frames t)) (select-window (display-buffer buffer)))
|
2006-01-30 00:29:49 +00:00
|
|
|
(dframe-select-attached-frame speedbar-frame)
|
2006-01-29 13:08:58 +00:00
|
|
|
(switch-to-buffer buffer))))))
|
|
|
|
|
|
|
|
(defun erc-speedbar-line-text ()
|
|
|
|
"Return the text for the item on the current line."
|
|
|
|
(beginning-of-line)
|
|
|
|
(when (re-search-forward "[]>] " nil t)
|
2022-08-23 04:54:57 +02:00
|
|
|
(buffer-substring-no-properties (point) (line-end-position))))
|
2006-01-29 13:08:58 +00:00
|
|
|
|
|
|
|
(defun erc-speedbar-item-info ()
|
|
|
|
"Display information about the current buffer on the current line."
|
|
|
|
(let ((data (speedbar-line-token))
|
|
|
|
(txt (erc-speedbar-line-text)))
|
|
|
|
(cond ((and data (listp data))
|
|
|
|
(message "%s: %s" txt (car data)))
|
|
|
|
((bufferp data)
|
|
|
|
(message "Channel: %s" txt))
|
2023-11-23 13:30:06 -08:00
|
|
|
;; Print help if line has a non-standard ([-+?=]) button
|
|
|
|
;; char and a `speedbar-token' property with a known CAR.
|
|
|
|
((and-let* ((p (text-property-not-all (pos-bol) (pos-eol)
|
|
|
|
'speedbar-token nil))
|
|
|
|
(v (get-text-property p 'speedbar-token))
|
|
|
|
((eq erc-speedbar--fmt-sentinel (car v))))
|
|
|
|
(apply #'message (cdr v))))
|
2006-01-29 13:08:58 +00:00
|
|
|
(t
|
|
|
|
(message "%s" txt)))))
|
|
|
|
|
2023-05-04 00:01:11 -07:00
|
|
|
|
|
|
|
;;;; Status-sidebar integration
|
|
|
|
|
|
|
|
(defvar erc-track-mode)
|
|
|
|
(defvar erc-track--switch-fallback-blockers)
|
|
|
|
(defvar erc-status-sidebar-buffer-name)
|
|
|
|
(declare-function erc-status-sidebar-set-window-preserve-size
|
|
|
|
"erc-status-sidebar" nil)
|
|
|
|
|
|
|
|
(defvar erc-speedbar--buffer-options
|
|
|
|
'((speedbar-update-flag . t)
|
|
|
|
(speedbar-use-images . nil)
|
|
|
|
(speedbar-hide-button-brackets-flag . t)))
|
|
|
|
|
|
|
|
(defvar erc-speedbar--hidden-speedbar-frame nil)
|
|
|
|
|
|
|
|
(defun erc-speedbar--emulate-sidebar-set-window-preserve-size ()
|
|
|
|
(let ((erc-status-sidebar-buffer-name (buffer-name speedbar-buffer))
|
|
|
|
(display-buffer-overriding-action
|
|
|
|
`(display-buffer-in-side-window
|
|
|
|
. ((side . right)
|
|
|
|
(window-width . ,erc-speedbar-nicknames-window-width)))))
|
Replace some uses of erc-error
* lisp/erc/erc-button.el
(erc-button--display-error-notice-with-keys-and-warn): Use
`erc--lwarn' so the warnings buffer is overridable for testing.
* lisp/erc/erc-sasl.el (erc-sasl-mode, erc-sasl-enable): Signal an
`error' instead of calling `erc-error', which continues execution. In
this special case, the session cannot continue initializing, since
connection registration can't reasonably be expected to complete
successfully.
(erc-sasl--destroy): Don't run `erc-quit-hook', and issue a warning of
level `:error' to get users' attention instead of calling `ding'.
* lisp/erc/erc-speedbar.el
(erc-speedbar--emulate-sidebar-set-window-preserve-size): Don't set
window parameters. Doing this basically made
`erc-speedbar-toggle-nicknames-window-lock' unusable.
(erc-speedbar--toggle-nicknames-sidebar): Manually unlock the window
after toggling.
(erc-nickbar-mode, erc-nickbar-enable, erc-nickbar-disable): Don't
`ding' when called in a non-ERC buffer, and make sure to call
`erc-speedbar--ensure' from an ERC buffer. Also, don't disable
minor-mode var when speedbar buffer doesn't exist because that doesn't
ensure it'll be created the next time around, and users may count on
the activation state remaining consistent.
(erc-speedbar-toggle-nicknames-window-lock): Make usable from lisp
with explicit numeric arg.
* lisp/erc/erc-status-sidebar.el (erc-bufbar-mode, erc-bufbar-enable):
Only create the side window from an erc-mode buffer to ensure the
ratio is preserved when burying the current buffer, e.g., with
`custom-buffer-done'.
* lisp/erc/erc.el (erc--warnings-buffer-name, erc--lwarn): New
function, an analog of `lwarn', that allows for overriding the
warnings buffer with the new variable `erc--warnings-buffer-name'.
(erc-cmd-SERVER): Add comment.
* test/lisp/erc/erc-scenarios-sasl.el
(erc-scenarios-sasl--plain-fail): Expect warning instead of error.
* test/lisp/erc/erc-scenarios-status-sidebar.el
(erc-scenarios-status-sidebar--bufbar): Refresh when interactive as
well.
* test/lisp/erc/resources/sasl/plain-failed.eld: Expect EOF instead of
"CAP END". (Bug#63595)
2023-12-18 20:50:26 -08:00
|
|
|
(erc-status-sidebar-set-window-preserve-size)))
|
2023-05-04 00:01:11 -07:00
|
|
|
|
|
|
|
(defun erc-speedbar--status-sidebar-mode--unhook ()
|
|
|
|
"Remove hooks installed by `erc-status-sidebar-mode'."
|
|
|
|
(remove-hook 'window-configuration-change-hook
|
|
|
|
#'erc-speedbar--emulate-sidebar-set-window-preserve-size))
|
|
|
|
|
|
|
|
(defun erc-speedbar--emulate-sidebar ()
|
|
|
|
(require 'erc-status-sidebar)
|
|
|
|
(cl-assert speedbar-frame)
|
|
|
|
(cl-assert (eq speedbar-buffer (current-buffer)))
|
|
|
|
(cl-assert (eq speedbar-frame (selected-frame)))
|
|
|
|
(setq erc-speedbar--hidden-speedbar-frame speedbar-frame
|
2023-11-23 13:30:06 -08:00
|
|
|
;; In Emacs 27, this is not `local-variable-if-set-p'.
|
2023-05-04 00:01:11 -07:00
|
|
|
dframe-controlled #'erc-speedbar--dframe-controlled)
|
|
|
|
(add-hook 'window-configuration-change-hook
|
|
|
|
#'erc-speedbar--emulate-sidebar-set-window-preserve-size nil t)
|
|
|
|
(add-hook 'kill-buffer-hook
|
|
|
|
#'erc-speedbar--status-sidebar-mode--unhook nil t)
|
|
|
|
(with-current-buffer speedbar-buffer
|
|
|
|
(pcase-dolist (`(,var . ,val) erc-speedbar--buffer-options)
|
|
|
|
(set (make-local-variable var) val)))
|
|
|
|
(when (memq 'nicks erc-modules)
|
|
|
|
(with-current-buffer speedbar-buffer
|
|
|
|
(add-function :around (local 'erc-speedbar--nick-face-function)
|
|
|
|
#'erc-speedbar--compose-nicks-face))))
|
|
|
|
|
|
|
|
(defun erc-speedbar--toggle-nicknames-sidebar (arg)
|
|
|
|
(let ((force (numberp arg)))
|
|
|
|
(if speedbar-buffer
|
|
|
|
(progn
|
|
|
|
(cl-assert (buffer-live-p speedbar-buffer))
|
|
|
|
(if (or (and force (< arg 0))
|
|
|
|
(and (not force) (get-buffer-window speedbar-buffer nil)))
|
2023-08-15 21:14:07 -07:00
|
|
|
;; Close associated windows and stop updating but leave timer.
|
|
|
|
(progn
|
|
|
|
(dolist (window (get-buffer-window-list speedbar-buffer nil t))
|
|
|
|
(unless (frame-root-window-p window)
|
|
|
|
(when erc-speedbar--hidden-speedbar-frame
|
|
|
|
(cl-assert
|
|
|
|
(not (eq (window-frame window)
|
|
|
|
erc-speedbar--hidden-speedbar-frame))))
|
|
|
|
(delete-window window)))
|
|
|
|
(with-current-buffer speedbar-buffer
|
|
|
|
(setq speedbar-update-flag nil)
|
|
|
|
(speedbar-set-mode-line-format)))
|
2023-05-04 00:01:11 -07:00
|
|
|
(when (or (not force) (>= arg 0))
|
|
|
|
(with-selected-frame speedbar-frame
|
Replace some uses of erc-error
* lisp/erc/erc-button.el
(erc-button--display-error-notice-with-keys-and-warn): Use
`erc--lwarn' so the warnings buffer is overridable for testing.
* lisp/erc/erc-sasl.el (erc-sasl-mode, erc-sasl-enable): Signal an
`error' instead of calling `erc-error', which continues execution. In
this special case, the session cannot continue initializing, since
connection registration can't reasonably be expected to complete
successfully.
(erc-sasl--destroy): Don't run `erc-quit-hook', and issue a warning of
level `:error' to get users' attention instead of calling `ding'.
* lisp/erc/erc-speedbar.el
(erc-speedbar--emulate-sidebar-set-window-preserve-size): Don't set
window parameters. Doing this basically made
`erc-speedbar-toggle-nicknames-window-lock' unusable.
(erc-speedbar--toggle-nicknames-sidebar): Manually unlock the window
after toggling.
(erc-nickbar-mode, erc-nickbar-enable, erc-nickbar-disable): Don't
`ding' when called in a non-ERC buffer, and make sure to call
`erc-speedbar--ensure' from an ERC buffer. Also, don't disable
minor-mode var when speedbar buffer doesn't exist because that doesn't
ensure it'll be created the next time around, and users may count on
the activation state remaining consistent.
(erc-speedbar-toggle-nicknames-window-lock): Make usable from lisp
with explicit numeric arg.
* lisp/erc/erc-status-sidebar.el (erc-bufbar-mode, erc-bufbar-enable):
Only create the side window from an erc-mode buffer to ensure the
ratio is preserved when burying the current buffer, e.g., with
`custom-buffer-done'.
* lisp/erc/erc.el (erc--warnings-buffer-name, erc--lwarn): New
function, an analog of `lwarn', that allows for overriding the
warnings buffer with the new variable `erc--warnings-buffer-name'.
(erc-cmd-SERVER): Add comment.
* test/lisp/erc/erc-scenarios-sasl.el
(erc-scenarios-sasl--plain-fail): Expect warning instead of error.
* test/lisp/erc/erc-scenarios-status-sidebar.el
(erc-scenarios-status-sidebar--bufbar): Refresh when interactive as
well.
* test/lisp/erc/resources/sasl/plain-failed.eld: Expect EOF instead of
"CAP END". (Bug#63595)
2023-12-18 20:50:26 -08:00
|
|
|
(erc-speedbar--emulate-sidebar-set-window-preserve-size)
|
|
|
|
(erc-speedbar-toggle-nicknames-window-lock -1)))))
|
2023-08-15 21:14:07 -07:00
|
|
|
(when-let (((or (not force) (>= arg 0)))
|
|
|
|
(speedbar-frame-parameters (backquote-list*
|
|
|
|
'(visibility . nil)
|
|
|
|
'(no-other-frame . t)
|
|
|
|
speedbar-frame-parameters))
|
|
|
|
(speedbar-after-create-hook #'erc-speedbar--emulate-sidebar))
|
|
|
|
(erc-install-speedbar-variables)
|
|
|
|
;; Run before toggling mode to prevent timer from being
|
|
|
|
;; created twice.
|
|
|
|
(speedbar-change-initial-expansion-list "ERC")
|
|
|
|
(speedbar-frame-mode 1)
|
|
|
|
;; If we put the remaining parts in the "create hook" along
|
|
|
|
;; with everything else, the frame with `window-main-window'
|
|
|
|
;; gets raised and steals focus if you've switched away from
|
|
|
|
;; Emacs in the meantime.
|
|
|
|
(make-frame-invisible speedbar-frame)
|
|
|
|
(select-frame (setq speedbar-frame (previous-frame)))
|
Replace some uses of erc-error
* lisp/erc/erc-button.el
(erc-button--display-error-notice-with-keys-and-warn): Use
`erc--lwarn' so the warnings buffer is overridable for testing.
* lisp/erc/erc-sasl.el (erc-sasl-mode, erc-sasl-enable): Signal an
`error' instead of calling `erc-error', which continues execution. In
this special case, the session cannot continue initializing, since
connection registration can't reasonably be expected to complete
successfully.
(erc-sasl--destroy): Don't run `erc-quit-hook', and issue a warning of
level `:error' to get users' attention instead of calling `ding'.
* lisp/erc/erc-speedbar.el
(erc-speedbar--emulate-sidebar-set-window-preserve-size): Don't set
window parameters. Doing this basically made
`erc-speedbar-toggle-nicknames-window-lock' unusable.
(erc-speedbar--toggle-nicknames-sidebar): Manually unlock the window
after toggling.
(erc-nickbar-mode, erc-nickbar-enable, erc-nickbar-disable): Don't
`ding' when called in a non-ERC buffer, and make sure to call
`erc-speedbar--ensure' from an ERC buffer. Also, don't disable
minor-mode var when speedbar buffer doesn't exist because that doesn't
ensure it'll be created the next time around, and users may count on
the activation state remaining consistent.
(erc-speedbar-toggle-nicknames-window-lock): Make usable from lisp
with explicit numeric arg.
* lisp/erc/erc-status-sidebar.el (erc-bufbar-mode, erc-bufbar-enable):
Only create the side window from an erc-mode buffer to ensure the
ratio is preserved when burying the current buffer, e.g., with
`custom-buffer-done'.
* lisp/erc/erc.el (erc--warnings-buffer-name, erc--lwarn): New
function, an analog of `lwarn', that allows for overriding the
warnings buffer with the new variable `erc--warnings-buffer-name'.
(erc-cmd-SERVER): Add comment.
* test/lisp/erc/erc-scenarios-sasl.el
(erc-scenarios-sasl--plain-fail): Expect warning instead of error.
* test/lisp/erc/erc-scenarios-status-sidebar.el
(erc-scenarios-status-sidebar--bufbar): Refresh when interactive as
well.
* test/lisp/erc/resources/sasl/plain-failed.eld: Expect EOF instead of
"CAP END". (Bug#63595)
2023-12-18 20:50:26 -08:00
|
|
|
(erc-speedbar--emulate-sidebar-set-window-preserve-size)
|
|
|
|
(erc-speedbar-toggle-nicknames-window-lock -1))))
|
2023-08-15 21:14:07 -07:00
|
|
|
(cl-assert (not (cdr (erc-speedbar--get-timers))) t))
|
2023-05-04 00:01:11 -07:00
|
|
|
|
|
|
|
(defun erc-speedbar--ensure (&optional force)
|
|
|
|
(when (or (erc-server-buffer) force)
|
|
|
|
(when erc-track-mode
|
|
|
|
(cl-pushnew '(derived-mode . speedbar-mode)
|
|
|
|
erc-track--switch-fallback-blockers :test #'equal))
|
2023-08-15 21:14:07 -07:00
|
|
|
(unless speedbar-update-flag
|
|
|
|
(erc-button--display-error-notice-with-keys
|
|
|
|
(erc-server-buffer)
|
|
|
|
"Module `nickbar' needs `speedbar-update-flag' to be non-nil"
|
|
|
|
(and (not (display-graphic-p)) " in text terminals")
|
|
|
|
". Setting to t for the current Emacs session."
|
|
|
|
" Customize it permanently to avoid this message.")
|
|
|
|
(setq speedbar-update-flag t))
|
2023-05-04 00:01:11 -07:00
|
|
|
(erc-speedbar--toggle-nicknames-sidebar +1)
|
2023-08-15 21:14:07 -07:00
|
|
|
(with-current-buffer speedbar-buffer
|
|
|
|
(setq speedbar-update-flag t)
|
|
|
|
(speedbar-set-mode-line-format))))
|
|
|
|
|
|
|
|
(defvar erc-speedbar--shutting-down-p nil)
|
2023-05-04 00:01:11 -07:00
|
|
|
|
|
|
|
;;;###autoload(autoload 'erc-nickbar-mode "erc-speedbar" nil t)
|
|
|
|
(define-erc-module nickbar nil
|
2023-08-15 21:14:07 -07:00
|
|
|
"Show nicknames for current target buffer in a side window.
|
2023-05-04 00:01:11 -07:00
|
|
|
When enabling, create a speedbar session if one doesn't exist and
|
|
|
|
show its buffer in an `erc-status-sidebar' window instead of a
|
|
|
|
separate frame. When disabling, close the window or, with a
|
|
|
|
negative prefix arg, destroy the session.
|
|
|
|
|
|
|
|
WARNING: this module may produce unwanted side effects, like the
|
|
|
|
raising of frames or the stealing of input focus. If you witness
|
2023-08-15 21:14:07 -07:00
|
|
|
such a thing and can reproduce it, please file a bug report with
|
|
|
|
\\[erc-bug]."
|
2023-05-04 00:01:11 -07:00
|
|
|
((add-hook 'erc--setup-buffer-hook #'erc-speedbar--ensure)
|
|
|
|
(erc-speedbar--ensure)
|
|
|
|
(unless (or erc--updating-modules-p
|
|
|
|
(and-let* ((speedbar-buffer)
|
|
|
|
(win (get-buffer-window speedbar-buffer 'all-frames))
|
|
|
|
((eq speedbar-frame (window-frame win))))))
|
Replace some uses of erc-error
* lisp/erc/erc-button.el
(erc-button--display-error-notice-with-keys-and-warn): Use
`erc--lwarn' so the warnings buffer is overridable for testing.
* lisp/erc/erc-sasl.el (erc-sasl-mode, erc-sasl-enable): Signal an
`error' instead of calling `erc-error', which continues execution. In
this special case, the session cannot continue initializing, since
connection registration can't reasonably be expected to complete
successfully.
(erc-sasl--destroy): Don't run `erc-quit-hook', and issue a warning of
level `:error' to get users' attention instead of calling `ding'.
* lisp/erc/erc-speedbar.el
(erc-speedbar--emulate-sidebar-set-window-preserve-size): Don't set
window parameters. Doing this basically made
`erc-speedbar-toggle-nicknames-window-lock' unusable.
(erc-speedbar--toggle-nicknames-sidebar): Manually unlock the window
after toggling.
(erc-nickbar-mode, erc-nickbar-enable, erc-nickbar-disable): Don't
`ding' when called in a non-ERC buffer, and make sure to call
`erc-speedbar--ensure' from an ERC buffer. Also, don't disable
minor-mode var when speedbar buffer doesn't exist because that doesn't
ensure it'll be created the next time around, and users may count on
the activation state remaining consistent.
(erc-speedbar-toggle-nicknames-window-lock): Make usable from lisp
with explicit numeric arg.
* lisp/erc/erc-status-sidebar.el (erc-bufbar-mode, erc-bufbar-enable):
Only create the side window from an erc-mode buffer to ensure the
ratio is preserved when burying the current buffer, e.g., with
`custom-buffer-done'.
* lisp/erc/erc.el (erc--warnings-buffer-name, erc--lwarn): New
function, an analog of `lwarn', that allows for overriding the
warnings buffer with the new variable `erc--warnings-buffer-name'.
(erc-cmd-SERVER): Add comment.
* test/lisp/erc/erc-scenarios-sasl.el
(erc-scenarios-sasl--plain-fail): Expect warning instead of error.
* test/lisp/erc/erc-scenarios-status-sidebar.el
(erc-scenarios-status-sidebar--bufbar): Refresh when interactive as
well.
* test/lisp/erc/resources/sasl/plain-failed.eld: Expect EOF instead of
"CAP END". (Bug#63595)
2023-12-18 20:50:26 -08:00
|
|
|
(when-let ((buf (or (and (derived-mode-p 'erc-mode) (current-buffer))
|
|
|
|
(car (erc-buffer-filter #'erc--server-buffer-p)))))
|
|
|
|
(with-current-buffer buf
|
|
|
|
(erc-speedbar--ensure 'force)))))
|
2023-05-04 00:01:11 -07:00
|
|
|
((remove-hook 'erc--setup-buffer-hook #'erc-speedbar--ensure)
|
|
|
|
(when erc-track-mode
|
|
|
|
(setq erc-track--switch-fallback-blockers
|
|
|
|
(remove '(derived-mode . speedbar-mode)
|
|
|
|
erc-track--switch-fallback-blockers)))
|
|
|
|
(erc-speedbar--toggle-nicknames-sidebar -1)
|
2023-08-15 21:14:07 -07:00
|
|
|
(when-let (((not erc-speedbar--shutting-down-p))
|
|
|
|
(arg erc--module-toggle-prefix-arg)
|
2023-05-04 00:01:11 -07:00
|
|
|
((numberp arg))
|
|
|
|
((< arg 0)))
|
2023-08-15 21:14:07 -07:00
|
|
|
(with-current-buffer speedbar-buffer
|
|
|
|
(dframe-close-frame)
|
|
|
|
(setq erc-speedbar--hidden-speedbar-frame nil)))))
|
|
|
|
|
|
|
|
(defun erc-speedbar--get-timers ()
|
|
|
|
(cl-remove #'dframe-timer-fn timer-idle-list
|
|
|
|
:key #'timer--function
|
|
|
|
:test-not #'eq))
|
2023-05-04 00:01:11 -07:00
|
|
|
|
|
|
|
(defun erc-speedbar--dframe-controlled (arg)
|
2023-08-15 21:14:07 -07:00
|
|
|
(when speedbar-buffer
|
|
|
|
(cl-assert (eq speedbar-buffer (current-buffer))))
|
2023-05-04 00:01:11 -07:00
|
|
|
(when (and erc-speedbar--hidden-speedbar-frame (numberp arg) (< arg 0))
|
|
|
|
(when erc-nickbar-mode
|
2023-08-15 21:14:07 -07:00
|
|
|
(let ((erc-speedbar--shutting-down-p t))
|
|
|
|
(erc-nickbar-mode -1)))
|
2023-05-04 00:01:11 -07:00
|
|
|
(setq speedbar-frame erc-speedbar--hidden-speedbar-frame
|
|
|
|
erc-speedbar--hidden-speedbar-frame nil)
|
|
|
|
;; It's unknown whether leaving the frame invisible interferes
|
2023-08-15 21:14:07 -07:00
|
|
|
;; with the upstream teardown sequence.
|
2023-05-04 00:01:11 -07:00
|
|
|
(when (display-graphic-p)
|
|
|
|
(make-frame-visible speedbar-frame))
|
2023-08-15 21:14:07 -07:00
|
|
|
(speedbar-frame-mode arg) ; -1
|
|
|
|
;; As of Emacs 29, `dframe-set-timer' can't remove `dframe-timer'.
|
|
|
|
(cl-assert (= 1 (length (erc-speedbar--get-timers))) t)
|
|
|
|
(cancel-function-timers #'dframe-timer-fn)
|
|
|
|
;; `dframe-close-frame' kills the buffer but no function in
|
|
|
|
;; erc-speedbar.el resets this to nil.
|
|
|
|
(setq speedbar-buffer nil)))
|
2023-05-04 00:01:11 -07:00
|
|
|
|
Replace some uses of erc-error
* lisp/erc/erc-button.el
(erc-button--display-error-notice-with-keys-and-warn): Use
`erc--lwarn' so the warnings buffer is overridable for testing.
* lisp/erc/erc-sasl.el (erc-sasl-mode, erc-sasl-enable): Signal an
`error' instead of calling `erc-error', which continues execution. In
this special case, the session cannot continue initializing, since
connection registration can't reasonably be expected to complete
successfully.
(erc-sasl--destroy): Don't run `erc-quit-hook', and issue a warning of
level `:error' to get users' attention instead of calling `ding'.
* lisp/erc/erc-speedbar.el
(erc-speedbar--emulate-sidebar-set-window-preserve-size): Don't set
window parameters. Doing this basically made
`erc-speedbar-toggle-nicknames-window-lock' unusable.
(erc-speedbar--toggle-nicknames-sidebar): Manually unlock the window
after toggling.
(erc-nickbar-mode, erc-nickbar-enable, erc-nickbar-disable): Don't
`ding' when called in a non-ERC buffer, and make sure to call
`erc-speedbar--ensure' from an ERC buffer. Also, don't disable
minor-mode var when speedbar buffer doesn't exist because that doesn't
ensure it'll be created the next time around, and users may count on
the activation state remaining consistent.
(erc-speedbar-toggle-nicknames-window-lock): Make usable from lisp
with explicit numeric arg.
* lisp/erc/erc-status-sidebar.el (erc-bufbar-mode, erc-bufbar-enable):
Only create the side window from an erc-mode buffer to ensure the
ratio is preserved when burying the current buffer, e.g., with
`custom-buffer-done'.
* lisp/erc/erc.el (erc--warnings-buffer-name, erc--lwarn): New
function, an analog of `lwarn', that allows for overriding the
warnings buffer with the new variable `erc--warnings-buffer-name'.
(erc-cmd-SERVER): Add comment.
* test/lisp/erc/erc-scenarios-sasl.el
(erc-scenarios-sasl--plain-fail): Expect warning instead of error.
* test/lisp/erc/erc-scenarios-status-sidebar.el
(erc-scenarios-status-sidebar--bufbar): Refresh when interactive as
well.
* test/lisp/erc/resources/sasl/plain-failed.eld: Expect EOF instead of
"CAP END". (Bug#63595)
2023-12-18 20:50:26 -08:00
|
|
|
(defun erc-speedbar-toggle-nicknames-window-lock (arg)
|
|
|
|
"Toggle whether nicknames window is selectable with \\[other-window].
|
|
|
|
When arg is a number, lock the window if non-negative, otherwise
|
|
|
|
unlock."
|
|
|
|
(interactive "P")
|
2023-05-04 00:01:11 -07:00
|
|
|
(unless erc-nickbar-mode
|
|
|
|
(user-error "`erc-nickbar-mode' inactive"))
|
|
|
|
(when-let ((window (get-buffer-window speedbar-buffer)))
|
Replace some uses of erc-error
* lisp/erc/erc-button.el
(erc-button--display-error-notice-with-keys-and-warn): Use
`erc--lwarn' so the warnings buffer is overridable for testing.
* lisp/erc/erc-sasl.el (erc-sasl-mode, erc-sasl-enable): Signal an
`error' instead of calling `erc-error', which continues execution. In
this special case, the session cannot continue initializing, since
connection registration can't reasonably be expected to complete
successfully.
(erc-sasl--destroy): Don't run `erc-quit-hook', and issue a warning of
level `:error' to get users' attention instead of calling `ding'.
* lisp/erc/erc-speedbar.el
(erc-speedbar--emulate-sidebar-set-window-preserve-size): Don't set
window parameters. Doing this basically made
`erc-speedbar-toggle-nicknames-window-lock' unusable.
(erc-speedbar--toggle-nicknames-sidebar): Manually unlock the window
after toggling.
(erc-nickbar-mode, erc-nickbar-enable, erc-nickbar-disable): Don't
`ding' when called in a non-ERC buffer, and make sure to call
`erc-speedbar--ensure' from an ERC buffer. Also, don't disable
minor-mode var when speedbar buffer doesn't exist because that doesn't
ensure it'll be created the next time around, and users may count on
the activation state remaining consistent.
(erc-speedbar-toggle-nicknames-window-lock): Make usable from lisp
with explicit numeric arg.
* lisp/erc/erc-status-sidebar.el (erc-bufbar-mode, erc-bufbar-enable):
Only create the side window from an erc-mode buffer to ensure the
ratio is preserved when burying the current buffer, e.g., with
`custom-buffer-done'.
* lisp/erc/erc.el (erc--warnings-buffer-name, erc--lwarn): New
function, an analog of `lwarn', that allows for overriding the
warnings buffer with the new variable `erc--warnings-buffer-name'.
(erc-cmd-SERVER): Add comment.
* test/lisp/erc/erc-scenarios-sasl.el
(erc-scenarios-sasl--plain-fail): Expect warning instead of error.
* test/lisp/erc/erc-scenarios-status-sidebar.el
(erc-scenarios-status-sidebar--bufbar): Refresh when interactive as
well.
* test/lisp/erc/resources/sasl/plain-failed.eld: Expect EOF instead of
"CAP END". (Bug#63595)
2023-12-18 20:50:26 -08:00
|
|
|
(let ((val (cond ((natnump arg) t)
|
|
|
|
((integerp arg) nil)
|
|
|
|
(t (not (window-parameter window
|
|
|
|
'no-other-window))))))
|
|
|
|
(set-window-parameter window 'no-other-window val)
|
|
|
|
(unless (numberp arg)
|
|
|
|
(message "nick-window: %s" (if val "protected" "selectable"))))))
|
2023-05-04 00:01:11 -07:00
|
|
|
|
|
|
|
|
|
|
|
;;;; Nicks integration
|
|
|
|
|
|
|
|
(declare-function erc-nicks--highlight "erc-nicks" (nickname &optional face))
|
|
|
|
|
|
|
|
(defun erc-speedbar--compose-nicks-face (orig buffer user cuser)
|
|
|
|
(require 'erc-nicks)
|
|
|
|
(let ((rv (funcall orig buffer user cuser)))
|
|
|
|
(if-let ((nick (erc-server-user-nickname user))
|
|
|
|
(face (with-current-buffer buffer
|
|
|
|
(erc-nicks--highlight nick rv)))
|
|
|
|
((not (eq face erc-button-nickname-face))))
|
|
|
|
(cons face (ensure-list rv))
|
|
|
|
rv)))
|
|
|
|
|
|
|
|
|
2006-01-29 13:08:58 +00:00
|
|
|
(provide 'erc-speedbar)
|
|
|
|
;;; erc-speedbar.el ends here
|
|
|
|
;;
|
|
|
|
;; Local Variables:
|
Put most erc autoloads in a dedicated file erc-loaddefs.el
These are features that are only useful after erc.el is loaded.
* lisp/erc/erc.el (top-level): Load erc-loaddefs.
* lisp/erc/erc-autoaway.el, lisp/erc/erc-button.el:
* lisp/erc/erc-capab.el, lisp/erc/erc-compat.el:
* lisp/erc/erc-dcc.el, lisp/erc/erc-desktop-notifications.el:
* lisp/erc/erc-ezbounce.el, lisp/erc/erc-fill.el:
* lisp/erc/erc-identd.el, lisp/erc/erc-imenu.el:
* lisp/erc/erc-join.el, lisp/erc/erc-list.el, lisp/erc/erc-log.el:
* lisp/erc/erc-match.el, lisp/erc/erc-menu.el:
* lisp/erc/erc-netsplit.el, lisp/erc/erc-notify.el:
* lisp/erc/erc-page.el, lisp/erc/erc-pcomplete.el:
* lisp/erc/erc-replace.el, lisp/erc/erc-ring.el:
* lisp/erc/erc-services.el, lisp/erc/erc-sound.el:
* lisp/erc/erc-speedbar.el, lisp/erc/erc-spelling.el:
* lisp/erc/erc-stamp.el, lisp/erc/erc-track.el:
* lisp/erc/erc-truncate.el, lisp/erc/erc-xdcc.el:
Set generated-autoload-file to "erc-loaddefs.el".
2017-11-28 21:16:02 -05:00
|
|
|
;; generated-autoload-file: "erc-loaddefs.el"
|
2006-01-29 13:08:58 +00:00
|
|
|
;; End:
|