comparison lisp/gnus/gnus-srvr.el @ 70:131b0175ea99 r20-0b30

Import from CVS: tag r20-0b30
author cvs
date Mon, 13 Aug 2007 09:02:59 +0200
parents 8b8b7f3559a2
children 0d2f883870bc
comparison
equal deleted inserted replaced
69:804d1389bcd6 70:131b0175ea99
1 ;;; gnus-srvr.el --- virtual server support for Gnus 1 ;;; gnus-srvr.el --- virtual server support for Gnus
2 ;; Copyright (C) 1995,96,97 Free Software Foundation, Inc. 2 ;; Copyright (C) 1995,96 Free Software Foundation, Inc.
3 3
4 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no> 4 ;; Author: Lars Magne Ingebrigtsen <larsi@ifi.uio.no>
5 ;; Keywords: news 5 ;; Keywords: news
6 6
7 ;; This file is part of GNU Emacs. 7 ;; This file is part of GNU Emacs.
24 ;;; Commentary: 24 ;;; Commentary:
25 25
26 ;;; Code: 26 ;;; Code:
27 27
28 (require 'gnus) 28 (require 'gnus)
29 (require 'gnus-spec) 29 (eval-when-compile (require 'cl))
30 (require 'gnus-group)
31 (require 'gnus-int)
32 (require 'gnus-range)
33 30
34 (defvar gnus-server-mode-hook nil 31 (defvar gnus-server-mode-hook nil
35 "Hook run in `gnus-server-mode' buffers.") 32 "Hook run in `gnus-server-mode' buffers.")
36 33
37 (defconst gnus-server-line-format " {%(%h:%w%)} %s\n" 34 (defconst gnus-server-line-format " {%(%h:%w%)} %s\n"
53 `((?h how ?s) 50 `((?h how ?s)
54 (?n name ?s) 51 (?n name ?s)
55 (?w where ?s) 52 (?w where ?s)
56 (?s status ?s))) 53 (?s status ?s)))
57 54
58 (defvar gnus-server-mode-line-format-alist 55 (defvar gnus-server-mode-line-format-alist
59 `((?S news-server ?s) 56 `((?S news-server ?s)
60 (?M news-method ?s) 57 (?M news-method ?s)
61 (?u user-defined ?s))) 58 (?u user-defined ?s)))
62 59
63 (defvar gnus-server-line-format-spec nil) 60 (defvar gnus-server-line-format-spec nil)
68 65
69 (defvar gnus-server-menu-hook nil 66 (defvar gnus-server-menu-hook nil
70 "*Hook run after the creation of the server mode menu.") 67 "*Hook run after the creation of the server mode menu.")
71 68
72 (defun gnus-server-make-menu-bar () 69 (defun gnus-server-make-menu-bar ()
73 (gnus-turn-off-edit-menu 'server) 70 (gnus-visual-turn-off-edit-menu 'server)
74 (unless (boundp 'gnus-server-server-menu) 71 (unless (boundp 'gnus-server-server-menu)
75 (easy-menu-define 72 (easy-menu-define
76 gnus-server-server-menu gnus-server-mode-map "" 73 gnus-server-server-menu gnus-server-mode-map ""
77 '("Server" 74 '("Server"
78 ["Add" gnus-server-add-server t] 75 ["Add" gnus-server-add-server t]
79 ["Browse" gnus-server-read-server t] 76 ["Browse" gnus-server-read-server t]
80 ["Scan" gnus-server-scan-server t]
81 ["List" gnus-server-list-servers t] 77 ["List" gnus-server-list-servers t]
82 ["Kill" gnus-server-kill-server t] 78 ["Kill" gnus-server-kill-server t]
83 ["Yank" gnus-server-yank-server t] 79 ["Yank" gnus-server-yank-server t]
84 ["Copy" gnus-server-copy-server t] 80 ["Copy" gnus-server-copy-server t]
85 ["Edit" gnus-server-edit-server t] 81 ["Edit" gnus-server-edit-server t]
86 ["Regenerate" gnus-server-regenerate-server t] 82 ["Exit" gnus-server-exit t]
87 ["Exit" gnus-server-exit t])) 83 ))
88 84
89 (easy-menu-define 85 (easy-menu-define
90 gnus-server-connections-menu gnus-server-mode-map "" 86 gnus-server-connections-menu gnus-server-mode-map ""
91 '("Connections" 87 '("Connections"
92 ["Open" gnus-server-open-server t] 88 ["Open" gnus-server-open-server t]
93 ["Close" gnus-server-close-server t] 89 ["Close" gnus-server-close-server t]
94 ["Deny" gnus-server-deny-server t] 90 ["Deny" gnus-server-deny-server t]
95 "---" 91 ["Reset" gnus-server-remove-denials t]
96 ["Open All" gnus-server-open-all-servers t] 92 ))
97 ["Close All" gnus-server-close-all-servers t]
98 ["Reset All" gnus-server-remove-denials t]))
99 93
100 (run-hooks 'gnus-server-menu-hook))) 94 (run-hooks 'gnus-server-menu-hook)))
101 95
102 (defvar gnus-server-mode-map nil) 96 (defvar gnus-server-mode-map nil)
103 (put 'gnus-server-mode 'mode-class 'special) 97 (put 'gnus-server-mode 'mode-class 'special)
116 "k" gnus-server-kill-server 110 "k" gnus-server-kill-server
117 "y" gnus-server-yank-server 111 "y" gnus-server-yank-server
118 "c" gnus-server-copy-server 112 "c" gnus-server-copy-server
119 "a" gnus-server-add-server 113 "a" gnus-server-add-server
120 "e" gnus-server-edit-server 114 "e" gnus-server-edit-server
121 "s" gnus-server-scan-server
122 115
123 "O" gnus-server-open-server 116 "O" gnus-server-open-server
124 "\M-o" gnus-server-open-all-servers
125 "C" gnus-server-close-server 117 "C" gnus-server-close-server
126 "\M-c" gnus-server-close-all-servers
127 "D" gnus-server-deny-server 118 "D" gnus-server-deny-server
128 "R" gnus-server-remove-denials 119 "R" gnus-server-remove-denials
129 120
130 "g" gnus-server-regenerate-server 121 "\C-c\C-i" gnus-info-find-node))
131
132 "\C-c\C-i" gnus-info-find-node
133 "\C-c\C-b" gnus-bug))
134 122
135 (defun gnus-server-mode () 123 (defun gnus-server-mode ()
136 "Major mode for listing and editing servers. 124 "Major mode for listing and editing servers.
137 125
138 All normal editing commands are switched off. 126 All normal editing commands are switched off.
139 \\<gnus-server-mode-map> 127 \\<gnus-server-mode-map>
140 For more in-depth information on this mode, read the manual 128 For more in-depth information on this mode, read the manual
141 (`\\[gnus-info-find-node]'). 129 (`\\[gnus-info-find-node]').
142 130
143 The following commands are available: 131 The following commands are available:
144 132
145 \\{gnus-server-mode-map}" 133 \\{gnus-server-mode-map}"
146 (interactive) 134 (interactive)
147 (when (gnus-visual-p 'server-menu 'menu) 135 (when (and menu-bar-mode
136 (gnus-visual-p 'server-menu 'menu))
148 (gnus-server-make-menu-bar)) 137 (gnus-server-make-menu-bar))
149 (kill-all-local-variables) 138 (kill-all-local-variables)
150 (gnus-simplify-mode-line) 139 (gnus-simplify-mode-line)
151 (setq major-mode 'gnus-server-mode) 140 (setq major-mode 'gnus-server-mode)
152 (setq mode-name "Server") 141 (setq mode-name "Server")
153 (gnus-set-default-directory) 142 ; (gnus-group-set-mode-line)
154 (setq mode-line-process nil) 143 (setq mode-line-process nil)
155 (use-local-map gnus-server-mode-map) 144 (use-local-map gnus-server-mode-map)
156 (buffer-disable-undo (current-buffer)) 145 (buffer-disable-undo (current-buffer))
157 (setq truncate-lines t) 146 (setq truncate-lines t)
158 (setq buffer-read-only t) 147 (setq buffer-read-only t)
187 "Initialize the server buffer." 176 "Initialize the server buffer."
188 (unless (get-buffer gnus-server-buffer) 177 (unless (get-buffer gnus-server-buffer)
189 (save-excursion 178 (save-excursion
190 (set-buffer (get-buffer-create gnus-server-buffer)) 179 (set-buffer (get-buffer-create gnus-server-buffer))
191 (gnus-server-mode) 180 (gnus-server-mode)
192 (when gnus-carpal 181 (when gnus-carpal
193 (gnus-carpal-setup-buffer 'server))))) 182 (gnus-carpal-setup-buffer 'server)))))
194 183
195 (defun gnus-server-prepare () 184 (defun gnus-server-prepare ()
196 (setq gnus-server-mode-line-format-spec 185 (setq gnus-server-mode-line-format-spec
197 (gnus-parse-format gnus-server-mode-line-format 186 (gnus-parse-format gnus-server-mode-line-format
198 gnus-server-mode-line-format-alist)) 187 gnus-server-mode-line-format-alist))
199 (setq gnus-server-line-format-spec 188 (setq gnus-server-line-format-spec
200 (gnus-parse-format gnus-server-line-format 189 (gnus-parse-format gnus-server-line-format
201 gnus-server-line-format-alist t)) 190 gnus-server-line-format-alist t))
202 (let ((alist gnus-server-alist) 191 (let ((alist gnus-server-alist)
203 (buffer-read-only nil) 192 (buffer-read-only nil)
204 (opened gnus-opened-servers) 193 (opened gnus-opened-servers)
205 done server op-ser) 194 done server op-ser)
206 (erase-buffer) 195 (erase-buffer)
207 (setq gnus-inserted-opened-servers nil) 196 (setq gnus-inserted-opened-servers nil)
208 ;; First we do the real list of servers. 197 ;; First we do the real list of servers.
209 (while alist 198 (while alist
210 (unless (member (cdar alist) done) 199 (push (cdr (setq server (pop alist))) done)
211 (push (cdar alist) done) 200 (when (and server (car server) (cdr server))
212 (cdr (setq server (pop alist))) 201 (gnus-server-insert-server-line (car server) (cdr server))))
213 (when (and server (car server) (cdr server))
214 (gnus-server-insert-server-line (car server) (cdr server))))
215 (when (member (cdar alist) done)
216 (pop alist)))
217 ;; Then we insert the list of servers that have been opened in 202 ;; Then we insert the list of servers that have been opened in
218 ;; this session. 203 ;; this session.
219 (while opened 204 (while opened
220 (unless (member (caar opened) done) 205 (unless (member (caar opened) done)
221 (push (caar opened) done) 206 (gnus-server-insert-server-line
222 (gnus-server-insert-server-line
223 (setq op-ser (format "%s:%s" (caaar opened) (nth 1 (caar opened)))) 207 (setq op-ser (format "%s:%s" (caaar opened) (nth 1 (caar opened))))
224 (caar opened)) 208 (caar opened))
225 (push (list op-ser (caar opened)) gnus-inserted-opened-servers)) 209 (push (list op-ser (caar opened)) gnus-inserted-opened-servers))
226 (setq opened (cdr opened)))) 210 (setq opened (cdr opened))))
227 (goto-char (point-min)) 211 (goto-char (point-min))
241 (let* ((buffer-read-only nil) 225 (let* ((buffer-read-only nil)
242 (entry (assoc server gnus-server-alist)) 226 (entry (assoc server gnus-server-alist))
243 (oentry (assoc (gnus-server-to-method server) 227 (oentry (assoc (gnus-server-to-method server)
244 gnus-opened-servers))) 228 gnus-opened-servers)))
245 (when entry 229 (when entry
246 (gnus-dribble-enter 230 (gnus-dribble-enter
247 (concat "(gnus-server-set-info \"" server "\" '" 231 (concat "(gnus-server-set-info \"" server "\" '"
248 (prin1-to-string (cdr entry)) ")\n"))) 232 (prin1-to-string (cdr entry)) ")")))
249 (when (or entry oentry) 233 (when (or entry oentry)
250 ;; Buffer may be narrowed. 234 ;; Buffer may be narrowed.
251 (save-restriction 235 (save-restriction
252 (widen) 236 (widen)
253 (when (gnus-server-goto-server server) 237 (when (gnus-server-goto-server server)
254 (gnus-delete-line)) 238 (gnus-delete-line))
255 (if entry 239 (if entry
256 (gnus-server-insert-server-line (car entry) (cdr entry)) 240 (gnus-server-insert-server-line (car entry) (cdr entry))
257 (gnus-server-insert-server-line 241 (gnus-server-insert-server-line
258 (format "%s:%s" (caar oentry) (nth 1 (car oentry))) 242 (format "%s:%s" (caar oentry) (nth 1 (car oentry)))
259 (car oentry))) 243 (car oentry)))
260 (gnus-server-position-point)))))) 244 (gnus-server-position-point))))))
261 245
262 (defun gnus-server-set-info (server info) 246 (defun gnus-server-set-info (server info)
263 ;; Enter a select method into the virtual server alist. 247 ;; Enter a select method into the virtual server alist.
264 (when (and server info) 248 (when (and server info)
265 (gnus-dribble-enter 249 (gnus-dribble-enter
266 (concat "(gnus-server-set-info \"" server "\" '" 250 (concat "(gnus-server-set-info \"" server "\" '"
267 (prin1-to-string info) ")")) 251 (prin1-to-string info) ")"))
268 (let* ((server (nth 1 info)) 252 (let* ((server (nth 1 info))
269 (entry (assoc server gnus-server-alist))) 253 (entry (assoc server gnus-server-alist)))
270 (if entry (setcdr entry info) 254 (if entry (setcdr entry info)
282 (unless (assoc server gnus-server-alist) 266 (unless (assoc server gnus-server-alist)
283 (error "Read-only server %s" server)) 267 (error "Read-only server %s" server))
284 (gnus-dribble-enter "") 268 (gnus-dribble-enter "")
285 (let ((buffer-read-only nil)) 269 (let ((buffer-read-only nil))
286 (gnus-delete-line)) 270 (gnus-delete-line))
287 (push (assoc server gnus-server-alist) gnus-server-killed-servers) 271 (setq gnus-server-killed-servers
272 (cons (assoc server gnus-server-alist) gnus-server-killed-servers))
288 (setq gnus-server-alist (delq (car gnus-server-killed-servers) 273 (setq gnus-server-alist (delq (car gnus-server-killed-servers)
289 gnus-server-alist)) 274 gnus-server-alist))
290 (gnus-server-position-point)) 275 (gnus-server-position-point))
291 276
292 (defun gnus-server-yank-server () 277 (defun gnus-server-yank-server ()
293 "Yank the previously killed server." 278 "Yank the previously killed server."
294 (interactive) 279 (interactive)
295 (unless gnus-server-killed-servers 280 (or gnus-server-killed-servers
296 (error "No killed servers to be yanked")) 281 (error "No killed servers to be yanked"))
297 (let ((alist gnus-server-alist) 282 (let ((alist gnus-server-alist)
298 (server (gnus-server-server-name)) 283 (server (gnus-server-server-name))
299 (killed (car gnus-server-killed-servers))) 284 (killed (car gnus-server-killed-servers)))
300 (if (not server) 285 (if (not server)
301 (setq gnus-server-alist (nconc gnus-server-alist (list killed))) 286 (setq gnus-server-alist (nconc gnus-server-alist (list killed)))
302 (if (string= server (caar gnus-server-alist)) 287 (if (string= server (caar gnus-server-alist))
303 (push killed gnus-server-alist) 288 (setq gnus-server-alist (cons killed gnus-server-alist))
304 (while (and (cdr alist) 289 (while (and (cdr alist)
305 (not (string= server (caadr alist)))) 290 (not (string= server (caadr alist))))
306 (setq alist (cdr alist))) 291 (setq alist (cdr alist)))
307 (if alist 292 (if alist
308 (setcdr alist (cons killed (cdr alist))) 293 (setcdr alist (cons killed (cdr alist)))
342 327
343 (defun gnus-server-open-server (server) 328 (defun gnus-server-open-server (server)
344 "Force an open of SERVER." 329 "Force an open of SERVER."
345 (interactive (list (gnus-server-server-name))) 330 (interactive (list (gnus-server-server-name)))
346 (let ((method (gnus-server-to-method server))) 331 (let ((method (gnus-server-to-method server)))
347 (unless method 332 (or method (error "No such server: %s" server))
348 (error "No such server: %s" server))
349 (gnus-server-set-status method 'ok) 333 (gnus-server-set-status method 'ok)
350 (prog1 334 (prog1
351 (or (gnus-open-server method) 335 (or (gnus-open-server method)
352 (progn (message "Couldn't open %s" server) nil)) 336 (progn (message "Couldn't open %s" server) nil))
353 (gnus-server-update-server server) 337 (gnus-server-update-server server)
354 (gnus-server-position-point)))) 338 (gnus-server-position-point))))
355 339
356 (defun gnus-server-open-all-servers ()
357 "Open all servers."
358 (interactive)
359 (let ((servers gnus-inserted-opened-servers))
360 (while servers
361 (gnus-server-open-server (car (pop servers))))))
362
363 (defun gnus-server-close-server (server) 340 (defun gnus-server-close-server (server)
364 "Close SERVER." 341 "Close SERVER."
365 (interactive (list (gnus-server-server-name))) 342 (interactive (list (gnus-server-server-name)))
366 (let ((method (gnus-server-to-method server))) 343 (let ((method (gnus-server-to-method server)))
367 (unless method 344 (or method (error "No such server: %s" server))
368 (error "No such server: %s" server))
369 (gnus-server-set-status method 'closed) 345 (gnus-server-set-status method 'closed)
370 (prog1 346 (prog1
371 (gnus-close-server method) 347 (gnus-close-server method)
372 (gnus-server-update-server server) 348 (gnus-server-update-server server)
373 (gnus-server-position-point)))) 349 (gnus-server-position-point))))
374 350
375 (defun gnus-server-close-all-servers ()
376 "Close all servers."
377 (interactive)
378 (let ((servers gnus-inserted-opened-servers))
379 (while servers
380 (gnus-server-close-server (car (pop servers))))))
381
382 (defun gnus-server-deny-server (server) 351 (defun gnus-server-deny-server (server)
383 "Make sure SERVER will never be attempted opened." 352 "Make sure SERVER will never be attempted opened."
384 (interactive (list (gnus-server-server-name))) 353 (interactive (list (gnus-server-server-name)))
385 (let ((method (gnus-server-to-method server))) 354 (let ((method (gnus-server-to-method server)))
386 (unless method 355 (or method (error "No such server: %s" server))
387 (error "No such server: %s" server))
388 (gnus-server-set-status method 'denied)) 356 (gnus-server-set-status method 'denied))
389 (gnus-server-update-server server) 357 (gnus-server-update-server server)
390 (gnus-server-position-point) 358 (gnus-server-position-point)
391 t) 359 t)
392 360
404 (interactive 372 (interactive
405 (list 373 (list
406 (or (gnus-server-server-name) 374 (or (gnus-server-server-name)
407 (error "No server on the current line")) 375 (error "No server on the current line"))
408 (read-string "Copy to: "))) 376 (read-string "Copy to: ")))
409 (unless from 377 (or from (error "No server on current line"))
410 (error "No server on current line")) 378 (or (and to (not (string= to ""))) (error "No name to copy to"))
411 (unless (and to (not (string= to ""))) 379 (and (assoc to gnus-server-alist) (error "%s already exists" to))
412 (error "No name to copy to")) 380 (or (assoc from gnus-server-alist)
413 (when (assoc to gnus-server-alist) 381 (error "%s: no such server" from))
414 (error "%s already exists" to)) 382 (let ((to-entry (gnus-copy-sequence (assoc from gnus-server-alist))))
415 (unless (gnus-server-to-method from)
416 (error "%s: no such server" from))
417 (let ((to-entry (cons from (gnus-copy-sequence
418 (gnus-server-to-method from)))))
419 (setcar to-entry to) 383 (setcar to-entry to)
420 (setcar (nthcdr 2 to-entry) to) 384 (setcar (nthcdr 2 to-entry) to)
421 (push to-entry gnus-server-killed-servers) 385 (setq gnus-server-killed-servers
386 (cons to-entry gnus-server-killed-servers))
422 (gnus-server-yank-server))) 387 (gnus-server-yank-server)))
423 388
424 (defun gnus-server-add-server (how where) 389 (defun gnus-server-add-server (how where)
425 (interactive 390 (interactive
426 (list (intern (completing-read "Server method: " 391 (list (intern (completing-read "Server method: "
427 gnus-valid-select-methods nil t)) 392 gnus-valid-select-methods nil t))
428 (read-string "Server name: "))) 393 (read-string "Server name: ")))
429 (when (assq where gnus-server-alist) 394 (setq gnus-server-killed-servers
430 (error "Server with that name already defined")) 395 (cons (list where how where) gnus-server-killed-servers))
431 (push (list where how where) gnus-server-killed-servers)
432 (gnus-server-yank-server)) 396 (gnus-server-yank-server))
433 397
434 (defun gnus-server-goto-server (server) 398 (defun gnus-server-goto-server (server)
435 "Jump to a server line." 399 "Jump to a server line."
436 (interactive 400 (interactive
437 (list (completing-read "Goto server: " gnus-server-alist nil t))) 401 (list (completing-read "Goto server: " gnus-server-alist nil t)))
438 (let ((to (text-property-any (point-min) (point-max) 402 (let ((to (text-property-any (point-min) (point-max)
439 'gnus-server (intern server)))) 403 'gnus-server (intern server))))
440 (when to 404 (and to
441 (goto-char to) 405 (progn
442 (gnus-server-position-point)))) 406 (goto-char to)
407 (gnus-server-position-point)))))
443 408
444 (defun gnus-server-edit-server (server) 409 (defun gnus-server-edit-server (server)
445 "Edit the server on the current line." 410 "Edit the server on the current line."
446 (interactive (list (gnus-server-server-name))) 411 (interactive (list (gnus-server-server-name)))
447 (unless server 412 (unless server
448 (error "No server on current line")) 413 (error "No server on current line"))
449 (unless (assoc server gnus-server-alist) 414 (unless (assoc server gnus-server-alist)
450 (error "This server can't be edited")) 415 (error "This server can't be edited"))
451 (let ((info (cdr (assoc server gnus-server-alist)))) 416 (let ((winconf (current-window-configuration))
417 (info (cdr (assoc server gnus-server-alist))))
452 (gnus-close-server info) 418 (gnus-close-server info)
453 (gnus-edit-form 419 (get-buffer-create gnus-server-edit-buffer)
454 info "Editing the server." 420 (gnus-configure-windows 'edit-server)
455 `(lambda (form) 421 (gnus-add-current-to-buffer-list)
456 (gnus-server-set-info ,server form) 422 (emacs-lisp-mode)
457 (gnus-server-list-servers) 423 (make-local-variable 'gnus-prev-winconf)
458 (gnus-server-position-point))))) 424 (setq gnus-prev-winconf winconf)
459 425 (use-local-map (copy-keymap (current-local-map)))
460 (defun gnus-server-scan-server (server) 426 (let ((done-func '(lambda ()
461 "Request a scan from the current server." 427 "Exit editing mode and update the information."
462 (interactive (list (gnus-server-server-name))) 428 (interactive)
463 (gnus-message 3 "Scanning %s...done" server) 429 (gnus-server-edit-server-done 'group))))
464 (gnus-request-scan nil (gnus-server-to-method server)) 430 (setcar (cdr (nth 4 done-func)) server)
465 (gnus-message 3 "Scanning %s...done" server)) 431 (local-set-key "\C-c\C-c" done-func))
432 (erase-buffer)
433 (insert ";; Type `C-c C-c' after you have edited the server.\n\n")
434 (insert (pp-to-string info))))
435
436 (defun gnus-server-edit-server-done (server)
437 (interactive)
438 (set-buffer (get-buffer-create gnus-server-edit-buffer))
439 (goto-char (point-min))
440 (let ((form (read (current-buffer)))
441 (winconf gnus-prev-winconf))
442 (gnus-server-set-info server form)
443 (kill-buffer (current-buffer))
444 (and winconf (set-window-configuration winconf))
445 (set-buffer gnus-server-buffer)
446 (gnus-server-update-server server)
447 (gnus-server-list-servers)
448 (gnus-server-position-point)))
466 449
467 (defun gnus-server-read-server (server) 450 (defun gnus-server-read-server (server)
468 "Browse a server." 451 "Browse a server."
469 (interactive (list (gnus-server-server-name))) 452 (interactive (list (gnus-server-server-name)))
470 (let ((buf (current-buffer))) 453 (let ((buf (current-buffer)))
472 (gnus-browse-foreign-server (gnus-server-to-method server) buf) 455 (gnus-browse-foreign-server (gnus-server-to-method server) buf)
473 (save-excursion 456 (save-excursion
474 (set-buffer buf) 457 (set-buffer buf)
475 (gnus-server-update-server (gnus-server-server-name)) 458 (gnus-server-update-server (gnus-server-server-name))
476 (gnus-server-position-point))))) 459 (gnus-server-position-point)))))
477 460
478 (defun gnus-server-pick-server (e) 461 (defun gnus-server-pick-server (e)
479 (interactive "e") 462 (interactive "e")
480 (mouse-set-point e) 463 (mouse-set-point e)
481 (gnus-server-read-server (gnus-server-server-name))) 464 (gnus-server-read-server (gnus-server-server-name)))
482 465
514 "q" gnus-browse-exit 497 "q" gnus-browse-exit
515 "Q" gnus-browse-exit 498 "Q" gnus-browse-exit
516 "\C-c\C-c" gnus-browse-exit 499 "\C-c\C-c" gnus-browse-exit
517 "?" gnus-browse-describe-briefly 500 "?" gnus-browse-describe-briefly
518 501
519 "\C-c\C-i" gnus-info-find-node 502 "\C-c\C-i" gnus-info-find-node))
520 "\C-c\C-b" gnus-bug))
521 503
522 (defun gnus-browse-make-menu-bar () 504 (defun gnus-browse-make-menu-bar ()
523 (gnus-turn-off-edit-menu 'browse) 505 (gnus-visual-turn-off-edit-menu 'browse)
524 (unless (boundp 'gnus-browse-menu) 506 (or
525 (easy-menu-define 507 (boundp 'gnus-browse-menu)
526 gnus-browse-menu gnus-browse-mode-map "" 508 (progn
527 '("Browse" 509 (easy-menu-define
528 ["Subscribe" gnus-browse-unsubscribe-current-group t] 510 gnus-browse-menu gnus-browse-mode-map ""
529 ["Read" gnus-browse-read-group t] 511 '("Browse"
530 ["Select" gnus-browse-read-group t] 512 ["Subscribe" gnus-browse-unsubscribe-current-group t]
531 ["Next" gnus-browse-next-group t] 513 ["Read" gnus-browse-read-group t]
532 ["Prev" gnus-browse-next-group t] 514 ["Select" gnus-browse-read-group t]
533 ["Exit" gnus-browse-exit t])) 515 ["Next" gnus-browse-next-group t]
534 (run-hooks 'gnus-browse-menu-hook))) 516 ["Prev" gnus-browse-next-group t]
517 ["Exit" gnus-browse-exit t]
518 ))
519 (run-hooks 'gnus-browse-menu-hook))))
535 520
536 (defvar gnus-browse-current-method nil) 521 (defvar gnus-browse-current-method nil)
537 (defvar gnus-browse-return-buffer nil) 522 (defvar gnus-browse-return-buffer nil)
538 523
539 (defvar gnus-browse-buffer "*Gnus Browse Server*") 524 (defvar gnus-browse-buffer "*Gnus Browse Server*")
540 525
541 (defun gnus-browse-foreign-server (method &optional return-buffer) 526 (defun gnus-browse-foreign-server (method &optional return-buffer)
542 "Browse the server METHOD." 527 "Browse the server METHOD."
543 (setq gnus-browse-current-method method) 528 (setq gnus-browse-current-method method)
544 (setq gnus-browse-return-buffer return-buffer) 529 (setq gnus-browse-return-buffer return-buffer)
545 (when (stringp method)
546 (setq method (gnus-server-to-method method)))
547 (let ((gnus-select-method method) 530 (let ((gnus-select-method method)
548 groups group) 531 groups group)
549 (gnus-message 5 "Connecting to %s..." (nth 1 method)) 532 (gnus-message 5 "Connecting to %s..." (nth 1 method))
550 (cond 533 (cond
551 ((not (gnus-check-server method)) 534 ((not (gnus-check-server method))
552 (gnus-message 535 (gnus-message
553 1 "Unable to contact server: %s" (gnus-status-message method)) 536 1 "Unable to contact server: %s" (gnus-status-message method))
554 nil) 537 nil)
555 ((not 538 ((not (gnus-request-list method))
556 (prog2
557 (gnus-message 6 "Reading active file...")
558 (gnus-request-list method)
559 (gnus-message 6 "Reading active file...done")))
560 (gnus-message 539 (gnus-message
561 1 "Couldn't request list: %s" (gnus-status-message method)) 540 1 "Couldn't request list: %s" (gnus-status-message method))
562 nil) 541 nil)
563 (t 542 (t
564 (get-buffer-create gnus-browse-buffer) 543 (get-buffer-create gnus-browse-buffer)
565 (gnus-add-current-to-buffer-list) 544 (gnus-add-current-to-buffer-list)
566 (when gnus-carpal 545 (and gnus-carpal (gnus-carpal-setup-buffer 'browse))
567 (gnus-carpal-setup-buffer 'browse))
568 (gnus-configure-windows 'browse) 546 (gnus-configure-windows 'browse)
569 (buffer-disable-undo (current-buffer)) 547 (buffer-disable-undo (current-buffer))
570 (let ((buffer-read-only nil)) 548 (let ((buffer-read-only nil))
571 (erase-buffer)) 549 (erase-buffer))
572 (gnus-browse-mode) 550 (gnus-browse-mode)
576 "Gnus: %%b {%s:%s}" (car method) (cadr method)))) 554 "Gnus: %%b {%s:%s}" (car method) (cadr method))))
577 (save-excursion 555 (save-excursion
578 (set-buffer nntp-server-buffer) 556 (set-buffer nntp-server-buffer)
579 (let ((cur (current-buffer))) 557 (let ((cur (current-buffer)))
580 (goto-char (point-min)) 558 (goto-char (point-min))
581 (unless (string= gnus-ignored-newsgroups "") 559 (or (string= gnus-ignored-newsgroups "")
582 (delete-matching-lines gnus-ignored-newsgroups)) 560 (delete-matching-lines gnus-ignored-newsgroups))
583 (while (re-search-forward 561 (while (re-search-forward
584 "\\(^[^ \t]+\\)[ \t]+[0-9]+[ \t]+[0-9]+" nil t) 562 "\\(^[^ \t]+\\)[ \t]+[0-9]+[ \t]+[0-9]+" nil t)
585 (goto-char (match-end 1)) 563 (goto-char (match-end 1))
586 (push (cons (match-string 1) 564 (setq groups (cons (cons (match-string 1)
587 (max 0 (- (1+ (read cur)) (read cur)))) 565 (max 0 (- (1+ (read cur)) (read cur))))
588 groups)))) 566 groups)))))
589 (setq groups (sort groups 567 (setq groups (sort groups
590 (lambda (l1 l2) 568 (lambda (l1 l2)
591 (string< (car l1) (car l2))))) 569 (string< (car l1) (car l2)))))
592 (let ((buffer-read-only nil)) 570 (let ((buffer-read-only nil))
593 (while groups 571 (while groups
616 2) `\\[gnus-browse-read-group]' to read a group ephemerally. 594 2) `\\[gnus-browse-read-group]' to read a group ephemerally.
617 595
618 3) `\\[gnus-browse-exit]' to return to the group buffer." 596 3) `\\[gnus-browse-exit]' to return to the group buffer."
619 (interactive) 597 (interactive)
620 (kill-all-local-variables) 598 (kill-all-local-variables)
621 (when (gnus-visual-p 'browse-menu 'menu) 599 (when (and menu-bar-mode
600 (gnus-visual-p 'browse-menu 'menu))
622 (gnus-browse-make-menu-bar)) 601 (gnus-browse-make-menu-bar))
623 (gnus-simplify-mode-line) 602 (gnus-simplify-mode-line)
624 (setq major-mode 'gnus-browse-mode) 603 (setq major-mode 'gnus-browse-mode)
625 (setq mode-name "Browse Server") 604 (setq mode-name "Browse Server")
626 (setq mode-line-process nil) 605 (setq mode-line-process nil)
627 (use-local-map gnus-browse-mode-map) 606 (use-local-map gnus-browse-mode-map)
628 (buffer-disable-undo (current-buffer)) 607 (buffer-disable-undo (current-buffer))
629 (setq truncate-lines t) 608 (setq truncate-lines t)
630 (gnus-set-default-directory)
631 (setq buffer-read-only t) 609 (setq buffer-read-only t)
632 (run-hooks 'gnus-browse-mode-hook)) 610 (run-hooks 'gnus-browse-mode-hook))
633 611
634 (defun gnus-browse-read-group (&optional no-article) 612 (defun gnus-browse-read-group (&optional no-article)
635 "Enter the group at the current line." 613 "Enter the group at the current line."
636 (interactive) 614 (interactive)
637 (let ((group (gnus-group-real-name (gnus-browse-group-name)))) 615 (let ((group (gnus-browse-group-name)))
638 (unless (gnus-group-read-ephemeral-group 616 (or (gnus-group-read-ephemeral-group
639 group gnus-browse-current-method nil 617 group gnus-browse-current-method nil
640 (cons (current-buffer) 'browse)) 618 (cons (current-buffer) 'browse))
641 (error "Couldn't enter %s" group)))) 619 (error "Couldn't enter %s" group))))
642 620
643 (defun gnus-browse-select-group () 621 (defun gnus-browse-select-group ()
644 "Select the current group." 622 "Select the current group."
645 (interactive) 623 (interactive)
646 (gnus-browse-read-group 'no)) 624 (gnus-browse-read-group 'no))
668 (not (eobp)) 646 (not (eobp))
669 (gnus-browse-unsubscribe-group) 647 (gnus-browse-unsubscribe-group)
670 (zerop (gnus-browse-next-group ward))) 648 (zerop (gnus-browse-next-group ward)))
671 (decf arg)) 649 (decf arg))
672 (gnus-group-position-point) 650 (gnus-group-position-point)
673 (when (/= 0 arg) 651 (if (/= 0 arg) (gnus-message 7 "No more newsgroups"))
674 (gnus-message 7 "No more newsgroups"))
675 arg)) 652 arg))
676 653
677 (defun gnus-browse-group-name () 654 (defun gnus-browse-group-name ()
678 (save-excursion 655 (save-excursion
679 (beginning-of-line) 656 (beginning-of-line)
686 (buffer-read-only nil) 663 (buffer-read-only nil)
687 group) 664 group)
688 (save-excursion 665 (save-excursion
689 (beginning-of-line) 666 (beginning-of-line)
690 ;; If this group it killed, then we want to subscribe it. 667 ;; If this group it killed, then we want to subscribe it.
691 (when (= (following-char) ?K) 668 (if (= (following-char) ?K) (setq sub t))
692 (setq sub t))
693 (setq group (gnus-browse-group-name)) 669 (setq group (gnus-browse-group-name))
694 ;; Make sure the group has been properly removed before we
695 ;; subscribe to it.
696 (gnus-kill-ephemeral-group group)
697 (delete-char 1) 670 (delete-char 1)
698 (if sub 671 (if sub
699 (progn 672 (progn
700 (gnus-group-change-level 673 (gnus-group-change-level
701 (list t group gnus-level-default-subscribed 674 (list t group gnus-level-default-subscribed
728 "Give a one line description of the group mode commands." 701 "Give a one line description of the group mode commands."
729 (interactive) 702 (interactive)
730 (gnus-message 6 703 (gnus-message 6
731 (substitute-command-keys "\\<gnus-browse-mode-map>\\[gnus-group-next-group]:Forward \\[gnus-group-prev-group]:Backward \\[gnus-browse-exit]:Exit \\[gnus-info-find-node]:Run Info \\[gnus-browse-describe-briefly]:This help"))) 704 (substitute-command-keys "\\<gnus-browse-mode-map>\\[gnus-group-next-group]:Forward \\[gnus-group-prev-group]:Backward \\[gnus-browse-exit]:Exit \\[gnus-info-find-node]:Run Info \\[gnus-browse-describe-briefly]:This help")))
732 705
733 (defun gnus-server-regenerate-server ()
734 "Issue a command to the server to regenerate all its data structures."
735 (interactive)
736 (let ((server (gnus-server-server-name)))
737 (unless server
738 (error "No server on the current line"))
739 (if (not (gnus-check-backend-function
740 'request-regenerate (car (gnus-server-to-method server))))
741 (error "This backend doesn't support regeneration")
742 (gnus-message 5 "Requesting regeneration of %s..." server)
743 (if (gnus-request-regenerate server)
744 (gnus-message 5 "Requesting regeneration of %s...done" server)
745 (gnus-message 5 "Couldn't regenerate %s" server)))))
746
747 (provide 'gnus-srvr) 706 (provide 'gnus-srvr)
748 707
749 ;;; gnus-srvr.el ends here. 708 ;;; gnus-srvr.el ends here.