view lisp/erc/erc-imenu.el @ 99602:c94ec53df9d8

* net/ange-ftp.el (ange-ftp-multi-msgs, ange-ftp-good-msgs) (ange-ftp-try-passive-mode, ange-ftp-data-buffer-name) (ange-ftp-account-hashtable, ange-ftp-ls-cache-lsargs) (ange-ftp-ls-cache-file, ange-ftp-ls-cache-res, ange-ftp-get-user) (ange-ftp-ftp-name-component, ange-ftp-kill-ftp-process) (ange-ftp-quote-string, ange-ftp-process-handle-line) (ange-ftp-start-process, ange-ftp-send-cmd, ange-ftp-add-dumb-unix-host) (ange-ftp-before-parse-ls-hook, ange-ftp-after-parse-ls-hook) (ange-ftp-ls, ange-ftp-add-dl-dir, ange-ftp-get-file-entry) (ange-ftp-set-binary-mode, ange-ftp-set-ascii-mode, ange-ftp-get-pwd) (ange-ftp-file-name-as-directory-alist, ange-ftp-reread-dir) (ange-ftp-vms-filename-regexp, ange-ftp-bs2000-fix-name-regexp-reverse) (ange-ftp-bs2000-fix-name-regexp): Fix typos in docstrings. (ange-ftp-name-format, ange-ftp-gateway-fatal-msgs) (ange-ftp-xfer-size-msgs, ange-ftp-tmp-name-template) (ange-ftp-netrc-filename, ange-ftp-disable-netrc-security-check) (ange-ftp-default-user, ange-ftp-default-password) (ange-ftp-default-account, ange-ftp-netrc-default-password) (ange-ftp-netrc-default-account, ange-ftp-dumb-unix-host-regexp) (ange-ftp-binary-file-name-regexp, ange-ftp-gateway-host) (ange-ftp-gateway-prompt-pattern, ange-ftp-smart-gateway-port) (ange-ftp-send-hash, ange-ftp-binary-hash-mark-size) (ange-ftp-ascii-hash-mark-size, ange-ftp-process-verbose) (ange-ftp-ftp-program-name, ange-ftp-gateway-ftp-program-name) (ange-ftp-ftp-program-args, ange-ftp-nslookup-program) (ange-ftp-make-backup-files, ange-ftp-retry-time) (ange-ftp-bs2000-special-prefix): Remove * from defcustom docstrings. (ange-ftp-skip-msgs, ange-ftp-potential-error-msgs) (ange-ftp-gateway-tmp-name-template) (ange-ftp-generate-anonymous-password, ange-ftp-local-host-regexp) (ange-ftp-gateway-program-interactive, ange-ftp-smart-gateway) (ange-ftp-raw-login): Remove * from defcustom docstrings; fix typos. (ange-ftp-fatal-msgs): Remove * from defcustom docstring; doc fix. (ange-ftp-gateway-program): Remove * from docstring and reflow. (ange-ftp-hash-entry-exists-p, ange-ftp-hash-table-keys) (ange-ftp-raw-send-cmd, ange-ftp-get-files, ange-ftp-canonize-filename) (ange-ftp-file-name-as-directory, ange-ftp-directory-file-name): (ange-ftp-copy-files-async, ange-ftp-rename-remote-to-remote): (ange-ftp-rename-local-to-remote): Doc fixes. (ange-ftp-set-xfer-size, ange-ftp-call-cont, ange-ftp-process-filter): Use `when', `unless'. (ange-ftp-set-passwd): Rename arg PASSWD to PASSWORD. (ange-ftp-process-handle-hash): Rename arg STR to STRING. (ange-ftp-nslookup-host): Rename arg HOST to HOSTNAME. (ange-ftp-smart-login): Rename arg PASS to PASSWORD. (ange-ftp-normal-login): Rename arg PASS to PASSWORD. Fix typo. (ange-ftp-process-sentinel): Use `when'. Fix typo. (ange-ftp-gwp-start): Use `let', not `let*'; use `when'. Fix typo. (ange-ftp-fix-name-func-alist, ange-ftp-fix-dir-name-func-alist) (ange-ftp-parse-list-func-alist, ange-ftp-add-file-entry-alist) (ange-ftp-delete-file-entry-alist): Fix typos and reflow docstring. (ange-ftp-dumb-unix-host, ange-ftp-binary-file) (ange-ftp-directory-files, ange-ftp-file-modtime, ange-ftp-vms-host) (ange-ftp-mts-host, ange-ftp-cms-host, ange-ftp-bs2000-host) (ange-ftp-bs2000-posix-host): Use `string-match-p' instead of `(save-match-data (string-match ...))'. (ange-ftp-use-gateway-p, ange-ftp-use-smart-gateway-p) (ange-ftp-file-name-directory, ange-ftp-file-name-nondirectory): Use `string-match-p' instead of `(save-match-data (string-match ...))'. Doc fixes.
author Juanma Barranquero <lekktu@gmail.com>
date Sun, 16 Nov 2008 05:50:23 +0000
parents 2a734255bcc7
children a9dc0e7c3f2b
line wrap: on
line source

;;; erc-imenu.el -- Imenu support for ERC

;; Copyright (C) 2001, 2002, 2004, 2006, 2007, 2008 Free Software Foundation, Inc.

;; Author: Mario Lang <mlang@delysid.org>
;; Keywords: comm
;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?ErcImenu

;; 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 <http://www.gnu.org/licenses/>.

;;; Commentary:

;; This file contains code related to Ibuffer and ERC.  Totally alpha,
;; needs work.  Usage:  Type / C-e C-h when in Ibuffer-mode to see new
;; limiting commands

;;; Code:

;;; Commentary:

;; This package defines the function `erc-create-imenu-index'.  ERC
;; uses this for `imenu-create-index-function', and autoloads it.
;; Therefore, nothing needs to be done to use this package.

;;; Code:

(require 'erc)
(require 'imenu)

(defun erc-unfill-notice ()
  "Return text from point to a computed end as a string unfilled.
Don't rely on this function, read it first!"
  (let ((str (buffer-substring
	      (save-excursion
		(re-search-forward (regexp-quote erc-notice-prefix)))
	      (progn
		(while (save-excursion
			 (forward-line 1)
			 (looking-at "    "))
		  (forward-line 1))
		(end-of-line) (point)))))
    (with-temp-buffer
      (insert str)
      (goto-char (point-min))
      (while (re-search-forward "\n +" nil t)
	(replace-match " "))
      (buffer-substring (point-min) (point-max)))))

;;;###autoload
(defun erc-create-imenu-index ()
  (let ((index-alist '())
	(notice-alist '())
	(join-alist '())
	(left-alist '())
	(quit-alist '())
	(message-alist '())
	(mode-change-alist '())
	(topic-change-alist '())
	prev-pos)
    (goto-char (point-max))
    (imenu-progress-message prev-pos 0)
    (while (if (bolp)
	       (> (forward-line -1)
		  -1)
	     (progn (forward-line 0)
		    t))
      (imenu-progress-message prev-pos nil t)
      (save-match-data
	(when (looking-at (concat (regexp-quote erc-notice-prefix)
				  "\\(.+\\)$"))
	  (let ((notice-text  ;; Ugly hack, but seems to work.
		 (save-excursion (erc-unfill-notice)))
		(pos (point)))
	    (push (cons notice-text pos) notice-alist)
	    (or
	     (when (string-match "^\\(.*\\) has joined channel" notice-text)
	       (push (cons (match-string 1 notice-text) pos) join-alist))
	     (when (string-match "^\\(.+\\) has left channel" notice-text)
	       (push (cons (match-string 1 notice-text) pos) left-alist))
	     (when (string-match "^\\(.+\\) has quit\\(.*\\)$" notice-text)
	       (push (cons (concat (match-string 1 notice-text)
				   (match-string 2 notice-text))
			   (point))
		     quit-alist))
	     (when (string-match
		    "^\\(\\S-+\\) (.+) has changed mode for \\S-+ to \\(.*\\)$"
		    notice-text)
	       (push (cons (concat (match-string 1 notice-text) ": "
				   (match-string 2 notice-text))
			   (point))
		     mode-change-alist))
	     (when (string-match
		    "^\\(\\S-+\\) (.+) has set the topic for \\S-+: \\(.*\\)$"
		    notice-text)
	       (push (cons (concat (match-string 1 notice-text) ": "
				   (match-string 2 notice-text)) pos)
		     topic-change-alist)))))
	(when (looking-at "<\\(\\S-+\\)> \\(.+\\)$")
	  (let ((from (match-string 1))
		(message-text (match-string 2)))
	    (push (cons (concat from ": " message-text) (point))
		  message-alist)))))
    (and notice-alist (push (cons "notices" notice-alist) index-alist))
    (and join-alist (push (cons "joined" join-alist) index-alist))
    (and left-alist (push (cons "parted" left-alist) index-alist))
    (and quit-alist (push (cons "quit" quit-alist) index-alist))
    (and mode-change-alist (push (cons "mode-change" mode-change-alist)
				 index-alist))
    (and message-alist (push (cons "messages" message-alist) index-alist))
    (and topic-change-alist (push (cons "topic-change" topic-change-alist)
				  index-alist))
    index-alist))

(provide 'erc-imenu)

;;; erc-imenu.el ends here
;;
;; Local Variables:
;; indent-tabs-mode: t
;; tab-width: 8
;; End:

;; arch-tag: 35c69082-ca29-43f7-a050-8da5f400de81