comparison lisp/gnus/message.el @ 2:ac2d302a0011 r19-15b2

Import from CVS: tag r19-15b2
author cvs
date Mon, 13 Aug 2007 08:46:35 +0200
parents 376386a54a3c
children 0293115a14e9
comparison
equal deleted inserted replaced
1:c0c6a60d29db 2:ac2d302a0011
38 (require 'easymenu) 38 (require 'easymenu)
39 (if (string-match "XEmacs\\|Lucid" emacs-version) 39 (if (string-match "XEmacs\\|Lucid" emacs-version)
40 (require 'mail-abbrevs) 40 (require 'mail-abbrevs)
41 (require 'mailabbrev)) 41 (require 'mailabbrev))
42 42
43 ;;;###autoload
44 (defvar message-directory "~/Mail/" 43 (defvar message-directory "~/Mail/"
45 "*Directory from which all other mail file variables are derived.") 44 "*Directory from which all other mail file variables are derived.")
46 45
47 (defvar message-max-buffers 10 46 (defvar message-max-buffers 10
48 "*How many buffers to keep before starting to kill them off.") 47 "*How many buffers to keep before starting to kill them off.")
162 161
163 ;;;###autoload 162 ;;;###autoload
164 (defvar message-user-organization-file "/usr/lib/news/organization" 163 (defvar message-user-organization-file "/usr/lib/news/organization"
165 "*Local news organization file.") 164 "*Local news organization file.")
166 165
167 ;;;###autoload 166 (defvar message-autosave-directory "~/"
168 (defvar message-autosave-directory 167 ; (concat (file-name-as-directory message-directory) "drafts/")
169 (concat (file-name-as-directory message-directory) "drafts/")
170 "*Directory where message autosaves buffers. 168 "*Directory where message autosaves buffers.
171 If nil, message won't autosave.") 169 If nil, message won't autosave.")
172 170
173 (defvar message-forward-start-separator 171 (defvar message-forward-start-separator
174 "------- Start of forwarded message -------\n" 172 "------- Start of forwarded message -------\n"
376 (let ((table (copy-syntax-table text-mode-syntax-table))) 374 (let ((table (copy-syntax-table text-mode-syntax-table)))
377 (modify-syntax-entry ?% ". " table) 375 (modify-syntax-entry ?% ". " table)
378 table) 376 table)
379 "Syntax table used while in Message mode.") 377 "Syntax table used while in Message mode.")
380 378
379 (defvar message-mode-abbrev-table text-mode-abbrev-table
380 "Abbrev table used in Message mode buffers.
381 Defaults to `text-mode-abbrev-table'.")
382
381 (defvar message-font-lock-keywords 383 (defvar message-font-lock-keywords
382 (let* ((cite-prefix "A-Za-z") (cite-suffix (concat cite-prefix "0-9_.@-"))) 384 (let* ((cite-prefix "A-Za-z") (cite-suffix (concat cite-prefix "0-9_.@-")))
383 (list '("^To:" . font-lock-function-name-face) 385 (list '("^To:" . font-lock-function-name-face)
384 '("^[GBF]?[Cc][Cc]:\\|^Reply-To:" . font-lock-keyword-face) 386 '("^[GBF]?[Cc][Cc]:\\|^Reply-To:" . font-lock-keyword-face)
385 '("^\\(Subject:\\)[ \t]*\\(.+\\)?" 387 '("^\\(Subject:\\)[ \t]*\\(.+\\)?"
515 (defun message-tokenize-header (header &optional separator) 517 (defun message-tokenize-header (header &optional separator)
516 "Split HEADER into a list of header elements. 518 "Split HEADER into a list of header elements.
517 \",\" is used as the separator." 519 \",\" is used as the separator."
518 (let ((regexp (format "[%s]+" (or separator ","))) 520 (let ((regexp (format "[%s]+" (or separator ",")))
519 (beg 1) 521 (beg 1)
522 (first t)
520 quoted elems) 523 quoted elems)
521 (save-excursion 524 (save-excursion
522 (message-set-work-buffer) 525 (message-set-work-buffer)
523 (insert header) 526 (insert header)
524 (goto-char (point-min)) 527 (goto-char (point-min))
525 (while (not (eobp)) 528 (while (not (eobp))
526 (forward-char 1) 529 (if first
530 (setq first nil)
531 (forward-char 1))
527 (cond ((and (> (point) beg) 532 (cond ((and (> (point) beg)
528 (or (eobp) 533 (or (eobp)
529 (and (looking-at regexp) 534 (and (looking-at regexp)
530 (not quoted)))) 535 (not quoted))))
531 (push (buffer-substring beg (point)) elems) 536 (push (buffer-substring beg (point)) elems)
787 (make-local-variable 'message-exit-actions) 792 (make-local-variable 'message-exit-actions)
788 (make-local-variable 'message-kill-actions) 793 (make-local-variable 'message-kill-actions)
789 (make-local-variable 'message-postpone-actions) 794 (make-local-variable 'message-postpone-actions)
790 (set-syntax-table message-mode-syntax-table) 795 (set-syntax-table message-mode-syntax-table)
791 (use-local-map message-mode-map) 796 (use-local-map message-mode-map)
792 (setq local-abbrev-table text-mode-abbrev-table) 797 (setq local-abbrev-table message-mode-abbrev-table)
793 (setq major-mode 'message-mode) 798 (setq major-mode 'message-mode)
794 (setq mode-name "Message") 799 (setq mode-name "Message")
795 (setq buffer-offer-save t) 800 (setq buffer-offer-save t)
796 (make-local-variable 'font-lock-defaults) 801 (make-local-variable 'font-lock-defaults)
797 (setq font-lock-defaults '(message-font-lock-keywords t)) 802 (setq font-lock-defaults '(message-font-lock-keywords t))
822 (make-local-variable 'message-post-method) 827 (make-local-variable 'message-post-method)
823 (make-local-variable 'message-sent-message-via) 828 (make-local-variable 'message-sent-message-via)
824 (setq message-sent-message-via nil) 829 (setq message-sent-message-via nil)
825 (make-local-variable 'message-checksum) 830 (make-local-variable 'message-checksum)
826 (setq message-checksum nil) 831 (setq message-checksum nil)
827 (when (fboundp 'mail-hist-define-keys) 832 ;;(when (fboundp 'mail-hist-define-keys)
828 (mail-hist-define-keys)) 833 ;; (mail-hist-define-keys))
829 (when (string-match "XEmacs\\|Lucid" emacs-version) 834 (when (string-match "XEmacs\\|Lucid" emacs-version)
830 (message-setup-toolbar)) 835 (message-setup-toolbar))
831 (easy-menu-add message-mode-menu message-mode-map) 836 (easy-menu-add message-mode-menu message-mode-map)
832 ;; Allow mail alias things. 837 ;; Allow mail alias things.
833 (if (fboundp 'mail-abbrevs-setup) 838 (if (fboundp 'mail-abbrevs-setup)
961 ((and (eq t signature) 966 ((and (eq t signature)
962 message-signature-file 967 message-signature-file
963 (file-exists-p message-signature-file)) 968 (file-exists-p message-signature-file))
964 signature)))) 969 signature))))
965 (when signature 970 (when signature
966 ; ;; Remove blank lines at the end of the message. 971 ;; Insert the signature.
967 (goto-char (point-max)) 972 (goto-char (point-max))
968 ; (skip-chars-backward " \t\n")
969 ; (delete-region (point) (point-max))
970 ;; Insert the signature.
971 (unless (bolp) 973 (unless (bolp)
972 (insert "\n")) 974 (insert "\n"))
973 (insert "\n-- \n") 975 (insert "\n-- \n")
974 (if (eq signature t) 976 (if (eq signature t)
975 (insert-file-contents message-signature-file) 977 (insert-file-contents message-signature-file)
1048 mail-to)) 1050 mail-to))
1049 (name-default (concat "*message* " mail-trimmed-to)) 1051 (name-default (concat "*message* " mail-trimmed-to))
1050 (name (if enter-string 1052 (name (if enter-string
1051 (read-string "New buffer name: " name-default) 1053 (read-string "New buffer name: " name-default)
1052 name-default))) 1054 name-default)))
1053 (rename-buffer name t))))) 1055 (rename-buffer name t)
1056 (setq buffer-auto-save-file-name
1057 (format "%s%s"
1058 (file-name-as-directory message-autosave-directory)
1059 (file-name-nondirectory buffer-auto-save-file-name)))))))
1054 1060
1055 (defun message-fill-yanked-message (&optional justifyp) 1061 (defun message-fill-yanked-message (&optional justifyp)
1056 "Fill the paragraphs of a message yanked into this one. 1062 "Fill the paragraphs of a message yanked into this one.
1057 Numeric argument means justify as well." 1063 Numeric argument means justify as well."
1058 (interactive "P") 1064 (interactive "P")
1092 (defun message-yank-original (&optional arg) 1098 (defun message-yank-original (&optional arg)
1093 "Insert the message being replied to, if any. 1099 "Insert the message being replied to, if any.
1094 Puts point before the text and mark after. 1100 Puts point before the text and mark after.
1095 Normally indents each nonblank line ARG spaces (default 3). However, 1101 Normally indents each nonblank line ARG spaces (default 3). However,
1096 if `message-yank-prefix' is non-nil, insert that prefix on each line. 1102 if `message-yank-prefix' is non-nil, insert that prefix on each line.
1103
1104 This function uses `message-cite-function' to do the actual citing.
1097 1105
1098 Just \\[universal-argument] as argument means don't indent, insert no 1106 Just \\[universal-argument] as argument means don't indent, insert no
1099 prefix, and don't delete any headers." 1107 prefix, and don't delete any headers."
1100 (interactive "P") 1108 (interactive "P")
1101 (let ((modified (buffer-modified-p))) 1109 (let ((modified (buffer-modified-p)))
1253 (and (or (not (memq 'mail message-sent-message-via)) 1261 (and (or (not (memq 'mail message-sent-message-via))
1254 (y-or-n-p 1262 (y-or-n-p
1255 "Already sent message via mail; resend? ")) 1263 "Already sent message via mail; resend? "))
1256 (message-send-mail arg)))) 1264 (message-send-mail arg))))
1257 (message-do-fcc) 1265 (message-do-fcc)
1258 (when (fboundp 'mail-hist-put-headers-into-history) 1266 ;;(when (fboundp 'mail-hist-put-headers-into-history)
1259 (mail-hist-put-headers-into-history)) 1267 ;; (mail-hist-put-headers-into-history))
1260 (run-hooks 'message-sent-hook) 1268 (run-hooks 'message-sent-hook)
1261 (message "Sending...done") 1269 (message "Sending...done")
1262 ;; If buffer has no file, mark it as unmodified and delete autosave. 1270 ;; If buffer has no file, mark it as unmodified and delete autosave.
1263 (unless buffer-file-name 1271 (unless buffer-file-name
1264 (set-buffer-modified-p nil) 1272 (set-buffer-modified-p nil)
1314 (run-hooks 'message-header-hook)) 1322 (run-hooks 'message-header-hook))
1315 (unwind-protect 1323 (unwind-protect
1316 (save-excursion 1324 (save-excursion
1317 (set-buffer tembuf) 1325 (set-buffer tembuf)
1318 (erase-buffer) 1326 (erase-buffer)
1319 (insert-buffer-substring mailbuf) 1327 ;; Avoid copying text props.
1328 (insert (format
1329 "%s" (save-excursion
1330 (set-buffer mailbuf)
1331 (buffer-string))))
1320 ;; Remove some headers. 1332 ;; Remove some headers.
1321 (save-restriction 1333 (save-restriction
1322 (message-narrow-to-headers) 1334 (message-narrow-to-headers)
1323 ;; Remove some headers. 1335 ;; Remove some headers.
1324 (message-remove-header message-ignored-mail-headers t)) 1336 (message-remove-header message-ignored-mail-headers t))
1411 (case-fold-search nil) 1423 (case-fold-search nil)
1412 (method (if (message-functionp message-post-method) 1424 (method (if (message-functionp message-post-method)
1413 (funcall message-post-method arg) 1425 (funcall message-post-method arg)
1414 message-post-method)) 1426 message-post-method))
1415 (messbuf (current-buffer)) 1427 (messbuf (current-buffer))
1428 (message-syntax-checks
1429 (if arg
1430 (cons '(existing-newsgroups . disabled)
1431 message-syntax-checks)
1432 message-syntax-checks))
1416 result) 1433 result)
1417 (save-restriction 1434 (save-restriction
1418 (message-narrow-to-headers) 1435 (message-narrow-to-headers)
1419 ;; Insert some headers. 1436 ;; Insert some headers.
1420 (message-generate-headers message-required-news-headers) 1437 (message-generate-headers message-required-news-headers)
1425 (unwind-protect 1442 (unwind-protect
1426 (save-excursion 1443 (save-excursion
1427 (set-buffer tembuf) 1444 (set-buffer tembuf)
1428 (buffer-disable-undo (current-buffer)) 1445 (buffer-disable-undo (current-buffer))
1429 (erase-buffer) 1446 (erase-buffer)
1430 (insert-buffer-substring messbuf) 1447 ;; Avoid copying text props.
1448 (insert (format
1449 "%s" (save-excursion
1450 (set-buffer messbuf)
1451 (buffer-string))))
1431 ;; Remove some headers. 1452 ;; Remove some headers.
1432 (save-restriction 1453 (save-restriction
1433 (message-narrow-to-headers) 1454 (message-narrow-to-headers)
1434 ;; Remove some headers. 1455 ;; Remove some headers.
1435 (message-remove-header message-ignored-news-headers t)) 1456 (message-remove-header message-ignored-news-headers t))
1524 (insert "Followup-To: " to "\n")) 1545 (insert "Followup-To: " to "\n"))
1525 t)) 1546 t))
1526 ;; Check "Shoot me". 1547 ;; Check "Shoot me".
1527 (or (message-check-element 'shoot) 1548 (or (message-check-element 'shoot)
1528 (save-excursion 1549 (save-excursion
1529 (if (search-forward 1550 (if (re-search-forward
1530 ".i-have-a-misconfigured-system-so-shoot-me" nil t) 1551 "Message-ID.*.i-have-a-misconfigured-system-so-shoot-me"
1552 nil t)
1531 (y-or-n-p 1553 (y-or-n-p
1532 "You appear to have a misconfigured system. Really post? ") 1554 "You appear to have a misconfigured system. Really post? ")
1533 t))) 1555 t)))
1534 ;; Check for Approved. 1556 ;; Check for Approved.
1535 (or (message-check-element 'approved) 1557 (or (message-check-element 'approved)
1661 (goto-char (point-min)) 1683 (goto-char (point-min))
1662 (re-search-forward 1684 (re-search-forward
1663 (concat "^" (regexp-quote mail-header-separator) "$")) 1685 (concat "^" (regexp-quote mail-header-separator) "$"))
1664 (forward-line 1) 1686 (forward-line 1)
1665 (let ((b (point))) 1687 (let ((b (point)))
1666 (or (re-search-forward message-signature-separator nil t) 1688 (goto-char (point-max))
1667 (goto-char (point-max))) 1689 (re-search-backward message-signature-separator nil t)
1668 (beginning-of-line) 1690 (beginning-of-line)
1669 (or (re-search-backward "[^ \n\t]" b t) 1691 (or (re-search-backward "[^ \n\t]" b t)
1670 (y-or-n-p "Empty article. Really post? "))))) 1692 (y-or-n-p "Empty article. Really post? ")))))
1671 ;; Check for control characters. 1693 ;; Check for control characters.
1672 (or (message-check-element 'control-chars) 1694 (or (message-check-element 'control-chars)
1692 ;; Check the length of the signature. 1714 ;; Check the length of the signature.
1693 (or 1715 (or
1694 (message-check-element 'signature) 1716 (message-check-element 'signature)
1695 (progn 1717 (progn
1696 (goto-char (point-max)) 1718 (goto-char (point-max))
1697 (if (or (not (re-search-backward "^-- $" nil t)) 1719 (if (or (not (re-search-backward message-signature-separator nil t))
1698 (search-forward message-forward-end-separator nil t)) 1720 (search-forward message-forward-end-separator nil t))
1699 t 1721 t
1700 (if (> (count-lines (point) (point-max)) 5) 1722 (if (> (count-lines (point) (point-max)) 5)
1701 (y-or-n-p 1723 (y-or-n-p
1702 (format 1724 (format
1757 (make-directory (file-name-directory file) t)) 1779 (make-directory (file-name-directory file) t))
1758 (if (and message-fcc-handler-function 1780 (if (and message-fcc-handler-function
1759 (not (eq message-fcc-handler-function 'rmail-output))) 1781 (not (eq message-fcc-handler-function 'rmail-output)))
1760 (funcall message-fcc-handler-function file) 1782 (funcall message-fcc-handler-function file)
1761 (if (and (file-readable-p file) (mail-file-babyl-p file)) 1783 (if (and (file-readable-p file) (mail-file-babyl-p file))
1762 (rmail-output file 1) 1784 (rmail-output file 1 nil t)
1763 (let ((mail-use-rfc822 t)) 1785 (let ((mail-use-rfc822 t))
1764 (rmail-output file 1 t t)))))) 1786 (rmail-output file 1 t t))))))
1765 (kill-buffer (current-buffer))))) 1787 (kill-buffer (current-buffer)))))
1766 1788
1767 (defun message-cleanup-headers () 1789 (defun message-cleanup-headers ()
2283 (defun message-do-send-housekeeping () 2305 (defun message-do-send-housekeeping ()
2284 "Kill old message buffers." 2306 "Kill old message buffers."
2285 ;; We might have sent this buffer already. Delete it from the 2307 ;; We might have sent this buffer already. Delete it from the
2286 ;; list of buffers. 2308 ;; list of buffers.
2287 (setq message-buffer-list (delq (current-buffer) message-buffer-list)) 2309 (setq message-buffer-list (delq (current-buffer) message-buffer-list))
2288 (when (and message-max-buffers 2310 (while (and message-max-buffers
2289 (>= (length message-buffer-list) message-max-buffers)) 2311 (>= (length message-buffer-list) message-max-buffers))
2290 ;; Kill the oldest buffer -- unless it has been changed. 2312 ;; Kill the oldest buffer -- unless it has been changed.
2291 (let ((buffer (pop message-buffer-list))) 2313 (let ((buffer (pop message-buffer-list)))
2292 (when (and (buffer-name buffer) 2314 (when (and (buffer-name buffer)
2293 (not (buffer-modified-p buffer))) 2315 (not (buffer-modified-p buffer)))
2294 (kill-buffer buffer)))) 2316 (kill-buffer buffer))))
2405 "Start editing a reply to the article in the current buffer." 2427 "Start editing a reply to the article in the current buffer."
2406 (interactive) 2428 (interactive)
2407 (let ((cur (current-buffer)) 2429 (let ((cur (current-buffer))
2408 from subject date reply-to to cc 2430 from subject date reply-to to cc
2409 references message-id follow-to 2431 references message-id follow-to
2432 (inhibit-point-motion-hooks t)
2410 mct never-mct gnus-warning) 2433 mct never-mct gnus-warning)
2411 (save-restriction 2434 (save-restriction
2412 (narrow-to-region 2435 (narrow-to-region
2413 (goto-char (point-min)) 2436 (goto-char (point-min))
2414 (if (search-forward "\n\n" nil t) 2437 (if (search-forward "\n\n" nil t)
2459 (let (ccalist) 2482 (let (ccalist)
2460 (save-excursion 2483 (save-excursion
2461 (message-set-work-buffer) 2484 (message-set-work-buffer)
2462 (unless never-mct 2485 (unless never-mct
2463 (insert (or reply-to from ""))) 2486 (insert (or reply-to from "")))
2464 (insert 2487 (insert (if (bolp) "" ", ") (or to ""))
2465 (if (bolp) "" ", ") (or to "") 2488 (insert (if mct (concat (if (bolp) "" ", ") mct) ""))
2466 (if mct (concat (if (bolp) "" ", ") mct) "") 2489 (insert (if cc (concat (if (bolp) "" ", ") cc) ""))
2467 (if cc (concat (if (bolp) "" ", ") cc) ""))
2468 ;; Remove addresses that match `rmail-dont-reply-to-names'. 2490 ;; Remove addresses that match `rmail-dont-reply-to-names'.
2469 (insert (prog1 (rmail-dont-reply-to (buffer-string)) 2491 (insert (prog1 (rmail-dont-reply-to (buffer-string))
2470 (erase-buffer))) 2492 (erase-buffer)))
2471 (goto-char (point-min)) 2493 (goto-char (point-min))
2472 (setq ccalist 2494 (setq ccalist
2473 (mapcar 2495 (mapcar
2474 (lambda (addr) 2496 (lambda (addr)
2475 (cons (mail-strip-quoted-names addr) addr)) 2497 (cons (mail-strip-quoted-names addr) addr))
2476 (nreverse (mail-parse-comma-list)))) 2498 (message-tokenize-header (buffer-string))))
2477 (let ((s ccalist)) 2499 (let ((s ccalist))
2478 (while s 2500 (while s
2479 (setq ccalist (delq (assoc (car (pop s)) s) ccalist))))) 2501 (setq ccalist (delq (assoc (car (pop s)) s) ccalist)))))
2480 (setq follow-to (list (cons 'To (cdr (pop ccalist))))) 2502 (setq follow-to (list (cons 'To (cdr (pop ccalist)))))
2481 (when ccalist 2503 (when ccalist
2482 (push (cons 'Cc 2504 (push (cons 'Cc
2483 (mapconcat (lambda (addr) (cdr addr)) ccalist ", ")) 2505 (mapconcat (lambda (addr) (cdr addr)) ccalist ", "))
2484 follow-to))))) 2506 follow-to)))))
2485 (widen)) 2507 (widen))
2486 2508
2487 (message-pop-to-buffer (message-buffer-name "reply" from)) 2509 (message-pop-to-buffer (message-buffer-name
2510 (if wide "wide reply" "reply") from
2511 (if wide to-address nil)))
2488 2512
2489 (setq message-reply-headers 2513 (setq message-reply-headers
2490 (vector 0 subject from date message-id references 0 0 "")) 2514 (vector 0 subject from date message-id references 0 0 ""))
2491 2515
2492 (message-setup 2516 (message-setup
2507 (defun message-followup () 2531 (defun message-followup ()
2508 (interactive) 2532 (interactive)
2509 (let ((cur (current-buffer)) 2533 (let ((cur (current-buffer))
2510 from subject date reply-to mct 2534 from subject date reply-to mct
2511 references message-id follow-to 2535 references message-id follow-to
2536 (inhibit-point-motion-hooks t)
2512 followup-to distribution newsgroups gnus-warning) 2537 followup-to distribution newsgroups gnus-warning)
2513 (save-restriction 2538 (save-restriction
2514 (narrow-to-region 2539 (narrow-to-region
2515 (goto-char (point-min)) 2540 (goto-char (point-min))
2516 (if (search-forward "\n\n" nil t) 2541 (if (search-forward "\n\n" nil t)
2900 (goto-char (min start end)) 2925 (goto-char (min start end))
2901 (while (re-search-forward "\b" end1 t) 2926 (while (re-search-forward "\b" end1 t)
2902 (if (eq (following-char) (char-after (- (point) 2))) 2927 (if (eq (following-char) (char-after (- (point) 2)))
2903 (delete-char -2)))))) 2928 (delete-char -2))))))
2904 2929
2905 (fset 'message-exchange-point-and-mark 'exchange-point-and-mark) 2930 (defalias 'message-exchange-point-and-mark 'exchange-point-and-mark)
2906 2931
2907 ;; Support for toolbar 2932 ;; Support for toolbar
2908 (when (string-match "XEmacs\\|Lucid" emacs-version) 2933 (when (string-match "XEmacs\\|Lucid" emacs-version)
2909 (require 'messagexmas)) 2934 (require 'messagexmas))
2910 2935
2957 (pop-to-buffer cur))))))) 2982 (pop-to-buffer cur)))))))
2958 2983
2959 ;;; Help stuff. 2984 ;;; Help stuff.
2960 2985
2961 (defmacro message-y-or-n-p (question show &rest text) 2986 (defmacro message-y-or-n-p (question show &rest text)
2962 "Ask QUESTION, displaying the rest of the arguments in a temporary buffer." 2987 "Ask QUESTION, displaying the rest of the arguments in a temp. buffer if SHOW"
2963 `(message-talkative-question 'y-or-n-p ,question ,show ,@text)) 2988 `(message-talkative-question 'y-or-n-p ,question ,show ,@text))
2964 2989
2965 (defun message-talkative-question (ask question show &rest text) 2990 (defun message-talkative-question (ask question show &rest text)
2966 "Call FUNCTION with argument QUESTION, displaying the rest of the arguments in a temporary buffer if SHOW. 2991 "Call FUNCTION with argument QUESTION, displaying the rest of the arguments in a temporary buffer if SHOW.
2967 The following arguments may contain lists of values." 2992 The following arguments may contain lists of values."