X-Git-Url: http://git.chise.org/gitweb/?a=blobdiff_plain;f=mu-cite.el;h=cc9db01b9b22942b08248e06f8d6685fa0566c4b;hb=af83c6b70a9a90a1c4238776872a9621e3d5b1db;hp=2e6168f793610f72922a5f314a20648b5c467981;hpb=fd5190d3455bdf6b89c910b933aede609f88f3ee;p=elisp%2Fmu-cite.git diff --git a/mu-cite.el b/mu-cite.el index 2e6168f..cc9db01 100644 --- a/mu-cite.el +++ b/mu-cite.el @@ -3,8 +3,7 @@ ;; Copyright (C) 1995,1996,1997,1998,1999 Free Software Foundation, Inc. ;; Author: MORIOKA Tomohiko -;; MINOURA Makoto -;; Shuhei KOBAYASHI +;; Shuhei KOBAYASHI ;; Maintainer: Katsumi Yamaoka ;; Keywords: mail, news, citation @@ -28,15 +27,15 @@ ;;; Commentary: ;; - How to use -;; 1. bytecompile this file and copy it to the apropriate directory. -;; 2. put the following lines to your ~/.emacs: -;; for EMACS 19 or later and XEmacs +;; 1. Bytecompile this file and copy it to the apropriate directory. +;; 2. Put the following lines in your ~/.emacs file: +;; For EMACS 19 or later and XEmacs ;; (autoload 'mu-cite-original "mu-cite" nil t) ;; ;; for all but message-mode ;; (add-hook 'mail-citation-hook (function mu-cite-original)) ;; ;; for message-mode only ;; (setq message-cite-function (function mu-cite-original)) -;; for EMACS 18 +;; For EMACS 18 ;; ;; for all but mh-e ;; (add-hook 'mail-yank-hooks (function mu-cite-original)) ;; ;; for mh-e only @@ -44,114 +43,47 @@ ;;; Code: -(eval-when-compile (require 'cl)) - ;; Pickup some macros, e.g. `with-temp-buffer', for old Emacsen. (require 'poe) -;; Pickup `char-category' for XEmacs. -(require 'emu) - -(require 'custom) +(require 'pcustom) (require 'std11) (require 'alist) +(autoload 'mu-cite-get-prefix-method "mu-register") +(autoload 'mu-cite-get-prefix-register-method "mu-register") +(autoload 'mu-cite-get-prefix-register-verbose-method "mu-register") + +(autoload 'mu-bbdb-get-prefix-method "mu-bbdb") +(autoload 'mu-bbdb-get-prefix-register-method "mu-bbdb") +(autoload 'mu-bbdb-get-prefix-register-verbose-method "mu-bbdb") + ;;; @ version ;;; -(defconst mu-cite-version "8.0") +(defconst mu-cite-version "8.1") -;;; @ obsoletes +;;; @ macro ;;; -;; This part will be abolished in the future. - -;; variables -(eval-when-compile (require 'static)) - -(defvar mu-cite/registration-file) -(defvar mu-cite-registration-file) -(defmacro mu-cite-registration-file () - (if (fboundp 'defvaralias) - 'mu-cite-registration-file - '(if (and (not noninteractive) - (boundp 'mu-cite/registration-file)) - (prog1 - (if (yes-or-no-p - (format "Obsolete variable `%s' found, use anyway? " - 'mu-cite/registration-file)) - (symbol-value 'mu-cite/registration-file) - mu-cite-registration-file) - (message "You should use `%s' instead of `%s'." - 'mu-cite-registration-file 'mu-cite/registration-file) - (sleep-for 1)) - mu-cite-registration-file))) - -(eval-and-compile - (defconst mu-cite-obsolete-variable-alist - '((mu-cite/allow-null-string-registration - mu-cite-allow-null-string-registration) - (mu-cite/citation-name-alist mu-cite-citation-name-alist) - (mu-cite/cited-prefix-regexp mu-cite-cited-prefix-regexp) - (mu-cite/default-methods-alist mu-cite-default-methods-alist) - (mu-cite/instantiation-hook mu-cite-instantiation-hook) - (mu-cite/minibuffer-history mu-cite-minibuffer-history) - (mu-cite/ml-count-field-list mu-cite-ml-count-field-list) - (mu-cite/post-cite-hook mu-cite-post-cite-hook) - (mu-cite/pre-cite-hook mu-cite-pre-cite-hook) - (mu-cite/prefix-format mu-cite-prefix-format) - (mu-cite/registration-file mu-cite-registration-file) - (mu-cite/top-format mu-cite-top-format))) - - (mapcar - (function - (lambda (elem) - (apply (function make-obsolete-variable) elem) - (when (and (not noninteractive) - (boundp (car elem))) - (apply (function message) - "WARNING: `%s' is an obsolete variable, use `%s' instead." - elem)) - (static-if (fboundp 'defvaralias) ; It may exists in XEmacs. - (apply (function defvaralias) elem) - (when (boundp (car elem)) - (eval (list 'defvar (cadr elem) (car elem))))))) - mu-cite-obsolete-variable-alist) - ) - -;; functions -(eval-and-compile - (defconst mu-cite-obsolete-function-alist - '((mu-cite/add-citation-name mu-cite-add-citation-name) - (mu-cite/cite-original mu-cite-original) - (mu-cite/eval-format mu-cite-eval-format) - (mu-cite/get-citation-name mu-cite-get-citation-name) - (mu-cite/get-field-value mu-cite-get-field-value) - (mu-cite/get-ml-count-method mu-cite-get-ml-count-method) - (mu-cite/get-prefix-method mu-cite-get-prefix-method) - (mu-cite/get-prefix-register-method - mu-cite-get-prefix-register-method) - (mu-cite/get-prefix-register-verbose-method - mu-cite-get-prefix-register-verbose-method) - (mu-cite/get-value mu-cite-get-value) - (mu-cite/load-registration-file mu-cite-load-registration-file) - (mu-cite/make-methods mu-cite-make-methods) - (mu-cite/save-registration-file mu-cite-save-registration-file))) - - (mapcar - (function (lambda (elem) - (apply (function define-obsolete-function-alias) elem))) - mu-cite-obsolete-function-alist) - ) +(defmacro mu-cite-remove-text-properties (string) + "Remove text properties from STRING which is read from minibuffer." + (if (or (featurep 'xemacs) + (boundp 'minibuffer-allow-text-properties);; Emacs 20.1 or later. + (not (fboundp 'set-text-properties)));; under Emacs 19.7. + string + (` (let ((obj (copy-sequence (, string)))) + (set-text-properties 0 (length obj) nil obj) + obj)))) ;;; @ set up ;;; (defgroup mu-cite nil - "yet another citation tool for GNU Emacs." + "Yet another citation tool for GNU Emacs." :prefix "mu-cite-" :group 'mail :group 'news) @@ -196,12 +128,13 @@ (cons 'id (function (lambda () - (let ((ml-name (mu-cite-get-value 'ml-name))) + (let ((ml-name (mu-cite-get-value 'ml-name)) + (ml-count (mu-cite-get-value 'ml-count))) (if ml-name (concat "[" ml-name - " : No." - (mu-cite-get-value 'ml-count) + (if ml-count + (concat " : No." ml-count)) "]") (mu-cite-get-value 'message-id)))))) (cons 'in-id @@ -211,15 +144,23 @@ (if id (format ">>>>> In %s \n" id) ""))))) + (cons 'x-attribution + (function + (lambda () + (mu-cite-get-field-value "X-Attribution")))) + ;; mu-register (cons 'prefix (function mu-cite-get-prefix-method)) (cons 'prefix-register (function mu-cite-get-prefix-register-method)) (cons 'prefix-register-verbose (function mu-cite-get-prefix-register-verbose-method)) - (cons 'x-attribution - (function - (lambda () - (mu-cite-get-field-value "X-Attribution")))) + ;; mu-bbdb + (cons 'bbdb-prefix + (function mu-bbdb-get-prefix-method)) + (cons 'bbdb-prefix-register + (function mu-bbdb-get-prefix-register-method)) + (cons 'bbdb-prefix-register-verbose + (function mu-bbdb-get-prefix-register-verbose-method)) )) @@ -235,46 +176,60 @@ If match, mu-cite doesn't insert citation prefix." (defcustom mu-cite-prefix-format '(prefix-register-verbose "> ") "List to represent citation prefix. -Each elements must be string or method name." - :type (list 'repeat - (nconc '(choice :tag "String or Method name") - (mapcar - (function - (lambda (elem) (list 'choice-item (car elem)))) - mu-cite-default-methods-alist) - '((symbol :tag "Other Method") - (item "-") - (choice-item :tag "String: \"> \"" "> ") - (string :tag "Other String")))) +Each elements must be a string or a method name." + :type (list + 'repeat + (list + 'group + :convert-widget + (function + (lambda (widget) + (list + 'choice + :tag "Method or String" + :args + (nconc + (mapcar + (function (lambda (elem) (list 'choice-item (car elem)))) + mu-cite-default-methods-alist) + '((symbol :tag "Method") + (const :tag "-" nil) + (choice-item :tag "String: \"> \"" "> ") + (string)))))))) + :set (function (lambda (symbol value) + (set-default symbol (delq nil value)))) :group 'mu-cite) (defcustom mu-cite-top-format '(in-id ">>>>>\t" from " wrote:\n") "List to represent top string of citation. -Each elements must be string or method name." - :type (list 'repeat - (nconc - '(choice :tag "String or Method name") - (mapcar - (function - (lambda (elem) (list 'choice-item (car elem)))) - mu-cite-default-methods-alist) - '((symbol :tag "Other Method") - (item "-") - (choice-item :tag "String: \">>>>>\\t\"" ">>>>>\t") - (choice-item :tag "String: \" wrote:\\n\"" " wrote:\n") - (string :tag "Other String")))) +Each elements must be a string or a method name." + :type (list + 'repeat + (list + 'group + :convert-widget + (function + (lambda (widget) + (list 'choice + :tag "Method or String" + :args + (nconc + (mapcar + (function (lambda (elem) (list 'choice-item (car elem)))) + mu-cite-default-methods-alist) + '((symbol :tag "Method") + (const :tag "-" nil) + (choice-item :tag "String: \">>>>>\\t\"" ">>>>>\t") + (choice-item :tag "String: \" wrote:\\n\"" " wrote:\n") + (string :tag "String")))))))) + :set (function (lambda (symbol value) + (set-default symbol (delq nil value)))) :group 'mu-cite) ;;; @ hooks ;;; -(defcustom mu-cite-load-hook nil - "List of functions called after mu-cite is loaded. -Use this hook to add your own methods to `mu-cite-default-methods-alist'." - :type 'hook - :group 'mu-cite) - (defcustom mu-cite-instantiation-hook nil "List of functions called just before narrowing to the message." :type 'hook @@ -298,128 +253,13 @@ Use this hook to add your own methods to `mu-cite-default-methods-alist'." "Alist major-mode vs. function to get field-body of header.") (defun mu-cite-get-field-value (name) + "Return the value of the header field NAME. +If the field is not found in the header, a method function which is +registered in variable `mu-cite-get-field-value-method-alist' is called." (or (std11-field-body name) (let ((method (assq major-mode mu-cite-get-field-value-method-alist))) - (when method - (funcall (cdr method) name))))) - - -;;; @ prefix registration -;;; - -(defcustom mu-cite-registration-file (expand-file-name "~/.mu-cite.el") - "The name of the user environment file for mu-cite." - :type 'file - :group 'mu-cite) - -(defcustom mu-cite-allow-null-string-registration nil - "If non-nil, null-string citation-name is registered." - :type 'boolean - :group 'mu-cite) - -(defcustom mu-cite-registration-file-coding-system-for-read nil - "Coding system for reading registration file." - :group 'mu-cite) - -(defcustom mu-cite-registration-file-coding-system-for-write nil - "Coding system for writing registration file." - :group 'mu-cite) - -(defcustom mu-cite-registration-file-modes 384 - "Mode bits of `mu-cite-registration-file', as an integer." - :type 'integer - :group 'mu-cite) - -(defvar mu-cite-registration-symbol 'mu-cite-citation-name-alist) - -(defvar mu-cite-citation-name-alist nil) -(unless (eq 'mu-cite-citation-name-alist mu-cite-registration-symbol) - (setq mu-cite-citation-name-alist - (symbol-value mu-cite-registration-symbol))) -(defvar mu-cite-minibuffer-history nil) - -;; get citation-name from the database -(defun mu-cite-get-citation-name (from) - (cdr (assoc from mu-cite-citation-name-alist))) - -;; register citation-name to the database -(defun mu-cite-add-citation-name (name from) - (setq mu-cite-citation-name-alist - (put-alist from name mu-cite-citation-name-alist)) - (mu-cite-save-registration-file)) - -;; load/save registration file -;;(defun mu-cite-load-registration-file () -;; (let ((file mu-cite-registration-file)) -;; (when (and file -;; (file-readable-p file)) -;; (let ((alist -;; (with-temp-buffer -;; (eval -;; (` (let ((, mu-cite-registration-symbol)) -;; (if mu-cite-registration-file-coding-system-for-read -;; (insert-file-contents-as-coding-system -;; mu-cite-registration-file-coding-system-for-read -;; file) -;; (insert-file-contents file)) -;; (condition-case nil -;; (progn -;; (eval-current-buffer) -;; (, mu-cite-registration-symbol)) -;; (error nil)))))))) -;; (when alist -;; (setq mu-cite-citation-name-alist alist)))))) -(defun mu-cite-load-registration-file () - (let ((file (mu-cite-registration-file))) - (when (and file - (file-readable-p file)) - (let ((alist - (with-temp-buffer - (eval - (` (let ((, mu-cite-registration-symbol) - mu-cite/citation-name-alist) - (if mu-cite-registration-file-coding-system-for-read - (insert-file-contents-as-coding-system - mu-cite-registration-file-coding-system-for-read - file) - (insert-file-contents file)) - (condition-case nil - (progn - (eval-current-buffer) - (or mu-cite/citation-name-alist - (, mu-cite-registration-symbol))) - (error nil)))))))) - (when alist - (setq mu-cite-citation-name-alist alist)))))) -(add-hook 'mu-cite-load-hook (function mu-cite-load-registration-file)) - -(defun mu-cite-save-registration-file () - ;;(let ((file mu-cite-registration-file)) - (let ((file (mu-cite-registration-file))) - (when file - (with-temp-buffer - (setq buffer-file-name file) - (insert ";;; " (file-name-nondirectory file) "\n") - (insert ";;; This file is generated automatically by mu-cite " - mu-cite-version "\n\n") - (insert "(setq " - (symbol-name mu-cite-registration-symbol) - "\n '(") - (insert (mapconcat - (function prin1-to-string) - mu-cite-citation-name-alist "\n ")) - (insert "\n ))\n\n") - (insert ";;; " - (file-name-nondirectory file) - " ends here.\n") - (write-region 1 1 file nil 'nomsg) - (condition-case nil - (set-file-modes file mu-cite-registration-file-modes) - (error nil)) - (if mu-cite-registration-file-coding-system-for-write - (save-buffer-as-coding-system - mu-cite-registration-file-coding-system-for-write) - (save-buffer)))))) + (if method + (funcall (cdr method) name))))) ;;; @ item methods @@ -430,66 +270,38 @@ Use this hook to add your own methods to `mu-cite-default-methods-alist'." (defcustom mu-cite-ml-count-field-list '("X-Ml-Count" "X-Mail-Count" "X-Seqno" "X-Sequence" "Mailinglist-Id") - "List of header fields which contain sequence number of mailing list." - :type '(repeat (choice (choice-item "X-Ml-Count") + "List of header fields which contains a sequence number of the mailing list." + :type '(repeat (choice :tag "Field Name" + (choice-item "X-Ml-Count") (choice-item "X-Mail-Count") (choice-item "X-Seqno") (choice-item "X-Sequence") (choice-item "Mailinglist-Id") - (item "-") + (const :tag "-" nil) (string :tag "Other"))) + :set (function (lambda (symbol value) + (set-default symbol (delq nil value)))) :group 'mu-cite) (defun mu-cite-get-ml-count-method () + "A mu-cite method to return a ML-count. +This function searches a field about ML-count, which is specified by +the variable `mu-cite-ml-count-field-list', in a header. +If the field is found, the function returns a number part of the +field. + +Notice that please use (mu-cite-get-value 'ml-count) +instead of to call the function directly." (let ((field-list mu-cite-ml-count-field-list)) (catch 'tag (while field-list (let* ((field (car field-list)) (ml-count (mu-cite-get-field-value field))) - (when (and ml-count (string-match "[0-9]+" ml-count)) - (throw 'tag - (substring ml-count - (match-beginning 0)(match-end 0)))) + (if (and ml-count (string-match "[0-9]+" ml-count)) + (throw 'tag (match-string 0 ml-count))) (setq field-list (cdr field-list))))))) -;;; @@ prefix and registration -;;; - -(defun mu-cite-get-prefix-method () - (or (mu-cite-get-citation-name (mu-cite-get-value 'address)) - ">")) - -(defun mu-cite-get-prefix-register-method () - (let ((addr (mu-cite-get-value 'address))) - (or (mu-cite-get-citation-name addr) - (let ((return - (read-string "Citation name? " - (or (mu-cite-get-value 'x-attribution) - (mu-cite-get-value 'full-name)) - 'mu-cite-minibuffer-history))) - (when (and (or mu-cite-allow-null-string-registration - (not (string-equal return ""))) - (y-or-n-p (format "Register \"%s\"? " return))) - (mu-cite-add-citation-name return addr)) - return)))) - -(defun mu-cite-get-prefix-register-verbose-method () - (let* ((addr (mu-cite-get-value 'address)) - (return1 (mu-cite-get-citation-name addr)) - (return (read-string "Citation name? " - (or return1 - (mu-cite-get-value 'x-attribution) - (mu-cite-get-value 'full-name)) - 'mu-cite-minibuffer-history))) - (when (and (or mu-cite-allow-null-string-registration - (not (string-equal return ""))) - (not (string-equal return return1)) - (y-or-n-p (format "Register \"%s\"? " return))) - (mu-cite-add-citation-name return addr)) - return)) - - ;;; @ fundamentals ;;; @@ -501,6 +313,7 @@ Use this hook to add your own methods to `mu-cite-default-methods-alist'." (run-hooks 'mu-cite-instantiation-hook)) (defun mu-cite-get-value (item) + "Return a current value of ITEM." (let ((ret (cdr (assoc item mu-cite-methods-alist)))) (if (functionp ret) (prog1 @@ -527,22 +340,22 @@ function according to the agreed upon standard." (interactive) (mu-cite-make-methods) (save-restriction - (when (< (mark t) (point)) - (exchange-point-and-mark)) + (if (< (mark t) (point)) + (exchange-point-and-mark)) (narrow-to-region (point)(point-max)) (run-hooks 'mu-cite-pre-cite-hook) (let ((last-point (point)) (top (mu-cite-eval-format mu-cite-top-format)) (prefix (mu-cite-eval-format mu-cite-prefix-format))) - (when (re-search-forward "^-*$" nil nil) - (forward-line 1)) + (if (re-search-forward "^-*$" nil nil) + (forward-line 1)) (widen) (delete-region last-point (point)) (insert top) (setq last-point (point)) (while (< (point)(mark t)) - (unless (looking-at mu-cite-cited-prefix-regexp) - (insert prefix)) + (or (looking-at mu-cite-cited-prefix-regexp) + (insert prefix)) (forward-line 1)) (goto-char last-point)) (run-hooks 'mu-cite-post-cite-hook))) @@ -561,25 +374,51 @@ function according to the agreed upon standard." :type 'string :group 'mu-cite) +(defun-maybe-cond char-category (character) + "Return a string of category mnemonics for CHAR in TABLE. +CHAR can be any multilingual character, +TABLE defaults to the current buffer's category table." + ((and (subr-fboundp 'char-category-set) + (subr-fboundp 'category-set-mnemonics)) + (category-set-mnemonics (char-category-set character)) + ) + ((fboundp 'char-category-list) + (mapconcat (lambda (chr) + (char-to-string (int-char chr))) + (char-category-list character) + "") + ) + ((boundp 'NEMACS) + (if (< (char-int character) 128) + "al" + "j") + ) + (t + (if (< (char-int character) 128) + "al" + "l") + )) + (defun detect-paragraph-cited-prefix () (save-excursion (goto-char (point-min)) (let ((i 0) (prefix - (buffer-substring - (progn (beginning-of-line)(point)) - (progn (end-of-line)(point)))) - str ret) - (while (and (= (forward-line) 0) - (setq str (buffer-substring - (progn (beginning-of-line)(point)) - (progn (end-of-line)(point)))) - (setq ret (string-compare-from-top prefix str))) - (setq prefix - (if (stringp ret) - ret - (cadr ret))) - (incf i)) + (buffer-substring (line-beginning-position) + (line-end-position)))) + (let ((init prefix) + str ret) + (while (and (= (forward-line) 0) + (setq str (buffer-substring + (progn (beginning-of-line)(point)) + (progn (end-of-line)(point)))) + (setq ret (string-compare-from-top prefix str))) + (setq prefix + (if (stringp ret) + ret + (car (cdr ret)))) + (or (string-equal init prefix) + (setq i (1+ i))))) (cond ((> i 1) prefix) ((> i 0) (goto-char (point-min)) @@ -591,8 +430,8 @@ function according to the agreed upon standard." (concat "[" citation-mark-chars "]") nil t) (progn (goto-char (match-end 0)) - (when (looking-at "[ \t]+") - (goto-char (match-end 0))) + (if (looking-at "[ \t]+") + (goto-char (match-end 0))) (buffer-substring (point-min)(point))) prefix))) ((progn @@ -602,12 +441,14 @@ function according to the agreed upon standard." (re-search-backward (concat "[" citation-mark-chars "]") nil t)) (goto-char (match-end 0)) - (when (looking-at "[ \t]+") - (goto-char (match-end 0))) - (buffer-substring (point-min)(point))) + (if (looking-at "[ \t]+") + (goto-char (match-end 0))) + (buffer-substring (line-beginning-position)(point))) (t ""))))) +;;;###autoload (defun fill-cited-region (beg end) + "Fill each of the paragraphs in the region as a cited text." (interactive "*r") (save-excursion (save-restriction @@ -616,22 +457,28 @@ function according to the agreed upon standard." (setq end (match-end 0))) (narrow-to-region beg end) (let* ((fill-prefix (detect-paragraph-cited-prefix)) - (pat (concat fill-prefix "\n"))) + (fill-column (max (+ 1 (current-left-margin) + (string-width fill-prefix)) + (current-fill-column))) + (pat (concat fill-prefix "\n")) + filladapt-mode) (goto-char (point-min)) (while (search-forward pat nil t) (let ((b (match-beginning 0)) (e (match-end 0))) (delete-region b e) - (when (and (> b (point-min)) - (let ((cat (char-category - (char-before b)))) - (or (string-match "a" cat) - (string-match "l" cat)))) - (insert " ")))) + (if (and (> b (point-min)) + (let ((cat (char-category + (char-before b)))) + (or (string-match "a" cat) + (string-match "l" cat)))) + (insert " ")))) (goto-char (point-min)) (fill-region (point-min) (point-max)))))) +;;;###autoload (defun compress-cited-prefix () + "Compress nested cited prefixes." (interactive) (save-excursion (goto-char (point-min)) @@ -645,8 +492,9 @@ function according to the agreed upon standard." (prefix (buffer-substring b e)) ps pe (s 0) (nest (let ((i 0)) - (when (string-match "<[^<>]+>" prefix) - (setq prefix (substring prefix 0 (match-beginning 0)))) + (if (string-match "<[^<>]+>" prefix) + (setq prefix + (substring prefix 0 (match-beginning 0)))) (while (string-match (concat "\\([" citation-mark-chars "]+\\)[ \t]*") prefix s) @@ -655,9 +503,11 @@ function according to the agreed upon standard." pe (match-beginning 1) s (match-end 0))) i))) - (when (and ps (< ps pe)) - (delete-region b e) - (insert (concat (substring prefix ps pe) (make-string nest ?>)))) + (if (and ps (< ps pe)) + (progn + (delete-region b e) + (insert (concat (substring prefix ps pe) + (make-string nest ?>))))) )))) (defun replace-top-string (old new) @@ -674,10 +524,10 @@ function according to the agreed upon standard." c1 c2) (while (and (< p len) (progn - (setq c1 (aref str1 p) - c2 (aref str2 p)) + (setq c1 (sref str1 p) + c2 (sref str2 p)) (eq c1 c2))) - (setq p (+ p (char-length c1)))) + (setq p (char-next-index c1 p))) (and (> p 0) (let ((matched (substring str1 0 p)) (r1 (and (< p len1)(substring str1 p))) @@ -687,19 +537,6 @@ function according to the agreed upon standard." (list 'seq matched (list 'or r1 r2))))))) -;;; @ obsoletes -;;; - -;; This part will be abolished in the future. - -(static-unless (fboundp 'defvaralias) - (mapcar - (function - (lambda (elem) - (eval (list 'defvar (car elem) (cadr elem))))) - mu-cite-obsolete-variable-alist)) - - ;;; @ end ;;;