1 |
;;; mh-e.el --- GNU Emacs interface to the MH mail system |
;;; mh-e.el --- GNU Emacs interface to the MH mail system |
2 |
|
|
3 |
;; Copyright (C) 1985,86,87,88,90,92,93,94,95,97,2000,2001,2002 Free Software Foundation, Inc. |
;; Copyright (C) 1985, 86, 87, 88, 90, 92, 93, 94, 95, 97, 1999, |
4 |
|
;; 2000, 01, 02, 2003 Free Software Foundation, Inc. |
5 |
|
|
6 |
;; Author: Bill Wohler <wohler@newt.com> |
;; Author: Bill Wohler <wohler@newt.com> |
7 |
;; Maintainer: Bill Wohler <wohler@newt.com> |
;; Maintainer: Bill Wohler <wohler@newt.com> |
8 |
;; Version: 7.2 |
;; Version: 7.3 |
9 |
;; Keywords: mail |
;; Keywords: mail |
10 |
|
|
11 |
;; This file is part of GNU Emacs. |
;; This file is part of GNU Emacs. |
80 |
;; Maintenance picked up by Bill Wohler <wohler@newt.com> and the |
;; Maintenance picked up by Bill Wohler <wohler@newt.com> and the |
81 |
;; SourceForge Crew <http://mh-e.sourceforge.net/>. 2001. |
;; SourceForge Crew <http://mh-e.sourceforge.net/>. 2001. |
82 |
|
|
|
;; $Id$ |
|
|
|
|
83 |
;;; Code: |
;;; Code: |
84 |
|
|
85 |
(require 'cl) |
(require 'cl) |
91 |
(> 50 recursive-load-depth-limit)) |
(> 50 recursive-load-depth-limit)) |
92 |
(setq recursive-load-depth-limit 50))) |
(setq recursive-load-depth-limit 50))) |
93 |
|
|
94 |
|
(require 'mh-inc) |
95 |
(require 'mh-utils) |
(require 'mh-utils) |
96 |
(require 'gnus-util) |
(require 'gnus-util) |
97 |
(require 'easymenu) |
(require 'easymenu) |
102 |
(defvar font-lock-auto-fontify) |
(defvar font-lock-auto-fontify) |
103 |
(defvar font-lock-defaults) |
(defvar font-lock-defaults) |
104 |
|
|
105 |
(defconst mh-version "7.2" "Version number of MH-E.") |
(defconst mh-version "7.3" "Version number of MH-E.") |
106 |
|
|
107 |
;;; Autoloads |
;;; Autoloads |
108 |
(autoload 'Info-goto-node "info") |
(autoload 'Info-goto-node "info") |
413 |
(cond |
(cond |
414 |
((not mh-folder-unseen-seq-cache) |
((not mh-folder-unseen-seq-cache) |
415 |
nil) |
nil) |
416 |
((not cur-msg) ;Presumably at end of buffer |
((>= (point) limit) ;Presumably at end of buffer |
417 |
(setq mh-folder-unseen-seq-cache nil) |
(setq mh-folder-unseen-seq-cache nil) |
418 |
nil) |
nil) |
419 |
((member cur-msg mh-folder-unseen-seq-cache) |
((member cur-msg mh-folder-unseen-seq-cache) |
432 |
;; Examine how we must have exited the loop... |
;; Examine how we must have exited the loop... |
433 |
(let ((cur-msg (mh-get-msg-num nil))) |
(let ((cur-msg (mh-get-msg-num nil))) |
434 |
(cond |
(cond |
435 |
((or (not cur-msg) |
((or (<= limit (point)) |
|
(<= limit (point)) |
|
436 |
(not (member cur-msg mh-folder-unseen-seq-cache))) |
(not (member cur-msg mh-folder-unseen-seq-cache))) |
437 |
(setq mh-folder-unseen-seq-cache nil) |
(setq mh-folder-unseen-seq-cache nil) |
438 |
nil) |
nil) |
467 |
(defvar mh-narrowed-to-seq nil) ;Sequence display is narrowed to or |
(defvar mh-narrowed-to-seq nil) ;Sequence display is narrowed to or |
468 |
;nil if not narrowed. |
;nil if not narrowed. |
469 |
|
|
470 |
|
(defvar mh-tick-seq-changed-when-narrowed-flag nil) |
471 |
|
;Has tick sequence changed while the |
472 |
|
;folder was narrowed to it? |
473 |
|
|
474 |
(defvar mh-view-ops ()) ;Stack of ops that change the folder |
(defvar mh-view-ops ()) ;Stack of ops that change the folder |
475 |
;view (such as narrowing or threading). |
;view (such as narrowing or threading). |
476 |
|
|
538 |
|
|
539 |
(defun mh-delete-msg (msg-or-seq) |
(defun mh-delete-msg (msg-or-seq) |
540 |
"Mark the specified MSG-OR-SEQ for subsequent deletion and move to the next. |
"Mark the specified MSG-OR-SEQ for subsequent deletion and move to the next. |
541 |
|
Default is the displayed message. |
542 |
Default is the displayed message. If optional prefix argument is given then |
If optional prefix argument is provided, then prompt for the message sequence. |
543 |
prompt for the message sequence. If variable `transient-mark-mode' is non-nil |
If variable `transient-mark-mode' is non-nil and the mark is active, then the |
544 |
and the mark is active, then the selected region is marked for deletion." |
selected region is marked for deletion. |
545 |
(interactive (list (cond |
In a program, MSG-OR-SEQ can be a message number, a list of message numbers, a |
546 |
((mh-mark-active-p t) |
region in a cons cell, or a sequence." |
547 |
(cons (region-beginning) (region-end))) |
(interactive (list (mh-interactive-msg-or-seq "Delete"))) |
|
(current-prefix-arg |
|
|
(mh-read-seq-default "Delete" t)) |
|
|
(t |
|
|
(cons (line-beginning-position) (line-end-position)))))) |
|
548 |
(mh-delete-msg-no-motion msg-or-seq) |
(mh-delete-msg-no-motion msg-or-seq) |
549 |
(mh-next-msg)) |
(mh-next-msg)) |
550 |
|
|
551 |
(defun mh-delete-msg-no-motion (msg-or-seq) |
(defun mh-delete-msg-no-motion (msg-or-seq) |
552 |
"Mark the specified MSG-OR-SEQ for subsequent deletion. |
"Mark the specified MSG-OR-SEQ for subsequent deletion. |
553 |
Default is the displayed message. If optional prefix argument is provided, |
Default is the displayed message. |
554 |
then prompt for the message sequence." |
If optional prefix argument is provided, then prompt for the message sequence. |
555 |
(interactive (list (if current-prefix-arg |
If variable `transient-mark-mode' is non-nil and the mark is active, then the |
556 |
(mh-read-seq-default "Delete" t) |
selected region is marked for deletion. |
557 |
(mh-get-msg-num t)))) |
In a program, MSG-OR-SEQ can be a message number, a list of message numbers, a |
558 |
(cond ((numberp msg-or-seq) |
region in a cons cell, or a sequence." |
559 |
(mh-delete-a-msg msg-or-seq)) |
(interactive (list (mh-interactive-msg-or-seq "Delete"))) |
560 |
((and (consp msg-or-seq) |
(mh-iterate-on-msg-or-seq () msg-or-seq |
561 |
(numberp (car msg-or-seq)) (numberp (cdr msg-or-seq))) |
(mh-delete-a-msg nil))) |
|
(mh-iterate-on-messages-in-region () (car msg-or-seq) (cdr msg-or-seq) |
|
|
(mh-delete-a-msg nil))) |
|
|
(t (mh-map-to-seq-msgs 'mh-delete-a-msg msg-or-seq)))) |
|
562 |
|
|
563 |
(defun mh-execute-commands () |
(defun mh-execute-commands () |
564 |
"Process outstanding delete and refile requests." |
"Process outstanding delete and refile requests." |
589 |
(mh-invalidate-show-buffer)) |
(mh-invalidate-show-buffer)) |
590 |
(let ((mh-decode-mime-flag nil) |
(let ((mh-decode-mime-flag nil) |
591 |
(mhl-formfile nil) |
(mhl-formfile nil) |
|
(mh-decode-content-transfer-encoded-message-flag nil) |
|
592 |
(mh-clean-message-header-flag nil)) |
(mh-clean-message-header-flag nil)) |
593 |
(mh-show-msg nil) |
(mh-show-msg nil) |
594 |
(mh-in-show-buffer (mh-show-buffer) |
(mh-in-show-buffer (mh-show-buffer) |
596 |
(mh-recenter 0)) |
(mh-recenter 0)) |
597 |
(setq mh-showing-with-headers t))) |
(setq mh-showing-with-headers t))) |
598 |
|
|
599 |
(defun mh-inc-folder (&optional maildrop-name) |
(defun mh-inc-folder (&optional maildrop-name folder) |
600 |
"Inc(orporate)s new mail into the Inbox folder. |
"Inc(orporate)s new mail into the Inbox folder. |
601 |
Optional argument MAILDROP-NAME specifies an alternate maildrop from the |
Optional argument MAILDROP-NAME specifies an alternate maildrop from the |
602 |
default. If the prefix argument is given, incorporates mail into the current |
default. The optional argument FOLDER specifies where to incorporate mail |
603 |
folder, otherwise uses the folder named by `mh-inbox'. |
instead of the default named by `mh-inbox'. |
604 |
The value of `mh-inc-folder-hook' is a list of functions to be called, with no |
The value of `mh-inc-folder-hook' is a list of functions to be called, with no |
605 |
arguments, after incorporating new mail. |
arguments, after incorporating new mail. |
606 |
Do not call this function from outside MH-E; use \\[mh-rmail] instead." |
Do not call this function from outside MH-E; use \\[mh-rmail] instead." |
607 |
(interactive (list (if current-prefix-arg |
(interactive (list (if current-prefix-arg |
608 |
(expand-file-name |
(expand-file-name |
609 |
(read-file-name "inc mail from file: " |
(read-file-name "inc mail from file: " |
610 |
mh-user-path))))) |
mh-user-path))) |
611 |
|
(if current-prefix-arg |
612 |
|
(mh-prompt-for-folder "inc mail into" mh-inbox t)))) |
613 |
|
(if (not folder) |
614 |
|
(setq folder mh-inbox)) |
615 |
(let ((threading-needed-flag nil)) |
(let ((threading-needed-flag nil)) |
616 |
(let ((config (current-window-configuration))) |
(let ((config (current-window-configuration))) |
617 |
(if (not maildrop-name) |
(cond ((not (get-buffer folder)) |
618 |
(cond ((not (get-buffer mh-inbox)) |
(mh-make-folder folder) |
619 |
(mh-make-folder mh-inbox) |
(setq threading-needed-flag mh-show-threads-flag) |
620 |
(setq threading-needed-flag mh-show-threads-flag) |
(setq mh-previous-window-config config)) |
621 |
(setq mh-previous-window-config config)) |
((not (eq (current-buffer) (get-buffer folder))) |
622 |
((not (eq (current-buffer) (get-buffer mh-inbox))) |
(switch-to-buffer folder) |
623 |
(switch-to-buffer mh-inbox) |
(setq mh-previous-window-config config)))) |
|
(setq mh-previous-window-config config))))) |
|
624 |
(mh-get-new-mail maildrop-name) |
(mh-get-new-mail maildrop-name) |
625 |
(when (and threading-needed-flag |
(when (and threading-needed-flag |
626 |
(save-excursion |
(save-excursion |
630 |
(and (message "Not threading since the number of messages exceeds `mh-large-folder'") |
(and (message "Not threading since the number of messages exceeds `mh-large-folder'") |
631 |
nil)))) |
nil)))) |
632 |
(mh-toggle-threads)) |
(mh-toggle-threads)) |
633 |
(if mh-showing-mode (mh-show)) |
(beginning-of-line) |
634 |
|
(if (and mh-showing-mode (looking-at mh-scan-valid-regexp)) (mh-show)) |
635 |
(run-hooks 'mh-inc-folder-hook))) |
(run-hooks 'mh-inc-folder-hook))) |
636 |
|
|
637 |
(defun mh-last-msg () |
(defun mh-last-msg () |
642 |
(forward-line -1)) |
(forward-line -1)) |
643 |
(mh-recenter nil)) |
(mh-recenter nil)) |
644 |
|
|
645 |
(defun mh-next-undeleted-msg (&optional arg) |
(defun mh-next-undeleted-msg (&optional arg wait-after-complaining-flag) |
646 |
"Move to the next undeleted message ARG in window." |
"Move to the next undeleted message ARG in window. |
647 |
|
If optional argument WAIT-AFTER-COMPLAINING-FLAG is non-nil and we are at the |
648 |
|
last undeleted message then pause for a second after printing message." |
649 |
(interactive "p") |
(interactive "p") |
650 |
(setq mh-next-direction 'forward) |
(setq mh-next-direction 'forward) |
651 |
(forward-line 1) |
(forward-line 1) |
653 |
(beginning-of-line) |
(beginning-of-line) |
654 |
(mh-maybe-show)) |
(mh-maybe-show)) |
655 |
(t (forward-line -1) |
(t (forward-line -1) |
656 |
(message "No more undeleted messages")))) |
(message "No more undeleted messages") |
657 |
|
(if wait-after-complaining-flag (sit-for 1))))) |
658 |
|
|
659 |
(defun mh-folder-from-address () |
(defun mh-folder-from-address () |
660 |
"Determine folder name from address in From field. |
"Determine folder name from address in From field. |
661 |
Takes the address in the From: header field, and returns one of: |
Takes the address in the From: header field, and returns one of: |
662 |
|
|
663 |
a) The folder name associated with the address in the alist |
a) The folder name associated with the address in the alist |
664 |
`mh-default-folder-list'. |
`mh-default-folder-list'. If the `Check Recipient' boolean |
665 |
|
is set, then the `mh-default-folder-list' addresses are |
666 |
|
checked against the recipient instead of the originator |
667 |
|
(making possible to use this feature for mailing lists). |
668 |
|
The first match found in `mh-default-folder-list' is used. |
669 |
|
|
670 |
b) The address' corresponding alias from the user's personal |
b) The address' corresponding alias from the user's personal |
671 |
aliases file prefixed by `mh-default-folder-prefix'. |
aliases file prefixed by `mh-default-folder-prefix'. |
672 |
|
|
673 |
Returns nil if the address was not found in either place or if the variable |
Returns nil if the address was not found in either place or if the variable |
674 |
`mh-default-folder-must-exist-flag' is nil and the folder does not exist." |
`mh-default-folder-must-exist-flag' is nil and the folder does not exist." |
675 |
;; Is address in mh-default-folder-list? |
;; Loop for all entries in mh-default-folder-list |
676 |
(let* ((address |
(save-excursion |
677 |
(nth 1 (mail-extract-address-components |
(let ((folder-name |
678 |
(mh-extract-from-header-value)))) |
(car |
679 |
(folder-name |
(delq nil |
680 |
(nth 1 (assoc-ignore-case address mh-default-folder-list)))) |
(mapcar |
681 |
|
(lambda (list) |
682 |
;; If not, is there an alias for the address? |
(let ((address-regexp (nth 0 list)) |
683 |
(if (not folder-name) |
(folder (nth 1 list)) |
684 |
(let* ((alias (mh-alias-address-to-alias address))) |
(to-flag (nth 2 list))) |
685 |
(setq folder-name |
(when (or |
686 |
(and alias (concat "+" mh-default-folder-prefix alias))))) |
(mh-goto-header-field (if to-flag "To:" "From:")) |
687 |
|
; if the To: field is missing, try Cc: |
688 |
;; If mh-default-folder-must-exist-flag set, check that folder exists. |
(and to-flag (mh-goto-header-field "cc:"))) |
689 |
(if (and folder-name |
(let ((endfield (save-excursion |
690 |
(or (not mh-default-folder-must-exist-flag) |
(mh-header-field-end)(point)))) |
691 |
(file-exists-p (mh-expand-file-name folder-name)))) |
(if (re-search-forward address-regexp endfield t) |
692 |
folder-name))) |
folder |
693 |
|
(when to-flag ;Try Cc: as well |
694 |
|
(mh-goto-header-field "cc:") |
695 |
|
(let ((endfield (save-excursion |
696 |
|
(mh-header-field-end)(point)))) |
697 |
|
(when (re-search-forward |
698 |
|
address-regexp endfield t) |
699 |
|
folder)))))))) |
700 |
|
mh-default-folder-list))))) |
701 |
|
|
702 |
|
;; Make sure a result from `mh-default-folder-list' begins with "+" |
703 |
|
;; since 'mh-expand-file-name below depends on it |
704 |
|
(when (and folder-name (not (eq (aref folder-name 0) ?+))) |
705 |
|
(setq folder-name (concat "+" folder-name))) |
706 |
|
|
707 |
|
;; If not, is there an alias for the address? |
708 |
|
(when (not folder-name) |
709 |
|
(let* ((from-header (mh-extract-from-header-value)) |
710 |
|
(address (and from-header |
711 |
|
(nth 1 (mail-extract-address-components |
712 |
|
from-header)))) |
713 |
|
(alias (and address (mh-alias-address-to-alias address)))) |
714 |
|
(when alias |
715 |
|
(setq folder-name |
716 |
|
(and alias (concat "+" mh-default-folder-prefix alias)))))) |
717 |
|
|
718 |
|
;; If mh-default-folder-must-exist-flag set, check that folder exists. |
719 |
|
(if (and folder-name |
720 |
|
(or (not mh-default-folder-must-exist-flag) |
721 |
|
(file-exists-p (mh-expand-file-name folder-name)))) |
722 |
|
folder-name)))) |
723 |
|
|
724 |
(defun mh-prompt-for-refile-folder () |
(defun mh-prompt-for-refile-folder () |
725 |
"Prompt the user for a folder in which the message should be filed. |
"Prompt the user for a folder in which the message should be filed. |
746 |
""))) |
""))) |
747 |
t)) |
t)) |
748 |
|
|
749 |
(defun mh-refile-msg (msg-or-seq folder) |
(defun mh-refile-msg (msg-or-seq folder |
750 |
"Refile MSG-OR-SEQ (default: displayed message) into FOLDER. |
&optional dont-update-last-destination-flag) |
751 |
If optional prefix argument provided, then prompt for message sequence. |
"Refile MSG-OR-SEQ into FOLDER. |
752 |
|
Default is the displayed message. |
753 |
|
If optional prefix argument is provided, then prompt for the message sequence. |
754 |
If variable `transient-mark-mode' is non-nil and the mark is active, then the |
If variable `transient-mark-mode' is non-nil and the mark is active, then the |
755 |
selected region is marked for refiling." |
selected region is marked for refiling. |
756 |
(interactive |
In a program, MSG-OR-SEQ can be a message number, a list of message numbers, a |
757 |
(list (cond |
region in a cons cell, or a sequence. |
758 |
((mh-mark-active-p t) |
|
759 |
(cons (region-beginning) (region-end))) |
If optional argument DONT-UPDATE-LAST-DESTINATION-FLAG is non-nil then the |
760 |
(current-prefix-arg |
variables `mh-last-destination' and `mh-last-destination-folder' are not |
761 |
(mh-read-seq-default "Refile" t)) |
updated." |
762 |
(t |
(interactive (list (mh-interactive-msg-or-seq "Refile") |
763 |
(cons (line-beginning-position) (line-end-position)))) |
(intern (mh-prompt-for-refile-folder)))) |
764 |
(intern (mh-prompt-for-refile-folder)))) |
(unless dont-update-last-destination-flag |
765 |
(setq mh-last-destination (cons 'refile folder) |
(setq mh-last-destination (cons 'refile folder) |
766 |
mh-last-destination-folder mh-last-destination) |
mh-last-destination-folder mh-last-destination)) |
767 |
(cond ((numberp msg-or-seq) |
(mh-iterate-on-msg-or-seq () msg-or-seq |
768 |
(mh-refile-a-msg msg-or-seq folder)) |
(mh-refile-a-msg nil folder)) |
|
((and (consp msg-or-seq) |
|
|
(numberp (car msg-or-seq)) (numberp (cdr msg-or-seq))) |
|
|
(mh-iterate-on-messages-in-region () (car msg-or-seq) (cdr msg-or-seq) |
|
|
(mh-refile-a-msg nil folder))) |
|
|
(t (mh-map-to-seq-msgs 'mh-refile-a-msg msg-or-seq folder))) |
|
769 |
(mh-next-msg)) |
(mh-next-msg)) |
770 |
|
|
771 |
(defun mh-refile-or-write-again (message) |
(defun mh-refile-or-write-again (message) |
775 |
(interactive (list (mh-get-msg-num t))) |
(interactive (list (mh-get-msg-num t))) |
776 |
(if (null mh-last-destination) |
(if (null mh-last-destination) |
777 |
(error "No previous refile or write")) |
(error "No previous refile or write")) |
778 |
(cond ((eq (car mh-last-destination) 'refile) |
(let (output) |
779 |
(mh-refile-a-msg message (cdr mh-last-destination)) |
(setq output |
780 |
(message "Destination folder: %s" (cdr mh-last-destination))) |
(cond ((eq (car mh-last-destination) 'refile) |
781 |
(t |
(mh-refile-a-msg message (cdr mh-last-destination)) |
782 |
(apply 'mh-write-msg-to-file message (cdr mh-last-destination)) |
(format "Destination folder: %s" (cdr mh-last-destination))) |
783 |
(message "Destination: %s" (cdr mh-last-destination)))) |
(t |
784 |
(mh-next-msg)) |
(apply 'mh-write-msg-to-file message (cdr mh-last-destination)) |
785 |
|
(format "Destination: %s" (cdr mh-last-destination))))) |
786 |
|
(mh-next-msg (interactive-p)) |
787 |
|
(message output))) |
788 |
|
|
789 |
(defun mh-quit () |
(defun mh-quit () |
790 |
"Quit the current MH-E folder. |
"Quit the current MH-E folder. |
845 |
(mh-in-show-buffer (mh-show-buffer) |
(mh-in-show-buffer (mh-show-buffer) |
846 |
(scroll-down arg))) |
(scroll-down arg))) |
847 |
|
|
848 |
(defun mh-previous-undeleted-msg (&optional arg) |
(defun mh-previous-undeleted-msg (&optional arg wait-after-complaining-flag) |
849 |
"Move to the previous undeleted message ARG in window." |
"Move to the previous undeleted message ARG in window. |
850 |
|
If optional argument WAIT-AFTER-COMPLAINING-FLAG is non-nil and we are at the |
851 |
|
first undeleted message then pause for a second after printing message." |
852 |
(interactive "p") |
(interactive "p") |
853 |
(setq mh-next-direction 'backward) |
(setq mh-next-direction 'backward) |
854 |
(beginning-of-line) |
(beginning-of-line) |
855 |
(cond ((re-search-backward mh-scan-good-msg-regexp nil t arg) |
(cond ((re-search-backward mh-scan-good-msg-regexp nil t arg) |
856 |
(mh-maybe-show)) |
(mh-maybe-show)) |
857 |
(t (message "No previous undeleted message")))) |
(t (message "No previous undeleted message") |
858 |
|
(if wait-after-complaining-flag (sit-for 1))))) |
859 |
|
|
860 |
(defun mh-previous-unread-msg (&optional count) |
(defun mh-previous-unread-msg (&optional count) |
861 |
"Move to previous unread message. |
"Move to previous unread message. |
1033 |
nil))) |
nil))) |
1034 |
(setq mh-next-direction 'forward) |
(setq mh-next-direction 'forward) |
1035 |
(let ((threaded-flag (memq 'unthread mh-view-ops))) |
(let ((threaded-flag (memq 'unthread mh-view-ops))) |
|
(mh-reset-threads-and-narrowing) |
|
1036 |
(mh-scan-folder mh-current-folder (or range "all") dont-exec-pending) |
(mh-scan-folder mh-current-folder (or range "all") dont-exec-pending) |
1037 |
(cond (threaded-flag (mh-toggle-threads)) |
(cond (threaded-flag (mh-toggle-threads)) |
1038 |
(mh-index-data (mh-index-insert-folder-headers))))) |
(mh-index-data (mh-index-insert-folder-headers))))) |
1078 |
Default is the displayed message. |
Default is the displayed message. |
1079 |
If optional prefix argument is provided, then prompt for the message sequence. |
If optional prefix argument is provided, then prompt for the message sequence. |
1080 |
If variable `transient-mark-mode' is non-nil and the mark is active, then the |
If variable `transient-mark-mode' is non-nil and the mark is active, then the |
1081 |
selected region is unmarked." |
selected region is unmarked. |
1082 |
(interactive (list (cond |
In a program, MSG-OR-SEQ can be a message number, a list of message numbers, a |
1083 |
((mh-mark-active-p t) |
region in a cons cell, or a sequence." |
1084 |
(cons (region-beginning) (region-end))) |
(interactive (list (mh-interactive-msg-or-seq "Undo"))) |
|
(current-prefix-arg |
|
|
(mh-read-seq-default "Undo" t)) |
|
|
(t |
|
|
(mh-get-msg-num t))))) |
|
1085 |
(cond ((numberp msg-or-seq) |
(cond ((numberp msg-or-seq) |
1086 |
(let ((original-position (point))) |
(let ((original-position (point))) |
1087 |
(beginning-of-line) |
(beginning-of-line) |
1098 |
(mh-maybe-show)) |
(mh-maybe-show)) |
1099 |
(goto-char original-position) |
(goto-char original-position) |
1100 |
(error "Nothing to undo")))) |
(error "Nothing to undo")))) |
1101 |
((and (consp msg-or-seq) |
(t (mh-iterate-on-msg-or-seq () msg-or-seq |
1102 |
(numberp (car msg-or-seq)) (numberp (cdr msg-or-seq))) |
(mh-undo-msg nil)))) |
|
(mh-iterate-on-messages-in-region () (car msg-or-seq) (cdr msg-or-seq) |
|
|
(mh-undo-msg nil))) |
|
|
(t |
|
|
(mh-map-to-seq-msgs 'mh-undo-msg msg-or-seq))) |
|
1103 |
(if (not (mh-outstanding-commands-p)) |
(if (not (mh-outstanding-commands-p)) |
1104 |
(mh-set-folder-modified-p nil))) |
(mh-set-folder-modified-p nil))) |
1105 |
|
|
1206 |
(call-process (expand-file-name "flist" mh-progs) nil t nil |
(call-process (expand-file-name "flist" mh-progs) nil t nil |
1207 |
"-norecurse" folder "-sequence" (symbol-name mh-unseen-seq)) |
"-norecurse" folder "-sequence" (symbol-name mh-unseen-seq)) |
1208 |
(goto-char (point-min)) |
(goto-char (point-min)) |
1209 |
(multiple-value-bind (folder1 unseen total) |
(multiple-value-bind (folder unseen total) |
1210 |
(mh-parse-flist-output-line |
(mh-parse-flist-output-line |
1211 |
(buffer-substring (point) (line-end-position))) |
(buffer-substring (point) (line-end-position))) |
1212 |
(values total unseen)))) |
(values total unseen folder)))) |
1213 |
|
|
1214 |
(defun mh-visit-folder (folder &optional range index-data) |
(defun mh-visit-folder (folder &optional range index-data) |
1215 |
"Visit FOLDER and display RANGE of messages. |
"Visit FOLDER and display RANGE of messages. |
1227 |
(list folder-name |
(list folder-name |
1228 |
(mh-read-msg-range folder-name current-prefix-arg)))) |
(mh-read-msg-range folder-name current-prefix-arg)))) |
1229 |
(let ((config (current-window-configuration)) |
(let ((config (current-window-configuration)) |
1230 |
|
(current-buffer (current-buffer)) |
1231 |
(threaded-view-flag mh-show-threads-flag)) |
(threaded-view-flag mh-show-threads-flag)) |
1232 |
(save-excursion |
(save-excursion |
1233 |
(when (get-buffer folder) |
(when (get-buffer folder) |
1234 |
(set-buffer folder) |
(set-buffer folder) |
1235 |
(setq threaded-view-flag (memq 'unthread mh-view-ops)) |
(setq threaded-view-flag (memq 'unthread mh-view-ops)))) |
|
(mh-reset-threads-and-narrowing))) |
|
1236 |
(when index-data |
(when index-data |
1237 |
(mh-make-folder folder) |
(mh-make-folder folder) |
1238 |
(setq mh-index-data (car index-data) |
(setq mh-index-data (car index-data) |
1251 |
(mh-index-data |
(mh-index-data |
1252 |
(mh-index-insert-folder-headers))) |
(mh-index-insert-folder-headers))) |
1253 |
(unless mh-showing-mode (delete-other-windows)) |
(unless mh-showing-mode (delete-other-windows)) |
1254 |
(setq mh-previous-window-config config)) |
(unless (eq current-buffer (current-buffer)) |
1255 |
|
(setq mh-previous-window-config config))) |
1256 |
nil) |
nil) |
1257 |
|
|
1258 |
;;;###mh-autoload |
;;;###mh-autoload |
1336 |
(mh-notate nil mh-note-refiled mh-cmd-note) |
(mh-notate nil mh-note-refiled mh-cmd-note) |
1337 |
(run-hooks 'mh-refile-msg-hook))))) |
(run-hooks 'mh-refile-msg-hook))))) |
1338 |
|
|
1339 |
(defun mh-next-msg () |
(defun mh-next-msg (&optional wait-after-complaining-flag) |
1340 |
"Move backward or forward to the next undeleted message in the buffer." |
"Move backward or forward to the next undeleted message in the buffer. |
1341 |
|
If optional argument WAIT-AFTER-COMPLAINING-FLAG is non-nil and we are at the |
1342 |
|
last message, then wait for a second after telling the user that there aren't |
1343 |
|
any more unread messages." |
1344 |
(if (eq mh-next-direction 'forward) |
(if (eq mh-next-direction 'forward) |
1345 |
(mh-next-undeleted-msg 1) |
(mh-next-undeleted-msg 1 wait-after-complaining-flag) |
1346 |
(mh-previous-undeleted-msg 1))) |
(mh-previous-undeleted-msg 1 wait-after-complaining-flag))) |
1347 |
|
|
1348 |
(defun mh-next-unread-msg (&optional count) |
(defun mh-next-unread-msg (&optional count) |
1349 |
"Move to next unread message. |
"Move to next unread message. |
1440 |
["Widen from Sequence" mh-widen mh-narrowed-to-seq] |
["Widen from Sequence" mh-widen mh-narrowed-to-seq] |
1441 |
"--" |
"--" |
1442 |
["Narrow to Subject Sequence" mh-narrow-to-subject t] |
["Narrow to Subject Sequence" mh-narrow-to-subject t] |
1443 |
|
["Narrow to Tick Sequence" mh-narrow-to-tick |
1444 |
|
(and mh-tick-seq (mh-seq-msgs (mh-find-seq mh-tick-seq)))] |
1445 |
["Delete Rest of Same Subject" mh-delete-subject t] |
["Delete Rest of Same Subject" mh-delete-subject t] |
1446 |
|
["Toggle Tick Mark" mh-toggle-tick t] |
1447 |
"--" |
"--" |
1448 |
["Push State Out to MH" mh-update-sequences t])) |
["Push State Out to MH" mh-update-sequences t])) |
1449 |
|
|
1496 |
"--" |
"--" |
1497 |
["List Folders" mh-list-folders t] |
["List Folders" mh-list-folders t] |
1498 |
["Visit a Folder..." mh-visit-folder t] |
["Visit a Folder..." mh-visit-folder t] |
1499 |
|
["View New Messages" mh-index-new-messages t] |
1500 |
["Search a Folder..." mh-search-folder t] |
["Search a Folder..." mh-search-folder t] |
1501 |
["Indexed Search..." mh-index-search t] |
["Indexed Search..." mh-index-search t] |
1502 |
"--" |
"--" |
1512 |
(set-specifier horizontal-scrollbar-visible-p nil |
(set-specifier horizontal-scrollbar-visible-p nil |
1513 |
(cons (current-buffer) nil))))) |
(cons (current-buffer) nil))))) |
1514 |
|
|
1515 |
|
;; Avoid compiler warnings in XEmacs and GNU Emacs 20 |
1516 |
|
(eval-when-compile (defvar tool-bar-mode)) |
1517 |
|
|
1518 |
(defmacro mh-write-file-functions-compat () |
(defmacro mh-write-file-functions-compat () |
1519 |
"Return `write-file-functions' if it exists. |
"Return `write-file-functions' if it exists. |
1520 |
Otherwise return `local-write-file-hooks'. This macro exists purely for |
Otherwise return `local-write-file-hooks'. This macro exists purely for |
1524 |
''write-file-functions ;Emacs 21.4 |
''write-file-functions ;Emacs 21.4 |
1525 |
''local-write-file-hooks)) ;<Emacs 21.4, XEmacs |
''local-write-file-hooks)) ;<Emacs 21.4, XEmacs |
1526 |
|
|
1527 |
|
;; Avoid compiler warning |
1528 |
|
(defvar tool-bar-map) |
1529 |
|
|
1530 |
(define-derived-mode mh-folder-mode fundamental-mode "MH-Folder" |
(define-derived-mode mh-folder-mode fundamental-mode "MH-Folder" |
1531 |
"Major MH-E mode for \"editing\" an MH folder scan listing.\\<mh-folder-mode-map> |
"Major MH-E mode for \"editing\" an MH folder scan listing.\\<mh-folder-mode-map> |
1532 |
|
|
1563 |
'mh-seen-list nil ; List of displayed messages |
'mh-seen-list nil ; List of displayed messages |
1564 |
'mh-next-direction 'forward ; Direction to move to next message |
'mh-next-direction 'forward ; Direction to move to next message |
1565 |
'mh-narrowed-to-seq nil ; Sequence display is narrowed to |
'mh-narrowed-to-seq nil ; Sequence display is narrowed to |
1566 |
|
'mh-tick-seq-changed-when-narrowed-flag nil |
1567 |
|
; Tick seq changed while narrowed |
1568 |
'mh-view-ops () ; Stack that keeps track of the order |
'mh-view-ops () ; Stack that keeps track of the order |
1569 |
; in which narrowing/threading has been |
; in which narrowing/threading has been |
1570 |
; carried out. |
; carried out. |
1583 |
(setq truncate-lines t) |
(setq truncate-lines t) |
1584 |
(auto-save-mode -1) |
(auto-save-mode -1) |
1585 |
(setq buffer-offer-save t) |
(setq buffer-offer-save t) |
1586 |
|
(mh-make-local-hook (mh-write-file-functions-compat)) |
1587 |
(add-hook (mh-write-file-functions-compat) 'mh-execute-commands nil t) |
(add-hook (mh-write-file-functions-compat) 'mh-execute-commands nil t) |
1588 |
(make-local-variable 'revert-buffer-function) |
(make-local-variable 'revert-buffer-function) |
1589 |
(make-local-variable 'hl-line-mode) ; avoid pollution |
(make-local-variable 'hl-line-mode) ; avoid pollution |
1590 |
(if (fboundp 'hl-line-mode) |
(mh-funcall-if-exists hl-line-mode 1) |
|
(hl-line-mode 1)) |
|
1591 |
(setq revert-buffer-function 'mh-undo-folder) |
(setq revert-buffer-function 'mh-undo-folder) |
1592 |
(or (assq 'mh-showing-mode minor-mode-alist) |
(or (assq 'mh-showing-mode minor-mode-alist) |
1593 |
(setq minor-mode-alist |
(setq minor-mode-alist |
1597 |
(easy-menu-add mh-folder-folder-menu) |
(easy-menu-add mh-folder-folder-menu) |
1598 |
(if (and (boundp 'tool-bar-mode) tool-bar-mode) |
(if (and (boundp 'tool-bar-mode) tool-bar-mode) |
1599 |
(set (make-local-variable 'tool-bar-map) mh-folder-tool-bar-map)) |
(set (make-local-variable 'tool-bar-map) mh-folder-tool-bar-map)) |
1600 |
|
(mh-funcall-if-exists mh-toolbar-init :folder) |
1601 |
(if (and mh-xemacs-flag |
(if (and mh-xemacs-flag |
1602 |
font-lock-auto-fontify) |
font-lock-auto-fontify) |
1603 |
(turn-on-font-lock))) ; Force font-lock in XEmacs. |
(turn-on-font-lock))) ; Force font-lock in XEmacs. |
1617 |
(cond ((null (get-buffer folder)) |
(cond ((null (get-buffer folder)) |
1618 |
(mh-make-folder folder)) |
(mh-make-folder folder)) |
1619 |
(t |
(t |
1620 |
(or dont-exec-pending (mh-process-or-undo-commands folder)) |
(unless dont-exec-pending |
1621 |
|
(mh-process-or-undo-commands folder) |
1622 |
|
(mh-reset-threads-and-narrowing)) |
1623 |
(switch-to-buffer folder))) |
(switch-to-buffer folder))) |
1624 |
(mh-regenerate-headers range) |
(mh-regenerate-headers range) |
1625 |
(if (zerop (buffer-size)) |
(if (zerop (buffer-size)) |
1627 |
(message "Folder %s is empty" folder) |
(message "Folder %s is empty" folder) |
1628 |
(message "No messages in %s, range %s" folder range)) |
(message "No messages in %s, range %s" folder range)) |
1629 |
(mh-goto-cur-msg)) |
(mh-goto-cur-msg)) |
1630 |
(when dont-exec-pending |
(when (mh-outstanding-commands-p) |
1631 |
(mh-notate-deleted-and-refiled))) |
(mh-notate-deleted-and-refiled))) |
1632 |
|
|
1633 |
(defun mh-set-cmd-note (width) |
(defun mh-set-cmd-note (width) |
1791 |
(if new-mail-flag |
(if new-mail-flag |
1792 |
(progn |
(progn |
1793 |
(mh-make-folder-mode-line) |
(mh-make-folder-mode-line) |
1794 |
|
(when (mh-speed-flists-active-p) |
1795 |
|
(mh-speed-flists t mh-current-folder)) |
1796 |
(when (memq 'unthread mh-view-ops) |
(when (memq 'unthread mh-view-ops) |
1797 |
(mh-thread-inc folder start-of-inc)) |
(mh-thread-inc folder start-of-inc)) |
1798 |
(mh-goto-cur-msg)) |
(mh-goto-cur-msg)) |
1912 |
(if (mh-outstanding-commands-p) |
(if (mh-outstanding-commands-p) |
1913 |
(if (or mh-do-not-confirm-flag |
(if (or mh-do-not-confirm-flag |
1914 |
(y-or-n-p |
(y-or-n-p |
1915 |
"Process outstanding deletes and refiles (or lose them)? ")) |
"Process outstanding deletes and refiles? ")) |
1916 |
(mh-process-commands folder) |
(mh-process-commands folder) |
1917 |
|
(set-buffer folder) |
1918 |
(mh-undo-folder))) |
(mh-undo-folder))) |
1919 |
(mh-update-unseen) |
(mh-update-unseen) |
1920 |
(mh-invalidate-show-buffer)) |
(mh-invalidate-show-buffer)) |
1966 |
|
|
1967 |
;; Redraw folder buffer if needed |
;; Redraw folder buffer if needed |
1968 |
(when (and redraw-needed-flag) |
(when (and redraw-needed-flag) |
1969 |
|
(when (mh-speed-flists-active-p) |
1970 |
|
(mh-speed-flists t mh-current-folder)) |
1971 |
(cond ((memq 'unthread mh-view-ops) (mh-thread-inc folder (point-max))) |
(cond ((memq 'unthread mh-view-ops) (mh-thread-inc folder (point-max))) |
1972 |
(mh-index-data (mh-index-insert-folder-headers))))) |
(mh-index-data (mh-index-insert-folder-headers))))) |
1973 |
|
|
2016 |
(or mh-delete-list mh-refile-list)) |
(or mh-delete-list mh-refile-list)) |
2017 |
|
|
2018 |
(defun mh-coalesce-msg-list (messages) |
(defun mh-coalesce-msg-list (messages) |
2019 |
"Give a list of MESSAGES, return a list of message number ranges. |
"Given a list of MESSAGES, return a list of message number ranges. |
2020 |
Sort of the opposite of `mh-read-msg-list', which expands ranges. |
This is the inverse of `mh-read-msg-list', which expands ranges. |
2021 |
Message lists passed to MH programs go through this so |
Message lists passed to MH programs should be processed by this function |
2022 |
command line arguments won't exceed system limits." |
to avoid exceeding system command line argument limits." |
2023 |
(let ((msgs (sort (copy-sequence messages) 'mh-greaterp)) |
(let ((msgs (sort (copy-sequence messages) 'mh-greaterp)) |
2024 |
(range-high nil) |
(range-high nil) |
2025 |
(prev -1) |
(prev -1) |
2113 |
(setq msgs (cons num msgs))))) |
(setq msgs (cons num msgs))))) |
2114 |
msgs)) |
msgs)) |
2115 |
|
|
2116 |
(defun mh-notate-user-sequences () |
(defun mh-notate-user-sequences (&optional msg-or-seq) |
2117 |
"Mark the scan listing of all messages in user-defined sequences." |
"Mark user-defined sequences in the messages specified by MSG-OR-SEQ. |
2118 |
|
The optional argument MSG-OR-SEQ can be a message number, a list of message |
2119 |
|
numbers, a sequence, a region in a cons cell, or nil in which case all |
2120 |
|
messages in the folder buffer are notated." |
2121 |
|
(unless msg-or-seq |
2122 |
|
(setq msg-or-seq (cons (point-min) (point-max)))) |
2123 |
(let ((seqs mh-seq-list) |
(let ((seqs mh-seq-list) |
2124 |
(msg-hash (make-hash-table))) |
(msg-hash (make-hash-table)) |
2125 |
|
(tick-msgs (and mh-tick-seq (mh-seq-msgs (mh-find-seq mh-tick-seq))))) |
2126 |
(dolist (seq seqs) |
(dolist (seq seqs) |
2127 |
(unless (mh-internal-seq (mh-seq-name seq)) |
(unless (mh-internal-seq (mh-seq-name seq)) |
2128 |
(dolist (msg (mh-seq-msgs seq)) |
(dolist (msg (mh-seq-msgs seq)) |
2129 |
(setf (gethash msg msg-hash) t)))) |
(setf (gethash msg msg-hash) t)))) |
2130 |
(mh-iterate-on-messages-in-region msg (point-min) (point-max) |
(mh-iterate-on-msg-or-seq msg msg-or-seq |
2131 |
(when (gethash msg msg-hash) |
(when (gethash msg msg-hash) |
2132 |
(mh-notate nil mh-note-seq (1+ mh-cmd-note)))))) |
(mh-notate nil mh-note-seq (1+ mh-cmd-note))) |
2133 |
|
(mh-notate-tick msg tick-msgs)))) |
2134 |
|
|
2135 |
(defun mh-internal-seq (name) |
(defun mh-internal-seq (name) |
2136 |
"Return non-nil if NAME is the name of an internal MH-E sequence." |
"Return non-nil if NAME is the name of an internal MH-E sequence." |
2137 |
(or (memq name '(answered cur deleted forwarded printed)) |
(or (memq name '(answered cur deleted forwarded printed)) |
2138 |
(eq name mh-unseen-seq) |
(eq name mh-unseen-seq) |
2139 |
|
(and mh-tick-seq (eq name mh-tick-seq)) |
2140 |
(eq name mh-previous-seq) |
(eq name mh-previous-seq) |
2141 |
(mh-folder-name-p name))) |
(mh-folder-name-p name))) |
2142 |
|
|
2143 |
(defun mh-delete-msg-from-seq (message sequence &optional internal-flag) |
(defun mh-delete-msg-from-seq (msg-or-seq sequence &optional internal-flag) |
2144 |
"Delete MESSAGE from SEQUENCE. |
"Delete MSG-OR-SEQ from SEQUENCE. |
2145 |
MESSAGE defaults to displayed message. From Lisp, optional third arg |
Default value of MSG-OR-SEQ is the displayed message. |
2146 |
INTERNAL-FLAG non-nil means do not inform MH of the change." |
If optional prefix argument is provided, then prompt for the message sequence. |
2147 |
(interactive (list (mh-get-msg-num t) |
If variable `transient-mark-mode' is non-nil and the mark is active, then the |
2148 |
|
selected region is deleted from SEQUENCE.. |
2149 |
|
In a program, MSG-OR-SEQ can be a message number, a list of message numbers, a |
2150 |
|
region in a cons cell, or a sequence; optional third arg INTERNAL-FLAG non-nil |
2151 |
|
means do not inform MH of the change." |
2152 |
|
(interactive (list (mh-interactive-msg-or-seq "Delete") |
2153 |
(mh-read-seq-default "Delete from" t) |
(mh-read-seq-default "Delete from" t) |
2154 |
nil)) |
nil)) |
2155 |
(let ((entry (mh-find-seq sequence))) |
(let ((entry (mh-find-seq sequence))) |
2156 |
(cond (entry |
(when entry |
2157 |
(mh-notate-if-in-one-seq message ? (1+ mh-cmd-note) sequence) |
(mh-iterate-on-msg-or-seq msg msg-or-seq |
2158 |
(if (not internal-flag) |
(when (memq msg (mh-seq-msgs entry)) |
2159 |
(mh-undefine-sequence sequence (list message))) |
(mh-notate nil ? (1+ mh-cmd-note))) |
2160 |
(setcdr entry (delq message (mh-seq-msgs entry))))))) |
(mh-delete-a-msg-from-seq msg sequence internal-flag) |
2161 |
|
(mh-clear-text-properties nil)) |
2162 |
|
(mh-notate-user-sequences msg-or-seq) |
2163 |
|
(when (and (eq sequence mh-unseen-seq) (mh-speed-flists-active-p)) |
2164 |
|
(mh-speed-flists t mh-current-folder))))) |
2165 |
|
|
2166 |
|
(defun mh-delete-a-msg-from-seq (msg sequence internal-flag) |
2167 |
|
"Delete MSG from SEQUENCE. |
2168 |
|
If INTERNAL-FLAG is non-nil, then do not inform MH of the change." |
2169 |
|
(let ((entry (mh-find-seq sequence))) |
2170 |
|
(when (and entry (memq msg (mh-seq-msgs entry))) |
2171 |
|
(if (not internal-flag) |
2172 |
|
(mh-undefine-sequence sequence (list msg))) |
2173 |
|
(setcdr entry (delq msg (mh-seq-msgs entry)))))) |
2174 |
|
|
2175 |
|
(defun mh-clear-text-properties (message) |
2176 |
|
"Clear all text properties (except mh-tick) from the scan line for MESSAGE." |
2177 |
|
(save-excursion |
2178 |
|
(with-mh-folder-updating (t) |
2179 |
|
(when (or (not message) (mh-goto-msg message t t)) |
2180 |
|
(beginning-of-line) |
2181 |
|
(let ((tick-property (get-text-property (point) 'mh-tick))) |
2182 |
|
(set-text-properties (point) (line-end-position) nil) |
2183 |
|
(when tick-property |
2184 |
|
(add-text-properties (point) (line-end-position) |
2185 |
|
`(mh-tick ,tick-property)))))))) |
2186 |
|
|
2187 |
(defun mh-undefine-sequence (seq msgs) |
(defun mh-undefine-sequence (seq msgs) |
2188 |
"Remove from the SEQ the list of MSGS." |
"Remove from the SEQ the list of MSGS." |
2189 |
(mh-exec-cmd "mark" mh-current-folder "-delete" |
(prog1 (mh-exec-cmd "mark" mh-current-folder "-delete" |
2190 |
"-sequence" (symbol-name seq) |
"-sequence" (symbol-name seq) |
2191 |
(mh-coalesce-msg-list msgs))) |
(mh-coalesce-msg-list msgs)) |
2192 |
|
(when (and (eq seq mh-unseen-seq) (mh-speed-flists-active-p)) |
2193 |
|
(mh-speed-flists t mh-current-folder)))) |
2194 |
|
|
2195 |
(defun mh-define-sequence (seq msgs) |
(defun mh-define-sequence (seq msgs) |
2196 |
"Define the SEQ to contain the list of MSGS. |
"Define the SEQ to contain the list of MSGS. |
2275 |
(gnus-define-keys mh-folder-mode-map |
(gnus-define-keys mh-folder-mode-map |
2276 |
" " mh-page-msg |
" " mh-page-msg |
2277 |
"!" mh-refile-or-write-again |
"!" mh-refile-or-write-again |
2278 |
|
"'" mh-toggle-tick |
2279 |
"," mh-header-display |
"," mh-header-display |
2280 |
"." mh-alt-show |
"." mh-alt-show |
2281 |
">" mh-write-msg-to-file |
">" mh-write-msg-to-file |
2322 |
"i" mh-index-search |
"i" mh-index-search |
2323 |
"k" mh-kill-folder |
"k" mh-kill-folder |
2324 |
"l" mh-list-folders |
"l" mh-list-folders |
2325 |
|
"n" mh-index-new-messages |
2326 |
"o" mh-alt-visit-folder |
"o" mh-alt-visit-folder |
2327 |
"p" mh-pack-folder |
"p" mh-pack-folder |
2328 |
"r" mh-rescan-folder |
"r" mh-rescan-folder |
2330 |
"u" mh-undo-folder |
"u" mh-undo-folder |
2331 |
"v" mh-visit-folder) |
"v" mh-visit-folder) |
2332 |
|
|
2333 |
|
(define-key mh-folder-mode-map "I" mh-inc-spool-map) |
2334 |
|
|
2335 |
|
(gnus-define-keys (mh-junk-map "J" mh-folder-mode-map) |
2336 |
|
"?" mh-prefix-help |
2337 |
|
"b" mh-junk-blacklist |
2338 |
|
"w" mh-junk-whitelist) |
2339 |
|
|
2340 |
(gnus-define-keys (mh-sequence-map "S" mh-folder-mode-map) |
(gnus-define-keys (mh-sequence-map "S" mh-folder-mode-map) |
2341 |
"?" mh-prefix-help |
"?" mh-prefix-help |
2342 |
"d" mh-delete-msg-from-seq |
"d" mh-delete-msg-from-seq |
2357 |
"o" mh-thread-refile) |
"o" mh-thread-refile) |
2358 |
|
|
2359 |
(gnus-define-keys (mh-limit-map "/" mh-folder-mode-map) |
(gnus-define-keys (mh-limit-map "/" mh-folder-mode-map) |
2360 |
|
"'" mh-narrow-to-tick |
2361 |
"?" mh-prefix-help |
"?" mh-prefix-help |
2362 |
"s" mh-narrow-to-subject |
"s" mh-narrow-to-subject |
2363 |
"w" mh-widen) |
"w" mh-widen) |
2408 |
'((nil "[i]nc, [.]show, [,]show all, [n]ext, [p]revious,\n" |
'((nil "[i]nc, [.]show, [,]show all, [n]ext, [p]revious,\n" |
2409 |
"[d]elete, [o]refile, e[x]ecute,\n" |
"[d]elete, [o]refile, e[x]ecute,\n" |
2410 |
"[s]end, [r]eply.\n" |
"[s]end, [r]eply.\n" |
2411 |
"Prefix characters:\n [F]older, [S]equence, MIME [K]eys, " |
"Prefix characters:\n [F]older, [S]equence, [J]unk, MIME [K]eys," |
2412 |
"[T]hread, / Limit, e[X]tract, [D]igest.") |
"\n [T]hread, / Limit, e[X]tract, [D]igest, [I]nc spools.") |
2413 |
|
|
2414 |
(?F "[l]ist, [v]isit folder;\n" |
(?F "[l]ist, [v]isit folder;\n" |
2415 |
"[t]hread; [s]earch; [i]ndexed search;\n" |
"[t]hread; [s]earch; [i]ndexed search;\n" |
2422 |
(?X "un[s]har, [u]udecode message") |
(?X "un[s]har, [u]udecode message") |
2423 |
(?D "[b]urst digest") |
(?D "[b]urst digest") |
2424 |
(?K "[v]iew, [i]nline, [o]utput/save MIME part; save [a]ll parts; \n" |
(?K "[v]iew, [i]nline, [o]utput/save MIME part; save [a]ll parts; \n" |
2425 |
"[TAB] next; [SHIFT-TAB] previous")) |
"[TAB] next; [SHIFT-TAB] previous") |
2426 |
|
(?J "[b]lacklist, [w]hitelist message")) |
2427 |
"Key binding cheat sheet. |
"Key binding cheat sheet. |
2428 |
|
|
2429 |
This is an associative array which is used to show the most common commands. |
This is an associative array which is used to show the most common commands. |