Commit | Line | Data |
---|---|---|
597993cf MB |
1 | ;;; erc-ibuffer.el --- ibuffer integration with ERC |
2 | ||
f0fa15c5 | 3 | ;; Copyright (C) 2002, 2004, 2006, 2007 Free Software Foundation, Inc. |
597993cf MB |
4 | |
5 | ;; Author: Mario Lang <mlang@delysid.org> | |
6 | ;; Keywords: comm | |
7 | ;; URL: http://www.emacswiki.org/cgi-bin/wiki.pl?ErcIbuffer | |
8 | ||
9 | ;; This file is part of GNU Emacs. | |
10 | ||
11 | ;; GNU Emacs is free software; you can redistribute it and/or modify | |
12 | ;; it under the terms of the GNU General Public License as published by | |
e0085d62 | 13 | ;; the Free Software Foundation; either version 3, or (at your option) |
597993cf MB |
14 | ;; any later version. |
15 | ||
16 | ;; GNU Emacs is distributed in the hope that it will be useful, | |
17 | ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
18 | ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
19 | ;; GNU General Public License for more details. | |
20 | ||
21 | ;; You should have received a copy of the GNU General Public License | |
22 | ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
23 | ;; Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | |
24 | ;; Boston, MA 02110-1301, USA. | |
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 | ||
34 | (require 'ibuffer) | |
059e26cf | 35 | (require 'ibuf-ext) |
597993cf MB |
36 | (require 'erc) |
37 | ||
38 | (defgroup erc-ibuffer nil | |
39 | "The Ibuffer group for ERC." | |
40 | :group 'erc) | |
41 | ||
42 | (defcustom erc-ibuffer-keyword-char ?k | |
43 | "Char used to indicate a channel which had keyword traffic lately (hidden)." | |
44 | :group 'erc-ibuffer | |
45 | :type 'character) | |
46 | (defcustom erc-ibuffer-pal-char ?p | |
47 | "Char used to indicate a channel which had pal traffic lately (hidden)." | |
48 | :group 'erc-ibuffer | |
49 | :type 'character) | |
50 | (defcustom erc-ibuffer-fool-char ?f | |
51 | "Char used to indicate a channel which had fool traffic lately (hidden)." | |
52 | :group 'erc-ibuffer | |
53 | :type 'character) | |
54 | (defcustom erc-ibuffer-dangerous-host-char ?d | |
059e26cf MB |
55 | "Char used to indicate a channel which had dangerous-host traffic lately |
56 | \(hidden)." | |
597993cf MB |
57 | :group 'erc-ibuffer |
58 | :type 'character) | |
59 | ||
059e26cf MB |
60 | (define-ibuffer-filter erc-server |
61 | "Toggle current view to buffers which are related to ERC servers." | |
62 | (:description "erc servers" | |
597993cf | 63 | :reader |
059e26cf MB |
64 | (let ((regexp |
65 | (read-from-minibuffer "Limit by server (regexp) (RET for all): "))) | |
597993cf MB |
66 | (if (string= regexp "") |
67 | ".*" | |
68 | regexp))) | |
69 | (with-current-buffer buf | |
70 | (and (eq major-mode 'erc-mode) | |
71 | (string-match qualifier (or erc-server-announced-name | |
72 | erc-session-server))))) | |
73 | ||
b6675b2d MO |
74 | ;; Silence the byte-compiler |
75 | (eval-when-compile | |
76 | (defvar erc-modified-channels-alist)) | |
0bde6a03 | 77 | |
059e26cf | 78 | (define-ibuffer-column erc-modified (:name "M") |
597993cf MB |
79 | (if (and (boundp 'erc-track-mode) |
80 | erc-track-mode) | |
81 | (let ((entry (assq (current-buffer) erc-modified-channels-alist))) | |
82 | (if entry | |
83 | (if (> (length entry) 1) | |
84 | (cond ((eq 'pal (nth 1 entry)) | |
85 | (string erc-ibuffer-pal-char)) | |
86 | ((eq 'fool (nth 1 entry)) | |
87 | (string erc-ibuffer-fool-char)) | |
88 | ((eq 'keyword (nth 1 entry)) | |
89 | (string erc-ibuffer-keyword-char)) | |
90 | ((eq 'dangerous-host (nth 1 entry)) | |
91 | (string erc-ibuffer-dangerous-host-char)) | |
92 | (t "$")) | |
93 | (string ibuffer-modified-char)) | |
94 | " ")) | |
95 | " ")) | |
96 | ||
059e26cf | 97 | (define-ibuffer-column erc-server-name (:name "Server") |
83dc6995 | 98 | (if (and erc-server-process (processp erc-server-process)) |
597993cf MB |
99 | (with-current-buffer (process-buffer erc-server-process) |
100 | (or erc-server-announced-name erc-session-server)) | |
101 | "")) | |
102 | ||
059e26cf | 103 | (define-ibuffer-column erc-target (:name "Target") |
597993cf | 104 | (if (eq major-mode 'erc-mode) |
83dc6995 | 105 | (cond ((and erc-server-process (processp erc-server-process) |
597993cf MB |
106 | (eq (current-buffer) (process-buffer erc-server-process))) |
107 | (concat "Server " erc-session-server ":" | |
108 | (erc-port-to-string erc-session-port))) | |
109 | ((erc-channel-p (erc-default-target)) | |
110 | (concat (erc-default-target))) | |
111 | ((erc-default-target) | |
112 | (concat "Query: " (erc-default-target))) | |
113 | (t "(parted)")) | |
114 | (buffer-name))) | |
115 | ||
059e26cf | 116 | (define-ibuffer-column erc-topic (:name "Topic") |
597993cf MB |
117 | (if (and (eq major-mode 'erc-mode) |
118 | erc-channel-topic) | |
119 | (erc-controls-interpret erc-channel-topic) | |
120 | "")) | |
121 | ||
059e26cf | 122 | (define-ibuffer-column |
597993cf MB |
123 | erc-members (:name "Users") |
124 | (if (and (eq major-mode 'erc-mode) | |
125 | (boundp 'erc-channel-users) | |
126 | (hash-table-p erc-channel-users) | |
127 | (> (hash-table-size erc-channel-users) 0)) | |
128 | (number-to-string (hash-table-size erc-channel-users)) | |
129 | "")) | |
130 | ||
059e26cf | 131 | (define-ibuffer-column erc-away (:name "A") |
83dc6995 | 132 | (if (and erc-server-process |
597993cf | 133 | (processp erc-server-process) |
ff59d266 | 134 | (erc-away-time)) |
597993cf MB |
135 | "A" |
136 | " ")) | |
137 | ||
059e26cf | 138 | (define-ibuffer-column |
597993cf MB |
139 | erc-op (:name "O") |
140 | (if (and (eq major-mode 'erc-mode) | |
141 | (erc-channel-user-op-p (erc-current-nick))) | |
142 | "@" | |
143 | " ")) | |
144 | ||
059e26cf | 145 | (define-ibuffer-column erc-voice (:name "V") |
597993cf MB |
146 | (if (and (eq major-mode 'erc-mode) |
147 | (erc-channel-user-voice-p (erc-current-nick))) | |
148 | "+" | |
149 | " ")) | |
150 | ||
059e26cf | 151 | (define-ibuffer-column erc-channel-modes (:name "Mode") |
597993cf MB |
152 | (if (and (eq major-mode 'erc-mode) |
153 | (or (> (length erc-channel-modes) 0) | |
154 | erc-channel-user-limit)) | |
155 | (concat (apply 'concat | |
156 | "(+" erc-channel-modes) | |
157 | (if erc-channel-user-limit | |
158 | (format "l %d" erc-channel-user-limit) | |
159 | "") | |
160 | ")") | |
161 | (if (not (eq major-mode 'erc-mode)) | |
162 | mode-name | |
163 | ""))) | |
164 | ||
059e26cf | 165 | (define-ibuffer-column erc-nick (:name "Nick") |
597993cf MB |
166 | (if (eq major-mode 'erc-mode) |
167 | (erc-current-nick) | |
168 | "")) | |
169 | ||
059e26cf MB |
170 | (defvar erc-ibuffer-formats |
171 | '((mark erc-modified erc-away erc-op erc-voice " " (erc-nick 8 8) " " | |
172 | (erc-target 18 40) (erc-members 5 5 :center) | |
173 | (erc-channel-modes 6 16 :center) " " (erc-server-name 20 30) " " | |
174 | (erc-topic 10 -1)) | |
175 | (mark erc-modified erc-away erc-op erc-voice " " (erc-target 18 40) | |
176 | (erc-members 5 5 :center) (erc-channel-modes 9 20 :center) " " | |
177 | (erc-topic 10 -1)))) | |
597993cf MB |
178 | (setq ibuffer-formats (append ibuffer-formats erc-ibuffer-formats)) |
179 | ||
180 | (defvar erc-ibuffer-limit-map nil | |
181 | "Prefix keymap to use for ERC related limiting.") | |
182 | (define-prefix-command 'erc-ibuffer-limit-map) | |
183 | (define-key 'erc-ibuffer-limit-map (kbd "s") 'ibuffer-limit-by-erc-server) | |
184 | (define-key ibuffer-mode-map (kbd "/ \C-e") 'erc-ibuffer-limit-map) | |
185 | ||
186 | (provide 'erc-ibuffer) | |
187 | ||
188 | ;;; erc-ibuffer.el ends here | |
189 | ;; | |
190 | ;; Local Variables: | |
191 | ;; indent-tabs-mode: t | |
192 | ;; tab-width: 8 | |
193 | ;; End: | |
194 | ||
195 | ;; arch-tag: fbad56a5-8595-45e0-a8c8-d8bb91e26944 |