Mercurial > emacs
annotate lisp/gnus/gnus-util.el @ 28923:dcafe3c9cd6c
(sh-while-getopts) <sh>: Handle case that
user-specified option string is empty.
| author | Gerd Moellmann <gerd@gnu.org> |
|---|---|
| date | Mon, 15 May 2000 20:14:39 +0000 |
| parents | 15fc6acbae7a |
| children | 9968f55ad26e |
| rev | line source |
|---|---|
| 17493 | 1 ;;; gnus-util.el --- utility functions for Gnus |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
2 ;; Copyright (C) 1996,97,98 Free Software Foundation, Inc. |
| 17493 | 3 |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
4 ;; Author: Lars Magne Ingebrigtsen <larsi@gnus.org> |
| 17493 | 5 ;; Keywords: news |
| 6 | |
| 7 ;; This file is part of GNU Emacs. | |
| 8 | |
| 9 ;; GNU Emacs is free software; you can redistribute it and/or modify | |
| 10 ;; it under the terms of the GNU General Public License as published by | |
| 11 ;; the Free Software Foundation; either version 2, or (at your option) | |
| 12 ;; any later version. | |
| 13 | |
| 14 ;; GNU Emacs is distributed in the hope that it will be useful, | |
| 15 ;; but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| 16 ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
| 17 ;; GNU General Public License for more details. | |
| 18 | |
| 19 ;; You should have received a copy of the GNU General Public License | |
| 20 ;; along with GNU Emacs; see the file COPYING. If not, write to the | |
| 21 ;; Free Software Foundation, Inc., 59 Temple Place - Suite 330, | |
| 22 ;; Boston, MA 02111-1307, USA. | |
| 23 | |
| 24 ;;; Commentary: | |
| 25 | |
| 26 ;; Nothing in this file depends on any other parts of Gnus -- all | |
| 27 ;; functions and macros in this file are utility functions that are | |
| 28 ;; used by Gnus and may be used by any other package without loading | |
| 29 ;; Gnus first. | |
| 30 | |
| 31 ;;; Code: | |
| 32 | |
| 33 (require 'custom) | |
|
19523
6713d6efcfde
Require cl only at compile time.
Richard M. Stallman <rms@gnu.org>
parents:
17493
diff
changeset
|
34 (eval-when-compile (require 'cl)) |
| 17493 | 35 (require 'nnheader) |
| 36 (require 'timezone) | |
| 37 (require 'message) | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
38 (eval-when-compile (require 'rmail)) |
| 17493 | 39 |
| 40 (eval-and-compile | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
41 (autoload 'nnmail-date-to-time "nnmail") |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
42 (autoload 'rmail-insert-rmail-file-header "rmail") |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
43 (autoload 'rmail-count-new-messages "rmail") |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
44 (autoload 'rmail-show-message "rmail")) |
| 17493 | 45 |
| 46 (defun gnus-boundp (variable) | |
| 47 "Return non-nil if VARIABLE is bound and non-nil." | |
| 48 (and (boundp variable) | |
| 49 (symbol-value variable))) | |
| 50 | |
| 51 (defmacro gnus-eval-in-buffer-window (buffer &rest forms) | |
| 52 "Pop to BUFFER, evaluate FORMS, and then return to the original window." | |
| 53 (let ((tempvar (make-symbol "GnusStartBufferWindow")) | |
| 54 (w (make-symbol "w")) | |
| 55 (buf (make-symbol "buf"))) | |
| 56 `(let* ((,tempvar (selected-window)) | |
| 57 (,buf ,buffer) | |
| 58 (,w (get-buffer-window ,buf 'visible))) | |
| 59 (unwind-protect | |
| 60 (progn | |
| 61 (if ,w | |
| 62 (progn | |
| 63 (select-window ,w) | |
| 64 (set-buffer (window-buffer ,w))) | |
| 65 (pop-to-buffer ,buf)) | |
| 66 ,@forms) | |
| 67 (select-window ,tempvar))))) | |
| 68 | |
| 69 (put 'gnus-eval-in-buffer-window 'lisp-indent-function 1) | |
| 70 (put 'gnus-eval-in-buffer-window 'edebug-form-spec '(form body)) | |
| 71 | |
| 72 (defmacro gnus-intern-safe (string hashtable) | |
| 73 "Set hash value. Arguments are STRING, VALUE, and HASHTABLE." | |
| 74 `(let ((symbol (intern ,string ,hashtable))) | |
| 75 (or (boundp symbol) | |
| 76 (set symbol nil)) | |
| 77 symbol)) | |
| 78 | |
| 79 (defun gnus-truncate-string (str width) | |
| 80 (substring str 0 width)) | |
| 81 | |
| 82 ;; Added by Geoffrey T. Dairiki <dairiki@u.washington.edu>. A safe way | |
| 83 ;; to limit the length of a string. This function is necessary since | |
| 84 ;; `(substr "abc" 0 30)' pukes with "Args out of range". | |
| 85 (defsubst gnus-limit-string (str width) | |
| 86 (if (> (length str) width) | |
| 87 (substring str 0 width) | |
| 88 str)) | |
| 89 | |
| 90 (defsubst gnus-functionp (form) | |
| 91 "Return non-nil if FORM is funcallable." | |
| 92 (or (and (symbolp form) (fboundp form)) | |
| 93 (and (listp form) (eq (car form) 'lambda)) | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
94 (byte-code-function-p form))) |
| 17493 | 95 |
| 96 (defsubst gnus-goto-char (point) | |
| 97 (and point (goto-char point))) | |
| 98 | |
| 99 (defmacro gnus-buffer-exists-p (buffer) | |
| 100 `(let ((buffer ,buffer)) | |
| 101 (when buffer | |
| 102 (funcall (if (stringp buffer) 'get-buffer 'buffer-name) | |
| 103 buffer)))) | |
| 104 | |
| 105 (defmacro gnus-kill-buffer (buffer) | |
| 106 `(let ((buf ,buffer)) | |
| 107 (when (gnus-buffer-exists-p buf) | |
| 108 (kill-buffer buf)))) | |
| 109 | |
| 110 (if (fboundp 'point-at-bol) | |
| 111 (fset 'gnus-point-at-bol 'point-at-bol) | |
| 112 (defun gnus-point-at-bol () | |
| 113 "Return point at the beginning of the line." | |
| 114 (let ((p (point))) | |
| 115 (beginning-of-line) | |
| 116 (prog1 | |
| 117 (point) | |
| 118 (goto-char p))))) | |
| 119 | |
| 120 (if (fboundp 'point-at-eol) | |
| 121 (fset 'gnus-point-at-eol 'point-at-eol) | |
| 122 (defun gnus-point-at-eol () | |
| 123 "Return point at the end of the line." | |
| 124 (let ((p (point))) | |
| 125 (end-of-line) | |
| 126 (prog1 | |
| 127 (point) | |
| 128 (goto-char p))))) | |
| 129 | |
| 130 (defun gnus-delete-first (elt list) | |
| 131 "Delete by side effect the first occurrence of ELT as a member of LIST." | |
| 132 (if (equal (car list) elt) | |
| 133 (cdr list) | |
| 134 (let ((total list)) | |
| 135 (while (and (cdr list) | |
| 136 (not (equal (cadr list) elt))) | |
| 137 (setq list (cdr list))) | |
| 138 (when (cdr list) | |
| 139 (setcdr list (cddr list))) | |
| 140 total))) | |
| 141 | |
| 142 ;; Delete the current line (and the next N lines). | |
| 143 (defmacro gnus-delete-line (&optional n) | |
| 144 `(delete-region (progn (beginning-of-line) (point)) | |
| 145 (progn (forward-line ,(or n 1)) (point)))) | |
| 146 | |
| 147 (defun gnus-byte-code (func) | |
| 148 "Return a form that can be `eval'ed based on FUNC." | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
149 (let ((fval (indirect-function func))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
150 (if (byte-code-function-p fval) |
| 17493 | 151 (let ((flist (append fval nil))) |
| 152 (setcar flist 'byte-code) | |
| 153 flist) | |
| 154 (cons 'progn (cddr fval))))) | |
| 155 | |
| 156 (defun gnus-extract-address-components (from) | |
| 157 (let (name address) | |
| 158 ;; First find the address - the thing with the @ in it. This may | |
| 159 ;; not be accurate in mail addresses, but does the trick most of | |
| 160 ;; the time in news messages. | |
| 161 (when (string-match "\\b[^@ \t<>]+[!@][^@ \t<>]+\\b" from) | |
| 162 (setq address (substring from (match-beginning 0) (match-end 0)))) | |
| 163 ;; Then we check whether the "name <address>" format is used. | |
| 164 (and address | |
| 165 ;; Linear white space is not required. | |
| 166 (string-match (concat "[ \t]*<" (regexp-quote address) ">") from) | |
| 167 (and (setq name (substring from 0 (match-beginning 0))) | |
| 168 ;; Strip any quotes from the name. | |
| 169 (string-match "\".*\"" name) | |
| 170 (setq name (substring name 1 (1- (match-end 0)))))) | |
| 171 ;; If not, then "address (name)" is used. | |
| 172 (or name | |
| 173 (and (string-match "(.+)" from) | |
| 174 (setq name (substring from (1+ (match-beginning 0)) | |
| 175 (1- (match-end 0))))) | |
| 176 (and (string-match "()" from) | |
| 177 (setq name address)) | |
| 178 ;; XOVER might not support folded From headers. | |
| 179 (and (string-match "(.*" from) | |
| 180 (setq name (substring from (1+ (match-beginning 0)) | |
| 181 (match-end 0))))) | |
| 182 ;; Fix by Hallvard B Furuseth <h.b.furuseth@usit.uio.no>. | |
| 183 (list (or name from) (or address from)))) | |
| 184 | |
| 185 (defun gnus-fetch-field (field) | |
| 186 "Return the value of the header FIELD of current article." | |
| 187 (save-excursion | |
| 188 (save-restriction | |
| 189 (let ((case-fold-search t) | |
| 190 (inhibit-point-motion-hooks t)) | |
| 191 (nnheader-narrow-to-headers) | |
| 192 (message-fetch-field field))))) | |
| 193 | |
| 194 (defun gnus-goto-colon () | |
| 195 (beginning-of-line) | |
| 196 (search-forward ":" (gnus-point-at-eol) t)) | |
| 197 | |
| 198 (defun gnus-remove-text-with-property (prop) | |
| 199 "Delete all text in the current buffer with text property PROP." | |
| 200 (save-excursion | |
| 201 (goto-char (point-min)) | |
| 202 (while (not (eobp)) | |
| 203 (while (get-text-property (point) prop) | |
| 204 (delete-char 1)) | |
| 205 (goto-char (next-single-property-change (point) prop nil (point-max)))))) | |
| 206 | |
| 207 (defun gnus-newsgroup-directory-form (newsgroup) | |
| 208 "Make hierarchical directory name from NEWSGROUP name." | |
| 209 (let ((newsgroup (gnus-newsgroup-savable-name newsgroup)) | |
| 210 (len (length newsgroup)) | |
| 211 idx) | |
| 212 ;; If this is a foreign group, we don't want to translate the | |
| 213 ;; entire name. | |
| 214 (if (setq idx (string-match ":" newsgroup)) | |
| 215 (aset newsgroup idx ?/) | |
| 216 (setq idx 0)) | |
| 217 ;; Replace all occurrences of `.' with `/'. | |
| 218 (while (< idx len) | |
| 219 (when (= (aref newsgroup idx) ?.) | |
| 220 (aset newsgroup idx ?/)) | |
| 221 (setq idx (1+ idx))) | |
| 222 newsgroup)) | |
| 223 | |
| 224 (defun gnus-newsgroup-savable-name (group) | |
| 225 ;; Replace any slashes in a group name (eg. an ange-ftp nndoc group) | |
| 226 ;; with dots. | |
| 227 (nnheader-replace-chars-in-string group ?/ ?.)) | |
| 228 | |
| 229 (defun gnus-string> (s1 s2) | |
| 230 (not (or (string< s1 s2) | |
| 231 (string= s1 s2)))) | |
| 232 | |
| 233 ;;; Time functions. | |
| 234 | |
| 235 (defun gnus-days-between (date1 date2) | |
| 236 ;; Return the number of days between date1 and date2. | |
| 237 (- (gnus-day-number date1) (gnus-day-number date2))) | |
| 238 | |
| 239 (defun gnus-day-number (date) | |
| 240 (let ((dat (mapcar (lambda (s) (and s (string-to-int s)) ) | |
| 241 (timezone-parse-date date)))) | |
| 242 (timezone-absolute-from-gregorian | |
| 243 (nth 1 dat) (nth 2 dat) (car dat)))) | |
| 244 | |
| 245 (defun gnus-time-to-day (time) | |
| 246 "Convert TIME to day number." | |
| 247 (let ((tim (decode-time time))) | |
| 248 (timezone-absolute-from-gregorian | |
| 249 (nth 4 tim) (nth 3 tim) (nth 5 tim)))) | |
| 250 | |
| 251 (defun gnus-encode-date (date) | |
| 252 "Convert DATE to internal time." | |
| 253 (let* ((parse (timezone-parse-date date)) | |
| 254 (date (mapcar (lambda (d) (and d (string-to-int d))) parse)) | |
| 255 (time (mapcar 'string-to-int (timezone-parse-time (aref parse 3))))) | |
| 256 (encode-time (caddr time) (cadr time) (car time) | |
|
19969
5f1ab3dd344d
*** empty log message ***
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
19523
diff
changeset
|
257 (caddr date) (cadr date) (car date) |
|
5f1ab3dd344d
*** empty log message ***
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
19523
diff
changeset
|
258 (* 60 (timezone-zone-to-minute (nth 4 date)))))) |
| 17493 | 259 |
| 260 (defun gnus-time-minus (t1 t2) | |
| 261 "Subtract two internal times." | |
| 262 (let ((borrow (< (cadr t1) (cadr t2)))) | |
| 263 (list (- (car t1) (car t2) (if borrow 1 0)) | |
| 264 (- (+ (if borrow 65536 0) (cadr t1)) (cadr t2))))) | |
| 265 | |
| 266 (defun gnus-time-less (t1 t2) | |
| 267 "Say whether time T1 is less than time T2." | |
| 268 (or (< (car t1) (car t2)) | |
| 269 (and (= (car t1) (car t2)) | |
| 270 (< (nth 1 t1) (nth 1 t2))))) | |
| 271 | |
| 272 (defun gnus-file-newer-than (file date) | |
| 273 (let ((fdate (nth 5 (file-attributes file)))) | |
| 274 (or (> (car fdate) (car date)) | |
| 275 (and (= (car fdate) (car date)) | |
| 276 (> (nth 1 fdate) (nth 1 date)))))) | |
| 277 | |
| 278 ;;; Keymap macros. | |
| 279 | |
| 280 (defmacro gnus-local-set-keys (&rest plist) | |
| 281 "Set the keys in PLIST in the current keymap." | |
| 282 `(gnus-define-keys-1 (current-local-map) ',plist)) | |
| 283 | |
| 284 (defmacro gnus-define-keys (keymap &rest plist) | |
| 285 "Define all keys in PLIST in KEYMAP." | |
| 286 `(gnus-define-keys-1 (quote ,keymap) (quote ,plist))) | |
| 287 | |
| 288 (defmacro gnus-define-keys-safe (keymap &rest plist) | |
| 289 "Define all keys in PLIST in KEYMAP without overwriting previous definitions." | |
| 290 `(gnus-define-keys-1 (quote ,keymap) (quote ,plist) t)) | |
| 291 | |
| 292 (put 'gnus-define-keys 'lisp-indent-function 1) | |
| 293 (put 'gnus-define-keys-safe 'lisp-indent-function 1) | |
| 294 (put 'gnus-local-set-keys 'lisp-indent-function 1) | |
| 295 | |
| 296 (defmacro gnus-define-keymap (keymap &rest plist) | |
| 297 "Define all keys in PLIST in KEYMAP." | |
| 298 `(gnus-define-keys-1 ,keymap (quote ,plist))) | |
| 299 | |
| 300 (put 'gnus-define-keymap 'lisp-indent-function 1) | |
| 301 | |
| 302 (defun gnus-define-keys-1 (keymap plist &optional safe) | |
| 303 (when (null keymap) | |
| 304 (error "Can't set keys in a null keymap")) | |
| 305 (cond ((symbolp keymap) | |
| 306 (setq keymap (symbol-value keymap))) | |
| 307 ((keymapp keymap)) | |
| 308 ((listp keymap) | |
| 309 (set (car keymap) nil) | |
| 310 (define-prefix-command (car keymap)) | |
| 311 (define-key (symbol-value (caddr keymap)) (cadr keymap) (car keymap)) | |
| 312 (setq keymap (symbol-value (car keymap))))) | |
| 313 (let (key) | |
| 314 (while plist | |
| 315 (when (symbolp (setq key (pop plist))) | |
| 316 (setq key (symbol-value key))) | |
| 317 (if (or (not safe) | |
| 318 (eq (lookup-key keymap key) 'undefined)) | |
| 319 (define-key keymap key (pop plist)) | |
| 320 (pop plist))))) | |
| 321 | |
| 322 (defun gnus-completing-read (default prompt &rest args) | |
| 323 ;; Like `completing-read', except that DEFAULT is the default argument. | |
| 324 (let* ((prompt (if default | |
| 325 (concat prompt " (default " default ") ") | |
| 326 (concat prompt " "))) | |
| 327 (answer (apply 'completing-read prompt args))) | |
| 328 (if (or (null answer) (zerop (length answer))) | |
| 329 default | |
| 330 answer))) | |
| 331 | |
| 332 ;; Two silly functions to ensure that all `y-or-n-p' questions clear | |
| 333 ;; the echo area. | |
| 334 (defun gnus-y-or-n-p (prompt) | |
| 335 (prog1 | |
| 336 (y-or-n-p prompt) | |
| 337 (message ""))) | |
| 338 | |
| 339 (defun gnus-yes-or-no-p (prompt) | |
| 340 (prog1 | |
| 341 (yes-or-no-p prompt) | |
| 342 (message ""))) | |
| 343 | |
| 344 (defun gnus-dd-mmm (messy-date) | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
345 "Return a string like DD-MMM from a big messy string." |
| 17493 | 346 (let ((datevec (ignore-errors (timezone-parse-date messy-date)))) |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
347 (if (or (not datevec) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
348 (string-equal "0" (aref datevec 1))) |
| 17493 | 349 "??-???" |
| 350 (format "%2s-%s" | |
| 351 (condition-case () | |
| 352 ;; Make sure leading zeroes are stripped. | |
| 353 (number-to-string (string-to-number (aref datevec 2))) | |
| 354 (error "??")) | |
| 355 (capitalize | |
| 356 (or (car | |
| 357 (nth (1- (string-to-number (aref datevec 1))) | |
| 358 timezone-months-assoc)) | |
| 359 "???")))))) | |
| 360 | |
| 361 (defmacro gnus-date-get-time (date) | |
| 362 "Convert DATE string to Emacs time. | |
| 363 Cache the result as a text property stored in DATE." | |
| 364 ;; Either return the cached value... | |
| 365 `(let ((d ,date)) | |
| 366 (if (equal "" d) | |
| 367 '(0 0) | |
| 368 (or (get-text-property 0 'gnus-time d) | |
| 369 ;; or compute the value... | |
| 370 (let ((time (nnmail-date-to-time d))) | |
| 371 ;; and store it back in the string. | |
| 372 (put-text-property 0 1 'gnus-time time d) | |
| 373 time))))) | |
| 374 | |
| 375 (defsubst gnus-time-iso8601 (time) | |
| 376 "Return a string of TIME in YYMMDDTHHMMSS format." | |
| 377 (format-time-string "%Y%m%dT%H%M%S" time)) | |
| 378 | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
379 (defun gnus-date-iso8601 (date) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
380 "Convert the DATE to YYMMDDTHHMMSS." |
| 17493 | 381 (condition-case () |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
382 (gnus-time-iso8601 (gnus-date-get-time date)) |
| 17493 | 383 (error ""))) |
| 384 | |
| 385 (defun gnus-mode-string-quote (string) | |
| 386 "Quote all \"%\"'s in STRING." | |
| 387 (save-excursion | |
| 388 (gnus-set-work-buffer) | |
| 389 (insert string) | |
| 390 (goto-char (point-min)) | |
| 391 (while (search-forward "%" nil t) | |
| 392 (insert "%")) | |
| 393 (buffer-string))) | |
| 394 | |
| 395 ;; Make a hash table (default and minimum size is 256). | |
| 396 ;; Optional argument HASHSIZE specifies the table size. | |
| 397 (defun gnus-make-hashtable (&optional hashsize) | |
| 398 (make-vector (if hashsize (max (gnus-create-hash-size hashsize) 256) 256) 0)) | |
| 399 | |
| 400 ;; Make a number that is suitable for hashing; bigger than MIN and | |
| 401 ;; equal to some 2^x. Many machines (such as sparcs) do not have a | |
| 402 ;; hardware modulo operation, so they implement it in software. On | |
| 403 ;; many sparcs over 50% of the time to intern is spent in the modulo. | |
| 404 ;; Yes, it's slower than actually computing the hash from the string! | |
| 405 ;; So we use powers of 2 so people can optimize the modulo to a mask. | |
| 406 (defun gnus-create-hash-size (min) | |
| 407 (let ((i 1)) | |
| 408 (while (< i min) | |
| 409 (setq i (* 2 i))) | |
| 410 i)) | |
| 411 | |
| 412 (defcustom gnus-verbose 7 | |
| 413 "*Integer that says how verbose Gnus should be. | |
| 414 The higher the number, the more messages Gnus will flash to say what | |
| 415 it's doing. At zero, Gnus will be totally mute; at five, Gnus will | |
| 416 display most important messages; and at ten, Gnus will keep on | |
| 417 jabbering all the time." | |
| 418 :group 'gnus-start | |
| 419 :type 'integer) | |
| 420 | |
| 421 ;; Show message if message has a lower level than `gnus-verbose'. | |
| 422 ;; Guideline for numbers: | |
| 423 ;; 1 - error messages, 3 - non-serious error messages, 5 - messages | |
| 424 ;; for things that take a long time, 7 - not very important messages | |
| 425 ;; on stuff, 9 - messages inside loops. | |
| 426 (defun gnus-message (level &rest args) | |
| 427 (if (<= level gnus-verbose) | |
| 428 (apply 'message args) | |
| 429 ;; We have to do this format thingy here even if the result isn't | |
| 430 ;; shown - the return value has to be the same as the return value | |
| 431 ;; from `message'. | |
| 432 (apply 'format args))) | |
| 433 | |
| 434 (defun gnus-error (level &rest args) | |
| 435 "Beep an error if LEVEL is equal to or less than `gnus-verbose'." | |
| 436 (when (<= (floor level) gnus-verbose) | |
| 437 (apply 'message args) | |
| 438 (ding) | |
| 439 (let (duration) | |
| 440 (when (and (floatp level) | |
| 441 (not (zerop (setq duration (* 10 (- level (floor level))))))) | |
| 442 (sit-for duration)))) | |
| 443 nil) | |
| 444 | |
| 445 (defun gnus-split-references (references) | |
| 446 "Return a list of Message-IDs in REFERENCES." | |
| 447 (let ((beg 0) | |
| 448 ids) | |
| 449 (while (string-match "<[^>]+>" references beg) | |
| 450 (push (substring references (match-beginning 0) (setq beg (match-end 0))) | |
| 451 ids)) | |
| 452 (nreverse ids))) | |
| 453 | |
| 454 (defun gnus-parent-id (references &optional n) | |
| 455 "Return the last Message-ID in REFERENCES. | |
| 456 If N, return the Nth ancestor instead." | |
| 457 (when references | |
| 458 (let ((ids (inline (gnus-split-references references)))) | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
459 (car (last ids (or n 1)))))) |
| 17493 | 460 |
| 461 (defsubst gnus-buffer-live-p (buffer) | |
| 462 "Say whether BUFFER is alive or not." | |
| 463 (and buffer | |
| 464 (get-buffer buffer) | |
| 465 (buffer-name (get-buffer buffer)))) | |
| 466 | |
| 467 (defun gnus-horizontal-recenter () | |
| 468 "Recenter the current buffer horizontally." | |
| 469 (if (< (current-column) (/ (window-width) 2)) | |
| 470 (set-window-hscroll (get-buffer-window (current-buffer) t) 0) | |
| 471 (let* ((orig (point)) | |
| 472 (end (window-end (get-buffer-window (current-buffer) t))) | |
| 473 (max 0)) | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
474 (when end |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
475 ;; Find the longest line currently displayed in the window. |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
476 (goto-char (window-start)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
477 (while (and (not (eobp)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
478 (< (point) end)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
479 (end-of-line) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
480 (setq max (max max (current-column))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
481 (forward-line 1)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
482 (goto-char orig) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
483 ;; Scroll horizontally to center (sort of) the point. |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
484 (if (> max (window-width)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
485 (set-window-hscroll |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
486 (get-buffer-window (current-buffer) t) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
487 (min (- (current-column) (/ (window-width) 3)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
488 (+ 2 (- max (window-width))))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
489 (set-window-hscroll (get-buffer-window (current-buffer) t) 0)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
490 max)))) |
| 17493 | 491 |
| 492 (defun gnus-read-event-char () | |
| 493 "Get the next event." | |
| 494 (let ((event (read-event))) | |
| 495 ;; should be gnus-characterp, but this can't be called in XEmacs anyway | |
| 496 (cons (and (numberp event) event) event))) | |
| 497 | |
| 498 (defun gnus-sortable-date (date) | |
| 499 "Make sortable string by string-lessp from DATE. | |
| 500 Timezone package is used." | |
| 501 (condition-case () | |
| 502 (progn | |
| 503 (setq date (inline (timezone-fix-time | |
| 504 date nil | |
| 505 (aref (inline (timezone-parse-date date)) 4)))) | |
| 506 (inline | |
| 507 (timezone-make-sortable-date | |
| 508 (aref date 0) (aref date 1) (aref date 2) | |
| 509 (inline | |
| 510 (timezone-make-time-string | |
| 511 (aref date 3) (aref date 4) (aref date 5)))))) | |
| 512 (error ""))) | |
| 513 | |
| 514 (defun gnus-copy-file (file &optional to) | |
| 515 "Copy FILE to TO." | |
| 516 (interactive | |
| 517 (list (read-file-name "Copy file: " default-directory) | |
| 518 (read-file-name "Copy file to: " default-directory))) | |
| 519 (unless to | |
| 520 (setq to (read-file-name "Copy file to: " default-directory))) | |
| 521 (when (file-directory-p to) | |
| 522 (setq to (concat (file-name-as-directory to) | |
| 523 (file-name-nondirectory file)))) | |
| 524 (copy-file file to)) | |
| 525 | |
| 526 (defun gnus-kill-all-overlays () | |
| 527 "Delete all overlays in the current buffer." | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
528 (let* ((overlayss (overlay-lists)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
529 (buffer-read-only nil) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
530 (overlays (delq nil (nconc (car overlayss) (cdr overlayss))))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
531 (while overlays |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
532 (delete-overlay (pop overlays))))) |
| 17493 | 533 |
| 534 (defvar gnus-work-buffer " *gnus work*") | |
| 535 | |
| 536 (defun gnus-set-work-buffer () | |
| 537 "Put point in the empty Gnus work buffer." | |
| 538 (if (get-buffer gnus-work-buffer) | |
| 539 (progn | |
| 540 (set-buffer gnus-work-buffer) | |
| 541 (erase-buffer)) | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
542 (set-buffer (gnus-get-buffer-create gnus-work-buffer)) |
| 17493 | 543 (kill-all-local-variables) |
| 544 (buffer-disable-undo (current-buffer)))) | |
| 545 | |
| 546 (defmacro gnus-group-real-name (group) | |
| 547 "Find the real name of a foreign newsgroup." | |
| 548 `(let ((gname ,group)) | |
| 549 (if (string-match "^[^:]+:" gname) | |
| 550 (substring gname (match-end 0)) | |
| 551 gname))) | |
| 552 | |
| 553 (defun gnus-make-sort-function (funs) | |
| 554 "Return a composite sort condition based on the functions in FUNC." | |
| 555 (cond | |
| 556 ((not (listp funs)) funs) | |
| 557 ((null funs) funs) | |
| 558 ((cdr funs) | |
| 559 `(lambda (t1 t2) | |
| 560 ,(gnus-make-sort-function-1 (reverse funs)))) | |
| 561 (t | |
| 562 (car funs)))) | |
| 563 | |
| 564 (defun gnus-make-sort-function-1 (funs) | |
| 565 "Return a composite sort condition based on the functions in FUNC." | |
| 566 (if (cdr funs) | |
| 567 `(or (,(car funs) t1 t2) | |
| 568 (and (not (,(car funs) t2 t1)) | |
| 569 ,(gnus-make-sort-function-1 (cdr funs)))) | |
| 570 `(,(car funs) t1 t2))) | |
| 571 | |
| 572 (defun gnus-turn-off-edit-menu (type) | |
| 573 "Turn off edit menu in `gnus-TYPE-mode-map'." | |
| 574 (define-key (symbol-value (intern (format "gnus-%s-mode-map" type))) | |
| 575 [menu-bar edit] 'undefined)) | |
| 576 | |
| 577 (defun gnus-prin1 (form) | |
| 578 "Use `prin1' on FORM in the current buffer. | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
579 Bind `print-quoted' and `print-readably' to t while printing." |
| 17493 | 580 (let ((print-quoted t) |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
581 (print-readably t) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
582 (print-escape-multibyte nil) |
| 17493 | 583 print-level print-length) |
| 584 (prin1 form (current-buffer)))) | |
| 585 | |
| 586 (defun gnus-prin1-to-string (form) | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
587 "The same as `prin1', but bind `print-quoted' and `print-readably' to t." |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
588 (let ((print-quoted t) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
589 (print-readably t)) |
| 17493 | 590 (prin1-to-string form))) |
| 591 | |
| 592 (defun gnus-make-directory (directory) | |
| 593 "Make DIRECTORY (and all its parents) if it doesn't exist." | |
| 594 (when (and directory | |
| 595 (not (file-exists-p directory))) | |
| 596 (make-directory directory t)) | |
| 597 t) | |
| 598 | |
| 599 (defun gnus-write-buffer (file) | |
| 600 "Write the current buffer's contents to FILE." | |
| 601 ;; Make sure the directory exists. | |
| 602 (gnus-make-directory (file-name-directory file)) | |
| 603 ;; Write the buffer. | |
| 604 (write-region (point-min) (point-max) file nil 'quietly)) | |
| 605 | |
| 606 (defun gnus-delete-file (file) | |
| 607 "Delete FILE if it exists." | |
| 608 (when (file-exists-p file) | |
| 609 (delete-file file))) | |
| 610 | |
| 611 (defun gnus-strip-whitespace (string) | |
| 612 "Return STRING stripped of all whitespace." | |
| 613 (while (string-match "[\r\n\t ]+" string) | |
| 614 (setq string (replace-match "" t t string))) | |
| 615 string) | |
| 616 | |
| 617 (defun gnus-put-text-property-excluding-newlines (beg end prop val) | |
| 618 "The same as `put-text-property', but don't put this prop on any newlines in the region." | |
| 619 (save-match-data | |
| 620 (save-excursion | |
| 621 (save-restriction | |
| 622 (goto-char beg) | |
| 623 (while (re-search-forward "[ \t]*\n" end 'move) | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
624 (gnus-put-text-property beg (match-beginning 0) prop val) |
| 17493 | 625 (setq beg (point))) |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
626 (gnus-put-text-property beg (point) prop val))))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
627 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
628 (defun gnus-put-text-property-excluding-characters-with-faces (beg end |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
629 prop val) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
630 "The same as `put-text-property', but don't put props on characters with the `gnus-face' property." |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
631 (let ((b beg)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
632 (while (/= b end) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
633 (when (get-text-property b 'gnus-face) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
634 (setq b (next-single-property-change b 'gnus-face nil end))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
635 (when (/= b end) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
636 (gnus-put-text-property |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
637 b (setq b (next-single-property-change b 'gnus-face nil end)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
638 prop val))))) |
| 17493 | 639 |
| 640 ;;; Protected and atomic operations. dmoore@ucsd.edu 21.11.1996 | |
| 641 ;;; The primary idea here is to try to protect internal datastructures | |
| 642 ;;; from becoming corrupted when the user hits C-g, or if a hook or | |
| 643 ;;; similar blows up. Often in Gnus multiple tables/lists need to be | |
| 644 ;;; updated at the same time, or information can be lost. | |
| 645 | |
| 646 (defvar gnus-atomic-be-safe t | |
| 647 "If t, certain operations will be protected from interruption by C-g.") | |
| 648 | |
| 649 (defmacro gnus-atomic-progn (&rest forms) | |
| 650 "Evaluate FORMS atomically, which means to protect the evaluation | |
| 651 from being interrupted by the user. An error from the forms themselves | |
| 652 will return without finishing the operation. Since interrupts from | |
| 653 the user are disabled, it is recommended that only the most minimal | |
| 654 operations are performed by FORMS. If you wish to assign many | |
| 655 complicated values atomically, compute the results into temporary | |
| 656 variables and then do only the assignment atomically." | |
| 657 `(let ((inhibit-quit gnus-atomic-be-safe)) | |
| 658 ,@forms)) | |
| 659 | |
| 660 (put 'gnus-atomic-progn 'lisp-indent-function 0) | |
| 661 | |
| 662 (defmacro gnus-atomic-progn-assign (protect &rest forms) | |
| 663 "Evaluate FORMS, but insure that the variables listed in PROTECT | |
| 664 are not changed if anything in FORMS signals an error or otherwise | |
| 665 non-locally exits. The variables listed in PROTECT are updated atomically. | |
| 666 It is safe to use gnus-atomic-progn-assign with long computations. | |
| 667 | |
| 668 Note that if any of the symbols in PROTECT were unbound, they will be | |
| 669 set to nil on a sucessful assignment. In case of an error or other | |
| 670 non-local exit, it will still be unbound." | |
| 671 (let* ((temp-sym-map (mapcar (lambda (x) (list (make-symbol | |
| 672 (concat (symbol-name x) | |
| 673 "-tmp")) | |
| 674 x)) | |
| 675 protect)) | |
| 676 (sym-temp-map (mapcar (lambda (x) (list (cadr x) (car x))) | |
| 677 temp-sym-map)) | |
| 678 (temp-sym-let (mapcar (lambda (x) (list (car x) | |
| 679 `(and (boundp ',(cadr x)) | |
| 680 ,(cadr x)))) | |
| 681 temp-sym-map)) | |
| 682 (sym-temp-let sym-temp-map) | |
| 683 (temp-sym-assign (apply 'append temp-sym-map)) | |
| 684 (sym-temp-assign (apply 'append sym-temp-map)) | |
| 685 (result (make-symbol "result-tmp"))) | |
| 686 `(let (,@temp-sym-let | |
| 687 ,result) | |
| 688 (let ,sym-temp-let | |
| 689 (setq ,result (progn ,@forms)) | |
| 690 (setq ,@temp-sym-assign)) | |
| 691 (let ((inhibit-quit gnus-atomic-be-safe)) | |
| 692 (setq ,@sym-temp-assign)) | |
| 693 ,result))) | |
| 694 | |
| 695 (put 'gnus-atomic-progn-assign 'lisp-indent-function 1) | |
| 696 ;(put 'gnus-atomic-progn-assign 'edebug-form-spec '(sexp body)) | |
| 697 | |
| 698 (defmacro gnus-atomic-setq (&rest pairs) | |
| 699 "Similar to setq, except that the real symbols are only assigned when | |
| 700 there are no errors. And when the real symbols are assigned, they are | |
| 701 done so atomically. If other variables might be changed via side-effect, | |
| 702 see gnus-atomic-progn-assign. It is safe to use gnus-atomic-setq | |
| 703 with potentially long computations." | |
| 704 (let ((tpairs pairs) | |
| 705 syms) | |
| 706 (while tpairs | |
| 707 (push (car tpairs) syms) | |
| 708 (setq tpairs (cddr tpairs))) | |
| 709 `(gnus-atomic-progn-assign ,syms | |
| 710 (setq ,@pairs)))) | |
| 711 | |
| 712 ;(put 'gnus-atomic-setq 'edebug-form-spec '(body)) | |
| 713 | |
| 714 | |
| 715 ;;; Functions for saving to babyl/mail files. | |
| 716 | |
| 717 (defvar rmail-default-rmail-file) | |
| 718 (defun gnus-output-to-rmail (filename &optional ask) | |
| 719 "Append the current article to an Rmail file named FILENAME." | |
| 720 (require 'rmail) | |
| 721 ;; Most of these codes are borrowed from rmailout.el. | |
| 722 (setq filename (expand-file-name filename)) | |
| 723 (setq rmail-default-rmail-file filename) | |
| 724 (let ((artbuf (current-buffer)) | |
| 725 (tmpbuf (get-buffer-create " *Gnus-output*"))) | |
| 726 (save-excursion | |
| 727 (or (get-file-buffer filename) | |
| 728 (file-exists-p filename) | |
| 729 (if (or (not ask) | |
| 730 (gnus-yes-or-no-p | |
| 731 (concat "\"" filename "\" does not exist, create it? "))) | |
| 732 (let ((file-buffer (create-file-buffer filename))) | |
| 733 (save-excursion | |
| 734 (set-buffer file-buffer) | |
| 735 (rmail-insert-rmail-file-header) | |
| 736 (let ((require-final-newline nil)) | |
| 737 (gnus-write-buffer filename))) | |
| 738 (kill-buffer file-buffer)) | |
| 739 (error "Output file does not exist"))) | |
| 740 (set-buffer tmpbuf) | |
| 741 (erase-buffer) | |
| 742 (insert-buffer-substring artbuf) | |
| 743 (gnus-convert-article-to-rmail) | |
| 744 ;; Decide whether to append to a file or to an Emacs buffer. | |
| 745 (let ((outbuf (get-file-buffer filename))) | |
| 746 (if (not outbuf) | |
| 747 (append-to-file (point-min) (point-max) filename) | |
| 748 ;; File has been visited, in buffer OUTBUF. | |
| 749 (set-buffer outbuf) | |
| 750 (let ((buffer-read-only nil) | |
| 751 (msg (and (boundp 'rmail-current-message) | |
| 752 (symbol-value 'rmail-current-message)))) | |
| 753 ;; If MSG is non-nil, buffer is in RMAIL mode. | |
| 754 (when msg | |
| 755 (widen) | |
| 756 (narrow-to-region (point-max) (point-max))) | |
| 757 (insert-buffer-substring tmpbuf) | |
| 758 (when msg | |
| 759 (goto-char (point-min)) | |
| 760 (widen) | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
761 (search-backward "\n\^_") |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
762 (narrow-to-region (point) (point-max)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
763 (rmail-count-new-messages t) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
764 (when (rmail-summary-exists) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
765 (rmail-select-summary |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
766 (rmail-update-summary))) |
| 17493 | 767 (rmail-count-new-messages t) |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
768 (rmail-show-message msg)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
769 (save-buffer))))) |
| 17493 | 770 (kill-buffer tmpbuf))) |
| 771 | |
| 772 (defun gnus-output-to-mail (filename &optional ask) | |
| 773 "Append the current article to a mail file named FILENAME." | |
| 774 (setq filename (expand-file-name filename)) | |
| 775 (let ((artbuf (current-buffer)) | |
| 776 (tmpbuf (get-buffer-create " *Gnus-output*"))) | |
| 777 (save-excursion | |
| 778 ;; Create the file, if it doesn't exist. | |
| 779 (when (and (not (get-file-buffer filename)) | |
| 780 (not (file-exists-p filename))) | |
| 781 (if (or (not ask) | |
| 782 (gnus-y-or-n-p | |
| 783 (concat "\"" filename "\" does not exist, create it? "))) | |
| 784 (let ((file-buffer (create-file-buffer filename))) | |
| 785 (save-excursion | |
| 786 (set-buffer file-buffer) | |
| 787 (let ((require-final-newline nil)) | |
| 788 (gnus-write-buffer filename))) | |
| 789 (kill-buffer file-buffer)) | |
| 790 (error "Output file does not exist"))) | |
| 791 (set-buffer tmpbuf) | |
| 792 (erase-buffer) | |
| 793 (insert-buffer-substring artbuf) | |
| 794 (goto-char (point-min)) | |
| 795 (if (looking-at "From ") | |
| 796 (forward-line 1) | |
| 797 (insert "From nobody " (current-time-string) "\n")) | |
| 798 (let (case-fold-search) | |
| 799 (while (re-search-forward "^From " nil t) | |
| 800 (beginning-of-line) | |
| 801 (insert ">"))) | |
| 802 ;; Decide whether to append to a file or to an Emacs buffer. | |
| 803 (let ((outbuf (get-file-buffer filename))) | |
| 804 (if (not outbuf) | |
| 805 (let ((buffer-read-only nil)) | |
| 806 (save-excursion | |
| 807 (goto-char (point-max)) | |
| 808 (forward-char -2) | |
| 809 (unless (looking-at "\n\n") | |
| 810 (goto-char (point-max)) | |
| 811 (unless (bolp) | |
| 812 (insert "\n")) | |
| 813 (insert "\n")) | |
| 814 (goto-char (point-max)) | |
| 815 (append-to-file (point-min) (point-max) filename))) | |
| 816 ;; File has been visited, in buffer OUTBUF. | |
| 817 (set-buffer outbuf) | |
| 818 (let ((buffer-read-only nil)) | |
| 819 (goto-char (point-max)) | |
| 820 (unless (eobp) | |
| 821 (insert "\n")) | |
| 822 (insert "\n") | |
| 823 (insert-buffer-substring tmpbuf))))) | |
| 824 (kill-buffer tmpbuf))) | |
| 825 | |
| 826 (defun gnus-convert-article-to-rmail () | |
| 827 "Convert article in current buffer to Rmail message format." | |
| 828 (let ((buffer-read-only nil)) | |
| 829 ;; Convert article directly into Babyl format. | |
| 830 (goto-char (point-min)) | |
| 831 (insert "\^L\n0, unseen,,\n*** EOOH ***\n") | |
| 832 (while (search-forward "\n\^_" nil t) ;single char | |
| 833 (replace-match "\n^_" t t)) ;2 chars: "^" and "_" | |
| 834 (goto-char (point-max)) | |
| 835 (insert "\^_"))) | |
| 836 | |
|
24357
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
837 (defun gnus-map-function (funs arg) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
838 "Applies the result of the first function in FUNS to the second, and so on. |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
839 ARG is passed to the first function." |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
840 (let ((myfuns funs)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
841 (while myfuns |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
842 (setq arg (funcall (pop myfuns) arg))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
843 arg)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
844 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
845 (defun gnus-run-hooks (&rest funcs) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
846 "Does the same as `run-hooks', but saves excursion." |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
847 (let ((buf (current-buffer))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
848 (unwind-protect |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
849 (apply 'run-hooks funcs) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
850 (set-buffer buf)))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
851 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
852 ;;; |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
853 ;;; .netrc and .authinforc parsing |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
854 ;;; |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
855 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
856 (defvar gnus-netrc-syntax-table |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
857 (let ((table (copy-syntax-table text-mode-syntax-table))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
858 (modify-syntax-entry ?@ "w" table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
859 (modify-syntax-entry ?- "w" table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
860 (modify-syntax-entry ?_ "w" table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
861 (modify-syntax-entry ?! "w" table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
862 (modify-syntax-entry ?. "w" table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
863 (modify-syntax-entry ?, "w" table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
864 (modify-syntax-entry ?: "w" table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
865 (modify-syntax-entry ?\; "w" table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
866 (modify-syntax-entry ?% "w" table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
867 (modify-syntax-entry ?) "w" table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
868 (modify-syntax-entry ?( "w" table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
869 table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
870 "Syntax table when parsing .netrc files.") |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
871 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
872 (defun gnus-parse-netrc (file) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
873 "Parse FILE and return an list of all entries in the file." |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
874 (if (not (file-exists-p file)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
875 () |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
876 (save-excursion |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
877 (let ((tokens '("machine" "default" "login" |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
878 "password" "account" "macdef" "force")) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
879 alist elem result pair) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
880 (nnheader-set-temp-buffer " *netrc*") |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
881 (unwind-protect |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
882 (progn |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
883 (set-syntax-table gnus-netrc-syntax-table) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
884 (insert-file-contents file) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
885 (goto-char (point-min)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
886 ;; Go through the file, line by line. |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
887 (while (not (eobp)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
888 (narrow-to-region (point) (gnus-point-at-eol)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
889 ;; For each line, get the tokens and values. |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
890 (while (not (eobp)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
891 (skip-chars-forward "\t ") |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
892 (unless (eobp) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
893 (setq elem (buffer-substring |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
894 (point) (progn (forward-sexp 1) (point)))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
895 (cond |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
896 ((equal elem "macdef") |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
897 ;; We skip past the macro definition. |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
898 (widen) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
899 (while (and (zerop (forward-line 1)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
900 (looking-at "$"))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
901 (narrow-to-region (point) (point))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
902 ((member elem tokens) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
903 ;; Tokens that don't have a following value are ignored, |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
904 ;; except "default". |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
905 (when (and pair (or (cdr pair) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
906 (equal (car pair) "default"))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
907 (push pair alist)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
908 (setq pair (list elem))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
909 (t |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
910 ;; Values that haven't got a preceding token are ignored. |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
911 (when pair |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
912 (setcdr pair elem) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
913 (push pair alist) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
914 (setq pair nil)))))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
915 (if alist |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
916 (push (nreverse alist) result)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
917 (setq alist nil |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
918 pair nil) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
919 (widen) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
920 (forward-line 1)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
921 (nreverse result)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
922 (kill-buffer " *netrc*")))))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
923 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
924 (defun gnus-netrc-machine (list machine) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
925 "Return the netrc values from LIST for MACHINE or for the default entry." |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
926 (let ((rest list)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
927 (while (and list |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
928 (not (equal (cdr (assoc "machine" (car list))) machine))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
929 (pop list)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
930 (car (or list |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
931 (progn (while (and rest (not (assoc "default" (car rest)))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
932 (pop rest)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
933 rest))))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
934 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
935 (defun gnus-netrc-get (alist type) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
936 "Return the value of token TYPE from ALIST." |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
937 (cdr (assoc type alist))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
938 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
939 ;;; Various |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
940 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
941 (defvar gnus-group-buffer) ; Compiler directive |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
942 (defun gnus-alive-p () |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
943 "Say whether Gnus is running or not." |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
944 (and (boundp 'gnus-group-buffer) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
945 (get-buffer gnus-group-buffer) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
946 (save-excursion |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
947 (set-buffer gnus-group-buffer) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
948 (eq major-mode 'gnus-group-mode)))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
949 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
950 (defun gnus-remove-duplicates (list) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
951 (let (new (tail list)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
952 (while tail |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
953 (or (member (car tail) new) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
954 (setq new (cons (car tail) new))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
955 (setq tail (cdr tail))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
956 (nreverse new))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
957 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
958 (defun gnus-delete-if (predicate list) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
959 "Delete elements from LIST that satisfy PREDICATE." |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
960 (let (out) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
961 (while list |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
962 (unless (funcall predicate (car list)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
963 (push (car list) out)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
964 (pop list)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
965 (nreverse out))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
966 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
967 (defun gnus-delete-alist (key alist) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
968 "Delete all entries in ALIST that have a key eq to KEY." |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
969 (let (entry) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
970 (while (setq entry (assq key alist)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
971 (setq alist (delq entry alist))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
972 alist)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
973 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
974 (defmacro gnus-pull (key alist) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
975 "Modify ALIST to be without KEY." |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
976 (unless (symbolp alist) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
977 (error "Not a symbol: %s" alist)) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
978 `(setq ,alist (delq (assq ,key ,alist) ,alist))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
979 |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
980 (defun gnus-globalify-regexp (re) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
981 "Returns a regexp that matches a whole line, iff RE matches a part of it." |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
982 (concat (unless (string-match "^\\^" re) "^.*") |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
983 re |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
984 (unless (string-match "\\$$" re) ".*$"))) |
|
15fc6acbae7a
Upgrading to Gnus 5.7; see ChangeLog
Lars Magne Ingebrigtsen <larsi@gnus.org>
parents:
23319
diff
changeset
|
985 |
| 17493 | 986 (provide 'gnus-util) |
| 987 | |
| 988 ;;; gnus-util.el ends here |
