]> git.eshelyaron.com Git - emacs.git/commitdiff
Convert ERC's Imenu integration into proper module
authorF. Jason Park <jp@neverwas.me>
Fri, 20 Jan 2023 05:07:27 +0000 (21:07 -0800)
committerF. Jason Park <jp@neverwas.me>
Sat, 8 Apr 2023 21:23:51 +0000 (14:23 -0700)
* lisp/erc/erc-goodies.el: Don't add Imenu hooks to `erc-mode-hook' at
top level.  Remove autoload for `erc-create-imenu-index' because it
already exists in the `erc-imenu' library.
(erc-imenu-setup): Move to the erc-imenu library.
* lisp/erc/erc-imenu.el (erc-unfill-notice): Allow modifications to
read-only text.  Thanks to Yusef Aslam for reporting this bug.
(erc-imenu-setup): Move here from goodies.
(erc-imenu--create-index-function): New helper var to hold previous
local value of `imenu-create-index-function'.  Perhaps advice should
be used instead, but a cursory search of the Emacs code base reveals
no such usage.
(erc-imenu-mode, erc-imenu-enable, erc-imenu-disable): Create "new"
ERC module for Imenu integration.
* lisp/erc/erc.el (erc-modules): Add `imenu' to default value and
create widget menu item.  Update package-version.
* test/lisp/erc/erc-tests.el (erc-tests--modules): Add
`imenu'.  (Bug#60954)

lisp/erc/erc-goodies.el
lisp/erc/erc-imenu.el
lisp/erc/erc.el
test/lisp/erc/erc-tests.el

index 5ddacb643fd26e70086b54a096e77d32d7c7381a..7ea6c42ec6546261db04b94c83fb5cdca1243db8 100644 (file)
 (eval-when-compile (require 'cl-lib))
 (require 'erc)
 
-(defun erc-imenu-setup ()
-  "Setup Imenu support in an ERC buffer."
-  (setq-local imenu-create-index-function #'erc-create-imenu-index))
-
-(add-hook 'erc-mode-hook #'erc-imenu-setup)
-(autoload 'erc-create-imenu-index "erc-imenu" "Imenu index creation function")
 
 ;;; Automatically scroll to bottom
 (defcustom erc-input-line-position nil
index 6223cd3d06f5ebc1e9001c7c9a763f726820a133..526afd32249171df14d0ad5065905ffed108ba86 100644 (file)
@@ -52,7 +52,8 @@ Don't rely on this function, read it first!"
                         (forward-line 1)
                         (looking-at "    "))
                  (forward-line 1))
-               (end-of-line) (point)))))
+               (end-of-line) (point))))
+       (inhibit-read-only t))
     (with-temp-buffer
       (insert str)
       (goto-char (point-min))
@@ -124,6 +125,26 @@ Don't rely on this function, read it first!"
                                  index-alist))
     index-alist))
 
+(defvar-local erc-imenu--create-index-function nil
+  "Previous local value of `imenu-create-index-function', if any.")
+
+(defun erc-imenu-setup ()
+  "Wire up support for Imenu in an ERC buffer."
+  (when (and (local-variable-p 'imenu-create-index-function)
+             imenu-create-index-function)
+    (setq erc-imenu--create-index-function imenu-create-index-function))
+  (setq imenu-create-index-function #'erc-create-imenu-index))
+
+;;;###autoload(autoload 'erc-imenu-mode "erc-imenu" nil t)
+(define-erc-module imenu nil
+  "Simple Imenu integration for ERC."
+  ((add-hook 'erc-mode-hook #'erc-imenu-setup))
+  ((remove-hook 'erc-mode-hook #'erc-imenu-setup)
+   (erc-with-all-buffers-of-server erc-server-process nil
+     (when erc-imenu--create-index-function
+       (setq imenu-create-index-function erc-imenu--create-index-function)
+       (kill-local-variable 'erc-imenu--create-index-function)))))
+
 (provide 'erc-imenu)
 
 ;;; erc-imenu.el ends here
index 60fe04804126d0068e4583ffd0dcbf5c3da73d8a..cc5cac87da88a544b137f1cec3cf9530c5123a0f 100644 (file)
@@ -1852,7 +1852,7 @@ buffer rather than a server buffer.")
   ;; each item is in the format '(old . new)
   (delete-dups (mapcar #'erc--normalize-module-symbol mods)))
 
-(defcustom erc-modules '( autojoin button completion fill irccontrols
+(defcustom erc-modules '( autojoin button completion fill imenu irccontrols
                           list match menu move-to-prompt netsplit
                           networks noncommands readonly ring stamp track)
   "A list of modules which ERC should enable.
@@ -1912,6 +1912,7 @@ removed from the list will be disabled."
     (const :tag "dcc: Provide Direct Client-to-Client support" dcc)
     (const :tag "fill: Wrap long lines" fill)
     (const :tag "identd: Launch an identd server on port 8113" identd)
+    (const :tag "imenu: A simple Imenu integration" imenu)
     (const :tag "irccontrols: Highlight or remove IRC control characters"
            irccontrols)
     (const :tag "keep-place: Leave point above un-viewed text" keep-place)
@@ -1949,6 +1950,7 @@ removed from the list will be disabled."
     (const :tag "unmorse: Translate morse code in messages" unmorse)
     (const :tag "xdcc: Act as an XDCC file-server" xdcc)
     (repeat :tag "Others" :inline t symbol))
+  :package-version '(ERC . "5.6") ; FIXME sync on release
   :group 'erc)
 
 (defun erc-update-modules ()
index 0c7b06da436f9dd28878551c5e5e1d60cd65e6ee..acd470a1e17258827339d5df41c2e83fa3b1eb94 100644 (file)
 
 (defconst erc-tests--modules
   '( autoaway autojoin button capab-identify completion dcc fill identd
-     irccontrols keep-place list log match menu move-to-prompt netsplit
+     imenu irccontrols keep-place list log match menu move-to-prompt netsplit
      networks noncommands notifications notify page readonly
      replace ring sasl scrolltobottom services smiley sound
      spelling stamp track truncate unmorse xdcc))