guile feature
[bpt/emacs.git] / lisp / erc / erc-imenu.el
CommitLineData
597993cf
MB
1;;; erc-imenu.el -- Imenu support for ERC
2
ba318903 3;; Copyright (C) 2001-2002, 2004, 2006-2014 Free Software Foundation,
ab422c4d 4;; Inc.
597993cf
MB
5
6;; Author: Mario Lang <mlang@delysid.org>
34dc21db 7;; Maintainer: emacs-devel@gnu.org
597993cf
MB
8;; Keywords: comm
9;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?ErcImenu
10
11;; This file is part of GNU Emacs.
12
4ee57b2a 13;; GNU Emacs is free software: you can redistribute it and/or modify
597993cf 14;; it under the terms of the GNU General Public License as published by
4ee57b2a
GM
15;; the Free Software Foundation, either version 3 of the License, or
16;; (at your option) any later version.
597993cf
MB
17
18;; GNU Emacs is distributed in the hope that it will be useful,
19;; but WITHOUT ANY WARRANTY; without even the implied warranty of
20;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
21;; GNU General Public License for more details.
22
23;; You should have received a copy of the GNU General Public License
4ee57b2a 24;; along with GNU Emacs. If not, see <http://www.gnu.org/licenses/>.
597993cf
MB
25
26;;; Commentary:
27
28;; This file contains code related to Ibuffer and ERC. Totally alpha,
29;; needs work. Usage: Type / C-e C-h when in Ibuffer-mode to see new
30;; limiting commands
31
32;;; Code:
33
597993cf
MB
34;;; Commentary:
35
36;; This package defines the function `erc-create-imenu-index'. ERC
37;; uses this for `imenu-create-index-function', and autoloads it.
38;; Therefore, nothing needs to be done to use this package.
39
40;;; Code:
41
42(require 'erc)
43(require 'imenu)
44
45(defun erc-unfill-notice ()
46 "Return text from point to a computed end as a string unfilled.
47Don't rely on this function, read it first!"
48 (let ((str (buffer-substring
49 (save-excursion
50 (re-search-forward (regexp-quote erc-notice-prefix)))
51 (progn
52 (while (save-excursion
53 (forward-line 1)
54 (looking-at " "))
55 (forward-line 1))
56 (end-of-line) (point)))))
57 (with-temp-buffer
58 (insert str)
59 (goto-char (point-min))
60 (while (re-search-forward "\n +" nil t)
61 (replace-match " "))
62 (buffer-substring (point-min) (point-max)))))
63
64;;;###autoload
65(defun erc-create-imenu-index ()
66 (let ((index-alist '())
67 (notice-alist '())
68 (join-alist '())
69 (left-alist '())
70 (quit-alist '())
71 (message-alist '())
72 (mode-change-alist '())
73 (topic-change-alist '())
74 prev-pos)
75 (goto-char (point-max))
76 (imenu-progress-message prev-pos 0)
77 (while (if (bolp)
78 (> (forward-line -1)
79 -1)
80 (progn (forward-line 0)
81 t))
82 (imenu-progress-message prev-pos nil t)
83 (save-match-data
84 (when (looking-at (concat (regexp-quote erc-notice-prefix)
85 "\\(.+\\)$"))
86 (let ((notice-text ;; Ugly hack, but seems to work.
87 (save-excursion (erc-unfill-notice)))
88 (pos (point)))
89 (push (cons notice-text pos) notice-alist)
90 (or
91 (when (string-match "^\\(.*\\) has joined channel" notice-text)
92 (push (cons (match-string 1 notice-text) pos) join-alist))
93 (when (string-match "^\\(.+\\) has left channel" notice-text)
94 (push (cons (match-string 1 notice-text) pos) left-alist))
95 (when (string-match "^\\(.+\\) has quit\\(.*\\)$" notice-text)
96 (push (cons (concat (match-string 1 notice-text)
97 (match-string 2 notice-text))
98 (point))
99 quit-alist))
100 (when (string-match
101 "^\\(\\S-+\\) (.+) has changed mode for \\S-+ to \\(.*\\)$"
102 notice-text)
103 (push (cons (concat (match-string 1 notice-text) ": "
104 (match-string 2 notice-text))
105 (point))
106 mode-change-alist))
107 (when (string-match
108 "^\\(\\S-+\\) (.+) has set the topic for \\S-+: \\(.*\\)$"
109 notice-text)
110 (push (cons (concat (match-string 1 notice-text) ": "
111 (match-string 2 notice-text)) pos)
112 topic-change-alist)))))
113 (when (looking-at "<\\(\\S-+\\)> \\(.+\\)$")
114 (let ((from (match-string 1))
115 (message-text (match-string 2)))
116 (push (cons (concat from ": " message-text) (point))
117 message-alist)))))
118 (and notice-alist (push (cons "notices" notice-alist) index-alist))
119 (and join-alist (push (cons "joined" join-alist) index-alist))
120 (and left-alist (push (cons "parted" left-alist) index-alist))
121 (and quit-alist (push (cons "quit" quit-alist) index-alist))
122 (and mode-change-alist (push (cons "mode-change" mode-change-alist)
123 index-alist))
124 (and message-alist (push (cons "messages" message-alist) index-alist))
125 (and topic-change-alist (push (cons "topic-change" topic-change-alist)
126 index-alist))
127 index-alist))
128
129(provide 'erc-imenu)
130
131;;; erc-imenu.el ends here
132;;
133;; Local Variables:
134;; indent-tabs-mode: t
135;; tab-width: 8
136;; End:
137