pax_global_header00006660000000000000000000000064125645554700014527gustar00rootroot0000000000000052 comment=ff9c41b981fb6050121a3831825d0349bffeb9ce kazu-yamamoto-Mew-ff9c41b/000077500000000000000000000000001256455547000155535ustar00rootroot00000000000000kazu-yamamoto-Mew-ff9c41b/.gitignore000066400000000000000000000003061256455547000175420ustar00rootroot00000000000000*.elc *.o *.log *.hi config.h config.status temp.el Makefile bin/Makefile bin/incm bin/mew-pinentry bin/mewcat bin/mewdecode bin/mewencode bin/mewl bin/hs/smew bin/hs/cmew bin/hs/dist TAGS info/dir kazu-yamamoto-Mew-ff9c41b/00api000066400000000000000000000070151256455547000164120ustar00rootroot00000000000000 Kazu Yamamoto Feb 16, 2004 --- * '"' A command specified by '"' is called with "Grep pattern" and file names of the messages in the directory of a target folder. "Grep pattern" is encoded according to 'mew-cs-database-for-arg'. The command must produce output whose lines start with a file name of matched messages. It's OK if the same file name appears multiple times. 10: xxx pattern xxx 10: yyy pattern yyy 21: zzz pattern zzz --- * mew-scan-form-* A symbol, say 'symb', in 'mew-scan-form' means to call the function 'mew-scan-form-symb'. Read the document of 'mew-scan-form' for more information. This function MUST return a string. mew-scan-form-* can use some functions (MEW-FOO) and variables (TOTAL, WIDTH). Users customizable variables are 'mew-scan-fields' and 'mew-scan-fields-alias'. 'mew-scan-fields' MUST start with ("Folder:" "Filename:"). (nthcdr 2 mew-scan-fields) passed to "mewl" and 'mew-vec', which contains each value of field in 'mew-scan-fields', is created. Each element of 'mew-scan-fields-alias' is corresponding to an element of 'mew-scan-fields', respectively. Functions called MEW-FOO is defined according to 'mew-scan-fields-alias'. e.g. (MEW-SUBJ) returns the value of Subject: ;; MEW-SUBJ is defined as (aref mew-vec 3) Pre-defined functions are: MEW-FLD - Folder: MEW-NUM - Filename: MEW-SUBJ - Subject: MEW-DATE - Date: MEW-FROM - From: MEW-TO - To: MEW-CT - Content-Type: MEW-ID - Message-ID: MEW-UIDL - X-Mew-UIDL: To get a size in X-Mew-UIDL:, call (mew-scan-get-size (MEW-UIDL)). To get a uidl in X-Mew-UIDL:, call (mew-scan-get-uidl (MEW-UIDL)). Also, two local variables are available: TOTAL - the current total width WIDTH - the width After you change both 'mew-scan-fields' and 'mew-scan-fields-alias', call 'mew-status-update' ("Z" in Summary mode). --- * Local mailbox Mew uses POP to retrieve messages. If you want to retrieve them from a local mailbox, set 'mew-mailbox-type' to 'mbox. (setq mew-mailbox-type 'mbox) In this case, Mew executes "mewl" with 'mew-mbox-command' and 'mew-mbox-command-arg'. mewl -e mew-mbox-command -m mew-mbox-command-arg +folder "mewl" then executes 'mew-mbox-command' like this: mew-mbox-command mew-mbox-command-arg +folder Note that 'mew-mbox-command' is executed in the destination directory (e.g. +folder). So, 'mew-mbox-command' need not to expand/analysis the destination folder string. Note also that you can specifies a source of messages (i.e. local mailbox) in 'mew-mbox-command-arg'. (The source need not to be the folder format. Just a path is enough.) 'mew-mbox-command' MUST be move a message to the destination, then print its file name (a message number) to stdout. Repeat this cycle until the mailbox becomes empty. "mewl" reads stdin, extracts a message number, opens the message, then prints necessary fields. The extraction of a message number is performed like "^[\t]*\\([0-9]+=\\)". It is emphasized that 'mew-mbox-command' MUST print a resulting message number just after it moves the corresponding file so that "mewl" prints necessary fields immediately. It is a quite bad idea that 'mew-mbox-command' moves all files first, then prints all message numbers. An example: (setq mew-mbox-command "inc") (setq mew-mbox-command-arg "-truncate -file /var/mail/user") The image of this example is as follows: mewl -e inc -m '-truncate -file /var/mail/user' +inbox v (fork) v inc -truncate -file /var/mail/user +inbox | mewl --- kazu-yamamoto-Mew-ff9c41b/00changes.0000066400000000000000000001051771256455547000174170ustar00rootroot00000000000000 0.99 (10/08/95) mew-release release * Typo of mew-draft-multipart-end. * Never display MIME syntax when mew-summary-toggle-disp-msg is on. * I have misunderstand RFC1522 for a long time that its heder encoding requires MIME-Version: field. But Keith kindly told me that it's not the case. Thanks to this flexibility of RFC1522, we can safely exchange non-ascii header fields with non-MIME interface. * Typo of update in mew-summary-rescan. * mew-field-get-{value, line} now uses mew-loop-depth to prevent long loop that happens with thousands of same field in a message. * mew-prog-pick-default-arg is defined. * edit-again and reedit inserts mew-from and mew-reply-to. Satoshi Nakagawa * mew-cite-format is *field free*! See the documentation of mew-cite-fields. * mew-refile is version up to stop using mew-summary-buffer-disp-msg-current. * Many code contributions that make Mew slightly faster preventing consumption of cells. Thanks! UMEMURA Akihiro * Define mew-cite-prefix-function and mew-cite-prefix-username. * Define mew-cite-prefix-confirmp. * On Xemacs, use (mark t) instead of (marker-position (mark-marker)). Niclas Andersson * mew-prog-audio bug fix (Sorry for late, Dave!). Shiro IKEDA dcw (David Worenklein) * mew-summary-reply prepares Cc: from From: field. This may be useful in the case that To: is a user, From: is the sender, and Reply-To: is a ML. * Define mew-header-max-length to prevent long loop for processing loooong header. * mewencode hack. (1) "\n.\n" including "post soft break" is QP-encoded to "\n.=\n\n". (suggested by Richard Levitte ) (2) If we meet illegal encoded words such as "=XX" at PQ-decoding, we just warn, never exit. (suggested by Niclas Andersson ) * mew-header-extract-addr hack. Mine Sakurai * mew-mark-process-all-folders bug fix. Shiro IKEDA * "insert" rather than insert-after-markers which is obsolete in Emacs 19. Jarle Fredrik Greipsland * Draft menu enhancement. dcw (David Worenklein) * mew-ask-cc hack for forward, multiforward, and resent. dcw (David Worenklein) * Define message-mode functions and menu. dcw (David Worenklein) * Use buffer-substring-no-properties instead of buffer-substring for mew-delete-backward-char[-at] on Emacs 19 for font-lock-mode. Jarle Fredrik Greipsland * C-u C-c C-c on draft buffer leaves the draft as it is. Tomoharu Suzuki 0.98 (08/01/95) mew-release release * mew-pgp.el support the cases of lack of public key and keyring itself. * mew-part-make hack. * A bug fix for X-Mew:. * defvar of mew-x-mew to allow users to defined an appropriate strings for security. * "mo" bug fix. Hirotaka Yokokawa 0.97 (07/28/95) mew-release release * mew-draft-check-whom uses mew-header-address-collect instead of mew-header-user-collect. Tetsuro Muranaga * Defined mew-temp-file to get rid of the security hole which makes eavesdroppers possible to watch contents of mail on /tmp. mew-temp-file must be a file which nobody but you can access. The default value is ~/Mail/drafts. * localform decoder and syntax analyzer now handle CT: in Message/digest. Message/Mixed and Message/Digest is syntactically identical but the semantics are different. The default CT: for Message/Digest is "message/rfc822" whereas the default CT: for Message/Mixed is "text/plain". We don't assume null line after boundary anymore. * mew-pgp-decode-sentinel and mew-pgp-decode-sentinel-mime is merged to handle PGP message. 0.96 (06/28/95) gnu.emacs.sources release * mew-draft-cite sets buffer to (mew-buffer-message) when non-analysis mode. * Some warning preventions. SAKAI Kiyotaka * Dummy message "" for mew-draft-cite to prevent echo. I don't know why this echo occurs. * mew-summary-{reedit, edit-again} inserts mew-fcc and mew-dcc. * mew-draft-undo deletes backup files. * Tiny bug fix for mew-draft-undo. * Tiny bug fix of CD: for PGP/MIME * Double quotations in the description of mew-cache are escaped with "\". This makes Mew workable on Emacs 19.29. * Further English improvement Mikitomo Ushijima * mew-mime-{call,start}-process warns a message if program doesn't exist. 0.95 (06/26/95) mew-dist release * mew-fib-flush-input -> "C-cu" * mew-draft-undo -> "C-cC-u" * mew-header-user-collect never warn when exceeds mew-loop-depth. mew-apply-before-refile-function SAKAI Kiyotaka * Check existence of PGP before decoding the region. * English improvement Mikitomo Ushijima * mew-summary-rmm and mew-summary-undo can take number prefix. SAKAI Kiyotaka * MIME syntax analyzer takes care of CTE:, CI: and CD: for message/rfc822. * Message/External-body can contain CD: * An entry of mew-multi-syntax consists of (filename type description encoding param). PGP encryption uses param instead of descrition. So, MIME object which is encoded by PGP can include CD:. * All command in multipart of draft mode keep the position. * The key binding of mew-multi-pgp-sign-enc changes from "B" to "P" due to mew-multi-base64. * mew-multi-base64, mew-multi-quoted-printable. * mew-multi-gzip -> mew-multi-gzip64. * mew-summary-edit-again for old fashion error mail that an original message is encapsulated after "----- Original message follows -----". This is binded to "\ee" in summary mode. * mew-header-alist * Bug fix of code transform error in PGP/MIME. I forgot to specifiy boundary. * In draft mode, C-cC-c + "n" caused an error. This is fixed. * Comment out mew-draft-anno in mew-summary-reply. 0.94 (06/21/95) mew-dist release * PGP/MIME !! \^^/ * Bug fixs for mew-summary-forward[-multi] * mew-summary-{inc,scan}-sentinel-hook * typo kawato * Two warning reduction SAKAI Kiyotaka 0.93 (06/20/95) mew-dist release * "Z" for mew-status-update in summary mode. * Scan cache is not used in +draft. SAKAI Kiyotaka * Mark based composer at last!! * Mew doesn't scan mime directory at entring multipart mode. * draft's mark is integrated into encoding. So, mew-insert-file became much simle and beautiful. * We can handle ISO-8859-1 on Mule correctly. * mew-summary-reedit now can handle rfc822 part. * Many functions become virtual-mode ready. * mew-quit-hook 0.92 (06/18/95) mew release * User-customizable valuable mew-field-delete, mew-field-resent. * mew-part-get-params-member to avoid depending the order of parameters. This can survive even if "boundary" is not the first parameter of multipart. * Virtual mode is provided. Since buffer-name is not equal to folder name. (mew-summary-folder-name) is defined. Many functions are rewrited with it. * mew-summary-mark-collect2 for virtual mode. * mew-summary-{inc, scan}-filter deletes only "+". * When number of address reaches to mew-loop-depth, warning message is displayed to tell users the truncation of addresses. * Fcc: allows multiple values. * mew-header-{user, address}-collect became case-sensitive. I don't know any side effect occurs. * User options of mew-auto-add-content-type and mew-ask-cc. David C. Worenklein * Better value of mew-window-configuration to make lines of summary window odd * We should allow aliases that contain ".". "^\\([-\\+a-z0-9_]+\\):\\s-+\\(.*\\)$" -> "^\\([^:]+\\):\\s-+\\(.*\\)$" 0.91 (05/21/95) gnu.emacs.sources release * mew-summary-forward causes an error due to modification of mew-summary-display. set-buffer-modified is moved before return value to fix this problem. * regex of mew-summary-{inc,scan}-filter is changed from "^ *[0-9]+\\([ +]\\).*\n" into "^ *[0-9]+\\(.\\).*\n". * mark enhancement. Hiroshi ENOMOTO * mew-read is obsolete. 0.90 (05/08/95) mew-dist release * buffer-modified hack. * make mew-summary-save general for binary CT:. * mew-summary-multipart-delete for mew-summary-toggle-disp-msg. 0.89 (03/07/95) gnu.emacs.sources release * Menu bar enchancement SAKAI Kiyotaka * PEM functions are named as mew-pem-xxx. * Set terminal-more-break-insertion nil. * Patch to delete blank for .xface. YAMAMOTO Akishige * Set mail-header-separator "----" for ispell-message. * Position is changed that call mew-send-hook for ispell-message. * (split-window-vertically sumheight) -> (split-window nil sumheight) in mew-window-configure. SAKAI Kiyotaka * +language=en for PGP decode. Hiroshi ENOMOTO 0.88 (03/03/95) mew-dist release * +clearsig=on, +language=en for mew-pgp-encode-switch. * (featurep 'hilit19) for hilit-rehighlight-buffer. * If you make three mistakes for pass phrase, body isn't deleted and CT: is not inserted. * mew-alias-update. SAKAI Kiyotaka * mew-pgp-add-key and mew-terminal-emulater. * mew-refile is updated to 0.19 including mew-alist-max-length. Yoshinari NOMURA * mew-from-alist patch to avoid the name of nil. Keith Waclena * mew-mime-start-process checks the existence of program. * Add ^G to exit condition to mew-read-passwd to prevent everending loop. * PGP temrinology: "encode" == encrypt, sign, sign then verify * PGP temrinology: "decode" == decrypt, verify, decrypt then verify * Error handle for {pub,sec}ring.pgp not exist and userid not found. * mew-draft-check-whom Tetsuro Muranaga * "~/.xface" * mew-summary-reply-with-citation -> "A" * mew-summary-toggle-analysis -> "ESC a" * Special case support for mew-mime-localform-singlepart null CT: and CTE: 7bit! 0.87 (02/26/95) mew-dist release * X-Face: support. * Burst support. * hilit-rehighlight-buffer rather than redraw-display in mew-draft-mode to cease to left garbage. * erase-buffer before MIME analysis for PGP pass phase input. * Define mew-which to cease full path notation. (e.g. mew-prog-pgp = "pgp") * Call PGP asynchronously to send a pass phrase safely to prevent the ps or sps snoop. * Pretty Good Support for PGP. Now you can sign(C-cs), encrypt(C-ce), sign and encrypt(C-eb). You can re-enter your pass phrase. * mew-pgp-insert-public-key(C-cp). * Define mew-pgp-decrypt-letter(C-cd) to decrypt the message without CT: app/pgp. 0.86 (02/09/95) gnu.emacs.sources release * mew-command-key-sequence is defined to support C-u on draft mode. SAKAI Kiyotaka * set-marker at mew-summary-reedit SAKAI Kiyotaka * mew-draft-delete-content-type is defined. * condition-case for mew-summary-{inc, scan} 0.85 (02/08/95) mew release * Region hack for mew-summary-convert-local-charset and mew-pem-decrypt-letter. * Bug fix for auto-fill-{hook & function} again. * MIME composer hack to throw away swap CT:. * mew-draft-send-letter never undo now to corrent C-cC-c & n bug. * Add (mew-summary-multipart-delete) to mew-input-range for the case when parts is expanded in the bottom of the folder. * mew-summary-reply doesn't use full window if current Mew's windows have enough height. * mew-draft-header-domain switch the current candidate to the next one if the current one is conpleted. * mew-minibuffer-domain is defined. * mew-draft-header-{domain,alias} saves the window configuration. * Hacking mew-mime-syntax-singlepart to handle multipart/digest correctly. * Hacking mew-mime-localform-singlepart to handle multipart/digest correctly. * Add ".*" entry to mew-mime-content-type. * Reply address hack for ":;" Motonori NAKAMURA * A setmaker bug in mew-mime-decode is fixed. * mew-summary-convert-local-charset checks mew-message-citation. * "C-cC-h" in summary mode is mew-summary-convert-header. * "C-cC-d" -> "C-cC-h" in draft buffer. * mew[en|de]code's gzip64 bug fix. (Three processes are necessary.) * X-Gzip64 decode support. * mew-summary-reply never causes an error when From: doesn't exist. * Parameter of mew-draft-cite can be nil. Yoshinari NOMURA * mew-send-hook is defined. * mew-draft-auto-fill hack. Yoshinari NOMURA * Decription for message mode. * "q" of mew-message-mode-map -> "o", "h". * mew-file-append-p is defined. * Remote file completion support for composing annon-ftp of external-body. * mew-temp-minibuffer-message is defined. 0.84 (01/11/95) mew-dist release * a tiny patch to support mew-refile version 0.14. Yoshinari NOMURA * mew-mail-domain is taken from (car mew-mail-domain-list) Sakai Kiyotaka * Key binding change for mew-draft-header-domain into C-cC-i. * C-cC-l for mew-summary-convert-local-charset * C-cC-d for mew-pem-decrypt-letter * Minimum width is 80 for scan and inc. 0.83 (01/12/95) mew release * goto-char (point-max) when goto-folder. * Draft mode documentation hack for fill blanks. * mew-highlight-lines-use Maybe TABOO * mew-mime-content-type-multipart-list is defined to limit the range for the content-type of directory. * (this-command-keys) instead of last-command-char for mew-draft-keyswitch to support more than 2 key strokes. * mew-header-insert-from-file bug fix. Tomoharu Suzuki * Bug fix for insertion of messages in +drafts. Tomoharu Suzuki * mew-mail-domain-list and mew-draft-header-domain are defined. You can complete your domain after by "M-TAB" in draft header. * Bug of auto-fill-{hook & function} in mew-draft-mode is fixed. 0.82 (01/05/95) gnu.emacs.sources release * mew-mime-syntax adopts vector instead of list. * Speed hack for mew-fields-get-as-list . * Set end multipart in mew-mime-syntax for mew-summary-save. * Coding systam bug of mew-summary-save is fixed. * mew-summary-save bug that mishandles message/rfc822 is fixed. * mew-part-make regex bug fix for Emacs 19. 0.81 (12/23/94) gnu.emacs.sources release * mew-summary-[message-]-{up,down} goes to * mark, too. * When ((oldmsg = newmsg) & (oldpart != newpart) mew-summary-show displays the message. * mew-draft-insert-signature, at last! (Set mew-signature-file.) This function will be improved to handle multiple signature files. * Highlite patch. mew-xemacs.el is removed. Sakai Kiyotaka * File existence check in mew-summary-{show, display} Yoshinari NOMURA * Set mew-summary-buffer-disp-msg-current in mew-message-next-msg. Sakai Kiyotaka * mew-summary-reply takes care of Apparently-To:. * name change: canform -> localform. * Bug fix that CD: of CT: message is not displaied. * CD: decode bug fix. 0.80 (12/14/94) mew-dist release * Never ask "process marks?" if range is update at rescan. * The save hack to goto-folder. * Regex for mew-mail-address-list. Yoshinari NOMURA * Bug fix for mew-summary-{refile, display-{top,bottom}}. Yoshinari NOMURA * Bug fix for mew-alist-load concerned with null readable file. Yoshinari NOMURA * (call-interactively mew-summary-recenter) bug fix. Yoshinari NOMURA * Bug fix for mew-multi-{type,description} that cause an error if it is called on the bottom boundary. * mewencode, mewdecode, and mewcat are implemented. 0.79 (12/08/94) mew-dist release * mew-header-split is re-written with aref instead of string-match to fix a bug. * application/x-graph. Youki Kadobayashi * AF support. * Variable name change: mew-mule-charset-spool -> mew-mule-charset-local. 0.78 (12/08/94) mew relase * Mew MIME canonical form is changed to handle recuresive MIME message. So, MIME syntax analyzer is also drastically changed. * truncate-lines for summary-mode. * When mew-summary-cache-file is inserted, mew-summary-mode is always called. * MIME boundary includes preceding CRLF(yes, LF on UNIX). mew-summary-save and analyzer obey this spec. 0.77 (11/30/94) mew-dist release * Introduction of cache based scan. * mew-fib.el is created. * Tiny bug of mew-summary-quite is fixed. 0.76 (11/25/94) mew-dist release * mew-content-attr rather than mew-file-attr for encoding in mew-draft-make-multi[part] * C-cC-q (mew-kill-buffer) for watch buffer, summary mode, and mew-multi-find-file. mew-multi-find-new-file. * Refine mew-multi-find-file. * Refine mew-multi-external-body. * Define mew-multi-find-new-file. * mew-multi-remove and mew-multi-delete. 0.75 (11/22/94) mew release * run-hooks instead of funcall for mew-cite-hook. * Stop inserting "\n" after mew-cite-format. "\n" is appended to mew-cite-format instead. * The arguments of mew-summary-scan are changed for update. * Update bug fix in mew-summary-scan. * Mime multipart composing method is changed. It become statefull(mew-multi-syntax) to support Content-Description: (and Mark based composing in the near future). c, l, m, r are done. a, d, e, f are not yet. T, D are added. 0.74 (11/17/94) mew release * Demo strings are always centerized. * mew-eof-string display bug fix. * mew-cite-format is defined. * Exclusive control for inc, scan, exec, pack, and sort. * Introduce the concept of "update". * "?" searches on range of displayed messages. * Correct typos in mew-draft-mode-map. Sakai Kiyotaka * kill-buffer *mew-watch* at mew-summary-quit. 0.73 (10/19/94) gnu.emacs.sources release * Add mew-emacs19-p to mew-window-pop. Yoshiaki KASAHARA * defvar instead of setq for mew-path. Sakai Kiyotaka * Add bufferp to mew-mark-process-all-folders. Ishikawa Ichiro 0.72 (10/18/94) mew-dist release * mew-summary-cite will cite whole message including header if prefix is given(i.e. C-uC-cC-y). * mew-header-extract-addr extract a string from last <> pair. * mew-mark-process-all-folders is defined for kill-emacs-hook. * mew-loop-depth is defined for long field safety. * mew-summary-scroll-up's bug fix. Sakai Kiyotaka * mew-mime-decode-region's *critical* loop error is fixed to introduce mew-decode-marker. * CTE: quoted-printable for 8bit charset. * Bug fixes for XEmacs code. Sakai Kiyotaka * p/n on message buffer goes to previous/next part. Sakai Kiyotaka Following are contributed by Motonori NAKAMURA . * toggle summary only and summary & message when p/n on top/bottom. * "^-*$" instead of "^$" to show draft. * When replys your own message, never change To: and Cc:. * Never insert list:; into To: from To: list:;. * If body is empty on draft, ignore this body creating multipart. * Now we can find-file any file on drafts/mime/1/. 0.71 (10/15/94) mew-dist release * ISO-8859-1 support for Emacs 19. * mew-draft-charset-guess-letter guess charset only inbody excluding header. * Stops to user " " for boundary. " " is replaced by "_". * Some bugs of mew-summary-save are fixed. * Tiny bug of mew-multi-part-directory is fixed. KIZU takashi * Improvement of mew-summary-scroll-up. Sakai Kiyotaka * -f option is added when execute gzip or compress with "-d" to avoid uncompression failer due to a existence "basename" file. * Remove string-to-char-list from mew-base64-[en,de]code-string. * Define mew-y-or-n-p. * Non MIME analysis mode now clenas up message header. * Default value of mew-fcc is now nil. * XEmacs(Lucid Emacs) support. "Matthew Liggett" * Make fcc folder if not exist. * X-Mailer. 0.70 (10/04/94) mew-dist release * Support hilight in draft mode. See mew.dot.emacs. * mew-eof-string Sakai Kiyotaka * *IMPORTANT CHANGE* mew-summary-print "!" -> "#" * *IMPORTANT CHANGE* mew-summary-refile-again -> "!" * *IMPORTANT CHANGE* mew-summary-toggle-disp-msg "t" -> "v" to reserve to *t*hread * auto decryption for PGP's signed message. * Multipart composing in draft mode is depeloped to make flat multipart. This intends to support mark based PEM & PGP composing. * Comment out (kill-all-local-variables) in mew-draft-mode to avoid killing mew-draft-buffer-header 0.69 (09/27/94) mew release * Non MIME analysis mode is added. 0.68 (09/25/94) mew-dist release * Typo :: image/mpeg -> video/mpeg * mew-summary-search-mark never ask folder. * Support long alias whose lines are separated by comma. Sakai Kiyotaka * Delete recursive paretheses(comment) in header field. Sakai Kiyotaka * mew-mime-decode takes care of charset to convert codeset. * Ignore error that no content-* exists after boundary. * mhc by nomsun. 0.67 (08/30/94) gnu.emacs.sources release * Empty body mail bug is fixed. * Mule 1.1 PL04 byte-compile problem is fixed. * make-variable-buffer-local -> make-local-variable in mew-draft-mode. * mew-mime-reply is removed. 0.66 (08/26/94) mew-dist release * Header sort/insertion algorithm is improved. * kill-buffer on watch sentinel's bug is fixed. * Many patches are merged. * never quire japanese.el or european.el. 0.65 (08/25/94) mew-dist release * Many functions are refined to use while instead of recursion to speed up. * Make mew-summary-exec much faster. :) * mew-multi-find-file's bug fix. * mew-message-[mode-]hook are defined. * Mew menu is defined for Emacs 19. * mew-summary-{rescan, pack, sort} ask you to process mark when messages are marked. * mew-summary-scroll-{up, down} and mew-summary-prev-page check if cursol is on message or part. * run-hooks refine in mew-draft-mode. 0.64 (08/23/94) gnu.emacs.sources release * mew-base64-char256 now expects nil. * mew-draft-cite sets mark for C-xC-x. * Byte-compile check on Mule2. * mew-summary-show action for multipart on the end of summary buffer is refined. 0.63 (08/22/94) mew-dist release * mew-file-suffix and mew-mime-switch -> mew-mime-content-type * mew-mule-charset-alist and mew-charset-coding -> mew-mule-character-set * Whereas mew-assoc-match is obsolated, mew-assoc is defined. * mew-mule-charset-{spool, integrity} are defined. 0.62 (08/20/94) * Mode line of summary mode now contains how many mails are left. * Support 2 styles of dist. * mew-header-delete-at supports %. * mew-draft-kill may rm mimefolder. * mew-mime-start-process now uses temporary file rather than pipe to speed up. * Get elisp whois back to command whois for mew-whois. 0.61 (08/19/94) internal release * mew-field-visible and mew-field-invisible are defined. * quoted-printable decoding of header support. * gnus linking. 0.60 (08/18/94) internal release * one more mew-summary-multipart-delete's bug fix. 0.59 (08/17/94) internal release * mew-summary-redist is defined. * Initial PGP implementation. * A bug that cursol moves to the end of buffer when mew-summary-recenter-p is nil is fixed. * Coding system in draft mode is refined. 0.58 (08/17/94) internal release * mew-header-delete-ws[2]'s regex is fixed to support multi () pairs. * new mew-header-insert-from-cache supports multi header fields. * mew-watch-sentinel timing bug is slightly fixed. 0.57 (08/16/94) internal release * mew-draft-mode-map refine. * mew-draft-character-code-mule is defined. * backgroud sending is supported. * fields other than mew-message-visible-fields hides over the top. Type DEL to see them. 0.56 (08/15/94) internal release * auto-fill-function's typo is fixed. * Make mew independ on tiny-mime. Now original code for base64 decoding is merged. * Support for Nemacs is completely quited. * Define file-coding-system-for-read in mew-draft-mode. * Support multi-value of Reply-To: * mew-mail-address-list is defined. * condition-case for mew-mime-canform & mew-mime-syntax to read *all* messages including error format mail. * mew-summary-save now support message copy. 0.55 (07/19/94) gnu.emacs.sources release * mew-summary-refile moves to mew-refile.el so that nomsun can maitain. * Redisplay bug of mew-summary-refile is fixed. * auto-fill-hook for 18, auto-fill-function for 19. * Set -list for the first argument of pick to overwirte -sequence by shutton * "<" and ">" for summary mode. * mew-summary-recenter always keep the line center to avoid hidden mulipart problem. * Minor change for mew-set-environment to avoid calling mew-header-delete-ws with nil. * "t" of mew-summary-mode-map for mew-summary-toggle-disp-msg. 0.54 (07/15/94) gnu.emacs.sources release * (marker-position (mark-marker)) instead of (mark) in mew-draft-cite. (mark) causes error on Emacs 19 if no mark exists. (mark t) also causes error on Emacs 18;( * mew-draft-auto-fill is defined. * mew-input-address is refined. * EUC support for mew-insert-file. * (sit-for 0) for mew-summary-show. 0.53 (07/15/94) internal release * mew-url refine. * (and (boundp 'MULE) *noconv*)) for non-Mule in mew-insert-file * Quoted string that contains separotor can be splited correctly now. 0.52 (07/12/94) ip-connection release * Documentation for mew-summary-mode and mew-dtaft-mode. 0.51 (07/11/94) * define mew-delete-line * mew-minibuffer-alias bug fix * mew-insert-file cares kanji-flag or something. 0.50 (07/11/94) internal release * This version or later is called beta. * mew-summary-reply can hangle part. * N on last part goes to next message. * Alias is expaned when string ends "@". * Structure of mew-mime-syntax is changed to support content-* family. * kanji flag reset for mime decode. * regexp-quote for boundary 0.49 (07/07/94) mew-dist release * "|" for mew-summary-pipe-message * "y" for mew-summary-save. * mew-summary-refile supports part. * mew-summary-print supports part. * mew-summary-rmm supports part. * mew-summary-undo-all is defined. * mew-summary-refile reports when the message is marked as refile. * mew-summary-search-mark is defined. * mew-summary-search can handle complicated pick syntax. * last-command-char instead of last-input-char for emacs 19. * Reduce warning at batch-byte-compile. * native check for message :) * MIME canonical form creactor's case-sensitive bug fix. * mew-summary-goto-folder uses mew-window-configure when folder exists. 0.48 (07/04/94) internal release * concat rather than expand-file-name because its spec was changed on 19. * mew-message-citation bug fix. * mew-summary-show-direction is defined; 'up 'down 'next 'stop * N and P go to next message in part semantics. * Prefix argument support for mew, mew-read. * Optional argument *notforce* for mew-summary-display for mew-summary-display as a command and mew-summary-refile. * mew-summary-{inc, refile, rmm} call mew-summary-multipart-delete. * mew-draft-make-mime kill mark of mew-draft-buffer-multipart. * mew-draft-mode-map redefine. * mew-[summary-]send refine. 0.47 (07/01/94) mew-dist release * alias expantion support. * comment of header field (i.e. (.*)) is now to be deleted. * multipart remain at mew-summary-exec bug fix. * mew-summary-message-{up, down} are defined. * many functions are translated into macros. * keep-lines for inc and scan. * mew-draft-keyswitch is made to be general with mew-draft-null-function 0.46 (07/01/94) internal release * Multi mode is integrated into Draft mode. So, many functions are drastically changed. mew-draft-keyswicth is defined. 0.45 (06/30/94) internal release * Mime mode is integrated into Summary mode. So, many functions are drastically changed. * Current message mark "+" is deleted on inc and scan. * * mew-summary-buffer-direction is defined. 0.44 (06/28/94) mew-dist release * mew-summary-forward uses multi mode. So, mew-draft-forward and mew-default-charset are obsolated. * Refile support folders that contains subfolders. * mew-insert-file cares kanji-fileio-code for Nemacs. * mew-summary-untar into mew-summary-uudecode. * mew-summary-edit into mew-summary-reedit. * Some messages are changed. * mew-draft-cite widen message buffer with save-restriction. * Super cite support. * "f" of mew-multi-mode-map double booking bug fix. * mew-summary-mode-hook is defined. mew-{mime,multi}-mode-hook are not defined 'cause mime and multi mode will be integrated to summary and draft mode. 0.43 (06/24/94) mew-dist release * mew-field-get-{line,value} contains "^-*"-don't-care and return nil bugs in certain cases. They are fixed. 0.42 (06/24/94) mew-dist release * RET of summary mode for mew-summary-scroll-up * ESC RET of summary mode for mew-summary-scroll-down * M-l instead of C-l of summary mode for mew-summary-recenter 0.41 (06/23/94) internal release * mew-field-get-{line,value} support multiple fields. * mime decode for header of message/rfc822 * mew-multi-mode-map "f" for mew-multi-find-file * mew-multi-mode-map "q" for mew-multi-goto-draft * mew-multi-mode-map "\C-c\C-m" for mew-multi-make-multi * mew-window-{stack,push,pop} are defined. * unwind-protect and save-buffer bug at forward and etc is fixed. * mew-header-extract-addr can now extract address that doesn't contain @ mark. * mew-refile-pair bug fix. * mew-draft-kill's in multi buffer kill bug fix. * mew-summary-exec moves point to the nearest message. 0.40 (06/20/94) internal release * multi mode refine. 0.39 (06/20/94) internal release * confirmation for mew-summary-{sort, untar, unshar, quit} * M-t for mew-summary-untar * M-s for mew-summary-unshar * O for mew-summary-pack * initial version of multi mode. * C-l for mew-summary-recenter * mew-draft-to-mime * C-u M-x mew execute mew-summary-rescan * mew-refile-pair downcases folders. * mew-mime-display-part kills mark for citation. 0.38 (06/17/94) internal release * mew-summary-print widens the message and ask. * mew-mime-print 0.38 (06/17/94) internal release * MIME canonical form creator refine. * mew-mime-decode[-region] 0.37 (06/17/94) * mew-summary-{unshar,untar} * mew-mime-store(still buggy) * mew-mime-save * mew-mime-reply * mew-summary-quit 0.36 (06/15/94) internal release * mew-mime-switch macro make type downcase. * mew-mime-show calls mew-mime-display next? Do you like recuresive like mew-mime-show-next? * mew-window-configure bug fix. * mew-summary-search now take care of date completion. * mew-mime-display[-next,-prev] * mew-mime-{call,start}-process 0.35 (06/15/94) internal release * j for mew-summary-jump-message * reply and forward make sure whether message exists. * multi-forward makes sure whether mark exists. * mew-input-* are defined. * function names are drastically changed. * kill-region is replaced with delete-region for no side effect. * MIME decode and enjoy-part display messages. * no content-type's region was started with null line. Now after null line. * draft-send-letter's undo bug fix * draft-make-mime force goto-char to content-type * no subject, no more bug. 0.34 (06/13/94) internal release * mime mode functions are drastically modified. * mew-summary-print * mew.el is splited into mew.el, mew-refile.el, mew-ftp.el, and mew-pem.el. * exclusive process excuting for sort and pack. * mew-mule-charset-alist, mew-default-charset are defined. * mew-draft-forward's boundary is refined. * mew-current-* function is simplified. * yet another collecting folder list algorithm refine. 0.33 (06/13/94) internal release * process I/O charset for inc, scan, send, pick * Even if mew-buffer-mime is killed, it is now setted to mime mode. * mew-summary-searh 0.32 (06/09/94) internal release * collecting folder list algorithm refine. * VM like refile rule is supported(nomsun). * cache attribute change (nomsun) * ange-ftp linking (m-sakura) * kanji code setting for inc & scan 0.31 (06/09/94) mew-dist release * point move to bottom of buffer on "x". * string-match instead of string= for mime version. 0.30 (06/07/94) internal release * mew-summary-edit never choose new draft in +drafts. * inc and scan refine. Fix scan: no messages. * scan now takes ranges * can undo citation * (unwind-protect save-buffer) so that draft never already exists * reply header refine. i.e. Reply-To:, From:, To:, Cc:. 0.29 (06/07/94) internal release * (run-hooks 'text-mode-hook) in draft mode. * mew-summary-sort, mew-summary-edit, mew-summary-pack * refile ordering bug fix 0.28 (06/07/94) internal release * mew-summary-show recenter bug fix. * mew-mail-domain is now "" instead of nil. * yet another mew-reply-to setting bug fix. * "w" of mew-summary-mode-map is now mew-summary-send instead of mew-send. * If mew-visit-next-message is nil, never move to next message even at the end of buffer. * "*", N, P for mew-mark-back. I'll be back! * default-directory change in draft mode. * text-mode-syntax-table in draft mode. * mew-from is defined. * exec message. 0.27 (06/06/94) internal release * mew-reply-to setting bug fix. * draft-mode paragraph arrange for M-q. * citation tag is cited from cache. This enables a single part citation. * mew-summary-re is defined for xxxxx message number. * bug that message scrolls at refile is fixed. 0.26 (06/06/94) internal release * mew-match is defined. * forwarding adopts multipart/digest instead of message/rfc822 to support multi message forwarding. * multi message forwarding. 0.25 (06/03/94) * mew-summary-display is defined. So, reply, forward, refile, n, and p use this function. * current-window-configuration bug fix. * page-delimiter works now(default is ^^L). * rmm and refile call mew-summary-display-next. * mew-draft-header is defined. Fcc: and Reply-To: are ignored if corresponding valuable is nil. * "w" for mew-send in summary mode. * syntax of "Draft-Folder: +drafts" in mh_profile is allowed. * undo calls mew-window-configure. 0.24 (06/01/94) * reply header setting bug fix (space is needed) * define mew-draft-mode-hook * bootstrap error function refine * boundary is now case sensitive * multi-lingual charset guess for Mule 0.23 (05/31/94) internal release * mew-send & mew-read check whether mew is already executing. * execulusive marking and undo. * draft buffer name looks like +drafts/num. * demo becomes user option * reply-to created from mew-mail-domain * simple describe mode 0.22 (05/30/94) * current window configuration save for reply and send * save draft when buffer is created for execusive draft creation * side effect of previous mark for citation is fixed * mew-path is used to distinguish whether mew is running. * initial forward function (of course MIME encapsulation) 0.21 (05/26/94) internal release * citation is modified to copy from message buffer * rmm bug fix 0.20 (05/24/94) * initial composer and draft mode functions sign, encryption, make mime, send letter, citation, and kill draft * mime decoder refine 0.19 (05/23/94) internal release * set part nil when mime quit (to read same part when get back from summary mode) * define default from directory for refile folder guess 0.18 (05/19/94) internal release * Mew means to "Message interface to Emacs Window" for NetNews support in the future * MIME subprocess support for Nemacs 0.17 (05/18/94) internal release * Mail/.folders for quick start * ignore folders prefix list support * recursive folders is now default 0.16 (05/17/94) internal release * 1 message deleting bug fix 0.15 (05/09/94) internal release * refile (not exclusive marking yet) * delete * mark exec * cache validation 0.10 (05/05/94) internal release * perfect MIME viewer * asynchronous inc * good refile guess algorithm form folders list ** draft-ietf-pem-mime-alternative-00.txt is obsolete but mew continue to support because mew needs tag in mail header to check old style PEM message. ** draft-ietf-pem-mime-04.txt support someday. 0.03 (04/27/94) internal release * asynchronous scan (not inc yet) * dynamic window configuration * press SPC to select and scroll message * PEM decription (not merged encryption from mhpem yet) * LRU cache message algorithm (not validation yet) * sorted header fields * Mew means "Mail interface to Emacs Window" 0.00 (03/22/94) * initial version * boot strap * Mew means "MH interface to Emacs from WIDE" --End of file kazu-yamamoto-Mew-ff9c41b/00changes.1000066400000000000000000002326621256455547000174200ustar00rootroot00000000000000 1.94 (99/09/05) mew-release release 1.94pre4 (99/09/03) mew-dist release * To: and Cc: are preserved if fromme. * A patch for contrib/mew-virtual-thread.el. Hideyuki SHIRAI * mew-cache-prefetch-remote. Hideyuki SHIRAI 1.94pre3 (99/09/01) mew-dist release * A patch for xcite.el. Hideyuki SHIRAI * A patch to contrib/mew-gnus.el. Makoto Fujiwara * IMAP caching. Hideyuki SHIRAI 1.94pre2 (99/08/31) mew-dist release * Enhancing imget error check. * Set mew-config-list to mew-config-default if there is no case. * Making Mew limit-safe. * Killing mew-buffer-hello in mew-init. * mew-auto-get can be set by the hooks. Xin-Zhi Zheng * New contrib/mew-sol.el. sen_ml * A message fix. Han Yeongsu * A patch for contrib/mew-guess.el. OBATA Noboru * Highlight References when cite. OBATA Noboru 1.94pre1 (99/08/30) mew-release release * Checking quoted-string in comment. * A patch for contrib/mew-cite-color.el. Hideyuki SHIRAI 1.94b56 (99/08/27) mew-dist release * A patch for contrib/mew-virtual-thread.el. Hideyuki SHIRAI * A bug fix for reedit. * Brushing up header encoding. * Insert "\n" if the header separator doesn't locate in the begging of line. Koga Youichirou * Defined mew-env-hook. * make install-etc. Ninomiya Hideyuki * A bug fix for PGP verification. 1.94b55 (99/08/26) mew-dist release * A bug fix for "r" and "E". * New contrib/mew-sol.el. sen_ml * Checking whether or not mew-mail-domain-list is nil at boot time. * Making Virtual mode more generic. Hideyuki SHIRAI * A fix for mew-passwd-reset. "Takashi P.KATOH" * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI 1.94b54 (99/08/25) mew-dist release * A bug fix for the save cache. * A bug fix for mew-summary-decode-pgp. Hideyuki SHIRAI * Patches to make Mew IMAP-friendly. Hideyuki SHIRAI * Making save safer. * A bug fix for mew-field-delete-common. Hideyuki SHIRAI * A bug fix for mew-field-delete-for-reediting. SAKAI Kiyotaka * Fixes for Makefile. Ninomiya Hideyuki 1.94b53 (99/08/24) mew-dist release * A bug fix for C-cC-p. * A fix for auto-fill vs mew-draft-mode-hook. SAKAI Kiyotaka * Defined mew-passwd-reset-timer. * Making "s" and "B" safer. * Defined mew-insert-address-list. * Fold header hack. * info/Makefile. * Defined mew-field-delete-common. * mew-field-delete -> mew-field-delete-for-reediting. * mew-field-delete-for-resend -> mew-field-delete-for-resending. * Fixes for cs and point of mew-summary-im-start. Hideyuki SHIRAI * Remote folder check in dsts. Hideyuki SHIRAI * Error message of removing quote for mew-addrbook-register. Han Yeongsu 1.94b52 (99/08/19) mew-dist release * Type "." if the "Too long header" error occurs. * Make info hack. Shun-ichi TAHARA * mew-field-delete-for-saving. Xin-Zhi Zheng * Removing virtual mode when "Q". Hideyuki SHIRAI 1.94b51 (99/08/18) mew-dist release * Several IMAP-friendly stuffs. (e.g.mew-summary-imap-cache, mew-summary-imap-nocache-folders) Hideyuki SHIRAI * Defined mew-draft-mode-newdraft-hook and mew-draft-mode-reedit-hook. * contrib/mew-sol.el. sen_ml * Finding From: address from PGP verification messages. * mew-summary-im-filter{1,2}. * Set the current buffer for mew-summary-start-im. * dup1 -> dup-msgid, dup2 -> dup-subj-msgid. * Draft menu update. "Takashi P.KATOH" * A patch for contrib/mew-guess.el. OBATA Noboru 1.94b50 (99/08/16) mew-dist release * "?" supports imgrep's dupchecktarget. dup1 -> --dupchecktarget=message-id dup2 -> --dupchecktarget=message-id+subject * contrib/mew-guess.el. Shun-ichi GOTO OBATA Noboru * A fix for a bad macro. SAKAI Kiyotaka 1.94b49 (99/08/16) mew-dist release * C-cC-pC-d in Draft can set privacy services of C-cC-m. * Support for imget's assoc. (Set mew-use-imget-assoc to t) 1.94b48 (99/08/13) mew-dist release * The PGP cache mechanism is generalized. You can cache passwords for imget. Set mew-use-cached-passwd to t. Good-bye, impwagent. * Deleted mew-addrbook-downcase-address. Defined mew-assoc-member-case-equal instead. * Fixed the byte-compile vs XEmacs problem. * Always set mew-decode-syntax for reply. * A patch for mew-field-spec vs visible. Shuichi KITAGUCHI 1.94b47 (99/07/31) mew-dist release * Code for <> mew-header-encode-addr. * Document fixes for Draft mode. 1.94b46 (99/07/30) mew-dist release * New contrib/{mew-mailto,rfc2368}.el sen_ml * A patch for contrib/mew-browse.el. Hideyuki SHIRAI * Makefile fix. * Removing mew.jis.info-* from Makefile. * A tiny fix for mew-draft.el. Hideyuki SHIRAI * Fix mew-cs-pick in mew-win32.el. Hideyuki SHIRAI 1.94b45 (99/07/30) mew-dist release * Existence check for PGP. * Info were updated. * Function explanations were updated. 1.94b44 (99/07/26) mew-dist release * Bug avoidance for XEmacs's read-only property. * A bug fix for mew-ask-subject vs. C-g. TAKAHASHI Masafumi * Defined mew-addrbook-switch. * A bug fix for undo in Draft. * C-cC-v -> mew-pgp-select. * Enabling timer on Meadow. Hideyuki SHIRAI 1.94b43 (99/07/23) mew-dist release * Toggling mew-protect-privacy-*. (C-cC-p{C-a,C-e} in Draft) * Key assignments for FIB were changed. * PGP selection mechanism. * Ignoring the protocol/micalg parameter. * The passphrase prompt tells PGP version. * A patch for contrib/mew-gnus.el. Koji Arai * Resolved duplicated folders in .folders. * Used "function" for mapcar. * Now attachments includes the preceding \n. * X-Mew: -> chocolate. Bag PGP sign -> red. * Defined mew-use-timer. * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI * Added mew-make-message-hook. * C-cC-p checks the PGP boundaries in a message file unless they exist in Message mode. * A patch for mew-summary-goto-folder-subr. Hideyuki SHIRAI * mew-refile-auto-refile-confirm is default to nil. * Property code was revised. * Putting read-only after attachments. SAKAI Kiyotaka * Bug fixes for C-cC-r in Draft KOIE Hidetaka 1.94b42 (99/07/15) mew-dist release * mew-input-passwd ignores control characters. * mew-pgp-cached-passphrase is clear when PGP fails. * A bug fix for wrong passphrase of PGP 5. * "." decrypts undecrypted messages. * Brushed up prefetch function calls * Adding cancel-timer to mew-pgp-clean-up. 1.94b41 (99/07/15) mew-dist release * C-cC-p in Summary to verify/decrypt old-fashioned PGP messages. * C-cC-r in Draft to mew-pgp-encrypt-sign-letter. * A new contrib/mew-virtual-thread.el. Hideyuki SHIRAI * A new contrib/mew-nmz.el. Hideyuki SHIRAI * (auto-save-mode nil) in Draft mode so that the ".save-*" files don't remain. * Insert (sit-for 0 1) into mew-pgp-passphrase to fix a timing problem. * PGP-clean-up when quitting. * Made mew-header-decode-regex more specific. * Removed mew-toolbar-clean-up. Used redraw-frame instead. * Put save-buffer into mew-draft-kill. 1.94b40 (99/07/14) mew-dist release * A timeout mechanism of PGP passphrase. * A caching mechanism of PGP passphrase. 1.94b39 (99/07/13) mew-dist release * Automatic PGP is supported. See mew-protect-privacy-{always,encrypted}{,-type}. * Fixing the nconc vs. mew-folder-list problem. * s/-geom/-geometry/g MUKOUCHI Takafumi * A bug fix for prefetch. * A bug fix for refile vs Japanese. * mew-cache is now in the (new ... old) order to make the code simpler. 1.94b38 (99/07/13) mew-dist release * (set-buffer-modified-p nil) for mew-summary-search-mark. * Defined mew-addrbook-override-by-newone. * Bug fixes for mew-addrbook-setup. * Defined mew-buffer-draft-clean-up. Removing Mew's buffers very carefully when quit. * Brushing up setcdr and nconc. * An appropriate attachdir is removed when entering Draft mode. * mew-mime-compose-folder-delete was removed. * A bug fix for mew-window-configure, where the height of Summary mode is not odd... (Why does this bug still exist? sigh.) * A bug fix for mew-summary-refile-report. Yoshinari NOMURA * Added get-buffer-create to mew-pop-to-buffer. * A patch of mew-summary-setup-mode-line for Virtual mode. Hideyuki SHIRAI * contrib/mew-toolbar-frame.el. Shun-ichi TAHARA * A patch for the problem of mew-draft-mode-hook vs mew-summary-reply-with-citation. Ninomiya Hideyuki * A new contrib/mew-refile-view.el. "Takashi P.KATOH" * A patch for cases and password. Shuichi KITAGUCHI 1.94b37 (99/06/28) mew-dist release * Learning short name in Draft only when mew-addrbook-append-domain-p is t. * A bug fix for Content-* for Multipart/Encrypted. * Removing the mew-buffer-whom garbage. * Adding 1999 to copyrights. * Moved the definition of mew-coding-system-p to mew-mule*.el for XEmacs without the Mule feature. * Use read-passwd if bound. 1.94b36 (99/06/25) mew-dist release * mew-split can handle quote open and quote close independently. * Shortname expanding hack. See mew-addrbook-unexpand-regex and mew-addrbook-append-domain-p. * A bug fix for "mr". * s/set-keymap-parent/mew-set-keymap-parent/g. 1.94b35 (99/06/24) mew-dist release * Visual Addrbook registration. * save-buffer after make-message. * Support install-info. (KOSEKI Yoshinori) * If ctext-unix is bounded, use ctext-unix for mew-cs-virtual instead of ctext. * Decoding header even if mew-decode-DECODE is nil. Only when over the limit, decoding is suppressed. This fix the bug of mew-summary-save for a message whose header is not well ordered. * Since the current mew-summary-save can store part 1 of the message, text/plain with CDP: for part 1 is displayed with its header. This resolves the bug of a message whose header has CDP:. * contrib/mew-virtual-thread.el "Hideyuki SHIRAI" * A patch for mew-win32.el. Shuichi Kitaguchi * A bug fix for "E". * A patch for mew-refile-guess-by-alist2. Yoshinari NOMURA 1.94b34 (99/06/22) mew-dist release * A bug fix for the C-cC-l vs C-y (in Draft) problem. * A bug fix for "r". * Ad-hoc fix for broken Solaris /bin/mail. * Removing append. Use setcdr, instead. * C-cC-a -> adding aliases. C-uC-cC-a -> adding personal info. * mew-addrstr-canonicalize-address does not append mew-mail-domain if addresses end with ";". * mew-header-arrange hack for the case of no visible fields. * mew-draft-cite hack for xcite. 1.94b33 (99/06/09) mew-dist release * Use identity instead of (lambda (x) x). * Standardized the usage of replace-math. * C-cC-a for mew-summary-alias-add. * Unified mew-input-address{,2}. * Removing mew-header-insert-ascii-{text,addr}. Defined mew-header-fold-region, instead. * Patches for RFC 2047 decoding. Shun-ichi GOTO * Bug fixes for mew-header-arrange. * Removed C-cC-w in Draft mode. Aliases are now expanded before sending. * Sophisticated mew-draft-{make-message,send-letter}. * A patch for mew-refile.el. Yoshinari NOMURA * A bug fix for buffer-read-only in Summary mode. * Defined mew-addrstr-canonicalize-address. All function concerned with addresses should use this. * A bug fix for ",". 1.94b32 (99/06/04) mew-dist release * A bug fix for mew-header-set. * One patch for contrib/mew-cite-color.el. * A bug fix for mew-mode-input-file-name. Hideyuki SHIRAI * Removed erase-buffer. Used mew-erase-buffer instead. * Defined mew-elet. Removed buffer-read-only and inhibit-read-only. * A bug fix * mew-refile-auto-refile-confirm. Yoshinari NOMURA * Brushing up resend. 1.94b31 (99/06/03) mew-dist release * Info updates. * A bug fix for wrong Subject: on forwarding. SAKAI Kiyotaka * A bug fix for Aliases vs NULL. * The markers for header and attachments region were removed. Resolved the insert-before-markers dilemmas. * Functions for file attributes are well-organized. * Cashing for save. * mew-refile.el. See info. Yoshinari NOMURA * A bug fix for mew-summary-folder-name. Hideyuki SHIRAI 1.94b30 (99/05/28) mew-dist release * mew-summary-burst is completely re-written. * mew-summary-save is completely re-written. * Resend is now like reedit. * "D" in Summary removes all messages in +trash. * The default range of +trash became "update". * mew-addrstr-extract-user removes Notes domain parts. * mew-refile-guess-by-default now makes use of e-mail domain. 1.94b29 (99/05/20) mew-dist release * mew-cs-{dummy,binary,text-for-read,text-for-write} * Diff for contrib/mew-browse.el. Hideyuki SHIRAI * mew-toolbar-clean-up. 1.94b28 (99/05/20) mew-dist release * contrib/mew-browse.el Shuichi Kitaguchi * Info updates: * A bug fix for mew-draft-header. 1.94b27 (99/05/19) mew-dist release * A bug fix for C-u a vs insert-before-markers. * Charset is displayed not only for text/plain but also for text/*. * Added "nil t" to re-search-*. * "range" is asked only when "s" is called interactively. 1.94b26 (99/05/17) mew-dist release * SPC is allowed after "," in Addrbook * Anonymous recipients and PGP. * Info updates. * Defined mew-use-nickname instead of mew-use-petname. * Putting readonly on "\n" after "----". * Some hacks for the RFC 2047 encoding. * mew-end-of-{message,part}-string is implemented by overlay. So, this feature is now available on XEmacs. * Address selection of mew-summary-reply for To: and Cc: was brushed up. * Defined mew-draft-header-insert-address and mew-header-parse-address-list2. * mew-column was buggy. Used current-column instead. * Demonstration is skipped if Emacs is executed without X. * Removed mew-{alias,addrbook}-comment-string. Defined mew-{alias,addrbook}-comment-regex, instead. "#" is comment. ";" is comment only if it locates on the beginning of lines. * Check no-dir before mew-buffers-init. SAKAI Kiyotaka * An alternative implementation for mew-end-of-message-string. * Use 'backspace for define-key on XEmacs. * Moved (make-local-variable 'mail-header-separator) to mew-draft-mode(). * Some contrib/{bbdb-*,*mail*}. sen_ml * New contrib/mew-nmz.el. Hideyuki SHIRAI 1.94b25 (99/04/26) mew-dist release * New contrib/00readme-namazu.jis. Hideyuki SHIRAI * Defined mew-use-config-imget-for-draft. * Clearing the undo list in Draft mode. * mew-namazu.el -> mew-nmz.el. Hideyuki SHIRAI * Defined mew-user-agent-compose. Hideyuki SHIRAI * Defined mew-unhighlight-header-region. * Require highlight-headers instead of autoload. Added mew-which-el. 1.94b24 (99/04/22) mew-dist release * Deleting unnecessary null lines in a header when composed. * One bug fix for mew-summary-display-asis. OBATA Noboru . * Defined mew-use-text/enriched. On Emacs 19/Mule 2.3, this is nil by default. * Made mode-line better. * mew-mule-version -> mew-mule-ver. * Unset the enriched submode. * A bug fix for "f". * Fixed the refile vs next-encrypted message problem. * Use message instead of error when decoding is quitted. kyota (Kyotaro HORIGUCHI) 1.94b23 (99/04/18) mew-dist release * It appeared that changing mew-cs-draft to ctext is a bad idea. So, got it back to ss2 and resolved the Latin-1 problem with ad-hoc manner. 1.94b22 (99/04/16) mew-dist release * Fixed the property problems in Draft mode. * Support text/enriched. Read only. * 7bit-ss2 -> ctext. (to fix the Latin-1 problem on Emacs 20.3) * clean and rm refer to mew-use-immv. * A used entry comes to the top of mew-alias-auto-alist anyway. * Yet another bug fix for mew-summary-save. * Fixed the mc-flag vs. APEL problem. * A patch for mew-cite-color. Hideyuki SHIRAI * Three patches for mew-namazu.el. Hideyuki SHIRAI * The scan sentinel vs save-excursion patch. Yoshinari NOMURA * mew-summary-show-direction is 'next by default. * mew-use-folders-file-p is t by default. 1.94b21 (99/04/05) mew-dist release * ctext-unix -> ctext. * A bug fix for refile on part. * A bug fix for X-Face:. * Several patches for contrib/*. Hideyuki SHIRAI * Mark bug fix. * One more bug fix for References: creation. * A bug fix for mew-summary-display-after. 1.94b20 (99/04/02) mew-dist release * mew-summary-display families are drastically simplified. * A bug fix for References creation. mew-gnus.el is also fixed. SAKAI Kiyotaka * Cache prefetch is quitted if the message contains Multipart/Encrypted. * mew-summary-display-asis is assigned to ",". * Throw away M-a mechanism. Thanks to the cache prefetch, non-MIME analysis becomes meaningless. Use "," if you want to see the raw message. * A bug fix for mew-addrbook-alias-get1. * A bug fix for mew-chop. * mew-addrbook-clean-up before mew-config-clean-up. Murata Takashi * Changed face "t" to "'default" for XEmacs. * Defined mew-prog-text/html-arg-hack. Enjoy: (setq mew-prog-text/html-arg-hack 'mew-prog-text/html-netscape-remote) 1.94b19 (99/04/01) mew-dist release * Used intern-soft to prevent warnings. * Generic mechanism to check existence of multiple Addrbook files. * Deleted file-name-coding-system mew-cs-noconv from mew-summary-scan-body. * A bug fix for mew-mime-message/rfc822 to set end-of-header correctly. * X-Face: entry to mew-field-database. * A bug fix for mew-summary-auto-refile. Hideyuki SHIRAI * A bug fix for mew-summary-cache-prefetch in the case that messages don't exist. 1.94b18 (99/03/31) mew-dist release * Visuality of Content-* is configurable by mew-field-spec. * Bug fixes for cache prefetch vs too large. * Simplified code for IMAP and NetNews. * Defined mew-use-immv. * Set mode hack. Takuro Horikawa * A bug fix for mew-refile.el. Yoshinari NOMURA * mew-{summary,draft}-preserve-dir. * Quoting hack for Addrbook. Atsushi Nemoto * New mew-namazu.el. Hideyuki SHIRAI 1.94b17 (99/03/30) * Re-defining CS mechanism for pick and virtual mode. * Defined mew-char-width for pure XEmacs. * A bug fix for X-face. * Yet another bug fix for mew-summary-save. * Removing append from mew-refile.el. Yoshinari NOMURA * contrib/mew-namazu.el. Hideyuki SHIRAI Takeshi ITOH * contrib/mew-cite-color.el. Hideyuki SHIRAI 1.94b16 (99/03/29) * Cache prefetch!!! * Set mew-cs-virtual to ctext. * mew-draft-keyswitch for M-C-I. Hideyuki SHIRAI * One more bug fix for mew-summary-save. * A bug fix for mew-field-delete-for-forwarding. Xin-Zhi Zheng * Defined mew-addrbook-downcase-address. 1.94b15 (99/03/23) mew-dist release * C-i and M-C-i in header. ka[C-i] -> kazu kazu[C-i] -> kazu kazu@[C-i] -> kazu kazu[C-i] -> kazu kazu[M-C-i] -> Kazu Yamamoto * Separating refiling and aliases. Created mew-addrbook.el. Now, addresses on To: and/or Cc: in Draft mode is automatically learned. * Refile for NetNews. (Need to hack immv) SAKAI Kiyotaka * Defined mew-field-delete-for-forwarding. * A bug fix for "E" in the case of +draft. SAKAI Kiyotaka 1.94b14 (99/03/19) mew-dist release * Bug fix for E in the case of multipart. * mew-use-symbolic-link-for-forwarding is defined. * Brush up my addresses stuff. * mew-summary-save certainly stores the original message if the target is message/rfc822. * mew-complete displays how to expand explicitly. * browse-url-or-mew update. Shuichi Kitaguchi * Supporting GNU Emacs on Windows NT and Windows 95/98. Shuichi Kitaguchi 1.94b13 (99/03/10) mew-dist release * PDF support. KOIE Hidetaka * CaseConfigInbox patch. Kazuteru Okahashi * Mew.png is read as binary on XEmacs. (against dired's side effect.) * Suspend vs buffer patch. Ken-ichi Yamamoto * euc-korea -> euc-kr. Shun-ichi TAHARA * More Chinese support: Big5, GB2312, HZ. * Synchronizing mew-gnu.el to Mew's references creation. Makoto MATSUSHITA * Bug fixes for mew-pgp-verify-check. * Eliminating bin/configure. SAKAI Kiyotaka * New mew-fib.el. Yoshinari NOMURA 1.94b12 (99/03/02) mew-dist release * Defined mew-attach-link-message and assigned to "y". * Ensuring the first argument of nthcdr() is non-negative. SAKAI Kiyotaka * A patch for mew-inbox-folder(). Makoto MATSUSHITA * A patch for mew-caesar.el. Hideyuki SHIRAI * A typo fix for mew-join. SAKAI Kiyotaka 1.94b11 (99/03/01) mew-dist release * Adding PGP key is now conformant to C-cC-e convention. * Some function concerned with string were re-written for memory efficiency. 1.94b10 (99/02/27) mew-dist release * If a message size is larger than mew-file-max-size, Mew insert only mew-file-max-size byte of the file into Message buffer. * A patch to prevent infinite loop when typing "m r RET". KOIE Hidetaka * A patch for mew-fib.el so that contrib/mew-ff.el works. OBATA Noboru * Introducing mew-sort-default-key-alist. Toru YANO * One patch for mew-gnus.el. SAKAI Kiyotaka * "i" selects inbox name according to config cases. The mew-inbox-folder and mew-inbox-folders function are defined. 1.94b9 (99/02/25 Happy Birthday!) mew-dist release * mew-overlay-p for XEmacs sees if the overlay is alive or not. * Replaced th-tis620 to tis620 to get along with both Emacs 20.3 and XEmacs 21.0. XEmacs 20.4 provides an empty thai.el so tis620 is not available on that XEmacs. * Set an appropriate error message for GNUPG. * Bug fix for mew-pgp-encrypt-check. (A very careless mistake, sorry.) * Re-wrote References: creation when reply. And defined mew-references-max-count. * mew-refile patch. Yoshinari NOMURA * mew-alias-comment-characters. * contrib/mew-ff.el. OBATA Noboru 1.94b8 (99/02/23) mew-dist release * Now you can pick on XEmacs. * Sanity hack for MIME parameter. Shun-ichi GOTO * Invalid public key handle for PGP 5.x. * C-u a now replys to From: only. Shun-ichi GOTO * Coding system hack for undo in Draft mode. Shun-ichi GOTO * Deleting overlays in Message mode and in Draft mode. * Divided mew-version. Ken-ichi Yamamoto 1.94b7 (99/02/17) mew-dist release * A bug fix for the +draft vs. "E" problem. * Defined mew-set-keymap-parent for mew-draft-body-map. Shun-ichi GOTO SAKAI Kiyotaka Kennichi Yamamoto * A fix for mew-pgp-set-version. Hideyuki SHIRAI Shun-ichi GOTO * Fixes for mew-prog-pgpk-ext-arg. Chifumi Hayashi MIYAJIMA Mitsuharu * Set mew-highlight-url-max-size to 10000. SAKAI Kiyotaka * Even if the number of field lines is 1 and its length is over max, no folding for 'unstruct field in ASCII only. * Deleted "\t" from mew-draft-body-map. Shun-ichi GOTO 1.94b6 (99/02/15) mew-dist release * If an error occurs in PGP/MIME creation, Mew automatically does undo. * RFC 2231, MIME parameter extensions. * Parameter insertion is sophisticated. i.e. folding and quoting * More error handling on RFC 2047 header encoding. 1.94b5 (99/02/13) mew-dist release * inhibit-read-only for the entire mew-draft-make-header. * Check the string "Pretty Good Privacy(tm) 2" for PGP 2.3. * Auto flush after scan. Shuichi Kitaguchi * mew-header-insert-ascii-addr makes use of the last white space. * Explicitly causes an error if non-ASCII characters are contained in quoted-string in the header. 1.94b4 (99/02/12) mew-dist release * MIME-Version: is inserted when C-c C-m. * BIG5 support (not tested). * GNUPG support. * Several bugs of RFC 2047 are fixed. 1.94b3 (99/02/08) mew-dist release * Multiple burst. (M-b) * Deleting (mew-current-set 'message nil) from mew-window-configure. * If mew-highlight-mark-folder-list is t, marked lines in all folders are highlight. * Defined mew-syntax-format-hook. * A bug fix for message/delivery-status. * A bug fix for mimedecodequoted. Murata Takashi * Several type definitions. Shuichi Kitaguchi * A new entry "x-ml-count" for mew-sort-key-alist. nakaji * mew-config-insert-when-composed for PGP encoding. Akihiro Motoki 1.94b2 (98/11/24) mew-dist release * rear-nonsticky for attachments. Mikio Nakajima * Specifying the --mimedecodequoted option to imget and imscan according to mew-decode-quoted. * MIME decodings checks CTE: values for composite CT:s. * Prevent applying X-GIP64 to message/* and multipart/*. * mew-prog-tiff for mew-win32.el Hideyuki SHIRAI * mew-folder-list hack for msdos file system. SAKAI Kiyotaka * "=" hack for mew-gnus.el. SAKAI Kiyotaka * mew-require-final-newline. "YAMAGUCHI, Shuhei" * mew-decode-quoted. SASAKI Takeshi * mew-refile-view.el. "Takashi P.KATOH" * A patch to mew-gnus.el. SAITO Tetsuya 1.94b1 (98/10/21) mew-dist release * mew-uniq-variables. * EUC KR patch. Han Yeong Su * Define mew-summary-mark-direction. SAKAI Kiyotaka * The text demo for xemacs -nw. Naoki Wakamatsu * Introducing mew-summary-prepare-draft to mew-gnus.el. Mito * And mew-gnus.el fix related to the References hack. Han Yeongsu * References hack. Mito * mew-sort.el fixes. "Takashi P.KATOH" * Use mew-save-dir instead of default-directory in mew-ext.el. Hideyuki SHIRAI * Two patches for mew-gnus.el. SAKAI Kiyotaka * Modeline of Summary mode tells that subprocess is running. Yoshiaki Kasahara 1.93 (98/09/05) mew-release release 1.93pre4 (98/09/03) * Due to my typo, Latin-1 in header was treated as unknown in Emacs 19. Sorry! 1.93pre3 (98/09/01) * Load refile nits only at boot time. SAKAI Kiyotaka * nconc fix. * Temp dir fix. 1.93pre2 (98/08/31) * Message handling for imget. Murata Takashi * Fix for mew-summary-sort-subr. Akihiro Motoki * Kill whom buffer when sent. Akihiro Motoki * A patch for goto-folder. wkenji * mew-alias-setup checks mew-alias-file. 1.93pre1 (98/08/24) * Version strings are updated. * The item 3 of copyright is deleted. * Bug fix for mew-message-narrow-to-page when ^Ls are continued. 1.93b56 (98/08/22) * Header highlight problem for reedit with Config: is fixed. * mew-expand-folder allows absolute path. * Defined mew-string-as-multibyte to get along with Emacs 20.3. * Fix for an unnecessary null line when a draft is prepared. * mew-get-header-value extract only one From: field to get along with new x-face-mule.el. * Deleted contrib/mew-xface-mule.el. * Defined mew-uniq-list. Obsoleted mew-refile-list-uniq. 1.93b55 (98/08/19) * Bug fix of header encoding for comment. * Delete append from mew-refile as much as possible. * Deleted mew-member. Use member instead. * Multiple alias files are allowed. * Run mew-message-hook in mew-summary-insert. Makoto MATSUSHITA * Yet another alias patch for continuous line. SAKAI Kiyotaka * Message analysis for messages in +draft is controlled by mew-debug. * PNG patches for OS/2. OKUNISHI Fujikazu * Alias patch. SAKAI Kiyotaka 1.93b54 (98/08/15) * Defined mew-draft-before-composition-only. * Yet another header encoding. * Alias setup by Elisp. SAKAI Kiyotaka * Bug fix for status update. kyota (Kyotaro HORIGUCHI) * Remove exception of mew-summary-display. Messages in the draft folder are analyzed then displayed. * When reedit, decode header if CT: is text/plain. * Got rid of mew-virtual-mode-map from mew-caesar.el. Hideyuki SHIRAI * mew-ask-subject fix. Maybe TABOO 1.93b53 (98/08/11) * Use char-equal instead of equal, sigh. On XEmacs " " has not been encoded as "_" with quoted-printable but "=20".... * Define values for primitive field-names. * Update documentations. * Fix for mew-highlight-url-max-size. Atsushi Nemoto * Deleted mew-virtual-mode-map thanks to mew-summary-only. * The default value of mew-use-cursor-mark is nil. * Displaying CTE: for application/octet-stream. Atsushi Nemoto 1.93b52 (98/08/04) * Bug fix for mew-summary-convert-local-cs. * mew-mark-clean-up before mew-buffers-clean-up. * Bug fix for mew-summary-scroll-{up,down} * Small patch to mew-env.el. Mito * Patch to mew-os2.el to get along with Mule 3. OKUNISHI Fujikazu * Clean up mew-header.el. * Bug fix for mew-string<. * mew-config-clean-up was added to mew-summary-quit. Satoshi Yatagawa 1.93b51 (98/08/01) * CDP: is used for the temporary file to pass an external program. Shuichi Kitaguchi * Ensuring overlay-arrow-{string,position} is buffer-local. * mew-local-variable-p again. * Defined mew-use-cursor-mark. Mito * Deleted mew-folder-alist-reverse. Sort mew-folder-alist with mew-string< instead. * Define mew-lc-kana for non-Mule. * Tiny fix for mew-refile-guess-by-newsgroups. NAGAO Tadaaki 1.93b50 (98/07/30) * mew-prog-audio2 for Win. Shuichi Kitaguchi * Even unless MIME analysis, RFC 2047 header decoding is applied. * Cleaning up setup, clean-up, clear, and init functions. * Let "ma" not to mark multipart. * One more bug fix for toolbar. * One more bug fix for mew-attach-audio. * Bug fix for join. OKUNISHI Fujikazu 1.93b49 (98/07/26) * Get along with XEmacs compiled with --without-toolbars. Naoki Wakamatsu * If attachments are not valid, make single. * Yet another bug fix for mew-draft-header-keymap. * mew-summary-ls preserves preview marks if range is "all". Is this desired? * mew-summary-folder-cache-save deletes mew-decode-syntax if printed. * Clear decode-syntax markers if nothing is printed. * Bug fix for attach-audio. * Fix for message search for pick. * The scroll-up problem of forward is fixed. * The cursor position problem of forward is fixed. * The boundary problem of overlay is fixed. 1.93b48 (98/07/18) * widen for mew-summary-folder-cache-save. "Takashi P.KATOH" * Set inhibit-read-only to t in draft-undo. * Bug fix for CD: encoding. * Specify cs-draft for make-backup and undo. * Typo fix for mew-addrstr-parse-address. TSUMURA Tomoaki * rear-nonsticky for header separator. SAKAI Kiyotaka * Bug fix for read-only header separator when undo. * Only parameter value can be quoted. * Define mew-header-sanity-check. * Header encoding now gets along with Emacs 20.2. * Add mew-mule.el to Makefile. 1.93b47 (98/07/16) * Define mew-aref and mew-charlen to support all Mule versions. * s/redist/resend/g. * mew-addrstr-parse-syntax-list checks mew-header-max-depth. * Tiny fix for mew-summary-redist. Takeshi Itoh * Make attachments read-only. SAKAI Kiyotaka * mew-summary-save sets file to nil if the charset of filename is unknown. * mew-charset-sanity-check is defined. * New RFC 2047 header encoding. * Make mew-gnus.el synchronized with mew-header.el. SAKAI Kiyotaka 1.93b46 (98/07/11) * Fixes of draft toolbar. * mew-syntax-number bug fix for XEmacs. * mew-draft-mode-map inherits mew-draft-body-map if mew-use-overlay-keymap is t. SAKAI Kiyotaka * Corporate with Emacs which returns mule-version of 4. SAKAI Kiyotaka * mew-attach-undo clears decrypters. * Defined mew-summary-clear-end-of. * Bug fix of mew-end-of-* for mew-summary-insert. Hideyuki SHIRAI * mew-header.el is drastically modified. * Integrated mew-split, mew-header-split, mew-split-number. * s/equal/mew-case-equal/g if necessary. * s/string-equal/string=/g. * Added missing options for search-forward. Hideyuki SHIRAI * Make (setq mew-use-overlay-keymap nil) work on Emacs 19.34. SAKAI Kiyotaka * Mark patch for mew-gnus.el. SAKAI Kiyotaka 1.93b45 (98/07/05) * Two bug fixes for mew-ext.el. Kenichiro MATOBA * mew-draft-keyswitch is back. * mew-draft-show-attach deletes only glyph extents. * mew-pgp-verify-check checks if the signature is supported or not. * mew-pgp-verify-check bug fix. Masachika ISHIZUKA * Don't assign mew-attach-dummy for C-u. Mito * Keymap of attachments also uses overlay. * Bug fix for mew-highlight-body. 1.93b44 (98/07/02) * Obsolete mew-header-insert-value. Use mew-complete-insert instead to use right colors. * mew-message-set-end-of now sees if extents exist. * Separated mew-summary-display-part to mew-mime-part so that mew-end-of-* are displayed correctly. * Obsoleted mew-message-citation. Use marker instead. * Changed convention of marker naming. * s/jepg/jpeg/g. k-morito * Replaced defun with defmacro in mew-mule*.el. * Make mew-cs-post-conv safer. 1.93b43 (98/07/01) * Mew now takes care of composite character set like tis620!! * Define mew-header-insert-value. * mew-refile-guess-by-folder is now customizable by mew-refile-guess-key-list. * Check if mew-buffer-hello exists when kills it. Akihiro Motoki * widen when replys. * widen when inserts end-of-*. 1.93b42 (98/06/30) * Bug fix for local-map of draft header. * Bug fix for end-of-*. * Define mew-frame-id to make unique string independent on frame-title-format. Masahiro MURATA * Add an optional argment to mew-draft-{yank,cite} to cooperate with xcite.el. * Syntax fixes for mew-mule0.el. Mark Burton * A patch for mew-summary-virtual. OKUNISHI Fujikazu 1.93b41 (98/06/26) * Use overlay-arrow-string for mew-end-of-message-string and mew-end-of-part-string. * mew-draft-keyswitch is now obsoleted. Use the 'local-key property instead. * Use set-window-start to the header and attachments visible. * Bug fixes for the header separator. * Marker bug fixes. * Bug fix for header separator of reedit. * Deleting the variables to prevent warning due to many side effects, sigh. 1.93b40 (98/06/24) * Use PNG for opening instead of XPM. * Use valid-image-instantiator-format-p instead of featurep. * Defined mew-summary-reply-position and mew-summary-reply-with-citation-position. * Marker stuff was brushed up. * mew-summary-reply-with-citation sets disp-msg on anyway. * mew-draft-cite and mew-summary-reply select a buffer from where header info is retrieved in the following order: (1) Message buffer if header exists (2) Cache buffer if exists. Typing "a" on a part (not on a message) means replying to the part(e.g. message/rfc822). So, prefix argument of mew-summary-reply was removed. * mew-current-{get,set} is now frame-local. * Bug fix for insert. TAKAHASHI Masafumi * mew-summary-goto-folder takes care of virtual folders. OKUNISHI Fujikazu Masahiro MURATA * TIS(Thai) 620 support. * mew-summary-join was back. 1.93b39 (98/06/11) * Commands for Summary and Virtual mode were drastically re-written with new macros. 1.93b38 (98/06/08) * Obsoleted mew-use-pgp5. PGP version is automatically detected. * mew-summary-save use the filename parameter of CDP: even if "inline". * Defined mew-end-of-message-string and mew-end-of-part-string. Obsoleted mew-eof-string. * Key assignment of mew-summary-exchange-point was changed from "C-xC-x" to "C-cC-b". * New mew-win32.el. Shuichi Kitaguchi * Bug fix of "n" when the cursor locates in the middle of a line. OKUNISHI Fujikazu 1.93b37 (98/05/31) * Defined mew-pick-canonicalize-pattern. * Refine unfolding of mew-header-decode-region. * Bug fix of mew-update-range. OKUNISHI Fujikazu * Patches for X-Face: and mew-os2.el. OKUNISHI Fujikazu * C-uC-cC-l asks coding-system. SAKAI Kiyotaka * Old replace-match doesn't support string, sigh. Shun-ichi GOTO * A patch to mew-xface-mule.el Makoto MATSUSHITA * mew-header-decode-region unfolds folded lines. 1.93b36 (98/05/27) * Remove all illegal characters in decoded string if exist. * PGP key server is changed from ICAT to JPNIC. Hideyuki SHIRAI * Bug fix for other fields. Mito * Default value of mew-folder-list-skip-pattern is changed. Shuichi Kitaguchi 1.93b35 (98/05/26) * An error message is displayed unless mew-prog decode exists. * Regexs in mew-field-spec were fixed. * mew-highlight-header-region bug fix. * When the file which Mew believe doesn't exit unfortunately exists (probably because of NFS bugs), Mew asks you to input a message number instead of causing an error. * Some of mew-input-* calls mew-decode-syntax-delete after its retern value is fixed. * mew-summary-display-message deletes extents as mew-summary-display-part does. * mew-prog-xxx is dynamically evaluated to get along with window-system which has different value for each frame. * mew-header-decode-address and mew-header-decode-text were integrated into mew-header-decode-region. * A patch for mew-input-sort-key. SUGIMORI 1.93b34 (98/05/23) * Removed mew-rfc822-field. See mew-address-fields. * visible/invisible and header-highlight is integrated. See mew-field-spec. This makes mew-header-arrange much faster. * mew-ask-subject works when C-cC-m is typed. * Required faces.el only if window-system. This pacifies the "void: frame-face-alist" error. * Fixed "mo". * Use mew-make-directory instead of make-directory to prevent an error if Mail doesn't exist. * Deleted mew-folder-list-use-file-attributes. If mew-folder-list-skip-pattern is nil. use link count. The default value mew-folder-list-skip-pattern is nil. For Win95, "^[0-9]+" is set. * Made messages in Massage more safer. * Header arrange. * Deleted mew-member-del. * Input functions were integrated. Completion functions were also integrated:: pick pattern, folder, folders, address, address2, rfile, sort. * Specify Content-ID: instead of Message-ID: for external-body. OKUNISHI Fujikazu * Ignore quoted-strings during MIME header decoding. Mito * The value of mew-keyval was changed to prevent mismatching errors. 1.93b33 (98/05/13) * C-cC-f tries fetching a public key with the From: field unless the X-Mew: field exists. Mito * Logic change for CD: and CDP: The default value is decided as follows: (1) If its value exists, use it. (2) If not exist, use its file name. (3) If its file name does not exist, use "". Mito * Some fixes for mew-draft-prepare-attachments. * Specified "=" in addition to "+" for folder completion. * Updated menubars and mode descriptions. * Brushed up PGP key fetch. Hideyuki SHIRAI * Fixed range of sort-region. Masahiro MURATA * Brush up the message when attachments were deleted. Hideaki MORINAKA * The window of completion candidates scrolls up when TAB is typed repeatedly. * Small fixes for Makefile. 1.93b32 (98/05/11) * mew-draft-make-mime -> mew-draft-make-message. * The old IM Config variables were cleaned up. The new variables are: mew-config-guess-alist mew-config-insert-when-prepared mew-config-insert-when-composed If you want the old feature of mew-config, set (setq mew-config-guess-alist '((nil . value))). * Set mark the original position when Config: is inserted. Takeshi Itoh * C-uC-cC-c preserves a multi-part draft and doesn't remove the files under +draft/mime for undo. OKUNISHI Fujikazu * Added "install-info" to Makefile * Ah-hoc Emacs 20.2.9x support. 1.93b31 (98/05/08) * Refine Makefile. * Delete files when error occurs in Multipart/Encrypted and Multipart/Signed. * More ad-hoc support for PGP 5. Minoru Matsumura * file-writable-p returns t even if the file doesn't exist. Ugh! Added file-exists-p. * mew-summary-scan-filter bug fix. * Defined mew-ask-pack. * mew-auto-add-content-type -> mew-ack-send (negated) 1.93b30 (98/05/06) * mew-message-goto-summary displays the "No Summary mode" message if the corresponding Summary mode doesn't exist. * All functions for circular completion now have the prefix mew-circular-complete. * If mew-summary-buffer-disp-msg is nil, "A" displays the "Type v first" message. * If MIME decoding is quitted by C-g, its cache is removed. * Made mew-summary-scroll-{up,down} symmetric. * New mew-ext-url. Mito * Defined mew-pick-default-field. Gorochan ^o^ * Got rid of insert-before-markers from the scan filter so that the side-effect to mew-summary-buffer-end is resolved. Now mew-decode-syntax-delete is safe even if the final message is multipart. * Defined error messages in mew-vars.el. * Mew now incorporates with XEmacs without the --with-mule option. * PNG support. Yoshikazu Ooe * bug fix for PGP error report. * CDP: patch for "F" in attachments. OKUNISHI Fujikazu 1.93b29 (98/04/30) * Made mew-complete-window-config buffer-local to make completion safer against multiple draft buffer. * Explicitly notify unknown PGP micalg. * Made mew-summary-prog-exec safer for OS/2. OKUNISHI Fujikazu * mew-save-dir for uudecode and unshar. Masahiro MURATA * Clear jam-zcat-filename-list and jka-compr-compression-info-list in mew-flet and mew-frwlet. OKUNISHI Fujikazu * CDP: is displayed as it is. Filename is displayed with "*" appended. * mew-encode-syntax-single fix. Maybe TABOO * Avoid inserting CDP: for signature. OKUNISHI Fujikazu * Bug fix for missing subject when forwarding a forwarded message. Shigemi Mikayama * Bug fix for "A" in attachment. OKUNISHI Fujikazu * mew-summary-toggle-analysis stays on the current message always. OKUNISHI Fujikazu * Ignore charsets other than US-ASCII and ISO-8859-1 on bilingual Emacs. * Use substring if mew-substring is not bound. 1.93b28 (98/04/20) * When compsing, CDP: is automatically set unless it matches mew-mime-content-type-ignore-cdp. Type just RET for 'N' to clear CDP:. * Set inhibit-quit to t in functions to enter Draft mode. * Pack now preserves the * mark. * Defined mew-pop-to-buffer to fix all bugs on XEmacs. * Integrated config valuables and functions. * Use copy instead link for signature attachment to protect the original signature file anyway. Hideyuki SHIRAI * gzip hack for OS/2. OKUNISHI Fujikazu * mew-summary-toggle-disp-msg stays on the current message always. * Defined mew-string-width because string-width is not available on some Emacses. * save-excursion for mew-summary-mark-refile. Shun-ichi GOTO * PGP fetch patch. Hideyuki SHIRAI * Info on sort. "Takashi P.KATOH" * XPM support. Mark Burton * Eliminated the "no messages" message when scan. * Made mew-input-{folder,folders} symmetric. * Made mew-summary-{next,prev}-page symmetric. * Call mew-highlight-{url,body} only in text/plain. * Set modes of Mail and News to mew-folder-mode when init. * Defined mew-folder-mode and mew-file-mode for privacy reasons. * Made folder operations safer. * mew-config-imget is displayed when incing if not default. Makoto MATSUSHITA 1.93b27 (98/04/08) * mew-summary-config-imget. ("C" in Summary mode, anyway.) * Set mark the point in inbox before get so that we can get back to that position with C-xC-x. * mew-save-dir. OKUNISHI Fujikazu * Set mew-use-highlight-x-face when refiling. TSUMURA Tomoaki * imget.sh and imls.sh. KITAUCHI Akira * imput.sh. Murata Takashi * IMAP regex fix. Yuuichi Teranishi * New mew-caesar.el Hideyuki SHIRAI 1.93b26 (98/03/24) * MIME decoder and decode-syntax displayer was elegantly re-written. * "guess" -> "us-ascii" when decoding. * Openp, again. OKUNISHI Fujikazu * Defined mew-folder-list-function. OKUNISHI Fujikazu 1.93b25 (98/03/13) * Displaying filename when executing a program. Shun-ichi GOTO * Bug fix for cursor position when "x". * An ad-hoc hack for left click on Draft mode. Yuuichi Teranishi * A patch to support Mew.img and to make it safer. yamagus (KOSEKI Yoshinori) * Several patches for elisp impath. yamagus 1.93b24 (98/03/10) * Elisp version of impath to list up folders. yamagus * Bug fix for mew-attach-duplicate. Yuji Yamano * Several patches including x-face, mew-os2.el, etc. OKUNISHI Fujikazu * The first part is displayed with its header in Summary mode if it is text/plain. * A tiny patch for imjoin. koie 1.93b23 (98/03/02) * IMAP is back. wkenji * set-buffer in addition to select-window. 1.93b22 (98/02/28) * mew-{symbolic-,}link checks if the target file is a regular file. * Another terrible multipart bug of "f" was fixed. OKUNISHI Fujikazu * Multiple frame problem on XEmacs was fixed. * Stupid completion bug fix. * Fixed icon problems in Draft mode on XEmacs. 1.93b21 (98/02/26) * Cleans up variables on the last stage of mew-summary-quit. * Define mew-before-cite-hook for mew-summary-reply-with-citation. Gorochan ^o^ * mew-demo-picture is t only when XEmacs. OKUNISHI Fujikazu * "o" marks are removed when Summary cache is loaded. (Just in case...) 1.93b20 (98/02/25) * Bitmap demo patch. (KOSEKI Yoshinori) * Config: patch. SAKAI Kiyotaka * Fix in mew-highlight-header-region. * Typo fix in mew-env.el. SAITO Tetsuya * Beautify mew-attach.el. * mew-im-call-process{,-no-output} checks the return value of call-process. * mew-draft-make-mime moves the cursor onto the end of the header. Hideaki MORINAKA * Add the "-q" option when calls gzip. Mikio Nakajima yamagus * Use mew-folder-member instead of mew-member in highlight stuff. Yuji Yamano 1.93b19 (98/02/24) * Bug fix for mew-syntax-format. * Defined mew-summary-goto-message. * Defined mew-string-to-list. 1.93b18 (98/02/23) * One more fix for mew-header-decode-address. Mito * X-Mew: result reports are now perfect. * attachment syntax and multipart syntax were integrated. 1.93b17 (98/02/20) * Unfold fix for mew-header-decode-address. * highlight on tty if XEmacs. And if tty, never do inline display. Yuuichi Teranishi * Bug fix for mew-folder-check. mew-folder-check now certainly appends a new folder to ".folders". * Touch-folder fix. Shuichi Kitaguchi * New mew-refile.el. Yoshinari NOMURA * Define mew-link for OS/2 and Win32. OKUNISHI Fujikazu 1.93b16 (98/02/19) * Fix for "y". * Defined mew-link. * Variable index for info. Koichi Sekido * "x" became much much faster. 1.93b15 (98/02/19) * Prepare mew-summary-imap-{process, string} for neat exclusive operations. * mew-folder-new-message becomes independent on "impath". This makes preparation of draft buffer much faster!!! * Ad-hoc Content-Disposition: support. * You can specify citation-prefix if mew-ask-cite-prefix is t. Akihiro Motoki * Update only necessary part if sorted regionally. Akihiro Motoki * Regional picking. Akihiro Motoki * Bug fix for mew-summary-exec-region. Information outside the region is preserved. Akihiro Motoki * syntax-table bug fix. 1.93b14 (98/02/17) * Header encoding modification. But still imperfect. * PGP5 verification patch. Hiroshi Ogata * Coding system patch for mew-summary-display-part. OKUNISHI Fujikazu * New goto folder. SAKAI Kiyotaka 1.93b13 (98/02/10) * Ad-hoc PGP 5 support. MURATA Nobuhiro Hiroshi Ogata * Bug fix of "g" for NetNews. TSUMURA Tomoaki * Yet another config implementation. Maybe TABOO * message/partial support. SAKAI Kiyotaka * HTML and URL stuff for Win32. Shuichi Kitaguchi * More information for binary content-type. SAKAI Kiyotaka * Two patches to improve the text/html interface. SAKAI Kiyotaka * text/html for Win32. Shuichi Kitaguchi 1.93b12 (98/01/30) * Message flush when quit. * Mode line fix for "x". Akihiro Motoki * Bug fix for Hankaku kana stuff. * Audio bug fix. * Several feedback concerted with OS/2. OKUNISHI Fujikazu * Mode line fix for reedit. SAKAI Kiyotaka * Safty patch for mew-summary-goto-folder. SAKAI Kiyotaka * New mew-summary-display-{top,bottom}. SAKAI Kiyotaka 1.93b11 (98/01/29) * Config bug fix. Akihiro Motoki * At composing, hankaku kana is converted into zenkaku kana if exists. Mito * A safty patch for mew-input-range. TSUMURA Tomoaki 1.93b10 (98/01/28) * A patch for mew-draft-cite. Maybe TABOO * Ad-hoc support for text/html. * Some fixes for mew-win32.el. Shuichi Kitaguchi * mew-summary-get flush queue if messages exist. This is very convenient on PPP environment. Hisakazu Hada * mew-ext-prog-url-args. TSUMURA Tomoaki * mew-draft-insert-config. Maybe TABOO * File mode change for attachments. OKUNISHI Fujikazu * --preserve=on for imput when "C-uC-cC-c". 1.93b9 (98/01/25) * Process bug fix for "x". * Drive letter support in mew-input-file-name. OKUNISHI Fujikazu * The mew-summary-scan-width option. Toshihiko SHIMOKAWA * C-ug always goes to the last line when visits the folder. Akihiro Motoki * filter patch for Win32. Shuichi Kitaguchi 1.93b8 (98/01/23) * IMAP support. wkenji * mew-summary-mark-all fix. TAKAHASHI Masafumi 1.93b7 (97/12/15) * mew-prog-im-arg but imperfect... * Make mew-attach-{copy,link} safer. * Make mew-summary-mark-all region-oriented. TAKAHASHI Masafumi * Make mew-attach-delete safer. Mito * Check default-toolbar-visible-p. TSUMURA Tomoaki * require 'easy-menu. Yuuichi Teranishi * New mew-os2.el. OKUNISHI Fujikazu * Moved mew-status-update after running mew-init-hook. * Deleted mew-draft-delete-content-type. Use mew-draft-undo instead. * -> on privacy results. This distinguishes <2> and <2 body>. * A patch to mew-win32.el. Shuichi Kitaguchi 1.93b6 * mew-{unix,os2,win32}.el. 1.93b5 (97/12/04) * Case-fold for {in,}visible. * Defined mew-{reply,forward}-{string,regex}. 1.93b4 * mew-attach-type sets an appropriate mark by default. * mew-real-send-hook 1.93b3 (97/12/02) * mew-opt-highlight-* -> mew-use-highlight-*. * mew-folders-default-folder bug fix. Mito * Anonymous FTP bug fix. * iso-2022-int-1. * mew-gnus-save-preserve-dot. TSUMURA Tomoaki SAKAI Kiyotaka * mew-summary-flush-queue. Shuichi Kitaguchi * face-foreground bug fix. Maybe TABOO * A bug fix: refile cancel and specify again. Mito 1.93b2 (97/12/01) * mew-y-or-n-p was removed. * mew-vars.el was created. * Support of "no *new* message" for imget. SAITO Tetsuya * Inline display of xbm. Yuuichi Teranishi * Removed the "Removing folder" message. Akihiro Motoki * A bug fix of ordering of visible fields. TSUMURA Tomoaki * C-l to mew-draft-rehighlight in Draft mode. 1.93b1 * Strict path check to avoid Petname dilemma. * Typo fixes for mode-line. Akihiro Motoki * A bug fix for mew-decode-syntax-print. * Support of imclean. SAKAI Kiyotaka * mew-header-decode-qp bug fix. Yoshikatsu Kawabe * highlight for body in Draft mode. SAKAI Kiyotaka * New contrib/mew-mule-xface.el. Yuuichi Teranishi KORIYAMA Naohiro OKUNISHI Fujikazu * mew-configs -> mew-config-list. * Brushed up mew-status-update. * mew-highlight-url patch. Masahiro MURATA * mew-highlight-body patch. Masahiro MURATA SAKAI Kiyotaka * C-cC-i is now a generic circular completion. mew-complete-from for From:. Set mew-from-list. * You can get back to single part only in Draft mode. Type "d" on a top directory in attachments. * PGP sign takes the "-u" options. If From: exists, use it. Otherwise, mew-mail-address is used. * Interface to execute external programs such as xv is improved. SAKAI Kiyotaka OKUNISHI Fujikazu * A patch to mew-gnus.el. SAKAI Kiyotaka * Add Newsgroups: for highlight. SAKAI Kiyotaka * new mew-xface-mule.el and patch KORIYAMA Naohiro OKUNISHI Fujikazu * A bug fix for mew-encode-syntax-format. Harald Hanche-Olsen * highlight for mew-summary-exchange-mark. "Takashi P.KATOH" * Overlay instead of property. SAKAI Kiyotaka * mew-opt-highlight-header check in mew-highlight-header-region. 1.92 (97/10/25) mew-release release * put-text-property 'default for multipart decoded syntax in Summary mode. Just for XEmacs, sigh. * Added mew-folder-newsp for mew-summary-display-message. TSUMURA Tomoaki * (require 'faces) for Text Emacs. * highligh-url fix. Yuuichi Teranishi * A bug fix for header arrange. * "File does not exist" check moved to mew-summary-display-message. * local zmacs-region is set nil on Summary mode. * (buffer-read-only t) for highlight functions. * font-lock is now obsoleted. * new mew-refile.el. Yoshinari NOMURA * A bug fix of mew-draft-insert-signature. * A bug fix of header encoding when signs/encrypts a single body. * mew-folder-check checks whether or not the argument is a string. * mew-decode-syntax works even when charset is nil. * mew-folder-check checks whether or not the folder is a directory. * A bug fix of mew-window-configure. * font-lock is now used only in +inbox. * zmacs-regions hack. Yuuichi Teranishi * name changes: overlay -> property. * Underline and bold when no window. Mito * Charset is displayed when multipart on Summary mode. * Check window-system for no window. * Styles and colors are now customizable. * Face color hack. * Use 'binary instead of 'no-conversion. * find-file-hooks is set to nil to prevent font-lock-mode. * mew-opt-highlight-headers -> mew-opt-highlight-header. * Mark names were integrated. * Range completion. * Highlight of mouse line on Mule 2.3 and Emacs 20 was obsoleted. * Throw away hilight19. Use font-lock instead. * mew-opt-highlight-headers -> mew-opt-highlight-header. * Removing a drive letter for mew-ext-ftp. OKUNISHI Fujikazu * A bug fix for mew-folder-make-list. Masahiro MURATA * Popup menu on Summary mode. Yuuichi Teranishi * (make-local-variable 'tab-width) in Summary mode. * A tiny patch to mew-summary-send. naoki-e * (featurep 'hilit19). Mito * mew-make-folder-list ignores garbages. * Highlight functions were integrated. See mew-opt-highlight-cursor-line, mew-opt-highlight-mouse-line, mew-opt-highlight-headers, mew-opt-highlight-url and mew.dot.emacs. * Unknown cte is treated as app/oct. * koi8-r. * One more patch to mew-gnus.el. OKI Yukihiro * PGP/MIME bug fix. * Added "From$" to mew-field-invisible. Masahiro MURATA * imstore for mew-gnus.el. OKI Yukihiro * More utime hack. OKUNISHI Fujikazu * Key binding patch for Summary and Virtual mode. Tetsu NISHIMOTO * display correctly when header is too long. Hirotaka Yokokawa - Nihon Sun IR * cn-gb patch. huangyan (Yan HUANG) * mew-summary-save patch. SAKAI Kiyotaka * error -> mew-decode-error in mew-decode.el. * OS2/Makefile patch. OKUNISHI Fujikazu * New mew-os2.el and utime.cmd.in. OKUNISHI Fujikazu * New mew-win32.el Shuichi Kitaguchi * Some mew-assoc-match were replaced eith mew-assoc-case-equal. * mew-set-file-coding-system is obsolted. * utime hack. OKUNISHI Fujikazu * MIME decode routines uses eoh2 instead of eoh for messages in +draft. * Pretty good multi-lingual support. * A bug fix for C-u n. * If mew-summary-exec-region catches C-g, it set mew-summary-buffer-process nil. * C-cC-k set mew-summary-buffer-process nil anyway, always. * Defined mew-cs-charset. * mew-msg-rm-policy hack. Maybe TABOO * A bug fix for mew-summary-get's cache. Akihiro Motoki * charset safe mechanism for mew-summary-burst. * mew-refile-{add,purge}-alias. Yoshinari NOMURA * mew-summary-save takes the object *binary* if unknown. OKUNISHI Fujikazu * mew-sort.el patch. "Takashi P.KATOH" * Startup errors is now user friendly. * 'no-msg for write-region. * mew-refile.el use To: if From: is myself. Yoshinari NOMURA * mew-summary-auto-refile can be used in Summary buffer only. Daisuke Sato 1.91 (97/09/18) mew-release release * Confirmations to a user were removed completely in mew-ext.el. OKUNISHI Fujikazu * Set mew-message-citation 'header for non-MIME analysis mode. Hirotaka Yokokawa * Patches for mew.dot.emacs. OKUNISHI Fujikazu Shuichi Kitaguchi * OS2/configure.cmd patch. OKUNISHI Fujikazu * inhibit-input-event-recording for mew-read-passwd. * Synchronized mew.texi, mode descriptions, and description for each functions. * You can put the '*' mark and the '@' mark even when on parts. Now, to skip parts, call "n" or "p" with C-u. * C-cC-u(undo) works even for a single-part message. * No white space is allowed for Aliases. * Omitting a question for ext url. OKUNISHI Fujikazu * New mew-sort.el. "Takashi P.KATOH" * Newsgroup -> Newsgroups in mew-pick.el. Akihiro Motoki . * TMP for mew-temp-file-initial. OKUNISHI Fujikazu * Be silent when write control files. SAKAI Kiyotaka * redraw-display was removed to fix the emphasis problem. SAKAI Kiyotaka * The default value of mew-refile-guess-control was modified. Yoshinari NOMURA * N and P move the cursor only onto the review mark. * New mew-os2.el and mew-mime.cmd. OKUNISHI Fujikazu * mew-summary-inc-sentinel-hook came back. * Many explanations were added and revised for interactive functions. * "--link=no" for immv when +trash. "Chikara 'Power of Allow' Yano" * mew-folder-new-message works well even if Perl5 warns. * A bug when ISO-2022-JP is encoded with B was fixed. * Use install in bin/Makefile. SAKAI Kiyotaka * A bug for forward by icon was fixed. * X-Mailer tiny hack. Daisuke Yabuki * mew-summary-reply-with-citation fix again. Yoshinari NOMURA 1.90 (97/08/26) mew-release release * The -f option for cp in bin/Makefile. Motonori Nakamura * Use copy-file for mew-attach-copy. * Integrated mew-field-resent to mew-field-delete. OKUNISHI Fujikazu Motonori Nakamura * mew-summary-reply-with-citation fix. Yoshinari NOMURA * mew-header-encode-text was compromised so that 'text' and 'encoded-word' may not be separated by 'linear-white-space'. * New mew-refile.el. Yoshinari NOMURA * mew-summary-mode-line bug fix. * "v" and "o" combination made Summary mode mixed up. This is certainly fixed. * Defined mew-summary-trace-directory. SAKAI Kiyotaka * Timing to ask range was changed in mew-summary-ls. SAKAI Kiyotaka * Cache manage fix and MIME decode for News articles. * Use (cd dir) for unshar and uumerge. * Bug fix for the case that null name is specified when ext. * Fixes for display. SAKAI Kiyotaka * Defined mew-home. * Used file-name-as-directory instead of mew-path-separator as much as possible. 1.89 (97/08/20) mew-dist beta release * RFC 2047 encoding. This introduced drastic changes. * Added "Lines:" and "X-Dispatcher:" for mew-field-delete. * Random stuff goes to mew-func.el. * A patch for uumerge.cmd.in OKUNISHI Fujikazu * Unfold In-Reply-To:. * X-Mailer hack. * mew-config-guess-alist SAKAI Kiyotaka * automatic-conversion -> mew-cs-autoconv SAKAI Kiyotaka * Completely deleted X-Graph. * read-file-name argment fix. Takaaki MORIYAMA "Takashi P.KATOH" 1.88 (97/08/06) mew-dist beta release * mew-draft-keyswitch patch Takaaki MORIYAMA SAKAI Kiyotaka * mew-watch-sentinel check "imput: ERROR:" instead of "imput:". * X-Mew: hack. * Defined mew-configs. * Too large mesage bug fix. SAKAI Kiyotaka * mew-summary-insert displays the message without analysis on non-part. SAKAI Kiyotaka * mew-decode-error hack. * New Makefile.os2, configure.cmd and uumerge.cmd.in. OKUNISHI Fujikazu * mewencode binary patch for OS/2. * insert-file-contents-internal for mew-attach-copy on Xemacs. * Displaying GIF/JPEG internally on Xemacs. Yuuichi Teranishi 1.87 (97/07/28) mew-dist beta release * Replaced insert-string, beginning-of-buffer, end-of-buffer, replace-regexp with primitives. * C-u a and C-u A. SAKAI Kiyotaka * Contains Message-ID: in In-Reply-To:. Takeshi Chiba * Make undo possible for mew-summary-reply-with-citation. NISHIDA Keisuke * mew-sort.el. Hironori Ikura * Catched up to Emacs 20.0.91. SAKAI Kiyotaka * pick macro UMEMURA Akihiro * mew-cite-strings-with-petname Yuuichi Teranishi Ryuichi MATSUMOTO * Preliminary News support. SAKAI Kiyotaka * Virtual mode for XEmacs. Yuuichi Teranishi * mew-draft-keyswitch bug fix. SAKAI Kiyotaka * PGP/MIME re-enter bug fix. 1.86 (97/07/21) mew-dist beta release * Defined mew-use-petname. * imsort support. * A bug for "Subject: as CD:" was fixed. That is, RFC822 messages were also supported. * "-" is assigned to mew-summary-scroll-down in Summary and Virtual mode. * mew-summary-burst can be executed on part. * mew-summary-save askes y-or-n only when the file exists. * push-mark if rmm or refile treats one message. If you fail to put a mark you want, type C-x C-x to get back. * C-cC-y and C-cC-t in Draft mode is now symmetric. * Set modeline-buffer-identification for each mode. NISHIDA Keisuke * mew-virtual-mode-hook OKUNISHI Fujikazu 1.85 (97/07/01) mew-dist beta release * Support of "=". Yoshinari NOMURA * Deleted mew-cs-spool. * "mo" bug fix. * Keybindin changes for Draft mode. C-cM -> C-cC-a C-cu -> C-cC-l C-cy -> C-cC-t * Bug fix of button2 on Xemacs. Yuuichi Teranishi * mew-gnus.el patch SAKAI Kiyotaka * (sit-for 0.1) to flush the gap for imget. * Too large mail is not analyzed and display 'To analyze, type "."'. If analyzed with ".", it is cached and used when displayed another time. 1.84 (97/06/27) mew-alpha release * mewencode.c patch SAKAI Kiyotaka OKUNISHI Fujikazu * mewencode.c hack. * mew-refile.el was changed drastically. * mew-use-folders-file-p. If t, read the file when bootup. And save the file when C-u Z. * MailDir -> MailPath. * mew-scan patch for imget error Yuuichi Teranishi * non-analysis when too large mail SAKAI Kiyotaka 1.83 (97/06/24) mew-alpha release * mew-cs-autoconv for mewencode... * "Password is wrong" message for imget. * add #if defined(OS2) || defined(WINNT) || defined(_WIN32) to mewencode.c. * cd to the +folder when moved to it. SAKAI Kiyotaka * Install *.el before *.elc SAKAI Kiyotaka 1.82 (97/06/23) mew-alpha release * mew-cs-noconv-eol. * Makefile was changed to install all *.el. * Significant PGP/MIME hack. * mew-folder-alist fix to make it easy to input multi-level folder (("+work/mew" "mew") ("+work" "work")) -> (("+work/mew" "mew") ("+work/" "work")) * mew-file-ask-p SAKAI Kiyotaka 1.81 (97/06/18) mew-alpha release * Integrated body functions for inc, scan, and vscan. * mew-set-file-coding-system to fix Noconv bug of XEmacs. * Refile bug for multipart was fixed. * Refile action was strictly specified. If message mode exists, let it be. Otherwise, display the header. If any mark exists, stay the position. Otherwise, display the next. * Subject is displayed as CD: for Message/Rfc822 if CD: doesn't exist. 1.80 (97/06/15) mew-alpha release * "n" for new folder at refile made a refile mark. This bug was fixed. * Style of Xemacs's emacs-version changed. So, changed regex for mew-x-mailer. 1.79 (97/06/08) img release * mew-assoc-case-equal for mew-summary-refile. * Defined mew-characterp. * PGP/MIME hack for the case where his public key doesn't exist. * Added In-Reply-To: to mew-rfc822-fields. * Defined mew-erase-buffer and mew-set-buffer-tmp. * Next message bug fix for mew-summary-refile. * mew-save-application/octet-stream-p was obsolete. * Interface of mew-save-application/octet-stream was improved. Mito * Added +trash to mew-range-alist. 1.78 (97/06/02) img release * mew-summary-pick fix. * mew-summary-refile mark fix. 1.77 (97/06/01) img release * Deleted mew-file-chase-links which was defined to maintain backward compatibility to Emacs 18. Mew don't support Emacs 18 anymore, so use file-chase-links instead. * mew-symbolic-link was defined to rescue OS/2. OKUNISHI Fujikazu * Set scrollbar-height 0 only for Summary mode. Yuuichi Teranishi * mew-input-range causes an error unless range starts with "0-9a-zA-Z". * expand-file-name for mew-mail-path in mew-refile.el. * New re-sent uses imput. * Hard cordings of UNIX path separator "/" were eliminated. Defined mew-path-separator. * "poster" check. Maybe TABOO * mew-expand-file-name was obsolete. Use mew-expand-folder instead. * All completion mechanisms were uniformed in mew-complete.el. * mew-keyval was modified to allow field-keys which are not terminated by ":". * mew-draft-get-new -> mew-folder-new-message. * mew-summary-burst hack. * Defined mew-folder-check. * mew-refile hack. * mew-assoc-{equal,match,match2} hack. * mew-pgp.el hack to support sign-AND-encrypt service of PGP/MIME. * mew-random-string for more safe boundary. 1.76 (97/05/27) img release * Some MH dependencies were removed. * Info typos were fixed. OKUNISHI Fujikazu * "w3.el" support for access-type=url. Toshihiko SHIMOKAWA 1.75 (97/05/15) img release * inc/scan remembers neat cursor movements. * "--src" option for mew-summary-pack. 1.74 (97/05/07) img release * mew-{scan,summary}.el update. 1.73 (97/05/02) img release * mew-prog-scan-range-alist -> mew-range-alist. * mew-scan.el was modified for imget. 1.72 (97/04/29) img release * immv is supported for deletion and refile. * imput is ok if mew-fcc is nil. * impick is ok if while spaces are provided. * imget:: format is deferent from imls. * imls is ok. * mew-plet:: 'binary for XEmacs, 'no-conversion for Emacs. 1.71 (97/04/26) img release * Start walking with im series. * make-local-variable coding-system-for-{read,write}. SAKAI Kiyotaka . * Defined mew-which-el. 1.70 (97/04/21) mew-dist release * Retrieve the body of Message/External-Body only if typing C-cC-e. * Many syntaxes are uniformed. * Pretty good regular expressions. * Summary mode now reports the reason when an error occurs. * Yet another bug fix for mew-attach-undo. * Catch up to XEmacs 20.1 b15. * Defined mew-subsequence. * mew-draft-keyswitch bug fix. SAKAI Kiyotaka . 1.69 (97/04/02) mew-release release * Add many explanations to variables and functions. * mew-mark-process-all-folders is set to kill-emacs-hook by default. REMOVE THIS CONFIGURATION FROM YOUR .EMACS. * Yet another mew-draft-keyswitch bug fix from SAKAI Kiyotaka . But his patch couldn't handle vector sequence. So I modified. * mew-attach-line bug fix. SAKAI Kiyotaka * A fix for mew-attach-undo fatal bug. It calls mew-syntax-clear-marks now. * "'" -> "function". 1.68 (97/03/30) mew-release release * Infos are provided. * mew-draft-refresh. Maybe TABOO * Put mew-cache-flush in mew-summary-toggle-analysis. Murata Shuuichirou * Changed regular expressions for buffer. Use "$" instead of "\n" since there are, at least, three end of lines in the world. Add "^" to "[ \t]". * Define mew-prog-shell{,-arg} for cmd.exe. * Add "Resent-*:" to mew-rfc822-fields. 1.67 (97/03/26) mew-release beta release * bin/* upgrade - chmod 555 for vscan, uumerge, mew-refile - find a path for pick, etc. * Support for Gnumule 19.34.94 epsilon * Output of pick is line-based. So use mew-piolet instead of mew-plet in mew-summary-pick. IMAI Kenichi SAKAI Kiyotaka * PGP result duplicate bug fix(only for XEmacs). * Forward/Multi-Forward attachment/toolbar bug fix(only for XEmacs). * Reply with citation display bug fix(only for XEmacs). * mew-decode-syntax-print moves the cursor a wrong place. This is fixed. * mew-draft-show-attach is now generic enough so that it can execute any external commands including "xv", "ghostview", etc. Click left bottun on icons of Draft mode! * mew-mime-{start,call}-process now becomes generic. * On XEmacs, I decide to call any external commands immediately without y-or-n to hide Summary toolbar bug, sigh. 1.66 (97/03/24) the first beta release of Mew next generation to mew-release * XEmacs 20.1 full support. * Menu refine for Summary, Virtual, and Draft mode. * Toolbar for Summary and Draft mode. * Icons are ready. * Making code of Summary mode and that of Draft mode as symmetric as possible. * Many bug fixes found in 1.55. 1.55 (97/03/04) mew-dist release * "Message interface to Emacs Window" -> "Messaging in the Emacs World" * s/mew/Mew/g. * (message "") to cancel some messages. * Set ange-ftp-tmp-name-template to ensure that ange-ftp creates temporary files on /tmp/mewxxx. * Asynchronous FTP for access-type=anon-ftp. * Makefile bug fix. SAITO Tetsuya * Set process-connection-type nil for all start-process funcs. SAKAI Kiyotaka * Use make-symbolic-link instead of "ln". * Use make-directory instead of "mkdir". * Use copy-file instead of "cp". SAKAI Kiyotaka * Define mew-delete-directory-recursively instead of "rm -rf". * Delete mew-os2-p. * Delete mew-mule18-p * Define mew-window-home-buffer. * Define a content-type entry for ".tgz" and ".pgp". * "M-p" and "M-n" for mew-folder-map. SAKAI Kiyotaka * run-hooks mew-message-hook in mew-message-next-page. * Delete hilit19 from mew-draft. It is called via mew-draft-mode-hook. * unread-command-char -> unread-command-events in mew-temp-minibuffer-message. * Bug fix for undo in Draft mode. * Define new mew-header-syntax. * C-g on E in attachments set unintentional privacy. This is fixed. * "E" on attachments prepares a default decrypter. * A bug fix for "D" on attachments. * Implement mew-summary-burst. * Keyswitch bug fix. Koji Imada - je4owb/2 * Add pre-command-hook for keyswitch. Drago Goricanec * Signature insertion bug fix. Kazuyan / OKUNISHI Fujikazu * Draft mode "----" search bug fix. Maybe TABOO * Define mew-field-other-visible. "A. SAGATA" * Special thanks to SAKAI Kiyotaka 1.54 (11/25/96) mew-release release * Insert "\n" after mew-draft-attach-boundary-end. Shuhei KOBAYASHI * Refine Makefiles Maybe TABOO * "F" in attachments set charset us-ascii. Now it sets "guess". * "^$" -> "^-*$" in mew-cache-message-new. Havard.Eidnes * mew-save-transfer-form's end problem was fixed. PGP encoding on Emacs is now stable. Havard.Eidnes * mew-header-decode-regex was defined to pacify those how don't use MH 6.8.3.JPx. * Check non-erase in mew-summary-display-part. SAKAI Kiyotaka 1.53 (11/23/96) mew-release release * Makefile was modified again, sign. Maybe TABOO * mew-draft-keyswitch was generalized. * mew-header-canform now just adds mew-mail-domain. This fix for an environment where the domain contains the string of the first domain (e.g. jpcert.or.jp). * mew-attach-multipart fix. Shunichi GOTO * The same fix for mew-attach-external-body and mew-attach-pgp-public-key. * Writable check for mew-summary-folder-cache-save. Shuhei KOBAYASHI * Newline hack for mew-draft-syntax-file. Shuhei KOBAYASHI * mew-mime-application/octet-stream uses the obsolete name parameter as the default file name. 1.52 (11/21/96) mew-release release * Makefile was modified. Maybe TABOO * Insert "\n\n" when a truncated message doesn't have a header delimiter. * Some undo fixes. SAKAI Kiyotaka * Disabled C-y on attachments region. * mew-mule-p for mew-encode-text-magic. Jarle.Greipsland * Path expansion fix for mew-ext-anon-ftp. * mew-header-expand-alias-list: mew.el -> mew-header.el * mew-header-decrypters-collect fix. * PGP ".asc" suffix fix in mew-pgp.el. * mew-mime-pgp-keys now checks mew-prog-pgp. * auto-mode-alist fix. Shuhei KOBAYASHI * Add message/delivery-status for mew-mime-content-type. * Check mew-temp-dir in mew-clean-up. Yoshitsugu Mito 1.51 (11/18/96) mew-release release * Re-write version of Mew 1.50 * Re-write version of Mew for alpha testers. 1.06 (06/07/96) mew-release release * mew-draft-insert-signature hack. See mew-signature-insert-last and mew-signature-as-lastpart. David C Worenklein * mew-ask-range David C Worenklein * mew-trash-folder Maybe TABOO * Make mew-draft-keyswitch more generic. KITAJIMA Akira Koji Imada * Set split-window-keep-point t for split-window-vertically. SAKAI Kiyotaka * mew-message-highlight-url SAKAI Kiyotaka * Provide mew-minibuffer-folders-word and mew-temp-minibuffer-message so that we can enjoy SPC and TAB on refile completion. * C-u y requires read-coding-system if on Mule. SAKAI Kiyotaka * highlight-headers support for Xemacs Ulrich Drepper * mew-summary-send speed up SAKAI Kiyotaka * Don't force display to reply a scrambled message. SAKAI Kiyotaka * mew-summary-quit bug fix SAKAI Kiyotaka * inc now support password input for -norpop. * mail-citation-hook is deleted. * vscan patch including foiler alias bug fix and space-separated pattern for -subject. Shigeya Suzuki * OS/2 support Fujikazu OKUNISHI * mew-summary-highlight-lines-region bug fix SAKAI Kiyotaka 1.05 (03/28/96) mew-release release * mew-os2-p if t, use "cp" instead of "ln -s". * mew-summary-exec-current for "X" SAKAI Kiyotaka * mew-file-chase-links Yoshiaki KASAHARA * mew-draft-cite does support super cite. Shuhei KOBAYASHI * message retains in Summary mode if refiled as link. SAKAI Kiyotaka * recursive VM refile SAKAI Kiyotaka * multi refile Yoshinari NOMURA * mew-status-update updates only aliases by default. It does for both aliases and folders if it is called with prefix(C-u). SAKAI Kiyotaka * mew-ask-subject SAKAI Kiyotaka * A bug of mew-mime-external-send-mail due to the change of mew-draft-header is fixed. * mew-draft-header doesn't insert "Cc:" if cc is nil. * English is brushed up. Mikitomo Ushijima * Bug fixes for Xemacs. overlay. enlarge-window. Ulrich Drepper "Carl D. Roth" Wilfried Philips SAKAI Kiyotaka * mew-base64-encode-string bug fix * pick macro UMEMURA Akihiro * mew-draft-{yank,cite} save-restriction bug fix. * mew-draft-header typo fix. koba (Kobayashi Shinji) * mew-draft-on-key-p bug fix. koba (Kobayashi Shinji) 1.04 (02/29/96) mew-dist release * Functions of header completion staff in Draft buffer are enhanced. * mew-assoc-match bug fix * all "reverse" are changed to "reverse" to save cells! * mew-summary-{next,prev}-msg are redefined. * mew-buffer-substring is defined. * Make mew-base64-char64 one-liner... 1.03 (02/14/96) mew-dist release * "N" and "P" just moves cursor if mew-summary-buffer-disp-msg is nil. * Keep summary height(excluding mode line) ODD! (Why hasn't this code been included yet? I certainly implemented before...) * "n" display D-marked message even if all below messages are marked as D. Comment out (forward-line -1) on mew-summary-down to prevent this. * Typing "u" on a part whose message is marked causes an error. This is fixed. * (set-buffer-modified-p nil) for mark functions. * use buffer-substring-no-properties in lieu of buffer-substring in mew-match. Anders Lindgren * mew-summary-rmm has potentially a big bug, which marks "D" on another message if and only if the user types "D" on a part which is already marked as "D". This bug is fixed with mew-summary-rmm-one. * The same bug fix for mew-summary-refile Hirotaka Yokokawa * Underline and pick seedup patch SAKAI Kiyotaka UMEMURA Akihiro * mew-mime-application/octet-strem in lieu of mew-mime-default-function. 1.02 (12/21/95) mew-dist release * mew-summary-search bug fix. * Assign C-xC-o to mew-summary-jump-to-draft-buffer. * Don't recenter at refile. NAKAMURA Motonori * Move (mew-summary-highlight-lines) after sentinel. SAKAI Kiyotaka * Don't delete mew-watch buffer when quite. * Inc calls scan-body to fill the gap. * Synchronize the scan termination in inc. Tomoaki Tada * mew-mail-address patch to fix PGP key selection bug Makoto 'MAR_kun' MATSUSHITA * mew-summary-inc bug fix. folder -> mew-inbox Hirotaka Yokokawa * mew-prog-scan-default-range Akihisa Konno * Use file-truename to expand symbolic directory name in mew-summary-folder-dir-newp when Emacs19. This bug remains for Emacs18... Yoshiaki KASAHARA * Define mew-summary-exec-hook. * Mark @ and * enhancement Akihisa Konno * -not support for pick. Akihisa Konno * Strong marks and weak marks. * vscan enhancement. Shigeya Suzuki 1.01 (11/28/95) mew-dist release * Delete X-Mailer: field when reedit. * Don't set mew-reply-to by default. * Define mew-noreplyto-to-list mew-noreplyto-cc-list mew-replyto-to-list mew-replyto-cc-list This is a quite temporary solution. * passphrase failure bug fix. MOTOKADO Yoshihiro * (forward-char 1) in mew-message-prev-page for compatibility with emacs-19.28 and emacs-19.29 SAKAI Kiyotaka * undo don't delete message buffer. * Never ask update if a directory is older than its cashe file. * underline patch SAKAI Kiyotaka * mhc.el version up * "message/external-body" patch Yoshinari NOMURA * Window pop patch SAKAI Kiyotaka * Do update if .mew-cache doesn't exist. * Change the regex for keep-lines not to delete multipart. * "^" mew-mail-address "$". * overlay-put instead of put-text-property. SAKAI Kiyotaka * mew-input-filename bug fix. Suggested by Richard Levitte 1.00 (10/18/95) mew-release release * Define buffer-substring-no-properties on Emacs19 if not defined. * Never use text properties on Xemacs. * Warn if old style of mew-cite-format is used. * mew-temp-minibuffer-message bug fix. * Support Gnus v5. * mew-draft-header more neatly deletes Cc:. * redist never prepares Resent-Cc:. * All commands are sensitive end of buffer. Boundary problems are solved. * mew-summary-prev-page bug fixes. * mew-summary-exec displays "No marks". * You can execute mew-summary-forward on part. --End of file kazu-yamamoto-Mew-ff9c41b/00changes.2000066400000000000000000001723161256455547000174200ustar00rootroot00000000000000 Mew 2.1 (2001/11/01) Mew 2.1 release candidate 3 (2001/10/30) * Setting 0.05 instead of 0.01 for mew-smtp-command-content. This maybe rescue XEmacs. Tatsuya Kinoshita * Biding buffer-file-coding-system to prevent the side effect. * Adding the "-l" option for mew-prog-vgrep. * Ensuring that richtech-mode is disabled. * Setting max-mini-window-height to 1 in mew-summary-pipe-message. * Taking care of EXPIRED PGP keys. * Using mew-mule3.el even if Emacs is executed with the --unibyte option. Mew 2.1 release candidate 2 (2001/10/26) * gifsicle support to prevent XEmacs from dying. Hideyuki SHIRAI * Text/Xml support for mew-summary-execute-base. Hideyuki SHIRAI * Handling 'quit in sort and pack. * A patch for refile learning. Yoshinari Nomura * Fixing a bug that XEmacs dies when encoding GIF. Hideyuki SHIRAI * Edit again for qmail. Fumio Kaiyama * Bug fixes for privacy services in drafts. * Limit for re-search-foward in mew-text/xml-detect-cs etc. Hideyuki SHIRAI Mew 2.1 release candidate 1 (2001/10/24) * mew-auto-flush-queue works for mbox. * Workaround for mew-image-inline-p on Emacs 21.1. * Implementing mew-text/html-detect-cs and mew-text/xml-detect-cs. Hideyuki SHIRAI * Process status is well displayed on the mode line. * A bug fix for mew-demo-picture. NABEYA Kenichi * Defining mew-use-charset-sanity-check. * A patch for refile. Tatsuya Kinoshita * mew-input-folders hack. Tatsuya Kinoshita * Defining mew-syntax-treat-filename-function. Tatsuya Kinoshita * Defining mew-input-draft-buffer. Hideyuki SHIRAI * No sanity check if charset is specified. Hideyuki SHIRAI * C-cC-i for mew-summary-find-file. Mew 2.0.60 (2001/10/15) mew-dist release * Enhancing mew-param-analyze-broken to remove white spaces between encoded-words. * recenter for mew-summary-down. * "c" for mew-summary-copy. * Allowing the 'X' mark for +mdrop. * A bug fix for 'invisible. * "?" for mew-input-map. Tak Ota * Allowing multiple SPCs on POP sessions. Tatsuya Kinoshita Mew 2.0.59 (2001/10/12) mew-dist release * A bug fix for Multipart/Alternative. * Removing mew-summary-display-raw-header. * Use the "--decrypt" option instead of "--verify" for GnuPG. * Some "mew-pop-to-buffer" patches. Hideyuki SHIRAI * Defining mew-regex-ignore-folders. * Removing mew-sort-debug and mew-pack-debug. Using (mew-debug 'sort) and (mew-debug 'pack) instead. * A bug fix for folded quoted strings. * Defining mew-summary-message-number2. * A bug fix for PGP encryption. * Integrating "," and "C-cC-u". Use "," only. * Removing mew-pop-to-buffer. * Using mew-current-get-* as little as possible. Mew 2.0.58 (2001/10/10) mew-dist release * The "Type 'T'" message displayed only when the top level is truncated. * ".txt" suffix for dummy file names. * 't' in attach to toggle text/binary. * Defining mew-ask-fcc. * "Y" for mew-summary-cite. Mew 2.0.57 (2001/10/04) mew-dist release * XML support. * mew-mime-content-type hack. * A patch for contrib/mew-caesar.el. Hideyuki SHIRAI * mew-summary-kill-subprocess() now calls mew-pop-tear-down(). Hideyuki SHIRAI * Supporting .htm as well as .html. Hideaki MORINAKA Mew 2.0.56 (2001/10/03) mew-dist release * mew-summary-folder-cache-save() now includes mew-touch-folder(). * A bug fix for non-UIDL POP servers. * Unlimiting mew-header-max-depth for mew-scan-form-mark(). * Touching folders when 'mdrop. * mew-set-environment() moved after loading mew-rc-file. Kyotaro HORIGUCHI Mew 2.0.55 (2001/10/01) mew-dist release * A bug fix for file mode of manuals. * Code clean up for refile. * A bug fix for mew-regex-id. * Removing mew-folder-remotep. * +mdrop finally. * mew-time-diff. KOIE Hidetaka * If a number N is set to mew-pop-delete, it means to keep message on the POP server for N days. INOUE Tomohiro Hideyuki SHIRAI * A bug fix for mew-folder-check. Hideyuki SHIRAI * A bug fix for mew-substring. * A bug fix for mew-summary-sort. * A bug fix for mark handling of mew-summary-refile. * Fixing the problem of ":" vs "y" and/or "C-cC-l". Mew 2.0.54 (2001/09/17) mew-dist release * Defining mew-warning-field-level. * Bug fixes for mew-pop-info-name and mew-smtp-info-name. * completion-ignore-case hack in draft for mouse clicking. Hideyuki SHIRAI * Highlighting a body when reediting. * Re-writing mew-summary-sort. * C-u# now asks a printer name. * A bug fix for mew-header-fold-region. * Removing the last "," of enum in pattern.c. Wataru Saito * The "-f" option for "test" instead of the "-e" otpion in Makefile. kuwa Mew 2.0.53 (2001/09/10) mew-dist release * mewls bug fix for sort. KAMEI Ken-ichi * Sort and pack doesn't call mew-scan. Just arrange Summary cache. * Preserving all marks when scanning. * Enhancing thread architecture. Hideyuki SHIRAI * Defining mew-input-language-name. * A bug fix for mew-input-address. * Removing unnecessary code from mew-summary-sort. Tatsuya Kinoshita Mew 2.0.52 (2001/09/05) mew-dist release * "I" inserted a line in a underline overlay. So, underline was put onto two lines. This bug has been fixed. * A bug fix for mew-alias-expand-addrs. * A bug fix for mew-input-address. * Bug fixes for "(" and ")" again. NINOMIYA Hideyuki * The "-a" option for contrib/incdir. Yasunari Momoi "YAMAZAKI Noriyuki" * A patch for contrib/mew-fancy-summary.el. Hideyuki SHIRAI * Some defcustom hack. Hideyuki SHIRAI Mew 2.0.51 (2001/08/31) mew-dist release * Info updates. * Some defcustom hack. Hideyuki SHIRAI * Binary parts of a truncated message should not be decoded. * Now "Too large, truncated" message is displayed in the minibuffer. * Check the size from X-Mew-Uidl: carefully. * Addrbook now can contain group:; notation. It can be expand unless it recurses. * mew-summary-ls calles mew-mark-clean only when called interactively. * C-cC-o inserts X-Mailer: in the last. Tatsuya Kinoshita * Ask Subject: before "Really send this message? ". Koga Youichirou * 't' in mew-scan-form now means the position of thread indentation. "Takashi P.KATOH" * X-Mailer: now locates just above mew-header-separator. * insert-file-contents changes buffer-file-coding-system. "," is sacrificed and lpr-buffer goes wrong. mew-insert-message now preserves buffer-file-coding-system. * Workaround for a broken POP server which doesn't display UID after a message number. * X-Mailer: for Bcc:. * Bug fixes for mew-case-guess-when-composed. Tatsuya Kinoshita * Bug fixes for "(" and ")". NINOMIYA Hideyuki Mew 2.0.50 (2001/08/14) mew-dist release * info and doc updates. * mew-summary-sort: some bugs related to region are fixed. Tatsuya Kinoshita * mew-substring in mew-mule3.el: length of mew-error-broken-string to width. SAITO Atsunori * Defining mew-ask-mark-process. The default is nil. * Supporting sort region. (C-uS) "Takashi P.KATOH" * mew-encode-remove-illegal-fields has a bug which removes Subject: whose first line is null and whose second one has a value. This bug was fixed. * Setting mode of files under ~/Mail to mew-file-mode. * A bug fix for mew-case-guess-when-composed. Tatsuya Kinoshita * The "-l" option for "grep". "David A. Panariti" * Inserting X-Mew-UIDL: at the beginning of a mail. * mew-multibyte-string-p and multibyte hack. Hideyuki SHIRAI Mew 2.0 stable (2001/07/26) mew-release release * info updates. * Defining mew-set-language-environment-coding-systems to avoid the side effect of set-language-environment-coding-systems. * A bug fix form mew-mime-text/html. * A bug fix for mew-summary-auto-refile. * Rescue the SMTP sentinel. * mew-thread-only for "to". * the -man style of bin/{mewencode,mewls}.1. Shun-ichi GOTO Mew 2.0 pre4 (2001/07/22) mew-dist release * mew-refile-guess-by-folder prefers the entire folder to ml name. * save-excursion hack for mew-mime.el. * Unifying a region of Summary mode. See mew-summary-region-include-cursor-line. Hideyuki SHIRAI * "postnum" for x-sequence: * A bug fix for mew-sort-number. Hideyuki SHIRAI * "n" works for mew-summary-ls in the case that the scan form is old. * Defining mew-input-grep-pattern. * Adding key-bindings for [delete]. * A bug fix for mew-addrbook-clean-up. Tak Ota * PWD for Makefiles to same Emacsen on Windows. Motohiko Minakuchi Mew 2.0 pre3 (2001/07/16) mew-dist release * info updates. * Defining mew-mime-text/plain-ext. And charset hack. Mew 2.0 pre2 (2001/07/13) mew-dist release * info updates. * Forcing re-scan if the format of summary cache is old. * "tu" for mew-thread-unmark. Hideyuki SHIRAI * A bug fix for mew-addrbook-override-by-newone. NABEYA Kenichi . * contrib/mew-fancy-summary.el. Hideyuki SHIRAI * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI * highlight-body for mew-summary-convert-local-cs. Mew 2.0 pre1 (2001/07/08) mew-dist release * info updates. * A patch for Makefile.w32. Shuichi KITAGUCHI * save-match-data for mew-draft-dynamic-highlight. Hideyuki SHIRAI * CDP: bug fixes. * A bug fix of CDP: for S/MIME Ryutaroh Matsumoto * A bug fix for "h" on Summary. * "to"! 1.95b126 (2001/06/21) mew-dist release * Enhancing mew-reply-regex. Tatsuya Kinoshita * Setting scan form for "I" and Biff. * A users now can do MIIME stuff for the body! * A bug fix for mew-header-p(). This enbuged on mew-draft-dynamic-highlight(). * A bug fix for reediting multipart on +draft. Tatsuya Kinoshita * A bug fix for mew-draft-dynamic-highlight. Hideyuki SHIRAI * Removing mew-color-p. Shun-ichi TAHARA * A patch for bin/w32/dirent.c. Shuichi KITAGUCHI * bin/w32/* Shuichi KITAGUCHI * Defining mew-cite-strings-function. Tatsuya Kinoshita * Adding ":" to mew-regex-url. NINOMIYA Hideyuki * A bug fix for mew-summary-mark-region. Tatsuya Kinoshita Hideyuki SHIRAI * In-Reply-To is preferred for thread only if it contains one value. * mew-addrstr-parse-syntax-list ignores empty address "<>". Tatsuya Kinoshita * A bug fix for mew-encode-remove-illegal-fields. Shun-ichi GOTO * mew-ask-flush-case. KOIE Hidetaka * A bug fix for undo on drafts. * A bug fix for mew-pgp-verify. * Saving .mew-folder-{list,alist} when new folder is created. * set-buffer the original buffer in mew-summary-display. Hideyuki SHIRAI * A bug fix for the problem of "," vs raw-header. Hideyuki SHIRAI * A bug fix for mew-header-combine-field. * after-change-functions for dynamic header highlight KAMEI Ken-ichi 1.95b125 (2001/05/31) mew-dist release * PGP key fetch! * SMTP bug fix for locking. * New mew-from. Tatsuya Kinoshita * RFC 2822 compliance. * add-hook for local-write-file-hooks. Shun-ichi TAHARA 1.95b124 (2001/05/29) mew-dist release * "S" and "O" can't be used in +draft. * Defining mew-user, mew-name, mew-mail-domain. * Multipart can revive in +draft. * "case" can revive in +draft and +queue. * mew-addrbook-alias-add does not register alias for a null user. * "make" makes in the bin directory. * Some mew-config-* -> mew-case-*. * Guessing case when reediting normal messages. Tatsuya Kinoshita * Defining mew-content-type. * Making cases unique. Tatsuya Kinoshita * jit-lock for thread. Hideyuki SHIRAI 1.95b123 (2001/05/24) mew-dist release * Defining mew-draft-mode-reedit-queue-hook. Tatsuya Kinoshita * Inputting RET for C-uP and C-uN changes the mark to the default. NINOMIYA Hideyuki * Defining mew-config-guess-addition. Tatsuya Kinoshita * signature is selectives by cases. KOSUGE Takuya * A bug fix for NetNews folders. * Using jit-lock on Emacs 21. * Defining mew-face-eof-{message,part}. * Defining mew-insert-final-newline due to the bug of narrow-to-region on Emacs 20 and XEmacs. ^L can't be broken. * "E" works for RFC822 messages. * mew-news-path is passed to mewls. * mew-cc and mew-dcc uses mew-mail-address() if it is 'me. SUGIMORI * A patch for mew-summary-retrieve-message(). Makoto Kohno * A patch for contrib/mew-browse.el. Shuichi KITAGUCHI * Lovely hack for mew-config-guess-when-composed. Now a user can watch a header when modified. Tatsuya Kinoshita * Thread key-bindings are now reset. They all have the prefix "t". * C-uP and C-uN set mew-mark-walk. * Adding .dll. Tak Ota * A bug fix for mew-config-guess-when-replied. Tatsuya Kinoshita 1.95b122 (2001/05/09) mew-dist release * Big5 for XEmacs. * Fixing infinite loop of mew-summary-setup-mode-line(). * Defining mew-config-guess-when-{replied,prepared,composed} * Keep modified for mew-draft-rehighlight(). Hideyuki SHIRAI * Bug fix of reedit for a message whose first part is not text. * Clarify "case" for reedit. * Removing sit-for. * Getting mew-param-analyze-broken() back to the old logic. * mew-theme-file hack. FUKANO Akihiro * C-uC-cC-e now prepares a default value for CT:. * Fixing the last range for mewls. Yoshiaki Kasahara * MS Office patch. Hideyuki SHIRAI 1.95b121 (2001/04/24) mew-dist release * Merging wvHtml for WORD files. * Making execute-external safer. Hideyuki SHIRAI * A bug fix for mew-win32.el. Hideyuki SHIRAI 1.95b120 (2001/04/24) mew-dist release * C-cC-e is now executable on a message. * A bug fix for ".". Tatsuya Kinoshita * A bug fix for "h" in Message mode. Hideyuki SHIRAI * A patch for text/html2. Hideyuki SHIRAI * Supporting ks_c_5601-1987. * C-uC-cC-y asks you arguments of the specified commands. * New API for mime-content-type. * mew-{front,rear}-{,non}sticky handle only text. * Defining mew-mime-external-body-list. * Singlepart body with unknown CTE: is now treated as a multipart. * The number of buffer local variables is now as small as possible. * ":" displays the syntax of a body. * Defining mew-ct-*p. * Defining mew-insert-manual. * mew-summary-execute-command can take args. Hideyuki SHIRAI * mew-summary-set-config can be used in thread. SUGIMORI * Singleparts in Multipart/Alternative are marked with "*". * Defining mew-find-longest-match(). * Separating warning and info. 1.95b119 (2001/04/09) mew-dist release * Raw text strings in parameters are decoded before splited with ";". * ":" for mew-summary-analyze-again-alternative. * Defining mew-use-alternative. * mew-face-header-date. Takashi SATOH * C-cC-y for mew-summary-execute-command. * "ml2" for sorting. Kentaro Inagaki 1.95b118 (2001/04/03) mew-dist release * Load mew-theme-file if non-nil. Hideyuki SHIRAI * Defining mew-syntax-get-entry-by-cid for mew-w3m.el. * Supporting Multipart/Alternative. See mew-mime-multipart-alternative-list. * Putting face except line delimiters. Hideyuki SHIRAI * s/cite3/cite5/ in mew-theme.el. Takashi SATOH 1.95b117 (2001/04/01) mew-dist release * Try to send a message even if smtp-auth is t and a server does not support SMTP AUTH. * Defining mew-mime-content-disposition. Obsoleting mew-content-disposition-inline-list and mew-mime-content-type-ignore-cdp. * Creating mew-theme.el. * Try to decode even if a message is truncated. 1.95b116 (2001/03/29) mew-dist release * last:N is supported for range. * Setting mew-addrbook-orig-alist with unquoted strings when C-uC-cC-a. SUGIMORI * A bug fix for Bcc: vs +backup. * Sender: is now decided when the message is sent. * A patch for contrib/mew-summary-hl.el. Hideyuki SHIRAI * Using delete-windows-on so that scrambled drafts are not displayed. * Removing bold from the comment face. Shun-ichi TAHARA * defface -> faces group. Ryutaroh Matsumoto 1.95b115 (2001/03/20) mew-dist release * Using defface. Now three kinds of colors, TTY, bright-background, dark-background can be defined. * A bug fix for X-Face:. * A bug fix for "." of end-of-* * Overriding smtp-auth, smtp-auth-list, smtp-user, smtp-helo-domain when sending a message in +queue. 1.95b114 (2001/03/18) mew-dist release * mewencode.1 and mewls.1 * Ensuring downcase of shortname in Addrbook. * contrib/mew-nmz-fixer.el. Hideyuki SHIRAI * CID: hack. Hideyuki SHIRAI * A color patch for Emacs 21. 1.95b113 (2001/03/13) mew-dist release * Colors are available on Emacs21/XEmacs with the -nw option. * M-a -> mew-summary-addrbook-edit. * Fixing duplicated entries buf of mew-summary-addrbook-add. * SMTP bug fix. * SAMBA support. 1.95b112 (2001/03/04) mew-dist release * Defining mew-touch-folder-check-enabled-p. Tatsuya Kinoshita * A bug fix of mouse-face. * defcustom hack. Ryutaroh Matsumoto * S/MIME patches. Ryutaroh Matsumoto 1.95b111 (2001/03/03) mew-dist release * Enabling case for mew-summary-send-message. Tatsuya Kinoshita * mew-blinfo. * Fixing Bcc: bugs. * mew-mark-{put,delete}-here use insert-and-inherit() instead of insert() to inherit highlight. * mew-scan-insert-line checks mew-use-highlight-mark. * Removing mew-range-{auto,interactive}-alist. * Hack for queue folders. * Patches for contrib/mew-summary-hl.el. Hideyuki SHIRAI Shun-ichi TAHARA * A patch for mew-fancy-highlight-body-setup. Hideyuki SHIRAI 1.95b110 (2001/03/01) mew-dist release * A patch for body property. KAMEI Ken-ichi * Enabling C-cC-e on Emacs 21. Hideyuki SHIRAI * You can now specifies "queue-folder" in mew-config-alist. * C-cC-c in Summary mode flushes messages in this queue folder or the default queue folder. * A patch for mew-thread-indent-propery. Hideyuki SHIRAI * New contrib/mew-summary-hl.el. Hideyuki SHIRAI * A patch for fancy highlight. Hideyuki SHIRAI 1.95b109 (2001/02/25 Happy Birthday!) mew-dist release * Defining mew-highlight-body-max-size. * Highlighting non-MIME messages. * Integrating fancy highlight body. Set mew-use-fancy-highlight-body. Hideyuki SHIRAI * See if current-language-environment is bound. 1.95b108 (2001/02/22) mew-dist release * Supporting OpenSSH 2.5. Shun-ichi GOTO * mew-lang-jp.el hack. Shun-ichi TAHARA * paragraph-start hack for Draft mode. Shun-ichi GOTO SUGIMORI * mew-use-highlight-{body,url}. Tatsuya Kinoshita 1.95b107 (2001/02/21) mew-dist release * Flushing caches when 'x'. * Fixing the bug of X-Mew:. * when/unless are now allowed. * Highlighting text/plain in message caches for Message mode. * Highlighting citation only in Draft mode. * Fixing the +++inbox problem. Hideyuki SHIRAI * Fixing the problem of auto-refile in the case mew-use-thread-separator is used. Hideyuki SHIRAI * S/MIME patch. Ryutaroh Matsumoto * defcustom patch Ryutaroh Matsumoto * mew-buffer-message for gnuclient Yoshiaki Kasahara 1.95b106 (2001/02/17) mew-dist release * Don't window-scroll-functions to highlight Message/Draft. * Defining mew-use-highlight-{header,body,mark,url} * A bug fix for deleting multipart in the attachments. 1.95b105 (2001/02/15) mew-dist release * Fixing a fatal bug of mew-highlight-body-region. * No highlighting if window-system is nil. * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI 1.95b104 (2001/02/15) mew-dist release * Preemptive SMTP sending. KOIE Hidetaka * Defining mew-summary-cook-function. Hideyuki SHIRAI * Enabling auto-refile in thread folders. Hideyuki SHIRAI * xemacs-codename hack. Hiromichi Kawachi * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI * A patch for mew-summary-up. Hideyuki SHIRAI * A patch for mew-was-regex. Tatsuya Kinoshita * Sophisticating buffer management. * Obsoleting mew-set-buffer-tmp. (But it is left.) 1.95b103 (2001/02/10) mew-dist release * Concatenating folders gussed by C-uo with ",". KOIE Hidetaka * Defining mew-summary-mark-undo-all again. Hideyuki SHIRAI * mew-dir-messages to make directory-files faster. * A bug fix for mew-summary-search-mark. Hideyuki SHIRAI * A patch for mew-draft-header. Tatsuya Kinoshita * contrib/mew-gnus.el. SAKAI Kiyotaka 1.95b102 (2001/02/06) mew-dist release * "k" to delete sub-thread. * A patch for mew-refile-view-unmark. Hideyuki SHIRAI * A bug fixing of Fcc (after SMTP). * Improving consistency of marks between Summary and Virtual. i.e. "U", "ma", "mr" * Obsoleting "mu". This is trade-off for thread(Virtual). * Removing mew-remote-folder-cache-delete. (This was not used.) * A bug fix for burst. * Removing mew-folder-member. Now mew-folder-insert uses member() which is much faster. * delete -> delq. * mew-mime-text/plain uses buffer-substring instead of buffer-substring-no-properties because Emacs 21 implements composite characters as a property. * Organization: patch. Tatsuya Kinoshita * Error handling for Q-encoding. * "?" for thread folder and "/" for Virtual mode. Hideyuki SHIRAI * A bug fix for mew-pop-biff-setup. NINOMIYA Hideyuki 1.95b101 (2001/01/29) mew-dist release * E on +draft configures the window. * Defining mew-pop-sentinel-non-biff-hook. * mew-summary-search-mark hack. Hideyuki SHIRAI * A bug fix for mew-summary-exchange-mark in Virtual mode. * A bug fix for mew-attach-next. * condition-case for write-region in POP sessions. * mew-pop-check. NINOMIYA Hideyuki * mew-pop-biff-function. Tak Ota * mew-pop-biff-setup disables the timer if mew-use-biff is nil. * Cleaning up mew-env.el. 1.95b100 (2001/01/25) mew-dist release * Biff can bark for POP servers which don't support UIDL. * E on +draft switches a buffer of +draft/n if exists. * buffer-disable-undo to save resources. Hideyuki SHIRAI * A minor fix for defcustom. OHARA Shigeki * Adding mew-thread-display-hook. Hideyuki SHIRAI * Workaround for the "biff vs password" problem. * Some enhancements for invisibility. * SMTP status hack. (RFC 1893) Tatsuya Kinoshita 1.95b99 (2001/01/18) mew-dist release * Don't override {Resent-,}Sender: if exists. * Using run-at-time and cancel-timer even on XEmacs. * mew-summary-make-invisible checks existence of buffers and input-pending. * copy-list -> copy-sequence. 1.95b98 (2001/01/18) mew-dist release * C-cC-l now converts MIME-decoded-but-not-charset-converted text. * Mode line for Summary/Virtual displays "[n more]*" if thread information is still visible. When the thread information becomes invisible over the entire buffer, mode line displays "[n more]" (asterisk disappears). * A bug fix for "y". A text/plain body was not decoded. * mew-virtual-cache-valid-p -> mew-thread-cache-valid-p Hideyuki SHIRAI * Using idle timer for invisible. * mew-eoh is set by mew-regex-setup. * C-u i now doesn't flush +queue. * Sender: hack. Defining mew-use-sender. * Defining mew-header-mode-hook. * mew-summary-scan-sentinel-hook -> mew-scan-sentinel-hook. * mew-summary-inc-sentinel-hook -> mew-pop-sentinel-hook. * Defining mew-smtp-sentinel-hook. * Now now we have: mew-{pop,scan,smtp}-sentinel-hook. * Biff doesn't put the lifetime of POP password longer. * Biff doesn't flush +queue. * Removing mew-sublist. * "I" now takes care of the current folder. * New mew-summary-hl.el. Hideyuki SHIRAI * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI * Handing the case where an SSH server refuses a connection. KOIE Hidetaka HAYASHI Chifumi 1.95b97 (2001/01/11) mew-dist release * Workaround of mew-make-postfix-invisible for Emacs 21. * Detection for POP lock. * Modeline hack for biff. 1.95b96 (2001/01/10) mew-dist release * SASL for POP had a side-effect. When receiving a big message, Mew created a very long string. This bug has been fixed. * Implementing POP biff. See mew-use-biff and mew-use-biff-bell. * Flexible mechanism for get/set functions. * Defining mew-scan-form-size-huge. Tatsuya Kinoshita Tak Ota 1.95b95 (2001/01/06) mew-dist release * SASL for POP. * O(N) algorithm for mew-uniq-alist. * choice for defcustom. NINOMIYA Hideyuki * A fix for mew-win32.el. Hideyuki SHIRAI 1.95b94 (2001/01/04) mew-dist release * No thread separator on the first line. NINOMIYA Hideyuki * Bug fixes for mew-summary-thread-{up,down}. * Extending mew-count-lines for mew-use-thread-separator. * Correct handling for wrong passwords of SMTP AUTH. * A bug fix for 55-characters-boundary problem of MD 5. * A bug fix for mew-summary-thread-move-cursor. Hideyuki SHIRAI * mew-prog-ms*. Shuichi KITAGUCHI 1.95b93 (2000/12/28) mew-dist release * Defining mew-summary-ls-no-scan-hook. * C-u I and C-u m I are case-ready. * C-u I and C-u m I now reverse mew-pop-delete. * Fixing the unsigned char bug of mewls. * Removing mew-time-cts-*. * Make mew-pop-body-lines configurable. * A patch for 'wrap' citation. Tatsuya Kinoshita * Removing mc-flag. * Using new macro style for defvar. * Removing post-conv. 1.95b92 (2000/12/25) mew-dist release * Workaround for Mew bombs. * A bug fix for mew-use-8bit. * base64 stuff for XEmacs 21.1. NINOMIYA Hideyuki * A bug fix for mew-pop-clean-up. * Fixes for careless mistakes. NINOMIYA Hideyuki HAYASHI Chifumi 1.95b91 (2000/12/23) mew-dist release * Stopping support for Emacs 19/Mule 2.3. * Using defalias instead of fset. * Using replace-match as much as possible. * Using invisible instead of selective-display. * Defining mew-scan-form-extract-rule. mew-scan-form-from-name-only and mew-scan-form-from-addr-only are now obsoleted. Shun-ichi TAHARA * Defining mew-summary-thread-move-cursor. Hideyuki SHIRAI * A bug fix for mew-summary-mark-select-thread. Hideyuki SHIRAI * Defining mew-use-thread-separator. NINOMIYA Hideyuki * Removing defmacro as many as possible. * Enhancing mew-sort.el. Hideyuki SHIRAI * Fixing mew-icon-directory. NINOMIYA Hideyuki * Unsigned char fixes for mewencode -g. Tatsuya Kinoshita * A bug fix for mewencode -g. Shun-ichi GOTO 1.95b90 (2000/12/15) mew-dist release * utf-7. Hideyuki SHIRAI * Implementing "I" and "i". 1.95b89 (2000/12/13) mew-dist release * Bug fixing and enhancing thread commands. Hideyuki SHIRAI * mew-mark-tmp -> ?\0. * Mark soft-coding patch. Hideyuki SHIRAI Shun-ichi GOTO * Visualizing thread without recursive function call. Shun-ichi TAHARA * Deleting mew-summary-convert-local-cs2. * mew-smtp-auth-list can be used in config. * Ensuring POP's end of session. * Allowing the case where one boundary is a substring of another boundary. * Yet another bug fix for mew-draft-auto-fill. * Yet another patch for subject-simplify. Tatsuya Kinoshita 1.95b88 (2000/12/12) mew-dist release * Defining mew-cite-ignore-mouse-region. * Fixing the mouse-region vs citation problem. SAKAI Kiyotaka . * Soft coding mode-name. KOIE Hidetaka * Supporting SASL(PLAIN,LOGIN) as well as CRAM-MD5. * Defining mew-summary-display-raw-header. * A patch for subject-simplify. Tatsuya Kinoshita * A bug fix for mew-draft-auto-fill. Kenichi Nabeya * A bug fix for highlight-url. HAYASAKA Hiromu * mew-thread-only NINOMIYA Hideyuki 1.95b87 (2000/12/08) mew-dist release * Toolbar hack for refile in Virtual mode. NINOMIYA Hideyuki * Making "g" and "C-cC-b" thread-friendly. * Ignoring marks in Virtual mode when quitting. KOIE Hidetaka * Enabling mew-summary-thread-{parent,child,brother-up,brother-down} in Summary mode. Hideyuki SHIRAI 1.95b86 (2000/12/08) mew-dist release * Virtual folders are highlighted by default. See mew-highlight-mark-folder-type for more information. * mew-summary-thread-{parent,child,brother-up,brother-down}. Hideyuki SHIRAI * Fancy threading. Shun-ichi TAHARA * Fixing mew-refile-init. kill-emacs-hook now calls mew-refile-clean-up. * Now you can use "o", "!", "mo" in Virtual mode. 1.95b85 (2000/12/06) mew-dist release * A bug fix for mew-complete. SAKAI Kiyotaka . * Catching a error signal in base64-decode-string. Takuro Horikawa * mew-scan-get-line extracts the last id from References:. * "C-cC-g" -> "C-cC-z". * "," displays a message in the echo area if too large. KOIE Hidetaka * "t" checks mew-summary-buffer-folder-cache-time. * Disabling mew-mark-afterstep in "mt". * Exclusive check for mew-summary-thread-region. * A bug fix for mew-mime-image. 1.95b84 (2000/11/30) mew-dist release * Thread fixes and profile. * A patch for mewls. Tatsuya Kinoshita * A patch for mew-icon-p. KIM Hyeong Cheol * Hash size patch. Shun-ichi GOTO 1.95b83 (2000/11/29) mew-dist release * regexp-quote for addresses. Tatsuya Kinoshita * A bug fix for the "-nw" option of Emacs 21. * mew-{,insert-}buffer-substring. * Making "t" more convenient. * A patch for mew-win32.el. Shuichi KITAGUCHI * Summary/Virtual menu patch. NINOMIYA Hideyuki * mewls can display the last line of References:. * HAVE_POOL for mew.h. Hideyuki SHIRAI Atsushi Onoe * A patch for mew-cite-strings. Tatsuya Kinoshita * Removing goto-line. * Cite label hack. See mew-draft-cite-fill-mode for more information. KOIE Hidetaka Tatsuya Kinoshita * A bug fix for mew-input-comma. * Defining "h" in Summary mode, debugging "h" in Message mode. * Backup status files. 1.95b82 (2000/11/27) mew-dist release * mew-summary-{msg,part} hack. Hideyuki SHIRAI * Displaying the current message when "t". KOIE Hidetaka * A fix for serious bug of mew-scan-form-from. * In Summary mode, "** no subject **" is displayed if Subject: is empty. This is just for threads. * bin/w32. Shuichi KITAGUCHI * "mt" is for putting the '*' mark on the current thread. * "mm" is for making thread. * "^", C-cC-p, C-cC-n to walk thread. * mew-summary-decode-pgp: C-cC-p -> C-c\C-g. * mew-folder-clean-up removes virtual folders before saving. * A patch to mew-refile-view.el. sen_ml * "t" in Virtual goes to corresponding physical folder and moves to the message. * C-uC-cC-c in Summary flushes the current buffer only. Tatsuya Kinoshita 1.95b81 (2000/11/25) mew-dist release * Defining mew-thread-column. This value can be set in mew-scan-form-list, too. * A bug fix of mew-check-config in Emacs 21. KIM Hyeong Cheol Hideyuki SHIRAI * mew-refile-clean-up to avoid saving every time when "x". * Defining mew-count-lines which counts \n only. * mew-addrbook-alias-add doesn't overwrite if a target already exists in Addrbook. * Setting mew-cs-m17n to ctext-unix to save ^M. * Removing highlight at unmarking even if the folder is matched to (mew-highlight-this-folder-p). * Adding virtual folder to mew-folders-ignore-p. * A bug fix for deleting comments in Addrbook. 1.95b80 (2000/11/24) mew-dist release * "t", "C-u t" and "mt" for thread. 1.95b79 (2000/11/22) mew-dist release * Toolbar hack for Emacs 21. * mew-exit-minibuffer-function and mew-input-comma-function. KOIE Hidetaka * Extending C-u C-c C-o. Tatsuya Kinoshita 1.95b78 (2000/11/20) mew-dist release * "." vs count-lines. Hideyuki SHIRAI * Info update. * "==" and "!==" for mewls. SAKAI Kiyotaka * Right reassemble procedure. * Patches for join. Hideyuki SHIRAI * Binding system-time-locale to "C" when using format-time-string in Emacs 21. SAKAI Kiyotaka Hideyuki SHIRAI * Sort variety. * Using pp instead of prin1 in mew-save-lisp. 1.95b77 (2000/11/17) mew-dist release * Join for message/partial. Hideyuki SHIRAI * Pick macro. * Warning for "X" if executed on the bottom. Hideyuki SHIRAI * Updating info. * Defining mew-scan-form-from-addr-only. * Case fold search for pick SAKAI Kiyotaka * "g" chooses a inbox folder according to mew-config-input. Toru YANO sen_ml * (mew-mark-clean) for sort. * s/mew-config-syncronize/mew-config-synchronize/g INOUE Tomohiro sen_ml * A patch for Makefile. KOIE Hidetaka * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI 1.95b76 (2000/11/07) mew-dist release * A bug fix for mew-cache-message. Tatsuya Kinoshita * Ensuring final newline for uudecode. * A bug fix for TIS-620. * Error message hack for mewencode. * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI 1.95b75 (2000/11/01) mew-dist release * Defining mew-serv-to-port so that .mew-uidl uses service names. * Sanity-check of '\n'. * Highlighting Summary mode for POP and scan. * Fixing mewdecode so that it doesn't exit but warn when illegal characters are found. * Adding copyright to contrib/*. Hideyuki SHIRAI * X-Mailer hack for XEmacs. Shun-ichi TAHARA * contrib/mew-nmz.el again. Hideyuki SHIRAI * A patch for contrib/mewinc. Shun-ichi TAHARA * Supporting "Re> " for i-mode. Tatsuya Kinoshita * Cast for isdigit() in mewls. * A bug fix for mew-decode-warning-body. * prototypes for C source files. * bin/Makefile hack. SAKAI Kiyotaka 1.95b74 (2000/10/23) mew-dist release * Fixing the queue vs cache problem. Tatsuya Kinoshita * mew-msgid-{user,domain} -> mew-smtp-msgid-{user,domain}. * Defining mew-prog-ssh-arg. e.g. (setq mew-prog-ssh-arg '("sleep 10")) * Some patches for bin/ SAKAI Kiyotaka * A patch for SMTP debug log. OHARA Shigeki * "quit" -> "QUIT" OHARA Shigeki * contrib/incmbox. Yasunari Momoi * contrib/mewinc. Shun-ichi TAHARA 1.95b73 (2000/10/17) mew-dist release * contrib/incdir for Maildir(qmail). Yasunari Momoi * Too big vs "a". Tatsuya Kinoshita * case-fold-search for mew-scan-form-type SAKAI Kiyotaka * Yet another fixes for Virtual mode. Hideyuki SHIRAI * A patch for X-Mew-UIDL:. Ninomiya Hideyuki * Pick pattern for mewls. 1.95b72 (2000/10/16) mew-dist release * mew-summary-virtual-with-grep. Hideyuki SHIRAI * Ad hoc mechanism to detect a broken string has been removed because it doesn't work on XEmacs and Emacs 20.7 with --unibyte. * Set mc-flag to t function-locally in mew-header-encode-region so that Emacs 19.x works. mc-flag must be nil buffer-locally in the draft at encoding so that re-search-forward works especially for GB2312. Sigh... * Solving cache-sort problem. Tatsuya Kinoshita * A patch for mew-time-rfc-to-sortkey. Ninomiya Hideyuki 1.95b71 (2000/10/15) mew-dist release * Decode multipart even if CTE: is not composite-type. * -i option for mewls. * match_pattern matches even if multiple lines for key exist. * Bug fixes for mew-cache-message. * mew-mail-path can be passed to mewls. * "C-u/" in Summary mode. 1.95b70 (2000/10/12) mew-dist release * A patch for mewls to fix a long line from stdio. Konuma Masaki * A patch for mewls's pick. SAITO Tetsuya * Fixing toolbar syntax for XEmacs. * Fixing a toolbar problem in Virtual mode. * All variables for path are now downcased. * bindir patch. Yoichi NAKAYAMA * mew-conf-path is now set to mew-mail-path. INOUE Tomohiro * A patch for the position of mew-folder-make-alist. Hideyuki SHIRAI 1.95b69 (2000/10/11) mew-dist release * Defining mew-config-synchronize. Shun-ichi TAHARA * Some #ifdef for mewls. Takuro Horikawa * mewls -a -p pattern sleeps only when it prints fields. * Patches for strlen in mewls. Tatsuya Kinoshita * Analysis of multipart is now conformant to RFC 2046. Tatsuya Kinoshita 1.95b68 (2000/10/10) mew-dist release * Some #ifdef for mewls. Hideyuki SHIRAI * Virtual mode is back. 1.95b67 (2000/10/09) mew-dist release * mew-scan-fields is now customizable. * mew-content-disposition-inline-list instead of mew-content-disposition-type. * C-uC-cC-e asks Content-Type:. * mew-mailbox-type to select either 'pop or 'mbox. * Many files, which kazu can't support, have been deleted. * A bug fix for mew-debug for MIME decoding. * Customizable argument encoding scheme. Hideyuki SHIRAI * Bug fixes for mew-param-sanity-check. 1.95b66 (2000/10/05) mew-dist release * mew-header-encode-string chooses a charset for the entire string, not each charset of substrings. * "inline" is now default for CDP:. Set mew-content-disposition-type to customize it. * Generic sanity-check for parameters. * (Re: ...) is the same of (was ...). Tatsuya Kinoshita * Fixing refile vs scroll problem when too big. 1.95b65 (2000/10/03) mew-dist release * Prohibiting refiling messages to +draft. * Supporting NetBSD SSH. Haruhisa Minami * mew-header-decode-region calles mew-header-sanity-check-region last. * mew-summary-search-mark always clears mew-summary-buffer-find-keyword. * Coding style changes for mewls and mewencode. * README has been deleted. 00api has been created. * Some bug fixes on argment coding-system for pick. * Saving .mew-uidl when POP is finished. * mew-summary-find-keyword-{down,up} centerize if a match found. Otherwise, they display the end/beginning of the buffer at most. * M-p for mew-summary-find-keyword-up * A buf fix for mew-kill-buffer. Ninomiya Hideyuki 1.95b64 (2000/09/29) mew-dist release * mxo is for mew-summary-exec-refile. * mxd is for mew-summary-exec-delete. * Fixing mew-kill-buffer so that it kills a process as well. * mew-scan-form-mark-delete is now default to nil. * Error recovery for mew-substring. * mew-smtp-mail-from. * mew-prog-grep* hack. Hideyuki SHIRAI * Ensuring that mew-coding-system-p returns t when the argument is nil. * M-n in Summary mode is now bound to mew-summary-find-keyword-down. 1.95b63 (2000/09/27) mew-dist release * A patch for mew-scan-form-friendly-addr. Hideyuki SHIRAI * Several bug fixes for the --unibyte. * mew-charset-m17n is defined and default to "utf-8". * A patch for mew-scan-form-friendly-addr to remove recursive comments. * Defining mew-scan-form-list-{string,list}-type to let a user choose 'regex, 'string, 'recursive. * A string is not truncated if the width exceeds abs(minus-integer) in scan-from. 1.95b62 (2000/09/24) mew-dist release * Several fixes for mew-scan-form-func. * Several functions for mew-scan-form. Hideyuki SHIRAI * Fixing mew-summary-scan-form for Windows. Takashi SATOH 1.95b61 (2000/09/21) mew-dist release * X-Mew-UIDL: is put onto messages if truncated. * Defining mew-scan-form-list. * Configurable mew-scan-form. * Content-type hack. Shuichi KITAGUCHI 1.95b60 (2000/09/19) mew-dist release * mew-summary-display-raw doesn't call mew-message-hook. * Coding style hack for replace-match. * Setting multibyte stuff for encoding to prevent re-search-forward's failures. * mew-addrstr-parse-syntax-list hack. * A bug fix for mew-summary-refile. Getting information from the top level header. * Auto configuration of mew-touch-folder. Shuichi KITAGUCHI 1.95b59 (2000/09/15) mew-dist release * A fix for X-Mew:. * Fixes for mew-summary-display. * "8" to toggle mew-use-8bit. * mew-addrstr-parse-address parses just one address. * mew-summary-msg-or-part for save. * Quiting bold face for demo on XEmacs because center-line sucks. * New coding style for mew-{c,d}info-set. * mew-regex-nonascii to make it independent on the internal expression. * A patch for mew-insert-message. Shun-ichi GOTO 1.95b58 (2000/09/11) mew-dist release * "C-u SPC" now re-display a message or a part only. To remove limitations for decoding, use ".". * Drastic internal changes, including message caches. * Change buffer-name to mew-summary-folder-name. * Deleting the meaningless argment of mew-window-configure. 1.95b57 (2000/09/04) mew-dist release * Defining mew-port-sanity-check. * mew-encrypt-to-myself is defined. * Don't insert SPC between 'phrase' and ':;'. If 'phrase' ends with an 'encoded-word', this violates RFC 2047. But the spec itself is broken. * Toolbar for message. Ninomiya Hideyuki * A patch for POP communication. Tatsuya Kinoshita * The -wait option for mewls. Hideyuki SHIRAI * Choosing correct micalg when GnuPG is used. * Supporting SSH v2.3.0. Chifumi Hayashi 1.95b56 (2000/08/30) mew-dist release * Hiding the Status: field. * Sanity check for strings in the scan form. * Subfolders of +attach and +draft are removed from mew-folder-list. * Deleting all Mew's buffers when quit. * Removing all queue folders when refile. KOIE Hidetaka * Condition check for menu. Ninomiya Hideyuki * mewls opt patch. KOIE Hidetaka 1.95b55 (2000/08/27) mew-dist release * Defining mew-dir-list-with-link-count and mew-dir-list-without-link-count. * Obsoleted mew-folder-list-skip-pattern. * Some command can't be use in +draft and +queue. * mew-make-temp-name ensures to use ASCII only. * A fix for C-cC-k. * A fix for usage of w32-get-true-file-link-count. Hideyuki SHIRAI * A fix for mew-dir-list2 NAKAGAWA Takayuki 1.95b54 (2000/08/18) mew-dist release * Workaround when base64-decode-string fails. * Extending mew-header-replace-value. Shun-ichi GOTO * Postfix support for edit-again. * Similar coding style for SSH/POP/Scan/SMTP. * Timezone fix for sorting. Ninomiya Hideyuki * Using PTY for mewls. * A bug fix for MIME composing. * Using delete-process for network processes. 1.95b53 (2000/08/16) mew-dist release * Dividing mew-cs-database into mew-cs-database-for-{encoding,decoding} * Obsolete "~/Mail/.folders". Use ".mew-folder-list" and ".mew-folder-alist" instead. Now, creating a new folder became MUCH faster than before. * Complete bug fix for SSH password cache. * Removing headers for uumerge. Tatsuya Kinoshita * A patch for XEmacs on Windows. Shuichi KITAGUCHI * mew-cs-m17n for lisp saving/loading. * Use mew-header-encode-addr for mailbox even if ASCII only to check syntax. * A bug fix for broken Date:. * Cleaning up mew-cs-*. 1.95b52 (2000/08/07) mew-dist release * A bug fix for sort (ie time zone). * Displaying file time stamp if Date: is not present. * Taking care of Date: which doesn't contain time zone. * Getting back uumerge. * POP password caching with user/host/port. Takashi SATOH * touch-folder after scanning. Shuichi KITAGUCHI 1.95b51 (2000/08/03) mew-dist release * Making scan safer against broken strings. * The --field option for mewls. * Getting back mew-sort.el. Date: only. * Cleaning up unibyte and multibyte. * Support for Emacs 20 with the "--unibyte" option. 1.95b50 (2000/07/31) mew-dist release * Hacking time stuff. * Error avoiding for saving, bursting, converting 8bit to 7bit. 1.95b49 (2000/07/27) mew-dist release * Saving UIDLs when POP is quitting. * Defining mew-msg-user. Kenichi Niioka * Defining mew-hello-text. * Getting. mew-auto-flush-queue back. * Fixes for POP getting. * Distinguish continuous SPCs and meaningless TAB in Subject:. * Checking SSH process before sending strings. * Checking the existence of mewls in mew-summary-scan-body. * Made mew-scan-format safer From: is nil. * Made mew-pop-tear-down safer in the case where inbox is nil. * Setenv LANGUAGE for gnupg. * nostat for mewls. SAKAI Kiyotaka 1.95b48 (2000/07/19) mew-dist release * Cleaning up mode line after POP. Ninomiya Hideyuki * Binding coding system for write in drafts. * So many bug fixes for USER/PASS. 1.95b47 (2000/07/13) mew-dist release * A bug fix for mew-pop-filter. * USER/PASS support. Set mew-pop-auth. Kyotaro HORIGUCHI * PGP 6.5.1i support. Ninomiya Hideyuki Shigeki Fujii 1.95b46 (2000/07/12) mew-dist release * Don't put the D mark if Msg-Id: doesn't exist. Masaki KONUMA * Making Mew safer against unsupported charset. * Replacing TABs to a SPC on Subject: SAKAI Kiyotaka * mew-summary-toggle-disp-msg-hook Ninomiya Hideyuki * Displaying percentage of receiving messages. Shun-ichi GOTO * mew-pop-get-next instead of mew-folder-new-message. Shun-ichi GOTO * stat() hack. Kyotaro HORIGUCHI KOIE Hidetaka * Option and argument hack for imls SAKAI Kiyotaka * if -> ifdef in mewls Shuichi KITAGUCHI * Limit check for mewls. KOIE Hidetaka 1.95b45 (2000/07/08) mew-dist release * Fixing a type of mew-mode-line-id. Ninomiya Hideyuki * "D" mark for duplicated messages. * Bug fixes for mewls. KOIE Hidetaka * Packing. Masaki KONUMA 1.95b44 (2000/07/07) mew-dist release * Defining mew-decode-set-environment for burst. * mew-summary-inbox-position hack. Hideyuki SHIRAI * Defining mew-coding-system-p for non-Mule. * eq -> = if comparing numbers. * POP hack. 1.95b43 (2000/07/01) mew-dist release * mew-summary-inbox-position is set only if "i" is called in Summary/Virtual mode. * Obsoleting mew-cs-rfc822-trans. * Using string= wherever appropriate. * Using eq wherever appropriate. * POP hacking. * A bug fix for Bcc:. 1.95b42 (2000/06/29) mew-dist release * Binding print-length and print-level for Emacs 21's prin1. * A bug fix for mew-summary-display. * SSH password can be cached. * Now, mew-use-cached-passwd controls all password cache. e.g. mew-use-pgp-cached-passphrase is obsoleted. 1.95b41 (2000/06/28) mew-dist release * case is guessed when To:, Cc:, and Newsgroup: are inserted into a draft. * The old "." now became "C-u SPC". That is, mew-summary-{show,display} have been integrated. "." is an analysis command removing its cache. "C-u ." analyzes the message with mew-decode-broken reversed. * Enhancing mew-summary-exchange-point. KOIE Hidetaka 1.95b40 (2000/06/27) mew-dist release * Defining mew-regex-virtual. * Defining mew-summary-edit-header-for-{message,draft,queue}. * install-info opts and args in info/Makefile. * Supporting Emacs 21. * Defining mew-smtp-auth. And for mew-config-alist. * mew-fcc is default to +backup. * Getting back mew-config-guess-alist. * mew-decode-tag-fields -> mew-decode-ws-fields. * Canonicalizing aliases on Bcc:. Takashi SATOH * OpenSSH 2 support. Hidetomo Hosono * Decode unknown coding-system if mew-decode-broken. shirai 1.95b39 (2000/06/05) mew-dist release * Both "." and "C-u ." flush its cache. * Updating X-Mailer: when "E". * Adding Content-Length to mew-field-delete-for-reediting. Murata Takashi * Fixing infinite loop of mew-param-analyze-broken. Ryota HIROSE * The perfect regular expression for quoted strings. * Fixing infinite warning of ",". * mew-header-sanity-check-string retains SPC even if all-ctls. * Fixing a warning message for parameter. 1.95b38 (2000/06/01) mew-dist release * "C-u ." now displays a message with mew-decode-illegal reversed. * Defining mew-no-warning-{fields,params} * Defining mew-decode-illegal-subject-tab, mew-decode-tab-fields, mew-use-name-parameter. * Defining mew-param-analyze-broken. * Sort then uniq mew-decode-illegal. * A bug fix for mew-header-decode-region. "\000"s remained. * Defined the missing mew-mime-image/tiff. Hayato Ishibashi * Property for X-Mew: Shuichi KITAGUCHI 1.95b37 (2000/05/28) mew-dist release * Be liberal for broken messages. mew-decode-illegal-{quoted-phrase,raw-subject,mime-parameter,text-body} * "Config:" is saved for "E". * "E" in +queue used an improper cache. This bug has been fixed. 1.95b36 (2000/05/24) mew-dist release * Bug fix to handle multiple drafts. Encoded messages don't appear to users anymore. * Bug fixes for SMTP. * Appropriate Bcc, Dcc, Fcc when "E" on messages in +queue. * Get mew-{,real-}send-hook back. * A patch for mew-virtual-thread.el Hideyuki SHIRAI * Defining mew-smtp-flush-hook. Shuichi KITAGUCHI * Creating mew-md5.el. * A patch for mew-subject-simplify. KOIE Hidetaka 1.95b35 (2000/05/19) mew-dist release * Password cache for SSH/SMTP Auth. See mew-use-{ssh,smtp}-cached-passphrase. * Retaining Dcc: in .mqi. * mew-header-{en,de}code-{base64,qp} -> mew-{base64,q}-{en,de}code-string. * SMTP Auth. Currently, on XEmacs only. * mew-smtp-user for SMTP Auth. * UTF-8. (require 'un-define) by yourself. * mew-summary-convert-local-cs2 for header. (C-cC-d) * CTE: x-uuencode decoding. (Implemented in mewencode.) * mew-start-process. KOIE Hidetaka 1.95b34 (2000/04/20) mew-dist release * Try EHLO first, and try HELO if failed. * Binding case-fold-search in mew-subject-simplify. Shun-ichi GOTO * Binding mark-active in the cite functions. KAMEI Ken-ichi * Dynamically check capability of image on a frame. Daiki Ueno * Simplify mew-icon-p. Daiki Ueno 1.95b33 (2000/04/18) mew-dist release * Mode menu pops up in each mode on XEmacs by 3 button. * Creating mew-auth.el. (just a toy) * Some XEmacs hacks. Yoshiki Hayashi * Subject: hack function. KAMEI Ken-ichi Shun-ichi GOTO * Patches for contrib/mew-nmz.el Hideyuki SHIRAI * assoc -> assq if appropriate. 1.95b32 (2000/04/13) mew-dist release * immknmz hack. Hideyuki SHIRAI * Catching format-decode-buffer's error. * RFC 2017 support. access-type=url. Ninomiya Hideyuki * Resent-From: is passed to MAIL FROM. * Displaying a message when "!". utashiro 1.95b31 (2000/04/11) mew-dist release * Checking existence of a buffer in mew-summary-set-config. Hideyuki SHIRAI * C-u X processes all marked messages before the cursor. * C-u x processes marked messages in the region. * If mew-use-burst-folder-history is non-nil, mew-burst-last-folder is used as a candidate of a burst folder. * Fixed the bare LF problem for non-Mule Emacs. * Deleting old X-Mew: for C-cC-p. * See if a coding-system exists on decoding. (hack for ISO-2022-JP-3) * "smtp-hello-domain" for mew-config-alist. 1.95b30 (2000/04/09) mew-dist release * ISO-2022-JP-3 test support for Emacs 20.x. * Info updates. * Deleted mew-addrbook-unexpand-regex. * "header-alist" can be used in mew-config-alist. * Removing unnecessary newline of Smtp log in the case of errors. KOIE Hidetaka 1.95b29 (2000/03/09) mew-dist release * C-cC-s and C-cC-r in Summary mode now can breaks page delimiters. * Explanation for GNUPG is now displayed when PGP key is added. * A fix for C-cC-e in Draft mode. * Returning "" if read-passwd causes an error. Hideyuki SHIRAI * comment-region now works for citation in Draft mode. * A fix for IMAP resend. Hideyuki SHIRAI * A fix for re-edit. Hideyuki SHIRAI * touch-folder for queues. Hideyuki SHIRAI * A bug fix for mew-encode-learn-aliases. * contrib/mew-nmz.el. Hideyuki SHIRAI 1.95b28 (2000/02/21) mew-dist release * A fix for PGP vs undo. * If you type "C-u" for PGP signature function, you can specify PGP user id (usually an e-mail address) instead of From:. * A bug fix for PGP unsupported signature. * contrib/mew-nmz.el. Hideyuki SHIRAI 1.95b27 (2000/02/16) mew-dist release * PGP unsupported signature(2). * Removing mqi files when messages in +queue are marked with 'D' Shuichi KITAGUCHI * Supporting OpenSSH. Shuichi KITAGUCHI 1.95b26 (2000/02/08) mew-dist release * Supporting multiple SMTP servers. 1.95b25 (2000/02/03) mew-dist release * A patch for loading order. Hideyuki SHIRAI * Toolbar hack for XEmacs 1.95b24 (2000/02/03) mew-dist release * The decoding mechanism is sophisticated for re-edit. * Creating mew-const.el, mew-blvs.el and mew-vars2.el. * Creating mew-nntp.el. (Just a toy now) 1.95b23 (2000/01/31) mew-dist release * When reedit, "charset" is cleared so that the charset of the file can be guessed. * "E" in +draft now recovers attachments. * Getting edit-again (M-e) back. * A bug fix for C-cC-o vs header problem. * Customizing patches again. SAKAI Kiyotaka 1.95b22 (2000/01/28) mew-dist release * mew-queue-backup. * 'no-err -> t for re-search-{forward,backward}. * A bug fix for mew-encode-save-draft. * defcustom for Emacs 19.28. Hideyuki SHIRAI 1.95b21 (2000/01/27) mew-dist release * defcustom for Emacs 19.28. Hideyuki SHIRAI * Some hacks for resending. * Supporting Bcc: and Resend-Bcc:. * Read-only for a body of Header mode. * Bug fixes for PGP. * C-cC-o replaces From: if exists. * Defining mew-header-replace-value. * mew-draft-undo hack (for resend). * C-cC-o for Header mode. * Mode name in Header mode. * Patches for contrib/mew-summary-hl. Hideyuki SHIRAI 1.95b20 (2000/01/26) mew-dist release * A bug fix for mew-summary-switch-to-folder. * t -> 'no-err for re-search-{forward,backward}. * Header mode is now ready! You can resend and send a massage to other receivers. "r" for resending. "W" for sending to other receivers. * A bug fix for "error in process filter: Selecting deleted buffer". * Customizing patches. SAKAI Kiyotaka * Warning against illegal ranges. SAKAI Kiyotaka 1.95b19 (2000/01/24) mew-dist release * mew-folder-new-message see if whether or not a buffer exists corresponding to a new file. * mew-summary-reply prohibits to be executed in +draft. ksakai * mew-config-init. Shuichi KITAGUCHI * mew-draft-set-config set mew-draft-buffer-config only. * Date: fix. Masaki KONUMA Hideaki YOSHIFUJI Kenji Sato * Header encoding fix for Mule 2.3. SAKAI Kiyotaka * Defining mew-mail-address again for backward compatibility. 1.95b18 (2000/01/20) mew-dist release * SMTP fixes. * Config fixes. * Friendly messages for config input. Shuichi KITAGUCHI * A patch for contrib/mew-summary-hl.el. Hideyuki SHIRAI 1.95b17 (2000/01/13) mew-dist release * Touch folder hack. Shuichi KITAGUCHI * Fixing mew-substring. Masaki KONUMA * "." for parts. * Checking null string for Addrbook. * PGPv5 fixes for "not encrypted" with invalid key of ANY kinds. Michael Steiner * Adding the "X" mark for mark existence check. Masaki KONUMA * No sorting for directory-files. Masaki KONUMA * SPC doesn't scroll message buffers if not displayed. * Syncing the return value of base64-decode-string and that of mew-header-decode-base64. Masaki KONUMA 1.95b16 (99/12/28) * mew-generate-{mail-address,mail-domain,from}-list. * Supporting SSHv2. * Functions for buffers and folders have been re-written. * The config feature has been drastically re-written. Now, the Config: field is obsoleted. * mew-touch-folder for SMTP. Hideyuki SHIRAI * selected-window instead of mew-pop-to-buffer, again. Hideyuki SHIRAI 1.95b15 (99/12/22) mew-dist release * Checking the existence of ssh. * Making filters and sentinels safer. * Killing drafts became safer. * Loading "~/.mew" when initialized. * Rotating Smtplog. * selected-window instead of mew-pop-to-buffer. kyota (Kyotaro HORIGUCHI) * A mechanism to locate log files. * Defining mew-conf-path. 1.95b14 (99/12/16) mew-dist release * SSH is now available! Set mew-smtp-ssh-server. 1.95b13 (99/12/14) mew-dist release * A patch for contrib/mew-browse.el. Hideyuki SHIRAI * Config comes back. See mew-config-alist. Currently, inbox-folder, from, and msgid-domain are supported. * mew-use-full-window is default to nil. * A patch for reply fragments of SMTP. SUGIMORI * Typo fixes. Masaki KONUMA * Macro fix. Shun-ichi GOTO 1.95b12 (99/12/13) mew-dist release * mew-window-use-full -> mew-use-full-window. (Should be obsoleted) * mew-stmp.el has benn brushed up. Logging, recovering, and message fragment-safe. * mew-random has been defined to avoid the same sequence. * Both mew-date and mew-message-id use format-time-string. * Addrbook is now assumed to be under ~/Mail. * A mew-pioalet patch for mew-nmz.el. Hideyuki SHIRAI * Defining mew-pioalet. Shun-ichi GOTO * English is blushed up. Masaki KONUMA 1.95b11 (99/12/10) mew-dist release * A bug fix for the case where Addrbook doesn't exist. * A coding-system bug fix for "y". * Fixing the Draft mode vs window-configuration problem. * A bug fix for Fcc:. * Message-ID: is added by Mew. * A bug fix for the Draft mode vs auto-save problem. * A bug fix for the Draft that starts with null lines. * A bug fix for draft undo. * A bug fix for SMTP sentinel. * Set mew-init-p to nil when quitting. * Deleting decode-syntax when "E" in +queue. 1.95b10 (99/12/08) mew-dist release * Saving non-saved buffers for multipart composing. kyota (Kyotaro HORIGUCHI) * mew-smtp-keep-connection. * Dummy timer functions for Mule for Win32. Hideyuki SHIRAI * Undo if no recipient in Draft. 1.95b9 (99/12/07) mew-dist release * CRLF bug fixes for SMTP. * Environment hacks. * "." transparency for SMTP. 1.95b8 (99/12/06) mew-dist release * Header remains unmodified for "E" in +draft. Hideyuki SHIRAI * Defining mew-capitalize. * Defining mew-timer-reset. * Mew now speaks SMTP. Queuing is processed by Mew. * Using the third argument of rename-file. * Thraw imput, impath, Petname, Aliases away. * More friendly message for "I" and "C". Shuichi KITAGUCHI * A bug fix of window configurations for C-cC-c and C-cC-m. 1.95b7 (99/11/29) mew-dist release * A bug fix for duplicate privacy marks. * A bug fix for the multipart vs C-cC-s problem. * Preventing refiling messages to +queue. * "E" move msg to #msg when executed in +queue. * Flushing +queue asynchronously. * A bug fix for mo. * A bug fix for the case encryption fails. * Defining mew-attach-folder. * Defining mew-remove-entry. * Updating contrib/*.el Chifumi Hayashi Hideyuki SHIRAI 1.95b6 (99/11/23) mew-dist release * mew-auto-flush-queue is t by default. * Defining mew-regex-*. * Right use of directory-files. * A new mark "X"(M-d) to be really removed anyway. * Brushing mew-mark.el up. * C-cC-c flushes +queue only in +queue with Summary mode. * C-cC-m queues the composed message to +queue. * List modification functions. mew-add-first, mew-insert-after, mew-replace-with. * mew-which-exec. Shuichi KITAGUCHI * A patch for contrib/mew-browse.el. Hideyuki SHIRAI * mew-complete-*-ignore-case. Hideyuki SHIRAI * Patches for contrib/mew-gnus.el. Toshio HORI * C-cC-c in Draft asks whether or not you really want to send the draft if mew-ask-send is non-nil. * Bug fixes for function definitions in mew-addrbook.el. SAKAI Kiyotaka 1.95b5 (99/11/15) mew-dist release * Sophisticated some features of b4. * Many comments and documents are added. * Some parts of Summary-to-Draft functions are integrated. * Enabling encoding marks for attachments. * Bug fixes for C-u y in Summary mode. * Many functions which assume database structures are abstracted. * In attachments, "C" specifies an output "charset" parameter. "I" specifies an input file-coding-system for a text file. * A buf fix for mew-draft-auto-fill. * A bug fix for mew-highlight-header-region. * mew-input-config requires matching. 1.95b4 (99/11/10) mew-dist release * mew-use-8bit enables CTE: 8bit for 8bit charset. * Multipart-oriented reediting. * 8bit-to-7bit converter. * A bug fix for the mark vs update problem. * Defining mew-charset-input-method-alist. E.g. (setq mew-charset-input-method-alist '(("iso-8859-1" . "latin-1-postfix") ("iso-8859-2" . "latin-2-postfix"))) * A patch for mew-highlight.el. "Takashi P.KATOH" * Cursor position hack for message prefetching. * Set mew-cache-prefetch-remote to t. * Defining mew-pgp-verify-addr. Chifumi Hayashi * A tiny patch for mew-bq.el. Hideyuki SHIRAI * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI * Brush up mew-{en,de}code.el so as to use base64-{en,de}code-{region,string}. * Size hack. SAKAI Kiyotaka * C-u mew-summary-addrbook-add targets the first address on To:. Hideyuki SHIRAI * Checking redraw-frame for BOW. * A patch for mew-refile-view.el. "Takashi P.KATOH" * mew-ask-flush-queue "Takashi P.KATOH" Hideyuki SHIRAI * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI * IMAP fixes. Hideyuki SHIRAI * Preventing infinite loop of PGPv5. * Making mew-header-{en,de}code-base64 faster. Masaki KONUMA 1.95b3 (99/10/15) mew-dist release * Validity check for Fcc:. Tomoya Ida * C-cC-a in Summary mode registers To: and Cc: if From: is mine. * "p" and "n" in attachments move line by line if mew-attach-move-by-line is non-nil. * Defining mew-summary-jump-{message,top,bottom}-then-display. * A tiny patch for mew-scan.el. Hideyuki SHIRAI 1.95b2 (99/10/14) mew-dist release * Fcc: vs folder hack. * Removing mew-attach-dummy. * XEmacs compiled with --with-scrollbars=no doesn't have scrollbar-height. Daiki Ueno * mew-header-clear removes the read-only property from the entire buffer. * s/find-mew-file/find-new-file/ SUGAI Norihiko * contrib/mew-refile-misc.el. sen_ml * A patch for contrib/mew-summary-hl.el.diff. Hideyuki SHIRAI 1.95b1 (99/09/27) mew-dist release * Check contents of a directory before removing it. (NFS) * contrib/mew-summary-hl.el. Hideyuki SHIRAI * Ensuring that mew-summary-*-sentinel-hook runs in Summary mode. Hideyuki SHIRAI * Completion hack for Config:. SAKAI Kiyotaka * A patch for mew-win32.el. Shuichi KITAGUCHI * A patch for mew-nmz.el syncing with mew-fake-imap.el. Hideyuki SHIRAI * contrib/mew-fake-imap.el. Hideyuki SHIRAI * A patch for contrib/mew-virtual-thread.el. Hideyuki SHIRAI * If mew-refile-guess-from-me-is-special is t, mew-refile-guess-by-default produces folders according to To: and Cc:. --End of file kazu-yamamoto-Mew-ff9c41b/00changes.3000066400000000000000000000500501256455547000174070ustar00rootroot00000000000000 Mew 3.2 release (2003/02/25) Mew 3.2 release candidate 1 (2003/02/18) * Net debugging now records strings to be sent. * A bug fix for "y" when mew-use-samba-encoding is 't'. * Hiding the Face: field. NINOMIYA Hideyuki * Learn aliases after no error occurred Hideyuki SHIRAI Mew 3.1.53 (2003/02/05) * Supporting non-UIDL POP server. * mew-hscroll() uses auto-hscroll-mode if bound. Hideyuki SHIRAI * Defining mew-delete-other-window(). Hideyuki SHIRAI * Assigning a dummy buffer to a process due to Window's PTY bug. Hideyuki SHIRAI * Adding the "TMPDIR" environment variable. Tatsuya Kinoshita * A bug fix for mew-smtp-queue again. KOIE Hidetaka * mew-summary-mark-call-command -> mew-summary-cmd-msgs. And "m\" -> "M-\". * A bug fix for the support of non UIDL POP servers. * A bug fix for mew-input-folder-prefix when called by mew-input-refile-folders. Mew 3.1.52 (2003/01/23) * A bug fix for DOC handling. * info updates. * Hacking SSL/SSH notification. Hideyuki SHIRAI * Displaying the lock XPM on XEmacs. Hideyuki SHIRAI * Deleting .mdi/.mqi files when 'D','X', and 'o' are executed. * Fixing en-bugged SMTP/NNTP. Tatsuya Kinoshita * Don't decode encoded-word in addr-spec. * Defining mew-use-highlight-x-face-inversion. * Unmarking in Summray mode when "m/". * Defining mew-ask-charset. * Making mew-encode-make-multi simpler. * A bug fix for mew-draft-header. Mew 3.1.51 (2003/01/20) * A typo fix for "m\". KOIE Hidetaka * Integrating X-Face: features. * Visualizing X-Face: on Emacs 21. * "\" for mew-summary-call-command and "m\" for mew-summary-mark-call-command. * "m/" for mew-summary-mark-virtual. * Obsoleting the following variables: mew-noreplyto-to-list mew-noreplyto-cc-list mew-replyto-to-list mew-replyto-cc-list mew-fromme-to-list mew-fromme-cc-list And defining the following variables: mew-reply-all-alist mew-reply-sender-alist mew-reply-fromme-alist This change enables support for NetNews and non-standard fields such as Mail-Folloup-To:. * Setting mew-summary-buffer-secure-process to nil in mew-summary-unlock. Hideyuki SHIRAI * Defining mew-field-for-printing. * A bug fix for C-cC-e in the case where cover page does not exist and only one text attachment exists. * Defining mew-ssl-verify-level. Koga Youichirou * "stunnel" is supported instead of "openssl s_client" for SSL. Now server certificates can be verified. * If SSL/SSH is used for POP/IMAP/NNTP, a lock image is displayed in a mode line on Emacs 21. * mew-real-send-hook is not called when "n" is typed for "Really send this message?". * 'binary for "C-uy" is obsoleted. Use raw-text-foo on Emacs or no-conversion-foo on XEmacs. * A bug fix for mew-smtp-log. HAYASHI Chifumi * mew-vinfo-set-flds for thread. Hideyuki SHIRAI * A bug fix for mew-smtp-queue. KOIE Hidetaka Mew 3.1.50 (2002/12/24) * Supporting Emacs 21.3.50's UTF-8. * Supporting Emacs 21.3.50's tool-bar. * A bug fix of "key" for C-u/. * Logging SSH server in Smtplog and Nntplog. Hideyuki SHIRAI * Defining mew-use-spc-padding. Hideyuki SHIRAI KOIE Hidetaka * Translation between Latin 0 and Latin 1. * Universal argument for mew-summary-jump-message. e.g "12j" KOIE Hidetaka * Adding regexp-quote to mew-path-to-folder. Hideyuki SHIRAI * mew-summary-goto-folder now selects a default folder according to mew-case-input if in a local folder. Tatsuya Kinoshita * Defining mew-nntp-msgid-user and mew-nntp-msgid-domain. * C-g can be used when typing a password. * mew-folder-spec removes case from folder if exists. Hideyuki SHIRAI * Quotation for IMAP's SELECT. * Loose the case format. Hideyuki SHIRAI * Double quotation for IMAP commands. Kazuhiko Izawa Mew 3.1 release (2002/12/02) * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI * A bug fix for mew-proto-to-body. Hideyuki SHIRAI * Inheriting case from a remote folder to its thread folder. * Touching %queue folder. Hideyuki SHIRAI * A patch for contrib/mew-nmz.el. HAYASHI Chifumi Mew 3.1 release candidate 2 (2002/11/20) * info/doc updates. * A warning patch for bin/mewencode.c. KIMURA Yasuhiro * Deleting case: in mew-input-folder-prefix. Hideyuki SHIRAI * mew-input-folder-prefix inserts mew-case-input dynamically. * Defining mew-ask-cc. KOIE Hidetaka * The data structure of folders changed for mew-assoc-folder-fast. Type "1Z" and "3Z" for local and IMAP respectively. If you don't use capital letters for your folders, set mew-use-fast-refile to t. This make marking for refile much faster. * Implementing "lX". Hideyuki SHIRAI * Making mew-folder-input* clearer. * Prompt style change. Tatsuya Kinoshita * "B" and "lc" ask a user if the directory does not exist. * Defining mew-ask-to. KOIE Hidetaka * "?" caused an error when it was executed on the fancy separator. This bug has been fixed. * "i" is now a command to copy messages from a server to a local inbox. * "g" does not refer mew-case-input anymore. * Defining mew-draft-set-completion-ignore-case. * mew-input-folder-prefix() allows users to input "-" in the middle if it is used for mew-complete-local-folder. * A buf fix for marking thread. The sort function has side-effect. * A bug fix for mew-input-folder-search-setup. Hideyuki SHIRAI * Setting file mode when bursting. Tatsuya Kinoshita * If mew-charset-m17n is "utf-8" and Mule-UCS is not available, mew-charset-m17n falls back to "iso-2022-jp-2". * Adding CPPFLAGS to bin/Makefile. Hiroshi Fujishima Mew 3.1 release candidate 1 (2002/11/01) * Yet another bug fix for "A". Mew 3.0.73 (2002/10/31) * C-u y + binary does not convert charset. Hideyuki SHIRAI * Defining mew-time-ctz-to-sortkey-invalid. NINOMIYA Hideyuki * Adding CVS hack to Makefile. KOIE Hidetaka * Creating mew-darwin.el. * Deleting a temporary file when a synchronous process is finished. * A patch for bin/w32/config.h. Shuichi KITAGUCHI Mew 3.0.72 (2002/10/29) * "lc" now calls mew-local-folder-check. * mew-local-folder-insert now recurses to register parents directories. * Removing mew-local-folder<. * Implementing mew-assoc-folder so that mew-local-folder-alist can be the alphabetical order. * Preserving case of draft for re-editing. * A bug fix of citation when mew-use-other-frame-for-draft is t. * Using bcopy if memmove does not exist. SAKAI Kiyotaka Shun-ichi TAHARA * A patch for mew-highlight-folder-comp-search-window. Hideyuki SHIRAI Mew 3.0.71 (2002/10/21) * Displaying candicates on folder search mode by SPC. Hideyuki SHIRAI * Using PIPE instead of PTY on Darwin since Darwin's PTY is buggy. * read-only property on folder search mode. Hideyuki SHIRAI * A bug fix for C-s/C-r (again). Hideyuki SHIRAI * Supporting SSH on Solaris 9. Kenichiro MATOBA * "mlc". Hideyuki SHIRAI * Letting folder search mode work on Meadow. Hideyuki SHIRAI Mew 3.0.70 (2002/10/19) * Letting folder search mode work on XEmacs. * Folder search mode for multiple folder input. * C-p and C-n enter folder search mode. Hideyuki SHIRAI * Binding C-cC-i to mew-circular-complete-case for folder input. Mew 3.0.69 (2002/10/17) * Several fixes for folder search mode. Hideyuki SHIRAI * info updates. * Folder search (C-s and C-r) is now available. * Defining mew-net-status-percent-size, mew-local-status-unit, mew-local-status-threshold. * Excluding "*" in mew-input-folder-prefix. Hideyuki SHIRAI * mew-circular-complete-case moves the cursor backward if necessary. * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI * Defining mew-minibuf-point-min. * C-cC-i for mew-circular-complete-case. * A patch for prefix replacement. Hideyuki SHIRAI * "+", "%", "$", "*", "-" replace the previous prefix in minibuffer. * mew-queue-insert-file removes an old message buffer if exists. Mew 3.0.68 (2002/10/09) * "zc" is bound to mew-summary-cache-clean-up. * "zd" is bound to mew-summary-toggle-debug. * "zp" is bound to mew-summary-toggle-policy. * "zw" is bound to mew-summary-toggle-warning. Hideyuki SHIRAI * Catching up new warning messages of GnuPG 1.2.0. KOIE Hidetaka * mew-complete-local-folder now completes an absolute path. Hideyuki SHIRAI * mew-link uses copy-file if add-name-to-file failed. Hideyuki SHIRAI * Defining mew-ask-virtual-folder-name. * A patch for mewls to prevent an infinite loop. Hideyuki SHIRAI * The name of thread folder corresponding to "case:folder" is now "*case:fodlder", not "case:*folder". * mew-buffer-list hack. Hideyuki SHIRAI * nreverse for "mI" * LDFLAGS for bin/Makefile. SAKAI Kiyotaka * Taking care of mode-line-position in mew-summary-setup-mode-line. Hideyuki SHIRAI * Defining mew-scan-max-field-length. * Making use of time as well as date if Date: is broken. Murata Takashi * In-Reply-To: is now unstruct. Murata Takashi * "/" does not ask a virtual folder name now. A name "*+fld1,+fld2*" is used instead. * Resolving the "munyumunyu" problem when "x". Mew 3.0.67 (2002/09/24) * A bug fix for mew-summary-auto-refile. Tatsuya Kinoshita * The default value of max field length of mewls is now 5. * Removing mew-mode-line-magic-number. * Defining mew-range-list. * The entry of "$" in mew-proto-spec is now '("$" "+" nil "$" "+"). * If Text/* is specified when C-uC-cC-e, the attachment is not decoded. This bug has been fixed. Tatsuya Kinoshita * Prohibiting "d"/"md"/"td" in "-news.groups". * Defining mew-face-spec-set due to a bug of face-spec-set on Emacs 20.7. Tatsuya Kinoshita * Prohibiting "o" in $inbox. Use "lc" instead. * Defining mew-summary-local-copy. ("lc") * Defining mew-complete-local-folder. * Binding check of default-file-name-coding-system for XEmacs 21.1.14. * Some commands are not operational for invalid messages. Mew 3.0.66 (2002/09/02) * SMTP/NNTP sentinel hack. * Removing the quoting "function". * Defining mew-imap-trash-folder. * A bug fix for S/MIME's temporary file. * A bug fix for mew-summary-folder-cache-save. * Modifying mew-regex-url. SAKAI Kiyotaka Mew 3.0.65 (2002/08/23) * C-cC-c on %queue now processes the jobs. * Using the native md5 on Emacs 21. * A patch for the old Summary format. SAKAI Kiyotaka * IMAP jobs are now stored in %queue. * A bug fix for mew-imap-queue-folder. Tatsuya Kinoshita * A bug fix for mew-dir-messages. Mew 3.0.64 (2002/08/21) * A bug fix for mew-imap-skip-uidl. * A bug fix for IMAP CREATE. * C-u can be specified to mew-summary-isearch-{forward,backward} for regexp. KOIE Hidetaka * mew-summary-exec-offline is bound to "l". * mew-dir-messages is accelerated. * custom-set-faces -> face-spec-set. Tatsuya Kinoshita * mew-input-range returns a list of range and erase. * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI * Rejecting illegal range for local folders. * Defining mew-range-update. * A regex bug fix for mew-summary-cook-region. Shun-ichi TAHARA Mew 3.0.63 (2002/08/16) * Preserving refile info when killing an IMAP process. * Since highlight-summary is buggy, it has been removed. Mew 3.0.62 (2002/08/15) * A bug fix for the number of messages to be scanned. * highlight-summary is merged. To use this feature, set mew-use-highlight-summary to t. Shun-ichi TAHARA Mew 3.0.61 (2002/08/14) * mewls now tells the number of messages to be scanned. * A bug fix of Virutal mode for remote folders. * Accelerating IMAP refile. * Defining mew-summary-mark-duplicated. Binding it to "M". Shun-ichi TAHARA KOIE Hidetaka * A patch for contrib/mew-fancy-summary.el Mew 3.0.60 (2002/08/01) * A bug fix for NNTP reply. * Making NNTP2 code more readable. * Removing delete-process. * A bug fix of IMAP end-of-message. * A bug fix for the cursor position on "s" + "all". * Making SMTP code more readable. * A bug fix for SMTP over SSL. Mew 3.0.59 (2002/07/30) * A bug fix for mew-net-status2. * Defining mew-imap-skip-uidl to make 'exec and 'get much faster. * Enhancing the state machine of IMAP. * Removing mew-pop-tear-down. * Adjusting the cursor position for mI. * SSH process name now includes a server name. * Savin POP UIDL only when "QUIT" was sent. Mew 3.0.58 (2002/07/26) * Bug fixes of net-status. * SSL support. Mew 3.0.57 (2002/07/24) * A bug fix for mew-net-status1. * Defining mew-file-mode-mask instead of mew-file-mode. * Rotating NNTP log files. * The Model primary content type. * Removing X-Mew when forwarding. * Removing $ and - from refile candidates. * Preventing using bitmap in a character terminal. KIMURA Yasuhiro Mew 3.0.56 (2002/07/22) * The default value of mew-ssh-keep-connection is t for IMAP. * Fixing IMAP end-of-mail bug. * A bug fix for mew-summary-folder-dir-newp. Hideyuki SHIRAI * Putting mew-use-nfs-hack onto mew-local-retrieve. * NFS hack. Tatsuya Kinoshita * You can specify a target folder to clean up by C-u D. * M-x mew creates directories for %inbox at boot time. * Supporting SSH 3. Tomoharu Suzuki * A patch for bin/Makefile.w32 Shuichi KITAGUCHI Mew 3.0.55 (2002/07/02) * mew-smtp-auth is obsoleted. SMTP AUTH is used when mew-smtp-user is set like mew-nntp-user. * Year range check for encode-time. * Using free software only. Tatsuya Kinoshita * New value for mew-highlight-body-regex-cite. Tatsuya Kinoshita * X-Face: hack. Tatsuya Kinoshita * Supporting Oasys. * A bug fix for mew-input-folder. Tatsuya Kinoshita * Taking care of the second part of time zone. * mew-highlight-body-regex-cite hack. Tatsuya Kinoshita * A patch for contrib/mew-fancy-summary.el. Hideyuki SHIRAI * A bug fix for Text/Rfc-Headers. * mew-summary-kill kills a Message buffer. * A bug fix for mew-imap-folder-alist. * Defining mew-summary-not-in-nntp. * mew-{pop,imap,nntp}-folder are auto-generated with the user%port format. Take care! * Defining mew-summary-kill to kill a frame. * Delete a frame when C-cC-c/C-cC-m if mew-use-other-frame-for-draft is t. * Obsoleting mew-use-other-frame. Defining mew-use-other-frame-for-draft and mew-use-other-frame-for-summary. * Making burst generic. Tatsuya Kinoshita * Resolving the "g" vs "s" problem. Tatsuya Kinoshita * Defining mew-message-last-buffer. * Moving mew-minfo-set-summary to a right place. Hideyuki SHIRAI * A bug fix for mew-summary-prepare-draft. Hideyuki SHIRAI * A patch for POP sentinel. NINOMIYA Hideyuki * Adding windows-125x. Tatsuya Kinoshita * A patch for mew-summary-send-message. Tatsuya Kinoshita * Yet another patch for mew-input-folders. Tatsuya Kinoshita * A bug fix for mew-input-folders. Tatsuya Kinoshita * A patch for mew-refile-ctrl-multi. Tatsuya Kinoshita * A patch for thread regex. Hideyuki SHIRAI * A bug fix for mew-input-folder. Hideyuki SHIRAI * A patch for contrib/mew-nmz.el Hideyuki SHIRAI * A patch for config guess. Tatsuya Kinoshita * Supporting Text/Rfc822-Headers. * Defining mew-use-autoconv-when-unknown. Tatsuya Kinoshita * A patch for contrib/mew-fancy-summary.el. Hideyuki SHIRAI * after-change-functions goes to mew-elet. * "mc" NOGUCHI Yusuke * "tc" Hideyuki SHIRAI * Patches for mew-nmz.el. Hideyuki SHIRAI * A bug fix for mew-net-status. Hideyuki SHIRAI * Supporting POP servers which do not support APOP. * More specific regex to extract APOP key. Tatsuya Kinoshita * Defining mew-nntp-process-send-string(). * Defining mew-smtp-process-send-string(). * Defining mew-imap-process-send-string(). * IMAP support. Scanning %inbox only at this moment. * A bug fix for collecting groups. SAITO Takuya Mew 3.0.54 (2002/02/20) * mew-input-folder now uses mew-case-input. Hideyuki SHIRAI * Defining mew-folder-remotep. * Defining mew-syntax-treat-filename-default-function. * Yet another bug fix for "t*". * A bug fix for thread of case:-news.group. * Binding auto-image-file-mode to nil in mew-flet and mew-frwlet. * Supporting NNTP servers which do not support mode reader. * Defining mew-use-other-frame. * mode reader and etc for NNTP. Kenichi OKADA * mew-newsgroups-save creates a directory if not present. Mew 3.0.53 (2002/02/13) * Yet another bug fix for "t*". * A bug fix for mew-summary-join. Tatsuya Kinoshita * Seeing if incm exists or not. * Fixing the "foo: ;" problem. HAYASHI Chifumi * m17n hack for Summary mode of +draft. Tatsuya Kinoshita * Window-config hack for composing mails. Tatsuya Kinoshita * A bug fix for "t*". KOIE Hidetaka * Prefix for mew-draft-insert-signature. Tatsuya Kinoshita * Patches for incm. KOIE Hidetaka Masami Kobayashi Yasunari Momoi * A bug fix of mew-summary-save for the NAME parameter. KOIE Hidetaka * Creating folders specified by Fcc: when composing. Tatsuya Kinoshita * Debug hack. Hideyuki SHIRAI * sleep-for 1 for mew-touch-folder-check. Tatsuya Kinoshita * LANG: "en" -> "C" Tatsuya Kinoshita * A bug fix for mew-buffer-message. "[ODDS] ogawa, takanori" * Defining mew-encode-singlepart-hook. KOIE Hidetaka * Null body hack for incm. Masafumi Matsumura Yasunari Momoi * A bug fix for mew-insert-message. * Workaround for messages whose size is 0. SAKAI Kiyotaka * Defining mew-expand-folder2. * make clean hack. Koga Youichirou * A bug fix for mew-delete-file. Hideyuki SHIRAI * Displaying the number of marked messages. KOIE Hidetaka * Followup-To: Hiroshi Fujishima * incm hack. Yasunari Momoi * TIS 620 hack. Hideyuki SHIRAI * GCC hack for configure.in. Tatsuya Kinoshita * A patch for configure.in. Tatsuya Kinoshita Mew 3.0.52 (2002/01/09) * A patch for mew-summary-kill-subprocess. Hideyuki SHIRAI * Digit-argument for "0"-"9". mew-summary-toggle-8bit -> "z8". SAKAI Kiyotaka * NNTP bug fixes. Tatsuya Kinoshita * Supporting ".tif". Shinji UEDA * A patch for incm. Yasunari Momoi * Defining mew-folder-folder. * "nntp" service entry. Makoto Kohno * incm is merged. * no-fold option for mew-header-insert. Tatsuya Kinoshita Mew 3.0.51 (2001/12/20) * Saving and loading newsgroup list. * Supporting case for $inbox and newsgroups. * mew-complete-folder hack. * A patch for contrib/mew-nmz.el. * A bug fix of C-cC-z for multple PGP data. Tatsuya Kinoshita * Case-sensitive search for marks. Hideyuki SHIRAI Mew 3.0.50 (2001/12/13) * AUTHINFO for NNTP. * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI * A bug fix for w3m. Kan Sasaki Hideyuki SHIRAI * Refile hack and auto-refile hack. Hideyuki SHIRAI * Sort key hack: "ml2" -> "mlnum" Tatsuya Kinoshita * Copying minibuffer-local-map to mew-input-map. Tak Ota * A bug fix for mew-input-file-name. KUSAWAKE Hisasi Hideyuki SHIRAI * wvHtml hack. SAKAI Kiyotaka * A patch for contrib/mew-refile-view.el. KOIE Hidetaka * m17n hack. Tatsuya Kinoshita * Defining mew-prog-audio{,2} for Win32. * Illegal field hack. * A workaround for reediting ctext. Tatsuya Kinoshita * A bug fix for mewls's null pattern. Koga Youichirou * Removing ".CRLF" instead of "CRLF.CRLF" in a POP session. Tatsuya Kinoshita * A bug fix for md5 on XEmacs. * 'no-line-break for base64-encode-string. HOSONO Hidetomo * A bug fix for mew-start-process-disp. Hideyuki SHIRAI Kazumasa Utashiro * A patch for contrib/mew-nmz{,-fixer}.el Hideyuki SHIRAI * A bug fix for mew-replace-white-space. Hideyuki SHIRAI * +mdrop is renamed to $inbox. * NNTP support. * A bug fix for mew-summary-virtual-with-grep. Kidzu Takashi * Adding ISO-8859-15 rivo nurges --End of file kazu-yamamoto-Mew-ff9c41b/00changes.4.1000066400000000000000000000454651256455547000175650ustar00rootroot00000000000000 Mew 4.1 release (2004/10/18) Mew 4.1 release candidate 3 (2004/10/12) * A bug fix for mew-summary-set-walk-mark(). sai * UTF-8 support for contrib/mew-browse.el. Hideyuki SHIRAI Mew 4.1 release candidate 3 (2004/10/12) * "mM-u" converts the '*' mark to the 'U' mark. Mew 4.1 release candidate 2 (2004/10/06) * A bug fix for mew-physical-folder(). Hideyuki SHIRAI Mew 4.1 release candidate 1 (2004/10/05) * Defining mew-protect-privacy-with-old-pgp-signature. * mew-summary-{un,}mark-in-physical preserve the cursor position. * Avoiding overriding files in queue. Tatsuya Kinoshita * Making "tt" and "x" friendly to Virtual folder made of one physical folder. * Fixing bugs of the new mark scheme. * IMAP bug fixes. * sinfo is now passed with Summary cache as well. * Defining mew-imap-spam-folder. * You can create a thread for Virtual folder which is made of just one Summary folder. Mew 4.0.69 (2004/09/30) * Defining mew-delete-unread-mark-by-mark. * Set comment-start-skip in Draft mode. * Fixing a bug of EOL for the SEARCH command. * A bug fix for mew-decode-syntax-buffer(). Hideyuki SHIRAI * A bug fix for biff. * "C-um/" asks you a target mark. Now you can create Virtual mode for unread messages. * "m/" does not unmark the * mark in its physical folder. * Patches for contrib. Hideyuki SHIRAI * Don't put the unread mark if scanning all. * Face for the unread mark. * You can pick in Virtual mode if it is created from one folder. Mew 4.0.68 (2004/08/30) * Defining mew-summary-markable(). * "Md" puts the delete/unlink mark onto the unread mark. * The unread mark 'U' is implemented. Set mew-use-unread-mark to t. See also mew-unread-mark-list. * A fixing bug of SMTP/NNTP queuing. * DNS error check for SSL. Shuichi KITAGUCHI * ":" works for text messages as well as MIME messages. Mew 4.0.67 (2004/08/23) * One more bug fix for IMAP. * Fixing a bug for IMAP's "3Z". Mew 4.0.66 (2004/08/23) * A patch for reedit in +queue. Tatsuya Kinoshita * Defining mew-queue-check-new-message to avoid race condition of +queue. * "mI" now retrieves truncated messages only. * IMAP fetch now uses the byte of a literal to detect the tail of a message. * Making execute-external and excute-internal more elegant. * Introducing the mew-set function. * Obsoleting mew-mime-image-alist. Using mew-mime-content-type instead. * Supporting Ms-Tnef. Type C-cC-e to extract files. * C-cC-t to mew-summary-execute-internal. * The "-f" option for "incm" to preserve UNIX From. Yasunari Momoi Jonathan * PGP 6 key handling. TAKANO Yuji * Supporting "-ERR [IN-USE]" (RFC2449). Shun-ichi TAHARA * You can quit Mew without processing marks. All marks will appears when you run Mew again. * Making message search faster. KOIE Hidetaka * Checking windows-1251 instead of windows-1252. * "M*" for mew-summary-redo. * Sort now uses a right range. * A bug fix for mew-summary-kill-subprocess. * A patch for contrib/mew-refile-view.el. KOIE Hidetaka * New mark "$" is introduced. This mark should be used to backup the current "*" marks. * The "@" mark is obsoleted. All commands which targeted the "@" mark, including the "F" command, now work for the "*" mark. * A bug fix for "tg" on XEmacs. Shigeru Yasuda * A bug fix for mew-refile-guess-by-alist2. Kyotaro HORIGUCHI Mew 4.0.65 (2004/06/01) * Workaround for mew-addrstr-parse-syntax-list against Emacs 20.7's bug. * Decoding Subject: for auto refile. Tatsuya Kinoshita * Registering ISO-8859-8-I for Hebrew as a temporary solution. Numbers are displayed in the reverse order but better than nothing. * "mu" work for pruned threads. Hideyuki SHIRAI * Marks work on pruned threads. Hideyuki SHIRAI * "t(" and "t)". Hideyuki SHIRAI * A bug fix for "p" and "n" on toggled threads. Hideyuki SHIRAI * ";" displays trace paths. * mew-old-pgp-decode() checks "charset". Tatsuya Kinoshita * Check mew-use-header-veil in "zv". Tatsuya Kinoshita * Now "." on a part displayed with ":" can parse HTML. * "Too large" for remote folders. * Disabling "S" in IMAP folders. * A patch for mewl. Shigeya Suzuki * PuTTY (SSH) support. Shuichi KITAGUCHI * Defining mew-use-node-folder. * Charset can be specified for mew-use-old-pgp. * Removing \r from message-id. * Defining mew-draft-append-domain-p. * Defining mew-use-full-alias. * Defining mew-use-text/html-list. * Defining mew-use-text/xml. * Defining mew-imap-prefix-list(). Shigeru Yasuda * A patch for mew-use-old-pgp(). Tatsuya Kinoshita * Defining mew-imap-prefix-list. * Displaying account name when asking a password. KOIE Hidetaka * Visio support. TAKANO Yuji * C-cC-z now treats MIME-encoded body. * '*', '@', 'd', 'u' now handles a visual region. Ryota Hirose * Adding ".tbz". TAKANO Yuji * A bug fix for mew-summary-goto-folder(). Shigeru Yasuda * Defining mew-use-old-pgp. * A bug fix for SSL. Shigeru Yasuda * Checking expired public key for GnuPG. Mew 4.0.64 (2004/03/08) * NOTE: YOU MUST RE-INSTALL THE "BIN" DIRECTORY. * info updates. * SSL now checks verification failure. * Fcc: %backup is now cached. * Fixing a bug of mew-regex-part. Shigeru Yasuda * incm now touches ".mew-mtime" by default. Mew calls incm with the "-u" option to suppress this. Yasunari Momoi * Obsoleting mew-msg-rm-policy and mew-msg-rm-folder-list. Use mew-trash-folder and mew-trash-folder-list for local folders. Use mew-imap-trash-folder and mew-imap-trash-folder-list for IMAP folders. Read info for more information. * Removing 'no-ls from mew(). Hideyuki SHIRAI * A bug fix for mew-summary-from-local-to-imap. * Removing unnecessary fields when resending. * Command and pattern should be specified at the same time for '"'. Hideyuki SHIRAI * History for '"'. KOIE Hidetaka * Circular completion now works for pick pattern. 'mew-pick-default-field' is obsoleted. Use 'mew-pick-pattern-list' instead. * Circular completion now works for "C". * '"' calls a command through a shell. * Don't use "error" in mew-smtp-queue and mew-nntp2-queue. * A patch to fix face problems on XEmacs. Shun-ichi TAHARA * A patch for mew-mark-active-p(). Hideyuki SHIRAI * Defining mew-visit-inbox-after-setting-case. After setting a case with "C", you can visit an inbox determined with the case and its "proto". * "?", "tt", "'", '"', "x", "lx", "ma", "Md", "S", "mlc" are now friendly for the visible region (transient mark mode for Emacs and zmacs region for XEmacs). You don't need to type "C-u" to specify the visible region. * "?" for pick. "C-u?" for pick in the region. * "'" for grep. "C-u'" for grep in the region. * '"' for a specified command. 'C-u"' for the one in the region. * mew-connection-type-for-scan is now obsoleted. Pipe is good for mewl. * Header mode also takes care of mew-visit-queue-after-sending. * mew-visit-queue-after-sending is default to nil. If non-nil, visiting a queue folder C-cC-m in a draft. * mew-imap-trash-folder is now default to "%trash". * The patch version of Emacs is removed for X-Mailer:. Hiroshi Fujishima Tatsuya Kinoshita * mew-summary-folder-name() hack. Hideyuki SHIRAI * "mr" and "tr" now ignore invisible strings. Hideyuki SHIRAI * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI Mew 4.0.63 (2004/01/15) * If IMAP path separator is ".", "/" is not allowed for a folder name. * IMAP response code hack. * New mew-summary-next-line and mew-summary-previous-line. Hideyuki SHIRAI * Removing mew-timing from mew-local-filter for Emacs. Hideyuki SHIRAI * mew-use-thread-cursor hack. Hideyuki SHIRAI * mew-summary-refile-remove-body hack. Hideyuki SHIRAI * Another patch for contrib/mew-nmz.el. Hideyuki SHIRAI * Another patch for contrib/mew-refile-view.el. Hideyuki SHIRAI * A patch for contrib/mew-refile-view.el. Hideyuki SHIRAI * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI * A patch for contrib/mew-nmz.el. hasi * A bug fix for mew-scan-header(). hasi KOIE Hidetaka Mew 4.0.62 (2003/12/25) * mew-refile-guess-alist can be set in mew-config-alist. * mew-scan-header decodes encoded fields according to mew-scan-max-field-length. * incm handles a read-only file system. Yousuke HARADA * PGP PKS servers are selectable for C-cC-f. * "Rd" deletes the local folder or the IMAP folder. * "Rr" renames the local folder or the IMAP folder. * Implementing mew-imap-directory-file-name and mew-imap-file-name-as-directory. * Appropriate arguments for bogofilter. Walter Truitt * IMAP spam filter. (setq mew-imap-spam-field "X-Bogosity") ;; Do NOT append ":" (setq mew-imap-spam-word "Yes") (setq mew-imap-trash-folder "%trash") ;; nil means really delete * "tr" for mew-summary-regexp-make-thread. KOIE Hidetaka * Setting buffer-read-only to nil for C-cC-q in Draft (just in case). * Defining mew-use-retrieve. * A bug fix for "D". Mew 4.0.61 (2003/11/18) * A bug fix for mew-decode-rfc822-header(). * Using delete-overlay() in mew-header-veil-make() so as to detach the overlay from its buffer. * If a specified folder contains SPC, Mew warns. * Fixing a bug of IMAP's # character. * Supporting IMAP servers which does not implement NAMESPACE. * Defining mew-input-case-hist. KOIE Hidetaka * mew-connection-type-for-scan hack for Darwin. Hideyuki SHIRAI Mew 4.0.60 (2003/10/29) * Allowing mew-folder-case handle multiple cases. KOIE Hidetaka * Supporting the windows-125x coding system on Emacs current. * mew-inbox-action-alist bug fix on XEmacs. * A bug fix for "A". (a side effect of mew-push-mark). * "lh" for learning as ham. * "ls" for learning as spam. * If mew-highlight-body-max-size is set to 0, it means unlimited. Kazumi HARA * Using find-file-hook instead of find-file-hooks on Emacs 21.4. * Using write-file-functions instead of local-write-file-hooks on Emacs 21.4. * Supporting transient-mark-mode on Emacs 20/21. * Fixing a bug that the "X" mark is not highlighted. * A buf fix for "zv" on XEmacs. Mew 4.0.59 (2003/10/06) * "zv" toggles the header veil for To:/Cc:. * s/illegal/invalid/g. * A bug fix for C-cC-c in +postq. * mode-line-format hack for Emacs 21.3.50. Kan Sasaki * X-Mailer contains the third number of emacs-version. * A bug fix for mew-region-bytes(). Hideyuki SHIRAI * Fixing mew-header-arrange() for X-Face:. * Removing string-bytes(). * Replace ":" with "_" in boundary strings. Mew 4.0.58 (2003/09/26) * A bug fix for "o" in Virtual. * A bug fix for "U". Kan Sasaki * C-uC-cC-k now kills all SSH processes. * mew-substring now checks the composition property of Emacs 21. * A bug fix for mew-summary-goto-part. * Implementing "make check". * The xlt suffix for Excel. Munechika Sumikawa * set-window-start in mew-header-arrange for Emacs 21.3.50. Hideyuki SHIRAI * A bug fix for mew-summary-convert-local-cs. Hideyuki SHIRAI * Defining mew-use-push-mark. Hiroshi Fujishima * Process filters now check existence their buffers when erasing. * Another fix for "m/". * mew-summary-kill-subprocess now calls the sentinel of each process. * A bug fix "ms" in Virtual mode. * Replacing length() with string-width() in mew-scan-get-piece() for composite strings. Mew 4.0.57 (2003/07/31) * Defining mew-ask-folder-after-join and mew-ask-folder-after-burst. * mew-scan-header decodes three lines instead of two (for Subject:). * Implementing mew-insert-file-contents2 so that mew-thread-save-xref can set correct coding-system. * mew-imap-cache-refile-online is now default to 't'. * Bug fixes of SMTP queue. * Bug fixes for "m/". * Bug fixes for mew-canonicalize-case-folder(). Mew 4.0.56 (2003/07/24) * mew-canonicalize-case-folder removes unnecessary last separator. * New "#" mark for invalid cache messages. * A patch for Fcc: %mailbox. sai * Defining mew-window-magic. * A bug fix for mew-imap-fcc-to-mailbox(). * Recovering marks for POP/IMAP/NNTP. * Defining mew-imap-exec-recover(). * Local cache refile even when online. * Implementing APPEND {num+} (LITERAL+) for IMAP. * A bug fix for C-xC-s in Draft mode. * Fcc: %mailbox is supported! * A bug fix for "/". * If an attachment is prepared by "f", the read-only property disappears. This bug has been fixed. * A bug fix for mew-summary-refile-log. * Removing the message of "queue is empty" from the SMTP/NNTP2 sentinel. Mew 4.0.55 (2003/07/16) * The sentinel of SMTP/IMAP2 can keep a message to its queue when its connection is lost. * Set mew-icon-p to t on Emacs 21 when tool-bar is available. KOSEKI Yoshinori * Tuning up mew-summary-scan. * "y" now chooses file name correctly. * Defining mew-highlight-x-face-function. Tatsuya Kinoshita * mew-input-refile-folders sets inhibit-quit to nil to avoid Emacs 21.3's bug. * The sentinel of POP/IMAP/NNTP safely stores information about retrieved messages when the connection is lost. * Implementing mew-nntp-skip-uidl to make 'get faster. Mew 4.0.54 (2003/07/08) * The quality of IMAP folder management is now as same as that of local folder one. * A bug fix for the region of "tt". * Security fix: stunnel now allows access from localhost only. Koga Youichirou * Fixing a fatal bug of mew-idstr-to-id-list(). * Clearing IMAP/SMTP password if its connection times out. * The problem of IMAP namespace has been fixed. Your space : %foo (inbox is not necessary) Another user's space : ~user/foo Shared space : #foo * Implementing mew-find-file-noselect2. * A bug fix for "Uo" in Virtual mode. * (mew-set-buffer-cs mew-cs-m17n) for Summary/Message mode so that "1" is displayed in their modeline. * Security fix: Implementing mew-find-file-noselect to prevent file-local variable attack. * mew-summary-msg for "=". * A bug fix for "mr" in Virtual mode. * A bug fix for "mo". * Replacing white spaces in msg-id to "_". * Fixing a buf of mew-imap-friend-regex(). * A patch for contrib/mew-nmz.el. hasi * Clearing POP password if its connection times out. * IMPORTANT NEWS. Information part of .mew-summary (after \r) changed. That is, folder-name is removed. This makes .mew-summary independent on its directory path. If you want to re-use current .mew-summary, try the "alpha/fix-sum" command. * IMPORTANT NEWS OF IMAP: There are two kinds of IMAP servers. One allows folders under the root like "foo". The other allows folders under the "inbox" folder only. An example is "inbox.foo". So far, Mew has treated a folder name as is. So, with the server of the latter type, you had to specify a folder like "%inbox.foo". This was very inconvenient. Mew now automatically checks the type of servers when typing "3 Z", which updates a list of folders. For the latter type, Mew now automatically expands, for example, "%foo" (a user view) to "inbox.foo" (IMAP level). So, you need to type '3 Z' once. When Mew find a list of folders is in the old format, Mew displays "type '3 Z'". So, take it easy. An old cache directory located in, for example, ~/Mail/.imap/user%port/inbox.foo and currently does in ~/Mail/.imap/user%port/foo for the latter type. If you want to reuse the old cache directories, "mv" them by yourselves. Try the "alpha/fix-imap" command. Remove "inbox." from 'mew-refile-guess-alist' and 'mew-imap-trash-folder' in ".mew" if any. You may need to remove the following two files: ~/Mail/.mew-refile-msgid-alist ~/Mail/.mew-refile-from-alist Mew 4.0.53 (2003/05/22) * A bug fix for mew-smtp-queue again. * Copying decrypters when the body part is empty. * mew-summary-visit-folder calls mew-summary-cook-window if necessary. * mew-summary-mark-duplicated is now bound to "Md" from "M". * If mew-summary-form-mark-delete is a character, use it as a mark when duplicated. If mew-summary-form-mark-review is a character, use it as a mark when destined to me. * A bug fix for mew-summary-display-asis. * Using "%s" for message() just in case. Tatsuya Kinoshita * A patch for contrib/mew-nmz.el. hasi * Using temp-directory or temporary-file-directory. Tatsuya Kinoshita * A patch for mew-regex-ignore-scan-body-list. Tatsuya Kinoshita * mew-inbox-action-alist now effects to %inbox. * C-umxo refiles messages whose destination is the same as that of the current message. * (mew-window-configure 'summary) for mew-summary-reset. Kazumi HARA * Bug fixes for sort and pack. Mew 4.0.52 (2003/04/07) * A bug fix for "mI" on XEmacs. * Enhancing mew-scan-body. If charset is not specified, mew-cs-autoconv is used. Skipping the body if it is encoded with base64. * A bug fix for 7bit vs mew-convert-singlepart. * If a user rename a folder on a command line, Mew will fix the folder part of .mew-summary automatically. * mew-lang-kr.el. CHOI Junho * Adding examples of StarSuite/OpenOffice.org to mew.dot.mew. * Defining mew-regex-ignore-scan-body-list. Tatsuya Kinoshita * Making line-number-mode buffer-local. Kan Sasaki * Saving msids without limitations. * Back-porting the "string" header separator because the overlay one has too many side effects. Instead, C-xC-s now removes the string header separator. * A bug fix for "tp". Kan Sasaki * The filename parameter for CDP:inline of CT: Message/. * A patch for contrib/mew-fancy-summary.el. ogawa Mew 4.0.51 (2003/03/20) * A patch for contrib/mew-fancy-summary.el. Masahiro NANASHIMA * mew-summary-form-mark-review now takes care of Cc: in addition to To:. * Defining mew-inbox-action-alist. This enables spam filtering and auto refiling while retrieving messages. See the document of this variable for more information. * Defining mew-addrbook-alias-not-learn-list. Mew does not learn addresses on this list when replying. * The separator between a header and a body in Draft mode is now overlay. If supercite causes an error when citing due to this change, configure as follows: (setq sc-blank-lines-after-headers nil) * Sophisticated regex for body scan. Tatsuya Kinoshita Mew 4.0.50 (2003/03/14) * Fancy thread style is now the default. * "=" is bound to mew-summary-info. * NetNews articles are now gained access by article numbers. * Initial implementation to visualize refile folders. * Implementing refile log. * A bug fix for marking in a physical folder. * Bug fixes for thread commands. * "j" is now goto-line(). * A patch for mewl on Windows. Hideyuki SHIRAI * "mewls" is now called "mewl" so that both "mewls" or Mew 2/3 and "mewl" for Mew 4 co-exist. * Scan form changed. Body can be displayed. Message number is hidden. * Moving the position of mew-make-message-hook so that ispell-message works. * Scanning local messages now synchronize 'mewls'. mew-scan-wait-for is obsoleted. PLEASE RE-INSTALL MEWLS. --End of file kazu-yamamoto-Mew-ff9c41b/00changes.4.2000066400000000000000000000107121256455547000175510ustar00rootroot00000000000000 Mew 4.2 release (2005/02/11) Mew 4.2 release candidate 3 (2005/02/03) * A bug fix for mew-summary-exchange-marks. Hideyuki SHIRAI * A bug fix for mew-win32.el. Takashi Masuda * mew-which-exec hack and a fix for mew-namazu.el. Hideyuki SHIRAI Mew 4.2 release candidate 2 (2005/01/27) * Fixes for defcustom. Hideyuki SHIRAI * Bug fixes for "Rr". Hideyuki SHIRAI * The suffixes of OpenOffice are supported. * A bug fix for mark exchange. Mew 4.2 release candidate 1 (2005/01/13) * Wording check for minibuffer messages. Tatsuya Kinoshita * A patch for mew-nmz.el. Hideyuki SHIRAI * A patch for Application/Rtf. Hideyuki SHIRAI Mew 4.1.55 (2005/01/08) * The "-p" option is specified only for "incm". * The lang augment for mknmz. * Supporting Application/Rtf. SAKAI Kiyotaka * Yet another patch for mew-nmz.el. Hideyuki SHIRAI Mew 4.1.54 (2005/01/07) * snprintf() patch for incm. Yasunari Momoi * A patch for mew-nmz.el. Hideyuki SHIRAI * Using the same toolbar and menu as much as possible. SAKAI Kiyotaka * A wrapper for snprintf(). Murata Takashi * A patch to bin/w32/config.h. Shuichi KITAGUCHI Mew 4.1.53 (2004/12/28) * Marks on invalid messages are preserved when scanning. * A bug fix for mew-addrbook-clean-up. * mew-summary-cache-prefetch checks marks. * ";" now can handle an attached message. * "C-uw" now can handle an attached message. * Yet another patch for mew-nmz.el. Hideyuki SHIRAI * Hacking mew-cs-utf-16be. Hideyuki SHIRAI * :type fixes. Hideyuki SHIRAI * --info-dir for install-info. KIMURA Yasuhiro * A patch for mew-summary-folder-dir-newp. Hideyuki SHIRAI * Using null-device. Shuichi KITAGUCHI * Yet another patch for mew-nmz.el. Hideyuki SHIRAI Mew 4.1.52 (2004/12/22) * Yet another patch for mew-nmz.el. Hideyuki SHIRAI * Yet another patch for mew-nmz.el. Hideyuki SHIRAI * Introducing configure. KOIE Hidetaka * A patch for mew-nmz.el. Hideyuki SHIRAI * Importing mew-nmz.el. The key prefix is "k". Hideyuki SHIRAI * The etc directory is now "/usr/local/share/emacs/site-lisp/mew/etc" and it is automatically set. * Implementing mew-summary-write ("C-uw"). * Defining mew-summary-physical-folder. * "zi" toggles search-invisible. * A bug fix for mew-imap-expand-folder. * A bug fix for mew-convert-to-home-dir. * A bug fix for the mark recover. * Mew now makes use of the "-p" option for "incm". * The "-p" option for incm. Yasunari Momoi * Lock check for mew-{smtp,nntp2}-flush-queue. * A bug fix for refile override on scanning. * A bug fix for refile log. * Supporting POP PLAIN. * The invisible area is hidden when C-uC-cC-k. * Invalid cache messages of IMAP is first changed into invisible. Then the sentinel removes then invisible ones. * Security fix: a bug of format string on incm has been fixed. Ulf Harnhammar * Making line-move-ignore-invisible buffer-local. Mew 4.1.51 (2004/11/25) * "e" can be used in Virtual mode. Hideyuki SHIRAI * A bug fix for mew-in-decode-syntax-p(). SAITO Takuya * S/MIME support with gpgsm. * C-g works for mew-temp-minibuffer-message(). SAITO Takuya * A buf fix for mew-summary-goto-folder(). * NNTP hack for mew-summary-goto-folder(). Hideyuki SHIRAI * Replace the value of mew-sp for XEmacs: 32 => "?\ ". * Removing an unintended variable from mew-summary-goto-folder(). SAITO Takuya * A patch for contrib/mew-nmz.el. Hideyuki SHIRAI * A patch for contrib/mew-browse.el. Hideyuki SHIRAI * A new command "e" in Summary to exchange marks. * Removing a refile log entry when undo. * A bug fix for the problem of toggle-msg vs refile. Mew 4.1.50 (2004/10/29) * Removing CRs in mew-imap-debug(). * Removing mew-timing() from the SSL code. * Defining mew-cs-utf-16be. Hideyuki SHIRAI * Implementing IMAP UTF-7. * Yet another error handling for base64. Murata Takashi * Kill the buffer inserted with C-cC-i when quiting. KOIE Hidetaka * TLS support with stunnel. * Taking care of 'move on DnD. Hideyuki SHIRAI * Supporting Drag & Drop in Draft mode. * mew-set-file-modes for "lc". Nobuhiro IMAI * A bug fix for NNTP error handling. * A bug fix for SMTP error handling. * Hacking contrib/mew-browse.el. Hideyuki SHIRAI kazu-yamamoto-Mew-ff9c41b/00changes.5.1000066400000000000000000000211421256455547000175500ustar00rootroot00000000000000Mew 5.1 (2006/07/14) Mew 5.1 release candidate 3 (2006/07/12) * Fixing "Virtual mode vs 'i'" problem. * mew-summary-form-mark-spam works only in the inboxes. * C-cC-m for mew-passwd-change. Mew 5.1 release candidate 2 (2006/07/05) * Workaround for PGP hang up. * ${emacsbin} hack for configure.in. Tatsuya Kinoshita * A bug fix for suffix. * A bug fix for mew-max-draft-buffer(). Tatsuya Kinoshita * Using "RFC822" to fetch an entire message to turn the Seen flag "on". (But keep it "off" when fetching a header only) Mew 5.1 release candidate 1 (2006/06/19) * Fixing the SSL/TLS problem. * RFC 2822 allows "'" for local-part but Mew removed it. This bug has been fixed. Mew 5.0.53 (2006/06/06) * "C-uB" decomposes any files in the current message. * "B" is now a part sensitive. It decomposes messages embedded in the current message. If executed on a part, only the message part is saved to a folder. * Using BODY.PEEK[] instead of RFC822 not to set the SEEN Flag. NAKAMURA Motonori * "ta" toggles all threads. * Fixing "md5" vs "k/" problem. * "I" now automatically displays the current message. * "i" is inc in +folder and is "s" + "update" in a remote folder. Mew 5.0.52 (2006/05/25) * Bug fixes for mew-use-master-passwd. Kan Sasaki * Non-blocking connect() is not used for SMTP/TLS. * Implementing the master password. * ";" also displays IP addresses. * Defining mew-summary-form-mark-spam. * Defining mew-smtp-auth-plain-authorize-id to enabling to specify the optional "authorize-id". Mew 5.0.51 (2006/05/15) * A workaround for mew-addrstr-parse-syntax-list(). * A patch for Google Desktop. Shuichi KITAGUCHI * A temporary workaround for SSL timing problem. * A bug fix for mew-summary-info on mew-suffix. * Speed up for NNTP in the case of last:n. * All variables can be defined in ".mew.el", not in ".emacs". * The "-x" option to "mewl". Mew 5.0.50 (2006/04/28) * A patch for mew-highlight-header-address-region. Tsutomu OKADA * Making mew-max-draft-buffer friendly to mew-suffix. INOUE Tomohiro * A patch for the problem of Spotlight vs mew-suffix. Nobuya WATANABE * If mew-use-suffix is non-nil, Mew does not set file type. * A patch for WDS. INOUE Tomohiro * Functions for WDS. * Spotlight key is "mew" and the file type is "MewX". * getline() -> Getline() for Windows. INOUE Tomohiro * Defining mew-suffix. Please don't set it t at this moment. This is not tested well. * mew-max-draft-buffer() can now treats numbers larger than 9. * Back port of PLAIN of SMTP AUTH. * PLAIN/LOGIN of SMTP AUTH changed to the more popular scheme. kanaoka * Fixing the "invisible vs remote folders" problem! * Defining mew-smtp-submission-family. * Defining mew-summary-show-pause. KOIE Hidetaka * Supporting DKIM-Signature:. * A patch for contrib/mew-browse.el. Hideyuki SHIRAI * Defining mew-header-decode-error(). * When make-network-process with :nowait t returns nil, Mew falls back explicitly. * A bug fix for a failed SMTP process. * Defining mew-use-smtp-auth to disable SMTP AUTH of a broken server. * If an SMTP server returns the AUTH capability, Mew tries authentication automatically. * A fallback mechanism from the Submission port (587) to the SMTP port (25). Set mew-use-submission to use this mechanism. If mew-use-submission is t AND mew-smtp-port is "smtp" AND Mew is running on Emacs 22, this mechanism does work. Non-blocking connect() is used for this purpose. * "C-uk/" asks a user to input folders. * "k?" for Google Desktop. (testing) * A bug fix for mew-mode-input-file-name() Hideyuki SHIRAI * A bug fix for mew-net-status-clear(). * A small fix for "?" and "/". * Check close() status for incm. Yasunari Momoi * Setting completion-ignored-extensions to nil in mew-attach-duplicate. * A bug fix for mew-pick-parse-open/close. * Spotlight hack. Shuichi KITAGUCHI * EMACS => emacsbin in configure.in. Shun-ichi TAHARA * Obsoleting mew-my-domains and mew-my-address-no-warning. Defining mew-safe-addresses, mew-warn-domains, and mew-safe-domains instead. Mew 4.2.53 (2005/09/07) * A mewl expression is converted to an expression native to each search engine when you use "k?" and "k/". * Changing mew-warn-my-address to mew-my-address-no-warning. * Defining mew-warn-addresses. Ryota Hirose * --with-elispdir and --with-etcdir for configure. Shun-ichi TAHARA * mew-prog-vgrep was obsoleted. "/" also uses mew-prog-grep. * M-p and M-n can work in Virtual mode, too. * Google Desktop support. * Defining mew-warn-my-address. * "kc" now can select search method. Currently Spotlight and Namazu are supported. * Disabling '"' temporally. * Merging "/" and "C-u/" to "/". And "C-u/" targets a region. * Merging "?" and "'" to "?". "'" was obsoleted. * Byte-compiling all files. * A patch for mew-my-domains. Hideyuki SHIRAI * Defining mew-my-domains. If addresses on To:/Cc:/Bcc: in a draft are not matched to this domain lists, they turns red. * Binding case-sensitive for char-equal. Hideyuki SHIRAI * Defining mew-bcc. * Removing an initial value from mew-input-grep-pattern(). * Using mac-set-file-type(). * A bug fix for mew-addrstr-parse-syntax-list(). * Fixing IMAP LIST. * "tr" retains the "*" mark. KOIE Hidetaka * Fixing mew-transit-folder-alist. Hideyuki SHIRAI * Spotlight support. ("kM", "km", "k/") * Undo if "C-g" is typed when charset is asked in a draft. Hideyuki SHIRAI * "[Apple Key] + click" executes Safari. * Supporting system-type 'cygwin'. Tomoyuki Murakami Hideyuki SHIRAI Mew 4.2.52 (2005/06/03) * Implementing "mli". * Displaying status of "I" in Thread mode. * mew-summary-input-file-name appends a default file name if a user specified a directory only. Hideyuki SHIRAI * "I" now works in Thread mode. * "li" copies a message to an IMAP folder. * DnD for Meadow. INOUE Tomohiro Hideyuki SHIRAI * Fixing a problem of "i" vs mew-imap-delete. * A patch to contrib/mew-browse.el. Hideyuki SHIRAI * Displaying Bcc:/Fcc:/Dcc: with X-Mew: in +queue. Hideyuki SHIRAI * Obsoleting mew-use-retrieve. "i" is now equivalent to "s" + "update" in remote folders. * Message to be deleted by sync are unlinked, not moved to +trash. Shun-ichi TAHARA * A patch for mew-nmz.el. Hideyuki SHIRAI Mew 4.2.51 (2005/05/26) * Obsoleting mew-prog-image/*-ext-arg. * Obsoleting mew-prog-*/*ml-ext-arg. * A patch for C-cC-e. Hideyuki SHIRAI * A bug fix for "o" and "C-uo" * A bug fix for ";" * A patch for contrib/mew-browse.el. Tsutomu OKADA * Merging mew-browse-url-at-mouse(). * A new implementation of "C-cC-e". See its manual. * "C-cC-y" in Summary was obsoleted. Use "C-uC-cC-e" instead. * "C-cC-t" in Summary was obsoleted. * A patch for mew-nmz.el. Hideyuki SHIRAI * A patch for contrib/mew-browse.el. Shun-ichi TAHARA * Fixing a problem of "message buffer vs cache buffer". * mew-inbox-action-alist can be set in mew-config-alist. * Obsoleting both mew-case-input and mew-case-output. mew-case is now introduced. Mew 4.2.50 (2005/05/16) * Setting overlay-arrow-string even if it is initialized. * Removing trailing white spaces for PGP/MIME signatures to catch up to RFC 3156. * A patch for mew-syntax-format(). Hideyuki SHIRAI * Allow 'D' and 'X' only in $inbox when mew-inbox-action-alist is used. * A patch for mark undo. KOIE Hidetaka * C-xC-s in Draft mode was moved to the share map. * A DnD patch to catch up to Emacs current. Kenichi Niioka * "C-cC-k" calls mew-summary-visible-buffer() anyway. * "mewdecode -q" treats =CRLF. * A patch for mew-nmz.el. Hideyuki SHIRAI * Visualizing field relating domain authentications effectively. * Bug fixes for "C-cC-f". * mew-summary-reset() removes a Message buffer. * Loading the theme file before .mew.el. * Handling GnuPG's marginal keys. Koyama Mituru * DESTDIR in Makefile.in. Shun-ichi TAHARA * Defining mew-ask-encoding. * Truncated messages retain case in X-Mew-UIDL:. "I" uses this case. Hideyuki SHIRAI * A patch for Makefile and configure. KOIE Hidetaka * A patch for Makefile. Eisaku YAMAGUCHI * "v" displays line numbers when off. * Defining mew-imap-spam-pattern. See its doc. * "C-cC-b" now can work in any folders. * A bug fix for "C-uj". Shigeru Yasuda * "C-uj" jumps to the message whose message number is specified. * Defining mew-use-cut-file-name. If non-nil, the file path is pushed to the cut buffer of your window system when typing "=". * Binding inhibit-eol-conversion to nil in mew-filter. kazu-yamamoto-Mew-ff9c41b/00changes.5.2000066400000000000000000000055541256455547000175620ustar00rootroot00000000000000Mew 5.2 stable release (2007/01/10) * A bug fix for "I" on NetNews. Hideyuki SHIRAI * A bug fix for "mlc". Mew 5.2 release candidate 3 (2007/01/04) * Using the "--output" option of "gpgsm". * The same logic for Spotlight/Google. * WDS bug fix and hack. INOUE Tomohiro * mewest makes indexes for [0-9]* or [0-9]*.mew only. Tatsuya Kinoshita Mew 5.2 release candidate 2 (2006/12/21) * case-fold-search fix for mew-refile.el. Mew 5.2 release candidate 1 (2006/12/19) * Win32 patch for mewest. KIMURA Yasuhiro Mew 5.1.52 (2006/12/11) * A bug fix for Addrbook. Unknown. * Let mewest work on Solaris. Takashi Masuda * A bug fix for M-p. Takashi Masuda * A bug fix for "/". Tsutomu OKADA * A patch for mark vs case-sensitive. Hideyuki SHIRAI * Using shift_jis for EST on Windows. * A bug fix for "join". Hideyuki SHIRAI * Allowing an empty pattern for EST pattern of "k/". Tatsuya Kinoshita * Allowing an empty pattern for EST pattern of "k?". * Allowing "to,cc" for EST filter. * Fixing the problem of Smtplog vs message-id. * Error handling of EST filter. Mew 5.1.51 (2006/10/24) * Enchanting the filter of Hyper Estraier. Tatsuya Kinoshita * Implementing filter of Hyper Estraier. * Enhancing body filter. Tatsuya Kinoshita * bin/mew-pinentry will be removed with "make distclean" instead of "make clean". MLB33828 * Bug fix of "Resent-Fcc:" in the Header mode. * Killing subprocess when typing "D". Hideyuki SHIRAI * Asking master password only when it is required. Hideyuki SHIRAI * Adding bin/mew-pinentry.1. Tatsuya Kinoshita * mew-pinentry works on Solaris and Linux. * A bug fix for mew-summary-clean-trash. * Obsoleting the support of Emacs 20.7. * Supporting the content types of OpenOffice.org 2.0. * mew-prog-msword-ext etc can be set in ".mew". * Adding IMAP proxy. Tatsuya Kinoshita * Fixing the problem of "i" on threads. KOIE Hidetaka * Loosing the mark restriction for POP. Hideyuki SHIRAI * Making image scaling faster on Emacs 21. * A patch for mew-mime-image. Hideyuki SHIRAI * A patch for Namazu. Hideyuki SHIRAI Mew 5.1.50 (2006/08/16) * Resizing hack. Tetsuya Toda * Resizing PNG images with "netpbm" if too large. * Supporting smime-type=signed-data. * Preventing redundant MIME encoding for encryption/signature. * Resizing JPEG images with "netpbm" if too large. * Workaround for anti-virus softwares. * "C-n" and "C-p" keeps the current column. Hideyuki SHIRAI * Obsoleting pack ("O"). If you really want to use pack, type "C-uO". You should understand that pack breaks indexes of Hyper Estraier. * A bug fix for mewl. * A bug fix for mew-nmz.el. Hideyuki SHIRAI * Yet another bug fix for SSL. * S/MIME support can ask passphrase now! * Supporting Hyper Estraier. kazu-yamamoto-Mew-ff9c41b/00changes.6.1000066400000000000000000000202071256455547000175520ustar00rootroot00000000000000Mew 6.1 release (2008/06/06) * No subject bug fix for "V". Shigeru Yasuda * Suffix bug fix for "=". * Using AES for S/MIME. * mew-face-make-spec retains the parameter order. * const patch for bin/d/Sqlite3DB.d Masamichi HOSODA Mew 6.1 release candidate 1 (2008/5/28) * Guarding broken UTF-7. * Bug fixes for mew-use-x-mailer. * Structuring mew-addrstr-parse-syntax-list. * Changing the order of smew's options. * Defining mew-disable-alternative-regex-list. Mew 6.0.51 (2008/05/13) * Defining mew-use-x-mailer. * Defining mew-header-color-bold. Kuroishi Mitsuo * Defining mew-setface and mew-header-color. * A bug fix for mew-header-alist. Takashi SATOH * Brushing up the S/MIME code. * "&" now makes use of "smew". KOIE Hidetaka * IMAP folder completion for Fcc:. * stunnel 4.23 does not retry all addresses associated with localhost. So, the "localhost" server should be 127.0.0.1. * Hacking cmew's get_parid. KOIE Hidetaka * Now type's mark in Summary mode can be customized. Hideyuki SHIRAI * File existence check in mew-attach-duplicate. * Checking update-coding-systems-internal for Emacs 23. Tatsuya Kinoshita * Using "--status-fd" for S/MIME. Mew 6.0.50 (2008/04/14) * A bug fix for X-Mew: Hideyuki SHIRAI * A bug fix for mew-refile-guess-alist. IDE Kazumi * Now numeric port can be specified as integer. * A bug fix for cmew. Hideyuki SHIRAI * A bug fix for mew-protect-privacy-encrypted of S/MIME. * cmew now can take a target folder. * "kI" updates ID database for all folders. * "ki" updates ID database for this folder. * "1Z", "2Z", "3Z" were obsoleted. Use "C-uZ" instead to collect folders of the current world. * New mew-config-alist scheme. * A bug fix for mew-use-submission vs "E". * Checking "not cross-certified" for GnuPG. * Deleting X-Face: on "E". Takashi Masuda Mew 5.2.55 (2008/03/31) * "E" inserts .xface. Takashi Masuda * C-uw now takes an address from To: if From: is mine. * Two bug fixes for mew-folder-path-to-folder. * A patch for bin/w32/w32.h. Shuichi KITAGUCHI * Binding mew-draft-set-privacy-method to C-cC-pC-m in Draft mode. * Adding ID error to S/MIME. * "kj" jumps the original message in Summary mode from Virtual mode. * Portable patch to mewest. Takashi Masuda * Bug fixes for "k/". * Broken UAs quote extended-value of RFC2231, sigh. A workaround for that. * A bug fix for "=". * Using (put 'foo 'lisp-indent-function num) instead of declare due to Emacs 21. Hideyuki SHIRAI * Merging jumbo patch: mew-defstruct for POP/IMAP/NNTP. * Merging jumbo patch: dolist and dotimes. Mew 5.2.54 (2008/03/18) * set-file-times hack. Hideyuki SHIRAI * Backporting mw32script-init. Hideyuki SHIRAI * Define mew-set-file-times only for Mac. * Defining mew-refile-guess-by-from-learn-hook. * A bug fix for "I" in Selection. * A bug fix for "g" in Selection. * A bug fix for mew-folder-func. Hideyuki SHIRAI * Local folder hack for mew-summary-parent-global. Hideyuki SHIRAI * Incremental update for "cmew". Tomoyuki Murakami * "^" now makes use of "smew". * "?" marks well in Selection. * Merging mew-defstruct finally! * Defining mew-ntake. * Defining mew-pgp-signer and mew-smime-signer. * Generation search algorithm for smew. KOIE Hidetaka * Date bug fix for cmew. Tomoyuki Murakami * cmew creates id.db.new instated of id.db.old Hideyuki SHIRAI * Defining mew-status-update-hook. Hideyuki SHIRAI * A bug fix where "J" cannot handle the message suffix. * "smew.rb" -> "smew". KOIE Hidetaka * Adding cmew.1 and smew.1. Tatsuya Kinoshita * cmew.rb & smew.rb were renamed to cmew & smew. * A bug fix for M-s (sort). Mew 5.2.53 (2008/02/13) * A bug fix for mew-inbox-action-alist in the case where CT: is text/plain but its body is HTML. * Preventing that Emacs uses CPU 100% when typing a password. Hideyuki SHIRAI * "M-s" is now real sorting instead of unshar. "S" is now mew-summary-selection-by-sort instead of real sorting. * Fixing a bug of sort. * Implementing mew-summary-selection-by-sort. * Refactoring the sort code. * A bug fix for "Rr". Hayashi Masahiro * A bug fix for "c". Hayashi Masahiro * Setting cache time for Virtual mode. * Adding some hooks. Hideyuki SHIRAI * Using process-kill-without-query for Emacs 21.4. * A bug fix of mew-ct-setup. Takanori Ogawa * Introducing selection and thread. * Fixing the problem of image vs scroll. Naohiro Aota * Backporting make-string hack. Koga Youichirou * unix-sync only when mew-use-async-write is t. * Removing XEmacs code from the contrib files. KOIE Hidetaka * Obsoleting obsoleted Elisp functions. * Obsoleting mozilla and lynx. The default value is firefox. * Obsoleting w3.el. * Obsoleting the Namazu code. * Obsoleting the MD5 code. * Obsoleting Emacs 20.7 support. * Obsoleting XEmacs support. * defsubst => defun. * Using mapcar as much as possible. * cmew/smew hack. KOIE Hidetaka * Preventing fsync for cmew.rb. OHARA Shigeki * Prototype implementation of "V". Mew 5.2.52 (2007/12/03) * Allowing SPCs in folder names specified with Fcc: * mew-wrap-lines hack for Zaurus. Hideyuki SHIRAI * Making mew-complete-insert-folder-function sophisticated. Hideyuki SHIRAI * Async write for message retrieval on POP/IMAP/NNTP. KOIE Hidetaka * Clicking a candidate of folders works well. * Workaround for Emacs's bug, goto-char vs underline. * A bug fix for thread in case where my-id and prnt-id is the same. * A bug fix for allowing SPC. Hideyuki SHIRAI * Allowing SPC in folder names. \007 is a separator for mewl if a folder is specified in arguments. (No separator escape for "CD:") * Fixing a bug of "M->". * Fixing a bug of format=flowed. * Fixing a bug of quoted double-quote. * Unknown encoding is displayed "?" instead of "X" to avoid mark conflict. * A bug fix for key binding. KOIE Hidetaka * '<' and '>' scrolls the Message buffer horizontally. Hideyuki SHIRAI * Keybinding changes: - Moving to the top: '<' => 'M-<' - Moving to the top: '>' => 'M->' * Supporting image/pjpeg. Hideyuki SHIRAI Mew 5.2.51 (2007/08/20) * Implementing mew-imap-inbox-folder(). * The Authentication-Results: field is visible only when fail or softfail. * A bug fix for mew-q-decode-string. * Applying fill-column to "_". Hideyuki SHIRAI * A bug fix for mxo etc on IMAP. * Implementing the format=flowed decoding defined in RFC 3676. * "_" toggles normally wrapped lines, softly wrapped lines, and single lines. * Guard for join againt broken messages. Hideyuki SHIRAI * A suffix can be specified to mewest. "MIYOKAWA, Nobuyoshi" * A patch for VS2005 of Windows. Shuichi KITAGUCHI * Logging the port for SMTP. Mew 5.2.50 (2007/07/27) * Allowing "<>" for boundaries. * C-umxo for IMAP. * save-excursion for the filters and sentinels. * Workaround for the case where "smime-type" is omitted. Wada Keiji * Adding the MODI MIME type. * Implementing the unofficial NAME parameter to pass non-ASCII file names to poor OEs. * configure was re-created by autoconf v2.61 so that manuals/info can be installed into ${prefix}/share. Emacs 22.1 requires this. * Preventing APOP attack. Tatsuya Kinoshita * mew-regex-url for IDN again. Hideyuki SHIRAI * mew-message-goto-next-url and mew-browse-url-at-point. KOIE Hidetaka * mew-regex-url for IDN. eamcs * Supporting punycode decoding. * My address should not be deleted if specified with mew-ask-{to,cc}. Takashi Masuda * mew-ask-{to,cc} for mew-user-agent-compose. KOIE Hidetaka * Thread bug fix. Some broken messages refer themselves. KOIE Hidetaka * Fixing the passphrase prompot in mew-pinentry. KOIE Hidetaka * Filename hack for Hyper Estraier on Zaurus. Hideyuki SHIRAI * mew-draft-privacy-method now can take case. * Explicitly specify sslVersion=TLSv1. Tetsuya Toda * A patch for image scaling. Tatsuya Kinoshita * A patch for ";". KOIE Hidetaka kazu-yamamoto-Mew-ff9c41b/00changes.6.2000066400000000000000000000064701256455547000175610ustar00rootroot00000000000000Mew 6.2 release (2008/12/24) * Brushing up defcustom. Tatsuya Kinoshita * Defining mew-cite-default-prefix. Mew 6.2 release candidate 2 (2008/12/18) * Defining mew-flowed-broken-list. * Workaround for infinite loop of regexp. * A patch for "_". Hideyuki SHIRAI * C-cC-o sets use-flowed in a draft. * C-uC-cC-f toggles whether or not a body will be encoded with format=flowed. * Status of lines is displayed in mode-line of Message mode. * Implementing mew-flowed-auto-wrap. * A patch for incm. Yasunari Momoi * mew-use-format-flowed defaults to nil. Use C-cC-f in Draft mode. * Defining mew-flowed-unfold-regex. * Bug fixes for mew-encode-flowed and mew-decode-flowed. Mew 6.2 release candidate 1 (2008/12/02) * Catching up Authentication-Results: ID 17. * A bug fix of "E" vs flowed. * A bug fix for mew-encode-flowed-line. * A bug fix of IMAP mark sync. * Refactoring mew-decode-multipart. Mew 6.1.52 (2008/11/27) * Recovering duplicate boundary. * Turning off longlines-mode on the encoding of format=flowed. Harald Hanche-Olsen * Implementing encoding of format=flowed. * Brushing up mew-decode-flowed. * "lx" supports IMAP mark sync. * A bug fix for format=flowed. * A bug fix for mew-refile-guess-by-alist. Hideyuki SHIRAI * Removing different "proto" candidates on refile. * A bug fix of "I" for IMAP in the case where the message does not exist. * Supporting Application/Zip. * Supporting MS Office 2007. Tomoharu Suzuki * The Seen and Flagged flag of IMAP is now supported. * A bug fix for "E" and "M-e" in the case where text/html is directly embedded in the body. * Implementing Edit mode (M-e). * A bug fix for mew-smime-encrypt. Christian Gerhardt Mew 6.1.51 (2008/10/15) * Backporting of "A bug fix of quote for smew" and "Generation search algorithm for smew" since searching by parid is quite fast. KOIE Hidetaka * An important bug fix on indices of "cmew". You MUST re-create the DB with "cmew -f". * mewest replicates casket when updating. HORIE Tetsuya * Emacs 22.2 on Windows has a bug on "%Z" of format-time-string. So, Mew does not append symbolic timezone on it. Yu-ji Hosokawa * Pacifying a worning of incm. KOIE Hidetaka * A bug fix of quote for smew. KOIE Hidetaka * A bug fix for "C-n". Mew 6.1.50 (2008/08/29) * Removing the key biding of "M-<" and "M->". * Supporting Text/X-Patch. "C-cC-e" opens a new frame and displays it with diff-mode. * A bug fix for static literal list. * mew-header-parse-address-list2 allows SPCs in folder names but removes preceding SPCs. * Defining "Text/Calendar" and "Text/X-Patch". * A bug fix for error recovery of message composing. * S/MIME filter now uses the result of status-fd. * Separating mew-inherit-encode-signer to mew-inherit-encode-pgp-signer and mew-inherit-encode-smime-signer. * No warnings hack for Emacs 23. * No warnings hack for unix-sync and mac-set-file-type. * No warnings hack when compiling. * Bug fix for mew-face-make-spec. * Bug fix for mew-header-color-base. * Bug fix the new alist format for nil. * Broken MIME messages without the MIME-Version: header are treated as MIME messages if the Content-* fields exist. * Excluding ",.:" at the end of URL. Christophe TROESTLER * syslog=no for stunnel. Yu-ji Hosokawa kazu-yamamoto-Mew-ff9c41b/00changes.6.3000066400000000000000000000031301256455547000175500ustar00rootroot00000000000000Mew 6.3 (2009/11/20) * mew-find-cs-region for iso-8859-1 and iso-8859-15. * mew-pgp-signer for old PGP. Tatsuya Kinoshita Mew 6.3 release candidate 2 (2009/11/02) * Maintaining backward compatibility of mew-find-cs-region on Emacs 23. * A patch for writefln() of d/smew. Masamichi HOSODA Mew 6.3 release candidate 1 (2009/10/16) * Flush in cmew. Hideyuki SHIRAI * Reducing stat() in cmew. Takahiro Kambe * Using last-command-event instead of last-command-char. Hideyuki SHIRAI * Binding large-file-warning-threshold to nil in mew-find-file-noselect2. Hideyuki SHIRAI Mew 6.2.52 (2009/08/12) * A patch for mew-warn-addresses. Yu-ji Hosokawa * Unibite buffer for image. Hideyuki SHIRAI * mode-id hack. Hideyuki SHIRAI * UTF-8 hack for Emacs 23. Hideyuki SHIRAI * A patch for warning. Hayashi Masahiro Mew 6.2.51 (2009/02/16) * Supporting NTEmacs. Hayashi Masahiro * A patch for mew-fill-match-adaptive-prefix. Takashi Masuda * Rescuing non-balanced parenthesis of addresses. * A patch for mew-input-folder-search-setup2 KOIE Hidetaka * A patch for Makefile. Kazuyoshi Furutaka * Refile uses mew-case instead of mew-case-default. Hideyuki SHIRAI Mew 6.2.50 (2009/01/21) * Set IMAP's \Seen flag onto refiled messages. * Changing the timing of longlines-mode off. * A bug fix for mew-cite-prefix-username. * A patch for join. Hideyuki SHIRAI * chapter -> section in info. * Defining mew-fill-match-adaptive-prefix to save Emacs 21.4. kazu-yamamoto-Mew-ff9c41b/00changes.6.4000066400000000000000000000054701256455547000175620ustar00rootroot00000000000000Mew 6.4 stable release (2011/10/19) * cmew falls back to getModificationTime on Windows. Masamichi HOSODA * Supporting Ruby 1.9. Takahiro Kambe Mew 6.4 release candidate 1 (2011/09/06) * A bug of rescan is fixed finally! * mewl avoids causing error if a folder does not exist. Masamichi HOSODA * Catching up to stunnel 4.39. Ryo ONODERA * Supporting text/csv. Tetsuya Toda Mew 6.3.51 (2011/06/29) * A hack for calling browser on Unix. "Diogo F. S. Ramos" and Tatsuya Kinoshita * Bug fixes for hankaku. and Tatsuya Kinoshita * Avoiding broken end-of-line for quoted-printable. * Multibyte hack for Emacs 23 and 24. * Supporting GBK. * Fixing excel and powerpoint on Unix. Kan Sasaki * pdftotext support for Windows. Shuichi KITAGUCHI * &rest to mew-user-agent-compose for Emacs 24. Harald Hanche-Olsen * More gentle for broken Multipart/Signed. Eisaku YAMAGUCHI * Improving the documentation of mew-draft-use-format-flowed. Christophe TROESTLER * varsx hack. * Fixing regex of time. Christophe TROESTLER * Fixing major mode hooks. Hayashi Masahiro * Inline display of PDF with "pdftotext". Hideyuki SHIRAI Harumitsu YOSHITAKE * Text/Pdf for Thunderbird Christophe TROESTLER * Removing warnings for Emacs 23.3 Yu-ji Hosokawa * Killing stunnel with -KILL since the spec of stunnel changed. * The -b option for mewest. "Diogo F. S. Ramos" Mew 6.3.50 (2010/08/31) * Defining mew-draft-use-format-flowed. Christophe TROESTLER * Making use of mew-save-dir. * Fixing the hash-vs-array problem of cmew. Masamichi HOSODA * Making cmew safer in the case where mewest works at the same time. Masamichi HOSODA * Hack for mew-time-rfc-to-sortkey. Hideyuki SHIRAI * A patch for unzip. Yu-ji Hosokawa * Supporting unzip. * Bug fix for PGP/MIME of binary encryption. Shoichi Kurosaka * Both cmew and smew in Haskell works well finally! Shuichi KITAGUCHI * Fixing info/Makefile. Yasuhiro KIMURA * Guarding mew-addrbook-clean-up. Hideyuki SHIRAI * A bug fix of mew-mime-content-type. Yu-ji Hosokawa * Setting split-width-threshold to nil in mew-summary-reply. * "b" in Summary saves the buffer of Message mode to a file. * header-only now can work for M-x mew. * Bold of font can be specified on Emacs 23. * Deleting " " from global-mode-string. Christophe TROESTLER * Correcting the -P option of stunnel3. Kendall Shaw * Define mew-sumsym-encode-folder and mew-sumsym-decode-folder. * set-buffer -> with-current-buffer. * Making mew-mime-image() safer. Hideyuki SHIRAI kazu-yamamoto-Mew-ff9c41b/00changes.6.5000066400000000000000000000010551256455547000175560ustar00rootroot00000000000000Mew 6.5 stable release (2012/04/16) Mew 6.5rc2 (2012/04/05) * Checking libwrap for stunnel. * Supporting stunnel 4.53. TAKANO Yuji * Disabling libwrap. ARAI Shun-ichi Mew 6.5rc1 (2012/03/28) * Workaround of cmew for Ruby 1.9. Tatsuya Kinoshita * mew-make-temp-name allows non-ASCII characters Yoshinari Nomura Mew 6.4.50 (2012/03/07) * Supporting stunnel 4.51. Seiji Ariga * Hilighting HTML produced by w3m. * Fixing regex of mew-regex-ignore-scan-body-list. Tatsuya Kinoshita * Fixing cmew bugs. kazu-yamamoto-Mew-ff9c41b/00changes.6.6000066400000000000000000000160601256455547000175610ustar00rootroot00000000000000Mew 6.6 release (2014/04/29) Mew 6.6 release candidate 3 (2014/04/25) * Guarding coding-system-equal to rescue Emacs 22. Mew 6.6 release candidate 2 (2014/04/24) * Remove argument for called-interactively-p to rescue Emacs 22. Shuichi KITAGUCHI Mew 6.6 release candidate 1 (2014/04/16) * Using "pnmscale" by default. * temporary fix for pnm. * Use variables instead of fixed string Yuta Yamada * Add variables for pamscale Yuta Yamada * Allow arbitrary filename in summary buffer Yoshinari Nomura * Support stunnel 5.x Tatsuya Kinoshita * Add "failed" message when pdftotext does not exist This is about displaying a PDF attached file. Masamichi Hosoda * Update mew-regex-ignore-scan-body-list for a line beginning with "[" Tatsuya Kinoshita * Move fboundp statement Yuta Yamada * Add guard conditions Yuta Yamada * Fix indent Yuta Yamada * Change the image resizing command line option pamscale option -xysize is obsoleted by -xyfit. Masamichi Hosoda * Add image resizing always flag variable `mew-image-display-resize-always` Masamichi Hosoda * Fix variable mew-image-display-resize ignored The variable `mew-image-display-resize` was ignored and did not performed. Masamichi Hosoda * Add emacs unsupported image resizing Emacs unsupported image size is obtained after converting the image to PNM (pbm) format. Masamichi Hosoda * removing unnecessary local var. * Fix indent function mew-mime-image Fix indent only. No other changed. Masamichi Hosoda * Add netpbm image size obtaining and resizing function mew-pbm-size netpbm (PBM, PGM, PPM, PNM, PAM) formats Masamichi Hosoda * Fix function mew-image-inline-p return value function mew-image-inline-p may return strings. It should return value t or nil only. Masamichi Hosoda * Add internet media types of netpbm formats image/x-portable-bitmap pbm image/x-portable-graymap pgm image/x-portable-pixmap ppm image/x-portable-anymap pnm image/x-portable-arbitrarymap pam Masamichi Hosoda * Add bmp image size obtaining and resizing function mew-bmp-size Masamichi Hosoda * Add codes that convert from emacs unsupported formats to inline images Bmp etc. to pnm / pam by netpbm image converting tools. Masamichi Hosoda * Add some Content-Types image/bmp: Windows bitmap (*.bmp), unofficial, IANA unregistered, Microsoft's de facto standard. image/jpg: JPEG (*.jpg), unofficial, IANA unregistered, some MUA's typo, registered type is image/jpeg. image/vnd.microsoft.icon: Windows icon (*.ico), IANA registered. Masamichi Hosoda * Fix a comment line row position The comment line row position is wrong. Masamichi Hosoda * Update mew-mime-content-type to support xz suffixes Tatsuya Kinoshita * change the image converting command pngtopnm was obsoleted by pngtopam. pnmtotiff was extended and renamed to pamtotiff. pnmtogif is not present but pamtogif is. Masamichi Hosoda * change the image resizing command pnmscale was obsoleted by pamscale. Masamichi Hosoda * Fix the broken default value handling in mew-input-range This commit fixes a defect in my previous commit 4af7048 which broke the case where askp is nil. Tadaaki Nagao * Fixing type by Michael Ernst. * Use the default value handling of completing-read On Emacs at least 22.1 and later, completing-read has the 7th argument DEF which specifies the default value in case the user input is null. Make use of this argument instead of a home-grown logic to check the user input later and assign the default value. This should allow some elisp packages that replace the completion UI, such as Helm and anything.el, to happily make use of given default values for their good user experience. Tadaaki Nagao * removing duplicated image-type-available-p from auxiliary.el. * Prevent SIGABRT when Quoted-Printable decoding in mew-scan-body() Tatsuya Kinoshita * syncing two mew-regex-url. * adding comment. * Revert "removing mew-url-regex in mew-lang-jp." This reverts commit 7f1830f26f6ccb7c8b84db5751d1352d057f68cd. * file name change. * Stop using obsoleted one. Using display-buffer-alist instead of special-display-buffer-names and special-display-regexps. Using visual-line-mode instead of longlines-mode. We need carefuly watch whether or not these changes introduce side-effects. * Using called-interactively-p instead of interactive-p. * removing mew-url-regex in mew-lang-jp. Why does this duplicated definition exist? * Fix mew-prog-ssl-arg with stunnel 4 Currently, variable mew-prog-ssl-arg is ignored when using stunnel 4. This makes it difficult to supply extra arguments to stunnel 4. A reason to do so is to work around a stunnel installation that does not support FIPS. This patch corrects the problem. Ref. [mew-int 3158] Michael Ernst * Add gitlog2mewchanges to easily generate 00changes Tatsuya Kinoshita * Changed mew-regex-url to disallow right square bracket at the end. Harald Hanche-Olsen * Use unfolding for mew-summary-trace-path Tatsuya Kinoshita * Make mew-smtp-info-name use the domain part of mew-smtp-user Tadaaki Nagao * Find a deep part for mew-scan-body Tatsuya Kinoshita * Remove "\r" on Base64 decoding for mew-scan-body Tatsuya Kinoshita * Typo fix for dot.mew Tatsuya Kinoshita * Support Base64/Quoted-Printable decoding for mew-scan-body Tatsuya Kinoshita * Define mew-regex-url in mew-lang-jp.el Tatsuya Kinoshita * Add coding tag to clarify non-ASCII Tatsuya Kinoshita * Fallback to mew-charset-m17n for mew-param-encode Tatsuya Kinoshita * removing mew-from from info. * Use auth-user for smtp-passtag Tatsuya Kinoshita * Doc fix, point to the English git page Tatsuya Kinoshita * Typo fix for info/mew.texi Tatsuya Kinoshita * wording change. * adding README.md. * Check for the existence of a decrypted file instead of relying upon Emacs's process filter It seems that Emacs's process filter frequently drops some lines of process's output. This patch works around this (long-standing?) Emacs bug. Tadaaki Nagao * GnuPG at least 2.0.19 emits 'Bad session key' for a wrong passphrase Tadaaki Nagao * Re-highlight the message body after decrypting an old-styled PGP message Tadaaki Nagao * Fixing segfault of mewl. Tatsuya Kinoshita * Supporting cp932 (Windows-31J). Tatsuya Kinoshita * mew-cs-to-charset uses coding-system-equal. * s/CVS/Git/g s/2011/2013/g * mew-draft-keep-text-charset is nil by default. * Defining mew-draft-keep-text-charset. * Removing iso-2022-jp-3 from charset guess candidates. * Setting bidi-paragraph-direction for speed up on Emacs 24.x. * Typo. Munechika Sumikawa * Supporting Mac terminal. * fix `mew-thread-glue' destroying file encoding. Masahiro Hayashi * typo fix. * catching up to GHC 7.4.x. * convert file name to ASCII on Meadow. kazu-yamamoto-Mew-ff9c41b/00changes.6.7000066400000000000000000000022201256455547000175530ustar00rootroot00000000000000Mew 6.7 (2015/08/04) * supporting GnuPG 2.1 for master password. * ver bumps up. * s/2014/2015/. * stop using discard-input. * Fix mew-scan-body() chips the last byte of the base64 decoded body Tatsuya Kinoshita * Match exactly on an email address to specify a user ID to GnuPG Tatsuya Kinoshita * Do not use exit|return with negative status code to fix bashism Tatsuya Kinoshita * Remove the trailing whitespace of w3m This whitespace was causing lines to wrap even when the text itself was correctly wrapped to the window width. Christophe Troestler * Drag and drop improvement in Windows environment UNC path files can be attached to draft mode by drag and drop. Masamichi Hosoda * updating auxiliary.el * Typo fix Tatsuya Kinoshita * Mention MELPA Stable Bozhidar Batsov * Choose last preferred part in multipart/alternative Tatsuya Kinoshita * Increase mew-header-reasonable-size to 10000 Tatsuya Kinoshita * mew-summary-refile-report: Show warning when mew-header-reasonable-size does not cover the header of the selected message. Koichi Inoue kazu-yamamoto-Mew-ff9c41b/00copyright000066400000000000000000000027021256455547000176470ustar00rootroot00000000000000Copyright (C) 1994-2015 Mew developing team. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. kazu-yamamoto-Mew-ff9c41b/00copyright.ja000066400000000000000000000037461256455547000202510ustar00rootroot00000000000000(注) ä»¥ä¸‹ã¯æ—¥æœ¬èªžã®æ–¹ãŒåˆ†ã‹ã‚Šã‚„ã™ã„人ã®ãŸã‚ã«ã€è‹±èªžã®è‘—ä½œæ¨©è¡¨ç¤ºã‚’è¨³ã— ãŸæ–‡ç« ã§ã‚る。正å¼ãªè‘—作権ã¯ã€è‹±èªžã®åŽŸæœ¬ã«å¾“ã†ã€‚ Copyright (C) 1994-2015 Mew developing team. All rights reserved. å¤‰æ›´ã®æœ‰ç„¡ã«ã‹ã‹ã‚らãšã€ã‚½ãƒ¼ã‚¹ãŠã‚ˆã³ãƒã‚¤ãƒŠãƒªå½¢å¼ã®å†é…布ãŠã‚ˆã³åˆ©ç”¨ã¯ã€ ä»¥ä¸‹ã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„れã°ã€ã“れを許å¯ã™ã‚‹ã€‚ 1. ソース・コードã®å†é…布ã¯ã€ä¸Šè¨˜ã®è‘—作権表示ã€ã“ã®æ¡ä»¶é …ç›®ã€ãŠã‚ˆã³ã€ 以下ã®å…責事項をä¿å­˜ã—ãªã‘れã°ãªã‚‰ãªã„。 2. ãƒã‚¤ãƒŠãƒªå½¢å¼ã®å†é…布ã¯ã€ä¸Šè¨˜ã®è‘—作権表示ã€ã“ã®æ¡ä»¶é …ç›®ã€ãŠã‚ˆã³ã€ä»¥ 下ã®å…責事項をã€ãã®é…布ã«ä»˜éšã™ã‚‹èª¬æ˜Žæ›¸ã€ã‚ã‚‹ã„ã¯ãã®ä»–ã®è³‡æ–™ã®ã„ãšã‚Œ ã‹ã«æ˜Žè¨˜ã—ãªã‘れã°ãªã‚‰ãªã„。 3. å‰ã‚‚ã£ã¦ç‰¹åˆ¥ã«è¨±è«¾ã‚’å¾—ãªã„é™ã‚Šã€ã“ã®ã‚½ãƒ•トウェアã‹ã‚‰æ´¾ç”Ÿã—ãŸè£½å“㮠推奨や販売促進ã®ãŸã‚ã«ã€ã“ã®ãƒãƒ¼ãƒ åã¨è²¢çŒ®è€…é”ã®åå‰ã‚’利用ã—ã¦ã¯ãªã‚‰ãª ã„。 ã“ã®ã‚½ãƒ•トウェアã¯ã€Œã“ã®ã¾ã¾ã®å½¢ã§ã€æä¾›ã•ã‚Œã€æ˜Žç¤ºçš„ã‚ã‚‹ã„ã¯è¨€å¤–ã®ä¿è¨¼ ã¯ã€å•†ç”¨åˆ©ç”¨ãŠã‚ˆã³ç‰¹å®šç›®çš„ã¸ã®é©åˆã«å¯¾ã™ã‚‹è¨€å¤–ã®ä¿è¨¼ã‚‚å«ã¿ã€ã¾ãŸã“れら ã ã‘ã«é™ã‚‰ãšã€å­˜åœ¨ã—ãªã„。ãŸã¨ãˆä»¥ä¸‹ã®ã‚ˆã†ãªæå®³ã®å¯èƒ½æ€§ã‚’示唆ã•れã¦ã„ ãŸã¨ã—ã¦ã‚‚ã€ã©ã®ã‚ˆã†ãªå½¢ã«ã—ã‚ã“ã®ã‚½ãƒ•トウェアã®åˆ©ç”¨ã‹ã‚‰ç™ºç”Ÿã—ãŸå•題㫠ãŠã„ã¦ã€ã“ã®ãƒãƒ¼ãƒ ã¨è²¢çŒ®è€…é”ã¯ã€(代替製å“やサービスã®èª¿é”; 利用権ã€ãƒ‡ãƒ¼ ã‚¿ã€ã‚ã‚‹ã„ã¯åˆ©ç›Šã®æå¤±; ã‚ã‚‹ã„ã¯å–¶æ¥­ã®ä¸­æ–­ã‚’å«ã‚€ã€ã¾ãŸã“れらã ã‘ã«é™ã‚‰ ãš)直接的ã«ã€é–“接的ã«ã€å¶ç„¶ã«ã€ç‰¹åˆ¥ã«ã€æ‡²ç½°ä¸Šã€ã‚ã‚‹ã„ã¯ã€å¿…ç„¶çš„ã«ç”Ÿã˜ ã¦ã—ã¾ã£ãŸæå®³ã«å¯¾ã—責任ã¯ãªãã€ã„ã‹ãªã‚‹è²¬ä»»ç†è«–上ã§ã‚‚å¥‘ç´„ã®æœ‰ç„¡ã«ä¿‚゠らãšå޳坆ãªè²¬ä»»ã¯ãªãã€ã¾ãŸ(éŽå¤±ã‚ã‚‹ã„ã¯ãã®ä»–ã‚’å«ã‚€)䏿³•行為ã«å¯¾ã—ã¦ã‚‚ 責任ã¯ãªã„。 kazu-yamamoto-Mew-ff9c41b/00diff000066400000000000000000000433761256455547000165630ustar00rootroot00000000000000 Kazu Yamamoto July 3, 2015 * Configuration in ".mew.el" is simplified between Mew 5.2 and Mew 6.1. Almost all old configuration works. However, if you are using complex configuration, please translate it to the new one. See the config2 node in info. Complex configuration includes: - mew-header-alist - mew-refile-guess-alist - mew-inbox-action-alist - All above in mew-config-alist * Security fix for GnuPG. * GnuPG 2.1 is supported only for master password, not for PGP/MIME and S/MIME. * Better image supports. * The body encoded with Base64/Quoted-Printable is decoded. * Catching up to the latest GnuPG. * Support of ISO-2022-JP-3 was removed in favor of UTF-8. * The speed to move the cursor in Summary mode got much faster. * Supporting stunnel 5. * Catching up to latest "stunnel". * Catching up to Ruby 1.9. * Highlighting HTML produced by "w3m". * Zip support for reading and composing. * Many bug fixes. * Mew 6.3 works on Emacs 23 properly. * Mew 6.2 does not work on Emacs 21. This bug has been fixed. * Edit mode has been implemented. * The encoding of format=flowed has been implemented. * IMAP mark synchronization has been implemented. * "V" (i.e "smew") became much faster. You MUST re-create the DB with "cmew -f". * "k/" and "k?" can be used even while updating the DB. * Configuration in ".mew.el", especially of mew-config-alist is simplified. See the config2 node in info. * Virtual mode is categorized to Selection and Thread. You can create Selection by keyword, dialog, sorting, and so on. You can make Thread even of Selection as well as of Summary. * "S" is now virtual sort creating Selection. Physical sort is assigned to "M-s". * Mew now supports Emacs 21.4 or later only. Please use Emacs 22.x unless you have a particular reason. Mew does support Emacs 23.x. * Punycode is supported. Mew now can display internationalized domain names. * "Z" collects a folder list according to the current world. No numeric argument is necessary any more. * "_" toggles a long line: normal, long, wrapped. * You can use gmail with IMAP. * Full S/MIME support based on GnuPG 2. http://www.mew.org/feature/smime.html.en http://www.mew.org/feature/smime.html.ja * Automatic resizing for large JPEG/PNG images. * Hyper Estraier support. http://www.mew.org/feature/est.html.en http://www.mew.org/feature/est.html.ja * The ".mew" suffix is introduced for OS level search mechanisms. * OS level search mechanisms including Spotlight, Windows Desktop Search, Google Desktop are integrated. * The mechanism of master password was implemented. Set mew-use-master-passwd to t to use it. * When sending a message, if your SMTP server requires user authentication, Mew asks you to input your password. You don't have to configure mew-smtp-user anymore. * In Draft mode, addresses which are not considered safe turn red. See mew-safe-addresses, mew-warn-addresses, mew-safe-domains, and mew-warn-domains. * You can securely save your passwords to a file with a master password. * "li" copies a message to an IMAP folder. * "I" now works in Thread mode. * "C-cC-e" in Summary has been drastically improved. * "C-cC-t" and "C-cC-y" in Summary were obsoleted. * 'mew-inbox-action-alist' can be set in 'mew-config-alist'. * "v" in Summary mode displays line numbers when off. * "C-uj" in Summary mode jumps to the message whose message number is specified. * "C-uB" decomposes any attached files. * If you want to put the 'D' mark to duplicated messages whose bodies are identical (ie spams), set mew-summary-form-mark-spam to t. * All variables can be defined in ".mew.el". You don't have to set specific variables in ".emacs". * mew-nmz.el has been integrated. You can search messages with keyword DB. For more information, see info. * "C-uw" prepares a draft whose To: is the address on From: of the current message. * "e" in Summary can convert any mark to new one. * S/MIME has been supported. (alpha stage) * IMAP UTF-7 support. You can use non-ASCII characters for folder names. * TLS has been supported. * Fixing a bug of SSL. * Drag and Drop composing has been supported. * Many small bug fixes. * Summary mode format - Parts of message bodies are displayed. - Message number disappeared. - "=" displays its message number. - Refile information overrides its body part in Summary mode. - 'mew-scan-form*' is now 'mew-summary-form*'. - "j" now jumps to a message with line number instead of its message number. - You can still pack messages by "O" in a local folder. * A new mark scheme - Marks are preserved even if Emacs is terminated. - The unread mark 'U' is introduced. - The multi mark '@' is obsoleted. - To handle multiple messages, use the target mark '*'. - To preserve the target mark '*', use the escape mark '$'. - You can create Virtual mode for unread messages by "C-um/" + 'U'. * Summary mode - Refile information is logged. See "Mail/Refilelog". - You can pick or grep for a region as well as the entire folder. ("?" and "'") - You can rename and remove folders. ("Rd" and "Rr") * Message mode - If To:/Cc: contains many addresses, they are covered with a invisible veil except the first four lines. To toggle the veil, type "zv". * Virtual mode - You can pick or grep if the Virtual mode is created of a one physical folder. - You can make a thread if the Virtual mode is created of a one physical folder. * Draft mode - You can complete addresses even if they have the same user name. See 'mew-use-full-alias'. - Fixing a bug of 'mew-make-message-hook' so that ispell-message works. * IMAP - A new name space. You can omit the unnecessary prefix, "inbox."! - Fcc: %backup - Invalid cache messages are marked with "#". - Invalid cache messages can be created even online (by "x"). - IMAP messages are cached with the same UID number. - Transition mechanism from POP to IMAP is provided. M-x mew-summary-from-local-to-imap copies messages on a local file system to an IMAP server. * NetNews - NetNews articles are now gained access by article numbers instead of Message-Id:. Articles are cached with the same article number. * Spam filter - Mew side filtering when scanning/retrieving. See 'mew-inbox-action-alist'. - Mew side filtering by a command. ('"') - IMAP server side filtering. See 'mew-imap-spam-field'. - Learning as spam or ham. ("ls" and "lh") * Network - POP/IMAP/SMTP/NNTP preserves its status even if its connection is lost by accident. * Other - "mewls" is now called "mewl" so that both "mewls" or Mew 2/3 and "mewl" for Mew 4 co-exist. * If SSL/SSH is used for message retrieval by POP/IMAP/NNTP, it is notified in mode line ("Sec" or a lock image). * Supporting Emacs 21.3.50's native UTF-8. * Translation between Latin 0 and Latin 1. * A certificate of an SSL server can be verified. For this, "stunnel" v3 and v4 are supported and support for "openssl s_client" is obsoleted. * Supporting X-Face: on Emacs 21. To use X-Face: on any Emacsen, install both the "compface" package and the "netpbm" package. * Obsoleting the following variables: mew-noreplyto-to-list mew-noreplyto-cc-list mew-replyto-to-list mew-replyto-cc-list mew-fromme-to-list mew-fromme-cc-list And defining the following variables: mew-reply-all-alist mew-reply-sender-alist mew-reply-fromme-alist This change enables support for NetNews and non-standard fields such as Mail-Folloup-To:. * New commands in Summary mode. "\", "M-\", "m/" * Many bug fixes. * Supporting Darwin. * The structure of folder list is changed. Type "1Z" once after upgrading to Mew 3.1 * You can enter folder search mode by typing C-s and C-r in minibuffer. * Off-line version of "x", namely "lx", is introduced. * "x" became much faster thanks to a new algorithm of mew-dir-messages(). * A new range "sync" is defined. * IMAP and NNTP are supported. * +mdrop is renamed to $inbox. * mew-summary-toggle-8bit is bound to "z8" instaed of "8". * "0"-"9" are bound to digit-argument. So, for example, we can type "10d" instead of "C-u10d". * yes-or-no-p is replaced by y-or-n-p. * Minor bug fixes. * XML is well supported. * "c" in Summary works like "copy" (by specifying the current folder) while "o" does like "move". * "," and C-cC-i are integrated. Use "," to display a part as it is. C-cC-i now acts like view-file. * Both ":" and C-cC-l is now friendly for ":". * +mdrop is implemented. You can remove messages on your POP server visually. * Sort (s) and pack (O) became much faster. * contrib/incdir now moves messages in the "cur" directory as well as the "new" directory if the "-a" option is specified. * The "Type 'I'" message is displayed in the minibuffer, not in the body of a message marked with 'T'. * The "Type 'T'" message is displayed in the minibuffer when CT: of an attach file is unknown and the default CT: is chosen. * mew-case-guess-when-composed works well now. * "Sort region" (C-uS) now revives. * A header for a Bcc: message is now well-prepared. * mew-thread-column is now obsoleted. Put 't' in mew-scan-form to specify the position of thread indentation. * Asking Subject: before "Really send this message? ". And asking Fcc: if folders do not exist. * The "phrase:addr1,addr2;" notation is allowed in Addrbook if and only if it doesn't recurse when expanded. * Some workaround for broken POP servers. * Many other small bug fixes. * Mew 2 has thrown away Emacs 19, Mule 2.3, XEmacs 20.4. * Mew 2 has thrown away IM and is being implemented purely by Elisp with two C commands, 'mewencode' and 'mewls'. * Thread is supported. The key bindings of most thread commands start with "t". For example, typing "tt" makes thread. * Both Multipart/Alternative and Multipart/Related are supported. Use ":" to display the entire structure. * Sophisticated POP support. POP biff is supported. * 8bit clean. If mew-use-8bit is non-nil, 8bit charset in a body is sent without any MIME encoding(i.e. CTE: 8bit). If this is nil, 8bit charset in a body is sent with an appropriate MIME encoding(e.g. CTE: quoted-printable). Also, 8bit messages to be attached are converted into 7bit. 8bit messages to be signed are also converted into 7bit. This is required by the Multipart/Signed spec. mew-use-8bit is nil by default to avoid accidents. * Preview. Typing C-cC-m in Draft mode puts the composed message to +queue. You can preview messages to be send in +queue with Summary mode. If you are in Summary mode, typing C-cC-c sends all messages in +queue. "i" in Summary mode also flushes all messages in +queue since mew-auto-flush-queue is default to t. Typing C-cC-c in Draft sends the draft without preview. * MIME editor. Typing "E" (i.e. reediting) in Summary mode leads you Draft mode. If the target is multipart, attachments are prepared. * In attachments, you can specify charset both for input and output. "C" specifies the charset parameter for a Text/* object. "I" specifies a input coding-system for a text file. * Header mode is created for resending and sending the same content to different destinations. * C-cC-l makes use of autoconf of a specified language. * Mew 2 is liberal for many kinds of broken messages. * Auto input-method selection. Typing C-cC-y or C-cC-t in Draft mode automatically selects input-method on X/Emacs 20 or later. For example, Germany can be represented by both iso-8859-1 and iso-8859-1. When you received a Germany message in iso-8859-2, it would be nice if latin-2-postfix is selected for input-method. To implement this, put the following to your .emacs. (setq mew-charset-input-method-alist '(("iso-8859-1" . "latin-1-postfix") ("iso-8859-2" . "latin-2-postfix"))) * "y" in Summary mode is now able to save the raw format of message (i.e. header fields are not decoded). You can safely forward saved messages. * Multiple "inbox"es with IM Config are supported. * "D" in Summary mode removes all messages in the +trash folder. * Summary mode is now really multi-lingualized thanks to IM. * Aliases and Petname are integrated into Addrbook. To register expansion rules and/or personal information, type [C-u]C-cC-a in Summary mode. * The cache prefetch mechanism is implemented. You can read messages very quickly in Summary mode. * Thanks to the cache prefetch mechanism, the non-MIME analysis sub-mode, which is provided for rapid reading, becomes meaningless. So, M-a was throw away. Use "," if you want to see a message in the raw format. * GNUPG support. To select PGPv2/PGPv5/GNUPG, type C-cC-v in Summary mode. * Imget's password and PGP passphrase can be cached. You can now survive without impwagent. Set mew-use-cached-passwd t. Set mew-use-pgp-cached-passphrase to t. * C-c{C-s,C-p,C-b,C-r} can work even if draft contains attachments. * Automatic PGP protection for all drafts or drafts replying to encrypted messages is supported. See mew-protect-privacy-{always,encrypted}. * C-cC-p in Summary mode can handle old-fashioned PGP messages. * "." can decrypt messages which you failed to decrypt before. * Unknown Multipart/{Signed,Encrypted} is treated as a single part. * C-u Z saves the update folder file to ~/Mail/.folders. So, Mew can assume that this file exist by default. Concludingly the bootstrap becomes faster. mew-use-folders-file-p is now default to `t'. * You can customize Mew so that the directory previously used is preserved. See, mew-{summary,draft}-preserve-dir. See also mew-summary-trace-directory. * You can display text/html by a running netscape. Put the following in .emacs. (setq mew-prog-text/html-arg-hack 'mew-prog-text/html-netscape-remote) * Range is asked only when you interactively execute "s". * The key binding of FIB commands were changed with the C-cC-f prefix. * Getting along with the mail-user-agent convention. * Many IMAP4-friendly hacks. * Many many bug fixes. And many many optimizations. * Copyright of Mew conforms ``AS IS'' instead of GPL2. * Mew now supports IMAP4 and qmail mailbox. * immv, imrm, and imclean are implemented by Elisp. So, "x" in Summary mode became much faster. Other commands became faster as well. * Multipart format in Summary mode and Draft mode are integrated. * Neat support for IM Config. Please refer to info for more information. * mew-opt-highlight-* -> mew-use-highlight-*. * mew-field-{,in}visible were obsoleted. Use mew-field-spec instead. * Hankaku kana is converted into zenkaku kana if exists. * Safely ignores unknown charset in a header. * message/partial and text/html are supported. * Ad-hoc PGP 5 support. * Content-Disposition: support. * Neat reporting mechanism of PGP/MIME. * Many many bug fixes. * Mew uses IM Perl5 instead of MH. Mew will never support MH again. * Mew works on OS/2, Win95, and WNT as well as on UNIX. * Mew doesn't ask you to input y or n in Summary mode though it used to do so. Please follow instructions which Mew displays. * Deleting messages on Summary mode(i.e. the D mark) means refiling to the +trash folder. If in +trash folder, messages marked with 'D' are really removed. You can customize this action. See mew-msg-rm-policy for details. * "N" and "P" in Summary mode move the cursor onto only messages marked with '*'. To skip parts, call "n" or "p" with "C-u". * The default folder name of draft changed from "+drafts" to "+draft" so that its length became equal to "+inbox" and "+trash". * Some key-bindings in Draft mode were changed to keep C-c "key" for users. C-cM -> C-cC-a C-cu -> C-cC-l C-cy -> C-cC-t * C-cC-u(undo) in Draft mode works for any kinds of messages. For this reason, mew-mime-compose-folder-delete is set 'delete by default. * PGP/MIME became very stable. And verification message turned more informational. e.g. "No public key" -> "No his/her public key" C-cC-u works even for PGP shortcuts. * Refile scheme was changed much. mew-auto-folder-alist -> mew-refile-guess-alist mew-refile-folder-guess-functions -> mew-refile-guess-control * Pick interface(for "?", "/", and "V") was changed. Examples are below: to=mew-dist to=kazu & cc=kazu * Burst("B") on Summary mode is now really cool. * Subject is displayed for Message/Rfc822 if Content-Description: is empty. * "C-uZ" on Summary mode saves Mail/.folders if mew-use-folders-file-p. If mew-use-folders-file-p is t, Mew loads Mail/.folders at boot time. * Many similar codes were integrated. * Some function names were changed. mew-mark-process-all-folders -> mew-mark-clean-up-all (Remove kill-emacs-hook from .emacs if it contains mew-mark-process-all-folders.) * Some variables were changed. Each members of mew-folders-ignore must start with "+" or "=". Value of mew-folders-default-folder must start with "+" or "=". * Support RFC 2047(aka MIME header encoding/decoding) precisely. * Color is now used by default. Remove configurations concerned with fonts from each hooks!. --End of file kazu-yamamoto-Mew-ff9c41b/00readme000066400000000000000000000022241256455547000170730ustar00rootroot00000000000000 Kazu Yamamoto May 13, 2015 This is stable releases of Mew 6.7. Mew now supports Emacs 22.3 or later only. Useful information may be found from the following web page: http://www.Mew.org/ (1) Type './configure'. (2) Type 'make'. (2.1) Mew's info is formatted by Emacs 24.x. So, the info could not be visible with other Emacsen. In this case, type 'make info' to format the info. (2.2) If you want to format the Japanese info, type 'make jinfo'. (3) Type 'make install'. If you have the "install-info" command, the following line will be automatically added to the "dir" file. Otherwise, add it by yourself. --- * Mew: (mew.info). Messaging in the Emacs World --- (3.1) If you want the Japanese info, type 'make install-jinfo'. If you have the "install-info" command, the following line will be automatically added to the "dir" file. Otherwise, add it by yourself. --- * Mew-J: (mew.ja.info). Messaging in the Emacs World --- (4) See info for configuring a site file/.emacs/.mew.el. See also "mew.dot.emacs" and "mew.dot.mew". --End of file kazu-yamamoto-Mew-ff9c41b/Makefile.in000066400000000000000000000137661256455547000176350ustar00rootroot00000000000000### ### Makefile.in for byte-compile ### ### Author: Kazu Yamamoto ### Created: Nov 18, 1994 ### Revised: Sep 1, 2010 ### ### (1) Set the following variables as you like. ### (2) make ### (2.1) make info ### (2.2) make jinfo ### (3) make install ### (3.1) make install-jinfo ### ################################################################ ## ## EDIT THE FOLLOWINGS ## prefix=@prefix@ exec_prefix=@exec_prefix@ libdir=@libdir@ datadir=@datadir@ infodir=@infodir@ ## ## Compile engines ## EMACS = @emacsbin@ ## ## A directory where mew*.el[c] will be installed. ## elispdir = @elispdir@ #elispdir = $(prefix)/share/emacs/site-lisp/mew #elispdir = $(prefix)/lib/emacs ## ## A directory where etc file will be installed. ## etcdir = @etcdir@ #etcdir = $(prefix)/share/emacs/site-lisp/mew/etc ################################################################ ## ## DO NOT EDIT THE FOLLOWINGS ## OBJS = mew-addrbook.elc mew-attach.elc mew-auth.elc \ mew-blvs.elc mew-bq.elc mew-cache.elc \ mew-complete.elc mew-config.elc mew-const.elc \ mew-decode.elc mew-demo.elc mew-draft.elc \ mew-edit.elc mew-encode.elc mew-env.elc \ mew-ext.elc mew-fib.elc mew-func.elc \ mew-gemacs.elc mew-header.elc mew-highlight.elc \ mew-imap.elc mew-imap2.elc mew-key.elc \ mew-lang-jp.elc mew-lang-kr.elc mew-lang-latin.elc \ mew-local.elc mew-mark.elc \ mew-message.elc mew-mime.elc mew-minibuf.elc \ mew-mule.elc mew-mule3.elc \ mew-net.elc mew-nntp.elc mew-nntp2.elc \ mew-pgp.elc mew-pick.elc mew-pop.elc \ mew-refile.elc mew-scan.elc mew-smime.elc \ mew-search.elc mew-smtp.elc mew-sort.elc \ mew-ssh.elc mew-ssl.elc mew-passwd.elc \ mew-summary.elc mew-summary2.elc mew-summary3.elc \ mew-summary4.elc mew-syntax.elc \ mew-thread.elc mew-unix.elc \ mew-vars.elc mew-vars2.elc mew-vars3.elc \ mew-varsx.elc mew-virtual.elc \ mew-win32.elc mew-exec.elc \ mew-darwin.elc mew.elc SRCS = mew-addrbook.el mew-attach.el mew-auth.el \ mew-blvs.el mew-bq.el mew-cache.el \ mew-complete.el mew-config.el mew-const.el \ mew-decode.el mew-demo.el mew-draft.el \ mew-edit.el mew-encode.el mew-env.el \ mew-ext.el mew-fib.el mew-func.el \ mew-gemacs.el mew-header.el mew-highlight.el \ mew-imap.el mew-imap2.el mew-key.el \ mew-lang-jp.el mew-lang-kr.el mew-lang-latin.el \ mew-local.el mew-mark.el \ mew-message.el mew-mime.el mew-minibuf.el \ mew-mule.el mew-mule3.el \ mew-net.el mew-nntp.el mew-nntp2.el \ mew-pgp.el mew-pick.el mew-pop.el \ mew-refile.el mew-scan.el mew-smime.el \ mew-search.el mew-smtp.el mew-sort.el \ mew-ssh.el mew-ssl.el mew-passwd.el \ mew-summary.el mew-summary2.el mew-summary3.el \ mew-summary4.el mew-syntax.el \ mew-thread.el mew-unix.el \ mew-vars.el mew-vars2.el mew-vars3.el \ mew-varsx.el mew-virtual.el \ mew-win32.el mew-exec.el \ mew-darwin.el mew.el TEMPFILE = temp.el TEMPFILE2 = temp2.el DETECT = emacs CP = cp RM = rm -f MKDIR = mkdir -p # To save Emacses on Windows PWD = CNF = config.h config.status config.cache config.log configure.lineno MK = Makefile DESTDIR = ################################################################ all: $(OBJS) bin install: install-el install-bin install-info install-etc ################################################################ $(OBJS): el el: $(TEMPFILE) mew.el @echo 'Compiling EL files of Mew ... ' @echo 'PLEASE IGNORE WARNINGS IF DISPLAYED. TAKE IT EASY!' $(EMACS) -batch -q -no-site-file -l ./$(TEMPFILE) -f mew-compile @echo 'Compiling EL files of Mew ... done' $(TEMPFILE): @echo '(setq mew-compiling t)' > $(TEMPFILE) @echo '(setq load-path (cons "." load-path))' >> $(TEMPFILE) @echo '(defun mew-compile () (mapcar (lambda (x) (byte-compile-file x)) (list ' >> $(TEMPFILE) @echo $(OBJS) | sed -e 's/\(mew[^ ]*\.el\)c/"\1"/g' >> $(TEMPFILE) @echo ')))' >> $(TEMPFILE) install-el: $(OBJS) -@if [ ! -d $(DESTDIR)$(elispdir) ]; then \ $(MKDIR) $(DESTDIR)$(elispdir); \ fi $(CP) $(SRCS) $(DESTDIR)$(elispdir) $(CP) $(OBJS) $(DESTDIR)$(elispdir) ################################################################ detect: $(TEMPFILE2) mew.el @echo 'Compiling EL files of Mew ... ' $(DETECT) -batch -q -no-site-file -l ./$(TEMPFILE2) -f mew-compile @echo 'Compiling EL files of Mew ... done' $(TEMPFILE2): @echo '(setq mew-compiling t)' > $(TEMPFILE2) @echo '(setq load-path (cons "." load-path))' >> $(TEMPFILE2) @echo '(setq hack-local-variables-hook (lambda () (setq lexical-binding t)))' >> $(TEMPFILE2) @echo "(defun mew-compile () (mapcar (lambda (x) (byte-compile-file (symbol-name x))) '($(SRCS))))" >> $(TEMPFILE2) ################################################################ bin:: cd bin; $(MAKE) install-bin: cd bin; $(MAKE) install DESTDIR=$(DESTDIR) ################################################################ info:: cd info; $(MAKE) info EMACS=$(EMACS) install-info: cd info; $(MAKE) install-info infodir=$(infodir) DESTDIR=$(DESTDIR) ################################################################ jinfo: cd info; $(MAKE) jinfo EMACS=$(EMACS) install-jinfo: cd info; $(MAKE) install-jinfo infodir=$(infodir) DESTDIR=$(DESTDIR) ################################################################ install-etc: -@if [ ! -d $(DESTDIR)$(etcdir) ]; then \ $(MKDIR) $(DESTDIR)$(etcdir); \ fi cd etc; $(CP) -r * $(DESTDIR)$(etcdir)/ ################################################################ clean: $(RM) *.elc $(TEMPFILE) $(TEMPFILE2) -@if [ -f bin/Makefile ]; then \ cd bin; $(MAKE) clean; \ fi distclean: $(RM) *.elc $(TEMPFILE) $(TEMPFILE2) $(CNF) $(MK) -@if [ -f bin/Makefile ]; then \ cd bin; $(MAKE) distclean; \ fi ################################################################ ## ## For github users ## # git fetch # make log to see logs of updates # make diff to see the updates # git pull log:: git log HEAD..FETCH_HEAD diff:: git diff HEAD..FETCH_HEAD VERSION = `git tag | tail -1 | sed -e 's/v//'` archive: git archive master -o ~/mew-$(VERSION).tar --prefix=mew-$(VERSION)/ gzip ~/mew-$(VERSION).tar ## ## End of Makefile ## kazu-yamamoto-Mew-ff9c41b/README.md000066400000000000000000000004171256455547000170340ustar00rootroot00000000000000# Messaging in the Emacs World - Home page: [http://www.mew.org/](http://www.mew.org/) - Installation: The github version is available via [MELPA](http://melpa.milkbox.net/) and the latest stable release is available via [MELPA Stable](http://melpa-stable.milkbox.net). kazu-yamamoto-Mew-ff9c41b/bin/000077500000000000000000000000001256455547000163235ustar00rootroot00000000000000kazu-yamamoto-Mew-ff9c41b/bin/Makefile.in000066400000000000000000000055061256455547000203760ustar00rootroot00000000000000### ### Makefile ### ### Author: Kazu Yamamoto ### Created: Jul 7, 2000 ### Revised: ### ### make ### make install ### srcdir = @srcdir@ VPATH = @srcdir@ prefix = @prefix@ exec_prefix = @exec_prefix@ bindir = @bindir@ mandir = @mandir@/man1 CC = @CC@ CFLAGS = @CFLAGS@ CPPFLAGS = @CPPFLAGS@ LDFLAGS = @LDFLAGS@ COFLAG = -o $@ LIBS = @LIBS@ INSTALL = @INSTALL@ LN = ln RM = rm -f MKDIR = mkdir -p #INSTALL = copy #LN = copy #RM = del #MKDIR = md EXEEXT=@EXEEXT@ OBJEXT=.@OBJEXT@ SRC1 = mewencode.c utils.c OBJ1 = mewencode$(OBJEXT) utils$(OBJEXT) PRG1 = mewencode$(EXEEXT) ALT = mewdecode$(EXEEXT) mewcat$(EXEEXT) SRC2 = mewl.c utils.c pattern.c OBJ2 = mewl$(OBJEXT) utils$(OBJEXT) pattern$(OBJEXT) PRG2 = mewl$(EXEEXT) SRC3 = incm.c OBJ3 = incm$(OBJEXT) utils$(OBJEXT) PRG3 = incm$(EXEEXT) PRG4 = mewest PRG5 = mew-pinentry PRG6 = cmew PRG7 = smew DO1 = utils$(OBJEXT) SR2 = pattern.c DO2 = pat$(OBJEXT) DBG = pattern MAN1 = mewencode.1 MALT = mewdecode.1 mewcat.1 MAN2 = mewl.1 MAN3 = incm.1 MAN4 = mewest.1 MAN5 = mew-pinentry.1 MAN6 = cmew.1 MAN7 = smew.1 CNF = config.h config.status config.cache config.log configure.lineno MK = Makefile DESTDIR = .c$(OBJEXT): $(CC) -c $(DEFS) $(CFLAGS) $(CPPFLAGS) $< all: $(PRG1) $(PRG2) $(PRG3) $(PRG1) : $(OBJ1) $(CC) $(COFLAG) $(LDFLAGS) $(OBJ1) $(LIBS) $(RM) $(ALT) for f in $(ALT); do \ $(LN) $(PRG1) $${f}; done $(PRG2): $(OBJ2) $(CC) $(COFLAG) $(LDFLAGS) $(OBJ2) $(PRG3): $(OBJ3) $(CC) $(COFLAG) $(LDFLAGS) $(OBJ3) $(DO2): $(SR2) $(CC) -DDEBUG -c $(CFLAG) -o $(DO2) $(SR2) $(DBG): $(DO1) $(DO2) $(CC) $(CFLAGS) $(COFLAG) $(DO1) $(DO2) clean: $(RM) $(OBJ1) $(PRG1) $(ALT) $(OBJ2) $(PRG2) $(OBJ3) $(PRG3) $(DBG) $(DO2) distclean: clean $(RM) $(CNF) $(MK) $(PRG5) install: all -@if [ ! -d $(DESTDIR)$(bindir) ]; then \ $(MKDIR) $(DESTDIR)$(bindir); \ fi $(INSTALL) -m 555 $(PRG1) $(DESTDIR)$(bindir) for f in $(ALT); do \ $(RM) $(DESTDIR)$(bindir)/$${f}; \ $(LN) $(DESTDIR)$(bindir)/$(PRG1) $(DESTDIR)$(bindir)/$${f}; \ done $(INSTALL) -m 555 $(PRG2) $(DESTDIR)$(bindir) $(INSTALL) -m 555 $(PRG3) $(DESTDIR)$(bindir) $(INSTALL) -m 555 $(PRG4) $(DESTDIR)$(bindir) $(INSTALL) -m 555 $(PRG5) $(DESTDIR)$(bindir) $(INSTALL) -m 555 $(PRG6) $(DESTDIR)$(bindir) $(INSTALL) -m 555 $(PRG7) $(DESTDIR)$(bindir) -@if [ ! -d $(DESTDIR)$(mandir) ]; then \ $(MKDIR) $(DESTDIR)$(mandir); \ fi $(INSTALL) -m 444 $(MAN1) $(DESTDIR)$(mandir) for f in $(MALT); do \ $(RM) $(DESTDIR)$(mandir)/$${f}; \ $(LN) $(DESTDIR)$(mandir)/$(MAN1) $(DESTDIR)$(mandir)/$${f}; \ done $(INSTALL) -m 444 $(MAN2) $(DESTDIR)$(mandir) $(INSTALL) -m 444 $(MAN3) $(DESTDIR)$(mandir) $(INSTALL) -m 444 $(MAN4) $(DESTDIR)$(mandir) $(INSTALL) -m 444 $(MAN5) $(DESTDIR)$(mandir) $(INSTALL) -m 444 $(MAN6) $(DESTDIR)$(mandir) $(INSTALL) -m 444 $(MAN7) $(DESTDIR)$(mandir) ## ## End of Makefile ## kazu-yamamoto-Mew-ff9c41b/bin/Makefile.w32000066400000000000000000000032411256455547000203750ustar00rootroot00000000000000# -*- Mode: makefile; -*- # # Makefile for mewl.exe/mewencode.exe # for Visual C++ / Borland C++ Compiler # # Note: # 1. If you want to use Cygwin, read ../00readme and follow its # instructionx. # 2. You need pre-compiled and original zlib packages. # Please download original tarball from # http://www.gzip.org/zlib/, # and put # zconf.h, zlib.h, zlib.lib # to suitable directory. # 2. If you want to use Borland C++ Compiler, you need import library. # > implib -a # **** Please modify **** ZLIBINC = C:/usr/local/zlib ZLIBLIB = C:/usr/local/zlib/zlib.lib # for Visual C++ CC = cl CFLAGS = -nologo -O2 -W3 -MT -Iw32 -I$(ZLIBINC) \ -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS EXEFLAG = -Fe # for Borland C++ #CC = bcc32 #CFLAGS = -O2 -w -Iw32 -I$(ZLIBINC) #EXEFLAG = -e ################################################################ TARGET = mewencode.exe mewl.exe MEWENCODEOBJS = mewencode.obj utils.obj MEWLOBJS = mewl.obj utils.obj pattern.obj dirent.obj all : $(TARGET) config.h : w32\config.h copy w32\config.h config.h mewencode.exe : $(MEWENCODEOBJS) $(CC) $(CFLAGS) $(EXEFLAG)mewencode.exe $(MEWENCODEOBJS) $(ZLIBLIB) mewl.exe : $(MEWLOBJS) $(CC) $(CFLAGS) $(EXEFLAG)mewl.exe $(MEWLOBJS) mewencode.obj : mewencode.c mew.h config.h $(CC) $(CFLAGS) -c mewencode.c mewl.obj : mewl.c mew.h config.h $(CC) $(CFLAGS) -c mewl.c utils.obj : utils.c mew.h config.h $(CC) $(CFLAGS) -c utils.c pattern.obj : pattern.c mew.h config.h $(CC) $(CFLAGS) -c pattern.c dirent.obj : w32\dirent.c w32\dirent.h w32\w32.h $(CC) $(CFLAGS) -c w32\dirent.c kazu-yamamoto-Mew-ff9c41b/bin/cmew000077500000000000000000000177451256455547000172220ustar00rootroot00000000000000#!/usr/bin/env ruby # # cmew.rb: Creating Message-ID: DB with Sqlite3 # begin require 'rubygems' gem 'sqlite3-ruby' rescue LoadError end require 'sqlite3' require 'time' require 'fileutils' require 'find' ################################################################ ## ## mail_header ## ## Get header from mail message. If multiple header field ## exists, last one will be used. ## def mail_header(path) @header = {} value = nil File.open(path) do |f| while l = f.gets.chomp next if /^From / =~ l break if /^$/ =~ l if /^\s+/ !~ l (name, value) = l.split(/:\s*/, 2) value = '' if value.nil? || value.empty? @header[name.downcase] = value else value << $' end end end return @header end ################################################################ ## ## DB ## def open_db(db_file, fullupdate) db_new_file = db_file + '.new' if FileTest.exist?(db_new_file) STDERR.print "Error: another cmew running.\n" exit 1 end if fullupdate == false FileUtils.copy_file(db_file, db_new_file) if FileTest.exist?(db_file) end db = SQLite3::Database.new(db_new_file) db.results_as_hash = true sql = 'CREATE TABLE IF NOT EXISTS mew(id TEXT, path TEXT, parid TEXT, date TEXT);' db.execute(sql) db.transaction return db end def close_db(db_file, db) db.close db_new_file = db_file + '.new' if FileTest.exist?(db_new_file) File.rename(db_new_file, db_file) end end def get_ctime(db) ent = db.get_first_row('SELECT * FROM mew WHERE id = ?;', '') if ent db.execute('DELETE FROM mew WHERE id = ?;', '' ) return ent['date'].to_i; else return 0 end end def set_ctime (db, ctime) sctime = ctime.to_s db.execute('INSERT INTO mew VALUES(:id, :path, :parid, :date);', 'id' => '', 'date' => sctime) end ################################################################ ## ## Fields ## def check_id(id) return nil if id == nil if id =~ /\A<[-a-zA-Z0-9!#\$%&\'\*\+\/=\?\^_`{}|~\.@]+>\z/ return id else return nil end end def get_id(msg) return check_id(msg['message-id']) end def get_parid(msg) # (1) The In-Reply-To contains one ID, use it. # (2) The References contains one or more IDs, use the last one. # (3) The In-Reply-To contains two or more IDs, use the first one. irt = [] irt = msg['in-reply-to'].split(/[ \t\n]+/) if msg['in-reply-to'] irt.delete_if {|id| !check_id(id) } return irt[0] if irt.size == 1 ref = [] ref = msg['references'].split(/[ \t\n]+/) if msg['references'] ref.delete_if {|id| !check_id(id) } return ref.pop if ref.size > 0 return irt[0] if irt.size > 1 return nil end def get_date(msg) begin date = Time.rfc2822(msg['date']).getutc().strftime('%Y%m%d%H%M%S') rescue date = '19700101000000' end return date end def get_path(file) # removing './' return file[2..-1] end ################################################################ ## ## ## def register(db, maildir, ignore_regex, target, last_mod) Dir.chdir(maildir) add_entry = db.prepare('INSERT INTO mew VALUES(:id, :path, :parid, :date);') get_entry = db.prepare('SELECT * FROM mew WHERE id = ?;') del_entry = db.prepare('DELETE FROM mew WHERE id = ? AND path = ?;') db.results_as_hash = true registred = 0 deleted = 0 skipdir = '' begin Find.find(target) do |fpath| if fpath =~ ignore_regex if FileTest.directory?(fpath) print fpath, " (ignored)\n" Find.prune # includes next end # next else st = File.lstat(fpath) rescue next if st.symlink? if FileTest.directory?(fpath) print fpath, " (ignored)\n" Find.prune # includes next end # next elsif st.directory? print fpath mtime_file = File.expand_path('.mew-mtime', fpath) if FileTest.file?(mtime_file) and last_mod > File.mtime(mtime_file).tv_sec print " (skipped)\n" skipdir = fpath if st.nlink == 2 Find.prune # includes next end else print "\n" end STDOUT.flush # next elsif st.file? and fpath =~ /\/[0-9]+(\.mew)?$/ next if File.dirname(fpath) == skipdir next if last_mod > st.ctime.tv_sec m = mail_header(fpath) rescue next id = get_id(m) parid = get_parid(m) date = get_date(m) path = get_path(fpath) newpath = true if last_mod > 0 get_entry.execute(id).each do |row| past_path = row['path'] unless File.exist?(past_path) del_entry.execute(id, past_path) deleted = deleted + 1 end newpath = false if path == past_path end end if newpath == true add_entry.execute('id' => id, 'path' => path, 'parid' => parid, 'date' => date) registred = registred + 1 end # next end end end ensure add_entry.close get_entry.close del_entry.close print 'Registered: ', registred, ', deleted: ', deleted, "\n" end end ################################################################ ## ## Main ## require 'optparse' opts = {} OptionParser.new {|opt| begin opt.on('-f', 'full building') {|v| opts[:f] = v } opt.parse!(ARGV) rescue OptionParser::ParseError => e STDERR.puts opt exit 1 end } db_file = ARGV[0] || File.expand_path('~/Mail/id.db') maildir = ARGV[1] || File.expand_path('~/Mail') ignore_regex = Regexp.new(ARGV[2] || '^\./casket$|^\./casket/|^\./casket_replica$|^\./casket_replica/|/\.') target = if ARGV[3]; './' + ARGV[3] else '.' end have_target = if ARGV[3]; true else false end fullupdate = opts[:f] == true if fullupdate == true and have_target == true STDERR.print "Error: -f and target_folder cannot be specified at the same time.\n" exit 1 end db = open_db(db_file, fullupdate) curr_mod = Time.now.tv_sec last_mod = get_ctime(db) comp_mod = if fullupdate == true; 0 else last_mod end begin register(db, maildir, ignore_regex, target, comp_mod) db.commit db.execute('CREATE INDEX IF NOT EXISTS mew_id ON mew (id);') db.execute('REINDEX mew_id;') db.execute('CREATE INDEX IF NOT EXISTS mew_parid ON mew (parid);') db.execute('REINDEX mew_parid;') ensure if have_target == true set_ctime(db, last_mod) else set_ctime(db, curr_mod) end close_db(db_file, db) end # Copyright (C) 2008 Mew developing team. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the team nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. kazu-yamamoto-Mew-ff9c41b/bin/cmew.1000066400000000000000000000016031256455547000173400ustar00rootroot00000000000000.\" Unlimited permission is granted to use, copy, distribute and/or modify .\" this file. There is NO WARRANTY. .TH CMEW 1 "February 17, 2008" .SH NAME cmew - create Mew's database file .\" .SH SYNOPSIS cmew .RI [ -f ] .RI [ db_file .RI [ maildir .RI [ ignore_regex .RI [ target_folder ]]]] .\" .SH DESCRIPTION The .B cmew utility creates a Message-ID database file with SQLite 3 for Mew. .PP .I db_file is a database file name. (default: "~/Mail/id.db") .PP .I maildir is a mail directory name. (default: "~/Mail") .PP .I ignore_regex is a regular expression for the mail directory names to not create the database. (default: "^\\./casket$|^\\./casket/|/\\.") .PP .I target_folder is a target folder. Information about messages contained in this folder only are updated. .\" .PP The options are as follows: .TP 8 .B \-f Full update. Unless this option is specified, incremental update is used. kazu-yamamoto-Mew-ff9c41b/bin/config.h.in000066400000000000000000000061251256455547000203520ustar00rootroot00000000000000/* config.h.in. Generated automatically from configure.in by autoheader. */ #ifndef __CONFIG_H__ #define __CONFIG_H__ /* Define to empty if the keyword does not work. */ #undef const /* Define to `int' if doesn't define. */ #undef gid_t /* Define to `int' if doesn't define. */ #undef pid_t /* Define as the return type of signal handlers (int or void). */ #undef RETSIGTYPE /* Define to `unsigned' if doesn't define. */ #undef size_t /* Define if you have the ANSI C header files. */ #undef STDC_HEADERS /* Define if you can safely include both and . */ #undef TIME_WITH_SYS_TIME /* Define to `int' if doesn't define. */ #undef uid_t /* Define useconds_t as int if you don't have useconds_t */ #undef useconds_t /* Define ssize_t as int if you don't have ssize_t */ #undef ssize_t /* Define if you have the Sleep function. */ #undef HAVE_SLEEP /* Define if you have the _chdir2 function. */ #undef HAVE__CHDIR2 /* Define if you have the _setmode function. */ #undef HAVE__SETMODE /* Define if you have the chdir function. */ #undef HAVE_CHDIR /* Define if you have the fchmod function. */ #undef HAVE_FCHMOD /* Define if you have the fgetln function. */ #undef HAVE_FGETLN /* Define if you have the flock function. */ #undef HAVE_FLOCK /* Define if you have the fork function. */ #undef HAVE_FORK /* Define if you have the futimes function. */ #undef HAVE_FUTIMES /* Define if you have the getlogin function. */ #undef HAVE_GETLOGIN /* Define if you have the getpwuid function. */ #undef HAVE_GETPWUID /* Define if you have the lockf function. */ #undef HAVE_LOCKF /* Define if you have the memmove function. */ #undef HAVE_MEMMOVE /* Define if you have the poll function. */ #undef HAVE_POLL /* Define if you have the setmode function. */ #undef HAVE_SETMODE /* Define if you have the snprintf function. */ #undef HAVE_SNPRINTF /* Define if you have the strncasecmp function. */ #undef HAVE_STRNCASECMP /* Define if you have the strnicmp function. */ #undef HAVE_STRNICMP /* Define if you have the usleep function. */ #undef HAVE_USLEEP /* Define if you have the vfork function. */ #undef HAVE_VFORK /* Define if you have the header file. */ #undef HAVE_DIR_H /* Define if you have the header file. */ #undef HAVE_DIRENT_H /* Define if you have the header file. */ #undef HAVE_FCNTL_H /* Define if you have the header file. */ #undef HAVE_IO_H /* Define if you have the header file. */ #undef HAVE_NDIR_H /* Define if you have the header file. */ #undef HAVE_PWD_H /* Define if you have the header file. */ #undef HAVE_SYS_DIR_H /* Define if you have the header file. */ #undef HAVE_SYS_FILE_H /* Define if you have the header file. */ #undef HAVE_SYS_NDIR_H /* Define if you have the header file. */ #undef HAVE_SYS_TIME_H /* Define if you have the header file. */ #undef HAVE_UNISTD_H /* Define if you have the z library (-lz). */ #undef HAVE_LIBZ #endif /* !__CONFIG_H__ */ kazu-yamamoto-Mew-ff9c41b/bin/configure000077500000000000000000005524611256455547000202470ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.65. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1 test \$(( 1 + 1 )) = 2 || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="mewl.c" # Factoring default headers for most tests. ac_includes_default="\ #include #ifdef HAVE_SYS_TYPES_H # include #endif #ifdef HAVE_SYS_STAT_H # include #endif #ifdef STDC_HEADERS # include # include #else # ifdef HAVE_STDLIB_H # include # endif #endif #ifdef HAVE_STRING_H # if !defined STDC_HEADERS && defined HAVE_MEMORY_H # include # endif # include #endif #ifdef HAVE_STRINGS_H # include #endif #ifdef HAVE_INTTYPES_H # include #endif #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_UNISTD_H # include #endif" ac_subst_vars='LTLIBOBJS LIBOBJS EGREP GREP CPP INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM OBJEXT EXEEXT ac_ct_CC CPPFLAGS LDFLAGS CFLAGS CC target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking ' ac_precious_vars='build_alias host_alias target_alias CC CFLAGS LDFLAGS LIBS CPPFLAGS CPP' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error "unrecognized option: \`$ac_option' Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Some influential environment variables: CC C compiler command CFLAGS C compiler flags LDFLAGS linker flags, e.g. -L if you have libraries in a nonstandard directory LIBS libraries to pass to the linker, e.g. -l CPPFLAGS (Objective) C/C++ preprocessor flags, e.g. -I if you have headers in a nonstandard directory CPP C preprocessor Use these variables to override the choices made by `configure' or to help it to find libraries and programs with nonstandard names/locations. Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.65 Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## # ac_fn_c_try_compile LINENO # -------------------------- # Try to compile conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest.$ac_objext; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_compile # ac_fn_c_try_cpp LINENO # ---------------------- # Try to preprocess conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_cpp () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_cpp conftest.$ac_ext" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_cpp conftest.$ac_ext") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } >/dev/null && { test -z "$ac_c_preproc_warn_flag$ac_c_werror_flag" || test ! -s conftest.err }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_cpp # ac_fn_c_check_type LINENO TYPE VAR INCLUDES # ------------------------------------------- # Tests whether TYPE exists after having included INCLUDES, setting cache # variable VAR accordingly. ac_fn_c_check_type () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=no" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof ($2)) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 int main () { if (sizeof (($2))) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else eval "$3=yes" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_type # ac_fn_c_try_run LINENO # ---------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. Assumes # that executables *can* be run. ac_fn_c_try_run () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { ac_try='./conftest$ac_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then : ac_retval=0 else $as_echo "$as_me: program exited with status $ac_status" >&5 $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=$ac_status fi rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_run # ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists and can be compiled using the include files in # INCLUDES, setting the cache variable VAR accordingly. ac_fn_c_check_header_compile () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_compile # ac_fn_c_try_link LINENO # ----------------------- # Try to link conftest.$ac_ext, and return whether this succeeded. ac_fn_c_try_link () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack rm -f conftest.$ac_objext conftest$ac_exeext if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>conftest.err ac_status=$? if test -s conftest.err; then grep -v '^ *+' conftest.err >conftest.er1 cat conftest.er1 >&5 mv -f conftest.er1 conftest.err fi $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } && { test -z "$ac_c_werror_flag" || test ! -s conftest.err } && test -s conftest$ac_exeext && { test "$cross_compiling" = yes || $as_test_x conftest$ac_exeext }; then : ac_retval=0 else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 ac_retval=1 fi # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would # interfere with the next link command; also delete a directory that is # left behind by Apple's compiler. We do this before executing the actions. rm -rf conftest.dSYM conftest_ipa8_conftest.oo eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} as_fn_set_status $ac_retval } # ac_fn_c_try_link # ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES # ------------------------------------------------------- # Tests whether HEADER exists, giving a warning if it cannot be compiled using # the include files in INCLUDES and setting the cache variable VAR # accordingly. ac_fn_c_check_header_mongrel () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } else # Is the header compilable? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 usability" >&5 $as_echo_n "checking $2 usability... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ $4 #include <$2> _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_header_compiler=yes else ac_header_compiler=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler" >&5 $as_echo "$ac_header_compiler" >&6; } # Is the header present? { $as_echo "$as_me:${as_lineno-$LINENO}: checking $2 presence" >&5 $as_echo_n "checking $2 presence... " >&6; } cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include <$2> _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : ac_header_preproc=yes else ac_header_preproc=no fi rm -f conftest.err conftest.$ac_ext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc" >&5 $as_echo "$ac_header_preproc" >&6; } # So? What about this header? case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #(( yes:no: ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&5 $as_echo "$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; no:yes:* ) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled" >&5 $as_echo "$as_me: WARNING: $2: present but cannot be compiled" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: check for missing prerequisite headers?" >&5 $as_echo "$as_me: WARNING: $2: check for missing prerequisite headers?" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation" >&5 $as_echo "$as_me: WARNING: $2: see the Autoconf documentation" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&5 $as_echo "$as_me: WARNING: $2: section \"Present But Cannot Be Compiled\"" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result" >&5 $as_echo "$as_me: WARNING: $2: proceeding with the compiler's result" >&2;} ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else eval "$3=\$ac_header_compiler" fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } fi eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_header_mongrel # ac_fn_c_check_func LINENO FUNC VAR # ---------------------------------- # Tests whether FUNC exists, setting the cache variable VAR accordingly ac_fn_c_check_func () { as_lineno=${as_lineno-"$1"} as_lineno_stack=as_lineno_stack=$as_lineno_stack { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $2" >&5 $as_echo_n "checking for $2... " >&6; } if { as_var=$3; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Define $2 to an innocuous variant, in case declares $2. For example, HP-UX 11i declares gettimeofday. */ #define $2 innocuous_$2 /* System header to define __stub macros and hopefully few prototypes, which can conflict with char $2 (); below. Prefer to if __STDC__ is defined, since exists even on freestanding compilers. */ #ifdef __STDC__ # include #else # include #endif #undef $2 /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char $2 (); /* The GNU C library defines this for functions which it implements to always fail with ENOSYS. Some functions are actually named something starting with __ and the normal name is an alias. */ #if defined __stub_$2 || defined __stub___$2 choke me #endif int main () { return $2 (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : eval "$3=yes" else eval "$3=no" fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext fi eval ac_res=\$$3 { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval $as_lineno_stack; test "x$as_lineno_stack" = x && { as_lineno=; unset as_lineno;} } # ac_fn_c_check_func cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.65. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. set dummy ${ac_tool_prefix}gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$ac_cv_prog_CC"; then ac_ct_CC=$CC # Extract the first word of "gcc", so it can be a program name with args. set dummy gcc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="gcc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi else CC="$ac_cv_prog_CC" fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. set dummy ${ac_tool_prefix}cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="${ac_tool_prefix}cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi fi if test -z "$CC"; then # Extract the first word of "cc", so it can be a program name with args. set dummy cc; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else ac_prog_rejected=no as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then ac_prog_rejected=yes continue fi ac_cv_prog_CC="cc" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS if test $ac_prog_rejected = yes; then # We found a bogon in the path, so make sure we never use it. set dummy $ac_cv_prog_CC shift if test $# != 0; then # We chose a different compiler from the bogus one. # However, it has the same basename, so the bogon will be chosen # first if we set CC to just the basename; use the full file name. shift ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" fi fi fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi fi if test -z "$CC"; then if test -n "$ac_tool_prefix"; then for ac_prog in cl.exe do # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. set dummy $ac_tool_prefix$ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$CC"; then ac_cv_prog_CC="$CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_CC="$ac_tool_prefix$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi CC=$ac_cv_prog_CC if test -n "$CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CC" >&5 $as_echo "$CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$CC" && break done fi if test -z "$CC"; then ac_ct_CC=$CC for ac_prog in cl.exe do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_prog_ac_ct_CC+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -n "$ac_ct_CC"; then ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_prog_ac_ct_CC="$ac_prog" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS fi fi ac_ct_CC=$ac_cv_prog_ac_ct_CC if test -n "$ac_ct_CC"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC" >&5 $as_echo "$ac_ct_CC" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$ac_ct_CC" && break done if test "x$ac_ct_CC" = x; then CC="" else case $cross_compiling:$ac_tool_warned in yes:) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 $as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} ac_tool_warned=yes ;; esac CC=$ac_ct_CC fi fi fi test -z "$CC" && { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "no acceptable C compiler found in \$PATH See \`config.log' for more details." "$LINENO" 5; } # Provide some information about the compiler. $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler version" >&5 set X $ac_compile ac_compiler=$2 for ac_option in --version -v -V -qversion; do { { ac_try="$ac_compiler $ac_option >&5" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compiler $ac_option >&5") 2>conftest.err ac_status=$? if test -s conftest.err; then sed '10a\ ... rest of stderr output deleted ... 10q' conftest.err >conftest.er1 cat conftest.er1 >&5 fi rm -f conftest.er1 conftest.err $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } done cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files a.out a.out.dSYM a.exe b.out" # Try to create an executable without -o first, disregard a.out. # It will help us diagnose broken compilers, and finding out an intuition # of exeext. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether the C compiler works" >&5 $as_echo_n "checking whether the C compiler works... " >&6; } ac_link_default=`$as_echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` # The possible output files: ac_files="a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*" ac_rmfiles= for ac_file in $ac_files do case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; * ) ac_rmfiles="$ac_rmfiles $ac_file";; esac done rm -f $ac_rmfiles if { { ac_try="$ac_link_default" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link_default") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # Autoconf-2.13 could set the ac_cv_exeext variable to `no'. # So ignore a value of `no', otherwise this would lead to `EXEEXT = no' # in a Makefile. We should not override ac_cv_exeext if it was cached, # so that the user can short-circuit this test for compilers unknown to # Autoconf. for ac_file in $ac_files '' do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; [ab].out ) # We found the default executable, but exeext='' is most # certainly right. break;; *.* ) if test "${ac_cv_exeext+set}" = set && test "$ac_cv_exeext" != no; then :; else ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` fi # We set ac_cv_exeext here because the later test for it is not # safe: cross compilers may not add the suffix if given an `-o' # argument, so we may need to know it at that point already. # Even if this section looks crufty: it has the advantage of # actually working. break;; * ) break;; esac done test "$ac_cv_exeext" = no && ac_cv_exeext= else ac_file='' fi if test -z "$ac_file"; then : { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { as_fn_set_status 77 as_fn_error "C compiler cannot create executables See \`config.log' for more details." "$LINENO" 5; }; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 $as_echo "yes" >&6; } fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name" >&5 $as_echo_n "checking for C compiler default output file name... " >&6; } { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_file" >&5 $as_echo "$ac_file" >&6; } ac_exeext=$ac_cv_exeext rm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of executables" >&5 $as_echo_n "checking for suffix of executables... " >&6; } if { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : # If both `conftest.exe' and `conftest' are `present' (well, observable) # catch `conftest.exe'. For instance with Cygwin, `ls conftest' will # work properly (i.e., refer to `conftest.exe'), while it won't with # `rm'. for ac_file in conftest.exe conftest conftest.*; do test -f "$ac_file" || continue case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;; *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` break;; * ) break;; esac done else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of executables: cannot compile and link See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest conftest$ac_cv_exeext { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext" >&5 $as_echo "$ac_cv_exeext" >&6; } rm -f conftest.$ac_ext EXEEXT=$ac_cv_exeext ac_exeext=$EXEEXT cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include int main () { FILE *f = fopen ("conftest.out", "w"); return ferror (f) || fclose (f) != 0; ; return 0; } _ACEOF ac_clean_files="$ac_clean_files conftest.out" # Check that the compiler produces executables we can run. If not, either # the compiler is broken, or we cross compile. { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling" >&5 $as_echo_n "checking whether we are cross compiling... " >&6; } if test "$cross_compiling" != yes; then { { ac_try="$ac_link" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_link") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; } if { ac_try='./conftest$ac_cv_exeext' { { case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_try") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; }; then cross_compiling=no else if test "$cross_compiling" = maybe; then cross_compiling=yes else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot run C compiled programs. If you meant to cross compile, use \`--host'. See \`config.log' for more details." "$LINENO" 5; } fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $cross_compiling" >&5 $as_echo "$cross_compiling" >&6; } rm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out ac_clean_files=$ac_clean_files_save { $as_echo "$as_me:${as_lineno-$LINENO}: checking for suffix of object files" >&5 $as_echo_n "checking for suffix of object files... " >&6; } if test "${ac_cv_objext+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF rm -f conftest.o conftest.obj if { { ac_try="$ac_compile" case "(($ac_try" in *\"* | *\`* | *\\*) ac_try_echo=\$ac_try;; *) ac_try_echo=$ac_try;; esac eval ac_try_echo="\"\$as_me:${as_lineno-$LINENO}: $ac_try_echo\"" $as_echo "$ac_try_echo"; } >&5 (eval "$ac_compile") 2>&5 ac_status=$? $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5 test $ac_status = 0; }; then : for ac_file in conftest.o conftest.obj conftest.*; do test -f "$ac_file" || continue; case $ac_file in *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;; *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` break;; esac done else $as_echo "$as_me: failed program was:" >&5 sed 's/^/| /' conftest.$ac_ext >&5 { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "cannot compute suffix of object files: cannot compile See \`config.log' for more details." "$LINENO" 5; } fi rm -f conftest.$ac_cv_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext" >&5 $as_echo "$ac_cv_objext" >&6; } OBJEXT=$ac_cv_objext ac_objext=$OBJEXT { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler" >&5 $as_echo_n "checking whether we are using the GNU C compiler... " >&6; } if test "${ac_cv_c_compiler_gnu+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { #ifndef __GNUC__ choke me #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_compiler_gnu=yes else ac_compiler_gnu=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_cv_c_compiler_gnu=$ac_compiler_gnu fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu" >&5 $as_echo "$ac_cv_c_compiler_gnu" >&6; } if test $ac_compiler_gnu = yes; then GCC=yes else GCC= fi ac_test_CFLAGS=${CFLAGS+set} ac_save_CFLAGS=$CFLAGS { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g" >&5 $as_echo_n "checking whether $CC accepts -g... " >&6; } if test "${ac_cv_prog_cc_g+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_save_c_werror_flag=$ac_c_werror_flag ac_c_werror_flag=yes ac_cv_prog_cc_g=no CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes else CFLAGS="" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : else ac_c_werror_flag=$ac_save_c_werror_flag CFLAGS="-g" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_g=yes fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ac_c_werror_flag=$ac_save_c_werror_flag fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g" >&5 $as_echo "$ac_cv_prog_cc_g" >&6; } if test "$ac_test_CFLAGS" = set; then CFLAGS=$ac_save_CFLAGS elif test $ac_cv_prog_cc_g = yes; then if test "$GCC" = yes; then CFLAGS="-g -O2" else CFLAGS="-g" fi else if test "$GCC" = yes; then CFLAGS="-O2" else CFLAGS= fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89" >&5 $as_echo_n "checking for $CC option to accept ISO C89... " >&6; } if test "${ac_cv_prog_cc_c89+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_cv_prog_cc_c89=no ac_save_CC=$CC cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include /* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ struct buf { int x; }; FILE * (*rcsopen) (struct buf *, struct stat *, int); static char *e (p, i) char **p; int i; { return p[i]; } static char *f (char * (*g) (char **, int), char **p, ...) { char *s; va_list v; va_start (v,p); s = g (p, va_arg (v,int)); va_end (v); return s; } /* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has function prototypes and stuff, but not '\xHH' hex character constants. These don't provoke an error unfortunately, instead are silently treated as 'x'. The following induces an error, until -std is added to get proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an array size at least. It's necessary to write '\x00'==0 to get something that's true only with -std. */ int osf4_cc_array ['\x00' == 0 ? 1 : -1]; /* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters inside strings and character constants. */ #define FOO(x) 'x' int xlc6_cc_array[FOO(a) == 'x' ? 1 : -1]; int test (int i, double x); struct s1 {int (*f) (int a);}; struct s2 {int (*f) (double a);}; int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); int argc; char **argv; int main () { return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; ; return 0; } _ACEOF for ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \ -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" do CC="$ac_save_CC $ac_arg" if ac_fn_c_try_compile "$LINENO"; then : ac_cv_prog_cc_c89=$ac_arg fi rm -f core conftest.err conftest.$ac_objext test "x$ac_cv_prog_cc_c89" != "xno" && break done rm -f conftest.$ac_ext CC=$ac_save_CC fi # AC_CACHE_VAL case "x$ac_cv_prog_cc_c89" in x) { $as_echo "$as_me:${as_lineno-$LINENO}: result: none needed" >&5 $as_echo "none needed" >&6; } ;; xno) { $as_echo "$as_me:${as_lineno-$LINENO}: result: unsupported" >&5 $as_echo "unsupported" >&6; } ;; *) CC="$CC $ac_cv_prog_cc_c89" { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89" >&5 $as_echo "$ac_cv_prog_cc_c89" >&6; } ;; esac if test "x$ac_cv_prog_cc_c89" != xno; then : fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done done if test -z "$ac_aux_dir"; then as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. # Find a good install program. We prefer a C program (faster), # so one script is as good as another. But avoid the broken or # incompatible versions: # SysV /etc/install, /usr/sbin/install # SunOS /usr/etc/install # IRIX /sbin/install # AIX /bin/install # AmigaOS /C/install, which installs bootblocks on floppy discs # AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag # AFS /usr/afsws/bin/install, which mishandles nonexistent args # SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" # OS/2's system install, which has a completely different semantic # ./install, which can be erroneously created by make from ./install.sh. # Reject install programs that cannot install multiple files. { $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 $as_echo_n "checking for a BSD-compatible install... " >&6; } if test -z "$INSTALL"; then if test "${ac_cv_path_install+set}" = set; then : $as_echo_n "(cached) " >&6 else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. # Account for people who put trailing slashes in PATH elements. case $as_dir/ in #(( ./ | .// | /[cC]/* | \ /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ /usr/ucb/* ) ;; *) # OSF1 and SCO ODT 3.0 have their own names for install. # Don't use installbsd from OSF since it installs stuff as root # by default. for ac_prog in ginstall scoinst install; do for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_prog$ac_exec_ext" && $as_test_x "$as_dir/$ac_prog$ac_exec_ext"; }; then if test $ac_prog = install && grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # AIX install. It has an incompatible calling convention. : elif test $ac_prog = install && grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then # program-specific install script used by HP pwplus--don't use. : else rm -rf conftest.one conftest.two conftest.dir echo one > conftest.one echo two > conftest.two mkdir conftest.dir if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && test -s conftest.one && test -s conftest.two && test -s conftest.dir/conftest.one && test -s conftest.dir/conftest.two then ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" break 3 fi fi fi done done ;; esac done IFS=$as_save_IFS rm -rf conftest.one conftest.two conftest.dir fi if test "${ac_cv_path_install+set}" = set; then INSTALL=$ac_cv_path_install else # As a last resort, use the slow shell script. Don't cache a # value for INSTALL within a source directory, because that will # break other packages using the cache if that directory is # removed, or if the value is a relative name. INSTALL=$ac_install_sh fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 $as_echo "$INSTALL" >&6; } # Use test -z because SunOS4 sh mishandles braces in ${var-val}. # It thinks the first close brace ends the variable substitution. test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' { $as_echo "$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const" >&5 $as_echo_n "checking for an ANSI C-conforming const... " >&6; } if test "${ac_cv_c_const+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { /* FIXME: Include the comments suggested by Paul. */ #ifndef __cplusplus /* Ultrix mips cc rejects this. */ typedef int charset[2]; const charset cs; /* SunOS 4.1.1 cc rejects this. */ char const *const *pcpcc; char **ppc; /* NEC SVR4.0.2 mips cc rejects this. */ struct point {int x, y;}; static struct point const zero = {0,0}; /* AIX XL C 1.02.0.0 rejects this. It does not let you subtract one const X* pointer from another in an arm of an if-expression whose if-part is not a constant expression */ const char *g = "string"; pcpcc = &g + (g ? g-g : 0); /* HPUX 7.0 cc rejects these. */ ++pcpcc; ppc = (char**) pcpcc; pcpcc = (char const *const *) ppc; { /* SCO 3.2v4 cc rejects this. */ char *t; char const *s = 0 ? (char *) 0 : (char const *) 0; *t++ = 0; if (s) return 0; } { /* Someone thinks the Sun supposedly-ANSI compiler will reject this. */ int x[] = {25, 17}; const int *foo = &x[0]; ++foo; } { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */ typedef const int *iptr; iptr p = 0; ++p; } { /* AIX XL C 1.02.0.0 rejects this saying "k.c", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */ struct s { int j; const int *ap[3]; }; struct s *b; b->j = 5; } { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */ const int foo = 10; if (!foo) return 0; } return !cs[0] && !zero.x; #endif ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_c_const=yes else ac_cv_c_const=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const" >&5 $as_echo "$ac_cv_c_const" >&6; } if test $ac_cv_c_const = no; then $as_echo "#define const /**/" >>confdefs.h fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor" >&5 $as_echo_n "checking how to run the C preprocessor... " >&6; } # On Suns, sometimes $CPP names a directory. if test -n "$CPP" && test -d "$CPP"; then CPP= fi if test -z "$CPP"; then if test "${ac_cv_prog_CPP+set}" = set; then : $as_echo_n "(cached) " >&6 else # Double quotes because CPP needs to be expanded for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" do ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : break fi done ac_cv_prog_CPP=$CPP fi CPP=$ac_cv_prog_CPP else ac_cv_prog_CPP=$CPP fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $CPP" >&5 $as_echo "$CPP" >&6; } ac_preproc_ok=false for ac_c_preproc_warn_flag in '' yes do # Use a header file that comes with gcc, so configuring glibc # with a fresh cross-compiler works. # Prefer to if __STDC__ is defined, since # exists even on freestanding compilers. # On the NeXT, cc -E runs the code through the compiler's parser, # not just through cpp. "Syntax error" is here to catch this case. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #ifdef __STDC__ # include #else # include #endif Syntax error _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : else # Broken: fails on valid input. continue fi rm -f conftest.err conftest.$ac_ext # OK, works on sane cases. Now check whether nonexistent headers # can be detected and how. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if ac_fn_c_try_cpp "$LINENO"; then : # Broken: success on invalid input. continue else # Passes both tests. ac_preproc_ok=: break fi rm -f conftest.err conftest.$ac_ext done # Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. rm -f conftest.err conftest.$ac_ext if $ac_preproc_ok; then : else { { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} as_fn_error "C preprocessor \"$CPP\" fails sanity check See \`config.log' for more details." "$LINENO" 5; } fi ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu { $as_echo "$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e" >&5 $as_echo_n "checking for grep that handles long lines and -e... " >&6; } if test "${ac_cv_path_GREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if test -z "$GREP"; then ac_path_GREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in grep ggrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_GREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_GREP" && $as_test_x "$ac_path_GREP"; } || continue # Check for GNU ac_path_GREP and select it if it is found. # Check for GNU $ac_path_GREP case `"$ac_path_GREP" --version 2>&1` in *GNU*) ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'GREP' >> "conftest.nl" "$ac_path_GREP" -e 'GREP$' -e '-(cannot match)-' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_GREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_GREP="$ac_path_GREP" ac_path_GREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_GREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_GREP"; then as_fn_error "no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_GREP=$GREP fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP" >&5 $as_echo "$ac_cv_path_GREP" >&6; } GREP="$ac_cv_path_GREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for egrep" >&5 $as_echo_n "checking for egrep... " >&6; } if test "${ac_cv_path_EGREP+set}" = set; then : $as_echo_n "(cached) " >&6 else if echo a | $GREP -E '(a|b)' >/dev/null 2>&1 then ac_cv_path_EGREP="$GREP -E" else if test -z "$EGREP"; then ac_path_EGREP_found=false # Loop through the user's path and test for each of PROGNAME-LIST as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_prog in egrep; do for ac_exec_ext in '' $ac_executable_extensions; do ac_path_EGREP="$as_dir/$ac_prog$ac_exec_ext" { test -f "$ac_path_EGREP" && $as_test_x "$ac_path_EGREP"; } || continue # Check for GNU ac_path_EGREP and select it if it is found. # Check for GNU $ac_path_EGREP case `"$ac_path_EGREP" --version 2>&1` in *GNU*) ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_found=:;; *) ac_count=0 $as_echo_n 0123456789 >"conftest.in" while : do cat "conftest.in" "conftest.in" >"conftest.tmp" mv "conftest.tmp" "conftest.in" cp "conftest.in" "conftest.nl" $as_echo 'EGREP' >> "conftest.nl" "$ac_path_EGREP" 'EGREP$' < "conftest.nl" >"conftest.out" 2>/dev/null || break diff "conftest.out" "conftest.nl" >/dev/null 2>&1 || break as_fn_arith $ac_count + 1 && ac_count=$as_val if test $ac_count -gt ${ac_path_EGREP_max-0}; then # Best one so far, save it but keep looking for a better one ac_cv_path_EGREP="$ac_path_EGREP" ac_path_EGREP_max=$ac_count fi # 10*(2^10) chars as input seems more than enough test $ac_count -gt 10 && break done rm -f conftest.in conftest.tmp conftest.nl conftest.out;; esac $ac_path_EGREP_found && break 3 done done done IFS=$as_save_IFS if test -z "$ac_cv_path_EGREP"; then as_fn_error "no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin" "$LINENO" 5 fi else ac_cv_path_EGREP=$EGREP fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP" >&5 $as_echo "$ac_cv_path_EGREP" >&6; } EGREP="$ac_cv_path_EGREP" { $as_echo "$as_me:${as_lineno-$LINENO}: checking for uid_t in sys/types.h" >&5 $as_echo_n "checking for uid_t in sys/types.h... " >&6; } if test "${ac_cv_type_uid_t+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "uid_t" >/dev/null 2>&1; then : ac_cv_type_uid_t=yes else ac_cv_type_uid_t=no fi rm -f conftest* fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_uid_t" >&5 $as_echo "$ac_cv_type_uid_t" >&6; } if test $ac_cv_type_uid_t = no; then $as_echo "#define uid_t int" >>confdefs.h $as_echo "#define gid_t int" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi # On IRIX 5.3, sys/types and inttypes.h are conflicting. for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ inttypes.h stdint.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_compile "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default " eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done ac_fn_c_check_type "$LINENO" "pid_t" "ac_cv_type_pid_t" "$ac_includes_default" if test "x$ac_cv_type_pid_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define pid_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "size_t" "ac_cv_type_size_t" "$ac_includes_default" if test "x$ac_cv_type_size_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define size_t unsigned int _ACEOF fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking return type of signal handlers" >&5 $as_echo_n "checking return type of signal handlers... " >&6; } if test "${ac_cv_type_signal+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include int main () { return *(signal (0, 0)) (0) == 1; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_type_signal=int else ac_cv_type_signal=void fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal" >&5 $as_echo "$ac_cv_type_signal" >&6; } cat >>confdefs.h <<_ACEOF #define RETSIGTYPE $ac_cv_type_signal _ACEOF ac_fn_c_check_type "$LINENO" "useconds_t" "ac_cv_type_useconds_t" "$ac_includes_default" if test "x$ac_cv_type_useconds_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define useconds_t int _ACEOF fi ac_fn_c_check_type "$LINENO" "ssize_t" "ac_cv_type_ssize_t" "$ac_includes_default" if test "x$ac_cv_type_ssize_t" = x""yes; then : else cat >>confdefs.h <<_ACEOF #define ssize_t int _ACEOF fi ac_config_headers="$ac_config_headers config.h" ac_header_dirent=no for ac_hdr in dirent.h sys/ndir.h sys/dir.h ndir.h; do as_ac_Header=`$as_echo "ac_cv_header_dirent_$ac_hdr" | $as_tr_sh` { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_hdr that defines DIR" >&5 $as_echo_n "checking for $ac_hdr that defines DIR... " >&6; } if { as_var=$as_ac_Header; eval "test \"\${$as_var+set}\" = set"; }; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include <$ac_hdr> int main () { if ((DIR *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : eval "$as_ac_Header=yes" else eval "$as_ac_Header=no" fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi eval ac_res=\$$as_ac_Header { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_res" >&5 $as_echo "$ac_res" >&6; } eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_hdr" | $as_tr_cpp` 1 _ACEOF ac_header_dirent=$ac_hdr; break fi done # Two versions of opendir et al. are in -ldir and -lx on SCO Xenix. if test $ac_header_dirent = dirent.h; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' dir; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi else { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing opendir" >&5 $as_echo_n "checking for library containing opendir... " >&6; } if test "${ac_cv_search_opendir+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_func_search_save_LIBS=$LIBS cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ /* Override any GCC internal prototype to avoid an error. Use char because int might match the return type of a GCC builtin and then its argument prototype would still apply. */ #ifdef __cplusplus extern "C" #endif char opendir (); int main () { return opendir (); ; return 0; } _ACEOF for ac_lib in '' x; do if test -z "$ac_lib"; then ac_res="none required" else ac_res=-l$ac_lib LIBS="-l$ac_lib $ac_func_search_save_LIBS" fi if ac_fn_c_try_link "$LINENO"; then : ac_cv_search_opendir=$ac_res fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext if test "${ac_cv_search_opendir+set}" = set; then : break fi done if test "${ac_cv_search_opendir+set}" = set; then : else ac_cv_search_opendir=no fi rm conftest.$ac_ext LIBS=$ac_func_search_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_opendir" >&5 $as_echo "$ac_cv_search_opendir" >&6; } ac_res=$ac_cv_search_opendir if test "$ac_res" != no; then : test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking for ANSI C header files" >&5 $as_echo_n "checking for ANSI C header files... " >&6; } if test "${ac_cv_header_stdc+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include #include int main () { ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_stdc=yes else ac_cv_header_stdc=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext if test $ac_cv_header_stdc = yes; then # SunOS 4.x string.h does not declare mem*, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "memchr" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include _ACEOF if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | $EGREP "free" >/dev/null 2>&1; then : else ac_cv_header_stdc=no fi rm -f conftest* fi if test $ac_cv_header_stdc = yes; then # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. if test "$cross_compiling" = yes; then : : else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #if ((' ' & 0x0FF) == 0x020) # define ISLOWER(c) ('a' <= (c) && (c) <= 'z') # define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) #else # define ISLOWER(c) \ (('a' <= (c) && (c) <= 'i') \ || ('j' <= (c) && (c) <= 'r') \ || ('s' <= (c) && (c) <= 'z')) # define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) #endif #define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) int main () { int i; for (i = 0; i < 256; i++) if (XOR (islower (i), ISLOWER (i)) || toupper (i) != TOUPPER (i)) return 2; return 0; } _ACEOF if ac_fn_c_try_run "$LINENO"; then : else ac_cv_header_stdc=no fi rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ conftest.$ac_objext conftest.beam conftest.$ac_ext fi fi fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc" >&5 $as_echo "$ac_cv_header_stdc" >&6; } if test $ac_cv_header_stdc = yes; then $as_echo "#define STDC_HEADERS 1" >>confdefs.h fi { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included" >&5 $as_echo_n "checking whether time.h and sys/time.h may both be included... " >&6; } if test "${ac_cv_header_time+set}" = set; then : $as_echo_n "(cached) " >&6 else cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ #include #include #include int main () { if ((struct tm *) 0) return 0; ; return 0; } _ACEOF if ac_fn_c_try_compile "$LINENO"; then : ac_cv_header_time=yes else ac_cv_header_time=no fi rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time" >&5 $as_echo "$ac_cv_header_time" >&6; } if test $ac_cv_header_time = yes; then $as_echo "#define TIME_WITH_SYS_TIME 1" >>confdefs.h fi for ac_header in dir.h unistd.h pwd.h fcntl.h io.h sys/time.h sys/file.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` ac_fn_c_check_header_mongrel "$LINENO" "$ac_header" "$as_ac_Header" "$ac_includes_default" eval as_val=\$$as_ac_Header if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_header" | $as_tr_cpp` 1 _ACEOF fi done { $as_echo "$as_me:${as_lineno-$LINENO}: checking for main in -lz" >&5 $as_echo_n "checking for main in -lz... " >&6; } if test "${ac_cv_lib_z_main+set}" = set; then : $as_echo_n "(cached) " >&6 else ac_check_lib_save_LIBS=$LIBS LIBS="-lz $LIBS" cat confdefs.h - <<_ACEOF >conftest.$ac_ext /* end confdefs.h. */ int main () { return main (); ; return 0; } _ACEOF if ac_fn_c_try_link "$LINENO"; then : ac_cv_lib_z_main=yes else ac_cv_lib_z_main=no fi rm -f core conftest.err conftest.$ac_objext \ conftest$ac_exeext conftest.$ac_ext LIBS=$ac_check_lib_save_LIBS fi { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_main" >&5 $as_echo "$ac_cv_lib_z_main" >&6; } if test "x$ac_cv_lib_z_main" = x""yes; then : cat >>confdefs.h <<_ACEOF #define HAVE_LIBZ 1 _ACEOF LIBS="-lz $LIBS" fi for ac_func in strncasecmp strnicmp memmove fgetln fork vfork getpwuid getlogin usleep Sleep setmode _setmode chdir _chdir2 poll futimes fchmod flock lockf snprintf do : as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" eval as_val=\$$as_ac_var if test "x$as_val" = x""yes; then : cat >>confdefs.h <<_ACEOF #define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 _ACEOF fi done if test "$GCC" = "yes"; then CFLAGS="$CFLAGS -Wall" fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.65. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.65, with options \\"\$ac_cs_config\\" Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || as_fn_error "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit $? fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi ac_config_files="$ac_config_files mew-pinentry" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' DEFS=-DHAVE_CONFIG_H ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.65. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac case $ac_config_headers in *" "*) set x $ac_config_headers; shift; ac_config_headers=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" config_headers="$ac_config_headers" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE --header=FILE[:TEMPLATE] instantiate the configuration header FILE Configuration files: $config_files Configuration headers: $config_headers Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.65, with options \\"\$ac_cs_config\\" Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' INSTALL='$INSTALL' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --header | --heade | --head | --hea ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_HEADERS " '$ac_optarg'" ac_need_defaults=false;; --he | --h) # Conflict between --help and --header as_fn_error "ambiguous option: \`$1' Try \`$0 --help' for more information.";; --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "config.h") CONFIG_HEADERS="$CONFIG_HEADERS config.h" ;; "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; "mew-pinentry") CONFIG_FILES="$CONFIG_FILES mew-pinentry" ;; *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" # Set up the scripts for CONFIG_HEADERS section. # No need to generate them if there are no CONFIG_HEADERS. # This happens for instance with `./config.status Makefile'. if test -n "$CONFIG_HEADERS"; then cat >"$tmp/defines.awk" <<\_ACAWK || BEGIN { _ACEOF # Transform confdefs.h into an awk script `defines.awk', embedded as # here-document in config.status, that substitutes the proper values into # config.h.in to produce config.h. # Create a delimiter string that does not exist in confdefs.h, to ease # handling of long lines. ac_delim='%!_!# ' for ac_last_try in false false :; do ac_t=`sed -n "/$ac_delim/p" confdefs.h` if test -z "$ac_t"; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_HEADERS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done # For the awk script, D is an array of macro values keyed by name, # likewise P contains macro parameters if any. Preserve backslash # newline sequences. ac_word_re=[_$as_cr_Letters][_$as_cr_alnum]* sed -n ' s/.\{148\}/&'"$ac_delim"'/g t rset :rset s/^[ ]*#[ ]*define[ ][ ]*/ / t def d :def s/\\$// t bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3"/p s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2"/p d :bsnl s/["\\]/\\&/g s/^ \('"$ac_word_re"'\)\(([^()]*)\)[ ]*\(.*\)/P["\1"]="\2"\ D["\1"]=" \3\\\\\\n"\\/p t cont s/^ \('"$ac_word_re"'\)[ ]*\(.*\)/D["\1"]=" \2\\\\\\n"\\/p t cont d :cont n s/.\{148\}/&'"$ac_delim"'/g t clear :clear s/\\$// t bsnlc s/["\\]/\\&/g; s/^/"/; s/$/"/p d :bsnlc s/["\\]/\\&/g; s/^/"/; s/$/\\\\\\n"\\/p b cont ' >$CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 for (key in D) D_is_set[key] = 1 FS = "" } /^[\t ]*#[\t ]*(define|undef)[\t ]+$ac_word_re([\t (]|\$)/ { line = \$ 0 split(line, arg, " ") if (arg[1] == "#") { defundef = arg[2] mac1 = arg[3] } else { defundef = substr(arg[1], 2) mac1 = arg[2] } split(mac1, mac2, "(") #) macro = mac2[1] prefix = substr(line, 1, index(line, defundef) - 1) if (D_is_set[macro]) { # Preserve the white space surrounding the "#". print prefix "define", macro P[macro] D[macro] next } else { # Replace #undef with comments. This is necessary, for example, # in the case of _POSIX_SOURCE, which is predefined and required # on some systems where configure will not decide to define it. if (defundef == "undef") { print "/*", prefix defundef, macro, "*/" next } } } { print } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 as_fn_error "could not setup config headers machinery" "$LINENO" 5 fi # test -n "$CONFIG_HEADERS" eval set X " :F $CONFIG_FILES :H $CONFIG_HEADERS " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # case $INSTALL in [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;; esac _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t s&@INSTALL@&$ac_INSTALL&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || as_fn_error "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; :H) # # CONFIG_HEADER # if test x"$ac_file" != x-; then { $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" } >"$tmp/config.h" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 if diff "$ac_file" "$tmp/config.h" >/dev/null 2>&1; then { $as_echo "$as_me:${as_lineno-$LINENO}: $ac_file is unchanged" >&5 $as_echo "$as_me: $ac_file is unchanged" >&6;} else rm -f "$ac_file" mv "$tmp/config.h" "$ac_file" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 fi else $as_echo "/* $configure_input */" \ && eval '$AWK -f "$tmp/defines.awk"' "$ac_file_inputs" \ || as_fn_error "could not create -" "$LINENO" 5 fi ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit $? fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi kazu-yamamoto-Mew-ff9c41b/bin/configure.in000066400000000000000000000011721256455547000206350ustar00rootroot00000000000000AC_INIT(mewl.c) AC_PROG_CC AC_PROG_INSTALL AC_C_CONST AC_TYPE_UID_T AC_TYPE_PID_T AC_TYPE_SIZE_T AC_TYPE_SIGNAL AC_CHECK_TYPE(useconds_t, int) AC_CHECK_TYPE(ssize_t, int) AC_EXEEXT AC_OBJEXT AC_CONFIG_HEADER(config.h) AC_HEADER_DIRENT AC_HEADER_STDC AC_HEADER_TIME AC_CHECK_HEADERS(dir.h unistd.h pwd.h fcntl.h io.h sys/time.h sys/file.h) AC_CHECK_LIB(z, main) AC_CHECK_FUNCS(strncasecmp strnicmp memmove fgetln fork vfork getpwuid getlogin usleep Sleep setmode _setmode chdir _chdir2 poll futimes fchmod flock lockf snprintf) if test "$GCC" = "yes"; then CFLAGS="$CFLAGS -Wall" fi AC_OUTPUT(Makefile) AC_OUTPUT(mew-pinentry) kazu-yamamoto-Mew-ff9c41b/bin/d/000077500000000000000000000000001256455547000165465ustar00rootroot00000000000000kazu-yamamoto-Mew-ff9c41b/bin/d/Makefile000066400000000000000000000004431256455547000202070ustar00rootroot00000000000000# You NEED TO make a link "sqlite3.a" to its entity. # (e.g /usr/lib/libsqlite3.dylib on Mac) TGT = smew OBJ = smew.o Sqlite3DB.o SearchEngine.o LIB = sqlite3.a DC = dmd .SUFFIXES: .d .d.o: $(DC) -c $< all: $(TGT) $(TGT): $(OBJ) $(DC) -of$@ $(OBJ) $(LIB) clean: rm -f $(TGT) $(OBJ) kazu-yamamoto-Mew-ff9c41b/bin/d/SearchEngine.d000066400000000000000000000112241256455547000212460ustar00rootroot00000000000000module SearchEngine; private import std.stdio; private import std.string; private import std.path; private import Sqlite3DB; //////////////////////////////////////////////////////////////// class SearchEngine { //////////////////////////////////////////////////////////////// private: Sqlite3DB db; string myid; string mydir; Row[] selectById(string id) { string sql = format("SELECT * FROM mew WHERE (mew.id = '%s');", id); return db.execute(sql); } Row[] selectByParid(string[] ids) in { assert(ids.length > 0); } body { string cond = ""; foreach (id; ids) { if (cond == "") cond = format("mew.parid = '%s'", id); else cond ~= format("OR mew.parid = '%s'", id); } string sql = format("SELECT * FROM mew WHERE (%s);", cond); return db.execute(sql); } Row chooseOne(Row[] ents) { if (ents is null) return null; if (mydir is null) return ents[0]; foreach (ent; ents) { if (dirname(ent["path"]) == mydir) { return ent; } } return ents[0]; } //////////////////////////////////////////////////////////////// public: this(string database, string myid, string mydir) { db = new Sqlite3DB(); db.open(database); this.myid = myid; this.mydir = mydir; } ~this() { db.close(); } //////////////////////////////// void searchMe() in { assert(myid != ""); } body { Row[] ents = selectById(myid); if (ents is null) return; Row me = chooseOne(ents); writefln("%s", me["path"]); } //////////////////////////////// void searchChild() in { assert(myid != ""); } body { Row[] ents = selectByParid([myid]); if (ents is null) return; Row child = chooseOne(ents); writefln("%s", child["path"]); } //////////////////////////////// void searchDescendants() { string rootid; int count = 0; int[string] index; Row[] descendants; string getParid(string id) { Row[] ents = selectById(id); if (ents is null) { return ""; } else { return ents[0]["parid"]; } } void findRoot() in { assert(myid != ""); } body { rootid = myid; string parid = getParid(myid); while (parid != "") { rootid = parid; parid = getParid(parid); } } bool pushDescendant(Row ent) { int* ip = ent["id"] in index; if (ip is null) { index[ent["id"]] = count; descendants ~= ent; count++; return true; } else { if (dirname(ent["path"]) == mydir) { Row old = descendants[*ip]; delete(old); descendants[*ip] = ent; } return false; } } void findDescendants() { Row root = chooseOne(selectById(rootid)); pushDescendant(root); Row[] children = selectByParid([rootid]); while (children.length != 0) { string[] ids; foreach (child; children) { if (pushDescendant(child)) ids ~= child["id"]; } children = selectByParid(ids); } } void printDescendants() { descendants.sort; foreach (ent; descendants) { writefln("%s", ent["path"]); } } // the main part of searchDescendants findRoot(); findDescendants(); printDescendants(); } } /* * Copyright (C) 2008 Mew developing team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ kazu-yamamoto-Mew-ff9c41b/bin/d/Sqlite3DB.d000066400000000000000000000104251256455547000204470ustar00rootroot00000000000000module Sqlite3DB; private import std.string: d2c = toStringz; private import std.conv; string c2d(char *s) { return to!string(s); } class Row { string[string] hash; string opIndex(string key) { return hash[key]; } void opIndexAssign(string value, string key) { hash[key] = value; } int opCmp(Object obj) { Row row = cast(Row)obj; return hash["date"] > row.hash["date"]; } } private struct sqlite3 {} private struct sqlite3_stmt {} private enum RC { OK, ROW = 100, DONE, } extern (C) RC sqlite3_open(const(char)* filename, sqlite3** database); extern (C) RC sqlite3_close(sqlite3* database); extern (C) RC sqlite3_prepare(sqlite3* database, const(char)* zSql, int nByte, sqlite3_stmt** ppStmt, char** pzTail); extern (C) RC sqlite3_step(sqlite3_stmt* pStmt); extern (C) RC sqlite3_finalize(sqlite3_stmt* pStmt); extern (C) int sqlite3_column_count(sqlite3_stmt* pStmt); extern (C) char* sqlite3_column_name(sqlite3_stmt* pStmt, int N); extern (C) char *sqlite3_column_text(sqlite3_stmt* pStmt, int iCol); extern (C) char* sqlite3_errmsg(sqlite3* database); class Sqlite3DB { private: string file; sqlite3* database; sqlite3_stmt* stmt; void prepare(string sql) { char** errmsg; RC rc = sqlite3_prepare(database, d2c(sql), sql.length, &stmt, errmsg); if (rc != RC.OK) { throw new Exception("sqlite3_prepare: " ~ c2d(sqlite3_errmsg(database))); } } RC step() { RC rc = sqlite3_step(stmt); if (rc != RC.ROW && rc != RC.DONE) { throw new Exception("sqlite3_step: " ~ c2d(sqlite3_errmsg(database))); } return rc; } void finalize() { RC rc = sqlite3_finalize(stmt); if (rc != RC.OK) { throw new Exception("sqlite3_finalize: " ~ c2d(sqlite3_errmsg(database))); } } Row result() { Row ret = new Row(); for (int i = 0; i < sqlite3_column_count(stmt); i++) { ret[c2d(sqlite3_column_name(stmt, i))] = c2d(sqlite3_column_text(stmt, i)); } return ret; } public: Row[] execute(string sql) in { assert(database !is null); } out { assert(database !is null); } body { Row[] results; prepare(sql); while (step() != RC.DONE) { results ~= result(); } finalize(); return results; } void open(string file) in { assert(database is null); } out { assert(database !is null); } body { this.file = file; RC rc = sqlite3_open(d2c(file), &database); if (rc != RC.OK) { throw new Exception("sqlite3_open: " ~ c2d(sqlite3_errmsg(database))); } } void close() in { assert(database !is null); } out { assert(database is null); } body { RC rc = sqlite3_close(database); if (rc != RC.OK) { throw new Exception("sqlite3_close: " ~ c2d(sqlite3_errmsg(database))); } database = null; } } /* * Copyright (C) 2008 Mew developing team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ kazu-yamamoto-Mew-ff9c41b/bin/d/smew.d000066400000000000000000000042361256455547000176730ustar00rootroot00000000000000import std.getopt; import std.path; import std.stdio; import SearchEngine; void main(string[] args) { bool parent, child; getopt(args, "p|parent", &parent, "c|child", &child); if (args.length < 2) { stderr.writefln("smew [-c|-p] id [db [dir]]"); return; } string myid = args[1]; string mydb = args.length >= 3 ? args[2] : expandTilde("~/Mail/id.db"); string mydir = args.length >= 4 ? args[3] : null; SearchEngine engine = new SearchEngine(mydb, myid, mydir); scope(exit) delete engine; if (parent) engine.searchMe(); else if (child) engine.searchChild(); else engine.searchDescendants(); } /* * Copyright (C) 2008 Mew developing team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ kazu-yamamoto-Mew-ff9c41b/bin/hs/000077500000000000000000000000001256455547000167355ustar00rootroot00000000000000kazu-yamamoto-Mew-ff9c41b/bin/hs/00readme000066400000000000000000000004161256455547000202560ustar00rootroot00000000000000 cmew and smew in Haskell * Installation - Install the Haskell Platform http://hackage.haskell.org/platform/ - Compile % cabal install "cmew" and "smew" will be installed to "~/.cabal/bin". Note that this may displays warnings. Please ignore them. kazu-yamamoto-Mew-ff9c41b/bin/hs/Index.hs000066400000000000000000000164061256455547000203470ustar00rootroot00000000000000module Index (makeIndex) where import Control.Applicative import Control.Monad import Data.IORef import Data.List import Data.Time import Data.Time.Clock.POSIX import Database.HDBC.Sqlite3 import Mail import Msg import Param import Sql import System.EasyFile import Text.Regex.Posix ---------------------------------------------------------------- data Control = Control { toFolder :: FilePath -> String , fromFolder :: String -> FilePath , ignoreRegex :: String , msgRegex :: String , dirModFile :: String , dbModTime :: Maybe Integer , refDel :: IORef Int , refReg :: IORef Int , getmsg :: Msg -> IO [Msg] , addmsg :: Msg -> IO () , delmsg :: Msg -> IO () , processDir :: String -> IO () , ignoreDir :: String -> IO () , skipDir :: String -> IO () } defaultCtl :: Control defaultCtl = Control { toFolder = undefined , fromFolder = undefined , ignoreRegex = defaultIgnoreRegex , msgRegex = defaultMessageRegex , dirModFile = defaultDirModFile , dbModTime = Nothing , refDel = undefined , refReg = undefined , getmsg = undefined , addmsg = toBeAdded , delmsg = toBeDeled , processDir = process , ignoreDir = ignore , skipDir = skip } ---------------------------------------------------------------- process :: String -> IO () process = putStrLn ignore :: String -> IO () ignore dir = putStrLn $ dir ++ " (ignored)" skip :: String -> IO () skip dir = putStrLn $ dir ++ " (skipped)" toBeDeled :: Msg -> IO () toBeDeled msg = putStrLn $ " " ++ path msg ++ " (to be deleted)" toBeAdded :: Msg -> IO () toBeAdded msg = putStrLn $ " " ++ path msg ++ " (to be added)" ---------------------------------------------------------------- makeIndex :: Bool -> Bool -> FilePath -> FilePath -> Regexp -> Maybe FilePath -> IO (Int, Int) makeIndex dryRun fullUpdate db dir re msubdir = withNewDB db (not fullUpdate) $ \conn -> do createDB conn stime <- utctimeToInteger <$> getCurrentTime ctl <- makeControl conn walkDirectory (getTargetDir msubdir) ctl indexDB conn unless dryRun $ setDBModtime conn stime results ctl where getTargetDir Nothing = dir getTargetDir (Just subdir) = dir subdir makeControl conn = do let ctl0 = defaultCtl ctl1 <- makeControl1 ctl0 dir re ctl2 <- makeControl2 ctl1 fullUpdate conn makeControl3 ctl2 dryRun conn results ctl = do registered <- readIORef (refReg ctl) deleted <- readIORef (refDel ctl) return (registered,deleted) withNewDB :: FilePath -> Bool -> (Connection -> IO a) -> IO a withNewDB db repl action = do when repl $ do exist <- doesFileExist db when exist $ copyFile db newdb ret <- withDB newdb action renameFile newdb db return ret where newdb = db ++ ".new" makeControl1 :: Control -> FilePath -> String -> IO Control makeControl1 ctl dir re = do let dlen = length dir + 1 refd <- newIORef 0 refr <- newIORef 0 return ctl { toFolder = drop dlen , fromFolder = (dir ) , ignoreRegex = re , refDel = refd , refReg = refr } -- Fullupdate makeControl2 :: Control -> Bool -> Connection -> IO Control makeControl2 ctl True _ = return ctl makeControl2 ctl False conn = do dbMod <- dbModtime conn return ctl { dbModTime = dbMod } -- Dryrun makeControl3 :: Control -> Bool -> Connection -> IO Control makeControl3 ctl True conn = do gstmt <- prepareGet conn return ctl { getmsg = getMsg gstmt } makeControl3 ctl False conn = do gstmt <- prepareGet conn astmt <- prepareAdd conn dstmt <- prepareDel conn return ctl { getmsg = getMsg gstmt , addmsg = addMsg astmt , delmsg = delMsg dstmt } ---------------------------------------------------------------- walkDirectory :: FilePath -> Control -> IO () walkDirectory dir ctl = do files <- filter (`notElem` [".", ".."]) <$> getDirectoryContents dir forM_ files $ \file -> do let file' = dir file isDir <- doesDirectoryExist file' if isDir then do isSym <- isSymlink file' if isSym then ignoreDir ctl (toFolder ctl file') else handleDirectory file' ctl else handleFile file' ctl handleDirectory :: FilePath -> Control -> IO () handleDirectory dir ctl | takeFileName dir =~ ignoreRegex ctl = ignoreDir ctl (toFolder ctl dir) | otherwise = do modified <- isModified if modified then do processDir ctl (toFolder ctl dir) walkDirectory dir ctl else do skipDir ctl (toFolder ctl dir) mn <- getLinkCount dir case mn of Nothing -> walkDirectory dir ctl Just n -> when (n > 2) $ walkDirectory dir ctl where isModified = case dbModTime ctl of Nothing -> return True Just dbmt -> do let mtimeFile = dir dirModFile ctl exist <- doesFileExist mtimeFile if exist then (dbmt <) <$> getModTime mtimeFile else return True handleFile :: FilePath -> Control -> IO () handleFile file ctl | not (takeFileName file =~ msgRegex ctl) = return () | otherwise = do modified <- isModified when modified $ do mmsg <- fileMsg file (toFolder ctl file) case mmsg of Nothing -> return () Just msg -> do register <- deleteMsgIfMoved msg when register (registerMsg msg) where isModified = case dbModTime ctl of Nothing -> doesFileExist file Just dbmt -> do exist <- doesFileExist file if exist then do tm <- getChangeTime file case tm of Just x -> return . (dbmt <) . utctimeToInteger $ x Nothing -> (dbmt <) . utctimeToInteger <$> getModificationTime file else return False deleteMsgIfMoved msg = case dbModTime ctl of Nothing -> return True Just _ -> do msgs <- getmsg ctl msg msgs' <- filterM doesExist msgs let msgsToDel = msgs \\ msgs' mapM_ (delmsg ctl) msgsToDel modifyIORef (refDel ctl) (+ length msgsToDel) let exist = any (\m -> path m == path msg) msgs' return (not exist) doesExist m = doesFileExist $ fromFolder ctl $ path m registerMsg msg = do addmsg ctl msg modifyIORef (refReg ctl) (+1) ---------------------------------------------------------------- getModTime :: FilePath -> IO Integer getModTime file = utctimeToInteger <$> getModificationTime file utctimeToInteger :: UTCTime -> Integer utctimeToInteger = truncate . toRational . utcTimeToPOSIXSeconds kazu-yamamoto-Mew-ff9c41b/bin/hs/Mail.hs000066400000000000000000000061251256455547000201570ustar00rootroot00000000000000{-# LANGUAGE CPP #-} module Mail (fileMsg) where import Control.Applicative import Data.Char import Data.Maybe import Data.Time import Msg import System.IO import System.Locale import Text.Parsec import Text.Parsec.String ---------------------------------------------------------------- type Key = String newtype Value = Value { foldedLines :: [String] } deriving Show type Header = [(Key,Value)] getValue :: Key -> [(Key,Value)] -> Maybe String getValue key fs = concat . foldedLines <$> lookup key fs ---------------------------------------------------------------- fileMsg :: FilePath -> String -> IO (Maybe Msg) fileMsg file folder = makeMsg folder . header <$> readFileU8 file where readFileU8 fl = do h <- openFile fl ReadMode #if __GLASGOW_HASKELL__ >= 611 hSetEncoding h latin1 #endif hGetContents h header :: String -> Header header = unfold . takeWhile (/= "") . lines unfold :: [String] -> Header unfold [] = [] unfold (l:ls) = unfold' $ break (== ':') l where unfold' (_,[]) = unfold ls' unfold' (k,_:v') = (key, Value (v:vs)) : unfold ls' where key = map toLower k v = dropWhile isSpace v' vs = takeWhile (isSpace . head) ls ls' = dropWhile (isSpace . head) ls makeMsg :: FilePath -> Header -> Maybe Msg makeMsg folder hdr = messageID hdr >>= \vmyid -> Just Msg { myid = vmyid , path = folder , paid = messagePaID hdr , date = messageDate hdr } ---------------------------------------------------------------- messageID :: Header -> Maybe ID messageID hdr = getValue "message-id" hdr >>= parseMaybe msgid {- (1) The In-Reply-To contains one ID, use it. (2) The References contains one or more IDs, use the last one. (3) The In-Reply-To contains two or more IDs, use the first one. -} messagePaID :: Header -> ID messagePaID hdr | ilen == 1 = head is | rlen /= 0 = last rs | ilen /= 0 = head is | otherwise = "" where ilen = length is rlen = length rs is = fromMaybe [] inReplyTo rs = fromMaybe [] references inReplyTo = getValue "in-reply-to" hdr >>= parseMaybe msgids references = getValue "references" hdr >>= parseMaybe msgids messageDate :: Header -> String messageDate hdr = maybe "19700101000000" toStr (getValue "date" hdr >>= parseDate) where toStr :: UTCTime -> String toStr = formatTime defaultTimeLocale "%Y%m%d%H%M%S" parseDate :: String -> Maybe UTCTime parseDate cs = parseTime defaultTimeLocale "%a, %e %b %Y %T %z" xs where (xs,_) = break (=='(') cs ---------------------------------------------------------------- parseMaybe :: Parser a -> String -> Maybe a parseMaybe p cs = either (const Nothing) Just (parse p "" cs) ---------------------------------------------------------------- msgid :: Parser String msgid = do _ <- char '<' left <- many1 (oneOf dotAtom) _ <- char '@' right <- many1 (oneOf dotAtom) _ <- char '>' spaces return $ "<" ++ left ++ "@" ++ right ++ ">" where dotAtom = ['a'..'z'] ++ ['A'..'Z'] ++ ['0'..'9'] ++ "!#$%&'*+-/=?^_`{|}~." msgids :: Parser [String] msgids = many1 msgid kazu-yamamoto-Mew-ff9c41b/bin/hs/Makefile000066400000000000000000000001311256455547000203700ustar00rootroot00000000000000all: cabal configure cabal build install: cabal install $(OPT) clean: rm -rf dist kazu-yamamoto-Mew-ff9c41b/bin/hs/Msg.hs000066400000000000000000000012671256455547000200250ustar00rootroot00000000000000module Msg where import Database.HDBC type ID = String data Msg = Msg { myid :: ID , path :: FilePath , paid :: ID , date :: String } deriving (Eq, Show) toMsg :: [SqlValue] -> Msg toMsg [a,b,c,d] = Msg { myid = fromSQL a , path = fromSQL b , paid = fromSQL c , date = fromSQL d } where fromSQL SqlNull = "" fromSQL x = fromSql x toMsg _ = error "toMsg" fromMsg :: Msg -> [SqlValue] fromMsg msg = [ toSql (myid msg) , toSql (path msg) , toSql (paid msg) , toSql (date msg) ] kazu-yamamoto-Mew-ff9c41b/bin/hs/Param.hs000066400000000000000000000006541256455547000203360ustar00rootroot00000000000000module Param where type Regexp = String defaultDB :: FilePath defaultDB = "~/Mail/id.db" defaultMailDir :: FilePath defaultMailDir = "~/Mail" defaultIgnoreRegex :: Regexp defaultIgnoreRegex = "^casket" -- including casket_replica defaultMessageRegex :: Regexp defaultMessageRegex = "^[0-9]+(\\.mew)?$" defaultDirModFile :: FilePath defaultDirModFile = ".mew-mtime" defaultTarget :: Maybe FilePath defaultTarget = Nothing kazu-yamamoto-Mew-ff9c41b/bin/hs/Search.hs000066400000000000000000000054221256455547000205010ustar00rootroot00000000000000module Search (Search, withDB, searchMe, searchChild, searchFamily) where import Control.Applicative import Data.List import Data.Map (Map) import qualified Data.Map as Map hiding (Map) import Data.Ord import Database.HDBC.Sqlite3 import Msg import Sql import System.EasyFile ---------------------------------------------------------------- type Search a = ID -> FilePath -> Connection -> IO a ---------------------------------------------------------------- searchMe :: Search [Msg] searchMe mid dir conn = chooseOne dir <$> getByID conn mid ---------------------------------------------------------------- searchChild :: Search [Msg] searchChild mid dir conn = chooseOne dir <$> getByPaID conn [mid] ---------------------------------------------------------------- searchFamily :: Search [Msg] searchFamily mid dir conn = sortBy (comparing date) <$> findFamily where findFamily = findRoot conn mid mid >>= findDescendants conn dir data ParentError = NoEntry | NoPid getPaid :: Connection -> ID -> IO (Either ParentError ID) getPaid conn mid = getPid <$> getByID conn mid where getPid [] = Left NoEntry getPid (e:_) | pid == "" = Left NoPid | otherwise = Right pid where pid = paid e findRoot :: Connection -> ID -> ID -> IO ID findRoot conn previd mid = getPaid conn mid >>= either terminate (findRoot conn mid) where terminate NoEntry = return previd terminate NoPid = return mid type Hash = Map ID Msg findDescendants :: Connection -> FilePath -> ID -> IO [Msg] findDescendants conn dir rtid = do root <- head . chooseOne dir <$> getByID conn rtid let mmap = Map.insert rtid root Map.empty findChildren ([rtid],mmap) where findChildren :: ([ID],Hash) -> IO [Msg] findChildren (ids,hash) = getByPaID conn ids >>= findChildren' where findChildren' [] = return (Map.elems hash) findChildren' msgs = findChildren $ pushChildren hash msgs [] pushChildren :: Hash -> [Msg] -> [ID] -> ([ID],Hash) pushChildren hash [] ids = (ids, hash) pushChildren hash (m:ms) ids | Map.notMember mid hash = pushChildren hash' ms (mid:ids) | mdir == dir = pushChildren hash' ms ids -- insert overwrites the value | otherwise = pushChildren hash ms ids where hash' = Map.insert mid m hash mdir = (takeDirectory.path) m mid = myid m ---------------------------------------------------------------- -- to express failure, the empty list is used chooseOne :: FilePath -> [Msg] -> [Msg] chooseOne _ [] = [] -- failure chooseOne "" (m:_) = [m] chooseOne dir msgs@(m:_) | null sames = [m] | otherwise = [head sames] where sames = filter sameDir msgs sameDir x = (takeDirectory.path) x == dir kazu-yamamoto-Mew-ff9c41b/bin/hs/Setup.hs000066400000000000000000000000561256455547000203720ustar00rootroot00000000000000import Distribution.Simple main = defaultMain kazu-yamamoto-Mew-ff9c41b/bin/hs/Sql.hs000066400000000000000000000063001256455547000200270ustar00rootroot00000000000000module Sql where import Control.Applicative import Data.List import Database.HDBC import Database.HDBC.Sqlite3 import Msg ---------------------------------------------------------------- withDB :: FilePath -> (Connection -> IO a) -> IO a withDB db cmd = handleSqlError $ do conn <- connectSqlite3 db res <- withTransaction conn cmd disconnect conn return res ---------------------------------------------------------------- createDB :: Connection -> IO () createDB conn = () <$ run conn format [] where format = "CREATE TABLE IF NOT EXISTS mew (id TEXT, path TEXT, parid TEXT, date TEXT);" indexDB :: Connection -> IO () indexDB conn = do _ <- run conn "CREATE INDEX IF NOT EXISTS mew_id ON mew (id);" [] _ <- run conn "REINDEX mew_id;" [] _ <- run conn "CREATE INDEX IF NOT EXISTS mew_parid ON mew (parid);" [] _ <- run conn "REINDEX mew_parid;" [] return () ---------------------------------------------------------------- getByID :: Connection -> ID -> IO [Msg] getByID conn mid = map toMsg <$> quickQuery' conn format params where format = "SELECT * FROM mew WHERE (id = ?);" params = [toSql mid] getByPaID :: Connection -> [ID] -> IO [Msg] getByPaID conn ids = map toMsg <$> quickQuery' conn format params where fmt = replicate (length ids) "parid = ?" fmt' = intersperse " OR " fmt fmt'' = concat fmt' format = "SELECT * FROM mew WHERE (" ++ fmt'' ++ ");" params = map toSql ids delByID :: Connection -> ID -> IO () delByID conn mid = () <$ run conn format params where format = "DELETE FROM mew WHERE (id = ?);" params = [toSql mid] addByID :: Connection -> ID -> String -> IO () addByID conn mid dat = () <$ run conn format params where format = "INSERT INTO mew VALUES (?, ?, ?, ?);" params = [toSql mid, toSql "", toSql "", toSql dat] ---------------------------------------------------------------- idForModtime :: String idForModtime = "" dbModtime :: Connection -> IO (Maybe Integer) dbModtime conn = do msgs <- getByID conn idForModtime if null msgs then return Nothing else return $ toI msgs where toI = Just . read . date . head setDBModtime :: Connection -> Integer -> IO () setDBModtime conn mt = do let mts = show mt mint <- dbModtime conn case mint of Nothing -> return () Just _ -> delByID conn idForModtime addByID conn idForModtime mts ---------------------------------------------------------------- prepareGet :: Connection -> IO Statement prepareGet conn = prepare conn "SELECT * FROM mew WHERE (id = ?);" prepareDel :: Connection -> IO Statement prepareDel conn = prepare conn "DELETE FROM mew WHERE (id = ?) AND (path = ?);" prepareAdd :: Connection -> IO Statement prepareAdd conn = prepare conn "INSERT INTO mew VALUES (?, ?, ?, ?);" getMsg :: Statement -> Msg -> IO [Msg] getMsg stmt msg = map toMsg <$> (execute stmt params *> fetchAllRows' stmt) where params = [toSql (myid msg)] delMsg :: Statement -> Msg -> IO () delMsg stmt msg = () <$ execute stmt params where params = [toSql (myid msg), toSql (path msg)] addMsg :: Statement -> Msg -> IO () addMsg stmt msg = () <$ execute stmt params where params = fromMsg msg kazu-yamamoto-Mew-ff9c41b/bin/hs/Util.hs000066400000000000000000000021071256455547000202060ustar00rootroot00000000000000{-# LANGUAGE ScopedTypeVariables #-} module Util where import Control.Applicative import Control.Exception as E import Data.List import Param import System.EasyFile import System.Environment import System.IO -- symbolic link to real link normalizePath :: FilePath -> IO FilePath normalizePath path = dropTrailingPathSeparator <$> (expandHome path >>= realPath) where realPath sym = canonicalizePath sym `E.catch` \(_::SomeException) -> return sym expandHome "" = expandHome defaultMailDir expandHome ('~':cs) = do mhome <- getHomeDirectory2 case mhome of Just home -> return $ home ++ cs Nothing -> (++ cs) <$> getHomeDirectory expandHome dir | isRelative dir = expandHome (defaultMailDir dir) | otherwise = return dir help :: String -> IO () help message = getProgName >>= hPutStrLn stderr . (\prog -> "Usage: " ++ prog ++ " " ++ message) splitArgOpt :: [String] -> ([String],[String]) splitArgOpt as = (filter isArg as, filter isOpt as) where isArg = not . isOpt isOpt = ("-" `isPrefixOf`) kazu-yamamoto-Mew-ff9c41b/bin/hs/cmew.hs000066400000000000000000000032611256455547000202260ustar00rootroot00000000000000---------------------------------------------------------------- -- -- cmew.hs -- module Main where import Control.Applicative import Data.List import Index import Param import System.Environment import Util ---------------------------------------------------------------- helpMessage :: String helpMessage = "[-n] [-f] [db [dir [dignore_regex [target_folder]]]]" options :: [String] options = ["-n","-f"] parseOpts :: [String] -> Maybe (Bool,Bool) parseOpts opts | unknown = Nothing | otherwise = Just (dryRun, fullUpdate) where unknown = (opts `union` options) \\ options /= [] dryRun = "-n" `elem` opts fullUpdate = "-f" `elem` opts parseArgs :: [String] -> Maybe (FilePath,FilePath,Regexp,Maybe FilePath) parseArgs [] = Just (defaultDB,defaultMailDir,defaultIgnoreRegex,defaultTarget) parseArgs [db] = Just (db,defaultMailDir,defaultIgnoreRegex,defaultTarget) parseArgs [db,dir] = Just (db,dir,defaultIgnoreRegex,defaultTarget) parseArgs [db,dir,re] = Just (db,dir,re,defaultTarget) parseArgs [db,dir,re,subdir] = Just (db,dir,re,Just subdir) parseArgs _ = Nothing ---------------------------------------------------------------- main :: IO () main = do (args,opts) <- splitArgOpt <$> getArgs let mtri = parseArgs args mopt = parseOpts opts exec mopt mtri where exec (Just (dryRun,fullUpdate)) (Just (db,dir,re,target)) = do db' <- normalizePath db dir' <- normalizePath dir makeIndex dryRun fullUpdate db' dir' re target >>= printResults exec _ _ = help helpMessage printResults (reg,del) = putStrLn $ "Registered: " ++ show reg ++ ", deleted: " ++ show del kazu-yamamoto-Mew-ff9c41b/bin/hs/mew.cabal000066400000000000000000000030251256455547000205110ustar00rootroot00000000000000Name: mew Version: 0.1 Author: Kazu Yamamoto Maintainer: Kazu Yamamoto License: BSD3 Homepage: http://www.mew.org/ Synopsis: Sub-commands for Mew Description: "smew" and "cmew" Category: Mail Cabal-Version: >= 1.6 Build-Type: Simple Executable smew Main-Is: smew.hs GHC-Options: -Wall Build-Depends: base >= 4 && < 5 , HDBC , HDBC-sqlite3 , containers , easy-file , parsec Other-Modules: Msg Param Search Sql Util Executable cmew Main-Is: cmew.hs GHC-Options: -Wall Build-Depends: base >= 4 && < 5 , HDBC , HDBC-sqlite3 , bytestring , containers , easy-file , old-locale , old-time , parsec , regex-posix , time if os(windows) Build-Depends: Win32 else Build-Depends: unix Other-Modules: Index Mail Msg Param Sql Util kazu-yamamoto-Mew-ff9c41b/bin/hs/smew.hs000066400000000000000000000031261256455547000202460ustar00rootroot00000000000000---------------------------------------------------------------- -- -- smew.hs -- module Main where import Control.Applicative import Data.List import Msg import Param import Search import System.Environment import Util -- ./smew '<20100105.154842.110627375.kazu@iij.ad.jp>' ~/Mail/id.db #imap/kazu@localhost#imap/work.mew-dist ---------------------------------------------------------------- helpMessage :: String helpMessage = "[-p|-c] id [db [dir]]" options :: [String] options = ["-p","-c"] ---------------------------------------------------------------- parseOpts :: [String] -> Maybe (Search [Msg]) parseOpts opts | opts == [] = Just searchFamily | unknown = Nothing | "-p" `elem` opts = Just searchMe -- to find a parent, specify pid | "-c" `elem` opts = Just searchChild | otherwise = Nothing where unknown = (opts `union` options) \\ options /= [] parseArgs :: [String] -> Maybe (ID,FilePath,FilePath) parseArgs [] = Nothing parseArgs [mid] = Just (mid, defaultDB, "") parseArgs [mid,db] = Just (mid, db, "") parseArgs [mid,db,dir] = Just (mid, db, dir) parseArgs _ = Nothing ---------------------------------------------------------------- main :: IO () main = do (args,opts) <- splitArgOpt <$> getArgs let mtri = parseArgs args mcmd = parseOpts opts exec mcmd mtri where exec (Just cmd) (Just (mid,db,dir)) = do db' <- normalizePath db dir' <- normalizePath dir withDB db' (cmd mid dir') >>= printResults exec _ _ = help helpMessage printResults = mapM_ (putStrLn . path) kazu-yamamoto-Mew-ff9c41b/bin/incm.1000066400000000000000000000074501256455547000173410ustar00rootroot00000000000000.\" Copyright (C) 2001-2003 Mew developing team. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. Neither the name of the team nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR .\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE .\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR .\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF .\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR .\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, .\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE .\" OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .TH INCM 1 "December 25, 2001" .SH NAME incm - Incorporating new mails for Mew .\" .SH SYNOPSIS incm .RI [ options ] .\" .SH DESCRIPTION The .B incm utility incorporates new mails from the mbox or the maildir to Mew's inbox folder. .PP The options are as follows: .TP 8 .B \-a Retrieve all mails from maildir/{cur,new} for maildir. .TP 8 .B \-b Backup mails. mbox: No truncate mbox file. maildir: To maildir/cur directory. .TP 8 .BI \-c Use the Content-Length: field, instead of the "From " line, as a mail separator for mbox. .TP 8 .BI \-d " path" Path to mbox/maildir. If .IR path is a file, mbox is assumed. If .IR path is a directory, maildir is assumed. .TP 8 .BI \-m " path" The same as the .B \-d option. .TP 8 .BI \-s Read one mail from stdin instead of mbox/maildir. .TP 8 .BI \-i " inboxdir" A path to the inbox directory. .TP 8 .B \-u Don't touch ".mew-mtime". .TP 8 .B \-f Preserve Unix From (Envelope Sender) line in mbox case. .TP 8 .BI \-p " mode" Specify file mode that creates in mbox case. .TP 8 .B \-o Use the suffix when creating messages. .TP 8 .BI \-x " suffix" Use this .IR suffix . .TP 8 .B \-h Display this help message. .TP 8 .B \-v Display the version. .PP .SS mbox For mbox, the mail separator is "From " in the beginning of lines. The .B incm utility does not convert ">From " to "From " in the beginning of lines in the body. On Solaris, Content-Length: should be used with the .BI \-c option to tell the end of mail. .PP To lock mbox, a lock file(".lock"), flock() or lockf(), and open(O_EXLOCK) are used. .PP .SS maildir For maildir, no lock and no separator are necessary. .PP Consider the following situation: .nf cur/{1,2} new/{3,4} .fi .PP Executing .B incm without the options results in: .nf cur/{1,2} new/{} to inbox: {3,4} .fi .PP Executing .B incm with the .B \-a option results in: .nf cur/{} new/{} to inbox: {1,2,3,4} .fi .PP Executing .B incm with the .B \-b option results in: .nf cur/{1,2,3,4} new/{} to inbox: {3,4} .fi .PP Executing .B incm with the .B \-a option and the .B \-b option results in: .nf cur/{1,2,3,4} new/{} to inbox: {1,2,3,4} .fi So, if both options are specified, messages are retrieved multiple times. .\" kazu-yamamoto-Mew-ff9c41b/bin/incm.c000066400000000000000000000533551256455547000174300ustar00rootroot00000000000000/* * incm - incorporating new mails * * Author: Yasunari Momoi * Created: 2000/10/19 */ #include "mew.h" private char version_message[] = "version 6.6 20140416 Yasunari Momoi"; #include #include #include #include #include #include #include #include #include #include #if TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #if HAVE_DIRENT_H # include #endif #if HAVE_FCNTL_H # include #endif #if HAVE_SYS_FILE_H # include #endif #if HAVE_UNISTD_H # include #endif enum MBOXTYPE { T_UNKNOWN, T_MAILDIR, T_MBOX, T_STDIN, }; enum MBOXSTATE { ST_UNKNOWN, ST_HEADER, ST_BODY_AFTER_EMPTY_LINE, ST_BODY, }; #define FBUFSIZ (BUFSIZ * 32) #ifndef PATH_MAX # define PATH_MAX 1024 #endif private char FileBuf[FBUFSIZ]; private char Mbox[PATH_MAX]; private char MboxLock[PATH_MAX]; private char *InboxDir = NULL; private char *Suffix = NULL; private int Use_Suffix = FALSE; private int Suffix_len; private int MboxType; private int Backup; private int GetCur; private int UseCL; private int PreserveUnixFrom; private int CreateMTime = TRUE; private int FileMode = S_IRUSR | S_IWUSR; private int Exit = 0; /**************************************************************** * * prototype * */ private void error(const char *, ...); private void usage(const char *); private void help(const char *); private void version(const char *); private void init_env(int, char **); private int get_number(char *); private int get_last_seq(void); private int compare_string(char **, char **); private int copyfile(char *, char *); private void movefile(char *, char *, char *, int); private int maildir_names(const char *, char **, char **, char **); private int new_inbox_file(int, char[]); private FILE *open_new_inbox_file(int *, char[]); private int get_from_dir(int, char *, char *, int); private int process_maildir(int); private int lock_mbox(char *); private void unlock_mbox(char *); private int process_mbox(int); private int process_stdin(int); private void process(void); private int check_mbox_type(const char *); private void sanity_check(void); #if !HAVE_FLOCK # if HAVE_LOCKF # define flock(a, b) lockf(a, b, 0) # define LOCK_EX F_LOCK # endif #endif #ifndef S_ISDIR # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif #ifndef S_ISREG # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #endif private char * Getlogin(void) { #ifdef HAVE_GETLOGIN { char *user; if ((user = getlogin()) != NULL) return user; } #endif #ifdef HAVE_GETPWUID { struct passwd *pw; if ((pw = getpwuid(getuid())) == NULL) return NULL; else return pw->pw_name; } #endif return NULL; } private char * Gethomedir(void) { char *home; if ((home = getenv("HOME")) != NULL) return home; #ifdef HAVE_GETPWUID { struct passwd *pw; if ((pw = getpwuid(getuid())) != NULL) return pw->pw_dir; } #endif return NULL; } private void error(const char *fmt, ...) { va_list ap; if (warn_prog != NULL) fprintf(stderr, "%s: ", warn_prog); va_start(ap, fmt); if (fmt != NULL) vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); if (strlen(MboxLock) > 0) unlock_mbox(MboxLock); exit(EXIT_FAILURE); } /**************************************************************** * * options and usages * */ #define LOCK_SUFFIX ".lock" #define MAILDIR "Maildir" #define MAILDIR_NEW "new" #define MAILDIR_CUR "cur" #define MAILDIR_TMP "tmp" private void usage(const char *progname) { fprintf(stderr, "Usage: %s [-abchosv] [-d maildir] [-i inboxdir] [-x suffix]\n", progname); } private const char * help_message[] = { " -h Display this help message.", " -v Display the version.", " -d Path to mbox/maildir.", " -m Path to mbox/maildir.", " -s Read one mail from stdin instead of mbox/maildir.", " -i Path to inboxdir.", " -b Backup mail.", " mbox: No truncate mbox file.", " maildir: To maildir/cur directory.", " -a Retrieve all mail from maildir/{cur,new} directory.", " (no backup) (for maildir)", " -c Use Content-Length: field. (for mbox)", " -u Don't create inboxdir/.mew-mtime file.", " -f Preserve Unix From (Envelope Sender). (for mbox)", " -p Specify file permission. (for mbox)", " -o Use the suffix when creating messages.", " -x Use this suffix.", NULL }; private void help(const char *progname) { const char **p = help_message; fprintf(stderr, "Help: %s\n\n", progname); fprintf(stderr, " Incorporating new mails.\n\n"); usage(progname); while (*p) fprintf(stderr, "%s\n", *p++); } private void version(const char *progname) { fprintf(stderr, "%s %s\n", progname, version_message); } private int check_mbox_type(const char *path) { struct stat sb; if (stat(path, &sb)) return T_UNKNOWN; if (S_ISDIR(sb.st_mode)) { char* newdir; char* curdir; if (maildir_names(path, &newdir, &curdir, NULL)) error("maildir name is not set (%s)", path); if (stat(newdir, &sb)) return T_UNKNOWN; if (!S_ISDIR(sb.st_mode) || access(newdir, R_OK|W_OK|X_OK)) return T_UNKNOWN; if (Backup) { if (stat(curdir, &sb)) return T_UNKNOWN; if (!S_ISDIR(sb.st_mode) || access(curdir, W_OK)) return T_UNKNOWN; } return T_MAILDIR; } else if (S_ISREG(sb.st_mode)) return T_MBOX; else return T_UNKNOWN; } private const char * mbox_path_list[] = { "/var/mail/", "/var/spool/mail/", "/usr/spool/mail/", NULL }; private void search_mbox_path(void) { char *home, *mail, *user; if ((home = Gethomedir()) != NULL) { if (strlen(home) + 9 > PATH_MAX) error("pathname too long (%s)", home); snprintf(Mbox, sizeof(Mbox), "%s/%s", home, MAILDIR); if (check_mbox_type(Mbox) != T_UNKNOWN) return; } if ((mail = getenv("MAIL")) != NULL) { if (strlen(mail) + 1 > PATH_MAX) error("pathname too long (%s)", mail); STRCPY(Mbox, mail); if (check_mbox_type(Mbox) != T_UNKNOWN) return; } if ((user = Getlogin()) != NULL) { int i; for (i = 0; mbox_path_list[i] != NULL; i++) { if (strlen(mbox_path_list[i]) + strlen(user) + 1 > PATH_MAX) error("pathname too long (%s)", user); snprintf(Mbox, sizeof(Mbox), "%s%s", mbox_path_list[i], user); if (check_mbox_type(Mbox) != T_UNKNOWN) return; } } snprintf(Mbox, sizeof(Mbox), "."); return; } void sig_exit(int signo) { Exit = 1; } void sig_ignore(int signo) { /* ignore signal */ } private void set_sighandler(void) { if (signal(SIGHUP, sig_ignore) == SIG_ERR) error("can't catch SIGHUP\n"); if (signal(SIGINT, sig_exit) == SIG_ERR) error("can't catch SIGINT\n"); if (signal(SIGALRM, sig_ignore) == SIG_ERR) error("can't catch SIGALRM\n"); if (signal(SIGTERM, sig_ignore) == SIG_ERR) error("can't catch SIGTERM\n"); } private void init_env(int argc, char **argv) { set_sighandler(); STRDUP(InboxDir, "."); MboxType = T_UNKNOWN; Backup = FALSE; UseCL = FALSE; search_mbox_path(); STRDUP(Suffix, SUFFIX); Suffix_len = strlen(Suffix); } private int get_number(char *s) { int num = 0; unsigned char c; while ((c = *s) != NUL && isdigit(c)) { num = num * 10 + c - '0'; s++; } if (num == 0) return 0; else if (*s == NUL) return num; else if (strncmp(s, Suffix, Suffix_len) == 0 && s[Suffix_len] == NUL) return num; else return 0; } private int get_last_seq(void) { struct dirent *dp; DIR *dirp; int last = 0; int seq; if ((dirp = opendir(InboxDir)) == NULL) error("opendir(%s)", InboxDir); while ((dp = readdir(dirp)) != NULL) { if ((seq = get_number(dp->d_name)) == 0) continue; last = last > seq ? last : seq; } closedir(dirp); return last; } private int compare_string(char **i, char **j) { return strcmp(*i, *j); } private int copyfile(char *src, char *dst) { struct timeval tv[2]; struct stat sb; int srcfd, dstfd; ssize_t rlen, wlen; if ((srcfd = open(src, O_RDONLY, 0)) < 0) error("open(%s) for read", src); if (fstat(srcfd, &sb)) error("fstat(%s)", src); if ((dstfd = open(dst, O_EXCL | O_CREAT | O_WRONLY | O_TRUNC, 0)) < 0) error("open(%s) for write", dst); while ((rlen = read(srcfd, FileBuf, FBUFSIZ)) > 0) { if ((wlen = write(dstfd, FileBuf, rlen)) != rlen) { if (close(dstfd)) goto werr; unlink(dst); error("write(%s) (read %d bytes/write %d bytes)", dst, rlen, wlen); } } if (rlen < 0) { if (close(dstfd)) goto werr; unlink(dst); error("read(%s)", src); } close(srcfd); tv[0].tv_sec = sb.st_atime; tv[0].tv_usec = 0; tv[1].tv_sec = sb.st_mtime; tv[1].tv_usec = 0; #if HAVE_FUTIMES if (futimes(dstfd, tv)) warning("futimes(%s) failed", dst); #endif #if HAVE_FCHMOD if (fchmod(dstfd, sb.st_mode)) warning("fchmod(%s) failed", dst); #endif close(dstfd); #if !HAVE_FUTIMES if (utimes(dst, tv)) warning("utimes(%s) failed", dst); #endif #if !HAVE_FCHMOD if (chmod(dst, sb.st_mode)) warning("chmod(%s) failed", dst); #endif return 0; werr: close(srcfd); return -1; } private void movefile(char *fromfile, char *tofile, char *backupfile, int backup) { if (backup && backupfile != NULL) { if (copyfile(fromfile, tofile)) error("copyfile(%s, %s)", fromfile, tofile); if (rename(fromfile, backupfile)) error("rename(%s, %s)", fromfile, backupfile); } else if (backup) { if (copyfile(fromfile, tofile)) error("copyfile(%s, %s)", fromfile, tofile); } else { if (rename(fromfile, tofile)) { if (errno != EXDEV) error("rename(%s, %s)", fromfile, tofile); if (copyfile(fromfile, tofile)) error("copyfile(%s, %s)", fromfile, tofile); if (unlink(fromfile)) error("unlink(%s)", fromfile); } } } /* maildir has {new,cur,tmp} subdirectory. */ private int maildir_names(const char *maildir, char **newdir, char **curdir, char **tmpdir) { int len = strlen(maildir) + strlen(MAILDIR_NEW) + 2; if (maildir == NULL || strlen(maildir) <= 0) return -1; if (newdir != NULL) { MALLOC(*newdir, len); snprintf(*newdir, len, "%s/%s", maildir, MAILDIR_NEW); } if (curdir != NULL) { MALLOC(*curdir, len); snprintf(*curdir, len, "%s/%s", maildir, MAILDIR_CUR); } if (tmpdir != NULL) { MALLOC(*tmpdir, len); snprintf(*tmpdir, len, "%s/%s", maildir, MAILDIR_TMP); } return 0; } /* *WARNING* inboxfile requires PATH_MAX bytes */ private int new_inbox_file(int seq, char inboxfile[]) { char num[PATH_MAX]; char *suffix = (Use_Suffix == YES) ? Suffix : ""; do { snprintf(num, sizeof(num), "%d%s", ++seq, suffix); if (strlen(InboxDir) + strlen(num) + 2 > PATH_MAX) error("pathname too long (%s/%s)", InboxDir, num); snprintf(inboxfile, PATH_MAX, "%s/%s", InboxDir, num); if (access(inboxfile, F_OK) && errno == ENOENT) break; } while (TRUE); return seq; } /* *WARNING* inboxfile requires PATH_MAX bytes */ private FILE * open_new_inbox_file(int *seq, char inboxfile[]) { char num[PATH_MAX]; int flag = O_EXCL | O_CREAT | O_WRONLY; int fd; FILE *fp = NULL; char *suffix = (Use_Suffix == YES) ? Suffix : ""; for (;;) { snprintf(num, sizeof(num), "%d%s", ++*seq, suffix); if (strlen(InboxDir) + strlen(num) + 2 > PATH_MAX) error("pathname too long (%s/%s)", InboxDir, num); snprintf(inboxfile, PATH_MAX, "%s/%s", InboxDir, num); if ((fd = open(inboxfile, flag, FileMode)) >= 0 || errno != EEXIST) break; usleep(rand() % 199); } if (fd < 0) warning("open(%s) for write", inboxfile); else { if ((fp = fdopen(fd, FDWRITE)) == NULL) warning("open(%s) for write", inboxfile); } return fp; } private int get_from_dir(int seq, char *fromdir, char *backupdir, int backup) { struct stat sb; struct dirent *dp; DIR *dirp; char mailfile[PATH_MAX]; char inboxfile[PATH_MAX]; char backupfile[PATH_MAX]; char **list; int listsize = BUFSIZ; int listend = 0; int i; MALLOC(list, sizeof(char *)*listsize); if ((dirp = opendir(fromdir)) == NULL) error("opendir(%s)", fromdir); while ((dp = readdir(dirp)) != NULL) { if (strlen(fromdir) + strlen(dp->d_name) + 2 > PATH_MAX) error("pathname too long (%s/%s)", fromdir, dp->d_name); snprintf(mailfile, sizeof(mailfile), "%s/%s", fromdir, dp->d_name); if (stat(mailfile, &sb)) continue; if (!(S_ISREG(sb.st_mode) && (sb.st_mode & S_IRUSR))) continue; if (listend >= listsize) { listsize *= 2; if ((list = (char **) realloc(list, sizeof(char *)*listsize)) == NULL) error("realloc"); } STRDUP(list[listend++], dp->d_name); } closedir(dirp); qsort(list, listend, sizeof(char *), (int (*)(const void *, const void *))compare_string); for (i = 0; i < listend; i++) { seq = new_inbox_file(seq, inboxfile); if (strlen(fromdir) + strlen(list[i]) + 2 > PATH_MAX) error("pathname too long (%s/%s)", fromdir, list[i]); snprintf(mailfile, sizeof(mailfile), "%s/%s", fromdir, list[i]); if (backup && backupdir != NULL) { if (strlen(backupdir) + strlen(list[i]) + 6 > PATH_MAX) error("pathname too long (%s/%s)", backupdir, list[i]); snprintf(backupfile, sizeof(backupfile), "%s/%s:2,S", backupdir, list[i]); movefile(mailfile, inboxfile, backupfile, backup); } else movefile(mailfile, inboxfile, NULL, backup); printf("%d\n", seq); } return seq; } private int process_maildir(int seq) { char *newdir, *curdir; if (maildir_names(Mbox, &newdir, &curdir, NULL)) error("maildir name is not set (%s)", Mbox); if (GetCur) seq = get_from_dir(seq, curdir, NULL, Backup); return get_from_dir(seq, newdir, curdir, Backup); } private int lock_mbox(char *lockfile) { int fd; int retry = 5; while (TRUE) { if ((fd = open(lockfile, O_WRONLY | O_CREAT | O_EXCL, 0666)) < 0) { if (errno == EACCES || errno == EROFS) return 1; /* doesn't need a lockfile, maybe. */ else if (errno != EEXIST) error("open(%s)", lockfile); if (retry-- <= 0) error("can't get lock(%s)", lockfile); } else { /* lock succeeded. */ write(fd, "0", 1); close(fd); return 0; } sleep(2); } } private void unlock_mbox(char *lockfile) { if (strlen(lockfile) > 0) unlink(lockfile); } private int process_mbox(int seq) { char inboxfile[PATH_MAX]; char emptyline[3]; char *ln; int srcfd, oflag; FILE *srcfp = NULL; FILE *dstfp = NULL; int state = ST_UNKNOWN; int bytes = -1; /* UseCL (Content-Length:) */ if (strlen(Mbox) + strlen(LOCK_SUFFIX) + 1 > PATH_MAX) error("pathname too long (%s%s)", Mbox, LOCK_SUFFIX); snprintf(MboxLock, sizeof(MboxLock), "%s%s", Mbox, LOCK_SUFFIX); if (lock_mbox(MboxLock)) MboxLock[0] = '\0'; /* doesn't need a lockfile, maybe. */ oflag = O_RDWR; #if defined(O_EXLOCK) oflag |= O_EXLOCK; #endif if ((srcfd = open(Mbox, oflag, 0)) < 0) { warning("open(%s) for rw/truncate", Mbox); goto rerr; } #if !defined(O_EXLOCK) && (HAVE_FLOCK || HAVE_LOCKF) if (flock(srcfd, LOCK_EX) < 0) { warning("flock(%s)", Mbox); goto rerr; } #endif if ((srcfp = fdopen(srcfd, FDREAD)) == NULL) { warning("fdopen(%s) for read", Mbox); goto rerr; } while ((ln = Getline(srcfp)) != NULL) { if (Exit) goto werr; switch (state) { case ST_UNKNOWN: if (strncmp(ln, "From ", 5) == 0) { dstfp = open_new_inbox_file(&seq, inboxfile); if (dstfp == NULL) goto rerr; if (PreserveUnixFrom && fputs(ln, dstfp) == EOF) { warning("fputs(%s)", inboxfile); goto werr; } state = ST_HEADER; } break; case ST_HEADER: if (strlen(ln) < 3 && (ln[0] == '\n' || ln[0] == '\r')) { STRCPY(emptyline, ln); state = ST_BODY_AFTER_EMPTY_LINE; break; } if (fputs(ln, dstfp) == EOF) { warning("fputs(%s)", inboxfile); goto werr; } if (UseCL && strncasecmp(ln, "Content-Length", 14) == 0) { int i; for (i = 14; i < strlen(ln); i++) if (isdigit((unsigned char)ln[i])) break; bytes = atoi(&ln[i]); } break; case ST_BODY_AFTER_EMPTY_LINE: if (bytes < 0 && strncmp(ln, "From ", 5) == 0) { if (fclose(dstfp)) goto rerr; printf("%d\n", seq); dstfp = open_new_inbox_file(&seq, inboxfile); if (dstfp == NULL) goto rerr; if (PreserveUnixFrom && fputs(ln, dstfp) == EOF) { warning("fputs(%s)", inboxfile); goto werr; } state = ST_HEADER; break; } else if (fputs(emptyline, dstfp) == EOF) goto werr; /* FALLTHRU */ case ST_BODY: if (strlen(ln) < 3 && (ln[0] == '\n' || ln[0] == '\r')) { STRCPY(emptyline, ln); state = ST_BODY_AFTER_EMPTY_LINE; } else state = ST_BODY; if (state == ST_BODY && fputs(ln, dstfp) == EOF) goto werr; if (bytes >= 0) { bytes -= strlen(ln); if (bytes <= 0) { if (fclose(dstfp)) goto rerr; dstfp = NULL; printf("%d\n", seq); state = ST_UNKNOWN; bytes = -1; break; } } break; } free(ln); } if (dstfp) { if (fclose(dstfp)) goto rerr; printf("%d\n", seq); } if (!Backup && ftruncate(srcfd, 0)) { unlock_mbox(MboxLock); error("ftruncate"); } fclose(srcfp); unlock_mbox(MboxLock); return seq; werr: if (dstfp) fclose(dstfp); unlink(inboxfile); rerr: if (srcfp) fclose(srcfp); unlock_mbox(MboxLock); error("process_mbox(%s)", Mbox); return -1; /* error. not reached */ } private int process_stdin(int seq) { char inboxfile[PATH_MAX]; char *ln; FILE *srcfp = stdin; FILE *dstfp; if ((dstfp = open_new_inbox_file(&seq, inboxfile)) == NULL) goto rerr; while ((ln = Getline(srcfp)) != NULL) { if (Exit) goto werr; if (fputs(ln, dstfp) == EOF) { warning("fputs(%s)", inboxfile); goto werr; } free(ln); } if (dstfp) { fclose(dstfp); printf("%d\n", seq); } return seq; werr: if (dstfp) fclose(dstfp); unlink(inboxfile); rerr: error("process_stdin"); return -1; /* error. not reached */ } private void process(void) { char mtimefile[PATH_MAX]; FILE *fp; size_t wb; int len = strlen(MEW_MTIME_PHRASE); int seq = get_last_seq(); int newseq = 0; switch (MboxType) { case T_MAILDIR: newseq = process_maildir(seq); break; case T_MBOX: newseq = process_mbox(seq); break; case T_STDIN: newseq = process_stdin(seq); break; default: error("unknown mbox type (%s)", Mbox); } /* update .mew-mtime file if new mail arrived */ if (!CreateMTime || newseq <= seq) return; /* no new mail */ if (strlen(InboxDir) + strlen(MEW_MTIME_FILE) + 1 > PATH_MAX) error("pathname too long (%s%s)", InboxDir, MEW_MTIME_FILE); snprintf(mtimefile, sizeof(mtimefile), "%s/%s", InboxDir, MEW_MTIME_FILE); if ((fp = fopen(mtimefile, FDWRITE)) == NULL) error("can't create file (%s)", mtimefile); if ((wb = fwrite(MEW_MTIME_PHRASE, sizeof(char), len, fp)) != len) { fclose(fp); error("fwrite failed (%d, %s)", wb, mtimefile); } fclose(fp); } private void sanity_check(void) { struct stat sb; /* was directory exists? */ if (stat(InboxDir, &sb)) error("stat(%s)", InboxDir); if (!S_ISDIR(sb.st_mode) || access(InboxDir, W_OK)) error("can't write directory (%s)", InboxDir); /* mbox type checking */ if (MboxType == T_UNKNOWN && (MboxType = check_mbox_type(Mbox)) == T_UNKNOWN) error("can't find mbox (%s)", Mbox); } int main(int argc, char **argv) { extern char *Optarg; extern int Optind; char *progname = getprognm(argv[0]); int ch; warn_prog = progname; init_env(argc, argv); while ((ch = Getopt(argc, argv, "abcd:fhi:m:op:suvx:")) != EOF) { switch (ch) { case 'a': GetCur = TRUE; break; case 'b': Backup = TRUE; break; case 'c': UseCL = TRUE; break; case 'd': case 'm': if (strlen(Optarg) + 1 > PATH_MAX) error("pathname too long (%s)", Optarg); snprintf(Mbox, sizeof(Mbox), "%s", Optarg); break; case 'f': PreserveUnixFrom = TRUE; break; case 'i': STRDUP(InboxDir, Optarg); break; case 'o': Use_Suffix = TRUE; break; case 'x': STRDUP(Suffix, Optarg); Suffix_len = strlen(Suffix); break; case 'p': sscanf(Optarg, "%i", &FileMode); break; case 's': MboxType = T_STDIN; break; case 'u': CreateMTime = FALSE; break; case 'v': version(progname); exit(EXIT_SUCCESS); case 'h': help(progname); exit(EXIT_SUCCESS); default: usage(progname); exit(EXIT_SUCCESS); } } argc -= Optind; argv += Optind; sanity_check(); process(); return EXIT_SUCCESS; } /* * Copyright (C) 2001-2005 Mew developing team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * incm.c ends here */ kazu-yamamoto-Mew-ff9c41b/bin/mew-pinentry.1000066400000000000000000000007021256455547000210420ustar00rootroot00000000000000.\" Unlimited permission is granted to use, copy, distribute and/or modify .\" this file. There is NO WARRANTY. .TH MEW-PINENTRY 1 "October 18, 2006" .SH NAME mew-pinentry - simple pinentry for gpg-agent .\" .SH SYNOPSIS mew-pinentry .\" .SH DESCRIPTION The .B mew-pinentry utility is a simple pinentry for gpg-agent. It is a front end to ask a passphrase to a user. .PP You may configure "~/.gnupg/gpg-agent.conf" to tell "gpg-agent" the path. .\" kazu-yamamoto-Mew-ff9c41b/bin/mew-pinentry.in000077500000000000000000000042161256455547000213170ustar00rootroot00000000000000#!/bin/sh # # mew-pinentry:: a simple pinentry # # Author: Kazu Yamamoto # Author: Tadaaki Nagao # Created: Jul 24, 2006 # Revised: May 15, 2007 PROMPT="Enter passphrase:" TTY=`tty` echo "OK" while read cmd arg; do case $cmd in "OPTION") key=${arg%%=*} val=${arg#*=} if [ "X$key" = "Xttyname" ]; then TTY=$val fi ;; # "SETPROMPT") # PROMPT=$arg # ;; "GETPIN") echo @ECHO_N@ "$PROMPT @ECHO_C@" > $TTY stty -echo < $TTY read passwd < $TTY stty echo < $TTY echo "" > $TTY echo "D $passwd" ;; "BYE") # echo "OK" exit 0 ;; "SETERROR") echo $arg > $TTY ;; esac echo "OK" done exit 0 # Copyright (C) 2006-2007 Mew developing team. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the team nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. kazu-yamamoto-Mew-ff9c41b/bin/mew.h000066400000000000000000000101731256455547000172660ustar00rootroot00000000000000/* * mew.h * * Author: Kazu Yamamoto * Created: Jul 7, 2000 * Revised: Jul 10, 2001 * * Code: */ #ifndef _MEW_H_ #define _MEW_H_ #include "config.h" #include /* * Common symbol */ #define TRUE 1 #define FALSE 0 #define YES 1 #define NO 0 /* * File descriptor */ #define READ 0 #define WRITE 1 #define SYNC 3 /* * File mode: "b" is ignored on UNIX. */ #define FDREAD "rb" #define FDWRITE "wb" /* * Control characters */ #define NUL '\0' #define CR '\r' #define LF '\n' #define EQ '=' #define TAB '\t' #define SP ' ' #define DOT '.' #define DEL 127 /* * .mew-mtime filename */ #define MEW_MTIME_FILE ".mew-mtime" #define MEW_MTIME_PHRASE "touched by mewl." /* * Suffix */ #define SUFFIX ".mew" /* * */ #define FILESEP '/' #define STRCMP(str1, str2) strncmp(str1, str2, sizeof(str2) - 1) #define STRCPY(dst, src) do {strncpy(dst, src, sizeof(dst) - 1); dst[sizeof(dst) -1] = NUL;} while (0); #define STRDUP(dst, src) if (((dst) = strdup((src))) == NULL) warn_exit("memory fault.") #define MALLOC(p, siz) if (((p) = malloc((siz))) == NULL) warn_exit("memory fault.") #define REALLOC(p, siz) if (((p) = realloc((p), (siz))) == NULL) warn_exit("memory fault.") #ifndef HAVE_STRNCASECMP # ifdef HAVE_STRNICMP # define strncasecmp strnicmp # endif #endif #ifndef HAVE_CHDIR # ifdef HAVE__CHDIR2 # define chdir _chdir2 # endif #endif #ifdef HAVE_FCNTL_H # include # ifdef HAVE_IO_H # include # endif # ifdef O_BINARY # ifndef HAVE_SETMODE # ifdef HAVE__SETMODE # define setmode _setmode # endif # endif # ifndef HAVE_FILENO # ifdef HAVE__FILENO # define fileno _fileno # endif # endif # define SET_BINARY_MODE(fd) setmode(fileno((fd)), O_BINARY) # else /* O_BINARY */ # define SET_BINARY_MODE(fd) {} # endif /* O_BINARY */ #endif /* HAVE_FCNTL_H */ #ifndef HAVE_USLEEP # ifdef HAVE_SLEEP # define usleep(x) Sleep(x / 1000) # elif defined(HAVE_POLL) # define usleep(x) poll(0, 0, (x)/1000) # endif #endif #ifdef HAVE_VFORK # define FORK() vfork() # define HAVE_FORK 1 #elif defined(HAVE_FORK) # define FORK() fork() #endif /* * External functions and variables */ #define public extern #define private static public char *getprognm(char *); public void warning(const char *, ...); public void warn_exit(const char *, ...); public int search_string(char *, char *, int); public void pattern_init(char *); public int pattern_match(void); public char *Getline(FILE *); public int Getopt(int, char **, const char *); extern char *warn_prog; extern int Optind; extern char *Optarg; #endif /* _MEW_H_ */ /* * Copyright (C) 2000-2003 Mew developing team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * mew.h ends here */ kazu-yamamoto-Mew-ff9c41b/bin/mewencode.1000066400000000000000000000052531256455547000203600ustar00rootroot00000000000000.\" Copyright (C) 2001-2003 Mew developing team. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. Neither the name of the team nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR .\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE .\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR .\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF .\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR .\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, .\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE .\" OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .TH MEWENCODE 1 "March 17, 2001" .UC 4 .SH NAME .BR mewencode , .BR mewdecode , .B mewcat - MIME encoder/decoder .\" .SH SYNOPSIS .PD 0 .B mewencode .RB [ -options ] .RI [ infile .RI [ outfile ]] .PP .B mewdecode .RB [ -options ] .RI [ infile .RI [ outfile ]] .PP .B mewcat .RB [ -options ] .RI [ infile ] .PD 1 .\" .SH DESCRIPTION The .B mewencode utility encode/decode MIME objects. .PP The options are as follows: .TP 8 .B \-e Encoding. .TP .B \-d Decoding. .TP .B \-8 See if any 8bit characters are contained. .TP .B \-b MIME base64 en/decoding. .TP .B \-q MIME quoted-printable en/decoding. .TP .B \-g MIME gzip64 en/decoding(not yet specified in RFC). .TP .B \-z The same as -g. .TP .B \-u Uudecoding. .TP .BI \-l " length" Line .I length into which base64/quoted-printable/gzip64 encoding truncate. .TP .B \-t On base64/gzip64 encoding, local newline is treated as CRLF. On base/gzip64 decoding, any newline is translated into local newline. Specify this option only when the input is a line based object(e.g. Content-Type: is text/plain or application/postscript). .TP .B \-h Display this help message. .TP .B \-v Display the version. .\" kazu-yamamoto-Mew-ff9c41b/bin/mewencode.c000066400000000000000000000604621256455547000204450ustar00rootroot00000000000000/* * mewencode, mewdecode, and mewcat --- MIME encoding for Mew * * Author: Kazu Yamamoto * Created: Dec 8, 1994 * * Code: */ #include "mew.h" private char version_message[] = "version 6.6 20140416 Kazu Yamamoto"; #ifdef HAVE_UNISTD_H #include #include #endif /* HAVE_UNISTD_H */ #include #include #include #ifdef HAVE_LIBZ #include #endif #define ENCODE_NAME "mewencode" #define DECODE_NAME "mewdecode" #define CAT_NAME "mewcat" #define ENCODE 1 #define DECODE 2 #define CHECK8 8 #define LINELEN 70 #define BASE64 'b' #define QP 'q' #define GZIP64 'z' #define UU 'u' #define OOB -1 #define EOP -2 #define ELF -3 #define ECR -4 typedef unsigned char byte; /**************************************************************** * * prototype * */ private void usage(const char *); private void help(const char *); private void version(const char *); private int read_text(byte *, unsigned int); private int read_binary(byte *, unsigned int); #ifdef HAVE_LIBZ private int deflate_gzip(byte *, unsigned int); #endif /* HAVE_LIBZ */ private int encode_base64(byte *, unsigned int); private void write_base64(void); private void base64_encode(int, int); private void gzip64_encode(int, int); private int read_base64(byte *, unsigned int); private int decode_base64(byte *, unsigned int); #ifdef HAVE_LIBZ private int inflate_gzip(byte *, unsigned int); #endif /* HAVE_LIBZ */ private void write_text(void); private void write_binary(void); private void base64_decode(int); private void gzip64_decode(int); private void quoted_printable_encode(int); private int puthexchar(int, int); private void quoted_printable_decode(void); private void uu_decode(int); private void check_8bit(void); /**************************************************************** * * long name convention for option * */ private void usage(const char *progname) { fprintf(stderr, "Usage: %s [-e|-d|-8] [-b|-q|-g|-u] [-l length] [-t] [infile [outfile]]\n", progname); } private const char * help_message[] = { " -e Encoding ", " -d Decoding instead of encoding", " Decoding is the default when called with the decoding", " program name.", " -b MIME base64 en/decoding.", " -q MIME quoted-printable en/decoding.", " -g MIME gzip64 en/decoding(not yet specified in RFC).", " -z The same as -g.", " -u Uudecoding.", " -l Line length into which base64/quoted-printable/gzip64 ", " encoding truncate. The default value is 70.", " -t On base64/gzip64 encoding, local newline is treated as CRLF.", " On base/gzip64 decoding,any newline is translated", " into local newline.", " Specify this option only when the input is a line", " based object(e.g. Content-Type: is text/plain or", " application/postscript).", " -8 See if any 8bit characters are contained.", " -h Display this help message.", " -v Display the version.", "", "Default is Encoding, Base64, Length = 70, Binary.", "If is \"-\", it means the standard input.", "If is \"-\", it means the standard output.", "If is given for uudecoding, an embedded file is used.", NULL }; private void help(const char *progname) { const char **p = help_message; fprintf(stderr, "Help: %s\n\n", progname); fprintf(stderr, " MIME encoder/decoder.\n\n"); usage(progname); while (*p) fprintf(stderr, "%s\n", *p++); } private void version(const char *progname) { fprintf(stderr, "%s %s\n", progname, version_message); } /**************************************************************** * * Base64 / Gzip64 encoder * */ struct { int (*e_func1)(byte *, unsigned int); int (*e_func2)(byte *, unsigned int); int (*e_func3)(byte *, unsigned int); unsigned int e_length; } E_ctx; #if HAVE_LIBZ private byte e_buf1[BUFSIZ]; #endif /* HAVE_LIBZ */ private byte e_buf2[BUFSIZ]; private byte e_buf3[BUFSIZ]; private char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; private int read_text(byte *p, unsigned int max) { static int done = NO; static int cr_in = NO; int c; byte *start = p, *lim = p + max; if (done) return 0; while (p < lim) { c = getchar(); if (cr_in == YES) { cr_in = NO; *p = LF; switch (c) { case EOF: done = YES; return p - start; case LF: break; case CR: default: ungetc(c, stdin); break; } } else { switch (c) { case EOF: done = YES; return p - start; case LF: *p = CR; cr_in = YES; ungetc(c, stdin); break; case CR: *p = CR; cr_in = YES; break; default: *p = c; break; } } p++; } return p - start; } private int read_binary(byte *p, unsigned int max) { return fread(p, sizeof(byte), max, stdin); } #ifdef HAVE_LIBZ private int deflate_gzip(byte *p, unsigned int max) { static int done = NO; static int initialized = NO; static int finalize = NO; static uLong crc = 0; static uLong total = 0; static z_stream z; int err, size, deflated = 0, old; byte *q; if (done == YES) return 0; if (initialized == NO) { initialized = YES; crc = crc32(0L, Z_NULL, 0); z.zalloc = (alloc_func)0; z.zfree = (free_func)0; z.opaque = (voidpf)0; z.avail_in = 0; err = deflateInit2(&z, Z_DEFAULT_COMPRESSION, Z_DEFLATED, -MAX_WBITS, 8, Z_DEFAULT_STRATEGY); if (err != Z_OK) warn_exit("deflateInit2 error."); *p++ = 0x1f; *p++ = 0x8b; *p++ = Z_DEFLATED; *p++ = 0; /* flag */ *p++ = 0; /* mtime */ *p++ = 0; /* mtime */ *p++ = 0; /* mtime */ *p++ = 0; /* mtime */ *p++ = 0; /* xf */ *p++ = 3; /* UNIX */ return 10; } z.next_out = p; z.avail_out = max; if (finalize == YES) goto finalize; while (z.avail_out != 0) { if (z.avail_in == 0) { size = (*E_ctx.e_func1)(e_buf1, sizeof(e_buf1)); if (size == 0) { finalize = YES; if (deflated == 0) goto finalize; return deflated; } z.next_in = e_buf1; z.avail_in = size; total += size; crc = crc32(crc, e_buf1, (uInt)size); } old = z.avail_out; err = deflate(&z, Z_SYNC_FLUSH); if (err != Z_OK && err != Z_STREAM_END) warn_exit("inflate error (%d).", err); deflated = max - z.avail_out; if (old == z.avail_out) break; } return deflated; finalize: done = YES; do { err = deflate(&z, Z_FINISH); } while (err != Z_STREAM_END); if (deflateEnd(&z) != Z_OK) warn_exit("deflateEnd error."); deflated = max - z.avail_out; q = z.next_out; *q++ = (int)(crc & 0xff); *q++ = (int)((crc >>= 8) & 0xff); *q++ = (int)((crc >>= 8) & 0xff); *q++ = (int)((crc >>= 8) & 0xff); *q++ = (int)(total & 0xff); *q++ = (int)((total >>= 8) & 0xff); *q++ = (int)((total >>= 8) & 0xff); *q++ = (int)((total >>= 8) & 0xff); deflated += 8; return deflated; } #endif /* HAVE_LIBZ */ private int encode_base64(byte *p, unsigned int max) { static int done = NO; static unsigned int avail = 0; static byte *q; unsigned int i, size, out = 0; byte c1, c2, c3, *r, *lim = p + max; if (done == YES) return 0; while (p + 4 < lim) { if (avail < 3) { r = q; q = e_buf2; for (i = 0; i < avail; i++) *q++ = *r++; size = (*E_ctx.e_func2)(q, sizeof(e_buf2) - avail); q = e_buf2; avail += size; if (size == 0) { done = YES; switch (avail) { case 0: return out; case 1: c1 = *q++; *p++ = base64[c1 >> 2]; *p++ = base64[((c1 & 0x3) << 4)]; *p++ = EQ; *p++ = EQ; return out + 4; case 2: c1 = *q++; c2 = *q++; *p++ = base64[c1 >> 2]; *p++ = base64[((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4)]; *p++ = base64[((c2 & 0xf) << 2)]; *p++ = EQ; return out + 4; } } } if (avail >= 3) { c1 = *q++; c2 = *q++; c3 = *q++; *p++ = base64[c1 >> 2]; *p++ = base64[((c1 & 0x3) << 4) | ((c2 & 0xf0) >> 4)]; *p++ = base64[((c2 & 0xf) << 2) | ((c3 & 0xc0) >> 6)]; *p++ = base64[c3 & 0x3f]; avail -= 3; out += 4; } } return out; } private void write_base64() { unsigned int length = E_ctx.e_length; unsigned int size = 0, out = 0, gap; byte *p; while ((size = (*E_ctx.e_func3)(e_buf3, sizeof(e_buf3))) != 0) { p = e_buf3; if (out != 0) { gap = length - out; if (size < gap) { fwrite(p, sizeof(byte), size, stdout); out += size; continue; } fwrite(p, sizeof(byte), gap, stdout); p += gap; size -= gap; putchar(LF); out = 0; } while (size >= length) { fwrite(p, sizeof(byte), length, stdout); p += length; size -= length; putchar(LF); } fwrite(p, sizeof(byte), size, stdout); out = size; } if (out != 0) putchar(LF); } private void base64_encode(int text, int length) { E_ctx.e_func1 = NULL; if (text == YES) E_ctx.e_func2 = read_text; else E_ctx.e_func2= read_binary; E_ctx.e_func3 = encode_base64; E_ctx.e_length = length; write_base64(); } private void gzip64_encode(int text, int length) { #ifdef HAVE_LIBZ if (text == YES) E_ctx.e_func1 = read_text; else E_ctx.e_func1= read_binary; E_ctx.e_func2 = deflate_gzip; E_ctx.e_func3 = encode_base64; E_ctx.e_length = length; write_base64(); #else /* HAVE_LIBZ */ warn_exit("not linked to zlib."); #endif /* HAVE_FORK */ } /**************************************************************** * * Base64 / Gzip64 decoder * */ struct { int (*d_func1)(byte *, unsigned int); int (*d_func2)(byte *, unsigned int); int (*d_func3)(byte *, unsigned int); } D_ctx; private byte d_buf1[BUFSIZ]; #if HAVE_LIBZ private byte d_buf2[BUFSIZ]; #endif /* HAVE_LIBZ */ private byte d_buf3[BUFSIZ]; private signed char base256[] = { OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,ELF,OOB, OOB,ECR,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, /* - / */ OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB, 62, OOB,OOB,OOB, 63, /* 0 1 2 3 4 5 6 7 8 9 = */ 52, 53, 54, 55, 56, 57, 58, 59, 60, 61,OOB,OOB, OOB,EOP,OOB,OOB, /* A B C D E F G H I J K L M N O*/ OOB, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, /* P Q R S T U V W X Y Z */ 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25,OOB, OOB,OOB,OOB,OOB, /* a b c d e f g h i j k l m n o*/ OOB, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, /* p q r s t u v w x y z */ 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51,OOB, OOB,OOB,OOB,OOB, }; private int read_base64(byte *p, unsigned int max) { static int done = NO, cnt = 0; int c, d, out = 0, lf = 0, cr = 0; byte *lim = p + max; if (done == YES) return 0; while (p < lim) { c = getchar(); if (c == EOF) { done = YES; return out; } d = base256[c]; switch (d) { case OOB: warning("invalid base64 character."); goto skiptail; case EOP: goto skiptail; case ELF: /* If cnt == 0, unnecessary null lines are prepended. */ if (++lf >= 2 && cnt > 0) goto skiptail; continue; case ECR: if (++cr >= 2 && cnt > 0) goto skiptail; continue; } lf = cr = 0; *p++ = d; out++; cnt++; } return out; skiptail: done = YES; return out; } private int decode_base64(byte *p, unsigned int max) { static int done = NO; static unsigned int avail = 0; static byte *q; unsigned int i, size, out = 0; byte c1, c2, c3, c4, *r, *lim = p + max; if (done == YES) return 0; while (p + 3 < lim) { if (avail < 4) { r = q; q = d_buf1; for (i = 0; i < avail; i++) *q++ = *r++; size = (*D_ctx.d_func1)(q, sizeof(d_buf1) - avail); q = d_buf1; avail += size; if (size == 0) { done = YES; switch (avail) { case 0: return out; case 1: warning("invalid base64 length."); return out; /* anyway */ case 2: c1 = *q++; c2 = *q++; *p++ = (c1 << 2) | ((c2 & 0x30) >> 4); return out + 1; case 3: c1 = *q++; c2 = *q++; c3 = *q++; *p++ = (c1 << 2) | ((c2 & 0x30) >> 4); *p++ = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2); return out + 2; } } } if (avail >= 4) { c1 = *q++; c2 = *q++; c3 = *q++; c4 = *q++; *p++ = (c1 << 2) | ((c2 & 0x30) >> 4); *p++ = ((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2); *p++ = ((c3 & 0x03) << 6) | c4; avail -= 4; out += 3; } } return out; } #ifdef HAVE_LIBZ private int inflate_gzip(byte *p, unsigned int max) { static int done = NO; static int initialized = NO; static z_stream z; int err, size, inflated = 0, old; if (done == YES) return 0; if (initialized == NO) { byte flag = 0; uInt len; byte *q, *r; initialized = YES; z.zalloc = (alloc_func)0; z.zfree = (free_func)0; z.opaque = (voidpf)0; err = inflateInit2(&z, -MAX_WBITS); if (err != Z_OK) warn_exit("inflateInit2 error."); size = (*D_ctx.d_func2)(d_buf2, sizeof(d_buf2)); q = d_buf2; r = q + size; if (*q++ != 0x1f) warn_exit("not gzip format (ID1)."); if (*q++ != 0x8b) warn_exit("not gzip format (ID2)."); if (*q++ != Z_DEFLATED) warn_exit("not gzip format (CM)."); flag = *q++; q += 6; /* mtime, xf, os */ /* * Optional header, probably omitted. */ if (flag & 0x04) { /* xlen */ len = *q++; len = len + (*q++ << 8); q += len; } if (flag & 0x08) /* file name */ while (*q++ != NUL); if (flag & 0x10) /* comment */ while (*q++ != NUL); if (flag & 0x02) /* crc */ q += 2; z.next_in = q; z.avail_in = r - q; } z.next_out = p; z.avail_out = max; while (z.avail_out != 0) { if (z.avail_in == 0) { size = (*D_ctx.d_func2)(d_buf2, sizeof(d_buf2)); z.next_in = d_buf2; z.avail_in = size; } old = z.avail_out; err = inflate(&z, Z_SYNC_FLUSH); if (err != Z_OK && err != Z_STREAM_END) warn_exit("inflate error (%d).", err); inflated = max - z.avail_out; if (old == z.avail_out) break; if (err == Z_STREAM_END) { done = YES; /* 8 bytes (crc and isize) are left. */ if (inflateEnd(&z) != Z_OK) warn_exit("inflateEnd error."); break; } } return inflated; } #endif /* HAVE_LIBZ */ private void write_text() { int i, c, size, cr_out = NO; while ((size = (*D_ctx.d_func3)(d_buf3, sizeof(d_buf3))) != 0) { for (i = 0; i < size; i++) { c = d_buf3[i]; if (cr_out == YES) { cr_out = NO; switch (c) { case LF : break; case CR : putchar(LF); cr_out = YES; break; default: putchar(c); break; } continue; } switch (c) { case CR : putchar(LF); cr_out = YES; break; default: putchar(c); break; } } } } private void write_binary() { unsigned int size; while ((size = (*D_ctx.d_func3)(d_buf3, sizeof(d_buf3))) != 0) fwrite(d_buf3, sizeof(byte), size, stdout); } private void base64_decode(int text) { D_ctx.d_func1 = read_base64; D_ctx.d_func2 = NULL; D_ctx.d_func3 = decode_base64; if (text == YES) write_text(); else write_binary(); } private void gzip64_decode(int text) { #ifdef HAVE_LIBZ D_ctx.d_func1 = read_base64; D_ctx.d_func2 = decode_base64; D_ctx.d_func3 = inflate_gzip; if (text == YES) write_text(); else write_binary(); #else /* HAVE_LIBZ */ warn_exit("not linked to zlib."); #endif /* HAVE_LIBZ */ } /**************************************************************** * * Quoted_Printable * */ private char base16[] = "0123456789ABCDEF"; private char From[] = "\nFrom "; #define softbreak() {putchar(EQ); putchar(LF);} private void quoted_printable_encode(int length) { int c, len = 0, sp = NO, lfdot = NO, Fromix = 1; while ((c = getchar()) != EOF) { if ((c == TAB) || (c == SP)) { if (From[Fromix] == c) { /* SP */ putchar(EQ); putchar(base16[c >> 4]); putchar(base16[c & 0x0f]); len += 3; Fromix = 0; continue; } Fromix = 0; sp = YES; putchar(c); if ((++len) > length) { sp = NO; len = 0; lfdot = LF; Fromix = 1; softbreak(); } continue; } if (c == LF) { if (sp || (lfdot == DOT)) softbreak(); len = 0; sp = NO; lfdot = LF; Fromix = 1; putchar(LF); continue; } if ((c < SP) || (c == EQ) || (c >= DEL)) { /* exclusive TAB, SP */ sp = NO; putchar(EQ); putchar(base16[c >> 4]); putchar(base16[c & 0x0f]); len += 3; if (len > length) { len = 0; lfdot = LF; Fromix = 1; softbreak(); } else { Fromix = 0; lfdot = NO; } continue; } sp = NO; if (From[Fromix] == c) Fromix++; else Fromix = 0; if (c == DOT && lfdot == LF) lfdot = DOT; else lfdot = NO; putchar(c); if ((++len) > length) { len = 0; lfdot = LF; Fromix = 1; softbreak(); } } if (len > 0) softbreak(); /* ignored by decoder */ } private signed char base128[] = { OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,OOB,OOB, OOB,OOB,OOB,OOB, OOB, 10, 11, 12, 13, 14, 15,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB, 10, 11, 12, 13, 14, 15,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, OOB,OOB,OOB,OOB, }; private int puthexchar(int c1, int c2) { int a1, a2; static int warned = NO; if (((a1 = base128[c1]) != OOB) && ((a2 = base128[c2]) != OOB)) { putchar(((a1 << 4) | a2)); return(TRUE); } else { if (warned == NO) { /* warn just once */ warning("can't translate hex to character: %c%c", c1, c2); warned = YES; } return(FALSE); } } private void quoted_printable_decode() { int c1, c2, c3; /* if an error occurs, print input sequence as it is, anyway, sigh */ while((c1 = getchar()) != EOF) { skipgetc: if (c1 == EQ) { if ((c2 = getchar()) == EOF) { putchar(EQ); warn_exit("end of file after =."); } if (c2 == LF) continue; if (c2 == CR) { if ((c3 = getchar()) == EOF) break; if (c3 == LF) { continue; } else { ungetc(c3, stdin); continue; } } if ((c3 = getchar()) == EOF) { putchar(EQ); putchar(c2); warn_exit("end of file after =."); } if (puthexchar(c2, c3) == FALSE) { putchar(EQ); if ((c1 = c2) == EOF) warn_exit("invalid eof."); ungetc(c3, stdin); goto skipgetc; } else continue; } putchar(c1); } } /**************************************************************** * * uudecode * */ private char Uu_read_buf[BUFSIZ]; private char Uu_flnm_buf[BUFSIZ]; #define uuchar(c) (((c) - SP) & 0x3f) private void uu_decode(int use_file_name) { int n, c1, c2, c3, c4; char *p, *q; while (fgets(Uu_read_buf, sizeof(Uu_read_buf), stdin) != NULL) { if (STRCMP(Uu_read_buf, "begin ") == 0) { if (use_file_name == YES) { if ((p = strchr(Uu_read_buf + 6, SP)) == NULL) warn_exit("no filename for uudecode."); p++; for (q = Uu_flnm_buf; *p != LF; p++, q++) *q = *p; if (freopen(Uu_flnm_buf, FDWRITE, stdout) == NULL) warn_exit("can't open a file."); } break; } } while (fgets(Uu_read_buf, sizeof(Uu_read_buf), stdin) != NULL) { if (STRCMP(Uu_read_buf, "end") == 0) break; p = Uu_read_buf; n = uuchar(*p++); if (((n + 2) / 3) != (strlen(Uu_read_buf) / 4)) continue; while (n > 0) { if (n >= 3) { c1 = uuchar(*p++); c2 = uuchar(*p++); c3 = uuchar(*p++); c4 = uuchar(*p++); putchar(((c1 << 2) | ((c2 & 0x30) >> 4))); putchar((((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2))); putchar((((c3 & 0x03) << 6) | c4)); } else if (n == 2) { c1 = uuchar(*p++); c2 = uuchar(*p++); c3 = uuchar(*p++); putchar(((c1 << 2) | ((c2 & 0x30) >> 4))); putchar((((c2 & 0x0f) << 4) | ((c3 & 0x3c) >> 2))); } else { c1 = uuchar(*p++); c2 = uuchar(*p++); putchar(((c1 << 2) | ((c2 & 0x30) >> 4))); } n = n - 3; } } if (use_file_name == YES) fprintf(stderr, "filename: %s\n", Uu_flnm_buf); } /**************************************************************** * * Checking 8bit * */ private void check_8bit() { int c; while ((c = getchar()) != EOF) if (c & 0x80) { printf("8bit\n"); exit(EXIT_FAILURE); } printf("7bit\n"); exit(EXIT_SUCCESS); } /**************************************************************** * * main * */ int main(int argc, char **argv) { int optc, file_count; /* * default option values */ int action = ENCODE; char encode = BASE64; /* -b -q -g */ int length = LINELEN; /* -l num */ int text = NO; /* -t */ int use_file_name = NO; char *progname = getprognm(argv[0]); warn_prog = progname; while((optc = Getopt(argc, argv, "esdbqgzl:tuhv8")) != EOF) { switch (optc) { case 'e': action = ENCODE; break; case 'd': action = DECODE; break; case 'b': encode = BASE64; break; case 'q': encode = QP; break; case 'g': case 'z': encode = GZIP64; break; case 'u': encode = UU; break; case '8': action = CHECK8; break; case 'l': length = atoi(Optarg); if (length == 0) length = LINELEN; break; case 't': text = YES; break; case 'h': help(progname); exit(EXIT_SUCCESS); break; case 'v': version(progname); exit(EXIT_SUCCESS); break; default: usage(progname); exit(EXIT_FAILURE); } } file_count = argc - Optind; /* Override arguments by progname. */ if (action == ENCODE) { if (STRCMP(progname, DECODE_NAME) == 0) action = DECODE; if (STRCMP(progname, CAT_NAME) == 0) { if (file_count != 0) warn_exit("too many arguments."); action = DECODE; } } switch(file_count) { case 0: break; case 1: if (STRCMP(argv[Optind], "-") == 0) ; else if (freopen(argv[Optind], FDREAD, stdin) == NULL) warn_exit("can't open file %s.", argv[Optind]); break; case 2: if (STRCMP(argv[Optind], "-") == 0) ; else if (freopen(argv[Optind], FDREAD, stdin) == NULL) warn_exit("can't open file %s.", argv[Optind]); Optind++; if (STRCMP(argv[Optind], "-") == 0) ; else if (encode == UU) use_file_name = YES; else if (freopen(argv[Optind], FDWRITE, stdout) == NULL) warn_exit("can't open file %s.", argv[Optind]); break; default: usage(progname); exit(EXIT_FAILURE); break; } SET_BINARY_MODE(stdin); SET_BINARY_MODE(stdout); switch (action) { case ENCODE: switch (encode) { case BASE64: base64_encode(text, length); break; case QP: quoted_printable_encode(length); break; case GZIP64: gzip64_encode(text, length); break; } break; case DECODE: switch (encode) { case BASE64: base64_decode(text); break; case QP: quoted_printable_decode(); break; case GZIP64: gzip64_decode(text); break; case UU: uu_decode(use_file_name); break; } break; case CHECK8: check_8bit(); break; } fclose(stdin); fclose(stdout); exit(EXIT_SUCCESS); } /* * Copyright (C) 1994-2005 Mew developing team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * mewencode.c ends here */ kazu-yamamoto-Mew-ff9c41b/bin/mewest000077500000000000000000000121031256455547000175520ustar00rootroot00000000000000#!/bin/sh # # mewest: Updating indexes of Hyper Estraier # # Author: Mitsuo Kuroishi # Author: Kazu Yamamoto # Created: Jul 20, 2006 # Revised: Jul 25, 2006 ESTCMD=estcmd FIND=find RM=rm MKDIR=mkdir BASEDIR=${HOME}/Mail INDEXDIR_ORG=casket INDEXDIR_REPLICA=casket_replica INDEXDIR=${INDEXDIR_ORG} OUTPUT=${OUTPUT:-/dev/null} LOCK=${BASEDIR}/.mewest.lock CYGWINENV=no SUFFIX=${SUFFIX:-.mew} usage () { PROG=`basename $0` cat <<__HDT__ USAGE: ${PROG} [directory] -s specify suffix -h help -v verbose mode -b base dir __HDT__ exit 1 } cleanup () { ${RM} -fr "${LOCK}" clean_up_replica } cleanup_trap () { cleanup exit 4 } cleanup_exit () { echo $1 cleanup exit 4 } clean_up_replica () { if [ -d "${BASEDIR}/${INDEXDIR_REPLICA}" ]; then rm -fr "${BASEDIR}/${INDEXDIR_REPLICA}" fi } # Check if environment is Cygwin. check_cygwin () { if type uname > /dev/null then true else return 255 fi case `uname -s` in CYGWIN*) if type cygpath > /dev/null then return 1 else return 255 fi ;; *) return 0 ;; esac } # Convert path style from Unix to Windows if environment is Cygwin. # Otherwise same path is simply echoed. path_conv() { if [ $CYGWINENV = "yes" ]; then cygpath -w "$1" else echo "$1" fi } check_cygwin case $? in 0) CYGWINENV=no ;; 1) CYGWINENV=yes # There is native find.exe in Windows but it is incompatible # with Unix's one. So make sure Cygwin's find.exe is used. PATH=/usr/bin:/bin:$PATH ;; *) echo Environment check failed exit 255 ;; esac while getopts "b:hvs:" OPTION do case ${OPTION} in b) BASEDIR=${OPTARG} ;; h) usage ;; v) OUTPUT=/dev/stdout ;; s) SUFFIX=${OPTARG} ;; *) usage ;; esac done shift `expr $OPTIND - 1` TGTDIR=${1:-${BASEDIR}} trap cleanup_trap 1 2 3 9 15 # create and check lock if ${MKDIR} "${LOCK}" > /dev/null 2>&1 ; then true else echo "${LOCK} exists" exit 5 fi # Directory exist? if [ ! -d "${TGTDIR}" ]; then cleanup_exit "${TGTDIR} not found" fi if [ -d "${BASEDIR}/${INDEXDIR}" ]; then echo "Replicating index..." clean_up_replica cp -R "${BASEDIR}/${INDEXDIR}" "${BASEDIR}/${INDEXDIR_REPLICA}" INDEXDIR=${INDEXDIR_REPLICA} echo "Replicating index...done" echo "Purging old messages..." ${ESTCMD} purge "`path_conv \"${BASEDIR}/${INDEXDIR}\"`" "`path_conv \"${TGTDIR}\"`" > ${OUTPUT} ||\ cleanup_exit "Purging old messages...failed" echo "Purging old messages...done" fi echo "Indexing new messages..." # "find"'s regular expression is NOT portable, sigh... # "[0-9]*" matches both "123" and "234.mew". ${FIND} "`path_conv \"${TGTDIR}\"`" \ -type d -name "trash" -prune -o \ -type d -name ${INDEXDIR_ORG} -prune -o \ -type d -name ${INDEXDIR_REPLICA} -prune -o \ -type f \( -name "[0-9]" -o -name "[0-9]*[0-9]" -o -name "[0-9]*${SUFFIX}" \) -print |\ ${ESTCMD} gather -cl -fm -cm -sd -xh "`path_conv \"${BASEDIR}/${INDEXDIR}\"`" - > ${OUTPUT} ||\ cleanup_exit "Indexing new messages...failed" echo "Indexing new messages...done" if [ "${BASEDIR}/${INDEXDIR}" = "${BASEDIR}/${INDEXDIR_REPLICA}" ]; then echo "Replacing old index with new one..." rm -fr "${BASEDIR}/${INDEXDIR_ORG}" mv "${BASEDIR}/${INDEXDIR_REPLICA}" "${BASEDIR}/${INDEXDIR_ORG}" echo "Replacing old index with new one...done" fi cleanup exit 0 # Copyright (C) 2006-2007 Mew developing team. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the team nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. kazu-yamamoto-Mew-ff9c41b/bin/mewest.1000066400000000000000000000011401256455547000177050ustar00rootroot00000000000000.\" Unlimited permission is granted to use, copy, distribute and/or modify .\" this file. There is NO WARRANTY. .TH MEWEST 1 "July 25, 2006" .SH NAME mewest - register messages into an index for Hyper Estraier .\" .SH SYNOPSIS mewest .RI [ options ] .RI [ directory ] .\" .SH DESCRIPTION The .B mewest utility registers messages into an index for Hyper Estraier. ${HOME}/Mail directory is used by default. This command requires the estcmd command. .PP The options are as follows: .TP 8 .B \-s Suffix for mail file. Default value is '.mew'. .TP 8 .B \-v Verbose mode. .TP 8 .B \-h Display help message. .\" kazu-yamamoto-Mew-ff9c41b/bin/mewl.1000066400000000000000000000061731256455547000173600ustar00rootroot00000000000000.\" Copyright (C) 2001-2003 Mew developing team. .\" All rights reserved. .\" .\" Redistribution and use in source and binary forms, with or without .\" modification, are permitted provided that the following conditions .\" are met: .\" .\" 1. Redistributions of source code must retain the above copyright .\" notice, this list of conditions and the following disclaimer. .\" 2. Redistributions in binary form must reproduce the above copyright .\" notice, this list of conditions and the following disclaimer in the .\" documentation and/or other materials provided with the distribution. .\" 3. Neither the name of the team nor the names of its contributors .\" may be used to endorse or promote products derived from this software .\" without specific prior written permission. .\" .\" THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND .\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE .\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR .\" PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE .\" LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR .\" CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF .\" SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR .\" BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, .\" WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE .\" OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN .\" IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. .TH MEWL 1 "March 5, 2003" .SH NAME mewl - Message scanner for Mew 4 or later .\" .SH SYNOPSIS mewl .RI [ options ] .RI [ folder .RI [ range ]] .\" .SH DESCRIPTION The .B mewl utility extracts necessary fields from messages stored in folders. This command is necessary for Mew to implement the asynchronous feature. .PP The options are as follows: .TP 8 .B \-a Print all necessary fields when picking. .TP 8 .BI \-b " dir" Set the Mail home to .IR dir . .TP 8 .BI \-c " bodylen" Set the max body length to be extracted to .IR bodylen . .TP 8 .BI \-d " field" Set the field to be extracted to .IR field . .TP 8 .BI \-e " command" Specify an external .I command to fetch mailbox. .TP 8 .BI \-m " options" Specify .I options for .IR command . .TP 8 .BI \-f " fields" Specify .I fields to display. .TP 8 .B \-h Display this help message. .TP 8 .BI \-i " file" Set the input stream to .IR file . .TP 8 .BI \-l " length" Set the max field length to be extracted to .IR length . The default value is 3. 0 means no limit. .TP 8 .B \-n Don't use fstat(). .TP 8 .BI \-p " pattern" Specify the pick .IR pattern . .TP 8 .BI \-s " src" Set message source to .I src : '+folder range'. .TP 8 .B \-w Wait for stdio input to synchronize. .TP 8 .B \-v Display the version. .TP 8 .BI \-x " suffix" Use this .IR suffix . Definitions of the symbols above are as follows: .TP 8 .I range N | [start]-[end] | last:N .TP 8 .I pattern \'key=val' | 'key!=val' | '!' | '()' | '&' | '|' .\" .SH BUGS If a field is long, only the beginning three lines are extracted by default. .\" kazu-yamamoto-Mew-ff9c41b/bin/mewl.c000066400000000000000000000653251256455547000174460ustar00rootroot00000000000000/* * mewl -- Message scanner for Mew 4 or later * * Author: Kazu Yamamoto * Created: Jul 7, 2000 * * Code: */ #include "mew.h" private char version_message[] = "version 6.6 20140416 Kazu Yamamoto"; #ifdef HAVE_UNISTD_H # include # include #endif /* HAVE_UNISTD_H */ #include #include #include #include #include #ifdef HAVE_DIRENT_H # include # define NAMLEN(dirent) strlen((dirent)->d_name) #else /* HAVE_DIRENT_H */ # define dirent direct # define NAMLEN(dirent) (dirent)->d_namlen # ifdef HAVE_SYS_NDIR_H # include # endif /* HAVE_SYS_NDIR_H */ # ifdef HAVE_SYS_DIR_H # include # endif /* HAVE_SYS_DIR_H */ # ifdef HAVE_NDIR_H # include # endif /* HAVE_NDIR_H */ #endif /* HAVE_DIRENT_H */ #ifdef HAVE_DIRECT_H #include #endif /* for chdir() */ #ifdef HAVE_DIR_H # include #endif /* HAVE_DIR_H */ #ifdef HAVE_PWD_H # include #endif /* HAVE_PWD_H */ /**************************************************************** * * Macro, structure, and tables * */ #define MAILHOME "Mail" #define CHDIR "CD:" #define INBOX "+inbox" #define STDINFILE "-" #define HEAD "head" #define FILE_SEPARATOR '\7' /* 16k, my experience says that 8k is not enough. */ #define MAX_HEADER 16384 #define MAX_FIELD_LEN 5 #define MAX_BODY_LEN 20 #define MAX_FOLDER 16 #define NUMBER_OF_FILE 128 #define MAX_ARGC 16 #ifdef PATH_MAX # define MAX_FILE_NAME_LEN PATH_MAX #else # define MAX_FILE_NAME_LEN 1024 #endif #define DEFAULT_FIELDS \ "Subject:,Date:,From:,To:,Cc:,Content-Type:,Content-Transfer-Encoding:,X-Mew-UIDL:,Message-ID:,In-Reply-To:,References:,X-Mew-Ref:" #define REFERENCES "References:" struct fld_rng { char *folder; unsigned int first; unsigned int last; unsigned int num; }; private char Buf_header[MAX_HEADER]; private char Buf_filenm[MAX_FILE_NAME_LEN]; private char Buf_filenm2[MAX_FILE_NAME_LEN]; private char *Mail_home; private char Current_folder[MAX_FILE_NAME_LEN]; private struct fld_rng Folders[MAX_FOLDER]; private char *Argvec[MAX_ARGC]; private char *Key_field = NULL; private char *Exec_cmd = NULL; private char *Exec_arg = NULL; private char *Input_file = NULL; private char *Suffix = NULL; private char *Suffix_fmt = NULL; private int All_fields = 0; private int Field_len = MAX_FIELD_LEN; private int Body_len = MAX_BODY_LEN; private int PrintNumOfMsg = NO; private int Suffix_len = 0; private int no_fld_flag = 0; private int default_fld_error_flag = 0; /**************************************************************** * * prototype * */ private void usage(const char *); private void help(const char *); private void version(const char *); private void ch_home(void); private void ch_mail_home(char *); private void ch_folder(char *); private char *nextline(char *, char *, int); private char *nextfield(char *, char *, char **, char **, int); private char *eoh(char *, char *); private void init_fields(char *); private void print_field(char *, int, char *, char *); private void init_search(char *, int); private char *mystrcasechr(char *, int); private char *mystrcasestr(char *, char *); private int print_for_scan(FILE *, char *, char *); private int print_for_sort(FILE *, char *, char *); private int print_for_pick(FILE *, char *, char *); private int scan_numfile(char *, unsigned int, unsigned int); private int scan_intcompare(unsigned int *, unsigned int *); private int scan_folder(struct fld_rng *); private void scan_init(unsigned int); private FILE *scan_getfile(char **, char **); private void exec_init(unsigned int); private FILE *exec_getfile(char **, char **); private void stdin_init(unsigned int); private void set_fld_rng(struct fld_rng *, char *, char *); /**************************************************************** * * options and usages * */ private void usage(const char *progname) { fprintf(stderr, "Usage: %s [options] [folder [range]]\n", progname); } private const char * help_message[] = { " -a Print all necessary fields when picking.", " -b Mail home.", " -c Max body length to dump.", " -d A field to be extracted.", " -e An external command to fetch mailbox.", " -m The second argument for the external command.", " -f Fields to display.", " -h Display this help message.", " -i A file name to be read.", " -l Field max length to dump. (0 means no limit)", " -n Don't use fstat().", " -p Pick pattern.", " -s Message source: '+folder range'.", " -w Wait for stdio input to synchronize.", " -v Display the version.", " -x Use this suffix.", "", " = N | [start]-[end] | last:N", " = 'key=val' | 'key!=val' | '!' | '()' ", " | '&' ", " | '|' ", "", "Default is mdir = ~/Mail,", "length = 5, folder = +inbox, range = 0, bodylen = 20", "field = Subject:,Date:,From:,To:,Cc:,Content-Type:,Content-Transfer-Encoding:,X-Mew-UIDL:,Message-ID:,In-Reply-To:,References:,X-Mew-Ref:", NULL }; private void help(const char *progname) { const char **p = help_message; fprintf(stderr, "Help: %s\n\n", progname); fprintf(stderr, " Message scanner.\n\n"); usage(progname); while (*p) fprintf(stderr, "%s\n", *p++); } private void version(const char *progname) { fprintf(stderr, "%s %s\n", progname, version_message); } /**************************************************************** * * folder function * */ private void ch_home() { char *home = getenv("HOME"); #ifdef HAVE_GETPWUID if(home == NULL || home[0] == NUL) { struct passwd *pw = getpwuid(getuid()); if(pw == NULL) warn_exit("failed in getting home directory."); home = pw->pw_dir; } #endif /* HAVE_GETPWUID */ if (home == NULL) warn_exit("can't change directory to home."); if (chdir(home) != 0) warn_exit("can't change directory to %s.", home); } private void ch_mail_home(char *dir) { char *p = dir + 1, c; if (dir == NULL) warn_exit("%s not exist.", dir); c = *dir; switch (c) { case '~': ch_home(); if (*p == NUL) break; if (*p++ != FILESEP) warn_exit("can't change directory to %s.", dir); if (*p == NUL) break; if (chdir(p) != 0) warn_exit("can't change directory to %s.", dir); break; case FILESEP: if (chdir(dir) != 0) warn_exit("can't change directory to %s.", dir); break; default: ch_home(); if (chdir(dir) != 0) warn_exit("can't change directory to %s.", dir); break; } } private void ch_folder(char *folder) { char c = *folder, *p = folder + 1; switch (c) { case '+': ch_mail_home(Mail_home); if (p == NUL) break; if (chdir(p) != 0) { if( no_fld_flag != 0 ) default_fld_error_flag = 1; else warn_exit("can't change folder to %s.", folder); } break; case '~': ch_home(); if (*p == NUL) break; if (*p++ != FILESEP) warn_exit("can't change folder to %s.", folder); if (*p == NUL) break; if (chdir(p) != 0) warn_exit("can't change folder to %s.", folder); break; default: if (chdir(folder) != 0) warn_exit("can't change folder to %s.", folder); break; } } /**************************************************************** * * header sub functions * */ /* * p: a point to be scanned in the buffer. * lim: the end of the buffer. * hdr_only: if YES, scan the header only (not the body). * * return value: the beginning point of the next line. NULL pointer is * returned if either the buffer or the header ends. */ private char * nextline(char *p, char *lim, int hdr_only) { if (p == lim) return NULL; if (*p == LF && hdr_only == YES) return NULL; while (p < lim) { if (*p == LF) break; p++; } p++; if (p < lim) return p; else { *(lim - 1) = LF; return NULL; } } /* * p: a point to be scanned in the buffer. * lim: the end of the buffer. * truncated_end: if the number of the lines of the field is over * Field_len, it is truncated. And the end point is * set to truncated_end. * prev_beg: if not NULL pointer, the beginning point of the previous * line of the last line is set to prev_beg. This is used * for the References: field. * hdr_only: if YES, scan the header only (not the body). * * return value: a point of the next field. NULL pointer is returned * if either the buffer or the header ends. */ private char * nextfield(char *p, char *lim, char **truncated_end, char **prev_beg, int hdr_only) { int i = 0; char *q; *truncated_end = NULL; do { q = p; p = nextline(p, lim, hdr_only); if (p == NULL) break; i++; if (Field_len != 0 && i == Field_len) *truncated_end = p; } while (*p == SP || *p == TAB); if (prev_beg != NULL) *prev_beg = q; return p; } private char * eoh(char *p, char *lim) { while (p < lim) { if (*p == LF && p + 1 < lim && *(p + 1) == LF) return p + 1; p++; } return lim - 1; } /**************************************************************** * * print sub-functions * */ private char **Scan_ctx_beg; private char **Scan_ctx_end; private char **Scan_ctx_fields; private unsigned int *Scan_ctx_slen; private int Scan_ctx_ref_idx = -1; private unsigned int Scan_ctx_ptr_size; private unsigned int Scan_ctx_fld_num; private void init_fields(char *fields) { unsigned int i; char *start, *p; if (fields != NULL) p = fields; else p = DEFAULT_FIELDS; STRDUP(start, p); for (i = 1, p = start; (p = strchr(p, ',')) != NULL; i++) *p++ = NUL; Scan_ctx_fld_num = i; Scan_ctx_ptr_size = Scan_ctx_fld_num * sizeof(char *); MALLOC(Scan_ctx_fields, Scan_ctx_ptr_size); MALLOC(Scan_ctx_slen, Scan_ctx_fld_num * sizeof(int)); MALLOC(Scan_ctx_beg, Scan_ctx_ptr_size); MALLOC(Scan_ctx_end, Scan_ctx_ptr_size); i = 0; p = start; do { Scan_ctx_fields[i] = p; Scan_ctx_slen[i] = strlen(p); if (strcmp(p, REFERENCES) == 0) Scan_ctx_ref_idx = i; p = strchr(p, NUL); p++; i++; } while (i < Scan_ctx_fld_num); } private void print_field(char *buf, int lim, char *fname, char *fld) { unsigned int i; int match; char *p, *q, *limp, *end, *prev, *body_beg = NULL; memset(Scan_ctx_beg, 0, Scan_ctx_ptr_size); memset(Scan_ctx_end, 0, Scan_ctx_ptr_size); p = buf; limp = p + lim; for (;;) { i = 0; match = NO; while (i < Scan_ctx_fld_num) { if (strncasecmp(Scan_ctx_fields[i], p, Scan_ctx_slen[i]) == 0) { match = YES; break; } i++; } if (match == YES) { Scan_ctx_beg[i] = p; p = nextfield(p, limp, &end, &prev, NO); if (i == Scan_ctx_ref_idx) { /* For the References: field, the bottom part of its value is important. */ if (Scan_ctx_beg[i] == prev) /* Skip the field name since it will be printed below. */ Scan_ctx_beg[i] = Scan_ctx_beg[i] + Scan_ctx_slen[i]; else /* The last line only */ Scan_ctx_beg[i] = prev; if (p == NULL) Scan_ctx_end[i] = limp; else Scan_ctx_end[i] = p; } else { if (end != NULL) Scan_ctx_end[i] = end; else if (p == NULL) Scan_ctx_end[i] = limp; else Scan_ctx_end[i] = p; } } else /* not a target field. let's skip this */ p = nextfield(p, limp, &end, NULL, NO); if (p == NULL) break; /* for */ if (*p == LF) { /* header ends */ p++; body_beg = p; break; /* for */ } } if (fld != NULL) printf("Folder: %s\n", fld); printf("Filename: %s\n", fname); for (i = 0; i < Scan_ctx_fld_num; i++) if (Scan_ctx_beg[i] != NULL) { if (i == Scan_ctx_ref_idx) printf("%s", REFERENCES); p = Scan_ctx_beg[i]; while (p < Scan_ctx_end[i]) putchar(*p++); } printf("\n"); if (body_beg != NULL) { p = body_beg; i = 0; while (i < Body_len) { q = p; p = nextline(q, limp, NO); if (p == NULL) { while (q < limp) { putchar(*q); q++; } break; } i++; if (*q == '.') printf("."); while (q < p) { putchar(*q); q++; } } } printf(".\n"); } /**************************************************************** * * String search * */ private char *Search_ctx_buf; private int Search_ctx_lim; private void init_search(char *buf, int lim) { Search_ctx_buf = buf; Search_ctx_lim = lim; } private char * mystrcasechr(char *s, int c) { int lc = tolower(c); int uc = toupper(c); do { if (*s == lc || *s == uc) return s; } while (*s++); return NULL; } private char * mystrcasestr(char *s1, char *s2) { char *p; unsigned int len = strlen(s2); for (p = s1; (p = mystrcasechr(p, *s2)) != NULL; p++) if (strncasecmp(p, s2, len) == 0) return p; return NULL; } public int search_string(char *key, char *value, int case_sensitive) { unsigned int len = strlen(key); char *beg = NULL, *end = NULL; char *p = Search_ctx_buf, *limp = p + Search_ctx_lim, tmp; if (strcmp(HEAD, key) == 0) { end = eoh(p, limp); tmp = *end; *end = NUL; if (case_sensitive == YES) { if (strstr(p, value) != NULL) { *end = tmp; return TRUE; } } else { if (mystrcasestr(p, value) != NULL) { *end = tmp; return TRUE; } } *end = tmp; return FALSE; } for (;;) { if (strncasecmp(key, p, len) == 0) { beg = p + len; p = nextfield(p, limp, &end, NULL, YES); if (end != NULL) end--; /* end == LF */ else if (p == NULL) end = limp - 1; /* end == LF, see nextline */ else end = p - 1; /* end == LF */ tmp = *end; *end = NUL; if (case_sensitive == YES) { if (strstr(beg, value) != NULL) { *end = tmp; return TRUE; } } else { if (mystrcasestr(beg, value) != NULL) { *end = tmp; return TRUE; } } *end = tmp; } else p = nextfield(p, limp, &end, NULL, YES); if (p == NULL) break; } return FALSE; } /**************************************************************** * * print functions * */ private int print_for_scan(FILE *fp, char *fname, char *fld) { int lim = fread(Buf_header, sizeof(char), sizeof(Buf_header), fp); print_field(Buf_header, lim, fname, fld); return TRUE; } private int print_for_sort(FILE *fp, char *fname, char *fld) { int lim = fread(Buf_header, sizeof(char), sizeof(Buf_header), fp); unsigned int len = strlen(Key_field); char *beg = NULL, *end = NULL; char *p = Buf_header, *limp = p + lim; for (;;) { if (strncasecmp(Key_field, p, len) == 0) { beg = p + len; p = nextfield(p, limp, &end, NULL, YES); if (end != NULL) end--; else if (p == NULL) { end = limp; } else end = p - 1; break; } p = nextfield(p, limp, &end, NULL, YES); if (p == NULL) break; } if (beg == NULL) printf("%s: \n", fname); else { printf("%s:", fname); p = beg; while (p < end) putchar(*p++); printf("\n"); } return FALSE; } private int print_for_pick(FILE *fp, char *fname, char *fld) { int lim = fread(Buf_header, sizeof(char), sizeof(Buf_header), fp); init_search(Buf_header, lim); if (pattern_match() == TRUE) { if (All_fields > 0) { print_field(Buf_header, lim, fname, fld); return TRUE; } else { printf("%s\n", fname); return FALSE; } } return FALSE; } /**************************************************************** * * scan functions * */ private unsigned int Scan_ctx_folders; private unsigned int Scan_ctx_messages; private unsigned int Scan_ctx_buf_size; private unsigned int *Scan_ctx_buf; private int scan_numfile(char *s, unsigned int first, unsigned int last) { int num = 0; unsigned char c; while ((c = *s) != NUL && isdigit(c)) { num = num * 10 + c - '0'; s++; } if (num == 0) return FALSE; else if (*s == NUL) ; else if (strncmp(s, Suffix, Suffix_len) == 0 && s[Suffix_len] == NUL) ; else return FALSE; if (num >= first && (last == 0 || num <= last)) return TRUE; else return FALSE; } private int scan_intcompare(unsigned int *i, unsigned int *j) { if (*i > *j) return 1; if (*i < *j) return -1; return 0; } private int scan_folder(struct fld_rng *fr) { unsigned int num = 0; unsigned int first = fr->first, last = fr->last; DIR *dirp; struct dirent *dp; char *fname; int i; ch_folder(fr->folder); if ((dirp = opendir(".")) == NULL) warn_exit("can't open folder: %s.", fr->folder); while ((dp = readdir(dirp)) != NULL) { fname = dp->d_name; if (scan_numfile(fname, first, last)) { if (num == Scan_ctx_buf_size) { Scan_ctx_buf_size += NUMBER_OF_FILE; Scan_ctx_buf = (unsigned int *)realloc(Scan_ctx_buf, Scan_ctx_buf_size * sizeof(unsigned int)); } *(Scan_ctx_buf + num) = atoi(fname); num++; } } closedir(dirp); qsort(Scan_ctx_buf, num, sizeof(int), (int (*)(const void *, const void *)) scan_intcompare); if (fr->num > 0 && fr->num < num) { for (i = 0; i < fr->num; i++) Scan_ctx_buf[i] = Scan_ctx_buf[num - fr->num + i] ; num = fr->num; } if (PrintNumOfMsg == YES && num > 0 && Scan_ctx_folders == 1) { printf("NumOfMsg: %d\n", num); fflush(stdout); } return num; } private void scan_init(unsigned int folders) { Scan_ctx_folders = folders; Scan_ctx_messages = 0; Scan_ctx_buf_size = NUMBER_OF_FILE; MALLOC(Scan_ctx_buf, Scan_ctx_buf_size * sizeof(int)); } private FILE * scan_getfile(char **filename, char **foldername) { static unsigned int i = 0, j = 0; FILE *fp; again: if (i == Scan_ctx_messages) { if (j < Scan_ctx_folders) { Scan_ctx_messages = scan_folder(&Folders[j++]); i = 0; } else return NULL; } *foldername = Folders[j - 1].folder; while (i < Scan_ctx_messages) { snprintf(Buf_filenm, sizeof(Buf_filenm), "%d", *(Scan_ctx_buf + i)); snprintf(Buf_filenm2, sizeof(Buf_filenm2), Suffix_fmt, "", *(Scan_ctx_buf + i)); fp = fopen(Buf_filenm2, FDREAD); if (fp == NULL) fp = fopen(Buf_filenm, FDREAD); if (fp != NULL) { i++; *filename = Buf_filenm; return fp; } snprintf(Buf_filenm, sizeof(Buf_filenm), "0%d", *(Scan_ctx_buf + i)); snprintf(Buf_filenm2, sizeof(Buf_filenm2), Suffix_fmt, "0", *(Scan_ctx_buf + i)); fp = fopen(Buf_filenm2, FDREAD); if (fp == NULL) fp = fopen(Buf_filenm, FDREAD); if (fp != NULL) { i++; *filename = Buf_filenm; return fp; } i++; } goto again; } /**************************************************************** * * exec functions * */ #ifdef HAVE_FORK private void exec_init(unsigned int num) { /* num == 0 */ int childpid; int pipes[2]; if (strlen(Folders[0].folder) >= sizeof(Current_folder)) warn_exit("folder name is too long."); STRCPY(Current_folder, Folders[0].folder); ch_folder(Current_folder); if (pipe(pipes) != 0) warn_exit("can't open pipe."); childpid = FORK(); if (childpid < 0) warn_exit("can't fork."); if (childpid == 0) { /* I'm the child. */ int i = 0; int lim = MAX_ARGC - 2; char *p; close(WRITE); dup(pipes[WRITE]); close(pipes[READ]); Argvec[i++] = Exec_cmd; if (Exec_arg != NULL) { p = Exec_arg; Argvec[i++] = p; while (i < lim) { if ((p = strchr(p, SP)) == NULL) break; *p++ = NUL; Argvec[i++] = p; } } Argvec[i++] = Current_folder; Argvec[i++] = NULL; execvp(Exec_cmd, Argvec); warn_exit("'%s' command not found.", Exec_cmd); } /* I'm the parent. */ close(READ); dup(pipes[READ]); close(pipes[WRITE]); } #else /* HAVE_FORK */ private void exec_init(unsigned int num) { /* num == 0 */ if (strlen(Folders[0].folder) >= sizeof(Current_folder)) warn_exit("folder name is too long."); STRCPY(Current_folder, Folders[0].folder); ch_folder(Current_folder); } #endif /* HAVE_FORK */ private FILE * exec_getfile(char **filename, char **foldername) { FILE *fp; char *p, *q, *r; int c; *foldername = Current_folder; while ((p = fgets(Buf_filenm, sizeof(Buf_filenm), stdin)) != NULL) { if ((q = strchr(Buf_filenm, LF)) != NULL) *q = NUL; else { Buf_filenm[MAX_FILE_NAME_LEN - 1] = NUL; while ((c = getchar()) != LF && c != EOF) ; } if (STRCMP(p, CHDIR) == 0) { no_fld_flag = 0; default_fld_error_flag = 0; p = p + strlen(CHDIR); while (*p == SP || *p == TAB) p++; if (strlen(p) >= sizeof(Current_folder)) warn_exit("folder name is too long."); STRCPY(Current_folder, p); ch_folder(Current_folder); *foldername = Current_folder; continue; } if(default_fld_error_flag != 0) warn_exit("default folder is not exist."); while (*p == SP || *p == TAB) p++; if (isdigit((unsigned char)*p) == 0) continue; *filename = p; while (isdigit((unsigned char)*p)) p++; if (STRCMP(p, Suffix)==0) { r = p; p = p + Suffix_len; } else r = NULL; *p = NUL; fp = fopen(*filename, FDREAD); if (fp != NULL) { if (r != NULL) *r = NUL; return fp; } if (r != NULL) { *r = NUL; fp = fopen(*filename, FDREAD); if (fp != NULL) return fp; } } return NULL; } /**************************************************************** * * stdin functions * */ private void stdin_init(unsigned int num) { /* num == 0 */ if (strcmp(Input_file, STDINFILE) != 0) if (freopen(Input_file, FDREAD, stdin) == NULL) warn_exit("can't open %s.", Input_file); if (strlen(Folders[0].folder) >= sizeof(Current_folder)) warn_exit("folder name is too long."); STRCPY(Current_folder, Folders[0].folder); ch_folder(Current_folder); } /**************************************************************** * * parser for folder and range * */ private void set_fld_rng(struct fld_rng *fr, char *arg1, char *arg2) { char *folder = arg1; char *range = NULL, *last = NULL; char *p; if (arg1 != NULL) range = strchr(arg1, SP); if (range == NULL) range = arg2; else *range++ = NUL; if (range == NULL) fr->first = fr->last = fr->num = 0; else if (strncmp(range, "last:", 5) == 0) { range += 5; fr->first = fr->last = 0; fr->num = atoi(range); } else if ((last = strchr(range, '-')) == NULL) { fr->first = fr->last = atoi(range); fr->num = 0; } else { *last++ = NUL; fr->first = atoi(range); fr->last = atoi(last); fr->num = 0; } if (folder == NULL) folder = INBOX; STRDUP(fr->folder, folder); while ((p = strchr(fr->folder, FILE_SEPARATOR)) != NULL) *p = SP; } /**************************************************************** * * main * */ int main(int argc, char **argv) { int optc, rest; int eflag = 0, nflag = 1, sflag = 0, wflag = 0; int wait; unsigned int lim = 0; struct stat st; int (*func_print)(FILE *, char *, char *); void (*func_init)(unsigned int); FILE *(*func_getfile)(char **, char **); FILE *fp, *sync = NULL; char *filename, *foldername, *fields = NULL, *pattern = NULL; char *progname = getprognm(argv[0]); char *fld_rng; warn_prog = progname; STRDUP(Mail_home, MAILHOME); while ((optc = Getopt(argc, argv, "ab:c:d:e:f:hi:l:m:np:s:vwx:")) != EOF) { switch (optc) { case 'a': All_fields++; break; case 'b': STRDUP(Mail_home, Optarg); break; case 'c': Body_len = atoi(Optarg); break; case 'd': STRDUP(Key_field, Optarg); break; case 'e': STRDUP(Exec_cmd, Optarg); eflag++; break; case 'f': STRDUP(fields, Optarg); PrintNumOfMsg = YES; break; case 'h': help(progname); exit(EXIT_SUCCESS); break; case 'i': STRDUP(Input_file, Optarg); break; case 'l': Field_len = atoi(Optarg); break; case 'm': STRDUP(Exec_arg, Optarg); break; case 'n': nflag = 0; break; case 'p': STRDUP(pattern, Optarg); break; case 's': if (lim >= MAX_FOLDER) warn_exit("too many folders."); STRDUP(fld_rng, Optarg); set_fld_rng(&Folders[lim++], fld_rng, NULL); sflag++; break; case 'v': version(progname); exit(EXIT_SUCCESS); break; case 'w': wflag++; break; case 'x': STRDUP(Suffix, Optarg); break; default: usage(progname); exit(EXIT_FAILURE); } } rest = argc - Optind; /* Suffix */ if (Suffix == NULL) STRDUP(Suffix, SUFFIX); Suffix_len = strlen(Suffix); MALLOC(Suffix_fmt, (Suffix_len + 10)); /* xxx */ snprintf(Suffix_fmt, Suffix_len + 10, "%%s%%d%s", Suffix); if (sflag == 0) switch (rest) { /* lim == 0 */ case 0: set_fld_rng(&Folders[lim++], NULL, NULL); no_fld_flag = 1; break; case 1: set_fld_rng(&Folders[lim++], argv[Optind], NULL); break; case 2: set_fld_rng(&Folders[lim++], argv[Optind], argv[Optind + 1]); break; default: usage(progname); exit(EXIT_FAILURE); } else if (rest != 0) warn_exit("the 's' option can't co-exist with arguments."); if (Input_file != NULL) { func_init = stdin_init; func_getfile = exec_getfile; } else if (eflag > 0) { func_init = exec_init; func_getfile = exec_getfile; } else { func_init = scan_init; func_getfile = scan_getfile; } init_fields(fields); /* lengthy sometime */ if (pattern != NULL) { pattern_init(pattern); func_print = print_for_pick; PrintNumOfMsg = NO; } else if (Key_field != NULL) func_print = print_for_sort; else func_print = print_for_scan; dup2(READ, SYNC); sync = fdopen(SYNC, FDREAD); (*func_init)(lim); while ((fp = (*func_getfile)(&filename, &foldername)) != NULL) { if (nflag != 0) { fstat(fileno(fp), &st); if (!(st.st_mode & S_IFREG)) { fclose(fp); continue; } } wait = (*func_print)(fp, filename, foldername); if (wait == TRUE && wflag > 0 && sync != NULL) { fflush(stdout); fgetc(sync); } fclose(fp); } exit(EXIT_SUCCESS); } /* * Copyright (C) 2000-2005 Mew developing team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * mewl.c ends here */ kazu-yamamoto-Mew-ff9c41b/bin/pattern.c000066400000000000000000000313741256455547000201540ustar00rootroot00000000000000/* * pattern.c * * Author: Kazu Yamamoto * Created: Oct 17, 2000 * * Code: */ #include "mew.h" #include #include #include /**************************************************************** * * Structures * */ enum ptype { P_NUL, /* terminator */ P_EXP, /* abstracted expression */ P_STR, /* str, "str", "\"" */ P_EQ, /* = case-insensitive */ P_CEQ, /* == case-sensitive */ P_NEQ, /* != case-insensitive */ P_CNE ,/* !== case-sensitive */ P_AND, /* &, && */ P_OR, /* |, || */ P_NOT, /* ! */ P_LSQ, /* ( */ P_RSQ /* ) */ }; struct pat { enum ptype typ; /* See above */ struct pat *prv; /* Doubly linked list */ struct pat *nxt; /* Doubly linked list */ struct pat *dwn; /* For P_EXP and P_NOT */ char *key; /* For P_STR, P_EQ, P_NEQ */ char *val; /* P_EQ, P_NEQ */ }; /**************************************************************** * * prototype * */ private void Pinit(char *); private int Getc(void); private void Ungetc(void); private int token(char **); private struct pat *get_pat(void); private struct pat *exp_eq(struct pat *); private struct pat *exp_sq(struct pat *); private struct pat *exp_not(struct pat *); private struct pat *exp_lao(struct pat *, enum ptype); private struct pat *exp_exp(struct pat *); private struct pat *parse_pattern(char *); private int eval_exp(struct pat *); /**************************************************************** * * Utilities for lexical analyzer * */ char *Pvec; int Ppos; int Plim; private void Pinit(char *p) { Pvec = p; Ppos = 0; Plim = strlen(Pvec); } private int Getc() { if (Ppos < Plim) return Pvec[Ppos++]; else return EOF; /* Getc() is to be called even after Getc() returned EOF. */ } private void Ungetc() { if (Ppos > 0) Ppos--; else warn_exit("ungetc is impossible."); } /**************************************************************** * * Lexical analyzer * */ private char Keyval[BUFSIZ]; private int token(char **ret) { int c; int type = P_NUL, i = 0, quoted = NO; *ret = NULL; while ((c = Getc()) != EOF) { switch (c) { case SP: case TAB: continue; case '&': type = P_AND; break; case '|': type = P_OR; break; case '!': type = P_NOT; break; case EQ: type = P_EQ; break; case '(': return P_LSQ; case ')': return P_RSQ; break; case '"': type = P_STR; quoted = YES; break; case '\\': if ((c = Getc()) == EOF) warn_exit("broken escape."); /* fall through */ default: type = P_STR; Keyval[i++] = c; break; } break; } if (quoted == YES) { while ((c = Getc()) != EOF) { switch (c) { case '\\': if ((c = Getc()) == EOF) warn_exit("broken escape."); Keyval[i++] = c; break; case '"': goto allocstr; default: Keyval[i++] = c; break; } } warn_exit("broken quoted string."); } while ((c = Getc()) != EOF) { switch (c) { case SP: case TAB: break; case '&': if (type != P_AND) Ungetc(); break; case '|': if (type != P_OR) Ungetc(); break; case '!': Ungetc(); break; case EQ: if (type == P_EQ) { type = P_CEQ; break; } else if (type == P_NOT) { if ((c = Getc()) == EQ) { type = P_CNE; } else { type = P_NEQ; Ungetc(); } break; } else { Ungetc(); break; } case '(': Ungetc(); break; case ')': Ungetc(); break; case '\\': if (type != P_STR) { Ungetc(); break; } if ((c = Getc()) == EOF) warn_exit("broken escape."); /* fall through */ default: if (type != P_STR) { Ungetc(); break; } Keyval[i++] = c; continue; } break; } allocstr: if (type == P_STR) { Keyval[i] = NUL; STRDUP(*ret, Keyval); } return type; } /**************************************************************** * * Utilities for parser * */ private struct pat * get_pat() { struct pat *p; MALLOC(p, sizeof(struct pat)); memset(p, 0, sizeof(struct pat)); return p; } /**************************************************************** * * Parser * */ /* * Both key = val and key != val is the most strong. * This function assumes to be called just once as pre-process * before exp_exp(). * * P_STR P_EQ P_STR => P_EXP * key val v * P_EQ * key val */ private struct pat * exp_eq(struct pat *top) { struct pat *n, *p, *q = top; while (q != NULL) if (q->typ == P_EQ || q->typ == P_CEQ || q->typ == P_NEQ || q->typ == P_CNE) { if (q->prv == NULL || q->nxt == NULL) warn_exit("broken eq/neq."); if (q->prv->typ != P_STR || q->nxt->typ != P_STR) warn_exit("broken eq/neq."); n = get_pat(); p = q->prv; n->typ = q->typ; n->key = p->key; n->val = q->nxt->key; p->typ = P_EXP; p->dwn = n; p->key = NULL; q = q->nxt->nxt; if (q != NULL) q->prv = p; free(p->nxt->nxt); free(p->nxt); p->nxt = q; } else q = q->nxt; return top; } /* * Making square bracket to one P_EXP. * * X P_LSQ Y Z P_RSQ Z => X P_EXP Z * v * Y Z (will be parsed by exp_exp()) */ private struct pat * exp_sq(struct pat *top) { struct pat *p = NULL, *q = top, *n; int level = 0; while (q != NULL) { switch (q->typ) { case P_LSQ: if (level == 0) p = q; level++; break; case P_RSQ: level--; if (level < 0) warn_exit("too many ')'."); if (level == 0) { if (p->nxt == q) warn_exit("empty '()'."); n = p->nxt; n->prv = NULL; q->prv->nxt = NULL; n = exp_exp(n); if (p->prv == NULL) top = n; else { p->prv->nxt = n; n->prv = p->prv; free(p); } if (q->nxt == NULL) ; else { q->nxt->prv = n; n->nxt = q->nxt; free(q); } q = n->nxt; continue; } break; default: break; } q = q->nxt; } if (level > 0) warn_exit("too many '('."); return top; } /* * Binding logical not to the next one * * P_NOT P_EXP => P_EXP' * v * P_NOT * v * P_EXP * P_EXP is a result of exp_sq() or exp_eq(). */ private struct pat * exp_not(struct pat *top) { struct pat *n, *m, *p = top, *q; while (p != NULL) if (p->typ == P_NOT) { if ((q = p->nxt) == NULL) warn_exit("broken not."); if (q->typ != P_EXP) warn_exit("broken not."); n = get_pat(); m = get_pat(); p->dwn = n; n->typ = P_NOT; n->dwn = m; m->typ = P_EXP; m->dwn = q->dwn; p->typ = P_EXP; q = q->nxt; free(p->nxt); if (q != NULL) q->prv = p; p->nxt = q; p = q; } else p = p->nxt; return top; } /* Binding logical and/or to the previous one and the next one. * This is processed barkward from the tail so that the result * P_EXP can be evaluated naturally. * * P_EXP1 P_ANDa P_EXP2 P_ANDb P_EXP3 * * v * v * * P_EXP5 * v * P_ANDa P_EXP1 P_EXP4 * v * P_ANDb P_EXP2 P_EXP3 */ private struct pat * exp_lao(struct pat *top, enum ptype lao) { struct pat *p = top, *q, *r, *n; int count = 0; do { if (p->typ == lao) count++; q = p; p = p->nxt; } while (p != NULL); if (count == 0) return top; while (q != NULL) if (q->typ == lao) { p = q->prv; r = q->nxt; if (p == NULL || r == NULL) warn_exit("broken and/or."); if (p->typ != P_EXP || r->typ != P_EXP) warn_exit("broken and/or."); n = get_pat(); n->typ = P_EXP; n->prv = p->prv; n->nxt = r->nxt; n->dwn = p; if (p->prv != NULL) p->prv->nxt = n; if (r->nxt != NULL) r->nxt->prv = n; p->prv = NULL; r->nxt = NULL; /* swap p and q */ q->typ = P_EXP; q->dwn = p->dwn; p->typ = lao; p->dwn = NULL; top = n; q = n->prv; } else { top = q; q = q->prv; } return top; } /* * Creating an expression tree. * */ private struct pat * exp_exp(struct pat *top) { if (top == NULL) warn_exit("invalid pattern."); top = exp_sq(top); top = exp_not(top); top = exp_lao(top, P_AND); top = exp_lao(top, P_OR); return top; } /**************************************************************** * * Starter of the parser * */ private struct pat * parse_pattern(char *pattern) { enum ptype type; char *str; struct pat *top = NULL, *p = NULL, *q = NULL; Pinit(pattern); while ((type = token(&str)) != P_NUL) { p = get_pat(); p->typ = type; if (type == P_STR) p->key = str; if (top == NULL) top = p; else { q->nxt = p; p->prv = q; } q = p; } top = exp_eq(top); top = exp_exp(top); return top; } /**************************************************************** * * Evaluator of an expression tree * */ private int eval_exp(struct pat *p) { switch (p->typ) { case P_NOT: if (eval_exp(p->dwn) == TRUE) return FALSE; else return TRUE; case P_AND: if (eval_exp(p->nxt) == FALSE) return FALSE; if (eval_exp(p->nxt->nxt) == FALSE) return FALSE; return TRUE; case P_OR: if (eval_exp(p->nxt) == TRUE) return TRUE; if (eval_exp(p->nxt->nxt) == TRUE) return TRUE; return FALSE; #ifndef DEBUG case P_EQ: if ((search_string(p->key, p->val, NO)) == TRUE) return TRUE; else return FALSE; case P_CEQ: if ((search_string(p->key, p->val, YES)) == TRUE) return TRUE; else return FALSE; case P_NEQ: if ((search_string(p->key, p->val, NO)) == TRUE) return FALSE; else return TRUE; case P_CNE: if ((search_string(p->key, p->val, YES)) == TRUE) return FALSE; else return TRUE; #endif /* !DEBUG */ case P_EXP: return eval_exp(p->dwn); break; default: warn_exit("broken tree."); } return TRUE; /* never reached */ } /**************************************************************** * * External interface * */ private struct pat *Parsed_pattern; public void pattern_init(char *pattern) { Parsed_pattern = parse_pattern(pattern); } public int pattern_match() { return eval_exp(Parsed_pattern); } #ifdef DEBUG /**************************************************************** * * Visualizing parsed pattern * */ private void print_exp(struct pat *, int); #define leveling(n) {int i; for(i = 0; i < (n); i++) putchar(SP);} private void print_exp(struct pat *p, int level){ switch (p->typ) { case P_NOT: leveling(level); printf("!\n"); print_exp(p->dwn, level + 1); break; case P_AND: leveling(level); printf("&\n"); print_exp(p->nxt, level + 1); print_exp(p->nxt->nxt, level + 1); break; case P_OR: leveling(level); printf("|\n"); print_exp(p->nxt, level + 1); print_exp(p->nxt->nxt, level + 1); break; case P_EQ: leveling(level); printf("'%s' = '%s'\n", p->key, p->val); break; case P_NEQ: leveling(level); printf("'%s' != '%s'\n", p->key, p->val); break; case P_CEQ: leveling(level); printf("'%s' == '%s'\n", p->key, p->val); break; case P_CNE: leveling(level); printf("'%s' !== '%s'\n", p->key, p->val); break; case P_EXP: print_exp(p->dwn, level + 1); break; default: warn_exit("broken tree."); } } int main(int argc, char *argv[]) { char *progname = getprognm(argv[0]); struct pat *top; warn_prog = progname; if (argc != 2) warn_exit("argc != 2."); top = parse_pattern(argv[1]); print_exp(top, 0); exit(EXIT_SUCCESS); } #endif /* DEBUG */ /* * Copyright (C) 2000-2005 Mew developing team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * pattern.c ends here */ kazu-yamamoto-Mew-ff9c41b/bin/smew000077500000000000000000000103311256455547000172220ustar00rootroot00000000000000#!/usr/bin/env ruby # # smew.rb: Lookuping Message-ID: DB with Sqlite3 # begin require 'rubygems' gem 'sqlite3-ruby' rescue LoadError end require 'sqlite3' ################################################################ ## ## DB search ## def select_by_id(hash, db, id, mydir) ret = nil db.execute("SELECT * FROM mew WHERE (mew.id = ?);", id) do |ent| if push_results(hash, ent, mydir) ret = ent end end return ret end def select_by_parid(hash, db, id, mydir) ret = [] db.execute("SELECT * FROM mew WHERE (mew.parid = ?);", id) do |ent| if push_results(hash, ent, mydir) ret.push(ent) end end return ret end ################################################################ ## ## Results ## def push_results(hash, ent, mydir) if hash.key?(ent['id']) if File.dirname(ent['path']) == mydir hash.delete(ent['id']) hash[ent['id']] = ent end return nil else hash[ent['id']] = ent return true end end def print_results(hash) fin = hash.to_a.sort!{|a,b| a[1]['date'] <=> b[1]['date']} fin.each do |a| puts a[1]['path'] end end ################################################################ ## ## Search ## def search_me(hash, db, myid, mydir) ent = select_by_id(hash, db, myid, mydir) exit unless ent return ent end def search_ancestors(hash, db, parid, mydir) until parid == '' ent = select_by_id(hash, db, parid, mydir) break unless ent parid = ent['parid'] end end def search_descendants(hash, db, myid, mydir) parents = select_by_parid(hash, db, myid, mydir) while parents != [] children = [] parents.each do |ent| children += select_by_parid(hash, db, ent['id'], mydir) end parents = children end end def search_child(hash, db, myid, mydir) parents = select_by_parid(hash, db, [myid], mydir) exit unless parents != [] return parents[0] end ################################################################ ## ## Main ## require 'optparse' opts = {} OptionParser.new {|opt| begin opt.on('-p', 'search a parent message only') {|v| opts[:p] = v } opt.on('-c', 'search a child message only') {|v| opts[:c] = v } opt.parse!(ARGV) rescue OptionParser::ParseError => e puts opt exit end } myid = ARGV[0] mydb = ARGV[1] || File.expand_path('~/Mail/id.db') mydir = ARGV[2] db = SQLite3::Database.new(mydb) db.results_as_hash = true hash = {} begin if opts[:p] my = search_me(hash, db, myid, mydir) puts my['path']; elsif opts[:c] my = search_child(hash, db, myid, mydir) puts my['path']; else my = search_me(hash, db, myid, mydir) search_ancestors(hash, db, my['parid'], mydir) search_descendants(hash, db, myid, mydir) print_results(hash) end ensure db.close end # Copyright (C) 2008 Mew developing team. # All rights reserved. # # Redistribution and use in source and binary forms, with or without # modification, are permitted provided that the following conditions # are met: # # 1. Redistributions of source code must retain the above copyright # notice, this list of conditions and the following disclaimer. # 2. Redistributions in binary form must reproduce the above copyright # notice, this list of conditions and the following disclaimer in the # documentation and/or other materials provided with the distribution. # 3. Neither the name of the team nor the names of its contributors # may be used to endorse or promote products derived from this software # without specific prior written permission. # # THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND # ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE # IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR # PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE # LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR # CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF # SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR # BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE # OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN # IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. kazu-yamamoto-Mew-ff9c41b/bin/smew.1000066400000000000000000000016251256455547000173640ustar00rootroot00000000000000.\" Unlimited permission is granted to use, copy, distribute and/or modify .\" this file. There is NO WARRANTY. .TH SMEW 1 "February 17, 2008" .SH NAME smew - search related messages from Mew's database file .\" .SH SYNOPSIS smew .RI myid .RI [ mydb .RI [ mydir ]] .\" .SH DESCRIPTION The .B smew utility searches related messages from a Message-ID database file with SQLite 3 for Mew. .PP .I myid is a Message-ID of the message to search. .PP .I mydb is a database file name. (default: "~/Mail/id.db") .PP .I mydir is a directory part of the message in the database. Note that messages are contained as a relative path from "~/Mail". If multiple messages are found by .I myid , the first found one is preferred. However, the message whose directory is .I mydir is preferred to the first one. .\" .PP The options are as follows: .TP 8 .B \-c Search a parent message only. .TP 8 .B \-p Search a child message only. kazu-yamamoto-Mew-ff9c41b/bin/utils.c000066400000000000000000000100021256455547000176200ustar00rootroot00000000000000/* * utils.c * * Author: Kazu Yamamoto * Created: Sep 29, 2000 * * Code: */ #include "mew.h" #include #include #include #include #include #if !HAVE_MEMMOVE #define memmove(d, s, n) bcopy((s), (d), (n)) #endif char *warn_prog; public char * getprognm(char *filename) { char *p, *q; if ((p = strrchr(filename, FILESEP)) != NULL) p++; else p = filename; for (q = p; *q; q++) { *q = tolower(*q & 0xff); } return p; } public void warning(const char *fmt, ...) { va_list ap; if (warn_prog != NULL) fprintf(stderr, "%s: ", warn_prog); va_start(ap, fmt); if (fmt != NULL) vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); } public void warn_exit(const char *fmt, ...) { va_list ap; if (warn_prog != NULL) fprintf(stderr, "%s: ", warn_prog); va_start(ap, fmt); if (fmt != NULL) vfprintf(stderr, fmt, ap); va_end(ap); fprintf(stderr, "\n"); exit(EXIT_FAILURE); } #ifndef HAVE_SNPRINTF public int snprintf(char *buf, int len, const char *fmt, ...) { int ret; va_list ap; va_start(ap, fmt); ret = vsprintf(buf, fmt, ap); va_end(ap); return ret; } #endif #ifndef HAVE_FGETLN private char* fgetln(FILE *fp, size_t *len) { static size_t bufsize = 0; static char *buf = NULL; char tmp[BUFSIZ]; size_t readlen; if (buf == NULL) { bufsize = BUFSIZ; MALLOC(buf, bufsize); } *len = 0; while (1) { if (fgets(tmp, BUFSIZ, fp) == NULL) return NULL; readlen = strlen(tmp); if (*len + readlen > bufsize) { bufsize += BUFSIZ; REALLOC(buf, bufsize); } memmove(&buf[*len], tmp, readlen); *len += readlen; if (readlen < BUFSIZ - 1 || tmp[BUFSIZ - 2] == '\n') break; } return buf; } #endif char* Getline(FILE* fp) { char *s, *t; size_t len; if ((t = fgetln(fp, &len)) == NULL) return NULL; MALLOC(s, len+1); memmove(s, t, len); s[len] = '\0'; return s; } int Optind = 1; char *Optarg = NULL; public int Getopt(int argc, char *argv[], const char *fmt) { char *p, *q, c; Optarg = NULL; if (Optind >= argc) return EOF; p = argv[Optind]; if (*p++ != '-') return EOF; c = *p; if (c == NUL) return EOF; if (*(p + 1) != NUL) warn_exit("unknown long option '-%s'.", p); if ((q = strchr(fmt, c)) == NULL) warn_exit("unknown option '-%c'.", c); if (++q != NULL && *q == ':') { if (++Optind >= argc) warn_exit("no parameter for '-%c'.", c); Optarg = argv[Optind]; } Optind++; return c; } /* * Copyright (C) 2000-2005 Mew developing team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * utils.c ends here */ kazu-yamamoto-Mew-ff9c41b/bin/w32/000077500000000000000000000000001256455547000167365ustar00rootroot00000000000000kazu-yamamoto-Mew-ff9c41b/bin/w32/config.h000066400000000000000000000042341256455547000203570ustar00rootroot00000000000000#ifndef __CONFIG_H__ #define __CONFIG_H__ /* Define to empty if the keyword does not work. */ /* #undef const */ /* Define if you have the header file. */ #define HAVE_FCNTL_H 1 /* Define if you have the header file. */ #define HAVE_DIRENT_H 1 /* Define if you have the header file. */ #ifdef __BORLANDC__ #define HAVE_DIR_H 1 #endif /* Define if you have the header file. */ #ifdef _MSC_VER #define HAVE_DIRECT_H #endif /* Define if you have the header file. */ /* #undef HAVE_NDIR_H */ /* Define if you have the header file. */ /* #undef HAVE_SYS_DIR_H */ /* Define if you have the header file. */ /* #undef HAVE_SYS_NDIR_H */ /* Define if you have the header file. */ /* #define HAVE_UNISTD_H 1 */ /* Define if you have the header file. */ /* #define HAVE_PWD_H 1 */ /* Define if you have the header file. */ #define HAVE_IO_H 1 /* Define if you have the strncasecmp function. */ /* #define HAVE_STRNCASECMP 1 */ /* Define if you have the strnicmp function. */ #define HAVE_STRNICMP 1 /* Define if you have the fork function. */ /* #define HAVE_FORK 1 */ /* Define if you have the vfork function. */ /* #define HAVE_VFORK 1 */ /* Define if you have the getpwuid function. */ /* #define HAVE_GETPWUID 1 */ /* Define if you have the usleep function. */ /* #define HAVE_USLEEP 1 */ /* Define if you have the Sleep function. */ #define HAVE_SLEEP 1 /* Define if you have the memmove function. */ #define HAVE_MEMMOVE 1 /* Define if you have the poll function. */ /* #undef HAVE_POLL */ /* Define if you have the setmode function. */ #define HAVE_SETMODE 1 /* Define if you have the _setmode function. */ /* #undef HAVE__SETMODE */ /* Define if you have the chdir function. */ #define HAVE_CHDIR 1 /* Define if you have the _chdir2 function. */ /* #undef HAVE__CHDIR2 */ /* Define useconds_t as int if you don't have useconds_t */ #define useconds_t int /* Define if you have the z library (-lz). */ #define HAVE_LIBZ 1 /* generic windows header */ #include /* windows specific definitions */ #include #endif /* !__CONFIG_H__ */ kazu-yamamoto-Mew-ff9c41b/bin/w32/dirent.c000066400000000000000000000061031256455547000203670ustar00rootroot00000000000000/* * dirent.c * * Author: Shuichi Kitaguchi * Created: Jun 17, 2001 * Revised: * * Code: */ #include #include #include #include #include /* * XXX: these functions may return invalid errno. */ DIR * opendir(const char *filename) { DIR *dir; size_t len = strlen(filename); char *pt; dir = malloc(sizeof(DIR)); if (dir == NULL) return NULL; /* initialize DIR strucure */ memset(dir, 0, sizeof(DIR)); dir->hFind = INVALID_HANDLE_VALUE; if (strlen(filename) == 0){ strcpy(dir->dd_filename, "*.*"); } else { while ((pt=_mbschr(dir->dd_filename, '/')) != NULL ) *pt = '\\'; if (filename[len-1] == '\\') _snprintf(dir->dd_filename, sizeof(dir->dd_filename), "%s*.*", filename); else _snprintf(dir->dd_filename, sizeof(dir->dd_filename), "%s\\*.*", filename); } return dir; } struct dirent * readdir(DIR *dir) { WIN32_FIND_DATA wfd; if (dir->hFind == INVALID_HANDLE_VALUE){ dir->hFind = FindFirstFile(dir->dd_filename, &wfd); if (dir->hFind == INVALID_HANDLE_VALUE) return NULL; } else { if (!FindNextFile(dir->hFind, &wfd)) return NULL; } /* store file attributes */ dir->dir.d_ino++; /* XXX fake */ dir->dir.d_namlen = strlen(wfd.cFileName); strcpy(dir->dir.d_name, wfd.cFileName); return &dir->dir; } int closedir(DIR *dir) { if (dir->hFind != INVALID_HANDLE_VALUE) FindClose(dir->hFind); free(dir); return 0; } /* * Copyright (C) 2001-2003 Mew developing team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * dirent.c ends here */ kazu-yamamoto-Mew-ff9c41b/bin/w32/dirent.h000066400000000000000000000041731256455547000204010ustar00rootroot00000000000000/* * dirent.h * * Author: Shuichi Kitaguchi * Created: Jun 17, 2001 * Revised: * * Code: */ #ifndef __DIRENT_H__ #define __DIRENT_H__ /* * Structures */ #define d_ino d_fileno struct dirent { DWORD d_fileno; BYTE d_namlen; char d_name[MAX_PATH + 1]; }; typedef struct _DIR { struct dirent dir; HANDLE hFind; char dd_filename[MAX_PATH+1]; } DIR; /* * Functions */ DIR *opendir(const char *); struct dirent *readdir(DIR *); int closedir(DIR *); #endif /* __DIRENT_H__ */ /* * Copyright (C) 2001-2003 Mew developing team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * dirent.h ends here */ kazu-yamamoto-Mew-ff9c41b/bin/w32/w32.h000066400000000000000000000112551256455547000175260ustar00rootroot00000000000000/* * w32.h * * Author: Shuichi Kitaguchi * Created: Jun 17, 2001 * Revised: * * Code: */ /* * Typedefs, definitions and functions for Win32 environment. */ #ifndef __W32_H__ #define __W32_H__ /* includes */ #include /* for chdir()/mkdir()/... */ /* additional types for sys/types.h */ #ifndef _POSIX_SOURCE typedef unsigned char u_char; typedef unsigned short u_short; typedef unsigned int u_int; typedef unsigned long u_long; typedef unsigned short ushort; /* Sys V compatibility */ typedef unsigned int uint; /* Sys V compatibility */ #endif typedef unsigned char u_int8_t; typedef unsigned short u_int16_t; typedef unsigned long u_int32_t; typedef unsigned __int64 u_int64_t; typedef signed char int8_t; typedef signed short int16_t; typedef signed long int32_t; typedef signed __int64 int64_t; typedef u_int32_t pid_t; /* process ID */ /* Borland C++ has uid_t and gid_t. Why? */ #ifndef __BORLANDC__ typedef u_int32_t uid_t; /* user ID */ typedef u_int32_t gid_t; /* group ID */ #endif /* definitions */ #ifndef inline #define inline __inline #endif /* POSIX macros */ #include #ifndef S_IFLNK #define S_IFLNK 0120000 /* symbolic link */ #endif #ifndef S_ISUID #define S_ISUID 0004000 /* set user id on execution */ #endif #ifndef S_ISGID #define S_ISGID 0002000 /* set group id on execution */ #endif #ifndef S_IRWXU #define S_IRWXU 0000700 /* RWX for owner */ #endif #ifndef S_IRUSR #define S_IRUSR 0000400 /* R for owner */ #endif #ifndef S_IWUSR #define S_IWUSR 0000200 /* W for owner */ #endif #ifndef S_IXUSR #define S_IXUSR 0000100 /* E for owner */ #endif #ifndef S_IRWXG #define S_IRWXG 0000070 /* RWX for group */ #endif #ifndef S_IRGRP #define S_IRGRP 0000040 /* R for group */ #endif #ifndef S_IWGRP #define S_IWGRP 0000020 /* W for group */ #endif #ifndef S_IXGRP #define S_IXGRP 0000010 /* X for group */ #endif #ifndef S_IRWXO #define S_IRWXO 0000007 /* RWX for other */ #endif #ifndef S_IROTH #define S_IROTH 0000004 /* R for other */ #endif #ifndef S_IWOTH #define S_IWOTH 0000002 /* W for other */ #endif #ifndef S_IXOTH #define S_IXOTH 0000001 /* E for other */ #endif #ifndef S_ISDIR #define S_ISDIR(mode) (((mode)&(_S_IFMT))==(_S_IFDIR)) #endif #ifndef S_ISREG #define S_ISREG(mode) (((mode)&(_S_IFMT))==(_S_IFREG)) #endif /* supplements for string.h */ #define strcasecmp stricmp #define strncasecmp strnicmp #define snprintf _snprintf #if _MSC_VER < 1500 #define vsnprintf _vsnprintf #endif #define lstat stat size_t strlcpy(char *, const char*, size_t); size_t strlcat(char *, const char*, size_t); char *realpath(const char *, char*); #ifdef INET6 #include #else #include #endif int wsa_socketpair(SOCKET *); void wsa_create_terminal(SOCKET); char *wsa_strerror(int); void wsa_perror(char *); #define wsa_lasterror() WSAGetLastError() /* On Win32 environment, uid/gid does not exist. */ #define _W32_USER_ID 0 #define _W32_GROUP_ID 0 #endif /* __W32_H__ */ /* * Copyright (C) 2001-2003 Mew developing team. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. Neither the name of the team nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /* * w32.h ends here */ kazu-yamamoto-Mew-ff9c41b/configure000077500000000000000000002636471256455547000175040ustar00rootroot00000000000000#! /bin/sh # Guess values for system-dependent variables and create Makefiles. # Generated by GNU Autoconf 2.65. # # # Copyright (C) 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001, # 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 Free Software Foundation, # Inc. # # # This configure script is free software; the Free Software Foundation # gives unlimited permission to copy, distribute and modify it. ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH if test "x$CONFIG_SHELL" = x; then as_bourne_compatible="if test -n \"\${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on \${1+\"\$@\"}, which # is contrary to our usage. Disable this feature. alias -g '\${1+\"\$@\"}'='\"\$@\"' setopt NO_GLOB_SUBST else case \`(set -o) 2>/dev/null\` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi " as_required="as_fn_return () { (exit \$1); } as_fn_success () { as_fn_return 0; } as_fn_failure () { as_fn_return 1; } as_fn_ret_success () { return 0; } as_fn_ret_failure () { return 1; } exitcode=0 as_fn_success || { exitcode=1; echo as_fn_success failed.; } as_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; } as_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; } as_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; } if ( set x; as_fn_ret_success y && test x = \"\$1\" ); then : else exitcode=1; echo positional parameters were not saved. fi test x\$exitcode = x0 || exit 1" as_suggested=" as_lineno_1=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_1a=\$LINENO as_lineno_2=";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested" as_lineno_2a=\$LINENO eval 'test \"x\$as_lineno_1'\$as_run'\" != \"x\$as_lineno_2'\$as_run'\" && test \"x\`expr \$as_lineno_1'\$as_run' + 1\`\" = \"x\$as_lineno_2'\$as_run'\"' || exit 1" if (eval "$as_required") 2>/dev/null; then : as_have_required=yes else as_have_required=no fi if test x$as_have_required = xyes && (eval "$as_suggested") 2>/dev/null; then : else as_save_IFS=$IFS; IFS=$PATH_SEPARATOR as_found=false for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. as_found=: case $as_dir in #( /*) for as_base in sh bash ksh sh5; do # Try only shells that exist, to save several forks. as_shell=$as_dir/$as_base if { test -f "$as_shell" || test -f "$as_shell.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$as_shell"; } 2>/dev/null; then : CONFIG_SHELL=$as_shell as_have_required=yes if { $as_echo "$as_bourne_compatible""$as_suggested" | as_run=a "$as_shell"; } 2>/dev/null; then : break 2 fi fi done;; esac as_found=false done $as_found || { if { test -f "$SHELL" || test -f "$SHELL.exe"; } && { $as_echo "$as_bourne_compatible""$as_required" | as_run=a "$SHELL"; } 2>/dev/null; then : CONFIG_SHELL=$SHELL as_have_required=yes fi; } IFS=$as_save_IFS if test "x$CONFIG_SHELL" != x; then : # We cannot yet assume a decent shell, so we have to provide a # neutralization value for shells without unset; and this also # works around shells that cannot unset nonexistent variables. BASH_ENV=/dev/null ENV=/dev/null (unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV export CONFIG_SHELL exec "$CONFIG_SHELL" "$as_myself" ${1+"$@"} fi if test x$as_have_required = xno; then : $as_echo "$0: This script requires a shell more modern than all" $as_echo "$0: the shells that I found on your system." if test x${ZSH_VERSION+set} = xset ; then $as_echo "$0: In particular, zsh $ZSH_VERSION has bugs and should" $as_echo "$0: be upgraded to zsh 4.3.4 or later." else $as_echo "$0: Please tell bug-autoconf@gnu.org about your system, $0: including any error possibly output before this $0: message. Then install a modern shell, or manually run $0: the script under such a shell if you do have one." fi exit 1 fi fi fi SHELL=${CONFIG_SHELL-/bin/sh} export SHELL # Unset more variables known to interfere with behavior of common tools. CLICOLOR_FORCE= GREP_OPTIONS= unset CLICOLOR_FORCE GREP_OPTIONS ## --------------------- ## ## M4sh Shell Functions. ## ## --------------------- ## # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits as_lineno_1=$LINENO as_lineno_1a=$LINENO as_lineno_2=$LINENO as_lineno_2a=$LINENO eval 'test "x$as_lineno_1'$as_run'" != "x$as_lineno_2'$as_run'" && test "x`expr $as_lineno_1'$as_run' + 1`" = "x$as_lineno_2'$as_run'"' || { # Blame Lee E. McMahon (1931-1989) for sed's syntax. :-) sed -n ' p /[$]LINENO/= ' <$as_myself | sed ' s/[$]LINENO.*/&-/ t lineno b :lineno N :loop s/[$]LINENO\([^'$as_cr_alnum'_].*\n\)\(.*\)/\2\1\2/ t loop s/-\n.*// ' >$as_me.lineno && chmod +x "$as_me.lineno" || { $as_echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2; as_fn_exit 1; } # Don't try to exec as it changes $[0], causing all sort of problems # (the dirname of $[0] is not the place where we might find the # original and so on. Autoconf is especially sensitive to this). . "./$as_me.lineno" # Exit status is that of the last command. exit } ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" test -n "$DJDIR" || exec 7<&0 &1 # Name of the host. # hostname on some systems (SVR3.2, Linux) returns a bogus exit status, # so uname gets run too. ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` # # Initializations. # ac_default_prefix=/usr/local ac_clean_files= ac_config_libobj_dir=. LIBOBJS= cross_compiling=no subdirs= MFLAGS= MAKEFLAGS= # Identity of this package. PACKAGE_NAME= PACKAGE_TARNAME= PACKAGE_VERSION= PACKAGE_STRING= PACKAGE_BUGREPORT= PACKAGE_URL= ac_unique_file="mew.el" enable_option_checking=no ac_subst_vars='LTLIBOBJS LIBOBJS etcdir elispdir emacsbin subdirs target_alias host_alias build_alias LIBS ECHO_T ECHO_N ECHO_C DEFS mandir localedir libdir psdir pdfdir dvidir htmldir infodir docdir oldincludedir includedir localstatedir sharedstatedir sysconfdir datadir datarootdir libexecdir sbindir bindir program_transform_name prefix exec_prefix PACKAGE_URL PACKAGE_BUGREPORT PACKAGE_STRING PACKAGE_VERSION PACKAGE_TARNAME PACKAGE_NAME PATH_SEPARATOR SHELL' ac_subst_files='' ac_user_opts=' enable_option_checking with_emacs with_elispdir with_etcdir ' ac_precious_vars='build_alias host_alias target_alias' ac_subdirs_all='bin' # Initialize some variables set by options. ac_init_help= ac_init_version=false ac_unrecognized_opts= ac_unrecognized_sep= # The variables have the same names as the options, with # dashes changed to underlines. cache_file=/dev/null exec_prefix=NONE no_create= no_recursion= prefix=NONE program_prefix=NONE program_suffix=NONE program_transform_name=s,x,x, silent= site= srcdir= verbose= x_includes=NONE x_libraries=NONE # Installation directory options. # These are left unexpanded so users can "make install exec_prefix=/foo" # and all the variables that are supposed to be based on exec_prefix # by default will actually change. # Use braces instead of parens because sh, perl, etc. also accept them. # (The list follows the same order as the GNU Coding Standards.) bindir='${exec_prefix}/bin' sbindir='${exec_prefix}/sbin' libexecdir='${exec_prefix}/libexec' datarootdir='${prefix}/share' datadir='${datarootdir}' sysconfdir='${prefix}/etc' sharedstatedir='${prefix}/com' localstatedir='${prefix}/var' includedir='${prefix}/include' oldincludedir='/usr/include' docdir='${datarootdir}/doc/${PACKAGE}' infodir='${datarootdir}/info' htmldir='${docdir}' dvidir='${docdir}' pdfdir='${docdir}' psdir='${docdir}' libdir='${exec_prefix}/lib' localedir='${datarootdir}/locale' mandir='${datarootdir}/man' ac_prev= ac_dashdash= for ac_option do # If the previous option needs an argument, assign it. if test -n "$ac_prev"; then eval $ac_prev=\$ac_option ac_prev= continue fi case $ac_option in *=*) ac_optarg=`expr "X$ac_option" : '[^=]*=\(.*\)'` ;; *) ac_optarg=yes ;; esac # Accept the important Cygnus configure options, so we can diagnose typos. case $ac_dashdash$ac_option in --) ac_dashdash=yes ;; -bindir | --bindir | --bindi | --bind | --bin | --bi) ac_prev=bindir ;; -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) bindir=$ac_optarg ;; -build | --build | --buil | --bui | --bu) ac_prev=build_alias ;; -build=* | --build=* | --buil=* | --bui=* | --bu=*) build_alias=$ac_optarg ;; -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) cache_file=$ac_optarg ;; --config-cache | -C) cache_file=config.cache ;; -datadir | --datadir | --datadi | --datad) ac_prev=datadir ;; -datadir=* | --datadir=* | --datadi=* | --datad=*) datadir=$ac_optarg ;; -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \ | --dataroo | --dataro | --datar) ac_prev=datarootdir ;; -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \ | --dataroot=* | --dataroo=* | --dataro=* | --datar=*) datarootdir=$ac_optarg ;; -disable-* | --disable-*) ac_useropt=`expr "x$ac_option" : 'x-*disable-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=no ;; -docdir | --docdir | --docdi | --doc | --do) ac_prev=docdir ;; -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*) docdir=$ac_optarg ;; -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv) ac_prev=dvidir ;; -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*) dvidir=$ac_optarg ;; -enable-* | --enable-*) ac_useropt=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid feature name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "enable_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval enable_$ac_useropt=\$ac_optarg ;; -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ | --exec | --exe | --ex) ac_prev=exec_prefix ;; -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ | --exec=* | --exe=* | --ex=*) exec_prefix=$ac_optarg ;; -gas | --gas | --ga | --g) # Obsolete; use --with-gas. with_gas=yes ;; -help | --help | --hel | --he | -h) ac_init_help=long ;; -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) ac_init_help=recursive ;; -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) ac_init_help=short ;; -host | --host | --hos | --ho) ac_prev=host_alias ;; -host=* | --host=* | --hos=* | --ho=*) host_alias=$ac_optarg ;; -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht) ac_prev=htmldir ;; -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \ | --ht=*) htmldir=$ac_optarg ;; -includedir | --includedir | --includedi | --included | --include \ | --includ | --inclu | --incl | --inc) ac_prev=includedir ;; -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ | --includ=* | --inclu=* | --incl=* | --inc=*) includedir=$ac_optarg ;; -infodir | --infodir | --infodi | --infod | --info | --inf) ac_prev=infodir ;; -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) infodir=$ac_optarg ;; -libdir | --libdir | --libdi | --libd) ac_prev=libdir ;; -libdir=* | --libdir=* | --libdi=* | --libd=*) libdir=$ac_optarg ;; -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ | --libexe | --libex | --libe) ac_prev=libexecdir ;; -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ | --libexe=* | --libex=* | --libe=*) libexecdir=$ac_optarg ;; -localedir | --localedir | --localedi | --localed | --locale) ac_prev=localedir ;; -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*) localedir=$ac_optarg ;; -localstatedir | --localstatedir | --localstatedi | --localstated \ | --localstate | --localstat | --localsta | --localst | --locals) ac_prev=localstatedir ;; -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*) localstatedir=$ac_optarg ;; -mandir | --mandir | --mandi | --mand | --man | --ma | --m) ac_prev=mandir ;; -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) mandir=$ac_optarg ;; -nfp | --nfp | --nf) # Obsolete; use --without-fp. with_fp=no ;; -no-create | --no-create | --no-creat | --no-crea | --no-cre \ | --no-cr | --no-c | -n) no_create=yes ;; -no-recursion | --no-recursion | --no-recursio | --no-recursi \ | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) no_recursion=yes ;; -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ | --oldin | --oldi | --old | --ol | --o) ac_prev=oldincludedir ;; -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) oldincludedir=$ac_optarg ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) prefix=$ac_optarg ;; -program-prefix | --program-prefix | --program-prefi | --program-pref \ | --program-pre | --program-pr | --program-p) ac_prev=program_prefix ;; -program-prefix=* | --program-prefix=* | --program-prefi=* \ | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) program_prefix=$ac_optarg ;; -program-suffix | --program-suffix | --program-suffi | --program-suff \ | --program-suf | --program-su | --program-s) ac_prev=program_suffix ;; -program-suffix=* | --program-suffix=* | --program-suffi=* \ | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) program_suffix=$ac_optarg ;; -program-transform-name | --program-transform-name \ | --program-transform-nam | --program-transform-na \ | --program-transform-n | --program-transform- \ | --program-transform | --program-transfor \ | --program-transfo | --program-transf \ | --program-trans | --program-tran \ | --progr-tra | --program-tr | --program-t) ac_prev=program_transform_name ;; -program-transform-name=* | --program-transform-name=* \ | --program-transform-nam=* | --program-transform-na=* \ | --program-transform-n=* | --program-transform-=* \ | --program-transform=* | --program-transfor=* \ | --program-transfo=* | --program-transf=* \ | --program-trans=* | --program-tran=* \ | --progr-tra=* | --program-tr=* | --program-t=*) program_transform_name=$ac_optarg ;; -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd) ac_prev=pdfdir ;; -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*) pdfdir=$ac_optarg ;; -psdir | --psdir | --psdi | --psd | --ps) ac_prev=psdir ;; -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*) psdir=$ac_optarg ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) silent=yes ;; -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) ac_prev=sbindir ;; -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ | --sbi=* | --sb=*) sbindir=$ac_optarg ;; -sharedstatedir | --sharedstatedir | --sharedstatedi \ | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ | --sharedst | --shareds | --shared | --share | --shar \ | --sha | --sh) ac_prev=sharedstatedir ;; -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ | --sha=* | --sh=*) sharedstatedir=$ac_optarg ;; -site | --site | --sit) ac_prev=site ;; -site=* | --site=* | --sit=*) site=$ac_optarg ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) srcdir=$ac_optarg ;; -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ | --syscon | --sysco | --sysc | --sys | --sy) ac_prev=sysconfdir ;; -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) sysconfdir=$ac_optarg ;; -target | --target | --targe | --targ | --tar | --ta | --t) ac_prev=target_alias ;; -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) target_alias=$ac_optarg ;; -v | -verbose | --verbose | --verbos | --verbo | --verb) verbose=yes ;; -version | --version | --versio | --versi | --vers | -V) ac_init_version=: ;; -with-* | --with-*) ac_useropt=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=\$ac_optarg ;; -without-* | --without-*) ac_useropt=`expr "x$ac_option" : 'x-*without-\(.*\)'` # Reject names that are not valid shell variable names. expr "x$ac_useropt" : ".*[^-+._$as_cr_alnum]" >/dev/null && as_fn_error "invalid package name: $ac_useropt" ac_useropt_orig=$ac_useropt ac_useropt=`$as_echo "$ac_useropt" | sed 's/[-+.]/_/g'` case $ac_user_opts in *" "with_$ac_useropt" "*) ;; *) ac_unrecognized_opts="$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig" ac_unrecognized_sep=', ';; esac eval with_$ac_useropt=no ;; --x) # Obsolete; use --with-x. with_x=yes ;; -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ | --x-incl | --x-inc | --x-in | --x-i) ac_prev=x_includes ;; -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) x_includes=$ac_optarg ;; -x-libraries | --x-libraries | --x-librarie | --x-librari \ | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) ac_prev=x_libraries ;; -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) x_libraries=$ac_optarg ;; -*) as_fn_error "unrecognized option: \`$ac_option' Try \`$0 --help' for more information." ;; *=*) ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` # Reject names that are not valid shell variable names. case $ac_envvar in #( '' | [0-9]* | *[!_$as_cr_alnum]* ) as_fn_error "invalid variable name: \`$ac_envvar'" ;; esac eval $ac_envvar=\$ac_optarg export $ac_envvar ;; *) # FIXME: should be removed in autoconf 3.0. $as_echo "$as_me: WARNING: you should use --build, --host, --target" >&2 expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && $as_echo "$as_me: WARNING: invalid host type: $ac_option" >&2 : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} ;; esac done if test -n "$ac_prev"; then ac_option=--`echo $ac_prev | sed 's/_/-/g'` as_fn_error "missing argument to $ac_option" fi if test -n "$ac_unrecognized_opts"; then case $enable_option_checking in no) ;; fatal) as_fn_error "unrecognized options: $ac_unrecognized_opts" ;; *) $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2 ;; esac fi # Check all directory arguments for consistency. for ac_var in exec_prefix prefix bindir sbindir libexecdir datarootdir \ datadir sysconfdir sharedstatedir localstatedir includedir \ oldincludedir docdir infodir htmldir dvidir pdfdir psdir \ libdir localedir mandir do eval ac_val=\$$ac_var # Remove trailing slashes. case $ac_val in */ ) ac_val=`expr "X$ac_val" : 'X\(.*[^/]\)' \| "X$ac_val" : 'X\(.*\)'` eval $ac_var=\$ac_val;; esac # Be sure to have absolute directory names. case $ac_val in [\\/$]* | ?:[\\/]* ) continue;; NONE | '' ) case $ac_var in *prefix ) continue;; esac;; esac as_fn_error "expected an absolute directory name for --$ac_var: $ac_val" done # There might be people who depend on the old broken behavior: `$host' # used to hold the argument of --host etc. # FIXME: To remove some day. build=$build_alias host=$host_alias target=$target_alias # FIXME: To remove some day. if test "x$host_alias" != x; then if test "x$build_alias" = x; then cross_compiling=maybe $as_echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. If a cross compiler is detected then cross compile mode will be used." >&2 elif test "x$build_alias" != "x$host_alias"; then cross_compiling=yes fi fi ac_tool_prefix= test -n "$host_alias" && ac_tool_prefix=$host_alias- test "$silent" = yes && exec 6>/dev/null ac_pwd=`pwd` && test -n "$ac_pwd" && ac_ls_di=`ls -di .` && ac_pwd_ls_di=`cd "$ac_pwd" && ls -di .` || as_fn_error "working directory cannot be determined" test "X$ac_ls_di" = "X$ac_pwd_ls_di" || as_fn_error "pwd does not report name of working directory" # Find the source files, if location was not specified. if test -z "$srcdir"; then ac_srcdir_defaulted=yes # Try the directory containing this script, then the parent directory. ac_confdir=`$as_dirname -- "$as_myself" || $as_expr X"$as_myself" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_myself" : 'X\(//\)[^/]' \| \ X"$as_myself" : 'X\(//\)$' \| \ X"$as_myself" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_myself" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` srcdir=$ac_confdir if test ! -r "$srcdir/$ac_unique_file"; then srcdir=.. fi else ac_srcdir_defaulted=no fi if test ! -r "$srcdir/$ac_unique_file"; then test "$ac_srcdir_defaulted" = yes && srcdir="$ac_confdir or .." as_fn_error "cannot find sources ($ac_unique_file) in $srcdir" fi ac_msg="sources are in $srcdir, but \`cd $srcdir' does not work" ac_abs_confdir=`( cd "$srcdir" && test -r "./$ac_unique_file" || as_fn_error "$ac_msg" pwd)` # When building in place, set srcdir=. if test "$ac_abs_confdir" = "$ac_pwd"; then srcdir=. fi # Remove unnecessary trailing slashes from srcdir. # Double slashes in file names in object file debugging info # mess up M-x gdb in Emacs. case $srcdir in */) srcdir=`expr "X$srcdir" : 'X\(.*[^/]\)' \| "X$srcdir" : 'X\(.*\)'`;; esac for ac_var in $ac_precious_vars; do eval ac_env_${ac_var}_set=\${${ac_var}+set} eval ac_env_${ac_var}_value=\$${ac_var} eval ac_cv_env_${ac_var}_set=\${${ac_var}+set} eval ac_cv_env_${ac_var}_value=\$${ac_var} done # # Report the --help message. # if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF \`configure' configures this package to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... To assign environment variables (e.g., CC, CFLAGS...), specify them as VAR=VALUE. See below for descriptions of some of the useful variables. Defaults for the options are specified in brackets. Configuration: -h, --help display this help and exit --help=short display options specific to this package --help=recursive display the short help of all the included packages -V, --version display version information and exit -q, --quiet, --silent do not print \`checking...' messages --cache-file=FILE cache test results in FILE [disabled] -C, --config-cache alias for \`--cache-file=config.cache' -n, --no-create do not create output files --srcdir=DIR find the sources in DIR [configure dir or \`..'] Installation directories: --prefix=PREFIX install architecture-independent files in PREFIX [$ac_default_prefix] --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX [PREFIX] By default, \`make install' will install all the files in \`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify an installation prefix other than \`$ac_default_prefix' using \`--prefix', for instance \`--prefix=\$HOME'. For better control, use the options below. Fine tuning of the installation directories: --bindir=DIR user executables [EPREFIX/bin] --sbindir=DIR system admin executables [EPREFIX/sbin] --libexecdir=DIR program executables [EPREFIX/libexec] --sysconfdir=DIR read-only single-machine data [PREFIX/etc] --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] --localstatedir=DIR modifiable single-machine data [PREFIX/var] --libdir=DIR object code libraries [EPREFIX/lib] --includedir=DIR C header files [PREFIX/include] --oldincludedir=DIR C header files for non-gcc [/usr/include] --datarootdir=DIR read-only arch.-independent data root [PREFIX/share] --datadir=DIR read-only architecture-independent data [DATAROOTDIR] --infodir=DIR info documentation [DATAROOTDIR/info] --localedir=DIR locale-dependent data [DATAROOTDIR/locale] --mandir=DIR man documentation [DATAROOTDIR/man] --docdir=DIR documentation root [DATAROOTDIR/doc/PACKAGE] --htmldir=DIR html documentation [DOCDIR] --dvidir=DIR dvi documentation [DOCDIR] --pdfdir=DIR pdf documentation [DOCDIR] --psdir=DIR ps documentation [DOCDIR] _ACEOF cat <<\_ACEOF _ACEOF fi if test -n "$ac_init_help"; then cat <<\_ACEOF Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) --with-emacs=EMACS use EMACS --with-elispdir=DIR where elisp files should go --with-etcdir=DIR where etc files should go Report bugs to the package provider. _ACEOF ac_status=$? fi if test "$ac_init_help" = "recursive"; then # If there are subdirs, report their specific --help. for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue test -d "$ac_dir" || { cd "$srcdir" && ac_pwd=`pwd` && srcdir=. && test -d "$ac_dir"; } || continue ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" || { ac_status=$?; continue; } # Check for guested configure. if test -f "$ac_srcdir/configure.gnu"; then echo && $SHELL "$ac_srcdir/configure.gnu" --help=recursive elif test -f "$ac_srcdir/configure"; then echo && $SHELL "$ac_srcdir/configure" --help=recursive else $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 fi || ac_status=$? cd "$ac_pwd" || { ac_status=$?; break; } done fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF configure generated by GNU Autoconf 2.65 Copyright (C) 2009 Free Software Foundation, Inc. This configure script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it. _ACEOF exit fi ## ------------------------ ## ## Autoconf initialization. ## ## ------------------------ ## cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. It was created by $as_me, which was generated by GNU Autoconf 2.65. Invocation command line was $ $0 $@ _ACEOF exec 5>>config.log { cat <<_ASUNAME ## --------- ## ## Platform. ## ## --------- ## hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` uname -m = `(uname -m) 2>/dev/null || echo unknown` uname -r = `(uname -r) 2>/dev/null || echo unknown` uname -s = `(uname -s) 2>/dev/null || echo unknown` uname -v = `(uname -v) 2>/dev/null || echo unknown` /usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` /bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` /bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` /usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` /usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` /usr/bin/hostinfo = `(/usr/bin/hostinfo) 2>/dev/null || echo unknown` /bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` /usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` /bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` _ASUNAME as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. $as_echo "PATH: $as_dir" done IFS=$as_save_IFS } >&5 cat >&5 <<_ACEOF ## ----------- ## ## Core tests. ## ## ----------- ## _ACEOF # Keep a trace of the command line. # Strip out --no-create and --no-recursion so they do not pile up. # Strip out --silent because we don't want to record it for future runs. # Also quote any args containing shell meta-characters. # Make two passes to allow for proper duplicate-argument suppression. ac_configure_args= ac_configure_args0= ac_configure_args1= ac_must_keep_next=false for ac_pass in 1 2 do for ac_arg do case $ac_arg in -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil) continue ;; *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac case $ac_pass in 1) as_fn_append ac_configure_args0 " '$ac_arg'" ;; 2) as_fn_append ac_configure_args1 " '$ac_arg'" if test $ac_must_keep_next = true; then ac_must_keep_next=false # Got value, back to normal. else case $ac_arg in *=* | --config-cache | -C | -disable-* | --disable-* \ | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ | -with-* | --with-* | -without-* | --without-* | --x) case "$ac_configure_args0 " in "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; esac ;; -* ) ac_must_keep_next=true ;; esac fi as_fn_append ac_configure_args " '$ac_arg'" ;; esac done done { ac_configure_args0=; unset ac_configure_args0;} { ac_configure_args1=; unset ac_configure_args1;} # When interrupted or exit'd, cleanup temporary files, and complete # config.log. We remove comments because anyway the quotes in there # would cause problems or look ugly. # WARNING: Use '\'' to represent an apostrophe within the trap. # WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug. trap 'exit_status=$? # Save into config.log some information that might help in debugging. { echo cat <<\_ASBOX ## ---------------- ## ## Cache variables. ## ## ---------------- ## _ASBOX echo # The following way of writing the cache mishandles newlines in values, ( for ac_var in `(set) 2>&1 | sed -n '\''s/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'\''`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space='\'' '\''; set) 2>&1` in #( *${as_nl}ac_space=\ *) sed -n \ "s/'\''/'\''\\\\'\'''\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\''\\2'\''/p" ;; #( *) sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) echo cat <<\_ASBOX ## ----------------- ## ## Output variables. ## ## ----------------- ## _ASBOX echo for ac_var in $ac_subst_vars do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo if test -n "$ac_subst_files"; then cat <<\_ASBOX ## ------------------- ## ## File substitutions. ## ## ------------------- ## _ASBOX echo for ac_var in $ac_subst_files do eval ac_val=\$$ac_var case $ac_val in *\'\''*) ac_val=`$as_echo "$ac_val" | sed "s/'\''/'\''\\\\\\\\'\'''\''/g"`;; esac $as_echo "$ac_var='\''$ac_val'\''" done | sort echo fi if test -s confdefs.h; then cat <<\_ASBOX ## ----------- ## ## confdefs.h. ## ## ----------- ## _ASBOX echo cat confdefs.h echo fi test "$ac_signal" != 0 && $as_echo "$as_me: caught signal $ac_signal" $as_echo "$as_me: exit $exit_status" } >&5 rm -f core *.core core.conftest.* && rm -f -r conftest* confdefs* conf$$* $ac_clean_files && exit $exit_status ' 0 for ac_signal in 1 2 13 15; do trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal done ac_signal=0 # confdefs.h avoids OS command line length limits that DEFS can exceed. rm -f -r conftest* confdefs.h $as_echo "/* confdefs.h */" > confdefs.h # Predefined preprocessor variables. cat >>confdefs.h <<_ACEOF #define PACKAGE_NAME "$PACKAGE_NAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_TARNAME "$PACKAGE_TARNAME" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_VERSION "$PACKAGE_VERSION" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_STRING "$PACKAGE_STRING" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" _ACEOF cat >>confdefs.h <<_ACEOF #define PACKAGE_URL "$PACKAGE_URL" _ACEOF # Let the site file select an alternate cache file if it wants to. # Prefer an explicitly selected file to automatically selected ones. ac_site_file1=NONE ac_site_file2=NONE if test -n "$CONFIG_SITE"; then ac_site_file1=$CONFIG_SITE elif test "x$prefix" != xNONE; then ac_site_file1=$prefix/share/config.site ac_site_file2=$prefix/etc/config.site else ac_site_file1=$ac_default_prefix/share/config.site ac_site_file2=$ac_default_prefix/etc/config.site fi for ac_site_file in "$ac_site_file1" "$ac_site_file2" do test "x$ac_site_file" = xNONE && continue if test /dev/null != "$ac_site_file" && test -r "$ac_site_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file" >&5 $as_echo "$as_me: loading site script $ac_site_file" >&6;} sed 's/^/| /' "$ac_site_file" >&5 . "$ac_site_file" fi done if test -r "$cache_file"; then # Some versions of bash will fail to source /dev/null (special files # actually), so we avoid doing that. DJGPP emulates it as a regular file. if test /dev/null != "$cache_file" && test -f "$cache_file"; then { $as_echo "$as_me:${as_lineno-$LINENO}: loading cache $cache_file" >&5 $as_echo "$as_me: loading cache $cache_file" >&6;} case $cache_file in [\\/]* | ?:[\\/]* ) . "$cache_file";; *) . "./$cache_file";; esac fi else { $as_echo "$as_me:${as_lineno-$LINENO}: creating cache $cache_file" >&5 $as_echo "$as_me: creating cache $cache_file" >&6;} >$cache_file fi # Check that the precious variables saved in the cache have kept the same # value. ac_cache_corrupted=false for ac_var in $ac_precious_vars; do eval ac_old_set=\$ac_cv_env_${ac_var}_set eval ac_new_set=\$ac_env_${ac_var}_set eval ac_old_val=\$ac_cv_env_${ac_var}_value eval ac_new_val=\$ac_env_${ac_var}_value case $ac_old_set,$ac_new_set in set,) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} ac_cache_corrupted=: ;; ,set) { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' was not set in the previous run" >&5 $as_echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} ac_cache_corrupted=: ;; ,);; *) if test "x$ac_old_val" != "x$ac_new_val"; then # differences in whitespace do not lead to failure. ac_old_val_w=`echo x $ac_old_val` ac_new_val_w=`echo x $ac_new_val` if test "$ac_old_val_w" != "$ac_new_val_w"; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: \`$ac_var' has changed since the previous run:" >&5 $as_echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} ac_cache_corrupted=: else { $as_echo "$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&5 $as_echo "$as_me: warning: ignoring whitespace changes in \`$ac_var' since the previous run:" >&2;} eval $ac_var=\$ac_old_val fi { $as_echo "$as_me:${as_lineno-$LINENO}: former value: \`$ac_old_val'" >&5 $as_echo "$as_me: former value: \`$ac_old_val'" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: current value: \`$ac_new_val'" >&5 $as_echo "$as_me: current value: \`$ac_new_val'" >&2;} fi;; esac # Pass precious variables to config.status. if test "$ac_new_set" = set; then case $ac_new_val in *\'*) ac_arg=$ac_var=`$as_echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; *) ac_arg=$ac_var=$ac_new_val ;; esac case " $ac_configure_args " in *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. *) as_fn_append ac_configure_args " '$ac_arg'" ;; esac fi done if $ac_cache_corrupted; then { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5 $as_echo "$as_me: error: in \`$ac_pwd':" >&2;} { $as_echo "$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build" >&5 $as_echo "$as_me: error: changes in the environment can compromise the build" >&2;} as_fn_error "run \`make distclean' and/or \`rm $cache_file' and start over" "$LINENO" 5 fi ## -------------------- ## ## Main body of script. ## ## -------------------- ## ac_ext=c ac_cpp='$CPP $CPPFLAGS' ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' ac_compiler_gnu=$ac_cv_c_compiler_gnu ac_aux_dir= for ac_dir in "$srcdir" "$srcdir/.." "$srcdir/../.."; do for ac_t in install-sh install.sh shtool; do if test -f "$ac_dir/$ac_t"; then ac_aux_dir=$ac_dir ac_install_sh="$ac_aux_dir/$ac_t -c" break 2 fi done done if test -z "$ac_aux_dir"; then as_fn_error "cannot find install-sh, install.sh, or shtool in \"$srcdir\" \"$srcdir/..\" \"$srcdir/../..\"" "$LINENO" 5 fi # These three variables are undocumented and unsupported, # and are intended to be withdrawn in a future Autoconf release. # They can cause serious problems if a builder's source tree is in a directory # whose full name contains unusual characters. ac_config_guess="$SHELL $ac_aux_dir/config.guess" # Please don't use this var. ac_config_sub="$SHELL $ac_aux_dir/config.sub" # Please don't use this var. ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. subdirs="$subdirs bin" # Check whether --with-emacs was given. if test "${with_emacs+set}" = set; then : withval=$with_emacs; emacsbin="${withval}" fi # Check whether --with-elispdir was given. if test "${with_elispdir+set}" = set; then : withval=$with_elispdir; elispdir="${withval}" fi # Check whether --with-etcdir was given. if test "${with_etcdir+set}" = set; then : withval=$with_etcdir; etcdir="${withval}" fi if test -z "${emacsbin}"; then for ac_prog in emacs do # Extract the first word of "$ac_prog", so it can be a program name with args. set dummy $ac_prog; ac_word=$2 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 $as_echo_n "checking for $ac_word... " >&6; } if test "${ac_cv_path_emacsbin+set}" = set; then : $as_echo_n "(cached) " >&6 else case $emacsbin in [\\/]* | ?:[\\/]*) ac_cv_path_emacsbin="$emacsbin" # Let the user override the test with a path. ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. for ac_exec_ext in '' $ac_executable_extensions; do if { test -f "$as_dir/$ac_word$ac_exec_ext" && $as_test_x "$as_dir/$ac_word$ac_exec_ext"; }; then ac_cv_path_emacsbin="$as_dir/$ac_word$ac_exec_ext" $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 break 2 fi done done IFS=$as_save_IFS ;; esac fi emacsbin=$ac_cv_path_emacsbin if test -n "$emacsbin"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: $emacsbin" >&5 $as_echo "$emacsbin" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 $as_echo "no" >&6; } fi test -n "$emacsbin" && break done test -n "$emacsbin" || emacsbin="emacs" fi chk_prefix= if test "${datadir}" = "\${prefix}/share" && \ test -z "${elispdir}" -o -z "${etcdir}"; then chk_prefix=yes fi if test ! -x "${emacsbin}"; then chk_prefix= fi if test "${chk_prefix}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking for prefix of ${emacsbin}" >&5 $as_echo_n "checking for prefix of ${emacsbin}... " >&6; } if test "${emacsbin_cv_emacs_prefix+set}" = set; then : $as_echo_n "(cached) " >&6 else OUTPUT=./conftest-$$ echo ${emacsbin}' -q -no-site-file -batch -eval '\''(write-region (princ (expand-file-name ".." invocation-directory)) nil "'${OUTPUT}'" nil 5)'\' >& 5 2>&1 eval ${emacsbin}' -q -no-site-file -batch -eval '\''(write-region (princ (expand-file-name ".." invocation-directory)) nil "'${OUTPUT}'" nil 5)'\' >& 5 2>&1 retval="`cat ${OUTPUT}`" rm -f ${OUTPUT} emacsbin_cv_emacs_prefix="${retval}" fi emacs_prefix=${emacsbin_cv_emacs_prefix} { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${emacs_prefix}" >&5 $as_echo "${emacs_prefix}" >&6; } fi if test "${chk_prefix}" -a -z "${elispdir}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where lisp files should go" >&5 $as_echo_n "checking where lisp files should go... " >&6; } if test -d "${emacs_prefix}/share/emacs/site-lisp"; then elispdir="${emacs_prefix}/share/emacs/site-lisp/mew" fi if test "${elispdir}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${elispdir}" >&5 $as_echo "${elispdir}" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none (fall back to the default value)" >&5 $as_echo "none (fall back to the default value)" >&6; } fi fi if test -z "${elispdir}"; then elispdir="\${datadir}/emacs/site-lisp/mew" fi if test "${chk_prefix}" -a -z "${etcdir}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: checking where etc files should go" >&5 $as_echo_n "checking where etc files should go... " >&6; } if test -d "${emacs_prefix}/share/emacs/site-lisp"; then etcdir="${emacs_prefix}/share/emacs/site-lisp/mew/etc" fi if test "${etcdir}"; then { $as_echo "$as_me:${as_lineno-$LINENO}: result: ${etcdir}" >&5 $as_echo "${etcdir}" >&6; } else { $as_echo "$as_me:${as_lineno-$LINENO}: result: none (fall back to the default value)" >&5 $as_echo "none (fall back to the default value)" >&6; } fi fi if test -z "${etcdir}"; then etcdir="\${datadir}/emacs/site-lisp/mew/etc" fi ac_config_files="$ac_config_files Makefile" cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure # scripts and configure runs, see configure's option --config-cache. # It is not useful on other systems. If it contains results you don't # want to keep, you may remove or edit it. # # config.status only pays attention to the cache file if you give it # the --recheck option to rerun configure. # # `ac_cv_env_foo' variables (set or unset) will be overridden when # loading this file, other *unset* `ac_cv_foo' will be assigned the # following values. _ACEOF # The following way of writing the cache mishandles newlines in values, # but we know of no workaround that is simple, portable, and efficient. # So, we kill variables containing newlines. # Ultrix sh set writes to stderr and can't be redirected directly, # and sets the high bit in the cache file unless we assign to the vars. ( for ac_var in `(set) 2>&1 | sed -n 's/^\([a-zA-Z_][a-zA-Z0-9_]*\)=.*/\1/p'`; do eval ac_val=\$$ac_var case $ac_val in #( *${as_nl}*) case $ac_var in #( *_cv_*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline" >&5 $as_echo "$as_me: WARNING: cache variable $ac_var contains a newline" >&2;} ;; esac case $ac_var in #( _ | IFS | as_nl) ;; #( BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #( *) { eval $ac_var=; unset $ac_var;} ;; esac ;; esac done (set) 2>&1 | case $as_nl`(ac_space=' '; set) 2>&1` in #( *${as_nl}ac_space=\ *) # `set' does not quote correctly, so add quotes: double-quote # substitution turns \\\\ into \\, and sed turns \\ into \. sed -n \ "s/'/'\\\\''/g; s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" ;; #( *) # `set' quotes correctly as required by POSIX, so do not add quotes. sed -n "/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p" ;; esac | sort ) | sed ' /^ac_cv_env_/b end t clear :clear s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ t end s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ :end' >>confcache if diff "$cache_file" confcache >/dev/null 2>&1; then :; else if test -w "$cache_file"; then test "x$cache_file" != "x/dev/null" && { $as_echo "$as_me:${as_lineno-$LINENO}: updating cache $cache_file" >&5 $as_echo "$as_me: updating cache $cache_file" >&6;} cat confcache >$cache_file else { $as_echo "$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file" >&5 $as_echo "$as_me: not updating unwritable cache $cache_file" >&6;} fi fi rm -f confcache test "x$prefix" = xNONE && prefix=$ac_default_prefix # Let make expand exec_prefix. test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' # Transform confdefs.h into DEFS. # Protect against shell expansion while executing Makefile rules. # Protect against Makefile macro expansion. # # If the first sed substitution is executed (which looks for macros that # take arguments), then branch to the quote section. Otherwise, # look for a macro that doesn't take arguments. ac_script=' :mline /\\$/{ N s,\\\n,, b mline } t clear :clear s/^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*([^)]*)\)[ ]*\(.*\)/-D\1=\2/g t quote s/^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)/-D\1=\2/g t quote b any :quote s/[ `~#$^&*(){}\\|;'\''"<>?]/\\&/g s/\[/\\&/g s/\]/\\&/g s/\$/$$/g H :any ${ g s/^\n// s/\n/ /g p } ' DEFS=`sed -n "$ac_script" confdefs.h` ac_libobjs= ac_ltlibobjs= for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue # 1. Remove the extension, and $U if already installed. ac_script='s/\$U\././;s/\.o$//;s/\.obj$//' ac_i=`$as_echo "$ac_i" | sed "$ac_script"` # 2. Prepend LIBOBJDIR. When used with automake>=1.10 LIBOBJDIR # will be set to the directory where LIBOBJS objects are built. as_fn_append ac_libobjs " \${LIBOBJDIR}$ac_i\$U.$ac_objext" as_fn_append ac_ltlibobjs " \${LIBOBJDIR}$ac_i"'$U.lo' done LIBOBJS=$ac_libobjs LTLIBOBJS=$ac_ltlibobjs : ${CONFIG_STATUS=./config.status} ac_write_fail=0 ac_clean_files_save=$ac_clean_files ac_clean_files="$ac_clean_files $CONFIG_STATUS" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS" >&5 $as_echo "$as_me: creating $CONFIG_STATUS" >&6;} as_write_fail=0 cat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1 #! $SHELL # Generated by $as_me. # Run this file to recreate the current configuration. # Compiler output produced by configure, useful for debugging # configure, is in config.log if it exists. debug=false ac_cs_recheck=false ac_cs_silent=false SHELL=\${CONFIG_SHELL-$SHELL} export SHELL _ASEOF cat >>$CONFIG_STATUS <<\_ASEOF || as_write_fail=1 ## -------------------- ## ## M4sh Initialization. ## ## -------------------- ## # Be more Bourne compatible DUALCASE=1; export DUALCASE # for MKS sh if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then : emulate sh NULLCMD=: # Pre-4.2 versions of Zsh do word splitting on ${1+"$@"}, which # is contrary to our usage. Disable this feature. alias -g '${1+"$@"}'='"$@"' setopt NO_GLOB_SUBST else case `(set -o) 2>/dev/null` in #( *posix*) : set -o posix ;; #( *) : ;; esac fi as_nl=' ' export as_nl # Printing a long string crashes Solaris 7 /usr/bin/printf. as_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\' as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo as_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo # Prefer a ksh shell builtin over an external printf program on Solaris, # but without wasting forks for bash or zsh. if test -z "$BASH_VERSION$ZSH_VERSION" \ && (test "X`print -r -- $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='print -r --' as_echo_n='print -rn --' elif (test "X`printf %s $as_echo`" = "X$as_echo") 2>/dev/null; then as_echo='printf %s\n' as_echo_n='printf %s' else if test "X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`" = "X-n $as_echo"; then as_echo_body='eval /usr/ucb/echo -n "$1$as_nl"' as_echo_n='/usr/ucb/echo -n' else as_echo_body='eval expr "X$1" : "X\\(.*\\)"' as_echo_n_body='eval arg=$1; case $arg in #( *"$as_nl"*) expr "X$arg" : "X\\(.*\\)$as_nl"; arg=`expr "X$arg" : ".*$as_nl\\(.*\\)"`;; esac; expr "X$arg" : "X\\(.*\\)" | tr -d "$as_nl" ' export as_echo_n_body as_echo_n='sh -c $as_echo_n_body as_echo' fi export as_echo_body as_echo='sh -c $as_echo_body as_echo' fi # The user is always right. if test "${PATH_SEPARATOR+set}" != set; then PATH_SEPARATOR=: (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && { (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 || PATH_SEPARATOR=';' } fi # IFS # We need space, tab and new line, in precisely that order. Quoting is # there to prevent editors from complaining about space-tab. # (If _AS_PATH_WALK were called with IFS unset, it would disable word # splitting by setting IFS to empty value.) IFS=" "" $as_nl" # Find who we are. Look in the path if we contain no directory separator. case $0 in #(( *[\\/]* ) as_myself=$0 ;; *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break done IFS=$as_save_IFS ;; esac # We did not find ourselves, most probably we were run as `sh COMMAND' # in which case we are not to be found in the path. if test "x$as_myself" = x; then as_myself=$0 fi if test ! -f "$as_myself"; then $as_echo "$as_myself: error: cannot find myself; rerun with an absolute file name" >&2 exit 1 fi # Unset variables that we do not need and which cause bugs (e.g. in # pre-3.0 UWIN ksh). But do not cause bugs in bash 2.01; the "|| exit 1" # suppresses any "Segmentation fault" message there. '((' could # trigger a bug in pdksh 5.2.14. for as_var in BASH_ENV ENV MAIL MAILPATH do eval test x\${$as_var+set} = xset \ && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || : done PS1='$ ' PS2='> ' PS4='+ ' # NLS nuisances. LC_ALL=C export LC_ALL LANGUAGE=C export LANGUAGE # CDPATH. (unset CDPATH) >/dev/null 2>&1 && unset CDPATH # as_fn_error ERROR [LINENO LOG_FD] # --------------------------------- # Output "`basename $0`: error: ERROR" to stderr. If LINENO and LOG_FD are # provided, also output the error to LOG_FD, referencing LINENO. Then exit the # script with status $?, using 1 if that was 0. as_fn_error () { as_status=$?; test $as_status -eq 0 && as_status=1 if test "$3"; then as_lineno=${as_lineno-"$2"} as_lineno_stack=as_lineno_stack=$as_lineno_stack $as_echo "$as_me:${as_lineno-$LINENO}: error: $1" >&$3 fi $as_echo "$as_me: error: $1" >&2 as_fn_exit $as_status } # as_fn_error # as_fn_set_status STATUS # ----------------------- # Set $? to STATUS, without forking. as_fn_set_status () { return $1 } # as_fn_set_status # as_fn_exit STATUS # ----------------- # Exit the shell with STATUS, even in a "trap 0" or "set -e" context. as_fn_exit () { set +e as_fn_set_status $1 exit $1 } # as_fn_exit # as_fn_unset VAR # --------------- # Portably unset VAR. as_fn_unset () { { eval $1=; unset $1;} } as_unset=as_fn_unset # as_fn_append VAR VALUE # ---------------------- # Append the text in VALUE to the end of the definition contained in VAR. Take # advantage of any shell optimizations that allow amortized linear growth over # repeated appends, instead of the typical quadratic growth present in naive # implementations. if (eval "as_var=1; as_var+=2; test x\$as_var = x12") 2>/dev/null; then : eval 'as_fn_append () { eval $1+=\$2 }' else as_fn_append () { eval $1=\$$1\$2 } fi # as_fn_append # as_fn_arith ARG... # ------------------ # Perform arithmetic evaluation on the ARGs, and store the result in the # global $as_val. Take advantage of shells that can avoid forks. The arguments # must be portable across $(()) and expr. if (eval "test \$(( 1 + 1 )) = 2") 2>/dev/null; then : eval 'as_fn_arith () { as_val=$(( $* )) }' else as_fn_arith () { as_val=`expr "$@" || test $? -eq 1` } fi # as_fn_arith if expr a : '\(a\)' >/dev/null 2>&1 && test "X`expr 00001 : '.*\(...\)'`" = X001; then as_expr=expr else as_expr=false fi if (basename -- /) >/dev/null 2>&1 && test "X`basename -- / 2>&1`" = "X/"; then as_basename=basename else as_basename=false fi if (as_dir=`dirname -- /` && test "X$as_dir" = X/) >/dev/null 2>&1; then as_dirname=dirname else as_dirname=false fi as_me=`$as_basename -- "$0" || $as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ X"$0" : 'X\(//\)$' \| \ X"$0" : 'X\(/\)' \| . 2>/dev/null || $as_echo X/"$0" | sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q'` # Avoid depending upon Character Ranges. as_cr_letters='abcdefghijklmnopqrstuvwxyz' as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' as_cr_Letters=$as_cr_letters$as_cr_LETTERS as_cr_digits='0123456789' as_cr_alnum=$as_cr_Letters$as_cr_digits ECHO_C= ECHO_N= ECHO_T= case `echo -n x` in #((((( -n*) case `echo 'xy\c'` in *c*) ECHO_T=' ';; # ECHO_T is single tab character. xy) ECHO_C='\c';; *) echo `echo ksh88 bug on AIX 6.1` > /dev/null ECHO_T=' ';; esac;; *) ECHO_N='-n';; esac rm -f conf$$ conf$$.exe conf$$.file if test -d conf$$.dir; then rm -f conf$$.dir/conf$$.file else rm -f conf$$.dir mkdir conf$$.dir 2>/dev/null fi if (echo >conf$$.file) 2>/dev/null; then if ln -s conf$$.file conf$$ 2>/dev/null; then as_ln_s='ln -s' # ... but there are two gotchas: # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail. # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable. # In both cases, we have to default to `cp -p'. ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || as_ln_s='cp -p' elif ln conf$$.file conf$$ 2>/dev/null; then as_ln_s=ln else as_ln_s='cp -p' fi else as_ln_s='cp -p' fi rm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file rmdir conf$$.dir 2>/dev/null # as_fn_mkdir_p # ------------- # Create "$as_dir" as a directory, including parents if necessary. as_fn_mkdir_p () { case $as_dir in #( -*) as_dir=./$as_dir;; esac test -d "$as_dir" || eval $as_mkdir_p || { as_dirs= while :; do case $as_dir in #( *\'*) as_qdir=`$as_echo "$as_dir" | sed "s/'/'\\\\\\\\''/g"`;; #'( *) as_qdir=$as_dir;; esac as_dirs="'$as_qdir' $as_dirs" as_dir=`$as_dirname -- "$as_dir" || $as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$as_dir" : 'X\(//\)[^/]' \| \ X"$as_dir" : 'X\(//\)$' \| \ X"$as_dir" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$as_dir" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` test -d "$as_dir" && break done test -z "$as_dirs" || eval "mkdir $as_dirs" } || test -d "$as_dir" || as_fn_error "cannot create directory $as_dir" } # as_fn_mkdir_p if mkdir -p . 2>/dev/null; then as_mkdir_p='mkdir -p "$as_dir"' else test -d ./-p && rmdir ./-p as_mkdir_p=false fi if test -x / >/dev/null 2>&1; then as_test_x='test -x' else if ls -dL / >/dev/null 2>&1; then as_ls_L_option=L else as_ls_L_option= fi as_test_x=' eval sh -c '\'' if test -d "$1"; then test -d "$1/."; else case $1 in #( -*)set "./$1";; esac; case `ls -ld'$as_ls_L_option' "$1" 2>/dev/null` in #(( ???[sx]*):;;*)false;;esac;fi '\'' sh ' fi as_executable_p=$as_test_x # Sed expression to map a string onto a valid CPP name. as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" # Sed expression to map a string onto a valid variable name. as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" exec 6>&1 ## ----------------------------------- ## ## Main body of $CONFIG_STATUS script. ## ## ----------------------------------- ## _ASEOF test $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1 cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Save the log message, to keep $0 and so on meaningful, and to # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" This file was extended by $as_me, which was generated by GNU Autoconf 2.65. Invocation command line was CONFIG_FILES = $CONFIG_FILES CONFIG_HEADERS = $CONFIG_HEADERS CONFIG_LINKS = $CONFIG_LINKS CONFIG_COMMANDS = $CONFIG_COMMANDS $ $0 $@ on `(hostname || uname -n) 2>/dev/null | sed 1q` " _ACEOF case $ac_config_files in *" "*) set x $ac_config_files; shift; ac_config_files=$*;; esac cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 # Files that config.status was made for. config_files="$ac_config_files" _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 ac_cs_usage="\ \`$as_me' instantiates files and other configuration actions from templates according to the current configuration. Unless the files and actions are specified as TAGs, all are instantiated by default. Usage: $0 [OPTION]... [TAG]... -h, --help print this help, then exit -V, --version print version number and configuration settings, then exit --config print configuration, then exit -q, --quiet, --silent do not print progress messages -d, --debug don't remove temporary files --recheck update $as_me by reconfiguring in the same conditions --file=FILE[:TEMPLATE] instantiate the configuration file FILE Configuration files: $config_files Report bugs to the package provider." _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ config.status configured by $0, generated by GNU Autoconf 2.65, with options \\"\$ac_cs_config\\" Copyright (C) 2009 Free Software Foundation, Inc. This config.status script is free software; the Free Software Foundation gives unlimited permission to copy, distribute and modify it." ac_pwd='$ac_pwd' srcdir='$srcdir' test -n "\$AWK" || AWK=awk _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # The default lists apply if the user does not specify any file. ac_need_defaults=: while test $# != 0 do case $1 in --*=*) ac_option=`expr "X$1" : 'X\([^=]*\)='` ac_optarg=`expr "X$1" : 'X[^=]*=\(.*\)'` ac_shift=: ;; *) ac_option=$1 ac_optarg=$2 ac_shift=shift ;; esac case $ac_option in # Handling of the options. -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) ac_cs_recheck=: ;; --version | --versio | --versi | --vers | --ver | --ve | --v | -V ) $as_echo "$ac_cs_version"; exit ;; --config | --confi | --conf | --con | --co | --c ) $as_echo "$ac_cs_config"; exit ;; --debug | --debu | --deb | --de | --d | -d ) debug=: ;; --file | --fil | --fi | --f ) $ac_shift case $ac_optarg in *\'*) ac_optarg=`$as_echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append CONFIG_FILES " '$ac_optarg'" ac_need_defaults=false;; --he | --h | --help | --hel | -h ) $as_echo "$ac_cs_usage"; exit ;; -q | -quiet | --quiet | --quie | --qui | --qu | --q \ | -silent | --silent | --silen | --sile | --sil | --si | --s) ac_cs_silent=: ;; # This is an error. -*) as_fn_error "unrecognized option: \`$1' Try \`$0 --help' for more information." ;; *) as_fn_append ac_config_targets " $1" ac_need_defaults=false ;; esac shift done ac_configure_extra_args= if $ac_cs_silent; then exec 6>/dev/null ac_configure_extra_args="$ac_configure_extra_args --silent" fi _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 if \$ac_cs_recheck; then set X '$SHELL' '$0' $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion shift \$as_echo "running CONFIG_SHELL=$SHELL \$*" >&6 CONFIG_SHELL='$SHELL' export CONFIG_SHELL exec "\$@" fi _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 exec 5>>config.log { echo sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX ## Running $as_me. ## _ASBOX $as_echo "$ac_log" } >&5 _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # Handling of arguments. for ac_config_target in $ac_config_targets do case $ac_config_target in "Makefile") CONFIG_FILES="$CONFIG_FILES Makefile" ;; *) as_fn_error "invalid argument: \`$ac_config_target'" "$LINENO" 5;; esac done # If the user did not use the arguments to specify the items to instantiate, # then the envvar interface is used. Set only those that are not. # We use the long form for the default assignment because of an extremely # bizarre bug on SunOS 4.1.3. if $ac_need_defaults; then test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files fi # Have a temporary directory for convenience. Make it in the build tree # simply because there is no reason against having it here, and in addition, # creating and moving files from /tmp can sometimes cause problems. # Hook for its removal unless debugging. # Note that there is a small window in which the directory will not be cleaned: # after its creation but before its name has been assigned to `$tmp'. $debug || { tmp= trap 'exit_status=$? { test -z "$tmp" || test ! -d "$tmp" || rm -fr "$tmp"; } && exit $exit_status ' 0 trap 'as_fn_exit 1' 1 2 13 15 } # Create a (secure) tmp directory for tmp files. { tmp=`(umask 077 && mktemp -d "./confXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" } || { tmp=./conf$$-$RANDOM (umask 077 && mkdir "$tmp") } || as_fn_error "cannot create a temporary directory in ." "$LINENO" 5 # Set up the scripts for CONFIG_FILES section. # No need to generate them if there are no CONFIG_FILES. # This happens for instance with `./config.status config.h'. if test -n "$CONFIG_FILES"; then ac_cr=`echo X | tr X '\015'` # On cygwin, bash can eat \r inside `` if the user requested igncr. # But we know of no other shell where ac_cr would be empty at this # point, so we can use a bashism as a fallback. if test "x$ac_cr" = x; then eval ac_cr=\$\'\\r\' fi ac_cs_awk_cr=`$AWK 'BEGIN { print "a\rb" }' /dev/null` if test "$ac_cs_awk_cr" = "a${ac_cr}b"; then ac_cs_awk_cr='\r' else ac_cs_awk_cr=$ac_cr fi echo 'BEGIN {' >"$tmp/subs1.awk" && _ACEOF { echo "cat >conf$$subs.awk <<_ACEOF" && echo "$ac_subst_vars" | sed 's/.*/&!$&$ac_delim/' && echo "_ACEOF" } >conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_num=`echo "$ac_subst_vars" | grep -c '$'` ac_delim='%!_!# ' for ac_last_try in false false false false false :; do . ./conf$$subs.sh || as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 ac_delim_n=`sed -n "s/.*$ac_delim\$/X/p" conf$$subs.awk | grep -c X` if test $ac_delim_n = $ac_delim_num; then break elif $ac_last_try; then as_fn_error "could not make $CONFIG_STATUS" "$LINENO" 5 else ac_delim="$ac_delim!$ac_delim _$ac_delim!! " fi done rm -f conf$$subs.sh cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 cat >>"\$tmp/subs1.awk" <<\\_ACAWK && _ACEOF sed -n ' h s/^/S["/; s/!.*/"]=/ p g s/^[^!]*!// :repl t repl s/'"$ac_delim"'$// t delim :nl h s/\(.\{148\}\)..*/\1/ t more1 s/["\\]/\\&/g; s/^/"/; s/$/\\n"\\/ p n b repl :more1 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t nl :delim h s/\(.\{148\}\)..*/\1/ t more2 s/["\\]/\\&/g; s/^/"/; s/$/"/ p b :more2 s/["\\]/\\&/g; s/^/"/; s/$/"\\/ p g s/.\{148\}// t delim ' >$CONFIG_STATUS || ac_write_fail=1 rm -f conf$$subs.awk cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 _ACAWK cat >>"\$tmp/subs1.awk" <<_ACAWK && for (key in S) S_is_set[key] = 1 FS = "" } { line = $ 0 nfields = split(line, field, "@") substed = 0 len = length(field[1]) for (i = 2; i < nfields; i++) { key = field[i] keylen = length(key) if (S_is_set[key]) { value = S[key] line = substr(line, 1, len) "" value "" substr(line, len + keylen + 3) len += length(value) + length(field[++i]) substed = 1 } else len += 1 + keylen } print line } _ACAWK _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 if sed "s/$ac_cr//" < /dev/null > /dev/null 2>&1; then sed "s/$ac_cr\$//; s/$ac_cr/$ac_cs_awk_cr/g" else cat fi < "$tmp/subs1.awk" > "$tmp/subs.awk" \ || as_fn_error "could not setup config files machinery" "$LINENO" 5 _ACEOF # VPATH may cause trouble with some makes, so we remove $(srcdir), # ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and # trailing colons and then remove the whole line if VPATH becomes empty # (actually we leave an empty line to preserve line numbers). if test "x$srcdir" = x.; then ac_vpsub='/^[ ]*VPATH[ ]*=/{ s/:*\$(srcdir):*/:/ s/:*\${srcdir}:*/:/ s/:*@srcdir@:*/:/ s/^\([^=]*=[ ]*\):*/\1/ s/:*$// s/^[^=]*=[ ]*$// }' fi cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 fi # test -n "$CONFIG_FILES" eval set X " :F $CONFIG_FILES " shift for ac_tag do case $ac_tag in :[FHLC]) ac_mode=$ac_tag; continue;; esac case $ac_mode$ac_tag in :[FHL]*:*);; :L* | :C*:*) as_fn_error "invalid tag \`$ac_tag'" "$LINENO" 5;; :[FH]-) ac_tag=-:-;; :[FH]*) ac_tag=$ac_tag:$ac_tag.in;; esac ac_save_IFS=$IFS IFS=: set x $ac_tag IFS=$ac_save_IFS shift ac_file=$1 shift case $ac_mode in :L) ac_source=$1;; :[FH]) ac_file_inputs= for ac_f do case $ac_f in -) ac_f="$tmp/stdin";; *) # Look for the file first in the build tree, then in the source tree # (if the path is not absolute). The absolute path cannot be DOS-style, # because $ac_f cannot contain `:'. test -f "$ac_f" || case $ac_f in [\\/$]*) false;; *) test -f "$srcdir/$ac_f" && ac_f="$srcdir/$ac_f";; esac || as_fn_error "cannot find input file: \`$ac_f'" "$LINENO" 5;; esac case $ac_f in *\'*) ac_f=`$as_echo "$ac_f" | sed "s/'/'\\\\\\\\''/g"`;; esac as_fn_append ac_file_inputs " '$ac_f'" done # Let's still pretend it is `configure' which instantiates (i.e., don't # use $as_me), people would be surprised to read: # /* config.h. Generated by config.status. */ configure_input='Generated from '` $as_echo "$*" | sed 's|^[^:]*/||;s|:[^:]*/|, |g' `' by configure.' if test x"$ac_file" != x-; then configure_input="$ac_file. $configure_input" { $as_echo "$as_me:${as_lineno-$LINENO}: creating $ac_file" >&5 $as_echo "$as_me: creating $ac_file" >&6;} fi # Neutralize special characters interpreted by sed in replacement strings. case $configure_input in #( *\&* | *\|* | *\\* ) ac_sed_conf_input=`$as_echo "$configure_input" | sed 's/[\\\\&|]/\\\\&/g'`;; #( *) ac_sed_conf_input=$configure_input;; esac case $ac_tag in *:-:* | *:-) cat >"$tmp/stdin" \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; esac ;; esac ac_dir=`$as_dirname -- "$ac_file" || $as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ X"$ac_file" : 'X\(//\)[^/]' \| \ X"$ac_file" : 'X\(//\)$' \| \ X"$ac_file" : 'X\(/\)' \| . 2>/dev/null || $as_echo X"$ac_file" | sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/ q } /^X\(\/\/\)[^/].*/{ s//\1/ q } /^X\(\/\/\)$/{ s//\1/ q } /^X\(\/\).*/{ s//\1/ q } s/.*/./; q'` as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix case $ac_mode in :F) # # CONFIG_FILE # _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # If the template does not know about datarootdir, expand it. # FIXME: This hack should be removed a few years after 2.60. ac_datarootdir_hack=; ac_datarootdir_seen= ac_sed_dataroot=' /datarootdir/ { p q } /@datadir@/p /@docdir@/p /@infodir@/p /@localedir@/p /@mandir@/p' case `eval "sed -n \"\$ac_sed_dataroot\" $ac_file_inputs"` in *datarootdir*) ac_datarootdir_seen=yes;; *@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*) { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&5 $as_echo "$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting" >&2;} _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_datarootdir_hack=' s&@datadir@&$datadir&g s&@docdir@&$docdir&g s&@infodir@&$infodir&g s&@localedir@&$localedir&g s&@mandir@&$mandir&g s&\\\${datarootdir}&$datarootdir&g' ;; esac _ACEOF # Neutralize VPATH when `$srcdir' = `.'. # Shell code in configure.ac might set extrasub. # FIXME: do we really want to maintain this feature? cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_sed_extra="$ac_vpsub $extrasub _ACEOF cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 :t /@[a-zA-Z_][a-zA-Z_0-9]*@/!b s|@configure_input@|$ac_sed_conf_input|;t t s&@top_builddir@&$ac_top_builddir_sub&;t t s&@top_build_prefix@&$ac_top_build_prefix&;t t s&@srcdir@&$ac_srcdir&;t t s&@abs_srcdir@&$ac_abs_srcdir&;t t s&@top_srcdir@&$ac_top_srcdir&;t t s&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t s&@builddir@&$ac_builddir&;t t s&@abs_builddir@&$ac_abs_builddir&;t t s&@abs_top_builddir@&$ac_abs_top_builddir&;t t $ac_datarootdir_hack " eval sed \"\$ac_sed_extra\" "$ac_file_inputs" | $AWK -f "$tmp/subs.awk" >$tmp/out \ || as_fn_error "could not create $ac_file" "$LINENO" 5 test -z "$ac_datarootdir_hack$ac_datarootdir_seen" && { ac_out=`sed -n '/\${datarootdir}/p' "$tmp/out"`; test -n "$ac_out"; } && { ac_out=`sed -n '/^[ ]*datarootdir[ ]*:*=/p' "$tmp/out"`; test -z "$ac_out"; } && { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&5 $as_echo "$as_me: WARNING: $ac_file contains a reference to the variable \`datarootdir' which seems to be undefined. Please make sure it is defined." >&2;} rm -f "$tmp/stdin" case $ac_file in -) cat "$tmp/out" && rm -f "$tmp/out";; *) rm -f "$ac_file" && mv "$tmp/out" "$ac_file";; esac \ || as_fn_error "could not create $ac_file" "$LINENO" 5 ;; esac done # for ac_tag as_fn_exit 0 _ACEOF ac_clean_files=$ac_clean_files_save test $ac_write_fail = 0 || as_fn_error "write failure creating $CONFIG_STATUS" "$LINENO" 5 # configure is writing to config.log, and then calls config.status. # config.status does its own redirection, appending to config.log. # Unfortunately, on DOS this fails, as config.log is still kept open # by configure, so config.status won't be able to write to it; its # output is simply discarded. So we exec the FD to /dev/null, # effectively closing config.log, so it can be properly (re)opened and # appended to by config.status. When coming back to configure, we # need to make the FD available again. if test "$no_create" != yes; then ac_cs_success=: ac_config_status_args= test "$silent" = yes && ac_config_status_args="$ac_config_status_args --quiet" exec 5>/dev/null $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false exec 5>>config.log # Use ||, not &&, to avoid exiting from the if with $? = 1, which # would make configure fail if this is the last instruction. $ac_cs_success || as_fn_exit $? fi # # CONFIG_SUBDIRS section. # if test "$no_recursion" != yes; then # Remove --cache-file, --srcdir, and --disable-option-checking arguments # so they do not pile up. ac_sub_configure_args= ac_prev= eval "set x $ac_configure_args" shift for ac_arg do if test -n "$ac_prev"; then ac_prev= continue fi case $ac_arg in -cache-file | --cache-file | --cache-fil | --cache-fi \ | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) ac_prev=cache_file ;; -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \ | --c=*) ;; --config-cache | -C) ;; -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) ac_prev=srcdir ;; -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) ;; -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) ac_prev=prefix ;; -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) ;; --disable-option-checking) ;; *) case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac as_fn_append ac_sub_configure_args " '$ac_arg'" ;; esac done # Always prepend --prefix to ensure using the same prefix # in subdir configurations. ac_arg="--prefix=$prefix" case $ac_arg in *\'*) ac_arg=`$as_echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; esac ac_sub_configure_args="'$ac_arg' $ac_sub_configure_args" # Pass --silent if test "$silent" = yes; then ac_sub_configure_args="--silent $ac_sub_configure_args" fi # Always prepend --disable-option-checking to silence warnings, since # different subdirs can have different --enable and --with options. ac_sub_configure_args="--disable-option-checking $ac_sub_configure_args" ac_popdir=`pwd` for ac_dir in : $subdirs; do test "x$ac_dir" = x: && continue # Do not complain, so a configure script can configure whichever # parts of a large source tree are present. test -d "$srcdir/$ac_dir" || continue ac_msg="=== configuring in $ac_dir (`pwd`/$ac_dir)" $as_echo "$as_me:${as_lineno-$LINENO}: $ac_msg" >&5 $as_echo "$ac_msg" >&6 as_dir="$ac_dir"; as_fn_mkdir_p ac_builddir=. case "$ac_dir" in .) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_dir_suffix=/`$as_echo "$ac_dir" | sed 's|^\.[\\/]||'` # A ".." for each directory in $ac_dir_suffix. ac_top_builddir_sub=`$as_echo "$ac_dir_suffix" | sed 's|/[^\\/]*|/..|g;s|/||'` case $ac_top_builddir_sub in "") ac_top_builddir_sub=. ac_top_build_prefix= ;; *) ac_top_build_prefix=$ac_top_builddir_sub/ ;; esac ;; esac ac_abs_top_builddir=$ac_pwd ac_abs_builddir=$ac_pwd$ac_dir_suffix # for backward compatibility: ac_top_builddir=$ac_top_build_prefix case $srcdir in .) # We are building in place. ac_srcdir=. ac_top_srcdir=$ac_top_builddir_sub ac_abs_top_srcdir=$ac_pwd ;; [\\/]* | ?:[\\/]* ) # Absolute name. ac_srcdir=$srcdir$ac_dir_suffix; ac_top_srcdir=$srcdir ac_abs_top_srcdir=$srcdir ;; *) # Relative name. ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix ac_top_srcdir=$ac_top_build_prefix$srcdir ac_abs_top_srcdir=$ac_pwd/$srcdir ;; esac ac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix cd "$ac_dir" # Check for guested configure; otherwise get Cygnus style configure. if test -f "$ac_srcdir/configure.gnu"; then ac_sub_configure=$ac_srcdir/configure.gnu elif test -f "$ac_srcdir/configure"; then ac_sub_configure=$ac_srcdir/configure elif test -f "$ac_srcdir/configure.in"; then # This should be Cygnus configure. ac_sub_configure=$ac_aux_dir/configure else { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir" >&5 $as_echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2;} ac_sub_configure= fi # The recursion is here. if test -n "$ac_sub_configure"; then # Make the cache file name correct relative to the subdirectory. case $cache_file in [\\/]* | ?:[\\/]* ) ac_sub_cache_file=$cache_file ;; *) # Relative name. ac_sub_cache_file=$ac_top_build_prefix$cache_file ;; esac { $as_echo "$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&5 $as_echo "$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir" >&6;} # The eval makes quoting arguments work. eval "\$SHELL \"\$ac_sub_configure\" $ac_sub_configure_args \ --cache-file=\"\$ac_sub_cache_file\" --srcdir=\"\$ac_srcdir\"" || as_fn_error "$ac_sub_configure failed for $ac_dir" "$LINENO" 5 fi cd "$ac_popdir" done fi if test -n "$ac_unrecognized_opts" && test "$enable_option_checking" != no; then { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts" >&5 $as_echo "$as_me: WARNING: unrecognized options: $ac_unrecognized_opts" >&2;} fi echo_value () { case "$1" in *\$*) eval "echo_value \"$1\"" ;; *) echo "$1" ;; esac } echo echo "***************************" echo " Mew configuration results" echo "***************************" echo echo $ECHO_N "use emacs : $ECHO_C"; echo_value "${emacsbin}" echo $ECHO_N "elisp files should go : $ECHO_C"; echo_value "${elispdir}" echo $ECHO_N "etc files should go : $ECHO_C"; echo_value "${etcdir}" echo $ECHO_N "exec files should go : $ECHO_C"; echo_value "${bindir}" echo $ECHO_N "info files should go : $ECHO_C"; echo_value "${infodir}" echo $ECHO_N "man files should go : $ECHO_C"; echo_value "${mandir}/man1" echo echo "Then type 'make' and 'make install'." echo "For Japanese environment, also 'make install-jinfo'." echo kazu-yamamoto-Mew-ff9c41b/configure.in000066400000000000000000000056371256455547000200770ustar00rootroot00000000000000AC_INIT(mew.el) AC_CONFIG_SUBDIRS(bin) AC_ARG_WITH(emacs, [ --with-emacs=EMACS use EMACS], emacsbin="${withval}") AC_SUBST(emacsbin) AC_ARG_WITH(elispdir, [ --with-elispdir=DIR where elisp files should go], elispdir="${withval}") AC_SUBST(elispdir) AC_ARG_WITH(etcdir, [ --with-etcdir=DIR where etc files should go], etcdir="${withval}") AC_SUBST(etcdir) if test -z "${emacsbin}"; then AC_PATH_PROGS(emacsbin, emacs, emacs) fi chk_prefix= if test "${datadir}" = "\${prefix}/share" && \ test -z "${elispdir}" -o -z "${etcdir}"; then chk_prefix=yes fi if test ! -x "${emacsbin}"; then chk_prefix= fi if test "${chk_prefix}"; then AC_MSG_CHECKING(for prefix of ${emacsbin}) AC_CACHE_VAL(emacsbin_cv_emacs_prefix,[ OUTPUT=./conftest-$$ echo ${emacsbin}' -q -no-site-file -batch -eval '\''(write-region (princ (expand-file-name ".." invocation-directory)) nil "'${OUTPUT}'" nil 5)'\' >& AC_FD_CC 2>&1 eval ${emacsbin}' -q -no-site-file -batch -eval '\''(write-region (princ (expand-file-name ".." invocation-directory)) nil "'${OUTPUT}'" nil 5)'\' >& AC_FD_CC 2>&1 retval="`cat ${OUTPUT}`" rm -f ${OUTPUT} emacsbin_cv_emacs_prefix="${retval}"]) emacs_prefix=${emacsbin_cv_emacs_prefix} AC_MSG_RESULT(${emacs_prefix}) fi if test "${chk_prefix}" -a -z "${elispdir}"; then AC_MSG_CHECKING([where lisp files should go]) if test -d "${emacs_prefix}/share/emacs/site-lisp"; then elispdir="${emacs_prefix}/share/emacs/site-lisp/mew" fi if test "${elispdir}"; then AC_MSG_RESULT(${elispdir}) else AC_MSG_RESULT([none (fall back to the default value)]) fi fi if test -z "${elispdir}"; then elispdir="\${datadir}/emacs/site-lisp/mew" fi if test "${chk_prefix}" -a -z "${etcdir}"; then AC_MSG_CHECKING([where etc files should go]) if test -d "${emacs_prefix}/share/emacs/site-lisp"; then etcdir="${emacs_prefix}/share/emacs/site-lisp/mew/etc" fi if test "${etcdir}"; then AC_MSG_RESULT(${etcdir}) else AC_MSG_RESULT([none (fall back to the default value)]) fi fi if test -z "${etcdir}"; then etcdir="\${datadir}/emacs/site-lisp/mew/etc" fi AC_OUTPUT(Makefile) echo_value () { case "$1" in *\$*) eval "echo_value \"$1\"" ;; *) echo "$1" ;; esac } echo echo "***************************" echo " Mew configuration results" echo "***************************" echo echo $ECHO_N "use emacs : $ECHO_C"; echo_value "${emacsbin}" echo $ECHO_N "elisp files should go : $ECHO_C"; echo_value "${elispdir}" echo $ECHO_N "etc files should go : $ECHO_C"; echo_value "${etcdir}" echo $ECHO_N "exec files should go : $ECHO_C"; echo_value "${bindir}" echo $ECHO_N "info files should go : $ECHO_C"; echo_value "${infodir}" echo $ECHO_N "man files should go : $ECHO_C"; echo_value "${mandir}/man1" echo echo "Then type 'make' and 'make install'." echo "For Japanese environment, also 'make install-jinfo'." echo kazu-yamamoto-Mew-ff9c41b/dot.emacs000066400000000000000000000020141256455547000173500ustar00rootroot00000000000000;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; A sample file of .emacs or a site configuration file ;;; ; ; This is just a sample. You should customize as you like... ; (autoload 'mew "mew" nil t) (autoload 'mew-send "mew" nil t) ;; Optional setup (Read Mail menu): ;(setq read-mail-command 'mew) ;; Optional setup (e.g. C-xm for sending a message): ;(autoload 'mew-user-agent-compose "mew" nil t) ;(if (boundp 'mail-user-agent) ; (setq mail-user-agent 'mew-user-agent)) ;(if (fboundp 'define-mail-user-agent) ; (define-mail-user-agent ; 'mew-user-agent ; 'mew-user-agent-compose ; 'mew-draft-send-message ; 'mew-draft-kill ; 'mew-send-hook)) ;; If you are using Emacs with the --unibyte option or the ;; EMACS_UNIBYTE environment variable for Latin-1, put the following ;; into your "~/.emacs". ;(set-language-environment "Latin-1") ;(set-input-method "latin-1-prefix") ;; or "latin-1-postfix" ;; You MUST remove (standard-display-european 1) from your .emacs. ;;; ;;; End ;;; kazu-yamamoto-Mew-ff9c41b/dot.mew000066400000000000000000000136231256455547000170600ustar00rootroot00000000000000;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; A sample file of .mew.el ;;; ; ; This is just a sample. You should customize as you like... ; ;; (setq mew-name "your name") ;; (user-full-name) ;; (setq mew-user "user name of e-mail address") ;; (user-login-name) ;(setq mew-mail-domain "domain of e-mail address") ;; For SMTP ;(setq mew-smtp-server "your SMTP server") ;; if not localhost ;; For POP ;; (setq mew-pop-user "your POP account") ;; (user-login-name) ;(setq mew-pop-server "your POP server") ;; if not localhost ;; To use local mailbox "mbox" or "maildir" instead of POP ;(setq mew-mailbox-type 'mbox) ;(setq mew-mbox-command "incm") ;(setq mew-mbox-command-arg "-u -d /path/to/mbox") ;; If /path/to/mbox is a file, it means "mbox". ;; If /path/to/mbox is a directory, it means "maildir". ;; For IMAP ;(setq mew-proto "%") ;; (setq mew-imap-user "your IMAP account") ;; (user-login-name) ;(setq mew-imap-server "your IMAP server") ;; if not localhost ;; For NNTP ;; (setq mew-nntp-user "your NNTP account") ;(setq mew-nntp-server "your NNTP server") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Citation tip ;;; ;;; ;;; From: Kazu-kun ;;; Subject: Hello World ;;; Date: Thu, 08 Dec 1994 11:44:08 +0900 ;;; Message-Id: <199509291309.WAA21663@example.org> ;;; ;;; Kazu-kun> The quick brown fox jumped over the very lazy dog. ;;; (setq mew-cite-fields '("From:" "Subject:" "Date:" "Message-ID:")) (setq mew-cite-format "From: %s\nSubject: %s\nDate: %s\nMessage-ID: %s\n\n") (setq mew-cite-prefix-function 'mew-cite-prefix-username) ;(setq mew-addrbook-for-cite-label 'nickname) ;(setq mew-addrbook-for-cite-prefix 'nickname) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Pick macro ;;; ;(mew-pick-define-macro "tocc=#" "to=#|cc=#") ;(mew-pick-define-macro "mew" "tocc=mew"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; ? and / ;;; ;; To whose who want to search Japanese key in the entire of messages. ;; ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/mg-xxx ;; ftp://ftp.iij.ad.jp/pub/IIJ/dist/utashiro/perl/jcode-xxx.pl ;; ;; (setq mew-prog-grep "mg") ;; ;; 1. Search an EUC key (after converting to JIS) on JIS messages. ;; (setq mew-prog-grep-opts '("-j" "jis" "-l" "-e")) ;; ;; 2. Search an EUC key (after converting to JIS) on JIS messages ;; decoding their encoded-words. ;; (setq mew-prog-grep-opts '("-j" "jis" "-l" "-e" "-x" "&mime")) ;; ;; 3. Search an EUC key on JIS messages after converting to EUC by nkf. ;; (setq mew-prog-grep-opts '("-l" "-e" "-z" "nkf -e")) ;; ;; 4. Search an EUC key on JIS messages after converting to EUC ;; and decoding their encoded-words by nkf. Make sure that ;; "nkf" has the "-m" option. ;; (setq mew-prog-grep-opts '("-l" "-e" "-z" "nkf -e -m")) ;; ;; ;; Also, set mew-prog-vgrep and mew-prog-vgrep-opts ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Using the "eww" browser ;;; ;;; shr-render-region is built into Emacs 24.1 and later. ;(setq mew-use-text/html t) ; decode HTML for all folders ;(setq mew-mime-multipart-alternative-list '("Text/Html" "Text/Plain" ".*")) ;(if (and (fboundp 'shr-render-region) ; ;; \\[shr-render-region] requires Emacs to be compiled with libxml2. ; (fboundp 'libxml-parse-html-region)) ; (setq mew-prog-text/html 'shr-render-region)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Using "w3m" with "emacs-w3m" ;;; ;;; w3m: please use w3m-m17n based on w3m 0.2.5 (or greater maybe). ;;; http://www2u.biglobe.ne.jp/~hsaka/w3m/ ;;; ;;; emacs-w3m: ;;; cvs -d :pserver:anonymous@cvs.namazu.org:/storage/cvsroot login ;;; cvs -d :pserver:anonymous@cvs.namazu.org:/storage/cvsroot co emacs-w3m ;(setq mew-use-text/html t) ; decode HTML for all folders ;(setq mew-mime-multipart-alternative-list '("Text/Html" "Text/Plain" ".*")) ;(condition-case nil ; (require 'mew-w3m) ; (file-error nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Using "wvHtml", "xlhtml", and "ppthtml" ;;; ;;; Unicode is necessary. Emacs 22.0.50 or later includes Unicode by ;;; default. For earlier versions, install Mule-UCS. ;;; ;;; ftp://ftp.m17n.org/pub/mule/Mule-UCS/ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Using "wvHtml" ;;; http://www.wvware.com/ ;;; ;;; The default configuration is for the version greater than ;;; or equal to 0.7. For the version prior to 0.7, set as follows: ;(setq mew-use-old-wvhtml t) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Using "xlhtml" and "ppthtml" ;;; http://chicago.sourceforge.net/xlhtml/ ;;; ;;; The default configuration is for the version greater than ;;; or equal to 0.3. For the version prior to 0.3, set as follows: ;(setq mew-prog-application/msexcel "xlHtml") ;(setq mew-prog-application/mspowerpoint "pptHtml") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Using OpenOffice.org (openoffice) ;;; ;(setq mew-prog-msword '("openoffice" nil t)) ;(setq mew-prog-msexcel '("openoffice" nil t)) ;(setq mew-prog-mspowerpoint '("openoffice" nil t)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Using StarSuite (soffice) ;;; ;(setq mew-prog-msword '("soffice" nil t)) ;(setq mew-prog-msexcel '("soffice" nil t)) ;(setq mew-prog-mspowerpoint '("soffice" nil t)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Replying messages and character set ;;; ;; When replying, select input method according to the character set ;; of the message to be replied. ;(setq mew-charset-input-method-alist ; '(("iso-8859-1" "latin-1-postfix") ; ("iso-8859-2" "latin-2-postfix") ; ("iso-8859-15" "latin-9-postfix"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Printing Message mode to your PS printer ;;; ;(setq mew-print-function 'ps-print-buffer) ;(setq ps-multibyte-buffer 'non-latin-printer) ;; for Japanese ;(setq ps-print-header nil) ;;; ;;; End ;;; kazu-yamamoto-Mew-ff9c41b/dot.theme000066400000000000000000000050011256455547000173610ustar00rootroot00000000000000;;; ;;; Copy this contents to "~/.mew.el". ;;; ;;; Or, copy this file to a file, say "~/.mew-theme.el" and ;;; put the following to "~/.mew.el". ;;; (setq mew-theme-file "~/.mew-theme.el") ;;;; COPY FROM HERE ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Highlight header ;;; (mew-setface-bold header-subject :tty "red" :light "Firebrick" :dark "OrangeRed") (mew-setface-bold header-from :tty "yellow" :light "DarkOrange4" :dark "Gold") (mew-setface-bold header-date :tty "green" :light "ForestGreen" :dark "LimeGreen") (mew-setface-bold header-to :tty "magenta" :light "DarkViolet" :dark "violet") (mew-setface-bold header-key :tty "green" :light "ForestGreen" :dark "LimeGreen") (mew-setface-bold header-private) (mew-setface-bold header-important :tty "cyan" :light "MediumBlue" :dark "SkyBlue") (mew-setface-bold header-marginal :light "gray50" :dark "gray50") (mew-setface-bold header-warning :tty "red" :light "red" :dark "red") (mew-setface-bold header-xmew :tty "yellow" :light "chocolate" :dark"chocolate") (mew-setface-bold header-xmew-bad :tty "red" :light "red" :dark "red") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Highlight body ;;; (mew-setface body-url :tty "red" :light "Firebrick" :dark "OrangeRed") (mew-setface body-comment :tty "blue" :light "gray50" :dark "gray50") (mew-setface body-cite1 :tty "green" :light "ForestGreen" :dark "LimeGreen") (mew-setface body-cite2 :tty "cyan" :light "MediumBlue" :dark "SkyBlue") (mew-setface body-cite3 :tty "magenta" :light "DarkViolet" :dark "violet") (mew-setface body-cite4 :tty "yellow" :light "DarkOrange4" :dark "Gold") (mew-setface body-cite5 :tty "red" :light "Firebrick" :dark "OrangeRed") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Highlight mark ;;; (mew-setface mark-review :tty "cyan" :light "MediumBlue" :dark "SkyBlue") (mew-setface mark-escape :tty "magenta" :light "DarkViolet" :dark "violet") (mew-setface mark-delete :tty "red" :light "Firebrick" :dark "OrangeRed") (mew-setface mark-unlink :tty "yellow" :light "DarkOrange4" :dark "Gold") (mew-setface mark-refile :tty "green" :light "ForestGreen" :dark "LimeGreen") (mew-setface mark-unread) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Highlight eof ;;; (mew-setface-bold eof-message :tty "green" :light "ForestGreen" :dark "LimeGreen") (mew-setface-bold eof-part :tty "yellow" :light "DarkOrange4" :dark "Gold") ;;;; COPY TO HERE kazu-yamamoto-Mew-ff9c41b/etc/000077500000000000000000000000001256455547000163265ustar00rootroot00000000000000kazu-yamamoto-Mew-ff9c41b/etc/Mew.img000066400000000000000000000431401256455547000175560ustar00rootroot000000000000000$,0&a+]/"0z6[;v>8D:F310'&+{.<1!48688z;u>5B;FS10&O,{.L4@68;yA#D2F5I 10'!-,1!4:9&;Y>t@uDzFQ10$>&E+}1a699^>T@|DrI"10#n'_+{.>293z8~6A3CZF3IP10&_-#1[3h::>|@uFy10'%+m/Z3|:6;yA$D2F9J110'o.C293x6;:6;e>5A3CTFqHx10'/.\3`7W8x<5><@uCrJB10$~&O,;.<1)4x6;9&<5>6CvGQ10'/+\/"3Y7g;^>tCdGQ10'&.C1Y6I>FASF5I010&_,?1)6{8w>|Fy10#n&?)\.>293`6X>FB3FCJ010)@/[193`68<5>6A3CSF9IP10'_),1=8z<5>5A3CVI 10)@/Z1+7W8w;y>5@{CtGYI210*N.<1a3Z6_9X;e>vA'D2GfIP10$~&a),- .J2=3i7{9&FBSC\FqI:10'm+_.Z4:6G:6;wBWDrG!J010&?*L.<1Y6I<5>D@uGQHy10&M*<+_1:7_;W>DASF510'a+{.>3x6;<5>6A#DrHr10)>,{.B0z7[<5>6A#DrHt10)@1;9Z>DDtF910'm) 193\7W;f?T@wCr10'_+{.B296;96>8E"F310&_+c/Z0{3h7W;]>t@uCbHt10&^+c.z0z3h::>ED2F9Hr10&M) .z0}689^A7F2IX10'!+c.z3Y6[>xCbHr10&_,{.<193`8x<5A$DrF5I010'!.^4x6H<9Cv10&E)\+\/^1)9'?\@tCrF5J010'f+{.>498z;u@{CTFq10&a.~3h69=%>6CrHt10&),/\3`6y>XDsFA10'.) .z1!6Y8A3F9IR10#~&A,<.B5)8zFD6F2I 10"O#b&}(}+k1=69:F;V>xCdI010"@&a+\/"3Y6;fAWFSJ010!($>).1b6G8x>|CSFy10$B&>),.|1!6w8z;e?T@uCZFqHr10!/&E)].>1Y3h69:6;e>8ASFCIP10"A#n)>.B296[FD2FC10!/'!+l/Z0}3x::;eB3C[J@10#o']) +{1"4x8T@wFQHt10'&/#6[;W>DB3CSFUJ010!1$>) +{1!4:9&;W>t@{FS10!1$~)@/[193Z6?9V>8ASFC10! %&)>.B0{3x::;eB5CbHq10#p)\+m1Y3\6G:6;W>DD610#o&}) .Z0}4y6W;^>TB7FCIT10! #b&],1;3`699>;W>]B7C{GcIX10!!#n&(}-/.z1.586K9W='>=ASC\G!Hu10!'%>&G)=,C.L1=4y7+96;j>tA=E"FvI"10!4%>&R)\,%/Z1n3`6|:G;y>FB7CcFyI510$S)F,{.d1]3j6{9>='>}BECvGcI510!G$>&a*L,\ASE&FqI:10!?$~&E(}.^4x6G8w>XDrFAHt10"?#_&]) .[4|6G8w>DB5FBJ010!?&>),+_.Z0}4:6G9!<7>D@wDDF9I510!?#`)$+\.Z2A3Z7g9~=?>bB5CcGQI:10!g)$.Z0}486H:6;y?UB[DFFFIS10!?'a+k/Z0{3h8z<5>=A3DtG:JZ10"?#f)<+_/Z3|:6;yB6AdCTH&JU10!g&>)d.<1a7h8z^ASE@G+I{10"?#n&?,C.;4@9(=BUD>H&I{10"?#~&?+{.>5)9Z;V>\ASD1a3Z6w9&;Y>tBEC[HEIe10!1&}) /j0}7h=ASCTGyIP10$"-$196?9XA7FsHx10!0$~&A)<.>5)8z<5A%D2I510$F(}-#1:3`8x=%@xE"FAB#D;GsJ010#f&~+m.z1#5*7,:^EAWCsF9I210!_#b&]+m.z2I5:6w8~<5>5A[FuJ@10$@&M*<+c2K:H>D@uCrF9J010"?)\/Z7W>tGQ1(B 0$,0$ &E,;.L7 ;wA#D6Hr10!'$?*E+{.<2A3Z6W8x;i>u@}E"F;I010!/#`&})%,M/b1^5(6\:><:>\AXDzFVJB10"A#f&})-+.{1-496G98<=>EA]CrF{I 10!/$>&A),,<.>1a3y6K:W;]?&@wDCGYI510#p']+1b6{9&<:?\A5D;FAIR10"?#b&]*<+o1;7`96;Y?$@}DCF:JT10!#'m(~/"3j9:8A[CSGcHx10#b'm(}.^0z3h6;97<}>U@}DCF;JT10"G&_+l.z1!3z6?98;]?&@|DFFsJI10"?#b&](}+k.>293i6{9&?fA\E$G{I110!C#_'])..^2B3x7a9h;~?&A4B8!9`8AeCwFEIR10"_#s'a)m,%.~1B4J6K9g=)>}BWCdGvJD10"G$#'m)A,E/j1>5*6[9_='>XBED}AeDzGsHt10"G$"'~)0-?.b1^5@7l9:=g>YA'DGGSI810!_&E)\+].J4<8x=%ASCdGQHq10!('b),+].Z1$4x6I8w<>5AXCTFZHu10!q$(''*f,P0$1n5B8"9@=B?)AhDGG&Ie10!_%C&M+!,#0J1C5j7+:_HA\E6F2JZ10"i$]'2)6,A.C2[3`7{9(<=>VA'E4FBHz10"i$h(3+7.(002f4n8$9l=0>:BVE$FQId10"i%I(W*+-P0Q2t5n82;L"@+C@ELHGJm10"i%u'J+G,X012&5s8t9l=P?AB*EoH\Jn10"i%F'G+7,P/I2n4e8R:m=B?OBaDmG~KK10!@%3(()r,h052'5M8V:0=D?IC-D_GyK!10!'$h'S+6-Q/G335N7?;+=5?)B5C{FEIq10!u%J(.+0-<0<1-5(6\9`;u>~A7D:FCIP10"S'2,O.;2c5(6<9j`B5D;FUI"10"G$#&O)f+|/$1>4@6\9^='>~BDDtA%D2F5I`10!#%.) ,;.<1)7`<9A4CVGQI 10$>*<1Y<5Fq1(B 0$,0!g&M(~,;.>1)6y8~>U@{FuHq10!)%.&B)D+`/"1+4x6L9V;jA]CSFyHq10!c%/&a).,C/l1=5!6[9_;y?iA5D6FZIb10"I$"'n)f-,.~2J3|7i9:=&>~AdD|G%I910"?$(&A)m+/c1;5!6Y:J<>>YA\E&G&JT10"O$#'e)>,C.\1a3]7'9`;z>|A8EvA,D.\1!5:7_9h<~>XA\CvFzJB10"a%3&_)p,%/#2^3b7{8;z?VA4D|FQIZ10!A$R''*P-=//1A5=8!9:}A7DDFZJR10"I$N&G*n,D0$1+4\7l9@='?(B]D;G%Ie10!k%/'2*N,D.d2I5=7+9_=?>yBGC{GfIY10"i$#'/)1,D0$2K4"7|9`<&>yAmCvFCIZ10"Q$R'&)l,%0"1k5@6[9_]A]E6FzJB10!H%(&g*E+/o1>5,7!9?<9>]BHCtGeI910!q#s(R)@-E//1=5A7k9?=9?&@|DVGbI:10"i$ '1*E-P.2c4L7i9@=>?&A=E6FCI410"c%('2)n+o/+1m596K:_<:?~B7C{GfJP10"q%C&e)^-D.D3.4"7i9l~BWE>TBIA>E'F^I:10"i$S(')q-F/01n4R8";+\A(E2G~Ia10!C$G'r)q, /o1c4M6\:KYBHD$>iC2D'HKI?10"y%u(3*7-I/U2c4o81;C=P?BBnD_HHJ%10#6${(T*{.&0W2x6"76:`Jk10#6&;((+Z,P0h2p6%8.:d>0@!C2EGH'I}10!u&<'2+K-U0d2s4m7;O?)AeE'G+JU10!t'/*<+/Z2c4A6[:H;u>~BgDGGsIe10!d#f&)0,}.c293m7y9*<?tB]CvFrI410!h$('q)>-5.d1^3l7|9k=?>HB\CVFSJD10%@']*D,=/Z194|98?eCVGa10!#$>)@.<2I6y9&;V>tFq1(B 0$,0!?#b&N)\.?1Y3`69:F>=ASCVFA10!C#`&M)^+\.D1Y3Z6W:8;e>6ASCVGb10"H$P'e)A,E.^2K4A7i8z=>>8BUCfFzI"10!i%0(&).-?//2B4L6y:J;?dA8D6FCI510!q%H'2*Q,C//5B6\:F<?&A^AhD:FWIX10"O#h'!)E-E/#1>4A7+:XYA\E$FVIX10"d#f'2*@,$.|1B4<7i9:<>>XAUCzFCJT10!3%G&Q*^+p.\1b4}7)::;~>yBDC\GsJ910"S$'''*N,$.|1m4A7):ZXAeD;GyI"10"d#p(&)a,M/n1b4J6`9Z;~?hA5CfF{J410!H$C&g)`,M/_1B4:6`:;;v?XAdD|GqJ910!h$"''*M-?/#1=4A7)9:<>?hA5DFGcI910!c%''/)=,E.K2]3a7)::;~>xBED:GcI210"c$G'/)d, /"1^3l6y:J;z>|BFCvGbIZ10"Q$#'%*N+d/~1+4@6\:GXAeDwFaIU10!i$ 'e)=+o.{2M3z7 9(<9?fA\CvGcI410"i$S(')1-E._2N3z7$9'=?>vA=E'FyJB10"a$R(")d-E0#1]5B6x9j=*>|BXCfGsJD10"G$O&A)l- .J2]486L:V;^?vA>ZBDD6FCIX10"i%C'6)s-E/D1o4M6a:\ ?IC-DlHNJ&10!d%X(D*Q.&/w2$5N8R:lJf10!i%S'2*&,U/O2d5m7A;+<_@QBhD\H&J]10"y$S'8+2-E/D2n4M7|9j<>?xA*i,P0%2N4e71:k.J1Y3Y7_;wA#Dv10&}/Z9VB3J01(B 0$,0!c#_&M) ,<1=6H9V;]>6A3FU10!c#_&]) +\.b0z4<8~<7A7DrFAHq10!g$ &e)^+k.\1-3z7_96;_>TB;CtF9I210"Q$"'g)E-0/$2K3m8!9WY@{DCG[I410"d$F&a)n+/"1>4@6\9^;w>}A7D;G%J210!D%2'&*N,D/l1B4<6a:G;y>}BGCtGfIb10!0%B&O)e+/#1=5*7 9(=9>FBWD;FUIY10!I%.'')-,C._2K3|7 8{==?fA]C{GVI910!s%B&O)p,@.b2M4J7 9@=&?~A]DGFYIe10!H%3'&*a+l/1:5-699j;W?}AeD:GvI:10!q$&'")D,P.B1n3|7l9j=*>XAeE&F[I%10!i$"&O)f+m.\1b3b7+9?;i?~AgD|G%I810!h%0(!*E,?0#0~5L7a9H=?>yAEE&F;JY10!C$G'q)=-0.\1b5*6:[;u>yAcDwGyHr10"i$"'o)E,E.J1c5(7!98=&>>AgCTGzI"10"Q$"'o)E,?/k1c5(7!:G;_?$B=DBF6I810!t%B&f)^-D.>1k5<6I9_;w?hAUE&FSHt10!A$H&^)f+k/|1!5=6G9[;u>~BDD6FRJD10"S$G&b)^-,._2K3b6y9?<>XA&E6FFIY10"i$['G)r,u//2f4S8,:!=B?/B EHG,J&10"i$Y(**g-Q/52p4e82:#=T?>BhEhG;K-10#3$S(g)m-o/D2c4M8!9k<_?yB]EgG{Je10"O$#'&).,P/g2.4}819[=K>}AiF+GJ*10!$%F''*d,P.d1n4M8M:c=>bC(E2@)C?EOG*?~B(DMG:K:10#<$u(:*G-Y0T20557N9t('*D,M/z1p5B7+9k=9?)A;ETB;CsGaI210!g&O*<.~3h6;9V?XA3CTF9IP10&}/Z6w?TIP1(B 0$,0!0$>&F,?193a9&;Y>T@wCrF5J010!?#g)<+d/Z0}3h6y;e>u@{D2F5J@10!'#~&G)]+_.J0{3x6@9V;Y>D@uE"F3Hx10!(%@&F)@,yA3E'F3Id10!L$S'7)2,P/$1C4=6H9`=&>VA[CdFuI910!s$G'*e,C/2K3|7,9^;z>|BECvGZI210"Q$"'&)@-$.^2b4:6`:`;g?xA%E7FYIU10!s%0&a*N+/l1=4A6Y9_='>]B7DDFUIY10"H$P'q)e--/#2K3|7 98<>>VB5,6X9`;y>|AeDvFZJ410"S$ (%)!,M/#1=3j6x9 =5>6BGD2F;I110"Q%B'm)q+}/.2B4H6\9^='>XB5A=DrF[10"h#t'.)I,M/o1m5=6a9Z=?>6B]CcGuHy10!s#c'5)F-+/$2M4 7i:Z=&>xBECvGZI010!3$?&Q*N+_/,0}5)6;97;]>vA#D6F2JD10"g#_(%*>,K/^194A9hDB8CdFzI%10!c#n'"),+_/{1!3y6;:F;z?iAhDGG;Ie10"A#f'"),,@1k7!9&+o.Z2N4@6I9Z='>XA]CfGSI$10!A%'&a*M,?/c1=5*6[:?EHHKJ&10"l%I'2*f,U//1o5B8!9h=B@NAhEGHKK%10"l$T'R*i-P//335C8!:`MBiD?GhI*10#I%]'I*s,V001n5r7E:h<_@HC;EDG5K:10"i$)(')q-@0U2!5R8T9K=Q?BpDHH.Ig10#<$i(2+2,h0/2f5C7,: =B?)AeC}G|Ie10"'%Q'G+F-1/?2S4e7m9k=C?1BaDLG~Im10#Y$+(w*f.8/e2n5B729kXBCE4GYI110%')@.;1a6Y;]>TD3FA10)\6w?TJ01(B 0$,0!?#`&M*<+e.Z0z3\6W;yA$D2F5I 10!!$>&N) ,;1+6{=%>6CvF2I 10!`#b&M-%1:3\7W9(>}CtHt10! $('])F+\/.0{4@6I9^;W>\@xDBF6J@10!!$R'_)D+`0"0{4L68:`?)@uDFF:Ib10!h$"'f)@+m/#2K4A6I9:='>XA]E;FCIZ10!?%3&]*Q,=.c1]3h6{:?,C.[1-586A9g;]?&@|DDGyIZ10!c#o'!*E+{.1)596?9g;Y?|A5E6GbIY10!p'1,E.;1i3Z7,9 &R-0.z1"3Z6;z?TA#DtJT10"a#b'/)$,=.N1Z3\7x9 <5>FB;CtGYI110"S%@&M*a,;/o4M9@^B3CgGqHu10!?$'-(~-;.C1Y3|7W9&<9>TB3CfFqI!10!d$&'')E,M.D2"3m8!9o;@!AHE'F[Hu10"3%H(n)J-l041n4"7l9?=9?)AhE*`+\/"5*9`?~@tC|GZI510!A$H&O)A+m0$1+5<6I:`<7?hA=DCFUIZ10"u%C(3*)-R0'2n5B8$9i=B?BhDHG|Jf10"|%u(x*i,z0d285m85:+=t?ACNEAGFK?10"l$y(**1-F0g1s5M8M:c3@IBqF'G|KE10!t%3('+Q-I/T366.82;E=J@SC@DMG%Ie10")$S(7)f.%/o2b5B8L: =r?>C-CvGzIT10!y%I'1*a,E.d1b3z7 :@4z7):7;y@DAgD|FVI[10"_%h'}+&-?/c1]5A7a9&5BGCTIX10"{$U'w*r-G.d1u4K6c:FTB;CrGR10!i$Q&g*`,M/d1)4:6?8x=CTFA10"m$X(3)z.0/42v4m8$9p^B]C\G{I$10!I%1'g)o, /,1>4:6a:W;]?vA3DtFRJ:10#3%G(A*n-d/{2_5!7|9&OAwE-FVI]10!t$I'1+I,P/D2m4M6Y:J<9@/A]CwF:Ib10"j$R(P)f,%0$2K4"7!:I3?~B*D;G{IY10"($ '2)v.(01265o8r;,=R@JAnDTD;IT10!c&M*@.Z1"488z=%AWFA10'].z:6B3J01(B 0$,0!!$>&E,?.J0{486H8z?eC[FqHr10!a'e,?.J0{486?<>A5CZI210!_#p)d.{1)3Y7_97>FD6FAIP10!$$N&B*L+_.c0{4!9@;V?(@uE&FRJ:10!($S&_*P,E.^1c3i7!:K;w?hA]E;FUIe10!p$#'&*f,D0$2M4!8!9`TB=G#Hx10"t%J&g)q-C.|1N4B8!:k\AWFUJ110"?%0']*]+c/|1Y5*6W:@;v?hA8E&FVIY10"S#_'-)!,K.?2Y3m7_9h;]?yA3D?G#I410!o#h&})1,;.d0}4I6?:[;e>yA#D\B8CzGVIb10"Q$(''*Q,P0#1?4A7+:@BED6FBIT10"P#~'e)<,C/k1]4J7':`=>?+B\EgG>JZ10!q$"(&)q,%.O1m3b6B9W;_?tAUDFG"JZ10!\$I&z)f,U/.2N5<7):#=j?1AiF9IQ10!1$G&O*a+n/105B759k+\.B7W8~>5A3Hr10! &E.<4868;e@uFQHr10!h$R&]*P,;.b1Y3j6W:6;y>DB5CZGVI"10!##x&M)I-0/61C4%8-9C=k>oB}ELFuK(10"Y$U&j)f,&/$2N4"7i;+=@?QC!DCFCIP10"H$#'o*^,P/e1m5G8':$==?%BSC[F3I:10"`$B'~+%0?5!6I9W;k>IAiEGG{J]10!I$"'')1-E.O1n4R7{9o=g?|BWDDGqJu10"D%G'a)n-#.[1!5=6H9`;g?)BIDLG~Ij10!G$H'1*D,M/.1k4 6y:^=9?$B5E:JQ10$F*N.z1+6w88A4I410"C'!),/Z1)3Y6;96>=A3JB10']/Z9VDr1(B 0$,0!?#h)n/o1:5"6\9^;z>~A^BXDTB]D6GsJ910!/$H'a)E,E.J1_4 6<9f<?$B=DDFEIX10!I%C&Q)q--.d2N5A6[9_=)>VB}A5D;F[J410!?%3&_*E+}/#1=5*6W9[='>5@6{9?<7?]A5D;FCIT10"S$S'o)@--/~1B5:6K9h;]?&ASC|FqJ:10"H$"'^)F,|.d1)4=7g9 =6>8BUCZGsHt10!/$H&^)f+{/$2:3l7Y9?;W>\B8CzGVI810"H$ &Q)e--/#1+5<6I9_;y?]A7D;FCI410!t%H'2)a,-/$2c3m8A9k;?yAhD"@+C@DPHZIg10"z$k(4*)-P0O1t4N8`:a=I?>B`EbF_KM10"}$i(7*+,P/51m5:7+9h==?yA;DtG"Id10"Q$F(O*`,d/,2b5B6I:Z<>B[CTFQJ910!t%S'q)G,E.?1j4|7A9h;~?XA4DvFRHx10!c$&'o*)-m/.1;5,6x:J;y>tA$FU10!/$>&A)].Z4<:6;uCVI010!$#~&>.J::Ct10!g$R&}+l293\>VF2I 10!_) .Z6?9VCVI010&~)$3x69,C.L2c4B6<9';Y>D@uFqHt10"t$h('*f,.b2>4I8#9f=:>D@uGc10!0$@'o)`-0.L1b3z6?:[;]>UBCCWFqHx10"4%H(&*f,L/~1:5,6w&A),.[0}7g;Y?dDrFU10'o.c7_;g?TCvJ110#f&~+c.Z0{7_;u>6B3CZF3I010!_,;7W>tJ01(B 0$,0!D$S'r)E-p._2c4M8!9k=??)A]EGF{JZ10!t$S'2)F,M//2c4M8!9k=??)B]DGG{JZ10!t$S'2*f,P//2c4M8!9k=??)B]DGG~Je10!t$S'2*f,P//2c4N8!9k=??)BhE=G&Ie10!y$S'2+1,U//2c5B8L9k=??*A}DGG&Ie10"u%G'3)q-P0$2f5B7,:k=??B`DGG;Ie10"i$H(/)q,D0/1c5B7A:`=J>~A}DGG~Ij10"i$H(&)>,D.d2c5<7l:`XB]D;G%J:10!/$C'o)p+|/n1>4@6a9j;Z?|AYC{GyJU10!q#g') ,L/d1:5B6H:`<9>EB}C{FuI910!q'2,E.Z1#3x7!=??%A[CwFzId10"O$ &Q)]0$4M:`;f>vA;D7FYJB10!A%&&)$+|/^1a3z6?:V;j>TBHD:G#J510!s%0'%)A+d.Z2=3h7\9>;W?(@uDFGSI910!q%''1)D,?/k1k5 6[9h;}?vAgDsF[IX10!_#s'])e+m.z1C4x7+:8XBXA\CVG"Hz10!i#n(").,D.^1c3h7|8,?2CJE@HlI}10#\%I(W*'-x/P3X5B8v:`>4?~CNE@HlI}10!q$S(R*;-E0w1o6%8,;+TAXCbGUI!10"G#~)e.^1Z3\7'::;~>tA'D4F9I010! $~&E,;1!7X8~;u?T@{E2F;JP10#_&M,{0}6G;V?TA#F5I010#b.{3`;W>TGY10'e+{.<1a3m728|;W>=AUCcF310!'&>*<+k.<294J7!:k<@)B]DGH!IZ10!g(~,;.O0}4=7o:Z(~+{0}4x6G;W>t@{I410! %.&?,D0}3h7Y;zA$DvF2I010!A#g)q/50}5A6[9(<=>>A}CgG'Hy10"O#_'%) ,K.z2M3x8!:V;i?tB=DCGuIb10!?#b&>*L.{1)4|96|CTFqHx10&}/Z6w?TGQ1(B 0$,0!t%H'2*f,e/o2c4M8!:`>xB]D6FZIU10!t%H'3*q,P0$1n4M6a:`/.2c5<7,9h=??&B]E7G#JE10!A$H'2*`,%/1c5*7@:<=F?!B]DFF{Ie10!t%F''*f-@//1k5B7 9k=7>HBXE;GeIb10!G%@'&*`,M._2c4A6a9h<>?~A7D]B=CvG#J910!0$B&g)e+0#1>5,7!9j='>~AdD|G"IZ10!c%.'')E-/.[1m5"7):[HBTD|FUIb10!$%F&O)`--.^2J4B7h98<>?hA5E&F{JA10!I%I'3*Q,P/m1C4=6a9;$x(\+Y,j043D5N8T:m>2?+B0EIH^IO10"|&3(,)y,q0U2x628$:l=p?BCHDMHGJj10"5%{'T+6.1/73C5R8F:p=B@)B^DLH^JE10"s&('2*V-`.t2]5q7+:k=i?&AgE4G"IT10"c$~'1)^+k.~2I486K9V=%>6BWFzI010"?#b'})%,{.L5:6?:6;w?TA#CVFqHr10!#%/)@/#3z7W8>T@{DsI410!($ &E*^.B1[6W8x;e>t@wFyHq10#f'_),,|.^5*9_>XB3FC10!!$F)>.L4@6996;]>tA%DrI410$''](},C.;1a6;96D@tGc10!?'%)<+e.z3|9V;]A5Ht10$~&M) ,;2A:?>T@wGQHy10"?&N*<.<2I689&>8ASI!10&E,;.<3`98ASC[10"O&>*<+k.<1Y6?9W><@tCrF510&M(~,;.B0{486?;wA%CZFs10!($~&b).+]/"1-4z6`8x6B[D7GaI210!t#p''*`,e/t2^4"7l9h<=?fBWC[FuJB10!o%H'})f-,.~1:4|7(9Z='>=BSC]GaIU10"?#o'])>+c.z1*6<=>UBGCwG{I%10$ )$,}193\:G>XASDQGzJ'10$>,;4x<5D2GqIp1(B 0$,0!t$S(')v-E//2c5B10!t$S('*f-E//3.5B10!h$((!*e-E//1n5B10!H%B'/)`,M/$1B5=10!q%3''*e,E/l1m3}10"i$S(')q-00$2c4M10"i$S(')r,P0$2c4M10"i$T('*q,P0$3/4M10"i%s(**f,P0'2n5B10"i$S('*f,P0/1c5M10"c$S'o*f,P/,2c4M10"c$((')q,O0#2c4J10"i%0(&)A-D._2M4J10!p%C&g)p, /#2c5*10!h#p(&*N,E.c2]4B10!C$G'/)A-//,2b4=10"P$H'/)A-/0$1k3|10!H$P'q)F--0$2N5B10!3%@(&*Q-?//1C5A10"i%0'&)F-E//2]4M10!t%0'2*Q-E.c3#4M10",%U':)K-V/(2p4E10#M%X(T*&-Z0o2h4r10#I%H'1+Q-0/T2c6#10"h%"'F*@,c/k2c4\10!)#&E*\+o.z1+4810!g&]*>+k/Z1!3x10$~&O,=.B2910$F,C.<293h10$"*<+l1Y3Y10'e.\10$"']+_.Z3`10"O&>)<,3`10#~&A+|2A10'!.>1910!?#`),,}1!4810! $F(},C.<1;5!10!I'')-,?/l1b3}10"G$#&E)m+i0K1C4M10!H$@'2)1-H/E3.4M10!I$O'1)q-E/,2c4b10#4$((Z)F-H0$2h4L10!8%u'G*g-P0(2#5m10!_%>(])\-;0Z2Y4X1(B kazu-yamamoto-Mew-ff9c41b/etc/Mew.png000066400000000000000000001356231256455547000175760ustar00rootroot00000000000000‰PNG  IHDR[Èq”²†¾PLTE((((40(8X08@0<00HP8,(88`8<@8@88PP@@H@D8@H0@\`HHPHX8Hh`P$8P40P<8PH@PL8PPXPlhPtP„XPˆX<(XD@XH8XPHXT@XXPXdH`X@`pphL@hLPhT@h\Hh\XhtXhthh€€pdPpd`pxxp|hp€ppŒhpˆxTHxd@xlxx|€x„xx`x”€D8€D@€X8€lH€lX€|ˆ€ˆ€x€ ˆˆ@PˆLhˆ\Pˆ`@ˆxXˆxhˆ˜ `XdHh@h`˜ˆ ¨°˜T@˜\x˜h@˜hP˜l€˜ph˜„`˜„p˜Œh˜˜˜”p˜¬° `@ pX th x@ |p € ˜P  x ¬ È ¨|`¨|¨€x¨Œh¨”ˆ¨¨€¨°¨°TX°\H°dh°hP°l@°€H°„H°P°”p° °¨`°°°¸x°¸°¸tX¸€ˆ¸„p¸˜X¸œ¨¸¤¸¸˜¸À€¸À¸¸ÀÈÀxHÀ„`À„ÀŒxÀ `À xÀ¤hÀ¤¨À¨ˆÀÀ ÀÐÈÀ԰ȈHÈŒ`È”hÈ”€È¬xȰ`ȰÈȈÈȨÐhXÐxpЀHÐPД°Ð˜ˆÐœHМhд€Ð¸hи˜Ð¸¸ÐÈÀÐØÈÐàÈÐàØØpXØ”XØœXØ ˆØ¤hؼˆØ¼ÀØÀpØÀ ØÌ ØÐÈØä¸ØäØØèÈàœHà¨Pà¨à¬pàÄpàȈàÐÀàÔ¨àÜØàðÐè€Xèˆ`è°Xè¸pè¼xè¼°èĘèÐpèÐˆèØ¸èàÀèä€èèÈèèàèðèèøàðœ`ð¤hð´`ð¼hðÀXðÄpðÄ€ðÌ ðÔpðÜðä˜ðè°ðì˜ðô°ðø ðüèø¬pø° øÌˆøÐpøÔ¨øðزšbKGDéQÓG” IDATxÚl½ÿSgž.ê”ñ–‰ÅØ[‘ùa°„¹ˆ–S¢<[&5©º‘ª¶îÁ­‚xæÖ1ƒÄõ]0ÄS:4쩤BZ&ÃÀ3Ñ Öˆ%7•ñeÔÒf2+ѽBá#„HÖ²¤#¦NÍÞÿtÄqŸÏÛ-Aæ¬Àú†¾>ý¼Ïçy>ïÛíse:­³óòF‰]TÊ•Jy£\Ù¨è7ôûvpßFÙx€~gù¸|\9>ÆyÙ¸Y;UèúÑÙûŽ+µ×®Êgο:©|õÕ·þRÆë–«x^Þ8á½Npñò×*¸Q©œà§Âþé'û¸Ü×ï9¡Ûx þh\cÏ;fÏ<6ž|ö÷+û'åý}ºRÖ_g§þqz‰ŸcܪÒ÷¯”«ôêþÉNu¿Z©îTªtY>¡¯yT¥ßsõ³:ôìbGGWðjì{³/ ÔñÓ/€"Á}|„«ecú)³VÖŸ¬CP?}EÈ2l÷÷R%|øÒa ‰ 8!` —øŠ':6/n:¶'ì™xI\ùþƒÙ¹ò…Ç«à Ç„7½VYÇ@;³Áõ×a¿ÀyG‡·0Þ–áR!\«Õ}‹” Óú¤R'xqîøø¨êñ:CBGˆXƒÚ)ïÓÎuõ³òFecc£Æ;ƒÇôþë:=uH×ë׎ –3|þ£“A½:Þû¥Réàà€WGõø%xó¬ÕÅÙÉËÊæ1\ 3p òý:òÇÆ»Ðó¸: oí%{LÛuŸaT%6îWvÎàtжÀ{Ú< |­œìœ‡wö °˜AxÎ ÜQ}è2ÊU ênTô‘lÜ>…Wç¬~Oe£v£\c4^£B¼ 3boùhøLd©1ãdÜØ?1Pac/Q:ÈïîUKŒ^lDWt²žòx™FëÛ†^fŸ{Bè²_†ùWÆcNH) m!Ò/Z˜'Uý;àñ;;ûtv²1¾ÏBÿfg?9ý“ì“,€„Œe$UÛ£#F³õ£šJÒù±!¶ºÊVÊ¥: :K÷ëÃgpE×iƒÄúYEßZìéôе/F½dãô¸†ÌîlkÚfQËi…Cö•Nt|õ3ƒ®ºþ¾$t_ê¬Ä5ù=!„Råä':¶' kc{2a¨ëÊ^´¦ÊÈ{ÂØ¾Cˆî¶ÄÞ}] Y^êP1n“$œèz þ¨ôèâm À–Ž×HÂëÇFq;.׊–mí–송ʺ0” ˆOѯÔ*;;*U©(•ëØ°Á®W#ZN)~£åó{Õãrøƒ7'};½¤môòXWÑÊ™ eè)ÄÉ~Mz¾Ò%‚m§ãÒëc6^ž­Š•êIma˜ïœìÐoM^eõR­êÒ üé ày•žQÝ´;ÄÛuÀ«c¹ŽËuœ ­ü³N9h [w †¾nÔ”£6HΓc$ëÿʧ@3X«z™Ò½F<ªak?…½jõøÌ—®éˆ'ó _׫“>j_Q Eç>3û_±Šyò«œ5•7ÄW/’$å“òIM]÷™3xqi`&âÌwdÏ"Òêµ ÄH«@v§Z÷ /ÎKµ›á ÞÐEXwhú^ Õ®BÛ•]ÑUšýµÂžQ)¯o¯—ku©\Cô¬'ÒÅ©îj²¶—ßËjy àÖëÀÖ5è¼dÏúŠñîØØPì–ƒ„à«z…$ˆÿ°Ï€=ù¶ ™:Ðp?©ž©[$¹]qËÌ<žÖ…åXäÊ:ºäTwÀÙ‚÷axT3¸¸^*1KåÒz ÚcÓ•Øý•RÝiuΨi:¥w*5=0`®s˜}æWɤÕ4¡æ\+Œ€.—ö2Z~oo/ŸÕˆ¼{‡º Ðq`°}E#ø%ã%=ç+ÃIè2À>S1éQøƒ¶Vô¿úÖ@ W>®ß|yfxì”k¥|²£›^ýEN m€&¼$Î’6?Ø?!Mi«d¬ÎAéÏLRÏ$ºzü­;ʆ<ü¸´¹ôÚ¦ÛŠúTÌî0Ö¶u˦s ekœÃép/ŸxöÍ^^Ëg3ZQI¨Emï Ê¾ÍjP Vªü'ǵÑm YfŠÀôS¯uütòî×!f…j§ræéº€WŒ§ß¥ C•¹Ý“cÃÈPJ¨²G¶éy¬îìë¦Þì!E-} 1T³Ò)¸§q ¤­Éî™ÓŽ) Æ«°:ØÄaD:]t¡Ð¿Šáê:Ëd÷hOËó8i{š¦(EEÎÃëÕSôáNCý¸¦§,Aè5Iß\'µLP3µ'uYÐýƒŽÎþ÷zR9E·&ò©#“УËä_÷÷Ï<‹Cö@Ýv‘å%T駺lbéV}ݰ¹ë†0ed÷éöIOõ„\ç­¡ÄLl+d? Kà1y}ë×>PÝ~S‚1(BÄŘ9¢£%rÿs/³5Њ°`‰\®ˆrV*×8§¿“̯ _k yJ9Vôñ/ONíèIíÍ÷Ïä.ÚÖûƟˆ}xùdP‡¶ÎÉþÎÉ©²œâ1kQ=fdÁm*aûäÁPÈvPËÖ‰°%}¤—}×uðð‡R Æõ3x®ë†›Xß8:õh§>¸îÒ‹ËõŠ{šºNjâk|c¢íŒ±ö›|&ŸÑ´­Œ’¼Å„ª-W«µ'í4Ü8ÑÉû•NÜÓ¡]Ù¨”5Ú8ÕþþqØ?+ĆweFàØHèµrB†õTô¦C½Ô°/]¥4F&ÒîT™ÞžŠ“†1¬J†;:«á&6ÖOq.į̂fe£Å£'‡S}ÓÓÍΙ¯6ûø¨”×¶ž?ÿ}&³UÜÚz®i¹"ÀÍÉ™­ÂQM-uúêï“î`jèÂ[ï½ëö¨&;ôu=:©¥¿šþÖx|}æ«§A©¶QÊÌäîïï×hbÀ®×r-ÂR<£’snc§\Â/ÎpA—Ø@Q­xÿK¯k½¶UþòÑFr(‹°ú‡©CT©[ ]Ë{ùâV>ÿ¼XÌo¦¸õ×þ˜Ëå{‡µá\û’ÌÔWX=ûª>NŽkБ$”Oô¾ÃÉÉÐĨüýÊIíšÑ1©a{¤ÛÃrÝõ”k:Íòž%ö¿‚kø\¢0¥µs%ppÝ 9ØÙ(mèUM‡—®³–ë¸VêÊäÑÖ× ½Xÿ¶n°í·aŒ&ÃÁüÅÉèTP7ñ U °f2Úó-!ü<“)æ2¹½½ÃÚf8ÓŽÙØgöéä«:¾g|ðWz;ÇhBœ2ÚàŸîÄë¬5ÆÕ~yÿlD9f­öκ<©Ö4¥Ö'ÓY]ÕËÞÉ1kÔTËTaÃ*çÈé–vv ®ÐKÂrÃȲ„q­•{Ö-Õešw|ÌL²Ž²! 5<(ÿ•+•ºyÙ9ÛµÓÒqõp„…?€óÊ@ ™bqëß‹Läy*fåÊYOº¯#Ì\Ãþ~åä,®/ ­=ÑóˆÎ¿³à–k {ÆŽ±®ÖNíE Ëm´–ΞNôÇT©“Ú»ú Ú’TYË™x[Ý©€·%¶Ìtacƒ¹¡+èŽQÿõ‹ÊzEoßàaF ‘ý” §» »õ3Q©o¶•öÏX…rM9ÊÕR ŒÕžç·¶@ZÒYÈA&‘Ùú÷­Ì3‰\&ÏÚ“ßj²ÖN_i|+³¿é1•Ë?XaÊÃz— .ïÔ–¹˜ªa•™Ìèù‚)€Û©éë¿ÖJ™~I¿Ì'(•Îø[êÚîTN‹T¥t*¢Çuò%o£´n4͘IÛ([™™Á:ÕÖ³_ß u©T-ÀskóêW"SÔ ERÞ­ç™\bkï¨|\OßBtç+R‡ý“ÿEoδ(ŽYÕgU³|¶:Õ´÷Œ=3“þ—§‰8WuQØ©VöuH÷Én27¯dü0Öâš°Þ–7eu 7jáªbd„òé=µ°Q¿ÜÐýn‰øØˆÇLŒIz¥\ëpìÔðeªG¤Z=È3óŸ@¬U PÛ ->ß‚àæ÷Êõáù­({R+FúøþCåûF¿Üí1»4*™®þÏ@[Þ7®ï×f-j›ˆU¨J…õØŒÇ h3t÷©UË,wUo5ë½D8Ë|B•ætΆ²Jm^¡\®KI¹ Ë­ºÞnœ×ecvAïoUôùÖa'>ëÔ=®OMÔÄ@ƒÕÒÁîî7ävó›JnSSŠˆ øEn(&Š9ò ù½#=¹Õç¹ôF-†[½û:Üï_ˆ{gý³²ç•ù:¸Æ¦Òåa‡a5'£^h©©x|lh¤Ýg39eR"ê6°-UuÛ@¨œí'ÔÀ­Ÿ°Öš±u@1cørƒõI…ã¸ô[=VÚq&ÝÕƒ]pU£˜«©šB°>N™Œ`Å¿DNÍmíÝÇ•£Z‰Ê…ír}sŸ)7ßV‡r¹æ?kB¥oõo?¯–ü(¨ïë¢h§ö€#êxUu|Oöˬ·È²m™õfv¾øâà‹ƒ’. Dßê_bk \ŸÕ1êÍñ·ªlùì:ã× šèMߣ™õÏDØVaŽðc™Ra7¯ärª¶ h7sŠBaw³þ*Z®vR´BÕ[6WVßråÂA¶`„ÉZÅ4䦼Á >éE­«Lã¥\>dã©j¸'ÖìÒ•<›do¿¬ F}´±QS­™^<®ÊZ^_T¿xñ¯?ýÕ¯fÃÛÕº¿'Í=·®²Cº“ aoôG})ø•³ß >7Y1Úz÷¡>µf<»jüïA¯zÌf¥ªd´K¥ƒ*H«Æ© NÅ (\%§nE]UAÚ§*N™|UŸv:6ô/‚ÍU(²Úrá p@_ ¤Ý}¼RbŸÎpA•R¡\(TŽiÌ2Q,Ui(è¦ß`ŒñEiÒ ‚gQ¶lŒÿú$À1µ«5´Ë”m_¼Œü¸§{:|€W'_K"Aº{®T>,²"Èú\U£aVgm¹Ö «›Qƒ£u˜kíþòÙÉcF’>lÊå Ù c&Ž ÍÒÜkÍ(`-©­‚“,Ëêj(®æT9§ªi Ø•ˆ½ÝÚëГdr1»w¼†ìP‹¹Ä.Iñ‡íʰÍâA…Ru½Z]_¯ÈÞë]¬3S;åm6—¸S"]ØÙ7’e.¬ÇxÉâ×Îö¿þsLvõ:}ÑdµD›eGgÔ½-±fW½sÀé¨6®#ª«Em’¾Rþ i8-Sìcl” ¼õ*RŸp /CØ”È<Çð‡ØÂ@Zn1G‚‹ŠªÈi⬂ í€É{­‡¨7èJU-¸ÓÛÛã¾9Ÿ{«Œ¾–á·©³²C#—x»]ªl—¶·_dq ðbcâZ™®ת+F¸ûE‰ °ÝÙ9+ƒÆW}É8{PÈŽ  ‰ÊîÞÞÞAu ¨•@¡<›Ú­Íå°¶Ì¡aWë­ñÓ³SÂÖ„¥þ†§6«òíÚ¢26eÆüéA»÷\Ë$0â·¾ÉoÆ6“Ó˜înª²…Ty3·_UŠÃ½<1"9˜âb4pïÖM‡ó-9™Ï” §^ªÅŠî: gÀZz±–Ý~ l Û…Bés\ zÖfÕIom_QíwJÕØ8;;º$@µËõ‰H*,„U!hÉÙî[Ýv¸—ÝÍf ÐJ¹ô¦UrÁçŽkÖfÈŒŒ®oUc½}Š?×ÖpÔêmm{Ö{ß§X~^ælŽ·Ì²Hw¸GÕJ]R ZJ0\P$EÎåVÕ¨_ÍådÐVÎi»g_MOYÕB>¿w¸—מ|Ðqµ•ÃÙ=í°\Z¯2| »Û¥}‚ oµýŒ]‹Å’¥dÈœ²ÙÝ*ã(É'A{ÄX¥𿊱ý¶ìE_ °_gS»j6éwM„ˆ³ÙÂ.^••Aš,c+˜ËR£Õä!ذÓfEêˆU‘ª kÒZ>]·¤›ÅzϹ>„öõiõÚˆÆëž”K‡¥½|qé°Í=ÿ¢.E0ækw¿ÙÊs›¹\<.Ç£àïª\Ô±­·¨èŪ{{y »•ÀÿóßSÝ/Jʪ[a=» “TÝà#^ìn'_dÿ€(·çcÙµX8¦Ì¯%•°²–%¨2JUKzø.¬­­^¬m|Qª²¤CØÖ§xõ\¥ìî¼0àº9:,,/¢ˆ±l• ÕR {Nï–Jëø9"rôg½ÏuDÝÖ"8ªë«BÌ¿Õ}nÝ×R²¾Òæ¬}ÑX×l(Bõ°ú'@ûôË¥?.%þ”ÿ=¢W"÷¬˜H .d2œX1A¢_ÇÕ¸ªB(JgÍ(•’=8â„¶<¿•E-ÛÛûŸÜã{±Y Ø= Ï+-/ÿi¯P­æ¶|·;:N—›sõyxÞÍ{úüÐø,Ïîrpg¶˜-—/›-›åuK‹ÃÁ{fcgY;Д°$yov¹€­ËírŽ +É,¼Øö‹*PÝ~ñâE2ùW’þ~—½£7²wô§½åÌu6ÚÂ’'«ÛÔª­î×yk@©Gª±HÂä®õÞ#›ÖýCMÎHFõl?±ò-í=uj;gt¦D¾p“ {M-eöò-÷ ¤M(”ä4<í’-(‹;À\Â8Çlù¾ÑeÅÖÊÎKÓÂĨ0&¢œÌu16·²{ÅÕ[]í\«ÕÂ9œ=.§Ë…Ñïpqv; uYZ›Í¦³¿f³Éln5_¿á½ëA!ä]]®ÍÖjïr_çÌ­Øîi%–L&ýâˆ·ß â»ÜÞá!§ƒ»Ù-ïU³Ú|‚etuBq9VئLW%õ Ù?GpoŒ.¯Ã£­3[Mîºdœjº Ã«ÃjÌ®WËõÜVŸ8c½]ÆS¶|§¤ŸÕ7á®šŠ¦"_§‚*êüóDþKÍä–T9¾$Ç.ÜC<…¸0œ“6¨ âËÆ’ØíE0æ‡),ãû-g?ÉÂ4À5ü)àä:¸ŽvKG×Å9].‡µÕasX¯Ù®Óf¶*Àµ˜éŸ­ 9Ü^;Ü-­v«Õk·š,—ËÉ{qVŠ@á ¬ FqŽM£—™&”6Öé«Ã3ÈþÁª1HÅ“( ŸPZ?<¤)†C*y¥²¾¬XE·¬ƒË= *ÙK>HŸ¤¯R!¦Íµ·F¢‘H<•ÉçaEu : ‡ ¬*¶JŽFãi\Å…GC‰B©.+4,¾H®ðv˜Dir~r~y-›œŸW@ÝB>u  ¶5·YÛÚ8\ä¬V`ÖÆÙÍûVk“‰1ç—Í—/[pfÁ©­ÕbiÔœµ™»n7›š­G£ËÉSéãí6ÎfmoãníŽw¢ù5-»F¥ål6!Ë¡àŒ•b»$´efŒ™&P_¼´þ9ÐeÝÖB´§¾I~÷ P0ta]—âÓ Cªð»z ¤‰¸#ÒæR½,2Úoô†I‰ú›Û»S##‘h(ëZŽ4@F#!UË%RôI*Èâ.¡‰< D€v¶*T*õµlɰäë÷ ¹Ýƒ¼W˜ŒÅ²µä¼œL‚IùBB¸ÓÕemnn#xÛ:8®­ÍÜljæ,î 0l¾ÐDŒ5]ºlºd¾Ôil255Û;Ûð8Ü׎r“sÜtpV[;†A;žîpØm=>m][Ö—5m æ++â†B¢,ÐüX•MžAöõuŒ%6ËPBÜ]ÓduÁ¿ L;žÎ\®Mü” t˃iMN½½ÎpEæb¸²x¿Í¶D|û€Âæ¶¶›S#‘@$ 御NM‚¤ DŽªx?5´ÄÄ+ ö"9¤€-1<žÐ D|æ“2kSÍŠÂà g°ç¶«Ï+†Ã b@WI&ÞçÁ×lµZ¯¶[Û­mTšMÖkÖ+ðV ljfZk2¨¦K¦×p ÛmßµsÄ_ˆ§Ÿ¬–³ÕÒni·6Ûì7í¶eF \×|rîr оÐ^­×É–Ö óÖª á åƒ4ý”×hÖ•õTóâÞçÛ5f\.Øp/}J  )ö¨«Z…^W-wvéßlz~wWËŒ©¯#QªÌ0\ ÜVTŒÊ*5À¨ûExBc£Áh4ú$ý·H$W3Ù£JÒ/½|CÃüP¿«¯È3앤pX[mµùùy|á]i°»£ @¶³_\knj¾Èš­\S£©‘H XÍæK@ô²é¢.L f›¹¢m··Û,Í-6<ŠaµYl·¦¢ëË#ÉX,,#áÍÇæmH–"âŒÌ¦t(ìÒn&Æú[× Þ,ÈJXn°»47˜×¨™ªäI€ þííÒç;å3$Ö5bÉiùN¨GX0ö x¼”¶«ék¼45|ø—H$•ßÓÔ𔢠аU†èF#ÓSÓ:Í@pŠ,à:êD¾ÀH¡7«¾x‹ïºÓÓïìãDif!›LÆÂJø#I›‡  ¿ µ0h!”VÎd‚Npæ¦ÆÆ&€K—Mìd¾|ñµËù5¨ÅÜJ8_µvØpbl5·@#Ú͆aY[VB19,ÃýÎ'ç¯_ ÇC!Iäª>iKMŠZ+ª×2¨í]E%h™µ€žÕòš²Ò4jqècœ6ÄçŸÓÅ~JŒ·-ˆZ(S­_ƒ‘C¼» ýjNûf‹F@NYU‰¶©Àõž6§D¥èJ\Þ$ÚÆCøÛÂT B¨ÆÉÛ2˜q]Ñ ¥jÝ…TwÅ!ŸÀö÷õß¾ ÿV’‹kˆ·ai6Þ—³ùhï-ްmnn¾jå¬MÀ HZ¹kVðÕDØâÔ`‚Þš.âÆeèï%²½­¤ævK ´Y®š›ÍWuJ·Ùl7e¼ °IB†Ö´Âî.,1`–BrT mÊÆGdóéÔO0\jŒX™˜«Ð€¢ËM°›óHé0(Míš@¬“ ²–3y*‡ßdòˆƒ[™-pæU¡w<  DŸ?ŽÆ²"ÇQ`#@ŸN’T†¨ªääP4Ä@£#bd9BÙ«Ï–€¸ùAœâ{{zQÉG˜Ñ6¹˜„0¬! ÏËÙ¥A®  6[Í$º–&œ ÁWZ-¦¦Æ&ÎÁë–al¶w¶@»ÅÖIra#M°ƒ·Í-MM-M-@lë¸#*ËKË1”-a6›S&ý“p ›1¨Ñ¼¢„6´Peªúä­¿…¡b+•(ì°®?a L”áªÑE†.q‹¬Çî‹,«J¥íÏ ;ŸCr©'ÊÚ¢k{P:Dlj hH êtçÔ„ªI+MG#S©§RôÚ r€'¢Ì®„$IÆØ’WáQä(€’òŠ! –wõþ&­ÓB²“ÁÇõ9{]·ú'ÄÙµµµØd6ûb B[‘ÂÚîÜžÜÝÕu¥à6·“Þ645››-f+iBCÛ5»åUÓÅâ0ð=l)Ô¶µr Ók³vXlW[ÌÍ-„«”4Úß–´=eY“DI–ddŠEeu²»â_ô*r(V-Õ„²þ:õŒÒç™Ä°•‰´ –SN(´Ì…h«éb‰qM½ë5T'êcl3ân—¶³pÙ ”“¡£4‹À2«OGaXUUÞ`;1i!(þ•â€QН®¢†*+rxU[ oÊ"ÓÓ iI …HuQúÈï;¥T510ñàÞêé½=Œ­2ë—ð5cÆIžiÙØ®&¼Ãµµ^E-ë€f657™_¾á &ó•fó…ÆWÌ—YMkhÑ«›¥½&í5‹­¥ÅÚA¸Ú‚Jf±àÚo JÈÈ0ØBaŒŒd2¼0ýÈï'x%?>¨V_zȺÿe¦ ëe=%šJQ¼TgteºŠ–)jÏqmµms Þ=ž@—H»»» ¸wñ—U9—X³Ø N¦C@’° IDAT† –* ) À{=œš˜šˆ,·°ñÔx$ Q¬«2”ð#i!"FÅÈ„/‚ÊjˆLnt“Â!îM$æ|ÂÀ¾{ýЄþ Qý¢?æOÆæ“±ùú²³`ҺŵCðcn¾`¾ÐÐhuÌ.6šÛ€éùʨi&«µõ²©å²ÝêzÊKØÚZ®Ú¨†]µ¡ríoûvó(óŒµÓ”˜Kj»ó“c’´‚{Diee¥†-­`‘ÿ•ø2•yh%pƒbÕ›ÜABK$p›Ðt/˜7YCUK¾Ø…ö¾0Z/¨ì©á¥€E¨`9 C•Ž T)Ô±)T2Z­˜X"©…ÞÊ2wUZ‘ÀÇ€ˆÈµ°o°¶ ©Éq<)‘Øô*kÁ*â‡>ßßß×;ì›ýaI„Ö&QºA$HÆØGãÉìÁ·Û9®¹Yo44@i)æBP¶LLoaÀ`8;s^öv— ®ì²Å† ÖÒn†ýj±¶Ü¼yëA)hI’ Â$Ȩh¨Ñx»MŸo±"É25™õéZÇP-Ÿ+SSæh¥~Pæï‰s¹ˆ›£¦j1QÌPO"Ád—–mÈ$*NrïA“#k»úL­LAªñÔA$ S©P4UƒÓ*üÁ¯ ÜÀà <_LD?|LAžÌ€¥øÈ¡8Mæ³ÀtÞ/)ÔcÊ&c†R(ר~œÄнlR<¼pïö õõówøäñdìñ\òqrqR¸&Ç„•9[ØU&ÝÖÖW›š.45^hjµ|§ ~µùZSCcãùƆKBû*èjw·šÈ‹™-­æf›­ýj3™¯; …åù™Þ æ•åBv9;¿V($e…òJL¡f§ +»Fp`‹1Ø:“[Øñõõ*,褚[J,cE¡r–  B€œÓ±Ýb+`4"¨²™\Û]«‹1žƒ`؆bYG+”FXJÜÑÈÇD\°÷ãH(³µ–  Š!î ü‚ÀQÄ–ÝäÚ¤ßÿèªæ?ÿê1Þ¤hHÛýFÙ\+èm¢ãj ¥l‚ç}÷ø¡{ƒÎ;wx!ùÑll1›]ŒÍÁ0Äæ“aNYÃ…l²2¬õŠ¥éÂ…¦ ÐV‹åÊ…†¤†kÍî… ØbƒÛn>o2¿f2Ú9--¦–öIÉfö²(IÊr›|/›Ey‰…Ã2•á¨Íתµ–u°ŽIo×KëGÔ„9, ÇDjÅhXÞ"1Xcý4<¶—–Ç*ª—s›Ì C&ؤ!M†q¤XÂ^e½—hJEvM¡¤}<õqàa ði ð4ƒ—XRg3ñ LøÈ àƒ†ÃB$º[þåôð”øwÈ ªœMi»,öàƒïíJ°A‚ob··¯·o€ZàÒZ6,ÏÃåÂ2ÌÎ&WÂbX— Õ[­6+¹ÛƦÆÓ€z¥™ ïr õü`!lm\'ÜÂyÔ·–×L¯½f‚"]G²P’¥€OCãã2Eëe-©¬<€ÒCkéecM©ŠÞO`u÷‹e‡äÀHЉܒºDˆ®%1ls Ú±ƒt¸È¨­¼ÏsüéøÍ È”QYPeØ¢>QO ¥Ÿy/êàÏÁ'dÀvúÓ‰ˆªd´ç m$‚$¶àóù"d· ¾‚ j?]øÙèèð/!ºà#°ýP6Hß Ôz´•;üÐ ßß××ß7:Êû¤X2&„ar³kHKáI8+ H#â\Aë¼iÕ›µ”Í.^hB¦0™^ÇÍÆ†‹×Ô{koC¿ÃÔxñ|uuM¯µ\¸—mb²ŸE/Î'×ÖôVáÁnR‰…WåðŠ0"Hñy÷tñ[‚[>w¨÷×× &¸9š R2#/ʾVÌi$ @»¥ ]“Øî¶Åµé´ÊÂ)» Tõû\‚šyBÂh ø}JMš‘6R1„üFg` &¦¤8"­†ã ÿ6=Üÿ㡟ýŒx,F¢Juò€íÛKÓ€•Riw>„X6ìå‡ûùþ!¾Ïé™Eøœ­%ÃsÙÂÚ\lÖ/ :I###÷× ý7Û! —ÍæW-hÚy­µñÒ³óç/!”]:ßpÁÞZÚo¸L.žo¼l³·P—ìµËg½ÙìÜâ¤( ¸FqM®Xlqe„˜|ПÝÓ™WásÆ Yì>ˆ+CpÁÒ\Ä¥•š Ü„š`;#äŠÀY!éýF+ÊÔO!ÓŠJ.’}¥Žë#PØêLŽë½êÅâAÿòÕ²H‚Ü&f 9pçt@ŠŠ>^åufýcþµ5E– h²L±‹¾ Ͳ~Q:¥Q~xˆïçû‡î CyâèñΆç& ‹ç&“/%¯(¸ûÝn/©ÐÑ} ²ú*ø{¡ñ¯¯Y¡ W.¶ç_5Ÿo¸ Í.×øj£^Ë,—¨sι“±ûÉÙa!©ùEgmn9ËNÕl’fƒwµM¸q|÷À˜ÛÞÑ—Úéþö:Xëë{Ud^ß&AÍÐU “ê‚ɸ†?$p“ÂR­¦¦žB‘ÀÄ¡ S@ ¬ÀjTŒ“ãL…"`ìšÌ-éíÔÄC %Š6|™˜˜ž€›¤ˆ/à#"iW„zÍÐ5«è´ ŒúÂÙÂr2»§w=4eåžgpˆçy·³ÿÎÐPŸgdÄëõŽÌJcsŸ|–ýü“ÉIAòûE¯×åö?^“úÛÛÁXT²¦6ê$¼n¹xþËe*i`Ð×dyõü%˛ׯœ¿H¹‚Ì—©Ñ|©ÅrS|1'Îûøäܤžœ[\üd™M¬“…ÉjZ,–œõŒÂB:vôõ7õ…[çj­mD‡ 0€ âØ%Ä+—Y1…ÍrÓ2`[bK·2.¸Íº±ÄÆ)m4\#!¦ ÔeaׂhÂ×dÁ`pR‘µht&°05 Ÿ@@ðMã„W”¢«J8–\AÁZ¤i!"jéËz+®TZS¤!¤ÀÕï„,Üô‚›÷øgÓ?yü8»¸¸8vß?9>66âíq„³ËbG3*”©±éò5ü}­ñüy0¸¡áÂ¥&Èà„ÊZ®£Á‚™í¨}¯›/#Ÿ¹ÂŸÏ> (íìä"^ˆ~–]Ïf× Ûå¤4Ž"çõ bòà„&œªlgf&:¶l¦·D»Ðæh¡*‡˜XRƒ\aÝ…,”–Mx³jWDPÛ¢5É*q+0$74MpãÚ#vÁÐ ªDãHÂ×`n„a«D# ÛÛ6À6"N“& OH!|bÁ7øÞÔTÿß.ˆq%ªpxHE·””ebC¿«ÏÝãðõߤðââú6a2<¹¨Åfïðn»Ëåæ'×F¶Kˆc¦Ë¤ –ïÚÍæË¯_3›Î[^‡#—]¾tñ‚ÙÑaƒ%3u8ì–Ë—[Z.¿fsÍg=cÞI8ýôWþï®Íâ¼4cp!«ÁµøF#° ´ŒöCbû3WØ¾ÒÆÞ¦Ð[ÖÈѬ%Ù(š€€ PHƒX(úúŒáÍr´¯¹Ý"œ€.£YM‹GRÀ·h£‘éœë Ã8U2²·ŸFhÊA^¥.md‚h/XS&"ˆQI¤v­4 LOù¦¦ÞëCö o* ÛÂÑMkh+±á~·ëöm—ËÕãæ}îžwtr2ûø³ß>‰-../~²˜¿?. =în—kÜ?7ËCqÍ—.^¼táu‹¹•kµØl–×/ÜËÄ.5˜šÝŽK ç-{«ùµKH½¯uðÙ°ä½#c~ê φý~É/Í*³pŠÔ=6‡ˆ¿ÈdÄvKŒ¶ìØ@újÆså’n©ºK("Õ¶dÿ©q#+:¼H°2]¡˜–¡r òmÝbšMkô†U„Y_€*›»Ñ{4«¬à}¥‡!ÀÂÄ©ò …܉Ób0 ƒõøJ"ÚŒLÿlzdøý÷ɉ…×è0‡G¥£Ãª\ý@Ô…ß¾~—ë¶Ë;|79÷ÙãíÏ?~üIvqrü¾4‹jæB…ò‹ã1O·­ÕrÙtþÒ%Ëw.™`¹:[í×,Ô·5¿Š’Y·Ãe‚6¸,æKP†Ë-W»DÍ×íƒ4ÍÁØ$Ð Í®È1ê‚ÍÉÒÊä D}dDĈZ¢]øh°Ñ¿]¯µÆiª]¥Å>«TáQÊdýgK¸—º/jH^RIt!êÓ%´L>ŸPSˆ³4Á`تÑÜÄT$ª—.6ÞAæètdêÓSáümQ[ ‰„êB€ÂY$|Cx¾ < ÁHã‚0Ôwûöß÷Où…d(.-´(îiâ°0ÖþøÇ`ímWg«Ÿ÷Ž„ÿanñŸ?ûüqÈú'ÇÂã^aÖ}³ó¦[ïÎÇ„–v ,íÅK—/6¼ú»õÍN®³µñÂe‚÷2MÚ´Â(¸M¯üœ.Y\°u.K¼¯_x J±IÿÈØdlq66›û×äH‹ð7;‹ 8Ô74ìäriŸí Cè²Ý%vαÙpÖb¬f5“:RÁ`y°B{‰H  a ¨in–hy¿p©oa“²‘r˜ø˜ZSDÙ¯QÂ&€mš@V 6c<`ÂXˆÐY™á3䤌¤(g">_o__ß{}ï½7è£?+ÚV¶@+„€­àó ÷¸\¼ g®În8­ÿ Ã~ò·…õÏ·»¸8>.Ý<÷Çݼ»Ó5â¹;› [i6Ìü `ÿïrŽ7¾{íâå† ¦ ¯~‡úbv‡Õí¸Þx¾ÁN=ó«íí¯™Û<Éû¼ÓíåÅq°±±ÉÉÉŸÿ||â0ŸÕbóš<+ýlä—â]* 3ZI?pU¹º¿ƒ_Z/zîÌämaW˱þb<„l -ÅIwãò*s„HDM²*-é–ñ—P.˜ Ú7šO ·º¦‚©™Yblœ&kq#šË©˜X2¨}QÚRQꀓ,çÛ .Ðèé ßt „wóÝéíéé{ÿ½÷}¾iJà %³œÝ+¬VóŠïë¬nûvgw§½ûÇÂä¯üþýü·ŸÿKãþ1?­>ryy§ |ÄÙZ,­—Mæk×.šLo:½^ÅÏ•ï\¼ðê%“å;¦ÿí»o^³›hžÞض´t kÁ)öðC+“ß?0*x‡‡GGüÒOúÿøÿá¿ûÝÆ.ÌóÀ€“Ï)Úé$¯¾ì±jx°²>¹«Ï;€»븄⫡‰¨h¡zH´K„mˆ¦YØÒ0 O ¸)ȲD:¥B%@ä_“DÓÀ=W€í§‘-“‰‚j|uÛ‚EDRTYC L/,LÿÒ· m"Ž|ƒÿõ½Á÷î¼7€˜EUUYÞÊïAö€mo?4¶gÔëêéìî¾íýóf·w~÷»ßþÓ'ŸMNúïÏÎ͉s1ÿ}¡Ÿ¿Ýí¸ï&5GGK‹ÅÒn±ý5ÄôºÃÑlúŽ…ÖÀ]0µZhÚ¼õÚ«fS›½Ñd±tØZZœ÷µçƒü`8ü`xÃeØ;êEyÿ—‘üÅ/~1¯D?ŽÀNU·õ™H}©¡>i,ëÀï62œŠ2†ï‘¢$j]/àôèQôÑ£G÷TéTʳ¡5b–ÔZq/§F¡¶0 €+• ªj:2YxH4Ž?ƒN4ðõt„y`d l–`4Š÷BÈ«KÚj|EXÅ•)Vâ‘è´o°—$aÐ7í› ˆ$ ùìÞÞGé ßqõ»zúÝ‚wz‹ÌðÓÙŸ~ößöì?ýö³ŸýdNBæ‹Mx¼Þ¯ÃÅñ)©¸nšZÌöËå×M0 n{3È /š.5^á,æ ×PàL mo˜¬ÖvÀ”´>'wÇ3È‹‚01@ùÄýƒï‡| Ï-þté: Þ²ÝKŽõ÷*z-c&l)Ögã!iUgz!²˜žL€J”M÷+Ë$ÀCýÃP4'#båµ"(H-• DS3jPýØ75»â@:”£E5Áðþ:Ší»›b«@ïD7ñªÊj8$nŠB±ØjpU˜îë|Ð7õ>LG ’ŸØb‡_ÊÍ ò=ü sÀã†Eèéç>ùâ‹íú§ÇŸÄþaÖëº1‚ª}?<7â½;>âá…aG·£ÏÃKa§Ã† k³]2µ»ìf‹û»Vó53¥Þ Ï_s»M¯Ý´#´ÙmWÛ¹v·Ã¯È'Gíá{÷†}>¯ËÁ9¼¼ûöXì—ÞýÄ?öø3š ¥˱¤¶]Õמ»U•IJåÚJƒÒÁ®¢ÆÃVåÅÛ+~…ˆôHfk‰I r«ËijÁ@:ŸkZv/ŸŠ²FãéˆJåÔ\Àç›Úé™HŽÔ7ø<÷uàk€ é…\ÃM€øKÑèêmµ„¢’?c>‰ŠihUXðùúú}ƒSƒ°ÈÞÚú¡­–"Cý·|Â0ä&‡0 ËõÛzüÙgŸýël!wÄãÈˆŽ y¼¾a߈¯Ûáty&¤pV«½ÅöúëœÙáÍV³¥³µáä‰ çÏ_yãÆ¥ ßê1¿n¶Ylœ‹Ã¹m\ùÈé¾éâ@ZÏç£]r†‘µFfÇ~6–ÌnòóŸþâ³~8<ŸÌ";ì°Å l¯*:Ræ9ØC:†J6¯ÑÚ&¶âe&2ý)¹Ñ‰ j\SÒKR´VN­†¨ ¤RT‹Ê“܇@.•ZzBË?Ó‰ÔÃaPØ¢K)ˆq*óGøˆ_ãpw$Èq6 š£´Ñ¢šME’äGѰ"¡²©!i¨¿¯ïý÷‡Þß'ƒ°¼ó‰LþOÚû½:3ØÛå ýÎ>ñ£ÉÙØg?\ø¼ôÉoÿá§ÿ÷Ð}Ûí½KÝÝŸ0<äñx]œ³Ë9ž”ƒwì6ÛU‹¹ƒk»ÖÚhu[ÍmîÖ†d]ó«M×ì×ïŽy&[“£§Çfi¶¶K=¸×ûV¯(ðx!Þét90ÞòŽŒºÇ~5öãÿâò ûdž?çNÇJ…¼Bë±dUŠ® ˆ“žš ø¦¦}ÔM¡ÙBÊÅ X(´I”¡3ŠF䳯#é´úelXè©J9*Yt):öö˜p|\Ó¬Ò:æ™HÕ,­,ådI•WVÅ9¼«åeyÅÇ$§))$‡@ üS>/G{]}]ï Z÷˜8"xøwn÷†{=>^ðzFîºáÎûO)¸9Îív9<‚&BÚ›ÛœÕb6Ýð;,­¯644_1‘5kv¿ary¼W¯Z,VÇ-çœþ§«‹ã½>ò ⸛79×ÈøÔÔTduuú}¸žÍÿñ?¼=7{ä˜V(é{÷—õC±~Âú)º4ÓKs3à§¡¸!t§§F§¦¦§Å覲ºJrË&eWãÄl‘a B«<àÀhý, Œ@.póáÇÐ úQŸ|HÅ,ý4ñ4¡âWM%¨¤±ýGŠÚ*MÑ-É –¼WÅЪéùû¾ A’È›ÈK¶2>ø§Ç#øœ\ÁázÃåþ¾÷-ÏøÝñ1á®Çý·ž\Ïßpr.÷ QÏÞÙÉ9n'çñ '4rn/×à¹Î!=Т°ækn»é»7~Ôù}—{Ìët\§ý$Ú[9«­Åfé%eéà:8®Wý¾ÑYÞ w7ëF,¼y³³Ç-†³Ù¬’¤½ÑªgŽôwŽ”–vD`¶4Ò[U7JXÀB $™¦®d ÁÍÊB5BÌKDW`H9:ÈD¤Ìiñu ·âIDUŸ%žþ1÷%ÅçT:Hû‹€»K¹à3ý Èwšªf ö!™õ4” ¬mJ‘÷o¿ïc©…f‘òù^?ßÿ·xÄ®[=7;lÝ6›¥Í{átd®wÃ=xÞEÌÇuˆƒÛÞáÂCÚqáh·]uxxÎb:ßê¼Ñfv»®™ÿª±Vr^x··­Óîö¹¡Ñ\§ÝÒÖ‰xÖaïvusvø—¬ŸSxAuý'·û¶ãVwçèl2 lc´ §l á¬À8k¸…ü¦É@wîêQt5¦e»7 S3l*¸BSÉÑGÀh5\à{aȨœÑ~LéxJU2”oý0ÏPÌQ¯&EN ˜o#¿†ûoUš£ýy3Ì=?eÇN‘iYc(ž“1XŠkr¡l8²Éac'O3téÁ;wîõ ÀVäûŽ›ív{‹¹¥Ý-ò¼Çã¿ënÃ&ˆ$A=î^ì—Ýö†Ëfi±Ù\Ž›\ŸçŽÃfj°»œœ¹í:gnhh´XZ.µzó›îÎNë›û^G·k·µ¶¢RUçÛÑÝ/¢äú»†ÅIYFDW‹Í~³Ç=ØÝ3F¡7»™¤ÝÐiGŠáÃÎU×ë‹¿iά mAseZû(¤µ.«1¶LQV„ÑQ!@+á$*t‘ }eÖ1”¢l¡c®¬j™\”Å! ™›ýþQÑ?›|\H&·¿ Ì*;53v®Z­9\*g…¼¶UÌÉF+Œ …E+±XxUû¦ñ}EÑBl‘©MɹU¶ŠŒV7 ˜¥Ô_G>}IÉZ‰¦sl¾XL§ÒÈÆ¡/áÔgéܳ%º’Z¦I¥‘i•­öÃFÛ\ R«w‡-CTOi½TÎ×Çó²$Lx·œý·8«¹ÝÂqzÔ3!„A~„¦'džx÷7:¯¶t ˆ½Žóîœm374:àÔLf×uó¥v[»¥ÃÜ []ž—ý¼Ù= zœpí­V‹ÅnïtÜp{ýâÈØˆèÇåbXD÷­žžnîmrz>q,{üØVi÷þÚøÛCZÃX®ˆjV+&i¦—2‚ŒKò|,<˜7#Ô‘š}ŒÁt„êK´1‘iašÊ9Šý9ZΈ˜@mòÜV1£å` 2j0QüF)æÒO# ®Ì¥3KÅ/AØ/—‚ÐÝ4Âr* ¦Á_”=y‰Ê×jdbAã„-Nl—¥h?¬/?>àßáœÎ®¶ææ«íímïxµÖ…À‡¾iabH™‚C IDAT¸p€ïånZáA© cîèpx8Ï[o¾ÒðŠ•óvq´ŒéÂ9çö.ÇÕVk{ó÷=ç]î•ó­m]|ŸÃÚáh577·´˜›íŽ›·8â—>š—> IŠò ÏÙïrv½ípwÛ\C‚øàqLŽoÂàî臬f+Œõ·zS¡J¢À:]–E ±B|b,™ž€—˜[1ða„z jBQãÁ(µ©anìð è¢zs\…1Ëç"ñH.É%ž·2!82<Zû%ĬE!ÂéàoPâžDS¸º¤¯3‡˜Gf4CªÑ Í™A™T±ÏÕÕÅKâ€ðî ³ §vÚщërò¸Gü ŸÿÄÑ/Þõˆèh¶\³·›Í-´)?Ðiih€ÜŽp­äÀ`g›ƒ³Ø­Vó5Ï]¿ÒÐðjÛu·ë ¤9‹¹³Ø,›Ýc÷¥IEIÎÓÎíßßßÓÝ×MûŸñP~iQYQ4:dh¥¶ã@µ¬ç2½K´]/ä©ÓÅV5³Õù±è=Ÿ_ …ÈuhŒ‡ &êÄ"FQ^Š/©4 i1±”+’£H @PÔòEH¬ȹçJ±¨¦Ùº»7¡þ% z‹ó´šJ…RO‚A(6 ê†Øæ ÅWƒÀu•h¬ÌkJ0â¼ Èt@„®wÛv®Ã ËtOü($Ï'•ärv9 y=øÚwù¶¶ævT$®Å„”Ƹ[Mç_y¥õ†×qÝt¾¡Ít©kw:ìVø2“çîxW3% wWr²Ýjæ­6[‡£ÇÅ󃞹µì"šï=|§¯§ËÕëè¾ÕÛïg¹¼{PÚgGLeÿW M˜éÕ°S!«ÄÙ´ªÂv&¦ãQŸ@N`­±€Â… =ÃÏ'r!Öå¦@–B%kxhV¿›(@ϣѯ©û(k¹o+⑯QäR¤¬Ï‘ÐÒ9f'êâ¨OŸRlKÓ‹R\®‘ÛE U`S ¾^Ê-€';õ:»¸·oÝêõÌÌ'æ——×íü¼t—úV<$™J0§.— ×Ûý†­õÂùóejæÜ®‹ 3Òÿ>·›š,Ó‡›³¾çù¦e»6+×ÞÌ!}9GÇ/ìÀdlym-ƒjJ3Áù·ßîuú$ÖÄ¢CÎÓèìhãt< ò¹õú®wlÎì ‰AŽx» î“Í}„ä9±ðH| ‡ñŠ"›9%Zóo¤%”hPßB`›œfËÆ³ØbFšQPŠ›yMϽÑhNËgVCjŠ­t& Ÿ«F?Œ¼[: DSé/Ÿi5˜¦]ÕgR´v$H&ÖeÃ(.úz{Û­ÍäÀHz]ƒ[(jï8}d:\Åòr_ÿÁ»÷îÁŠò|W— àvpov·tº#.»ýõ‹ çÍf«ÛÑ`rÜm·›ÛNî{ œãjóu'gm$Wví.×nµ´ã™mŽ[|5…¼““±ÅEl;£:é»Õ=ˆúÁZ^¥iìÐNúQòõ#sólG1}÷±XˆNŸÍÛÕÕ…‰éáÁ~ßhh6G¦GDA!=DÄ™óJB‘ÓiÔÀÃŽ³bû;¬F#¾@(§$2Jü!H<™‰oîmåâ95JËS©t.“BK=ƒyHS$ jêË º´„‚–Ÿ¤‚)ií)ÍvOb¤g³kó(eµ ¾>$zÁ/ùEqzzA%1$G¨-C/³…84±C»- ɸiHÂsÚMÁ7ŠŒ—Kè{<§ŸD¢üiN‹¦(X¤ÚâXç4Äõ7©/±QàÃÔôo‚`r0•^zŠAÊâ~Z+* Ü»ÕÍÁKAp{0`mVŽ{g0ðîE›WÄ®ñphüA@¸7ˆ‚t­‹s\øV‹ƒkjþá]Ø¢”5rîÞ=æ¶ØM–ëol%3²y0·ÕÓÔÐ`j¾fiupÍ×Pèx§Ûãó¿<;>&ŽŒHs¨–ø}à䜽nÞ÷a0(>|~Àþ¯5]èø`;úœÎçõ% ¥Â¼ “¾FG]ˆ‹ ´¸°àê}gØ/ŒúŸ ®Ò¢Rˆ3€ _•QõIË$¸ÏTTûL.J»>…¢Á\(JýHl`&Î÷³ªÆ?þô t‚ô5MðFÒTÄ–RÔmø2˜ ÆQß  })%µ²:Ó×ÝÑÖ†| ëJ{ï[Û€æ2íÛ67Þð<×ï*°Òăñ· ‡íV+gmµZÛ-×oX,f‹×èokãû–Æ;J×ÙÝiã:\]^~€›ll4›Ìß³u"ñ~ï{ÜMÎ}×Ûãõö»üa¡Á7– ‹ž·;0*af&âû`FÛ£Ã5ëz˦»ví|PØTéð:Úš²ú(",~6Ñ×wû¿ö ‹ˆeŠ À/ÈáЪ]AdÓrršŽ{¡ÂVå¢Á4 xŠd +–KÅA¸U<—›z£="Ñám‹¹ÜêÔC×Ü&âU)§B–’±Rd~É@¤Ùâgtô Ú—EM@Ûã3ö¡ê[Q¥ ¦mW¬ÍÍçôú³…ìü¸óÆ[¢ôàîÝ;NÏGâø]0˜á„&rVÎbmw¢€Y̦+¦WL&nä>?f±[L߃n8®8ºÜNˆŒá›ÌHÂmT›¹ŽëïìxËÙ…´;ÊK÷óþqlnññ¼4<ÈC =ÁPèC! l©OC«Drv®¾K¹^Í Š:O{hr4 ƒ¾á©þ¾ÞŸMÿR\€~Ï®H¡ø#ŠeÀ-£¨!šó¥ä ,¥ˆ·¡\‚F:a«/e DŸl€¼EEËQ‹ajúk˜_Z>É—Ôl¹Ú±‡¬ÜÓ¥§OŸ=´ÅL?ÔŸ[‚ü|8Ñ{³½­¶ØR&5·¹œnïü“s“îfîîîó¼è¹þ·w}ÂŒx÷oßõÜ{5 u ²ÜÒØlij27¼r©ñ ÿH³Ùjm±{î:­ŽÞ7î»8˜ÎqÅd¹ÜØb}C!ƒø¼Íu:¸~iü~ØÒŽÿh`$¶¶MNl|w-ÚKfDgàµoØôy•þë3ZoWÑçyOgÑ …ƒÄª¬¬‘·EmŸž¾÷Þ{}ïû†‡G‡}câèô°oD’VW¥0<¬‘¢ñ8B=Û¥¥(‚!OÄS¬³>C ôä ô ˆç¨éB~| lã´¢_•â¹\\ÝTñ°oé4ñ˜V¯/‘Õ}–Ëó™Ìót”lu)œèî†5pºº®;,–f“Ù|Ëyç^÷¾Ä;;8¯×í¹Ïû<üà[üŒp÷®«ƒŽ«BvÂ5à0sÍ.{[SÃùWL޼×忏´ÛÇüÖÖÎÎÎË®¶Ú;ÝœËþú¥×-Ë%³Ãaks ¢oÂ3À{…»?ôzGîÞvxý?ú¡×íçárƒzàÂPƒ†’òœŽ6X®êÿQTµr²CÇr×lOºÀ–ê&X(“”Õ Ÿ/05xojpptxÐ' £Ó”¾Ç¢D‘M–Váó¢4c“#ò…du)ÃŒ?uÄÔˆf‰P<a=]Ô¾"«m@7²J ñ¢”Ø@êÕ¬".*ÙÓ\ií7Ð ;ò8­KÅ{©©'€NGÇœh2[¯ñãw½^§kÄ;. ¾¡—´Øy7ôî5Ÿóm§ççÀÕ.óš©­Ùål¾ÐøJƒ™ów\m#Öö·F¼ËÝþ—͹nôz¬ÜÖö·Û½G—0I½ËÁA^ôŒ‡Ãíîq9\î1%œT” p¯ß7àùð]6-¢W3ã¿7¬2Þ–õc ¬—«° ùÝl¾ %¡mÑè´0=5üþ{½}ÃÓµ%é‘$…9Œˆ´©Ä¡º´~?WQÑ–r¨hK´ç_à¦m4H+4K¹¥)ÈÂû*H*¢,uxâÙÂr:$تRTT%‡eV™ù”T0³5êô?iÀ‘ŸÌLÀV½Í±£ýX,Öf«µÇÙuÃÍó¯÷ûîÜ•7îz»¥PÐ)˜¡ôÂyœí]m¼µ‰sR¿ ±±É%Žßw»ìæk{Ûuýºû‘Ö7lv¿—÷t66¼Òh¶:Ž› Èƒµƒ°%<ïFŒöòýCÂØÈ˜?¼¸¸½n'Å‘öÝ£ÿ"Pÿ¿£ôÿº÷T­v˜vÌ]:¾M!Ï/È5훚ì{¯Ï7…gQT 'iga07,Óê1%LJ-é‹ïØÑÓÔ¸LËþvT•LBˤáÑ÷§éø j`*@Ø~ | ;ðW©Ì°Ý¸…½¬‡$ÑN†|ïùÞŒl®ŠÔhˆ…±˜ÛTh)Á&4—HÇ7²U¹ìPˈj¡-j¤ÅÐJ"¤=‡“F§|š*kqßT üËô¿øØ¢Qu—¨nÆUE)Ò~¯i‚VoïÂ)<{–øã3KOCÁ‡8ou½ÍÑ”¬&SS;×å¸á»ëñúÇ<·{\=.Îü†ÃÁ <‡Êþ.ÔÁÅóŽ+nG³£ëz³õºÕR6r€Ëï0uºL&pÓýýÖNÎÞðº»ÓëírpH& ×is¸:n¸øá‡†ù‰á;t¼0gdlLðŠcsɘ_ìu¹ð£’vP¨VÙœQ=¡ÿYïÕÐÞet„¤õCš7Ëçɳ nB•¢´WV¼ Â#%ŠÑ.¦¬G“WØ’rãð'Ô%×y«²0Ac©‰h<ÁÐ2@>Ž;|ÊÿÏÖû?µ‘§i‚®3Þ(—ñØS¢ún×_F"å:q®^¨™¾ +çzb!5¨èÞ ´úrÌHˆ¢'ƒDgÎr hh¯(uâ\‰äë«`”h«k‹<¤VÍËt7ehl÷ÌÅaÖ]wð_Üû|R¸«'N Å—7ß|Þç}?ïû¼”_•Ʀ¦ ”¿e¦ÿcæ³–v4&Ì€éÉÇh YažËÚ¯W~A6†&ËM&)z·Y,M7›o6S¾ßÃõ JŸ~Ïë§ð23½Ýu‹ç-7›ÈqŒôi:MNyº@D×Úx¹áÒ宨à¸mi¸É7™m>ë¶ÛÍÝ6_xfèÃÆ††Ñð¾•w ¼³ËÞAèJ “%ÿà=I’ý„Õ”JIô½ïˆ7Ä…$º§uèÕËÆø.³¼¬ºÿºúÇ’Õc2ëjÆÕTr\2®8E<,(RÖ¬²î(¹éõ¶;ˆxËØøù š½’™lódS²m&™‚ ¡rb.VQïNeÉVlJ²@ÉÚ zžô#=Í.ÓÆ2ÁÁÆŽ1 ¿±øëÅ_lü9.±„•TæÞ`Ogik&0h#ÓÞáìç€,ÝúÞ÷í~è PŒëá{í`íøÐÖꔆ¸ë­WíðSê6ŽJ>É;¡Œ*ò‘‘ÌKާ(Ù´V®Æ5V<`N“{xs Ç…Õ¦žßܪmmêÚŠš¹ŸˆDÄÁ».W@Ž‘a“JŠÙVEOÎ))Æ£µ6“dähQ³ÄpXŸOÒÛÌ}JŒ3Ú"E/ñ>¾vpjìÉòêê“ϦÀV0¯¶LÙðzc¸0iõdù×dbb ¿ ³oÉäÉÇŸy™Û2Y*²¬Á‚ÄÐq¦[ö»)èðÁò8­·œ·)ó5]¿ÕÚr}ˆ»Úl¦„¶¡±uØéu ÍÍM¦“tÛf¶q]üwþÄùCî{Ñ–Û—.74šè“v^oâÂÕ€Dð= 8¼~¿,9}¾ai08(P®Ê¼V† }El9Ì㌳{híB{jk3ŸßÊcÿ ¸B‚¨XÀíDˆŒ'WRM_¡Äa¥D–¥g û…B&V—¦,‘ãQ66úíTb›¹Hv\w'+N!¸Ñ¿s+Ë«[¿F‘·]aÂ8[À÷ eùÕM}‡"ÛªÆ4„(“ø§ÕÚA©âq, |µ·[š-–vÊx{ºº(óòô ‚ËΙ._m"2eçˆ_ùy{W/`FŠ^;(/k¾ÞÜæír4·5]"ë^ov ‡‡Û%‹¹±Ah»i¶{}ŽÆ+vÁëô ùИßÐø>¹+ïçì|“ÅÆQã9ÁŒÌHØNƒG–G"#RÔ#I‚–›-4ŽÐOßœû"ë<ì5Ùý˜wó?å±ra™r¯¥fè& ˆ™z‡PØJ¡ àZ2€³  ¤˜zœ]öLFL,dÄ©L‰îùL$³’ÕU} [¡ ¹05•¡DkkÕóBjC[ÝÑõ½­¯tØ‘é­bH`fç’:ƈ½±ø‹d,“ºº­·Íí–Î.{½·ëÎ.!(½·ˆ5˜Ì·ø>ÂY¯àrºž³#Š[;nÙÚ( ¸ÕN$ÀΙ¯¿wñ²éV—oXÇ-íÒàm·@2ô#ŠjÞ¤ÈN3hÂÕdVÇ(ï´»ìV»ä;}#^—‹T y <  #dW…ý2ÏÕŠ£Oôµq²sá¼2nüsZ==®T6ó[[[-™¤Ä»zÝ®þD&¹ˆr Î)?A÷Ûœ’Aìbµxd2h(ÉSsÙéLfC/,~‰b£®OßS Ë+¥©©ÈæyjªQYšŒvûÝå-mG¹LýâëÍeµ.ﲬo°j›’‘e±×rÃjµÚ¸în¾«Óîâ]”Ô;\8‚é´š,®»W@hïuBð³…ŒÚrÝLé–¥XtpÝö¶Æw.6r>)êàšÌ­<ßdm¥¯%–gd%mÂÌ?ÇÙ}n§äqtö8{dâ_LP{­ù Û=AŸŸ™#<²2³”ÖvkGl‡ÎzßVuu°º} ȶùMzÑW)¬g¥@W·Ëí $"”ý6ȶË8{\ÄÁ…ÿ'É$ÔjŸ©3 YÙ€Hr… ïÍé:919¥´WŠŒMßËRX#ÿÕ÷*[[)ˆác áA±ƒ“­êÖ ì¿f|—˜^UÕ8°“D)貑ßÚº;ìŽÞnJþ].Æuôpœå¦¥LKqßÉ÷ðNbd|»™r^“¯ÕáóHÏsfÓ;Ú†Âó~_s¸­¹£•·Ùnµ¶ƒ{ÃQ vb.²‡3(¹eÐA´VŠ µÔ@ôºŽO¼¢»Jø­æPËΕžýìè°.bfÌîUÏ¥k™†s­º)YzC/A^"Ðiïu¹Å„KÒ_¹˜"ï…VŠQTM=QŸdŸ$Y‘÷’SgÉÇJÆÃ¾ÒÕ%©#Ѓ©DRÛÈŽýtš¬YÙ"_ÜH¡½tk«VÓ Ý‚*½÷õ*R¸ h °Q€B2«Œˆ¡P°‹³ÚÈoíön¢”¹]B¿àqõ¹Ñ1jïîíóð˜œ=Í”vÑÝÞnï¡(çÄ—ú£QB³©áâ;­ßóÆ?ò9$çM[+ßa³;››l¦áÑ® ß‚„›ÆsBˆ×+ Ñ 8â…ˆ¤ÊÝ8¢èwý¡~ N+Q M+KéRz=WüîGɆ2´ õ©ÈÓ*ëÂÍ0*kÕ̳’ÛM’&8‡¾r&ý¥j8%—"S²€ÄlqñIJ™Í¹‚¶*[3B~šÕvEÐ9E_!ÇY傾6c`3÷^ žœ§·tM)s‡^4t´ðHe¡ÈNÈÏwZ[Ì6+Å';úè„€Gˆ#‰^Â'ߢO@ë t´Ûùî.Áãàí¦–篣ëãVÊ|<„hè®w ÃÞ0×ð¡­±Õׯµ½ÛØîÿÏ9¹ó;nKþ€" Žà°Ý•¸¼²Ïô=”ƒa$ B !"ùÅ{’“!µ¹”VÖ‹ÅçOfh¯½vçuq† kdêµãÚž®Çóºž/“m•¬ðôyD)S‚%Ò[f\Ô>aÝõpâ'‹‹‹¬…ñ1kSÊ|N—‰;înL?еìÔÔºG6tÊËŠ¤l,ýUºˆµÚoŽk[µ=úÑ[{5ràåU´‘l—YM<µ° L‡Ä`w§ öÎn^ðô <KðBH’ƒº<íÂpïÿ`±ó¼G8¸F³§¼?Øeã$ÿONon4µ6sÎð(×ü±é†Ó{µËnºéž ÛMè»q“ërJþ¾QŸ07*xÈʼÔÏwú/é"¸üRÄËL$9 úµ¤(dbñéSl-8ïcDÙö9í³óͦðáÓ-½®¥ƒé1â`b†u¯§’èT¢g2Kx„ÒœÂ,2…ÕÅ$¹wá1T*³+¹ÛÕ‰èvÔ,kîš">Kü!}h¢]•uîný†l½GÎû"•=ȃ,À°ÆàUI‘‰°=dÚ7*ðv¾\7(¼;Hèjïµ.Xø¹°ÿßY­Ç]}‚Ý‚/vz»|ý6[tdÈÞÎóV³¹£ÉîœðÛoYl&^¸êà9‡/7l¿a²¸øÎNy¸_R¼}Q¡]™ ¢âç‰ò¬‚Žž€t?bò´RLIÍ4hëúúó£§dÙSc­›/Ã&cHb2 gfÛÊV](‚QЬ2&ŠJ¶$ÔK¦²É•d¡”b Ö‹+j’7µødeñÉ“•e,zÔ jñä Ùvxy´KéÖt!E±M ¿$¨˜žÊVªLóG•”îBˆ Z…¤?yíÞƒÿ7½³³Jˆ¡.¢¿sÚJ–l;ìîµY¯Y ݽNq¡ W 7%õöâ·¨ðñNëMŽÈÅ´æ}~4:>êüØù<¾ÆÙÄyÌ-·[}N§=ÌÑ¥pPš Üjkïà]èÄáÜ#^ʾ|ña¾+7#»ØÈ]IÜŠLzy‹BÖ%¿”†ˆ ™99›™Ë²dÜuU×+Lº¶Åýk6XºIS´›6,ΣçWD£•=øÞ;ч@Á3BHè 8û(×j·Ü°Ýtvuzƒ\»¥›\U{oq8Ã3âÇ-·;:x»Íiq:M ?òÍð>.HdîÙ¶¹¼—îwÞãv8¹¡!Þ~;v8Qí²wÞàÝœ- ÐÍàòûC8öïË„,AB6#+ëú0á€é(¢'߀ÚómèŒ*°@£o¡È¸¨R‘Ĩ>“ø‰e˜¦òJiP@¼añ×,ׇ³ÐXˆ³²ŒÎCâ˜Y[Öþ—LjªÒTæ‰J`QÙ¢RÝ+6k:³(´'ÀP*[X4’ßÄÆúö¨¥¯°C^9áö„z;m|zK‘ŒWŸÃ# brxœ'ï¤÷ñí®CpòÂ:k‡ ·ƒ"?ªD¬×>0Ûˆó]^™3Sb; ô:¼^úÒ®›^ÙÍ·9ÚÈ9ò‡7í¼‰kïS|Cvþ6Ý ¶vßaé ô€8{½wh0&EDÊV“÷%ô*P>_ÚØ=ÅÔÃá»Æ™NÕÐU©2L¨bÁ)·ˆóRÜ“‹€Öìç¶'÷D;2^" ‹…›]@7>Žº°m{“I¸©húuݪP4º—ȪŸ ‰éHƒ#Z…p  â…pWƒP^óôØÚ¬»Þ‚•,Ü®üšv ™H_¿‡ ì·åYBëœgÈ'ö9CÞ ›¿í´Ûˆ´·;œ‚Àñ^ïÐn÷ ·y¯t[˜M÷]#ã6Òuƣζ‹ï ù‡ì>á–Sv6O5ßrL BYòæíë¶›ö¥°O&çdz—ëìè ·B==|$B”JEEvf gd)K·éŽz1Éj5P¾]34ÂØ üƒVò-F,é7†xS*lšR¡™ Ul¹Ø †[ØXÄ‘Aá1ÁÅÊ ÜV‡q¡ÑNÔAßIJ&}9ñYf%¶A©0J·…‚V)×*h¤Þ¢œv— û€)ë0…]m’)0yGÖù„ƒuÊ IDATˆ~v$ä¢Áf5™[l¶c%ÄÅ6 '™×çs*`šŸ’ZË7ErG·ÏiºÑrŸvÚ;¾!Ñ9u67^ÿ ‘wJQ-곚Þi˜ìÝn¶kô…ùë—›ó’ÐÕm·6ÚLMNy^^ ìô NØ3äë»#&ä`ý˜E)èÅ$)•¸¯$`V“\ ¨žž£A]ÀS|[† kÄ­O“àP;¯TÊyQþf‡ *ƒ6 ÿ•Þ2ÁƭͯWq&‰óÙ=$Y[ÙÏ@ÏìôT´B ºIä®å#ú»Àƒ¢ªL{DâSOOH’Y zø I]<½ž@¶5Akn‹Ñ1h¦ / ç2>i³SXsötµ[‰ÌsÜ-AðD%îöm‚loxr^òÙM¯}äøÈéð ~ç-a€»ÔÐÆ{eÙÁY̦÷ì~%ìÄŠ’fOˆ¾i'çôzyçèh8­D%E^4pÐ;B¶]ÙÑwöO± w/ê½F)ì ¾Z 3ö÷6õs%ܺ&.kx£Ç“BQ/ÆÈ‚ˆö…•ìpvXúºEjX¹º³Å>ÚÊ~^Јg§2™}§õ¢^ËŸBNm—L[ÑËZs¬&D¹zŸÇõ„06,Á¼p÷x{9ë2n{›ÅbµÑŸÍÃy¹N>òaÒnÿ¸ÃF¨`o¶y½œ…Ę­¹‰»-x‡UñFÇwìæ“YPF•ÙaÁiºØØúݨìõ yéëȶ¦a¤´ìáÚL—›œÎ¡ »­²ÃfÜ Ä0zùßÉßòùGÉgǽÝI®.OD7 ¿eÛºÏNÙú”Ó Çoç"_×§°ž„˜AcMcY=ø;„‡U6!EaªÀô?V6ÎÏ`P§”‚8׋ò:N–ñ![ I7ŠzLÝé‘‚Ù½½ã#ƒr±”™¦Ä€~ÅÈÝl}¼¯X¤0º¢°n§DdŠ~wÑÝÛíôß^3™ZÌdà†Žnlcá~iÄ鼕7vJ œ>³™ìî o±E¸Û²—,mÍXâàW†¢éaÁon|÷Ï££QDÀ6k‡3Üú^c¯WšwØÛÚìÞð(ñµ+7L×l(UòÏŠ˜ôã†(Ý7¹²£70H$[”Þî³ PÌoQƒ§bõçA½O“f•]Ðw²í*:‰Ã«†3Ù¯l QÖå–e¢´L±qcµ ¡Â Û‹ÿ ¢’G1f‹BÝ/ ÉŒšÜ,c9öºÑ×–2Êg…®[î 2É‘sæ‹Je…Ÿ$áÎ>ÜdÚ>Ëj6]»r¥ñʵ+&“•ã:ìV®ÊN_ˆÒ]B^Ÿsvuóä³dòÛDªx›ùr£Å9Ÿv88S£ù_¼/+²šO{ ï6r>¡kÔïlmmþžïòåwn á¨êpÑ»¦64™{½n¦©O0dµô }Ýç• ¦*v¸=¼‡¬ŸüVÛÝÚc»iÙ¢yôƒï¿>®ô×Çý‘xV ÎH™'…|–v²ÌžÒ´ˆˆyá¨lqZ˜8ÇÅ´öl îRÙûM U-i«[`UdÇ=][©J}¾‘ÚÒp=òÌ´µãšžQ²ÒˆÀ·7ó¢8‚íN!gô!E7¦{^X)áä-põv¢Œx‹DÈ´ô¦ÙÊÙ;°ÜÉA08âó ‚oˆÌ{Kໜ˜EL(i1™,œo"®]vs“¹¡)¬L–‹q'gz÷¢Ù9àõ½Ýañùl—ßqQ9ì† ¡MØ;¬HÆ÷¯^¾ŒÄ'ùòLTI§Ó3 Šä Üýt³y#™5'¶Yúà }ŒÀ„ãS¶oè|ËÃ1ùí1nëÈã#Ñ‚ ãfÛX†¼¡Ö¸‚ô¶öi»ÅÊ[•ãê1±|õöhÐ÷ª±³M}s9•MÐï°Šºb^¯'JfÈLÈöþµ?ûa%|i$8ô|iø? 5)yzj¬çN'`½q {˜b-ê \7ßmw #~Éï“ýFϼ3Ä.¸vDvÞÅ÷õZ8‡4#yx®¹…ÞU´ÙJeÞË›.¿ÓìK  Ù,–è÷È¿y¿<3‘Ì„±RXÉ¥R‚ˆýZ·Z{>)Ôí öòÊÌY—hä´ßÊ÷3Dúeuçë£S¦Ëš›ÑŸ`´,¡·ÇôÁñ)R£M”û7‰f.£ÜGv†Ô%újU,*‡H.´ÙbT VÉ´»Ð3ÞÚg‹_°*gÕØ½üvfê8_xœ¼¿¸ÁvBn­b©.y®Ó*Q¿íÝ?þ‹†g¢’,†œ¾Q#ãR¨CSvaZô¸º=bß óµk×Èsß7Y­-V å®^»ÛZŸ4êœBÈÉw’q=ÞQ߈Ç%Ð ëƒ$¦ ËK~Á#ß.¯‚-œŠ ˜/š…ÙáÑ¡ð³Þn¼ÜèFs³²×ÛbºÖÂËñxNðÓ7æ{»qdÄëñ…|QEJESôK§g¤,à!1'ïì`uª±>åôì°®©òú|C[ß}ZÛ?ÚÛûŠmXÅé5ÀÓ³[Dã<„Ñ´ Iƶ¦`Ëað¬ÑeA^X ¯×™Ïä²-2««©äçq[pÜå<ËuU™l–CÖ?±ýÙ¢33Òœ …þ·‡_²<¸LþŽš´8ÖÝéqvÚ¬dÛ+ï7‚,˜Í–ÎNrÍ,1ôx}¢3àóWâ"Ÿ~‡0$½ûG¼}h&7¡I‚½Ùô¯~UUó’WºÙØØìÍE‡F‡>ïl+ŒÈé‡ai¨Ådj²“oVô‰Û>§À A;ˆ2§Ó|#’2.û½C£rHƒ¡‘i)‚&ýë­S¶|ÀèO8¨ï9…Y_×7þg¬z ¿cˆ@ \`ïZ¦žGÛ¿fÝ÷†e75Êlq ´·uT«2 ÓcŠE[`d5” ±î\¯hË_a8ý½y?V~Se¶e ØÞlþÓLme fÁ?|X«=}À’卵½ÝÖNîƒWèQ×¢ãºQ…éÄáуs‡ƒW°]¼àŒz‰M‘Cû0*m7ßúQ<,IŽækM‚¢Õ˜ßÛÃYo…kÃyb4š›àßm¸ì“g¼?J§'ˆ‡pÎhº˜“¸òÝ]~ºzò¸ä\DiG("„ø‚Î-ˆB0â¥8 f¿>ª1•|&Ü|Èΰ ÒX˜µO^)ãe5ÔUƼ ù ŸÅÄG*™Z\As¸¡¨¿¼ñK¦ñ¾…š6ÚØb¹JmÿÁ^Eß%8€¥7óyJžAR©ÅEM#¤Y^\ÝÚ«Ò5¨) ¿}P)£‚œMˆžîÎN› $¡Ñ§Å œÅæ¼tÓÛ¯_¹öAk³C‚§_Rf¤á‰¨ÏK\¿§³Ûf·{æÞÑÔtÕ›ª¤…xlœò¯6ΞKQ%<6]kh¸¬ ËéáÉœbýàçÔfçÃNbÉ‚Ãå•äqY zº/…0ç¬-¦&³Ýnï‡㹞Œ¶·Wc;Œ_‡‘‡ªõ]‘Ìe±•yZé_#–i««ÌŒ«Ë¿€ßþC “ùÌ´;Ë;(ónQ.VâZ²#ÛE&~X1X€±Â{´Õ|ÒË‹Æ>гÚë×§©X$ªŽFˆ+šZ‡F£r”2È ¯8ÿ¼òˆÐe«¬©rVžȶV›é9®é*ÛôÀµs(ÈÜn3›)Æ]3 >Ÿà y½Ñ\ý/d[DQ„Žç|%* ]íÍãñ¢29™Rï Λæáô„W&Ôá°jîò°\ôæŠiËû&»w¶Rpvñö @˜ Ž‹’pô:~ ”\›ÅÔxµÑÔn%úÕÛ;Ý…ÕÚñ©1& ãžÖ÷ó’Q_!ÍPg¬aAÖ×Ð7a˜ª¡@°±ø ¶»å€[ì†ò;±ˆ¯Ø±ÁÞc[½˜V¤Äôfx°"üt¿V5$ŽéËʬ…oGc£oVöɶJBQ º\ÞP"“J*#®¥â|­¶O×¶UÔìÜôX/·Ónµ²c&S£…»cwô²õm­æ+—.^&¤hk1ß`ì¨_V”Q‰Y÷ß…úº¹8W%b½Ên||&¬æké«ÅJ5®þªhKhŠÎÈÑŠþÐëº)ÍTNÄDn/[EŽªš×q‡ãL—é+¯\y+å¬vAèê´ØÝ#;_cÃ3¶šæõëE(Û?/1²]ha,L‡0>ãbh ®¹òd‘À õü Ö»IéÁóÛʦN7°!ºÄÔ4ª]54ïaY‹s•24Ú–ÁƈÐQ”;^;x]ËŒˆ÷b19‘ˆ †"¢œL¦äÁµX®Õ ¶Ž6I%!öõv÷ò½V¶ëýÆ›f}5]ä¸HÒ.5^¹ÔH9¬Ífæ‰çz£éÖ/D‡}Ò<ìu|T|ž÷p.™LL¿f~Òkïp 2]ÃÊWÐ+Ò…"X¼²ˆÎÒwÞ¥›„€¿G‡kït…²Ïww±ËX°õ{Mlca½Rc,9¥Dê믿b± ólíè Ùv™ ºÃs¡/ÌνÑРkŠäöôÜQ’£¥ÒJFY"§­’ë‚ÞîêÅ2+†oê8ÉÙ«¿>©%ú]Âýû±X$ñ“û9–ŒÅÝúÚÚc}e©Àâ§!®äºÓb5¶;^os8ìèå.aØî¦n6]ml´w „ ÂxzrvvVòùg>ø÷ÿ –ÏÕ*Åd¿¤–µ%ž¯(r—#_=©T+qý¡b·6ÝäCAYK+“¹P ’¦wÆ)‹Ž¦sé8% Rðœ&ÓÓÏ}¿É•?i4YÛ»G¤¬þ aä¸om[?F]—pÞ3‚ö|ÅúZ æñ$›*,Âi—WÙ6¶cƒØ1á½½½ÍåXÀãvSrMy ÅÛ¸¦.(µS¶úÆ="c2hX]ý þ»¹ZÁŽû}Ùápˆ19–!ëÆ’™dì¾§[Ò5,BÆèj¶´RR”i÷Ý@ÐÓÍ5ÌaFçÀÐíõ¦Ë —/a ¼á²ùÒåKï^¼Î;ŽO‰|Æ+PÀÍÍFýÃã?T*äUµ9•ÖgÒê¤$'e]‘÷Ojo(.äky¡ËÒé"©ÔR¼¸›MÌAìIG铬*Ë„LjJîâìm¸’ïãW¸aj¤´ùе½7’-í=¯ï%9_bWŸw8­²å[Ì{«{5v¢ý•±Ôb–;;ÚÊâãäc&>µ Äd|wƒa.JùeMq÷D1"(º¸ƒ2%5sñ¢`ç78¼ß.{Ñt¨Ý%rÿ®ÁO?%ÏÅîÇ’ÉD¤Ç¯Æuml¦/Ï&¡V† žOŽ7±òâSmmflÖl"‡e†« ï\¼Ør½Å.8äpôÏÒ@xfÔG¾æôýÛÿý¥@R¹ô8ÛWŸùTªÕÖ¶ONjù½¸@œìl£ÏÇÙæÁJíÁƒ¿ûÑßüÍßü}x‚ØXzþ¡BÁÐÞÌ:ñ(çf«Í°5æý¼¤¤+¬Åbêk‡Æã ³}„Œ­y`ã蔘ÖÈcõMÖ`ñ•„T›Ñ#Ϥ0þ±Èºî—uuP¸OwtR‘½ôwKêLâñª^#öA°Ë\v«\tfk¥°t¿¶êæìÂe6´ªˆŽ…•Óðóh™„4¡Bx‹[Âõ›Ñ ×€¹Ð†«¦&âT—®^½Þ„—«—._m´X,ngÀn¶òú¶¢WñøöÛؤ}MÏMäôÜŒ®¦é;{õæ¤ú:¾W$( Ý—u•®úñþƒJšïáѰã¾éëB‚ÃnøºÉD?ÁÒÙÕm¹A1õý÷»]„‚©§OŸ?Ãñù3ƒ'¶­ÖñàøÀHÒ RÛÝÚÚýê+8íÆªÆZmQ¹em±”óRN±ÁŽ!уFI·à ¾¢ø/7)ñùxrÐ+*j¹ú«µc@žÁÂ.Öe’ßî¯í×Òbo7%Äɉ•KBÏ຾±¹·—Ç~Ÿ2-vfå{ƒýnOo§ùÆ•wÉSAq±9«éÒ¥«ï]%Ã67_ojºtµ©ÉÂuv÷ôÐErZ‰Åu\Qü‚wX޾­¡ £RÔ*9Y-ã¦z³ýæÕÉ!Q 4Ò=YÑÔ­ÊñI­6€Â7kùšž ¸8“Ë'Ø9îæMXµ‡8s¿§§³hKc³s0˜È–žŸ>;=ØÓƒcÆÿ€Ùôõëzãt@ö‘^‘㬲 ¦!ŽAj˜mz.0;£³«Ùl­1©`PJÆ‹q-u^¾dš˜œ-¥ ' ÇkDGÀ—qvóâp¾¸‹ó¢h‡ûûúB$è‚@]—Ãõ‰Ã%ªëÄ!PQÏ/§žÄ£7úI)+'„~‡½»Ý|ƒrÞFrÚ‹„tQÈÌW›ÛÑ¥ÏQ¸îâ> F¤O¥û„¼Å;¾˜Ïçgã?øÎåÖÙ¥ý.ßüÓCºž•\±œ«ÔÎ_Ñcûlû ¢©š, ‘˜¢oüç-Á¢ƒï~÷‡³³“““ãç‘é–ìí÷÷Bƒ‘A! É)Òc±´»0“¿®ï>‡ÊR½ïƒ‰„]x}p¾´xÿØÈy_³ÊÍqíˆmÓ¢€Ž½d)¶Ä%Y0ö“ãß'0ìcvâ«•Ë t[(¹x:79ÌSî4/êy9à½tßW‘ç!q¦ôm•õô—ßÅò¡ýbztd°§óÎÎÞžO"Ê’¶¾¡³ÞšÕÅÔ“lŒa%•”#¢ÛÕmç,V+¶[ ÎØxéò» lèÓ ==¼«ÇDÙFIiz~Õiù4¥åõ||â£ë—.}w¶œSäHïÐ,ýÕûûåŠ^9y¶¶M–ýæÕööÙA­Bêï§4f¯öz+£[uàvÛíïOÌçµI•ȰSÁ”)?c•¡û1¢/’»§ÓHH‰Bî9Ö;`PúàÙ‹·ú·¯ÙÒbl³Û¯·à @wOÇ ¿Íâ(2k¬$®k5;ŠŸJºþ<=xbrqVËÉb›¹ÙYe:`wȵc̨Ôö`ÛM·š–ÓõœŽE`ô³+¹y:àv¹=ä irÚu`mm/¯Rz½’¡Ë·’e¢«çNww§Åjz5\ºéõËW!o0Ð/b YV(ÅÒâñ¼®ñ6IÌWòó?j%àøhvv~q\æ[‡ö··k»µ““3²,^É„Ä$A×k¯k“1USǽö>þóÍÏã|ÉowF+DxGeJݰYK&Ò}ÿÞ Ç%&2)»nŒí={3³gÈyá­ÇÆ8 Îu i•*rìæ]ÆVGÜû)Ö Ÿ/ÕÄÜþcu…{÷h·(Ed2iŠß}ÃÔÖ&´Iº¬í\H¯W_ת”çj«HÞ´U­.ŠE1Àg·˜N—–²PËÃNÎ fÙÍü2æ}V²)L£Çb‰HÀÕÓÙ‰Ýä”=Ü0_aƽÜpõêÕ6iÓ}¯ßKI’'Ùö¶Új÷éør¾2_§`þßÌÎçã*ÝÚͳkgÛ‡kkÛkdSø-C…jµB>yOÚ:¥_¶“Szžp Õôþr~^Qò׈!ËQ.Ë÷Ằx!‘bÙûbbþÏP¡yVßA@ÉÃ…Ó},û8†ÃÂ{÷_³á#1còͯ{l¡p~òšaê«Ù¨ÐéµÓÝòœSRX(óZ¬å1á”"ºÛïÄT_ã,cçè;…‘ÁT ¶A¯ç´tIY*dɲ;{Gà^˜=§Ûe±ÂÈDBÝŽn¨/Z-“ ;FP²¡8fºÞÊû£QçÙBl;<©ËXÜÀ"„*&~ð]G8ž§«éå®ÿ Fpx¶]·ë7ðÛíÃj…ÙkŸÖÉS˺ Û¶þwN÷ŸªŒ;ÛC }Óò|NQÑ•à•ÔY-•ÊHÙBLŒÈúæÑÑÏXYüìðÅÙ3Vqá˜UïÛ7xBõ˜um" qêÊ2o7@5xEÛÀ!xm¿²;ˆÌ¤Ð%Eº{y\U’²èjçܹ­cÐØ=Ô}6ÉoWÙP+ù/f~j@Áâ,|ÀÉ…~ÄzkÐ=þ•'¶ÐD ¸»ït¶“ã¶‘ç6*°ÅЦ&Ó5‹²Àèx½ò^YŸI?dÝe#½ê¸:\¿ÔÐüQ8ŸTãB«ÙùððŒ öܶÆcíåiäð0mÕ!È*,a‚Éü&èS¢ŽvqæÑ£§•"EAU‘襦Bæ@•ï‰2ÝmGûl›Zẇg§€®Œ(@M”Å´cLøž²£ðÍe6Ü”…ª’aÓ9¶È…;±½¼‹÷Qq0€!)%)ePP–”¬ä±wöºÕ21B…-”#ÑŒ„þÄzË2Ë&r j®ŒÆšÓš1®½û5Žˆ0{ª1 J`ªØírõØ{Ú ,–f"_XtÞni²Xz(€§ÓŠ,z‚0,‡'Ò•Dª÷• C Sè°57û‡•ð䤿ZÍöðááö‹ß›öøµœ2^¬­î+ÞNiÊø€Ðejs`ökÜ˵+¹ƒjm¢=’×ïpGÔúj'-•!Ù:ÂÚr¦Sô) táÔ(ܰ³ôƒ:&ÐM\Û=¢äaÛ¶@ Þš61Ͷ;1–k4@³ÓƒÊî´ÇOZIer$‘Qã®@Z¯A¶¶¥-o®b“÷;½¤o½¨-#ñ*eKZy—-ÃseW×È´ëëÊ4ÙÏ3™ŸLÝsú{P™iÃ$Is“¥ “{ôè ‹”°LôSpJRt"ëϪ‡ZÂ!Œ‡%‡½k˜n¤ø$å¬f³}h{íŸyí«—/ÖžÎÈ”n¯ÕüV»@¯Ž{\—0<>>,9Ú»sJtæ‹t‡É¢³×#ªZÜhÛHÉ™ÒW[ƨZÆ_¼8xñ¾`Ì›bj¥dÇtã|’aGÿЕijO’”í³½8¬Å…à€’†U6ùALê˜Õl×%·×OD]ŽÑ“©ˆÙmV÷Ý1…x,q° [Ö·µYa M:{ËêÀX¼Dš9{»ð0-ѲÉ;">K|&Þû?áˆÆÞ¹ÓÖÖÖŸmǬ?ÑM9E஄½4Gè7˜ýòQíQ¥Ðëöðx ƒ§ŸÆÆÇ''Ç…6Ss»óa›E²—¯^¾üæ›—ßüüQeFÉÕåÇ+ôå)y€’ïð¸ß+pÜ`¿_\‹§£N§+$JØ’©,†" ä·'¯™mO °=}fhS¼®ë'°ý`ÆÔ4ÙvuEC7ÃŒId>ƒôQj¥°H Ãæ×ì$ç´F—âH/ý­:ˆäã±LFŽ\gß”X*³zùvÒb*pukû”6#oÞXL"QQ®åËEmc…'ÓS%NÍ›Ýÿ,ó“{â 4«Zï´¶Ýi»~³{Í]=flé‚’—݈æâ|@ŸŸøhm¿r¸†)“ðÞó†•aÀ¥:gµÊìz̾A8«~‘’Ë•µG‡iŒL Œ+“©˜wpÐëýT&là\#û”¾=Ì—·Ò²Ã%DP÷ªèDÓ‹^QL([[§ûG†Û²½$gh[z»ß± ! ï£\³ÅÊU«L0˜msŠH‰Œ!жü ¸¿Þ5 a¿ZÛÝ»]˜]¹Ÿ¾0& ®³70=WÒ±y¬²§³q”Ö˜‚nÔј^瓬GM•€6LÊ]½Ù Ôs³™ûâ` ÿÜ–¼Ö%ǽÓåèï‡9aZeüSÁÕåðb}·<1ÿ°öåá¾pþááO†!£H €ÓŽ·k'Û¯ TxIOî˵ýÜRymíp-ÊÛl-NyøS¿pï±^®Ù5¢P¦S«äãB£?"+zZƒY*"fWvŽŽ(V`/ïá Îx^Ðó\¯¦jÔÅ ^WYéêèw‡îÑ'Œa'$–ä‘SDjµE•“íâçx¿vZÑw×=®Þ ×'ùBBwgÏߦK;ÿï:Eÿ ]ã¶Ç øèÝßÔYÙöóÌã_@[lƒHÝâº!<˜ùüs¶‡\7qÒÅݹsýúõ;wî´[îXî|âDQ$OUÆ!Áñº0t.HÑÜüÕÃk•´Ôk¿õ]ïÀÀp˜·šM-líœ?=¬ÓÚ·xûòñìòÁþá£Z¶µ}è–?•ü~ïmG×›ÍíœTˆs "àM¨ªV)ë9-§Hž€¢ïÖ+ ¯È´gg€¦ÇxðV è­²Jõ´F‰z ±ºH©¹k$25=…¶7\ª *Êã„·JjÈu+ÅmÄÝÝÛåèsvuw»=Ó …uý¹¶õ¦¸Pb›Ô· þ¡oâ Ž¾96Ýüd'Ç ÆÕ \ ¤(ª}M½-ø†~à¼ÕÔh²}Øaµ«k m_~+š=z^¦LfmíésOÙÖj¶ÉÈG·º¸æNΕCGk¾R‘y»½ÛLé•ÝÝ öÎËbPTrÖ–¯Å.tfZcÁÁïýö­nítgà8)Ç‚€QÌ)¶3/’08˜jTá‡{äµÕZõH××Ksb¿‹n·8·°TXÏéÅuH„¤×1 JW{ƒ;´( CùýIê1ö&ŸôþmË+è5A!(‹ózuEI~‹É÷Ÿ8 àG±¬ëNWtÁÈqû JïK„AãØ(÷;ºìÁéôE'&¾|vX{(ºº­-x¥U IDATm\Ç­oµ¢?Ïf³QįíÞš—Ú«jE/¢tô¨èî¶Y››MW[oݾ}«µ¹©ÉêòH:Y‡YŽ0½— ç"¾ ñ›úDc’÷à„më6h[NbÌœûåQ ¯¶etl_½Q“í"Lœ¿ Cƒ¶º±ºÉàåô]}][!S¦—–(ˆb!tN'¬+aBKýÈÏ7ÔEøïòò¢ú8FXi•xü‹ÅÅeàð×à&«ž`° %•q9à"h…¦aí;­MÍ×›®7àÞ‹Ü‹©Ëú²ª.Ëb×û-ÁK±§¥õGÿþÅ‹åRÆÓKö´µ´˜-=½}.ÊAäJ †}YÏyaßµ*úÖ‰,>LwwÚ»í–Í&³µ½gL¦§º—ÏKŽ®ž;G¤ŒXÏ+2ÖZ÷ ÒÂó]FŒqHÝœ z/s¦ì@¶n^ö‰ÓÚÖîîÎ)žÈçkìüœˆ@ò1Rˈh{•ßwê¹ëIÈÕêGGÄVÓÙ¹Rª”] __Sê…þGsæË+?'´ýIbêóÇ+¿^^þ§Uh£ùŒM´B ç~d=…¼`0àú¤«‹»~§•þävk›š™èmŒÒÜTœU(ÔØý~âNès´~T¥ÇéîœØÛÓÝCœÅîñ <ž>Çh±º½ýÒðZãùêgÑà3åhg·‹w÷vw´Û:)ÉîîM”vO)k(O;øžvò[»¤ê{Ê cÞþîŽ^©!Æýƒºò퉡‡]Ÿ9­ë ³:ìí#v s„^hâ³å.™X¶žþfS¡¤Ÿ‚”Äj>FP¶Í{šv¿ÂüÉ2%¯”9׈¥häô t.R¥3Zv7Ðuÿÿ'v¤&l`ûºÕLLR5Ó)NˆØE»Ú-®Íwp–ÓD™o³¹•»eo'‚ŸbÖÕ“Rïp@Ež‘ÿ§‰ê³ê~’Gî¢õ]½˜ƒî>1Z1РnXzTk˜ÊÚÚš‘ûøÞž‘äiìšVRiô±Ôf ÄÖÍó‚Ë!²Ÿ”ÚÍ7,åKä@лeö|cx® Þb,™ói ¢xËz±ÈD+ÉlÌ({AÂ=ƒÏ…d,›D„Éž¨©œ~åóùJþA¥¼Å&ð(¢)tŸ¥„·+”˱Ý[Þ€È ŠTS™’B¦úÝ|{s3×DÁ© –½qÃli³q-æöæv‡¨NRf²G×QtapÑëuúÕâÃêÚÚÉ@nÿøäà47 †F¤"c`ßÊÍp2rL©€ä³‡œ}¡¬·Nw^y÷é³ýZ~Vvö8>é¢oívˆ16Ùv:»Ú,ÝÎкAXÍÖØ*m,РXöˆÙñ­yɲô|Šù´¿b<Û͜ҬÉ*bÉØÛh hË‹›È¹}ŸhX8FI!•å¹9z]X˜+0üƒ-³ï}O ‘X‡ü'q䮄Òð–Ù:|‘u6‹bPèé¦ß|³¹­ âHä²Í}:îä·ÃŠQ¸L2…w¯ä|²$ÍÌ>|ôó5"FÛÛoPÏ/I#’WœY{uŽ´Æã‡zV¾>ÎéñˆÙ£ã}£÷êÑþÓ/ãŠ$|âý¡OîtEˆ$l©a‰·ß´ØC£KÛÞ½=2‡ÿBG”YÌ„5J*ØOÿ¼ˆqÓ¹LBÆÜLË–èÊ5]R—0^€.úº' ž–YaKÏW(›Ø?13úúWV2ÓSâôÜtbZœ.`ê•lªƒ<rd±G‚U ¬‡Á ¾1 ¶”€è×=2m0àÆlâM³åÆU3ÙÕÊ™›ß£ÀÝlƦóæ[^ä÷ª–úT ”Â+z=q|r5O©Såé£ÃíC ]ôüB“C!ïÈèÏÁi¿eÛ7ÛÕý׺ªØ­-¶vA”ur÷ÃGµ‡ó£’ìåQ¿ßÉuñ]Ž Æ5-åwÜ0Y8H{iÏŸ=cìШ-ž±ìì5ÎtNYK's7òUbù„år‘îˆÌ÷"N;͹ɘ,cƒ²ª(@lzu®NbÃl*µ¨-çóàgjBòP!h'²âT¦õèu ýëØŸ¨fëc8™ÇX³cÈ.b0m™üºD?ÅÛA@g··6™LM&ssS›y/¦°ºÉl»žÐÂý~Ý»Ž{Ÿ~:ÎÎvj_|Y[;xôlíÕ!ùꋵœ<’Ô‡k/︌mRlHlæF³Ù”+{ûÕG_>xGç'Ò>¿Ïç´Ù¹>û^²¨ÿ§üª<è¾Ãõ¸CRV…Û‷®ÍjÄ1–H\0¼V­!ðÍ_Ç>#øÓʼnÙYe¢\Ì¥•¥´’Nçô\9N7ï¸êÞ»¯ åÀHÅž²1‡S#®¡Öx± ¢²¨CC)í3–yMOEè†úí4îšNHÓ#rB¢';b‰à?Ñ¥$ø•ç2 g8ôU?Ñ¢î’1R–5릦Ùø)–ô©ÚJ‰¾VÜ ˆÈÂv‚“9W°jfY¥ð“¯³1AºÅ)ߥ`ú]¸"˜ˆyÙ¸ ÙòN§À÷9zyG¯ xœ²L}¹¨ŽK#A@}±˜§wûì^Á´?g~Ë*Œì³ÛÛ5]ænÿ 80‡3³Åbz& çæÓÅ"tŠi¬»ïÑíµƒöVJ`g9ŒÔž1Ð5æy™ÅFÙ)®±®Ç(SldnŠ=Å9™‚ªŒëÉc™eÅéi‰âEFš6JÆ^ãQtuêØúº 5V œfÝgèË]§[dAÅ¢`BvnbŒù}Á|±6§ŒY̸B¹rJ–c÷ý÷ÞÕÒdj¸„E m-f›½:ˆB Až×+†œCJz²XÎÇÓ©¤"*AŸ3Ù'ç†ýæÜ¾/×(á…ç~CŸ|ùÏo¶ŽRöM^¡† +é\nF™‰ÎŒ†‹óEÔ½Òd,úî0Ø…]}xÓ#‡l¸ÿìÙ™ úúF ²iëop§"dÇȳjzh #Ä‹DDz¢ 9Ëbù)v9Jði)3—…x¾RHAKð‰jˆO‘ãaöDàsvÕ’-ªÙ…¹ì n(¥f•lƒ*XDúç §M) SX’ăwÙM—ºJŽ{ÅÔfë°wØö®®.AV†%ö}þpxVS'”qzIÆãj™8jõŸŸà¼baŒaÂ78u8‡ÞíJ¼×ÒÂq¢×¯åt\‹CÁZMK\EKoN%îÁTª†¨N˜Ӿ`çdg‡çmŒÐ@Ì Rlós‚ð€Ðî:£7âHB2Ø 2ÓÓØˆœ˜6|úÃàW¬®›± †ÛûÀÞ,Þv‰@ÊJa” é-iï¬S^­Æu–©ÁkË[åbQ£\W›k æèåˆ(¸ìVSã»—ß}—;«m·ÝXÙ¥¿:—ž!_#ˆ$yXÏŒÇçg‹ùŸ$GgÒ¹ù8N+ƒ‚ÅÔD|vBÉë•êá@íyLc•Åoi™ãn¿: Ÿ×‹ÅN¸Š•ÊéqµJô7'{Ý.—¼ÒéºÃºè“›Ÿ/ðŸcgH-^~ZÛ¥?üÙþÚywRÝ®Œ,|ƒÏQ@£˜uëð»}¶_;Ð5)63«QbY;®¾¡+söãÇì0åô“i¿dÕôº^Õ¡±’— ŸB*ÿÙÙÙá…L–$–<%¦‡Ñ YSsß Ô#Æ ð^À«‘ÇPMˆe€ cÄ02,#…`d]C)ËZÆ ×Dº….ôu²2ùïÖ,g—7Ù°M¯ Ý¦ ¿(â€MMO†•(’ 8S‹ÍÔxåÊ{(/6šïôüõ_ßÅ&ãùüÇùÍZå‹Z틇_|ñ°òôgž>zfdºßb o1÷wßê«KÀUòòêq“x~k¯Z=<3>{³M÷ü †N±¤&¥¿x0ÿàáƒ/äžy‰$œk0»gôxP“AÎ@@ŽJ°à!@M‘QÇÜîþ»cpÝA²û‘–(dF9ˆeïg’hÉCT*µ¬¥ ¯ ­á }%û„qVçn[ 6ÖK×}£ð«¹,fã!h¡£¡c/ã ˜PQðyx²í5³Íú¯®Ü°uÞþá¿ü×ÿò¿þŽó»þQE™QÓ³ùùâƒÚ£ýê21½<}JÆ}¶öâåXöܸÛhð—dTØ–lL¨ u) cœœž½yE/ÛoNÞlSȺ]Ì‘³åC•òÃYŠŸÅGûXG×F÷¼÷ã¶Å=Í2–0ЃŒKÑ H05M;Ö—^Üx\DÏȺ™XæüV¸zDR)Tr6–)!ÙØÙQ7X>ŠbHýÖ×ÿqýÿùÇÒoÿQ_ßYgk<Ù äv1>¹Nì+Ä.jê̸¢ŒÊ’×èíh7a+|Ë¿év~ôGô_½w½©Étõ¦Åéøþpxr2‹S¯<¬< ›<¢¿üÑ—_¸d±óäöÛ9î7ðÜWßú¼ÑeÃ,¾}PC Z=`äí !ÅÉ6Ánõ·®=³øŒl[\§àùüé³§çÍâ'¬0ÎÎÐAÊ.°£EV¥ššš†Y§§©™óÜc†ÛÂk ª@× 3ÊWdäŠ É$V?'!m£×µÞWR؃¦³¸¶ŽúZekkw§TÈ.²¿Z¢„¥Tøm¡°ôÛ&ËZ6Ö o­ž«;iX"‘¦œ—¢™8âçí\7Ç}ø§d25]¿ÔÐH¦m¿iëî£Tz2ŽÍìwç¼Tú_<¥?ùÅÚ‹í¬tðòշ˵FYñ÷E†úãàKŽÏ¶)æ‰ò£¸»½}¸}xxòŽI¦}vHWïéó܉VÏWŽž>ÇòØÓ㬠ég,1»0ÔÚ¾˜Ó‚oÕ’Yé}7L`.[WêéÇ”“HÆýÿâò\T¢d¼‡k‡kíïùôyqýÇ¥òóÚÑþg}ÍNvТpvÁ¸±YéN{Oœ ’U‘5ЫH½ëA(ƒâxஸn1B!ë>º]˜Z«º¼Šl•°%…¬¦o²¥åÖÃPÔŠ»µ½£¯ôÒ¯~šýéoK¿ýíÂ/~UÚØÀP5ÚÊ #¦³š86ì-ªl7™–b™(8Î?n¹Ôtýj£™³Üq ·oÿi뇷¾Kç¢3“³yœÙ‘yÐçÙkkϪO­±ýß2í7¿Ç„?pÜß~{xøÏ©0{ 1ï>ÁùÅòêíƒGôØt°¶¿ÆJ ?;}Ê6¡³Æš“C¶âù-™–\PüÉ”‘èxKþ:ìêºYRv—á­8H/ `÷¡¶¤ªã)UIRĉÅb2[¡»JYÃ2…#¦NL2Ü’Í8²›ö¸F¬ö·KK¿--ü4³ðÛÐ/<ót-4hãÀéÙÃ8Û¾®ÄdéSÉÁµ˜Lm­mׯ6™¯·qßi1›._n2™8»Ó)HÃa¬w…Ëù2zyë'âûdcÎ^¾zù‡eÅßm¯ýÎhÿ0ÌL“i×ÖÖ¶ß~Ѷñò†!ÈX÷ 3ð6K'*Åÿ@ìÿzø¼Lœù ¶‡`¹lä g‘S?ùIâ'̺S?¹Ç`áÀ–,K¯cýè{%·£XFñŒð6àö° êX)5KfcrB&(까á@|µ‚s3îµúá?þÚÓÊÞ‘¾þK¿ZúÕO ë»»!ËBàƒI†2I§Ezâ;+j¢q’£Ål¾n¾ÞŒC‡ë×?hºzù…³÷š9îV—Óë••™ÉÉ\)K‰$yD@•T\_ŽãÜv ]V±*NœgD’²ˆ”¶ž[/æôuÊtqdÇôñ9¤½XO$&ùÅA‡ÝÒt•YýlÔ´¥£ƒw~ÔÑÚÔö‘ó#B…ÙâC€í¦‘SÉçãErFÊ€÷Ñm‹Öº—õ‡AĶŸî.Lõu÷à )»w–™õƒó:úö[žÀL}†)¯<¥<0­*á°,¥ÖËú.e/ž±~qö6\@þ%žÛ¹îÔ]/1086Æ2‡»pcJzEâ·.W¯ ¶…hbŸž[HH N/%M[‚ôv㘚–VÐÙAam’ƒñe¶š+Ï€ÞÀ¶J"»T(Á˜ë(0µ…A`Õ301æI%¥$ïû¡)‰]ÚL)áÒeú‡à'²´Ø8Îjó$ ñùù¿ùчž `( «†Õ‰økyÍÐ'Ž3: ëiu© dS%øªJoaZŒžêôž6C¦ÍÁ¼ê ËK$ÿ »›l ÓÍ&Øö†Éjµr§³ONWŽÊDrOŸ?c~‹óäµÄq/‚Z†ºcÄj ‚î¿%{"Í­SÜ©Û}11Ò¤¯¿+ÊKêRHN§—I’—Ò½ÈEKÉãª63©NkäÁ©ì#ÃΪºN7?+AÐ+æN H ¬P,ÎjIÒri™h/× 0¸xÑdƪ¡÷¯4~`sʹ‰Ñ?·µtØl6žwú|щ2柲D…ÞŸæ‹,®"ábµ—ÌfŒ‡=«î¯twtwwß-|µ[;Ø>¡ôöìBÜßÁ’†™ÏË‚7„·¯^u~P©D¥! :¢¢¼0“Þ­>?}öìëOxÁjo.L1 @ÔÆùžwÉ®î»VDij»Œ¦=ÝݽÌQfùºIDAT.Wÿˆäá=ôˆc Ê€$Egr!Y¾—Èåç's„¸“ºz_Žèj“ãÊx8EVURã)v“3r¥«ZÊ(É0ŠýRAÈi‹ñ8ñ¥X&Ǥû^¡¿›ki¼tñ†¶k&èÅ\¾|µÉí™øû¿ü°£ÃÖÒòÇ|/?"ÏÌÒƒðñ,°–G²×ÈÎU4æ½õt à@Dl_ÏôôüõXæˆÒãí¿‡‚z oýÉuBÛŸc°z­B©uZ[LJ¼—b~ïýÃ/ž±ã22.ëÉGÕ†e¦ 0|eu¯»8Å¡@¼(ïE=Þ£hÖÛëîG]½Ÿ¸§‰&@ˆRƒ’4RPs”×ÏÈršˆ˜„žÇ0…Òñññ0Ù”òz†™EQåÊ¡“\Ó ´ìrÝ"5àn.NT!E yݶf¬Õ%5‘Û¾Óx³½[šøþ‡öÿÇÒZÈk£3ʼn rÚ/‚/T+¡úFt¡L&®Vë&zuÎÇ^½Ø>|ñóÃ£ŠØ·PÜ}¶2Ìv½ªH@F¯gF2|¸ý_ÿ’.À}åÉ~qV‡eÑãñ9½Šº®WŽž±eÒ8>gþÈÆX–`”ÃÇÛeÀqY@¼øÿšº¾Ÿ¶Î- «üjÓt†¦ÒÕ”B•ÄndDG!JÀ£>`<8$øÌ\Õ¿šêÈÇÉVÌqh¹fL¢xðñØ×Øq?pQvE€ êXʨ¶éªQÍØô±šA}Kþ‹Ùk&½†’&¤,ÖYûÇ·öþ¸·€v¥´þiizzÚjeŒ%ú6 Ýóy(Öv6ÂñŰFñ$¾áõ¨ƒ,ª¦Î©A¸T¾f!ˆ¡ƒžy¼IY…<Üϱ™G31‘¸€¢›¼›šÞÀƒ'é/¾ÿvWG¿®]§kïì\úêw]Cƒ ce¾Aÿ%þÍJx1GÈ&·’…J©r¼UèAYuòIé ¼L]ŠøÄÂrí¨¶Ÿ­ÔÙ8Û@c†Ó.`û+áW‚Ãcx£›8›h6šår±P:ú¾°Gü‘W74W#¿%HÙ  4ÛUHo‘s‘â:é$z\ã"Âá]bh%?$BvOÿQ"Ú²æZ%°[õ)^õß\ïGT¢|£zä<4ÜN©Ä6TE Â\…MZ¦UÉÆÄQ†¡Ý»ÛȈ )@›¥ êˆm?ÓÑÓÓC¥RÜa»oÄxí¦Ýþf«ðç?—ü¾X¡W¡˜¬KB¶^ý·úÓOŒ.½Š¥BWÝèë~ÜÏïW·*GˆSåçÓ7ØBlOVÒ‰×D[¶\«}K ÿ.±è¹4ÜYT_ìD”Õ(7ô^~_ç$Lð–Ülƒ§mïi‡=®¸ÚEñ ËÜwá ‡„d׊(gýbþºÍ(Þ©‰ ú;ꘒ¤Ù”À^Ò˜²ª…ÜŽY·ŒÅ[jDVîiqXWµ¯ ½û6ñg„/… ަèSá ͈AœÎIã`g;Vÿ¼?ièèíF;¬«÷í‹WŒ’eÒ¼9ç &ID2’Û^¼Î‘È[gæ¢áH/ Ëí,kâ”®ýˆ¾ ×`{*prø+‹tVèÂkJ­Q¬W*ß+‰[vŸÝ`øôæÍx>¾¸GÈA÷Á…Kè7°(Ÿb|Š~<ÿ8!²h- „ÉrhýQzž33¨®c é˜#DʶéiPÚ=sw‡~c–°Èe•>±ª*)bí#]ØtIRó€’Æz3¢k*…‹ 1ôƒÛ¥Øg0¦¥wÀÞÌNë)®*ÐDè!þvuu÷võõbñø¥9ß­Ï?‘‚ÁÛ++’ÉBµPª$‹…B±\«®8z)b¯^µ$º8¥ÿ¾8­ÅÆ ñ¨Bœ,é}„¯2Ÿâp›§!N"‰¸õbåAbå?sa¯äæ ÂÈÜæ{ +n­ŽÖlÖ0»ç[?{A%›Àøl'¢DÜèÙxqn&!'›÷Ûæ%¿ÕfUdç¬[r: l°]El xC0=S™YÕ|U[…"Põ¶ºê]U#¡”’¢Z* Ѷì7O§·ÓÛÑí§±í(\üÛiœÇY*ˆ©º`lgM—ˆ·}ƒÃCý}=½Ø°ÜÛÕÛwqè³Ï®}6‚üë«0å_ÄÏB‰p-TŠÅZñÛz±P$Њ%—¸ú¿%q‡v‰¯*Q&ÁCJõÚ²ÄÙfƒs­òµe\±7>‚µ"}ë•pðÁwYWñÙMv_6ÿòåK ×’âÝW bmÕoÛ’~¹V’Kå¯8N‡Ÿ öæ%'ñé(‚™À¸ÃÛ},–CóV%­}mŽý!ñ{)S‘N.¢>¥¿B)5µª¦BÂç„mUpšc/F|ÒënëJ"¢pLÜͱ îf©Ü£wrx ³{`ØÐßÓßÝÛÛÍ®°®‹&ËÕsç/,Oð«ðJŽT–­0]kßkô×Iv‹è:Vq$Qä{"h£Ä{”Æ üA³ùºyÜD v|š —qò nxkôÝ*µ\âNð›ïÂAÝc±{¨4Ù´¿¼㺸:ƒGvjè'øgffØ]Ë•,OåDp¦ò oHnn\þ¢å(Ë.¯â°bÑ­ì˜vDs3.™…§šu5W}ØtIxU‚2¤Š@6›ð ·íåeÌ¡,¯/Óûvt}™‘~Š%z1†—É´2®8;t¶‹Û;00888d — çÏ^6ýÓ5Óˆïv"q°•¤Ç¾B ¯J‘Ñ2|KGµZ¹PâÝKö…Õò Î^Êèb¶¤ÁÁŠ“-F·‰®íßð·ÑªËjÕZq+›½ã³Óâڥ)IÇÑÇå pçó­$”$à ³6N p¼@Ä„QIŽ,`'²œFë0¥¦SK2×¶Œ0ÚlGPs¸dŠlJÀp^ŸáHŸHEH"R Lc¤Ä}·Ô§é;2gUÀ÷>±4…›=â(Ï ÇbÏ2»1.ŽÑãÙø½{ªÍ8hÔutt#7ÔS¥k>ö¼qúªÁ0,ó$·ÄÛ¤ -Z+?´e,ó(VI'*…z¥ÎàÒë¤Qjœ”JPÒ27n£)°<þI`µ-ó)˜måÃ>×no¨;v²ñx65rƒ\ÜõªmÉÅ'ä`­ÿ.Ï=E—Ñê^Žª*æÉR„$QrÉåò·ÚN†–ò\'ó|\’¬Ø|Ké„ß ,ïç‘¥L¤˜ŒP\{¤²©œ±Ô0zÂT†%nX†³NÁ1 cS°<>æCX< «÷T·„ýÌ:Šc½ý=TFô½OÑûŸ jÓ¬oq%›O=Q³vzʞíPCP« ýªT ¿ÈºJ â/½d‡xò-ó–g¤Í×ÇÜŸA#_UD,ærùŰ÷ÆŸ|Tw¢}‡Þs·YýpôêŒJ‹uîDÝ6Û½fl~‘(ËñG#è)ŽRàQá½spïÜáâ Íæ–…U„ 0ç–f®[Í3“2i…ß!Æ¥%´)9Äk`ß§•†IŠeX‘Ç6{±uv£«Ñ§Ñm¾›Ç™Q¼Åcqf^§±¯³ƒÞt:6è F¾×Ðø‰Ñä †³+èvU“ôìWJ—J5ØcÎ’4p*Ö„ZÔëÈn¡µÄÝ£““2ó_Ùà8½%TÆ‚¼‚¶Hà •\öNØçóQÅÎòæ¸ýü}¸‡1[Q}uÄ—v¿‚·à‚Ã`…\²®eÌèwé]Ãr%„³Öì‡aIæn¹C¶’LÚfmf«™1ÕΘ/Y"YaxÀ ²p±¿–p}Døî íʈ¥¤±è:D`[ì ˆ.§·c0‘Áݺ_™tyK1Ñý‰N×y¦³³«»O×ßßG‚0l°Ø-ƒz#<ù·ïç¹ÿµ…r—Ë.¢%‰*Õ‚½ô¢ÌŠÛ#–b‚–¿ªqThbÖìj€6/½7Å!$çb tÕj"—ØJ³á ýÀãÙ|þ BÔÝËfãÚÞ¦ªåI~üÀ¾Æ^;â›J/ôÄmK.IJ5šÞÍ ^g°—"%üb"š± žž¿l›r¸eë”Íaž›g(G`„&)¸KŒ]¼ìÚY–ž„À¬.?Ûyú·uñà#VëÒg¢Oq‰r†g[|*Ó°þ2£iÄ·Íø>z4:J¾ú?ø`ØðÁðå¡sCWö¹¹[·ï'òOP ”pl[*–Z¬mÔ “Mñ$Z”• " •¨8(£> Ê¶Ì]©þùõñÏǯáÓC£ª[.s÷$~K‰gok™ìÞþ~&¼/îåïÇ3XÛJ™¨C‰Hæ+WLS·ï/ÿN9˜ÍäjÉå'xîÊZ˜Ù%.ežÅ¢¼ß@Gýi¿ü3H\è““Ò:oÈσÍü2NÏÖ„jIì`¡@…@†•™Âé´³ó4Æè¢vàÞÌ3‰(ÛöŸ{©d‹BJðºG¿À¼Ý­ë|[Çu.% zÃdž®ZnÌy´Ål6‹32˜=pnŽë ? ‰‡½IÜE@ä#´ AÄ£F© ]YœáŠ’¬ù3ä¬müÜ Y³“2¶<‰kÁûy šT÷Ñ ‡÷H|©X$°ªÊ^Å5våÊ„Þ8¡5µµ|‡5aK±,{Û~JÑjjA—‚ž(08#£rÍætNK ò i±Ód¿¼IGÖ!¶e†–½ºŒ¬CSÖÊÔ%vbG)Å®(ýÆy0ƒ½{ü mHvžb4…û”§í£ìdíy»g`pà‚qÂ29b2]±ŒØoß^¼ gBË"Z=ÀV£ªf)m4`f$€š A`ByU ^oÑŽ¡ßž²1´•&@Çð1š_Ä[^÷_Ýÿë;21ô Ç7TŸF2ðÍÇéW]Ne|ltblLåÊ•6’ñ19§PÀBd™°%ÚÄø_—&l(ee_ÏìµÎÖ‘tÙ ¼È\3’ÍÏ ®_ޤÒ©5ÜDA²€y=µFÿEÒ»ÖÝÿzʨî¾;,µŒ»Æ°²wV‘@hÇ&ÁÇ6 ÊUV±PÂðng{›?º;?>7l0ÙívÙã óaeÉŸ’ì§©V_•„$ˆ&-RSB Ø6~ëqO„‡ý‚ÓÜÂ=néýÒD†V·ãl^»+=2û{ÙXPCkÚ§e”Y»Ïb™¤Ê) LŽé­æQ³y´M†ÁG„ ±–ä–xeXQB+#kRŒ¥Ü8ÂíT6îãØl×­VJ¬×­\š-É# ØC‡ XÖFßðáEDJa#iÜ›œÚ%Jj ðntCç˜H«<ïšNóº ÊTRQmY%Ú.cÚ+ô½²ñR'ílïì{¡lrÒnÿüÓÏÿ Áñ–Häžðõ¾8Æá 눀:aQ¨ñ‘×± k­y .r+ÊÀXDkæ¤qxxêø8ð6IIˆâÅ£Ó›kØÛÜ|sûkXSƒM/ ããîÉññÙQ½~”ÞÌmÌW–""%±òRk”b¼mâ˜×C<öQÊ\®% ‹|–­wfî”±OÌÆžlDø¢üâ¡Ì 3öU“ñg0“R¯]ãKóê‚”ª½Y¬ËyuJ£Ú””ê x½”)Luvt´wvõ\µ¼sþܹË#S¦ßû‚ÁI»/¼™Àät»ˆGÃR Ø–‘1ˆ8uxø`áðþ°7ÜýÅôZ°ÿ|J]Böy­Q㤣”À *ÿ±÷xs3¼*_~9þÉäœ ‡z½þÒÄ´M›”ô°¹m‰‹QÖr2àpQF‘$Š&`ŒrOÂd!p—`rÁóìÇ„/3§ƒ­w_˜%4r$Û”DU0"bE…@œÝ}I­ÚÿæÝô¿Û¸¸t9½Û¢)Oº>"¥Â0{*”Š(¡i€P’¬*/`/_gdé´ÃÃCCïö¼uöüð5»çƯ‚á¯î¬$O(?ÊQ4ÃJÔ:—ôÈ#×jˆCqÙlp@¤àät¹åuú›×¼Ú¹ÁG?õbõ ÷µÎlÞ祚šÙÓÜ…·˜Æ±ãúÌÄÄÄø´Ù|Ýíøû¯Ú„~ºÐªa ­v¬F¡ºQŠlËË‘»ò݈BŒu±i %„þ:šÓVá²âô’*g™—Zˆ6ÏCAŒI»¶¶‡:¶þðºLÂt—“¶F¨Ñˉ¤B¡ª­ÙªÕ•^sûy¶££è¼îÌ™öNƒw›Ji2Oä&xv¯PÝYX·Ž0Ûø›È–ËÇ€ê+ð, LÙj/ø-¶=}•~ÅJ.·w ¢nÞÇuH u|üú•qÅ+[~o{.]3›ãFý¸sìÒ`KQ Öez'` dÏ‹pý EÂVŦIñ/tpi±m– _PJfµšÍ”+,I­aúQ ¥D¸ ]_ß&Ê.P4[[{×SËô8¼Ùº0[m0vþPˆøëuËNm@ùrn60ëîï8Ó®ëÕõëúÏž;÷ÎÇÃ#×nÜøç7ƒwÛ\n+¹U(¡½X*B*¾ »‡¢¨]¡£¤Ï›¿Þpa[>• î"p’QC!™K k°™½¿©a_|lffÖhœ›0šÆÅç±ÛeÒbÒO˜GI,ã~ôQé§èráHrKo^º¨FÕeŠÓDÛe´^—ËÏSÓˆe~뼄‹Ç ‰î„ÙŠä—=$éçs—G}°@ÃýسºNq ‰Ù:âÜú6>±ž:e-Ï_§–BK˜rǰ0²¹@ÈKùâÜ,QW™£D°}«S×ÛÛ«ëëî?Û£Ó½3tùêåË#×<ÿÎ?Èç¶pb¡R©“:6˜[Ži¼ÿ­1 q̽ðf+´œèZþÒF©^«låòžÙYíÞý¬f©H¼˜•/]2Ès²ÕxeÔ:ëýñØf²^¸pi qìÒ¨Åüá…6xC¹{8ã8ìãár5dÕT”âõ¡;“äglmâ5Cy®ubjÂÊc“ ™~Z”UPÞÁÎ}Èêv* „×y‘ò3âqúthuA̺Êl!âr÷Ø+ËnÂ8S”Ûî¥Ì;ç6]ì:ÓßÕ«ëèëêïéîë¹|Ù004¯eҫĤ1£~Vµ§ŒV‰~ø÷TuÒê \7›ÇôfR†1ÉyáÂÿékà>ó‰¿uEzTXtSoftwarexÚsÐPÖôÌMLOõMLÏLÎV0Ñ3Ð3R°´Ð70Ö70TH.Ê,.©t(®Ì-H,ÉLÎ×Ë/J|öb«ˆJ0zTXtSignaturexÚ3NLI4M4¶H4¶L4I²06MJ±4²Œ,L€œ´4–KòrÒ*OIEND®B`‚kazu-yamamoto-Mew-ff9c41b/etc/Mew.xbm000066400000000000000000001303101256455547000175640ustar00rootroot00000000000000#define noname_width 347 #define noname_height 200 static char noname_bits[] = { 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x02,0x08,0x00,0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x08,0x00, 0x00,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x24,0x92, 0x48,0x22,0x10,0x41,0x44,0x12,0x49,0x4a,0x48,0x4a,0x92,0x44,0x40,0x00,0x41, 0x00,0x00,0x24,0x09,0x40,0x04,0x04,0x08,0x21,0x00,0x00,0x09,0x41,0x44,0x84, 0x08,0x22,0x44,0x22,0x10,0x91,0x24,0x42,0x8a,0x20,0x22,0x01,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x24,0x08,0x24, 0x49,0x08,0x00,0x09,0x80,0x00,0x01,0x00,0x44,0x24,0x20,0x00,0x00,0x00,0x20, 0x00,0x00,0x00,0x02,0x00,0x00,0x08,0x20,0x00,0x00,0x00,0x40,0x04,0x01,0x89, 0x44,0x04,0x11,0x48,0x00,0x00,0x02,0x80,0x00,0x22,0x00,0x00,0x00,0x00,0x00, 0xa1,0x20,0x00,0x10,0x10,0x20,0x04,0x01,0x00,0x00,0x04,0x10,0x10,0x00,0x10, 0x01,0x00,0x80,0x04,0x00,0x00,0x00,0x82,0x08,0x00,0x12,0x40,0x48,0x00,0x00, 0x20,0x00,0x01,0x90,0x44,0x40,0x12,0x90,0x00,0x20,0x81,0x00,0x01,0x40,0x08, 0x04,0x40,0x02,0x00,0x00,0x20,0x10,0x00,0x00,0x10,0x01,0x02,0x02,0x02,0x40, 0x24,0x21,0x20,0x22,0x41,0x02,0x10,0x80,0x02,0x80,0x10,0x00,0x10,0x12,0x01, 0x42,0x00,0x01,0x00,0x08,0x00,0x02,0x08,0x01,0x04,0x24,0x48,0x12,0x21,0x00, 0x02,0x80,0x44,0x84,0x00,0x80,0x44,0x04,0x01,0x40,0x80,0x20,0x00,0x04,0x00, 0x08,0x00,0x00,0x00,0x10,0x00,0x22,0x00,0x00,0x02,0x12,0x42,0x00,0x44,0x08, 0x24,0x04,0x10,0x01,0x80,0x00,0x00,0x10,0x10,0x00,0x00,0x40,0x88,0x42,0x00, 0x08,0x00,0x00,0x04,0x00,0x00,0x20,0x00,0x08,0x08,0x00,0x80,0x10,0x01,0x00, 0x82,0x08,0x10,0x00,0x89,0x00,0x00,0x24,0x80,0x80,0x00,0x40,0x00,0x00,0x00, 0x20,0x01,0x20,0x09,0x48,0x22,0x84,0x80,0x00,0x01,0x14,0x25,0x08,0x48,0x00, 0x00,0x11,0x20,0x21,0x00,0x01,0x20,0x01,0x00,0x80,0x24,0x00,0x88,0x00,0x00, 0x40,0x42,0x44,0x00,0x08,0x02,0x00,0x20,0x00,0x08,0x12,0x10,0x21,0x01,0x01, 0x40,0x08,0x00,0x00,0x80,0x00,0x00,0x20,0x80,0x42,0x08,0x01,0x00,0x00,0x21, 0x00,0x00,0x00,0x22,0x00,0x04,0x00,0x21,0x12,0x00,0x40,0x00,0x88,0x20,0x00, 0x00,0x00,0x20,0x40,0x00,0x84,0x04,0x24,0x20,0x00,0x01,0x00,0x24,0x08,0x02, 0x02,0x90,0x00,0x00,0x00,0x02,0x02,0x24,0x08,0xa1,0x44,0x02,0x11,0x00,0x40, 0x02,0x02,0x00,0x88,0x00,0x10,0x00,0x00,0x00,0x02,0x22,0x00,0x04,0x09,0x00, 0x01,0x01,0x01,0x00,0x20,0x80,0x00,0x02,0x04,0x40,0x12,0x00,0x80,0x10,0x40, 0x02,0x48,0x12,0x48,0x40,0x80,0x80,0x42,0x48,0x00,0x10,0x00,0x08,0x08,0x40, 0x40,0x08,0x01,0x20,0x02,0x88,0x00,0x22,0x00,0x00,0x11,0x00,0x40,0x24,0x20, 0x10,0x10,0x01,0x00,0x11,0x08,0x40,0x90,0x04,0x40,0x88,0x04,0x40,0x00,0x00, 0x02,0x00,0x01,0x04,0x04,0x10,0x28,0x05,0x25,0x00,0x44,0x40,0x02,0x08,0x08, 0x00,0x20,0x00,0x40,0x00,0x24,0x00,0x88,0x00,0x80,0x10,0x00,0x00,0x04,0x84, 0x00,0x00,0x12,0x00,0x02,0x11,0x01,0x10,0x00,0x02,0x40,0x04,0x24,0x48,0x00, 0x00,0x00,0x80,0x20,0x44,0x02,0x50,0x01,0x80,0x00,0x00,0x00,0x01,0x01,0x41, 0x04,0x09,0x08,0x02,0x00,0x08,0x01,0x24,0x04,0x40,0x04,0x81,0x00,0x01,0x88, 0x00,0x40,0x44,0x20,0x04,0x00,0x40,0x12,0x10,0x02,0x00,0x01,0x01,0x20,0x12, 0x48,0x10,0x00,0x11,0xa9,0x02,0x0a,0x11,0x00,0x01,0x20,0x00,0x00,0x10,0x00, 0x40,0x00,0x10,0x80,0x00,0x20,0x00,0x20,0x02,0x00,0x08,0x10,0x10,0x20,0x04, 0x00,0x00,0x08,0x00,0x48,0x02,0x00,0x81,0x10,0x49,0x00,0x00,0x04,0x00,0x01, 0x02,0x08,0x44,0x02,0x54,0x01,0x00,0x10,0x90,0x00,0x40,0x20,0x00,0x00,0x00, 0x20,0x40,0x12,0x40,0x04,0x00,0x01,0x00,0x20,0x00,0x42,0x80,0x04,0x00,0x12, 0x09,0x81,0x90,0x00,0x08,0x41,0x08,0x00,0x00,0x48,0x48,0x80,0x00,0x00,0x80, 0x40,0x10,0xa8,0x00,0x14,0x04,0x01,0x04,0x04,0x12,0x04,0x01,0x49,0x12,0x01, 0x01,0x00,0x04,0x80,0x48,0x00,0x88,0x00,0x21,0x00,0x02,0x00,0x01,0x00,0x20, 0x00,0x02,0x22,0x00,0x08,0x00,0x88,0x00,0x02,0x01,0x11,0x48,0x88,0x20,0x08, 0x05,0x05,0xaa,0x02,0x01,0x80,0x00,0x40,0x00,0x00,0x10,0x00,0x00,0x08,0x04, 0x80,0x00,0x10,0x00,0x24,0x01,0x12,0x04,0x10,0x20,0x42,0x00,0x24,0x02,0x24, 0x00,0x80,0x10,0x00,0x22,0x01,0x92,0x00,0x00,0x00,0x00,0x02,0x04,0x42,0x50, 0xa8,0x00,0x24,0x10,0x04,0x80,0x00,0x00,0x21,0x00,0x00,0x80,0x40,0x40,0x04, 0x90,0x00,0x02,0x00,0x20,0x00,0x40,0x82,0x04,0x08,0x00,0x80,0x80,0x00,0x48, 0x08,0x82,0x44,0x00,0x20,0x00,0x20,0x24,0x44,0x02,0x20,0x00,0x80,0x84,0x02, 0x54,0x09,0x80,0x20,0x08,0x10,0x10,0x00,0x04,0x49,0x12,0x00,0x00,0x10,0x02, 0x44,0x20,0x00,0x04,0x80,0x00,0x00,0x00,0x01,0x02,0x00,0x08,0x80,0x00,0x00, 0x00,0x00,0x88,0x04,0x00,0x04,0x00,0x00,0x48,0x00,0x21,0x29,0x12,0x54,0x01, 0x82,0x00,0x00,0x20,0x80,0x00,0x08,0x20,0x00,0x00,0x12,0x04,0x01,0x00,0x00, 0x00,0x91,0x00,0x11,0x04,0x48,0x48,0x10,0x00,0x24,0x00,0x12,0x00,0x42,0x20, 0x10,0x01,0x00,0x92,0x00,0x81,0x10,0x00,0x04,0x00,0x02,0x48,0x01,0x54,0x11, 0x24,0x84,0x04,0x04,0x04,0x01,0x01,0x00,0x40,0x80,0x20,0x80,0x80,0x00,0x09, 0x00,0x20,0x00,0x40,0x02,0x02,0x00,0x01,0x80,0x24,0x00,0x92,0x10,0x02,0x01, 0x20,0x90,0x00,0x10,0x04,0x40,0x02,0x20,0x44,0xa8,0x24,0xaa,0x22,0x02,0x00, 0x00,0x20,0x11,0x20,0x40,0x00,0x49,0x12,0x00,0x00,0x00,0x04,0x12,0x20,0x04, 0x00,0x84,0x08,0x50,0x09,0x49,0x00,0x08,0x00,0x80,0x00,0x00,0x08,0x00,0x04, 0x01,0x00,0x42,0x40,0x04,0x20,0x81,0x10,0x05,0x81,0x10,0x48,0x29,0x01,0x21, 0x42,0x40,0x02,0x08,0x24,0x00,0x00,0x12,0x89,0x24,0x20,0x40,0x00,0x00,0x89, 0x10,0x00,0x49,0x45,0x00,0x00,0x20,0x40,0x12,0x08,0x02,0x40,0x24,0x00,0x00, 0x24,0x00,0x10,0x00,0x08,0x04,0x40,0x28,0x2a,0xa2,0x22,0x02,0x08,0x08,0x08, 0x09,0x88,0x00,0x00,0x04,0x89,0x00,0x00,0x00,0x01,0x02,0x89,0x10,0x00,0x00, 0x11,0xaa,0x02,0x00,0x01,0x02,0x09,0x00,0x40,0x20,0x01,0x00,0x21,0x90,0x00, 0x08,0x02,0x21,0x01,0x00,0x14,0x82,0x04,0x89,0x14,0x29,0x80,0x80,0xd0,0x16, 0x01,0x20,0x01,0x41,0x20,0x48,0x22,0x00,0x88,0x08,0x00,0x42,0x20,0x40,0xa0, 0x15,0x10,0x49,0x00,0x00,0x80,0x88,0x00,0x08,0x08,0x01,0x08,0x01,0x40,0x40, 0x00,0x08,0x40,0x90,0x40,0x49,0xa8,0x24,0x49,0x82,0x00,0x00,0x42,0x55,0x24, 0x02,0x24,0x08,0x01,0x01,0x80,0x24,0x00,0x20,0x01,0x00,0x02,0x09,0x42,0x41, 0x02,0x00,0x00,0x48,0x22,0x00,0x12,0x01,0x20,0x48,0x00,0x04,0x08,0x02,0x20, 0x00,0x08,0x04,0x94,0x90,0x02,0x48,0x92,0x14,0x24,0x08,0x08,0x74,0x81,0x90, 0x00,0x40,0x54,0x90,0x14,0x00,0x21,0x02,0x90,0x00,0x00,0x00,0xb0,0x88,0x80, 0x08,0x02,0x00,0x00,0x22,0x00,0x40,0x02,0x00,0x01,0x20,0x01,0x10,0x02,0x41, 0x00,0x21,0x21,0x02,0x54,0x21,0x49,0x02,0x00,0x41,0x20,0x41,0x15,0x04,0x91, 0x8a,0x02,0x45,0x02,0x01,0x08,0x49,0x02,0x24,0x48,0xa0,0x0e,0x22,0x12,0x40, 0x00,0x22,0x48,0x00,0x80,0x10,0x00,0x02,0x90,0x00,0x80,0x00,0x00,0x08,0x22, 0x00,0x94,0x50,0x09,0x88,0x24,0x29,0x01,0x00,0x4a,0x88,0x2a,0x41,0x22,0x40, 0x75,0x32,0x52,0x24,0x41,0x90,0x40,0x00,0x02,0x09,0x92,0x84,0x00,0x04,0x00, 0x80,0x00,0x44,0x12,0x02,0x48,0x48,0x00,0x04,0x24,0x44,0x48,0x00,0x00,0x48, 0x49,0x0a,0xa2,0x12,0x49,0x02,0x08,0x88,0x10,0x01,0xa8,0x96,0x88,0xad,0x5a, 0xad,0x4d,0x00,0x88,0x2b,0x15,0x42,0x00,0xd0,0x45,0x10,0x22,0x10,0x01,0x08, 0x04,0x01,0x00,0x40,0x02,0x00,0x09,0x20,0x01,0x00,0x00,0x80,0x00,0x22,0x12, 0xa0,0x48,0xa4,0xa4,0x54,0x20,0x01,0xa4,0x54,0xc2,0x55,0x55,0xa5,0xd6,0xd6, 0x56,0xa5,0x42,0xaa,0x02,0x10,0xa4,0x54,0x01,0x44,0x09,0x01,0x00,0x00,0x10, 0x08,0x41,0x08,0x00,0x01,0x20,0x01,0x00,0x11,0x01,0x09,0x24,0x40,0x45,0x05, 0x11,0x49,0x09,0x11,0x02,0x90,0x4a,0x02,0x48,0x55,0x55,0x55,0x6d,0x7b,0xbb, 0x10,0xa8,0x55,0x55,0x84,0x10,0x6a,0x29,0x11,0x02,0x20,0x00,0x44,0x82,0x40, 0x10,0x02,0x48,0x20,0x00,0x08,0x20,0x00,0x20,0x40,0x80,0x28,0x11,0xa8,0xa4, 0x52,0xa4,0x24,0x00,0x00,0x54,0xa5,0x12,0xfa,0x56,0xd5,0xb6,0xae,0xdd,0xcf, 0x6e,0xeb,0x15,0xa9,0x56,0x35,0x00,0xa4,0x24,0x09,0x02,0x10,0x00,0x02,0x02, 0x20,0x01,0x04,0x09,0x20,0x09,0x44,0x04,0x02,0x01,0xa4,0x4a,0x21,0x09,0x84, 0x52,0x85,0x10,0xa1,0x52,0x08,0x40,0xaa,0x6d,0x5b,0xeb,0xfd,0x76,0x35,0xb5, 0xb6,0x56,0xd5,0x6e,0x8d,0xaa,0x48,0x01,0x00,0x00,0x00,0x91,0x90,0x88,0x08, 0x00,0x01,0x40,0x02,0x80,0x00,0x80,0x10,0x48,0x48,0x04,0x8a,0xa4,0x52,0x29, 0x28,0x02,0x08,0x55,0xa3,0x14,0x58,0xdb,0xf6,0x3a,0xab,0xdd,0xee,0xde,0xd7, 0xdb,0x6a,0x5b,0x2b,0x00,0x52,0x8a,0x20,0x01,0x02,0x04,0x4a,0x24,0x82,0x24, 0x28,0x00,0x40,0x00,0x88,0x08,0x40,0x00,0x51,0x51,0x54,0x52,0x09,0xa2,0x25, 0x40,0x40,0xaa,0x14,0xa2,0x62,0xb7,0xad,0xd7,0xde,0xb7,0xbb,0x75,0xba,0xaa, 0xb6,0x6d,0x85,0x2a,0x84,0x04,0x02,0x00,0x48,0x40,0x11,0x82,0x20,0x00,0x00, 0x12,0x11,0x24,0x02,0x20,0x09,0x24,0x2a,0x85,0x22,0x09,0xd2,0x54,0x14,0x08, 0x04,0x55,0x0b,0x11,0x90,0x6d,0xeb,0xba,0x77,0xed,0xdd,0xbf,0xed,0xf6,0xdd, 0xb6,0x43,0x80,0x52,0x22,0x40,0x00,0x00,0x11,0xa2,0x28,0x12,0x92,0x44,0x00, 0x80,0x80,0x10,0x01,0x20,0x91,0xa4,0x28,0x94,0xa4,0x24,0x89,0xa2,0x00,0xd0, 0xaa,0x54,0x44,0x45,0xb5,0xdd,0x6b,0xdd,0xbb,0x76,0xd5,0xb6,0xad,0x76,0x5b, 0x28,0x55,0xa4,0x82,0x08,0x02,0x00,0x40,0x09,0x82,0x84,0x00,0x00,0x48,0x12, 0x08,0x44,0x88,0x4a,0x04,0x52,0x82,0x4a,0x49,0x55,0x55,0x15,0x22,0x01,0x55, 0x4b,0x91,0x10,0x6e,0x6b,0xdd,0xb6,0xee,0xdf,0xbe,0xdb,0xb6,0xad,0x6d,0x09, 0x09,0x12,0x09,0x00,0x00,0x92,0x04,0xa4,0x08,0x28,0x22,0x91,0x00,0x80,0x20, 0x10,0x22,0x10,0x51,0x55,0x29,0x28,0x24,0x25,0x22,0xa9,0x00,0x48,0xd5,0x2a, 0x22,0x25,0xb5,0xdd,0x77,0xfb,0xbd,0x7a,0x6b,0xbf,0xdb,0xfb,0x16,0xa4,0xa0, 0xa4,0x04,0x91,0x00,0x00,0x40,0x11,0x44,0x85,0x08,0x04,0x24,0x24,0x84,0x44, 0x08,0x45,0x4a,0x52,0x80,0x8a,0x92,0x48,0xa9,0x24,0x40,0x80,0x54,0x95,0x48, 0x48,0x6a,0x6f,0xdd,0xae,0xd6,0xaf,0xdd,0x6a,0xed,0x5e,0xab,0x52,0x2a,0x12, 0x42,0x00,0x00,0x44,0x28,0xa2,0x12,0x10,0xa2,0x20,0x81,0x00,0x11,0x10,0x21, 0x92,0x94,0x2a,0x55,0x29,0x49,0x22,0x25,0x4b,0x09,0x51,0xb5,0x4a,0x82,0x12, 0xd9,0xda,0xbb,0xbb,0x7d,0x7d,0xb7,0xdd,0xb5,0xf5,0x05,0x04,0x41,0x49,0x09, 0x22,0x02,0x00,0x82,0x14,0x88,0x4a,0x11,0x0a,0x10,0x20,0x84,0x4a,0x4a,0x49, 0x4a,0x95,0x20,0x92,0x24,0x95,0x92,0xa4,0x00,0x80,0xaa,0x95,0x28,0x44,0x60, 0xb7,0xee,0x76,0xb7,0xab,0xed,0xb6,0xde,0xae,0xaa,0x52,0x34,0x52,0x02,0x00, 0x00,0x08,0x50,0xa2,0x52,0x20,0x44,0x50,0x82,0x12,0x50,0x90,0x28,0x92,0x94, 0x54,0x4a,0x25,0x49,0x52,0x4a,0x28,0x02,0xa2,0xaa,0x52,0x92,0x28,0xc5,0xda, 0xb5,0xdd,0xde,0x7e,0xb7,0xee,0x75,0x5b,0x41,0x24,0x41,0x89,0x48,0x84,0x00, 0x22,0x09,0x11,0x04,0x8a,0x92,0x8a,0x20,0x80,0x8a,0x2a,0x45,0x49,0x52,0x15, 0xa4,0x48,0x52,0x49,0x11,0xaa,0x48,0x40,0xaa,0x2a,0x25,0x45,0x49,0xb7,0x7e, 0xf7,0xf5,0xad,0x5d,0xbb,0xde,0xb6,0x94,0x12,0x92,0x52,0x02,0x20,0x00,0x00, 0x50,0xa4,0x52,0x11,0x08,0x90,0x0a,0x49,0x50,0x42,0x28,0x55,0x55,0xaa,0x28, 0xa5,0x88,0x04,0x45,0x41,0x01,0x94,0xaa,0xaa,0x80,0x88,0x04,0xed,0xd5,0xad, 0xdb,0x77,0x6b,0xd7,0xb5,0x15,0x28,0x48,0x24,0xa4,0x20,0x01,0x02,0x40,0x04, 0x49,0x08,0xa4,0x42,0x25,0x41,0x10,0x25,0x99,0x8a,0x84,0x28,0x15,0x42,0x29, 0x25,0xa8,0x20,0x14,0x80,0xa0,0xaa,0x16,0x55,0x50,0x2a,0xba,0x7e,0xf7,0x7d, 0xbd,0xbd,0x7d,0xdf,0x8b,0x86,0x02,0x48,0x49,0x0a,0x08,0x00,0x12,0x50,0x22, 0x51,0x01,0x09,0x80,0x14,0x45,0x44,0x22,0x51,0x32,0x55,0x49,0x94,0x4a,0x55, 0x25,0x4d,0x49,0x25,0x40,0x55,0x55,0x01,0x85,0x24,0xea,0xeb,0x5d,0xeb,0x77, 0x57,0xeb,0x6a,0x45,0x6a,0xaa,0xa2,0x92,0x00,0x20,0x00,0x00,0x09,0x89,0x24, 0x54,0xa4,0x2a,0x49,0xa9,0x2a,0x55,0x0a,0x89,0xa4,0x2a,0x51,0xa8,0x44,0x51, 0xa5,0x12,0x01,0xa8,0xaa,0xaa,0xa8,0x50,0x92,0x58,0x7d,0xeb,0xbe,0xba,0xd5, 0xbf,0x7f,0x23,0x91,0x00,0x10,0x54,0x45,0x02,0x01,0x08,0xa0,0x24,0x89,0x20, 0x11,0x00,0x94,0x44,0x52,0x8a,0x50,0xaa,0x4a,0x92,0x54,0xab,0x2a,0xaa,0x14, 0x41,0x84,0x40,0x55,0x55,0x0a,0x21,0xa9,0xe8,0xd6,0x6d,0xeb,0x6f,0x6f,0xd5, 0xaa,0x48,0x25,0x4a,0x42,0x29,0x01,0x00,0x00,0x40,0x14,0x48,0x52,0x8a,0x44, 0x55,0x41,0x2a,0x29,0x51,0x4d,0x49,0xa8,0x0a,0x91,0x24,0x91,0x4a,0x42,0x2a, 0x20,0xa8,0xaa,0x2a,0x55,0x48,0xaa,0x52,0xbf,0xde,0xfd,0xda,0xaa,0x7f,0xf7, 0x52,0x10,0x01,0x28,0x44,0x11,0x24,0x01,0x02,0xa0,0x12,0x89,0x24,0x12,0x22, 0x92,0x54,0x45,0x15,0x92,0x92,0x92,0x54,0x24,0x55,0xad,0x28,0x95,0x94,0x0a, 0x41,0xd5,0xaa,0x22,0x85,0xa4,0xe2,0xea,0x75,0xd7,0xbf,0xf7,0xaa,0x5d,0x24, 0x25,0x24,0x41,0x59,0x42,0x00,0x00,0x20,0x12,0x49,0x22,0x91,0x44,0x89,0x44, 0x92,0xaa,0x48,0x55,0x54,0x55,0x15,0xa9,0xaa,0xa2,0x8a,0x50,0x25,0x00,0xa8, 0x6a,0x55,0x15,0x50,0xa9,0x49,0xbf,0xde,0xbb,0xea,0x55,0x77,0x57,0x52,0x49, 0x01,0x94,0x54,0x01,0x40,0x00,0x08,0x48,0x24,0x89,0x44,0x12,0x14,0x10,0xa5, 0x14,0x55,0x48,0x09,0x49,0x4a,0xa4,0x24,0x55,0x2a,0xab,0x4a,0x49,0xa0,0xaa, 0xaa,0x22,0x05,0x52,0x45,0xf5,0x55,0xfd,0x5f,0xff,0xed,0x5d,0x4a,0x22,0x55, 0x01,0xa2,0x04,0x09,0x02,0x00,0x01,0x91,0x24,0x91,0xa0,0x42,0x45,0x50,0xa5, 0xa4,0x26,0xa5,0x54,0x15,0x29,0x95,0x2a,0x85,0x54,0x25,0x00,0x94,0x5a,0x55, 0x09,0xa0,0xaa,0x2a,0xbf,0xee,0x57,0xf5,0x45,0xb7,0xae,0x2a,0x49,0x92,0xa8, 0x28,0x21,0x00,0x00,0x42,0xa8,0x24,0x49,0x44,0x0a,0x28,0x11,0x25,0x55,0x49, 0xa9,0x2a,0xa5,0x24,0x52,0x29,0x49,0x28,0x49,0x49,0x25,0x50,0xd5,0x5a,0xa1, 0x0a,0xa4,0x95,0xea,0x5d,0xfa,0xae,0xf7,0xed,0x15,0x55,0x94,0x24,0x45,0xa5, 0x00,0x42,0x00,0x10,0x02,0x92,0x24,0x29,0x52,0x05,0x4a,0x90,0x24,0xa5,0x54, 0x92,0x52,0x92,0x94,0x94,0x54,0x95,0x6a,0x55,0x00,0x4a,0xab,0x56,0x0a,0x50, 0xa9,0xa6,0x5a,0xb7,0x55,0x77,0xad,0x75,0x9f,0x8a,0x22,0x49,0x28,0xaa,0x44, 0x08,0x00,0x00,0xa8,0x24,0x89,0x92,0xa4,0x54,0x91,0xa4,0x4a,0x4a,0x49,0x55, 0x8c,0x2a,0x22,0x25,0x95,0xa2,0x9a,0x8a,0x92,0xa8,0x5a,0x55,0x24,0xa1,0x4a, 0x15,0xf7,0xdd,0xf6,0xdd,0xd5,0xdf,0xaa,0x2a,0x95,0x04,0x51,0x55,0x00,0x80, 0x00,0x84,0x00,0xa9,0x52,0xa4,0x12,0x42,0x24,0x41,0xa5,0x92,0x2a,0xa2,0xa2, 0x94,0x94,0x4a,0x4a,0x55,0xd5,0x52,0x04,0xa8,0xaa,0x2b,0x01,0x14,0xa4,0x6a, 0xac,0x76,0xbd,0xb6,0x76,0xb5,0x4e,0x55,0xaa,0x52,0x05,0x28,0x89,0x10,0x02, 0x10,0x52,0x44,0x8a,0x92,0xa4,0x94,0x92,0x84,0x94,0x24,0x55,0x29,0x5a,0x52, 0xa9,0x90,0x54,0x21,0x55,0x25,0x91,0xd4,0x56,0x45,0x90,0xa8,0xa9,0x2d,0xfb, 0xdd,0xd6,0xfb,0xad,0xfb,0x95,0xaa,0x4a,0x2d,0x55,0x95,0x00,0x00,0x00,0x00, 0x80,0x22,0x51,0x29,0x55,0x52,0x24,0x51,0x52,0x4a,0x92,0x94,0x24,0x25,0x44, 0x26,0x25,0x94,0x56,0x55,0x04,0xa9,0x52,0x95,0x04,0x05,0x52,0x56,0xac,0xb6, 0xf6,0x5e,0xdb,0xad,0x8e,0x2a,0xa9,0xaa,0x24,0x20,0x20,0x44,0x00,0x22,0x12, 0x94,0x2a,0xaa,0x08,0x89,0x92,0x04,0xa5,0x94,0x2a,0xa9,0x48,0x92,0x29,0x89, 0x48,0xa9,0xaa,0x4a,0x11,0xb4,0x6a,0x01,0x52,0xb5,0x54,0x55,0x5b,0xeb,0xda, 0xb5,0xb6,0x6d,0x65,0xd5,0x5a,0x45,0x82,0x44,0x09,0x01,0x02,0x80,0x80,0x4a, 0x94,0x25,0x45,0x52,0x49,0x52,0x28,0x45,0xaa,0x92,0x52,0x49,0x94,0x54,0x24, 0x05,0xaa,0x2a,0x84,0x54,0x55,0xa9,0xa0,0x8a,0xaa,0x56,0xf4,0xae,0x6e,0x7f, 0xdd,0xb6,0x97,0x2d,0xa5,0xaa,0x24,0x29,0x00,0x10,0x00,0x04,0x24,0x91,0x52, 0x4a,0x52,0x09,0xaa,0x04,0xa5,0x28,0x29,0xa5,0x94,0x92,0x22,0x25,0x49,0x52, 0x55,0x45,0x11,0xaa,0x5a,0x02,0x4a,0x55,0x55,0x2d,0xad,0xf5,0xea,0xd5,0x63, 0xab,0xa2,0x52,0x5d,0x2a,0x55,0x95,0x44,0x80,0x00,0x20,0x40,0x4a,0x49,0x55, 0x15,0x50,0x25,0xa5,0x10,0x95,0x94,0x48,0xa2,0x24,0x91,0x92,0xa4,0x44,0xaa, 0x2a,0x8a,0xa8,0xaa,0x6a,0x55,0x55,0xa5,0x6a,0x71,0x5b,0x5d,0xfb,0xac,0xdd, 0x5d,0xad,0xaa,0x53,0x2a,0x2a,0x01,0x04,0x00,0x88,0x08,0x11,0x95,0xaa,0xa2, 0x22,0x48,0x09,0xaa,0x28,0x52,0x95,0x54,0x52,0x4a,0x4a,0x12,0x11,0x55,0xa5, 0x20,0x5a,0x55,0xd5,0x52,0xad,0x9a,0xda,0xda,0x76,0xf6,0xae,0xae,0x6b,0xe3, 0xaa,0xda,0x04,0x80,0x9a,0x10,0x10,0x02,0x02,0x42,0xa4,0x48,0xa9,0x48,0x94, 0xa6,0x52,0x21,0x45,0x49,0xa2,0x22,0x89,0x84,0x12,0x49,0x84,0xa8,0x12,0x0a, 0xd5,0xda,0x2e,0x89,0xd2,0xea,0x36,0xa9,0xda,0xba,0xb5,0x57,0xaa,0xa9,0x56, 0x6b,0x55,0xb5,0x6d,0x04,0x41,0x00,0x00,0x80,0x52,0x25,0x12,0x25,0x55,0x29, 0x05,0x94,0xa8,0x94,0x4a,0x4a,0x25,0x52,0xa4,0x90,0x28,0x55,0x55,0xa1,0xaa, 0xb6,0xad,0xa4,0x2a,0x55,0xd5,0xf5,0xb5,0xee,0x7e,0x8e,0x6b,0xd7,0x5a,0x55, 0x95,0xaa,0x1a,0x21,0x00,0x00,0xa0,0x50,0x24,0xaa,0xaa,0x90,0x92,0x94,0xa8, 0x42,0x44,0x42,0x29,0xa1,0x92,0x88,0x12,0x25,0x82,0xa4,0x95,0x08,0x68,0xda, 0x56,0xaa,0xda,0x56,0x7b,0xab,0xea,0xb8,0xad,0x55,0xb4,0xb9,0xae,0x56,0x55, 0xd5,0x6e,0x00,0x08,0x01,0x02,0x02,0x49,0x91,0x00,0x25,0xa4,0xa2,0x2a,0x94, 0x92,0x2a,0x92,0x94,0x24,0x25,0xa2,0x48,0x29,0xa9,0x22,0x25,0xab,0xaa,0x55, 0x49,0xa5,0x6a,0x55,0xd5,0x5a,0xab,0xf7,0xd6,0xab,0xd6,0xd5,0xad,0x52,0xa9, 0x09,0x45,0x02,0x00,0x10,0x40,0x92,0x2a,0x55,0x92,0x92,0x54,0x8a,0x22,0xa1, 0x92,0x4a,0x42,0x92,0x90,0x28,0x12,0x44,0x44,0x55,0x02,0xaa,0x6a,0xfb,0x56, 0x55,0xaa,0xda,0x6e,0xeb,0xad,0x7d,0x5d,0xa9,0x6d,0xab,0xaa,0xaa,0xb6,0x56, 0x10,0x80,0x00,0x40,0x04,0x49,0x42,0xa4,0x44,0x2a,0x85,0x24,0x49,0x4a,0x4a, 0x94,0x94,0x4a,0x4a,0x42,0xa4,0x92,0xb2,0x82,0xa8,0xaa,0xd4,0x56,0x4a,0xaa, 0x54,0xab,0xb5,0xbc,0xda,0xd6,0xaa,0x56,0xdb,0x56,0xa5,0x42,0x5a,0x85,0x02, 0x11,0x00,0x09,0x41,0x20,0x29,0x09,0x52,0x45,0xa9,0xaa,0x24,0x21,0x25,0x22, 0xa1,0x24,0x21,0x29,0x89,0x48,0x88,0x2a,0x05,0x2c,0xab,0xba,0x55,0x55,0x65, 0x7d,0x5b,0x63,0xb5,0xb7,0xad,0x55,0x6d,0xab,0x2a,0x35,0xad,0x35,0x44,0x00, 0x02,0x00,0x08,0x95,0x54,0x51,0x55,0x2a,0x42,0x12,0x92,0x94,0x8a,0x94,0x84, 0x92,0x94,0xa4,0x52,0x22,0x55,0xa9,0x90,0xaa,0xb4,0x56,0x55,0x95,0xaa,0xaa, 0xad,0x7c,0x5d,0xed,0x56,0xd7,0xda,0x56,0x92,0xc4,0xb6,0x4a,0x10,0x44,0x00, 0x90,0x40,0x20,0x09,0x4a,0x54,0x51,0x99,0xa4,0x24,0xa2,0x24,0x29,0x21,0x29, 0x22,0x12,0x24,0x49,0x42,0x12,0x45,0x2a,0x55,0xfb,0xaa,0x64,0x55,0xd7,0xb7, 0xda,0xea,0x5b,0xdb,0xae,0x6e,0xbb,0x25,0xa9,0xaa,0x15,0x05,0x00,0x00,0x02, 0x02,0x45,0xa4,0x94,0xaa,0x4a,0x25,0x92,0x42,0x89,0x4a,0x44,0x8a,0x44,0x49, 0xc9,0x4a,0x92,0x54,0xa5,0x94,0x56,0xb5,0x56,0x15,0x89,0x94,0xba,0xae,0xb6, 0xbe,0xb5,0x2d,0x5b,0xb5,0xad,0x94,0x50,0x6d,0xa5,0x40,0x08,0x01,0x20,0x20, 0x28,0x22,0x55,0x12,0x55,0x12,0x49,0x14,0x50,0x92,0x28,0x51,0x2a,0x12,0x24, 0xa1,0x24,0xa9,0x28,0x22,0x3a,0xaa,0xbb,0x45,0x22,0x55,0x5d,0x6b,0xfd,0x6a, 0xdb,0x96,0x5e,0xdb,0x56,0x05,0xa4,0xb6,0x15,0x0a,0x21,0x00,0x08,0x89,0x92, 0x48,0xa9,0x64,0x92,0xa4,0xa4,0x48,0x45,0x15,0x52,0x05,0x49,0x49,0x89,0x0c, 0x49,0x12,0x45,0x49,0xd5,0x6a,0x6a,0x15,0x48,0xd5,0x6a,0xad,0x5b,0xbd,0xad, 0xfb,0xbb,0xb6,0xad,0x52,0x89,0xa8,0x52,0x00,0x00,0x00,0x00,0x00,0x48,0xa4, 0x94,0x12,0xa9,0x12,0x12,0x25,0x91,0x48,0x21,0x91,0x94,0x44,0x52,0xa2,0x24, 0x49,0x29,0x84,0x3a,0xb5,0xad,0xa2,0x12,0x55,0x5b,0xab,0xf6,0xab,0xd6,0x5d, 0x6e,0x6d,0xb5,0x2a,0x20,0xaa,0x8a,0x02,0x00,0x01,0x22,0x22,0x12,0x49,0x55, 0x54,0x25,0xa5,0xa4,0x88,0x54,0x2a,0x94,0x4a,0x52,0x92,0x24,0x55,0x49,0xaa, 0x44,0x29,0x55,0x55,0x2b,0x09,0xa0,0xda,0xb6,0xae,0x5f,0xad,0xad,0x52,0xbb, 0xdb,0x6b,0x4b,0x95,0xd4,0x2a,0x49,0x12,0x00,0x80,0x80,0x44,0x24,0x2a,0x55, 0x92,0x12,0x29,0x25,0x09,0x25,0xa9,0x14,0x24,0x49,0x92,0x24,0x24,0x25,0x52, 0x92,0xba,0xda,0xaa,0xa4,0x15,0x55,0xd5,0xd5,0xb5,0xb4,0xaa,0xad,0xee,0x76, 0x56,0x25,0x02,0x51,0x95,0x00,0x00,0x00,0x08,0x04,0x14,0x51,0x95,0x8a,0x24, 0x24,0x92,0x48,0x52,0x48,0x92,0xa2,0x48,0x25,0x29,0x49,0x49,0x94,0x84,0xa4, 0x56,0xb5,0x57,0x92,0x52,0xed,0x56,0xaf,0x7e,0xd3,0xad,0x52,0xbd,0xda,0x55, 0x55,0x55,0xb4,0x52,0x09,0x48,0x02,0x20,0x20,0x42,0x94,0x6a,0x69,0xa9,0x4a, 0x49,0x92,0x88,0x2a,0xa5,0x14,0x52,0x91,0x84,0x94,0x94,0x42,0x52,0x42,0x6a, 0xd5,0x8a,0x48,0x15,0x22,0xfb,0xda,0xaf,0xec,0xb6,0x5d,0xd1,0xaf,0x56,0x45, 0x11,0xa8,0x95,0x22,0x01,0x00,0x82,0x80,0x08,0xa9,0x54,0x95,0x42,0x24,0x92, 0x24,0x12,0xa2,0x88,0xaa,0x48,0x22,0xa9,0x52,0x22,0x95,0x08,0x89,0x5e,0x6d, 0x2b,0xaa,0xaa,0xac,0xaa,0xb5,0x7a,0xdb,0x5a,0x53,0x7d,0x79,0xb5,0x2a,0x4a, 0x55,0x25,0x01,0x00,0x00,0x00,0x14,0x44,0x52,0x55,0xa5,0x94,0x12,0x49,0x92, 0xa4,0x14,0xa5,0x10,0x44,0x95,0x44,0x08,0x89,0x20,0x45,0xa4,0xaa,0xda,0x56, 0xb1,0x54,0xa3,0x6a,0xdb,0x5f,0x69,0x6b,0xb5,0x5b,0xa7,0x56,0x52,0x05,0xc0, 0xaa,0x04,0x22,0x01,0x24,0x80,0x28,0x49,0x55,0x49,0x29,0xa4,0x94,0x24,0x49, 0x29,0x84,0xaa,0x92,0xa0,0x92,0x52,0x52,0x4a,0x10,0x49,0xb5,0xed,0x55,0xae, 0xaa,0xda,0xd6,0xac,0xba,0xb6,0xd4,0xad,0xee,0x5e,0xa9,0xaa,0xea,0x2a,0x25, 0x91,0x00,0x00,0x00,0x22,0x44,0xa8,0xaa,0xaa,0x84,0x12,0x22,0x49,0x24,0x4a, 0xa9,0x24,0x50,0x2d,0x49,0x09,0x09,0x25,0xa5,0x50,0xda,0xb6,0xaa,0xa1,0xaa, 0x24,0x5b,0x7b,0x6f,0xa9,0x3b,0x75,0xb9,0xa5,0x56,0x95,0x55,0x45,0x55,0x02, 0x08,0x00,0x88,0x00,0x11,0x55,0x55,0x95,0x52,0xa4,0x54,0x92,0x92,0x92,0x40, 0xa9,0x2a,0x51,0x12,0x52,0x52,0x48,0x08,0x42,0xad,0xdd,0x55,0x5d,0x6b,0xad, 0xd4,0xaa,0xbe,0xba,0xca,0xaa,0xee,0x76,0xa9,0x6a,0x2a,0x90,0x56,0x09,0x20, 0x02,0x02,0x10,0x04,0x82,0xaa,0x24,0x89,0x12,0x89,0x48,0xa0,0x54,0x2a,0x2a, 0x94,0x4c,0xa5,0x44,0x89,0x92,0xa2,0x94,0xd6,0xb6,0xaa,0xa2,0xb5,0xb2,0x6e, 0x77,0xab,0xd4,0xd7,0xb6,0x7a,0xab,0x56,0x95,0xaa,0xa5,0xaa,0x40,0x02,0x00, 0x10,0x42,0x50,0x34,0x55,0x49,0x12,0x44,0x24,0x25,0x15,0x89,0x40,0xa9,0x28, 0x55,0x04,0x89,0x50,0x44,0x04,0x51,0xb5,0xfd,0x56,0x6d,0x57,0x47,0x59,0xd5, 0xbf,0x6d,0x55,0xaf,0xda,0xdd,0xaa,0x5a,0x25,0xa9,0x56,0x09,0x00,0x00,0x40, 0x00,0x04,0x49,0x55,0x25,0xa4,0x92,0x92,0x48,0x49,0x55,0x95,0x24,0x55,0xa2, 0xa2,0x50,0x0a,0x29,0x52,0x24,0xda,0x56,0xa5,0x92,0x74,0xb9,0x6e,0x5b,0xad, 0xda,0x6a,0x55,0xfa,0xa6,0x5a,0xa5,0xaa,0xaa,0xaa,0x04,0x21,0x01,0x04,0x24, 0x11,0xa4,0xaa,0x92,0x10,0x24,0x29,0x25,0x52,0x52,0x4a,0x4a,0x2a,0x4c,0x0a, 0x2a,0x51,0x42,0x89,0xc8,0xb6,0xad,0x55,0x6a,0xab,0x56,0xb5,0x76,0x37,0xad, 0xd5,0xae,0xda,0x55,0xad,0x2a,0x14,0xa9,0x2a,0x11,0x04,0x00,0x00,0x01,0x44, 0x89,0x54,0xa5,0x8a,0x92,0x44,0x92,0x94,0xaa,0x12,0x29,0x51,0x29,0xa1,0x40, 0x0a,0x29,0x22,0x25,0x6d,0x6b,0xab,0x9f,0x55,0x6b,0x6d,0xab,0xbd,0xf6,0xba, 0xda,0x76,0xbb,0x57,0xa9,0x55,0x55,0x95,0x84,0x40,0x00,0x24,0x08,0x10,0x20, 0x55,0x15,0x51,0x2a,0xa9,0x24,0xa1,0x14,0xa5,0x54,0x2a,0x50,0x15,0x95,0xa0, 0x44,0x84,0xa8,0xda,0x56,0x55,0x75,0x57,0xd5,0xda,0xd6,0xd6,0xa8,0xad,0x96, 0xdc,0x55,0x6d,0x57,0xa9,0x52,0x52,0x09,0x10,0x00,0x00,0x80,0x44,0x4a,0x55, 0x45,0x24,0x41,0x4a,0x92,0x94,0xaa,0x54,0xa8,0x14,0x95,0x40,0x48,0x14,0x20, 0x29,0x92,0x6e,0xbb,0xad,0x5e,0xa9,0x3a,0x6b,0xab,0x7d,0xd5,0x55,0x57,0xf5, 0xae,0x5a,0xb1,0xd4,0x2a,0xa9,0x44,0x02,0x02,0x88,0x04,0x10,0x90,0xb4,0x2a, 0x49,0x2a,0x91,0x24,0x29,0x49,0x12,0x95,0x2a,0x28,0x15,0x22,0x41,0x95,0x44, 0xa5,0xb5,0x6a,0xb5,0xb5,0xd6,0xd6,0xae,0x6a,0x57,0x55,0xbb,0x16,0x5f,0xa9, 0xa5,0x46,0xab,0x4a,0x45,0x11,0x00,0x00,0x02,0x90,0x04,0x45,0xaa,0x92,0x24, 0x49,0x4a,0x92,0x44,0x25,0xa9,0x68,0xa0,0x82,0x80,0x08,0x10,0x20,0x91,0xa8, 0xba,0x55,0xd5,0x6a,0xab,0x6a,0xab,0x55,0xfd,0xd4,0xd6,0xcd,0xb4,0x56,0x55, 0xa9,0x54,0x55,0x35,0x04,0x91,0x00,0x90,0x00,0x50,0x90,0x5a,0x45,0x92,0x24, 0x29,0x29,0x15,0x09,0x52,0x8a,0x1a,0x28,0x15,0xa2,0xa2,0x0a,0x24,0x55,0xd7, 0xb6,0xaa,0xae,0x5c,0xd5,0xba,0xa6,0x36,0x55,0xad,0x56,0x5f,0x55,0xaa,0xaa, 0xaa,0x2a,0x49,0x29,0x00,0x00,0x00,0x04,0x82,0x24,0x68,0x95,0x24,0x49,0x92, 0x8a,0xa0,0xaa,0x94,0xb4,0x54,0x49,0x41,0x08,0x08,0x44,0x89,0x52,0x6d,0x55, 0x55,0xb5,0x65,0x5b,0xad,0x5a,0xed,0xaa,0x6b,0x57,0x55,0xa5,0x55,0x55,0x55, 0xa5,0x24,0x05,0x24,0x02,0x22,0x90,0x20,0x82,0xaa,0x12,0x91,0x24,0x49,0x50, 0x4a,0x44,0x28,0x4a,0x09,0x20,0x0a,0x20,0xa2,0x28,0x22,0xa9,0xda,0xd6,0x5a, 0xad,0xb6,0x56,0x5b,0xb5,0xda,0xa5,0xb6,0x69,0xbf,0x2a,0x55,0xd5,0x56,0x55, 0x95,0xa8,0x00,0x00,0x00,0x01,0x08,0x51,0x52,0xa5,0x24,0x49,0x92,0x0a,0x92, 0x2a,0x52,0xa9,0x52,0x4a,0x21,0x85,0x00,0x04,0x91,0x54,0x6f,0xab,0xaa,0xaa, 0x55,0x6d,0xb5,0x56,0x6d,0xdb,0xad,0xa6,0xd1,0xaa,0x29,0xad,0xaa,0xaa,0x44, 0x05,0x80,0x00,0x04,0x20,0x40,0x84,0x54,0x49,0x95,0x24,0x49,0xa4,0x24,0x91, 0x48,0x2a,0x29,0x20,0x04,0x10,0x4a,0xa9,0x24,0xd5,0x5a,0xad,0x6a,0x5b,0xab, 0x5b,0x6d,0xa9,0xaa,0x16,0xb5,0x59,0xad,0x4a,0xa6,0x6b,0x95,0x2a,0x29,0x52, 0x12,0x00,0x90,0x08,0x04,0x22,0xa2,0x24,0x42,0x92,0x24,0x29,0x48,0x0a,0x52, 0xa5,0x14,0x89,0x92,0x84,0x00,0x12,0x49,0xaa,0xb6,0x55,0x55,0xd5,0x5d,0xad, 0x55,0x69,0x5b,0x5d,0xd5,0xb6,0x55,0x35,0x55,0xb5,0xae,0xaa,0x4a,0x09,0x00, 0x00,0x00,0x42,0x90,0x88,0x88,0xaa,0x94,0x44,0x92,0x84,0x82,0xa4,0x48,0x54, 0x49,0x20,0x00,0x20,0x52,0x48,0x24,0xa9,0x6d,0x55,0x55,0x55,0xb5,0xb2,0x56, 0xd3,0x76,0xbb,0xaa,0x69,0xda,0x5a,0xb5,0xab,0x5a,0x55,0x29,0x55,0x44,0x02, 0x08,0x00,0x02,0x52,0x52,0x12,0x55,0x92,0x44,0x52,0x50,0x12,0x80,0x22,0x25, 0x84,0x4a,0x09,0x08,0x22,0x91,0xd4,0xb6,0xb6,0x4a,0x55,0xab,0x5a,0xd5,0xa4, 0x4d,0xac,0x56,0xaa,0xaa,0x16,0x55,0x6d,0x55,0x25,0x45,0x05,0x00,0x00,0x20, 0x08,0x20,0x08,0x89,0xa4,0x48,0x49,0x92,0x24,0x05,0x49,0x55,0x55,0x89,0x10, 0x21,0xa4,0x52,0x49,0x4a,0xad,0xab,0x55,0xb5,0x5a,0xad,0x55,0x35,0xeb,0x56, 0x3d,0xb5,0x75,0xda,0xab,0x6a,0x55,0x55,0xa9,0x2a,0x91,0x10,0x00,0x04,0x82, 0x08,0xa2,0x44,0x12,0x25,0x94,0x44,0x12,0x40,0x24,0x80,0x40,0x22,0x42,0x08, 0xa9,0x2a,0x24,0x29,0x55,0xdd,0x6a,0x5b,0x55,0x6b,0xdd,0xda,0x98,0x2b,0xd5, 0xaa,0xba,0xe9,0x4e,0x5d,0x6d,0x15,0xaa,0xaa,0x24,0x04,0x01,0x20,0x10,0x40, 0x04,0x12,0x49,0x48,0x21,0x91,0x4a,0x29,0x91,0x54,0x55,0x49,0x08,0xa1,0xaa, 0xaa,0x52,0x55,0xd5,0xb6,0xd7,0xaa,0x6a,0xad,0xaa,0x57,0x6d,0x17,0xbd,0x4a, 0x75,0x5a,0xd3,0xb6,0x5a,0xd5,0xaa,0x55,0x09,0x00,0x00,0x04,0x02,0x09,0xa9, 0x48,0x24,0xa5,0x4a,0x24,0x21,0x02,0x0a,0x01,0x88,0x24,0x22,0x48,0xaa,0x2a, 0x28,0xa9,0x5a,0x6f,0x6d,0xad,0xaa,0xd6,0xb5,0x5a,0xb2,0x4d,0x6a,0xd4,0x5a, 0xe9,0x4d,0x6f,0x55,0x2d,0xd2,0x56,0x45,0x82,0x00,0x20,0x20,0x40,0x40,0x22, 0x91,0x14,0x24,0x91,0x94,0x50,0x50,0x54,0x25,0x91,0x80,0x92,0x56,0x55,0x41, 0x52,0xd5,0xba,0x5b,0x5b,0x55,0xb5,0xd6,0x76,0xe9,0x26,0xbd,0xd5,0xb5,0xaa, 0xab,0xba,0xd7,0x52,0x55,0x55,0x11,0x08,0x00,0x01,0x09,0x10,0x2a,0x94,0x44, 0xa2,0x92,0x08,0x21,0x84,0x0a,0x00,0x90,0x04,0x29,0xa8,0xaa,0x2a,0x28,0xa9, 0xb6,0xef,0x6e,0xab,0xaa,0xaa,0xad,0xba,0x58,0x57,0xea,0xaa,0xba,0xd2,0x96, 0x6e,0x29,0x8b,0xa0,0xaa,0x84,0x00,0x01,0x04,0x40,0x82,0x80,0x40,0x92,0x04, 0x49,0x22,0x8a,0x00,0x50,0x49,0x45,0x29,0x04,0xa2,0x2e,0x52,0x81,0x44,0x6d, 0xbd,0xb5,0x56,0xaa,0x56,0x5a,0x55,0xb5,0x05,0x3d,0x52,0x75,0x54,0x2b,0xaa, 0xd5,0x54,0x96,0x52,0x15,0x22,0x00,0x40,0x02,0x20,0x54,0x2a,0x24,0xa9,0x84, 0x88,0x00,0x44,0x0a,0x02,0x20,0x45,0x81,0x14,0x55,0x55,0x24,0x52,0xa5,0xeb, 0xde,0x2a,0xa9,0xaa,0xd5,0xaa,0x6a,0x53,0xea,0xca,0x5a,0xc9,0x95,0xd2,0x2a, 0xa5,0x44,0x95,0x04,0x00,0x00,0x08,0x88,0x08,0x01,0x41,0x91,0x04,0x12,0x22, 0x2a,0x11,0x50,0xa8,0x4a,0x08,0x0a,0x52,0x8f,0x54,0x80,0x48,0x6d,0xdf,0xb5, 0x55,0x55,0x5d,0x2a,0x35,0xa8,0x05,0x59,0x54,0x6d,0x51,0x23,0x2a,0xcb,0x8a, 0xaa,0xaa,0x52,0x08,0x01,0x01,0x20,0x00,0x54,0x14,0x24,0xa9,0x44,0x91,0x00, 0x00,0x05,0x00,0x10,0xa5,0x40,0x94,0x74,0x52,0x25,0xa4,0xb6,0xb5,0xae,0x4a, 0xaf,0x52,0xa5,0xda,0x6a,0x53,0x6d,0x25,0x7a,0xca,0x4d,0xb7,0x52,0xb5,0x5a, 0x55,0x05,0x21,0x00,0x50,0x02,0x51,0x80,0xa0,0x48,0x42,0x12,0x04,0x52,0x12, 0x50,0xa9,0x42,0x02,0x05,0x4a,0x8b,0x2a,0x80,0x48,0xed,0xfe,0xd5,0xb5,0x75, 0x57,0x52,0xb7,0xa9,0x25,0x35,0x4a,0xaf,0xa4,0x93,0xaa,0x54,0x53,0xb7,0x52, 0x11,0x00,0x00,0x04,0x00,0x00,0x2a,0x15,0x92,0x94,0x84,0xa2,0x80,0x80,0x04, 0x02,0x28,0xa9,0x90,0x50,0x5d,0xa4,0x12,0x55,0xb5,0x57,0xb7,0xd6,0x5e,0xa9, 0x54,0x49,0xd1,0x91,0x54,0x51,0x5a,0x4a,0x85,0x56,0x55,0xad,0xed,0xaa,0x05, 0x04,0x02,0x80,0x48,0x84,0x40,0x40,0x49,0x22,0x28,0x08,0x0a,0x5a,0x11,0x90, 0x82,0x00,0x02,0x96,0xaa,0x29,0x00,0x48,0xad,0xfe,0x5a,0x6d,0xbb,0x95,0x92, 0xb6,0xa4,0x22,0x3a,0x08,0xbd,0xa4,0x65,0x2d,0x49,0xfb,0xbe,0x7d,0x22,0x90, 0x00,0x20,0x00,0x20,0x12,0x2a,0x92,0x08,0x05,0x85,0x40,0x55,0x85,0x40,0x20, 0xaa,0x24,0xa8,0x54,0x54,0x49,0x25,0x55,0xab,0xad,0xdb,0x6f,0x55,0x44,0x49, 0x41,0x95,0xca,0x42,0xae,0x42,0x91,0xaa,0x54,0xad,0xeb,0xa6,0x08,0x02,0x00, 0x04,0x22,0x01,0x48,0x80,0x48,0x22,0x50,0x10,0xaa,0x4a,0x14,0x12,0x85,0x00, 0x01,0x55,0xa9,0x2a,0x00,0x48,0xb5,0x7d,0x6b,0x7f,0xdd,0xab,0x92,0x24,0x4a, 0x51,0x34,0x10,0xb5,0x54,0xa5,0x44,0x52,0x7d,0xdf,0x5d,0x41,0x00,0x00,0x00, 0x00,0x48,0x12,0x55,0x24,0x91,0x8a,0x8a,0x50,0x55,0x49,0x00,0x50,0x54,0x08, 0x9a,0x94,0x94,0x52,0x55,0xca,0xae,0xb5,0xd5,0xf7,0x56,0x51,0x49,0x81,0x08, 0x09,0x40,0x5a,0x85,0x08,0x29,0xc9,0xd6,0x6b,0xaf,0x08,0x20,0x01,0x24,0x09, 0x00,0x40,0x00,0x49,0x4a,0x10,0x20,0xaa,0x5a,0x25,0xa4,0x02,0x81,0x22,0x54, 0x25,0x15,0x00,0x42,0xb5,0xfb,0x6e,0x7f,0xad,0xbb,0x2a,0xba,0x24,0x52,0x32, 0x01,0xaa,0x10,0x21,0x22,0x52,0x7f,0xbd,0x35,0x21,0x09,0x00,0x00,0x40,0x92, 0x14,0xaa,0x24,0x01,0x4a,0x15,0x55,0x35,0x29,0x01,0x48,0x54,0x04,0xb5,0xaa, 0x4a,0x55,0x29,0xd5,0xb6,0xdb,0xab,0xfb,0x56,0xad,0x25,0x0b,0x80,0x04,0x90, 0x54,0x45,0xd8,0xdd,0xad,0x55,0x6b,0xaf,0x04,0x00,0x00,0x88,0x00,0x00,0xa0, 0x40,0x52,0xaa,0x90,0x44,0x0a,0xba,0x54,0x08,0x11,0x01,0x01,0xac,0xaa,0x22, 0x80,0x54,0xad,0xdf,0x6e,0x7d,0xb7,0x5b,0x55,0x54,0x2a,0x29,0x11,0x00,0x55, 0x04,0x26,0x52,0xf3,0xee,0xda,0x55,0x00,0x22,0x01,0x02,0x24,0x44,0x0a,0x2a, 0x95,0x44,0x4a,0x25,0xa5,0x2c,0x50,0x41,0x44,0xa8,0x28,0xa9,0x55,0x15,0x54, 0x8a,0x6a,0xf5,0xdf,0xaf,0xda,0x24,0x16,0x69,0x51,0x40,0x04,0x40,0x50,0x41, 0xd9,0xa4,0x8a,0x92,0x52,0x95,0x92,0x00,0x00,0x20,0x80,0x00,0xa0,0x90,0x48, 0x29,0x15,0x89,0x8a,0xba,0xaa,0x00,0x11,0x05,0x02,0x54,0x5b,0x40,0x91,0x24, 0xd5,0xae,0x7a,0xd5,0x2a,0x95,0x24,0xb4,0xa4,0x00,0x81,0x08,0x55,0x84,0xa4, 0x90,0x55,0x55,0xa5,0x25,0x00,0x08,0x00,0x08,0x08,0x20,0x09,0x4a,0x52,0x94, 0x52,0x92,0x52,0x34,0x51,0x25,0x84,0xa0,0x88,0xa0,0x2a,0x15,0xa4,0x52,0x6d, 0xf7,0xdf,0xaf,0xaa,0x22,0x16,0xe9,0xd2,0x12,0x00,0x00,0x28,0x51,0xb2,0x4a, 0x42,0x92,0xa8,0xaa,0x22,0x00,0x01,0x40,0x42,0x02,0xa0,0x90,0x8a,0x52,0xa4, 0x08,0x05,0xad,0x64,0x01,0x29,0x0a,0x11,0x4a,0xa2,0x40,0x12,0x49,0xb5,0x5d, 0x75,0x95,0x2a,0x89,0x4a,0xbc,0x48,0x41,0x20,0x80,0x92,0x20,0x59,0x91,0x85, 0x54,0xa1,0x14,0x00,0x21,0x00,0x02,0x00,0x48,0x0a,0xaa,0xa4,0x4a,0x15,0x05, 0x55,0x35,0xa9,0x49,0x80,0x50,0x8a,0x90,0x14,0x12,0xa1,0x54,0x6d,0xeb,0xbf, 0x4b,0xaa,0x04,0x24,0xd2,0x92,0x03,0x02,0x00,0x2a,0x58,0xea,0xa4,0x22,0x24, 0x95,0x52,0x12,0x00,0x00,0x10,0x11,0x00,0xa0,0x44,0x92,0x94,0x28,0x50,0x92, 0x54,0x6a,0x01,0x0a,0x02,0x10,0x22,0x21,0x48,0x8a,0x52,0xdb,0x5e,0x75,0x95, 0x54,0x11,0x95,0xbc,0x48,0x09,0x00,0x10,0x04,0x08,0xb4,0x49,0x85,0x52,0x21, 0x2a,0x00,0x22,0x01,0x00,0x00,0x12,0x09,0x29,0x55,0x4a,0x45,0x05,0x4a,0xaa, 0x52,0x85,0xa0,0xa8,0x8a,0x14,0x08,0x02,0x24,0xa9,0xaa,0xb5,0xaf,0xa7,0xaa, 0x04,0xaa,0x52,0xa5,0x03,0x00,0x00,0x29,0xb4,0x52,0x45,0x93,0xa8,0x4a,0x11, 0x49,0x08,0x00,0x22,0x22,0x00,0x20,0x52,0x92,0x12,0x12,0x40,0x2a,0x15,0xb4, 0x10,0x0a,0x02,0x24,0xa2,0x40,0xa8,0x50,0xaa,0x5a,0x6b,0xb5,0x08,0x95,0x12, 0x54,0x5a,0xc8,0x82,0x80,0x00,0x02,0xa9,0xd4,0xaa,0x00,0x55,0x11,0x4a,0x00, 0x00,0x00,0x08,0x08,0x82,0x94,0x24,0x55,0x55,0x41,0x12,0x54,0x42,0x5b,0x45, 0xa0,0x54,0x91,0x14,0x12,0x05,0x15,0x95,0xea,0xbd,0x5b,0xab,0x6a,0x89,0xa8, 0x2a,0xa5,0x16,0x10,0x40,0x14,0x3a,0x52,0xd1,0xa3,0xa8,0x84,0x2a,0x02,0x01, 0x01,0x40,0x40,0x08,0x40,0x52,0x29,0x49,0x0a,0x81,0xa8,0xac,0xb4,0x02,0x05, 0x20,0x42,0x52,0x40,0xa8,0xc8,0x64,0xad,0x6a,0x6d,0x25,0x5a,0x22,0x2a,0xa9, 0xe8,0x05,0x00,0x00,0x02,0x54,0xa9,0x2a,0x00,0xaa,0x10,0x4a,0x48,0x08,0x00, 0x02,0x02,0x80,0x94,0x88,0x94,0x24,0x41,0x24,0xa8,0x52,0x55,0x49,0xa8,0x8a, 0x28,0x09,0x95,0x12,0x24,0x92,0x6a,0xb7,0xab,0x92,0xaa,0x4a,0x50,0x25,0x55, 0x05,0x00,0x02,0x48,0xb4,0x54,0xf5,0x91,0x5a,0xa5,0x14,0x00,0x80,0x00,0x88, 0x10,0x11,0x00,0x52,0x55,0x95,0x14,0x00,0x51,0x55,0x2b,0x04,0x11,0x10,0x42, 0xaa,0x50,0x48,0xa9,0x2a,0xad,0x6d,0xad,0x4a,0xaa,0x0a,0xd0,0x4a,0x7a,0x13, 0x01,0x80,0x04,0x6d,0x49,0x0d,0x48,0x25,0x88,0x42,0x02,0x20,0x00,0x20,0x00, 0x84,0x54,0xa9,0x52,0x25,0x84,0x12,0x84,0xad,0x2a,0x51,0x4a,0xa5,0x94,0x24, 0x0a,0x85,0x24,0x51,0x75,0xb5,0x56,0xa5,0x6a,0x55,0x82,0xb6,0xaa,0x06,0x10, 0x00,0x01,0xb4,0xab,0x76,0x82,0x9a,0x52,0x15,0x90,0x04,0x02,0x00,0x92,0x00, 0x80,0x44,0x2a,0x49,0x29,0x40,0x50,0xaa,0x42,0x84,0x10,0x08,0x10,0xa9,0x50, 0x10,0x49,0x4a,0xad,0xeb,0x55,0x19,0xa8,0x95,0x50,0xab,0xde,0x0a,0x00,0x08, 0x24,0x6b,0xd5,0x15,0x68,0x4b,0x48,0x25,0x01,0x00,0x00,0x89,0x00,0x48,0x2a, 0x29,0x95,0xaa,0x42,0x15,0x04,0x91,0x14,0x29,0xa5,0xa2,0x4a,0x55,0x0a,0xa5, 0x14,0xa5,0x6a,0x5d,0x5b,0xa5,0xd2,0xea,0x05,0xba,0xab,0x96,0x80,0x00,0x08, 0xdc,0xbe,0x8a,0xa8,0x15,0xaa,0x0a,0x20,0x90,0x00,0x00,0x44,0x00,0x40,0x52, 0xa5,0x14,0x2a,0x40,0x51,0x4a,0x22,0xa4,0x04,0x08,0xa1,0xa4,0x50,0x08,0xa1, 0xa8,0xb6,0xb5,0xad,0x0a,0x49,0x95,0x42,0x6a,0x55,0x05,0x04,0x40,0x41,0x53, 0x73,0x05,0x6a,0x25,0x69,0x41,0x84,0x04,0x00,0x90,0x10,0x22,0x29,0x95,0x52, 0xa2,0x12,0x15,0x00,0x80,0x00,0x29,0xb2,0x52,0x14,0x55,0x0a,0xa2,0x14,0xaa, 0xda,0x6e,0xf7,0x6a,0x22,0xab,0x2a,0x00,0x82,0x2a,0x00,0x00,0x10,0x5d,0x8a, 0x90,0xad,0x4a,0x5a,0x15,0x00,0x00,0x01,0x02,0x00,0x08,0x84,0x24,0xa5,0x4a, 0x4a,0x40,0x4a,0x2a,0x24,0xa4,0x4a,0x84,0xa0,0x94,0x52,0x09,0xa1,0x54,0xb5, 0xb5,0xad,0x2f,0x88,0xb6,0x8a,0x10,0x48,0x15,0x00,0x04,0xa1,0x22,0x48,0x40, 0x55,0x05,0xb5,0x00,0x00,0x00,0x00,0x40,0x44,0x02,0x51,0xaa,0x28,0x29,0x51, 0x95,0x10,0x00,0x81,0x92,0x24,0x51,0x4a,0xa5,0x24,0x52,0x4a,0x52,0xdb,0xee, 0xb6,0xaa,0x22,0x55,0x55,0x82,0x00,0x2a,0x40,0x40,0x48,0x1b,0x02,0x54,0xb5, 0xa3,0x5a,0x85,0x24,0x49,0x00,0x04,0x11,0x28,0xa4,0xaa,0x4a,0x92,0x8a,0x12, 0x45,0x09,0x08,0x54,0x95,0x04,0x11,0x29,0x91,0x08,0x91,0xaa,0x6a,0xdb,0xdd, 0x7d,0x49,0xaa,0x22,0x08,0xa0,0x12,0x02,0x00,0xd0,0xa6,0x90,0x52,0xad,0x88, 0xae,0x10,0x00,0x00,0x02,0x50,0x80,0x82,0x12,0x25,0xa5,0xa4,0x50,0xa9,0x28, 0x42,0x52,0xa5,0x2a,0xa9,0xa4,0xaa,0x24,0x52,0x44,0x55,0xdd,0xb6,0xb6,0xd6, 0x12,0xad,0x14,0x02,0x04,0x2a,0x00,0x00,0xa4,0x2d,0x20,0xa9,0x56,0x42,0x55, 0x02,0x00,0x10,0x00,0x00,0x25,0x54,0x64,0xaa,0x94,0x0a,0x25,0x52,0x45,0x14, 0x21,0x28,0x55,0x44,0x02,0x49,0x81,0x84,0x28,0xaa,0xea,0xdb,0xed,0x5d,0x4b, 0x29,0x49,0x20,0x80,0x02,0x00,0x82,0xd0,0x96,0x44,0x52,0x55,0x49,0x95,0x20, 0x49,0x82,0x00,0x4a,0x88,0x22,0x55,0x55,0x49,0x61,0x95,0x2a,0x92,0xa2,0x94, 0xaa,0x2a,0x91,0xa8,0x24,0x54,0x52,0x92,0xa2,0x76,0xbd,0xb6,0xf6,0x25,0xd4, 0xb6,0x82,0x00,0x00,0x20,0x10,0xa0,0x2d,0x9a,0x44,0x55,0x22,0x55,0x08,0x00, 0x00,0x00,0x00,0x51,0xaa,0xaa,0x92,0x52,0x8a,0xa4,0x44,0x25,0x94,0x52,0x49, 0xa5,0x44,0x22,0x49,0x81,0x04,0x49,0x4c,0xad,0x77,0xad,0xaa,0x96,0x52,0x4b, 0x00,0x00,0x88,0x00,0x00,0x6a,0xab,0x28,0x12,0x21,0xa9,0x8a,0x00,0x00,0x10, 0x02,0xa9,0x24,0x95,0x4a,0x55,0xaa,0x6a,0x55,0xaa,0x92,0x42,0x08,0x54,0x52, 0x92,0x14,0x25,0x54,0x52,0x92,0x52,0xf5,0xad,0xab,0xda,0x4a,0xa0,0x2a,0x04, 0x08,0x00,0x04,0x00,0x80,0x2d,0x85,0x48,0x14,0x48,0x25,0x84,0x94,0x04,0x00, 0x84,0x4a,0x52,0x55,0xaa,0x92,0xaa,0x2a,0x49,0x54,0xa9,0x62,0xa9,0x94,0x24, 0xa1,0x94,0x08,0x81,0x48,0x55,0xad,0xb6,0xda,0x2a,0x95,0x8a,0x44,0x00,0x00, 0x01,0x00,0x00,0xd0,0x4a,0x2a,0x55,0xa1,0x92,0x84,0x20,0x00,0x40,0x00,0x51, 0xa4,0xaa,0xaa,0xaa,0xaa,0x94,0xaa,0xaa,0x4a,0x14,0x14,0x95,0x4a,0x49,0x15, 0x45,0xa2,0x28,0x25,0xa8,0xf6,0xdd,0x6a,0x45,0x55,0x21,0x29,0x22,0x00,0x20, 0x00,0x04,0x80,0x37,0x41,0x52,0x8a,0x44,0x29,0x00,0x00,0x00,0x00,0xa4,0x2a, 0x95,0xaa,0x4a,0x55,0x29,0x55,0x55,0x95,0xa2,0xa0,0x24,0xa9,0x04,0x22,0x28, 0x09,0x41,0x48,0x53,0xdd,0x77,0x97,0x2a,0x48,0x56,0x82,0x00,0x00,0x00,0x10, 0x40,0x50,0x4a,0x0a,0xa0,0x35,0x10,0x02,0x09,0x11,0x11,0x01,0x12,0x51,0x51, 0x55,0x55,0x55,0xa5,0x92,0x92,0xa4,0x4a,0x0a,0x92,0x44,0xa2,0x94,0x4a,0x50, 0x94,0x92,0xaa,0x76,0xdd,0xd5,0x4a,0x25,0x4a,0x29,0x01,0x21,0x00,0x02,0x00, 0x80,0x2a,0x01,0x88,0x0a,0xa5,0x00,0x00,0x00,0x00,0x00,0xa4,0x4a,0xa6,0xaa, 0xaa,0xaa,0xaa,0x54,0x55,0x29,0x29,0x51,0x29,0x29,0x49,0x42,0x10,0x85,0x40, 0x24,0x54,0xdb,0xb7,0x2d,0x15,0x92,0x94,0x24,0x04,0x00,0x00,0x00,0x01,0x42, 0x4a,0x94,0x20,0xa5,0x10,0x2a,0x20,0x48,0x04,0x00,0x52,0xaa,0x59,0x55,0x55, 0x55,0xa9,0xaa,0x54,0xaa,0x04,0x0a,0x44,0x92,0x10,0x91,0x4a,0x20,0x14,0x91, 0xa5,0xf6,0xed,0x56,0xa5,0x00,0x21,0x02,0x00,0x00,0x44,0x00,0x00,0x00,0x2a, 0x01,0x08,0x08,0x84,0x00,0x09,0x01,0x40,0x02,0x94,0x12,0xaa,0xaa,0xaa,0x2a, 0x95,0x24,0xa5,0x4a,0x55,0x51,0x91,0x44,0x22,0x44,0x02,0x45,0xa1,0x24,0xaa, 0x5a,0xb7,0xb5,0x14,0x15,0x84,0x88,0x00,0x00,0x00,0x00,0x10,0x80,0x48,0x24, 0x40,0x40,0x09,0x24,0x00,0x00,0x01,0x00,0x4a,0xd5,0x4a,0x55,0x55,0xab,0x4a, 0x95,0x52,0x52,0x22,0x4a,0x24,0x92,0x94,0x92,0x54,0x10,0x14,0x92,0x52,0xf7, 0x7a,0x0b,0x41,0x40,0x21,0x00,0x20,0x44,0x00,0x20,0x00,0x10,0x20,0x01,0x00, 0x00,0xa0,0x08,0x01,0x24,0x10,0x00,0x52,0x2a,0x55,0x55,0x55,0x55,0x55,0x52, 0x95,0x24,0x45,0x28,0x89,0x54,0x42,0x48,0x02,0x45,0xa1,0x48,0xaa,0xae,0x97, 0x74,0x8a,0x04,0x84,0x24,0x00,0x00,0x80,0x00,0x80,0x00,0x14,0x00,0x02,0x49, 0x02,0xa2,0x24,0x00,0x40,0x00,0x55,0xa5,0xaa,0xaa,0xaa,0xaa,0x2a,0x49,0x4a, 0x4a,0x91,0x12,0x22,0x21,0x91,0x22,0x51,0x20,0x14,0x24,0xa9,0xf5,0xea,0xbf, 0x2a,0x91,0x10,0x00,0x04,0x00,0x08,0x04,0x02,0x00,0x80,0x24,0x20,0x00,0x10, 0x10,0x00,0x81,0x04,0x01,0xa4,0xaa,0xaa,0xaa,0x5a,0x6d,0x55,0x55,0xa9,0x08, 0x4a,0x4a,0x09,0x44,0x2a,0x4a,0x02,0x85,0xa0,0x52,0xaa,0x56,0xbf,0x4a,0x81, 0x08,0x40,0x11,0x80,0x00,0x00,0x00,0x10,0x12,0x00,0x00,0x00,0x10,0x80,0x44, 0x09,0x04,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0x95,0x52,0x52,0x12,0xa2,0x90, 0x00,0x44,0x11,0x49,0x91,0xa8,0x50,0x4a,0x08,0xd5,0xea,0xd5,0xaa,0x54,0x20, 0x0a,0x04,0x01,0x80,0x20,0x00,0x00,0x00,0x01,0x00,0x00,0x02,0x09,0x90,0x80, 0x20,0x10,0x00,0xa9,0xaa,0xaa,0xaa,0xaa,0x6a,0x4d,0x95,0x44,0x49,0x45,0xaa, 0x28,0x42,0x12,0x2a,0x01,0x82,0x24,0xa5,0xa8,0x5e,0x5b,0xab,0x22,0x85,0x00, 0x00,0x10,0x08,0x00,0x11,0x80,0x00,0x08,0x00,0x11,0x00,0x40,0x00,0x12,0x80, 0x40,0x02,0x94,0x54,0x55,0x55,0xab,0xaa,0xaa,0x44,0x52,0x2a,0x20,0x00,0x82, 0x10,0xa4,0x14,0x92,0x28,0x91,0x48,0x4a,0xeb,0xd6,0xfe,0x9a,0x20,0xa4,0x92, 0x00,0x00,0x00,0x00,0x01,0x40,0x00,0x11,0x80,0x40,0x00,0xaa,0x20,0x09,0x04, 0x00,0xab,0x4a,0xaa,0xaa,0x5a,0xad,0x92,0x92,0x94,0x84,0x8a,0x52,0x00,0x84, 0x90,0x22,0x48,0x42,0x44,0x92,0xd2,0xb6,0xbb,0x55,0x2b,0x95,0x00,0x00,0x02, 0x01,0x00,0x04,0x08,0x02,0x00,0x00,0x00,0x04,0x92,0x00,0x0a,0x00,0x00,0x00, 0xa4,0xaa,0xaa,0xaa,0xaa,0x55,0xad,0x54,0x25,0x29,0x51,0x04,0x55,0x21,0x04, 0x89,0x02,0x28,0x92,0x24,0xa9,0xdd,0x6e,0xbf,0x55,0x02,0x92,0x24,0x00,0x00, 0x82,0x40,0x40,0xa8,0x02,0x00,0x00,0x00,0x00,0xda,0x02,0x82,0x10,0x01,0x55, 0x55,0x55,0x55,0x55,0xb5,0x52,0x55,0x92,0xa4,0x84,0x50,0x00,0x12,0x21,0x4a, 0x54,0x41,0x49,0x52,0x6a,0x77,0xff,0x6a,0x95,0x28,0x08,0x82,0x10,0x20,0x00, 0x12,0x01,0x20,0x10,0x40,0x04,0x20,0x20,0x20,0x29,0x08,0x00,0x00,0xaa,0xaa, 0xaa,0x6a,0x55,0x55,0x55,0x25,0x49,0x12,0x55,0x04,0xaa,0x44,0x08,0x11,0x01, 0x2a,0x84,0x08,0xd5,0xda,0x55,0xb7,0x2a,0x85,0x82,0x20,0x00,0x00,0x10,0xa8, 0x4a,0xa2,0x80,0x08,0x00,0x01,0x08,0x95,0x04,0x21,0x84,0x00,0x55,0x55,0x55, 0x55,0xab,0xaa,0x56,0xa9,0xaa,0x54,0x88,0x52,0x00,0x10,0xa1,0x24,0x2a,0x91, 0x28,0xa5,0xaa,0xef,0xff,0xad,0x55,0x29,0x10,0x0a,0x81,0x08,0x00,0xda,0x52, 0x19,0x00,0x00,0x10,0x08,0x41,0x24,0x55,0x00,0x01,0x02,0xaa,0xaa,0xaa,0xaa, 0xaa,0xad,0x55,0x55,0x45,0x2a,0x55,0x00,0x55,0x05,0x14,0x4a,0x41,0x24,0x45, 0x90,0xd4,0x7a,0x55,0xab,0xae,0x02,0x44,0x21,0x10,0x00,0x00,0x60,0xad,0x25, 0x00,0x00,0x01,0x00,0x00,0x48,0x05,0x04,0x20,0x00,0x55,0x55,0x55,0x55,0x55, 0x55,0xad,0xaa,0xaa,0xa0,0x22,0x55,0x88,0xa8,0x40,0x14,0x0a,0x91,0x88,0x4a, 0xaa,0xef,0xff,0xbe,0x15,0x54,0x11,0x94,0x04,0x80,0x40,0x40,0x51,0x0a,0x00, 0x00,0x00,0x40,0xa4,0x12,0x28,0x21,0x00,0x00,0xaa,0xaa,0xaa,0xaa,0x6a,0xd5, 0x52,0xaa,0x24,0x15,0x88,0x8a,0x42,0x04,0x2a,0x45,0x41,0x24,0x24,0x21,0xd5, 0x7a,0x55,0x6b,0x45,0xab,0x04,0x02,0x01,0x01,0x04,0x90,0xad,0x05,0x11,0x11, 0x00,0x02,0x00,0x50,0x05,0x00,0x12,0x01,0x52,0x55,0x55,0xad,0x56,0xb5,0x56, 0x55,0x55,0x62,0x53,0x12,0x14,0xa9,0x40,0x2a,0x2a,0x91,0x92,0x94,0x54,0xef, 0xdf,0xad,0xa9,0x2a,0xa2,0x28,0x10,0x08,0x00,0x42,0x55,0x02,0x00,0x00,0x49, 0x10,0x88,0x56,0x51,0x12,0x00,0x00,0xad,0xaa,0xaa,0xd5,0xaa,0xaa,0xaa,0xaa, 0x92,0x94,0x94,0xa4,0xa2,0x12,0x2a,0x81,0x84,0x08,0x20,0x48,0xaa,0x75,0x75, 0x57,0xda,0x8a,0x08,0x42,0x05,0x00,0x00,0x88,0xaa,0x00,0x00,0x00,0x00,0x00, 0x21,0xa8,0x8a,0x80,0x40,0x00,0x52,0x55,0xb5,0xaa,0xaa,0x56,0xb5,0xaa,0x2a, 0x15,0x22,0x92,0x14,0x4a,0x41,0x54,0x28,0xa5,0x8a,0xa2,0x54,0xdf,0xdf,0xc9, 0xb7,0x12,0x21,0x10,0x50,0x20,0x11,0x40,0x0d,0x20,0x00,0x21,0x00,0x00,0x80, 0x6a,0x25,0x02,0x02,0x01,0x55,0x55,0xad,0xaa,0xaa,0xaa,0x5a,0x55,0x51,0xa5, 0x94,0x2a,0x49,0xa1,0x94,0x12,0x45,0x48,0x50,0x14,0xd5,0xb6,0xb6,0x52,0x5a, 0x49,0x88,0x04,0x05,0x04,0x00,0x00,0x52,0x04,0x10,0x04,0x40,0x24,0x04,0x90, 0x4a,0x20,0x10,0x00,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0xa5,0x2a,0x55,0x49,0xa2, 0x44,0xaa,0x14,0x49,0xa4,0x88,0x22,0x85,0xa0,0x54,0xfb,0xbd,0x6e,0x2d,0x25, 0x01,0x20,0x90,0x00,0x40,0x00,0x04,0x00,0x01,0x00,0x09,0x00,0x90,0xaa,0x0a, 0x01,0x00,0x00,0x55,0x55,0x55,0x55,0x55,0x55,0xad,0x55,0x55,0x25,0xa9,0x52, 0x15,0x45,0x92,0x12,0x22,0x09,0x21,0x15,0xd5,0x5e,0xaf,0xbb,0x57,0x01,0x20, 0x89,0x44,0x10,0x12,0x94,0x00,0x01,0x00,0x00,0x00,0x00,0x01,0x48,0x55,0x88, 0x44,0x02,0xaa,0xaa,0xaa,0xaa,0x6a,0x6d,0xb5,0x2a,0x95,0xa8,0x4a,0xaa,0x52, 0x92,0x44,0x48,0x54,0x52,0x8a,0x48,0x6a,0xfb,0xf5,0xee,0xaa,0x2a,0x05,0x00, 0x10,0x41,0x00,0x01,0x12,0x08,0x88,0x10,0x80,0x08,0xa4,0x52,0x05,0x01,0x00, 0x00,0x55,0x55,0x55,0x55,0xad,0xaa,0xaa,0xca,0xaa,0xaa,0x34,0x25,0x55,0x25, 0x29,0x92,0x92,0x94,0x20,0x22,0xa9,0xbf,0xba,0x5b,0x59,0x42,0x90,0x24,0x45, 0x08,0x44,0x80,0x04,0x20,0x01,0x00,0x01,0x40,0x48,0x25,0x52,0x44,0x10,0x00, 0x56,0x55,0xab,0xaa,0xaa,0xaa,0x55,0x55,0x55,0x55,0xc5,0x54,0xa5,0x4a,0x42, 0x25,0x24,0x29,0x55,0x49,0xaa,0xf6,0x6e,0x6f,0xa3,0x08,0x01,0x00,0x00,0x81, 0x00,0x12,0x50,0x02,0x00,0x02,0x08,0x02,0x40,0x56,0x89,0x10,0x41,0x02,0xa9, 0xaa,0x54,0x55,0x55,0x55,0xad,0xaa,0x2a,0x55,0x2a,0xa5,0xaa,0xa4,0x2a,0x48, 0x95,0x84,0x0a,0x24,0xc9,0x5d,0xdb,0xba,0x5c,0x22,0x48,0x92,0x10,0x24,0x48, 0x80,0x02,0x00,0x40,0x40,0x40,0x10,0x12,0x59,0x22,0x02,0x00,0x00,0x55,0x55, 0xab,0xaa,0xaa,0xaa,0xaa,0xaa,0xaa,0x56,0x55,0x52,0x4a,0x55,0x49,0x93,0xa4, 0x2a,0x51,0x89,0x54,0xd7,0xfd,0x57,0x25,0x09,0x00,0x00,0x42,0x00,0x00,0x12, 0x00,0x11,0x09,0x00,0x02,0x40,0x28,0xa5,0x84,0x88,0x04,0x00,0xaa,0xaa,0x54, 0x95,0xaa,0x5a,0xb5,0xaa,0xaa,0x4a,0x25,0x49,0x55,0x92,0x94,0x48,0x29,0x51, 0x4a,0x52,0xa2,0x6d,0x5f,0x5d,0x9b,0x02,0x45,0x44,0x00,0x49,0x12,0x00,0x24, 0x00,0x00,0x10,0x00,0x02,0x41,0x54,0x21,0x00,0x20,0x01,0x55,0x55,0xa5,0xa8, 0x54,0xd5,0x4a,0x55,0x55,0x55,0xaa,0x96,0x92,0x54,0x29,0x55,0x52,0x4a,0x29, 0x89,0x54,0xbb,0xb5,0xf3,0x2a,0x28,0x10,0x01,0x04,0x00,0x40,0x20,0x00,0x00, 0x80,0x00,0x10,0x10,0x94,0xa9,0x8a,0x12,0x00,0x00,0x55,0x55,0x55,0x4a,0x55, 0xab,0xaa,0xaa,0xaa,0xaa,0x4a,0x61,0xaa,0x4a,0x92,0x92,0x2a,0xa5,0x84,0x44, 0xa4,0xed,0x6d,0x5d,0xad,0x02,0x01,0x90,0x40,0x92,0x04,0x04,0x02,0x91,0x08, 0x44,0x82,0x00,0x40,0x4a,0x22,0x00,0x89,0x00,0xaa,0xaa,0x48,0x95,0xaa,0xaa, 0xaa,0x55,0x55,0x55,0x55,0x8d,0x45,0x92,0x2a,0x29,0x49,0x8a,0x52,0x92,0x4a, 0xbf,0xdb,0xb5,0x2b,0x09,0x44,0x00,0x08,0x00,0x10,0x41,0x10,0x00,0x00,0x00, 0x00,0x44,0xaa,0x12,0x49,0x12,0x00,0x02,0xd5,0x2a,0x55,0x22,0xa9,0xaa,0xaa, 0x6a,0xb5,0xaa,0x4a,0xb2,0x28,0x55,0x89,0x94,0x52,0x51,0x28,0x29,0xa1,0xea, 0x76,0xad,0x4a,0x40,0x01,0x04,0x02,0x24,0x02,0x08,0x00,0x04,0x20,0x00,0x10, 0x00,0x40,0x49,0x90,0x84,0x24,0x00,0xaa,0xaa,0x22,0x55,0xaa,0xaa,0x6a,0xad, 0xaa,0x2a,0x55,0x55,0xa5,0x24,0x52,0x51,0x8a,0x4a,0x85,0x44,0xaa,0xbe,0xaf, 0xd5,0x2a,0x25,0x08,0x10,0x20,0x01,0x48,0x80,0x44,0x20,0x02,0x02,0x80,0x48, 0x15,0x25,0x05,0x29,0x02,0x00,0xad,0xaa,0x4a,0x22,0x55,0x55,0x55,0x55,0x55, 0x55,0xa5,0x2a,0x95,0x52,0x49,0x24,0x51,0x24,0x51,0x29,0x49,0xed,0xda,0x5a, 0x45,0x00,0x20,0x81,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x90,0x04,0x10,0xa2, 0x90,0xd0,0xa4,0xfa,0x02,0xaa,0xaa,0x94,0x94,0x52,0x55,0x55,0x55,0x5b,0xab, 0x4a,0x52,0x29,0x45,0x92,0x4a,0x8a,0x92,0x24,0x52,0xaa,0xb7,0x6b,0xb7,0x8a, 0x92,0x02,0x00,0x12,0x48,0x00,0x49,0x00,0x01,0x00,0x00,0x20,0x42,0x09,0x22, 0x09,0x55,0x95,0x05,0xd5,0xaa,0x4a,0xa2,0x54,0x55,0x55,0x55,0x55,0x55,0xa9, 0xaa,0x4a,0xa9,0x24,0x91,0x52,0x49,0x4a,0x89,0x92,0xfc,0x5d,0xa9,0x22,0x04, 0x40,0x24,0x80,0x00,0x24,0x00,0x20,0x90,0x88,0x00,0x00,0x00,0x44,0x49,0xa2, 0xa8,0xee,0x06,0xaa,0xaa,0x92,0x94,0x4a,0x55,0x55,0x55,0x55,0x55,0x25,0x25, 0x55,0x8a,0x92,0x24,0x89,0x94,0x28,0x55,0xaa,0xb6,0x77,0x57,0x95,0x50,0x12, 0x00,0x00,0x00,0x00,0x00,0x09,0x00,0x00,0x04,0x80,0x54,0x11,0x94,0x54,0xab, 0x98,0x02,0xaa,0xaa,0x54,0x25,0xa9,0xaa,0xaa,0x6a,0xab,0xaa,0xaa,0x54,0x49, 0xa5,0x48,0x92,0x52,0x4a,0x45,0x49,0x49,0xed,0x5d,0x55,0x21,0x84,0x00,0x01, 0x12,0x24,0x00,0x24,0x00,0x04,0x00,0x40,0x12,0x00,0xa4,0x42,0x8a,0x54,0xeb, 0x05,0x55,0x55,0x25,0x4a,0x52,0x55,0x55,0x55,0xb5,0x55,0x49,0x55,0x95,0x54, 0x95,0x4a,0x4a,0x29,0x95,0x92,0xaa,0xba,0xeb,0x2a,0x96,0x10,0x04,0x48,0x00, 0x00,0x11,0x01,0x80,0x20,0x22,0x00,0x00,0x52,0x10,0xaa,0x2a,0xbb,0x56,0x07, 0x5a,0x55,0x95,0x22,0x95,0xaa,0x6a,0xad,0x55,0x55,0x55,0xaa,0xa4,0x2a,0x49, 0xa4,0xa4,0x54,0xa9,0x54,0xa9,0xf4,0x56,0xaf,0x21,0x05,0x41,0x00,0x00,0x01, 0x00,0x00,0x04,0x00,0x00,0x08,0x80,0x88,0x8a,0xa8,0xaa,0x54,0xd5,0x02,0x55, 0x55,0x55,0x4a,0x52,0xa9,0xaa,0xaa,0xaa,0xaa,0xaa,0x2a,0x95,0xa4,0x52,0x29, 0x29,0x49,0x25,0x55,0x55,0xdd,0xfd,0xa9,0x16,0x28,0x08,0x42,0x12,0x88,0x00, 0x20,0x21,0x84,0x00,0x41,0x12,0x22,0x70,0xb5,0x55,0xb5,0xad,0x05,0xaa,0xaa, 0xaa,0x52,0x49,0x55,0x55,0x55,0xb5,0xad,0x4a,0x95,0xa4,0x92,0x94,0x4a,0x55, 0x55,0xaa,0xaa,0x94,0x72,0xaf,0x5e,0x89,0x02,0x01,0x10,0x40,0x00,0x44,0x04, 0x00,0x00,0x20,0x00,0x40,0x49,0x8b,0xd6,0x4a,0x55,0x75,0x07,0x55,0xab,0xaa, 0x94,0x2a,0x55,0x55,0x6b,0xad,0x52,0x55,0x55,0x29,0x55,0x25,0x95,0x4a,0xa9, 0x54,0x25,0x53,0xed,0xf5,0x55,0x55,0x48,0x10,0x01,0x01,0x02,0x00,0x00,0x00, 0x11,0x04,0x10,0x44,0x92,0x54,0xab,0x55,0xf5,0x56,0x05,0x55,0x55,0x55,0xa5, 0xa4,0xaa,0xaa,0xaa,0x55,0xad,0xaa,0x4a,0x4a,0x49,0x52,0xa2,0x24,0x55,0x95, 0xaa,0xaa,0xb2,0x5e,0xd7,0x26,0x02,0x04,0x00,0x08,0x80,0x00,0x10,0x10,0x00, 0x00,0x02,0x91,0xa4,0xaa,0xaa,0x56,0x2a,0xab,0x06}; kazu-yamamoto-Mew-ff9c41b/etc/Mew.xpm000066400000000000000000006524011256455547000176140ustar00rootroot00000000000000/* XPM */ static char *mew[] = { /* width height num_colors chars_per_pixel */ " 347 200 234 2", /* colors */ ".. c #282828", ".# c #283430", ".a c #283858", ".b c #303840", ".c c #303c30", ".d c #304850", ".e c #382c28", ".f c #383860", ".g c #383c40", ".h c #384038", ".i c #385050", ".j c #404048", ".k c #404438", ".l c #404830", ".m c #405c60", ".n c #484850", ".o c #485838", ".p c #486860", ".q c #502438", ".r c #503430", ".s c #503c38", ".t c #504840", ".u c #504c38", ".v c #505058", ".w c #506c68", ".x c #507490", ".y c #508458", ".z c #509088", ".A c #583c28", ".B c #584440", ".C c #584838", ".D c #585048", ".E c #585440", ".F c #585850", ".G c #586448", ".H c #605840", ".I c #607070", ".J c #684c40", ".K c #684c50", ".L c #685440", ".M c #685c48", ".N c #685c58", ".O c #687458", ".P c #687468", ".Q c #688080", ".R c #706450", ".S c #706460", ".T c #707878", ".U c #707c68", ".V c #708070", ".W c #708c68", ".X c #709088", ".Y c #785448", ".Z c #786440", ".0 c #786c78", ".1 c #787c80", ".2 c #788478", ".3 c #789060", ".4 c #789490", ".5 c #804438", ".6 c #804440", ".7 c #805838", ".8 c #806c48", ".9 c #806c58", "#. c #807c88", "## c #808890", "#a c #809078", "#b c #80a088", "#c c #884050", "#d c #884c68", "#e c #885c50", "#f c #886040", "#g c #887858", "#h c #887868", "#i c #8898a0", "#j c #906058", "#k c #906448", "#l c #906840", "#m c #906860", "#n c #909888", "#o c #90a090", "#p c #90a8b0", "#q c #985440", "#r c #985c78", "#s c #986840", "#t c #986850", "#u c #986c80", "#v c #987068", "#w c #988460", "#x c #988470", "#y c #988c68", "#z c #989098", "#A c #989470", "#B c #98acb0", "#C c #a06040", "#D c #a07058", "#E c #a07468", "#F c #a07840", "#G c #a07c70", "#H c #a09080", "#I c #a09850", "#J c #a0a078", "#K c #a0ac90", "#L c #a0c8a0", "#M c #a87c60", "#N c #a87c90", "#O c #a88078", "#P c #a88c68", "#Q c #a89488", "#R c #a8a880", "#S c #a8b0a8", "#T c #b05458", "#U c #b05c48", "#V c #b06468", "#W c #b06850", "#X c #b06c40", "#Y c #b08048", "#Z c #b08448", "#0 c #b09050", "#1 c #b09470", "#2 c #b0a090", "#3 c #b0a860", "#4 c #b0b090", "#5 c #b0b878", "#6 c #b0b8b0", "#7 c #b87458", "#8 c #b88088", "#9 c #b88470", "a. c #b89858", "a# c #b89ca8", "aa c #b8a490", "ab c #b8b898", "ac c #b8c080", "ad c #b8c0b8", "ae c #b8c0c8", "af c #c07848", "ag c #c08460", "ah c #c08490", "ai c #c08c78", "aj c #c0a060", "ak c #c0a078", "al c #c0a468", "am c #c0a4a8", "an c #c0a888", "ao c #c0c0a0", "ap c #c0d0c8", "aq c #c0d4b0", "ar c #c88848", "as c #c88c60", "at c #c89468", "au c #c89480", "av c #c8ac78", "aw c #c8b060", "ax c #c8b090", "ay c #c8c888", "az c #c8c8a8", "aA c #d06858", "aB c #d07870", "aC c #d08048", "aD c #d09050", "aE c #d094b0", "aF c #d09888", "aG c #d09c48", "aH c #d09c68", "aI c #d0b480", "aJ c #d0b868", "aK c #d0b898", "aL c #d0b8b8", "aM c #d0c8c0", "aN c #d0d8c8", "aO c #d0e0c8", "aP c #d0e0d8", "aQ c #d87058", "aR c #d89458", "aS c #d89c58", "aT c #d8a088", "aU c #d8a468", "aV c #d8bc88", "aW c #d8bcc0", "aX c #d8c070", "aY c #d8c0a0", "aZ c #d8cca0", "a0 c #d8d0c8", "a1 c #d8e4b8", "a2 c #d8e4d8", "a3 c #d8e8c8", "a4 c #e09c48", "a5 c #e0a850", "a6 c #e0a890", "a7 c #e0ac70", "a8 c #e0c470", "a9 c #e0c888", "b. c #e0d0c0", "b# c #e0d4a8", "ba c #e0dcd8", "bb c #e0f0d0", "bc c #e88058", "bd c #e88860", "be c #e8b058", "bf c #e8b870", "bg c #e8bc78", "bh c #e8bcb0", "bi c #e8c498", "bj c #e8d070", "bk c #e8d088", "bl c #e8d8b8", "bm c #e8e0c0", "bn c #e8e480", "bo c #e8e8c8", "bp c #e8e8e0", "bq c #e8f0e8", "br c #e8f8e0", "bs c #f09c60", "bt c #f0a468", "bu c #f0b460", "bv c #f0bc68", "bw c #f0c058", "bx c #f0c470", "by c #f0c480", "bz c #f0cca0", "bA c #f0d470", "bB c #f0dc90", "bC c #f0e498", "bD c #f0e8b0", "bE c #f0ec98", "bF c #f0f4b0", "bG c #f0f8a0", "bH c #f0fce8", "bI c #f8ac70", "bJ c #f8b0a0", "bK c #f8cc88", "bL c #f8d070", "bM c #f8d4a8", "bN c #f8f0d8", /* pixels */ "bmbmbmbmbma1bmbmbmbmbmbma3blbmbmbmbmbmbobmbobobma3bmboa3bobmbmbmbobmbobmbmbmbmbobmbabobma3a3bmbmbmbmbmbmbobmbmbobmbmbmbmbmbDbmbDbobDbDbDbmbDbmbmbmbmbmbmbDbmbmbmbmbmbmbmbmbmbCbobDbmbmbmbCbmbmbmbDbmbmbmbmbmbmbmbmbDbobmbmbmbmbobmbobobobobobobobobobobmbobobobobobmbobobobobobbbNbobbbbbobobobobobobobobobmbobobobmbDbDbmbmbMbmbmbobDbmbDbDbDbDbDbDbDbDbobDbDbNbDbDbDbFbNbDbobDbobobDbDbobobNbobNbobobobNbobobobobobobNbobobNbpbobobobpbobobNbobobobNbNbobobNbobDbobNbDbobDbobobNbobDbFbNbDbobDbDbDbobobDbDbDbDbobobDbDbobobDbobobobobobobobobmbobobobpbobpbNbmbpbpbobobpbobmbpbobobobpbobpbabobobobmbobobobobobobobobFbobFbobDbmbobobMbobmbmbobobmbMbobobobpbMbpbNbabMbpbMbobMbabobMbMbpbMbobmbNbobmbmbmbCbMbmbCbMbm", "bmbmbmbmbmbmbCbmbmbmbmbCbmbmbmbmbmbmbmbDbmbmbmbmbmbobmbmboa3bmbmbobmbmbabmbobmbobobmbmbmbaboboboa3bmbobobobmbmbmbobobmbmbobobmbobobobmbmbDbmbmbmbmbmbmbmbDbmbmbmbmbmbCbDbobmbDbmbDbmbDbCbmbCbDbmbDbmbmbmbCbmbCbmbCbmbmbobDbmbobobmbobmbmbmbobobobobobpbobobobobobobobobobobobbbobbbbbobbbobobobobpbpbNboboboboa3blbobmbMblbBblbCbobDbobDbDbDbNbDbDbobDbobDbDbobFbobobFbNbDbDbDbDbobobFbobDbobNbDbNbobobobNbobNbobobobpbpbobpbobNbobobqbNbpbobqbobobNbpbobpbobobNbobobobobbbDbNbobbbobobDbNbDbobNbDbDbNbobDbobDbobDbDbmbobDbobNbDbobobobobFbmbobobobobobobobobobobobobpbpbobpbpbobpbpbobmbpbpbabobpbabobobobobobmbobobobobobDbDbobmbobmbmbobobMbobobobMbMbNbmbobobobpbobmbpbMbobmbabobobpbMbNbobmbmbmbmbmbmbmbmbCbmbmbM", "bDbDbCbmbCbmbmbmbmbmbmbDa1bmbDbmbmbmbDbmbmbmbmbmbDbDbmbmbobmbobabmbpbmbobabmbmbpbmbmbobobobmbmbobobobmbmbobma3boa3a3a3bmbobobobobobmbobmbobmbmbobmbmbobmboboa1bmbDbobmbmbmbDbmbDbmbmbma1bmbmbmbDbmbDbmbmbmbDbDbmbmbmbmbDbmbDbDbobDbDbobobobobobobobobobobobobobobobobobobobobobNbobobobobobobpbobobobobobobobobpblblblbzbzbzbmbMbmbmbobobDbobDbDbobDbFbFbobFbFbDbDbFbDbDbDbobobFbDbDbobNbFbobobobDbobobobobobobobobpbobNbobobNbobobobNbobobpbobqbobobobNbobNbpbobobobNbobNbobobobDbobobobobNbobobDbDbobNbobDbobDbobobobobobFbobDbNbDbobobmbNbFbobNbobobobmbpbNbobpbobobpbMbNbMbNbabMbpbpbobabobpbobobobobobobobobobobmbobobobobobobobobobFbmbobobFbobobNbmbobNbMbpbpbMbMbpbobNbabNbobpbMbpbabpbmbobmbmbMbobMbmbmbmbmbm", "bmbmbmbmbmbDbmbCbmbmbmbmbmbmbmbmbDbDbmbDbmbDbobmbmbmbmbmbobma3bobobmbmbmbmbobobmbmbmbmbmbobobobobmbmbobobobmbmbmbobobmbobobmbobobobobmboa3bobobmbobobmbobobmbobmbmbmbobobmbmbmbDbmbobmbobDbobobmbobDbmbCbDbmbmbCa1bmbCbDbobDbDbmbobobDbobDbobobobobobobobobobobobobDbobobobobobobpbNbobobNbobobpbobpbobobpbobobmbmblbza9bibkbMblbDbmbobDbobobNbobDbFbobDbDbobobFbobNbDbDbDbDbDbobDbobFbDbobDbDbNbDbNbDbobNbobobNbobobobobobobobpbNbobpbNbpbobpbNbobqbobobqbobobqbobpbobNbobobbbobNbobobNbobobNbobNbNbobDbobDbDbNbDbDbobNbDbobFbobDbDbobobFbmbNbMbNbNbMbmbobobmbobobpbobNbpbpbNbabpbpbpbNbabNbpbmbNbobpbmbpbobobobobmbmbmbobobDbobobobobobobobobobobobmbMbobobobobobpbobpbobMbMbpbMbpbMbabobMbmbmbpbobmbmbobmbMbobmbmbM", "bmbmbmbmbmbCbCbmbmbma1bma1bCbDbmbmbmbCbmbmbmbmbmbCbmbDbmbmbobmbobmbma3a3bmbmbmbmbobmblbmbmbobobmbobobmbobmbobmbmbobmbpbmbobmbmbmbobobobobmboboa3boa3bobobobobobma3bmbobmbobmbmbobmbobmbmbobmbobmbobmbDbDbmbDbmbobmblbmbmbDbmbmbobDbobDbDbNbDbDbobDbDbDbDbFbobobDbNbDbDbobobNbobobobobobNbobobobobobobpbobobobzb.aVaVa6bfaVa7aVb#bBbmbmbobobDbNbDbobobNbobDbobobNbobDbobFbobobobDbobobDbDbobDbDbNbFbNbDbNbDbFbDbobobobobNbDbobDbNbobobobNbobobobNbpbNbpbobNbpbpbobNbqbNbNbobobbbobNbNbobobqbobobobobobobobobDbDbNbobDbobobDbobobFbobFbobobFbobobobobobFbNbMbNbobobobmbNbNbpbobobobabmbpbobobpbpbmbNbobobabobpbpbmbobmbmbobobDbobobmbobFbobobobobDbDbobobobobDbobobmbobmbpbMbobNbMbabobMbMbpbobNbabobmbmbMbpbmbobmbabmbm", "bmblbCbCbmblbDa1bCbmbDbCbmbmbmbma1bma3a1bDbma1bmbmbmbmbmbDbmbmbmbobmbmbmbmbmbmbmbobmblbmbmbmbobmbmbmbmbmbmbobmbpbmbobma3bmbmbmbobmbmbobobobobmbobmbmbobmboboa3boa3bmbobobmbobmbobmbmbobobobobobmbDbDbmbmbmbDbDbmbmbCblbMbmbDbDbDbmbobDbFbobDbobDbobobDbDbobDbDbDbDbobDbFbDbDbobobDbobNbobobobNbobpbobobobobmbzaVa7aIbfbyaVa9a9bkbMbDbmbobobobobobNbobobobNbobDbobobobobobNbobobFbobobFbobDbobDbDbNbDbFbDbFbobobFbDbobDbobDbobDbobobobNbobobobobobNbobobqbobobobNbobNbobpbobqbNbpbobobobobobobNbobbbNbobNbobobobobDbobobNbDbNbNbDbNbobDbDbobFbDbobFbobNbobobobNbobobobobobobobMbNbobpbobpbobobpbobabpbmbabNbababNbababobobobobobobmbobFbobobmbMbNbobDbobobobMbMbobobMbobobobobobabNbobpbobabNbpbMbpbobabpbMbabmbabmbabM", "bmbma1bmblbCa1bmbmbmbmbma1bCa1bma1a1a1a1bmbmbma1bmbmbmbEbmbDbDbmbDbmbma1bmbmbmbmblbmbma3bmbmbmbmbmbmbobmbobmbmbobmbmboa3bobmbmbmbmbmbobmbobobobobobobobmbmbobobmbobobmbobobobobobma3bobobobobobmbmbmbobDbmbmbobDbmbmbmbobmbDbDbmbmbmbDbDbmbDbDbobDbDbMbobDbobDbDbDbDbmbDbobDbDbobDbobDbobDbobobobmbobmb#aZaVa7aVaVa9a9aZa9aZa9b#bkbMbMbDbobobobNbobobobobobobobobobobobobobDbobFbobobFbDbobDbDbNbDbDbDbbbDbobDbobDbobDbDbmbobobobDbobobobFbobobbbobobbbNbobobobobobNbpbobpbobpbNbpbbbobobbbobbbNbbbobobobbbobobobobobobobobNbDbobNbobDbobDbDbDbobFbobobDbDbobNbmbNbmbNbobobobobobmbobobpbobobobmbpbpbobabpbmbmbpbpbpbmbpbmbpbpbobobobobmbobobmbobobobobobDbobFbobobMbobNbMbobMbobobobMbobabpbobmbobpbMbMbpbMbmbabMbabM", "bmbmbmbmbmbmbCbmbCa1bmbmbCbmbCblbmbmbmbmbmbCbmbCbmbCbmbmbmbmbmbmbmbDbmbmbmbmbmbDbobmbmbmbmbma3bmbmbobma3bobma3bmboa3bobobma3bmboa3bmbobpbmbobabobababobobpbmbobabobmbobma3boboa3bobobma3bobmbmbma3bmbobma1bDbDa3bDa1bDbmbmbmbobobDbobDbDbmbDbDbDbmbDbobDbDbDbobDbDbDbobobDbDbDbDbobDbobFbobDbDbmbmbobMbiaVavaVbka9bkaZaVa9aVaZa9b#b#a1bobNbobobobobobobobNbobobNbobobNbobNbobbbobFbDbobobFbobobDbobbbDbDbobFbDbDbobDbobDbDbDbDbobobobDbobbbobbbobobobobbbobNbNbbbobobobobpbobobobobpbobpbobqbpbobobbbobobNbobobNbobobobobobNbobobobobobFbobobmbDbobFbobFbobFbobobobNbMbobobobmbobobobobobobobNbabNbpbobobpbmbpbobobmbpbpbobpbpbmbpbobmbobobobobobobobDbDbDbDbobDbobobDbMbNbmbobmbMbobobobMbobmbabobmbababmbababpbMbmba", "bmbCbmbmbCbma1bmbmbmbmbmbmbCbmbmblblbobmbmbmbmbDblbmbla1bmbmbmbmbDbmbmbmbDbmbmbmbmbobmbmblbmbmbDblbmboblbobmbmbmbmbmbmbmbmbmbmbmbmbobobmbobmbobobobobmbmbmbobmbobmbabobobmbmbobobobobobobmbobma3bobobobobma3bobobobobobobobmbDbobmbobDbmbDbobmbDbmbobDbDbobDbDbDbDbDbDbDbDbDbobDbDbobDbDbbbDbobEbmblbkaXaVa9bkbkbka9aZaVaVaVa9a9bkbzbBbobobobpbobNbNbobobobobobbbobbbobobbbobFbobNbFbbbNbobobobDbbbDbobbbobobDbobDbDbobobobDbDbobDbobFbDbDbobobobDbobDbobobobobobobNbobobobqbqbobpbobpbobpbobobobobobobobbbobobobNbobobobobobobobobobNbNbobobDbNbobobobobobobobobFbobobobobobobobobobobobabmbobobobobpbobpbobmbNbabpbobmbpbobobpbobpbobobobNbobobmbobFbobobMbMbobFbobMbobobMbMbobobmbmbMbobpbNbMbpbobabmbabMbMbmbpbmbm", "bmbmbmbmbmbmbmbmbmbmbmbEbmblbmbmbmbmbDbmbmbmbmbmbmbmbmbmbmbDbmbmbDbmbmbDbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmblbmbmbmbmbmbmbmbmbmbmbmbmbmbmbobobmbmbabobmbmbpbmbobmbmbobmbmbmbmbobababmbobobpbabobobobabobobpboboa3boboboa3bmbobobobobobmbobDbobobobDbobmbmbDbobDbobobDbDbDbDbDbobDbobDbDbDbDbDbDbDbBbka9aJbebybka9aVa9aZaXaVbfaIaJaUbfaVbkbzbMbobobobNbobqbobobobobobobNbobNbNbobbbDbNbbbobNbobNbDbbbobobobobobobobDbobobobDbobDbmbDbobobobFbDbobFbDbobobDbNbDbobobobobobobobobobobNbobobpbobobobpbobpbobpbobpbobobobpbobobpbpbabobobobobobobobobDbobobobobobFbobDbobobobDbobobDbobobobDbobobobobmbobobpbobobMbpbobpbpbobNbabobpbobmbNbabobpbobobpbobobobmbNbobMbobobmbobobMbobDbobobMbobmbmbobMbpbobMbabpbMbMbpbMbpbMbpbpbM", "bmblbmbma1bmbmbmblblbmbmbmbmbmbmbmbmbmbmbmbmbDbma1blbmbmbmbmbDbmbmbDbmbmbmbmbmbmbmbmbmbmbmbCbmboblbma3bmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbabmbobmbmbmbma3bmbmbobabobobabmbpbmbmbabobmbmbobmbabobpbmbpbobpboboboboboa3boboa3bobobobobobobobDbmbmbobDbobDbDbobDbDbobDbobDbobDbDbDbmbDbDbmbmbEbCbkaVaXbfa9a9a9a9aVbkaVaVaIaIbfaIava7aVa9bka1bMbobobobobobobobobobobbbobbbobobobNbbbobobDbbbNbobobobobobNbDbobNbDbNbDbNbobDbDbobDbobDbobobDbNbDbobNbDbobobobobobDbobobobobNbobNbobobpbobobobobpbobobNbpbNbpbobpbobobpbobobpbabobpbobobobobobobobobNbobobobobobobFbobDbobobFbobFbobFbobobobobMbobMbmbobobobpbpbobpbobobpbabobmbpbabpbmbpbpbobpbobobobobobobobobNbmbDbobmbobobobMbobMbobmbMbobmbmbobNbmbobMbpbpbMbpbMbpbMbMbp", "bmbla1blbmblbCblblbla1bmbDbmbCbmbmbma1bmbmbDbmbmbmbDbDbobDbDbmbmbDbmbCbmblbmbmbDbmbma1bmbDbmbmbma3bmbma1bmbmbmbmbmbmbmbmbmbmbmbmbmbmbobmbmbmbmbma3bma3bobabobmbobobobmbabmbpbpbmbmbmbpbabobpbpbobobobobmbobpbpbobpbobobobobmbobobobobobobobobDbNbobmbmbobDbobobDbobobDbDbDbobmbEbmbCbDbCbmbCaVaJa7bLbkaXa8aVaVaVaVbfbfaVa7aJa7a7bfa9b#bkblbmbobobobpbobpbobpbpbobpbobobobbbobobNbobbbDbobNbobobNbobDbobobDbNbDbobDbobobobDbobobDbobobFbDbobFbobDbNbobFbNbobDbobobobobobobobobNbobobobmbobobobobpbobobpbpbobpbpbobpbpboboa3bobobpbobobobobobNbobmbNbobNbobobobobFbDbDbobobobobobobobobobobobobobobobobobabmbobNbobobpbNbpbabNbpbobpbobpbobobobobobNbobmbobmbNbobobobNbMbDbobDbmbmbobobmbobMbmbabMbpbmbmbMbpbMbabMbababM", "a1blblbmbmblbmbmbmblbmbmblbmbmblblbma1bma1bmbmbmbma1blblblbma1bmbmbmbmbmbma1bma1bmbmbmbmbmbmbmbmbma1bmbmbmbmbCbma1a1bma1a3bCbmbmbobmbmbmbmbmbmbmbmbma3a3bmbmbmbmbobmbmbmbmbmbmbobmbpbmbmbobabobobmbobmbobobpbobobobmbobobpbobobobobobobobNbobobobobobmbDbobobobobmbobobobDbDbmbDbCbDbDbMbkaVaXbfbya9aXa9aXaVaVa8aXaIaJaVbfbfbfaJaUaVaybMbBbMbobobobNbobobobobpbobobNbobNboboa3bNbobobNbbbobobbbobobobNbDbobobobobobobobobDbobobDbobDbobobobDbobDbobDbDbDbobDbobDbobobobDbobma3bobobobobobobobobobobobpbpbobobpbobpbobpbobpbobobpbobpbobpbobpbobobobobobobmbobFbobobobobobmbobobmbDbobDbmbobobmbobobobmbobmbobobobmbabmbmbpbobmbNbabobpbobobpbpbobobpbobmbobobmbobmbobobobobobmbmbmbmbMbMbmbmbmbobMbobMbMbpbMbMbabMbmbm", "bmbmblbmbmbmbmbmbmbmbmbmblbmbma1bmblbmbmblbma1bmbmbMb#bla1bmbmbma1bmbmbCbmbmbmbmbmbmbmbma1bmbma1bmbmbCbmbCbla3a1bmbmbmbmbma1bmbmbmbmbmbmbma3bmbmbmbmbobobmbmbmbobmbma3bobmbmbmbobmbmbobmbobmbobpbobpbobpbobobobpbobmbpbobobobobabobobobobobmbobobmbDbobmbobobmbobmbDbobobDbmblbDbDbCbla9aVa8bgbgbjaXaXa8bfa8a8bgaVaVa7bfaVbfbfa7avaXa8b#bCbobobpbobobobpbobobobobpbobpbpbobobNbobNbpbNbNbobbbobNbbbbbDbNbobNbDbbbobobobDbobobDbobobobobobDbobobDbobFbobDbobDbDbobDbDbobobobDbmboa3bobobobobobobobNbobNbobobpbobpbobpbobobobpbobpbobobpbpbobpbpbobpbobobobobobobobobobobobDbobobobmbMbobobmbobobmbobmbobmbobobobobobobobpbmbababobobobpbpbpbobobpbobobobobobmbobmbobobobmbobobDbobmbmbmbobmbmbmbmbobobmbobMbmbmbobababm", "a3babmblbabmblbmblbablbabmbmblbmblbmbabma3blbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbma3bmbmbDbmbmbmbmbmbmbDbmbmbmbmbmbmbmbmbma1bmblbmbmbmbmbmbmblbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbobmbobmbmbobobmbmbobobpbobobobmbobobpbobobpbobobobobobpbobobobpbobobobobobmbobobobobobobmbobobobobDbmbmbDbmbka9bfa8a9a9bgbfbfaXbfaXaXa8aXbfa8bgbfaXbfbua7a7a7aJbkbBbmbobobobobpbobobobobobobobobobpbobobpbobabobNbbbobNbobbbobobobobobobNbobobNbDbobobobNbobNbobobFbobDbNbmbNbDbDbDbobobFbNbNbDbDbobDbDbobobobobobobobobobobobobobobpbobobpbobpbobobobpbobNbobpbobpbobobobpbpbmbmbobobobmbobobobobDbobobobCbobDbDbDbobobmbobobmbmbobobobobobmbpbobpbobobpbobobNbobpbobobNbababobobobpbobmbobobmbmbobMbobMbobmbMbobMbobMbobobobMbmbmbMbMbobmbpbM", "blbla3a1blbablbaa3bmblblbmbaa3bla3bmblblbmbmbma3blbmbmbmbmblbma3bmbma3bobmbmbmbmbmbmbmbmbmbmbmbDbmbmbmbmbmbDbma1bmbmbla1bma1a1bmbma1bma1bmbma1bmbma1bma1bmbmbmbmbmbmbmbmbmbmbmbmboboa3bobobobmbmbmbmbmbmbobmbpbobobmbpbobobpbobobobobobobobobobobobobobobobobmbobobmbmbmbmbDbmbmbMbyaVbfa9a9bfaXaXaXaXaVbga8aVbfaXbfaXaXbgaXaXbfa7aXa7bkbkbBbobobobobmbobobobNbobobNbobobobNbobobpa3bpbobobNbNbobNbbbNbobbbobobobobobobobNbobobobobobobobNbobbbDbobobFbDbDbDbFbobDbDbobobobDbobobDbobobobobobobobobobobpbmbobpbmbobabobpbobpbobobpbpbobpbobobobpbobmbpbpbmbpbNbobobobobobobobobobobobDbobDbmbCbDbobobobobmbNbNbobobobobNbMbobobobobobpbpbobpbpbobpbpbobmbpbmbobmbobmbobMbobobMbobMbmbNbDbmbobmbmbMbMbmbMbmbobobabMbMbo", "bababmbablbabablblbla3a3bmblbma3bma3bma3bmbmbmbobma3blblbmbmbobmbobobma3bmbobmbDbmbmbmbmbmbmbmbmbmbmbobobobmbmbmbmblbmbmblbmbmbmblbmblblbmbmbDbDbmbCbma1bma1bmbma1bmbmbmbobmbma3bobmbobobobobmbobobobmbabmbabmbobobabobpbobobpbobobobababobobobobobmbobobobobobmbobmbmbmbmbDbMbBbkbfbfaXa9a9aVaXaVbfaXa8bgaVa8bfa8aXbfbfa8bvbfbuaJa7aJa9bkblbmbobmbobobobNbobobobobobobobobobpbNbobobobNbobbbobbbobobpbpbobNbobobNbobobobobobobobNbobFbDbobDbDbDbobDbNbDbobDbobFbobobDbDbDbobobobobDbobobobobobobobobobmbobpbobpbobobobobpbobpbobobobpbobobpbpbobobNbmbobabNbobobobobobobobDbDbDbDbobDbDbDbDbmbobobDbobobobobobobobobobobobobobNbabNbobobobobMbpbpbNbababobobobmbmbobmbmbmbmbMbobmbMbmbobMbmbMbmbmbMbmbmbmbMbMbobMbabo", "blblblbablblblbmbabmblbmbla3a3bma3bmbobma3bmbma3bmbmbmbabmbmbmbma3bma3bmbmbmbma3bmboa1bobmbDbmbmbobmbmbla3bmbDbmbmbma1bma1bma1bma1blblbmbma1bmbmbmbmbDbmbCbmbmbCblbma1blbmbmbmbmbmbmbmbmbmbmbobmbmbmbmbmbmbobobobobmbobobmbpbobobmbobobobobobobobobmbmbobmbmbobobmbmbmbMblbla9a9bfaVbga9a8a8aXaXaVaVa7bfaVbgbfaXaXaJaXa8bva8aXbuaXaJa7aXa9bmbDbmbDbDbmbobobobobobobobobobobobobobobobobobobobobbbobNbobobobNbobobobobobNbobobobobobobobobobobobobDbDbobbbobNbobDbobDbDbmbDbobobDbDbmbEbDbDbDbDblblbmbmbobmbobmbobobobabobobpbobpbobobobobpbobmbpbobpbobpbobobmbabobmbobmbobmbobobmbobDbobobMbDbobFbDbobobDbobobFbobDbDbNbobobobobmbobobpbobMbabobabobobmbobobmbmbobmbmbpbmbmbmbmbmbMbMbmbmbmbmbmbmbMbMbmbMbMbmbMbababM", "a1a1blblblblblbmblblbmbmbmbmbmbmbmbmbobmbobababobmbmbmbmbmbma3bmbmbmboblbmbmbmbmbobmbobmbmbobDa3bmbmbmbmbmbmbmbobobmbmblbma1bmbma3bla1bmbmbCbmbDbmbmbma1bmbDbma3bmbmbmbDbmbmbmbmbmbmbDbmbmbmbmbDbDbDbobmbmbobobobobobobmbobobabobobobobobobobobobobobobmbobobobmbabmblblbMb#aVaVaVaXa9a9aVa9aVbfaVbfaJaXbfaVaXaXbfbfbfbfaXbfa8bgaXa7aJa8bkbCbmbDbobDbDbDbDbDbobDbobNboboboboboboboboboboboboa3bobobobba3bpbobobpbNbpbobobobobobobobobobobobobobobobobobDbobDbobDbobobobmbobDbDbobDbmbobDbobobDbmbmbmbobmbobmbobobobobobobobobobobobpbobobpbmbobobobobpbobobpbpbobobobobobmbobmbobmbobobobobFbobobDbobDbmbDbobobobobMbDbMbNbMbobobobobabMbobpbmbobmbmbpbmbpbmbabmbpbmbpbmbmbabmbmbmbmblbmblbmblbMbmbmbmbMbmbmbMbabMbMba", "blblbma3bmblbmbla3bmbma3bmbmbma3bmbobmbmbobmbmbmbobma3bmbmbmbmbma3bmbmbobmbmbobmbmbmbobmbobmbmbobmbmbmbma3bmbmbobmbmbmbma3bma3bma3bmbma1bmblbmbDbma1bDbDbmbmbmbDbmbmbDbDbmbCbmbCbobDbmbmbmbCbDbobDbobDbDbmbobobmbobmbobobmbobobobabobabobobobobobobpbmbobpbmbmbmbMbmbMbMbza9aVaXbfbya9a9aVa8aVaVa7bfaIaVbfaXaXbfaXaJbfaXbfbfbga8bfa7aXa9bkbmbDbDbDbmbobobDbobobDbobDbobobobobobobNbobobobNbobobpbobNbobpbobobobobpbobpbqbobqbpbNbobobNbobNbobNbobFbNbDbobNbobNbobDbDbobDbDbobobDbobDbmbobDbDbDbmbmbmbDbobmbobobobobobobobobobmbpbmbobobobobobobpbpbpbobpbobNbobobpbobobobobobobobmbmbobMbobobobDbFbobobFbmbobobobobobobFbobNbNbMbobobobpbpbMbabobmbobobobpbMbobpbobobmbmbmbmbmbmbmblblbmbMblblbmbMbMbmbobMbmbmbobMbMbm", "bma1bmbmbmblblbmbmbmbmbmbmbobmbobobobmbmbobmbmbmbobobmbmbobmbmbmbmbmbmbobmbobobmboboboboboa3bmbobmbmbobobobma3bobobobobobobmbmbobmbmbmbmbmbDbmbDbmbmbDbDbmbDbDbobobmbmbDbmbDbDbDbmbDbmbDbmbCbmbDbDbmbDbDbDbobmbDbmbmbobmbmbobmbobobobmbmbobmbmbobobpbobpbobobmbMblbzbibibybfa8a9a9bia9a6aIa7a6aVaIbfaVaVbfaVaVbfa7aJa7bfaJbfa7a7a7a7aJa9bkbCbDbDbDbmbDbDbDbDbDbDbobobDbDbobDbobDbNboboblblblboboboboboboa3bobpbobobobobNbobpbqbobqbobobobNbobobobobobobobobobobobmbDbmbmbobobobobobmbmbDbobDbobDbmbmbmbDbmbDbDbobobobobobobobobmbpbobobobobobobNbpbobpbobobobabNbmbNbmbobpbobobobobobmbmbmbobmbobobDbobobMbobDbMbNbobDbDbDbobobobmbobobpbmbobobmbmbpbmbabpbmbabobobpbmbMbabobabMbabMbMb.bMblblblbMbmbmbobMbobMbmbmbmbm", "bmbmbmbmbmbmbmbmbmbmbmbmbmbmbobmbobobobobmbobobobobmbobobmbmbobmbobobmbmbobmbmboboboboa3bobobobobobobmbmbmbobmbobmbobobDbobobobDbobmbDbDbobobDbobDbobDbDbmbobobDbobDbDbmbDbmbDbDbDbmbDbDbmbDbDbMbDbDbobmbDbmbmbobmbmbDbDbmbDbmbobobmbobobobmbobmbobobmbobmbmblbMbzbiaVaVa7aVa9a9a9aVaVaUaVaIaVbfaVaVbgbgaVbfbfaVbfa7a7a7bfa7a7aJa7aUa7a8bkbmbMbmbDbobCbDbmbDbobDbDbDbobobobDbFbobmbobmblb#b.bmboa3bmbobmbmbobobobobobobobobobobobobobNbpbobobobobobobobobobobobobobmbmbmbobobDbobmbmbmbmbmbmbmbDbmbmbmbDbmbDbmbCbmbmbobmbmbobobobobobobobobobobmbobobobpbobpbobmbobmbabpbmbobababobmbobobobobmbmbobobobobobobobobmbCbobobDbMbMbDbDbobobobmbNbpbmbobMbobNbMbpbMbpbMbMbmbmbabMbMbmbaa0a0bza0bzblbmbmbmbMbmbmblbmbMbMbMbm", "bmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbmbobDbmbDbobmbmbmbmbmbmbobmbmbobobmbDbobDbobobobobobobobobobmbobmbobobobobobobobobmbobobobobobDbobobobobobDbobobobobobobmbDbmbDbDbmbDbmbmbCbmbDbmbDbmbmbDbDbCbobobDbMbMbobmbmbDbMbDbmbDbDbobCbobCbobobobmbmbmbmbMbablb#bia9aIa7a7aUaVbia9aVaVa6a7aIaIaVaVaVaVa6bfaIa7a6aIaVa7a7a7a7a7a7a7a7a7aIaVb#bMbDbobDbDbDbDbDbFbDbDbDbobDbmbDbDbDbmbDbDbmbmb#bzaZb#bmblbmbmblblbmbmbmbmbmbobobobobobobobobobpbmbma3bpbpbobobpbNbobpbobmbmbobobmbobobmblblbmbMbmblbDbmbmbBbDbmbCbmbDbMbmbobmbobMbobobobabmbobobpbmbobobobobNbabNbobmbobabmbmbobobmbmbmbpbmbmbpbmbobobobmbmbobmbobobobmbmbDbDbDbDbobMbDbDbobobmbobobmbobabmbMbobabmbabMa0bMa0bhaW#6amamaaanbzb.bMbmbmbmbmbmbobmbobmbMbmbmbM", "a1blblblbmblblbBbmbmbmbmbCbmbDbDbmbmbDbDbmbDbDbmbMbmbmbDbobDbmbmbmbmbmbmbmbmbmbobmbmbmbmbobmbmbmbmbobobobobobobobobmbobobobmbmbobobobobmbDbmbmbmbDbDbDbDbmbmbDbmbobobmbmbmbmbmbobobDbobDbmbmbmbmbMbmbDbDbDbDbmbmbmblblbDbDbmbMbDbMbmbobobmbMbmbMbobMblblbzbMbiaVaVaUaHaVa9a9aZaVaVaVaXa7aIaVaIaVaVaIa7aUaIa7a7aIaUaTaUa7aJa7a5aUaUaUaUaXa9bMbmbmbCbCbmbmbDbmbmbDbmbDbDbDbDbMbmbDbMbMb#b#b#aZaVayb#bzb#bzblbmblblblbmbmboblbmbmbabmbobobmbmbpblbmblbabobmbmboboblblbablblblbmboblb#bmb#b#bobDblblbMbmblblbmbMbMblbMbMbmbDbobobMbobMbobmbobobobobmbobmbmbmbmbmbmbmbobMbabmbaboblbablbmbababmbmbobpbmbobobmbmbobmbmbmbmbmbobmbobDbobMbMbobMbmbobmbobobobmbmbmbMbMbabMbhbhan#H#H#u#j#e#9anbzblblbMbabMbMbobmbMbabobmbMbMbm", "blbmbBbmbBbmbmbma1bmbBbmbmbCbmbobMbDbobobMbobmbmbmbmbmbmbmbobmbmbobmbmbmbDbmbmbDbmbmbobobmbobmbmbmbmbDbobDbobobobobobmbmbobobobobobobobmbobobobDbobobobmbDbmbmbmbobmbDbDbmbmbmbDbobobmbmbmbDbmbmbmbobMbDbmbDbDbmbDbmbmbmbobEbDbDbDbmbCbmbDbmbmbobMblblbzaZbzaVaVaVa7awa8aVaVaVaVaIa7aIaIa6aVaIbfaIaIaIaIavavavaUaTalaHaUa7aUava7aUaUaSaVa9bMbmbDbmbobDbDbDbmbobMbDbmbDbmbDbmbobMbmbma1bMbzbiaKaKaoaZbkb#b#b#bablbmblblblbobobmbmbmbobobabmboblboblbobobabmbobpbmbaboblblblb.boa3b#bmb#aZblbmblb#blbMa1bMbMa1a1bMb#a1bmbmbCbDbmbobobobMbobobmbmbobobobobmbobmbmbabmb.bmbmbobmbMbablbobababobabpbobpbobobobmbobmbmbmbmbobobDbobmbobDbobDbobmbobmbMbobMbmbmbMbab.aWaLaxak#G.9#k.8.8#tataKbMblbabmbabobabmbmbmbmbMbmbmbmbm", "bmbmbmbmbmbmbmblbmblbmbmbDbCbmbmbmbmbmbmbmbmbmbDbmbCbmbCbmbDbmbDbmbmbmbDbmbmbmbmbDbobmbmbmbmbobDbobobDbDbobmbobmbobmbmbobobobobobobobobmbobobobobobmbobobobmbmbobmbmbobmbmbobobDa3bmbobDbobobobmbDbobobmbmbDbobobobDbobDbDbmbDbDbobMbDbMbDbmbobMblbMbza9aVbgbfaIa7a7aVa9aVa8aVbfa7a7aIa7aIbfa7aVbfaVaVaVbfaVaIaUaIavaSaUaUaUaUaIaUaUaUaJaVbzbobmbobobDbDbobDbobDbobobDbDbobDbDbmbmblbMaValag#s#k#k#j#h#J#Jaya9aZb#bzblbMbmblblblbmbobmblbabmblb.bmbmbpbobabmbobabmbablblblb.blbob.blb.b.bhaZblb.blblb#blb#b#b#b#bMa1bMbMbmbmbobmbobobmbobMbDbobmbobobobmbobmblblblbMbmbMbmbmb.bhblbabobabobabpbobababobobmbobmbobobobobobobobmbobobobobobmbFbmbmbmbMbMbzb#aZ#Q#G#E#E#E#1aIbibkbkbkbzb#bablbabmbmbmbmbobabmbobabobMbMba", "bCbDbmbmbmbmbCblbmbmbmbmbmbmbCbmbmbmbBbmbCbmbDbmbmbmbDbmbDbmbmbDbmbmbDbmbDbmbmbDbmbDbmbmbDbmbobobobobobmbmbobobobmbmbmbmbobmbobmbobobobmbobobobobobobmbobmbobobmbobobobobmbobobobobobobobobobobobobobmbmbobmbmbDbmbobDbmbmbDbobDbDbobMbDbMbmbMblbMbzbkbgaVaXaJaUaUaXa8bya9a8bfaIa7a7bfa7aVaXa7aVaVaVa6a7aIa6aUavaUaHalalaUava6a7aTaHaTaIbfb#bobobobobobFbobFbNbDbobobobobDbobDbMbBbkb#aVaVbfatag#F#f.Y.R.8.3avaKa9aZbzbzbmblblblblbmblblblbobhaZblbobmbabmbmbmbmbabmblb.blb.b.blbhaYaZb.azaZblb.b#b.b#b#blaOblb.b#b#b#bmbmbDbmbmbMbDbDbobobobMbobmbmbobMbobmbMbabMb.bMbablbMbhblb.bmbababmbobpbmbobobpbNbobmbabobobobobobobmbobmbmbDbMbMbobmbMbmbMbzbMbiaKaa#e#f#eagalaVbBbkaZbiaZaZb#blblbabababmbabmbmbmbabMbobabMbo", "bDbmbmbmbmbCbmbmbmbCbmbCbmbmbmbmbma1bmblbmbmbmbmbCbCbmbmbDbmbMbmbDbDbmbDbmbDbmbDbmbmbEbmbmbDbDbmbmbmbmbmbmbmbmbDbmbmbmbobmbobmbobobobobpboboboboboa3bobobobobobobobobmbmbobmbobmbobobobobobobobobobobobobmbobmbobmbmbDbDbmbobDbmbDbDbobmbmbmblbMbBbkaVa7a7a7aUawaUa8bya9a8bgaXa7aJaJbfa7aIbfaIbfbfbfaIava7a7aTaUataUaHaTa7a7avaUaUaUava7aVbibobobobobobobobobobobobobDbobobDbDbmbMb#a9a9bkbBbka9aVaD#Y.L.C.F#g#1anaZbkaVbBbmbla1bMblblblblbmb#bib.blbpbobmbMbabmbmblb.bhb.b.bhaYaxaxaKblaKaKb#b.b#aZaZb#b#b#b#bzaZaZbibMblbMbmbMbmbobMbmbobMbobmbmbCbobmbobMbmblbzbzblbMbMblb.b.b.a0bMbMbmbabobabmbmbpbpbmbpbobobobpbmbobobobmbmbmbmbobobmbmbmbDbMaZaZan#H#v.9#ZalbibkbkbkaZb#biaZb#b#bobabmbmbobabmbababobMbabobMbabM", "bCbmbCbmbBbmbmbmbmbCbmbCbmblbmbmbmblbmblbmblbmbMbDbDbmbmblbCbCbmbmbDbmbDbDbmbmbDbCbDbmbDbDbDbMbDbmbDbobobDbobmbDbmbmbmbobmbmbmbmbobobmbobobobmbmbobobobobmbpbpbobpbpboboa3bobobobobobobobobmbobobpa3boa3bmbobobobDbDbobDbobDbobMbDbDbNbmblbBblbka9bfawbea7a7aUa7bgbAa9a8a8bfbfaXbfbfaVaVbfaVbfaVbgbya8aXbfa7a6a7a7aHaHavaHataUavaUaTavbfaVbibobobobobmbobobobobDbobobobobobDbDbMbkbka9b#a9a9a8aZa9bkbBbLbvaR#e.R.9#g#1akaIaYb#aZaVb#a1aZbib#aZaZaKblblbmbmbzaZb#bhbib.aKbhaZaI#2#y#1#1acanacaxaZaYaxanaxaIacaYaKaIanaIaYaZaZblb.blbMbCbmbmbmbmbMblbmbmbmbMblblb#aYaYaYbzb#bhaYb.bzbza0blbMbobabobabobpbpbmbpbpbmbpbpbobobobobmbmbabmbobmboblaZbiac#P#y.9#sasbCbBb#ayaybkaZaVaya9a9aZb#babmbmbmbpbMbMbpbobmbpblbmbabobM", "blbma1bmbmbmbBblbla1bla1blbCblbDbmbmbCbEbmbDbma1bmbmbCbCbma1bmbCbmbmbCblbCbmbmbmbmbmbCbmbmbmbDbmbmbobMbmbmblbmbMbobobmbmbmbobmbobmbmbmbmbmbmbmbobmbobmbmbmbmbmbma3bmbobobmboa3bobmbobobobmbmbobmbobobobmbobmbmbobobDbmbmbDbobmbmbMbDbMbMbBbMbAa9bfawa5a4awbuawaJbAa9bjbfa7aXaJa7bebfaJaJaJa7bfaXaXaVaIaIaVbfaJaUavaUaHaHaTaHaHaUaHaUaUa7aVaVblbobmbmbobobobobobobobobobmbobmbMbka9a9a9aJaVayaca8aZaZbkb#bkbkbwaD#F#g#j#w.3#RbgavalaZaVb#aVaYaZa9aKaKaYbMblaZbiaZaZaxaKaxaIaVak#1#w#w#g#P#P#w#Pakac#3ak#1#P#wavav#3#1#1acanbibibibibMbmbmbDbMbla1blblbMblblaZbiaZ#1aIakaVanacaKaKaYbhbzblb.babMbMbababMbMbmbmbmbmbmbabmbpbMbabablbmblbabmbMbhaV#5#1#j#r#0aVbBbkb#aZa9aZb#a9aZaZaVazaZaZblbabmbmbmbobpbMbabmbmbabmbmbabm", "bmblbmbmblbma1bmbla1bmblbmblbmbmbmbmbmbmbmbmbmbmbmbmbCbmbmbmbCbmbCbmbCbmbmbCbmbmbmbCbmbmbmbDbDbmbCbCbmbmbDbmbmbmbCbmbCbmbmbmbDbmbDbDbmbobobobmbmbobobmbmbobobobmbobobobma3a3bobobobobobobabobobobobobobobobobmbmbobobDbDbobobmbDbobmblblbBa9bfa7a7a5aUaSa5awa8bka9bgaXbuaJa7aJaJa7aXaXaVbfaVbfaVbfbfaIaIa7aUaUaUaUaHaHaUaHaHaHaTaUaUaUaJaUaVblbobobobmbobobobobNbobobNbobmbobmbza9acavaIaIaIavaIaJaya9aya9b#aqbmbCbBa9#Z#t#k#g.3#g#D#IakakalakavaIaIavaIaKaVav#3#1#P#1#1ak#P#P#g#g.9.9.M.K.L.N#x#P#g#h.9.9.N#h#h.8.R.S#g#g#J#1avaZbib.bzblb.aZaZb#bMblaZb#aVac#1#M#G#P#y#y#g#1#2avaxaKbhb#b.blbabmbmbpbababMbablbababmbabMb.bMbabMa0b.aK#2ak#h.Y.K#F#3bMbka9a9bkaZayayayaXayaVaIaIaKaVblbabmbabobabpbMbmbabobpbmbababm", "bma1bmblbmbmbma1bmblbmbmbmblblbmbmbmbmbmblblbmbmbCbDbmbCbmbCbmbmblbmbmbCbmbmbmbDbCbmbmbCbmbCbmbmbDbobEbDbCbmbCbmbmblbmbCbmbDbmbDbmbmbmbmbobmbmbobmbmbmbmbobobobobmbmbobmbmbmbobobobobobobobobmbpbmbobobobobobobobmbobmbobmbDbmboboblblbzbzbfaUaUaUaUaSaRaUaJa9bAa9aXbfaJaJa7a7aJa7a7a7a7aVa7a7a7aIaIa7aUaUaSaHaUaHataHaHaHaHaHaUaHalaUa7avaIbMbobmbmbpbpbmbpbobobpbobobmboboblb#aYaIakakak#3#P#3aIaVaya9aZa9a9b#a1bzbBa8aU#P.8.Z.M.8#D#P#P#P#g#x#3#2#1#P#1#1#1#w#g#w#gakav#w#g.8#h.9.9.S.E.K.F.R.0.N.R.N.N.D.N.R.N.F.F.R.N#h#g#Janaxbhb.b#aZacbib#b#b#aVaVacak#g.9#g#y#g#g#t#x#x#xaaanaKaYbzb.a0bMbMbma0bMbababla0a0bMa0bhbhbMb.a0bhaK#Q#y#w.Y.K#eaIbkb#a9aZa9b#bnb#b#aZaVaVaIavakaIaKbmbablbabMbmbmbabpbMbabMbabmbmba", "blblbmbma1bmbmblbmbmbla1bmbmbmblbmblbmblblbmbmbmbmblbmbmbmbDa1bmbma1bmblbmbCbmbmbmbCa1bmbmbmbCbDbmbmbmbmbDbmbmbmbmbmbmbDbmbDbDbmbobmbmbDbmbobDbmbmbmbobobobmbmbobmbmbobmbabmbobobobobobpbmbmbobmbobaboblbobobmbmbobobmbmboboblbobmbmbMa9aVbfaSaSaSaSaHaRawbgbka9bjaXa7bfbfaXaXbfaJaIaJavaUavaUa7aUa7aIaUaUaUaUataRataHaUavaUaUaUaHaHaTaUavaIblbobobmbobobobobpbobobobpbmbmblb#aZaVaxaaak#1#1#1auanacaI#5ayaybAbkb#bMbMa9bCa8#M#m.L.S.8.8.9#h.M.9#t#w#g#g#h#g#w#v.8#g#E#Raa#g.8.9#h.M.9.R.M.M.M.t.D.t.D.n.n.t.D.D.K.D.v.D.B.R.R#g#waaaxaZaZaKavaVbzaVaIanakak#x.Y.Z.9#y#g#g.9#h.9.8#O#PaFaKaZb.bhblb.bhbMbMa0bhb.bhbhbhaKaKbha0bhb.aK#2#v.9.N.L#kasbkbCbAbkayb#bkb#b#aZa9ayaVaIavavavaKbMb.blbmbabmbMbpbmbabobpbmbababm", "blbmblblbmbmbmblbmblblblbmblblblblbMbMbMa1bMbMa1bBa1blblblblblbla1blbmblbmbmbmbmbma1bCbmbmbmbCbmbmbmbmbmbmbmbmbmbmbCbmbmbmbMbmbDbmbmbmbmbmbmbDbmbmbmbobobmbmbmbmbmbmbmbobmbobmbmbobmbmbobobobmbmbmbmbabmbmbmbmbmbmbmbmbmbmbmblbmbmbMbMa6aUaUataRaDataRawaXbka9aXaVa7bea7aJa7aJaIa7aUava7avaSaSaUaUawaUaUaUaUataRaHaHaUava7avaHaHaHataHaUava7bMblbabmbabpbmbpbobpbobpbobaboblaZacak#9#P#Z#O#P#Q#P#P#1avaKaZaya9aZa9ayayaya8aZbkbfaT#f.Z.L.J.M.F.E.D.M.R.8#j.9.8.9.9#h.8.R.R.9.M.S.L.N.N.M.M.M.9.D.F.u.t.k.B.t.t.B.t.t.t.t.k.t.t.F.t.O.U#x#A#w#g#1ak#g.9.Z.R.M.H.K.F.N.Z#h.O.M.t.F.M.9.R#h#yakaFaxaKaKaK#2#1#H#x#v#h#h.9.9.9#h#x#G#E.8.R.M.Y#eavbkbMaZaVacaJaIaVaVaVaVaIavavavaUalaHavaxb#b.bMbabmbabMbababmbabpbababMbp", "bmbabmbla3blbabla3bmbablbma1b#blbla1b#bMa1bMbMb#b#b#bMblblblblblblblblbmblbmbmbCbmbmbmbma1bCbmbmbmbmbmbmbCbmbmbDbmbmbDbmbCbmbDbMbmbmbmbmbDbmbmbDbmbmbmbmblbmbmbmbmbmbmbobobmbmblbobobmbmbobababmbabablbabmbabablbablblbmbmbmblbmblblbiaUaRataRasbcaRajaUa9a9a8bgaJaJaXa7aJaUaXa7awaUavaHawavaHaSaUaUa7a7aUaHaRaHaRaHataUaHaHaRaHaHataHaHaUaIb#blbMbmbpbobabmbpbobabobpbobob.bzaIak#1ai#P#1#1#G#PakanavaVaVaVayaZaqaZa9a8aZaZa9bkbAag.8.M.L.M.L.J.D.L.H.M.Z.M.R.R.Z.9.R.E.F.R.K.R.E.G.N.N.N.M.8.K.E.u.t.k.t.k.t.t.B.t.t.D.t.t.t.D.t.K.L.9.9.9.R#h#x.N.M.D.F.u.D.F.N.E.E#x.N.E.k.D.D.9.9.8#g#w#P#1aaak#P#w#h.9.R.S#e.M.N.K.M.M.9#E.9.R.R.M.Y#Mblbmb#aVa9aJaVaKaVaVaVavavavatajauasakavaIb#blblbMbmbmbababobabmbMbpbMbabm", "blblbmbmbla3a1bablblbmbablbMb#b#aZaZb#aZb#b#aZb#b#b#b#bla1blbla1bMbMa1blbCbmbla1bBbBbma1blblbBbla1bmblblbma1a1bmbmbma1bDbobmbDboa1bmbCbmbmbCbmblbmbDbmbmboblbmbmboboblblbmbmbmbmblbobobmbmboblbmbmbzblblbmbmblbmbMblblbMblbMblblblbkbiaHatasatasasaHaRaXa9a9aXaJa7aJbfaUawa7aIaUavalaHalaUaUaUalaHaHavaUaUaSatataHaSalaHaHatataHaUataHatalaJb#blbobmbmbobobmbmbobobmbobmboa0aKaF#Pag#P#Z#O#G#g#P#1ak#4ac#4acayaYaZaKacacaIayaya8b#a9aR#f.M.Z.M.H.u.H.E.H.H.M.M.Z.R.M.M.E.E.u.D.F.H.M.N.t.D.N.P.E.E.l.k.t.t.t.k.t.k.t.t.n.t.n.n.D.n.t.n.D.D.D.D.H.F.D.D.u.t.t.D.M.E.u.M.O.N.t.k.u.E.R.R#j.R.Z.8#g#g#h.9.9.M.R.J.K.M.K.E.J.H.M#k.8.8.N.R#lata9aYaVaZaYaIaIaVaVayaZaZaJavavalaja.akatakaxbiblblbabMbabmbmbmbMbmbabobababm", "blbmbmbla3bmbla1aObablblb#b#b#aZaVaVa6a7aIaIaIa6aVaVaIaVaVa9bibzb#b#blbla1blbmblbma1blbmblbmblblbla1blblblblbCbmbmbmbCbmbmbMbMbDbmblbmbmbmblbla1blbmbmblbDbmbCblbmbCbmblblbmbmbmblblbmbmbmblblblblblb.b#blblbablblblblb.bMblblb.biaVbfatarasarasasatala9biaVbfaVa7awaUaUaUavajatasalaUaVa7aJaRalaHaHaDaRajaSaUaUaUaUaUataHatasasaragasaHavaUaZb#bmbMbpbobobobmbabobmbababmbaaKanak#M#v#M#E#h#h#D#g#x#P#4axaxaZazaVaKacavaKaKaVaKaVa9b#aJ#P#s.Z.Z.E.u.u.H.H.E.H.H.H.L.M.M.H.H.t.u.k.u.M.D.D.M.o.H.F.D.u.d.l.D.t.t.t.k.j.n.k.j.t.j.h.t.B.t.k.t.k.k.t.D.t.k.k.l.u.N.S.H.M.D.D.t.B.t.J.R.M.M.Y.M.R.Y.R.M.L.E.K.J.J.D.L.J.D.D.M.R.R.N.K#j#MaVa1aVayaVaoayaVaVaYa9aZaZaZav#5avavatalal#1#Pajb#blblblbabMbmbmbMbobmbmbabpbpbM", "bmbmbmbmblbmbobma3bmblblaOblbiaYaVavaUa6ava7a7ava7a7aIavbfaVaVaYa9b#b#b#b#blbmblblblblblbmblblblblblbla1blblblbmbBbla1bmblblbmbDbmblbCbla1bmbmbmblblbmbmbmbCbmblblbmblbMbBblbmbmbmblbMbmblblblb.blblb#b#b#blbMbMb.bzb.b#b#blb.aVbia7aUasasagasasasala7byaVaVaVa7aJaUalaHavatasatataUaIavbfaUalawavavavaUalaSaHaHavavaHataRatasasatasasaHaHaJaVb#bMbabmbmbobmbmbNbmbabmbaboblaa#1#P#D#D#w#D#j#m.9#t#x#1ananaxaZaYaxaxaVaKacaIaKaKaIaZaZbkbgaj#j.9.M.u.E.E.E.C.J.E.J.E.H.M.M.M.t.u.k.E.G.E.o.N.E.E.E.u.k.u.k.u.t.t.k.t.t.k.k.k.t.k.k.k.j.k.s.k.k.k.k.D.D.k.k.k.t.H.w.N.M.u.t.t.D.D.F.N.M.M.M.M.M.M.M.E.D.B.t.E.D.J.D.J.E.u.K.N.Y.N.KaiaIa1ayaYaZaKaVaIaIacaKayaZa9aZaIavavajaj#1akasasalbkblblbmbmbmbmbmbobmbmbMbpbMbMbo", "bmbmbmbmbabmbmbmblblblb.blb#aVa7aUaTavaVaVaVaVaVaVaVa9aVaVaXaVbfaIaIaVaVaVa9bMa1blblbablblaOb.blblblblblblbmblbla1blbmblblb#blbmbmblbmbla1blblblbmblblblbCblbMbMa1b#b#bkaZb#bmblbMb#bMblbMb#bzaZbibzbzbibibzbzbiaYbibibia9bibiaVa7aHatasag#7bcasataVbzaVaIaIaIa7aIaUaHatat#1atavaUaIaIaIaIaUaTalaHatasasatataHaHatajatatataDatatbdasasajaHaUaXaZbzbmbmbmbmbobmbobobmbmbMblbh#Q#P#M#E#G#g#E#v.9#t#v#E#w#G#xakakananaVaYaKaKaVaVacacacayaZa9biak#D#e.L.H.E.E.E.J.E.E.J.E.E.H.E.E.u.l.u.G.t.t.D.u.E.M.l.h.k.h.t.D.t.k.t.k.k.h.h.t.t.j.k.k.k.n.k.g.k.t.t.t.k.t.D.D.D.D.H.N.t.k.t.K.t.J.L.M.L.N.N.J.K.D.u.B.K.t.D.u.D.D.u.E.K.D.K#f#7ata1ayaKaxaIaKaxaxanavaxanaxacaxacaIavavalavakas#1a.avbMblblbmbMbobMbabMbobMbMbNbMbabM", "bmbmbmblblblblblbablblb.b#aZa7aIavaIaVaVaVa8aVa9aVaVbia9aVa9aVa9aVaIa7a7aIaIa9aZb#b#b#blblblb.b.b.blaObabmblblblblbmblblblblblblbla1blblblbla1bMblblbMblbmbBb#bMbMb#a9bkb#aZblbBblb#bkbBbkb#bza9aVa9a9aVaVaVbiaVa8aVaVaVaVbfaVaUa7atasaBagaQasasaRa9bkaVaUaJaIaIaIakataiasatalavavaUavaIaUavatas#9#7#9asasasasasa.ataHatatatatasaiasasasakavaIa9b#blblbmbmbmbobobmbobmbla0bh#1#M#G#M#D#D#E#s#j#v.8#t#g#y#1akaaavaKaZaZaKaKaxanaIan#5akaVacaVaVaI#G.7.M.E.E.D.E.E.J.E.E.E.J.H.E.t.k.t.D.k.k.u.u.H.M.t.l.h.h.l.D.t.k.k.j.j.h.h.k.k.k.k.k.k.t.n.g.s.n.j.k.k.s.D.D.t.D.t.F.k.t.t.t.C.E.L.K.K.K.K.D.u.t.t.D.E.t.B.B.t.J.J.t.K.J.J#GavaVayaIalaxavanavanaKaYacaKacaxanax#2akanaHalalak#PakavbMblbmbmbmbmbobMbmbMbmbabMbpboba", "blblbmbmblblbmblblblblblb.biaIaUaIaVaVaVaIaVaVaVaVayaVaVbibibia9a9aXa7a7a7aJaVaVaZaZb#b#blblblb.blblblblblbaaOaOblblblbla3bla3blblblbmbla1blbMblblbMb#bMblb#b#bBblb#aVb#a9aYbMbMbMb#bkbkb#bkbBbiaVaVa9aTa7aVbya8aVbfaIaIa7aIaTaUaHatasagag#7agaDaUa9aYaVaJaIaJa7aIatakataFaHava6aIaIaIaIaHalasagagai#7agasatatatataHaUaUaHaHasasasasasatataHaIaVb#blbMbmbmbmbmbmbmbobobmbMbi#1#E#M#P#g#D#D#v#t#v#m#m#g#1akanaIaKaoaYaZaZaxanakaaanana6#RavaoaZa9at#k#f.M.E.D.E.E.u.u.u.C.E.M.E.l.t.t.t.h.k.k.E.M.G.E.k.k.h.k.D.t.k.k.k.k.k.c.k.j.h.t.k.g.t.k.k.n.t.k.j.j.t.D.D.K.F.t.t.k.k.t.J.D.B.K.J.J.K.D.C.t.u.t.C.t.t.t.k.t.D.H.K.K.L.YavaZaZaxaVaVaVaKananaxaYaVb#bibianakakanavanakalavat#1ala6b#bmbMbmbmbmbmbmbmbmbMbMbmbmbobM", "blblblblblbmblbma1blblbMbiaVa7ava7aIavaIaIaIaVaIaVaIaVaVaVa9aVaVaVaVaVaXaIaVaIaVaIacaVaYaZbzb#aZb#b.b#blb.blb#b.blblaOb.blblblbla1blblb#b#blb.b#b#b#b#aZb#b#b#a9b#b#aZaVbyaXa9bka9a9a8aXa8a9a9aVa7aJa7aIaUava7aUaHaHajajaHalaUataDagagagafafataHaJa9aVaIavaIavaHakatakasakataFalavatakakaUatataHaUaUaUaIa7avalatajajavakasaiasatas#1asa.aRataHaIbkbmbmbmbmbobmbobmbMbobmbla9a.#P#1#Z#E#g#D#k#j#k.8#g#g#O#P#2anaKaZaZaKaKaKaoaKaYaKaKaYacavaIacavaZaw#D.M.H.E.M.E.u.E.t.J.E.J.E.D.l.l.l.l.u.E.E.o.F.D.k.l.h.l.M.R.M.t.t.h.c.c.k.j.h.k.k.k.k.c.t.N.S.F.t.k.t.N.D.K.S.D.t.k.t.K.K.t.J.L.N.K.K.K.u.B.l.l.B.l.B.D.t.u.t.K.L#s#1aIayawayaxal#1#P#PaaaxaxabaI#4#2#4aZaYaIa6axaVaYaKacaIaIalaIb#blblbmbmbMbmblbMbobMbMbobMbmbM", "bmbla1a1bmbla3bmblblblb#aZaVaIaIaIaIavaIaIaIaVaVa7aJaIaJaVaVaVaXaVaIaJaVaVaXaVaXaVaIaVaVaVaYaVaZaYbibhaZb.b#b#blb.blb.aOb#baaOblb#blblb.b#b.b.b#b.b#b#aYbkaZa9bia9a9bkbfaVbfaVaVa9aXaVaJa7aVbfaVa7aUaJaUaUaUaUaUaUataRatatataSatas#7ag#7af#7aRaJaVaVaVaUava7aUaHatas#1#1atalalaFalakakavaHalalavaTaIaIa6avatatakakajaHatasas#1as#PagagatasasatavbibDbDbmbmbmbmbobCbobDbmbMa9ak#P#P#M#g#E#t.8#k.9#f#t#D#Z#1aaaYaYaYax#4aZaZbhaYaKaxaxaxaFakanaVbiabbkav#e.Z.Z.o.u.E.u.E.u.J.E.E.u.l.c.l.u.t.u.D.t.E.t.l.h.h.c.H.G.N.D.i.k.g.c.k.k.h.k.k.j.h.b.t.N.S.D.t.k.D.D.D.F.F.N.t.k.D.t.K.K.E.L.D.K.C.B.t.u.B.t.B.B.C.B.t.t.t.J.7akaVbkaIayaVak#1akavakavaxaKaKaoaIaTaTaxaxanaF#2aFanavaxaIavalaxbMblbmblbmbmbmblbmbmbMbmbMbmbmbm", "bma1blblbmblbla1blblblbkaKaIaIa7avaIaIaVaIaJaIawa7aIavaJaIaXaXaVaVaVaXaIaVaVaVaVaVaVbfaVaVbfaIaVaVaVa6aYbzbibibhb#b.blb.b.blblblblb.blbzb.aZb.bzb.aZbzaVaKaVa7bfaVaVa7avaUaJaIa7aIa7aIaUavaUaUaUaUaHaSataUaUaSaUaUasasasasasatasas#7ag#Z#7agavaXa9aXaVaUavaUatakaHatakakakaHaTaTaUaTavaIaFavanaTak#QaTana6avauaias#9#9aiag#9akakalalatatatasasataVbMbMbDbmbmbmbobDbmbmbmbMaV#1ag#Z#Y#w#g#E#t#f#j#k#m#Gakakavaa#2akaxaxanaxaxaxaxaxaxaxaxavaaaxaVaZaxbiaV#P#l.M.H.F.C.E.E.H.L.D.E.t.l.u.l.k.h.i.u.t.u.t.t.k.c.k.t.o.u.t.d.h.#.t.n.k.t.k.k.h.c.B.t.D.t.k.t.k.D.J.F.H.F.D.s.D.K.B.B.E.J.D.C.t.C.B.u.B.K.D.D.E.H.L.J.Y#PaIa9aIaVaIav#3avaIavalanavaIacaKaKanai#9au#2#2axaxanaFak#2akakalaVblbmbmbmbmbmbmblbmbMbDbMbmbMbmbM", "blblbla1bmbla1blbla1bMb#aIaIaUaIavaIaIaIaIaIaIavaIaJaIaIaIaIaVaIaVaVaVaVaXaIaIaVaXbfaVbgaVaVaXa6aVaIa7a6aYaVaVaYbibzb.bzb.b.b.blb.b#b.b.bibib.bzbibibiaIa7a6aTava7aJaTaHawaUaUaUaUa7aUaHaSalavaUaUalaSaHaSaHaHaSalasag#7agagasasar#7#Z#7#Zasawbfa8a7aIavaUaHasataHakataUaTavaTavavavavavaIanauakaias#1at#1as#Z#Magas#1ala6aTaTaxaIaTalasasaragata6blbmbmbCbobobobCbmbMbMbla7#M#Z#P#y#Y#M#F#v#j#k.8#v#Z#1#1#1#2#1#2ax#2aKaxabaoaKaxacaFaxanaFakaaaxaIavbzaVal#f.M.J.J.E.D.E.D.E.t.u.d.t.d.c.h.k.t.u.D.u.t.k.g.h.t.H.t.k.k.b.c.k.t.k.t.j.j.h.k.E.E.F.n.k.B.n.N.E.9.0.n.t.k.D.K.B.B.K.B.C.K.t.B.B.t.C.K.E.E.E.M.J.7#Mbia9avaIaVakaKanakakaxaVaIaxaVaxaKaVbiac#4#QakakaFanakak#1akaFaFaFaVblbmbmbmbmbmbmbmbDbDbMbmbobmbmbo", "bla1bMblbma1bMblblb#b#a9aVaIa7avaUaIaUaJaIaIaIaIa7a7aIaJaVaJaJaVaIa7aVaVaVaXaJaVaIaIaVaVaVa9aVaXaIa6aUaUa7aVaVaVaKbhbiaZb#b.b.bzb.b.bzbzaZbibhbibibia9aVaUavaUaHaUaHaUatalaUaUaUaUava7aUaSaHaSaUaHaSavaSaHatajaSaHasarag#7agasagag#7#7#7agaDaXaXaXaVaJawatakasakakatakavavaTavaTavavaTakaFak#1ag#Zag#1#Pag#PaiaiakavaIaYbiaZaKaVaVavaHasagagagasavbzbMbmbobmbobCbmbCbmbmbBaI#Y#P#1#0#M#M#g#v#v#t#k#G#M#Z#y#y#1#2anak#1aYaKaKaKaKacaxaxaxanak#P#P#Q#5#RaKaZbz#s.7.J.M.M.u.u.t.t.t.t.k.t.c.c.l.h.l.t.t.D.t.k.h.k.t.D.D.k.h.c.c.k.j.k.n.k.h.h.k.M.N.N.t.k.t.K.N.J.9.9.t.j.k.n.D.K.t.C.t.B.J.t.B.K.t.B.E.B.Y.Y#f#l#PaIb#aV#5akak#P#1alaxavavavaZaZbiaVaVaYaKaKa6#M#M#O#1akavaFakalanavavaVblbobmbMbobmbMbmbMbDbMbMbDbMbmbD", "bmbBa1blblbCa1a1blbMbkaVaJaJa7aJaJaXaUaUaUa7a7aJavaIaJa7aJa7aXaXbfaJbfaXaJaIaVaVaJaJaVaVaXaVaVaVaXa9aVaJawaUaHataUaIa7aKbiaZaZbibzaZaZbiaYbiaVaVaVaVaIa7avaUaHataHatatatataUaUaUaSaUavaUaHaRaRalatalataUajasasataUatasagaCagagasagag#7agarajaXaVaXa9bfaJat#0aDajaRavaUataDa.agas#1avavavalaHakavaIaKa9aZbiaZaKac#2akaIbkb#b#aZaZaKaxaVavaIaIalataHaVbMbobmbmbMbmbmbDbDbkaZaK#1#P#w#g#P#F#g#v#G#M#E#t#v#g#s#g#5av#RaKaxazabaKazaKaoabaxaKaKaYavax#PaF#yavaZb#biaI#Z.R.M.H.E.E.E.F.F.i.l.l.d.l.h.d.l.F.D.m.l.d.c.h.i.u.G.l.c.h.h.b.h.c.j.k.h.h.D.D.F.i.k.D.K.N#h.F.k.j.k.k.s.t.D.F.t.u.K.K.J.C.u.B.t.J.J#s#0ajb#b#ayaca.#Y#Iaja9aIayb#aZayaZacaYb#b#aKavaIaxaxaVaKaxaIaIakakak#1alanaIbibmbmbmbmbmbobmbMbMbobmbmbmbMbMbm", "a1blblbmblbmbMbla1a1bMaVaXaVaIa7aIa7aUa7awaJawaJaJaXaIaIaJaIaJaVaJaVaXa7aVaJa7aXa7aJaVaVaXaVaVa8a9a9a9aVaVaVavaUaHaUaIa6aKaYbiaYbiaYbiaVaVaVaVaIa7a7aIava7aHaHajaHatatatatalaUavajaUaUawaUaUalaSalaHatawaSatatataUatasafag#7agasarag#7afasalaXa8a8aVaJaIaRagatalalajatas#Pasas#PasakatakatavaVaVbiaKaY#4#2#2auauaVaZaYaLama#anakakakatalaVbibyaIa6aYb#bmbmbmbmbCbmbDbMbla9ak#P#Z#g#g#D#M#F#g#E#F#D.8#s#s#g#PaK#5aaaxaoaZaZaoaxabaKaZaZaxacaKanalak#Pav#1#1anb#aZaK#t.M.D.D.t.E.o.D.l.d.d.l.d.k.k.h.D.D.o.d.c.c.h.t.t.G.u.h.h.h.h.b.h.d.d.c.k.t.F.D.k.k.D.H.N#h.N.t.b.k.t.s.k.k.t.k.t.t.B.t.B.B.k.B.J.LakaIaZbBaZan#P#yaxaVav#1akakaIayaZb#aZaZbkaZaZaVaKaVaxananavalaFalakat#PakakavaVbMbmbabmbmbmbmbmbmbDbMbmbmbDbmbM", "bla1bla1bCblblbBblbBb#aVaXaVaXaJa7aIaUa7aJa7a7aIaJaJa7a7aJa7a7aJaIaJbfaIaJa7aJaVaJaIaVaVaVaXaVaXayaVaVbgaVa8bfaIaUakaHava7a6aVaVaVaIaVaIa6aUa7avaUaUaUaHaUaHaHataUatasaHalaHavaUaHaUaIaUaUaUaUalaHataRaUaRatasaRaHaSataf#7afagaragagaBagaga5aXaVa8bfawaUa.aga.aHaj#Pag#Zagag#Z#MaiasasatavavalaFanan#PasataFaxayah#9#G#7#1#3avalaFavaIaTavaIavataRaVbiblblbmbMbobmbDbMbkbiak#1#P#P#P#M#Z#G#D#D#v#k#t#k#t#y#1#w#g#wakaYaZanavacaYaZaZaYaYaxaaaaaKaFan#1anaI#1ayb#bM#y#f.F.K.E.t.t.t.h.h.l.h.c.k.d.h.t.t.o.u.c.h.k.t.u.o.t.l.h.h.g.h.h.k.k.k.k.D.F.D.k.k.K.M.S.S.D.t.b.t.n.k.B.s.k.s.s.k.B.K.t.t.B.B.R#vaKb#blavak#3#Pakak#P#G#1al#R#RavacaIaKaKayaVaKaIaF#3#1#1#1ak#1akakakakakatakavbzblblbmbmbobMbmbmbMbobmbMbDbmbmbm", "bmbmblblblbBblblblb#bkaVaJaJbfaJa7awaUawa7aJaIaJaUa7avawaIa7a7aXaIaJbfa7aJaXaIaJaVaIaUaJaIbfaVaXaVaIa7aVaVaVbgaVbga7avaHataSaHawaHaHaHaUavataHaHatatataHaHataHataUatasataHakaHalaUaUaTaUaTaUaUaUaUatasatataUaHatatajaDasaBagagarag#9aB#ZasaUaIaXaVbgaIaRagasasavatasai#M#M#Masasas#1asasakak#P#P#1aV#6aaai#8#O#O#Gah#PaiaiauatakaHa6aVaVaKaVbibiaVaVaYb#blbmbabmbDbmbMbzaVaF#s#g#D#D#g#E#D#g#v#t#t#v#t#O#O#g#MakaxaKax#PanaoaZaKaKaZaYacaxanan#4#2anaZ#P#yak#H#1abb#aV.S.Y.E.t.t.t.k.t.t.k.t.D.k.g.d.l.M.E.D.k.k.v.t.t.k.h.c.g.h.g.h.k.c.c.t.N.N.F.k.B.J.V.U.k.h.g.b.c.t.t.F.t.k.s.B.j.k.B.K.n.K.L#1aKb#aZacaaak#Pakakakak#1#1acaKaYaYaZaZb#aZb#b#bzbiaKaIaxanaTavanaF#P#H#PakaHaFavbibmbobmbmbmbmbobmbmbmbMbmbMbMbmbm", "bBblbmbla1blblbBa1a1b#aXaVaJaJa7aJa7aUaUaJaUaUaJavaJa7a7aIaJava7aJaVbfa7aVa7aXa7aJaJaUa7bfaJaJaXbfbfaVa7aVa7aVaVa9bfaJaUaSatatatatatataTatatatatasatatatatataHakaHatatatatatataHalaUaUaHaHaHaUaUaHaRasaDataHaUatataRasasasaBagasasasafagasaJbfaVaXbfaJajagagasata.aias#Z#M#Z#9ag#PagasagasakaTanaHaibd#9#G#v#u#E#8#8asatavav#1asataIaKbibibibzaZa9aZa9b#blbabmbMboblblbiacal#E#M#P#G#x#g#D#E#D#v#g#v#E#g#t.8#waaanax#2aaaxaYaKanabaZb#aYabaxaa#2#Pananaxak#H#H#H#Ja1b##v.Y.J.D.D.t.n.t.t.i.t.D.k.h.k.k.S.G.F.h.j.o.D.D.k.b.b.j.k.g.t.j.b.c.d.N.F.D.k.D.J.U.9.k.d.g.b.h.n.K.N.B.k.j.n.k.s.n.B.K.J#kaZaZabao#4#1#1#PaIalakakakanaKaVaVaKaYbzaZaZb#aZb#b#aZbibiaVaIaTakak#P#9#P#M#1#1anbibmbobmbobobobmbobmbmbmbmbobmbmbm", "blbmbmbmbmbmblbCbmbMbMaVaXaVaJa7aJa7awava7awaJaIaUaJa7a7awaIa7aJa7bfaJaJa7aVaJa7aJaUaJbfaXaXaXaXa7bfaXa7aJaIaVaXaVaVbyaVbfavatatataDasatasasagagag#1asasasataHatataHauas#1asataHalaHatatataHaHaHaHatasasatatalaHaHatasagagaQarasagag#7agasaJa9aVaXbfaJasagasagaHag#Z#M#Pasagag#9agakat#1#M#Pag#1asasauatalavavaa#2#Q#2aYaYaIavakananavavavanaKaZaZb#aZb#b#blbmblbaa0blbzavak#O#g#G#E#g#v#g#D#v#D#E#F#G#g#D#Man#1#1#w#xaaanab#4aob#aoazab#4aKbhaoak#x#1#P#h#v#h#h#xaxaYaV#P#e.K.t.t.j.d.c.k.i.t.t.t.d.h.p.G.D.h.c.h.k.o.j.b.b.j.k.b.i.t.b.c.j.D.D.k.t.S.9.9.M.h.i.h.j.k.k.s.t.D.D.h.j.t.t.t.D.M#haKax#JaKaa#G#PaKaV#2#1axaxavaVabayaZaZaZaZaZaZbMaZaKanacaKaKbiaVa6avaFak#1ai#Pag#1bibzbobmbobobobmbmbabmbobmbMbmbmbmbM", "blblblbBblblbCbla1a1bkaJaVaJa7ava7aJaUaUavavavaJavavaUavaUaUaJaJawaJaIa7aJaJaIaJbfaJavaJaIa7aJavaJavaJaJaJaIaIaJaVaVa9a9a8aVaUaRaDasagasagasag#Z#Zagag#1asatalataHatajatagaTat#1aHatatasasauajaRalasataRasaDaHatatatagasasaragaragag#7#ZaraIaXaXaVaIaVa.atas#0as#Z#Z#9#Z#Z#Mag#Z#Pakas#Mag#M#1as#1akakatakasa.akatakavacaIanak#1at#9#P#P#O#ManaZb#ayaKaZbkblblblblblb.aVaIaF#F#w#D#E#g#g#g#h.8#v#s#E#E#t#w#H#H#x#x#x#Haaak#Qabaqaqabao#4adaq#4#4#Pak#2#2#1#x#x.9#h#2azaYak#v.J.J.D.k.h.d.k.k.l.H.D.t.k.k.v.D.g.b.#.D.n.d.c.c.h.h.c.k.k.b.b.k.D.i.b.j.D.0.O.o.b.g.k.c.k.t.J.t.B.K.k.h.t.j.B.D.Y#1bhab#1ac#M#gaKab#4avan#4abaoaoaqayaZb#b#b#b#a1b#b#aZaZaZaVaVaxaxaKaa#2#y#O#G#M#Z#1aKb#babobmbabobobobmbmbobmbmbobmbmbo", "blbmbmbmblbla1bla1bMb#aXaIaJaJa7aJavavawava7avaUavawavaUaJawaIa7aIaJa7aJa7aIaJa7aJaJa7a7aXaJa7aJawaJa7awa7aIa7aIbfaXaVa9a9a8a7a7awasasagasasagag#7agagatasataHataHaTat#1asalatatatatataiasatataHatatatatatajaHaUataRasasbcagasagagag#7#7araIaVaXbfavaVatata.agai#Zag#Pag#Pag#Pagagag#P#M#9#Zag#Pasas#1#1akataTaIanaxaKaF#P#P#Paiakak#9#Pas#1aVaZb#aYayb#b#b#blblblblblaYaIak#E#w#v#E#g.9#v.8#g#D#E#F#D#w#P#P#h#g#x#y#2aaan#4azaqazazaZaoaoao#Q#J#2#4#R#Q#Q#H#x#j#h#HanaZay#1.L.u.t.n.k.k.h.l.n.G.F.D.k.D.p.G.h.b.b.t.t.d.c.c.d.j.l.k.d.g.c.k.t.b.c.t.D.O.D.t.b.k.j.k.t.N.K.E.t.v.k.h.n.s.D.K.9anaOaa#3an#P#wak#1#1aa#4aoazaZaoaZaZaZaMaZa1aZaZa1b#aZaZaZayaKak#Rak#3#P#M#O#M#O#P#1aKbzbNbobabobpbMbobababmbobmbmbmbmbm", "blbmbmbmblbma1bmbmblblaVaVaIaIa7aIaIavavaUavalaUaHaHaHaUava7a7aIaIaVa7aJa7aIaIaJa7a7aJbfaVa7aXbfaJaJa7awaUawa7aJbfaXbfaVa8aVa9a9a9aUatagasasasar#7agagasatatatatataHal#9asasagasatatatauasagasatataHatatatatajaUatatasasaiarasagbcaragagasaIaVaXbfavaIatasa.agai#Zagagagasasagagagag#Pas#1#9ag#1asas#G#Zakalak#3#P#P#M#D#V#7#7#v#C#Oai#1aHavacaKaYaZaZb#bBbBbBblblblblaKavav#w#g#v#v#v.9#t#h#j#h#D#G#y#M#v#m#D#H#y#Pakanaoaoa1b.azab#4#4an#4aoaVaxaa#J#H#g#h.N.9.9#h#g#4aoaY#H.R.K.j.t.k.g.k.n.i.t.t.t.D.w.N.t.t.n.v.G.t.k.b.D.v.t.i.t.j.h.k.n.j.g.d.t.R.L.K.h.b.h.k.L.R.N.D.n.n.B.B.n.s.K.9acaZao#w#Q#x#Hak#P#Hakanan#6am#2#H#x#H#HakanaaakananabaKazaZb#b#b#b#b#aZaVak#1#P#M#OasbzblblbobabMbobobobababpbmbmbabobobM", "bmblbmblbmbmblbmbmblbMaVaXaIa7aIa7aIa7avaUalaHalaHavaUaUa6ava7aIa7aJaIaIaIa7aJa7avaIa7a7aVa7a7a7aXaJa7a7aJa7a7aJa7bfbfbfaXa8a9a9a9bfaUatasarasagag#7agaratatatatasaHatagakag#Maiatatauatas#9aiatauatatatatataHaUaHasasaBagagasaragaBagarasa7byaVaVavaTasasasa.as#Zasagasas#1ag#1as#Pagagas#P#1atak#1asakavaIaka.atag#9#7#M#7#7#V#tas#1alana6aIaKaYaZaZb#b#bCbCblbmblbMaVaFax#G#v#h.9#m#m.9.9.9#j#h#g#M#h#j#j#w#x#O#4#4aZazaMaNb#aqaxaoaoayaoaqaoaZ#R#J#R#1#P#j#h#e.9.9#R#2abaa#g.K.t.t.t.j.g.g.j.d.v.D.t.F.M.F.D.K.K.S.D.v.h.j.D.v.t.n.j.k.n.D.j.c.k.u#h.L.R.j.c.b.D.R.N.F.t.s.j.B.B.K.s.L#gaZanak#h#1#x#H#Q#2aKaKaxanaaan#2#2ak#2akaaaIaaaFananakaaanabaxabaxaxaxaKaKaxavak#1akakbiblbobabobpbMbpbpbMbMbpbmbmbmbobabm", "bmblblbmblbmbmblbmblbMbiaIaIaIa7avavaIavaUalaHatalaUavaIa7avaIavaIa7aIa7aJaIaIava7aUavaIa7aJaIbfaJbfaXaXbfaXa7aJaUa7aJaVaXbfa8a8a9a9bfaSatasasaragagagagatasasatasatatasatat#MagasatasasasagasasasasasasasasataTatasasagagaBatagagagagagasavaVbgaVaUava.as#Pasasagagas#1atatasas#1ajas#ZagagataHalavavaIaIaJajala6as#9#8#9#H#G#W#WaiaiauatalavaIaKaZa9b#b#bBbCblbCbBb#aT#1an#P.9#v#h#j#j.9#j#j.9#t#v.9.9#m.9#x#G#AaKabaMazb.aMaoaoazazazaqaZao#4#R#Jakaa#1#P#h.9.S.9.9#2#1#Rax#w#e.K.F.D.n.k.b.j.j.D.m.j.k.N.N.F.S.F.N.G.D.k.k.n.t.t.i.n.t.t.D.k.c.k.t#h.R.9.k.b.c.t.9.D.t.j.j.k.t.n.B.C.Z#1aV#2#A#h#M#P#P#PaaaKaKaxax#4anaaanalaaaFavaxavaxaKaKabavakaF#4aFak#2#2#H#H#P#Q#P#1asaUblbMbobobMbabpbMbMbobpbMbpbpbmbmbobM", "blbla1blblbmblblblblblaVaVaIavaUavaIaIavaTatataHaHaUavaUavavaUavavaUavaUavavawaIaIavaUa7aUaHaUalavawaUa7aJawaJaIaJa7aUa5awaJaVbfaXa9a9aJaUaRagaCagarasarasagasatasatataUata7#Z#7asatasasaragaragasasagagagasaHatat#9as#7aBagatatataiasagasaUaIbfaVaTal#1as#1atataiagagatalalasataj#P#M#E#Zagasat#P#PaualaIavakak#R#P#P#E#t#m#m#C#v#7#MagauaualavaVaZb#b#bkb#b#b#bBbkaV#1#G#P#H.9#m#m#u#u.9#j#h#m.9.S#j.9#v#g#x#Han#SabaoapaoaoaMaOazb#aZao#4#2#4#Qan#R#x#Paa#h.Y.S.Y#h#1#1#Aacax#P.B.J.D.t.t.k.g.j.n.g.c.i.m.N.E.0.S.M.S.F.h.d.n.k.k.n.t.n.t.D.u.D.F.t.S.9#h.k.#.e.N.F.k.b.c.t.t.k.n.B.C.8ayak#g#M#v#P#3#1akax#4#2#H#Q#4axaoaaax#4axaaabaWaKabanabaxaKanalaaaaakaa#1#E#t#E#G#M#PavbmblbpbobMbmbmbobpbMbMbobababobmboba", "a1bmbmbma1bla1blblblbMaZaVa7aUavaTavavavajajajaUavatavavaUaIavavaHalavavalavaIavavaUavalalalajataSaUavavaUavaUaUaUawaUaUaJaUa7aJaVbja8a9aJaUag#Z#7agasasasaragasasasaRaUaRaUagafagagasag#7asasasasbcasbcag#ZaHatataSasagagagaUatasasasagasasaIavaIaTatat#1asat#1agag#Pavatajajava.#Z#Z#Magakal#1#1#P#1akaja.as#M#M#k#t#t#t#V#t#V#V#D#MatajajavaIaVa8aZb#a9b#bnb#bBbkaV#P#M#w#G#j.9.9#g.9#j.9.9.S.9.S#e#v#h#h#z#2abaa#4aNaZazaMa1aOb.aNaoao#R#Rak#J#Q#P#w#J#R#h#g#h.S.9#H#w#AaaaZan.E.t.D.D.D.t.#.c.t.t.#.c.t.w.M.R.P.w.G.g.n.c.d.k.d.i.m.k.g.h.t.N.R.E#h.R.O.h.b.c.N.t.h.c.c.C.J.J.s.t.H#waK#J#g.8#h#x#g#1#R#1#1#1#Q#Q#4#4#4adad#R#RaxanaaacaZaVaxacaVavaaak#8#Hah#1#A#P#P#M#Da.aVblbmbMbobmbmbMbmbMbpbabMbpbabobabmbm", "blbmblblblblblbla1blblb#biaVa7aIaIaIaIavaHalatakatatalawaHalaHalaHaHavaTalakatas#1as#1atajatajaUavavaUaUavaSaUaUavalaHaHalaSaUaJa7a8aVa9a9byasataDagagasataRasasatasaRajaRaJatasagagasasagagaHaHataRatatasagata7a7aUasag#9agataHataHatagasatavaUavalatatatakakas#PasasaUavavava6ajai#Paiatat#9#Z#M#9agalatas#1#M#s#k#j#j#t#W#V#W#M#M#9asasatavaJaIaXayaZbkb#a1bBbMa9aI#M#g#t#v#j.9.9#h#w#h#m.S#e.S.N#e#u#P#4am#2#2aWaOaNa3a3aOaPaNaZaz#R#Q#Rak#R#2#Qakanan#2#g.9#h.9.9#x#g.8#PaI#5.M.K.B.D.F.n.k.t.G.G.g.k.k.0.R.F.t.k.i.k.i.k.o.m.g.d.i.j.k.D.m.k.I.w.0.G.N.k.k.h.t.D.c.h.k.C.J.J.B.B.Z#PaY#w#P.8#1#v#y#g#EaF#4ak#g#v#y#O#P#x#G#G#O#H#2ak#6#6aE#2#SaeaPaPa3biaYaV#P#y#y.8#ga7aIaVblblbmbmbmbmbmbobmbmbmbmbmbmbmbabMbo", "blbmbmbmblbmblblbablblb.biaVaIaIaIaIavavaTavakatatatatalalaHaTalaFakatasasasas#1asauatalaHataUawavavaUaUalalavavaUaUaUaUaHaUaUaJa7aVaXa9a9a9aUataDaragagaRasarasataDasaSaRaUaUaRag#7agasaCagatatatataSataDagasaHaIaUasagaBasasaHataHaHasagajaUaHaTaTatakataHatasasasakaIaUavaVavatatag#9aiai#9ah#Maiaka6av#1asag#M#D#T#V#D#V#s#V#7ag#P#1asataUaUaIaya8a9bkb#bkb#bka9aI#M#v#k#v.9#m.9#j#O#x.9#j.S#e#e#m#2axaL#oaaaob.baaPaPaNapaqaM#4#4#2#Jaaabab#1abax#2#J#P#v#g#m#e.R.9#x#g#IaKaV.R.L.B.B.D.D.J.D.K.p.j.k.t.O.R.R.u.k.m.D.t.t.n.t.g.c.k.d.k.F.D.t.D.D.F.F.G.i.t.k.H.N.h.k.D.D.L.K.B.B.8#JaVa.#P#g#g.8#D#g#Danan#3#G#G#M#w#G#G#x#O#x#h#h#xau#1#1#Q#O#G#N#Ha#aeaeaeacaIatafasaIaIaVbMb.bmbmbmbmbobMbobmbmbmbobobMbpboba", "blbmblbma1blbmblblbmblb.biaKaIava7aIaUalaUavatakatasakatauakataHakataiaiaiaiauauatauauauakaHa6avaIavaUaUalaUaUaHalalaUaUalaHawaUaJaXaVaVbfbka7aUatarasagatasarataHataRaRajaUaUaSas#7afagagarasatasaRaHaDasasagataUaUatagbc#9asatasataHatasatalaHaUaUajatatavatakasagasavaTawaVaTaHaF#Pai#1#1aFaFakaHanaIaHasat#9#M#D#k#t#V#t#V#D#M#9#M#7ag#1ajavaIaVa9aZbkbkbna9a9bfal#G#s.9#v.9#j#v#h#P#x#E#h#m.9#x#Haa#6aa#6aMa2bpaPaNapapaNaMad#Q#Kabakaxaa#2abax#4#y#w#x#x#y#x.R.9.M#g#wakaKaI.9.Y.k.B.t.N.L.D.n.v.k.t.F.M.S#h.N.u.D.m.k.h.k.D.h.g.k.j.h.o.M.D.t.d.G.F.S.F.k.c.H.P.k.E.E.J.K.L.K.B#DakaV#3#M.8.M#s#w#D#g#1#P#P#Z#y#x#x#x#H#h.2#H#x#u#E#M#G#Paaak#Qauauakanabao#6#4ananaxaKaIaVblbMbobMbmbmbDbobMbobMbmbmbobmbmbobM", "blbmblbmblbma1bmblblblblbzaVa7avaTavaHalaTalakatakaiataias#9aiasaiag#9#9ag#Zag#9asatatavaIaIaVaIaIavavavaUalaHakatalaHaSalaHatalata7avaVaIaVa9aVbfatasasaDasagasaRaRagataRa.aUajaUaf#M#7#ZasasaDaHaRajaUaRagagaratbfaUasas#9asasbcata7aUatajaUataRaUaHataHaHajatat#ZagatajaUaIavavaIaTanal#1a6#1aualaxaxaTajaT#P#9#D#G#t#t#D#W#D#M#7#W#MagasaRalavaIaJa8a9bkbkbka9a7a.#D#g#j#g#D.8#y#w#h#v.9.9#j#v#1abaqa0a0b.apapazaqax#Saa#x.9.U#H#Q#P#1#Janab#H#x#A#R#H#w#g#P#G.R#e.R#t#w#gakan.8.R.K.t.D.M.K.K.j.k.J.9.N.t.D#h.w.E.t.G.t.b.b.j.k.d.g.h.b.G#h#h.k.g.G.Y.N.t.k.k.N.K.C.J.M.J.D.L.K.L#2aIav#w.8.M#v#g#s#g#F#F#G#M#M#x.9.R.M.R#x#g#h#m#Qaxah#x#o#K#2#QazaMaZb#b.b.blb.b#aZayaxaKaVb.bMbMblbmbmbmbMbMbobMbobmbobobmbMbo", "blblbmbmblblblblblblblblbzbiaIaUaHanauaTavalakalatakasasag#9#9ag#9#9agagagaiasakauavavaIaIaIavalavavaUa7aTakalaUaHaHaHaSaHaUatatatavaUbgaVaVaZbka9aRasaRatatasataHaSasaUalaRa7aUa7ag#M#M#7asaDasaSa.asa7atasagagajbga7bcagbcasasaData7a7aSaUaUatataUalaUaUawatataT#ZasatatavaJaIaUaIaIavaT#1ax#MakaTavavavalaT#Pai#M#M#t#v#D#M#D#7#D#7asataUaJaJaJaJaIaVa9bkbkbka9awas#E#v#f#M#P#E#P#E#h#j.9#v#g#OazazaqaNapazaMaMaMaWaaan#1#x#x#H#w#h#Paaan#2#2#H#E#w#x#M#G#M#H#M#e.R.8.9#w#Zakan#j.R.t.t.D.J.B.K.v.v.M#h.N.t.t.0.F.t.D.S.F.c.#.g.k.n.d.b.b.o.P.U.j.d.w#E#j.t.v.t.K.D.K.M.9.M.K.D.K.K#RaI#5.8#h.Y.9.M#1#P#P#w#M#M#M#G#E#E#E#E#D#D#E#g#y#Haa#Q#8#QaKaZb.aqad#6aeaeaa#2#2ananacaKaZbzblblbabmbobMbmbMbobobMbobobMbpbpbo", "bmblblblblblblbBbmbMb#blaZa9aVavavatalavaUalaHavakakasas#9aBagagagag#Z#Z#Pasakat#1as#1akaHakakajalalavavavaRaTalaHajaHatajatat#1asajaUbfaIa8a9a9a9aUatarasasaDaRaRawaDaDataRawaSaJaRarafag#7asaRajaRatawaRaDaragaRaXbuasasaraCasaDaRaHaUavaRaUaUaRaHaUaJaUaUaUaRaRagagasataUaIaIaIa6aIakakavauatanaIakavava6aUalak#E#v#t#t#W#W#E#W#W#MakajajaIaIaJacaJaXa9bAbAbkbjaUa.#D#k.Z#w#P#g#g#P#v.8#t#1#5#4aaaxaMadazb#aOblaqaN#S#6#B#n.2#e#m#h#x#A#P#P#P#M#y#M#P#G#E#w#w#x.9.M.8.Z.8#RaKavaj#s.N.K.K.C.D.t.L.M.H.G.F.h.E#h.E.t.H#h.F.c.c.c.t.D.t.i.l.h.G.N.G.h#A#Q#x.h.R.k.K.l.R#j#j.K.D.u.E.Jak#5#3#F#v#m#f#k#1#P#g#E#w#w#g.8.8.9.R#x#A#R.3#x#H#O#h#Qam#Q#u#N#x#E#x#E#E#G#2#Q#E#wakaxaKbiblblblbmbmbmbmbmbobMbobmbmbobMbobmbM", "blblblblblbla1blblblb#blb#a9aIawavavavavaUakataFatatakataiasag#9#7#7ag#M#7#9#M#Mag#Z#PavavavaIaVaVaIaIaIavaTalalaTat#1atakatasasagasa.aIaVaJaVaVa9bfaUatbcasaSaSaUa4ajasasaRaUala5aUatagagagatataSatatawaSaUasagaDaUa7aUaRagagasaDaRaUaUaSavaUaUaUaUaUa7aUa7a.asaSasasasaSaIawa7avakaUavaFaFauaHaIavanbiaVa9avavaF#M#t#t#D#W#D#D#D#D#7akaHajavavawaIaJaXa8a9bAa9a9avas#D#k.9#t.Z#l#y#v.8#t#h#Q#1#H#P#x#n#a#h#h.2#G#k#w#M#g#P#x#w#H#A#h.9#g.9#D#v#P#w#g#y#x#x#x#P#h.M.M#h#h.9.R#w#PaV#1.M.K.K.J.u.J.R.M.E.D.t.k.U#2.R.D.h.F.i.c.c.u.o.k.D.D.t.#.u#h.P.k.9#w#x.C.C.D.D.E.R#f.R.t.D.t.M.8#2#y.8.9.Z.M#g#x#M#P#w#h#v.8#y#w.M.M.Y.Y.M.9#H#R#7#7#7asaTaT#9#WagataHa6bsbs#x#j.Y#j#yavaxaVb#blbmbmbMbmbmbMbmbMbmbmbmbobMbmbmbm", "bla1blblblblblbla1blblblbMb#aIaIa7a7aIavaHakakakasaiatauatasaiasag#9#9#7#O#7#7#9#9#1ata6aIaTaTaIavavavaTavavavavaTaHakakasas#1asagasa.aIa7aIaVa9a9aVa7aRasasaHaSaUaUaUaRagasaSaHaUa7aRasarafasaRataRataRataUaDaraRala7aUatarbcasaDaDaHaUajaUaHawa7aUalaUaJa7asasaHara.ataUa7a7avaUaUaIaIakaFaTaIa6avacaZbiaVavaIbi#D#M#D#D#D#M#7#D#F#9atakalaUavavaIaIaVaXbja9a9bfas#P#g#k#j#k#v#g#G.8.R.8#h#h#h.O.N.S#h#G#G.O.M.O#x#H#o#Q#H#h.2#x.G#e.9#v#x#x#h#h#G#h#x#h#h#P#x#v#e.R.R.M.M.M#h#gaI#3.M.J.J.t.K.M#e.R.N.t.t.t#g#2.O.M.c.i.l.c.l.D.t.k.t.t.t.k.u#x.S.b.w#h#h#j.J.J.t.J#t.9#e.D.D.D#g#1al#w#j.M.L#g.9.8#g.8#j#v#g#D.9#f.9#e.N.s.C.R#O#9#1abaoa3a1aNaNa2aNaPa0ad#S#p#H#E#e.R#vaIaKaVbibMbmbmbmbmbmbobmbmbobMbmbmbmbobMbo", "blblblbla1blblbMa1blblbMblbkaIaIaJaUavavatakatatatatatatatasasaiasas#9#G#7#9asaualavakavaTaIaIaIavaTakak#1akakauai#1aiat#1asaias#PasataHavaUa7aXaVaVaXaUaHatajaSaUa7a7aRasasatasaHaUalatarafasaRasaDatasaRataRaDaDaUaUaUaSasarbcaDaDaRaUaUaUaUawa7aJaSaUaVbfasatalaDaRa7aUaUaHataja7aVawaHalaIbfaVaIaVa9aVaZaKaVakak#1#Mag#9#D#t#j#Magas#1atavavaUavaUa8bja9a8aJaS#Z#F#D#D#j#f#F#y.M.Y.R.R.M.Y.M.M.K.J.o.O#h#K#J#J#JanaV#5#2#1#P#M#v#x#h.9#k#e.Y#h#m.9.9.M.M.9.9.9.R.9.S.D.K#h#h.Rav#R#g.M.L.F.K.R.8#k.L.D.k.D#h#R#g.H...c.l.k.u.R.E.D.n.h.k.N.E.R.t.c.D#Q#Pax#H.R.t.9#x#k.R.B.D.K#w#J#g#m#h.L.R#e#e.Y.Z#v#g#f#k.M.8#m#g.9#t.Y.G.Z#Pan#2#1anaxaKaYan#2#Q#x#u#j.R.N.M.K.K.K.RakaxaVaYbzblbabmbmbmbmbMbDbmbobMbmbmbmbmbm", "blbla1blblbBa1bMa1a1b#blb#b#aXaUavavavaHaHaHauasatatakatakasatasasas#9asagatavavavakaHaIaIavaHalaFakataias#1#1ag#P#9asaiasaiasaiasas#1akatavaIaIbgbgaXaJaUaUaSavaUa7aJaUataDasaRataUa4aSatarataRasasatatasaDaHaRajaUa5beaUaR#7asaDaRataUaUa5aUbea7a7awaUbfa7ajaUaRaDawa7aUawatataHbfaVavaHaHaVaVaVaVaVaVaVa9aVaxakakasai#P#M#t#m#C#D#9#1ajajaHavavaUava9a9bkbgaUaw#Z#D.8#k.9.8#M#1#f.M#e.N.L.M.Y.M.6.C.K#j#O#o#h#xaZ#6aL#J#J#J.3#g#w#M#v#k.9#g#x#w.9.R#v.R.Y#e.R.R.M.R.S.N.K.L.M.J#w#A#w.8.M.N.J.M#G#g.M.F.s.t.V#J#w.M.#.t.D.u.t.O.t.k.d.c.h.u.E#h.D.c.G#x#2an#2.9.K.R#E.9.Z.K.K.J#h#h.R.R.9.9.M.R.9.R.M#v#G#g#E#g#k#h#k.8.8#k#D#F#g#x#x#Qab#R#1#H#y#n#D.9.8.9.Z#k.K.Y.K.J.YaaaKbiaVb.babMbabobMbmbobMbMbobmbMbobMbMbm", "a1blblbBblblbBblblbMbMbMblb#aIaIaUa7avavavalatatat#1atatatatatauatauatataHavaIaVaIaIaIaIavakaFatakatakakasaiai#1atakaiag#1asat#1aiaiasatakaHava7aIaVaVbfa7a7awaUaUa7bfa7aHbdaDasatalaUa7aUaDaSatasasaRatarasaUaRaSbeaUaJbeaRagaCasaRataSaUawa7a7aJa7awaJbfaJataJaSaRa7awaSaHajaSaHaVbfaIa7aJaVbgaIaIbfaVaVaVanavax#PauaT#9#W#v#W#v#MaiajataTalalalaIaVa9bkbAa9bxbgat#O#t#t.8.8#Pal.9#e.K.M.L.L.L.J.L.M.G.S.Oak#3#R#H.2#Kam#Q#m#h.9#H#H#w.8#j#v#v#h.7.Z#x#v#e.9.S.J.9.9.D.K.S.M.N.L.O#g#1#E.M.K.D.C#w#1.R.E.B.k.U#J#1.9.c.t.L.u.C.w.o.k.k.h.h.F.R.U.o.h#h#h#4#J#J#x.Y.M#x.8#j.L.K.M.9.U.O.R.9.D.E.M.E.D.8#g#w#s#g#k.R#k#w#g#k#v#1aa#P#D#v#Oan#v#E#E#e#j#j.S#r#d.N.9#d.K#c.L#vanaKbzaYbzbobablbMbmbmbMbobobmbobobmbmbMbm", "bMa1bMbMa1bMa1bMa1a1bMa1blbBaVaIa7aUavavalatas#1atas#1ajatajaHajaTa6aIavavaIaIavavanavaFalalavaTanalakakatak#1asagatakakajatasakas#PasakalauaHava7aVbfa7aUaUalaRajaJa7a7awaUarasagaDajaUa7aUaUaSasaRasasaDaRa5aUawaUawaXbeaUararasaDaRaUaSa5aJa5aJaUa5aJaUaUaRaJaUaUa7aUaUawaUaUaUbfaVaTaJa7a7aIawavaJaVa7aIaIaIaT#1alaTakas#j#C#t#Z#Pakakalavavavavawa9aZbkbka8aX#M#v#t#t.8#w#w#P#M.8.L.M#j.M.K.J.R.9.P.9#h.V#x.3#w#R#A#R#Q#P#A#w#h.W#w#y#w#g#g#P#g#g.U.8.M.9#h#D.9.M.R.9.N.S.S.M.R.R#h.8.L.K.B.M#w#w.M.D.t.h.M#h#x.M.c#w.O.M.k.h.k.c.k.k.h.u.G#h.N.k.w.U#o.S.V.9#h#Q#x.8.R.O.R.Z.9.R.J.F.M.E.K.B.K.D#k.9.9.9.R.L.M.L.M.M#k#1#1#2#M#Oaa#g.8#M#G#Maa#2#G.9#j.S.Y.Y.S#j#h#1anaZaZaZaIaKb.blbabmbMbmbmbobmbmbmbmbmbmbmbm", "blbMa1blbMblbMblbMbMa1bMa1b#a8aVaJaUavavaUalatas#1atasatalalavaTavavaIaIavavanalaFakakavanavavavavakalaHakasas#1asasatatakalakataiasagataFavalaTaJa7aIa7a7aUaHataSaUaXbfaUaUasasagagasavaUaUa7aUaRataDasaDasaUaUbeaJa5bua7a4asasasasaRaSajaUa7a7aUawa7a7awa7ajbea7aJa7a5aUaUawaUaJaVaUaUaXaIaJaUalava7aIaIaIaIaIajavaVa6akas#W#m#W#MasatatavaIa7avawaIa8a9bka9aXav#F#v#g#v#l#0#Y#w#1#y.Z#f#j.Y.L.K#e.S.K.K.D.H#x#A#g#g.8#H#R#H#P#x#g#h#h#Q#1#w#I#P#y#y#P#x#g.9#g#x#h.N.L.9.S.K.K.J.N.L.9.R.J.K.C.R#w#g.M.D.k.b.F.8.U.H.t#h.9.G.t.e.h.c.t.t.h.k.M#x.R.t.D#h#x.H.S.N#h#2#Q#h.R.9.S.M.S.N.D.H.S.K.L.K.L.N#e.9#e.M.N.Y#h#m#E#x#w#P#g#g.8#Pak#g#P#1#D#G#O.9#d#h#h#m.R#f#e.S#OaaaKaKaZaZaIaxblbabMbmbabmbMbobmbmbmbmbmbCbmbM", "b#bMa1bMa1a1bla1blblblblblbBa9aVaVavaJaUavaTakatasauataTanananaHalalavaIaIanalanavalavaIacaxakakaFakakak#1atauasasasaiavaUavalat#1as#1alalaTaHavaUa7aJaIa7aUaSaHaRaUaIaXaUaUatagaCaragaSaUaUbfa7ataRatataRataUa7a7bfaJaXbeaUasaCaDaDataUaSa5aUa7a5aUa7bea7a7aUaXbua7a5aHa5a7a7aJa7aUavava7aUaHalaHa7ava7avaTa6aIavbfaYavas#M#7#W#GasaiakaHavaIavavaIaIa9a9a9a8aVaS#D#s#s#F#v#P#Y#w#1#1#g#v.8.R.Y.J.N.N.B.t.B.J#h#1#g#g#w#w#2#A#2#P#m.9#v#x#1#3ak#P#1#1#w#h#k.9#h.9.R.N.K.P.9.K.D.B.K.K.9.R.Y.L.M#t#w#s.R.K.k.c.N.9.8.M.t.H.O.M.t.c.c.h.D.D.B.j.F#w.R.D.t.0#h.S.S.E.0.Wa##x.R#e.N.M.J.K.F.F.M.M.K.M.N.Y.8#E#h.R#e#v#P#P#1ak#2#P#v.Z#G#1#4avav#P#H#1.9.B.K.N.Y#j#h#D#e#j#QananaxaKaZa6aKblbabababMbmbmbabobMbmbMbmbmbmbo", "bMa1blblblbla1blblblblbla1bMb#b#aVa8aIaIaUavavaHakatauatajakatakataTaxaIaIaVaVaVaIaIaF#P#O#O#Pag#1at#1asakatatakatasajaHavaIavasasagasasakataUaIaUaUaUa7aIa7a7aUavaUaVaXa7aHaHagasagasasataUbgaVaUaUaUatataHa7aJaUa9aXaXaJbeaRaDatataDaSa5aSaUa5aUawbea5bfawaUa5awbeaUaRaUaUa7aUawalaUaIa7alajaUava7aUa7ava7aUavbfaVaU#9asas#M#7#MagasatavaHaHalawa7aIaVa9bkbyaVaU#F#t#s#g#Y#Pa.#w#w#Y#g#g#g#k.8#f.Z.L.u.l.u.9.R#w#O.8.8#w#Q#w#P#H#H#Z#G#g#D#P#x#x#g#gak#Q#g.8.9.R.M.K.t.F.S.K.t.K.K.t.N.L.R#E#g#H#yak.U.F.c.h.S#g#g.R.k.u#a#h.D.r.k.s.N.L.D.j.l.8.R.D.c.R#x.S.9.K.k.S#h#y#P#D#j.M.9.R.D.B.D.K.N.S.N.R#g#x#w#Pak#P#w#y#H#P#A#1#1#1#1#P#3#P#0av#1#E.Y.L.K.Y.S.9#e.K#v#O#1#2aaaKazb#aKaKb.a0b.bMbabmbobabMbmbmbmbmbmbobm", "bMbMbla1blblblblblblblblbMbMb#a9aVa8bfa7avavavaTavakatatakatakatatavavanaIaxaxanaTak#P#M#M#M#9#9asasaiauat#1akaHalakatakavavaUalatasasatatatava7aTaUaUa7a7aJaJa7aUaUa7bfa7aRaUaCasaBarasaRavaVbfaJa7a7asataSa7aUaJbfaXaXbfbfaSaRaSaRasaRala4aUbea7aUbeaSa7beawaUbea7aUaRawaUaIaUaRaSalaUaUatalaUaUavaUaIaUavaIava6aTajasasasag#Z#MasakataHalajalaHavaIaVa9a9a9aVa7#M#t#g#g#Zavak#P#Z#w.8.Z.8.8#v#f.M.E.t.J.D.M.M#g#g#g#O#w#y#y#y#P#P#P#y#D#g#H#P#P#h#g#Q#y#E#g#h.U.P.S.C.B.L.M.K.D.v.B.L.M#j#w#g#Q#yaa.H.t.c.h.R#x#h.9.k.t.9.O.t.j.J.K.J.D.L.t.l.O.M.t.E.9#w.L.9.N.b.t#h#y#1#w.8.R.S.N.J.F.E.D.D.N.N.S.R.U#h#x#2#1#H#Q#H#1#2#1#Rav#3#1an#1#P#1#h#f#j#j#e.M.7#h#m.9.9#M#1#QanaxazazaKaKb.bMbababobMbobmbobmbmbmbmbobMbo", "bBa1bMblblbma1blblblblblbla1bMaZaVbfaKavavawavaIavavavakajaHakavacaxan#9ag#Zasasakas#M#9#M#7#9#1#M#Paiasat#9asakakalavajalava7aIa7ata.avaUavataHaUaSajava7aJaJaJaJa7aVaUavaUaUataragasasasa7a8bfaXaVa7asaRataXaUajaJbfbyaIbfa7aSaDaDaraRawaUaJbua7aSaXawbfa4aUa7aUa4awajawa7ajaSaRaRawaRatajajaSawalaUawaUawavawalavavavaTas#Zai#PavaHataHalajajajajavaVaVaVaVawat#v#k.8.8#gav#3#P#y#Y#g#l.M.8.8.Z.H.u.u.C.J.J.H.M#g#M#P#g#M#1#1#P#1#Pag#0#Z#M#9#P#Z#G#v#D#y#g#k.M.Y.E.R.N.M.N.t.k.k.t.L.L.R#w.M#w.3.0.#.c.#.E.M#x.Z.M.t.h.h.l.d...8.U.J.Z.R.C.F.E.J.u.V#w#w.8#A.M.#.b.F.H.Z#g#t.R.E.L.R.F.t.u.u.B.B.t.u.N.R.Y.R#h#1#H#2ak#5acak#5alakaIaI#3#t.8#v.9.8.Z.7.R#h#e.K.9#E#P#1#3azaxavaHa6bzblbababobababmbobobmbobmbMbmbM", "blblbla1bmbmblblblblblbMbla1bMb#aVaIaIavavaUa7avaXaIaIalaTavavaIaIat#P#M#Z#1axalas#9#Z#Mag#9ag#P#Zag#1#1ag#1ag#0asakakajalaUaJaIaUaHajataUaUaHalaUavaSaUaJa7a7a7a7aVa7awaUaJatatasagagasasaUaVaVbfa9a7asaHasa7alasa7aJbgbfa8aXalaRatarataUaUa7bea7a4a7aUaXaUbea7a5aUaUa4aUa7aSajaGaRaSajaDataRaUa7aSawaUaUaUaUaUaUaUavalasa.agatataUataHajaUatajatalavaIaVaVaIaU#1#t.9.Z.Z#gak#1#y#P#I#D.8.Z.Z.Z.Z.J.C.J.E.J.M.Z.8#g#y#P#I#1#5avakavaIavav#3#P#P#1#2#1#A#w#1#P#w.8.R.R.u.D.G.N.J.t.t.B.M.9.R#h#g#y.S.D.c.c.c.N.9#H.M.F.k.c.k.k.c.h.R.8.H.R.M.D.N.E.E.t.G#w#A#P#g.o.c.c.i.H.O#h.9.P.R.M.M.D.t.H.M.D.K.D.L.M.M#h#h#h#Q#Jak#4aIaIaKacaKaVav#3#P#g#v#v#j#e#t#e.M.R.Y.R#g#w#1#1akaoaIaFaIaVblbablbabobmbmbobmbobmbMbobMbmbo", "blblblblbma1blbmblblblbla1bMa1b#a9alavavaUaIaIaIaVaIaIaIavaIaIaxat#F#M#2akalalak#1asagag#Pasagag#1#1asas#Pag#Z#PasatasatalaIbfavaUavaUaHawaUaSalaUaUawaUaJbfaJawa7bfbfa7aUaUatatasasagatataHbfbfaVa9bfatataDaUatasava7bgaIbfbfaUaSatasaRaHaSa7aUa5aUaJaUbuaUa7a5awbeaUaUa7a5aSaUaRaRalaRaDajaja7a7aUaSawaUaUawaUawalatasagagasalaHaTajajatalaTalavavavaIacaVaIajas.8.Y.M.Z.8#3av#1#w#w#g.Z#l.Z.Z.Z.J.J.M.L.E.R.Z.9#F#1#5alavacaKaIaKayaZayaKaxan#R#Q#x#w#g#w#1#A#g.H.H.u.J.K.M.N.M.B.k.M.9.9.M#H#h.F.k.b.#.#.F.U#x.R.O.k.b.c.H.k.j.J.M.J.8.R.N.E.D.t.h.k#w#A#R.Z.u.d.c.h.u#h.Z.Z.M.M.M.N.E.t.M.R.F.K.K.L.R#j.9#g#g#D#wabaYaZaoaVaYaZa9av#1#w#G#s#t#j.Z.9#k.R#e#f#k#v#w#1aaaIaKacavbibzblbpbmbobmbpbobpbpbobabobabobmbo", "blblblblblbla1blblblblblblblblb#aZaIaHatalavaIaKaIaVaVaIavav#P#Z#9aHat#M#Pagaiag#1aHavakakasagakal#Pagaiai#ZatakatatatatalaIaVaJa7alaUaUajatataSavaUa7aRawa7aJaUawa7a7a7aUaSasagasatagasata6a7aIaVbzbgatatbcatatasatavaVa7bybfa7aHaHasbcasataUaRalaUaUavbgaUaUa5aSa7aSa7aUaSaSaSaSaSaSaRaUaUaSaUa5a5aUaUa5aUaSaUaUajatasaDatasajatalasalatalavavaUa7avava6aIal#P#M#k.R.M.M#h#P#P#w.8#w.8.8.8.8.8.8#k.8.Z.M.7#f#f#k#wa.acaJacayayaYayaZayacacak#A#w#g.8.8#g#w.8.Z.M.Z.M.M.R.L.M.9.9.K.M.R.R#x#e.P.K.F.d.b.b.e.k.u.M#h.9.g.c.r#H.H.B.K.K.M.9.R.J.k.l.D.D.k.o.R#h.M.E.#.c.c.h.M.M#g.R.M.H.E.K.E.M.J.u.M.9.8.9.8#O#Q#P#x#Qanan#4axayaYaYaKaxaKavavaka.aj#0#g.7.7#k.8#M#D#yakavavavaIaVbzbMbobobmbabobpbpbMbpbMbpbobabmbobm", "baa1bla1blblblbmblblblbla1blblb#bzaKaHajataHaIaIbiaKaVavalatas#1auai#P#M#Zaiau#1aualananavaka.#1atas#1as#1#1akas#1asatakaHavaVaJaIatajavaDajajalaSawaUavaSaJa7aJaUaJa7awaSaUatasataHasagasavaIbfa6a9aVaRasasatatasatata7aVa9aXaTalaUaRasasataUataRaUaUaSbgaUaUaUaUaUaUa7aUaUaSaHaRaSaSaUaSaUaRaSa4beaUaSaSaUajaSaUataRaDa.aRasatataHajavaTavavaUavava6avaIaIaH#1#M#k#k.J.E.u#w#1#1#g.8.Z.Z.Z#k.9.Z.8#g#f.8.Z.8#l.8#M#3avacavaIaIayayaZaYaYaK#3#I#F#F#g#g.8#g#g.Z.Z.9.Z.M.M.L.M.0#e.B.S.9.R#H.9.N.N.v.g.c.c.b.t.t.E#h.R.c.k.R#A.J.N.t.H.R.8.M.A.h.c.M.R.C.u.O.8.M.E.h.c.c.h.D.G#A.M.J.E.D.J.M.M.L.H.S.R#f#g#t#h#h#h.O#x#4#4axaoaoaYayaZaKacavaVaIaIalas#t#f#e#D#g#g#g#Y#3akavacaIaVaVb.bmbmbpbobpbMbMbpbMbpboboboboboba", "blbmblbmblbmbla3blblblblblblb.blblaxalava7aVa9aZaZaKaVavaTaTai#Z#9#G#D#v#M#Oalaaanan#1#H#9#H#1#P#Palavakalas#1a.asatakatatavaIaJaIavaSaSaHalajaUaUaSa7a7a7a7aJaUa7a7alaHawaUaUaUaTatas#Magala7aIaJaXaIaHarasatag#9asa.aHa6bka8a7aHa7aUataBagasasaRaRaSa7aXaRaUalaRaRbeaSaRaSaSajaRaRaRalaRaUaRa4ajaUawawaSawalaSajajaDaRajaRarasataUajaHalaUalaHavavawaIavavavaH#0#g#k.L.K.D#w#P#1#g.8#g.8.M.Z.H.M.Z.Z#D#g#Y#1ajak#Ravacayayacacavacayacab#R#R#5aI#g.8#g.8.8.M.E.E.D.H.Z.M.M.O.R.9.D.E.o.M.u#h.t.F.#.h.#.#.c.R.9#e.9.9.9.O#P.8.L.O.L.H.R#g.9#j.O.u.8#w.8.R.Z.8#P#w.e.c.h.c.c.o.O#g.H.E.l.u.E.8.Z.M.C.H#y#O.9.D.R.N.G.0#x#Jabav#4abaK#4aoaKaoaZaZaoakak#1#P#g.Z.M#g#Z#P#1#1akakakalbibzbMbmbabobMbpbobpbobmbpbmbabMboba", "a1bablbablblb#blb#b#a1b.b#blb.b#b#aIaHaIaVaYaZaZaVavavaUavataHai#9#t#s#W#W#Zanavak#w#P#M#M#9#1av#1#1aTaHas#1#1asakaHakakalavawa7aIawalajajatajajawavaSa7aJaJaUaJa7aUaRaUaUbfaUawaUaHatagasasaIaUavaIaUatagagatasasaRagatata9aVbfaIava7ataDasarbcataUawa7aIaRaDaUaGaUaUaUaRajaDajaUa.asasaRaRajaGaUaGaRaRaSaSaGaRajaRa.ajaDajaja4awaSaRataRavavaUajavavavavavat#M#G#k.Z.L.M.M#g#P#P#g.9.9#g.9.o.E.H.o.8.8.8#F#walaIakavaa#5abaa#1#H#oacayacac#R#I#g.8#g.L.R.9.8.7.M.Z.8.8.Z.8.M.E.R.M.k.E#x.8.L.t.k.#.#.c.c.#.R#x#Q.9.8#w.M.t#h.t.S.8.R.E#g.U#w.8.l#g#g#P.8.Z#P#Q#a.e.A.r.c.c.u.M.G.N.H.E.u.l.u.N.L.J.J#h.M#k#M#D#F.8.8#P#Raa#4#K#K#4ababaxaoaqayacaKaVav#2#g.L.7.Z#g#y#Pa.akaH#1asaVbzblblblbabobmbabobobMbpbobobabpbm", "blbla1bla1blblb#blblaOblblblblb.b#aKaHavaVaZaZaYacaIaIavatakalai#M#t#t#Z#P#P#2ak#2#1#1#9#9aiav#1ak#1alavas#1atakatavaHaHavaIaIaIa7avaUatatatajaRavaUajaUa7aJaJaUaJaSawaSaUbga7aIaUaHaUasasataJaUava7aJatasasatasasaSaDasataVa9aVa7a7aVataRasagasasaRaUbfa7aHaRaUaSaUaUaUaRaRaRaRaSaDatasaGaRa4aUawaUajaSawaUaSaGajajaRaRajaRaSawa5awaUaUavawaIaUawaUavavavanak#y#F#f#e.M.L.R#w#P#P#w#k.R.8.Z.H.H.E.M.M#l#Dag#I#3aIaVacaI#1#3#P.U.Z#y#Ranal#R#3ag#P#F#D.Z.Z.M.G.Z.M.R.O.8.8.8.E.D.R.M.l.u#n#A.M.t.k.#.b.#.#.h.M#h#H#g#h#Q#h.D.N.k.D.O.M.M#h.9#g.9.t#g#gak#w#w.8#A#h.E#w.l.c.c.k.u.G.D.F.R.M.u.G.M.J.8#g.8#h#w#M#w#P#w#2avaa#R#Q#1#Q#H#HakabaZayaKaZayaK#3.8.M.8#k#h#g#M#0ajajakag#0bgbzbMbmbmbobobobpbMbMbpbMbMbobabMba", "bmblblblblaOblblblblbla1blblb#blb#acaUaIaVa9aYaKaVaVaVaH#1ai#P#9#1aiai#M#E#k#l#G#2#P#O#M#P#M#P#1aTananavalalaHavavakalajaHavaIavaRavaUalaRataSalaSaUaUajaSavaJa7aJaUbeaUaja7a7aXa7ataHaSaHaHalataja7alataUaUasasataUataga.aHaVbfaVbfaVaTaUaHafaBaDasaUaVa7aUaUa7aSaJaUaSaSaUaSaRaRaRaRasaSa5aUaSaUawaRaUa7a7aUa4ajaRajaHaSaSaSa4ajaUaJaIaJa7aJa7aIa7aIaIaIaJavaUa.#t#e.L.H.H#g#w#w#g#k.M.M.M.H.H.E.H.Z#y#RaybzaVaKaVab#4an#P.3#y#wag#w.O#AaIaIacaVak#Z#3#R.3#g#g#g.J.E.E.M.E.F.E.E.J.R.B.O.U.D.D.t.u.d.c.g.h.O#n#2.H.J.P.V.D.h.B.N.M.M.R.M.S#e.S.K.M.L.9.Z#x#g#y.Maa#4.h.h.t.k.t.A.K.S.M.M.K.A.A.M.Y.M#h#A#x#j#x#x#v.9#2an#P#j#P#1akaxaK#Ranb#aZaZaoao#w.7.L.M.Z.8#P#Pa.a.as#M#Ya.aVbkbMbMbmbMbpbMbMbpbMbpbpbpbobpbobp", "blbmblblblblblbla1blblblblblaObzb#a6aUaIaVaya9aVaYaIaTauas#Paiagai#8#Z#t#t#m#T#t#G#1#M#M#M#PaF#P#PaHavakavanalaTaIataFatavavaVa7avaSavavatajaUaHaSa7a7atajaSa7aIa7a5aJbeaRaJawa7a7aRaHaUaUavaTatavavaHaUaUa6atatatatasasasakaVaIbfaVbfa7a7aT#7aratataUa7a6aUaUaUata7a7aUaUaUaSaHaUaSaUaRaRavaSalaSaRaUa7bea7aUaUa5aSaSaUaUaUawaUbeaJa7aJbfaJa7aXa7aUaJaJaIavaHa.#0#t.R.L.M.E.8#g#g.8.8.M.H.o.E.u.u.M.M.8#x#2aZb#aZac#R.8.U.3#1ak#3#A#A#s.8#w#5#1#R#A#w#P#Z#k.8.8.8#g.Z.M.M.E.M.D.E.J.8.t.t.E.D.t.k.o.k.#.k.k.M#H#J#g#Q.D.N.D.k.A.R.9.8.R.o.R.Z#h.L.8#g.9.9.R.8#g.Z#H#g.l.t.D.r.k.H.S.9.Z.M.M.u.M#y.M.M#v.S.L.3.8.Z#1#1#1#O#gak#Janaa#2#R#2axabaoazacak#G#D#g#k.Z.L#D#wajalal#0#PataVbkbMbmbMbobmbobpbMbobMbpbMbpbobobo", "blblblblbmblblblbla3blblblblblb#bzaIaUacaVaVaKaVaVavatag#M#M#9#M#M#M#D#M#G#7#v#t#k#8#9ah#1aiak#1#PaaaFakalaHauakalavajatavavaXaIaUalalaUaHaHaUavaSaUaIawaRavaJa7aJala7aJaRaUaSaUa7aRaHaUavaUaUalaUaUatatava7aHa.atajaRasasatbfaIaVa7aVaUaUaU#7#9bcataHbfaUaUaUaHasa7bfawaUa7ataRaUaSaSaUajaUaUalaSaUaJa7a7aJaUawa5awa5a5bea5aUbeaJbfaXaJaXaJaXaVaJaUavawavaUat#0#Z#k.Y.J.H.J.8.9.8.8.8.M.F.E.D.D.t.H.9.8#h#x#o#2#4ab#4#h.u.M#A#o#J#g#g#1#w.O.W#A#M#Pa.#1#A.W#I#w#F#I#w.8.R.H.E.l.o.8.8.B.h.u.D.l.l.t.c.#.j.h.o#h#h#h#H.u.t.E.E.B.N#w#A.8.E.R#k.U.L.U#J.9.M.E#h.R.M.R.o.k.D.n.h.B.E.s.M.8.Z.M.R#w#P.7.M.S.R.M#vak#R#Jan#2#P#1ak#R#o#y#HaxaYb.aYaYaKax#RbiaYat#k#g#g.8#g#1#1a.atalavaVbybMbMbobMbobMbMbNbobpbMbobpbMbobo", "bmblblblbmbmblblblblblblblblb#b#bzaJaTavaIaYaVaIavavatag#9#9#9#F#V#V#t#W#M#G#G#O#G#M#Q#1#O#9#G#M#HakakaTaTakanavaTaTavaTavaIaVbfavavataUalaSa7a7awaUawawatalaUaJbfawaUa7aHaJaHaRatatatatata.avaUa7aUavaXa7aIawaga.aHatat#ZaHa7aVaVaIaIalaSatasagaBataHbfaHatataDasaUakaHa7a7aHaUa6aUa7awaUa7awaSaSaSa7aUaUaUa7aJaUaUawa5a5aUaUbea7aXbfa9aXaXbua9aXbfaXaJaUawasaj#Z#e#e.M.Z.Z.8.9.Z.O.R.D.D.u.k.t.t#f.8#s#l#k#w#x#Jak#g.8.L.M#x#x#h#w#J#g#M#w#g#D.3#ga.#P#A#A.9.L.H.M.M.Z.M.Z.H.M.9#y.R.t.M.u.9.N.H.l.c.b.#.k.R.U#g#x.9#h.M.M.2.J.N#Q#2.E.F.S.S.S.n.9#n.F.N.S#h.M.9.N.v.j.s.h.D.R.D.j.t.R.R.K.H.8#P#1#M#Z#w#y#g#x#P#A#n#x#x#H#A#m.R#x#2#o#n#x#h#x#1acaKavavaj#0#w#D#g#g#1ak#1#GagakaIbgbzblbMbMbmbMbobpbobobobNbMbobNba", "a1a1blbma1blbmbmbmblblbla1b#b#b#aZaVaJaIaIaVaIaIakaIaT#Z#M#Mag#7#D#F#7#D#D#O#G#D#M#1#P#O#9#P#7#PaiaiakavaIakaIavaIaIavakaTavaVaIaJa7alataHaRajaUa7aUa7ataRalavaUawaXaUaSaUaUajaRasasaDaragagaUawaUbfbfaVaJalaHagasaUasasagagaIaIa7bfaJatasasatatasagasaTasasbcasatatasava7atajaRalawaUaUavbfaUataHaSawaUa5a7a7beaUaUaGaUa5aSa5aJbebfaXaJbfaXaXaXbfaXaVaIaJaUaR#0#Z.Z.M.Z.Z.Z.Z.R.R.M.E.E.H.E.l.t.E.G#g#R#A#x#x.8.9#H#x#R#1#P#M#y#P#k#g#w#w#g.8#Aal#I#s#w#P#1#M.8.7.8#w#l.8#y.C.Z#w.8.G.k.H.u.9.8.u.d.h.#.c.t.M#w#P#A#y.9.H.h#H.E.J.3#H.H.M.9.9#h.J.2.9.K.D.M.9.U#k#w.E.h.h.h.t.F.J.7.J#x.R.R.Z#P#4#g#g#w#w#D#D#w#w#w#g#l#g#1#w.R.R#h#h#j.9.R.9#h#QaIanaKaIaIaj#P#F#v#M#y#w#0#IalaIaVa9bkbzbMbmbmbobobMbabobMbMbpbobMbo", "bmblblbmbBblbmbmbmbla1bmbMa1bla1bza9biaZa9b#aVaKaIavaHatat#9#P#9#7#G#W#V#k#t#G#9#P#Pag#1atakakauakakanaIavanava6aIa6aIaHalaTaIawava7avalaHaUaRavaUawa7ataSalawa7aUa7awaXaSaUaUaRasaDaratatagaSaIa7aXaVaVa8aIajagaRaHa.at#Wasa7aIaIaIaUagagasaUaUatagaiaHagafagasatataHaUa7aIaUaTaIbfaIaUaIa7aHatavaIaUa7a7aUaUaUa4a5a5awa5a5aUa5a7awa7aJbfaXaXbfaXaXa7avaUajaDa.#Z.8.7.M.7.M.M.Z.M.H.u.D.D.E.u.E.E#j.8.Z.U#h#g#G#g#w#x#x.V#h.U.M.o.P#A#x.Z.M.9.8#1#Q#H.8.8#g#w#w#w.8.8.Z.8#w.8.J.Z.H#g.E.l.M.8#g.o.c.c.h.h.l.9#1#R#J#h.9.N.t.G.D.N.H.O#x#x#h.O#h.P#H.F.P.K.N#2#x#g#w.S.h.c.#.h.t.E.R.R.R.Y.R.9.R.9#g#w#y#g#D#P#P#w#g#g#h#G#x#w#g#x#g#v#E#P#Q#H#Q#2anaoaoaoan#1#x#h.8.9.Z.8#g#1akakavaVbkbMbMbDbMbobMbmbobobMbobobobpbM", "bmbmbCa1blblblblbmblbla1bMa1a1bMb#a9aZaZaZb#a9aVaVaIavavatasag#9#M#7#7#D#t#V#t#M#9at#P#9#1alavalatasanaKaxaVaIaxaIavaIanavava7aIaUaIa7aUaHalalaUawaUaUaUaUaHaUavaUa7aUa7aUaHavaSasasasbdatatalaUaUaIaXaJaVaXaSasataUagat#W#9a7ava7aIaUag#7agaUaUatagaBatagaf#9atatataUavbga7aIa7aJaIa7a7aIaIajaHa7a7aIaIa7a7aUaUawaUaJbea7a5a5beaUa7bebeaXbebfaXbfbgaXawawawa.aD#Z#l.Z.7.Z.M.M.G.R.H.E.t.u.k.J.E.M.8#w#P#P#F#D#g#w#2#1#w#E.R.M.N.N.D.O#h.R.M.8#g#h.9#h#g.8.8#w#F#g.8.Z.L.o.H.8.M.E.Z#g.Z.u.H.W.S.l.#.#.h.h.u.Z#g#w#R.V.o.S.M.t.t.t.t.N#h#H#h.E.M.N.0.t.N.M.S#H#g.9.Z.0.c.c.c.h.k.K.0#h.M.Y.R.J.M#h#g#w.8.8.8#P#P#w#g#g.9.8#h#x#y#O#P#g#P#2#1#G#x#HaaaKaxaa#Q#x#h.9.9.R.O.8#g#w#PakaVa9bzbBblbMbobMbmbobobMbpbNbMbNbNbM", "bCa1blbmbla1bCbmbmbmblbmbMa1a1bMb#bia9aZaZb#bkaZaVaVa7aUakas#9#7#9#E#M#V#M#W#D#Dasa6aT#1atalavaIaxalanaxaxaVaxa6aIaTaIa6ava6avaTava7aIaUaTavavaUaUalaUavaUaUaUa7aUava7aUavaSaSalasaRasarasaUaHaUalaIaJalaVbgalatajavarat#7#MaVaUavaVaH#M#7agava7aUagaQ#9aQ#MagataHataHaUbiaVbfaIaIaVa7a7aIa6aHaUaIaIbfa7aIa7aUaSaUaJbea7beawaUbea7aUbeaJa7bebeaJbubuaXawa5alajar#Y.8#f.Z.7.M.H.E.H.H.E.k.k.l.J.M.Z.R.U#x#O#Q#A#w#x#2#Q#w#m#j.9#j.9.M.t.P.R.R#g#P#g.M.Z#1#1#I#w#g.8.9#g#g.R.o#h.R.u.R.Z.O.u.E.O.E.k.c.#.h.h.M.8.8.8#2.R.k.S#h.c.k.k.R.9.R#h.V.F.S.M.N.c.v#h.S#x#x.Z.R.M.#.#.c.h.k.D.M.S.K.R.9.L.U#h.8#h.8#h#g#E#G#g#Z#G#s#g#w#P#1#w#w#H#Q#Q#P#x#1#QabaKax#2#P#D#E#D#k.9.9.8.9#g#OakaVbzb#bMbMbMbMbmbMbMbMbNbMbMbNbmbmbo", "blblblbmblbCbmbCbmblbla1bBblbMblbMa9a9ayayaZaZa9aVaVaJaUakatagag#7#7#M#D#W#D#M#O#P#PauaIalalaxaVaIaVaIaIaVaIaIaIaxavaFavaUavaUavatatatataHaUaUavaUalataUaUaHaUavaUaUavaUatatatasasasasag#7#ZataHasaHaUaRaVaXaUalaUaHasasag#MaIaUajavaT#W#7#7aHaJa7aUas#9aQasaraHatataUaIbfaIbfaIaVaVaVaUaHatataRavawaIaJaUaIa7a7aUaUaUa7aJaUaUbeaUa5bea7beaJaJa7aXa7a7aUawaUajag#F.8.Z.M.H.J.J.u.C.E.C.E.J.M.M#f.M#f#F#P#I.3#w#y#x#h#xaa#4#2.U.Z.O.9.9.J.C.u.M.8#g.R.R#h#h#w#y#x#g.M.M.t.D.u#h.8.M.G.R#g.E.M.E.K.k.h.c.d.h.Z#2#g.8.U.J.c.C.9.u.D.N#x#x.9.9.S.9.S.R.R.k.D#e.N#x#Raa#H.P.k.c.c.e.c.s.K.9#h#J#g.9#h.Z.R.S.R.9#h#k#g#wa.#1#P#y#F#Y#P#P#1#y#w#P#Aak#2#1#P#y#x#g#g#w#O#w#G#F#D#w#P#P#P#1alavaVb#b#bMblbMbmbmbobobMbmbobmbobo", "bBbla1bla1bla1blbCa1bCblbMa1bla1bBaZa9aVaXaZaZaZa9aVaIavaUakasagag#7#M#7#M#M#D#E#M#1#1akavavavaIaIaVaVavavavaVaIaIavalavavaUaUaUataHaHaHaUataIa7aUaHatataUaUaUaUaUavaRaUajasatagatatagas#7#DataHasasajalaIaIaIaHavalaHagaiagavavataUaH#M#V#7ata7aXa7asaBagasasaHasataVaUaVaJaVaVaVbzaVanatatataHaUa7aJawaUaJa7bfaUaUaUa7a7aJa7awbeawa7a5a7bubebeaJaJaUawaUalas#Y#F#f.Z.M.J.H.E.J.E.M.H.J.M.M.7.M.R.8#h#A#1#P.O.3#a.R.P.P#h#H#D.R.R.M#f.9#j.R.8#v#g.K.S.P.N.G#h#P#H.M.o.S.G.l.R.9.Z.H.M#P.M.M.E.N.t.c.c.t.c.Z#R#w.8.9.S.J.C#h.u.K.K#w#w#v.9.N.M.N.R.U.s.c.N#h.U#xao#h.9.k.c.b.c.j.B.K.O.8#x.Z#j.8#E.9.M.N.9.8#g#D#g#I#A#y#g#gakaa#R#2#P#x#P#w#4ak#Qak#1#H#x#h#w#M#g#w#O#M#O#PakakatanaIaYb#b#b#bMblbMbmbMbmbmbobMbobobM", "bmbBblblbCbmbBblblbMblbla1bBbMa1b#b#a8aVaya8a9b#a9a8aVaIaUavas#0ag#Z#Z#M#F#V#k#k#D#1a.avaIaIajakalaVaVavavavavaIavaTalaHalalavava7atataUaUatasajaUaUavalaHaUaUaHatavata7alatagasasatagag#7#7ajatagagas#0aIa7avasaIawatagai#M#0aUaUatas#F#7#WaSaJaXaXaSar#7asatatasaUa7awa7aIaJaVa9aVa6aHasaHatatavaUavaUaXbfaJaJaSaJbeaUaJa7a5a7a7a5beaJaJbebfaXbfaJawaUajaRar#w.8.Z.M.H.J.E.E.H.E.E.M.M.7.Z.M.Z.Z.Z.Z#E#w.8.G.E.t.D.D.R.8#h#h.O.R.0.Z#g#P#E.8#x#h.M.M#v.8.8.G.O#h.U.Z.M.G.t.o.O.G.F.o#H.M.l.E.D.l.c.c.c.k.G#J#h#w#t#g.E.E.u.t.c.t#P.U.N.D.N.M.Z.9.w.c.r#h#o.M.3#2.F.U.h.c.h.c.k.t.D.N.M.R.M#g.M.M.t.t.M#g#g.Z.8#g#A#P.8.8#w#A#g.8#w#y#y#1#P#h#x#x#J#P#F#E#F#g#M#P#M#w#P#P#P#1akakavaIa9aZbkblblbMbmbMbmbmbMbMbobobobo", "a1a1bla1blbla1bla1bMbmblbma1a1bBblb#bka9a8ayaya9aya8aVaVa7avaHatatag#Z#M#M#D#t#t#D#Z#Pa.#1ajaUalaHaIaVaUakalavaUaTaHalalaHalalaTawaHalaHaHaHasa.aHaUava7avaHaHaTaHaUa7avaTat#9agasatag#7ag#9aHatagasai#Zata6alaIaIbfat#M#7#WatalaUaUat#M#7aiaUaJaXa9beasagasataHataUaJaIaJaVaVa9aVaVa7aUaUaIavaUaIaIaXa8aVbfaJaIa7aXaIaIaUava7aUaJa7a7buaXbubfa7aJaJaUaRa.asa.#D#l.M.L.L.J.E.J.J.L.M.M.M#f.Z.Z#k.8.8#v#s#g#g#k.R.M.t.h.l.u.M.9.9.R.M.M#w#P#y.9.R.Z.Z.9#g.9.9.9#j.9.9.9.S.M.E.M.E.o.E.H#w.Z.8.E.H.u.d.l.c.c.o.E.8#J#R#J.L#P.J.D.k.c#g.H.C.D.R#w#x.8.k.j.R#g#w#h#v#H#x.N.k.k.h.c.k.s.M.N.9.9#y.M.R.9.u.J.N.M.8#h#x.9.M.9#g.9.8#h#P#P#1#A#w#x#g#g.8#v#1#J#1#O#Z#O#P#2#y#P#1#2#1#P#PakavaIaYb#b#blblblbobmbmbmbmbmbMbFbNbM", "bmbla1blbmbBblbmbBblbmbmbmbCblblbMbBa9a9aya8bjaya9aZaVaVaJavajata.#9#M#M#D#D#D#D#D#MasalajajaHavaUavaIaUalataHavaUaUaHaUavaTaUaHaHaUaHaHataHatataUaUaHaHavaUalaRataUaTaTaUaTas#Magauas#M#7asaTaHasatas#ZasaUataVavaVau#7#7#MakaSavavaH#7#7asaJaXaVa9aXatagasataHala7aIaXbfaVaVbka9bgaVaUaJa7a7bfaVbfaVaVaXaVa7aXbfaIa7aUaJavaUaIaUa7aVaXaXaXaXbea7awa5aja.asag#E#k#e.K.H.J.J.E.L.J.Y.Z.R#f.R#j.Z.7.7.Z#g#E#g#g#j.O.t.u.k.t.D.O.9#m.R.R#h#w#g#k#h#t#g.9.M.R#h.9.9.R.K.S.O.N.H.R.R.K.O.L#H#g.9.R.M.D.o.i.b.h.t.O.Z#x#J#g#1#3.J.L.r.c#w.L.J.9.R#h#y.V.k.k.R#w#G#Pak#1#h.D.c.c.h.k.l.B.M.R.9.8#Q.9#h.R#k.R.K.R#g#E.9.Y#x#O#w#k#k#P#1ak#P#G#w#w#M#g#v#h#x#y#O#O#y#P#1ak#1#1#1#1#P#P#P#1akakaIaKaZblblbmbmbmbmbCbobmbmbobmbo", "bla1blblblbmblbla1blblblbmblbMa1bMbBaZaZa8aya9a9a9aZa8aVaIaIajajasag#M.9#k#j#t#k#sagasajawaIaIaIaJawavaIavaRaSatavavaUaSaHalaUavaUaHaHaRataRataHaHaHaHaHasakaIa7aUataHaHasagaT#1#7aiat#9asasa7aVaHauaHbcagasasaIaVaV#9#V#7#WakaHaJaUaT#7#7#Za8bkaVa9aValaHasavaRavaJa7aJaVa9aZbkbibfaJa9aIbfaVa9a9a9a9a9a9aVaVbya8bfaJavaIaUaJaIaIaIaIaJaVa7a7avaUatatakas#1#1#M#j.J.B.K.K.K.N.M#e#e.9.Z.Y.R#k.9#k#D#g#k.8#k.Z.M.M.M.Y.K.t.J.J.M#e#j#g#h.8#h.8#j#h.9.R.R.M.F.H.R.R.F.o.D.S#h.M.J.H.9.9.9#M.8.M#e.R.H.k.#.b.k.M#x#P#2#h#A.M#A.u.D.G.9.9.u.K.G.R.R.M.k.c#g#1aa#1akan.t.k.c.c.t.M.M.R#x#t#h#P#v.8.Y#f#h#f#1#w#g#g#g#P#P#w#P#3#1#P#P#Z#g#F#t.8#D#g.8#f#E#x#y#1#1#1#1#P#1#1#1#Q#1akaaaFanaIbib#bzblblblbMbmbobMbobmbFbMbmbM", "bmblblbmblbma1blblbmblbla1blblblblb#bkaZa8ayaya8aya8ayaVaXaIaUajat#P#D.Z#e#k#t#k#Dag#Z#PatavaUaIa7awavaIaJaUaHalaUawaUaSawaUalaUaHaSajajataRaHaHaSaUaSaHasaRaIa7avataHatasasajaUagasatasasaiaVaVaTaUaT#9#7#9akaTbkaT#Z#W#9#VaiataIaIaH#7#7#MaVbkaZa9a9alaUataUaHavaJaIaXaVa9bkbka9aVaXa9aXaVaVaVa9a9aZa9aVa9a8aVbyaIa7a7aIaIa7aIaJaIa7aIavavalalak#1asag#P#M#P#E#k.N.K.H.J.N#e.S.R.8#j#e.R.M.R#k#k#v#w#g#k.8#k.8#f.M.M.J.C.J.L#e#j#g#x.9.9#h.9#f.9#h#m#j.9.9.L.D.H.M.M.t.R#h.R.M.K.8#x#v#P#P.9.9.M.D.t.#.b.c.H#H#Rao#y#x.E#R.H.E.S.G.9.N.N.O.G.H.E.K.k#A#J#R#w#R#2.t.c.c.r.K#g.8#k#g.9#g#w.8#h#E#P#t#gak#F.8#y#O#P#P#Zakak#1#M#g#g#w#O#M#w#t#D.8#l#w#M#P#P#1#1#1#Pag#P#M#PaiakakalavaxaYbzb.bza0bzbobobmbobmbMbobmbobM", "blbla1a1bmbmbmblbmbmbmbmblblbmbma1b#a1bkaZa9a8aZbkaZa9bka9aVaIaUavag#D.Y.R#j#k#t#Mag#Pa.ajaIavavawalawaIaIaUalaSalavawaIaUawaUalaSavaSataSajaSalaSaUaUaUaUaHalaUaIavaRataUatataTasatatasasasbgaVava7a7ag#M#9atalbzaH#M#V#7#7agajaIa7at#WaB#9aVa9bkaZa9avaUata7alaUa7aXaVa9a9b#b#aVa9a9a9a9aVaVa9aVb#a9aYa9a9a9byaXa7aIaIaIa7aVaXaVaVaIaIaIavalaHajatak#O#M#G#G#E.Z.M.K.N.K.K.N.R.R#e.9#j.R.M.9.8#t#k#g#s#g#v#k#m#t.R.R.M.Y.R#e#j#m#v.9.M.Z.9#h#f.E#h.9.N.9#h.R.L.L.R#f.D.D.R#h.R.M.9.8#y#2#2#g.9.R.D.t.c.b.#.G.3#wac.V#x.8#P#h.C.N.G.9.S.N.R#h.E.u.N.t#J#Q#A.Z#4#x.j.c.c.h.C#g#g#g.8#D#G#g#O#w#w#1#g#2#E#M#O#G.9#g#Z#Pav#1#g#1#1#M#M#P#D#s.8#E.8#s#G#s#P#1#P#1#1#Pakas#9#P#9akaFanaTana6axaKa0bMbmbmbmbMbobMbobMbDbMbo", "a1blblbmblblblbMa1a3bla3blbmblblblblbMbMbka9aVaIaVaVaVaVa9ayaIavavatag#t#t#t#k#s#G#PagaHaIa7avalatavavavaUaIaUavaUaUavaIawaUaUawavalalaUalaSaSaSalawaUaUaUawawaSalaIaXaUalaUatasaHasasaHavaUaVbfaVaVaV#7#7#MataIbiau#F#M#7#M#7#MakaVaU#7#7agacb#b#b#aZaVaIawaUaHaTaIbfaVa9a9bkbkb#bkaZa9a9ayb#bkaZaZa9bkbkaZaVaIaVaIaIawaIaJaIaIaIaIaIaIaIaIalat#1#1ak#P#M#M#D.9.Y.K.F.D.N.K.9.S.M.R.9#h#D.9#g#D#v#g#G#D.9.8#g#M#w.9.R.R#h.9#m#h.8#h#g.9.M.R#w#D.S.L.R.9#e.Z#g#v.8.9.R.t.F.S#h#H#x.S.Z.0.G.M.8.8#x.9.t.t.B.t.c.t.M#h#g#J#w#R.M.c.P.N.k.G#x.H.M.H.g.k.L#y.3.9.M#h#h.k.c.t.N#y.8.U#P#y#Dak#P#g.8#E#J.R#kan#A#D#k#w#1#x#w#E#w#D.8#f.8#g#w#k.Z#w#P#Z#g#M#P#Z#P#y#M#Y#P#1a.#1akakananaFanaka6aKaKbhb.a0bmblbmbmbMbmbmbmbmbm", "blaOblblblblbla1blbmblbma1bla3a1blbla3bBb#bkaVaVacayaVaVayaYaIavavakat#M#D#v#m#v#M#PasaTavaIaUavalalaUawavaUaIaUavalaUaUavaSaSavaUaUaUalaSalavaSawa7awawaJa7a7awaUaRaVaUaUaUatasaDatagataUaIaVaVaVbia7#9#7#WataVaIat#7#7#7#9#M#7#9a7aV#M#7agaKb#b#b#a9aVbfaIalaHaHaJaVaVaVa9b#b#bnbBb#a9b#bkbBb#bka9bkb#a9a9aVaJaXaJaJaJa7aIaIaIaJaJaIaIaIaJavalauauak#9#G#M#E#e.Y.N.K.D.K.M.S.N.Y#e.9#g#v#g#g#v#g#E#D#v.8#v#k#g#v#e.R.M.M.R#x#h.R.M#k#v.Y.L#g#J#j.5.J.R.9.9#v#g#D.8.M.k.D.N.9#x#h.8#E.Z.N.M#P#y#H.9.K.N.R.D.k.t.G.E.M#h#R#Q.M.E.0.t.B#h#w.l.Z.R.t.C#taa#R.R.t.M.M.K.M.B.C.M.Z#h#P#y#m#Q#x#gai#Q#g#v#P#y#D.9#y#Q#y.9.Z#v#w#g.Z#k.8.Z.8#k#g#P#y#P#Z#w#P#w#M#M#M#P#1ajakakavaIaFakakaTavaIaKaKb.b.bMbMbababmbmbmbmbmbmbm", "a3blblblbaa1a3blbaa3blbmbmbmbmblbmblblbMa1bMa9aVaJaIaVaVaVaVaIaIavatak#9#W#D#t#t#MasajajaHavava6alajavavaUalavaUalajatalaSavajalaSalaHaSajaSawaUawaJaJa7a7aXaXbfawajaHaIa7aHaRaHasasasataUa7bfaVaVbiaVagag#7aHbfavatas#M#7#Mag#7asaUa7#M#7asayb#aZaZb#aVaVa7aHavava7aIaVaVa9bnb#b#b#bkbkbkb#bnaya9ayaZbkbka9aXaVaVaXaVa7aIaJaJaIa7aIaIaVaIaIavaTak#1#9#M#M#E#v.Y.N.K.B.B.K.N.K.K.N.9.R.9#m.9#h#D#E#g#D#D.9#t#E#h#m#j.R#j.R.R.R.M.J.9#f#v.9.R.R#y#u.K.K.R.M.R.Z#m#g.R.J.K.K.N.9#h#w.Z#x#s.N.N#2#O#H.R.L.9.9.K.D.D.S.u.R#h#4#y.R.O.J.N.t.9#g.l.8.9.M.8#xax#J.R.B.t.J#k.9.Y.Y.8.G.M.8#y#Pak#w#m#2#g.Lakaa#D#g#Mak#y.9.M.M#f.8#k.8#D#E.8#f#D#P#0#Z#Z#M#M#D#G#w#M#P#1aj#Pa.akalaa#1#PakaIa6aVa6bhbzb.bababmbMbabmbmbmbmbobM", "blbmblbla3a1bmblblbmbaboblbmbmbla3blblbMa1bMaZa9aIaVaVaVaVaVaVaVaVaTalatas#M#W#M#MakataHajaHajatajalatajaUajaHaTalalaUaUaUalawaUavajaSavaSalawaSaUawaSaSaUaJaVaXaXbfaIavaUaJawaSaSasasatawa7aVaXaVbzbiatatat#9aHalasatas#M#MaHbcasasaH#9#7ataZa1b#b#b#aVaVaIaUavaIbfaIaVaZb#b#b#a1a1b#a9aZa9bka9bkbkaqaqbAaZa9bkbfaXaIawaUavawavaXaIaIaIaIavaUakat#1#9#M#W#E#e#j.N.K.n.K.N.K.9.S.S.S#e#j#h#x#g#v#h#E#w#P#G#g.8#t.9.8.9.R#f.M.9.9.S.K.R.9.9.8#M.7.G.C.M.R.K.R.9#f.9#G.9.Y.R.R.M.9#Q#2#3#Q#h.0#h#..9.M.9.9.S#h.u.M#v.D.F.U.G#x#h#h.R#R.M.9.R.R.8.R.M#g#g.O.H.L.S.9#k#w.8.R.R.M#t#O#w#x#P#w#xak#O#M#R.9.Zaxaa#1#k.M.M.M#h#g#j.R.R.8#E#E.9#k#g#Mak#P#F#Z#g#D#s#Dag#P#0akalalavavakakakakakalaTa6bha0bMbabMbabmbmbmbobmbmbm", "blbablbmbla3boaOblblbla3bmbmblbmblaObmblblb#b#a9aVaIaIacaKaVaVaVaVavaUajasag#M#7#Z#0asatatajaRajajavaRajaUaHalaRalalalavaUaSaUaUaUaUalaUaUaUaUaHawaUajatawaUaXaXaVa8bgaUawbfaUalaUasataHa7aVaVaVaVaYa9aUata7#7ataHasatatag#Mauasai#1atasaiataZb#b#b#b#b#aVaVaIa6avaVaVaZa9b#b#b#b#b#a9ayb#bkb#b#b#aZb#bkb#bka9a9aVa7ava7ava7aIa7aXaJaJawaIa7avaHakasas#M#v#v#j#e.K.K.K.K.K.K.9#j.S.R#j.9.9#v#v#g#v#g#v#O#w#E#w#x#D#h#m#h#w#t.L.J.B.N.C#h.Z.Y#w#E.M.L.J#e.9.R.9.R.R#h#h.R#m.9.J.8#h#Raa#M.0.S.F.U.S.S.9.R.N#h.J#h#h.t.c.k.k#K#xaa.9#x.M#E.Z.Y.R.O.M#g#g.E.H.9.M.8#g#P#y.9#v#t.8#h.M#H#H.9.R.Uanan#J.8#h#Q#x#h.9.R.Y.B.M.8#e.M.N#D#g.M.R.Z#k#y#y#G#w#P#M#M#M#F#0#1asajakakataFakakatas#1aka6aVbzb.bMbMbabmbabobpbMbpbobm", "a1bla1blbmblbma1bmbmblbmbmblblbmblbmbma1b#b#b#aZaVaIaIaVayaYaIaIaVaIaVawavavajatajagagagasataHalaHata.asatajatatataUaTawaSawaUawawalawawbeaJaUawaUalaUalawaUaXbfaXaXa8a8aXbfa7aUaJalaHavaIa7aXaVaZa9aVavaJaI#Xasala6asaHatag#P#7asaSavasataUaZa9a1b#b#a1bkaYaVaUaUaIaVbkb#b#b#aZaYaZaZb#a1bkaZa9aZa9aya9aya9aya8aXbfaJaIawaUawaIa7bfaJaUaUawaUavav#1ag#t#v#G#j.Y.N.v.v.K.K.N.M.R.9#h.9#m#h#m.8#v#g#x#g#g#w#G.8#v#h#v#h.9#h#h#h#h.M.0.U.S.M.S#g#h.9#g#A#g.8.8#g#g.8.J#e#D#g#g.U#E#M.9#Qak#Z.K.n.v.D.N.t.J.J.9.Z#w#1.M.D.c.k.t#A#g#j.8#w#w#g#A#g.Z.C#w#1#t.9.H#h.8aI#O#A.M.9.R.P.C.R.9.t.M.L#mav#A#x#H.R.9.U.R.9.9.N.L.N.9.S.J#m#D#f#h.9.R.R#w#w.8#t#G#Fa.#P#Z#M#Z#Pa.aj#0#Pakak#1#P#M#0aUaTa7bibMb.babMbabmbabMbabmbmbm", "bmblblblbma1bmbmblbma1bma1bmbmbla3bla1a1bMbMb#bMa9aVaIaIaKaIaIacaVaIaIaIaIawalaSavajataDatajajavaUajatajatajajaHalalaHaUavaUawaHaHawa7a7aJa7aUaUalaRalaSaUaJaXaXa8aXa8aXaVaXaJa7avaHaSa7aUaIaXaVa9a9aZaJaIaI#YagatavaDaHaHag#9#ZagaUawatataIaZaVaZb#a1b#b#aVa9aUaIaVaVb#aZb#aZaZaZb#aZaZayayayaya9a8b#ayaya8aXaVaVaXaIa7avalawa7aIaIaUaGalaSawaUaHas#Z#m#s#v#j.N.K.K.n.v.K.9#j.S.9.9.9.9#j.9#h#g#h#D#h#G#x#M#m#h#G#w#E#t.9.U#h.R.N.R.9#e.L.L.8#h.S#g#g.M.9#w#w#H#g.L.R#w#g.U.9#w#P.U#gaban#m.n.n.v.D.k.R.9#h#g#3#2#h.H.b.k.i#H#y#H.R#x#g.O#h#1#h.E#J#4#g.V.E.O.8#5#g#g.Z.9.9.N.C.U.o.N.C.RaF#R#x#1.9.R.9.9.R.9.9#j.M.Y.S.S.M.8#g#g#G#f#f.9#Z#D#D#g#G#P#3#1#1#P#M#M#Pag#1atak#1as#1#Pata7aVaVbzbMbmbMbpbobMbpbpbMbobobM", "a3bmblbla3blbmbla1blblbma1bmblbmblblbma1bMa1bMa1a9aVaVaIaIaIaIaIaIacaIaVaIaIavavalavatajatajalavalalatataHatalaUaSaUaUawa7aIaUawaHa7awaIbfaIaUaHaRaRajajaUaUbfaXaXa8aVa8aXaVaXa7aJaUalawa7awaVa8b#a9a9a8aVaJagarasaUa.a7aTas#M#7agava7aHaHaIaZaYb#aZbMb#b#aVa9aIaUa7biaZaZaZaqaZaZaZayaKaVaVaVaYaVaI#5avavaIaIaJaVaIa7avaUalaUavaSaUaSajaRajatajat#Z#G#k#k.8#k.N.K.t.D.F.N.S.N#d.K.S.S.S.9.9.9#h#h#h#g#h#x#x.8#E#w#x#h.9.9#x.9.R.M.J.7#t.8#k#g.8#e#x#h.t.B.F.U#w#x#h.9#h.R.Y.8#x#H#M#h#J#2#h.E.k.o.v.k.9#h#P#2aI#2#x.K.t.#.c#4#Q#g.R.V.U.E.R.3.M.k#x#R.9.o.h.u.8ao#P#g.Z#e.R.K.k.N.t.u#h#1aoav#J#g.8#w#h.R.R.9#m#g#h.R.9.9#j#v#H#x#m.7#Mag#1#E#Z#P#M#P#1#P#P#w#M#F#M#y#Paka.#P#PasakaHa6aVbgb.bMbMbabmbobabobobabobpbm", "bmbma1a1bMbmbmblblbmblbmbmbmbmbmbmbmbmblblblbMb#a9aVaVaVaIaVaIavaIavavavaIavavaIaIavavaUavaUa7avaUaTavavavaRaSavaSaSalalaUawaUaUavava7a7aIa7aHaHatasatatawaUaXaVa8a9a9a9a9a8byaXbfawaUa7aXaJaXaVbkaVa9a8aVa9ataraga7ava7aIat#7agasavaVaIaHalaVaZb#aYb#aZb#aYbzaVaIaVbiaZaYaZaZaKavak#9#v#M#E#D#v#v#v#f#G#P#1avavavavavaUajatatasasasasasasagagasag#D#v#j#v#G#g.N.K.t.t.D.K.K.S.9.9.9.9.9.R.9.S.9.S.9.9.R.M.9.8#h#G#x#O#H.9.9.9.9.9.R.N.R.8.9.R#h#f.Z.L.K.S.M.R.0.9.M.S.M.O#g#g#y#A#2#P.M.U.U.M.D.c.v.N.8#w#R#5ao#P#x.R.t.b.n.V.8.V#h.8#y#H#g#y#h.O#g#A.M.d.c.H.9#w#1#1.8.M.J.D.t.i.c.R#yak#R#h.9.N.S.S.N.D.S#h#v#G.8.9.R.Y.M#h#w#w.9#h#Q#Q#Ranak#2#Pak#g#D#g#w#M#g#g#v#g#F#w#O#PasakaUbfaVbibzblbMbpbmbobMbpbpbMbpbpba", "bmblblblblbla1blbla1blbmblbmbma1bmbmblbla1bMbMblbka8aVaIaIaIaIaIaIavaIaIavaIaIaIaIaIavavaUavavavavavaSaHaHajalaSalaHalalaUaUaUawaUa7aVaIaUavaHaUataSataHavaUbfaVa9bkbka9a9a9aXaVaXaUawaIa7aXbfa9bka9a9a9aXa9ataDaHaIaUaIaUat#7asasaTaIaIava6aKaVb#aybMaZb#aZb#biaVbiaZaZaVaYaIaH#9#7#G#W#D#D#D#D#D#D#g.8#m#PacavaIavavalatajajasasasas#Zag#Zag#9#M#D#t#f#v#F#j.M.K.j.t.t.D.L.H.J.J.K.N.N.S.S.9.S.S.9.9.M.Y.9#D#G#x#x#x#h#h.R.R.0.S.N.N.R.9.R.E.N#w#w.M.J.M.R.R.9.9.N.E.u.M.U#g#w#Jav#M.B.S.w.R.D.c.t.D#gak#Qakab#J#g#h.t.b.k.G.W#2#1#w#x#H#w.R.9.9#g#A.M.t.e.N#g#Pan#1#v.M.H.t.d.k.u#h#h#H#4.R.N.S.B.t.D.t.D.9.9#h#h.9.M.9#j.9#G#y#h.9.O#x#y#Q#1#P#P#3#w#D#v#k.8#k#k.Z#v#G#M#M#M#PajaHa6aVbgbMbMbmbMbabNbMbpbobabobpbM", "bBbmblbla1blblbMa1blblbCa1blblblblbla1blbMb#b#b#a9aVaVaIaJaIaIaJaIa7aIaIa7aIaIaIaIaJaIaUaIavavaUavavalatalaHavaHavavaUaUavaUa7aUaIaIbfa7aIa7aUaUaUaUavavaUaIaVaXaVa9b#bka9a9aVaVa7a7aUaUaJaVaXaVa9a9a9aVaXaVava7aJaUawalawatasasatavawaIaJaIaVaVaZaVb#aZbkbkbBbzaZaZaZaYaKaTas#9#9#G#M#G#M#M#Z#O#Z#P#M#m.9#xaKaKaYaIaIaUakatasasatasag#Z#7#M#M#M#M#t#j#e#t#D#f.N.K.t.n.t.t.F.D.t.t.D.F.F.N.S.S#e.R.S#e.M.9#h#y#P#O#h#h.U#h.9.9.9.R.K.N.R#h#x.D.D.9#g.R.S#t#E.9.J.J.N.K.t.D.M.U#1avac#P.J.H.E.S.D.k.k.k#yak#H#2an#J#g#y.D.k.g.2#2#Q#2#h#h#h#h.H.K.S#h#R.G.i.k#j#w#P#4#3.8.R.L.k.c.c.H.R#w#R#Q.9.9.S.j.B.t.k.n.N.9.9.9.S.9#v#x.9.9.9.R.M.M#h#y#P#H#P#1#1#M#g#t.R.Y.M.8#j#D#F#E#g#D#M#1ata7aVaVbzblbMbabmbmbabpbpbMbpbpbo", "bla1bmbmblblbMbMa1a1bmbmblblblbla1bla1a1bMa1aZbia9aXaVaVaJaIaIaXaIaJaIavaIaJaJavavaIaJaIaIaIavaUavaHaHaHaHalavaUavava7aIava7aJaUavaXaVaVaVaJavaUaJa7aJaJaUa7a7aXaYaZb#b#aZaZaVaVaXa7aIaJaIaIaXa8a9a9aZayaXaVa9bka9alaSaUa5awaHajasavata9aVaVaVaJa9aVa9a9aZaZbkb#aZaZaVaTasasak#P#M#g.Z.O#t#E#g#M#P#Z#O#O#v#haaaMaZaZbiaIa7avatajajatatagag#7#M#t#t#j#e#m#v#k.K.D.t.n.j.j.k.j.n.j.k.t.t.K.M.M.S.R.K.M.Y#e.R.9#x#h#x#G#h.8#h#h#x#x#x.R.M#h.Z#e.9.J.M.R.M.9#h.U.9.M.8.9.N.D.h.k.J#haoay#J.8.8.M.t.k.D.e.s#1ak#1avayan#w#h.c.c.g.k.M#x#g.Z#Q#y#h.G.G.E.3#x.h.h.#.U#g#R#2av.8#k#x.h.h.t.H.R#h#g#y#w#w#t.k.D.t.k.k.D.K.K.K.J#m#g#m#e.M.M#x#Q#Panaaakanavak#P#P#P#M#D#t#v.9#v#E#D#v#s#M#PajaIbia9bkbMblbMbMbmbmbMbababMbabMba", "bBblbCbBblblbla1blblbMbBblblblblblblbBbBb#bka9aZaVaXaVaJaVaJaXaVaXaJaIaJaJaIaIaJaIaIaIaIbfaIavawaUaSalaHaUawawaUavaUavawa7aJava7aJaIaXaJaVaVa7aIaIaXaVbfaIa7aXaVa9aZbkbnb#bka9aVaXaJaUa7aJaIaXa9aZa9aZa9a9aVa9bkaVaIawaJaIawaUalaDa7ala9aIaXaVaVaVaya9aZaZbkb#b#bBb#aVasakat#P#O#g.9.L.E.9#M#M#O#P#Z#O#P#G#h#2azaqaZaZaVaIaJaIawaHaUaTasasag#7#D#D#k#j.Y.M.Y.K.t.B.k.k.j.k.n.j.k.j.k.n.E.K.M.R.S.M.M.M.9.8#h#w#w#O#x#w#g#g#x#H#h#h#x.O#g.9.Z#h.M.R.9.R.R.M.M.R.8.9.R.J.t.t.J.M#x#4acak#g.Z.R.D.u.D.c.u#Rak#5aYaKac#h.M.t.g.b.D#h#A#w#x#Q#x#h.U.S.J#x#x.N.h.#.8#g#2#1#R#w#g#H.t.u.d.t.H.9#w#Jak#P#D.k.s.k.l.h.B.K.R.9.9#x#P#x#x#h.9#h#h#1aa#2akanananaaauak#P#w#E#D#t#s#Z#O#Z#w#ZasaUavaVa9a9b#bzblbmbmbmbmbNbobobabpbM", "bBbmbBbMa1bmbCbmbmbmblblbmblblblblbBa1a1bMbBbka9a9aVbfbfaXaVaXaVaXaXbfaIa7aJaJaIbfaXaIa7aIa7a7aUavawaUa7a7aJaIa7awavaUaUaJaUaIa7aIaVbfbfaVaVaVbfaIaIaVaVbia9a9a8aYa9aZbBa1bBb#a9a9a7aIa7a7bfa9bkb#aZbka9a9b#aZa9aVaVaJaVa8aJalatagaUavaVaXaJaIaXaVayaVaZb#b#b#b#b#aVakasau#1#1#P#G.N.s.n.1#o#R#2#1#P#P#P#O#E#HaLaqaNb#b#aZaZaVaVaIaIaIalal#1#9#7#W#f.7#f#v#D.K.B.n.k.j.j.t.k.k.k.D.F.K.D.K.M.M#e.9#e.R#k#g#O#y#P#y#x#1#y#g#h#x#h#h#h.S.9#h#G#E.8#h.9.9.L.R.9.9#j.9#k.9#m#j.J.M.8#Paa#P#v.9.M.E.F.J.M.8akaIabaZaZao#w.9.t.h.#.E#xan#A#H#Q#H#H.N.J.J#2.3.D.h.k.9#y#1aaab#2#O#P.D.k.t.D.9#P#Rakaxalal#g#M#v#h#h.9.O.G#j.8#x#P#G#e#h#E#j.9akaa#Haa#2akakakananaF#1#O#Z#P#1#1#1#0asa.asat#1avbfbybzbMblbmbmbobMbpbobobobobM", "bmbmblbmbmblblbla1blbmbmbBblbmbBbmbmblbBbMb#bkb#bka8aXaXaXaXa8aVaXaIaJaXa7aIaIbfaXaVaJaIa7aJaUawaUaHawava7bfa7a7awa7aJaIa7aJaJaXaVaVaXaVbfaVaVbiaVaXaVbia9biaZbkaZaZa9blbMa1b#b#bkaVa7aJaUawa9a9aZa9bkaybka9a8aZa9aVaIaXbfaVaRaj#0awa7aXaXaVaIaIa9aXaya9aZb#aZbkb#aIasau#1#1ak#2#y.N.g.p#.#o#Raa#2#P#1#M#G#h#x#6aMb#aNb#b#b#biaVaVaIaIalatau#9#M#v#k#e#v#M#m.B.D.n.n.n.k.k.j.s.t.K.K.F.K.J.N.M.R#k#j.R#t#y#P#1#1#P#P#Q#x#g#h#g#G#h.9.Y.S.9#h#v#w#Q#x#O#v#k#g.9#v#E#x#g#g#h.8#g#1#1aF#y#g.8.M.t.D.u.Z#wakaIaYaZaZak#g#g.D.k.b.D#gab#J#Q#H#R#H.R.M.R#Q.U.k.h.k.8#P#Qaxab#1#w#w.F.t.n.F.9#J#1#Aacacax#g#y#Q#x#g.9#j#e#D#D#M#O#O#w#v#x#G#x#2ak#Pal#2al#1#1akanaa#O#Z#P#M#Patak#P#P#Pagai#1bfbfbibMblbMblbmbmbmbobobMbNbobo", "blblbmbmblbCblbmblblbmbmbmblblbmblblbBbMb#blbzbkbkbgaVaVbfaVaVaXaJa7aXa7aVaXa7aIaXbfaXa7aJaUawaSaUaSaUaUa7aJa7aJa7aIa7bfaXbfaVbfaXaXaVaVaVbfa9aVa9aVaVa9aVaVaZbzb#bkb#a1b#b#b#b#bka9aVa7aJaUaVa9a9b#aZa9a9aZaya8aVa9aVaVaXaXalajaDaUaUaJaVa9aJaIaXaVaJaya9b#b#b#b#av#1au#1#1#R#1#G.K.r.N.1#n#2aaaa#Pai#M#G#G#GamazaNb#b#b#b#a9aYaVaVaJakak#1#M#M#W#e.Y#v#h.Y.N.K.n.n.n.j.s.k.j.t.t.D.D.D.J.Y.Y.R.9.9#f#D#P#P#P#y#g#x#H#w#x#M#h#D#x#v.9.R.Y.9#g#P#1#P#y.8#g#H#g#E#w#v.R.V.9.R#Haaax#4aI#P#g.R.E.t.A.8#yavavabavay#P#w#P.C.k.k.E#wax#2#J#A#Q#J#h#x#w#H.R.k.h.k#g#O#1anaz#R#P#H.F.t.t.u.R#2akakaZaV#4.U#x#h#g.9#g#E#v#t#E#1#1ak#P#h#v#E#g#x#O#Pak#3#1#y#w#H#Q#1#G#g#M#E#G#O#9#P#Zag#P#ZagaVbya9bMbMbmbMbmbMbNbMbMbNbmbmbm", "blbma1bmbmbmbmbmblblbCbmbmblbmblbmblbEblblblbkb#bkaVaXaVaXaVaXaVaJaXaXaVaXaXaXaVaXaVaJawaUalalaSaUaUa7a7aJa7bea7aJaUa7a7a7bfaXaXaVaVaVa8aIaVaZa9a9a9a9aZbka9bzb#b#bMb#b#b#b#a1bBaZaZbia9bfaVa9bkb#bkb#a9a9aZaVaVaVaVaZaIaJbgalaUa7aUaUaIaVa9ayaJaVaVa9aZbna1b#b#b#av#1#P#1aaak#P#g.9.D.D.I#n#4aaaa#P#1#O#O#v#E#6azazb#b#b.aqb#b#aZaVaIaj#1atai#M#D#j#e.K.Y.M.v.B.j.j.j.j.k.k.n.t.n.t.D.M#e.Y.R.R.M#j#g#M#Ja..9.R.K.F.D.S.8.9.8#h#g.R#E#k.9#g#w#Z#Q#w#Pan#1#y#P#1#x.M.R.9.N.R.D.O#Kac#R#P#P.8.E.n.u#gakaVaK#RaZa.#y#w#f.M.J.k.O#Rb##J.8#1#4#Q#2ax#4.M.k.g.c.h#x#1aa#w#Kanan#4.D.t.t.M#h#2anaKax#P.M.B.P.9#e.Z#y#P#P#y#1#3#P#w#g#k#g#w#M#O#O#P#G#G.9.S.Y.M.Y.M#t#g#M#g#E#Z#w#M#M#O#G#Eatbybzb#bmbMbmbMbDbmbmbmbMbmbobobM", "blblbmbCa1bmbla1bmblblbmblbBblbCblbBblbMb#bMbkb#a9a9aVaXaIaIaIaJaIaIaVaXbfbfaXa7aJa7aUaUaSalajalawaUaJaJaUaJaJaJa7aJaJaXaJbfa7a7a7aXaVaVaXaVaVa9aZaZa9bkaZaZaZa9aZb#b#aZb#aZb#blaqbkaZaVbibkaybkb#b#b#b#a8ayayaIacaVa9aVaVaValalawawaIaIa8aVaXaJawaXa9bka1b#a1bBb#akag#y#1#4#1#y#E.Z.L.n.p#n#2anak#1#H#P#P#O#xanaKaZaMb#b.b.aqaZaYavavakatatag#M#v#e.Y.Y.N.N.n.j.j.k.k.h.h.k.k.k.k.t.J.M.9#g.M.J.N.8#g#w#g#h.8.R.o.j.n.v.G.E.8.8#g.8.8#g#v#s#Pakaa#P#J#4#2#x#w#w#w.9#f.Y#e.N.R.R#wazay#g.9.8.u.u.l#walaZan#gaca.#3#P#g.Z.H.M.8#Rao#R#P#2ak#R#Q#R#J.t.n.c.c.hak#J#1an#J#5axak.K.v.n.M#haIabao#R#h.M.J.M#g.8#k#w#P#1#3#1#M#E#F#v.Z.8.8#wak#P#w#g.9.M.K.F.t.u.D.R.R.R#M#0#G#h#h.S.M#fasaIbkbkb#bmbDbDbDbMbCbmbCbobmbmbobo", "a1bmbmblbmblblblblbmblbmbla1bmbmbCbma1a1bMa1b#bka9a8bybfaXaVaXaIaXaXaJa7aJaJaXaXaJa5aJawaUalaGala5aJaUaUa7aJaJa7aJaJa7bfaJbfaVaJaIaVa9aVa8a9b#bkb#aZa9bkb#b#a9aZb#b#b#aZaZaZazaZa9aZaZbkb#b#aZb#b#aZb#b#aVayaVaVaIaXayaya9a9aJaUaJawaVaVa9aXaVaJaIaXa8a9b#bCbCbmbMala.#Z#2av#Q#Z#g#t.R.t.G#H#Q#2#1#2aka.#P#E#xaKaobhaZaOb#a1b#a9aYaIav#1at#1#9#G#D#e.Y.Y.K.N.t.B.B.j.j.t.l.t.k.t.t.F.M.M.R.8.M.L.M.8.8#g#g.U.H.D.D.k.j.j.n.t#g#x#x#g#w#G#w#w#2ax#2#1#y#w#P#x#w#w#x#g.9.8#g#g.S.S#haoaZ#2#1#g.Z.L.E#3acaKak#5#5alav#Y#g#h.C.D#Jan#4aVacak#4av#J#R#y.F.D.k.k.k#1#J#1aK#waxaKan.J.s.t.R#wabaZb##A#h.Z.9.R#E#g#g#D#g#gav#3#M#P#P#D.8#j.8#D#y.8#h.9.M.H.J.t.k.l.k.t.L.R#M#P#g#t.R.L.Y#taHa7aXb#bBbMbMbmbMbmbmbmbmbCbobmbMbm", "bmblbmbmblbla1bmbCblbmbmblblblbmbmbma1bla1b#b#bkbBbkbybfaVaIaVbfaXbfaVbfaIaXaVaXa7a7awa5aUaUaSaUaUa5aUa7aJa7bfaXbfbfaJaJbfaJaXaXbfbgaVaVa9b#b#bka9a9aZa9aZa9aZaVaKanak#Pag#9aiatatavaIaZaZb#blbMblb#a1b#aZaZaZaVaVaVaVa9aYa9aVaVaIavbfaIaXaXaVaXaVaVa8aZblbBbCbmbMak#Z#M#P#P#P#Z#M#M#E#k#k#w#Gagasalajak#O#kaFaKaob#b#blb#aZb#a9aYaIavakavatai#9#W#j#e.Y.Y.Y.R.K.K.t.j.k.k.k.t.t.k.J.M.7.R.8#j.M.M.M.M.M.G.D.j.k.d.b.h.k.n.t.H.F.D.U#D#t#x#x#x#Q#y#1akak#Q#P#P#x#w#w#x#u#G#m.Z#g#1aKaoacav#P.M.R.Makbiac#3aa#Ravayak#g.M.F.S#RavaKaZa1acaIabavayav.N.k.k.h.k#H#2aa#1#2aZaVaz#w#k.C#PaaaZaz#4#g.Y.M#e.9.8#t#w#1ak#2ak#1#2avaI#w.8.7.M.M.t.h.k.h.k.j.j.s.s.k.k.k.K.R#g#g.Z.Y.J.R#t#ObfbybBb#bMbMbMblbMbDbmbmbmbobCbmbMbo", "bmblbmblbCblblbmbmblbmbmblblbmbmblbmbMblbBblb#bkbka9a9aVbfaVbfaVaXaVbfbfaXaVaXbfaIa7aUawaHaUaUaSawaJa7beaXbfbfaXbfa7aJaXa7aXaXbfaXaXa8a9a9bkb#bkb#aZa9aZa8aVavavak#P#9#M#7agag#7#9atataIaZb#a1a1bMb#b#b#bkaZaVa9aVaVaZaZaYaVa9aVbfaJaVaVaJaVaXaIa7a9a9b#bBa3bmbCb#as#O#M#Ya.a.#1agag#Z#F#G#Z#M#1ajajal#1#F#favaKaYb#b#aNb#b#aZaZaVa6aUaHalalakag#M#m#j#e#j.9#j.K.D.t.k.k.k.s.k.C.D.M.M.M.7.Z.Z.M.L.M.F.D.t.t.d.k.j.d.k.t.b.k.N.N.D.9#w#g#g#w#2#4anaxaKaVaxan#2#J#x#P#H#y#3#R#w.8.VaKbhayac#3#f.M#k#1acav#Pavavakay#5#w.R.S#h#g#1aob#b#aZaoavaZaZax.M.j.t.k.K.9#g#P#R#2aoaZaZ#h.S#faaacaYax#Q#j#t#D#m#k#E#w#M#1akak#w#P#1#P#w#1#M#h.9.N.t.g.c.g.j.j.n.j.j.j.s.k.C.D.S.R.M.L.Y#k#Gatbhbibib#b.blblbmbmbMbMbmbmbmbobmbmbo", "blbmbmbmbmbmbmbCbmblbmbmbmbmbmbmbma1bMbMb#b#b#a9bka9bybyaVaVaXaVbfaXaXaVaXaXa7aXa7aUaUaHaHaRaHaUawaJa7aJaXa7bfaXa7aXbfbfaJbfbfbfaXaVaVaVa9a9aya9a9a9aVaIak#P#t#v#s#D#t#D#M#P#1#2aTaTaUasakaFb#a1b#a1bMblb#aZa9aVaVbiaVaKaYa9aVaVaVaIaIaJaIa8aVa7aIaVaVbka1bBbCbDb#ag#s#k#g#0#0a.a.#Zagaf#0#Z#1a.aja.a.#D#e#DaVaKaYb#aqb#b#b#aZaVaVaTaHatatakatak#9#k#j#k#v#k.7.F.K.t.k.t.k.k.t.o.H.8.8.R.Z.M.M.G.M.d.h.c.c.h.#.c.h.h.c.k.D.t.l.k.k.R.Z#g#x#g#w#g#3an#5ababab#P#x#yabazaqad#Saqb#ay#3axb#aZaKaj#s#PavaYaIaaakacayaZak#1#s.Z.8aya1bDa1bma1aZacaVazak.R.K.u.C.9#G#E#1aIanak#5ax#G#D#ZanaIanak#3aaakan#2#3#Qanaxanacananan#P#E#l#t.R.R.M.t.j.k.c.h.k.h.k.s.t.k.t.k.j.r.k.t.K.L#e#O#PataVbiblblblbmbmbmbmbmbobMbobmbobCbmbo", "blbmbmbmbmbmbmbmbmbmblbmbmbmbCbmbmblbmbmblbMbkbkb#a9a9aVaXaVaVa8a9bgaVaXaXaXaXaXbfaUaUaSatalaHawbeaXbfbfaJaXaJa7aXaXbfa7aJa7a7aIa7aIaXa8aXaXbkbkbka8aJa.#D#v#t#t#D#F#E#t#v.9#x#1aaacaIavauakb#bMblbmblblb#b#aZa9aVbzaVaVbkaZaVaVaVaVaXaXbgaVa9aVbfa8aXaZbBbmbmbmbl#1.8.8.8#Ma.#1a.asa.#Zaga.ajasaja.#0#v#e#PaVaIa9b#b#aZaZa9aZaVaVavataTaUaTakak#9#t#V#D#E#v#e.M.E.t.k.l.d.h.t.t.u.M.8.Z.Z.M.M.o.u.h.c.h.d.h.h.l.d.c.h.D.d.h.d.g.b.o.9#h.8.8#I#1akanacaZ#R#x#Paaaxab#2#y#J#J#Q#oakaZb#b.blb#aU#1alanaVaaanav#5#P#1aj#1aVak#1blbDb#bmbFbkb#b#ayb#ay#g.Z.J.Y.8#g#ZalalaFacaKbiatagaiaVaZaKaVaVaZaZaZayananan#1#1#4avakavaval#1.Z.M.R.H.k.h.#.c.h.s.h.t.t.u.B.t.k.c.g.k.j.K.L#j#ZataTbibzbhbmbabmbmbmbmbmbMbmbmbmbmbmbmbo", "bmblblblbmbmbMa1bMblbmblbmbCbmblbmbmbBa1bkb#b#bkaZa9a9bga9aVa9aVa9aVaXaVaVbfbfbfaIaUawaRajaRaUaUawa7aJaXbfaIaXaXaXbfaXa7aJa7aJaJbfaJaXa9aVa9a9ayaJaIak#t#s#D#M#M#Z#M#D.8.8#g#k#D#F#1akaxalaiacb#blblblb#b#b#b#b#aVaVaVaVaZa9aVaVaVaIaJaJaVaVaVaXaVaVaVb#b#a1bma1bM#1#s.7.Z#F#I#I#0a.a.a.a.#0a.ajajag#Z#f#yavacaVaVbkb#b#aZa9aVaVaIatajakakakas#P#9#P#M#v#l.8.8.B.C.t.k.h.c.c.l.k.u.H.H.D.E.E.E.u.u.h.h.c.c.c.c.c.c.t.t.d.l.c.c.#.b.b.F.o.F.R#g.8#1#R#2.2#h#P#A#Raa#Q#x.R.R.M#h#x#papaea1bla1aZaVaVaZaZaVacaVaIavavavacaa#I#Pb#b#a3bbbDbDbmb#aybkac#g#f.M.J#l#P#w#PakayacaVaVaIaVaVaZb#aqaq#L#K#B#B#B#S#R#4#2anaKanaoazak#2#1#g.R.E.h.c.h.c.k.j.k.j.t.u.B.t.B.h.h.h.h.s.B.Y.9#PakanaZaZb.b.b.blbMbmbmbMbmbobCbmbmbmbmbm", "bmbmblblbCbmbCbmbBbmbmbmbmblbCbmblblbla1bMbMb#bkbMb#a9bgaVaVa8aVbfaVaVaVaVa7a7a7aUavaUaSalaHaHawaUa7aJaJbfaXaXa7aJaJaJaJaUa7awaUawaIa7aXaVaVaJaVav#F#g#0#1a.ajajak#1#w.k.u.H#Pavaa#2#M#O#P#1avaVb#bmbla1b#a1a1bkaZaVaVaVa9aYaYa9a9aVaIaIaVaZaVaIaIaVaVbkblblbmblb#aF#G#e.M.R#g#O#P#Pag#Z#w#M#P#P#M.8#fakaIaVaXaVa9bka9a9ayaVavavavaHatajatakakag#M#t#t#D#F#v.M.L.D.k.k.h.c.c.c.h.c.c.c.l.t.u.u.u.l.d.l.l.o.u.o.u.o.u.l.h.c.d.k.k.k.l.k.J.J.J#t#h#D.R.D.K.9#D#O#P#P#M#w#P#O#w#A#y#D.R.U#4aqbla1bMa1b#b#aVax#4axaVaxaaaVavanb#a1a1bNbrbFbDa1bCaca9acak#P.8#w#w#P#0#1aVavaVaVb#bBblaqaZan.9#f.9.8#k.8#f#k.Z.R.M.H.o.o.H.8#g.8.R.N.D.t.h.k.t.t.J.J.J.J.Y.Z#e.J.B.t.t.k.s.s#e#k#D#M#Palb.b.bhbabababmbmbabmbmbmbmbCbobobobm", "bmbmblbla1bmblbmbmbmbCbmbBbmblbmbmblbCblblbMbMb#b#bia9a9bibgbgaXaVaVbfa7aXaIavavaUaUaUavaSaHaHaUaUaUa7a7a7bfa7aVaJaXa7aUaUalaUaUavaUata7aJaVaJaVaj#t#ga.alavavavakak#x.k.h.uakacaoacaj#F#w#MakavaYa1bCbMa1b#b#b#a9aVaVaVaVaYaZa9aZaVaVaVaVbiaVacaVaVaVb#b#bla3blb#an#M#j#e.M#j#g#g#w#M#w#M#O#P#g#s#f#Fa6aVa7a8bkbkayb#aVaXaVaUavaHatakasakatat#1#Y#F#s#t#v#j.Y.D.B.j.g.h.h.c.h.h.k.k.u.t.t.t.u.d.d.l.i.l.u.o.u.E.E.o.u.u.d.l.u.u.J.M.Y#e#f#f#M#P#P#h.K.R#M#Pa.akav#3akak#y#g#w#J#1#Z#E#h#x#Ka3blbma1blaZaKaIaZax#1avaYacb#blblbFbbbFbrbDboa1b#aZaI#1#1#P#M#P#Y#1akaIava9aZbBbDb#b##A#g#w#M#g#y#1#1#1#1#9#7#D#k.M.t#k#x#g.R.M.M.C.C.J.J.Y.Z#f#f.Y#e#s#v#f.Y.L.K.K.t.k.E#h#F#EagataTbhbMbabMblbmbmbmbmbmbmbmbMbmbDbobmbo", "blblbmbmbBbmblbmbCbCbmbmblbmbmbmbma1bMblblblb#b#bMb#bka9a9aXbfaXaIa7aIaIaIaUaUaHaHatalalaHaHaHatataHaHavaUaUaUavaUavaUaUaHajatatatatasaTaIbfaVal#E#E#PajacaKacaIax#2#h.h.d.t#4#5abaYaK#P#E#v#D#1acb#bCbmbMa1b#bka9aIaXaVa9aVaVaVaYaIaVaVaVaKbiaKaVaVaVaZb#blboblblaVau#Z#E#k.M.Y.M.M.Z.8#k#l.8#k#Mava6aIa7a9bka9a9a9ayaJalaSa.aRasasajalaSaTat#1ag#g#s.8.R#e.L.D.B.n.n.j.k.c.c.c.b.c.g.k.h.k.h.h.c.h.l.E.L.Z.7.M.H.M.M.L.Y.Z.M#l#E#Z#P#I#P#0avaval.9.J#w#3awayayayabac#n.w.h.G#Aabalatak#P#k#xaob.boa3blb#aZaxaKaYaxaZb#bmbNbobrbrbrbrbbbNbbbmaZaIavaI#1#P#g#Za.akaVa9bDbEbmaI#R#Zavav#w#g.W.W#o#4abab#5#5#5#3#g.M#v#1ak#1#w#j#s#v#g#Y#G#F#Z#F#g#D#P#1as#P#Z#f.J.J.L#kas#1asata6aVbibhbMbmbabmbabmbmbmbmbmbmbMbobobmbo", "bCbmblbmbmbmbCbmblblblbBbmblbmblbmblbCblblbla1blbBb#bza9a9aVaVaVa7aIaVa7avaUaHalaHalaHatatajaHaHaHataHaHaUajaHaHaHaSajatatataRajatatataUaIaYaYau#D#M#Pakaxacanax#5#J.9.j.j.k#4acaKaVay#1#Z#D.9#wanb#a1bBa1bMbkb#a9aXaXaXaVaVa9aZaXaVaIaIaVaIaYaVaVaVaVa9b#blbmbablaKan#Q#O#F#f.Y.7.7.Y#j#f#l#ZakaFaIa6a7aVa9bkb#a9a9aXawalaSata.atajataUalaj#1#Z#M#t#k#e.R.M.J.K.K.k.j.k.t.k.k.j.k.k.d.h.g.c.c.c.h.h.l.M.8.8.8#f#f.9#k#f.8#E#F#y#P#1#1akalaIaVayaX#h.J#IalaIayaVayac#4.V.o.d.d.WabaYaxak#1#Z#j#HabbobobmblblaYaZaVaZbDbaa3bbbrbrbrbHbrbbbbbNbmb#aZ#1#1#1#y#s#Z#2avbkb#bCbla9#Ra.aIavav#A.U.H.U#a#4aoayaI#5avak#g.M#h#1avavak#P#1#1#3#1#P#1#1#P#P#0a.atatak#P#t#f.Y#t#Dag#PagaHaxbhblblbobabmbabobobmbabpbobmbobobmbMbo", "blbCblblblbCblbCbmbmbBblblbmbmbmbCblblbBblblbMbMb#b#bkbka9bkaVa7aIa7aJavaIaUaUaHatatajatajataHatajatatatatatatatatasasasatataHaHataSaHaTaVaVbhan#F#Y#PaaaxaKabaIax#1#v.t.d.k#4#4axababak#9#D.R.8#1b#bBbmbMa1a1b#bkaXaXaXaVa8a9a9aVaIaIaIaIaxaVaVaxaVaIayaZb#blblblaZaxau#1#9#D#t#k#t#v#D#P#1ana6aIa7a6aVa9bka9b#bkayavawaUaJaUasataRajaUata.asag#M#k#f.7#e#e.Y.J.K.t.s.t.B.k.k.k.h.c.c.c.b.c.c.c.#.h.l.8#G#w#E#D#s#M#w#M#w#P#1akav#J#RaIacacayaVaI.9.N#Pav#5ayaZayao#K.G.d.d.l.Vababaoaw#3#1.9.G#Hblbbbbbmbob#bib#bDbDbNbrbrbrbNbrbrbrbbbrbrbDb#b#av#5#P#P#g#P#3aVb#bCbBb##5a.avaIav#3#w.R.v.0.2#KaoaoavaIavav#y.R#h#2aZaYax#Q#Q#1#1#J#1#1#1ak#1#1alalak#0#Y#F#v#k#Magas#Z#Pata6bhbmbabmbmbmbobobobNbabpbMbpbmbobabobo", "a1bBbmblbmbBbmblbCbmbCbma1blblbCblblbla1bMa1a1bkb#aZa9a9a9aXa7aJaIavaUaHaHajatatalaHaHataHataHatatajasasasasasatasasatasasaRaRavaUa7aIaVbibzbiaK#P#Z#1avanaIaxaIak#y#t.B.t.E#RaI#4aI#5ak#P#t.L.M#GaVaZbBa1bCb#a1a9aXaVaIaXa9a9aZa9aIaXaIaIaIaVaVaVaIaIaIaVaZblb#b#biaKananaTaFatakakatakakaHaTaTa7aVa9bka9b#a8ayaJava7aUavaUatalaRaRajaRa.a.ag#Z#D#k#f.Y.Y.M.L.E.K.K.D.t.B.D.j.k.k.h.c.c.h.c.l.l.l.H.M#t#w#1ak#0#w#y#w#w#w#w#P#P#1#5akaIayaZb#b#aX#m.M#I#3aJayaZaoac#R.o.h.h.h.yabaoayacav#3#g.M.Eaba3bNbbboa3a3bba3brbbbrbbbrbrbrbrbrbrbrbba1a1aZak#P#1#Y#Pa9bMbBa1bCaKa.#1alaVay#5#3#g.G.t.w.V#baoaoakav#R#1#w.8#D#2aZaZaZaxaIav#1#1#1#0#1#P#1#1avaIavavaH#Z#Z#Pa.at#0#Maga7aVbzblblbabMbmbobobabpbMbMbobababobobmbm", "bMblbCbCblbmbBbmbmbCblbCblbCbmblbCbBbmbBblblbMb#bkbka9a9aVa9aVaVa7aUalatakatajataHatajatataHaHatatasasasasasasasasaRataRatataUava7aIaIaVb#bMbiaYai#h#Pakavavavakak#w#F.J.K.M#1akak#Ralak#M#t.L.7#gaIa9b#bCblbBbBb#a8aXaJaVaVa9bka9aVaXaVaIaXaVaZaVaIavaIaKaYb#aqaZaKaKaxa6axaIanaTakaFaHataTa7aVbfbkbzb#aZa9aVaIaJa7aJaIaUaUawaHalajatagagag#M#M#t.8#e.L.L.L.J.K.J.J.t.t.K.t.t.t.k.k.h.h.d.l.i.t.o.G.9#y#2#2av#1#P#P#w#g#E#w#P#P#J#5aIazaZb#b#b#b##D.M#Aawavacayac#4#n.i.h.c.l.8#RacayaIaIaI#w.M.o#nb#bbbbbNbobNbbbbbrbrbrbrbrbrbHbrbrbbbrbbboa1aZ#1#P#1#1avblbDbmbmbD#P#ya.avaYaVav#3#g.G.t.G.T.2ababakavak#3#h.L#Gakb#b#b#aYaoaxakav#1#P#M#M#w#PavabaIalalas#PataHa.#M#Z#1aVa8bzbza0blbmbmbobMbNbobpbNbabobobobobMbp", "bBbBbmbmblbBbmbmbBblbCbmblblbCbmblblbCblblbMbMa1bBbkb#bka9a9a8a7aJavaHatatatatajatatasatatatatasasasasasasasasasatataSatataUaIa7aVaIaVbib#blaZbiaa#D#Zaaalavakakak#P#Z#e#j#g#1#3avakaj#1#M#k.L.M#taxa9bBa1bma1bMbkaVaXaIaXa8a9aZa9aXaVaJaIaIaVaZa9aIavaIaIaVb#aZaYaYaKaxaxaxaKaIavaIaTaIaVaVbiaVbzbkaZa9aZa9aVaIaIavaUaUalalaUaSaHatasasagag#M#D#t#e.7.Y.L.Y.M.L.H.E.K.K.u.t.B.k.t.k.k.k.k.t.u.t.n.J.R#P#1#2#2#3#2#P#G#w#w#w#1#P#3aaanazb#b#a1a1b##O#j#Aav#3av#5ac#R#A.o.d.c.E.V#R#Rac#5avac#g.G.D#hazbobNbrbbbbbbbbbrbrbrbrbrbrbrbrbrbrbrbra3aOaZak#1akaIaybDbmbmbDa1.8#g#1avayaI#5#3#w.R.t.D.w.V#4#5avacak#2.8.L#MaaaOaOb.aZaKaxaKaYav#P#g#g#M#1avaVaIavalajaHavav#1#Y#M#1a7aVa9bzblbabMbobobobmbobMbmbpbMbMbobobNbM", "blbBblblbmbBbmblbmbBblblbBbmbCbmblblbBa1blbma1bMbkbka9a9a9a8bfaJa7aUaHatatatasatasatasasasasasasaiasagasasasataUaUaUaUaIa7aIaVbfaVaYbia9b#b#b#bzaK#F#D#1akavavakaj#Pas#Z#M#1ajakaFakat#P#v.R.Y#j#tavaYb#bCbma1bCb#a9a7a7aXaVa9aya8aXaVa7aIaJaXaVaVaIaIaIavaVaZa9aVaVaxauavaxaYaZaZaZb#bMb#blblblblb#b#bibyaVbfaIaIaIaUa7a7aIaHatatajasagag#7#D#F#t#k#k#f.R#f.L.M.L.E.J.J.E.t.t.u.E.J.E.E.L.J.u.J.J#f#v#1akananak#1#M#w#h#g#g#J#1#R#4anaZaqb#bmblblak#E.8#P#R#1#1#3#3#A.N.E.E#y#Jak#R#5#5av#R.M.G.D.R#RbobobbbpbbbbbrbrbrbrbrbrbrbrbHbrbrbrbrbra3b#axak#3aKb#a3boboblak.J.9#y#RalaIak#3#A#g.Z.t.H.8#1#1akav#3#w.M.Lakaxbma1b#aoananavak#P#w#y.8#t#ZavaVaVaIaIa7aIaIaIalas#1alaVa9bzbMblblbMbobobobobobMbMbpbMbMbpbobabm", "bMbmblblbmblbBbmbBbmblbla1bmbmblbCbBbmbBblbCblbBb#bibza9bgaVaJa7avaUavaHaSajatasatasasasasasasaiag#9asagasatataUa7a7a7bfaIaVaVaVaVa9a9b#b#b#b#aZbi#9#v#y#1akalakalasag#1#Zasatakakajak#M.8.M#e#k#DanaVb#a1blblbBb#a9aIaJa8aXa9a9a8aXbfaIaXaJaVaVaVaJa7awaIaJa9aVaVaIaTataTaIaYbib#b#b#a1b#bla1a1bMaZbiaVaIbfaIaIa6a6aIaVa6aUaHataDasasaf#7#Y#F#W#t#D#s#f.Z.M.L.M.H.H.J.J.E.E.u.J.u.E.J.M.M.M.M.M.Z#D#Pakavavak#R#1#x#g.R#g#h#P#P#2#4aKaZb.aqbaa1boaIag.8#g#3#J#J#J#R#P.8.R.Z#J#1#3avac#5al#1.Z.D.D.R#Hbba3bbbbbbbrbrbrbrbrbrbrbrbrbrbrbrbrbqbpa3b.aa#1akaZb#bobba3b##y.K.R#gav#3avav#3#3#w.8.M.Z#g#J#3#3#J#P.8.L#eaxaZbmblb#aoaKaKaIav#1#M#h#j#v#MavaIacaIaIaIaIaIaval#1asaTbga9bzblblblbMbmbMbobMbobpbpbmbpbpbobMbMbp", "bla1bCbmbmbmbMa1bla1bmblblbla1bmbBbBa1bmbBbmbBbMb#bka9bfaVbga7aJa7aUaUataSaja.asa.asagagagasasasagagasatataSalaUaUa7aXbfaVa9a9a9aVa9b#bBb#b#b#aZaZa6#P#t#w#y#3akak#1a.ak#1a.#1#1asas#P.R.N.K#t#V#WakaVaZb#bMbkb#aZaJaIaVaXaVa9a8aZaXaVaXa7aJaVaXaVaXa7aJa7aJaJa7aJaSalavaUa7aVaVb#b#b#blb#b#bkbiaVa7aUaIbfaIaIaIacaVaIatajaU#1agagarasaragar#M#Y#M#s#F#l.M.7.M.H.7.7.H.H.H.u.E.E.L.J.L.M.Z.Z.8#v#g#Y#1alakak#Rak#R#w#g.8.Z.8.8#F#Oakak#1abaNaOb#aOaZaH#s.O.U#J#3a.#1#I#w#g#Ia.#3#3#5#5aw#3#g.H.t.E.L#hbmbDbDbNbrbbbbbrbbbrbrbqbrbqbqbHbHbqbHa2aOaZaaakaxb#boaObNbNay.8.M.M.9ak#3#5#5al#1#A#y#g#w#w#J#3#y#w#g.M.M#Fayb#blb#b#acaIacan#2#h#h#k#G#M#PacaVaYaZaVaVaIav#1#M#G#ZauaVa9bzbmbDbCbMbmbMbobMbMbobobobobMbpbMbabo", "blblblblbCbmblblblblblblbmbBbBblblblbmblbla1bMa1b#bka9aXa8aXbfaXa7aUavavalatasasasa.asagag#ZagasararasataUalaUaHawaIbfaVa8bya9a9a9aZbkbMb#bBbMb#bzaVaT#C#v#g#H#P#Pajatasa.asas#1a.#O#g.Y.M.Y#m#7#MaTaYaZb#b#b#aZbkaXaIaIaJaVaya8a9aXa9a7aXbfaXaVaXaXa7a7aJaJaJa7awajataHaHavavaVa9b#b#b#ayaYaKaIa7aUaIa7aIa7a7aIa7a7avalaHalasagagagag#0arasaf#Y#M#F.8.Z.Z.Z.G.7.G.H.7.H.o.7.E.H.E.E.E.Z#f.8.8#s#g#w#P#3akakavav#3#Y#g.8.8.8#w#P#1#3avaoaoaoazaOa3blaY#G.8#k#A#J#P#I#P#w#Y#w#Rakav#5av#R#A.8.D.t.H.M#ha1a1bbbrbbbrbrbbbrbrbrbrbrbrbHbHbHbrbrbba1aMal#1aYaZa3aObobman.O.N.H.R#A#3ak#5ala.#w#F#F#w#w#I#1#A#g.Z.M#k#OblbDboa1azayaYa9an#1.8#k#g#Z#PataVbiaZaVaYaVaVaK#w#M#Magaka9a9bMblbzbMbmbMbobMbobobmbmbmbobNbMbpbpbM", "blblbmbmblblblblbBblbCbmbBbmbmbBbmbmblblbBbla1bkb#b#a9bgaVa9aVbfaXaUaUalaRajasasagagag#Z#PagasasagasasataUaUawavaUa7aXaVaXaVbybia9a9b#b#b#b#bla1b#bibi#M#e#k#M#P#P#1#0#0#Z#Paga.#1#g.8.M.Y#j#D#9aiaTaVaZaZb#b#aZbkaVava7aIaVaVaXaVaVa8aJbfaXaXaXaVaXbfa7aJa7a7aUaUatatasataUaUaJaVbka9a9aVaVavalaTaUa7a7a7aIaIaUavavaUaUaUaHatasaDasaDasatas#0#M#F#D#s.7.7.M.H.7.H.H.H.H.7.H.o.E.E.L.7.Z.8#s#s.8.8#w#Pakakavavak#3#I#g#k.Z.8#w#1#1#2#1#1#4aoazb#aNbobl#1#D.8#g#A#y#J#J#I#A#Jak#5alakavak#g.R.t.D.N.M.Ub#bmbDbbbrbbbbbrbrbrbrbqbrbrbqbHbrbrbrbqa3blaxaFaYbla3a3boa3#2.9.N.N.F#h#J#1#3#1#J#I#y#g#Y#Y#P#P#g.M.E#k#Oavbmb#blbmb#aZayac#A#g#f.8#s#Z#1akaVanaIacavaIaIal#Z#MataUbfbzbzb#blblbmbDbMbmbobDbobobMbNbmbmbpbmbmbp", "blbmblblblblbla1blblbmbmblbma1bmblbCa1bBblblb#b#b#bzbza9a9a9aXbfaVa7aUaSajatagagagasag#Z#Z#Zagagag#PagasalaUa7aIaIawavaVaXaVaVa9bia9aZb#b#bBblb#bMaZaVbia6ag#f#k#j#E#w#x#P#x#G#g#e.Y#f#C#D#9aTbfbJa6aVaVbiaZbiaZaVbfaIa7avaIaIaIaVaVa9a7a7aXaXa8aVbfaXa7aJa7a7aUaUatataDasaRa5a7a7a7aJa7aRatatawbfbfbfbfbfaVbfbfa7aUaUatasaDaDatatataSatagag#0ag#Z#t#l.Z.M.7.7.o.o.o.7.7.7.L.J.7.J.7#l.8#g#M#M#g#F#P#1#3ak#3avavaj#0#Z#w#k.8.9#g#g#g#P#2axaoaMa1bobpa3aZan#P#j.R.O.W#w#A#A#J#R#R#R#R#A.O.E.t.F.0.0.K.YaobMbobrbrbrbrbrbrbbbrbrbrbrbrbrbrbrbqbqaOb#biaKaYbmblboaOb##G.9.N.N.F.N.P#w#J#1#I#P#A#y#y#w.U.8.H.M#jataxbibmbDaZac#R#A#g#h#x#h#D#wagavavaIaZaYaVaxaIaxak#P#v#DakaVbibMblbmbmbmbmbmbCbmbDbobobNbNbMbobobobMbmbo", "blbmblbmblblblblblbla1bmblblblblblblblbla1bMb#bMbMb#biaVaVaIbfaJa7a7awaHajatasagas#Z#Z#7#9#7#Zag#ZagagasatakaUaIa7aUava7aXbfbfa9aVa9aZa1bBa1bmb#b#blaZaKbfaI#O#t#e#j.Z.8#m#h.Z#e#e#t#v#9auaHa6aVbhaIa6aVaKaVaVaVaIaxaIavaTaUa7aVaVaVa9aIaIa7bfaVa8aXaXaJa7a7a7awaSataDag#0aRaSaUbea7aJaUaSalaUaUa7ava7a7aVbfaIa7aUaUaUataRatatalaHalatas#0agas#P#G.8#k.Z.7.E.H.7.o.H.7.Z.7.7.7.H.Z.Z.8#g#D#g#F#w#F#Pa.#P#1a.a.akaj#P#1#Z#k.Z.O.8#g#g#g#1aaaaabb.aMbobbbmaKav#m.L.M.M.M.U#g#x#H#A#n#h.O.u.k.t.N.P.S.K.RaKa1a3bbbbbrbbbrbqbrbrbrbrbrbrbrbrbrbrbraObhaYaVaZbla3a3b.bh#v.S.N.N.F.K.D.R#a#y#w#w#w.V.O.Z.M.E.Y.M#kaxaZbMb#b#ayaZaZ#1.9.R.R#e.8#EalaVaZbibiaZaKanakak#1#M#E#MakaxaZblbMblbmbmbMbmbobDbMbDbMbMbMbobobobMbobMbo", "blblbmblblblbla1blblbmbmblblblblblblblblblbMb#bMblbkbia9bfaVaJaUa7a7aUaHataja.agag#M#7agagagagag#ZagagasasasataUavaUawaIa7aXaVaIaVaVa9bkblb#bMa1b#a1bzaVaVa6aTai#M#s#k#k#k#k#t#t#MaiauaFaHa6axaVaKa6a6aIa6aIana6aUavaTaUavavaIa7aVaVbia7a7aJaJaVbfbfbfa7awaUaUaSalaRasafagasajaSaJaJa7a5aJa7aJa7aJaUaJaXa7aIavaUaUaHataSaUaUa7avaUakajaDa.a.#1#Y#D#l.8.M.M.L.H.H.7.7.Z.7.Z.H.H.H.E.M.7#l.8#s#w#Y#w#0#P#0#Z#P#3avaIa7aI#1#s.8.Z.R.8#g#h#h#y#H#2#4#4aNbabob#az#M#k#e.K.F.H.M.S.O.0.O.G.D.t.t.D.N.N.N.L#eaxb#blbbbrbbbbbbbrbbbrbqbrbrbrbrbqbrbqbra1aZaVaKb#blboblaOaK#t#e.N.K.E.E.t.l.G.O.U.U.O.G.E.u.u.K#k#v#PaVblbmbmb#acaIax#g.8.8#j.M#D#1alaVaKaKaIakanak#1#9#G#D#m#MavaIaYb#b#blbmbDbmbmbmbDbMbobobobobobMbobMbobmbm", "bla1blblbla1b#blblbMblbma1bMblbma1blblblblbMb#b#a9aYa9a9aVaIavaUavatajajasasasasagagagagasagagagagagasagagagatataUa7aJavaUaJaIaXa7aXa8aZb#b#aZbkb#b#bkaZbiaVa6aIaUa6aIa6anaFaFananaTaUaUaJaVaVbibiaVaxaValakavaTaUaHatavaUavaIaIaVa9aZa7avawa7aVaVaVaJaJawavaRa.aRajasagafagasaGaRa5awawaJaXaXaXaVbyaXbfaVa9aIaUaUalaSaSalaUaIavaH#Pajak#3#1#D#k#s#s.8.Z.M.Z.H.H.7.H.7.7.G.u.E.o.u.o.E.7.Z.8#F#F#Y#Z#Ya.avaJaVaJavavaJ#3#1#M.Z.7.R.O#g#w#g.Z.M.F.G#KadbpbpbpaYaTas#v#j.N.N.L.N.F.F.D.J.Y#f#j#m#k#t#e.7#1aZb#bbbbbrbbbqbbbrbbbrbrbrbrbqbrbrbra3a1aZb#aZaZb#a1blazan#e.Y.R#e.R.Y.Y.H.E.E.E.E.t.D.K.L#f#W#1aIaVb#a1bkayay#P.8.Z#f.7.M.9.7#MalaVayaVayak#1#D#g#v#t#s#g#PaubhbiblblblblbmbmbobmbMbobmbmbCbmbmbMbobmbMbmbmbm", "a1blblblblb#b#blbMblb#blbMblbma1bMblblblblblb#bMb#a9bibibfa7aUawaHaHatas#1agagagagag#ZagagagasasasasasaDasa.asajaRaHavalaHalaJa7aXaVaXbkaZbna9b#b#b#b#aZbkb#aVaIaIa6a6avaTavanaHakavaIaVaVaVbzbzbiaVaIanataiaTalaTatauaUavaUa6acaVbiaVaIava7aJaVa7aXaIaIaJaUaRaDataDasafag#7aDaRaUbeaJaJbuaXa8bfaXaVaJaJaIbfaUawaUaSawava7aval#0#Za6alak#1#M#w#F#D#k#l.Z.Z.M.o.7.G.E.E.E.L.E.o.u.u.u.E.M.Z.8#g#ya.#P#P#JalacaIaIaVaVaVava.#0#s.Z#f.8#h#g#v.8.R.M.v.G.Va1a1a1a1bMbiai#M#j#f#e#f.Y.M.Y.R#v#v#F#D#v#v#m.8#QaKa1bbbbbqbrbbbrbqbrbrbqbrbrbqbrbrbrbDb#aZaZaZaZb#b#b#aY#2.Y#e#k.9#t#j#e.S.L.N.Y.L.L.L#e#jagaTbibMbma1b#aY#5#J.8.9#f.L.8.8#j.R#PavaVbkaZayaIaIa.#w#s#e.S#j#PaHbzbMbmbablbmbobmbmbobmbobmbDbmbmbmbmbobmbobmbobM", "blblblblblblblbMblblblblb#blblblblblb#aOblb#b#b#b#bzaVa7aIa7avaHatatas#1asasas#1asagasasa.atatatatatajatatatalaRatas#1atalataHaUa7aXayaya8a9a9aZb#b#bkb#b#bkbkbka9bibgaIaVaIaVaJaVbzbkbMbMa1b#aYaVaVaIasasagauatakas#1aHaHalaTaxaIaVaVaVavbfa7aIa7a7aVaIa7avaRatatagasaCag#7agarajaUaUa7avaUa7aJbfa7aJaIa7a7a7a7aIavaUaJavavaVaVavaIaTag#M#Z#F#D#D.9#k.L.J.J.M.E.J.J.H.M.7.E.E.u.u.u.u.t.B.E.D.G.M.O.R.L.Z#g#JalaIaIaVaVaVaVaj#P#s.Z.9.8.8#E#G#g#Z#1aa#1#z#4a1baa1blb#aVbfaVaIaTaUaUa6biaVaKat#M#E#t#m#M#2aZbbbrbqbrbrbrbqbrbrbqbrbrbrbrbrbra1b#aZa1b#b#a9a9aa#1#m.9#j#f#D#Oakak#9#9#M#Mag#9akalanaZb#blaqb#ab#A.9.Z.M.M#e.9.9#g#k.8#MaIaVaVaVaVay#g.L.D.B.J#g#y#1akaVbzbzbabobabobobmbobmbobFbMbobmbmbCbmbobobobMbobM", "blblblblblblblblblb#b#b#b.b#blb#blb#b.b#blb#b#b#b#b#a9aVaIaVaUajata.asasasasatasat#1asakasatakasa.aHaja.atajaHalatasasaHaSavalaUaJaJaVaVayayayaZayaqaZaYa9b#b#b#bkbkb#biaVa9aVa9bkblbBb#b#b#aZaVaKa6aUaiag#9atauatasaiaFalauavaIaxaKaKa6aIaIaIaVaIaVaIaJa7avatasatagagagaraBagasasalaUa7avaUaJa7aXa7aJa7aIbfaIbfaJa7aIaIaIavalasaTakag#M#Z#9#D#D#s#t.9.L.E.E.M.u.L.M.M.H.E.u.u.u.B.B.D.J.H.N.M.F.D.L.E.L.8#Mav#5aIaVaXbkaVaVaI#1#F#k.Z.8#k#g#w#w#h#xakanakavaKaza1a3a3bDbmblbMb#b#blbBbDbmbMaxai#Z#E#G#O#PaKbbbbbrbrbrbbbrbrbrbrbrbrbrbrbrbra1b#b#b#bBaZaVaV#P#x.R#G#h#m#Ga.aVaVaVaVa6avaIaVaYbib.bablb#ayab#1#h#f.8#l.Z#k.Z.8#t.8#Ma.a9bkbka9aVan#h#h.Z.H.J#e#h#Ga6bibMblbmbmbmbobmbobobmbobobobmbmbobMbmbmbMbobobMbo", "aOb#b#b#b#b#blblblblblblb#b#b#b#b.b#b#b.b#b.biaZaZaZaVaIaJaIaTatatatasagasasagas#1asasasas#1a.asajalaHatajatavaUawatajatavaUaUaHaUa7aJaIaJawa8aVaXaVa9aVaya8a9aZb#b#b#b#b#a9bkb#bkbBbla1bMa1aZaVaVa7avasaiagaiaiaiagaiauauaiaTaHaIaKaIaIaIa7a6aVaIaIaIaVaIa7asasas#7agagaragagasaRawaUa7aJa7a7aIaUaUaJaIa7aVaJaIa7aIaJaIaIaIaVaVatagag#7#M#M#M#E#g#f#e.M.M.M.E.C.E.H.H.t.t.t.t.B.E.D.E.J.N.M.M.E.J.D.M.M.Z#g#J#JakaIaIaVaVaVaIaj#w.8.Z.8.8#w#P#w#A#g#x#1#P#PaaabazaOa2a3bDbobobbbbbFbobobmblayaF#P#O#P#w#Maaa3brbrbrbrbrbqbrbrbrbrbrbrbrbrbrbobla1b#a1aVaIav#x#m.M#h#v#v#MatbzbBblb#b#aZb#aZb#aOblb.aNacak#P#g#l.8#F#g.8#s#G#l.7.Z#ZalaVaZa9av#R#P.9.R.C.J.R#G#QaFaIaVb#blbmbmbobobmbobNbmbmbmbmbmbmbmbmbmbobFbMbobobm", "blblb#b#b#b#b#b#b.blb#b#b#bzb#b#bibiaZaZbibiaVbhaKaIaIavataiasag#1ag#9#Zagagas#1asatatasas#1#1aHavanataFavaFavavawalaHatakatatajajatataRajaHa7avawaJaIavaIaIaVaVayaZa9a9b#blbMaZa1bBa1b#a9aVaVaIaJaUaUas#9#7#M#9ai#9ag#9#M#9aHaTavaIaKaVaIa7aVa6aIa6aIaIaVaJatatasauatasagasasasaHaUa7a7aJa7a7avaUa7aJaUavawaJaIaJaVbfaUaIa7alajagas#P#Y#M#M#E#E#D#t#k.M.M.M.C.D.J.B.l.D.E.D.E.K.M.D.E.i.t.t.D.o.D.D.D.k.h.d.E.O#wavaIacaIavaIal#I#g.Z.8#s#w#M#w#v#D#M#3#5aXayaVaYaVaZb.aObobbbobbbqbbbbbqbbaMaI#1#G#G#w#O#Qa2brbrbqbqbrbqbrbrbrbrbrbrbrbrbrbFbba1blbCaVavak.R.K.F.N.L#g#M#1aVa1a3a3bobmaOb#azao#4#Q#P#1#y#M#1#Q#y#y#h.M.Z.9.Z.8#OaVa9aZb#aIal#y.8.B.t.J.M#t#M#9ataIbhbabablbmbmbobmbobNbabobobobobNbmbMbobMbobCbobmbo", "bMb#a1b#b#b#aZb#b#b#b#aZaZaZbiaZbiaYaVaVaYaYaKaVa6avaUaUakatasagag#M#Zag#Z#9#Zagasataja.#1#1avak#1akavakaka.atajaHakaja.asa.atasasatatasatasajatajalalalajalalawaIaJayaya9bkaZa9aZaZa9aVaIaVaUaJa7avaUasasag#M#9ag#9#M#M#7asaHavavaIaVa6avavava7aIa6a7avaTavavatasasasasagagasasaRaUa7aIa7aJaJaJaUavawavaUaUaIaXaVaJaIaVaIaTa.asa.agag#M#M#F#D#s#t.9.M.R.R.G.u.t.t.u.t.D.E.u.H.N.H.t.t.t.t.t.t.D.F.t.n.j.k.u.D.N.U#R#4aI#RaIavak#1#g#l.Z#k.8#Y#I#I#3#1akalaIaVb#aMaNb#a3bmaObaa3brboa3brbrbpa3ax#1#F#G#Pavaza3bqbrbrbrbrbrbqbrbrbrbrbbbrbbbbbbbbboa1b#aYal#D.N.D.k.D.D.R#E#1aZbkbla1aOaNaqaqan#R#2ao#4an#x#y#x#x#h.N.R.M#m#v#t#YajaKaVbjayaX#1#F#t.7.M#f#t#G#PatavaVb#blbmbabababmbpbMbMbpbMbMbobmbobmbobmbobmbmbmbmbC", "b#b#b#b#b#b#aZaZbiaZb#b#aYaVaVaKaVaVa6aIaIa6aIaIa6aFalatat#Pagagag#Z#7ag#9agas#Pasas#1alat#1#1#1#1atalatajaHalalavaTalaHakakakatatasasasasatatatatataRawawawawavaJawavaJaVayayaVayaVaIavavawaUava7aUatasbcag#9#M#7#M#7#Mag#9akavaIaxaIaIaTaIavava6a7aIaIaIaIaTauasasasatasasaRataHaUaUaJaXbfaVa7awaUalaSalawaXaVacacaIavavaja.asa.ag#M#Z#M#M#v#k#k#e.7.M.M.D.t.t.k.k.t.t.D.u.F.L.D.u.C.K.D.E.D.F.J.t.t.k.t.D.t.D.M#g#yaI#5aIavalak#1#P#F#w#w#R#5#1aa#5ananavb#b#a1aMa1a1a3boa3a3bobbbbbrbrbra3aZan#P#1axaZbla2bqbqbqbbbqbrbrbrbqbrbbbrbbbrbbbba3bbbla1aVan#g.K.D.n.t.E.Z#E#1aYaZaZb.aoaoao#4ax#4akaaanan#1#O#g.9.R.H.R#g#D#s#Da.akaXaya9aZa8#P#F#w#O#w#E#MagaialaIa9blbmbobmbmbmbpbmbobobobabobabobmbobmbobmbmbobmbmbm", "b#b#aZb#bzb#aVaVaVaVaVaVbfaVa7avaHasauasasasaiagag#Magagagag#M#Z#9#Z#7#Mag#9#Z#9#Pakakak#1agagak#1aHanakata.#1as#1#1asauakatas#1as#1agasasa.atasatasatalalavawaIa7a7avavalaSataHatataSaHatajalaUaHaHaRagagagag#9#7#7#W#7#9agasataTaIaIa6aVaIava7aIaIa6aIa6aIa7aTasauaHalasakavaIaVaIaIa9aVaVaVaIavalatatavaIacaVayaIaIalalajatajaHajakas#1ag#Z#O#g#k#e.M.E.t.t.n.t.t.k.t.t.C.J.L.M.M.M.K.L.M.M.K.M.M.L.D.D.t.s.k.t.H.R#2anabaKaVaKavaj#0#P#g#g#g.8.R.M.U.O.8#Raxazbla3bobbbrbrbbbbbrbrbrbrbqbrboblbma3boa3bNbqbqbqbqbqbrbqbrbrbqbrbrbrbrbbbrbrbbbbboblaYav#h.D.D.n.t.K#e#E#PaIaxac#1#P#g#w#2#6axaxan#Raxaxak#O#O#M#P#9#M#1as#1avavabaI#1#3alaF#1#F.8#s#g#MagaIaVbkbMbmbmbabmbobobpbobpbpbobabMbpbmbmbNbobDbobobobobobo", "aZaZbibiaZa9aVaVaIavaTavaUaTaTaHaHatatasas#9agag#9#7#9#7#M#Mag#Mag#7#M#9ag#M#Pag#1akaiaiag#Pas#1as#1at#1asasasas#1#Pagas#1ataHak#1asasasatatatajasajatalalavavavaIaVaUavaHajaRatataUaUaUaUaUaSalaSaRataragbcaBagag#M#7agagagasatavaIaIaIa6a7aUavavaIa7aTaIa7a6aHatakaHakatakaJaIaIaVaVa9aVaVbfaVaUaUavavaIaIaVaVaIavavavavawavavavakas#Pag#Z#G#F#E.8.9.L.D.t.t.k.k.k.k.k.t.J.H.M.M.Y.R.R.M.R.9.R.9.R.S.N.D.D.H.K.E.H.9#2aaaIaYaYaYacaT#1#P#g.M.M.O.M.K#j.9#hakaoaZbla1bbbNbrbbbrbrbrbrbrbrbrbrbbbobNbNbpbpbpbqbqbqbqbrbrbrbrbrbrbrbrbrbrbrbrbrbrbqbbboaoaI#G.D.t.t.D.M.9#E#PaxaKaV#3aa#g#yanaK#4ababak#4aYaKaxanakaFanakananaxaVaxaYac#1#1#1#3#P#G#s#E#Y#0akaVaVbkblbmbobobobobobMbabMbMbpbobobobMbmbmbobobmbobobMbMbo", "aVaVaVaVa6aVa7aIa6aUaHatataHasasaragagagasag#9#7#Z#M#7#M#9#M#M#M#9#7#M#M#M#M#9ag#P#9#O#1ag#P#1ag#Pasasagag#M#Z#9#M#M#M#M#P#9ak#1ak#1aias#1asakasasatataHakavavataHaHaUaUavalalawalavavaJaUawalatalajatagagag#7#7agasasagasaBasataHavavaIaUaTataHakakaTava7aIaIaTatatauaFalavaIavaIaVaVaUavavaTavaJavaVaYaVayaca6avavavavavavalaka.a.#1#P#Y#M#D#g#s#k.R.J.t.t.k.k.t.t.t.N.M.F.N.M.S.9.R.9.9.9#h#h#g.9#m.8#j.9.8#j#g#g#v#h#1#1ananaxaYaKav#3#P#O#Z#g#g#E#1#1akaKaKayb#blbbbbbNbrbrbrbrbrbrbrbrbHbrbrbrbrbrbrbqbqbqbqa2bqbrbqbrbrbHbHbHbrbrbHbrbrbrbrbbbbb#aV#1.M.B.t.H.R#g#M#w#P#1#R#RakaaananaaabaKaKanaa#2#2#RaxaoanaKaKaKaxaKaYaKanavavaIaT#O#M#YatatavbfaVb#b#blblbMblbmbmbobobmbobMbobobMbobMbNbpbMbMbobmbpbMbobobM", "aVaVaVaVaIa7aIaUavaHaHataHatatasasasagasasasagag#7#7#Z#7#M#M#M#7#M#M#7#M#M#Mai#1#9ag#9agag#Z#P#9#M#9#1#Pag#9#M#M#M#M#M#9#9#P#1akalas#P#9agasasagasasasatasataHataHaHaTavaUaHalalaVaJaJaJaIaJaSavaSatajasasagag#9asasasasasaraiatatava6aIavaTauavatatavava6aIa7aTataiauavaTaUbfaIaIaVaIavaIa6aIaIaIaIaVa9a9aYaIaIavaIacakalakaval#1#1a.#0#y#Y#F#F#g.9#k.F.u.t.c.d.k.l.D.D.H.F.D.N.R#m.9.9.8.9.9.8.9#g#G#M#G#G#O#w#M#G#h#H#Aakan#5aKaYayacanalajak#1#I#PakalavaxaVaZb#a1bDbrbrbrbrbrbrbrbHbHbrbrbrbrbrbHbrbrbqa3bqbbbrbqbqbrbrbHbrbHbHbqbqbHbqbqbHbHbbbobmbzal.R.B.u.J.9#g#Makakakak#1#3akanaxaxaaakaa#2aa#Q#H#Q#RaKaoaKaVaxaIaxaxaxakanaIaUav#1#I#PataHa7aVbib#b#bMblblbmbmbmbobobMbMbNbobobobobpbMbpbobNbabNbobobobobo", "aVa6a7aTaUava7ava6aHatatasasasasasas#7#Z#9ag#9#Z#7#7#M#M#7#M#D#7#M#M#D#M#M#Z#Mag#Z#O#Z#Z#M#Z#Z#M#P#Z#M#M#Z#M#M#M#M#7#9#M#M#Magas#1#P#9ag#P#9#Pasaiat#1#1asakakaHalavalavavaSavaJaIaIaIaIaJavavalajatatagasagagasaDasasasagasagasata7aIa7a7awavatauaiataUaIa6a6aIaHatasaUavavaUaIaIaVaVaIaIacaIavaIaVaYaZaZaoavavavavavalalakakavalalak#1#P#M#G.8.9#k.R.t.t.k.c.c.l.t.t.t.j.t.H.N.S.R.S.R.8.R.Z.Z.Z#g#1ak#J#P#P#P#P#P#P#M#x#y#A#R#RabaIav#4ak#3ak#3akajacacavaYaZb#aZa1bbbbbbbrbrbrbrbrbrbrbrbrbrbrbrbrbrbqbbbqbrbrbqbrbrbrbrbHbqbHbHbqbqbqbqbrbqbrbrbqbbaZac#j.J.F.M.M#M#w#yavaK#1anacaIacacaVaVaKavan#P#g#g#x#H#Q#2#4anaxaxavakalaIacaIaIavatasag#1avaIaVaZb#b#b#bla1bmbmbmbobMbobobpbMbpbMbMbpbNbobMbmbmbmbmbmbmbobm", "aIavaUaHavaHasasatatasatasasas#9asasag#7#Z#Mag#M#7#7#M#M#M#W#D#W#M#M#W#M#Oag#P#M#M#D#D#D#D#M#Z#9as#9#9#9#9ag#9ag#9#9#M#M#M#M#M#Z#M#Mag#9ag#9#Magag#Pagasag#1#Pasatasa.atajavaIaJaIavavaIaJaIavawaHatatasasasatataHaHaRatatatagasasaIa7a7aIaJaUaUaTaIaTaTaHakavaVbfa6avaHatavacaVaIaVaIaVaIaIaIaIaVaYa9aYaKaKaIaVavaIaIabacaIak#3#1#1#P#1#Z#M#g#k.R.Y.K.t.k.g.h.g.g.k.h.h.k.k.D.D.D.L.N.U#g#g#g#w#M#w#Hak#2anaxaxaxanaaakak#1#1ak#1#g#P#1#J#1#Raa#3acaoabaKayayaKayb#bobbbFbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbqbrbrbqbHbqbHbHbqbHbqbHbrbrbrbrbqbrbDb##O#s.8.J#k#t#E#ZakavavavaKbla1bmb#a1bBb#b#b#aKan#E#t.8.9#t#M#x#PalaKaKbibiaVaxaIavaTaVaVaVbkb#blblbmbmbmblbDbmbobmbobmbNbobabMbNbabNbabMbNbNbmbobpbMbpbobo", "aIavaUaHalatatatasas#1ajagagagas#9asasag#7ag#7#M#7#7#M#G#W#D#7#D#M#D#M#P#9#M#D#D#D#D#t#D#F#M#9#M#Zagagagag#9#Zag#O#9#M#O#M#9#M#M#M#M#Z#Pag#9aiag#9#Magag#1asasas#1atatatalaUa7avavavaUaIbfaJa7aUaUaHaRatatatataSalaHaHaHaHaHatatataIaUbfa7aIavaUaUa7a7aUaUaTa6aVaIaIa7atala7aIbiaVaVaxaTavaTaVaVbia9aYaKaVaKaxaIavaI#4avananal#1#1#P#P#P#P#y#D#t#f.N.L.j.c.b.h.b.b.b.h.k.n.t.i.t.k.F.M#g#E#w#E#v#x#x#P#1#2aaanaxaoaxanaxaxanananak#F#g#1#2#2#1#2akacab#4avaaayaVaZa1bobrbrbrbrbrbrbHbrbrbrbrbrbrbrbrbrbrbrbrbrbbbrbqbrbqbrbHbqbHbqbqbHbqbHbrbqbrbqbrbrbbbrbmal#1#1#j.9#E#P#1acaIavaIaKaZaZbMbBa1a1a1b#b#biax#1#w#t#k#k#1aualaVaYaKaKaKbibiaVaIaVaVbkbzb#b#blbma3bobmbmbDbmbDbobobobNbMbobNbmbobobMbabobmbobabmbNbMbMbN", "a7aIaUaHaHatasasasasasasasasaiagagag#9ag#9#Z#M#7#M#G#W#W#M#D#D#7#D#M#M#7#M#M#7#D#D#t#D#D#M#M#M#Z#Magag#O#Z#M#9#Pagag#P#M#M#M#M#9#M#9#9#M#9agasaiasaiagaiatasasakatakaHavaTalavawaIaIa7bfaIaVaIa7avaUaUaRaHaRaHajalaUaUaHaHaHaHatatbfaIaVa7a7aUaHaUa6aIa6aVbfaVa6aTavaTakataIaVaZaZaVaTanaTaIaVaKaVaZaVaVaVaVaIavabacaIav#4avaaalak#1#P#P#P#P#w#v.9.N.K.j.h.b.g.b.c.h.g.k.t.k.k.l.k.N.R.8#g#w#w#w#O#P#x#H#P#2#5axaKaxaxaKaxaxaKaxax#2#PaaaFan#1#2axaF#R#2aaanaZb#a1bmbmbbbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbbbrbbbbbrbrbrbrbrbrbqbqbHbqbHbqbHbqbHbrbrbrbrbrbrbrboaI#3ak#E#G#P#1akaIaIaVb#a9aoaZa1bDbobobma1b#aZaVa6avak#F#GakaxaVbibiaKaxaVaKaxbiaVbibib#b#b#b#b.aObmbmbobobmbobDbDbDbMbobNbobmbobobobobmbobobobobobpbMbMbp", "aUaHaHatasasasaiagag#Z#9agag#9#7#7ag#M#Z#M#7#7#M#W#W#D#M#D#7#E#W#t#M#M#V#s#D#7#D#D#v#V#D#M#D#Mag#P#1ag#P#9#Zag#Pasag#Pagag#9#9agag#9#P#P#M#9asai#P#M#Z#D#Z#M#9ag#Pas#1avavaIaIaVavavaUaUaIaIaJa7aIaVa7aIaUavaUavaUaUavalaHavavaTaUaVa6aVbfaVbfa7a7a7aVaVbfa6a7a6aHaHauakaIaVaVaVaKaKaVaVbiaZaYaYaVaKaVaYaVaIaxaIanacax#4avan#2#1#1#1#1#P#P#x#w#G#h.K.K.k.k.k.k.k.k.t.k.k.k.k.k.t.u.H.M.9.9#v#y#P#y#y#O#1#2aaabaxaoaKaoazaZaZaZazazaYaYaKaoaKabaKanavaKaZb#b.aObla3bbbNbNbrbrbHbrbrbrbrbrbrbHbrbHbrbrbrbrbrbrbbbrbrbrbrbrbqbHbHbqbHbHbqbqbHbqbrbrbrbrbbbbbrbraZaVaZak#P#D#w#1axaZacaVaZa9aZbBa1bDbbbobDa1b#b#a9aZb#blbMbibib#aKaVaIaVaVaVaxaIaYaZb#b#b.aZaZaZb#blblbmbmbmbobobobMbobFbobobobMbmbobobNbabobobMbobobMbMbp", "aUavaUataiasagagag#9agatagag#9ag#9#7ag#M#7#M#M#7#M#D#7#M#7#M#W#D#M#M#W#F#W#W#D#D#D#t#t#W#M#Mag#Zag#M#Zagag#M#Pagasasagasasasasasaiag#P#Pag#P#M#Z#Mag#9ag#9#ZaiasagatagalavacaIava7aTalaUaIa7aIaIaVaVa8bfaIaIavaUaTawaUaUava7a7aUavbfaIbfa6bfbfaVa7a6aVaVaVaVa7a6aHaHataTaVa9aZa9aVa9bia9aZaYaYazayaVaKaVaIaxavacaKacaKaIanakakak#1#H#P#H#P#y#G#g#v.R.K.D.n.t.k.l.t.t.t.k.k.k.t.t.k.R.9.M.R.9#P#P#A#1#1#2#3aaaxabaoaoaYaZazazaYazbhaZayaKaZb#acaYb.b#bib#blblbabla3bNbbbbbrbrbrbrbrbHbrbHbrbrbrbrbHbHbrbrbrbHbbbbbrbrbbbqbrbHbHbrbHbqbHbHbqbrbrbrbrbqbrbrbbbNblb#bmaVaI#Pa.aaabaIaVayaVb#bBa1bFbbbNbNbNbFbma1bmbmbBbCbmblblblaZbiaVa6aVaVaVbiaZb#b#aNaZb#aZaZb#bMbabmbmbmbmbobobobmbMbobMbMbobMbobobobMbMbobpbobabNbNbo", "asatajakasasagag#9agagag#9#7ag#7#9#Z#7#M#7#M#7#W#D#D#M#W#t#V#D#7#G#W#D#D#D#D#W#D#t#D#D#D#7#D#D#M#M#M#Zagagagasasa.a.asa.ata.as#Pagag#Pag#Pagas#1asak#1#1#0as#1asajatalavaUavavavaIava7aUalaUaUaUaUatava7aIaIaVaVaVavaUaHaHaHavaTaUbfaVa7a7a7a6a7a7aUa6aVbfa7aHaHaHauataJa8aZaZbkb#aZb#aVaZaXaVaVaIaYaVaVaxaIaKaVaVaIaxavan#5#Rak#2#2#1#P#y#w#v.9.M.t.F.N.t.k.j.j.i.u.u.B.B.k.D.7#f#q#q#0a.a.#5acayayazazayaqaZb#b#blblb#aZaMb#b#aMazaMaMazaZb.a0aOb.aObaa3a3bobbbbbrbbbbbrbrbrbrbrbrbrbrbrbHbrbrbrbrbrbrbrbrbGbbbbbrbrbrbrbrbrbrbrbHbqbqbrbqbqbrbqbqbbbbbbbba3bbbNa1a9avalalacaya9bka1a1bobDbbbNbrbrbNbFbbbDbDbDbDbmbmbBa1bMblb#b#bzb#aZaZb#blb#b#aMaqaoaqazaqaNaObobobobpbobmbmbobDbobmbMbNbobMbNbNbmbMbobpbobobmbobo", "atatatasasasag#Z#9ag#Zag#Z#9#9#7#Z#M#Z#M#7#W#W#D#7#7#M#v#W#t#M#G#7#t#D#D#W#t#t#s#V#W#D#D#t#t#F#D#M#M#Z#0#Zaga.asa.ajak#1as#P#Pagasag#Zagas#1#0asajalatakatalajaHavalalaJaIalaUaJavaUavalaHaUa7aVaUataSaIaIaIaVa9aVa7aUaHataHasataHa7bfa6a7a6a7a6bsa6aVaVa6a7aHbdaiatavaVa9a9a9b#bka9aVaVayaVaIaVaIaVacaIaIaIaIaIaVaxananakavakak#3#1#1#P#x#v.9.9.M.t.n.D.N.K.A.c.c.j.B.N#e#F#Y#J#o.z.X.z.x.w#h.W#y#Qakakaaavan#4abayaoaKaqb#aObla1aqb#aZaMaZaMaZb.b.b.aObabaa3bpbqbbbrbrbrbrbrbrbrbrbrbHbrbrbHbrbrbrbrbrbrbrbbbbbbbrbrbrbrbrbrbrbrbrbHbrbrbqbba3bbbqbbbbbbbqbqbrbNbobmaYaIaIaVaVb#b#a1bDbNbobNbFbrbFbrbFbbbFbDbFbbbmbDbmbMa1blbMbMb#bkb#b#blblaOblaZaYazabaxanaxaKaOblbobmbpbobobobobCbmbmbmbobmbobMbobobobobMbpbMbMbo", "atatasasasas#9#7#Z#7#M#Mag#7#7#Z#7#7#7#7#M#7#W#M#7#D#W#W#D#D#7#9#D#t#D#W#s#V#s#V#s#t#t#t#t#t#D#k#Mag#M#M#Z#0asa.asasasasasagagagagag#PasakasataHalaUavavalalalatalataja7aJawawaVaIavaHaHataHa7bfbfava7aVaVaVbiaVaVaIaVaUa7aHatataHa6a6bta6bIbtaTbsbtaVa6bfa6atatatava7aVa9a9aya9aZaVaVaJayaVaVaIa6aVavaIacavavaIaIaKaIavaa#3akak#Q#1#P#w#x#D#j.S.L.t.D.t.k.t.F#d#e#h.V.m.m.a.i.o.u.u.t.l.C.J#h#w#A#a#J#R#5#5anaxacaYaKaKaZazaZaqb#b#a1aOblaOblaOaNaNb.b.aObabbbqbbbqbqbrbrbrbrbrbrbqbrbrbrbrbrbrbrbrbrbrbrbHbrbrbGbbbrbrbrbrbrbrbrbqbrbrbrbrbbbbbrbbbrbrbbbbbbbrbrbbbmb#aZbibiaZa1a1bmbobbbFbrbrbFbrbbbNbDbbbDbbboa1bobmbBa1a1blbla1blbmblblbobablaZaYaKa6axaxaKbhb.bab.babmbmbmbmbmbmbMbDbmbmbobMbmbNbNbMbobobmbobmbN", "agasagagag#M#7#M#7#M#7#7#9#7#7#M#7#7#F#7#W#M#M#W#M#M#W#W#D#7#7#D#t#W#D#W#t#t#s#V#D#D#t#t#t#D#D#M#M#M#M#Magaga.asasasatasas#Z#0asagatatatajajajakalavavajavaIaIavaVaVaIaIaVaIaIaIaUalalava7aVaVavavaIaIaVa6aVaVaKaVaZa9a9bibfaTaHatauaHatbdaFa6a7aTaTaHbsaHaHaFbsaUaVaVa9a9aZaYaVaVaVaVaVa9a9aXaVaVaIaIaIaIaIaIaIaIavanavanavalak#2#1#1#M#O#y.9.R.M#e.M.M.P.I.m.t.t.u.o.d.c.k.o.u.u.L.C.N#e#m#7agas#5acaKaKaZaZaZb#b#b#aZb#aZb#b#b#b#aZaZazazazazaMb.b.babmbpa3bpbbbpbqbqbqbrbrbqbrbqbrbqbrbrbrbrbrbrbrbrbrbbbrbbbbbbbbbbbrbrbrbrbrbrbrbrbbbbbbbbbbbbbbbbbmbabNbrbrbrbrbNbbbobNbobbbbbNbrbrbrbFbrbrbrbrbFbbbbbbbobbbobobDbCbmbmbobmblbmblbaboblaOblb.bhax#6axaxaxaoaZbzb.bha0b.bMbabMbmbmbDbmbmbmbmbmbobDbMbNbNbobobobo", "agagag#7#M#7#M#7#M#M#7#7#Z#7#7#7#M#M#7#D#7#D#M#D#7#7#D#7#M#M#t#t#W#D#W#D#t#t#t#t#t#W#D#D#D#D#D#D#s#M#Z#M#D#Maga.asaDa.agag#Zataja.ajalajalavaIaIaIaVaIaIaIaKaIaIaVaKaVaIavaIaIavaJawaVaVaVaVaVaJaIaIbfaTaIaIa9aVaIaVaZa9aZa9aUaTaTatatasbcaiaTaUbtaHbdbdaubdaHa6a6aVa9aZaZa9ayaVaVaVaXa8aVaVaVaIaJa7avaIavavavavaIaIavavavaxaaalak#1#1#P#y#G#k.O.9.P.U.P.K.k.c.u.o.D.t.u.E.J.Y.R#f#s#s#w#x#x##.4#iakaaavaxacaKacayaZaZa9aZb#blblblb.a1a1a3bab.b.b#aMb#blbaa3bpa3bpa3bpbbbqbbbqbrbrbrbrbrbrbqbrbrbrbrbrbrbrbbbbbbbGbbbbbrbrbrbrbrbrbHbrbbbbbbbGbbbbbbbba3bma1bpbrbrbHbrbrbrbbbbbrbrbrbrbrbbbrbrbrbrbrbbbbbbbDbDbbbDbobDboa1bDbobDbDbDboa3boa3aOaOblblaNb.bhaKa6#6aTaYbhb#bzblbza0bMbmbmbmbCbmbobmbobobCbmbDbobMbobobMbN", "asasagagagag#7#M#M#M#7#7#M#7#7#Y#M#7#E#7#D#7#W#D#7#D#W#D#7#M#t#W#D#V#v#D#D#W#D#D#t#t#D#D#V#t#t#F#D#M#M#t#M#Zasajat#0agag#0agaUaIaUavaUavaJaXaIacaIavavavavaIavalakalaIavavavaIaVaVa8aVaVaXaVaVaJbfbfaVaIaVaVa9aKaIaKbib#bkbzbgaVbfaTbdaBataBbsaTbsbsaubcaubdaTa7a7a9aZaZbka9a9a9aZa9a9a8aVaVaIaXaVaJaIavawaIavawavavaIanavavalak#1#2#1#P#M#g.8.8#h.p.F.d.u.o.l.k.D.M.J.7#k#g.U.U.I.G.P.O.W.W.W.W#h#n#2aa#5abayaVayayayayaZaZaqaqaqaqblblblbma3a3baa1b.aOa3bmbabobpbpbbbqbbbqbrbrbrbrbrbrbqbHbrbrbrbrbrbrbrbHbrbrbbbbbbbbbbbrbrbrbrbrbrbrbrbGbbbbbbbbbbbbbobobbbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbrbNbrbbbbbDbbbbbDbDbDbobbbobbbFbbbobNbbbmaOaOaOaOblaObma3bla3b#b#bMblbla0bMb.bMbmbmbobmbCbmbDbobobDbobMbMbNbMbMbo", "agagagagag#7agag#Z#Maf#7#M#7#7#M#M#M#7#7#M#7#W#M#W#D#W#7#G#F#s#D#W#W#D#t#D#D#D#t#D#V#t#t#t#t#D#M#F#M#F#M#Zasag#Z#0atalaHavavav#3alavakajakak#3a.a.a.#1ajajavaVaVaXawaIaIaJacaIaIa8aZbkaZa9a9a9a9aYa9aZaZa9b#b#aZaZa9b#b#aZb#aZbBb#aVbfa6bsaFaFbsaTauaBasaubsbfaVa9aZa9a9aZa9a9ayaVa8aVaIaXaJaIaJaIavaIaIawavavawaIavacavavavavakaka.#1#P#I#P.8.M.F.t.t.H.G.H.o.l.u.D.o.H.M.w.F.D.t.h.h.u.t.t.M.R#h#h#g#P#A#J#R#4aIaIaKayaVayayaYayaYaYaZaZaZaZaZaZaZb#b#b#bla3a3baa3bpbqbbbrbqbrbqbqbqbqbqbrbrbrbrbrbrbrbrbrbrbGbba3bGbbbbbbbrbbbrbrbrbbbbbbbbbGbba3bbboboa3a3a3bbbqbrbrbrbrbrbrbrbrbbbrbbbrbbbrbbbFbrbbbrbbbbbFbbbDbbbbbFbbbbbDbDbDbbbobma1b#aZaZaKaLanaxaKaWazbhaYaYaYaVaVbzblblbmbobobNbobobFbobobmbobobmbMbNbobMbo", "#7afafagafagag#7agag#7af#Y#7#7#Z#7#7#Y#M#W#M#M#D#W#7#M#D#W#W#s#W#t#D#s#D#W#D#W#V#s#t#s#V#s#D#D#M#D#t#v#M#Magas#1atatavavalava.a.ajata.#1ag#1akaka.akavavaIaIaIaIaIavavaJaIaIacaXaZaZa9a9b#a9aZaZa9b#b#b#b#aZaZaZaZb#b#aZb#b#b#bMaZbkbzaVa6btaFbdaFbdaBauaHa6bibia9a9aZaya9ayaVa9aYaVaVaXaIaIaIaIaJaJavavaIawavaIawaIaIavav#3akavajaka.#P#P#P.8.F.D.D.o.D.o.E.k.t.t.D.o.o.v.u.l.h.d.i.o.u.i.E.M.M.O.Z#h#w#w#1akaa#5#5axacaxaKaVaYaYa9aZaZaZaZaZaZaZaZaqb#aqb#aOa3boa3bbbqbrbrbrbqbqbqbrbqbrbqbqbrbrbHbrbrbrbrbbbbbba3a3bbbbbrbrbrbbbbbbbbbGbbbbbbbbbbbobbbNb#axb.a3brbrbrbrbrbrbrbrbrbrbrbrbbbrbrbrbrbrbFbrbbbrbbbNbbbbbFbbbFbFbobbbbbDboa3blaZb#bhaYaoax#4axaKaKaKaYbhbib#b#aZb.b.babmbFbobobobobobobFbDbFbobobobMbobo", "#7agag#7#7#7#7#M#7#M#7#Z#7#M#M#7#M#M#W#7#D#W#W#M#W#7#M#D#W#D#t#W#D#D#W#D#W#D#s#W#V#V#D#D#t#t#t#t#k#m#D#G#M#P#1#9#Pag#P#P#9#Z#Yagasasakavavaxa6avaUakakakajalavavavaIaVaIacavaIayaVaXayaya8ayaVaVaVaVaya9aXaIaVa8aVaVaYaVayaZb#aZa9b#bkb#b#bKaVa6aTauaBaTaVbiaVaKaVaVaKaVaVaVaYaYaVbfaVa7aIaIaIaIaIavavaIaIaIavavawacavavavavajakakak#P#G#g#f.R.R.K.k.s.t.t.D.D.D.t.k.h.c.h.k.k.l.k.d.k.k.t.F.M.G.R.9#h#h#w#x#P#JakaxaoaKaYazaZaZaqa1b#b#b#b#b#aZb#b#aqb#aqb#a1a3bobpbbbqbbbrbrbqbrbrbrbrbrbqbrbqbqbqbHbrbrbrbba3a1a1a3a1aqaqa3a1a1bba1a1bGa3a3bDbbbmbmbDbiaaaubibobqbqbrbqbrbrbqbrbrbrbrbrbqbrbrbrbrbrbbbbbrbNbbbNbNbbbNbDbNbbbFbbbbbobla1blb#aZaZaKaoak#1#P#H#O#x#1aTbibzbKblblbobmbmbmbobobobmbobDbobobobobNbobCbmbo", "#7#Z#7#Z#Z#Z#7#M#7#7#M#M#7#Y#M#W#7#7#D#D#D#W#D#W#M#M#W#s#V#D#D#W#D#t#W#W#D#D#W#D#D#t#s#t#t#k#t#t#k#D#D#M#O#Z#M#Z#M#Z#Pag#9#ZagaiatalalaFalaka.akakalalaHanavavakalavavavawavavaXaVaVaXa8aVaVaXaIaVaVaVaVaVaIaVaVa9ayaVayaVaVaZaZaZaZaZb#b#b#bzaVaKaHaibsaVaYaKa6aKaVaKaYaYbiaYaVaKaVaVaVaIaIaIaIaIaIaIaIaIaIaIavavavavavavalakalaj#1a.#M#E.8.M.L.D.k.u.D.D.D.t.k.k.c.c.k.k.k.D.D.t.t.t.E.F.F.F.N.R.9#h#h#h#w#Raa#4aoaKaKayaqaqayaZaZaZaZayaZaZayaZayaZaZb#aNb#blbaa3bbbqbbbqbrbqbrbHbrbrbrbqbqbqbqbqbHbrbrbrbqa3b#aMb#ao#K#B#Laq#La1a1bDa1a3bobobDa1bmbmaKaiasaKbobrbbbbbqbrbrbbbrbbbrbrbrbrbrbrbrbNbbbrbrbNbNbNbbbFbNbFbbbbbNbbbobDbma1bla1aZb#aZaoabaIaaak#2ak#2anaxaVaYbzb.bzblbpbMbobobobmbDbobobMbobMbobMbobmbMbo", "#M#M#7#7#M#7#7#M#7#7#M#F#7#7#W#M#W#W#D#D#W#D#D#W#M#D#W#W#D#W#W#D#W#W#D#D#D#W#D#D#W#D#t#V#t#t#k#t#v#G#G#E#M#D#M#G#M#M#Zagas#9auaFakak#1#1#0asakajakavanavaTak#1a.#1alal#3avavaIaIaVaXaVa9ayaVaVaVaXaVaVaVaXaVaVaVaVaVaYaVayaZayb#aZaZaZaYaZaYbibhaVaTasaua6aVaIaKaVaKaVaVbiaYaVaVaVaVaIaIaIavaIaIaIaIaIaIaIaIavaIawavavavavavalak#3a.#P#M#g#D.M.J.u.t.D.D.D.d.c.c.c.h.d.u.t.D.D.D.t.k.t.D.F.F.E.M.R#h#h#H#A#2#4aa#4ab#5ababaKaoayayaqayaZaZaZaZaZaZaZayaqaZb#a1a1b#aOa3bbbbbqbqbqbrbrbrbqbHbqbqbrbqbHbqbrbrbqbba3aOaYaY#Q#a.3#b#o#4#Laqblbla1aZaqaZb#bMb#aT#7agaVa3brbrbrbbbrbqbrbrbrbrbbbrbrbbbrbrbrbbbbbNbbbbbNbbbNbbbbbobNbbbDboboa1a1b#b#b#aZayacaxananakaaak#2anabaKaZaZbibhb.a0bmbobmbmbobmbMbmbmbmbobDbFbmbMbmbD", "#7#W#7#W#7#W#F#7#W#W#M#D#M#W#D#7#D#W#D#D#W#t#W#W#M#t#W#W#F#D#D#W#t#V#s#t#D#s#t#t#t#s#s#l#t#D#M#D#v#t#t#k#k#t#t#M#M#1al#1#P#G#M#M#Z#M#Z#1avavalak#1#1asag#Zag#1ajalav#Rak#3al#5avacaZb#ayaVa9aya8aVaVaVaJayaXaXaIaXaVaVa9aYaZaZa9aZaVaYaVaYaVaKaKaIa6atataTa6axaKaKaKaIaVaKaVaVaxaxaKaKaIavavavacacaKavaIaIacavaIavaIavalavavajaj#1#Z#Z#F#g#k.M.M.D.k.c.h.c.c.c.c.c.h.l.k.c.c.h.c.c.k.k.J.J.Z#h#h.0.S.F.U#h#w#n#x#1al#3aIabacaZaZb#a1aqa1a1b#aqaqayacabaZaqb#aZa1blbbbba3bbbbbbbbbbbqbqbqbqbrbrbrbqbqbHbHbqbqbbbbbbaZaV#m.Y.Y.M.Y#j.9#G#O#H#O#v#t#kakaKau#sasaZbDbNbrbbbrbbbrbrbrbrbrbbbbbrbbbrbbbbbrbNbNbbbbbbbbbbbbbbbbbDbbbobFbbbDbDbma1a1bla1bkak#1#Q#1akas#P#9#F#MataTaVbibzbMbmblbmbmbmbobmbmbmbmbmbobmbobmbMbMbD", "#M#7#M#M#W#M#W#W#D#M#W#7#D#M#M#W#M#M#W#7#D#W#W#M#7#W#D#D#W#D#D#D#W#D#t#s#D#D#t#t#t#k#s#D#D#M#t#m#t#j#k#t#D#t#Eag#P#1ak#M#M#M#M#M#Dagasatakakat#1asas#1#PagajaIaIav#P#1avavakalacaVaJaca9aVaVaVaXaIaJaVaVaXayaVaXaIayaVaVaVayaVaZaVaVaVaYaVaKaVaKaIavatauaHalaIa6axa6aKaxaVa6aIaVacaKaVaxaIacanaIaxaIaIacaIacaIaIaI#5avakavavakaja.#P#y#M#F.8.R.J.u.l.c.c.h.c.c.h.h.c.c.k.c.c.c.h.h.F.S.S.9#h.V.S.G.u.H.V#h.V#h#w#RabaKazaZaqa1b#aqb#aZb#b#aZaZayayacaKaZaqaZa1aqb#bla1a3bbbbbbbqbrbbbqbqbqbqbqbqbqbqbHbrbrbrbrbrbbb.biau#7#m#e#j#v#D#D#G#E#v#W#t#k#QaT#Dasa6bmbbbFbrbrbrbrbrbrbbbrbrbbbrbbbrbbbrbbbbbrbbbrbrbNbNbNbNbNbbbNbbbobbbobobDblbMa1blblbMaYaKaKanavak#R#R#1#Pala6aYaVbib.bMbabpbabmbmbpbmbmbmbmbmbmbmbDbobobM", "#M#M#W#W#M#M#M#W#M#M#W#7#D#7#W#M#7#7#V#W#D#W#D#M#D#F#W#W#t#t#W#D#W#V#D#W#t#W#V#s#V#M#D#D#V#k#k#j#k#j#k#t#D#P#Z#O#O#G#D#t#t#t#9aiauag#Pakagagasag#PaIaIaFakalalavanak#1#1alaIaIanakavaTavavaVaIacawaIaJaJaIacaJaIaVaIaIaVayaVaVaYaVayaVaVaYaKaVaKaIakagataFaHaTanaIaxaIa6aVaKaKaVaKaIaxavaIaVaxaKaxaxavaxaIaxaIaIacacaIav#5akalakaj#0#y#M#g#t.R.M.E.h.c.h.h.c.c.c.d.h.h.h.c.t.D.F.D.t.t.D.v.F.N.M.M.K.N#vagaHacaoao#B#K#o#J#o#R#4ababaKaYayaZaZaZaZayav#Rav#4acaoaZb#b#bDa3bbbbbqbbbrbrbrbrbrbrbqbqbqbqbrbqbrbrbrbrbbboblbhaT#j#k#jaiaBaB#9#9#t#V#7#U#Wa6aZbmbbbbbrbrbrbrbrbrbrbbbrbrbrbrbrbrbrbbbbbbbbbrbrbbbrbrbrbNbbbbbobba3bobobDboa1a1bMbiacababaoaI#4avanaoaoaZaZaIavaKbzbzb.b.bMbpbMbabMbpbMbMbobNbMbobobmbobmbM", "#7#7#M#M#W#M#M#M#7#7#F#D#M#F#M#7#D#F#W#D#W#D#M#D#F#W#M#W#t#W#t#W#t#D#t#D#s#V#D#W#D#D#G#m#k#j#m#t#j#k#t#9#1#G#g#G#M#D#D#D#M#Mai#P#P#M#P#1#P#Makakanaxax#RaFanaxanaT#P#PavaKaxananak#P#1avaIavaIaIaVaJayacaIaIacaIaI#5aIaIaVaVayaVaVaVaZa9aYaVaxaIanau#1atanaTavaxa6aTaIa6aVaKaVaKaYaKaIavacaxaxaIaxacanaIaxacaxaIanaxavanalavakakak#1#0#E#D.8.R.M.D.k.c.h.h.h.g.d.h.c.c.u.D.D.t.t.t.t.D.D.N.F.K.H.M#C#Pax#6#6#2#o#i#..V.3#H#1#RanaxaKaZb#aZaZaZaZayacaIaKayaYaVabacaZb#a1boa3a3bbbbbrbbbqbrbrbrbrbqbqbqbqbqbqbrbqbqbbbbaObzbh#k.M.R#9ai#7ai#9#j#EaA#7aQbkbmbNbobNbrbrbrbrbrbrbbbrbrbrbrbrbbbrbrbFbrbbbrbbbNbrbFbrbbbbbNbbbbbNboboa3bma3bma1bmaZaZac#Raa#H#A#A#Q#2aa#4axaxaVbib#bzbzbza0bMbabMbobMbpbmbNbmbobobMbobDbMbo", "#M#M#7#M#D#W#F#W#M#M#7#7#M#W#D#W#M#7#D#D#D#D#D#D#W#D#W#t#D#D#v#W#v#t#W#W#D#t#D#W#G#D#t#k#j#k#j#C#t#G#M#G#M#t#D#E#M#M#D#G#M#O#M#G#G#M#Z#Pag#1aFaFanakakayaxan#P#1#1ala6aIanavaaaFagasakal#RakacacaIaVaIaIaIayaIavaIavavaIaIacaVaKaVaVaVaVaVanavaFaHakatalaTaIaxavaIavaTaIaxaVaKaYaKaKaxa6axaVaxaVaKaIaaaxacaxaxaxacaxaIavaaavakajakak#P#y#F#t#e.M.D.k.h.h.h.g.h.c.c.h.k.D.t.D.t.t.t.B.t.K.K.K.M.9.9aa#4#p#i.X.Q.S.w.9.9#1#y#PanaxaKaZayaZaZayaZayayaYayaZaVaKavaYb#a1b#bla1a3bba3bbbbbbbbbqbqbrbbbqbqbqbqa2brbrbqbrbqbbaOb#bi#t.7.M#9#M#j#M#D#j#V#EauaVblbbbNbbbFbrbFbrbbbrbGbrbrbrbrbbbbbrbbbrbrbbbbbbbrbbbbbbbrbrbrbbbbbNbbbbbobobDbmblb#a1aMbiac#P#H#a#w#x#h#h#m#1anaZbzaYaYbhbibMbhbabMbabMbpbMbmbmbpbobmbobmbFbobo", "#E#D#v#D#M#W#M#7#M#M#W#W#M#F#7#D#W#W#t#W#D#E#t#C#D#t#D#t#t#D#D#W#D#t#W#D#D#W#7#G#t#t#V#V#t#t#k#D#M#E#k.R#m#k#D#D#M#M#Z#s#E#F#7#D#V#M#1aFavaF#G#1ananaFak#P#P#1aFanaIanaIan#1asakaIal#1#3avaIaa#5av#5aIaIavalavavav#3alavav#5av#5aIaIaIavaIavavaIavava6avaxaIaIaIaKaIaIaIaKaIaKaxaxaxaIaIanaVaKbiaKaKaKabaIanaxaKaVaIaxanavanakak#1as#1#M#D#v#j.M.E.d.h.h.h.b.b.t.D.k.#.b.k.i.k.j.k.v.N#h#1ax#4#Q.2.N.F.S.N.N.N.9.9#h#x#x#2#4aYaoaoaoazazaZaZb#b#aZaZaZb#bBbMayaKayayayaZaZa1a3a3a3bbbbbbbbbbbba3bqbrbbbbbrbbbHbrbrbrbqbaa1bla6#O#e.S#e#e#e#VaHbgbib#bmbbbDbrbNbrbNbHbFbrbrbGbrbrbbbbbFbrbFbrbbbrbNboa3bbbbbbbbbqbbbbbbbbbNbbbobrbrbobob#b#aqaqaZaZ#2#P#H#P#P#w#E#D#M#1auaaanbiaZbzbMbhbMbabababMbNbpbMbMbpbmbobmbobMbF", "#7#F#W#D#W#D#W#D#D#D#M#F#D#W#D#D#D#t#t#D#t#t#D#V#t#D#D#t#V#D#t#D#D#V#t#F#M#M#D#t#V#t#t#k#k#t#D#9#v#e#e#j#k#k#s#O#P#v.9#v#M#F#D#M#Wauak#A#P#P#2aaax#G#1#1#Yagaxayao#5axak#1#1#5aVav#0#1acanakavaI#5#3ak#3#Ralav#5avakal#3alalavakakakavavavavavaVavaIalavavavavaIaIaIaIacaIaKaIaIavaIaIaIavaIaVaKaVacaxaxaKacacaxaxaKaIavavavak#1a.#P#0#w#g#s#e.M.F.k.d.b.#.c.H.n.t.h.c.h.c.h.h.l.u#t#v#4#S#b.P.S.S.N.F.F.p.S.9#j.9#O#1aaababababaoaZaZb#aqb#aZayaqa1b#aqayayaZb#aZacaIb#aZaZa1a1a3bbbba3bba3bbbba3a3bbbbbrbrbrbrbrbqbqbba3aOblaVas#f#f#q#Wasbzb#bla3bbbpbrbbbrbrbrbrbrbbbrbrbGbbbbbbbbbbbbbbbFbrbbbbbbbbbbbbbbbba3a3bba3a3boboa2bbbrbbboa3aZaYayaYan#1#g#g.N.S.P.9#w#Pala6aIaVaKaVblbobpbmbpbabobmbobobobMbpbmbMbmbmbm", "#D#M#M#M#D#D#D#M#D#M#F#D#W#F#D#W#t#D#t#D#t#t#t#t#t#V#D#t#t#W#t#t#V#t#D#M#D#D#s#D#D#V#t#t#D#M#D#k#k#j#j#j#t#f#M#O#F#k#j#l#t#9#M#Dagak#1#M#Mak#3#M#E#P#P#OaHavax#4aIaIaa#1#1anav#Rak#Pavak#1ak#Ranavak#3#3#3#Ravakakalakalalakal#RalavavavavavaIaIavaxalavalavanavanaIaIaIaIaIaIanavanaIaIaxaIaIaKaKaxaxaKaIaxaxaIaxaxacaI#5avalakak#P#P#w#F.8#e.N.E.h.#.c.t.t.t.D.t.#.b.k.#.k.C.L#e#P#4#a.P.S.1.V.9.p.D.v.F.F.9#h#x#2aaaK#4#4aoazazaNazazaZaqa1bma1aZazb#a1b#aZayacaKaYayayaZa1a1bbbbbbbbbbbbbbbrbbbbbbbbbbbqbqbqbrbpbbbobpa2bobzaZ#M#mauaKbibablbobbbobbbbbrbrbrbFbrbrbrbGbrbrbrbbbFbbbbbbbFbbbNbbbbbbbobbbNbobbbpbpbbbobpbqa3bbbpa3bobbbobDblaKabaVac#R#1#M#v#v#x#h#wakava6aVaZbzbabMbobpbMbobmbobpbMbabobobmbmbmbMbo", "#W#D#M#G#M#M#M#M#W#7#M#7#D#W#W#D#W#V#D#D#t#W#7#D#D#7#M#7#D#M#V#D#W#M#M#D#W#t#W#D#V#t#M#M#W#m#v#m#m#m#k#k#D#M#D#k#k#v#t#M#M#Dakakas#P#3#Q#O#E#D#D#M#OaTaFaaan#4aaak#1#RananaF#O#H#1av#1akanak#1#1ak#1#y#1#2akak#1#3#5avavaIavavalavavalalavawaIakalacavaKaxaIaIacaKaIaKavavavaxavana6avaIaIaxaIaxaIaIaKaxaVaKaIaKaxaxaIaxaIakakaaaF#P#P#w#E#v.M.K.u.l.t.t.g.b.t.d.#.d.d.#.c.c#7#K.z.g.G.F.w.S.F.N.S.N.N.M.w#han#6abaa#4azaoazazaqaMaqaNb.a1b.aZaqaqa1bma1b#ayayaZaZb#aYaZaZa9aqaya1a1a1bbbbbbbbbbbbbbbba3a3bbbbbba3boa3boboa3babmbaaYaxb.blbabobobobobobbbrbbbFbbbrbbbrbbbGbrbrbrbFbFbrbbbrbFbbbbbbbNbbbbbqbobobbbbbpbba3bbbqbpbobpa3a3aOaNa1bma0aNaVav#Rak#MaiaFak#H#O#1anaVbibzbMbMbabobabMbNbabNbpbMbMbpbmbobabmbabm", "#E#D#V#W#D#W#M#W#M#E#W#D#W#E#v#W#t#t#W#W#D#D#M#M#7#M#W#M#D#D#v#W#M#M#D#W#v#W#V#t#D#D#M#G#m#T#v#k#j#j#k#D#M#E#k#k#v#D#t#t#t#1#Q#P#O#1ah#F#v#t#W#D#Zauak#2an#6#1#H#MaTaK#P#1#1#O#Pakak#PalaF#1#P#1#2#M#w#P#1#1#1#1akakavaIaIavavavavavalavavavavalavaIaIaIavaIaIaVaKaVaIaTalaFavavaTaUavavaIaIaxaIaIaxaVaVaIaKaKaIaKaIanaIanavakakak#1#P#E#g#v.M.K.o.D.k.b.j.j.j.g.d.t.k.C.M#v.z.m.s.n.f.n.n.n.t.D.K.B.B.K#e#v#o#x.2#2#6adaoadaMaMb#b.b.b#aqb.b.bla1blaNaMaZaZb#aqb#aZaZaZaZb#ayayaZa1a1a3a3bbbba1a3bba3a3a3a3a3bba3bobaa3baaOboa3babhazblbaaObabpbabpbbbbbbbbbrbbbbbbbFbrbrbbbbbrbbbbbbbFbbbbbbbobbbbbbbbbbbbbbbpbbbbbpbpbobqbpboboblbab#aqbpaqa3bmazaNat#P#Q.W.P.9#j.8#PalaxaVbibzblbMbMbababMbpbMbabobpbMbpbpbmbmbmbm", "#E#E#D#M#V#M#E#F#M#M#E#D#W#7#W#D#W#D#7#D#W#D#W#M#D#D#W#W#D#W#F#M#W#v#W#W#D#t#D#D#M#v#t#j#V#C#k#k#k#t#D#C#j#f#v#t#t#W#Dau#P#G#1#P#E#v#Y#V#V#vakas#1#1ax#Q#8#D#Maka6#O#E#Pai#P#1aF#H#Pak#P#O#P#P#O#M#M#P#O#Z#M#Pas#1akakav#5avavavavakavaIaIaIavavaVavaIavaIaIaIaIaIaIavakatalalakatatalatalaHavava6axaIaxaIaIaxaIaxaIaxaIanaIavavan#1#1#w#D.8.M.N.D.#.b.b.#...b.g.#.k.S.P.D.c.b.q.r.j.q.k.t.D.t.K.F.R#j#E.9.9#z#2#S#Q#oaxaMaMaqb.aqaqaMaNaOaOb.azb#b#aNaOb#b#aZa1b#b#aqaZa9ayaya9b#aqa1a1a1a1a3a1a1a3a1a1a1a1a1a3blblbaa1a1aOb#aMaYaxaxb.blblblbabobobpbbbobobobbbbbbbbbbbFbbbbbbbbbbbbbbbbbbbbbDbbbDbbbobbbbbNa3bpbbbpa2a3bpbabpa3blbab.azaW#o#R#Q#oadaa#Qaa#H#h#v#G#PauakakaVaVbibzb.bmbMbabababMbMbpbpbMbpbabobMbMba", "#v#v#W#W#D#M#M#G#7#M#W#M#W#D#W#M#W#W#7#W#F#W#D#M#D#v#t#W#G#7#M#M#M#V#D#s#t#D#M#M#M#m#W#D#t#m#T#t#t#W#t#v#v#W#t#j#t#M#M#O#O#1#G.9#k#t#v#s#Dag#1#M#Paaak#h#M#D#Pakak#w#M#P#M#Pak#y#G#Qak#1#P#P#P#P#M#P#P#9#P#P#P#9#1aga.akav#5#5avakavavaIaIacavaIaIaka6avavaIavavaIavavakatalavaHalalaHalakalaTavaIa6aIavavavaIaIaIaxaIavanavanavavakas#Z#w#t.R.M.t.b.#.#.b.g.c.q.h.2.V.#.a.b.i.i.i.t.D.v.t.D.D.N.S#x#Q.U.R.2#o#x#Haa#6aMaNapapaWaqa0aOb.b.b.b.aNaOaqb.aOa1b.b#b#aqblb#bnaqb#aZaZb#bkbkaqa1a1a1a1a1a1a1aOa1aNaOa1bla1blaNb.b.b.bhaYaKaYb#aMb.bma3a3boboa3a2bpa3bobbbbbbbbbFbbbbbbbbbbbFbbbNbbbDbbbbbNbFbbbrbNbpbbbba3bpbaa3babaaPbabpbaaWao#4#H#o#2.9.U#S#4#1a6aTag#PaiajaTaVbiaVaKbia0blbabMbabMbpbabobpbMbpbpbMbpbMbp", "#D#v#V#D#V#t#t#t#m#D#E#E#M#D#M#D#D#D#M#M#D#D#W#D#D#F#W#M#W#M#M#t#D#D#D#t#F#M#M#M#t#D#v#v#W#v#t#k#t#t#t#V#k#C#V#l#t#O#Z#Z#P#O#j#e#e#D#M#D#Z#9#D#Pak#D#j#v#v#was#1#Z#M#M#P#1au#P#M#Pal#Paiak#9#G#D#w#G#M#1#P#M#P#1ag#M#P#3akan#1#1#1#3ak#5aIavavacavajalalalajavaJavavalajatajajakaHakataHatatatajaHa6avavavavavanavaIaIaIavaIalakakak#1#E#E#g.R.F.t.c.#.b.c.c.c.u#g.N.b.j.h.t.k.k.c.g.j.l.D.K.Y.R#v#h#g#H#2#o#y#H#2aoaoaqaoazazaNaqaNb.aNaNaNaNaNb#aqb#b#b#b#b#aNbla1b#b#aqaZb#aqb#aqaqaqaqa1a1a1a1aqa1a1b#aqb#b#a1b#aqb#aZaZazaZaZbhaZb#b#b#b.b.aObabababma3boa3bbbobbbbbbbbbDbbbFbDbbbDbbbbbobobDbbbbbobbbbbbbNa3a3bbbbbaboaOblb.b.aPaOb.ao#J#x#Q#x.N.N.V#o#oanaKan#4abaKaVaIaVaZb#bzb.bMbMbMbabMbMbabpbabobababMbabo", "#W#M#D#M#M#W#W#W#D#W#7#7#D#7#D#D#M#M#W#D#M#W#D#W#M#M#M#M#9ai#M#D#M#W#t#7#M#W#V#t#t#D#t#t#V#t#D#D#D#j#t#V#t#t#D#9#M#M#P#M#t#m#m#t#D#M#M#G#s#YaT#P#M#t#f#v#1#P#M#Mai#M#M#Pai#1#Pasak#1#Pau#1#M#M#M#P#M#M#P#9#P#O#Pas#Z#P#1as#1ag#Z#Pat#1akaIavavaIavasasalaHajataHatajatajaRajajataHatatataSalatatatataTalaTavaIavaTaIavavavavaIavanakak#1#1#M.R.D.k.c.c.c.k.D.U.M.t.b.g.g.h.j.g.k.j.n.n.n.k.L#y#Q#J#a#a.8.U#v#2#2#RababadaqaqaNb#aNa1b.aqaOaNaNaOa3bablaNbla1aOaOaOaOaOa1b#a1a1b#a1aZb#a1aqa1a1a1bCa1a1a1a1blbla1blb#a1blblb#aZaZaZbib#b.bla1blbababma3baboboa3bpbbbpbbbbbNbba3bbbbbDbbbbbbbba3bbbbbobbbbbbbobbbobbbba3a3baa3bablaOb.adaoabaLazaa#O#v#G#e.M.M#x#QaaaxaIaIacaVaVaVaVaYbiblblbMblbablbabobabMbpbpbabmbobM", "#W#M#M#7#M#M#M#W#M#M#D#M#M#M#D#M#W#M#D#D#7#D#7#M#M#M#7ag#Pag#G#M#7#W#D#O#7#M#t#W#v#V#D#t#t#V#W#t#V#v#W#k#t#k#P#M#E#w#G#v#E#E#t#D#D#E#M#D#M#1#M#M#D#t#k#Z#O#9#M#Z#9#M#Pag#1agaiak#Q#H#1akai#P#M#P#P#G#M#Oaiai#Oai#1ag#9as#Pasag#9asakasatavavakavavasasalatatatajasatataRataRajaRaHalaRajaSaHatajaRatataHalaUaTaIavavaTavaxavaxaIanakak#1#1#w.9.L.t.c.#.k.F.S.G.t.k.i.j.c.n.c.c.h.j.g.j.k.K.G.3.3.2.3.U#h#x#2aa#Kaa#4aoazaqaZb#aNa1aNaNaOaNb.aOaObaaOaPblaOaNaOblbabaaOa1a1b#a1a1b#aqb#b#bBa1a1bla1bla1bla1bmbla1blbla1a1bma1blb#b#b#b#blbabmbma3bma3boa3bpbobobbbpbpbba3bbbbbbbbbbbbbbbbbbbobbbbbbbobobNbbbba3bbbobobba3a3a3baaOb.aOaOabaa#2adaWax#H#O#P#Q#x.9#x#QaxaKbibibiaVaVbibibibzb.blblbMblbMbobobababpbMbobMbp", "#7#W#M#9#M#9#M#M#M#D#D#D#M#7#M#D#M#7#M#7#M#7#M#9ag#Mag#Pag#Z#7#M#M#M#7#7#E#W#V#t#W#t#t#s#t#D#D#v#t#t#D#t#t#M#D#E#M#G#l#t#D#D#D#M#9#V#k#Patak#t#D#M#t#Dag#E#M#G#M#P#Mas#P#9#Pasak#M#9ai#1#1#P#P#9ai#M#M#Makau#9as#1asai#1as#9agasasasasasatakakaHakasasataRajasasasajatajataDaRajaRaSajaRajatajatajajatalaHalavaUavavaUavaTaIavaxanaFakak#P#P#g.S.D.c.h.D.S.N.t.i.t.h.j.j.h.k.k.t.k.k.g.K.9#h.0.p.v.K.N#h#H#H#2#Kaaabazb.b.aNaNb.aNaOaNaOb.aOaOaOaOaObaaPaObab.aPaOblaOa1b.aOa1b#aqaqb#aqa1b#b#aOblblbla1bmboboa3boa1blbmbmbma1a1blbla1a1bmboboboa3bobpbpbNbpbqbpbbbbbqbbbqbbbbbbbbbbbrbbbba3bbbFbbboa3bobbbbbobbbba3bbbobobaaOblaOb.baazao#S#2#6aWaa#2#H#x#H#h#x#HaIb#aZaYaVaVbibibzbibMblblblblblbmbmbMbabMbMbpbMbMba", "#M#M#7#W#s#s#s#D#D#D#D#M#D#D#M#M#Zag#9agas#Pag#1ag#1ak#1agag#Zagag#9#M#W#D#W#D#W#D#D#W#D#t#W#D#W#D#t#s#M#M#F#O#P#D#k#D#t#D#M#M#D#m#Dag#P#D#D#t#t#s#F#M#D#W#M#M#Magag#Z#Mag#1ai#9#Mag#P#1as#Pag#9#9#M#M#Paiak#1akasas#9#1as#1asasasasatasasasasajatatatataRa.a.asasa.ata.aDa.a.aDa.aRajaDa.asasajatajaHaHalaHalalalavaUavavaIavanavanan#1#1#P.8.M.D.n.G.n.g.c.n.c.j.D.D.F.F.F.G.N.D.F.F.P.N.v.n.K.S.9#..2.9.U#Q#RaoaoaZaMaqb#a1aqb.a1aNaOaOaOaOaOb.aOa3a3aOa3aObaa3a3bmbabaa3aNa1b#b#a1a1b#aNa1aOblaObla1blbmbma3bDbDboboboa3bmbDboboa3boa3bNbobpbbbba3bpbbbbbbbbbpbpbbbbbqbbbpbrbNbNbba3bbbbbbbbbbbbbbbbbbbobobba3a3bba3a3bobab#baaOaMaxax#S#Q#x#h#x#2#1#x#v#j#v#MaaanaKaZaZbiaZbkaZaZblbMblbmbMbmbmbMbabobMbMbmbabMba", "#M#W#W#7#W#W#D#W#W#W#t#t#D#7#7#M#Mag#0#1as#1#1aga.atakagagasas#1atas#7#M#M#F#D#M#W#W#D#W#D#W#W#t#W#V#M#Z#M#M#M#t#k#t#t#D#F#M#t#t#t#P#Z#D#Z#E#l#s#M#M#D#D#W#M#M#Masag#D#M#1as#P#Zagagagai#1agag#Pag#M#M#1#1akat#1#1agagasasasas#1asasajatasatasatajaRajasajasatasa.asaDasaDa.asasa.atajatatatajatalalaSavaUalalaHalalalavavaIanavanaxan#3#3#1#t.R.F.N.F.d.b.b.h.v.t.D.D.D.F.M.S.N.F.N.S.S.v.n.v.R#m.0.N.N.S#v#2#4aKabadaqaZaNaNb.aqb.aOaOaOaOaOaObaa3baa3a2aObaa3a3a3a3a3boa3aOb#aNb.aOb.aNblb.blaOblaObla1a1a1a1bDboa1bobDa1a1bobbbobba3bbbobba3bobpbbbba3bobpbbbbbbbbbbbbbqbbbbbbbbbbbbbobbbbbbbobbbbbobbboa3boboa3boa3a3boboa3blb.b.aMaKaa#Q#H#O#x#xaaaF#1aFaTauaTaxananaKaKbib#bkaZb#blblbmblbmbmbmbobMbpbpbMbpbpbM", "#7#F#D#D#D#t#D#D#D#M#D#W#Y#Magagagagaja.akat#1asa.aj#1#1at#1#1#1as#Z#M#M#F#M#D#7#F#F#W#W#D#W#D#D#D#M#E#M#M#M#t#k#k#t#D#E#D#D#M#M#Z.8#v#v#k#t#s#D#M#D#t#F#W#W#Z#Pag#M#Y#1ag#1#Zag#7#Zag#Pagagag#9#M#M#Zasak#1au#1asag#1#Pasasatasa.asakatajasasatajaHaHa.asa.ajasasasaRasasasa.aDataRajajaRajajatajalaUaHawaUaUavawawavavavavalanavalaa#1#3#1#G#v.M.d.h.c.d.b.g.g.j.t.i.o.D.k.k.u.D.S.N.j.B.D.O.R.D.D.D.9#w#Q#4abaxazaqaqb#aqa1b#aNa1aOaOa1aOblaOaOa3a3baa3a3a3a3baa3baa2a3a3baa1baaOaOaOa1b.aOa1aNaOb.b.a1b#a1a1bma3a3boa1bobma3bDa3bDa3boboa3bba3bobbbba3bobpbbbpbpbbbbbqbNbqbqbqbqbobpbNbqbbbbbNbbbobba3bba3a3bDa3boaOblbla1blaOazazaK#4aa#O#n#8#Q#1akanaKaYaKaKaKaKaVaKaKaVbiaZaZa9bmbMbzbMbobmbmbMbmbMbmbmbmbMbMbm", "#F#D#W#s#V#s#s#t#W#W#M#M#M#M#9#Pa.akajatataka.asakakasasajasakas#1#M#Z#M#7#D#M#W#M#M#W#D#F#D#D#D#M#M#t#G#M#t#t#t#t#D#M#t#t#s#Z#y#G#v#s#l#k#f#s#g#M#t#s#M#W#Dagag#M#M#7as#9#P#Pas#M#9agagag#Zag#9ag#9agakat#1akasagasatas#PasatakatajaHatatataSajataHaHatasataRataRatajaRajatajaRatataRajajaHajaRavalaUaUavavavawavawavavalavanalananakak#1#1#O#E.R.k.c.b.c.b.c.d.d.n.t.i.t.k.D.M.N.R.M.R.9#h.9.R.O.R.9#H#2aaaxabayaZaZa1b#aqaNa1b#b.a1a3bma3a1baa1a3boa3a3a3a3a3boa3a3aOa3a3a3a3baaOaObaaNaOaOaOaOaOblblaOa1bla1bmbma1a1bDboa1bmbDbDa3a3a3boboa3a3a3boa3bobpbba3bbbbbqbbbqbbbNbqbbbpbbbbbqbNbqbbbbbobbbbbba3boboa3boa3a1a1a1aqaZaNb.azax#Saa#Q#Q#QauakakaaaxaYaYaKaxaxaYaKacaKaKaVaVaYaZb#aZb#bMbmblbMbmbobMbMbMbmbobo", "#D#D#D#F#s#D#W#t#t#t#D#9#F#M#O#Zag#Pasajajatata.akata.akataka.asagag#M#M#M#7#W#M#7#W#D#D#W#M#W#Z#M#D#M#M#t#D#s#V#D#D#M#k#s#M#M#g#t#w#t#f#k#f#M#D#M#D#V#W#D#7#9#M#M#7#Masag#Magag#7ag#7#Z#7#Z#Pag#9ag#9asakatatas#PasauasagasaTaHajataHavalaHalaHatatalajaDatatajataRatatatatajataja.ataRalaUalalavavaUavaUavavavaUaIaUavalalalanavalaa#1#1#P#P#G.O.d.d.c.a.c.c.g.h.k.d.t.t.k.N.S.S.S.N#h#x#h.F.M.R#x#P#1#2#RacaKaoaZaZb#aqaMb#aqb.b.a1a1a1a1a3bma3a3bmbma3bpa3boa3baa3a3a3a3a3a3a3aObaaOblbaaObmaOaOaOb.aObla1bma1a1a1a1a3bobma1boa3boa3bDboboboboboa3bba3a3bbbqbbbbbbbbbqbrbbbqbrbbbqbpbbbNbbbbbNbbbbbbbbbba3boa1a1a3a1b#b#aoazaoaMao#2axaaaF#2ak#1#1anaxaKaKaZb.aYaKaKaVaxaxanakaVaI#1akaKananaKbha0bMbMbmbobNbobNbM", "#M#t#s#t#V#D#s#W#M#7#D#t#7#F#M#M#Zag#0#1ajataUavajajatalavaHatas#1asag#7#M#7#M#7#D#W#D#D#W#D#M#M#M#9#M#V#M#D#t#W#M#t#j#D#G#M#k#j#t#D#f#j#D#D#M#M#s#W#M#D#Mag#M#W#F#W#Pagag#Yag#Zagarag#7ag#7agagagagaga.atasasasasas#1atatatalaHatakaHavaHavavaTaHaHavaHaHaHajatajaHajaHatalalatalaHajaHalaSalavavavaUaHavaHaHalaHaHalakakatakakavakakauakak#G#t.R.u.d.#.c.c.d.c.h.j.k.F.w.w.S.N.w.S.P.G.p.G.0#E#x#y#y#J#R#4acaoaKaZayb#aqb#aqaZa1aqblbla1a1a3bba1a3a3a3a3a3boa3bobaboa3a3bobpa3a3a3a3boa3bma3boa3blbabaa3boboa3boa3bmbma3bDa1bobobDa3bobDbbbbbDbbboa3bbbbbpbbbbbqbbbbbqbbbrbNbqbrbqbNbpbbbpbqbbbbbqbobbbbbbboa3a3a1b#aqb#b#ayan#J#Panax#RakavaxaVaYaYavaaaFanaa#4aVaKacanav#P#1#1#P#M#1#M#D#Pag#v#f.Y.Y.9#j#h#G#QaEam", "#7#W#t#W#s#t#D#D#7#F#W#s#W#M#Y#M#Z#1asatajaHavaUatatajavaSalajasatagagag#Z#7#7#7#7#M#W#M#F#D#M#D#F#M#W#s#D#t#W#D#F#t#k#D#M#v#k#t#D#k#j#t#D#9#D#V#s#D#D#D#Z#M#7#7#M#Magagasagaragagagagag#7#7agagagagasagasa.atagasasasakatajatatalaHavavavaTaTaHalaTaHaHavaHataHatajaUalaSalawavaSataHaHajavalaHavavaHaUalalalalajajakat#1akakakakak#3#1akak#M#t#k.D.l.h.d.c.l.d.t.D.D.N.S.D.F.F.M.N.H.H.N.G.0#h#n#y#Hak#4axaxaxayaZaZaZb#aqb#a1aZb#a1a1bmbma1bma3bobobma3boa3boa3a3a3bpa3baa3bbbba3bpbpa3a3bmbpa3a3a3bma3bobbboboa1a1a3bmboa1a3bDbDbbbDa3bbbbbbbDbbbobbbobbbbbbbbbpbrbqbNbqbqbbbqbpbbbobrbobbbqbNbbbbbbbba3a3bDa3bla1b#a1aZayanak#2acaZaKavaIaKaZb#aYaKaIaxaxanaaaYaZaYaKax#Qasalag#Zai#1#M#O#P#F.7.Y.Y#e.M.R#e.M.Z.9", "#M#D#W#W#D#W#W#F#W#W#F#M#W#F#Y#M#Zagaja.atalawalaRaHawawavajataja.as#0ag#7#M#7#M#7#7#F#D#W#M#M#D#M#M#D#W#D#W#D#M#W#t#t#E#E#m#v#D#D#k#t#v#s#M#s#D#F#D#t#M#9#M#M#M#W#Ma.agatag#0aDagag#Zagaf#Magagagasaga.asasasasagatasasataHajataHawaTaIavaHavaHavavavaHaHaUalatakalaUaHajaHaUalaHaRatatajaHalalaUalawaSavalalavatatajajajasakatakak#1#1ak#1#Z#E#t.E.i.c.h.c.l.i.l.i.D.F.D.J.R#e#h#g.U.9.9.0.U#h.U#x#R#R#4#RabaKaoayaZb#aZb#b#b#b#b#aZblbmbmblb#a1a3boa3a3boa3a3boboa3bobobpa3bpbbbba3a3bpbobobpa3a3a3a3a3bpa3bbbbboboa1bobDbobmbbbbbDbbbDbbbbbbbobDbbbNbobbbbbNbbbbbbbbbqbbbbbqbbbbbbbobqbqbpbbbqbobqbpbobbboa3bmblblb#b#b#aYbfaVaVaIaVaZa9aVaVaVax#2aaanaF#1#QakananaKa6anaTana6anatas#1#1#F#E#P.8.7.Z#e.7.7.M.Y.Y.Y", "#7#M#W#D#D#t#s#D#D#D#D#W#M#M#Z#Z#0aga.a.atalalajajalatatajajajata.as#0#0ag#Z#M#F#7#7#W#M#Z#M#M#M#M#W#D#D#W#D#D#D#s#M#M#D#t#t#D#s#V#t#s#D#M#F#s#v#t#W#F#M#D#W#M#W#Magas#0atasarasag#Z#7agag#7#Zagag#ZagagaDasaragaDasagataUatatatataUa7aHavaHaHaUalaTavaHavaTatatatajatavaUaHatatalatajatakatatalaHalalalatakakata.#1ata.akasas#1a.#1#1#1ai#P#O#P#w.N.o.c.#.b.d.c.c.c.h.h.c.E.S.S.p.S.N.9#x#x#x#M#H#QaaababaoaZaZazaqaZaqbkaqaZayaZayaZb#b#bMa1a1a3a3a3a3a3a3boa3boboa3a3a3bba3bpa3bbbpbba3bbbobpa3a3bobbbbbbbbbbbbbbbbbDbba3a3bDbDbDbbbbbFbbbbbbbFbDbbbobDbba3bNbbbbbbbrbbbrbbbqbbbpbbbbbqbbbbbbbpbbbpbobba3boa1bma1b#b#b#aZaZayayacakacb#aZaZaVavaYaVaxal#2ak#2akak#1#Qakav#P#w#x#Q#h#h#g#M#P#M#Z#P#g.7.M#k#f.Z#f#f.Z", "#M#F#D#D#W#F#D#W#F#W#F#M#Y#M#Z#Zag#0aga.asajatajajajatatataRata.atasasagar#Z#7#F#W#7#s#P#9#M#7#M#M#W#D#M#D#M#D#D#t#M#M#t#D#D#t#t#l#k#k#M#t#t#k#l#k#t#D#M#t#D#7#Mafag#0asatas#0asasag#Mag#Z#Z#Z#Z#Zagafara.asagaDa.asagataHata.asasaUavatatakaHajataHaUajaUavalatatasajatalat#1ataHatatasatatatakatatajakajatasajaka.#1ajasaka.at#1#1as#P#Pag#Z#O#M.R.L.c.d.c.c.c.c.#.c.k.u.N.S.S.S#g#g#x#x#a.V#a#Aak#4axaKaKaoaoazayaZayayayayayayaZb#b#a1a1bma3bmbDbba3bDa3boa3boa3blbmboa3bbbbbbbqa3a3bpa3bbbbbabpa3bobbbbbbbbbbbbbobba3bbbDa3bDbDa3bbbbbbbbbFbDbbbDbbbDbobbbbbbbbbrbbbrbbbbbrbqbbbqbbbpbbbbbpbpbpa3bbboboaObma1b#aZaZaZaVaVaVaYaVaVaVaValaIaIavavaIavavaIaIavavaaak#1#2aFbfat#0#M#t#t.8.8#G#g.8.8#w.Z.M.M.Z.M.Z.M#f", "#D#D#D#W#M#W#W#D#W#W#M#M#D#F#F#W#M#7#Zasa.asajalajatajalalaSalalaja.asa.agagaf#M#7#7#M#M#M#M#M#7#F#F#7#M#D#D#t#D#M#D#t#t#t#t#t#k#f#t#D#D#D#t#t#t#k#D#D#t#D#W#W#M#7#Z#Pagasaga.atasag#M#Maf#M#Magagagagagagarasasarasa.atasagagatatalaHasataRaUaHaHatatatataHatakatatasatatakasasakasasasasasasasasat#1#1at#1#1asak#Pag#1asak#Pag#Pas#1#O#Z#O#O#P#P#G#j.c.b.b.#.c.g.t.D.0#h.m.v.p.p.P.U#j.9#u#Q#2#2#g#x#QaaaIaoaoaoaoazaZaoayaZb#a1a1a1a1a1bmbobba1a1bba3bDa3a3a1a3bma3bDbbboa3bbbbbbbba2bbbpbbbba3bbbqbpbbbqbrbqbbbbbbbbbbbbbbbDbbbbbbbbbbbbbbbbbbbDbbbba3bDbobbbbbbbbbbbbbrbrbbbrbbbqbbbpbbbpbpa3a2babobaa3a3bmbma3a1aoacacaVaVaZa9aYaVaJaVawaIaIal#2acan#2#P#I#I.8.O#g#y#1#2aaaa.R.M.M.M.L#e#m#t#v.7#g#v.M.J.J.K.J.J", "#7#7#F#D#D#D#W#D#W#D#W#D#7#D#W#D#D#D#F#Zag#PajajakajajalalalalaRajata.atas#0#Z#Y#M#Mag#F#D#7#W#D#W#7#M#M#D#D#t#W#E#D#t#t#k#t#t#C#f#v#M#t#W#v#v#t#j#v#D#k#D#D#7#F#W#Z#Zag#Pagasatag#M#W#7#M#YafagasaDagagarasbcasagagasasaDagagaRasatasaga.ataUaHatatasatatatatatasatasauatas#1aias#1asas#9asag#P#9ag#1#1aiak#Pag#1ag#P#Pas#1#P#Z#O#1#P#M#O#Z#M#P#P#P#h.j.b.#.c.g.b.D.S.S.G.G.o.i.f.n.v.S.2#x#H#n#n#K#2aa#K#Sabaoaoayaoazaoazb#aqb#bMa1bla1bla3bDa3bDa3bba3a3a1bma1a1bobba3a3bbbbbbbba3bba3bbbbbpboboa3bobbbbbpbbbpbqbbbbbpbpa3bbbbbDbbbbbbbbbbbbbba3bbbbbobbbDbbbbbbbbbbbbbbbNbbbNbobNbbbobbbba3bpbpboboa3bablaOb#aZaz#5akaaavaIacayaVaIavavak#1avaVak#G.9.R.9.9#h.9.8#P#H#1#M#O#9#D#l#s#e#e#e.8#m#f#f#l#G#D.C.Y.L.L.L", "#M#W#D#D#W#D#F#M#D#D#D#7#M#W#D#W#s#W#D#M#M#Z#1#1asasajalalajajajaja.ata.a.ag#Y#M#Yag#P#F#7#M#F#M#D#M#W#D#D#D#D#M#W#V#l#t#V#t#t#m#k#D#t#t#t#t#k#j#k#t#t#V#D#W#W#W#Mag#Magagag#Pag#Z#7#M#Maf#Masasasagarasasarasarararasasagagaragagasasagasasatatasatarasasasa.asasasasagasagasas#1asaiagas#9#9#Z#9#9agag#9#1as#Pagag#Pag#Pai#9#O#Z#Pag#M#M#M#M#M#y#Z#x.v.b.#.c.b.b.t.G.v.d.a.a.#.c.N.N#h#x#G#h#v#h#v#g#2anaoababaoaoaoazaZaZaZaNb#a1blbla1a1bma3a3a3bba3bDbDbma1bma1bDboboa3a3bobbbbbbbbbbbbbba3a3bqbbbpbqbba3bbbpbbbbbbbba3bbbba3bbbbbbbobbbDbbbDboa3boa3boa3bbbbbbbbbbbobbbbbbbNbbbbbpa3bbbpbobpa3a3a3a3aOb.azazabaYaKaIavaIavaIaKaZaI#J.8#g#g#w#2#P.M.M.M.8.8#l.Y.8#P#O#M#h#u#xaa#H.L.J.7#f#f.R.8.R.M.8#E.7.L.J.L.L", "#M#F#7#7#D#W#V#s#W#V#s#D#W#s#D#F#M#F#D#M#M#M#M#Z#0a.ajajata.akajaja.#1ag#0ag#Z#Pag#M#M#M#M#D#D#F#D#D#D#D#D#t#M#D#D#t#t#t#D#D#t#t#V#C#s#D#t#k#k#f#f#M#s#D#7#v#D#D#M#M#M#M#M#Y#M#Y#M#M#D#M#ZagasaRasasasaDaDaRasaDag#0aDasagararagasasaDaDasa.aRajatasasasasatasasatasagagagasagagagagasag#M#9#9ag#9#M#Zagag#9#9#P#9ag#O#G#M#Eag#Z#O#M#Z#P#I#y#w#Z#w#O#w.S.t.b.a.#.d.j.d.t.d.t.v.F.p.p.m.H.S.U.2#n#n#i#n#o#2#SababaoazazaMaqaMaNa1b.aOaObaa1aOa3bDa3a3bobDa3a3a1a1a1bDa3bDa3bobba3bba3bobbbbbbbbbobobba3bbbpbbbbbpbpa2bbbpa2bpbbbbbbbbbbbbbbbbbbbbbba3bba3a3a3bbbbbbbbbDbbbbbbbobbbbbobba3a3boboa3baa3blb.b.aqazaoaxananaKaIaxacaIak#w#P#P#1al#s#s#w.R.R#g.Z.7.7#e.R.9.8#Z#H#P#Q#H#x#x#P#P#g#h.9.M#e#f.Z.M.J.J#h.8.C.E.E", "#F#F#7#W#D#W#D#D#W#V#D#W#M#F#W#M#7#M#7#M#Z#Zagagasas#1aj#1a.as#1a.ata.a.a.#P#Zagag#M#Y#M#M#F#W#M#D#D#D#D#D#M#D#D#W#k#V#v#D#V#t#t#s#D#s#t#k#f#e#f#k#F#D#M#D#W#M#7#M#Maf#F#M#F#Y#W#M#M#W#MagasatajasaDasasaDasaDasaData.asaDagag#ZaDas#0asasaDaRatajasaDaDasasasasasagasagasagagagag#9as#7#9#7as#9#9#9#M#9#Pag#9#M#M#M#Z#9#O#M#O#P#y#w#O#Z#P#P#y#O#P#w#w.S.t.f.c.d.j.j.j.d.k.h.t.n.i.d.d.m.G.P.0.P.P.U.2#Ha#aaaKadaKazaMb.aqb#b#aNb.b.bla3a3bmbobba3bbbbbba3a3a1a1a1bDbba3bDa3bobbboa3a3bbbbbDa3bobobbbbbpbbbqbqbbbbbbbpbpbbbqbqbpbbbpbbbbbpbbbbbbbbbobba3bDbbbbbbbbbFbbbbbbbobbbbboa3bobobbbbboa1blbab.aMazaK#H#w#wak#3acaxak#Z#v#w#1#P#P#J#Z#w#M.L.L.N#M#y#M#k.R.Y.Z#k#w#O#A#g#g#w#t.9#x.Z.J.J.L.7.M.Z.M.Z.L.Z#h#f.C.J", "#W#W#M#D#W#D#t#W#D#s#t#t#W#D#D#W#M#W#t#W#M#M#M#Z#P#1asa.as#1a.#1asaj#1ajas#0#1a.as#Z#Z#M#7#D#D#D#D#v#W#D#D#M#D#D#t#t#t#t#t#t#t#s#W#t#t#k#e#j#e#k#D#D#D#7#D#F#M#D#M#M#F#F#7#F#W#7#F#W#Fagas#1atatatasatataRasajaDasasaDaDagasagagasasarasagaRasaDatasasagasasasasas#0agatagag#9ag#Mag#9#7#M#M#9#9ag#7#M#7#M#9#O#M#M#G#M#9#P#9#O#M#G#G#G#x#O#P#O#P#O#y#G.9.K.g.a.t.g.j.d.b.k.g.t.i.h.k.i.P.P.N.D.G.S#j#h#Q#2aaaoaoadazaMaNaMaNaNb.aNaOaObla3a3boa3bba3boa3a3a1bla3bDa3a1a3bDa3boa3bDbbbbbDbbbba3bbbbbbbbbbbbbqbqbbbqbqbbbqa3bqbbbbbbbbbbbbbbbpbbbbbba3bbboa3bbbbbDbbbbbbbbbbbobobbbobbbobbbobbbmbla1b#b#axaxanavaxaVaKaxaVaVav#P#Z#Q#O#h#g#O#Pal#v.7.R.M#w#1#x.R#j.R#k#v#O#Z#P#3#1#1#g#k#O#Z#l#f#f.7.M#f.7#f#f.7#v#E.J.J" }; SIMPLE = T BITPIX = 8 NAXIS = 2 NAXIS1 = 347 NAXIS2 = 200 HISTORY Written by XV 3.10a END }}†|}|t}|rtt}||}†}t}†††‰˜™™™˜™˜™¡˜¡™‘˜™™‰‰†‡|||||}||†||tttttttr}ttnioin|||‡|}†|††}}‡}}‡}}}“™˜ŸŸŸ™ŸŸ¢™¡œ™™œœ“™““™™”™“¢™œŸ™™“™™™™™‘“Ÿ““’“†“’‡††’’“‡†‡†’Œ††††’’Œ††††‡ŒŒŒŠ†oV;7I;AA6@;IG<@Gnn_Q[go{™£§»»¼ÃÉÒÉÒÒÓÒÖÖØÝÝãÝåÝãÝÝÙØÝâÝÙÝâÝãÝâååâååÝååååååììåììåìÝìåååååååæåååÝåãÝååâåååååããåãåãåãåÝØÙÑѳ³«­³½»³½½­‰™Œ{xŒ¤|`e]…˜‡eoen|Œ‰Ÿ˜˜xnŒ‰ohh`]h`hh`|SS}}‡}|}||}~|}†}}†‡†‡†‰‰““™™˜¡˜™™˜™Ÿ™™™‰““†‡††}}†|||||†||}n~||~ttr|rtnhihn}|†|}†‡††‰}†}‡}††}†“™Ÿ¡™œ™™œ™œ™œŸ™™œ““‰œ™‘™™œ¢Ÿ¡™œœ™™™™™“™“™““““’™‡’‡™’’’†’“’†††‰’Œ†ŒŠ…Œ‰ŠŒ……gI>6AAAAA@IQg~‡“’’££§£¬³»»¾»Ã»ÃÑÇÑÙÙØÙØÝâÝâÝåÝÝÙÝÙÙãåÝÝååååÝåÝååæããÝãååæåæìååææÝååâåååååååÝååãåâåååååååïåïãïåãååÝææããÝÜØÖÑÉ뤧­µ³¾½µ­­¤˜­½¤†oeoo{om“˜†Œ’|oriiimthho†|K^WWW|||}†}}|}}††|}}}†‡‰™™™¡¤¡Ÿ¡¤¤¦¤¤¡™™™““‰†‡‡†††††‡}}‡†||t|†|tttttnht|||tttn||t|}}†‡‰“™“™Ÿ™“††‰††““““““”™™”™™Ÿ™““ŸŸ¤¥™Ÿ¢¬¥¥ŸŸŸŸ¥Ÿ¤ŸŸ™ŸŸ¤™™¤™™™™™™™™Ÿ˜˜Ÿ˜˜™¤“˜™¤“™˜Œ‰ŒŒ†o666/6;IQr{SQ[[ntoo~™££x‡™§µ»»»»ÃÉ»¾ÉÑÙÙÙÙÙÝãåÙÙåÝâÝÝÙÝÝÝâåãÝååååÞåæååÝåìæåìîìåååååååâåååååååååâååÝâãååååååîîåîåìåæåææÝÞÜãÜÝÝÝÝÝÙ»³³½½ÉÆÃ½³½«µµ¤£³«£mkxŠ˜£§§e]]]Witt|`x|]SSVSS†}||}}|}}}}†‡†‰‰“‘“™™¡Ÿ¡¡¡ŸŸŸ¢Ÿ™Ÿ™™“”‰‡}}‡r’†‡††}|†|†||t††t||ttonn†ttnont|†t|‡†‰“‘™Ÿ™‘™™“†“‰‰‰‰‰“‰”™™“œ™™“Ÿ¥Ÿ™™™¬­ŸŸ¤¥¡Ÿ¥¬¡¬­¤ŸŸ™¡Ÿ¤Ÿ˜Ÿ¥ŸŸ™ŸŸŸ¤ŸŸ¡¤¡Ÿ™¡¤™˜¡™¤™Ÿ˜˜™“‰Œ†eW6A6666/6@J_gggxx‡‡†x†¤«³»»»»Ã¾É¾¾¾¾¾¾ÉÑÑÙÙÝÝÝâåÝâÝãÝãÝØÝãÝåååìÝÝæÝååÜæÝãååååååãåÝåâÝââÝååååèâåâåâãååååîåîååîìåìåæååæææÝåããÖÝÙÑÉÉɽ½½Ã½½½½¤µµ­­µ­­µµ­­§¤˜£¨½Ÿ‘†ttmm†xmm…e]]e]e]h‡†}||tr||||}††‰‰‘“™™Ÿ¤¤¡¡¤ŸŸ¡¡¡Ÿ™™‘‘“‰†}‡‡}†‰††††}||}|||r††|tt|r~tr|†}r|t}}†|}†}†“™‘Ÿ™”™“‰‡““‡‰““‰““œ™”“œ™“Ÿ¬ŸŸŸŸ¬´¥­¥¥¬¤¯­¥­¯ŸŸŸ¡Ÿ­¬¥ŸŸ¤Ÿ¡Ÿ¤ŸŸ¤¥¤¤¤Ÿ¤¤Ÿ™˜Ÿ™¤™™˜™˜˜˜šŒ…_M6/6A666<<6Rgg[g_o‡‡‡†“™§³³»ÉÉÃÇÉÇÍÇɾɾÉÑÑÙÙÙÝÝÝÝÝÝãÝããÝÝÝåÝæÝåæåÝåãæÝÝãååååååååâåÝÝâââååèåååèâåãâåÝïåååîåîåìåæååìåååæåæãåÝãÙÝÙÑÑÑÉɾ¾³¤³ÑÉɽ­Ã½³¤£¤£¤¤˜™¤­…‡™{{x††‰x`]nhehhe†|}}|}}}}}}†}}‡†‰“¡™Ÿ¤«¤¢¥««­¡Ÿ¡™™‘“‡†‡†‡‡}|}††|††|}|}|†}ttt|||nt|r†r|}|t†’†††}†™“Ÿ“‘œ““‰“‰†“““™“™™™™™“Ÿ™™Ÿ¥¡Ÿ¥«¯µ­¥­¥­­­¥¥¬¤Ÿ¤¤¬¥¡¥¬¤¥¢ŸŸ¡¥¤¤¬¤«¦­¤¤­ŸŸ¡¡¡™¤Ÿ¤¤˜˜¤˜‰tRG6<6AGAGQVQSei{xtoort{t‡¡¡«¡³»»¾ÉÑÉÑÑÑÑÑÉØÝÝØÑÙÝãÝÝãÝÝããÝããæÝæååÝÝæããæÝÝÝÝÝæÝååããÙãâãÝååâåâåååãâåïãååïååååìååìåååãììæåìãìæãåãÝÝØØÑÑÑý½½µ½Éƽ½½³£§«¨˜™¤««»·«¯«·«Ÿ™˜˜}m`ei``]^^^‡}t}rt||‡}}r}†‡†‰˜™Ÿ¡¥­¬ŸŸ¡­¦¤¡™Ÿ“““‰‡‡‡‡†}†}|†|}†}r|t}|}tn|†|nt|not|’|~r|||‰†‡‡††““™“”“““““‡‡““““™“™™Ÿ“™™™¤Ÿ¡ŸŸ¤¥­­­¯¯¥¤¯¥¥­¥Ÿ¥Ÿ¡¬¤¦¤«­¦Ÿ¥¥¡­¤¥­­¥¬¤¤¤¤¡¡¤Ÿ˜¤¤¤¤¤Ÿ˜¤¤†tnQAIIIIQVJJVi|˜‡~£´¼»¼ÉÉÑÓÓÑÇÓÓØÙØÒÉÉÉÑÇÑÉÉÉÉѾ¾ÉÙÙÝÝååÙÝåÝÝÝÝÝåÝãÜÝÜÖãÝÜÉÃØÜÖܿܿååååîåååèîîååîåååèåååãåååååååæååææãìæããØÜÑÇæÇÝÝÃÒŸ™|noom¤³½ÉÑØÙÙÜÜÙæÙÜãæÙææÝÝÝÝ}|††††††}‡†‡|}}|}~||t}‡||‡†‡|†~|}††|}t}|~t††}t|tttnn|†|nn|t††|¤¤™Ÿ™Œ||†Œ¯¨§««§¤˜¡««¨Œ“˜­˜¤«¤˜˜¤˜Š˜£¤¤˜Ÿ«­­µ­­¤­­¤¤­«µ¤¤³­»³µµ³»µ»­­­³­«·­µµ³µ³µµ»³½»µ»³³µ³µ¤¤§¨…|]VJAII;6IA/AA/66‡£x;[VagV_g__]a{«´³§«Ã»ÃÃÇÉÇÒÓÙÓÉÇÇÙÝÙѾ¾ÉÉÑÃÉÉÆÇ¾ÙÙÙååååååååÝÝåååÝãÝããÝÜÝÜÃ³ÓØÜãããããåîåèåîåîåçîîîèèîåîèåååïååìããååæåÝåìæãæÝÝÖÒÙÝÑÒ½­¡¤†š¨¤“Œ˜«½ÉÑÙÙÜãÜÙïÜïæÙÙæÝãÜÝÜÝ|†††|||†|†}|}}|}t|t|ttttt~|tt}tt~t|†||r||~tt|†|nnoooth†Œ}noot’†|“¤˜††¤Ÿ†Œ¥­³«µµ§˜˜«­¡¤­¤˜¤¡«­¤ŸŸŸ¡­¤¤¤¤¤¤¤¤¡¤­­­­­µµ­³¤­¤­«­«µµµµµµ«­«µµ³µµ»»³³»µ³³µ³³³µ«­¤¤¤…}mi_R * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_Audio_xpm[] = { "28 28 6 1", " s backgroundToolBarColor c None", ". c black", "X c lightcyan", "o c gray90", "O c gray25", "+ c gray50", " ", " ........................ ", " .XXXXXXXXXXXXXXXXXXXXXX. ", " .XXXXooooooooooooooXXXX... ", " .XXXXo OXXXX... ", " .XXXXo OXXXX... ", " .XXXXo +. +.+ OXXXX... ", " .XXXXo .. .+. OXXXX... ", " .XXXXo +.+ OXXXX... ", " XXXXXo OXXXXX+. ", "o.OXXXo OXXXO.X. ", " X .XXo ... OXX. X+. ", " .XX.Xo ..... OX.XX... ", " .XXXXo ....... OXXXX... ", " .XXXXo ....+..+. OXXXXX+. ", " XXXXXo ...+O..O. OX....X. ", "o....Xo ......O+. OXXXXX+. ", " XXXXXo ....O+. OXXXX... ", " .XXXXo .+O+. OXXXX... ", " .XX.Xo ... OX.XX... ", " X .XXo OXX. X+. ", "o.OXXXo OXXXO.X. ", " XXXXXoOOOOOOOOOOOOOXXXXX+. ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .......................... ", " ........................ ", " ........................ ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-Blank.xpm000066400000000000000000000022701256455547000206720ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yoshiaki Kasahara * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_Blank_xpm[] = { "28 28 4 1", " s backgroundToolBarColor c None", ". c black", "X c lightcyan", "o c gray50", " ", " ........................ ", " .XXXXXXXXXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .X .. XXXXXXXXXXXXX.XXX... ", " .X.XX.X.XX.XXXXXXXX.XXX... ", " .X.XX. .. .. . X . .. X... ", " .X.XX.X.XX.XXX.X.XX.X.X... ", " .X....X.XX.Xo..X.XX.X.X... ", " .X.XX.X.XX.X.X.X.XX.X.X... ", " .X.XX.X.XX.Xo... . .X.X... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXX.XXXXXXXXXXXXXX... ", " .XXXXXXX.XXXXXXXXXXXXXX... ", " .XXXXXXX.. X . X. . . X... ", " .XXXXXXX.X.X.X.X..X.X.X... ", " .XXXXXXX.X.X...X.XX...X... ", " .XXXXXXX.X.X.XXX.XX.XXX... ", " .XXXXXXX.X.X ..X.XX ..X... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .......................... ", " ........................ ", " ........................ ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-External.xpm000066400000000000000000000023241256455547000214250ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yoshiaki Kasahara * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_External_xpm[] = { "28 28 6 1", " s backgroundToolBarColor c None", ". c black", "X c lightcyan", "o c gray50", "O c gray90", "+ c red", " ", " ........................ ", " .XXXXXXXXXXXXXXXXXXXXXXoOOO", " .XXXXXXXXXXXXXXXXXXXXX+++++", " .XXXXXXXXXXXXXXXXXXXX++++++", " .XXXXXXXXXXXXXXXXXXX+++++++", " .XXXXXXXXXXXXXXXXXXX+++++++", " .XXXXXXXXXXXXXXXXXX++++++++", " .XXXXXXXXXXXXXXXXXX+++XoooO", " .XXXXXXXXXXX+XXXXX+++XX... ", " .XXXXXXXXXX++XXXX+++XXX... ", " .XXXXXXXXX+++XX+++++XXX... ", " .XXXXXXXX++++++++++oooo... ", " .XXXXXXX+++++++++++oooo... ", " .XXXXXX+++++++++++ooooo...o", " .XXXXXXX+++++++++oooooo...o", " .XXXXXXXX++++++oooooooo...o", " .XXXXXXXXX+++XXXXXXXXXX...o", " .XXXXXXXXXX++XXXXXXXXXX...o", " .XXXXXXXXXXX+XXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .......................... ", " ........................ ", " ........................ ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-Folder.xpm000066400000000000000000000023031256455547000210530ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_Folder_xpm[] = { "28 28 5 1", " s backgroundToolBarColor c None", ". c black", "X c lightcyan", "o c gray60", "# c white", " ", " ........................ ", " .XXXXXXXXXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXX....XXXXXXXXXXXXX... ", " .XXXX.####..XXXXXXXXXXX... ", " .XXX.#oooo#..........XX... ", " .XXX.#ooooo########..XX... ", " .XXX.#ooooooooooooo..XX... ", " .XXX.#ooooooooooooo..XX... ", " .XXX.#ooooooooooooo..XX... ", " .XXX.#ooooooooooooo..XX... ", " .XXX.#ooooooooooooo..XX... ", " .XXX.#ooooooooooooo..XX... ", " .XXX.#ooooooooooooo..XX... ", " .XXX.#...............XX... ", " .XXX.................XX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .......................... ", " ........................ ", " ........................ ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-Image.xpm000066400000000000000000000023601256455547000206650ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yoshiaki Kasahara * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_Image_xpm[] = { "28 28 8 1", " s backgroundToolBarColor c None", ". c black", "X c lightcyan", "o c white", "O c gray25", "+ c gray50", "@ c Yellow", "# c yellow4", " ", " ........................ ", " .XXXXXXXXXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXoooooooooooooooooXXX... ", " .XXo...............oXXX... ", " .XXo.o....OOO......o++X... ", " .XXo....OOOOOO@..o.o++X... ", " .XXo...OOOOOOO#@...o++X... ", " .XXo...OOOOOOOO@...o++X... ", " .XXo..OOOOOOOO#@#..o++X... ", " .XXo..OOOOOOOO@@@..o++X... ", " .XXo..OOOOOOO#@@#..o++X... ", " .XXo...OOOOO#@@@..@o++X... ", " .XXo...@#O#@@@@#...o++X... ", " .XXo....@@@@@@#....o++X... ", " .XXo......#@#....o.o++X... ", " .XXo...............o++X... ", " .XXooooooooooooooooo++X... ", " .XXXX+++++++++++++++++X... ", " .XXXX+++++++++++++++++X... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .......................... ", " ........................ ", " ........................ ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-Octet-Stream.xpm000066400000000000000000000023631256455547000221550ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yoshiaki Kasahara * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_OctetStream_xpm[] = { "28 28 8 1", " s backgroundToolBarColor c None", ". c black", "X c lightcyan", "o c gray90", "O c gray25", "+ c gray50", "@ c gold", "# c white", " ", " ........................ ", " .XXXXXXXXXXXXXXXXXXXXXX. ", " .XXXXXXXooooooooXXXXXXX... ", " .XX..O..++++++++..oXXXX... ", " .XX..O..+++++..+...oXXX... ", " .XX..O..+++++..+.@..oXX... ", " .XX..O..+++++..+....+oX... ", " .XX..O..+++++..+.@@.++X... ", " .XX..OOO++++++++....++X... ", " .XX.................++X... ", " .XX.................++X... ", " .XX..#############..++X... ", " .XX..#############..++X... ", " .XX..#############..++X... ", " .XX..#############..++X... ", " .XX..#############..++X... ", " .XX..#############..++X... ", " .XX..#############..++X... ", " .XX..#############..++X... ", " .XX..#############..++X... ", " .XXXX+++++++++++++++++X... ", " .XXXX+++++++++++++++++X... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .......................... ", " ........................ ", " ........................ ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-Postscript.xpm000066400000000000000000000023241256455547000220150ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yoshiaki Kasahara * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_Postscript_xpm[] = { "28 28 6 1", " s backgroundToolBarColor c None", ". c black", "X c lightcyan", "o c pink", "O c gray50", "+ c red", " ", " ........................ ", " .XXXXXXXXXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XX... X .. XXXXXXXXXXX... ", " .XX.XX.X.XX.XXXXXXXXXXX... ", " .XX.XX.X.XXXXXXXXXXXXXX... ", " .XX... X .. XXXXXXXXXXX... ", " .XX.XXXXXXX.XXXXXXXXXXX... ", " .XX.XXXX.XX.XXXXXXXXXXX... ", " .XX.XXXX .. XXXXXXXXoooOOO ", " .XXXXXXXXXXXXXXXo+++++++++ ", " .XXXXXXXXXXXXXo++oooXXXOOO+", " .XXXXXXXXXXXo++oXXXXXXX... ", " .XXXXXXXXXXo+oXXXXX OO... ", " .XXXXXXXXXX+oXXXX OOO ... ", " .XXXXXXXXXo+XXX OO XXXX...O", " .XXXXXXXXX+oXX O XXXXXX... ", " .XXXXXXXXo+XXXO XXXXXXX... ", " .XXXXXXXX+oXX OXXXXXXXX... ", " .XXXXXXXX+oXXO XXXXXXXX... ", " .XXXXXXXX+oX OXXXXXXXXX... ", " .XXXXXXXo+XX OXXXXXXXXX... ", " .XXXXXXXo+XXO XXXXXXXXX... ", " ........O+O............... ", " ......O+O............... ", " ......O+O............... ", " + O "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-Rfc822.xpm000066400000000000000000000023411256455547000206100ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yoshiaki Kasahara * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_Rfc822_xpm[] = { "28 28 7 1", " s backgroundToolBarColor c None", ". c black", "X c lightcyan", "o c gray50", "O c white", "+ c brown", "@ c gray25", " ", " ........................ ", " .XXXXXXXXXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " o.....................X... ", " o.OOOOOOOOOOOOOOOOOOO.X... ", " o.OOOOOOOOOOOOOOO+++O.o@.. ", " o.OOOOOOOOOOOOOOO.++O.o@.. ", " o.OO...........OO.@+O.o@.. ", " o.OOOOOOOOOOOOOOOOOOO.o@.. ", " o.OO.........OOOOOOOO.o@.. ", " o.OOOOOOOOOOOOOOOOOOO.o@.. ", " o.OOOOOOOOOOOOOOOOOOO.o@.. ", " o.OO......O....OOOOOO.o@.. ", " o.OOOOOOOOOOOOOOOOOOO.o@.. ", " o.OOOOOOOOOOOOOOOOOOO.o@.. ", " o.....................o@.. ", " .XXoooooooooooooooooooo@.. ", " .XXoooooooooooooooooooo@.. ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .......................... ", " ........................ ", " ........................ ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-Text.xpm000066400000000000000000000022671256455547000205750ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yoshiaki Kasahara * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_Text_xpm[] = { "28 28 4 1", " s backgroundToolBarColor c None", ". c black", "X c lightcyan", "o c gray50", " ", " ........................ ", " .XXXXXXXXXXXXXXXXXXXXXX. ", " .XXXX XXXXXXXXXXXXXXXXX... ", " .XXXX.XXXXXXXXXXXXXXXXX... ", " .XXX . XXX..X.......XXX... ", " .XXXo oXXXXXXXXXXXXXXXX... ", " .XXX.X.XXX.....X..X..XX... ", " .XX ... XXXXXXXXXXXXXXX... ", " .XX. X .XX...X.X.....XX... ", " .X...X...XXXXXXXXXXXXXX... ", " .XXXXXXXXX....X.XXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXX.......X...X.X...XX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XX...X..X...X......XXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XX.......X.X...X....XX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXX...X..X.XXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXX.........X..X....XX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .......................... ", " ........................ ", " ........................ ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-Unknown.xpm000066400000000000000000000023101256455547000212750ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yoshiaki Kasahara * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_Unknown_xpm[] = { "28 28 5 1", " s backgroundToolBarColor c None", ". c black", "X c lightcyan", "o c gray50", "O c gray90", " ", " ........................ ", " .XXXXXXXXXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXX ....o XXXXXXX... ", " .XXXXoXXo.OXXO .oXXooXX... ", " .XXXXXXo.OXXXXXo. XXXXX... ", " .XXooXX..XXoooXX.oXooXX... ", " .XXXXXX..oXXXXXX.oXXXXX... ", " .XXoooXo.oXoXoX . XoXXX... ", " .XXXXXXXoXXXXXXooXXXXXX... ", " .XXoXoXXXXooXXo. XXXXXX... ", " .XXXXXXXXXXXX .OXXXXXXX... ", " .XXXXooooXoXO.OXXoXXXXX... ", " .XXXXXXXXXXXooXXXXXXXXX... ", " .XXoooXooooX.XXooooXoXX... ", " .XXXXXXXXXXX XXXXXXXXXX... ", " .XXooooXoXoXXXoooXoooXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXooooXoX . XoooXXXXX... ", " .XXXXXXXXXX...XXXXXXXXX... ", " .XXooXoooXX . XoooooXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .......................... ", " ........................ ", " ........................ ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-Video.xpm000066400000000000000000000023611256455547000207120ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yoshiaki Kasahara * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_Video_xpm[] = { "28 28 8 1", " s backgroundToolBarColor c None", ". c black", "X c lightcyan", "o c brown", "O c gray50", "+ c white", "@ c gray25", "# c lightblue", " ", " ........................ ", " .XXXXXXXXXXXXXXXXXXXXXX. ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XooooooooooooooooooXXX... ", " .Xo................oXXX... ", " .X..................OOX... ", " .X..+@..######..@+..OOX... ", " .X.+@.O.######.O.@+.OOX... ", " .X.+@.O.######.O.@+.OOX... ", " .X..+@..######..@+..OOX... ", " .X..................OOX... ", " .X..................OOX... ", " .X..................OOX... ", " .XXXOOOOOOOOOOOOOOOOOOX... ", " .XXXOOOOOOOOOOOOOOOOOOX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .XXXXXXXXXXXXXXXXXXXXXX... ", " .......................... ", " ........................ ", " ........................ ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-attach.xpm000066400000000000000000000017221256455547000211100ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_attach_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", ".............. ", ".XXXXXXXXXXXX. ", ".XXXXXXXXXXXX. ", ".XX.. . . ..X. ", ".XXXXXXXXXXXX. ", ".XX.. .............. ", ".XXXXX. . ", ".XX.. . o . ", ".XXXXX. o X. .. . ", ".XXXXX. XooX. .XX. . ", "....... Xoo.............", " ooooo. Xoo.oo.ooooo.oo.", " . ....oo..ooo..oo.", " . .oo.X...X.oo.", " . .oo.XXXXX.oo.", " ......oo.X.X.X.oo.", " .o.XX.X.XX.o.", " .oo.XX.XX.oo.", " .ooo.....ooo.", " .oo.XXXXX.oo.", " .............", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-cite.xpm000066400000000000000000000017201256455547000205660ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_cite_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", " ", "................... ", ".XXXXXXXXXXXXXXXXX. ", ".XXXXXXXXXXXX...XX. ", ".XXXXXXXXXXXX.o.XX. ", ".XXX.......XX...XX..... ", ".XXXXXXXXXXXXXXXXX.XXX. ", ".XXX.......XXX.XXX.XXX. ", ".XXXXXXXXXXXX.X.XX.XXX. ", ".X.XXXXXXXXXXX.XXX.XXX.o", ".X.XXXXXXXXXXXXXXX.XXX.o", "...................XXX.o", " o.oo.XXXXXXXXXXXXXXXX.o", " . .X.XXXo X....XXXX.o", " . .X..XXXXXXXXXXXXX.o", " ........Xo X....XXXX.o", " .X..XXXXXXXXXX....o", " .X.XXXo X....X.X.o ", " .XXXXXXXXXXXXX..o ", " ...............o ", " oooooooooooooo ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-forward.xpm000066400000000000000000000017241256455547000213120ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_forward_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", ".................. ", ".XXXXXXXXXXXXXXXX.o ", ".XXXXXXXXXXX...XX.o . ", ".XXXXXXXXXXX.o.XX.o.. ", ".XX.......XX...XX...... ", ".XXXXXXXXXXXXXXXX.o.. . ", ".XX.......XXXXXXX.o . . ", ".XXXXXXXXXXXXXXXX.o . ", ".XXXXXXXXXXXXXXXX.o . ", ".XXXXX..................", "......XXXXXXXXXXXXXXXX.o", " oooo.XXXXXXXXXXX...XX.o", " .XXXXXXXXXXX.o.XX.o", " .XX.......XX...XX.o", " .XXXXXXXXXXXXXXXX.o", " .XX.......XXX.XXX.o", " .XXXXXXXXXXX.X.XX.o", " .XXXXXXXXXXXX.XXX.o", " .XXXXXXXXXXXXXXXX.o", " ..................o", " oooooooooooooooooo", " ", " ",}; kazu-yamamoto-Mew-ff9c41b/etc/mew-inc.xpm000066400000000000000000000020241256455547000204110ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yoshiaki Kasahara * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_inc_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c Gray60", "o c white", " ", " ", " .............. ", " .XXX..X..oooooo. ", " .XXXXXX.XX.oooooo. ", " .XXXXXXX.XXX.ooooo. ", " .XXXXXX.X....oooooo.", " .XXXXXXX.X. .o...o.", " .XXXXXXX.X.....ooooo.", " .XXXXXXX.XXX.o.o...o.", " .XXXXXXX.XX.oo.oo.oo.", " .XXXXXXX.X.ooo.oo.oo.", " .XXXXXXX..ooo..oo.oo.", " .XXXXXXX.ooo.o.ooooo.", " .XXXXXX.oo..o..ooooo.", " .XXXXX.o..oooo.ooooo.", " .XXXX.o.oooooo.oooo..", " .XXXX..........oo.. ", " ................. ", " .ooooooooooooo. ", " .ooooooooooooo. ", " ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-lock.xpm000066400000000000000000000012011256455547000205640ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 2003 Yuuichi Teranishi * Copyright (C) 2003 Kazu Yamamoto * Copyright (C) 2004 Yoshifumi Nishida * Copyright notice is the same as Mew's one. */ static char * yellow3_xpm[] = { "14 14 7 1", " c None", ". c #B07403", "+ c #EFEE38", "@ c #603300", "# c #D0A607", "$ c #FAFC90", "% c #241100", " .++++@ ", " .+@...+@ ", " .+@ .+@ ", " .+@ .+@ ", " .+@ .+@ ", "++########@@@@", "+$$++++++++#@@", "+$++++%@+++#@@", "+$+++%%%@++#@@", "+$+++%%%@++#@@", "+$++++%@+++#@@", "+$++++%@+++#@@", "+$+++++++++#@@", "++@@@@@@@@@@@@"}; kazu-yamamoto-Mew-ff9c41b/etc/mew-next.xpm000066400000000000000000000017201256455547000206200ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_next_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", " ", " ", " ", " ........ ", " .XXXXX.. ", " .Xoooo.. ", " .Xoooo.. ", " .Xoooo.. ", " .Xoooo.. ", " .Xoooo.. ", " .Xoooo.. ", " .Xoooo.. ", " ...Xoooo.... ", " .XXooooo.. ", " .XXooo.. ", " .XXo.. ", " .X.. ", " .. ", " ", " ", " ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-pgp-enc.xpm000066400000000000000000000017231256455547000211760ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_pgp_enc_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", "............... ", ".XXXXXXXXXXXXX. ", ".X...X...X...X. ", ".X.X.X.X.X.X.X. ", ".X...X...X...X. ", ".X.XXXXX.X.XXX. ", ".X.XXX...X.XXX. XXXXX ", ".XXXXXXXXXXXXX.Xooooo ", "..............Xo....Xo. ", " Xo. Xo. ", " ooo Xo. Xo. ", "o...o XXXXXXXXXX.", "o. ooooooooo X oooooo..", "o. o....o... X oooooo..", "oooo. .. . X oooooo..", " ... X oooooo..", " X oooooo..", " X oooooo..", " ...........", " ", " ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-pgp-sigenc.xpm000066400000000000000000000017261256455547000217040ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_pgp_sigenc_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", "............... ", ".XXXXXXXXXXXXX. ", ".X...X...X...X. ", ".X.X.X.X.X.X.X. ", ".X...X...X...X. ", ".X.XXXXX.X.XXX. ", ".X.XXX...X.XXX. ", ".XXXXXXXXXXXX.. XXXXX ", "............. Xooooo ", " .X. Xo....Xo. ", " .XX. Xo. Xo. ", " .......XXX. Xo. Xo. ", " XXXXX.XX X. XXXXXXXXXX.", " XXXX.XX. . X oooooo..", " XXX.XX. X. X oooooo..", " XXX.X. X.X X oooooo..", " XXX.. X.o X oooooo..", " XXX.....ooooX oooooo..", " XX. .ooo X oooooo..", " X.XXXXX. ...........", " ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-pgp-sign.xpm000066400000000000000000000017241256455547000213720ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_pgp_sign_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", "............... .", ".XXXXXXXXXXXXX. .", ".X...X...X...X. ..", ".X.X.X.X.X.X.X. .X.", ".X...X...X...X. .XX.", ".X.XXXXX.X.XXX......XXX.", ".X.XXX...X.XXX.XXX.XXX. ", ".XXXXXXXXXXXXX.XX.XXXX. ", "...............X.XX. . ", " .XXXXXXXXXXXXXX.X. X. ", " .XXXXXXXXXXXXXX.. X.o ", " .XXXXXXXXXXXXXX.....o ", " .XXXXXXXXXXXXX. .o ", " .XX..XXXXXXXXX .ooo", " .X.X....XX..X.XX X..ooo", " ..XX.X.X.....X.X..X.o ", " .XX.X.X.X.XX.X..X.X.o ", " .XX.X.X.X...XX.X.XX.o ", " .XXXXXXXXXXXXXXXXXX.o ", " ....................o ", " oooooooooooooooooooo ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-prev.xpm000066400000000000000000000017201256455547000206160ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_prev_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", " ", " ", " ", " .. ", " .X.. ", " .XXo.. ", " .XXooo.. ", " .XXooooo.. ", " ...Xoooo.... ", " .Xoooo.. ", " .Xoooo.. ", " .Xoooo.. ", " .Xoooo.. ", " .Xoooo.. ", " .Xoooo.. ", " .Xoooo.. ", " .XXXXX.. ", " ........ ", " ", " ", " ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-queue.xpm000066400000000000000000000017201256455547000207660ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_comp_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", " ", " . ", " .X.o ", " .XXX.o ", " .XXXXX.o ", " .XXXoXXX.o ", " .XXXoXX XX. ", " ..XXXoXXoXX.oo ", " ...XXXoXXoXX.oo ", " ..X.XXXoXXoXX.oo ", " ..XX.XXXoXXoXX..o ", " ..XXXX.XXXXoXX. .. ", " .X.XXXX.XX XX. .X.o ", " .XX..XXX.XXX...XX.o ", " .XXXX..XX.X..XXXX.o ", " .XXXXXX....XXXXXX.o ", " .XXXXX XX XXXXX.o ", " .XXX XXXXXX XXX.o ", " .X XXXXXXXXXX X.o ", " ................oo ", " oooooooooooooooo ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-refile.xpm000066400000000000000000000017221256455547000211120ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_refile_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", " .. ", " .XX. ", " o.XXXX. ", " .XXXXXX. ", " .XXXX.XX. ", " .XXXX.XX. ", " .XXXX.XX. ", " .... .X XXXX. ", " .XXXX.. .XXXX. ", " .XooooX.......... ", " .XoooooXXXXXXXX.. ", " .Xooooooooooooo.. ", " .Xooooooooooooo.. ", " .Xooooooooooooo.. ", " .Xooooooooooooo.. ", " .Xooooooooooooo.. ", " .Xooooooooooooo.. ", " .Xooooooooooooo.. ", " .X............... ", " ................. ", " ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-reply.xpm000066400000000000000000000017211256455547000207760ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_reply_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " .. ", " .X. ", "............... ..XX. ", ".XXXXXXXXXXXXX. .XXXX. ", ".XXXXXXXXXXXXX..XXXX. ", ".XXXXX.........XXXXX. ", ".XXXXX.XXXXXX.XXXXX. ", ".XX....XXXXX.XXX.X..o ", ".XXXXX.XXXXX.XX.XX..o ", ".XXXXX.XXXX.XX.XX.X.o ", ".XX....XXX..X.XX.XX.o ", ".XXXXX.XXX.X.XX.XXX.o ", ".XXXXX.XXX..X..XXXX.o ", ".XX....XXX...XXXXXX.o ", ".XXXXX.XXX.XXXXXXXX.o ", ".XXXXX.XX.XX .oo ", ".XXXXX.X. .oooo", ".XXXXX.XXXXX .oo ", ".......XXXXXXXXXXXX.o ", " .XXXXXXXXXXXX.o ", " ..............o ", " ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-send.xpm000066400000000000000000000017201256455547000205730ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_send_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", " ", " ", " ", " ", " ", " ................", " .XXXXXXXXXXXXXXX.", " .XXXXXXXXXXoooXX. ", " .XXXXXXXXXXoooXX. ", " .XX.......XXXXXX. ", " .XXXXXXXXXXXXXXX. ", " .XX.......XXXXXX.ooooo", " .XXXXXXXXXXXXXXX.ooooo ", " ................ooooo ", " ooooooooooooooooo ", " ooooooooooooooooo ", " ooooooooooooooooo ", " ", " ", " ", " ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-sep.xpm000066400000000000000000000005541256455547000204350ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_sep_xpm[] = { "2 28 1 1", " s backgroundToolBarColor c None", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-show.xpm000066400000000000000000000017201256455547000206220ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_show_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c Gray60", "o c white", " ", " ", " ............. ", " ..Xoooooooooo.X ", " .o.Xoooooooooo.X ", " .oo.Xoooooooooo.X ", " .............ooo.X ", " .XXXXXoooooooooo.X ", " .ooooooooooooooo.X ", " .oo..........ooo.X ", " .ooooooooooooooo.X ", " .ooooooooooooooo.X ", " .oo..........ooo.X ", " .ooooooooooooooo.X ", " .ooooooooooooooo.X ", " .oo..........ooo.X ", " .ooooooooooooooo.X ", " .ooooooooooooooo.X ", " .ooooooooooooooo.X ", " .ooooooooooooooo.X ", " .................X ", " XXXXXXXXXXXXXXXXX ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-write.xpm000066400000000000000000000017211256455547000207750ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_write_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", " ................... ", " .XXXXXXXXXX..XXX. ", " .XXXXXXXXX.XXXX. ", " .XXXXXXXX.XXXX.. ", " .XXXXXXX.XX.XX.. ", " .XXXXXX.XX.XX. . ", " .XXXXX.X.XX. X. ", " .XXXXX.X... XX. ", " .XXXXX... XXX. ", " .XXXXX.. XXXXX. ", " .XXXXX.. XXXXXX. ", " .XXXX. XXXXXXX. ", " .X.......XXXXXX. ", " .X.X oo..XXXXXX. ", " .X.......XXXXXX. ", " .XX.oo..XXXXXXX. ", " .XX.XX o..XXXXX. ", " ....oXX oo....... ", " .. oo.. ", " ..ooo.. ", " ..... ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/etc/mew-yank.xpm000066400000000000000000000017201256455547000206040ustar00rootroot00000000000000/* XPM */ /* * Copyright (C) 1997 Yuuichi Teranishi * Copyright (C) 1997 Kazu Yamamoto * Copyright notice is the same as Mew's one. */ static char * mew_yank_xpm[] = { "24 24 4 1", " s backgroundToolBarColor c None", ". c black", "X c white", "o c Gray60", " ", " ", "................... ", ".XXXXXXXXXXXXXXXXX. ", ".XXXXXXXXXXXX...XX. ", ".XXXXXXXXXXXX.o.XX. ", ".XXX.......XX...XX..... ", ".XXXXXXXXXXXXXXXXX.XXX. ", ".XXX.......XXX.XXX.XXX. ", ".XXXXXXXXXXXX.X.XX.XXX. ", ".X.XXXXXXXXXXX.XXX.XXX.o", ".X.XXXXXXXXXXXXXXX.XXX.o", "...................XXX.o", " o.oo.XXXXXXXXXXXXXXXX.o", " . .X.XXXXX......XXX.o", " . .X..XXXXXXXXXXXXX.o", " ........XXX......XXX.o", " .X..XXXXXXXXXX....o", " .X.XXXXX.......X.o ", " .XXXXXXXXXXXXX..o ", " ...............o ", " oooooooooooooo ", " ", " "}; kazu-yamamoto-Mew-ff9c41b/gitlog2mewchanges000077500000000000000000000045031256455547000211140ustar00rootroot00000000000000#!/usr/bin/perl =head1 NAME gitlog2mewchanges - tiny tool to convert Git commit logs to Mew's 00changes =head1 SYNOPSIS git log | gitlog2mewchanges > 00changes git log --no-merges --decorate | gitlog2mewchanges > 00changes (Use --no-merges to ignore merge commits. Use --decorate to show version tags.) =head1 SEE ALSO Mew: =head1 COPYRIGHT Copyright (c) 2013 Tatsuya Kinoshita Redistribution and use in source and binary forms, with or without modification, are permitted without restriction, with NO WARRANTY. You may regard this as a work that is placed in the public domain. =cut use strict; use warnings; my $PRODUCT = "Mew"; my $OWNER = "Kazu Yamamoto "; my $author = ""; my $date = ""; my $comment = ""; my $version = "x.x"; my $pre_version = ""; sub print_entry { print "* "; $comment =~ s/\n([ \t]*\n)+/\n/g; $comment =~ s/\n+$//; $comment =~ s/\n/\n /g; $comment =~ s/^\* //; print "$comment\n"; my $name = $author; $name =~ s/<([^@]+)@[^>]+>/<$1>/; if ($name ne $OWNER) { print "\t$name\n"; } $author = ""; $date = ""; $comment = ""; } while (<>) { if (/^Author:[ \t]+([^\n]+)/) { $author = $1; } elsif (/^Date:[ \t]+(Sun|Mon|Tue|Wed|Thu|Fri|Sat) +(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) +(\d+) +\d+:\d+:\d+ +(\d+)/) { # Assume git log --date=default or --date=local my $mm = $2; my $dd = $3; my $yyyy = $4; $mm =~ s/Jan/01/; $mm =~ s/Feb/02/; $mm =~ s/Mar/03/; $mm =~ s/Apr/04/; $mm =~ s/May/05/; $mm =~ s/Jun/06/; $mm =~ s/Jul/07/; $mm =~ s/Aug/08/; $mm =~ s/Sep/09/; $mm =~ s/Oct/10/; $mm =~ s/Nov/11/; $mm =~ s/Dec/12/; $dd =~ s/^(\d)$/0$1/; $date = "$yyyy/$mm/$dd"; } elsif (/^Date:[ \t]+(\d+-\d+-\d+)/) { # Assume git log --date=short or --date=iso $date = $1; $date =~ s!-!/!g; } elsif (/^Date:[ \t]+(.+)$/) { $date = $1; } elsif (/^ (.*)$/) { $comment .= "$1\n"; } elsif (/^commit /) { if ($author && $date) { &print_entry; } if (/\((tag: v\d[^\)]+)\)$/) { $version = $1; $version =~ s/tag: v//g; } } if ($version ne $pre_version && $date ne "") { print "\n" if $pre_version ne ""; print "$PRODUCT " if $PRODUCT ne ""; print "$version ($date)\n\n"; $pre_version = $version; } } if ($author && $date) { &print_entry; } kazu-yamamoto-Mew-ff9c41b/info/000077500000000000000000000000001256455547000165065ustar00rootroot00000000000000kazu-yamamoto-Mew-ff9c41b/info/Makefile000066400000000000000000000040051256455547000201450ustar00rootroot00000000000000### ### Makefile for info ### ### Author: Kazu Yamamoto ### Created: Aug 22, 1999 ### Revised: ### ### (1) make EMACS=xemacs ### (2) make install ### ################################################################ ## ## EDIT THE FOLLOWINGS ## prefix=/usr/local infodir=$(prefix)/info EMACS=emacs INSTALLINFO = `which install-info` #INSTALLINFO = /usr/local/bin/install-info #INSTALLINFO_OPTIONS = --section Emacs Emacs #INSTALLINFO_JOPTIONS = #infodir = INSTALLINFO_ARGS = --info-dir=$(infodir) mew.info #INSTALLINFO_ARGS = mew.info INSTALLINFO_JARGS = --info-dir=$(infodir) mew.ja.info RM = rm -f MKDIR = mkdir -p TOUCH = touch # To save Emacses on Windows PWD = ################################################################ ## ## DO NOT EDIT THE FOLLOWINGS ## DESTDIR = all: info info: sed -e 's/@setfilename mew.ja.info/@setfilename mew.info/' \ -e 's/@set ja/@set en/' mew.texi > tmp.texi mv tmp.texi mew.texi $(RM) mew.info* $(TOUCH) mew.info $(EMACS) -batch -q -no-site-file -l texinfmt \ -f batch-texinfo-format mew.texi jinfo: sed -e 's/@setfilename mew.info/@setfilename mew.ja.info/' \ -e 's/@set en/@set ja/' mew.texi > tmp.texi mv tmp.texi mew.texi $(RM) mew.ja.info* $(TOUCH) mew.ja.info $(EMACS) -batch -q -no-site-file -l texinfmt \ -f batch-texinfo-format mew.texi install: install-info install-info: -@if [ ! -d $(DESTDIR)$(infodir) ]; then \ $(MKDIR) $(DESTDIR)$(infodir); \ fi; \ cp mew.info* $(DESTDIR)$(infodir) -@if [ -z "$(DESTDIR)" ] && [ -x "$(INSTALLINFO)" ]; then \ $(INSTALLINFO) $(INSTALLINFO_OPTIONS) $(INSTALLINFO_ARGS); \ else \ echo "Don't forget to edit $(infodir)/dir for Mew."; \ fi install-jinfo: -@if [ ! -d $(DESTDIR)$(infodir) ]; then \ $(MKDIR) $(DESTDIR)$(infodir); \ fi; \ cp mew.ja.info* $(DESTDIR)$(infodir) -@if [ -z "$(DESTDIR)" ] && [ -x "$(INSTALLINFO)" ]; then \ $(INSTALLINFO) $(INSTALLINFO_JOPTIONS) $(INSTALLINFO_JARGS); \ else \ echo "Don't forget to edit $(infodir)/dir for Mew."; \ fi ## ## End of Makefile ## kazu-yamamoto-Mew-ff9c41b/info/mew.info000066400000000000000000000052211256455547000201530ustar00rootroot00000000000000Info file: mew.info, -*-Text-*- produced by `texinfo-format-buffer' from file `mew.texi' using `texinfmt.el' version 2.42 of 7 Jul 2006. INFO-DIR-SECTION Message User Agent START-INFO-DIR-ENTRY * Mew: (mew.info). Messaging in the Emacs World. END-INFO-DIR-ENTRY  Indirect: mew.info-1: 282 mew.info-2: 50929 mew.info-3: 101676 mew.info-4: 153693 mew.info-5: 214499  Tag table: (Indirect) Node: Top285 Node: Overview1499 Node: characteristic2392 Node: Emacsen4118 Node: modes4335 Node: folder convention5102 Node: configuration8154 Node: password10927 Node: start13310 Node: Viewing14478 Node: singlepart15774 Node: multipart17263 Node: analysis20493 Node: cipher-viewing24442 Node: retrieving29468 Node: moving33477 Node: sum-write36125 Node: features38502 Node: status-update40982 Node: invalid42007 Node: Composing44204 Node: header46252 Node: cheader47252 Node: addr-comp49054 Node: addrbook50932 Node: auto-alias54124 Node: addr-comp155843 Node: addr-comp258265 Node: send60482 Node: cite63573 Node: mime-comp65819 Node: charset-guess73166 Node: longline76853 Node: reply78681 Node: forward82499 Node: resend83372 Node: shortcut85445 Node: mark-b-comp90879 Node: pgp-key93844 Node: anonymous94725 Node: Marks96292 Node: unread mark97936 Node: delete mark99437 Node: refile mark101679 Node: target mark103290 Node: escape mark104921 Node: unmark105776 Node: mark change106755 Node: sync108199 Node: off-line109377 Node: mew-mark111227 Node: Refile111949 Node: by-folder113809 Node: by-alist115706 Node: by-thread117789 Node: by-from-folder118643 Node: by-from120000 Node: by-newsgroups121579 Node: by-default121914 Node: guess-rule122368 Node: auto-refile124139 Node: copy-msg126351 Node: Virtual127618 Node: selection129278 Node: sorting129998 Node: dialog131841 Node: search132968 Node: condition134132 Node: dbsearch136371 Node: keyword137595 Node: thread138453 Node: thread-op139713 Node: Quit141879 Node: Customize142428 Node: summary-mode143243 Node: message-mode147402 Node: draft-mode150729 Node: charset153696 Node: highlight155902 Node: hooks158866 Node: pop163415 Node: imap165094 Node: nntp166662 Node: smtp168023 Node: config170508 Node: config2176438 Node: custom-misc177954 Node: Tips178975 Node: region179563 Node: visiting180253 Node: SSH180783 Node: SSL181755 Node: TLS184133 Node: spam185032 Node: spam2187321 Node: addr-warn188655 Node: biff189783 Node: edit190541 Node: Convention191816 Node: Implementation193884 Node: Avail196247 Node: obtain196554 Node: ml196846 Node: Copyright197242 Node: Variable Index199191 Node: Key Index214502  End tag table kazu-yamamoto-Mew-ff9c41b/info/mew.info-1000066400000000000000000001433631256455547000203230ustar00rootroot00000000000000Info file: mew.info, -*-Text-*- produced by `texinfo-format-buffer' from file `mew.texi' using `texinfmt.el' version 2.42 of 7 Jul 2006. INFO-DIR-SECTION Message User Agent START-INFO-DIR-ENTRY * Mew: (mew.info). Messaging in the Emacs World. END-INFO-DIR-ENTRY  File: mew.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir) Mew 6.7 Manual ************** Kazu YAMAMOTO Created 1996/02/18 Modified 2015/07/03 This manual documents Mew version 6.7. In addition to this manual, you may find useful information about Mew from Mew's official home page (http://www.Mew.org/). * Menu: * Overview:: Read me first * Viewing:: Viewing messages * Composing:: Composing messages * Marks:: Funny marks * Refile:: Happy refiling * Virtual:: Virtual folder * Quit:: Give me a break * Customize:: Customizing Mew * Tips:: Advanced usage * Convention:: E-mail convention * Implementation:: Implementation Issues * Avail:: Availability and mailing-list * Copyright:: Copyright * Variable Index:: Variable Index * Key Index:: Key Index  File: mew.info, Node: Overview, Next: characteristic, Prev: Top, Up: Top Read me first ************* Mew is a user interface for text messages, multimedia messages (MIME), news articles and security functionality including PGP, S/MIME, SSH, and SSL. Also, Mew can work with the recent search services. Mew is an acronym for "Messaging in the Emacs World". You should spell it with the first letter capitalized and pronounce it as it is (i.e. the meow of cats). When the author started programming it, he chose a cute word from his English dictionary. Thus, Mew. * Menu: * characteristic:: Mew's features * Emacsen:: Supported Emacs versions * modes:: Modes * folder convention:: Folder convention * configuration:: Configuration * password:: Password * start:: Starting  File: mew.info, Node: characteristic, Next: Emacsen, Prev: Overview, Up: Overview Mew's features ============== The features of Mew 6.7 are as follows: - You can easily display a very complicated structured message. What you should do to view messages is just type `SPC'. - If you know how to do file operations such as copy, you can compose a very complicated message without any difficulty. - You can start to read messages before they are all fully listed. - Since Mew preserves lists of messages in Summary mode, when you move messages to a new folder, they will automatically be listed incrementally. - Mew neatly suggests default folders for refiling. Those who receive many messages cannot live without this feature. - In Draft mode, you can complete field names, e-mail addresses, receiver's names, domain names, and folder names. - You can easily search messages with keywords etc. - Mew automatically decodes messages encrypted with PGP or S/MIME. It also automatically verifies signed messages. - You can easily encrypt or sign a message with PGP or S/MIME. - It takes a bit of time to analyze MIME syntax or to verify a PGP or S/MIME signature. While the user is reading a message, Mew processes the next message so that the next message can be displayed faster. Analyzed messages are cached briefly. - You can view multiple folders simultaneously. - Selection/Thread, a mechanism to display the flow of messages, is supported. You can make Selection from messages matched to a keyword and make Thread from the Selection. - When you input a folder name, you can search it with a substring of the name.  File: mew.info, Node: Emacsen, Next: modes, Prev: characteristic, Up: Overview Supported Emacs versions ======================== Please use Emacs 22.3 or later. Mew doesn't support earlier versions nor XEmacs.  File: mew.info, Node: modes, Next: folder convention, Prev: Emacsen, Up: Overview Modes ===== Mew has the following seven modes: `Summary mode' A mode to list and select messages. `Virtual mode' A mode to list messages selected with a specific condition from one or more folders. This is similar to Summary mode. This mode is categorized to Selection or Thread. `Message mode' A mode to display the content of a message. `Draft mode' A mode to prepare a message to be sent, answered, and forwarded. `Header mode' A mode to edit the header of a message and to send it. `Edit mode' A mode to edit a message to generate another new message. `Addrbook mode' A mode to register an entry to the address book (Addrbook).  File: mew.info, Node: folder convention, Next: configuration, Prev: modes, Up: Overview Folder convention ================= With Mew's terminology, a place where messages are deliver is called 'mailbox'. There are three kinds of mailbox: local, POP server, IMAP server, and NNTP server. A box which contains messages used by Mew is called "folder". The name of a folder is in the format that "proto" is followed by a string, where "proto" is one sign letter. For example, the proto of "+inbox" is "+". Mew's folders are categorized to two types: "local folder" and "remote folder". A local folder is a folder which is *original* and is created the computer on which Mew is running. Also, messages stored in the folder are *original*. (So, if you remove them, you cannot revive them.) The proto of a local folder is "+". We summarize special local folders as follows: `+inbox' The first local folder to store messages which you fetch from your local mailbox or your POP server. To refile messages, what you do is to move the messages from "+inbox" to other folders. `+draft' A local folder where messages, which you have not completed yet, are stored. `+queue' A local folder where e-mail messages to be sent are stored. The messages in "+queue" will be eventually sent by SMTP. `+postq' A local folder where NetNews message to be sent are stored. The messages in "+postq" will be eventually sent by NNTP. A remote folder is a COPY whose original is on a server side. A message in a remote folder is a cache which is copied from the server. Here are a list of available proto of remote folders: `%' Folders on an IMAP servers. Example: "%inbox" `$' The folder on a POP server. Example: "$inbox" (Since there is only one folder in a POP server, "$inbox" is the only folder whose name starts with "$".) `-' Newsgroups of NetNews. Example: "-fj.mail.reader.mew" If you use several servers, there are multiple sets of remote folders. You can specify several servers by using "case". For more information about the "case", see *Note config::. To specify a remote folder corresponding to a "case", you should write "case:folder". You can omit "case:" if a case is "default". A combination of "case" and proto organized a world to which a message belongs. A message can move within its world. To make it easy to search received messages afterward, they should be moved to proper folders. To know how to refile received messages, see *Note Refile::. You cannot move a message in the "$" world because there is only one folder, "$inbox". You cannot move a message in the "-" world either since messages in the "-" world are not yours. If you want to move a message from one world to another, you should COPY it. Its destination is restricted to a local folder. This method is described in *Note retrieving::. If you make a list of folders, you can use the completion functionality for folders. To know how to make a list of folders, please refer to *Note status-update::.  File: mew.info, Node: configuration, Next: password, Prev: folder convention, Up: Overview Configuration ============= To execute Mew, the followings are necessary either in the site configuration file or in your "~/.emacs". (autoload 'mew "mew" nil t) (autoload 'mew-send "mew" nil t) ;; Optional setup (Read Mail menu): (setq read-mail-command 'mew) ;; Optional setup (e.g. C-xm for sending a message): (autoload 'mew-user-agent-compose "mew" nil t) (if (boundp 'mail-user-agent) (setq mail-user-agent 'mew-user-agent)) (if (fboundp 'define-mail-user-agent) (define-mail-user-agent 'mew-user-agent 'mew-user-agent-compose 'mew-draft-send-message 'mew-draft-kill 'mew-send-hook)) If you are using Emacs with the --unibyte option or the EMACS_UNIBYTE environment variable for Latin-1, put the following into your "~/.emacs". (set-language-environment "Latin-1") (set-input-method "latin-1-prefix") ;; or "latin-1-postfix" If you use the following configuration for Latin-1, please remove it. This is an obsolete handling of Latin-1 that can cause Mew to function incorrectly. (standard-display-european 1) When booting, Mew reads the file "~/.mew.el". All Mew configurations should be written in this file. To configure your e-mail address, the followings are necessary. ;; (setq mew-name "your name") ;; (user-full-name) ;; (setq mew-user "user name of e-mail address") ;; (user-login-name) (setq mew-mail-domain "domain of e-mail address") To send e-mail messages by SMTP, the following is necessary. (setq mew-smtp-server "your SMTP server") ;; if not localhost If you want to use POP to receive e-mail messages, the followings are necessary. ;; (setq mew-pop-user "your POP account") ;; (user-login-name) (setq mew-pop-server "your POP server") ;; if not localhost If you want to use a local mailbox to receive e-mail messages, the followings are necessary. ;; To use local mailbox "mbox" or "maildir" instead of POP (setq mew-mailbox-type 'mbox) (setq mew-mbox-command "incm") (setq mew-mbox-command-arg "-u -d /path/to/mbox") ;; If /path/to/mbox is a file, it means "mbox". ;; If /path/to/mbox is a directory, it means "maildir". If you want to use IMAP to receive e-mail messages, the followings are necessary. (setq mew-proto "%") ;; (setq mew-imap-user "your IMAP account") ;; (user-login-name) (setq mew-imap-server "your IMAP server") ;; if not localhost To read and/or write articles of NetNews, the followings are necessary. ;; (setq mew-nntp-user "your NNTP account") (setq mew-nntp-server "your NNTP server")  File: mew.info, Node: password, Next: start, Prev: configuration, Up: Overview Password ======== When fetching/sending messages or using PGP or S/MIME, you may be required to input your password. Before you type your password, check carefully to see if either the following conditions is satisfied: - Emacs is running on a local computer - Emacs is running on a remote computer, but an encryption mechanism is being used for communication. If neither of these conditions are satisfied, do not input a password. Your password could be accessed without your knowledge. If you get sick of inputting your password from time to time, please use one of two password-cache mechanisms. 1. Storing passwords in memory temporarily. Not writing them to a file. 2. Storing passwords in memory while Mew is running. When Mew/Emacs quits, Mew encrypts the passwords and writes them to a file. To use Feature 1., configure as follows: (setq mew-use-cached-passwd t) To use Feature 2., after installing GnuPG, configure as follows (GnuPG version 1.x, 2.0 and 2.1 are supported for this feature): (setq mew-use-master-passwd t) If both variables are `t', the feature 2. is used. Feature 1.: Any passwords including POP and PGP are cached in memory. While a password is cached, you can omit to input the password. The cached password will expire after a certain period (20 minutes by default). However, its timer is cleared (reset to 20 minutes) if the password is used internally. Feature 2: When Mew boots, Mew asks you to input a master password. Mew decrypts encrypted passwords in a file and caches them in memory. For instance, if you have already typed POP password, it is to be stored in memory. Thus, when the POP password is required, you can omit to input it. If you use a master password at the first time, you are asked to input it twice. When Mew boots, you might type a wrong master password. In this case, if you enabled Feature 1., it is used. Otherwise, no password-cache mechanisms is used. If you want to change the master password, type `C-cC-m' in Summary mode. Cached passwords in memory are not encrypted. So, if you use either Feature 1. or Feature 2., you should take care so that nobody can touch your Emacs. If you leave your PC and an Emacs expert happens to check your configuration, your passwords could be stolen.  File: mew.info, Node: start, Next: Viewing, Prev: password, Up: Overview Starting ======== To start Mew, you can choose one of the following: `M-x mew' Execute Mew first unless Mew is running. And retrieve arrived messages or just visit to the default folder. `proto' is determined by `mew-proto' and the "case" (see *Note config::). If `proto' is `+' (i.e. a local folder), a mailbox is determined according to `mew-mailbox-type' (see *Note retrieving::). Otherwise (i.e. a remote folder), an appropriate protocol to retrieve messages is chosen according to `proto'. If `mew-auto-get' is `t', arrived messages are asynchronously fetched and listed up in Summary mode. `mew-auto-get' is `nil', just visit to the folder determined by `proto'. `C-uM-x mew' Perform `M-x mew' with `mew-auto-get' reversed. `M-x mew-send' Enter Draft mode for message composing. `C-xm' Enter Draft mode for message composing if `mail-user-agent' is configured. When Mew is executed on Emacs, two cute cats appear on the cover page. For the methods of quitting Mew, please refer to *Note Quit::.  File: mew.info, Node: Viewing, Next: singlepart, Prev: start, Up: Top Viewing messages **************** If you input `M-x mew' (regardless Mew is running or not), Mew displays a list of message like this: * 03/12 Hidenori Ohta This weekend |Let's go to StoneMagic M03/14 Momo-chan The pictures of Noto |Attached are the pictu 03/15 Neat Sumikawa Re: wine |OK. I vote for Wednesd This is called Summary mode. This section mainly explains how to read messages in Summary mode. As you can see the example above, the format of Summary mode consists of a mark, data type (a mark by Mew), date, a sender, Subject:, and a body. For the method of terminating Summary mode, please see *Note Quit::. * Menu: * singlepart:: Reading Basis * multipart:: Displaying MIME * analysis:: Controlling MIME analysis * cipher-viewing:: Visualizing cipher or signature * retrieving:: Getting messages * moving:: Moving to another folder * sum-write:: Write, answer, and forward * features:: Useful features * status-update:: Updating status * invalid:: Invalid messages  File: mew.info, Node: singlepart, Next: multipart, Prev: Viewing, Up: Viewing Reading Basis ============= To read messages in the order of their arrival, type `SPC' to display them. That's it. It's easy, isn't it? Yet this might not be comprehensive, so the basic commands for page processing are listed as follows: `SPC' Read through messages. That is, display a message, scroll it, and move-then-display another message. refer to *Note summary-mode:: to know which direction the cursor moves. `C-uSPC' Redisplay the message from its header. `DEL' Back-scroll this message. Unnecessary header fields are hidden over the window. Type `DEL' to see them when a message is displayed. `RET' Make this message scroll up one line. `M-RET' `-' Make this message scroll down one line. `C-n' Go to the next line. `C-p' Go to the previous line. `n' Move down then display. Targets include parts, messages marked with `*', and non-marked messages. `C-un' Move down then display. Targets include messages marked with `*', and non-marked messages. `p' Move up then display. Targets include parts, messages marked with `*', and non-marked messages. `C-up' Move up then display. Targets include messages marked with `*', and non-marked messages. `j' Jump to a line according to the line number which you input. `C-uj' Jump to a message according to the message number which you input.  File: mew.info, Node: multipart, Next: analysis, Prev: singlepart, Up: Viewing Displaying MIME =============== It's not difficult to read a multipart message. As usual, just type `SPC'. A multipart message is marked with `M' on the left side of date as follows: * 03/12 Hidenori Ohta This weekend |Let's go to StoneMagic M03/14 Momo-chan The pictures of Noto |Attached are the pictu 03/15 Neat Sumikawa Re: wine |OK. I vote for Wednesd When you type `SPC' on the message marked with `M', its header is displayed in Message mode. Then its multipart structure is displayed in Summary mode as follows: * 03/12 Hidenori Ohta This weekend |Let's go to StoneMagic M03/14 Momo-chan The pictures of Noto |Attached are the pictu B 2 Image/Jpeg picture 1 noto1.jpg Q 3 Application/Postscript Note map map.ps 03/15 Neat Sumikawa Re: wine |OK. I vote for Wednesd If the first part is Text/, the first part is not displayed in Summary mode but the first part is displayed with its header in Message mode. Each line of multipart consists of - marks (Content-Transfer-Encoding:) - part number - data type (Content-Type:) - description (Content-Description:) - file name (Content-Disposition:). Content-Description can be considered Subject: for each part. This format is very similar to that of the attachment region in Draft mode. If you type `SPC' or `n', the cursor moves onto part 2 and the content is displayed according to its data type. For instance, Text/Plain is showed in Message mode and PostScript is visualized with "ghostview". Please note that `n' and `p' move lines including multipart. To display the message below skipping multipart, type `C-un'. Likewise, to display the message above (not this message), input `C-up'. Mew processes MIME recursively. The following example is a forwarded multipart message. M03/15 Kazu yamamoto Fw: The pictures of Noto |Attached are the pictu 2 Message/Rfc822 The pictures of Noto B 2.2 Image/Jpeg picture 1 noto1.jpg Q 2.3 Application/Postscript Note map map.ps Note: We strongly recommend that you not embed any object other than text as a top level single part to a message directly. Instead, it is better to make a multipart message whose part 1 is a textual description of part 2 and part 2 is a non-text object. A message which contains a single part other than text is displayed as multipart. Since the syntax of MIME messages can be complex, it sometime takes a bit of time to analyze the syntax. However, Mew guesses the message to be read next and analyzes it beforehand while the user is reading the current message. Analyzed messages are temporarily cached. To make it clear where the message ends, Mew displays the string "[End of message]" in the end of the message. At the end of each part, Mew displays the string "[Message is continued]". These strings are customized by `mew-end-of-message-string' and `mew-end-of-part-string', respectively.  File: mew.info, Node: analysis, Next: cipher-viewing, Prev: multipart, Up: Viewing Controlling MIME analysis ========================= There are several variables for controlling message analysis. `mew-file-max-size' The size limit of messages to be analyzed. If the size of a message is less than or equal to this value, it is analyzed and displayed. Otherwise, the raw message is displayed without analysis. The default value is 10000 bytes. `mew-header-max-length' The length limit of header to be analyzed. If the length of a header is less than or equal to this value, it is analyzed and displayed. Otherwise, the message is displayed as fragmentarily since the analysis is stopped. The default value is 100 lines. `mew-decode-broken' Whether Mew be liberal or conservative to invalid messages. If the value is `t', the setting is liberal. If the value is `nil', the setting is for conservative. If conservative and invalid portions are found, they are reported in the X-Mew: field. The default value is `t'. `mew-use-text-body' Whether or not the text part of a body is displayed with its header. If the value is `t', both the body which is a single part text and the first text part in a multipart body are displayed with its header. If the value is `nil', they are displayed as a single part in a multipart. The default value is `t'. `mew-use-alternative' How to treat Multipart/Alternative. Messages containing Multipart/Alternative are marked with `-'. If the value is `t', one part is displayed according to the preference defined in `mew-mime-multipart-alternative-list'. If the value is `nil', it is displayed as a multipart. The default value is `t'. `mew-use-text/html' How to treat Text/Html. If `nil', HTML is displayed as is (without parsing). Otherwise, HTML is parsed and displayed. The default value is `nil'. `mew-use-text/xml' How to treat Text/Xml. If `nil', XML is displayed as is (without parsing). Otherwise, XML is parsed and displayed. The default value is `t'. The basic command relating to the variables above is `.'. The command acts as follows: 1) If this command executed on a message, the cache of the message is removed and the message is analyzed then displayed. 1a) If the size of the current message exceeds `mew-file-max-size', MIME analysis is skipped then the beginning of the raw message is displayed. In this situation, this command analyzes the current message without the limitation then displays it. 1b) If the length of a header exceeds `mew-header-max-length', a broken message is displayed. In this situation, this command analyzes the current message without the limitation then displays it. 1c) If the current message is displayed by `:', the multipart structure is displayed different from the normal display. In this situation, this command gets the multipart structure back to the normal display. 1d) If `mew-use-text/html' is `nil', its HTML body is displayed as is. In this situation, this command analyzes the HTML body and displays it. 2) If this command is called on a part, the part is displayed again. 2a) If 'mew-use-text/html' is `nil', its HTML part is displayed as is. In this situation, this command analyzes the HTML part and displays it. In addition to `.', the following commands are prepared: `.' Analyze the message and re-display it. `C-u.' Analyze the message with `mew-decode-broken' reversed (see *Note invalid::). `:' The same as `.' with `mew-use-alternative' and `mew-use-text-body' reversed. `C-u:' The same as `C-u.' with `mew-use-alternative' and `mew-use-text-body' reversed. `,' Insert a message or a part into Message mode in raw format. `C-cTAB' Open an entire message as a file in read-only mode. `C-uC-cTAB' Open an entire message as a file.  File: mew.info, Node: cipher-viewing, Next: retrieving, Prev: analysis, Up: Viewing Visualizing cipher or signature =============================== Basic commands such as `SPC' visualize messages signed or encrypted as well. Let's start with a simple example: S03/18 Kanda PC shop A written estimate |Here is a written esti E03/21 Anonymous Secret message | Messages above are marked with `S' and `E', respectively. This means that the body of the first message is signed and that of the second message is encrypted. PGP/MIME and/or S/MIME also allow to sign and/or encrypt some parts of a message. In this case, these marks do not appear. The `S' or `E' mark appears only when the entire body of the message is signed or encrypted. The terms "sign" and "encrypt" used above mean the last procedure applied the body is "sign" and "encryption", respectively. The above examples may have been produced with more complex processes. For instance, in the case of the former message, the body may have been signed after encrypting the body. It is likely that some part of the latter message was first signed then the body was encrypted. If some parts or the entire body is encrypted, Mew asks you to input your pass-phrase to get plain text. Please refer to *Note start:: to know what you should pay attention when inputting pass-phrase. The pass-phrase is used to decrypt your secret key. The secret key is then used to decrypt cipher text. To visualize a cipher message, you need to input your pass-phrase every time you encounter cipher text. This is because Mew does not cache pass-phrases anywhere for security reasons. If you feel this is inconvenient, you can configure Mew to cache your pass-phrase. Please refer to *Note password:: for more information. Since decrypted messages are cached for a while, you may not be asked for your pass-phrase at the next time you display the message, even if you are not using the pass-phrase cache. To verify signatures, senders' public keys are used. Hence you are not asked to type your pass-phrase. Since Mew automatically verifies signatures and/or decrypts cipher text with a pass-phrase, it is likely that users do not notice that the original message has signatures and/or which parts were encrypted. To inform users the results of verification of signatures or which parts were decrypted, Mew inserts the X-Mew: field in the header as follows: X-Mew: PGP decrypted. Good PGP sign "kazu@example.org" COMPLETE The number enclosed by "<>" indicates which part was protected with PGP. "body" means the body was protected. This example tells us that the body was singed by kazu then encrypted for the reader. Mew first decrypted the message and then verified its signature of the decrypted message. The fact that the signature is valid indicates that no one has modified the content of the message since it was signed by the secret key whose ID is kazu@example.org. The validity of the public key used to verify the signature is "complete". Thus, the receiver can be sure that the public key actually belongs to the user indicated by the ID. That is, this message was verified by a reliable public key AND its results were correct, so no alternation was found. In the following example, the signature of the body (multipart), is first verified, then part 2 (a message), is decrypted. That is, the composing process was that part 2 is first encrypted then the entire body is signed. X-Mew: Good PGP sign "kazu@example.org" COMPLETE X-Mew: <2 message> PGP decrypted. Intelligent users may wonder what happens in the case where a devious person sends a message that contains an invalid X-Mew: field. This is not a problem. First Mew carefully removes the X-Mew: field, and then inserts a valid X-Mew: field into the header. About PGP/MIME: X-Mew: informs the user of various other types of results. For example, the lack of availability of a public key, decryption failures, etc. The following example indicates the absence of a public key whose key ID is 0x1B8BF431. X-Mew: No his/her public key. ID = 0x1B8BF431 In this case, if you type `C-cC-f', Mew tries fetching this public key. You can interactively select a public key server. If the X-Mew: field does not exist, `C-c C-f' takes the From: field as ID. Also, `C-uC-cC-f' extracts key IDs from fields specified in `mew-x-pgp-key-list' in addition to the X-Mew: field, and then tries to fetch them. Mew supports PGPv2, PGPv5, and GNUPG. You can select one of these by typing `C-cC-v' in Summary mode. If you want to use those PGPs, you should set the command name of PGPv2, PGPv5, and GNUPG to `mew-prog-pgp2', `mew-prog-pgp5', and `mew-prog-gpg', respectively. Also, set the default PGP name to `mew-prog-pgp'. Note that pass-phrases are cached independently for each PGP. Old fashioned PGP messages cannot be processed automatically. You can decrypt and/or verify this kind messages with `C-cC-z'.  File: mew.info, Node: retrieving, Next: moving, Prev: cipher-viewing, Up: Viewing Getting messages ================ To copy arrived messages to your mailbox to +inbox and list up a list of the messages, use `i'. The mailbox is determined according to `mew-mailbox-type'. (When you type `M-x mew' and if `mew-proto' is `+', messages are also copied according to `mew-mailbox-type'.) Here are summary of its values. `'mbox' A local mailbox. "incm" is used to copy messages for the local mailbox by default. To know how to configure it, see *Note configuration::. `'pop' A POP server. To use POP as it is. (This is a default value.) `'imap' An IMAP server. This is not recommended. To flush a list of messages in a local folder and display them again, use `s'. To retrieve messages or flush-then-retrieve messages again in a remote folder, type `s'. It is recommended to use `s', not `i', for IMAP and NetNews. If you use `s', it asks you a range. Here are a summary of important ranges for Mew. `update' From "the last message in the Summary mode + 1" to "the last message in the corresponding folder". That is, the gap between the Summary mode and the existing folder `all' All messages in the folder. When Summary mode in a local folder becomes inconsistent, use this range to flush the list. For a remote folder, this range results in retrieval of all messages again. `sync' Deleting cache messages whose originals were removed in the server side. Valid for remote folders only. The default range both for +draft, +queue, and +postq is `all'. For other folders, the default is `update'. So, just type `RET' after `s' to get the up-to-date list of the current folder except +draft, +queue, and +postq. Although they are not especially important in Mew, you can specify the following ranges: `-' From to . Valid for local folders only. `-' From to the last. Valid for local folders only. `-' From the first to . Valid for local folders only. `last:' Last messages. If you execute `s' with `C-u' on a remote folder, you can toggle "copying a header only" and "copying both a header and a body". This action can be defined by `mew-pop-header-only', `mew-imap-header-only', and `mew-nntp-header-only' for POP, IMAP, and NNTP, respectively. The default values of these are `nil', that is, "copying both a header and a body". Messages that are of large size may be truncated. This kind of message is marked with `T'. To retrieve the rest of this kind of message, type `I' on the message. Suppose that there is a message marked with `T' in $inbox. If you type `I' on it, you can retrieve the entire message. Here is a summary of the commands concerned with message retrieval: `i' In a local folder, fetch arrived messages, store them to the +inbox folder and create a list. If `mew-auto-flush-queue' is `t', send messages in +queue. Please refer to *Note send:: for more information. In a remote folder, visit to its inbox folder and execute `s' + `update'. `C-ui' Perform `i' with `mew-auto-flush-queue' reversed. `I' Retrieve the rest of a truncated(`T') message. If you use this command in a local folder, a method to retrieve the message is determined by the "case" and `mew-mailbox-type'. If `mew-pop-delete'/`mew-imap-delete' is `t', delete the message from the mailbox. If you use this command in a remote folder, a "case" and protocol is determined by the folder. The message in the server side is always retained. `C-uI' Perform `I' with `mew-pop-delete' or `mew-imap-delete' reversed. `s' List up messages in Summary mode or flush them. `C-us' On a remote folder, list up messages in Summary mode by toggling "copying a header only" and "copying both a header and a body". `lc' Copy a cached message in a remote folder to a local folder.  File: mew.info, Node: moving, Next: sum-write, Prev: retrieving, Up: Viewing Moving to another folder ======================== To go to another folder, type `g'. Mew asks you to input a folder name as follows: Folder name (+inbox): + Let's call the right side of ":" 'writable area'. In this example, proto "+" is displayed in the writable area. Typing an appropriate string following proto and typing `RET' decides a folder name, then Mew moves to the folder. When you move to a folder and if Mew finds its list of messages old, Mew automatically displays the differences. The string in "()" is a default. If you specifies "+" by simply typing `RET', Mew considers that the default folder name is specified. To make use of completion, type `TAB' or `SPC'. Now, lets get back to the state just after typing `g'. Folder name (+inbox): + If you want to change, for example, "+" to "%", you have to delete "+" first then type "%" in normal situation. But this is inconvenient. So, typing "%" just after "+" removes "+" automatically. Like this, typing another proto just after a proto replaces the previous one without deletion. When you type a remote folder, you may want to specify the "case" (described in *Note config::). The "case" must be specified before a folder, separated by ":". Consider moving "%inbox" for a "case" "home". In this case, you should type "home:%inbox". Yes, this is inconvenient. So, typing `C-cTAB' in any position does circular completion for available "cases". Let's look at the following example. Folder name (+inbox): %inbox Typing `C-cTAB' here results in the following: Folder name (+inbox): home:%inbox You may want to search a folder by specifying a substring of the folder. For this purpose, `C-s' and `C-r' are available. The following is the state of the minibuffer after typing `C-s'. Folder name (+inbox): () "()" appeared in the writable area indicates you have switched to search mode. While you are typing here, a matched candidate is shown in "()". The following is the case where a search key is "mew". Folder name (+inbox): (+work/mew-release) mew To select the matched candidate, type `RET'. Then the search mode is finished and the matched candidate is displayed in the writable area. Folder name (+inbox): +work/mew-release Typing `RET' again means that you decide the folder. A list of folders to be searched is decided by a combination of "case" and proto. When you enter the search mode by typing `C-s' or `C-r', a pair of "case" and proto is extracted from the writable area, and a list of folders is selected according to the pair.  File: mew.info, Node: sum-write, Next: features, Prev: moving, Up: Viewing Write, answer, and forward ========================== Please use the following commands for writing, replying, and forwarding messages. `w' Write a message. A new draft is prepared in Draft mode. Please refer to *Note Composing::. `C-uw' Write a message. A new draft is prepared in Draft mode. The From: address of the current message is copied to the To: field in the draft. `W' Send a message by modifying a part of the header of another message. Please refer to *Note resend::. `a' Answer to this message. A new draft is prepared in Draft mode. Mew automatically inserts the content of the fields To: and Cc:. Please refer to *Note reply::. `C-ua' Answer to this message only to the sender. `A' Answer to this message. A new draft is prepared in Draft mode. Mew automatically inserts the content of the fields To: and Cc: and cites the body. Please refer to *Note reply::. `C-uA' Answer to this message only to the sender with citation. `f' Forward this message to a third person. A new draft is prepared in Draft mode and this message is automatically attached. Please refer to *Note forward::. `F' Forward messages marked with `*' to a third person. A new draft is prepared in Draft mode and this message is automatically attached. For more information, refer to *Note target mark::. Please refer to *Note forward::. If an error message returns, please try again with the following commands. `E' Edit this message again to retry sending. Or edit this RFC822 part typically included in a MIME-encapsulated error message. 1. In +draft, the message is just edited. 2. In +queue or +postq, the message is moved to +draft and is edited. 3. Otherwise, the message is copied to +draft and is edited. For +draft, +queue, and +postq, the "case" revives. For the other folders, if `mew-case-guess-when-prepared' is `t', each field of the original header is replaced according to a guessed "case". For more information, see *Note config::. `C-uE' The same as `E'. But, when used for other folders than +draft, +queue, and +postq, the original header is retained even if `mew-case-guess-when-prepared' is `t'.  File: mew.info, Node: features, Next: status-update, Prev: sum-write, Up: Viewing Useful features =============== Mew provides you with the following useful commands in Summary mode: `v' Toggle "Summary mode only" and "Summary & Message mode". If you choose "Summary mode only", you can quickly put the `D' mark since the next message is not displayed. `_' Toggle normal lines, wrapped lines and long lines. `zv' If `mew-use-header-veil' is non-nil, field lines of To: and Cc: over `mew-header-veil-count' are covered with invisible veils. This commands toggles visibility of these lines. `mew-use-header-veil' and `mew-header-veil-count' are default to `t' and 4, respectively. `M-l' Make the current line the center of the Summary mode. `C-cC-s' Incremental search forward in Message mode. `C-cC-r' Incremental search backward in Message mode. `y' Save this message or this part into the file whose name is specified by you. `b' Save the buffer of Message mode as is into the file whose name is specified by you. `C-uy' Save this message or this part into the file whose name is specified by you, specifying coding-system for text. `#' Print the content of Message mode according to `mew-print-function'. `C-u#' Print the content of Message mode with a specified printer name. `|' Send the content of Message buffer to a command via pipe. `C-u|' Send the body of Message buffer (excluding its header) to a command via pipe. `\' Executing an external command specifying this message as an argument. `B' De-capsulate embedded messages in MIME format. `C-uB' Decompose embedded files in this message. `C-cC-a' Register the information on the current message to Addrbook (*Note addrbook::). `C-cC-v' Select PGP version (*Note cipher-viewing::). `C-cC-z' Let PGP decrypt and/or verify old fashioned PGP messages (*Note cipher-viewing::). `C' Change the value of the "case". For more information, please refer to *Note config::. `=' Display the folder name of this message and the message number. If this is a cache message, both the unique id and the size are also shown. The full path to the message is set to the cut buffer of your window manager. `;' Parse the Received: fields and display them in Message mode. `Rd' Delete this folder. `Rr' Rename this folder.  File: mew.info, Node: status-update, Next: invalid, Prev: features, Up: Viewing Updating status =============== In some cases of configuration modifications, you have to update status to reflect them. When you think configuration modifications don't make any effects or some errors occur, use one of the following commands: `Z' Update information including Addrbook (*Note addrbook::). `C-uZ' Update information about folders of the current world. Here is a summary of toggle commands. `z8' Toggle 8bit mode (i.e. `mew-use-8bit'). `zc' Clean-up caches of analyzed messages. `zd' Toggle `mew-debug'. `zo' Toggle PGP/MIME or old-fashioned PGP (`mew-use-old-pgp') when composing with shortcut methods. `zp' Toggle decode policy (i.e. `mew-decode-broken'). `zv' Toggle whether or not veil is used in Message mode(`mew-use-header-veil'). `zw' Toggle warning level. If `mew-warning-field-level' is 2, set it to 1. If `mew-warning-field-level' is 1, set it to 2.  File: mew.info, Node: invalid, Next: Composing, Prev: status-update, Up: Viewing Invalid messages ================ The following message contains Japanese text in its body. The charset parameter is not specified in the Content-Type: field. So, the body should be treated as US-ASCII. To: piglet Subject: an invalid message From: pooh MIME-Version: 1.0 Content-Type: Text/Plain Japanese comes here. The following header is invalid as well. From: "=?iso-2022-jp?B?GyRCOzNLXE9CSScbKEI=?=" The string delimited by "=?" and "?=" in the above example was originally Japanese. Since the spec of mail limits the content of headers to ASCII characters, if a string whose character set is other than ASCII, is to be stored in a header, the string must be encoded with ASCII strings according to the defined rule. But it is certainly invalid to embed the ASCII strings with `"'. Strings surrounded by `"' are treated as is. Therefore, the string between "=?" and "?=" in the example will not be decoded into Japanese. Several mailers are careless about the spec and regularly violate these rules. The right way to do is ask the programmers of such mailers to make the programs conformant to the spec. However, since there are so many mailers of this kind around the world, Mew tries to decode as many different formats as possible. In these cases Mew displays warnings such as: X-Mew: Charset for body is not specified. To: has encoded-words in quoted text. If you want to decode messages strictly, set `mew-decode-broken' to `nil'. This value can be toggled dynamically by `C-u.' (see *Note singlepart::). The following message is displayed as a mess since the character set specified with the charset parameter and the actual character set of its body are different. Content-Type: Text/Plain; charset=ISO-2022-JP Japanese text written in Shift_JIS By using `C-cC-l', the text is re-displayed with charset guessed according to a specified language, ignoring the character set specified by the charset parameter. If you type `C-uC-cC-l', you can re-display the text by specifying a character set explicitly.  File: mew.info, Node: Composing, Next: header, Prev: invalid, Up: Top Composing messages ****************** This section explains how to compose a message. Methods to enter Draft mode to write a new message are given below. 1. Type `M-x mew-send'. 2. Type `C-xm' if `mail-user-agent' is configured. 3. Press `w' in Summary mode. Then a buffer like the following is prepared. To: Subject: From: Kazu Yamamoto X-Mailer: Mew version 6.7 on Emacs 24.4 ---- We call this "Draft mode". In Draft mode, we call the region above "----" the header, and the region below "----" the body. Also, replying a message (`a' or `A') and/or forwarding messages (`f' or `F') lead you to Draft mode from Summary mode. Drafts are temporarily stored in the +draft folder. You can write multiple messages simultaneously. For the method of deleting a prepared draft, please refer to *Note Quit::. Now let's see how to use Draft mode. * Menu: * header:: Completions in a header * cheader:: Circular completions in a header * addr-comp:: Address Completion * addrbook:: Address book * auto-alias:: Learning addresses * addr-comp1:: Address Completion(1) * addr-comp2:: Address Completion(2) * send:: Sending a message * cite:: Signature and citation * mime-comp:: Composing multipart * charset-guess:: Defining charset * longline:: Handling long lines * reply:: Replying to a message and deciding recipients * forward:: Forwarding messages * resend:: Re-sending messages * shortcut:: Creating signature or cipher message * mark-b-comp:: Mark based composer * pgp-key:: PGP key distribution * anonymous:: Sending messages with anonymous receivers  File: mew.info, Node: header, Next: cheader, Prev: Composing, Up: Composing Completions in a header ======================= In the header, completions for each field are assigned to `TAB' as follows: - Field completion - Address completion (To:, Cc:, etc) (see *Note addr-comp::) - Folder completion (Fcc:) If the cursor is at the beginning of a line and the previous line does not end with ",", you can complete field defined in the `mew-fields' variable with `TAB'. To: kazu@example.org R`TAB' At the point above, if you type `TAB', you get: To: kazu@example.org Reply-To: At a point, such as Fcc:, you can complete folder name with `TAB'. For example: Fcc: `TAB' Here, "+" is completed. Fcc: +`TAB' One more type of `TAB' shows candidates. Please type in the appropriate characters then type `TAB'. Fcc: +b`TAB' If a single candidate can be determined, you get a completion. Fcc: +backup  File: mew.info, Node: cheader, Next: addr-comp, Prev: header, Up: Composing Circular completions in a header ================================ In a header, circular completions are assigned to `C-cTAB'. Circular completion means that a value of a list is replaced by the next value of the list. The end of the list is considered continuous to the top of the list. Circular completions in a header are different for each field as follows: - Circular completion of domain name (To:, Cc:, etc) - Circular completion of From: (From:) On a field where addresses are written, use `C-cTAB' for domain completion. Candidates are selected from `mew-mail-domain-list'. To: kazu@`C-cTAB' If you try to complete just after "@" as up above, the first domain of `mew-mail-domain-list' is inserted. To: kazu@example.org`C-cTAB' After completion, pressing `C-cTAB' one more times inserts the next domain of `mew-mail-domain-list'. This completion is looped. To: kazu@example.jp If a single candidate can be determined, it is inserted. To: kazu@w`C-cTAB' The above example gives: To: kazu@example.jp In Draft mode, the From: field is inserted with the format of "mew-name ". From: Kazu Yamamoto On the From: field, `C-cTAB' circularly completes its value from `mew-from-list'. You can set `mew-from-list' by yourself. Also, `mew-from-list' can be set automatically. For automatic setup, please refer to *Note config::. Typing `C-cTAB' anywhere on the value replaces the value with the next value of `mew-from-list'. For example, From: Kazu Yamamoto `C-cTAB' becomes as follows: From: Kazuhiko Yamamoto  File: mew.info, Node: addr-comp, Next: addrbook, Prev: cheader, Up: Composing Address Completion ================== You can complete addresses on To: or Cc:. This completion command is bound to `TAB'. To: kazu`TAB' When you type `TAB' after a part of an address as the example above, the entire address is completed as follows: To: kazu@example.org There are three kinds of registered addresses to be used for the completion. 1. The expansion rule in an address book 2. The personal information in the address book 3. Learned addresses when sending Mew provides two ways to complete addresses. You can select one of them with `mew-use-full-alias', which is default to `nil'. If `mew-use-full-alias' is `nil', the portion before `@', a user name or a short name, is a target of the completion. When you type `TAB', the user name is completed. And if the user name is uniquely completed and you type `TAB' again, it is expanded to its entire address. Let's call this Address Completion(1). An advantage of Address Completion(1) (*Note addr-comp1::) is that you can use the completion/expansion against the three kinds of addresses seamlessly. You can also explicitly expand the user name with `TAB' as described later. A disadvantage is that user names must be unique. So, if a user name is already registered, other addresses with the same user name cannot be learned. If `mew-use-full-alias' is `t', for learned addresses when sending, completion target is an entire address. Let's call this Address Completion(2). An advantage of Address Completion(2) (*Note addr-comp1::) is that Mew can learn addresses whose user names are the same. One of disadvantages is that only the first address of personal information can be used (the other addresses are useless). And for the explicit expansion, you have to type `M-C-e', a different key from `TAB'.  kazu-yamamoto-Mew-ff9c41b/info/mew.info-2000066400000000000000000001435271256455547000203260ustar00rootroot00000000000000Info file: mew.info, -*-Text-*- produced by `texinfo-format-buffer' from file `mew.texi' using `texinfmt.el' version 2.42 of 7 Jul 2006. INFO-DIR-SECTION Message User Agent START-INFO-DIR-ENTRY * Mew: (mew.info). Messaging in the Emacs World. END-INFO-DIR-ENTRY  File: mew.info, Node: addrbook, Next: auto-alias, Prev: addr-comp, Up: Composing Address Book ============ Mew provides an address book ("~/Mail/Addrbook). The address book has 2 formats. One specifies expansion rules, while the other defines personal information. First, let's look at the format that specifies expansion rules. : [, , ,...] In this way, you should specify a short name and a full address separated by `:'. If you want to expand the short name to multiple addresses, you can delimit them with a comma `,'. (This is exactly same as addresses delimited by `,' in the To: field, for instance.) A space SPC is allowed after the comma `,'. For example: pooh: winnie-the-pooh@example.net piglet: piglet@example.org friends: pooh, piglet Next, the format to define personal information is shown below: [, , ,...] In this way, four elements are separated by SPC. is a short name. and are the person's nickname and full name, respectively. (For proper usage of the nickname, please refer to *Note summary-mode:: and/or *Note draft-mode::.) The second element is the addresses. If the person has multiple addresses, delimit them using `,'. SPC is allowed after `,', which means that it does not function as the delimiter. SPC surrounded by quotes `"' also has no delimiting function here. For example: kazu kazu@example.org, kazu@example.net Kazu-kun "Kazuhiko Yamamoto" In the personal information format, you can omit any element. When you want to omit an intermediate element, specify `*'. The following is an example to define nicknames for addresses. * kazu@example.org, kazu@example.net Kazu-kun The nickname is used to replace addresses in Summary mode and to replace the citation prefix (*Note cite::) in Draft mode. The comment letters are `;' and `#'. `;' is valid only when it appears at the beginning of lines, resulting in the disregarding of the entire line. The comment marker `#' is valid everywhere. The strings between `#' and the end of the line are ignored. Also, `\' means a continuous line. Summary mode includes the feature of directly registering the information of the current message into Addrbook. To register a expansion rule, type `C-cC-a'. #If you want to register this entry, type 'C-c C-c'. #If you want to NOT register this entry, type 'C-c C-q'. Shortname: kazu Addresses: kazu@example.org Comments: To register personal information, type `C-uC-cC-a'. #If you want to register this entry, type C-c C-c. #If you want to NOT register this entry, type C-c C-q. Shortname: kazu Addresses: kazu@example.org Nickname: Name: Kazuhiko Yamamoto Comments: Add or modify the information if necessary. To register this information, type `C-cC-c'. To quit the registration, type `C-cC-q'. You should also refer to *Note Quit::. If you want to use characters of multiple languages, put the following onto the beginning of Addrbook. #-*-coding:ctext;-*-  File: mew.info, Node: auto-alias, Next: addr-comp1, Prev: addrbook, Up: Composing Learning addresses ================== When you send a message, addresses on the To: and Cc: field are automatically registered. Consider the following: To: kazu@example.org In the case of Address Completion(1) (*Note addr-comp1::): When this message is sent, a short name "kazu" is automatically registered for the address "kazu@example.org". If there is already a short name of "kazu", the next action is decided according to `mew-addrbook-override-by-newone'. If `nil', the old entry remains. Otherwise, the new entry overrides the old one. When expanded, the address book short name has priority over the automatic short name. Only automatic short names which are not contained in the address book are valid. In the case of Address Completion(1) (*Note addr-comp2::): When this message is sent, the address "kazu@example.org" is automatically registered. The limit number of automatic short names is 2000 (`mew-lisp-max-length'). Once the number exceeds 2000, the tail entries in the alphabetical order are removed. This information is automatically saved to the file "~/Mail/.mew-alias". The automatic registration would register unnecessary short names. If you want to remove these entry, take the following steps. First, type `M-a' to open "~/Mail/.mew-alias". Then edit it as you do against a text file. Lastly, type `C-xC-s' to save it. When saving it, the modifications are automatically reflected to Mew. The formats of Address Completion (1) and (2) are different. When you change the value of `mew-use-full-alias' to switch one to the other, type `Z' once in Summary mode. This converts the format properly.  File: mew.info, Node: addr-comp1, Next: addr-comp2, Prev: auto-alias, Up: Composing Address Completion(1) ===================== As far as Address Completion (2) is concerned, there is an assumption: user names or short names of expansion rules, personal information and learned addresses are unique. For example, consider the following configuration of expansion rules: pooh: winnie-the-pooh@example.net When you are in a header in Draft mode, working within an address field, after typing one or more characters, you can complete a short name for an address by pressing the `TAB' key. To: piglet@example.org, po`TAB' If you press the `TAB' key, "pooh" is completed (unless other candidates exist). To: piglet@example.org, pooh`TAB' One more press of the `TAB' key expands the name to "winnie-the-pooh@example.net". To: piglet@example.org, winnie-the-pooh@example.net A string ending with "@" is explicitly expanded. Please pay attention to the following case where similar short names are defined. pooh: winnie-the-pooh@example.net pooh-pooh: pooh-pooh@example.org It is obvious that "pooh-" is completed to "pooh-pooh". But if you input "pooh", Mew cannot tell whether it should be expanded or completed to "pooh-pooh". Thus, if you want to explicitly complete "pooh" to "winnie-the-pooh@example.net", insert `@' and type `TAB'. To: pooh@`TAB' Explicit expansion can be accomplished by `M-C-e' instead of insertion of `@'. The explanation above can be applied to learned addresses when sending. The format of personal information means that each subsequently generated address will replace the former one. For example: kazu kazu@example.org, kazu@example.net Kazu-kun "Kazuhiko Yamamoto" Let's watch how it will be converted: To: kazu`TAB' Typing `TAB' after "kazu" generates "kazu@example.org". To: kazu@example.org`TAB' Typing `TAB' after "kazu@example.org" brings about "kazu@example.net". To: kazu@example.net`TAB' Then "kazu@example.org" will appear again if you type `TAB' after "kazu@example.net". In this way, each address is replaced one by one. After deciding an address, you can add its full name. To: kazu@example.org`M-TAB' Like this, typing `M-TAB' replace the address with the following format. To: Kazuhiko Yamamoto  File: mew.info, Node: addr-comp2, Next: send, Prev: addr-comp1, Up: Composing Address Completion(2) ===================== As far as Address Completion(2) is concerned, for learned addresses when sending, the entire addresses are completion targets. For expansion rules in the address book, short names are completion targets and unique short names are expanded to corresponding addresses. For personal information in the address book, short names are completion targets and unique short names are expanded to their first addresses. When you are in a header in Draft mode, working within an address field, after typing one or more characters, you can complete a short name or a learned address by pressing the `TAB' key. Suppose that kazu@example.org is already learned. To: ka`TAB' When you type some characters and press `TAB', its address is completed: To: kazu@example.org Also suppose that "kazunori@example.jp" is learned. To expand a user name to "kazu@example.org", you should input "kazu@". To convert it to "kazunori@example.jp", you need to input "kazun". For expansion rules and personal information, `TAB' completes short names first. You can expand a unique short name to corresponding address with `TAB'. For example, consider the following configuration of expansion rules: pooh: winnie-the-pooh@example.net Let's complete "pooh": To: po`TAB' If you press the `TAB' key, "pooh" is completed (unless other candidates exist). To: pooh`TAB' One more press of the `TAB' key expands the name to "winnie-the-pooh@example.net". To: winnie-the-pooh@example.net A problem occurs when a short name is not unique. Consider the following example: pooh: winnie-the-pooh@example.net pooh-pooh: pooh-pooh@example.org It is obvious that "pooh-" is completed to "pooh-pooh". But if you input "pooh", Mew cannot tell whether it should be expanded or completed to "pooh-pooh". Thus, if you want to explicitly complete "pooh" to "winnie-the-pooh@example.net", type `M-C-e'. (There is no way to accomplish this with `TAB'.) To: pooh`M-C-e' This example is explicitly expanded as follows: To: winnie-the-pooh@example.net  File: mew.info, Node: send, Next: cite, Prev: addr-comp2, Up: Composing Sending a message ================= When you are ready to send a message after completing composition, choose one of the following two commands. `C-cC-m' Compose a message, put it into +queue or +postq, and leave it for later sending. `C-cC-c' Compose a message and send it. You receive the prompt: "Really send this message? (y or n) ". Type `y' to send it. Let's look at how a message is modified when sent. Please see the following example: To: pooh Subject: the next Sunday From: Piglet X-Mailer: Mew version 6.7 on Emacs 24.4 ---- Would you like to play with me next Sunday? // Piglet This message is modified as follows, for example, if it is put into +queue or +postq by `C-cC-m'. Date: Mon, 13 Mar 2000 19:49:50 +0900 (JST) Message-Id: <20000313.194950.59499544.piglet@example.org> To: winnie-the-pooh@example.net Subject: the next Sunday From: Piglet X-Mailer: Mew version 6.7 on Emacs 24.4 Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Would you like to play with me in the next Sunday? // Piglet As you can see, Data: and Message-Id: are added. You should note that both its data type and its character set are guessed correctly and added. When composing a message using `C-cC-m' and `C-cC-c', you can make use of a feature that identifies errors in a header. Suppose you set `mew-ask-subject' to `t'. If Subject: is empty, Mew asks you its value. If you want to leave it empty, just type `RET'. The default value of this variable is `nil'. Suppose you set `mew-ask-fcc' to `t'. If there is a folder that doesn't exist, Mew asks you whether or not you want to create it. If you want to create it, type `y'. Otherwise, type `n'. If you type `n', sending is aborted and the cursor returns to the draft. The default value of this variable is `nil'. Mew asks you to input your password for sending if the server requires user authentication. Historically speaking, passwords are not necessary to send e-mail messages. This is one reason why e-mail addresses can be faked. In the near future, passwords are always required for sending messages as are for receiving messages. There are two ways to send messages waiting in +queue. Please note that both of these are commands in Summary mode. `i' If `mew-auto-flush-queue' is `t', the messages being held in +queue will be sent after the incoming messages have been received. This method is appropriate for dial-up environments, since one can save on connection fees and repeated authentication for sending. `mew-auto-flush-queue' is default to `t'. `C-cC-c' Send messages in +queue. Method is appropriate if you like to preview composed messages first in +queue and then send them. If `mew-ask-flush-queue' is `t', you are asked, Flush queue? (y or n) ". `mew-ask-flush-queue' is default to `nil'.  File: mew.info, Node: cite, Next: mime-comp, Prev: send, Up: Composing Signature and citation ====================== Next is the explanation of the commands for processing the text in the body of the message. The first one is signature. To insert your signature file ("~/.signature") on the cursor point, type `C-cTAB'. You can define your own signature file to `mew-signature-file'. Setting `mew-signature-as-lastpart' and `mew-signature-insert-last', you can customize the action of `C-cTAB'. `C-cTAB' Insert "~/.signature" on the cursor point. The next one is citation. If you use `a' or `A' in Summary mode, a draft for reply is opened up and Emacs is split into three windows. The top is Summary mode, the middle is Message mode, and the bottom is Draft mode. Here are the commands for citing text from Message mode to Draft mode. `C-cC-y' Copy and paste a part of a message from Message mode WITH citation prefix and label. 1. Roughly speaking, it copies the body in Message mode. For example, if Text/Plain is displayed, the entire Message mode is copied. If Message/Rfc822 is displayed, the body without the header is copied. 2. If you type `C-uC-cC-y', the header is also copied if exists. 3. If an Emacs mark exists, the target is the region between the mark and the cursor. `C-cC-t' Copy and paste a part of the message from Message mode WITHOUT citation prefix and label. The default label and prefix is as follows: From: SUMIKAWA Munechika Subject: Wine Date: Wed, 23 Jul 1997 11:40:50 +0900 > Hi, it's Sumikawa, the guy who's neat from good morning > to good night. > > Talking about the wonderful wine party, I would propose > Cabernet Sauvignon, Bordeaux, '90. In Draft mode, you can cite any text displayed in Message mode. So, you can cite text from multiple messages easily. Select a message in Summary mode and display it in Message mode, then cite it in Draft mode. Please repeat this procedure as you like. Triple windows are opened for this purpose. When highlighting gets wrong, type `C-cC-l' to re-highlight both the header and the body  File: mew.info, Node: mime-comp, Next: charset-guess, Prev: cite, Up: Composing Composing multipart =================== Now let's see how to create multipart messages. When you are writing a message in +draft/1 and type `C-cC-a', the following lines are inserted at the bottom of the draft. ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* 2 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- "1/" is a temporary directory to create multipart and provides a location for "~/Mail/attach/1". The part 1, "CoverPage", refers to the body. Now the entire draft looks like: To: mew-dist Subject: This is header X-Mailer: Mew version 6.7 on Emacs 24.4 ---- This is the body. ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* 2 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- Here we designate three regions as follows: * the region above "----" `header' * the region from "----" to "attachments" `body' * the region below "attachments" `attachments' In Draft mode, the key bindings differ according to the region. To `TAB', for instance, the following functions are assigned: header Completions. body Insert TAB. attachments Do nothing. To `c', functions are assigned as follows: header Insert c. body Insert c. attachments Copy a file. The following is a summary of commands in the attachments region. `C-p' Go to the previous file in the current directory. `C-n' Go to the next file in the current directory. `C-f' Go to the first subdirectory. `C-b' Go to the parent directory. `c' Copy a file (possibly via networks) on ".". To copy a remote file, use the "/[user@]hostname:/filepath" syntax. `l' Link a file with a symbolic link on ".". If you want to edit the attached file, you should `c' instead of `l' so that you do not edit the original file. `d' Delete this file or this directory. `m' Create a subdirectory (i.e. multipart) on ".". `f' Open this file into a buffer. `F' Open a new file into a buffer on ".". `y' Link the message which is displayed in Message mode on ".". `e' Input external-body on ".". `a' Sampling voice and insert as audio file on ".". `p' Extract the PGP key for the specified user on ".". `D' Input a description (Content-Description:). `T' Change the data type (Content-Type:). `t' Toggle text and binary for the data type. `I' Specify input coding-system for a Text/* object. `C' Specify output coding-system for a Text/* object. `P' Specify a file name (Content-Disposition:) to save this part in the receiver side. If you type just `RET' without any string, its value is cleared. Then the file name in the sender side is displayed with `*'. In attachments, data types are guessed by suffix. The currently supported suffixes are as follows: .txt Text/Plain .html Text/Html .xml Text/Xml .rtf Text/Enriched .css Text/Css .sgml Text/Sgml [0-9]+ Message/Rfc822 .ps Application/Postscript .pdf Application/Pdf .doc Application/Msword .xls Application/Vnd.Ms-Execl .ppt Application/Vnd.Ms-Powerpoint .vsd Application/Vnd.Visio .dat Application/Ms-Tnef .tar|.tar.|.gz|.Z|.taz|.tgz|.bz2?|.lzh|.zip|.bin|.pgp|.gpg|.exe|.dll Application/Octet-Stream .gif Image/Gif .tiff Image/Tiff .jpe?g Image/Jpeg .png Image/Png .xwd Image/X-Xwd .xbm Image/X-Xbm .xpm Image/X-Xpm .bmp Image/X-Bmp .pcx Image/X-Pcx .tga Image/X-Tga .au Audio/Basic .wav Audio/X-Wav .aif?f Auido/X-Aiff .midi? Auido/X-Midi .mpga|.mp[23] Audio/X-Mpeg .mpe?g Video/Mpeg .mov Video/Quicktime .avi Video/X-Msvideo Please choose an appropriate suffix for the file name so that Mew can guess its data type. If there is no matched suffix, the data type specified by `mew-content-type' is chosen. Its default value is Text/Plain. For instance, if you copy files with `c', the part becomes as follows: ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* B 2 Image/Gif MagicPoint logo mgp.gif Q 3 Application/Postscript Presentation Material ohp.ps 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- Each line of a multipart message consists of - marks (Content-Transfer-Encoding:) - part number - data type (Content-Type:) - description (Content-Description:) - file name (Content-Disposition:). You can change data types (Content-Type:) by pressing `T' at any time. If the data type is either text (Text/Plain) or binary (Application/Octet-Stream), you can toggle between them using `t'. Please refer to *Note mark-b-comp:: for explanation on changing the mark (Content-Transfer-Encoding:). You can also insert descriptions (Content-Description:) by `D'. This description column is overwritten when encrypted as described in *Note mark-b-comp::. Strictly speaking, the fifth column is the copied file name or the value of Content-Disposition:, namely the file name to which the receiver saves the part. If Content-Disposition: exists, Mew displays it. Otherwise, Mew displays the copied file name with `*' appended. When you copy a file, the file name is specified as Content-Disposition:. But this is not true for both Message/* and Multipart/*. To specify Content-Disposition: for Message/*, use `P'. Files are treated as singlepart while directories are treated as being multipart. Therefore you can create very complex multipart MIME messages in the same way as you would create a file system. Very easy, isn't it? The default data type for directories is Multipart/Mixed. Of course, you can change it by pressing `T'. Once you are ready to send a multipart message, type `C-cC-m' or `C-c C-c' to send it as described the previous subsection. Next is the explanation of the creation of a Message/External-body by pressing `e'. If the access-type is "ftp" or "anon-ftp", you can take advantage of remote filename completion due to the existence of the native Emacs mode of ange-ftp. Of course file completion is available for the access-type of "local-file". If you want to abort creating multipart and to get back to singlepart, type `d' in the top level of the multipart message.  File: mew.info, Node: charset-guess, Next: longline, Prev: mime-comp, Up: Composing Defining charset ================ Mew has a mechanism for determining the character set of the transfer form for both singlepart and multipart. When you type `C-cC-m' or `C-cC-c' to compose a message in Draft mode, Mew decides the character set of the transfer based on the internal representation of its body. On Bilingual Emacs, US-ASCII is chosen for 7bit character sets while ISO-8859-1 is selected for 8bit character sets. On Internationalized Emacs, the character set of the transfer form is chosen based on rules defined by Mew. Since the data to be attached as a part of multipart is a file, it is stored on disk. Therefore, in order to determine its character set for the transfer form, it is necessary to load the file into an Emacs buffer converting it into internal representation. After that, Mew determines the character set of the transfer form for the file by the same method as singlepart. On Bilingual Emacs, Mew reads a file as is. So if the file is 7bit, US-ASCII is chosen. Otherwise ISO-8859-1 is selected. On Internationalized Emacs, Mew reads a file according to the local convention (i.e. auto conversion). The command to set a local convention is `C-x RET l'. For example, in Japan, ISO-2022-JP, EUC-JP, and Shift_JIS is readily guessed and stored in buffer as internal representations for Japanese. Mew chooses ISO-2022-JP as the character set of the transfer form from the internal representation. That is, even if the character set of the file is EUC-JP or Shift_JIS, it is automatically converted into ISO-2022-JP, which is the transfer form for Japanese. This means that you can attach a file without needing to pay attention to its character set. If you want to specify the coding-system of a file to be attached, type `I'. Let's call the character set "input character set". Also, if you want to specify the coding-system of the transfer form, use `C'. Information regarding the character set is displayed in parentheses. If the character set of the transfer form is specified explicitly, it is displayed. Otherwise, if the input character set is specified, it is displayed with "*". Otherwise, "guess" is displayed. Let's look at the following example. Since part 1 is a body, it is stored in an Emacs buffer. Because "guess" is displayed, it is Mew that determines the character set of the transfer form according to the rules that Mew defines. Since iso-8859-1 is specified as the input character set, Mew loads the file considering that its character set is iso-8859-1, and then converts it into internal representation. The character set of the transfer form is decided according to rules defined by Mew. The input character set in part 3 cannot be identified just from this example. (But a user certainly knows what it is since he actually specified it.) In any case, a file will be loaded and be converted into internal representation, then be converted into EUC-JP which is specified as the character set of the transfer form. ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* 2 Text/Plain(*iso-8859-1) text1 B 3 Text/Plain(euc-jp) text2 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- Note that both `C' and `I' are not available on Bilingual Emacs.  File: mew.info, Node: longline, Next: reply, Prev: charset-guess, Up: Composing Handling long lines =================== For a long period, when you are writing a message, you should fold each line around 70 characters by yourself. RFC 3676 extended Text/Plain and defined "flowed" as a value of the "format" parameter. Thanks to this, long lines can be automatically folded on a sender side while they can be unfolded on a receiver side. From the point of user view, you can write long lines casually. There are two ways to apply the flowed folding. 1) To apply the flowed folding explicitly, type `C-cC-f'. Then, Mew sees if long lines exist in a draft. If long lines whose length is over `mew-flowed-fold-threshold' are found, Mew applies the "flowed" folding. This variable defaults to 78. `mew-flowed-fold-length' controls the max length of folded lines. Its initial value is 70. Folding method is decided according to character set. If the language is separated by SPC, the new line characters are inserted after existing SPCs(delsp=no). Otherwise, pairs of SPC and the new line character are inserted in appropriate positions(delsp=yes). If you type `C-cC-f' again, the folded lines are unfolded. 2) If `mew-use-format-flowed' is `t', this functionality is took into account automatically at composing with `C-cC-c' or `C-cC-m'. Its default value is `nil'. 3) You can toggle the value of `mew-use-format-flowed' by `C-cC-pC-f'. Note that folded lines with the "flowed" folding are always unfolded on viewing regardless of the value of `mew-use-format-flowed'. If you feel it is hard to see long lines, use `_' in Summary mode. If `mew-flowed-auto-wrap' is `t', at visualizing a message, `_' is automatically executed so as unfolded lines are folded. The default value of `mew-flowed-auto-wrap' is `t'.  File: mew.info, Node: reply, Next: forward, Prev: longline, Up: Composing Replying to a message and deciding recipients ============================================= As distinguished from the case of a new message, where the writer specifies the addresses of the To:, Cc: or Newsgroups: fields, in a reply message addresses are automatically generated. When `a' and `A' is used in Summary mode, a new draft is prepared in Draft mode. Values of To:, Cc:, and Newsgroups: are prepared according to three alists. 1. If called with `C-u', replying to the sender/poster only. In this case, `mew-reply-sender-alist' is used. 2. If this message is sent by ME, you probably intend to reply with the original header. In this case, `mew-reply-fromme-alist' is used. 3. Otherwise, replying to all people listed. In this case, `mew-reply-all-alist' is used. The default value of `mew-reply-sender-alist' is as follows: '(("Reply-To:" ("To:" "Reply-To:" "From:")) (t ("To:" "From:"))) This is read as follows: 1. If Reply-To: exists, copy the values of Reply-To: and From: to new To:. 2. Otherwise, copy the value of From: to To:. If you would like to reply only to the address on Reply-To: (if any), set `mew-reply-sender-alist' like this: (setq mew-reply-sender-alist '(("Reply-To:" ("To:" "Reply-To:")) (t ("To:" "From:")))) The default value of `mew-reply-fromme-alist' is as follows: '((t ("To:" "To:") ("Cc:" "Cc:") ("Newsgroups:" "Newsgroups:")))) This is read as follows: 1. Copying the value of To: to new To: and copying the value of Cc: to new Cc: and copying the value of Newsgroups: to new Newsgroups:. The default value of `mew-reply-all-alist' is as follows: '((("Followup-To:" "poster") ("To:" "From:")) ("Followup-To:" ("Newsgroups:" "Followup-To:" "Newsgroups:")) ("Newsgroups:" ("Newsgroups:" "Newsgroups:")) ("Reply-To:" ("To:" "Reply-To:" "From:") ("Cc:" "To:" "Cc:" "Apparently-To:")) (t ("To:" "From:") ("Cc:" "To:" "Cc:" "Apparently-To:"))) This is read as follows: 1. If the value of Followup-To: is "poster", copying the value of From: to new To:. 2. If Followup-To: exists, copying the values of Followup-To: and Newsgroups: to new Newsgroups:. 3. If Newsgroups: exists, copying the value of Newsgroups: to Newsgroups:. 4. If Reply-To: exists, copying the values of Reply-To: and From: to new To:. And copying the values of To:, Cc:, and Apparently-To: to new Cc:. 5. Otherwise, copying the value of From: to new To:. And copying the values of To:, Cc:, and Apparently-To: to new Cc:. You may want to set `mew-reply-all-alist' like this: (setq mew-reply-all-alist '((("Followup-To:" "poster") ("To:" "From:")) ("Followup-To:" ("Newsgroups:" "Followup-To:")) ("Newsgroups:" ("Newsgroups:" "Newsgroups:")) ("Reply-To:" ("To:" "Reply-To:")) (t ("To:" "From:") ("Cc:" "To:" "Cc:" "Apparently-To:")))) If there are multiple entries for a certain address, they are unified. Addresses ending with ":;", which indicates anonymous recipients, are automatically removed. Your addresses are automatically removed. Your addresses are automatically defined to `mew-mail-address-list' according to, for example, `mew-config-alist'. If you dislike this value, you can also explicitly set it like this: (setq mew-mail-address-list '("^pooh@[a-z]*.example.org$" "^pooh@example.net$" "^winnie@example.jp$"))  File: mew.info, Node: forward, Next: resend, Prev: reply, Up: Composing Forwarding messages =================== To forward messages, type `f' or `F' in Summary mode. Then Draft mode appears and the messages are already attached in the attachments region. Also, you can prepare the attachments region by yourself, then copy (`c') the messages or make links (`l') to the messages. If the file names of the messages are numeric ([0-9]+), they are automatically considered as messages. `y' is very convenient because it make a link to the message displayed in Message mode. By default, the entire message is forwarded. If you want to remove some parts of its header, define `mew-field-delete-for-forwarding'. The following is an example to remove "Received:" and "Return-Path:" when forwarded. (setq mew-field-delete-for-forwarding '("Received:" "Return-Path:"))  File: mew.info, Node: resend, Next: shortcut, Prev: forward, Up: Composing Re-sending messages =================== You may occasionally wish to send messages modifying the header of a message. For instance, you may want to send a message with the same body to multiple receivers independently. Please imagine the case where you put a created message destined to Pooh in +queue and then you wish to send an another message to Piglet by copying it and modifying its header. Let's call this recycle sending. Also, you occasionally wish to send a message adding the Resent-To: field to a target message. This is a kind of forwarding. This is called header conversion because a message header is modified. The forwarding described the previous subsection is called encapsulation because a message is embedded into another new message. Header mode exists for this reason, modifying a part of the header, sending/queuing the created message. You can think this is a kind of Draft mode which prohibits modifications of its body. The following commands are provided in Summary mode to enter Header mode. `W' Recycle sending. Enter Header mode in order to modify To:, Cc:, From: of a target message. Typical usage is for messages in +queue or +postq. `r' Re-sending. Enter Header mode in order to add Resent-To:, Resent-Cc:, Resent-From: of a target message. Re-sending may confuse receivers, so you should think carefully before using it. In Header mode, you can make use of completion and circular completion like in Draft mode. When you are finished inputting the header, send the message using one of the following commands. You may be concerned because the body of the message is not displayed in your new message. But you need not worry, since the body and a part of the target message is certainly used. `C-cC-m' Compose a message, put it into +queue or +postq, and let it be waiting to be sent. `C-cC-c' Compose a message and send it. You are asked, "Really send this message? (y or n) ". Type `y' to send it.  File: mew.info, Node: shortcut, Next: mark-b-comp, Prev: resend, Up: Composing Creating signature or cipher message ==================================== This section explains the method for signing or encrypting "text only" messages with PGP or S/MIME. The following commands are explained. `C-cC-s' Sign the entire draft. Input your pass-phrase. `C-cC-e' Encrypt the entire draft. `C-cC-b' Sign, and then encrypt the entire draft. Input your pass-phrase. `C-cC-r' Encrypt, and then sign the entire draft. Input your pass-phrase. To encrypt a message, receivers' public keys are used. On the other hand, your secret key is used to sign a message, and so you need to input your pass-phrase when applying the signature. Note that if you are using the pass-phrase cache or the master password mechanism and there are pass-phrases presently cached, you do not have to type your pass-phrase (*Note password::). These commands create a PGP/MIME message by default. If you want to use S/MIME, configure as follows: (setq mew-draft-privacy-method 'smime) You can change this variable with `C-cC-pC-m' in Draft mode. We can consider that these four commands above are shortcut methods of mark based composing described in the next section. To sign a message, type `C-cC-s'. When signing, because your secret key is needed to be decrypted, you may be asked for your pass-phrase if it is not cached. Created messages are stored in +queue or +postq. Your secret key is identified in From: address. If From: does not exist, your default secret key is selected. When you want to specify a secret key that is not identified the address of From:, type `C-uC-cC-s'. To encrypt a message, type `C-cC-e'. A message is encrypted with public keys identified with the addresses on To: and Cc:. Since this is encryption only, you are not asked for your pass-phrase. Created cipher messages are stored in +queue. This message is encrypted with your public key in addition to those of the receivers. Therefore you can decrypt created messages. For example, you can go to +queue by `g' and preview a created message to reconfirm this. To sign a draft and then encrypt it, type `C-cC-b'. To encrypt a draft and then sign it, type `C-cC-r'. In both cases, created messages are stored in +queue. It is very likely that you will forget to sign and/or encrypt a draft even if you intended to do so. To prevent this, Mew provides an mechanism to automatically sign or encrypt a message when `C-cC-m' or `C-cC-c' is typed. If you want to protect privacy of all drafts, set `mew-protect-privacy-always' to `t' and set `mew-protect-privacy-always-type' to one of services. If you want to protect the privacy of drafts when replying encrypted messages, set `mew-protect-privacy-encrypted' to `t' and set `mew-protect-privacy-encrypted-type' to one of the services. This configuration is preferred to the configuration for all drafts described above in the case of replying encrypted messages. The following services are available. The strings enclosed in braces are the symbols for each service. The service applied when typing `C-cC-m' or `C-cC-c' is displayed in the mode line. pgp-signature (PS) Sign with PGP pgp-encryption (PE) Encrypt with PGP pgp-signature-encryption (PSPE) Sign then encrypt with PGP pgp-encryption-signature (PEPS) Encrypt then sign with PGP pgp-signature (SS) Sign with S/MIME pgp-encryption (sE) Encrypt with S/MIME pgp-signature-encryption (SSSE) Sign then encrypt with S/MIME pgp-encryption-signature (SESS) Encrypt then sign with S/MIME The following example works for signing all drafts. (setq mew-protect-privacy-always t) (setq mew-protect-privacy-always-type 'pgp-signature) The following example is for encrypting drafts with PGP when replying encrypted messages. (setq mew-protect-privacy-encrypted t) (setq mew-protect-privacy-encrypted-type 'pgp-encryption) In Draft mode, `C-cC-pC-a' toggles `mew-protect-privacy-always' and `C-cC-pC-e' toggles `mew-protect-privacy-encrypted'. You can specify privacy services for the current draft in Draft mode beforehand so that you do not forget to apply the privacy services when sending. To set privacy services to the current draft evaluated when typing `C-cC-m' or `C-cC-c', type `C-cC-pC-d', and then input one of privacy services listed above. To cancel the current privacy service, just type `RET' instead of selecting the privacy service. When you compose a message by `C-cC-c' or `C-cC-m', and if signing and/or encryption fails, the cursor gets back to the draft. At this time, the service that you specified is canceled. If you type `C-cC-c' or `C-cC-m' in this situation, a plain message is created, so please be careful. After correcting the cause of the failure, if you want the same service, type `C-cC-pC-d' to specify your service explicitly or use `C-cC-s', `C-cC-e', etc. If `mew-use-old-pgp' is set to `t' (the default value is `nil'), `C-cC-s' and `C-cC-e', etc create old fashioned PGP message instead of PGP/MIME. If the attachment region exists, an error occurs. `mew-protect-privacy-*' described above are effective only to PGP/MIME, not to old PGP. If you want to create old PGP signature with `C-cC-m' or `C-cC-c' always, set `mew-protect-privacy-with-old-pgp-signature' to `t'. For PGP/MIME and S/MIME, Mew supports GnuPG 1.x and 2.0, not 2.1.  File: mew.info, Node: mark-b-comp, Next: pgp-key, Prev: shortcut, Up: Composing Mark based composer =================== To support PGP/MIME, S/MIME and ZIP, mark based composing is provided. Remember the previous example. ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* B 2 Image/Gif MagicPoint logo mgp.gif Q 3 Application/Postscript Presentation Material ohp.ps 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- You can find the `B' mark and the `Q' mark at the beginning of the line. Mew provides you with a new concept of "encoding". Encoding includes Base64, Quoted-Printable, Gzip64 (Gzip + Base64), signature, encryption. At present, 8 marks are prepared. `" "' No encoding. But 8bit text would be encoded. `B' Base64 `Q' Quoted-Printable `G' Gzip64 (compressed with gzip then encoded with Base64. This is experimental. Do not use this if receivers do not use Mew.) `PS' Sign with PGP `PE' Encrypt with PGP `SS' Sign with S/MIME `SE' Encrypt with S/MIME Additional key binding for marks in attachments is as follows: `B' Put the `B' mark to encode with Base64. `Q' Put the `Q' mark to encode with Quoted-Printable. `G' Put the `G' mark to encode with Gzip64. This is applicable only to Text/Plain and Application/Postscript since compression is not effective with other objects. For example, JPEG is already compressed. `S' Put the `PS' mark to sign with PGP. `E' Put the `PE' mark to encrypt with PGP. Input decrypters' addresses. `M-s' Put the `SS' mark to sign with S/MIME. `M-e' Put the `SE' mark to encrypt with S/MIME. Input decrypters' addresses. `Z' Encrypt the part with ZIP immediately. After the encryption, the `B' mark appears. `U' Unmark. The original mark appears. Consider the following example: The second part will be signed with PGP then encrypted with PGP for "kazu". Don't be alarmed. Its description is overwritten but saved. The third part will be encoded with Gzip64. ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* PSPE 2 Image/Gif kazu@example.org mgp.gif G 3 Application/Postscript Presentation Material ohp.ps 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- After applying marks, type `C-cC-m' or `C-cC-c' to create messages.  File: mew.info, Node: pgp-key, Next: anonymous, Prev: mark-b-comp, Up: Composing PGP key distribution ==================== To distribute a PGP public key, please use `p' on attachments in Draft mode. It asks whose public key you want to distribute. Just type `RET' if it is yours. If you want to distribute someone else's key, input his e-mail address with completion. The PGP public key will distributed as Content-Type: Application/Pgp-Keys. If Mew finds that the part is Application/Pgp-keys, it tries to add the PGP public key onto your PGP public keyring. Remember that Mew is not responsible for TRUST or VALIDITY. It is YOU who set these values. Please use the commands described by Mew to set these as necessary. If you do not know the meaning of TRUST and VALIDITY, you should learn the web of trust system provided by PGP BEFORE using PGP to protect your privacy.  File: mew.info, Node: anonymous, Next: Marks, Prev: pgp-key, Up: Composing Sending messages with anonymous receivers ========================================= You may occasionally wish to send a message to anonymous receivers. For instance, please imagine that Pooh is trying to invite multiple friends to a party. Piglet should reply only to Pooh. However, Piglet might make a mistake of replying to other people if the addresses of all the invitees are listed in Cc:. Moreover, Pooh does not want to disclose the names of those who he invited until the day of the party. To handle this, Mew makes use of ":;" for anonymous addresses. Please look at the following example. To: party:piglet@example.org,roo@example.org; From: Pooh Here, there is a colon (":") after the explanatory comment "party". This is followed by some addresses that are delimited by "," and terminated by ";". If you write addresses in this format, Mew sends the message to the addresses with them removed form the header. In this example, Piglet and Roo will receive the following message. To: party:; From: Pooh The receiver knows that the sender is Pooh, but will not know who else received the message. Also, the string "party:;" is not address, so the receiver cannot reply to it. You should understand that enumerating many addresses on To: or Cc: is basically not a good practice anyway. If you often have the occasion to send messages a set group of people, you should create a mailing-list.  File: mew.info, Node: Marks, Next: unread mark, Prev: anonymous, Up: Top Funny marks *********** Here is a listing of marks that a user can use for insertion or deletion in Summary mode. This mark is displayed in the beginning of a line as follows: (Note that the marks that Mew inserts are displayed left side of date.) D 03/12 Hidenori Ohta This weekend |Let's go to StoneMagic oM03/14 Momo-chan The pictures of Noto |Attached are the pictu * 03/15 Neat Sumikawa Re: wine |OK. I vote for Wednesd There are six marks at present. `U' The unread mark. `D' The delete mark. `X' The delete mark. `o' The refile mark, that is, to move a message to another folder. `*' The target mark. `$' The mark to save another mark temporarily. Just putting a mark on to a message does NOT process anything at all. It is typing `x' that processes the marks including `o', `D', `X'. So, take it easy to put marks but take care to type `x'. The marks above are explained in sequence. The marks which Mew inserts are summarized here as well. * Menu: * unread mark:: Unread `U' * delete mark:: Delete `D' and `X' * refile mark:: Refile `o' * target mark:: Target `*' * escape mark:: Escape `$' * unmark:: Deleting marks * mark change:: Overwriting marks * sync:: Mark consistency against an IMAP server * off-line:: Processing marks off-line for IMAP * mew-mark:: Marks displayed by Mew  File: mew.info, Node: unread mark, Next: delete mark, Prev: Marks, Up: Marks Unread `U' ========== With the following configuration, messages are marked with the unread mark `U' when scanning the messages. (setq mew-use-unread-mark t) When you read a message with `SPC', `n', or `p' and etc, the `U' mark disappears. These three commands read through messages marked with the `*' mark, the `U' mark, and non-marked messages. If you type `zSPC', they read through messages marked with the `*' mark and the `U' mark only. This is convenient to read through unread messages. Typing `zSPC' again gets the target messages back. When you move onto the current message by putting a mark on the previous message, the `U' mark is deleted. It's sure that you want to read the current message if you move onto it by `SPC', `n', and `p'. However, you might not intend to read the current message when you move onto it by putting a mark. If this is the case, this spec is inconvenient for you. If you want to retain the unread mark on the current message when you move onto it by putting a mark on the previous message, configure as follows: (setq mew-delete-unread-mark-by-mark nil) The followings are summary of commands related to the `U' mark. `zSPC' Toggle the target of `SPC', `n', and `p'. Toggling means change one to the other out of "the `U' mark, the `*' mark, and non-mark" and "the `U' mark and the `*' mark". `M-u' Put the `U' mark to the current message.  File: mew.info, Node: delete mark, Next: refile mark, Prev: unread mark, Up: Marks Delete `D' and `X' ================== If you want to delete a message, type `d' in Summary mode to put the `D' mark on it. Don't be worried about losing the message by mistake. Since putting the `D' mark has no immediate effect, it does not result in a serious mistake. By default, typing `x' moves messages marked with `D' to a trash. For local folders, a trash is +trash. For IMAP, it is %trash. To really delete messages in the trashes, there are two methods: 1. Type `D' in Summary mode. 2. Put the `D' mark in the trashes then type `x'. Exactly speaking, the following rule is applied for local folders. (`mew-trash-folder' is default to +trash. `mew-trash-folder-list' is default to `nil'.) - If `mew-trash-folder' is `nil', messages marked with `D' are deleted. - If `mew-trash-folder-list' is defined, messages marked with `D' in one of the folders defined in it are deleted. Otherwise, they are moved to the trash. - If `mew-trash-folder-list' is `nl', messages marked with `D' in `mew-trash-folder' are deleted. Otherwise, they are moved to the trash. (This is default.) For IMAP, the same rule is applied according to both `mew-imap-trash-folder' and `mew-imap-trash-folder-list' It is convenient if you can change the `*' mark to the `D' mark since you can put many the `D' marks at once. To achieve this, use `md'. Also, typing `Md' put the `D' mark to all duplicated messages excluding one for each. There is also another mark, `X', which is like the mark `D'. Messages marked with `X' are deleted when `x' is typed. The `X' mark can be put by `M-d'. `mxM-d' processes messages marked with `X' only. Typing `mM-d' converts all `*' marks to `X'. The following is a summary regarding with the `D' mark and the `X' mark. `d' Put the `D' mark. `M-d' Put the `X' mark. `md' Convert all `*' marks to `D'. `mM-d' Convert all `*' marks to `X'. `x' Process marked messages. `mxd' Process messages marked with `D' only. `mxM-d' Delete messages marked with `X' only. `D' Delete all messages in a trash. `C-uD' Delete all messages in a specified folder.  kazu-yamamoto-Mew-ff9c41b/info/mew.info-3000066400000000000000000001461151256455547000203230ustar00rootroot00000000000000Info file: mew.info, -*-Text-*- produced by `texinfo-format-buffer' from file `mew.texi' using `texinfmt.el' version 2.42 of 7 Jul 2006. INFO-DIR-SECTION Message User Agent START-INFO-DIR-ENTRY * Mew: (mew.info). Messaging in the Emacs World. END-INFO-DIR-ENTRY  File: mew.info, Node: refile mark, Next: target mark, Prev: delete mark, Up: Marks Refile `o' ========== To refile a message, type `o' and input a folder name, then `o' is put. A folder is guessed neatly, so most time what you should to is just type `RET'. For more information, refer to *Note Refile::. If you type `o' on a message marked with `o', the refile folder is shown. When typing `x', messages marked with `o' are actually refiled. Consider that you specify multiple folders and refiles actually. If your file system has hard link, the message is moved to the first folder, and hard links are created from the other folders. Otherwise, the message is moved to the first folder, and it is copied to the other folders. If the number of specified folders are 1, and it is the current folder, refiling means do nothing. If the number is more than two and the current folder is included, refiling means that the message number in the current folder remains and hard links are created from the other folders (or it is copied to the other folders). Mew provides `c' which is very similar to `o'. `c' shows the current folder as a candidate in addition to guessed folders. A summary about the `o' mark is here. `o' Put the `o' mark. `c' Put the `o' mark. Showing the current folder as a candidate in addition to guessed folders. `x' Refile messages marked with `o'. `mxo' Refile messages marked with `o' only. This command does not process other marks. `C-umxo' Refile messages marked with `o', whose destination is the same as that of the current message.  File: mew.info, Node: target mark, Next: escape mark, Prev: refile mark, Up: Marks Target `*' ========== Please put the `*' mark onto messages that you want to review later. `?' also put the `*' mark onto matched messages (for more information, refer to *Note search::). Use `N' and `P' to walk around messages marked with `*'. Here is a summary for `*' commands. `*' Put the `*' mark. `N' Jump to the message marked with `*' below and display it. `P' Jump to the message marked with `*' above and display it. `ma' Put the `*' mark to all unmarked messages. `mr' Put the `*' mark to all matching messages with specified regular expression. The `*' mark is used to handle multiple messages. The following is a list of commands which handle multiple messages. `F' Prepare a draft to forward multiple messages marked with `*' in MIME format. `J' A large message is occasionally fragmented into multiple messages whose Content-Type: is Message/Partial. Mew puts the `P' mark to these messages. Now a user marks these messages with `*' and executing this commands results in producing the original message. `mI' Retrieve the rest of truncated(`T') messages marked with `*'. `C-umI' Perform `mI'. `M-b' De-capsulate messages embedded in the messages marked with `*'. `M-\' Executing an external command specifying messages marked with `*' as arguments. `M-t' Apply "uudecode" on messages marked with `*'. For `M-t', messages marked with `*' are supposed to be in the right order. If out of order, sorting with `S' would help.  File: mew.info, Node: escape mark, Next: unmark, Prev: target mark, Up: Marks Escape `$' ========== Suppose that you want to put the `*' marks to messages matched to a pattern specified to the `/' command. If there are messages marked with `*' already, these messages are merged to the results of `/'. Thus, you would want to escape the current messages marked with `*'. For this sake, the escape mark `$' is provided. A typical usage is as follows: 1. Change the `*' marks to the `$' marks with `m$'. 2. Put the `*' marks to messages, for instance, with `/' and process the messages marked with `*'. 3. Cancel the `*' marks with `U*'. 4. Get the old `*' marks back with `m*'. Here is summary of the commands related to the `$' mark. `m$' Change the `*' marks to the `$' marks. `m*' Change the `$' marks to the `*' marks.  File: mew.info, Node: unmark, Next: mark change, Prev: escape mark, Up: Marks Deleting marks ============== Refiling and deleting is not processed unless you type `x'. So, if you press `u' to unmark before you type `x', messages do not disappear accidentally. Here is a summary for unmark commands. `u' Cancel the mark on this message. `U' Cancel all marks according to what you input. The method with the `$' mark, that is, preserve the `*' marks and operate something then get them back, is friendly to users since it is visible. But since messages are marked, they would not be the targets of the operation. To solve this problem, a method to recover `*' marks is provided. The command is bound to `M*'. This method would not be friendly to users since the `*' marks to recover are invisible. But because the marks are canceled, these message are surely the target of any operations. `M*' Recover the `*' marks which are canceled by the last `U*'.  File: mew.info, Node: mark change, Next: sync, Prev: unmark, Up: Marks Overwriting marks ================= Marks have levels of strength. You can override a mark by another same-level mark weak mark. Also stronger marks can override weaker marks. The followings shows the marks in the strong order: `o', `D', and `X' After marking a message newly, the next message is shown. After overriding another mark, the cursor stays on the message. `*' and `$' After marking a message, the cursor stays on the message. `U' After marking a message, the cursor stays on the message. refer to *Note summary-mode:: to know which direction the cursor moves after putting a strong mark. You can exchange marks as follows: `m$' `*' -> `$' :: Preserve the `*' marks temporarily. `m*' `$' -> `*' :: Get the `*' marks back. `ms' `$' <-> `*' `mM-u' `*' -> `U' :: It is useful when you put `U' marks to messages picked by `?'. `md' `*' -> `D' :: It is useful when you put `D' marks to messages picked by `?'. `mM-d' `*' -> `X' :: It is useful when you put `X' marks to messages picked by `?'. `mo' `*' -> `o' :: It is useful when you put `o' marks to messages to be moved picked by `?'. `*' -> `o' :: It is useful when you put `o' marks to messages to be copied picked by `?'. `e' Exchange the first input mark to the second one. The `o' mark is not exchangeable.  File: mew.info, Node: sync, Next: off-line, Prev: mark change, Up: Marks Mark consistency against an IMAP server ======================================= Mew can maintain consistency of the following marks against an IMAP server: `U' Whether a message is read or not. This IMAP flag is \Seen. This is usually valid in %inbox only. `*' Review mark. This IMAP flag is \Flagged. To allow off-line operations, Mew synchronizes marks with an IMAP server everytime when a user makes an action. Mew does not automatically synchronize marks repeatedly. The followings are how Mew synchronizes marks. 1. `s' + 'update - Reflecting modified marks of the existing messages to the server - For newly arrived messages, reflecting flags of the server to the messages. 2. `x' - Reflecting modified marks of the existing messages to the server 3. `s' + 'sync - Reflecting modified marks of the existing messages to the server - Clearing `*',`U', `$', ` ' mark on the existing messages. - Reflecting flags of the server to the existing messages - Removing messages which were deleted in the server  File: mew.info, Node: off-line, Next: mew-mark, Prev: sync, Up: Marks Processing marks off-line for IMAP ================================== An IMAP user may want to cache messages in folder A and go out. Then he may want to put the `o' and/or `D' marks, and process the marks off-line. In this story, these jobs should be done in his IMAP server after connecting the Internet. If a message in folder A is moved to folder B with IMAP, the cached message in folder A usually must be deleted and a corresponding message in folder B must be retrieved from his IMAP server again. This is because information embedded in a cached message in folder A is valid only in folder A. Suppose you refile a message in folder A to folder B off-line. It is very inconvenient for you to retrieve a corresponding message in folder B from your IMAP server , in order to read it, after refile jobs are done online. You may want to read the messages refiled to folder B by just going to the folder B, without retrieval form the IMAP server. Mew implements delayed jobs processing and viewing refiled messages without retrieval. If you want to process marks off-line, type `lx'. `lx' carries out the following jobs. 1. Deleting messages marked with `o' and/or `D' from folder A. 2. Queuing these jobs in %queue. 3. Moving messages marked with `o' to folder B and marking them invalid. 'invalid' means that you can read it but you cannot put the `o'/`D' mark on it. Invalid messages are marked with `#'. When you go to folder B by typing `g', a list of invalid messages is displayed automatically. If you want to let your IMAP server process jobs in %queue after you get back online, type `C-cC-c' in %queue. Typing `s' in folder B after jobs in %queue are done in your IMAP server results in deletion of invalid messages and caching valid messages.  File: mew.info, Node: mew-mark, Next: Refile, Prev: off-line, Up: Marks Marks displayed by Mew ====================== Here is a summary of marks displayed by Mew. `M' This message is a multipart. Please refer to *Note multipart::. `-' This message contains a Multipart/Alternative content. Please refer to *Note analysis::. `T' This message was truncated by Mew. Please refer to *Note retrieving::. `S' This message is signed. Please refer to *Note cipher-viewing::. `E' This is a cipher message. Please refer to *Note cipher-viewing::. `P' This message is fragmented. Please refer to *Note target mark::. `#' This message is invalid. Please refer to *Note off-line::.  File: mew.info, Node: Refile, Next: by-folder, Prev: mew-mark, Up: Top Happy refiling ************** When you come to receive hundreds of messages in a day (do not you believe it?), refiling messages becomes a very tough job. Mew neatly guesses default folders where the message is supposed to be refiled when you type `o'. You can see an example below. Folder name (+work/mew-dist): + If the default value in () is proper, just type `RET'. The messages will be marked with `o' if its refiling folders are decided. You can refile a message to folders of the same world to which the message belong. As described above, a world is identified by a combination of "case" and proto. When you input a folder to which the message is refiled, you must not specify "case" and you must input a folder whose proto is the same. The reason why you must not specify "case" is that the "case" is already known. With other commands, you have to specify the "case", if necessary, when you input folder name in minibuffer. This command is only the exception. Mew also provides `c' which is very similar to `o'. To know the difference, please refer to *Note refile mark::. As you know, the more excellent refiling guess algorithms become, the less user's job troublesome. Mew provides you with the following rules. * Menu: * by-folder:: Guess by mailing-list folders * by-alist:: Guess by user defined rules * by-thread:: Guess by thread * by-from-folder:: Guess by private folders * by-from:: Guess by From: * by-newsgroups:: Guess by Newsgroups: * by-default:: Guess by default rule * guess-rule:: Controlling rules * auto-refile:: Auto refile * copy-msg:: Copying messages across worlds  File: mew.info, Node: by-folder, Next: by-alist, Prev: Refile, Up: Refile Guess by mailing-list folders ============================= Many users tend to refile messages destined to a mailing-list to a folder whose name is the same as the mailing-list. Mew provides a mechanism to guess a mailing-list folder for messages destined to mailing-lists. Suppose that you have a folder named +misc/pooh-lovers. The following message is probably to be refiled to this folder. To: pooh-lovers@example.org Likewise, Mew searches a matching folder forward with addresses on To: and Cc:. There are many people who do not use recursive folders. With Mew, however, you would not be smart if you do not use it. Smart users may wonder that they get a trouble in the following situation where private addresses are on To: or Cc:. To: piglet@example.org Cc: pooh-lovers@example.org Since Pooh is a member of pooh-lovers, he receives this message. But he has a folder for his friend, Piglet. So, +from/piglet may be chosen. To avoid this, Mew allows you to specify which folders are to be ignored. The default is +from. So, please take a convention to refile personal messages under +from. When Mew guesses a candidate by the folders, it asks you: Folder name (+misc/pooh-lovers): + Just type `RET' if the default is exactly what you want. If you specify a new folder with `o', the folder is created and added to the folder list to be used for guess. Convenient, isn't it? The function name to provide this feature is `mew-refile-guess-by-folder'. If you don't use capital letters for folder names, configure as follows to make this function faster: (setq mew-use-fast-refile t) By default, candidate includes node folders as well as leaf folders. If you want to not select node folders but leave folders only, configure as follows: (setq mew-use-node-folder nil)  File: mew.info, Node: by-alist, Next: by-thread, Prev: by-folder, Up: Refile Guess by user defined rules =========================== There are some cases where the refile guess mechanism by folders does not work as you wish. For example, for both a message whose To: is staff@example.jp and another message whose To: is staff@example.net, the same folder would be selected with guess by folders (e.g. "+net/staff"). So, Mew allows you to define your own rules explicitly. (You must use the new format for `mew-refile-guess-alist'. For more information, see Let's look at an example. (setq mew-refile-guess-alist '(("To:" ("staff@example.jp" "+jp/staff") ("staff@example.net" "+net/staff")))) This means that if To: contains staff@example.jp +jp/staff is selected and if To: has staff@example.net +net/staff is chosen. The format of this rule is as follow: rule ::= ' ::= (( ) ( ) ... []) The whole is a list of ( ). A field name is specified for . The format for is as follows: ::= ( |) ( |) ... is a field value for . means a folder to be chosen if matched. You can write recursively instead of . (*Note config2::.) There are two special s: `nil' and `t'. `nil' is used to specify to be returned when nothing is guessed. `t' can specify to be returned in addition to guessed values. ::= (t ) | (nil ) If you know regular expression, a more advanced rule can be defined like this. (setq mew-refile-guess-alist '(("Newsgroups:" ("^nifty\\.\\([^ ]+\\)" "+Nifty/\\1") (".*" "+rec/news")) ("To:" ("\\(inet\\|wide\\)@wnoc-fuk" "+wide/\\1-wnoc-fuk")) ("From:" ("uucp@" "+adm/uucp") ("ftpsync@" "+adm/ftpsync")) (nil "+unknown"))) The function name to provide this feature is `mew-refile-guess-by-alist'.  File: mew.info, Node: by-thread, Next: by-from-folder, Prev: by-alist, Up: Refile Guess by thread =============== Mew provides a mechanism to guess a folder where the parent message of a current message was refiled before. For example, Pooh, Piglet, and Roo had a chat to go and get honey. So, Pooh made +project/honey then refiled the message to it. The further messages, if they are properly replied, they are supposed to be refiled to +project/honey. Information that which folder was chosen for messages is stored to "~/Mail/.mew-refile-msgid-alist". `mew-lisp-max-length' controls the amount of this information. The default value is 2000 messages. If you want limits it to 3000 messages, put the following to "~/.mew.el". (setq mew-lisp-max-length 3000) The function name to provide this feature is `mew-refile-guess-by-message-id'.  File: mew.info, Node: by-from-folder, Next: by-from, Prev: by-thread, Up: Refile Guess by private folders ======================== In addition to the mechanism to select a mailing-list folder described in *Note by-folder::, Mew provides a mechanism to choose a private folder. Since private folders locate under +from, we can say that this mechanism select a folder from the folders under +from. Let's see the following example: To: pooh@example.net From: piglet@example.org Pooh received a message from Piglet. If Pooh uses this mechanism, +from/piglet will be chosen according to From:. (Folders under +from can be recurse. And you can select the entire address for a folder name instead of the user part.) The function to provide this feature is `mew-refile-guess-by-from-folder'. Next, let's consider a care where Pooh replied to Piglet. Since Pooh Cc:ed the message to himself, the message was also delivered to him. To: piglet@example.org Cc: pooh@example.net From: pooh@example.net How do you feel if you are Pooh? You may want to refile this to +from/pooh. Also, you may want to move this to +from/piglet. So, it can be customized. If `mew-refile-guess-from-me-is-special' is `t' and if an address in From: is yourself, `mew-refile-guess-by-from-folder' select a folder under +from according to To: and/or Cc:.  File: mew.info, Node: by-from, Next: by-newsgroups, Prev: by-from-folder, Up: Refile Guess by From: ============== Mew also provides a mechanism to guess a folder by the place where a message that has the same From: field is refiled. Suppose that Piglet has two addresses, piglet@example.org and p-p-p@example.org. Pooh wants to refile messages from Piglet to +from/piglet no matter what his From: is. This policy can, of course, be implemented if Pooh specifies rules explicitly as follows: (setq mew-refile-guess-alist '(("From:" ("piglet@example.org" "+from/piglet") ("p-p-p@example.org" "+from/piglet")))) But such a work may bother you. So, first refile a message whose From: is piglet@example.org to +from/piglet. At this time, +from/piglet is created. Next, refile a message whose From: is p-p-p@example.org to +from/piglet. Here Mews learns that p-p-p@example.org was refiled to +from/piglet. After this, when messages whose From: is p-p-p@example.org are refiled, +from/piglet is chosen. For another example, you can refile messages from machinery to +adm/misc without defining an explicit rule. Information for relationship between From: and folder is stored to "~/Mail/.mew-refile-from-alist". `mew-lisp-max-length' controls the amount of this information as the same as *Note by-thread::. The function name to provide this feature is `mew-refile-guess-by-from'. If the value of `mew-refile-guess-from-me-is-special' is `t', `mew-refile-guess-by-from' acts as `mew-refile-guess-by-from-folder' (*Note by-from-folder::).  File: mew.info, Node: by-newsgroups, Next: by-default, Prev: by-from, Up: Refile Guess by Newsgroups: ==================== For those who read articles of NetNews received by e-mail with Mew, Mew provides a mechanism to guess a folder by Newsgroups:. The function name to provide this feature is `mew-refile-guess-by-newsgroups'.  File: mew.info, Node: by-default, Next: guess-rule, Prev: by-newsgroups, Up: Refile Guess by default rule ===================== The default rule is to extract a user name from From: and to choose `+from/user'. But if `mew-refile-guess-strip-domainpart' is `nil', it extracts the entire address. So, `+from/user@domain' is chosen. The default value of `mew-refile-guess-strip-domainpart' is `t'. The function name is `mew-refile-guess-by-default'.  File: mew.info, Node: guess-rule, Next: auto-refile, Prev: by-default, Up: Refile Controlling rules ================= Mew controls guess rules by two variables, `mew-refile-guess-control' and `mew-refile-ctrl-multi'. If you want multiple candidates, set `mew-refile-ctrl-multi' `t'. Otherwise, set it `nil'. By default, `mew-refile-guess-control' is declared as follows (since it is a declaration, `defvar' is used): (defvar mew-refile-guess-control '(mew-refile-guess-by-alist mew-refile-ctrl-throw mew-refile-guess-by-newsgroups mew-refile-guess-by-folder mew-refile-ctrl-throw mew-refile-ctrl-auto-boundary mew-refile-guess-by-thread mew-refile-ctrl-throw mew-refile-guess-by-from-folder mew-refile-ctrl-throw mew-refile-guess-by-from mew-refile-ctrl-throw mew-refile-guess-by-default)) Mew executes every function defined in `mew-refile-guess-control' in order. Each function may guess multiple candidates. Let's see the following example of `mew-refile-guess-control' action. `mew-refile-guess-by-alist' guessed +aaa and +bbb. `mew-refile-guess-by-folder' guessed +ccc and +ddd. `mew-refile-guess-by-default' guessed +eee. If you want to provide all candidates, +aaa - +eee, set `mew-refile-ctrl-multi' `t'. If you want to provide +aaa only, set it `nil'. If you want +aaa - +ddd but do not want left candidates, in other words, you want +eee only when no candidate is guessed by functions executed before, set `mew-refile-ctrl-multi' `t' and insert `mew-refile-ctrl-throw' between `mew-refile-guess-by-folder' and `mew-refile-guess-by-default'. `C-uo' displays the flow of guess rules in Message buffer.  File: mew.info, Node: auto-refile, Next: copy-msg, Prev: guess-rule, Up: Refile Auto refile =========== Those who receives many messages everyday is prone to store thousands of messages in the +inbox (or %inbox) folder. In such a case, they may want to speak out like this, "Hey messages, get out of the folder to somewhere". Mew provides a feature to satisfy such laziness. :) `M-o' is the spell. When you execute this function, it marks specific messages with `o'. The specific messages mean messages which are not marked with `o' nor `D' if `mew-refile-auto-refile-skip-any-mark' is `nil'. If `mew-refile-auto-refile-skip-any-mark' is `t', they mean non-marked messages (i.e. read). The default value of `mew-refile-auto-refile-skip-any-mark' is `nil'. `C-uM-o' targets messages marked with `*' regardless the value of `mew-refile-auto-refile-skip-any-mark'. Refile rule is the same described in the previous section. Please note that what this function does is just mark messages with `o'. Messages are not refiled until you will press `x'. Mew's refile mechanism is so smart that it would be harmful for this function. That is, most users would not understand where messages have been refiled if Mew made most use of its guess mechanism. :) For this reason, break is provided to limit usage of guess functions. Recall the declaration up above. (defvar mew-refile-guess-control '(mew-refile-guess-by-alist mew-refile-ctrl-throw mew-refile-guess-by-newsgroups mew-refile-guess-by-folder mew-refile-ctrl-throw mew-refile-ctrl-auto-boundary mew-refile-guess-by-thread mew-refile-ctrl-throw mew-refile-guess-by-from-folder mew-refile-ctrl-throw mew-refile-guess-by-from mew-refile-ctrl-throw mew-refile-guess-by-default)) You can find the `mew-refile-ctrl-auto-boundary' function in `mew-refile-guess-control'. Only when auto refile is used, Mew ignores guess functions below this function. If guess functions above `mew-refile-ctrl-auto-boundary' didn't guess any folder for a message, the message is not marked with `o'. Insert `mew-refile-ctrl-auto-boundary' before you ruin.  File: mew.info, Node: copy-msg, Next: Virtual, Prev: auto-refile, Up: Refile Copying messages across worlds ============================== "Refile" described above is moving messages in the same world. By contrast, you may want to move messages from a world to another world. You can accomplish this by copying messages from a world to another and deleting the original messages. Here we describe how to copy messages to another world. You may want to copy a message to a local folder. For this, type `lc'. If you execute `lc' in a remote folder, Mew removes information related to the remote folder from the cached message and copy it to a local folder. (You can use `lc' in a local folder, too. In this case, a message is moved in the same world.) To opy a message in a folder to an IMAP folder (the server side), type `li'. To copy messages marked with `*' to a local folder, use `mlc'. To copy messages marked with `*' to an IMAP folder, use `mli'. Here is a summary of commands which copy messages from a world to another. `lc' Copy a message to a local folder. `mlc' Copy messages marked with `*' to a local folder. `li' Copy a message to the server side of IMAP. `mli' Copy messages marked with `*' to the server side of IMAP.  File: mew.info, Node: Virtual, Next: selection, Prev: copy-msg, Up: Top Virtual folder ************** Virtual mode is a virtual folder and it consists of "selection" and "thread". `Selection' A virtual folder collecting necessary messages from several folders. Its folder name has "*" on the left side. `Thread' A virtual folder to visualize message flow with indentation, created from a folder or a virtual folder. Its folder name has "*" on the both sides. In Virtual mode, you can use most commands that you can find in Summary mode. If you put a mark on a message in Virtual mode and if corresponding Summary mode exists, the mark is also put onto the corresponding message there. But if you put a mark on a message in Summary mode, the mark is not put any corresponding messages in Virtual mode. You cannot process marks in Virtual mode. Even if you type `x' to process marks in Virtual mode, the cursor moves to corresponding Summary mode, if exsists, and you are asked to type `x' again. You should take note that Virtual folder is really virtual and it does not exist in file system. If you exit Mew, it then disappears. To know how to delete Virtual mode, please refer to *Note Quit::. * Menu: * selection:: Selection * sorting:: Sorting * dialog:: Dialog * search:: Searching * condition:: How to input search conditions * dbsearch:: Search Engine * keyword:: Highlighting a keyword * thread:: Thread * thread-op:: Thread operations  File: mew.info, Node: selection, Next: sorting, Prev: Virtual, Up: Virtual Selection ========= Selection is a virtual folder collecting necessary messages from several folders. There are five ways to create selection: `m/' Listing messages marked with `*' on a folder. see *Note sorting::. `S' Sorting messages on a folder and display them. (No effect to the original folder.) see *Note dialog::. `V' Listing messages which have relationship with the current message. See *Note dialog::. `/' Listing messaged matched to a search condition on a folder. see *Note search::. `k/' Listing messaged matched to a search condition from all folders. See *Note search::.  File: mew.info, Node: sorting, Next: dialog, Prev: selection, Up: Virtual Sorting ======= To make selection by sorting messages, use `S'. Then you will be asked to input the field name as follows: Sort by? (default date): There are some cases where strings stored in the specified field should not be compared as text. For example, while Subject: can be considered as text, Date: and X-Mail-Count: should be treated as date and number, respectively. In this way, we call the distinctions in methods of string sorting "modes". Default modes for typical field names are configured in `mew-sort-key-alist'. When you want to specify the mode of sorting, the mode is followed by `:'. For example, to sort with the X-Mail-Count: field as arithmetic value (not text), input like this: x-mail-count:num You can complete field names and modes with `TAB'. Mew provides four modes for sorting: `text' String with preceding "Re: " and or "Fw: " removed. `ml' The same as text but preceding mailing-list-string removed. `num' Number. `date' Date. The default field name, your response to the prompt "Sort by?", can be specified in `mew-sort-default-key'. The following example changes the default value from "date" to "x-ml-count". (setq mew-sort-default-key "x-ml-count") You can also set a default field name for each folder by `mew-sort-default-key-alist'. For folders not explicitly specified here, `mew-sort-default-key' is used for their default field name. The following is an example that specifies "subject" for the +inbox folder and "x-mail-count" for the +mew-dist folder. (setq mew-sort-default-key-alist '(("+inbox" "subject") ("+mew-dist" "x-mail-count"))) To really sort messages in a local folder, use `M-s'. This command is not available in remote folders.  File: mew.info, Node: dialog, Next: search, Prev: sorting, Up: Virtual Dialog ====== Mew can list messages which have relationship with the current message. Let's call this "dialog". This is different from thread described later in the following points: - Thread can be made from one folder or one virtual folder. Messages relating to dialog can ubiquitously exists in several folders. - Thread visualizes tree structres with indentation. while dialog lists up messages in order of time. To use the feature of dialog, execute `kI' to create database. New messages are not automatically registered in to the database, you should periodically execute `kI'. `kI' updates the database incrementally by default. This method is fast but garbages are left. So, sometime you should type `C-ukI' to update the database fully. To make dialog, type `V' on the current message. This command displays him, his ancestors, and his children only. His brothers and so on are not shown. If you display the entire of the family, type `V' again on the first message of the dialog, which is the origin of the family.  File: mew.info, Node: search, Next: condition, Prev: dialog, Up: Virtual Searching ========= Mew provides the following method to search messages: `?' Put the `*' mark onto messages in this folder, which are matched to a specified pattern. Either `mewl' or `grep' is called according to the specified pattern. `C-u?' `?' with a region specified. `/' Make selection with messages in this folder, which are matched to a specified pattern. Either `mewl' or `grep' is called according to the specified pattern. `C-u/' `/' with a region specified. We can also search messages with a search engine, including Spotlight, Windows Desktop Search, etc. This feature is supported by the following commands. `k?' Put the `*' mark onto messages in this folder, which are matched to a specified pattern. `k/' Make selection with messages in all folders, which are matched to a specified pattern. `C-uk/' Make selection with messages in specified folders, which are matched to a specified pattern. If you want to specify multiple folders, separate them with ",". You can also use a wildcar "*".  File: mew.info, Node: condition, Next: dbsearch, Prev: search, Up: Virtual How to input search conditions ============================== If you type `?' or `/', Mew asks you to input search pattern as follows: mewl/grep pick pattern: If you specify just a keyword, Mew executes `grep'. On the contrast if you type an expression, Mew calls `mewl'. Here is a list of expression elements. (In the strong order) `field=string' Match if the "field" field contains the "string" string (case-insensitive). If you specify "head", it means the entire header. `field==string' Match if the "field" field contains the "string" string (case-sensitive). If you specify "head", it means the entire header. `field!=string' Match if the "field" field does not the "string" string (case-insensitive). If you specify "head", it means the entire header. `field!==string' Match if the "field" field does not the "string" string (case-sensitive). If you specify "head", it means the entire header. `( )' Evaluate first. `! ' Match if not . ` & ' Match if AND . You can omit this. ` | ' Match if OR . Some examples are shown below. (a) Messages whose From: contains "kazu". from=kazu (b) Messages whose To: contains "mew" OR Cc: contains "mew". to=mew | cc=mew (c) Messages whose To: contains "mew" OR Cc: contains "mew" AND From: contains "kazu". (to=mew | cc=mew) & from=kazu When you execute `?' or `/' and if you just type `RET' to a pattern, you can specify a command to be executed. Cmd opts pattern: grep -l -e When you use an search engine with `k?' or `k/', the pattern (including just a keyword and an expression) will be converted to the syntax of the search engine. For example, you can write an expression, that From: is "kazu" and body contains "wine" but does not contain "bordeaux", as follows: from=kazu wine ! bordeaux If you set `mew-pick-pattern-list' to a list of pattern, you can enjoy circular completion with `C-cTAB'. In this case, the first member is displayed as a default value.  File: mew.info, Node: dbsearch, Next: keyword, Prev: condition, Up: Virtual Search Engine ============= To operate search engines, the following commands are provided: `km' Make index for the current folder. `kM' Make index for all folders. `kc' Switch one search engine to another. The followings are expiation of each search engines. `Hyper Estraier' Type `kM' periodically. It's OK to execute "mewest" on the command line instead. If you want to update the index for the current folder quickly, you can use `km'. Both `k?' and `k/' are available. When you specify folders with `C-uk/', sub-folders, if any, are included in the target. `Spotlight' Type `kM' just once. `km' is not necessary. Both `k?' and `k/' are available. `Windows Desktop Search' Type `kM' just once. `km' is not necessary. `Google Desktop' Type `kM' just once. `km' is not necessary. Only `k/' is available. The default search engine is automatically set to the one found first. If you explicitly specify it, set `mew-search-method' to one out of 'est, 'spotlight, 'wds, and 'google. The following is an example to choose Hyper Estraier. (setq mew-search-method 'est)  File: mew.info, Node: keyword, Next: thread, Prev: dbsearch, Up: Virtual Highlighting a keyword ====================== The keyword which you specified on search is shorted in a buffer. You can display messages with the keyword highlighted. The commands to enable this functionality are as follows: `M-n' Display a message in the forward direction and find a keyword and highlight it. In Summary mode, the target is messages marked with `*'. In Virtual mode, it is all messages. If you repeat this command, text around the keyword is displayed from one to another. If no key word is set to the variable, this command first asks you a keyword. `C-uM-n' The same as `M-n' except that you can change the stored keyword explicitly. `M-p' A reverse version of `M-n'. `C-uM-p' A reverse version of `C-uM-n'.  File: mew.info, Node: thread, Next: thread-op, Prev: keyword, Up: Virtual Thread ====== When in the process of exchanging messages, the relationship of the messages is presented in a tree structure. Visualization of the structure with indentation is called thread. Here is an example: 03/12 Hidenori Ohta This weekend |Let's go to StoneMagic 03/13 Kazu-kun +Re: This weekend |Since it'll be rainy, 03/15 Hidenori Ohta | +Re: This weekend |OK. Get together at 12 03/14 Oda-chan +Re: This weekend |Sounds lovely. I'd lik The thread feature is implemented as virtual folder. For instance, if you make threads for +inbox, a buffer *+inbox* is prepared. To make thread, the following commands exist. `tt' Make threads from Summary mode or selection and move the cursor to the current message. If corresponding threads already exist, switch to the Virtual mode. When this command is executed on threads, switch to the original folder and move the cursor to the current message. `C-utt' Make threads for messages in the region. `mt' Make threads for messages marked with `*'. `tr' Make threads for messages matched to a regular expression.  File: mew.info, Node: thread-op, Next: Quit, Prev: thread, Up: Virtual Thread operations ================= Here are the commands used for moving to thread presentation. `tp' Move to the top of the current thread. If the current message is a top node, move to the top of the next thread. `tn' Move to the top of the next thread. `^' Move to the parent message of the current message. (Available in both Summary and Virtual) `&' Move to the child message of the current message. (Available in both Summary and Virtual) `(' Search backward by one sibling message of the current message. `)' Search forward by one sibling message of the current message. Here are commands to mark messages in a thread. `t*' Put the `*' mark all messages of the current sub-thread. Please refer to *Note target mark:: for more information. `t$' Put the `$' mark all messages of the current sub-thread. Please refer to *Note escape mark:: for more information. `td' Put the `D' mark all messages of the current sub-thread. Please refer to *Note delete mark:: for more information. `tM-d' Put the `X' mark all messages of the current sub-thread. Please refer to *Note delete mark:: for more information. `to' Put the `o' mark all messages of the current sub-thread. Please refer to *Note refile mark:: for more information. A command to unmark all messages of the current sub-thread is `tu'. Here are commands to manipulate a thread: `tSPC' Hide children and leave the parent only. If its children are hidden, "+" is displayed on the parent. Also, if this command is executed on a message whose children are hidden, they appear. `ta' Toggle appearance of children for all threads. `tg' Graft a thread to a message. To specify which thread is grafted, type `C-SPC' on the root of the thread. Then move onto your target message, and typing `tg' grafts the thread to the target message as children. If `mew-use-thread-separator' is `t', threads are distinguished by a separator defined by `mew-thread-separator' (its default value is "--").  File: mew.info, Node: Quit, Next: Customize, Prev: thread-op, Up: Top Give me a break *************** Here are how to quit and suspend Mew and how to erase a mode (buffer). `q' Suspend Mew then switch to another buffer. All buffers of Mew remain, so you can resume with buffer operations. `Q' Quit Mew. All buffers of Mew are erased. `C-cC-q' Erase the current mode (buffer). `C-cC-q' Erase the draft. `C-cC-q' Erase the buffer.  File: mew.info, Node: Customize, Next: summary-mode, Prev: Quit, Up: Top Customizing Mew *************** Here are explained how to change default setting of Mew and make Mew your favorite. Edit "~/.mew.el" to do it! * Menu: * summary-mode:: Summary mode * message-mode:: Message mode * draft-mode:: Draft mode * charset:: Character set * highlight:: Highlighting * hooks:: Hooks * pop:: POP * imap:: IMAP * nntp:: NNTP * smtp:: SMTP * config:: Changing receiving/sending behavior * config2:: The format of configuration * custom-misc:: Miscellaneous  File: mew.info, Node: summary-mode, Next: message-mode, Prev: Customize, Up: Customize Summary mode ============ You can specify the format of Summary mode by `mew-summary-form'. The default value is as follows: (setq mew-summary-form '(type (5 date) " " (14 from) " " t (30 subj) "|" (0 body))) Like this, `mew-summary-form' is a list of list, symbol, and string. 1. A string is printed as it is. 2. A list consists of an integer and a symbol. The symbol specifies a function to be called. The name of the function is produced by concatenating "mew-summary-form-" and the symbol name. (e.g. `mew-summary-form-date' for the symbol 'date'). Pre-defined symbols are 'type, 'time, 'date, 'year, 'size, 'from, 'subj and 'body. For more details, see the explanation of the functions called `mew-summary-form-'. The integer specifies the width of field which will be filled with a return string of the function. A positive value means padding SPCs on the right if necessary. A negative value means padding SPCs on the left if necessary. If a negative value is specified, the corresponding function must return an ASCII string. 0 means the remaining width of the line and is treated as a positive value. 3. A symbol is equivalent to (1 symbol). 4. '(mark) is appended to `mew-summary-form' when used. 5. `t' means the position of thread indentation. An example is as follows: (setq mew-summary-form '(type (5 date) " " (-4 size) " " (14 from) " " t (30 subj) "|" (0 body))) `mew-summary-form-from-me-prefix' is the prefix to be prepend to an destination address if the message is originated by me. The default is "To:". `mew-summary-form-extract-rule' is a list to specify what part to extract from the From: field. Each element must be 'name, 'comment, 'address, 'nickname, or appropriate "regex". The default value is '(nickname). Consider the following examples: A: Kazu Yamamoto B: kazu@example.org (Kazu Yamamoto) C: Kazuhiko Yamamoto (Kazu) Each element returns the following value: 1. 'name:: Name part, if any A. Kazu Yamamoto B. (No match) C. Kazuhiko Yamamoto (Kazu) 2. 'comment:: Comment part, if any A: (No match) B: Kazu Yamamoto C: (Kazu) 3. 'address:: Address part A: kazu@example.org B: kazu@example.org C: kazu@example.org 4. 'nickname:: one element of personal information in Addrbook according to `mew-addrbook-for-summary'. The default value of `mew-addrbook-for-summary' is `'nickname'. So, From: is converted a nickname by default. To know what kind of value can be used, refer to *Note draft-mode::. 5. (regex):: The substring first matched. If a element does not match, the next element is applied. If no element matches to the From: field, or this value is `nil', the whole of the From: field is used. If `mew-summary-form-mark-delete' is `t', the `D' mark automatically is put onto duplicated messages. The default is `nil'. If `mew-summary-form-mark-spam' is `t', the `D' mark automatically is put onto SPAM messages. A message is considered a SPAM message if the MD5 checksum of its body is duplicated in a scan. The default is `nil'. If `mew-summary-form-mark-review' is `t', the `*' mark automatically is put onto messages destined to me. The default is `nil'. If you want to use Mew with full Emacs frame, set like this. (setq mew-use-full-window t) `SPC' in Summary mode decide the next action to view a message according to `mew-summary-show-direction'. Likewise, you can specify the cursor direction after putting a strong mark by `mew-summary-mark-direction'. You can select one from the following candidates. `up' Display the message above. `down' Display the message below. `next' Display the next message in the direction. `stop' Do not display the next message. The default value for both is `next'. If you read messages from the bottom, set as follows: (setq mew-summary-show-direction 'up)  File: mew.info, Node: message-mode, Next: draft-mode, Prev: summary-mode, Up: Customize Message mode ============ It is impossible to display a file to the Message buffer if its data type is not supported by Emacs. Install an external program which converts the data to text and you can display the file to the Message buffer. If you install "w3m" and "emacs-w3m", Text/Html can be displayed in Message mode. (Please note that multilingualized "w3m", not pure "w3m", is necessary for "wvHtml", "xlhtml", and "ppthtml" described below.) When you install both of them, add the following to "~/.mew.el'. (condition-case nil (require 'mew-w3m) (file-error nil)) With this, Text/Html can be displayed in Message mode as if it were Text/Plain. Even in this situation, `C-cC-e' described below is a valid operation. If you install "wvHtml", "xlhtml", and "ppthtml", you can display text parts of WORD, Excel, and PowerPoint file in Message, respectively. Since these commands uses HTML, the configuration of Text/Html above is required. With this, a WORD file, for example, can be displayed in Message mode as if it were text. You can display the file with an external application itself instead of displaying it in the Message buffer. For this, type `C-cC-e'. You can visualize an image file into the Message buffer. Also, you can display it with an external application by typing `C-cC-e', of course. You can display an HTML file to a browser with `C-cC-e'. A default browser is used on Windows and Mac. On Unix, "mozilla" is set to a default browser as follows: (defvar mew-prog-text/html-ext '("mozilla" ("-remote" "openFile(%s)") t)) If you want to set it to "firefox", for example, configure like this: (setq mew-prog-text/html-ext '("firefox" ("-a" "firefox" "-remote" "openFile(%s)") t)) You can visualize an Office-family file to each application by typing `C-cC-e'. On Windows and Mac, an Office-family application is executed. On Unix, "ooffice" is set to the default application as follows: (defvar mew-prog-msword-ext "ooffice") (defvar mew-prog-msexcel-ext "ooffice") (defvar mew-prog-mspowerpoint-ext "ooffice") If you want to set it to "soffice", for instace, do like this: (setq mew-prog-msword-ext "soffice") (setq mew-prog-msexcel-ext "soffice") (setq mew-prog-mspowerpoint-ext "soffice") If you want to not visualize an Office-family file into the Message buffer, but want to display it with "wvHtml", configure as follows: (setq mew-prog-msword '(nil mew-mime-application/msword)) (setq mew-prog-msexcel '(nil mew-mime-application/msexcel)) (setq mew-prog-mspowerpoint '(nil mew-mime-application/mspowerpoint)) If you want to specify an application instead of the pre-defined application, type `C-uC-cC-e'. Recently there are many message whose have Multipart/Alternative, which consists of Text/Plain and Text/Html. By default, Mew selects Text/Plain. When you install "emacs-w3m", you may want to choose Text/Html. In this case, add the following to "~/.mew.el". (Now, it's good idea to get back to *Note multipart:: to review how to use `:'.) (setq mew-mime-multipart-alternative-list '("Text/Html" "Text/Plain" ".*")) You can decrypt a ZIP attach file and display it with `zz'.  File: mew.info, Node: draft-mode, Next: charset, Prev: message-mode, Up: Customize Draft mode ========== Define `mew-cc' to use Cc:. When replying, another Cc: field may be prepared from the target message. If there are multiple Cc: fields, they are combined to one field on sending. If you want to receive your originating messages for backup without specifying your address, use Dcc:. Set your address to `mew-dcc'. Set header fields that you want to insert every time when you write messages to `mew-header-alist' as an associate list. The following is an example. (setq mew-header-alist '(("X-fingerprint:" "6B 63 38 88 67 5E 96 8E CE A4 62 73 3F 11 64 94") ("X-URL:" "http://www.example.org/~kazu/"))) To customize citation label, define field to cite in `mew-cite-fields' and format in `mew-cite-format'. Define citation prefix to `mew-cite-prefix'. The default declaration is as follows: (defvar mew-cite-fields '("From:" "Subject:" "Date:")) (defvar mew-cite-format "From: %s\nSubject: %s\nDate: %s\n\n") (defvar mew-cite-prefix "> ") To add Message-ID: to citation label, take this way. (setq mew-cite-fields '("From:" "Subject:" "Date:" "Message-ID:")) (setq mew-cite-format "From: %s\nSubject: %s\nDate: %s\nMessage-ID: %s\n\n") To add a user part of an address to the citation prefix, configure as follows: (setq mew-cite-prefix-function (function mew-cite-prefix-username)) With this, the citation prefix becomes like this: From: SUMIKAWA Munechika Subject: Wine Date: Wed, 23 Jul 1997 11:40:50 +0900 sumikawa> Hi, it's Sumikawa, the guy who's neat from good morning sumikawa> to good night. sumikawa> sumikawa> Talking about the wonderful wine party, I would propose sumikawa> Cabernet Sauvignon, Bordeaux, '90. Both an address in the citation label and the citation prefix can be converted to an element of a personal information in Addrbook. They can be configured by `mew-addrbook-for-cite-label' and `mew-addrbook-for-cite-prefix', respectively. The default values are `nil' and `'username', respectively. You can set out of the following values. 'shortname Short name 'address Address 'username User part of address 'nickname Nickname 'name Full name Let's consider the following example. (setq mew-addrbook-for-cite-label 'nickname) (setq mew-addrbook-for-cite-prefix 'nickname) With the first line, an address in the citation label is replaced with its nickname. The second line indicates that the cite prefix is replaced with its nickname. From: sumitch Subject: Wine Date: Wed, 23 Jul 1997 11:40:50 +0900 sumitch> Hi, it's Sumikawa, the guy who's neat from good morning sumitch> to good night. sumitch> sumitch> Talking about the wonderful wine party, I would propose sumitch> Cabernet Sauvignon, Bordeaux, '90.  kazu-yamamoto-Mew-ff9c41b/info/mew.info-4000066400000000000000000001672421256455547000203300ustar00rootroot00000000000000Info file: mew.info, -*-Text-*- produced by `texinfo-format-buffer' from file `mew.texi' using `texinfmt.el' version 2.42 of 7 Jul 2006. INFO-DIR-SECTION Message User Agent START-INFO-DIR-ENTRY * Mew: (mew.info). Messaging in the Emacs World. END-INFO-DIR-ENTRY  File: mew.info, Node: charset, Next: highlight, Prev: draft-mode, Up: Customize Character set ============= As described in *Note charset-guess::, Mew automatically chooses an appropriate charset for the message when composing. If characters of multiple languages exist, and if it is necessary to use an international charset, `mew-charset-m17n' is used. Its default value is "utf-8" (equivalent to Unicode). If you want to set it to "iso-2022-jp-2", configure like this: (setq mew-charset-m17n "iso-2022-jp-2") If you want to check a chosen charset when composing, configure `mew-ask-charset'. `nil' Not ask. `A list of charset' Ask if the charset is not a member of the list. `t' Ask if `mew-charset-m17n' is used. For instance, if you want to check when charset other than US-ASCII, ISO-8859-1, and ISO-8859-15, configure like this: (setq mew-ask-charset '("us-ascii" "iso-8859-1" "iso-8859-15")) For example, when "utf-8" is chosen for a message with this configuration, you are asked like this: utf-8 is used. OK? (y or n) Typing `y' makes the composed message sent (or queued). If you type `n', you will go back to the original draft. In Europe Latin 9 (ISO-8859-15 or Latin 0), which includes the euro sign, is getting more and more popular instead of Latin 1 (ISO-8859-1). If characters of both Latin 1 and Lain 9 exist in a draft, Mew takes the following step to decide a charset. 1. If `unify-8859-on-decoding-mode' is used: 1. Use "iso-8859-1" if no loss. 2. Otherwise, use "utf-8". 2. If `unify-8859-on-decoding-mode' is not used: 1. If both ISO-8859-1 and ISO-8859-15 can be used with no loss, "ISO-8859-1" is used. 2. Use "iso-8859-1" if no loss. 3. Use "iso-8859-15" if no loss. 4. Otherwise, use "utf-8". The default value of `mew-charset-latin' is "iso-8859-15". If you want to set it to "iso-8859-1", configure like this: (setq mew-charset-latin "iso-8859-1") If you want to always use UTF-8 for any characters other than US-ASCII, configure as follows: (setq mew-cs-database-for-encoding `(((ascii) nil "7bit" "7bit") (nil utf-8 "base64" "B")))  File: mew.info, Node: highlight, Next: hooks, Prev: charset, Up: Customize Highlighting ============ If `mew-use-highlight-mark' is `t', marked message are highlighted. The default is `t'. If `mew-use-highlight-header' is `t', the header of a message is highlighted. The default is `t'. If `mew-use-highlight-body' is `t', the body of a message is highlighted. The default is `t'. The limit to be highlighted can be set by `mew-highlight-body-max-size'. The default is 10000 bytes. If `mew-use-highlight-url' is `t', a spell is cast to URL strings in a message. So, when you move the cursor onto the URL, it is highlighted. The default is `t'. If `mew-use-cursor-mark' is `t', the mark specified `mew-cursor-mark' is putted to the beginning of the current line. The default is `nil'. The default of `mew-cursor-mark' is ">". If `mew-use-highlight-cursor-line' is `t', underline is put on the cursor line in Summary mode. The default is `t'. If `mew-use-highlight-mouse-line' is `t' on Emacs which supports mouse highlight, the mouse line is painted in Summary mode. This is very convenient to read messages clicking the middle button of the mouse. The default value is `nil'. If `mew-use-highlight-x-face' is `t', X-Face: in a header is iconified in Message mode. The default value is `t'. To use this feature, install the "netpbm" package and the "compface" package. To modify colors, copy "dot.theme" contained Mew's source file to an appropriate place, say "~/.mew-theme.el". First, set `mew-theme-file' to this file name in ".mew.el" as follows: (setq mew-theme-file "~/.mew-theme.el") Then, change the contents. For instance, you can find the following configuration. (mew-setface-bold header-subject :tty "red" :light "Firebrick" :dark "OrangeRed") The symbol `header-subject' means the value of the "Subject:" field in a header. :tty is the case where Emacs is executed on a terminal while :light and :dark indicates the case where the background of Emacs executed with a window is white and black, respectively. If you wish green for a terminal, ForestGreen for the white background, and LimeGreen for the black background, modify the configuration as follows: (mew-setface-bold header-subject :tty "green" :light "ForestGreen" :dark "LimeGreen") To know what kind of symbols are prepared, see the "dot.mew". The method above does not prepare symbols for all field names and field value. So, `mew-header-color' and `mew-header-color-bold' exist to change colors easily. If you use the latter, characters become bold. The former results in normal. The following is a typical usage: (mew-header-color-bold "Subject:" "LimeGreen" "OrangeRed") With this configuration, "Subject:" becomes bold LimeGreen and its value turns into bold OrangeRed. The second method cannot specify the cases of terminal or background. If you omit the field value color, the field name color is used for the field value.  File: mew.info, Node: hooks, Next: pop, Prev: highlight, Up: Customize Hooks ===== Here is a summary of hooks used in Mew. `mew-env-hook' Hook called at initialize time before setting environment. `mew-init-hook' Hook called at initialize time. `mew-status-update-hook' Hook called at status update(`Z'). `mew-summary-mode-hook' Hook called in Summary mode. `mew-virtual-mode-hook' Hook called in Virtual mode. `mew-thread-display-hook' Hook called after new threads are displayed. `mew-header-mode-hook' Hook called in Header mode. `mew-draft-mode-hook' Hook called in Draft mode. `mew-draft-mode-newdraft-hook' Hook called in Draft mode only when new draft is prepared. `mew-draft-mode-reedit-hook' Hook called in Draft mode when a message not in +draft is re-edited. `mew-draft-mode-reedit-draft-hook' Hook called in Draft mode when a message in +draft is re-edited. `mew-draft-mode-reedit-queue-hook' Hook called in Draft mode when a message in +queue or +postq is re-edited. `mew-draft-mode-edit-again-hook' Hook called in Draft mode when a message returned with the old style is edited again. `mew-message-mode-hook' Hook called in Message mode. `mew-message-hook' Hook called whenever message displayed. `mew-make-message-hook' Hook called before making a message in Draft mode. A good example is as follows: (add-hook 'mew-make-message-hook 'ispell-message) `mew-send-hook' Hook called before sending/queuing an e-mail message in Draft mode. Note that this hook is called before composition of the message `mew-post-hook' Hook called before posting/queuing a NetNews message in Draft mode. Note that this hook is called before composition of the message. `mew-real-send-hook' Hook called before sending/queuing an e-mail message in Draft mode. Note that this hook is called after composition of the message. `mew-real-post-hook' Hook called before sending/queuing a NetNews message in Draft mode. Note that this hook is called after composition of the message. `mew-smtp-flush-hook' Hook called before SMTP runs if messages exist in +queue. `mew-nntp2-flush-hook' Hook called before NNTP runs if messages exist in +postq. `mew-smtp-sentinel-hook' Hook called when a SMTP process finished. `mew-nntp-sentinel-hook' Hook called when a NNTP process to receive messages finished. `mew-nntp2-sentinel-hook' Hook called when a NNTP process to post messages finished. `mew-pop-sentinel-hook' Hook called when a POP process finished. `mew-pop-sentinel-non-biff-hook' Hook called when a non-Biff POP process finished. `mew-imap-sentinel-hook' Hook called when a NNTP process to post messages finished. `mew-imap-sentinel-hook' Hook called when an IMAP process finished. `mew-imap-sentinel-non-biff-hook' Hook called when a non-Biff IMAP process finished. `mew-scan-sentinel-hook' Hook called when scan finished. `mew-summary-ls-no-scan-hook' Hook called when mew-summary-ls does not scan a folder. `mew-summary-exec-hook' Hook called when `x' in Summary mode finished. `mew-refile-guess-by-from-learn-hook' Hook called in mew-refile-guess-by-from-learn. `mew-sort-hook' Hook called when `M-s' in Summary mode finished. `mew-pack-hook' Hook called when `O' in Summary mode finished. `mew-summary-delete-folder-hook' Hook called when a folder deleted. `mew-summary-rename-folder-hook' Hook called when a folder renamed. `mew-summary-toggle-disp-msg-hook' Hook called when `v' in Summary finished. `mew-syntax-format-hook' Hook called when mew-syntax-format is called. `mew-addrbook-mode-hook' Hook called in Addrbook mode. `mew-cite-hook' Hook for an external cite mechanism. If you want to use super-cite, (setq mew-cite-hook 'sc-cite-original). `mew-before-cite-hook' Called in mew-summary-reply-with-citation before citation. `mew-suspend-hook' Hook called on suspend. `mew-quit-hook' Hook called on quit. Here are some example configurations of hook Draft mode evaluates `text-mode-hook' and `mew-draft-mode-hook' in order. If you do not set `auto-fill-mode' to `text-mode-hook', It would be useful to define `mew-draft-mode-hook' as follows: (add-hook 'mew-draft-mode-hook (lambda () (auto-fill-mode 1) (set-fill-column 70))) In this example, the number of fill column is also set to 70.  File: mew.info, Node: pop, Next: imap, Prev: hooks, Up: Customize POP === Mew can POP to retrieve messages. This section describes following variables to control POP. `mew-pop-server' The name of your POP server. `mew-pop-ssh-server' The name of SSH server which forwards the POP3 port. `mew-pop-ssl' If non-nil, POP connections are made over SSL. `mew-pop-ssl-port' The port for POP over SSL. `mew-pop-user' The user name on your POP server. The default is your login name. `mew-pop-auth' The authentication method for POP3. 'pass means the authentication with USER/PASS (i.e. plain password). 'apop means the authentication with APOP. `t' means SASL according to `mew-pop-auth-list'. The default is 'apop. `mew-pop-auth-list' A list of SASL methods in the preferred order. Currently, "CRAM-MD5" can be used. `mew-pop-delete' Whether or not delete messages on a POP server after retrieval by POP. If `t', delete the messages. If `nil', retain the messages. If number N, delete the messages N days after the first access. The default is `t'. `mew-pop-size' The limit size of messages to be retrieved by POP. The default is 55296 byte. 0 means unlimited, so you can get all messages from the POP server. To know how to retrieve the rest of a truncated message, please refer to *Note retrieving::. `mew-pop-body-lines' *The limit of body lines to get when the size of message exceeds `mew-pop-size'. The default is 40. `mew-pop-header-only' Whether or not the body of a message is retrieved by POP. If non-nil, only header is retrieved. The default is `nil'  File: mew.info, Node: imap, Next: nntp, Prev: pop, Up: Customize IMAP ==== Mew can use IMAP to retrieve messages. This section describes following variables to control IMAP. `mew-imap-server' The name of your IMAP server. `mew-imap-ssh-server' The name of SSH server which forwards the IMAP4 port. `mew-imap-ssl' If non-nil, IMAP connections are made over SSL. `mew-imap-ssl-port' The port for IMAP over SSL. `mew-imap-user' The user name on the IMAP server. The default is your login name. `mew-imap-auth' The authentication method for IMAP4. `nil' means the authentication with LOGIN (i.e. plain password). `t' means SASL according to `mew-imap-auth-list'. The default is `t'. `mew-imap-auth-list' A list of SASL methods in the preferred order. Currently, "CRAM-MD5" and "LOGIN" can be used. `mew-imap-delete' Whether or not delete messages on an IMAP server after retrieval by IMAP. If `t', delete the messages. If `nil', retain the messages. If number N, delete the messages N days after the first access. Otherwise they are not deleted. The default is `t'. `mew-imap-size' The limit size of messages to be retrieved by IMAP. The default is 55296 byte. 0 means unlimited, so you can get all messages from the IMAP server. To know how to retrieve the rest of a truncated message, please refer to *Note retrieving::. `mew-imap-header-only' Whether or not the body of a message is retrieved by IMAP. If non-nil, only header is retrieved. The default is `nil'  File: mew.info, Node: nntp, Next: smtp, Prev: imap, Up: Customize NNTP ==== Mew uses NNTP to read/write News articles. This section describes following variables to control NNTP. `mew-nntp-server' The name of your NNTP server. `mew-nntp-ssh-server' The name of SSH server which forwards the NNTP port. `mew-nntp-ssl' If non-nil, NNTP connections are made over SSL. `mew-nntp-ssl-port' The port for NNTP over SSL. `mew-nntp-user' The user name on the NNTP server. If non-nil, authentication is used. (Note that mew-nntp-auth does not exist.) `mew-nntp-newsgroup' The name of default Newsgroup. `mew-nntp-size' The limit size of messages to be retrieved by NNTP. The default is 55296 byte. 0 means unlimited, so you can get all messages from the NNTP server. `mew-nntp-header-only' Whether or not the body of a message is retrieved by NNTP. If non-nil, only header is retrieved. `mew-nntp-msgid-user' A user name for creation of Message-Id:. If `nil', the value of `mew-user' is used. The default is `nil'. `mew-nntp-msgid-domain' A domain name for creation of Message-Id:. If `nil', the value of `mew-mail-domain' is used. The default is `nil'. A value of Message-Id: for NNTP is created by the following rule: message-id = *random*.nntp-msgid-user@nntp-msgid-domain  File: mew.info, Node: smtp, Next: config, Prev: nntp, Up: Customize SMTP ==== Mew uses SMTP to send messages. If an SMTP server requires authentication, Mew automatically asks you to input your password. This section describes following variables to control SMTP. `mew-smtp-server' The name of your SMTP server. `mew-smtp-port' The port for SMTP. `mew-smtp-ssh-server' The name of SSH server which forwards the SMTP port. `mew-smtp-ssl' If non-nil, SMTP connections are made over SSL. `mew-smtp-ssl-port' The port for SMTP over SSL. `mew-smtp-user' The user name on your SMTP server. If not configured, your e-mail address is automatically set. `mew-smtp-auth-list' A list of SMTP AUTH methods in the preferred order. Currently, "CRAM-MD5", "PLAIN", and "LOGIN" can be used. `mew-smtp-helo-domain' An e-mail domain to tell a SMTP server with HELO/EHLO. The default is "localhost". `mew-smtp-mail-from' The default is `nil'. An e-mail address to tell a SMTP server with MAIL FROM:. If `nil', an address specified by the From: field is used. `mew-smtp-msgid-user' A user name for creation of Message-Id:. If `nil', the value of `mew-user' is used. The default is `nil'. `mew-smtp-msgid-domain' A domain name for creation of Message-Id:. If `nil', the value of `mew-mail-domain' is used. The default is `nil'. `mew-use-8bit' Whether or not send 8bit text without MIME encoding. If `nil', an appropriate MIME encoding is applied. The default is `nil'. A value of Message-Id: for SMTP is created by the following rule: message-id = *random*.smtp-msgid-user@smtp-msgid-domain If you want to use Message Submission (SMTP for submission whose port number is 587), configure as follows: (setq mew-smtp-port "submission") Please refer also to SSL (*Note SSL::) and TLS (*Note TLS::). Some SMTP servers are mis-configured. They requests authentication though errors occur if passwords are received. Mew automatically ask a user to input user's password and send it to an SMTP server if it requires authentication. To get along with such SMTP servers above, configure as follows: (setq mew-use-smtp-auth nil) `mew-use-smtp-auth' If non-nil, Mew send user's password if an SMTP server requests authentication. The default value is `t'. If `nil', Mew does not send user's password even if the (mis-configured) SMTP server requests authentication.  File: mew.info, Node: config, Next: config2, Prev: smtp, Up: Customize Changing receiving/sending behavior =================================== With `mew-config-alist', you can differ actions of sending/receiving messages. Let's look at the following example: (setq mew-config-alist '((home (inbox-folder "+inbox-home") (pop-server "pop.iij4u.or.jp")) (ext (pop-ssh-server "ssh.example.org")) (default (proto "%") (imap-server "imap.example.org") (pop-server "pop.example.org")))) This example defines three "cases": "home", "ext", and "default". For each case, some pair of key and value are defined. We explain the semantics of `mew-config-alist' with this example. If the "case" is "home", looking up "pop-server" results in "pop.iij4u.or.jp". If the "case" is "ext", looking up "pop-server" results in "pop.example.org" since there is no specified key for the "case" and the "default" is used. If the "case" is "default", looking up "pop-server" results in "pop.example.org". If the "case" is "home", looking up "inbox-folder" results in "+inbox-home". If the "case" is "ext", looking up "inbox-folder" results in the value of `mew-inbox-folder' since there is no specified key for both "ext" and "default". If the "case" is "default", looking up "inbox-folder" also results in the value of `mew-inbox-folder'. "proto" (`mew-proto') is used to specify a folder which is selected when you type `M-x mew'. (If you input `M-x mew' when Mew is not executed, ""proto" for the "default" "case" is used. If you type `M-x mew' when Mew is running, "proto" is chosen according to the value of the "case". Candidates of the value are "+", "$", "%", and "-". These means "+inbox", "$inbox", "%inbox", and "-fj.mail.reader.mew" without any special configuration. Each key which can be specified in `mew-config-alist' corresponds to the variable `mew-"key"'. The following list enumerates such keys. name, user, mail-domain, cc, fcc, dcc, reply-to, organization, header-alist, proto, smtp-server, smtp-port, smtp-ssh-server, smtp-ssl, smtp-ssl-port, smtp-user, smtp-auth-list, smtp-msgid-user, smtp-msgid-domain, smtp-helo-domain, smtp-mail-from, pop-server, pop-port, pop-ssh-server, pop-ssl, pop-ssl-port, pop-user, pop-auth, pop-auth-list, pop-size, pop-header-only, pop-delete, pop-body-lines, pop-proxy-server, pop-proxy-port, imap-server, imap-port, imap-ssh-server, imap-ssl, imap-ssl-port, imap-user, imap-auth, imap-auth-list, imap-size, imap-header-only, imap-delete, imap-trash-folder, imap-queue-folder, imap-spam-field, imap-spam-word, imap-proxy-server, imap-proxy-port, nntp-server, nntp-port, nntp-ssh-server, nntp-ssl, nntp-ssl-port, nntp-user, nntp-size, nntp-header-only, nntp-msgid-user, nntp-msgid-domain, ssl-cert-directory, ssl-verify-level, inbox-folder, queue-folder, postq-folder, mailbox-type, mbox-command, mbox-command-arg, signature-file, content-type, refile-guess-alist, spam-prog, spam-prog-args, ham-prog, ham-prog-args, use-old-pgp, pgp-signer, smime-signer, privacy-method, protect-privacy-always, protect-privacy-always-type, protect-privacy-encrypted, protect-privacy-encrypted-type, protect-privacy-with-old-pgp-signature, use-format-flowed A value for From: is made of 'name', 'user', and 'mail-domain' according to the following rule: from = name Unless you set `mew-from-list' by yourself, `mew-from-list' is automatically set collecting 'from' for each "case" according to the rule above. see *Note cheader::. Cases configured in `mew-config-alist' can be specified to the "case". When Mew boots up, both the "case" is "default". If you want to change the "case", type `C'. You can use completion by `TAB' and circular completion by `C-cTAB'. If the "case" is not "default", they are displayed in the mode line of Summary mode. The following is an example where the "case" is "home". (Summary home) In Draft mode, if the "case" is not "default", the value is displayed in mode line. The following is an example that the "case" is "home". (Draft home) To change the "case" of a draft in Draft mode, use `C-cC-o'. Its header is dynamically modified according to the value of the 'mail-domain' key and the 'header-alist' key. Note that the "case" is a local variable of the Draft mode. You can automatically set the "case" in Draft mode. `mew-case-guess-when-prepared' If this variable is `t', the "case" is automatically guessed according `mew-case-guess-alist' when a draft is prepared. The default is `t'. `mew-case-guess-when-composed' If this variable is `t', the "case" is automatically guessed according `mew-case-guess-alist' when a message is composed. The default is `nil'. `mew-case-guess-when-replied' If this variable is `t', the "case" is automatically guessed according `mew-case-guess-when-replied-alist' when a draft is prepared by replying. The default is `t'. The syntax of `mew-case-guess-alist' and `mew-case-guess-when-replied-alist' is the same as `mew-refile-guess-alist'. For more information, please refer to *Note by-alist::. When typing `C-cC-c' in Draft mode to send a draft, the "case" in Draft mode is used to determine an SMTP/NNTP server, etc. When typing `C-cC-c' in Summary mode to flush messages in +queue/+postq, the "case" in Summary mode is used even if it is different from the one which was used in Draft mode. `C-uC-cC-c' in Summary mode let you specify the "case" to flush messages in +queue/postq. The following is a summary of commands concerned with the "case". `C' In Summary mode, set the "case". `C-cC-o' In Draft mode, set the "case" of a draft.  File: mew.info, Node: config2, Next: custom-misc, Prev: config, Up: Customize The format of configuration =========================== In Mew 6.1, configuration format of "mew.el" is improved. You can use a new format as well as the old format. - In the old format, sometime "." appears. In the new fomat, no "." appears at all. For instance, you can write ("foo" "bar") instead of ("foo" . "bar"). - In the old format, a numeric port is specified as string. An example is "25". In the new format, you can write it as integer. An example is 25. The string is still valid. An example is "smtp". - In the old format, the cases and the keys of `mew-config-alist' are written as string. In the new format, you can specify them as symbol. Here is an example of the new format: (setq mew-config-alist '((home (imap-server "imap.example.org") (imap-ssl t) (imap-ssl-port 993) (smtp-server "smtp.example.org") (smtp-port "submission")))) Compare this with the following old one: (setq mew-config-alist '(("home" ("imap-server" . "imap.example.org") ("imap-ssl" . t) ("imap-ssl-port" . "993") ("smtp-server" . "smtp.example.org") ("smtp-port" . "submission")))) Again, the old format is still valid. You can also mix the new format and the old format.  File: mew.info, Node: custom-misc, Next: Tips, Prev: config2, Up: Customize Miscellaneous ============= In a certain environment, it would be useful to encode a file with SAMBA encoding when saving an attached file. For this, set `mew-use-samba-encoding' to `t'. You can set `mew-cs-samba' to a character set for the file name. The default is `shift_jis'. You can print the current message by typing `#' in Summary mode. A function for printing can be set to `mew-print-function'. Since its default value is `ps-print-buffer', a message is converted into a PostScript file before sent to a printer. You can set your own print function as follows: (setq mew-print-function 'my-print-function) You can set fields in a header to be printed to `mew-field-for-printing'. Its default value is as follows: '("Subject:" "From:" "To:" "Cc:" "Date:") For instance, if you want to print Subject:, From:, and Date: only, configure as follows: (setq mew-field-for-printing '("Subject:" "From:" "Date:"))  File: mew.info, Node: Tips, Next: region, Prev: custom-misc, Up: Top Advanced usage ************** * Menu: * region:: Region * visiting:: Visiting another buffer * SSH:: Secure SHell * SSL:: Secure Socket Layer * TLS:: Transport Layer Security * spam:: Spam messages * spam2:: Spam messages (2) * addr-warn:: Warning addresses * biff:: Biff * edit:: Edit mode  File: mew.info, Node: region, Next: visiting, Prev: Tips, Up: Tips Region ====== In Summary mode, there are commands which work for a region if called with `C-u'. If a visible region is specified, these commands work for the region without `C-u'. For Emacs, you can use the visible region feature by putting the following into your "~/.emacs". (transient-mark-mode 1) Here is a summary of such commands. `?', `/', `tt', `x', `lx', `ma', `Md', `S', `mlc', `mli', `*', `$', `d', `u' Also you can specify a repeat count before you call `*', `$', `d', and `u'. For example, typing `3d' puts the `*' mark onto three messages. You don't have to type `C-u' before the number.  File: mew.info, Node: visiting, Next: SSH, Prev: region, Up: Tips Visiting another buffer ======================= If you want to move to +queue after making a message and putting it to +queue with `C-cC-m' in Draft mode, set `mew-visit-queue-after-sending' to `t'. If you want to visit to an appropriate inbox after setting the "case" with `C' in Summary mode, set `mew-visit-inbox-after-setting-case' to `t'. If you want to move from Summary mode to a draft (Draft mode) whose name is the smallest number, type `C-cC-o'.  File: mew.info, Node: SSH, Next: SSL, Prev: visiting, Up: Tips Secure SHell ============ Mew supports SSH version 1 and version 2 and OpenSSH for SSH. You must execute "ssh" on the command and obtain server's public key before you use Mew with SSH. That is, you should set up so that you can login the server with your user password or with the password to decrypt the secret key of the local machine. Of source, you can omit the password to decrypt the secret key if you use "ssh-agent". After that, you should configure SSH variables relating to each protocol. For example, if you want to use POP over SSH, set `mew-pop-ssh-server' to your SSH server name. While a connection is protected by SSH, a picture of a lock is shown in the mode line. The implementation of Mew does not allow to use both SSH and SSL/TLS at the same time. If you need to use SSL/TLS over an SSH tunnel, please configure SSL/TLS only with Mew and set up an SSH tunnel on a command line.  File: mew.info, Node: SSL, Next: TLS, Prev: SSH, Up: Tips Secure Socket Layer =================== Before you use SSL, you should understand the trust model of certificate authorities (CA). Currently, Mew supports "stunnel" version 3 and version 4 for SSL. Before you use Mew with SSL, you must be sure that an SSL connection can be established to your SSL server. Since "stunnel" is linked to the "openssl" library, you should understand "openssl". Suppose we use "~/.certs" as a directory where certificates of trusted CAs are contained. You need to copy PEM-format certificates embedded in the source of "openssl" to this director. Each name should be ".0". Here we call a sample CA certificate "ca.pem". You can calculate as follows: % openssl x509 -hash -noout -in ca.pem To copy the certificate, do as follows: % cp ca.pem ~/.certs/`openssl x509 -hash -noout -in ca.pem`.0 The certificates in the source of "openssl" do not cover all CAs. If the certificate of your SSL server is signed by another CA, you must copy the certificate of the CA to the directory. You may be able to find appropriate certificate from the following page: http://www.columbia.edu/~ariel/good-certs/ns45/ There are two important Mew variables to control "stunnel". `mew-ssl-cert-directory' is the directory where you install certificates of trusted CAs. It's default value if "~/.certs". Also, you can set the verification level with `mew-ssl-verify-level'. It's default to 1. The meanings of the values are as follows: 0 No verification. 1 Verify server's certificate if present. If verification failed, an SSL/TLS connection is not created. If not present, an SSL/TLS connection is created. 2 Verify server's certificate. If verification failed, an SSL/TLS connection is not created. If not present, an SSL/TLS connection is not created. 3 Verify server's certificate which locally installed (not one from the server). Then configure SSL-related variables of each protocol. For example, if you want to use POP over SSL, set `mew-pop-ssl' to `t'. Also, if its port is not a standard one, configure `mew-pop-ssl-port'. (setq mew-pop-ssl t) To use SSL for SMTP, configure as follows: (setq mew-smtp-ssl t) While a connection is protected by SSL, a picture of a lock is shown in the mode line.  File: mew.info, Node: TLS, Next: spam, Prev: SSL, Up: Tips Transport Layer Security ======================== Mew can use TLS instead of SSL. To enable TLS, Mew relies on "stunnel", too. So, before using TLS, you should configure according to the explanations in *Note SSL::. Then, set the SSL port to the same one of the protocol to be protected. For instance, configure as follows for POP: ;; mew-pop-port is default to "pop3" (110) (setq mew-pop-ssl t) (setq mew-pop-ssl-port mew-pop-port) ;; The default is "pop3s" (995) That is, if the SSL port is the same as the port of the protocol to be protected, TLS is used. Otherwise, SSL is used. The following is an example to protect Message Submission with TLS. (setq mew-smtp-port "submission") ;; The default is "smtp" (25) (setq mew-smtp-ssl t) (setq mew-smtp-ssl-port mew-smtp-port) ;; The default is 465  File: mew.info, Node: spam, Next: spam2, Prev: TLS, Up: Tips Spam messages ============= (1) In the case where a spam filter is running on your POP server or your IMAP server. You can put the `D' mark to spam messages while you are retrieving messages in +inbox or you are scanning messages in $inbox/%inbox. If you use "bogofilter", put the following to your "~/.mew.el". (defun mew-spam-bogofilter (val) (let ((case-fold-search t)) (if (string-match "yes" val) ?D))) (setq mew-inbox-action-alist '(("X-Bogosity:" mew-spam-bogofilter))) If you want to put the `o' mark so as to be refiled to the +spam folder, instead of putting to th `D' mark, you should program the function as follows: (defun mew-spam-bogofilter (val) (let ((case-fold-search t)) (if (string-match "yes" val) "+spam"))) If you use "spamassassin", put the following to your "~/.mew.el". (setq mew-spam: "X-Spam-Flag:") (defun mew-spam-assassin (val) (let ((case-fold-search t)) (if (string-match "yes" val) ?D))) (setq mew-inbox-action-alist '(("X-Spam-Flag:" mew-spam-assassin))) In the case where you want to use bsfilter, see a document in the bsfilter package. (2) In the case where a spam filter is running in your IMAP server. You can delete or move spam messages while you are scanning %inbox. If you use "bogofilter", put the following to your "~/.mew.el". (setq mew-imap-spam-field "X-Bogosity") (setq mew-imap-spam-word "Yes") If `mew-imap-spam-folder' or `mew-imap-trash-folder' is defined, spam messages are moved to the folder. Otherwise, they are removed. (3) In the case where you installed "bogofilter" in your local machine, you can put the `*' mark to spam messages. First you need to install the following script, say "bogo": #!/bin/sh bogofilter -v -T -B $* | grep S Type `?' and `RET', then specify "bogo", and spam messages are marked with `*'. After that, you may want to process them with `md' + `x'. (4) In the case where you use POP and a spam filter does not run on the POP server but you want to mark spam messages when retrieving Since bsfilter can be a POP proxy server, you can implement your policy. See a document in the bsfilter package.  File: mew.info, Node: spam2, Next: addr-warn, Prev: spam, Up: Tips Spam messages(2) ================ If you want to let your filter learn the current message in Summary as a spam, type `ls'. Likewise type `lh' to let your filter learn it as a ham (non-spam). To use these commands, you need to configure four variables in advance. We consider bogofilter as an example and see three cases. (2) To let your local filter learn: (setq mew-spam-prog "bogofilter") (setq mew-spam-prog-args '("-s" "-N" "-v")) (setq mew-ham-prog "bogofilter") (setq mew-ham-prog-args '("-n" "-S" "-v"))) (2) To let your filter on your learn via SSH: (setq mew-spam-prog "ssh") (setq mew-spam-prog-args '("" "bogofilter" "-s" "-N" "-v")) (setq mew-ham-prog "ssh") (setq mew-ham-prog-args '("" "bogofilter" "-n" "-S" "-v"))) (3) To pass through your with SSH and to let your filter on your learn via SSH: (setq mew-spam-prog "ssh") (setq mew-spam-prog-args '("-A" "" "ssh" "" "bogofilter" "-s" "-N" "-v")) (setq mew-ham-prog "ssh") (setq mew-ham-prog-args '("-A" "" "ssh" "" "bogofilter" "-n" "-S" "-v"))) If you use SSH, you need to configure related hosts so that you can login them without passwords.  File: mew.info, Node: addr-warn, Next: biff, Prev: spam2, Up: Tips Warning addresses ================= Suppose you are writing a message which must be closed in your company. You might write an non-employee's address by mistake. If you tells your company's domains, for instance, to Mew, it turns non-employee's addresses to red. There are four variables to decide which address should trun red. They are all a list of strings. Mew takes the following rules: 1. If an address is specified in `mew-safe-addresses', no warning. 2. If the address is specified in `mew-warn-addresses', warning. 3. If its domain is specified in `mew-safe-domains', no warning. 4. If its domain is specified in `mew-warn-domains', warning. 5. If either `mew-warn-addresses' or `mew-safe-domains' defined, warning. 6. No warning. Here is an example that an address whose domain is not "@example.org" turns red. (setq mew-safe-domains '("example.org")) If you want "customers@example.org" to turn red even its domain is "@example.org", add the following line. (setq mew-warn-addresses '("customers@example.org"))  File: mew.info, Node: biff, Next: edit, Prev: addr-warn, Up: Tips Biff ==== The functionality to check new messages is called biff. With the following configuration Mew sees how many new messages have arrived every 5 minutes. (setq mew-use-biff t) If one or more new messages exist, the total number is displayed in the mode line. The server and the protocol, which Mew checks, are decided according to `mew-proto' and the "case" (`mew-case') on boot time. With the following configuration, Mew beeps when the number of new messages changes from zero to one or more. (setq mew-use-biff-bell t) To change the interval time of biff, set `mew-biff-interval'. Below is an example to set it to 10 minutes. (setq mew-biff-interval 10)  File: mew.info, Node: edit, Next: Convention, Prev: biff, Up: Tips Edit ==== Edit mode is a mode to edit a message to generate another new message. The followings are typical examples: - Saving a new message with big attachments removed - Saving a decrypted message whose original one is encrypted with PGP/MIME or S/MIME To edit a current message in Edit mode, type `M-e'. Then, a new draft is prepared like Draft mode. In Edit mode, you can edit a message as if you were in Draft mode. To save edited message to a new message, type `C-cC-c' or `C-cC-m'. They are the exactly same command. To execute one of them, you are asked a folder to save the new message. Please take care that you may confuse this command as retry sending (*Note sum-write::). Retry seinding is to send a message after editing while Edit mode is to save a message after modifying. The following is summary of commands relating to Edit mode. To enter Edit mode from Summary mode, use the following command. `M-e' Entering Edit mode with the current message. The following is a summary of commands in Edit mode. `C-cC-c' Saving the edited message to a new message. `C-cC-m' The same as `C-cC-c' `Other commands' The same as the other commands in Edit mode  File: mew.info, Node: Convention, Next: Implementation, Prev: edit, Up: Top E-mail convention ***************** When you exchange messages with other people, you should obey minimum manner. It gives a bad impression to the people if you violate the manner since such messages are hard to read. We always should try to write concise yet comprehensive explanations and make an effort to make receivers well-understood. We should take good care of the following items. Fill To: and Cc: fields precisely To: is for target receivers and Cc: is for those who are received for their information. If his address is not on To:, he might skip to read the message. We should take care not to deliver to wrong people by mistaking the addresses. The number of addresses To: and Cc: should be small It is discouraged to specify a lot of mail addresses on To: and Cc:. You should create a mailing-list instead. Or, if necessary, you should make the destination anonymous (*Note anonymous::). Write a short and clear summary of body in Subject: There are people who decide to read contents from their Subject:. So, they might skip messages with improper Subject:. We should not write a long subject since it is hard to read. Cite only necessary sentences You should not bother to remove unnecessary sentences. With Mew, citation must be a piece of cake. Make your signature simple A long signature is just self-satisfaction. Do not send prank messages I do not want to warn this kind of stuff. Nonetheless, someone sends Happy or Unhappy messages to others. You should understand that people doubt your character. Attach data files that the receivers can read It is text only that you can send without any agreement with the receivers. If you want to send data files other than text, you should make an agreement with the receivers. To mailing-list, you should send text only. If you wish to learn manner on the Internet more comprehensively, please refer to RFC1855.  File: mew.info, Node: Implementation, Next: Avail, Prev: Convention, Up: Top Implementation Issues ********************* Why are "mewl" and "mewencode" necessary? With Mew, you can read throw messages in Summary mode while you are retrieving messages or listing the messages again. This means that multiple control flows of program are necessary. To make multiple control flows by Emacs, the only way is to make a TCP connection or to execute sub-process (Emacs Lisp does NOT provide a feature of light weight process). For POP and SMTP, Mew makes a TCP connection, so they are not a problem. However, to list the messages in Summary mode again, we have to execute a command. This is why "mewl" exists. The reason why "mewencode" exists is just for speed. When I programmed MIME encoding by Emacs Lisp in several ways, they are too slow to use. So, I decided to continue to use "mewencode". (If Base64 is implemented by Emacs, Mew uses the native function.) Why does the cursor jump onto the end of line when searching(`C-s', `C-r')? Thread informations are not displayed in Summary mode. This is because the "invisible" property is dynamically put onto them when displayed. Strings with this property is not a target of the string search. But, thread informations of undisplayed lines do not have this property, so the string search targets them. Then a matched line is displayed and the "invisible" property is put. So, it seems to you that the string search matches the end of the line. Mew puts the "invisible" property for all lines in Summary mode in background while there are no user key inputs. When this word is finished, the `*' mark in the right side of the mode line in Summary mode disappears. In this situation, string search works exactly as you expect. MS's mailers can handle file names well if I attach files with Mew 4.3 MS's mailers use "non-standard MS original" encoding to encode file names. MS mailers should migrate to the standard encoding. I repeatedly asked MS to do so, but they did not. So, Mew took the following workaround: Mew basically uses the standard encoding. In addition, Mew add "MS original parameter" with file names encoded with "MS original" encoding.  File: mew.info, Node: Avail, Next: obtain, Prev: Implementation, Up: Top Availability and mailing-list ***************************** This chapter describes how to get Mew and related mailing-lists. * Menu: * obtain:: How to get Mew? * ml:: Mailing list  File: mew.info, Node: obtain, Next: ml, Prev: Avail, Up: Avail How to get Mew? =============== The latest Mew is available from the following repository. http://www.Mew.org/Release/ If you want to know about Git versions of Mew, please refer to: http://www.mew.org/en/git/  File: mew.info, Node: ml, Next: Copyright, Prev: obtain, Up: Avail Mailing list ============ If you want to receive release announcement, please subscribe yourself to mew-release. http://www.mew.org/mailman/listinfo/mew-release If you want to ask questions and/or discuss features in English, please subscribe yourself to mew-int. http://www.mew.org/mailman/listinfo/mew-int  File: mew.info, Node: Copyright, Next: Variable Index, Prev: ml, Up: Top Copyright ********* Mew conforms the following copyright. Copyright (C) 1994-2013 Mew developing team. All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. Neither the name of the team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. If you wish to distribute Mew in CD or something, please let me know. I do not go mad even if you do not tell me but I'm very glad if you do so. I never have declined requirements. The copyright of this manual belongs to the author. Permission is granted to copy, modify, redistribute this manual but no warranty.  File: mew.info, Node: Variable Index, Next: Key Index, Prev: Copyright, Up: Top Variable Index ************** * Menu: * mail-user-agent: Composing. (line 5) * mail-user-agent: configuration. (line 5) * mail-user-agent: start. (line 5) * mew-addrbook-for-cite-label: draft-mode. (line 5) * mew-addrbook-for-cite-prefix: draft-mode. (line 5) * mew-addrbook-mode-hook: hooks. * mew-addrbook-override-by-newone: auto-alias. (line 5) * mew-ask-charset: charset. (line 5) * mew-ask-fcc: send. (line 5) * mew-ask-subject: send. (line 5) * mew-auto-flush-queue: retrieving. (line 5) * mew-auto-get: start. (line 5) * mew-before-cite-hook: hooks. * mew-biff-interval: biff. (line 5) * mew-case-guess-alist: config. (line 5) * mew-case-guess-when-composed: config. * mew-case-guess-when-prepared: config. * mew-case-guess-when-replied-alist: config. (line 5) * mew-case-guess-when-replied: config. * mew-cc: draft-mode. (line 5) * mew-charset-latin: charset. (line 5) * mew-charset-m17n: charset. (line 5) * mew-cite-fields: draft-mode. (line 5) * mew-cite-format: draft-mode. (line 5) * mew-cite-hook: hooks. * mew-cite-prefix: draft-mode. (line 5) * mew-cite-prefix-function: draft-mode. (line 5) * mew-config-alist: config. (line 5) * mew-config-alist: config2. (line 5) * mew-cs-samba: custom-misc. (line 5) * mew-cursor-mark: highlight. (line 5) * mew-dcc: draft-mode. (line 5) * mew-debug: status-update. (line 5) * mew-decode-broken: analysis. * mew-decode-broken: status-update. (line 5) * mew-decode-quoted: invalid. (line 5) * mew-delete-unread-mark-by-mark: unread mark. (line 5) * mew-draft-mode-edit-again-hook: hooks. * mew-draft-mode-hook: hooks. * mew-draft-mode-newdraft-hook: hooks. * mew-draft-mode-reedit-draft-hook: hooks. * mew-draft-mode-reedit-hook: hooks. * mew-draft-mode-reedit-queue-hook: hooks. * mew-draft-privacy-method: shortcut. (line 5) * mew-end-of-message-string: multipart. (line 5) * mew-end-of-part-string: multipart. (line 5) * mew-env-hook: hooks. * mew-field-delete-for-forwarding: forward. (line 5) * mew-field-for-printing: custom-misc. (line 5) * mew-fields: header. (line 5) * mew-file-max-size: analysis. * mew-flowed-auto-wrap: longline. (line 5) * mew-flowed-fold-length: longline. (line 5) * mew-flowed-fold-threshold: longline. (line 5) * mew-from-list: cheader. (line 5) * mew-ham-prog-args: spam2. (line 5) * mew-ham-prog: spam2. (line 5) * mew-header-alist: draft-mode. (line 5) * mew-header-max-length: analysis. * mew-header-mode-hook: hooks. * mew-header-veil-count: features. (line 5) * mew-highlight-body-max-size: highlight. (line 5) * mew-imap-auth: imap. * mew-imap-auth-list: imap. * mew-imap-delete: imap. * mew-imap-delete: retrieving. (line 5) * mew-imap-header-only: imap. * mew-imap-header-only: retrieving. (line 5) * mew-imap-sentinel-hook: hooks. * mew-imap-sentinel-hook: hooks. * mew-imap-sentinel-non-biff-hook: hooks. * mew-imap-server: configuration. (line 5) * mew-imap-server: imap. * mew-imap-size: imap. * mew-imap-spam-field: spam. (line 5) * mew-imap-spam-folder: spam. (line 5) * mew-imap-spam-word: spam. (line 5) * mew-imap-ssh-server: imap. * mew-imap-ssl: imap. * mew-imap-ssl-port: imap. * mew-imap-trash-folder: delete mark. (line 5) * mew-imap-trash-folder-list: delete mark. (line 5) * mew-imap-user: imap. * mew-inbox-action-alist: spam. (line 5) * mew-init-hook: hooks. * mew-lisp-max-length: auto-alias. (line 5) * mew-lisp-max-length: by-from. (line 5) * mew-lisp-max-length: by-thread. (line 5) * mew-mail-address-list: reply. (line 5) * mew-mail-domain-list: cheader. (line 5) * mew-mailbox-type: config. (line 5) * mew-mailbox-type: configuration. (line 5) * mew-mailbox-type: retrieving. (line 5) * mew-mailbox-type: start. (line 5) * mew-make-message-hook: hooks. * mew-mbox-command-arg: configuration. (line 5) * mew-mbox-command: configuration. (line 5) * mew-message-hook: hooks. * mew-message-mode-hook: hooks. * mew-mime-multipart-alternative-list: message-mode. (line 5) * mew-name: configuration. (line 5) * mew-nntp-header-only: nntp. * mew-nntp-header-only: retrieving. (line 5) * mew-nntp-msgid-domain: nntp. * mew-nntp-msgid-user: nntp. * mew-nntp-newsgroup: nntp. * mew-nntp-sentinel-hook: hooks. * mew-nntp-server: configuration. (line 5) * mew-nntp-server: nntp. * mew-nntp-size: nntp. * mew-nntp-ssh-server: nntp. * mew-nntp-ssl: nntp. * mew-nntp-ssl-port: nntp. * mew-nntp-user: nntp. * mew-nntp2-flush-hook: hooks. * mew-nntp2-sentinel-hook: hooks. * mew-pack-hook: hooks. * mew-pick-pattern-list: condition. (line 5) * mew-pop-auth-list: pop. * mew-pop-auth: pop. * mew-pop-body-lines: pop. * mew-pop-delete: pop. * mew-pop-delete: retrieving. (line 5) * mew-pop-header-only: pop. * mew-pop-header-only: retrieving. (line 5) * mew-pop-sentinel-hook: hooks. * mew-pop-sentinel-non-biff-hook: hooks. * mew-pop-server: pop. * mew-pop-size: pop. * mew-pop-ssh-server: SSH. (line 5) * mew-pop-ssh-server: pop. * mew-pop-ssl: SSL. (line 5) * mew-pop-ssl: pop. * mew-pop-ssl-port: SSL. (line 5) * mew-pop-ssl-port: pop. * mew-pop-user: configuration. (line 5) * mew-pop-user: pop. * mew-post-hook: hooks. * mew-print-function: custom-misc. (line 5) * mew-print-function: features. (line 5) * mew-prog-gpg: cipher-viewing. (line 5) * mew-prog-grep: condition. (line 5) * mew-prog-grep-opts: condition. (line 5) * mew-prog-msexcel-ext: message-mode. (line 5) * mew-prog-msexcel: message-mode. (line 5) * mew-prog-mspowerpoint-ext: message-mode. (line 5) * mew-prog-mspowerpoint: message-mode. (line 5) * mew-prog-msword-ext: message-mode. (line 5) * mew-prog-msword: message-mode. (line 5) * mew-prog-pgp: cipher-viewing. (line 5) * mew-prog-pgp2: cipher-viewing. (line 5) * mew-prog-pgp5: cipher-viewing. (line 5) * mew-prog-text/html-ext: message-mode. (line 5) * mew-protect-privacy-always: shortcut. (line 5) * mew-protect-privacy-always-type: shortcut. (line 5) * mew-protect-privacy-encrypted: shortcut. (line 5) * mew-protect-privacy-encrypted-type: shortcut. (line 5) * mew-protect-privacy-with-old-pgp-signature: shortcut. (line 5) * mew-proto: config. (line 5) * mew-proto: configuration. (line 5) * mew-proto: start. (line 5) * mew-quit-hook: hooks. * mew-real-post-hook: hooks. * mew-real-send-hook: hooks. * mew-refile-auto-refile-skip-any-mark: auto-refile. (line 5) * mew-refile-ctrl-multi: guess-rule. (line 5) * mew-refile-guess-alist: by-alist. (line 5) * mew-refile-guess-by-from-learn-hook: hooks. * mew-refile-guess-control: guess-rule. (line 5) * mew-refile-guess-from-me-is-special: by-from-folder. (line 5) * mew-refile-guess-from-me-is-special: by-from. (line 5) * mew-refile-guess-strip-domainpart: by-default. (line 5) * mew-reply-all-alist: reply. (line 5) * mew-reply-fromme-alist: reply. (line 5) * mew-reply-sender-alist: reply. (line 5) * mew-safe-addresses: addr-warn. (line 5) * mew-safe-domains: addr-warn. (line 5) * mew-scan-sentinel-hook: hooks. * mew-search-method: dbsearch. (line 5) * mew-send-hook: hooks. * mew-signature-as-lastpart: cite. (line 5) * mew-signature-file: cite. (line 5) * mew-signature-insert-last: cite. (line 5) * mew-smtp-auth-list: smtp. * mew-smtp-flush-hook: hooks. * mew-smtp-helo-domain: smtp. * mew-smtp-mail-from: smtp. * mew-smtp-msgid-domain: smtp. * mew-smtp-msgid-user: smtp. * mew-smtp-port: smtp. * mew-smtp-sentinel-hook: hooks. * mew-smtp-server: configuration. (line 5) * mew-smtp-server: smtp. * mew-smtp-ssh-server: smtp. * mew-smtp-ssl: SSL. (line 5) * mew-smtp-ssl-port: smtp. * mew-smtp-ssl: smtp. * mew-smtp-user: smtp. * mew-sort-default-key-alist: sorting. (line 5) * mew-sort-default-key: sorting. (line 5) * mew-sort-hook: hooks. * mew-sort-key-alist: sorting. (line 5) * mew-spam-prog-args: spam2. (line 5) * mew-spam-prog: spam2. (line 5) * mew-spam: spam. (line 5) * mew-ssl-cert-directory: SSL. (line 5) * mew-ssl-verify-level: SSL. (line 5) * mew-status-update-hook: hooks. * mew-summary-delete-folder-hook: hooks. * mew-summary-exec-hook: hooks. * mew-summary-form-extract-rule: summary-mode. (line 5) * mew-summary-form-from-me-prefix: summary-mode. (line 5) * mew-summary-form-mark-delete: summary-mode. (line 5) * mew-summary-form-mark-review: summary-mode. (line 5) * mew-summary-form-mark-spam: summary-mode. (line 5) * mew-summary-form: summary-mode. (line 5) * mew-summary-ls-no-scan-hook: hooks. * mew-summary-mark-direction: summary-mode. (line 5) * mew-summary-mode-hook: hooks. * mew-summary-rename-folder-hook: hooks. * mew-summary-show-direction: summary-mode. (line 5) * mew-summary-toggle-disp-msg-hook: hooks. * mew-suspend-hook: hooks. * mew-syntax-format-hook: hooks. * mew-theme-file: highlight. (line 5) * mew-thread-display-hook: hooks. * mew-thread-separator: thread. (line 5) * mew-trash-folder: delete mark. (line 5) * mew-trash-folder-list: delete mark. (line 5) * mew-use-8bit: smtp. * mew-use-8bit: status-update. (line 5) * mew-use-alternative: analysis. * mew-use-biff-bell: biff. (line 5) * mew-use-biff: biff. (line 5) * mew-use-cached-passwd: password. (line 5) * mew-use-cursor-mark: highlight. (line 5) * mew-use-fast-refile: by-folder. (line 5) * mew-use-format-flowed: longline. (line 5) * mew-use-full-window: summary-mode. (line 5) * mew-use-header-veil: features. (line 5) * mew-use-header-veil: status-update. (line 5) * mew-use-highlight-body: highlight. (line 5) * mew-use-highlight-cursor-line: highlight. (line 5) * mew-use-highlight-header: highlight. (line 5) * mew-use-highlight-mark: highlight. (line 5) * mew-use-highlight-mouse-line: highlight. (line 5) * mew-use-highlight-url: highlight. (line 5) * mew-use-highlight-x-face: highlight. (line 5) * mew-use-master-passwd: password. (line 5) * mew-use-node-folder: by-folder. (line 5) * mew-use-old-pgp: shortcut. (line 5) * mew-use-old-pgp: status-update. (line 5) * mew-use-samba-encoding: custom-misc. (line 5) * mew-use-smtp-auth: smtp. * mew-use-text-body: analysis. * mew-use-text/html: analysis. * mew-use-text/xml: analysis. * mew-use-thread-separator: thread. (line 5) * mew-use-unread-mark: unread mark. (line 5) * mew-user: configuration. (line 5) * mew-virtual-mode-hook: hooks. * mew-visit-inbox-after-setting-case: visiting. (line 5) * mew-visit-queue-after-sending: visiting. (line 5) * mew-warn-addresses: addr-warn. (line 5) * mew-warn-domains: addr-warn. (line 5) * mew-warning-field-level: status-update. (line 5) * mew-x-pgp-key-list: cipher-viewing. (line 5) * read-mail-command: configuration. (line 5)  kazu-yamamoto-Mew-ff9c41b/info/mew.info-5000066400000000000000000000416641256455547000203300ustar00rootroot00000000000000Info file: mew.info, -*-Text-*- produced by `texinfo-format-buffer' from file `mew.texi' using `texinfmt.el' version 2.42 of 7 Jul 2006. INFO-DIR-SECTION Message User Agent START-INFO-DIR-ENTRY * Mew: (mew.info). Messaging in the Emacs World. END-INFO-DIR-ENTRY  File: mew.info, Node: Key Index, Prev: Variable Index, Up: Top Key Index ********* * Menu: * A (Summary): Composing. (line 5) * A (Summary): reply. (line 5) * A (Summary): sum-write. (line 5) * B (Attach): mark-b-comp. (line 5) * B (Summary): features. (line 5) * C (Attach): charset-guess. (line 5) * C (Attach): mime-comp. (line 5) * C (Summary): features. (line 5) * C-b (Attach): mime-comp. (line 5) * C-cC-a (Draft): mime-comp. (line 5) * C-cC-a (Summary): addrbook. (line 5) * C-cC-a (Summary): features. (line 5) * C-cC-b (Draft): shortcut. (line 5) * C-cC-c (Addrbook): addrbook. (line 5) * C-cC-c (Draft): send. (line 5) * C-cC-c (Edit): edit. (line 5) * C-cC-c (Header): resend. (line 5) * C-cC-c (Summary): off-line. (line 5) * C-cC-c (Summary): send. (line 5) * C-cC-e (Draft): shortcut. (line 5) * C-cC-e (Summary): message-mode. (line 5) * C-cC-f (Draft): longline. (line 5) * C-cC-f (Summary): cipher-viewing. (line 5) * C-cC-l (Draft): cite. (line 5) * C-cC-l (Summary): invalid. (line 5) * C-cC-m (Draft): send. (line 5) * C-cC-m (Edit): edit. (line 5) * C-cC-m (Header): resend. (line 5) * C-cC-o (Draft): config. (line 5) * C-cC-o (Summary): visiting. (line 5) * C-cC-pC-a (Draft): shortcut. (line 5) * C-cC-pC-e (Draft): shortcut. (line 5) * C-cC-pC-f (Draft): longline. (line 5) * C-cC-pC-m (Draft): shortcut. (line 5) * C-cC-q (Addrbook): Quit. (line 5) * C-cC-q (Addrbook): addrbook. (line 5) * C-cC-q (Draft): Quit. (line 5) * C-cC-q (Header): Quit. (line 5) * C-cC-q (Summary): Quit. (line 5) * C-cC-r (Draft): shortcut. (line 5) * C-cC-r (Summary): features. (line 5) * C-cC-s (Draft): shortcut. (line 5) * C-cC-s (Summary): features. (line 5) * C-cC-t (Draft): cite. (line 5) * C-cC-v (Summary): cipher-viewing. (line 5) * C-cC-v (Summary): features. (line 5) * C-cC-y (Draft): cite. (line 5) * C-cC-z (Summary): cipher-viewing. (line 5) * C-cC-z (Summary): features. (line 5) * C-cTAB (Draft): cheader. (line 5) * C-cTAB (Draft): cite. (line 5) * C-cTAB (Summary): analysis. (line 5) * C-f (Attach): mime-comp. (line 5) * C-n (Attach): mime-comp. (line 5) * C-n (Summary): singlepart. (line 5) * C-p (Attach): mime-comp. (line 5) * C-p (Summary): singlepart. (line 5) * C-u: (Summary): analysis. (line 5) * C-u. (Summary): analysis. (line 5) * C-u. (Summary): invalid. (line 5) * C-u/ (Summary): search. (line 5) * C-u? (Summary): search. (line 5) * C-uA (Summary): reply. (line 5) * C-uC-cC-a (Summary): addrbook. (line 5) * C-uC-cC-e (Summary): message-mode. (line 5) * C-uC-cC-f (Summary): cipher-viewing. (line 5) * C-uC-cC-l (Summary): invalid. (line 5) * C-uD (Summary): delete mark. (line 5) * C-uD (Summary): features. (line 5) * C-uM-n (Summary): keyword. (line 5) * C-uM-o (Summary): auto-refile. (line 5) * C-uM-p (Summary): keyword. (line 5) * C-uM-x mew: start. (line 5) * C-uSPC (Summary): singlepart. (line 5) * C-uZ (Summary): status-update. (line 5) * C-ua (Summary): reply. (line 5) * C-uj (Summary): singlepart. (line 5) * C-uk/ (Summary): search. (line 5) * C-ukI (Summary): dialog. (line 5) * C-umI (Summary): target mark. (line 5) * C-un (Summary): singlepart. (line 5) * C-up (Summary): singlepart. (line 5) * C-us (Summary): retrieving. (line 5) * C-utt (Summary): thread. (line 5) * C-uw (Summary): sum-write. (line 5) * C-x RET l: charset-guess. (line 5) * C-xm: Composing. (line 5) * C-xm: start. (line 5) * D (Attach): mime-comp. (line 5) * D (Summary): delete mark. (line 5) * D (Summary): features. (line 5) * DEL (Summary): singlepart. (line 5) * E (Attach): mark-b-comp. (line 5) * E (Summary): sum-write. (line 5) * F (Attach): mime-comp. (line 5) * F (Summary): Composing. (line 5) * F (Summary): forward. (line 5) * F (Summary): sum-write. (line 5) * F (Summary): target mark. (line 5) * G (Attach): mark-b-comp. (line 5) * I (Attach): charset-guess. (line 5) * I (Summary): retrieving. (line 5) * J (Summary): target mark. (line 5) * M-RET (Summary): singlepart. (line 5) * M-\ (Summary): target mark. (line 5) * M* (Summary): unmark. (line 5) * M-b (Summary): target mark. (line 5) * M-d (Summary): delete mark. (line 5) * M-e (Attach): mark-b-comp. (line 5) * M-e: edit. (line 5) * M-l (Summary): features. (line 5) * M-n (Summary): keyword. (line 5) * M-o (Summary): auto-refile. (line 5) * M-p (Summary): keyword. (line 5) * M-s (Attach): mark-b-comp. (line 5) * M-s (Summary): sorting. (line 5) * M-t (Summary): target mark. (line 5) * M-u: unread mark. (line 5) * M-x mew: Viewing. (line 5) * M-x mew-send: Composing. (line 5) * M-x mew-send: start. (line 5) * M-x mew: start. (line 5) * Md (Summary): delete mark. (line 5) * N (Summary): target mark. (line 5) * P (Attach): mime-comp. (line 5) * P (Summary): target mark. (line 5) * Q (Attach): mark-b-comp. (line 5) * Q (Summary): Quit. (line 5) * RET (Summary): singlepart. (line 5) * Rd (Summary): features. (line 5) * Rr (Summary): features. (line 5) * S (Attach): mark-b-comp. (line 5) * S (Summary): sorting. (line 5) * SPC (Summary): singlepart. (line 5) * : (Summary): analysis. (line 5) * , (Summary): analysis. (line 5) * . (Summary): analysis. (line 5) * ; (Summary): features. (line 5) * = (Summary): features. (line 5) * | (Summary): features. (line 5) * # (Summary): features. (line 5) * _ (Summary): features. (line 5) * _ (Summary): longline. (line 5) * / (Summary): search. (line 5) * ? (Summary): search. (line 5) * - (Summary): singlepart. (line 5) * * (Summary): target mark. (line 5) * T (Attach): mime-comp. (line 5) * TAB (Draft): header. (line 5) * U (Attach): mark-b-comp. (line 5) * U (Summary): unmark. (line 5) * V (Summary): dialog. (line 5) * ) (Virtual): thread. (line 5) * ( (Virtual): thread. (line 5) * & (Virtual): thread. (line 5) * ^ (Virtual): thread. (line 5) * W (Summary): resend. (line 5) * W (Summary): sum-write. (line 5) * Z (Attach): mark-b-comp. (line 5) * Z (Summary): auto-alias. (line 5) * Z (Summary): status-update. (line 5) * a (Attach): mime-comp. (line 5) * a (Summary): Composing. (line 5) * a (Summary): reply. (line 5) * a (Summary): sum-write. (line 5) * b (Summary): features. (line 5) * c (Attach): mime-comp. (line 5) * d (Attach): mime-comp. (line 5) * d (Summary): delete mark. (line 5) * e (Attach): mime-comp. (line 5) * f (Attach): mime-comp. (line 5) * f (Summary): Composing. (line 5) * f (Summary): forward. (line 5) * f (Summary): sum-write. (line 5) * g (Summary): moving. (line 5) * i (Attach): mime-comp. (line 5) * i (Summary): retrieving. (line 5) * i (Summary): send. (line 5) * j (Summary): singlepart. (line 5) * k/ (Summary): search. (line 5) * k? (Summary): search. (line 5) * kI (Summary): dialog. (line 5) * kM: dbsearch. (line 5) * kc: dbsearch. (line 5) * km: dbsearch. (line 5) * lc (Summary): copy-msg. (line 5) * lh (Summary): spam2. (line 5) * li (Summary): copy-msg. (line 5) * ls (Summary): spam2. (line 5) * lx: off-line. (line 5) * m (Attach): mime-comp. (line 5) * m* (Summary): mark change. (line 5) * m$ (Summary): mark change. (line 5) * m*: escape mark. (line 5) * m$: escape mark. (line 5) * mI (Summary): target mark. (line 5) * mM-d (Summary): delete mark. (line 5) * mM-d (Summary): mark change. (line 5) * mM-u (Summary): mark change. (line 5) * ma (Summary): target mark. (line 5) * mc (Summary): mark change. (line 5) * md (Summary): delete mark. (line 5) * md (Summary): mark change. (line 5) * mlc (Summary): copy-msg. (line 5) * mli (Summary): copy-msg. (line 5) * mo (Summary): mark change. (line 5) * mr (Summary): target mark. (line 5) * ms (Summary): mark change. (line 5) * mt (Summary): thread. (line 5) * mxM-d (Summary): delete mark. (line 5) * mxd (Summary): delete mark. (line 5) * n (Summary): singlepart. (line 5) * o (Summary): refile mark. (line 5) * p (Attach): mime-comp. (line 5) * p (Attach): pgp-key. (line 5) * p (Summary): singlepart. (line 5) * q (Summary): Quit. (line 5) * r (Summary): resend. (line 5) * s (Summary): off-line. (line 5) * s (Summary): retrieving. (line 5) * t (Attach): mime-comp. (line 5) * t (Virtual): thread. (line 5) * t* (Virtual): thread. (line 5) * tM-d (Virtual): thread. (line 5) * tSPC (Virtual): thread. (line 5) * ta (Virtual): thread. (line 5) * td (Virtual): thread. (line 5) * tg (Virtual): thread. (line 5) * tn (Virtual): thread. (line 5) * to (Virtual): thread. (line 5) * tp (Virtual): thread. (line 5) * tr (Summary): thread. (line 5) * tt (Summary): thread. (line 5) * tu (Virtual): thread. (line 5) * u (Summary): unmark. (line 5) * v (Summary): features. (line 5) * w (Summary): Composing. (line 5) * w (Summary): sum-write. (line 5) * x (Summary): Marks. (line 5) * x (Summary): delete mark. (line 5) * x (Summary): unmark. (line 5) * y (Attach): mime-comp. (line 5) * y (Summary): features. (line 5) * z8 (Summary): status-update. (line 5) * zSPC: unread mark. (line 5) * zc (Summary): status-update. (line 5) * zd (Summary): status-update. (line 5) * zo (Summary): status-update. (line 5) * zp (Summary): status-update. (line 5) * zv (Summary): features. (line 5) * zv (Summary): status-update. (line 5) * zw (Summary): status-update. (line 5) * zz (Summary): message-mode. (line 5)  kazu-yamamoto-Mew-ff9c41b/info/mew.ja.info000066400000000000000000000051241256455547000205460ustar00rootroot00000000000000Info file: mew.ja.info, -*-Text-*- produced by `texinfo-format-buffer' from file `mew.texi' using `texinfmt.el' version 2.42 of 7 Jul 2006. INFO-DIR-SECTION Message User Agent START-INFO-DIR-ENTRY * Mew-J: (mew.ja.info). Messaging in the Emacs World. END-INFO-DIR-ENTRY  Indirect: mew.ja.info-1: 285 mew.ja.info-2: 50442 mew.ja.info-3: 101194  Tag table: (Indirect) Node: Top288 Node: Overview1325 Node: characteristic1968 Node: Emacsen2980 Node: modes3158 Node: folder convention3668 Node: configuration5541 Node: password7870 Node: start9334 Node: Viewing10099 Node: singlepart11078 Node: multipart11982 Node: analysis14247 Node: cipher-viewing16508 Node: retrieving19387 Node: moving21950 Node: sum-write23515 Node: features24979 Node: status-update26553 Node: invalid27254 Node: Composing28550 Node: header30058 Node: cheader30732 Node: addr-comp31937 Node: addrbook32932 Node: auto-alias35071 Node: addr-comp136081 Node: addr-comp237774 Node: send39135 Node: cite41245 Node: mime-comp42646 Node: charset-guess48225 Node: longline50445 Node: reply51581 Node: forward54586 Node: resend55178 Node: shortcut56359 Node: mark-b-comp59771 Node: pgp-key62185 Node: anonymous62760 Node: Marks63735 Node: unread mark64878 Node: delete mark65750 Node: refile mark67335 Node: target mark68328 Node: escape mark69389 Node: unmark69904 Node: mark change70521 Node: sync71386 Node: off-line72079 Node: mew-mark73346 Node: Refile73874 Node: by-folder75022 Node: by-alist76203 Node: by-thread77857 Node: by-from-folder78473 Node: by-from79426 Node: by-newsgroups80637 Node: by-default80872 Node: guess-rule81229 Node: auto-refile82757 Node: copy-msg84458 Node: Virtual85327 Node: selection86445 Node: sorting86951 Node: dialog88229 Node: search88895 Node: condition89532 Node: dbsearch91270 Node: keyword92152 Node: thread92651 Node: thread-op93456 Node: Quit94772 Node: Customize95195 Node: summary-mode95883 Node: message-mode98672 Node: draft-mode101197 Node: charset103292 Node: highlight104918 Node: hooks106958 Node: pop110364 Node: imap111446 Node: nntp112457 Node: smtp113576 Node: config115313 Node: config2119827 Node: custom-misc120983 Node: Tips121700 Node: region122227 Node: visiting122736 Node: SSH123098 Node: SSL123695 Node: TLS125251 Node: spam125962 Node: spam2127713 Node: addr-warn128832 Node: biff129605 Node: edit130087 Node: Convention130847 Node: Implementation131887 Node: Avail133346 Node: obtain133595 Node: ml133819 Node: Copyright133999 Node: Variable Index135007 Node: Key Index150266  End tag table kazu-yamamoto-Mew-ff9c41b/info/mew.ja.info-1000066400000000000000000002736401256455547000207160ustar00rootroot00000000000000Info file: mew.ja.info, -*-Text-*- produced by `texinfo-format-buffer' from file `mew.texi' using `texinfmt.el' version 2.42 of 7 Jul 2006. INFO-DIR-SECTION Message User Agent START-INFO-DIR-ENTRY * Mew-J: (mew.ja.info). Messaging in the Emacs World. END-INFO-DIR-ENTRY  File: mew.ja.info, Node: Top, Next: Overview, Prev: (dir), Up: (dir) Mew 6.7 マニュアル ****************** 山本和彦 ä½œæˆ 1996/02/19 æ›´æ–° 2015/07/03 ã“ã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã§ã¯ã€Mew ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 6.7 ã«ã¤ã„ã¦è§£èª¬ã—ã¾ã™ã€‚ã“ã®ãƒžãƒ‹ãƒ¥ アルã®ä»–ã«ã€Mew ã«é–¢ã™ã‚‹æœ‰ç›Šãªæƒ…報㯠Mew ã®å…¬å¼ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ (http://www.Mew.org/)ã‹ã‚‰å¾—られるã‹ã‚‚ã—れã¾ã›ã‚“。 * Menu: * Overview:: ã¯ã˜ã‚ã«èª­ã‚“ã§ã­ * Viewing:: メッセージを表示ã™ã‚‹ * Composing:: メッセージを作æˆã™ã‚‹ * Marks:: 愉快ãªãƒžãƒ¼ã‚¯ãŸã¡ * Refile:: æ¥½ã€…æ•´ç†æ•´é “ * Virtual:: 仮想フォルダ * Quit:: 一休㿠* Customize:: カスタマイズ * Tips:: ã•らãªã‚‹ä¸€æ­© * Convention:: メッセージã®ä½œæ³• * Implementation:: 実装ã«ã¤ã„㦠* Avail:: 入手方法ã¨ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆ * Copyright:: 著作権ã«ã¤ã„㦠* Variable Index:: 変数索引 * Key Index:: キー索引  File: mew.ja.info, Node: Overview, Next: characteristic, Prev: Top, Up: Top ã¯ã˜ã‚ã«èª­ã‚“ã§ã­ **************** Mew ã¨ã¯ã€ãƒ†ã‚­ã‚¹ãƒˆãƒ»ãƒ¡ãƒ¼ãƒ«ã‚„マルãƒãƒ¡ãƒ‡ã‚£ã‚¢ãƒ»ãƒ¡ãƒ¼ãƒ«(MIME)ã€ãƒ‹ãƒ¥ãƒ¼ã‚¹ã€ã‚» キュリティ機能(PGPã€S/MIMEã€SSHã€SSL)を便利ã«åˆ©ç”¨ã™ã‚‹ãŸã‚ã®ãƒ¦ãƒ¼ã‚¶ã‚¤ãƒ³ ターフェイスã§ã™ã€‚æœ€æ–°ã®æ¤œç´¢ã‚µãƒ¼ãƒ“スã¨ã‚‚連動ã—ã¾ã™ã€‚ Mew 㯠「Messaging in the Emacs World〠ã®ç•¥ã§ã™ã€‚先頭㮠M ã¯å¤§æ–‡å­—㧠表記ã—ã€ã€Œã¿ã‚…ã†ã€ã¨èª­ã¿ã¾ã™ã€‚M ã§å§‹ã¾ã‚‹ã‹ã‚ã„らã—ã„å˜èªžã‚’é¸ã‚“ã çµæžœ Mewã«ãªã‚Šã¾ã—ãŸã€‚決ã—ã¦æ¼«ç”»ã®é¡Œåã‚„æŸã‚¢ã‚¤ãƒ‰ãƒ«ã®æ­Œã€ã‚ã‚‹ã„ã¯ã€é–¢è¥¿ã®ä¼š 社ã«å› ã‚“ã§ã„ã‚‹ã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“。:p * Menu: * characteristic:: Mew ã®ç‰¹é•· * Emacsen:: Emacs ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ * modes:: モード * folder convention:: フォルダã®ç¨®é¡ž * configuration:: åˆæœŸè¨­å®š * password:: パスワード * start:: èµ·å‹•  File: mew.ja.info, Node: characteristic, Next: Emacsen, Prev: Overview, Up: Overview Mew ã®ç‰¹é•· ========== Mew ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 6.7 ã®ç‰¹é•·ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚ - è¤‡é›‘ãªæ§‹é€ ã‚’æŒã¤ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç°¡å˜ã«è¡¨ç¤ºã§ãã¾ã™ã€‚メッセージを表示 ã™ã‚‹ä½œæ¥­ã¯ã€`SPC' を押ã™ã ã‘ã§ã™ã€‚ - コピー程度ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ“作を知ã£ã¦ã„る人ãªã‚‰ã ã‚Œã§ã‚‚ç°¡å˜ã«è¤‡é›‘㪠メッセージを作æˆã§ãã¾ã™ã€‚ - メッセージã®ä¸€è¦§è¡¨ç¤ºãŒçµ‚了ã™ã‚‹ã¾ã§å¾…ãŸãªãã¦ã‚‚ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読㿠始ã‚られã¾ã™ã€‚ - Summary モードã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸€è¦§ã‚’ä¿å­˜ã—ã¦ã„ã‚‹ã®ã§ã€ãƒ•ォルダを移 å‹•ã—ãŸå ´åˆã¯ã€æ›´æ–°ã•れãŸéƒ¨åˆ†ã ã‘を一覧表示ã—ã¾ã™ã€‚ - ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æ•´é “å…ˆã‚’è³¢ãæŽ¨æ¸¬ã—ã¾ã™ã€‚ãŸãã•んメッセージをå—ã‘å–ã‚‹ 人ã¯ã€ã“れãŒãªã„ã¨ç”Ÿãã¦ã„ã‘ã¾ã›ã‚“。 - Draft モードã§ã¯ã€ãƒ•ィールドåã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã€æ°åã€ãƒ‰ãƒ¡ã‚¤ãƒ³å〠フォルダåを補完ã§ãã¾ã™ã€‚ - キーワードãªã©ã«ã‚ˆã£ã¦ã€æŽ¢ã—ãŸã„メッセージを簡å˜ã«æ¤œç´¢ã§ãã¾ã™ã€‚ - PGP ã‚„ S/MIME ã§æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’自動的ã«å¾©å·åŒ–ã—ã¾ã™ã€‚ã¾ ãŸã€é›»å­ç½²åã‚’è‡ªå‹•çš„ã«æ¤œè¨¼ã—ã¾ã™ã€‚ - MIME ã®æ§‹é€ ã‚’è§£æžã—ãŸã‚Šã€PGP ã‚„ S/MIME ã®ç½²åを検証ã—ãŸã‚Šã™ã‚‹ã®ã« ã¯å°‘ã—æ™‚é–“ãŒã‹ã‹ã‚Šã¾ã™ã€‚ãã“ã§ã€ãƒ¦ãƒ¼ã‚¶ãŒã‚るメッセージを読んã§ã„ ã‚‹é–“ã«ã€æ¬¡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã‚らã‹ã˜ã‚処ç†ã—ã¦ãŠãã“ã¨ã§é«˜é€Ÿæ€§ã‚’å®Ÿç¾ ã—ã¦ã„ã¾ã™ã€‚è§£æžã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã—ã°ã‚‰ãã®é–“ä¿å­˜ã•れã¾ã™ã€‚ - PGP ã‚„ S/MIME を使ã£ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç°¡å˜ã«æš—å·åŒ–ã—ãŸã‚Šã€ç½²åã—㟠りã§ãã¾ã™ã€‚ - 複数ã®ãƒ•ォルダを 1 ã¤ã®ãƒ•ォルダã«è¦‹ã›ã‹ã‘られã¾ã™ã€‚ - メッセージã®ã‚„りå–ã‚Šã®æµã‚Œã‚’å¯è¦–化ã™ã‚‹ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã‚„ã‚¹ãƒ¬ãƒƒãƒ‰ã®æ©Ÿ 能を備ãˆã¦ã„ã¾ã™ã€‚特定ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ ンを作りã€ã•らã«ãã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’作æˆã§ãã¾ã™ã€‚ - フォルダåを入力ã™ã‚‹å ´åˆã€ãƒ•ォルダåã®ä¸€éƒ¨ã‚’キーã¨ã—ã¦æ¤œç´¢ã§ãã¾ ã™ã€‚  File: mew.ja.info, Node: Emacsen, Next: modes, Prev: characteristic, Up: Overview Emacs ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ ================== Emacs 22.3 以é™ã‚’使ã£ã¦ä¸‹ã•ã„。ã“れらよりå‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚„ XEmacs ã¯ã€ サãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。  File: mew.ja.info, Node: modes, Next: folder convention, Prev: Emacsen, Up: Overview モード ====== Mew ã«ã¯æ¬¡ã® 7 ã¤ã®ãƒ¢ãƒ¼ãƒ‰ãŒã‚りã¾ã™ã€‚ `Summary モード' メッセージã®ä¸€è¦§ã‚’表示ã—é¸æŠžã™ã‚‹ãƒ¢ãƒ¼ãƒ‰ã€‚ `Virtual モード' å˜æ•°ã‚ã‚‹ã„ã¯è¤‡æ•°ã®ãƒ•ォルダã‹ã‚‰ã‚ã‚‹æ¡ä»¶ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–り 出ã—ã€ä»®æƒ³çš„ã« 1 ã¤ã®ãƒ•ォルダã«ã—ãŸãƒ¢ãƒ¼ãƒ‰ã€‚Summary モードã«ä¼¼ã¦ã„ る。セレクションやスレッドã¨å‘¼ã°ã‚Œã‚‹ã€‚ `Message モード' メッセージã®å†…容を表示ã™ã‚‹ãƒ¢ãƒ¼ãƒ‰ã€‚ `Draft モード' メッセージã®é€ä¿¡ã€è¿”ç­”ã€è»¢é€ã‚’準備ã™ã‚‹ãŸã‚ã®ãƒ¢ãƒ¼ãƒ‰ã€‚ `Header モード' 既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ˜ãƒƒãƒ€ã®ã¿ã‚’編集ã—é€ä¿¡ã™ã‚‹ãŸã‚ã®ãƒ¢ãƒ¼ãƒ‰ã€‚ `Edit モード' 既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’編集ã—ã€æ–°ã—ã„メッセージを作æˆã™ã‚‹ãŸã‚ã®ãƒ¢ãƒ¼ãƒ‰ã€‚ `Addrbook モード' アドレス帳ã«ã‚¨ãƒ³ãƒˆãƒªã‚’登録ã™ã‚‹ãŸã‚ã®ãƒ¢ãƒ¼ãƒ‰ã€‚  File: mew.ja.info, Node: folder convention, Next: configuration, Prev: modes, Up: Overview フォルダã®ç¨®é¡ž ============== Mew ã®ç”¨èªžã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå±Šã場所を「メールボックスã€ã¨å‘¼ã³ã¾ã™ã€‚メー ルボックスã®ç¨®é¡žã¨ã—ã¦ã¯ã€ãƒ­ãƒ¼ã‚«ãƒ«ã®ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã€POP サーãƒã€IMAP サーãƒã€ãŠã‚ˆã³ NNTP サーãƒãŒã‚りã¾ã™ã€‚ ã¾ãŸã€Mew 自身ãŒãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ ¼ç´ã™ã‚‹ç®±ã®ã“ã¨ã‚’「フォルダã€ã¨å‘¼ã³ã¾ã™ã€‚ フォルダåã¯ã€ä¸€æ–‡å­—ã®è¨˜å·ã‹ã‚‰ãªã‚‹ä¿®é£¾å­ã¨æ–‡å­—列ãŒé€£çµã•れãŸå½¢å¼ã«ãªã£ ã¦ã„ã¾ã™ã€‚ãŸã¨ãˆã°ã€ã€Œ+inboxã€ã¨ã„ã†ãƒ•ォルダã®ä¿®é£¾å­ã¯ã€Œ+ã€ã§ã™ã€‚ Mew ã®ãƒ•ォルダã«ã¯ã€ã€Œãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダã€ã¨ã€Œãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダã€ã® 2 種類ãŒã‚りã¾ã™ã€‚ ローカル・フォルダã¨ã¯ã€Mew ãŒå‹•ã„ã¦ã„るコンピュータã«ã€Œæœ¬ç‰©ã€ãŒä½œã‚‰ã‚Œ るフォルダã§ã™ã€‚ãã®ãƒ•ã‚©ãƒ«ãƒ€ã«æ ¼ç´ã•れるメッセージも本物ã§ã™ã€‚(ã§ã™ã‹ らã€ã‚‚ã—ãã®ãƒ•ォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’消ã—ã¦ã—ã¾ã†ã¨å¾©å…ƒã§ãã¾ã›ã‚“。) ローカル・フォルダã®ä¿®é£¾å­ã¯ "+" ã§ã™ã€‚以下ã«ç‰¹æ®Šãªãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダ を挙ã’ã¾ã™ã€‚ `+inbox' ローカルã®ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã‚„ POP サーãƒã«å±Šã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã€ãƒ­ãƒ¼ã‚« ルã«ç§»å‹•ã•ã›ã¦æœ€åˆã«ä¿å­˜ã™ã‚‹ãŸã‚ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダ。メッセージ ã‚’æ•´ç†ã™ã‚‹å ´åˆã¯ã€"+inbox" ã‹ã‚‰ä»–ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダã«ç§»å‹•ã•ã›ã‚‹ ã“ã¨ã«ãªã‚‹ã€‚ `+draft' 書ãã‹ã‘ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ä¿å­˜ã—ã¦ãŠãローカル・フォルダ。 `+queue' 書ã終ã£ã¦ãƒ¡ãƒ¼ãƒ«ã®é…é€ã«é©ã—ãŸæ›¸å¼ã«å¤‰æ›ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæºœã‚‹ãƒ­ãƒ¼ カル・フォルダ。"+queue" ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã„ãšã‚Œ SMTP ã«ã‚ˆã£ã¦é€ä¿¡ ã•る。 `+postq' 書ã終ã£ã¦ãƒ‹ãƒ¥ãƒ¼ã‚¹ã«æŠ•稿ã™ã‚‹ã®ã«é©ã—ãŸæ›¸å¼ã«å¤‰æ›ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ ãŒæºœã‚‹ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダ。"+postq" ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã„ãšã‚Œ NNTP 㫠よã£ã¦é€ä¿¡ã•れる。 リモート・フォルダã¨ã¯ã€ã‚µãƒ¼ãƒå´ã«ã‚るフォルダをローカルã«ã‚³ãƒ”ーã—ãŸã‚‚ ã®ã§ã™ã€‚本物ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã‚ãã¾ã§ã‚µãƒ¼ãƒå´ã«ã‚りã€ãƒ­ãƒ¼ã‚«ãƒ«ã«ã¯ãƒ¡ãƒƒã‚»ãƒ¼ ジã®ã‚³ãƒ”ーãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れã¾ã™ã€‚ 利用ã§ãるリモート・フォルダã®ä¿®é£¾å­ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚ `%' IMAP ã®ãƒ•ォルダ。例:"%inbox" `$' POP サーãƒã®ã‚µãƒ¼ãƒå´ã®ãƒ•ォルダ。例:"$inbox" (POP サーãƒã®ãƒ•ォル ダ㯠1ã¤ã—ã‹ãªã„ã®ã§ã€"$" ã§å§‹ã¾ã‚‹ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダ㯠"$inbox" ã®ã¿ã€‚) `-' ニュースã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚°ãƒ«ãƒ¼ãƒ—。例:"-fj.mail.reader.mew" サーãƒãŒç•°ãªã‚Œã°ã€ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダã®å®Ÿä½“ã‚‚ç•°ãªã‚Šã¾ã™ã€‚複数ã®ã‚µãƒ¼ãƒã¯ã€ ケースã¨ã„ã†æ©Ÿèƒ½ã‚’使ã£ã¦æŒ‡å®šã—ã¾ã™ã€‚詳ã—ãã¯ã€*Note config:: ã‚’å‚ç…§ã— ã¦ä¸‹ã•ã„。ã‚るケースã«å¯¾ã™ã‚‹ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダã¯ã€"case:folder" ã®ã‚ˆã† ã«ã€ãƒ•ォルダåã®å‰ã«ã‚±ãƒ¼ã‚¹åを付ã‘ã¦æŒ‡å®šã—ã¾ã™ã€‚ケース㌠"default" ã§ ã‚ã‚‹å ´åˆã¯ã€"case:" ã®éƒ¨åˆ†ã‚’çœç•¥å¯èƒ½ã§ã™ã€‚ ケースã¨ä¿®é£¾å­ã®çµ„ã¯ã€ã‚るメッセージãŒå±žã™ä¸–界を構æˆã—ã¦ã„ã¾ã™ã€‚メッセー ジã¯ã€ãれãŒå±žã™ä¸–界ã®ä¸­ã‚’移動ã§ãã¾ã™ã€‚å—ã‘å–ã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€å¾Œã§æŽ¢ ã—ã‚„ã™ã„よã†ã«ã€é©åˆ‡ãªãƒ•ォルダã«ç§»å‹•ã•ã›ã¦ä¿å­˜ã—ã¾ã™ã€‚ã“ã®æ•´é “ã®æ–¹æ³•ã« ã¤ã„ã¦ã€*Note Refile:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 ãªãŠã€POP サーãƒã«ã¯ "$inbox" ã¨ã„ã†ãƒ•ォルダã—ã‹ã‚りã¾ã›ã‚“ã‹ã‚‰ã€"$" 㮠世界ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’移動ã•ã›ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。ã¾ãŸã€ãƒ‹ãƒ¥ãƒ¼ã‚¹ã®è¨˜äº‹ã¯è‡ª 分ã®ã‚‚ã®ã§ã¯ã‚りã¾ã›ã‚“ã‹ã‚‰ã€"-" ã®ä¸–界ã§ã‚‚メッセージã®ç§»å‹•ã¯ä¸å¯èƒ½ã§ã™ã€‚ 世界を超ãˆã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’移動ã•ã›ãŸã„å ´åˆã¯ã€ã‚³ãƒ”ーã—ã¾ã™ã€‚ãŸã ã—ã€ã‚³ãƒ”ー å…ˆã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダã«é™å®šã•れã¾ã™ã€‚ã“ã®æ–¹æ³•ã¯ã€*Note retrieving:: ã§èª¬æ˜Žã•れã¦ã„ã¾ã™ã€‚ フォルダã®ãƒªã‚¹ãƒˆã‚’作æˆã—ã¦ãŠãã¨ã€ãƒ•ォルダåã«å¯¾ã—補完ãŒåˆ©ç”¨ã§ãã¦ä¾¿åˆ© ã§ã™ã€‚フォルダã®ãƒªã‚¹ãƒˆã‚’作æˆã™ã‚‹æ–¹æ³•ã¯ã€*Note status-update:: ã‚’å‚ç…§ã— ã¦ä¸‹ã•ã„。  File: mew.ja.info, Node: configuration, Next: password, Prev: folder convention, Up: Overview åˆæœŸè¨­å®š ======== Mew ã‚’èµ·å‹•ã™ã‚‹ã«ã¯ã€çµ„ç¹”ã®è¨­å®šãƒ•ァイルã‹è‡ªåˆ†ã® "~/.emacs" ã«ä»¥ä¸‹ã®è¨­å®š ãŒå¿…è¦ã§ã™ã€‚ (autoload 'mew "mew" nil t) (autoload 'mew-send "mew" nil t) ;; Optional setup (Read Mail menu): (setq read-mail-command 'mew) ;; Optional setup (e.g. C-xm for sending a message): (autoload 'mew-user-agent-compose "mew" nil t) (if (boundp 'mail-user-agent) (setq mail-user-agent 'mew-user-agent)) (if (fboundp 'define-mail-user-agent) (define-mail-user-agent 'mew-user-agent 'mew-user-agent-compose 'mew-draft-send-message 'mew-draft-kill 'mew-send-hook)) Latin-1 ã®ãŸã‚ã«ã€Emacs ã‚’ --unibyte オプション付ã§èµ·å‹•ã—ã¦ã„ã‚‹ã‹ã€ç’° 境変数 EMACS_UNIBYTE ã¨å…±ã«èµ·å‹•ã—ã¦ã„ã‚‹å ´åˆã€ä»¥ä¸‹ã®è¨­å®šã‚’ "~/.emacs" ã«å…¥ã‚Œã¦ä¸‹ã•ã„。 (set-language-environment "Latin-1") (set-input-method "latin-1-prefix") ;; or "latin-1-postfix" Latin-1 ã®ãŸã‚ã«ã€ä»¥ä¸‹ã®ã‚ˆã†ãªè¨­å®šã‚’ã—ã¦ã„ã‚‹ãªã‚‰ã€å‰Šã£ã¦ä¸‹ã•ã„。ã“れ㯠Latin-1 ã«ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã™ã‚‹ãŸã‚ã®æ–¹æ³•ã¨ã—ã¦ã¯æŽ¨å¥¨ã•れã¦ã„ã¾ã›ã‚“ã—ã€ã“㮠設定ã§ã¯ Mew ã¯æ­£ã—ãå‹•ãã¾ã›ã‚“。 (standard-display-european 1) Mew ã¯èµ·å‹•時ã«ã€"~/.mew.el" を読ã¿è¾¼ã¿ã¾ã™ã€‚Mew ã«é–¢ã™ã‚‹è¨­å®šã¯ã€ã“ã®ãƒ•ã‚¡ イルã«å…¥ã‚Œã‚‹ã¨ã‚ˆã„ã§ã—ょã†ã€‚ メールアドレスを指定ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã®è¨­å®šãŒå¿…è¦ã§ã™ã€‚ ;; (setq mew-name "your name") ;; (user-full-name) ;; (setq mew-user "user name of e-mail address") ;; (user-login-name) (setq mew-mail-domain "domain of e-mail address") SMTP を使ã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã«ã¯ã€ä»¥ä¸‹ã®è¨­å®šãŒå¿…è¦ã§ã™ã€‚ (setq mew-smtp-server "your SMTP server") ;; if not localhost POP を使ã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã™ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šãŒå¿…è¦ã§ã™ã€‚ ;; (setq mew-pop-user "your POP account") ;; (user-login-name) (setq mew-pop-server "your POP server") ;; if not localhost メッセージã®å—ä¿¡ã«ãƒ­ãƒ¼ã‚«ãƒ«ã®ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã‚’利用ã—ãŸã„å ´åˆã¯ã€ä»¥ä¸‹ã®ã‚ˆ ã†ãªè¨­å®šãŒå¿…è¦ã§ã™ã€‚ ;; To use local mailbox "mbox" or "maildir" instead of POP (setq mew-mailbox-type 'mbox) (setq mew-mbox-command "incm") (setq mew-mbox-command-arg "-u -d /path/to/mbox") ;; If /path/to/mbox is a file, it means "mbox". ;; If /path/to/mbox is a directory, it means "maildir". IMAP を使ã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã™ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šãŒå¿…è¦ã§ã™ã€‚ (setq mew-proto "%") ;; (setq mew-imap-user "your IMAP account") ;; (user-login-name) (setq mew-imap-server "your IMAP server") ;; if not localhost ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’èª­ã¿æ›¸ãã™ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šãŒå¿…è¦ã§ã™ã€‚ ;; (setq mew-nntp-user "your NNTP account") (setq mew-nntp-server "your NNTP server")  File: mew.ja.info, Node: password, Next: start, Prev: configuration, Up: Overview パスワード ========== メッセージをé€å—ä¿¡ã—ãŸã‚Šã€PGP ã‚„ S/MIME を使ã£ãŸã‚Šã™ã‚‹å ´åˆã«ã¯ã€ãƒ‘スワー ドを訊ã‹ã‚Œã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚パスワードを入力ã™ã‚‹å‰ã«ä»¥ä¸‹ã®æ¡ä»¶ã®ã©ã¡ã‚‰ ã‹ãŒæº€ãŸã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¾ã—ょã†ã€‚ - Emacs ãŒç›®ã®å‰ã®ã‚³ãƒ³ãƒ”ュータã§å‹•ã„ã¦ã„ã‚‹ - Emacs ãŒé éš”ã®ã‚³ãƒ³ãƒ”ュータã§å‹•ã„ã¦ã„ã‚‹ãŒã€ãªã‚“らã‹ã®æš—å·æ‰‹æ®µã‚’使㣠ã¦é€šä¿¡ã—ã¦ã„る。 ã©ã¡ã‚‰ã®æ¡ä»¶ã‚‚満ãŸã•れãªã„å ´åˆã¯ã€ãƒ‘スワードを入力ã—ãªã„ã§ä¸‹ã•ã„。入力 ã™ã‚‹ã¨ç›—è´ã•れるæã‚ŒãŒã‚りã¾ã™ã€‚ パスワードを何回も入力ã™ã‚‹ã®ãŒé¢å€’ãªäººã¯ã€ãƒ‘スワードをä¿å­˜ã™ã‚‹æ©Ÿèƒ½ã‚’利 用ã—ã¦ä¸‹ã•ã„。2 ã¤ã®æ–¹æ³•ãŒã‚りã¾ã™ã€‚ 1. パスワードをメモリã«ä¸€æ™‚çš„ã«è“„ãˆã‚‹ã€‚ファイルã«ã¯æ›¸ã出ã•ãªã„。 2. パスワードをメモリ㫠Mew ãŒèµ·å‹•ã—ã¦ã„る間中蓄ãˆã‚‹ã€‚Mew/Emacs ã®çµ‚ 了時ã«ã€ãƒ‘スワードを暗å·åŒ–ã—ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã出ã™ã€‚ 1. ã®æ©Ÿèƒ½ã‚’利用ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¾ã™ã€‚ (setq mew-use-cached-passwd t) 2. ã®æ©Ÿèƒ½ã‚’利用ã™ã‚‹ã«ã¯ã€GnuPG をインストールã—ãŸå¾Œã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®š ã—ã¾ã™ã€‚(GnuPG ã¯ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1.xã€2.0ã€2.1ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚) (setq mew-use-master-passwd t) 両方ã®å¤‰æ•°ãŒ `t' ã®å ´åˆã€2. ã®æ©Ÿèƒ½ãŒåˆ©ç”¨ã•れã¾ã™ã€‚ 1. ã®æ©Ÿèƒ½ï¼šã‚らゆるパスワード(POPã€PGP ãªã©)ãŒä¸€æ™‚çš„ã«ãƒ¡ãƒ¢ãƒªã«ä¿å­˜ã•れ ã¾ã™ã€‚パスワードãŒä¿å­˜ã•れã¦ã„ã‚‹é–“ã¯ã€ãƒ‘スワードã®å…¥åŠ›ã‚’çœç•¥ã§ãã¾ã™ã€‚ ä¿å­˜ã•れã¦ã„るパスワードã¯ä¸€å®šæ™‚é–“(通常㯠20 分)ãŒéŽãŽã‚‹ã¨æ¶ˆåŽ»ã•れã¾ã™ã€‚ ãŸã ã—ã€ä¿å­˜ã•れã¦ã„るパスワードãŒå†…部ã§åˆ©ç”¨ã•れるã¨ã€ä¿å­˜æœŸé–“ãŒå»¶é•·ã• れã¾ã™(20 åˆ†ã«æˆ»ã‚Šã¾ã™)。 2. ã®æ©Ÿèƒ½ï¼šMew ã®èµ·å‹•時ã«ã€ãƒžã‚¹ã‚¿ãƒ¼ãƒ‘スワードを訊ã‹ã‚Œã¾ã™ã€‚Mew ã¯ã㮠マスターパスワードã§ã€æš—å·åŒ–ã•れã¦ã„るパスワードを復å·åŒ–ã—ã€ãƒ¡ãƒ¢ãƒªã«è“„ ãˆã¾ã™ã€‚ãŸã¨ãˆã°ã€ä»¥å‰ POP ã®ãƒ‘スワードを入力ã—ã¦ã„れã°ã€ãれãŒãƒ¡ãƒ¢ãƒª ã«è“„ãˆã‚‰ã‚Œã¦ã„ã¾ã™ã‹ã‚‰ã€æ¬¡ã« POP ã®ãƒ‘スワードãŒå¿…è¦ãªéš›ã€POP ã®ãƒ‘スワー ドã®å…¥åŠ›ã‚’çœç•¥ã§ãã¾ã™ã€‚ã¯ã˜ã‚ã¦ãƒžã‚¹ã‚¿ãƒ¼ãƒ‘スワードを利用ã™ã‚‹éš›ã¯ã€ç¢ºèª ã®ãŸã‚マスターパスワードを 2 回訊ãã¾ã™ã€‚ã¾ãŸã€ãŸã¨ãˆã° POP ã®ãƒ‘スワー ドも1 回ã ã‘入力ã™ã‚‹ã‚ˆã†ã«ä¿ƒã•れã¾ã™ã€‚Mew ã®èµ·å‹•時ã«ã€é–“é•ã£ãŸãƒžã‚¹ã‚¿ãƒ¼ パスワードを入力ã™ã‚‹ã“ã¨ã‚‚ã‚ã‚‹ã§ã—ょã†ã€‚ãã®å ´åˆã€1. ã®æ©Ÿèƒ½ã‚’有効ã«ã— ã¦ã„ã‚‹ãªã‚‰ã€1. ã®æ©Ÿèƒ½ãŒä½¿ã‚れã¾ã™ã€‚有効ã§ãªã‘れã°ã€ãƒ‘スワードã®ä¿å­˜æ©Ÿ 能ã¯åˆ©ç”¨ã•れã¾ã›ã‚“。 マスターパスワードを変更ã™ã‚‹ã«ã¯ã€Summary モード㧠`C-cC-m' ã¨å…¥åŠ›ã—ã¾ ã™ã€‚ メモリã«ä¿å­˜ã•れã¦ã„るパスワードã¯ã€æš—å·åŒ–ã•れã¦ã„ã¾ã›ã‚“。ãã“ã§ã€ 1. ã¾ãŸã¯ 2. ã®æ–¹æ³•を使ã†å ´åˆã¯ã€ä»–ã®äººã«è‡ªåˆ†ãŒèµ·å‹•ã—㟠Emacs を触られ ãªã„よã†ã«æ°—ã‚’ã¤ã‘ã¦ä¸‹ã•ã„。もã—席を空ã‘ã€Emacs をよã知ã£ã¦ã„ã‚‹ä»–ã®äºº ã«Emacs ã‚’æ“作ã•れãŸå ´åˆã€ãƒ‘スワードを盗ã¿å–られるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚  File: mew.ja.info, Node: start, Next: Viewing, Prev: password, Up: Overview èµ·å‹• ==== Mew ã‚’èµ·å‹•ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®æ–¹æ³•ãŒã‚りã¾ã™ã€‚ `M-x mew' Mew ãŒèµ·å‹•ã—ã¦ã„ãªã‘れã°ã€ã¾ãš Mew ã‚’èµ·å‹•ã™ã‚‹ã€‚ãã—ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ ã‚’å–å¾—ã™ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯å˜ã«ãƒ‡ãƒ•ォルトã®ãƒ•ォルダã¸ç§»å‹•ã™ã‚‹ã€‚ ã¾ãšã€ã€Œä¿®é£¾å­ã€ã¯ `mew-proto' ã¨ã‚±ãƒ¼ã‚¹ã‹ã‚‰æ±ºå®šã•れる。(*Note config:: ã‚’å‚ç…§) 「修飾å­ã€ãŒ `+'(ローカル・フォルダ)ãªã‚‰ã€`mew-mailbox-type' ã‹ã‚‰ ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ãŒæ±ºå®šã•れる。(*Note retrieving:: ã‚’å‚ç…§) ãã®ä»–〠ã™ãªã‚ã¡ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダãªã‚‰ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹ãŸã‚ã®ãƒ—ロト コルãŒä¿®é£¾å­ã«å¿œã˜ã¦æ±ºã‚‹ã€‚ `mew-auto-get' ㌠`t' ãªã‚‰ã€åˆ°ç€ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒéžåŒæœŸã«å–å¾—ã•れ〠Summary モードã¸ä¸€è¦§è¡¨ç¤ºã•れる。 `mew-auto-get' ㌠`nil' ãªã‚‰ã€ä¿®é£¾å­ã«ã‚ˆã£ã¦æ±ºå®šã—ãŸãƒ‡ãƒ•ォルト㮠フォルダã¸å˜ã«ç§»å‹•ã™ã‚‹ã€‚ `C-uM-x mew' `mew-auto-get' ã®å€¤ã‚’逆ã ã¨è€ƒãˆã¦ã€`M-x mew' を実行ã™ã‚‹ã€‚ `C-xm' `mail-user-agent' ãŒè¨­å®šã•れã¦ã„ã‚‹å ´åˆã€Draft モードã¸ç§»è¡Œã™ã‚‹ã€‚ Emacs ã§ Mew ã‚’èµ·å‹•ã™ã‚‹ã¨å¯æ„›ã„ 2 匹ã®å­ãŒçŒ«ç¾ã‚Œã¾ã™ã€‚ ãªãŠã€Mew を終了ã™ã‚‹æ–¹æ³•ã¯ã€*Note Quit:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。  File: mew.ja.info, Node: Viewing, Next: singlepart, Prev: start, Up: Top メッセージを表示ã™ã‚‹ ******************** (Mew ãŒèµ·å‹•中ã§ã‚‚ã€èµ·å‹•中ã§ã¯ãªãã¦ã‚‚) `M-x mew' ã¨å…¥åŠ›ã™ã‚‹ã¨ã€Mew 㯠メッセージを以下ã®ã‚ˆã†ã«ä¸€è¦§è¡¨ç¤ºã—ã¾ã™ã€‚ * 03/12 Hidenori Ohta 今週末 |日曜ã«ã‚¹ãƒˆãƒ¼ãƒ³ãƒžã‚¸ãƒƒã‚¯ M03/14 ã‚‚ã‚‚ã¡ã‚ƒã‚“ 能登ã®å†™çœŸ |ã“ã®å‰æ’®ã£ãŸå†™çœŸã‚’添付 03/15 Neat Sumikawa Re: ワイン |ã˜ã‚ƒãã€æ°´æ›œæ—¥ã«ä¾‹ã®åº— ã“れを Summary モードã¨ã„ã„ã¾ã™ã€‚ã“ã“ã§ã¯ã€ä¸»ã« Summary モードã§ã®ãƒ¡ãƒƒ セージã®èª­ã¿æ–¹ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ 上記ã®ä¾‹ã®ã‚ˆã†ã« Summary モードã¯ã€ãƒžãƒ¼ã‚¯ã€ãƒ‡ãƒ¼ã‚¿åž‹(Mew ãŒä»˜ã‘るマーク)〠日付ã€å·®å‡ºäººã€Subject:ã€æœ¬æ–‡ã‹ã‚‰æ§‹æˆã•れã¦ã„ã¾ã™ã€‚ Summary モードを消去ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€*Note Quit:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 * Menu: * singlepart:: èª­ã¿æ–¹ã®åŸºç¤Ž * multipart:: MIME を表示ã™ã‚‹ * analysis:: MIME ã®è§£æžã‚’制御ã™ã‚‹ * cipher-viewing:: æš—å·ãƒ¡ãƒ¼ãƒ«ã‚„é›»å­ç½²åを表示ã™ã‚‹ * retrieving:: メッセージã®å–å¾— * moving:: フォルダã®ç§»å‹• * sum-write:: é€ä¿¡ã€è¿”ç­”ã€è»¢é€ * features:: ä¾¿åˆ©ãªæ©Ÿèƒ½ * status-update:: çŠ¶æ…‹ã®æ›´æ–° * invalid:: è¦æ ¼é•åã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸  File: mew.ja.info, Node: singlepart, Next: multipart, Prev: Viewing, Up: Viewing èª­ã¿æ–¹ã®åŸºç¤Ž ============ メッセージを上ã‹ã‚‰é †ã«èª­ã‚“ã§ã„ãã®ã§ã‚れã°ã€`SPC' ã‚’é©å®œæŠ¼ã™ã ã‘ã§ã™ã€‚ ç°¡å˜ã§ã—ょ? ã—ã‹ã—ãれã ã‘ã§ã¯ã‚ã‚“ã¾ã‚Šãªã®ã§ã€ä»¥ä¸‹ã«ãƒšãƒ¼ã‚¸ã‚’æ“作ã™ã‚‹åŸºæœ¬çš„ãªã‚³ãƒžãƒ³ ドを示ã—ã¾ã™ã€‚ `SPC' メッセージを読ã¿é€²ã‚る。ã¤ã¾ã‚Šã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã€ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã•ã›ã€ä»–㮠メッセージã«ç§»å‹•ã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚カーソルãŒç§»å‹•ã™ã‚‹æ–¹å‘ã¯ã€ *Note summary-mode:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `C-uSPC' メッセージを先頭ã‹ã‚‰å†è¡¨ç¤ºã€‚ `DEL' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’下ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã•ã›ã‚‹ã€‚ä¸å¿…è¦ãªãƒ˜ãƒƒãƒ€ãƒ•ィールド ã¯ã€ã‚¦ã‚¤ãƒ³ãƒ‰ã‚¦ã®ä¸Šã«éš ã‚Œã¦ã„る。よã£ã¦ã€`DEL' を入力ã™ã‚‹ã¨ã€ãれ らãŒç¾ã‚Œã‚‹ã€‚ `RET' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ 1 行上ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã™ã‚‹ã€‚ `M-RET' `-' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ 1 行下ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã™ã‚‹ã€‚ `C-n' 下ã®è¡Œã¸ç§»å‹•。 `C-p' 上ã®è¡Œã¸ç§»å‹•。 `n' 下方å‘ã«ç§»å‹•ã—表示。対象ã¨ãªã‚‹ã®ã¯ã€ãƒ‘ートã€`*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒ セージã€ãƒžãƒ¼ã‚¯ã®ä»˜ã„ã¦ã„ãªã„メッセージ。 `C-un' 下方å‘ã«ç§»å‹•ã—表示。対象ã¨ãªã‚‹ã®ã¯ã€`*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€ マークã®ä»˜ã„ã¦ã„ãªã„メッセージ。 `p' 上方å‘ã«ç§»å‹•ã—表示。対象ã¨ãªã‚‹ã®ã¯ã€ãƒ‘ートã€`*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒ セージã€ãƒžãƒ¼ã‚¯ã®ä»˜ã„ã¦ã„ãªã„メッセージ。 `C-up' 上方å‘ã«ç§»å‹•ã—表示。対象ã¨ãªã‚‹ã®ã¯ã€`*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€ マークã®ä»˜ã„ã¦ã„ãªã„メッセージ。 `j' 入力ã•れãŸè¡Œç•ªå·ã«å¾“ã£ã¦ãã®è¡Œã¸ç§»å‹•。 `C-uj' 入力ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ç•ªå·ã«å¾“ã£ã¦ãã®è¡Œã¸ç§»å‹•。  File: mew.ja.info, Node: multipart, Next: analysis, Prev: singlepart, Up: Viewing MIME を表示ã™ã‚‹ =============== マルãƒãƒ‘ートを読むã®ã¯åˆ¥ã«å¤§å¤‰ãªã“ã¨ã§ã¯ã‚りã¾ã›ã‚“。今ã¾ã§é€šã‚Šã€ `SPC' を押ã—ã¦ã„ã‘ã°ã‚ˆã„ã ã‘ã§ã™ã€‚ マルãƒãƒ‘ートã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«æ—¥ä»˜ã®å·¦ã« `M' ã¨ã„ã†ãƒžãƒ¼ã‚¯ãŒ 付ã„ã¦ã„ã¾ã™ã€‚ * 03/12 Hidenori Ohta 今週末 |日曜ã«ã‚¹ãƒˆãƒ¼ãƒ³ãƒžã‚¸ãƒƒã‚¯ M03/14 ã‚‚ã‚‚ã¡ã‚ƒã‚“ 能登ã®å†™çœŸ |ã“ã®å‰æ’®ã£ãŸå†™çœŸã‚’添付 03/15 Neat Sumikawa Re: ワイン |ã˜ã‚ƒãã€æ°´æ›œæ—¥ã«ä¾‹ã®åº— `M' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ `SPC' を押ã™ã¨ã€ãƒ˜ãƒƒãƒ€ã‚’ Message モード ã«è¡¨ç¤ºã™ã‚‹ã¨å…±ã«ã€ä»¥ä¸‹ã®ã‚ˆã†ã« Summary モードã§ãƒžãƒ«ãƒãƒ‘ãƒ¼ãƒˆã®æ§‹é€ ã‚’ç°¡ ç´ ã«è¡¨ç¤ºã—ã¾ã™ã€‚ * 03/12 Hidenori Ohta 今週末 |日曜ã«ã‚¹ãƒˆãƒ¼ãƒ³ãƒžã‚¸ãƒƒã‚¯ M03/14 ã‚‚ã‚‚ã¡ã‚ƒã‚“ 能登ã®å†™çœŸ |ã“ã®å‰æ’®ã£ãŸå†™çœŸã‚’添付 B 2 Image/Jpeg 写真1 noto1.jpg Q 3 Application/Postscript 能登ã®åœ°å›³ map.ps 03/15 Neat Sumikawa Re: ワイン |ã˜ã‚ƒãã€æ°´æ›œæ—¥ã«ä¾‹ã®åº— ã‚‚ã—ã€ãƒ‘ート 1 ㌠Text/ ãªã‚‰ã€Summary モードã«ã¯ãƒ‘ート 1 ã¯å¯è¦–化ã•れ ãšã€ãã®ã‹ã‚りパート 1 ãŒãƒ˜ãƒƒãƒ€ã¨å…±ã« Message モードã«è¡¨ç¤ºã•れã¾ã™ã€‚ マルãƒãƒ‘ートã®å„行㯠- マーク (Content-Transfer-Encoding:) - ãƒ‘ãƒ¼ãƒˆç•ªå· - データ型 (Content-Type:) - 説明 (Content-Description:) - ファイルå (Content-Disposition:) ã‹ã‚‰æ§‹æˆã•れã¦ã„ã¾ã™ã€‚Content-Description: ã¯ãƒ‘ートã«å¯¾ã™ã‚‹ Subject: ã¨è€ƒãˆã¦ã„ã„ã§ã—ょã†ã€‚ã“ã®è¡¨ç¤ºã¯ Draft ãƒ¢ãƒ¼ãƒ‰ã®æ·»ä»˜é ˜åŸŸã¨ã»ã¨ã‚“ã©åŒã˜ ã§ã™ã€‚ `SPC' ã‚„ `n' ã§ãƒ‘ート 2 ã¸é€²ã‚ã°ã€ãã®ãƒ‘ートãŒãƒ‡ãƒ¼ã‚¿åž‹ã«å¿œã˜ã¦ 表示ã•れã¾ã™ã€‚ãŸã¨ãˆã°ã€Text/Plain ãªã‚‰ Message モードã§ã€PostScript 㪠ら "ghostview" ã§è¡¨ç¤ºã•れã¾ã™ã€‚ `n' ã‚„ `p' ã¯ã€ãƒ‘ート部分ã¾ã§å«ã‚“ã è¡Œã‚’移動ã™ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¦ä¸‹ã•ã„。 パート部分を飛ã°ã—ã¦ä¸‹ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã«ã¯ `C-un' ã¨å…¥åŠ›ã—ã¦ä¸‹ã• ã„。ã¾ãŸã€ãƒ‘ート部分を飛ã°ã—㦠1 ã¤ä¸Šã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã«ã¯ `C-up' ã¨å…¥åŠ›ã—ã¦ä¸‹ã•ã„。 Mew ã¯ã€MIME ã‚’å†å¸°çš„ã«å‡¦ç†ã—ã¾ã™ã€‚以下ã¯è»¢é€ã•れãŸãƒžãƒ«ãƒãƒ‘ートã®ãƒ¡ãƒƒ セージã®ä¾‹ã§ã™ã€‚ M03/15 ã‹ãšãã‚“ Fw: 能登ã®å†™çœŸ |写真ãŒé€ã‚‰ã‚Œã¦ããŸã®ã§ 2 Message/Rfc822 能登ã®å†™çœŸ B 2.2 Image/Jpeg 写真1 noto1.jpg Q 2.3 Application/Postscript 能登ã®åœ°å›³ map.ps (メモ) テキスト以外ã®ãƒ‡ãƒ¼ã‚¿ã‚’ã€ã‚·ãƒ³ã‚°ãƒ«ãƒ‘ートã¨ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ ¼ç´ã™ ã‚‹ã®ã¯ã€æ›¸å¼ã¨ã—ã¦ã¯é–“é•ã„ã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãŠå‹§ã‚ã§ãã¾ã›ã‚“。マルãƒãƒ‘ー トを作æˆã—ã€ãã®ãƒ‘ート 1 ã«èª¬æ˜Žã®ãƒ†ã‚­ã‚¹ãƒˆã‚’ã€ãƒ‘ート 2 ã«ãƒ†ã‚­ã‚¹ãƒˆä»¥å¤–㮠データを入れる作法をãŠå‹§ã‚ã—ã¾ã™ã€‚ テキスト以外ã®ãƒ‡ãƒ¼ã‚¿ãŒæœ¬æ–‡ã«ç›´æŽ¥æ ¼ç´ã•れã¦ã„るメッセージã«å¯¾ã—ã€Mew 㯠ã“れをã‚ãŸã‹ã‚‚マルãƒãƒ‘ートã®ã‚ˆã†ã«è¡¨ç¤ºã—ã¾ã™ã€‚ ã“ã®ã‚ˆã†ã« MIME ã®æ§‹é€ ã¯è¤‡é›‘ã«ãªã‚Šã†ã‚‹ã®ã§ã€è§£æžã™ã‚‹ã®ã«ã¯æ™‚é–“ãŒã‹ã‹ã‚‹ å ´åˆãŒã‚りã¾ã™ã€‚ã—ã‹ã—ã€Mew ã¯æ¬¡ã«èª­ã¾ã‚Œã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’予想ã—ã€ãƒ¦ãƒ¼ã‚¶ãŒ ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読んã§ã„ã‚‹é–“ã«ã€æ¬¡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã‚らã‹ã˜ã‚è§£æžã—ã¦ãŠ ãã“ã¨ã§é«˜é€Ÿæ€§ã‚’実ç¾ã—ã¦ã„ã¾ã™ã€‚è§£æžã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã—ã°ã‚‰ãã®é–“ä¿ å­˜ã•れã¾ã™ã€‚ メッセージã®çµ‚りã®éƒ¨åˆ†ãŒã¯ã£ãりã¨åˆ†ã‹ã‚‹ã‚ˆã†ã«ã€Mew ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ€å¾Œ ã« "[End of message]" ã¨ã„ã†æ–‡å­—列を表示ã—ã¾ã™ã€‚ã¾ãŸã€ãƒ‘ートã®çµ‚りã§ã¯ã€ "[Message is continued]" ã¨ã„ã†æ–‡å­—列を表示ã—ã¾ã™ã€‚ã“ã‚Œã‚‰ã®æ–‡å­—列ã¯ã れãžã‚Œã€`mew-end-of-message-string' 㨠`mew-end-of-part-string'ã§æŒ‡å®š ã§ãã¾ã™ã€‚  File: mew.ja.info, Node: analysis, Next: cipher-viewing, Prev: multipart, Up: Viewing MIME ã®è§£æžã‚’制御ã™ã‚‹ ===================== メッセージã®è§£æžã‚’制御ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã®å¤‰æ•°ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚ `mew-file-max-size' è§£æžã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¤§ãã•ã®ä¸Šé™ã€‚メッセージã®å¤§ãã•ãŒã“ã®å€¤ä»¥ä¸‹ ãªã‚‰ã€è§£æžã—表示ã™ã‚‹ã€‚è¶Šãˆã¦ã„ã‚‹ãªã‚‰ã€è§£æžã›ãšã«ç”Ÿã®ã¾ã¾è¡¨ç¤ºã™ã‚‹ã€‚ åˆæœŸå€¤ã¯ 100000 ãƒã‚¤ãƒˆã€‚ `mew-header-max-length' è§£æžã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ˜ãƒƒãƒ€é•·ã®ä¸Šé™ã€‚ヘッダã®è¡Œæ•°ãŒã“ã®å€¤ä»¥ä¸‹ãªã‚‰ã€ メッセージを解æžã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚è¶Šãˆã¦ã„ã‚‹ãªã‚‰ã€è§£æžã‚’é€”ä¸­ã§æ­¢ã‚㦠メッセージを壊れãŸå½¢ã§è¡¨ç¤ºã™ã‚‹ã€‚åˆæœŸå€¤ã¯ 100 行。 `mew-decode-broken' è¦æ ¼é•åã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’è§£æžã™ã‚‹éš›ã«ã€å¯›å®¹ã«ãªã‚‹ã‹å¦ã‹ã€‚`t' ãªã‚‰å¯› 容ã«ã€`nil' ãªã‚‰å޳坆ã«è§£æžã™ã‚‹ã€‚寛容ã«è§£æžã™ã‚‹éš›ã«è¦æ ¼é•åãŒã‚㣠ãŸå ´åˆã¯ã€X-Mew: フィールドã«è¡¨ç¤ºã™ã‚‹ã€‚åˆæœŸå€¤ã¯ `t'。 `mew-use-text-body' 本文ã®ãƒ†ã‚­ã‚¹ãƒˆã‚’ヘッダã¨åŒæ™‚ã«è¡¨ç¤ºã™ã‚‹ã‹å¦ã‹ã€‚`t' ãªã‚‰ã€æœ¬æ–‡ãŒã‚· ングルã®ãƒ†ã‚­ã‚¹ãƒˆã€ãŠã‚ˆã³ã€æœ¬æ–‡ãŒãƒžãƒ«ãƒãƒ‘ãƒ¼ãƒˆã§æœ€åˆã®ãƒ‘ートãŒãƒ†ã‚­ ストã®å ´åˆã€ãã®ãƒ†ã‚­ã‚¹ãƒˆã‚’ヘッダã¨åŒæ™‚ã«è¡¨ç¤ºã™ã‚‹ã€‚`nil' ã®å ´åˆã¯ã€ マルãƒãƒ‘ート内ã®ãƒ‘ートã®ã‚ˆã†ã«è¡¨ç¤ºã™ã‚‹ã€‚åˆæœŸå€¤ã¯ `t'。 `mew-use-alternative' Multipart/Alternative ã®å–り扱ã„。Multipart/Alternative ã§ã‚るメッ セージã«ã¯`-' マークãŒä»˜ã„ã¦ã„る。`t' ãªã‚‰ã€ `mew-mime-multipart-alternative-list' ã®å„ªå…ˆé †ä½ã«å¾“ã£ã¦ã€1 ã¤ã® パートを表示ã™ã‚‹ã€‚`nil' ãªã‚‰ã€é€šå¸¸ã®ãƒžãƒ«ãƒãƒ‘ートã¨ã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚ åˆæœŸå€¤ã¯ `t'。 `mew-use-text/html' Text/Html ã®å–扱ã„。`nil' ã®å ´åˆã¯ HTML ã‚’è§£æžã›ãšã«è¡¨ç¤ºã€‚ãれ以 外ãªã‚‰ HTML ã‚’è§£æžã—ã¦è¡¨ç¤ºã€‚åˆæœŸå€¤ã¯ `nil'。 `mew-use-text/xml' Text/Xml ã®å–扱ã„。`nil' ã®å ´åˆã¯ XML ã‚’è§£æžã›ãšã«è¡¨ç¤ºã€‚ãれ以外 ãªã‚‰ XML ã‚’è§£æžã—ã¦è¡¨ç¤ºã€‚åˆæœŸå€¤ã¯ `nil'。 ã“れらã®å¤‰æ•°ã«é–¢ã™ã‚‹åŸºæœ¬çš„ãªã‚³ãƒžãƒ³ãƒ‰ã¯ã€`.' ã§ã™ã€‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ä»¥ä¸‹ ã®ã‚ˆã†ã«å‹•ãã¾ã™ã€‚ 1) ã“ã®ã‚³ãƒžãƒ³ãƒ‰ãŒãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä¸Šã§å®Ÿè¡Œã•れるã¨ã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ ãŒå‰Šé™¤ã•れã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè§£æžã•れã¦å†è¡¨ç¤ºã•れã¾ã™ã€‚ 1a) ã‚‚ã—ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¤§ãã•㌠`mew-file-max-size' ã‚’è¶Šãˆã¦ã„る㪠らã€MIME ã¯è§£æžã•れãšã€ãã®ã¾ã¾è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ã“ã®ã‚³ãƒžãƒ³ ドã¯ã“ã®ä¸Šé™ã«é–¢ã‚らãšã«ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’è§£æžã—ã€å†è¡¨ç¤ºã—ã¾ã™ã€‚ 1b) ã‚‚ã—ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ˜ãƒƒãƒ€é•·ãŒ `mew-header-max-length' ã‚’è¶Šãˆã¦ ã„ã‚‹ãªã‚‰ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå£Šã‚ŒãŸã‚ˆã†ã«è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ã“ã®ã‚³ãƒž ンドã¯ã“ã®ä¸Šé™ã«é–¢ã‚らãšã«ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’è§£æžã—ã€å†è¡¨ç¤ºã—ã¾ã™ã€‚ 1c) ã‚‚ã—ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒ `:' ã§è¡¨ç¤ºã•れã¦ã„ã‚‹ãªã‚‰ã€ãƒžãƒ«ãƒãƒ‘ãƒ¼ãƒˆã®æ§‹ 造ã¯ã€é€šå¸¸ã¨ã¯é•ã†ã‚ˆã†ã«è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ãƒžãƒ« ãƒãƒ‘ãƒ¼ãƒˆã®æ§‹é€ ã‚’通常ã¨åŒã˜ã‚ˆã†ã«å†è¡¨ç¤ºã—ã¾ã™ã€‚ 1d) ã‚‚ã— `mew-use-text/html' ㌠`nil' ãªã‚‰ã€HTML ã¯è§£æžã•れãšã€ãã®ã¾ ã¾è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ HTML ã‚’è§£æžã—ã€å†è¡¨ç¤ºã—ã¾ ã™ã€‚ 2) ã‚‚ã—ã“ã®ã‚³ãƒžãƒ³ãƒ‰ãŒãƒ‘ート上ã§å®Ÿè¡Œã•れãŸå ´åˆã€ãã®ãƒ‘ートãŒå†è¡¨ç¤ºã•れ ã¾ã™ã€‚ 2a) ã‚‚ã— `mew-use-text/html' ㌠`nil' ãªã‚‰ã€HTML ã¯è§£æžã•れãšã€ãã®ã¾ ã¾è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ HTML ã‚’è§£æžã—ã€å†è¡¨ç¤ºã—ã¾ ã™ã€‚ `.' 以外ã«ã‚‚ã€ä»¥ä¸‹ã®ã‚ˆã†ãªä¾¿åˆ©ãªã‚³ãƒžãƒ³ãƒ‰ãŒã‚りã¾ã™ã€‚ `.' メッセージを解æžã—ã€å†è¡¨ç¤ºã™ã‚‹ã€‚ `C-u.' `mew-decode-broken' を逆ã«ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’è§£æžã—ç›´ã™ã€‚ *Note invalid:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `:' `mew-use-alternative' 㨠`mew-use-text-body' ã‚’å転ã•ã›ãŸ `.'. `C-u:' `mew-use-alternative' 㨠`mew-use-text-body' ã‚’å転ã•ã›ãŸ `C-u.'. `,' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚„ãƒ‘ãƒ¼ãƒˆã‚’ç”Ÿã®æ›¸å¼ã§ Message モードã«è¡¨ç¤ºã™ã‚‹ã€‚ `C-cTAB' メッセージ全体をファイルã¨ã—㦠read only ã§é–‹ã。 `C-uC-cTAB' メッセージ全体をファイルã¨ã—ã¦é–‹ã。  File: mew.ja.info, Node: cipher-viewing, Next: retrieving, Prev: analysis, Up: Viewing æš—å·ãƒ¡ãƒ¼ãƒ«ã‚„é›»å­ç½²åを表示ã™ã‚‹ ============================== 今ã¾ã§ã¨åŒæ§˜ `SPC' ãªã©ã‚’利用ã™ã‚‹ã“ã¨ã§ã€Mew ã§ã¯æš—å·åŒ–ã‚„é›»å­ç½²åã‚’æ–½ ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç°¡å˜ã«è¡¨ç¤ºã§ãã¾ã™ã€‚ã¾ãšã€ç°¡å˜ãªä¾‹ã‹ã‚‰ç´¹ä»‹ã—ã¾ã—ょã†ã€‚ S03/18 神田パソコン館 è¦‹ç©æ›¸ |先日承りã¾ã—ãŸãƒŽãƒ¼ãƒˆPC E03/21 匿å希望 秘密ã®ãƒ¡ãƒ¼ãƒ« | 上記ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ã€ãれãžã‚Œ `S' マーク㨠`E' マークãŒä»˜ã„ã¦ã„ã¾ã™ã€‚ ã“れã¯ãれãžã‚Œã€æœ¬æ–‡å…¨ä½“ãŒç½²åã•れã¦ã„ã‚‹ã€ãŠã‚ˆã³ã€æš—å·åŒ–ã•れã¦ã„ã‚‹ã“㨠をæ„味ã—ã¾ã™ã€‚ PGP/MIME ã‚„ S/MIME ã§ã¯ã€ä¸€éƒ¨ã®ãƒ‘ートã«é›»å­ç½²åã‚’æ–½ã—ãŸã‚Šã€æš—å·åŒ–ã—ãŸã‚Š ã§ãã¾ã™ã€‚ã“ã®å ´åˆã“ã®ã‚ˆã†ãªãƒžãƒ¼ã‚¯ã¯ä»˜ãã¾ã›ã‚“。`S' マークや `E' マークãŒä»˜ãã®ã¯ã€æœ¬æ–‡å…¨ä½“ãŒå¯¾è±¡ã«ãªã£ã¦ã„ã‚‹å ´åˆã§ã™ã€‚ ã¾ãŸã€å˜ã«ç½²åã‚„æš—å·åŒ–ã¨ã„ã„ã¾ã—ãŸãŒã€ã“ã‚Œã¯æœ€çµ‚çš„ãªå‡¦ç†ãŒç½²åã‚„æš—å·åŒ– ã§ã‚ã£ãŸã“ã¨ã‚’æ„味ã—ã¦ã„ã¾ã™ã€‚やや複雑ãªè©±ã«ãªã‚Šã¾ã™ãŒã€ã‚‚ã—ã‹ã™ã‚‹ã¨å‰ è€…ã¯æœ¬æ–‡å…¨ä½“ã‚’æš—å·åŒ–ã—ãŸå¾Œã€ç½²åã—ãŸã®ã‹ã‚‚ã—れã¾ã›ã‚“ã—ã€å¾Œè€…ã¯ä¸€éƒ¨ã®ãƒ‘ー トã«ç½²åã—ã€ã•らã«å…¨ä½“ã‚’æš—å·åŒ–ã—ã¦ã„ã‚‹å¯èƒ½æ€§ã‚‚ã‚りã¾ã™ã€‚ 本文全体ã€ã‚ã‚‹ã„ã¯ã€ä¸€éƒ¨ã®ãƒ‘ãƒ¼ãƒˆãŒæš—å·åŒ–ã•れã¦ã„ã‚‹å ´åˆã€Mew ã¯ãƒ‘スフレー ズを訊ã„ã¦ãã¾ã™ã€‚パスフレーズを入力ã™ã‚‹éš›ã®æ³¨æ„事項ã«ã¤ã„ã¦ã¯ã€*Note start:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。入力ã•れãŸãƒ‘スフレーズã¯ã€ã‚ãªãŸã®ç§˜å¯†éµã‚’復 å·åŒ–ã™ã‚‹ã®ã«ä½¿ã‚れã¾ã™ã€‚ãã—ã¦ã€å¾©å·åŒ–ã•れãŸç§˜å¯†éµã«ã‚ˆã£ã¦ã€æš—å·åŒ–ã•れ ã¦ã„るメッセージを解ãã‚ã‘ã§ã™ã€‚ æš—å·ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã«ã¯ã€æš—å·åŒ–ã•ã‚ŒãŸæ•°ã ã‘パスフレーズを入力ã™ã‚‹ å¿…è¦ãŒã‚りã¾ã™ã€‚ã“れ㯠Mew ãŒå®‰å…¨ã‚’期ã—ã¦ã€é€šå¸¸ãƒ‘スフレーズをä¿å­˜ã—㪠ã„ã‹ã‚‰ã§ã™ã€‚ã‚‚ã—ã“れãŒã‚ãšã‚‰ã‚ã—ã„ãªã‚‰ã€Mew ã«ãƒ‘スフレーズをä¿å­˜ã•ã›ã‚‹ ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚詳ã—ãã¯ã€*Note password:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 パスフレーズをä¿å­˜ã—ãªã„通常ã®è¨­å®šã§ã‚‚ã€ä¸€æ—¦å¾©å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã— ã°ã‚‰ãä¿å­˜ã•れるã®ã§ã€2 回目ã®è¡¨ç¤ºã«ã¯ãƒ‘スフレーズを訊ã‹ã‚Œãªã„ã‹ã‚‚ã—れ ã¾ã›ã‚“。 一方ã€é€šä¿¡ç›¸æ‰‹ã®ç½²åを検証ã™ã‚‹ãŸã‚ã«ã¯ç›¸æ‰‹ã®å…¬é–‹éµãŒåˆ©ç”¨ã§ãれã°ã‚ˆã„ã® ã§ã€ãƒ‘スフレーズを訊ã‹ã‚Œã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。 Mew ã¯è‡ªå‹•çš„ã«é›»å­ç½²åを検証ã—ãŸã‚Šã€å…¥åŠ›ã•れãŸãƒ‘スフレーズを使ã£ã¦æš—å· ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å¾©å·åŒ–ã—ãŸã‚Šã—ã¦ã€å…ƒã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¾ã™ã€‚ãã“ã§ã€ãƒ¦ãƒ¼ ã‚¶ãŒç½²åã®å­˜åœ¨ã«æ°—ã¥ã‹ãªã„ã‹ã‚‚ã—れã¾ã›ã‚“ã—ã€ã©ã®éƒ¨åˆ†ãŒæš—å·åŒ–ã•れã¦ã„㟠ã®ã‹åˆ†ã‹ã‚‰ãªã„ã‹ã‚‚ã—れã¾ã›ã‚“。 ãã“ã§ã€æ¤œè¨¼ã®çµæžœã‚„ã©ã®éƒ¨åˆ†ãŒæš—å·åŒ–ã•れã¦ã„ã‚‹ã‹ã‚’ユーザã«é€šçŸ¥ã™ã‚‹ãŸã‚ ã«ã€Mew ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ãƒ˜ãƒƒãƒ€ã« X-Mew: フィールドを挿入ã—ã¾ã™ã€‚ X-Mew: PGP decrypted. Good PGP sign "kazu@example.org" COMPLETE "<>" 内ã®ç•ªå·ã¯ã€ã©ã®ãƒ‘ートã®çµæžœã§ã‚ã‚‹ã‹ã‚’示ã—ã¦ã„ã¾ã™ã€‚"body" ã¯ã€ãƒ¡ãƒƒ ã‚»ãƒ¼ã‚¸ã®æœ¬æ–‡å…¨ä½“ãŒä¿è­·ã•れã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ã“ã®ä¾‹ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ ジ全体㌠kazu ã«ã‚ˆã£ã¦ç½²åã•れã€å—信者ã®ãŸã‚ã«æš—å·åŒ–ã•れã¦ã„ã¾ã™ã€‚Mew ã¯ã¾ãšã“れを復å·åŒ–ã—ã€ãã—ã¦ç½²åを検証ã—ã¦ã„ã¾ã™ã€‚ç½²åã¯æ­£ã—ã„ã®ã§ã€ kazu@example.org ã¨ã„ㆠID ã®ä»˜ã„ãŸç§˜å¯†éµã§ç½²åã•れãŸã¨ãã‹ã‚‰ã€å†…容㯠変更ã•れã¦ã„ãªã„ã¨åˆ†ã‹ã‚Šã¾ã™ã€‚ã“ã®ç½²åã®æ¤œè¨¼ã«ä½¿ã‚れãŸå…¬é–‹éµã®ã€Œæœ‰åŠ¹æ€§ã€ ã¯ "complete" ã§ã™ã€‚よã£ã¦ã€å—信者ã¯ã“ã®å…¬é–‹éµãŒ ID ãŒç¤ºã™ãƒ¦ãƒ¼ã‚¶ã«å±žã— ã¦ã„ã‚‹ã¨ä¿¡é ¼ã—ã¦ã„ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ã¤ã¾ã‚Šã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ä¿¡é ¼ã‚’ãŠã„ ã¦ã„る公開éµã«ã‚ˆã£ã¦æ¤œè¨¼ã•ã‚ŒçµæžœãŒæ­£ã—ã„ã®ã§ã€æ”¹ç«„ã•れã¦ã„ãªã„ã¨ã„ã†ã“ ã¨ã«ãªã‚Šã¾ã™ã€‚ 以下ã®ä¾‹ã§ã¯ã€ã¾ãšãƒžãƒ«ãƒãƒ‘ートã§ã‚る本文全体ã®é›»å­ç½²åãŒæ¤œè¨¼ã•れã€ã㮠後パート 2 ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸å…¨ä½“ãŒå¾©å·åŒ–ã•れã¦ã„ã¾ã™ã€‚ã¤ã¾ã‚Šã€ä½œæˆæ™‚ã«ã¯ã€ ã¾ãšãƒ‘ート 2 ãŒæš—å·åŒ–ã•れã€ãã—ã¦æœ¬æ–‡å…¨ä½“ãŒç½²åã•れãŸã“ã¨ãŒåˆ†ã‹ã‚Šã¾ã™ã€‚ X-Mew: Good PGP sign "kazu@example.org" COMPLETE X-Mew: <2 message> PGP decrypted. ã™ã‚‹ã©ã„人ãªã‚‰ã€æ‚ªã„人ãŒã‚らã‹ã˜ã‚ X-Mew: フィールドを挿入ã—ã¦ãŠãã€ã‚ ãªãŸã‚’ã ã¾ã™ã‹ã‚‚ã—れãªã„ã¨æ€ã†ã‹ã‚‚ã—れã¾ã›ã‚“。ã§ã‚‚大丈夫ã§ã™ã€‚Mew ã¯ã€ ヘッダã«ã‚ã‚‹ X-Mew: ã‚’ã‚らã‹ã˜ã‚å‰Šã‚Šã€æœ¬ç‰©ã® X-Mew: フィールドを挿入㗠ã¾ã™ã‹ã‚‰ã€‚ PGP/MIME ã«ã¤ã„ã¦ï¼š X-Mew: フィールドã¯ä»–ã«ã‚‚ã•ã¾ã–ã¾ãªçµæžœã‚’ä¼ãˆã¦ãれã¾ã™ã€‚ãŸã¨ãˆã°ã€ç½² åを検証ã™ã‚‹ãŸã‚ã®å…¬é–‹éµãŒãªã„ã¨ã‹ã€å¾©å·åŒ–ã«å¤±æ•—ã—ãŸãªã©ã§ã™ã€‚以下ã®ä¾‹ ã¯ã€éµ ID ㌠0x1B8BF431 ã§ã‚る公開éµãŒãªã„ã“ã¨ã‚’示ã—ã¦ã„ã¾ã™ã€‚ X-Mew: No his/her public key. ID = 0x1B8BF431 ã“ã®å ´åˆã€`C-cC-f' ã¨å…¥åŠ›ã™ã‚‹ã¨ã€Mew ã¯ã“ã®å…¬é–‹éµã®å…¥æ‰‹ã‚’試ã¿ã¾ã™ã€‚ã ã®éš›ã€å…¬é–‹éµã‚µãƒ¼ãƒã‚’é¸æŠžã§ãã¾ã™ã€‚ã‚‚ã—ã€X-Mew: フィールドãŒãªã„å ´åˆã¯ã€ `C-cC-f' 㯠From: ã‚’ ID ã¨è€ƒãˆã¾ã™ã€‚ã¾ãŸã€`C-uC-cC-f' ã¯ã€X-Mew: フィー ルドã«åŠ ãˆã¦ `mew-x-pgp-key-list' ã«æŒ‡å®šã•れãŸãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã‚‚éµ ID を切り 出ã™å¯¾è±¡ã¨ã—ã€å…¬é–‹éµã®å…¥æ‰‹ã‚’試ã¿ã¾ã™ã€‚ Mew ã§ã¯ PGPv2ã€PGPv5ã€GNUPG ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚ã“れら㯠Summary モード ã«ãŠã„ã¦ã€`C-cC-v' ã§åˆ‡æ›¿ãˆå¯èƒ½ã§ã™ã€‚ã“れら複数㮠PGP を使ã„ãŸã„人㯠`mew-prog-pgp2'ã€`mew-prog-pgp5'ã€`mew-prog-gpg' ã«å¯¾ã—ã€ãれãžã‚Œ PGPv2ã€PGPv5ã€GNUPG ã®ã‚³ãƒžãƒ³ãƒ‰åを設定ã—ã¦ä¸‹ã•ã„。ã¾ãŸã€Mew ã®èµ·å‹•直後 ã«åˆ©ç”¨ã™ã‚‹ PGP ã®ã‚³ãƒžãƒ³ãƒ‰åã‚’ `mew-prog-pgp' ã«è¨­å®šã—ã¦ä¸‹ã•ã„。ãªãŠãƒ‘ スフレーズã¯ã€ãれãžã‚Œã® PGP ã«å¯¾ã—独立ã«ä¿å­˜ã•れã¾ã™ã€‚ ãªãŠæ˜”ãªãŒã‚‰ã® PGP メッセージã¯ã€è‡ªå‹•çš„ã«å‡¦ç†ã§ãã¾ã›ã‚“。ã“ã®ã‚ˆã†ãª PGPメッセージã«å¯¾ã—ã¦ã¯ã€`C-cC-z' ã§å¾©å·åŒ–ã‚„ç½²åã®æ¤œè¨¼ãŒã§ãã¾ã™ã€‚  File: mew.ja.info, Node: retrieving, Next: moving, Prev: cipher-viewing, Up: Viewing メッセージã®å–å¾— ================ メールボックスã¸åˆ°ç€ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ +inbox ã¸ã‚³ãƒ”ーã—一覧表示ã™ã‚‹ã«ã¯ã€ `i' を使ã„ã¾ã™ã€‚コピー元ã®ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã¯ `mew-mailbox-type' ã«ã‚ˆã£ã¦ 決りã¾ã™ã€‚(`M-x mew' を実行ã—ãŸéš›ã«ã€`mew-proto' ㌠`+' ã®å ´åˆã‚‚〠`mew-mailbox-type' ã«å¾“ã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚³ãƒ”ーã•れã¾ã™ã€‚) 以下ã«å–りㆠる値を示ã—ã¾ã™ã€‚ `'mbox' ローカルã®ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã€‚デフォルトã§ã¯ "incm" ã¨ã„ã†å¤–部コマン ドを使ã„ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹ã€‚設定方法ã¯ã€*Note configuration:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `'pop' POP サーãƒã€‚POP ã‚’ POP らã—ãä½¿ã†æ–¹æ³•。(åˆæœŸå€¤) `'imap' IMAP サーãƒã€‚IMAP らã—ããªã„利用方法ãªã®ã§ã€æŽ¨å¥¨ã•れã¦ã„ãªã„。 ローカル・フォルダã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸€è¦§ã‚’å†è¡¨ç¤ºã™ã‚‹ã«ã¯ã€`s' を使ã„ã¾ã™ã€‚ リモート・フォルダã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã€ã‚ã‚‹ã„ã¯å†å–å¾—ã™ã‚‹å ´åˆã«ã‚‚ `s' を使ã„ã¾ã™ã€‚IMAP やニュースã§ã¯ã€`i' ã¯åˆ©ç”¨ã›ãšã€`s' を使ã†ã®ãŒä¸€èˆ¬çš„ ã§ã™ã€‚ `s' を使ã†ã¨ç¯„囲を訊ã„ã¦ãã¾ã™ã€‚Mew ã§é‡è¦ãªç¯„å›²ã®æ„味を以下ã«ç¤ºã—ã¾ã™ã€‚ `update' 「Summary ãƒ¢ãƒ¼ãƒ‰ã®æœ€å¾Œã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æ¬¡ã€ã‹ã‚‰ã€Œãƒ•ã‚©ãƒ«ãƒ€å†…ã®æœ€å¾Œã® メッセージã€ã¾ã§ã€‚ã¤ã¾ã‚Šã€Summary モードã¨å®Ÿéš›ã®ãƒ•ォルダ内ã®ãƒ¡ãƒƒ セージã®å·®åˆ†ã€‚ `all' フォルダ内ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã™ã¹ã¦ã€‚ローカル・フォルダã§ã¯ã€Summary モー ドã®è¡¨ç¤ºãŒãŠã‹ã—ããªã£ãŸã¨ãã«ã€å†…容を一新ã™ã‚‹ãŸã‚ã«ç”¨ã„る。リモー ト・フォルダã§ã¯ã€ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å†å–得。 `sync' ã‚るリモート・フォルダã«å¯¾ã—ã€ã‚µãƒ¼ãƒå´ã§ã¯æ¶ˆãˆãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚­ãƒ£ãƒƒ シュを削除ã™ã‚‹ã€‚リモート・フォルダã«å¯¾ã—ã¦ã®ã¿æœ‰åŠ¹ã€‚ +draftã€+queueã€+postq ã§ã¯ã€ãƒ‡ãƒ•ォルトã®ç¯„囲㯠`all' ã¨ãªã£ã¦ã„ã¾ã™ã€‚ ãれ以外ã®ãƒ•ォルダã§ã¯ã€ãƒ‡ãƒ•ォルトã®ç¯„囲㌠`update' ã¨ãªã£ã¦ã„ã¾ã™ã€‚ã§ ã™ã‹ã‚‰ã€+draftã€+queueã€+postq 以外ã§ã¯ã€`s' ã®å¾Œã« `RET' を押ã™ã ã‘ã§ã€ ç¾åœ¨ã®ãƒ•ォルダã«å¯¾ã—最新ã®ä¸€è¦§ã‚’得られるã“ã¨ã«ãªã‚Šã¾ã™ã€‚ Mew ã§ã¯ã‚ã¾ã‚Šé‡è¦ã§ã¯ã‚りã¾ã›ã‚“ãŒã€ä»¥ä¸‹ã®ç¯„囲も指定ã§ãã¾ã™ã€‚ `-' ã‹ã‚‰ ã¾ã§ã€‚ローカル・フォルダã«å¯¾ã—ã¦ã®ã¿æœ‰åŠ¹ã€‚ `-' ã‹ã‚‰æœ€å¾Œã¾ã§ã€‚ローカル・フォルダã«å¯¾ã—ã¦ã®ã¿æœ‰åŠ¹ã€‚ `-' 最åˆã‹ã‚‰ ã¾ã§ã€‚ローカル・フォルダã«å¯¾ã—ã¦ã®ã¿æœ‰åŠ¹ã€‚ `last:' 最後㮠個。 リモート・フォルダ㧠`s' ã‚’ `C-u' 付ãã§å‘¼ã³å‡ºã™ã¨ã€ã€Œãƒ˜ãƒƒãƒ€ã®ã¿ã®ã‚³ ピーã€ã¨ã€Œãƒ˜ãƒƒãƒ€ã¨æœ¬æ–‡ã®ä¸¡æ–¹ã®ã‚³ãƒ”ーã€ã‚’å転ã§ãã¾ã™ã€‚ã“れらã®å‹•作ã¯ã€ POPã€IMAPã€NNTP ã«å¯¾ã—ã€ãれãžã‚Œ `mew-pop-header-only'〠`mew-imap-header-only'ã€`mew-nntp-header-only' ã§å®šç¾©ã§ãã€åˆæœŸå€¤ã¯ã™ ã¹ã¦ `nil' ã§ã™ã€‚ã¤ã¾ã‚Šã€åˆæœŸå€¤ã¯ã€Œãƒ˜ãƒƒãƒ€ã¨æœ¬æ–‡ã®ä¸¡æ–¹ã®ã‚³ãƒ”ーã€ã«ãªã£ ã¦ã„ã¾ã™ã€‚ サイズãŒå¤§ããªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€å…¨ä½“ã§ã¯ãªã一部ãŒå–å¾—ã•れã¦ã„ã‚‹ã‹ã‚‚ã—れ㾠ã›ã‚“。ã“ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ã€`T' マークãŒã¤ã„ã¦ã„ã¾ã™ã€‚ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ ジã®å…¨ä½“ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä¸Šã§ `I' ã¨å…¥åŠ›ã—ã¾ã™ã€‚ ãŸã¨ãˆã°ã€$inbox ã« `T' マークã®ã¤ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚ã‚‹ã¨ã—ã¾ã—ょã†ã€‚ã“ ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸Šã§ `I' を押ã™ã¨ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å…¨ä½“ãŒå–å¾—ã§ãã¾ã™ã€‚ メッセージã®å–å¾—ã«é–¢ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’以下ã«ã¾ã¨ã‚ã¾ã™ã€‚ `i' ローカル・フォルダã§ã¯ã€+inbox フォルダã«ç§»å‹•ã—ã€åˆ°ç€ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å– å¾—ã—ã¦ä¸€è¦§ã‚’表示ã™ã‚‹ã€‚`mew-auto-flush-queue' ㌠`t' ãªã‚‰ã€ +queue ã«ã‚るメッセージをé€ä¿¡ã™ã‚‹ã€‚詳ã—ãã¯ã€*Note send:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ リモート・フォルダã§ã¯ã€ãã®ãƒ‡ãƒ•ォルトã®ãƒ•ォルダã«ç§»å‹•ã—ã€`s' + `update' を実行ã™ã‚‹ã€‚ `C-ui' `mew-auto-flush-queue' ã®å€¤ã‚’逆ã ã¨æ€ã£ã¦ã€`i' を実行ã™ã‚‹ã€‚ `I' `T' マークã®ä»˜ã„ã¦ã„る一部ã ã‘ãŒå–å¾—ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å…¨ä½“ã‚’å–å¾— ã™ã‚‹ã€‚ ローカル・フォルダã§å®Ÿè¡Œã—ãŸå ´åˆã€ã‚±ãƒ¼ã‚¹ã¨ `mew-mailbox-type' 㫠よりå–å¾—æ–¹æ³•ãŒæ±ºã‚‹ã€‚`mew-pop-delete' ã¾ãŸã¯ `mew-imap-delete'ã®å€¤ ㌠`t' ãªã‚‰ã€ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’削除ã™ã‚‹ã€‚ リモート・フォルダã§å®Ÿè¡Œã—ãŸå ´åˆã€ã‚±ãƒ¼ã‚¹ã¨å–得方法ã¯ãã®ãƒ•ォルダ ã‹ã‚‰æ±ºã‚‹ã€‚サーãƒå´ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯å¸¸ã«ä¿å­˜ã•れる。 `C-uI' `mew-pop-delete' ã¾ãŸã¯ `mew-imap-delete' を逆転ã•ã›ã¦ `I' を実行 ã™ã‚‹ã€‚ `s' フォルダã®ä¸€è¦§ã‚’å–る。 `C-us' リモート・フォルダã«ãŠã„ã¦ã€ã€Œãƒ˜ãƒƒãƒ€ã®ã¿ã®ã‚³ãƒ”ーã€ã¨ã€Œãƒ˜ãƒƒãƒ€ã¨æœ¬ æ–‡ã®ä¸¡æ–¹ã®ã‚³ãƒ”ーã€ã‚’å転ã•ã›ã¦ã€ä¸€è¦§ã‚’å–る。 `lc' リモート・フォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ローカル・フォルダã¸ã‚³ãƒ”ーã™ã‚‹ã€‚  File: mew.ja.info, Node: moving, Next: sum-write, Prev: retrieving, Up: Viewing フォルダã®ç§»å‹• ============== フォルダã®ç§»å‹•ã«ã¯ `g' を入力ã—ã¦ä¸‹ã•ã„。以下ã®ã‚ˆã†ã«ãƒ•ォルダåを訊㋠れã¾ã™ã€‚ Folder name (+inbox): + ":" ã®å³å´ã‚’編集å¯èƒ½é ˜åŸŸã¨å‘¼ã¶ã“ã¨ã«ã—ã¾ã—ょã†ã€‚ã“ã®ä¾‹ã§ã¯ã€ç·¨é›†å¯èƒ½é ˜ 域ã«ä¿®é£¾å­ "+" ãŒè¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚修飾å­ã«ç¶šã‘ã¦ä»»æ„ã®æ–‡å­—列を入力ã—〠`RET' を押ã›ã°ã€ãƒ•ォルダåãŒæ±ºå®šã•れãŸã“ã¨ã«ãªã‚Šã€ãã®ãƒ•ォルダã¸ç§»å‹•ã— ã¾ã™ã€‚ フォルダを移動ã—ãŸéš›ã« Summary モードã®ä¸€è¦§ãŒå¤ã„ã¨åˆ¤æ–­ã—ãŸå ´åˆã¯ã€è‡ª å‹•çš„ã«å·®åˆ†ãŒè¿½åŠ è¡¨ç¤ºã•れã¾ã™ã€‚ "()" 内ãŒãƒ‡ãƒ•ォルトã®ãƒ•ォルダã§ã™ã€‚å˜ã« `RET' を押㗠"+" を入力ã™ã‚‹ã¨ã€ デフォルトã®ãƒ•ォルダを入力ã—ãŸã‚‚ã®ã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚ 補完を利用ã™ã‚‹ã«ã¯ã€`TAB' ã‚„ `SPC' を押ã—ã¦ä¸‹ã•ã„。 ã•ã¦ã€è©±ã‚’ `g' を押ã—ãŸç›´å¾Œã«æˆ»ã—ã¾ã—ょã†ã€‚ Folder name (+inbox): + ãŸã¨ãˆã°ã€"+" ã‚’ "%" ã«å¤‰æ›´ã™ã‚‹ã«ã¯ã€é€šå¸¸ãªã‚‰ "+" を削りã€"%" を入力㙠る必è¦ãŒã‚りã¾ã™ã€‚ã“れã§ã¯é¢å€’ãªã®ã§ã€"+" ã®å¾Œã§ "%" を入力ã™ã‚‹ã¨ã€"+" ㌠"%" ã«ç½®ãæ›ã‚るよã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ã“ã®ã‚ˆã†ã«ã€ä¿®é£¾å­ã®ç›´å¾Œã§ä»–㮠修飾å­ã‚’入力ã™ã‚Œã°ã€å‰Šã‚‹ä½œæ¥­ã‚’ã›ãšã«ç½®ãæ›ãˆå¯èƒ½ã§ã™ã€‚ リモート・フォルダを入力ã™ã‚‹å ´åˆã€*Note config:: ã§èª¬æ˜Žã™ã‚‹ã‚±ãƒ¼ã‚¹ã‚’指 定ã—ãŸã„å ´åˆã‚‚ã‚ã‚‹ã§ã—ょã†ã€‚ケースã¯ã€ãƒ•ォルダåã®å‰ã« ":" ã§åŒºåˆ‡ã£ã¦ 入力ã—ã¾ã™ã€‚ãŸã¨ãˆã°ã€"home" ã¨ã„ã†ã‚±ãƒ¼ã‚¹ã® "%inbox" ã«ç§»å‹•ã—ãŸã„ã¨ã— ã¾ã—ょã†ã€‚ã“ã®ã¨ãã€"home:%inbox" ã¨å…¥åŠ›ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã—ã‹ã—ã“れ ã¯é¢å€’ãªã®ã§ã€ä»»æ„ã®å ´æ‰€ã§ `C-cTAB' を押ã™ã¨åˆ©ç”¨å¯èƒ½ãªã‚±ãƒ¼ã‚¹ãŒã€ãƒ•ォル ダåã®å‰ã«å¾ªç’°çš„ã«è£œå®Œã•れã¾ã™ã€‚次ã®ä¾‹ã‚’考ãˆã¦ä¸‹ã•ã„。 Folder name (+inbox): %inbox ã“ã“ã§ `C-cTAB' を入力ã™ã‚‹ã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ Folder name (+inbox): home:%inbox フォルダåã®ä¸€éƒ¨ã‚’指定ã—ã¦ã€ãƒ•ォルダを検索ã—ãŸã„ã“ã¨ã‚‚ã‚ã‚‹ã§ã—ょã†ã€‚ã“ ã®å ´åˆã«ã¯ã€å‰æ–¹æ¤œç´¢ã® `C-s' ã‹å¾Œæ–¹æ¤œç´¢ã® `C-r' ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚以下ã¯ã€ `C-s' を押ã—ãŸã¨ãã®ãƒŸãƒ‹ãƒãƒƒãƒ•ã‚¡ã®çŠ¶æ…‹ã§ã™ã€‚ Folder name (+inbox): () 編集領域ã«ç¾ã‚ŒãŸ "()" ãŒã€æ¤œç´¢ãƒ¢ãƒ¼ãƒ‰ã«ç§»è¡Œã—ãŸã“ã¨ã‚’表ã‚ã—ã¦ã„ã¾ã™ã€‚ã“ ã“ã§æ–‡å­—を入力ã—ã¦ã„ãã¨ã€ãƒžãƒƒãƒã—ãŸå€™è£œãŒ "()" ã®ä¸­ã«è¡¨ç¤ºã•れã¾ã™ã€‚以 下㯠"mew" ã§æ¤œç´¢ã—ãŸã¨ãã®ä¾‹ã§ã™ã€‚ Folder name (+inbox): (+work/mew-release) mew 候補を確定ã™ã‚‹éš›ã«ã¯ã€`RET' を入力ã—ã¦ä¸‹ã•ã„。ãã†ã™ã‚‹ã¨æ¤œç´¢ãƒ¢ãƒ¼ãƒ‰ã‚’抜 ã‘ã¦ã€ç·¨é›†é ˜åŸŸã«ã“ã®å€™è£œãŒè¡¨ç¤ºã•れã¾ã™ã€‚ Folder name (+inbox): +work/mew-release ã•ら㫠`RET' を押ã›ã°ã€ã“ã®ãƒ•ォルダãŒå…¥åŠ›ã•れãŸã“ã¨ã«ãªã‚Šã¾ã™ã€‚ 検索対象ã¨ãªã‚‹ãƒ•ォルダã®ä¸€è¦§ã¯ã€ã‚±ãƒ¼ã‚¹ã¨ä¿®é£¾å­ã®çµ„ã§æ±ºå®šã•れã¾ã™ã€‚ `C-s' ã‚„ `C-r' ã§æ¤œç´¢ãƒ¢ãƒ¼ãƒ‰ã«ç§»ã‚‹ã¨ãã«ç·¨é›†é ˜åŸŸã«ã‚る文字列ã‹ã‚‰ã€ã‚±ãƒ¼ スã¨ä¿®é£¾å­ãŒåˆ‡ã‚Šå‡ºã•れã€ãƒ•ォルダã®ä¸€è¦§ãŒæ±ºå®šã•れる訳ã§ã™ã€‚  File: mew.ja.info, Node: sum-write, Next: features, Prev: moving, Up: Viewing é€ä¿¡ã€è¿”ç­”ã€è»¢é€ ================ メッセージã®é€ä¿¡ã€è¿”ç­”ã€è»¢é€ã«ã¯ã€ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’使ã„ã¾ã™ã€‚ `w' メッセージを書ã。新ã—ã„è‰ç¨¿ãŒ Draft モードã«ç”¨æ„ã•れる。 *Note Composing:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `C-uw' メッセージを書ã。新ã—ã„è‰ç¨¿ãŒ Draft モードã«ç”¨æ„ã•れる。ç¾åœ¨ã®ãƒ¡ãƒƒ セージ㮠From: ã«ã‚るアドレスãŒã€è‰ç¨¿ã® To: ã¸ã‚³ãƒ”ーã•れる。 `W' ã‚るメッセージã®ãƒ˜ãƒƒãƒ€ã®ä¸€éƒ¨ã ã‘を編集ã—メッセージをé€ä¿¡ã™ã‚‹ãŸã‚ ã« Header モードã«å…¥ã‚‹ã€‚*Note resend:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `a' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«è¿”ç­”ã™ã‚‹ã€‚Draft モードã«è‰ç¨¿ãŒç”¨æ„ã•れã€To: ã‚„ Cc: ãŒè‡ªå‹•çš„ã«æ±ºå®šã•れる。*Note reply:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `C-ua' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—é€ä¿¡è€…å®›ã«è¿”ç­”ã™ã‚‹ã€‚ `A' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«è¿”ç­”ã™ã‚‹ã€‚Draft モードã«è‰ç¨¿ãŒç”¨æ„ã•れã€To: ã‚„ Cc: ãŒè‡ªå‹•çš„ã«æ±ºå®šã•れãŸå¾Œã€æœ¬æ–‡ãŒå¼•用ã•れる。*Note reply:: ã‚’å‚ ç…§ã®ã“ã¨ã€‚ `C-uA' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã€å¼•用付ãã§é€ä¿¡è€…å®›ã«è¿”ç­”ã™ã‚‹ã€‚ `f' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’第 3 者ã«è»¢é€ã™ã‚‹ã€‚Draft モードã«è‰ç¨¿ãŒç”¨æ„ã•れ〠ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè‡ªå‹•çš„ã«æ·»ä»˜ã•れる。*Note forward:: ã‚’å‚ç…§ã®ã“ ã¨ã€‚ `F' `*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’第 3 者ã«è»¢é€ã™ã‚‹ã€‚Draft モードã«è‰ 稿ãŒç”¨æ„ã•れã€`*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè‡ªå‹•çš„ã«æ·»ä»˜ã•れる。 詳ã—ã㯠*Note target mark:: ã‚’å‚ç…§ã®ã“ã¨ã€‚*Note forward:: ã‚’å‚ç…§ ã®ã“ã¨ã€‚ エラーメッセージãŒè¿”ã£ã¦ããŸã‚‰ã€ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ã§ä¿®æ­£ã—冿Œ‘戦ã—ã¾ã—ょã†ã€‚ `E' メッセージã®å†ç·¨é›†ã€‚ã¾ãŸã¯ã€MIME å½¢å¼ã§ã‚«ãƒ—セル化ã•ã‚Œã¦æˆ»ã£ã¦ã㟠メッセージã®å†ç·¨é›†ã€‚ 1. +draft ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå˜ã«ç·¨é›†ã•れる。 2. +queue 㨠+postq ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒ +draft ã«ç§»å‹•ã•れã¦ã€ç·¨ 集ã•れる。 3. ãれ以外ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒ +draft ã«ã‚³ãƒ”ーã•れã¦ã€ç·¨é›†ã•れる。 +draftã€+queueã€+postq ã§ã¯ã€ã‚±ãƒ¼ã‚¹ãŒå¾©æ´»ã™ã‚‹ã€‚ ä»–ã®ãƒ•ォルダã§ã¯ã€`mew-case-guess-when-prepared' ㌠`t' ãªã‚‰ã€ ヘッダã®ãれãžã‚Œã®ãƒ•ィールドãŒã‚±ãƒ¼ã‚¹ã«å¾“ã£ã¦ç½®ãæ›ãˆã‚‰ã‚Œã‚‹ã€‚詳ã—ã㯠*Note config:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `C-uE' `E' ã¨åŒã˜ã€‚ãŸã ã—ã€+draftã€+queueã€+postq 以外ã®ãƒ•ォルダã§åˆ©ç”¨ã• れãŸå ´åˆã¯ã€`mew-case-guess-when-prepared' ㌠`t' ã§ã‚‚ã€ã‚ªãƒªã‚¸ãƒŠ ルã®ãƒ˜ãƒƒãƒ€ãŒä¿å­˜ã•れる。  File: mew.ja.info, Node: features, Next: status-update, Prev: sum-write, Up: Viewing ä¾¿åˆ©ãªæ©Ÿèƒ½ ========== Mew ã§ã¯ã€Summary モードã«ä»¥ä¸‹ã®ã‚ˆã†ãªä¾¿åˆ©ãªã‚³ãƒžãƒ³ãƒ‰ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚ `v' 「Summary モードã®ã¿ã€ã¨ã€ŒSummary & Message モードã€ã®åˆ‡ã‚Šæ›¿ãˆã€‚ 「Summary モードã®ã¿ã€ã‚’é¸ã‚“ã§ã„ã‚‹å ´åˆã¯ã€`d' ã¯æ¬¡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ 表示ã—ãªã„ã®ã§ã€é€£ç¶šã—ã¦ã™ã°ã‚„ã `D' マークを付ã‘られる。 `zv' `mew-use-header-veil' ㌠`nil' ã§ãªã„ã¨ãã€To: 㨠Cc: ã§ `mew-header-veil-count' ã‚’è¶Šãˆã‚‹è¡Œã¯ã€Œãƒ™ãƒ¼ãƒ«ã€ã§éš ã•れã¦ã„る。㓠ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ãれらã®è¡Œã®è¦‹ãˆã‚‹ï¼è¦‹ãˆãªã„ã‚’å転ã•ã›ã‚‹ã€‚ `mew-use-header-veil' 㨠`mew-header-veil-count' ã®åˆæœŸå€¤ã¯ã€ãれ ãžã‚Œ `t' 㨠4。 `_' 通常ã®è¡Œã€æŠ˜ã‚Šè¿”ã•れãŸè¡Œã€é•·ã„行ã®é †ã«è¡Œã®è¡¨ç¤ºã‚’変ãˆã‚‹ã€‚ `M-l' ç¾åœ¨ã®è¡Œã‚’ Summary モードã®ä¸­å¤®ã«ç§»å‹•ã•ã›ã‚‹ã€‚ `C-cC-s' Message モードã§é †æ–¹å‘段階的検索。 `C-cC-r' Message モードã§é€†æ–¹å‘段階的検索。 `y' メッセージã€ã‚ã‚‹ã„ã¯ã€ãƒ‘ートを入力ã—ãŸãƒ•ァイルåã§ä¿å­˜ã™ã‚‹ã€‚ `b' Message モードã®å†…容ãã®ã‚‚ã®ã‚’入力ã—ãŸãƒ•ァイルåã§ä¿å­˜ã™ã‚‹ã€‚ `C-uy' ä¿å­˜ã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆã® coding-system を指定ã—ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€ã‚ã‚‹ã„ã¯ã€ パートを入力ã—ãŸãƒ•ァイルåã§ä¿å­˜ã™ã‚‹ã€‚ `#' `mew-print-function' を利用ã—㦠Message モードã®å†…容をå°åˆ·ã™ã‚‹ã€‚ `C-u#' プリンタåを指定ã—㦠Message モードã®å†…容をå°åˆ·ã™ã‚‹ã€‚ `|' Message モードã®å†…å®¹ã‚’ãƒ‘ã‚¤ãƒ—ã§æŒ‡å®šã•れãŸã‚³ãƒžãƒ³ãƒ‰ã«å‡ºåŠ›ã™ã‚‹ã€‚ `C-u|' Message ãƒ¢ãƒ¼ãƒ‰ã®æœ¬æ–‡(ヘッダを除ã)ã‚’ãƒ‘ã‚¤ãƒ—ã§æŒ‡å®šã•れãŸã‚³ãƒžãƒ³ãƒ‰ã« 出力ã™ã‚‹ã€‚ `\' ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’引数ã«ã—ã¦ã€å…¥åŠ›ã•れãŸå¤–部コマンドを起動ã™ã‚‹ã€‚ `B' æ ¼ç´ã•れã¦ã„るメッセージをå–り出ã™ã€‚ `C-uB' æ ¼ç´ã•れã¦ã„るファイルをå–り出ã™ã€‚ `C-cC-a' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æƒ…報をアドレス帳ã«ç™»éŒ²ã™ã‚‹(*Note addrbook::)。 `C-cC-v' PGP ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’切替ãˆã‚‹(*Note cipher-viewing::)。 `C-cC-z' 昔ãªãŒã‚‰ã®è‡ªå‹•処ç†ã§ããªã„ PGP メッセージを PGP ã«å¾©å·åŒ–ã€æ¤œè¨¼ã• ã›ã‚‹(*Note cipher-viewing::)。 `C' ケースを変更ã™ã‚‹ã€‚詳ã—ãã¯ã€*Note config:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `=' フォルダåã¨ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ç•ªå·ã‚’表示ã™ã‚‹ã€‚キャッシュ・メッセージã®å ´ åˆã¯ã€åŠ ãˆã¦ ID ã¨ã‚µã‚¤ã‚ºã‚‚表示ã™ã‚‹ã€‚メッセージã¸ã®ãƒ•ルパスãŒã€ã‚¦ インドウマãƒãƒ¼ã‚¸ãƒ£ã®ã‚«ãƒƒãƒˆãƒãƒƒãƒ•ã‚¡ã«å…¥ã‚‹ã€‚ `;' Received: フィールドを解æžã—ã€åˆ†ã‚Šã‚„ã™ã Message モードã«è¡¨ç¤ºã™ã‚‹ã€‚ `Rd' フォルダを削除ã™ã‚‹ã€‚ `Rr' フォルダã®åå‰ã‚’変ãˆã‚‹ã€‚  File: mew.ja.info, Node: status-update, Next: invalid, Prev: features, Up: Viewing çŠ¶æ…‹ã®æ›´æ–° ========== ã„ãã¤ã‹ã®è¨­å®šã®å¤‰æ›´ã«ã¯ã€ãã®å¤‰æ›´ã‚’åæ˜ ã™ã‚‹ãŸã‚ã«ã€çŠ¶æ…‹ã‚’æ›´æ–°ã—ãªã‘れ ã°ãªã‚‰ãªã„å ´åˆãŒã‚りã¾ã™ã€‚変更ãŒå映ã•れãªã‹ã£ãŸã‚Šã€å¤‰æ›´ã®ãŸã‚ã«ã‚¨ãƒ©ãƒ¼ ãŒç”Ÿã˜ã‚‹ã‚ˆã†ã«ãªã£ãŸã‚Šã—ãŸå ´åˆã¯ã€ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’利用ã—ã¦ä¸‹ã•ã„。 `Z' アドレス帳(*Note addrbook::)ãªã©ã®æƒ…報を更新ã™ã‚‹ã€‚ `C-uZ' ç¾åœ¨ã®ä¸–界ã«å¯¾ã™ã‚‹ãƒ•ォルダã®ãƒªã‚¹ãƒˆã®æƒ…報を更新ã™ã‚‹ã€‚ 状態をå転ã•ã›ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’以下ã«ã¾ã¨ã‚ã¾ã™ã€‚ `z8' 8 ビット・モード(`mew-use-8bit')ã‚’å転ã•ã›ã‚‹ã€‚ `zc' è§£æžã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去ã™ã‚‹ã€‚ `zd' `mew-debug' ã‚’å転ã•ã›ã‚‹ã€‚ `zo' PGP ã‚’çœç•¥æ–¹æ³•ã§ä½œæˆã™ã‚‹å ´åˆã€PGP/MIME ãªã®ã‹å¤ã„ PGP ã®æ›¸å¼ãªã® ã‹(`mew-use-old-pgp')ã‚’å転ã•ã›ã‚‹ã€‚ `zp' è§£æžã€å¾©å·åŒ–ã®ãƒãƒªã‚·(`mew-decode-broken')ã‚’å転ã•ã›ã‚‹ã€‚ `zv' Message モードã§ãƒ™ãƒ¼ãƒ«ã‚’使ã†ã‹å¦ã‹(`mew-use-header-veil')ã‚’å転㕠ã›ã‚‹ã€‚ `zw' 警告ã®ãƒ¬ãƒ™ãƒ«(`mew-warning-field-level')㌠2 ãªã‚‰ 1 ã¸ã€1 ãªã‚‰ 2 ã¸è¨­å®šã™ã‚‹ã€‚  File: mew.ja.info, Node: invalid, Next: Composing, Prev: status-update, Up: Viewing è¦æ ¼é•åã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ ==================== 以下ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€Content-Type: ã§ charset ãŒæŒ‡å®šã•れã¦ã„ãªã„ ã®ã§ã€æœ¬æ¥ US-ASCII ã¨èªè­˜ã•れã¦ã—ã¾ã„ã¾ã™ã€‚ To: piglet Subject: è¦æ ¼é•åã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ From: pooh MIME-Version: 1.0 Content-Type: Text/Plain æ—¥æœ¬èªžã®æœ¬æ–‡ ã¾ãŸä»¥ä¸‹ã®ã‚ˆã†ãªãƒ˜ãƒƒãƒ€ã‚‚è¦æ ¼é•åã§ã™ã€‚ From: "=?iso-2022-jp?B?GyRCOzNLXE9CSScbKEI=?=" 上ã®ä¾‹ã§ã¯ "=?" 㨠"?=" ã§å›²ã¾ã‚ŒãŸéƒ¨åˆ†ã¯ã‚‚ã¨ã‚‚ã¨æ—¥æœ¬èªžã§ã—ãŸã€‚メッセー ジã®è¦æ ¼ã§ã¯ãƒ˜ãƒƒãƒ€ã«ã¯ ASCII ã®ã¿ãŒæ ¼ç´ã§ãã‚‹ã¨å®šã‚られã¦ã„ã¾ã™ã€‚よ㣠ã¦ã€ASCII ä»¥å¤–ã®æ–‡å­—ã‚³ãƒ¼ãƒ‰ã‚’ãƒ˜ãƒƒãƒ€ã«æ ¼ç´ã™ã‚‹ã«ã¯ã€ã‚ã‚‹è¦å‰‡ã«å¾“ã£ã¦ ASCII ã«ç¬¦å·åŒ–ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã—ã‹ã—ã€ã“ã®ç¬¦å·åŒ–ã•ã‚ŒãŸæ–‡å­—列を 「"〠ã§å›²ã‚€ã®ã¯é–“é•ã„ã§ã™ã€‚「"ã€ã§å›²ã¾ã‚ŒãŸæ–‡å­—列ã¯ã€ãã®ã¾ã¾ã®å½¢ã§å–り扱゠れã¾ã™ã€‚よã£ã¦ã€ä¸Šã®ä¾‹ã® "=?" 㨠"?=" ã§å›²ã¾ã‚ŒãŸéƒ¨åˆ†ãŒæ—¥æœ¬èªžã«å¾©å·åŒ–㕠れるã“ã¨ã¯æœ¬æ¥ã‚りã¾ã›ã‚“。 è¦æ ¼ã«ç„¡é “ç€ãªä¸€éƒ¨ã®ãƒ¡ãƒ¼ãƒ©ã§ã¯ã“ã®ã‚ˆã†ãªé–“é•ã„を平気ã§çНã—ã¾ã™ã€‚æ­£ã—ㄠ対処方法ã¯ã€ã“ã®ã‚ˆã†ãªãƒ¡ãƒ¼ãƒ©ã®ä½œè€…ã«é ¼ã‚“ã§ã€è¦æ ¼ã‚’æ­£ã—ã実装ã™ã‚‹ã‚ˆã†ã« 変更ã—ã¦ã‚‚らã†ã“ã¨ã§ã™ã€‚ã—ã‹ã—ã€ã“ã®ã‚ˆã†ãªãƒ¡ãƒ¼ãƒ©ã¯ã‚ã¾ã‚Šã«ã‚‚多ã„ã®ã§ã€ Mew ã§ã¯ã§ãã‚‹é™ã‚Šå¾©å·åŒ–ã™ã‚‹ã‚ˆã†è©¦ã¿ã¾ã™ã€‚ãã—ã¦ã€ä»¥ä¸‹ã®ã‚ˆã†ãªè­¦å‘Šã‚’ヘッ ダã«å‡ºã—ã¾ã™ã€‚ X-Mew: Charset for body is not specified. To: has encoded-words in quoted text. ã‚‚ã—ã€è¦æ ¼ã«å޳坆ã«å¾©å·åŒ–ã—ãŸã„ã®ãªã‚‰ã€`mew-decode-broken' ã‚’ `nil' 㫠設定ã—ã¦ä¸‹ã•ã„。ã“ã®å€¤ã¯ `C-u.' を使ã†ã¨å‹•çš„ã«å転ã§ãã¾ã™(*Note singlepart:: ã‚’å‚ç…§)。 次ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€charset ã§æŒ‡ç¤ºã•れã¦ã„る文字コードã¨å®Ÿéš›ã®æ–‡å­— ãŒç•°ãªã‚‹ãŸã‚ã€æ–‡å­—化ã‘ã‚’èµ·ã“ã—ã¾ã™ã€‚ Content-Type: Text/Plain; charset=ISO-2022-JP Shift_JIS ã§æ›¸ã‹ã‚ŒãŸæ—¥æœ¬èªžã®æœ¬æ–‡ `C-cC-l' を使ãˆã°ã€charset ã§æŒ‡å®šã•ã‚ŒãŸæ–‡å­—コードを無視ã—ã€æŒ‡å®šã—ãŸè¨€ èªžã®æŽ¨æ¸¬è¦å‰‡ã«å¾“ã£ã¦æ–‡å­—コードを推測ã—ã€å†è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã¾ ãŸã€`C-uC-cC-l' ã§æ˜Žç¤ºçš„ã«æ–‡å­—コードを指定ã—ã€å†è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ ã™ã€‚  File: mew.ja.info, Node: Composing, Next: header, Prev: invalid, Up: Top メッセージを作æˆã™ã‚‹ ******************** ã“ã“ã§ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä½œæˆæ–¹æ³•ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ æ–°ã—ã„メッセージを書ããŸã‚ã«ã€Draft モードã«ç§»è¡Œã™ã‚‹ã«ã¯ã€æ¬¡ã®æ‰‹æ®µãŒã‚ りã¾ã™ã€‚ 1. `M-x mew-send' ã¨å…¥åŠ›ã™ã‚‹ã€‚ 2. `mail-user-agent' ãŒè¨­å®šã•れã¦ã„ã‚‹å ´åˆã€`C-xm' ã¨å…¥åŠ›ã™ã‚‹ã€‚ 3. Summary モード㧠`w' を押ã™ã€‚ ã™ã‚‹ã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ãªãƒãƒƒãƒ•ã‚¡ãŒç”¨æ„ã•れã¾ã™ã€‚ To: Subject: From: Kazu Yamamoto X-Mailer: Mew version 6.7 on Emacs 24.4 ---- ã“れを Draft モードã¨ã„ã„ã¾ã™ã€‚Draft モードã«ãŠã„ã¦ã€"----" より上をヘッ ダã€ä¸‹ã‚’本文ã¨å‘¼ã³ã¾ã™ã€‚ ã¾ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã®è¿”ç­”(`a' ã‚„ `A')や転é€(`f' ã‚„ `F')ã§ã‚‚ Summary モー ドã‹ã‚‰ Draft モードã¸ç§»è¡Œã—ã¾ã™ã€‚ è‰ç¨¿ã¯ã€+draft フォルダã®ä¸‹ã«ä½œæˆã•れã¾ã™ã€‚åŒæ™‚ã«è¤‡æ•°ã®è‰ç¨¿ã‚’æŒã¤ã“㨠ãŒå¯èƒ½ã§ã™ã€‚ 一旦用æ„ã—ãŸè‰ç¨¿ã‚’削除ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€*Note Quit:: ã‚’å‚ç…§ã—ã¦ä¸‹ã• ã„。 以下ã€Draft モードã®ä½¿ã„方を説明ã—ã¾ã™ã€‚ * Menu: * header:: ヘッダã®è£œå®Œ * cheader:: ヘッダã®å¾ªç’°çš„ãªè£œå®Œ * addr-comp:: アドレスã®è£œå®Œ * addrbook:: アドレス帳 * auto-alias:: アドレスã®è‡ªå‹•学習 * addr-comp1:: アドレスã®è£œå®Œ(1) * addr-comp2:: アドレスã®è£œå®Œ(2) * send:: メッセージã®é€ä¿¡ * cite:: シグニãƒãƒ£ã¨å¼•用 * mime-comp:: マルãƒãƒ‘ートã®ä½œæˆ * charset-guess:: æ–‡å­—ã‚³ãƒ¼ãƒ‰ã®æ±ºå®š * longline:: é•·ã„行ã®å–り扱ㄠ* reply:: メッセージã¸ã®è¿”ç­”ã¨å®›å…ˆã®æ±ºå®š * forward:: メッセージã®è»¢é€ * resend:: メッセージã®å†é€ * shortcut:: é›»å­ç½²å/æš—å·ãƒ¡ãƒ¼ãƒ«ã‚’作æˆã™ã‚‹ * mark-b-comp:: マークを使ã£ãŸé›»å­ç½²å/æš—å·ãƒ¡ãƒ¼ãƒ«ã®ä½œæˆ * pgp-key:: PGP ã®éµã®é…布 * anonymous:: 宛先を匿åã«ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€ä¿¡  File: mew.ja.info, Node: header, Next: cheader, Prev: Composing, Up: Composing ヘッダã®è£œå®Œ ============ ヘッダã§ã¯ `TAB' ã«å¯¾ã—ã€ä»¥ä¸‹ã®ã‚ˆã†ã«å„フィールド用ã®è£œå®Œæ©Ÿèƒ½ãŒå‰²ã‚Šå½“ ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚ - フィールドåã®è£œå®Œ - アドレスã®è£œå®Œ (To:ã€Cc: ãªã©) (*Note addr-comp:: ã‚’å‚ç…§) - フォルダåã®è£œå®Œ (Fcc:) <フィールドåã®è£œå®Œ> 行頭ã®å˜èªžä¸­ã§ã€ã—ã‹ã‚‚ã€ä¸Šã®è¡Œã®æœ€å¾ŒãŒ "," ã§çµ‚る継続行ã§ãªã‘れã°ã€ `TAB' ã§ `mew-fields' ã«å®šç¾©ã•れã¦ã„るフィールドåを補完ã§ãã¾ã™ã€‚ To: kazu@example.org R`TAB' 上記ã®å ´æ‰€ã§ `TAB' を押ã™ã¨ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ To: kazu@example.org Reply-To: <フォルダåã®è£œå®Œ> Fcc: ãªã©ã®ã‚ˆã†ã«ãƒ•ォルダを補完ã™ã¹ãã¨ã“ã‚ã§ã¯ã€`TAB' ã§ãƒ•ォルダを補 完ã§ãã¾ã™ã€‚以下ã«ä¾‹ã‚’挙ã’ã¦ã¿ã¾ã™ã€‚ Fcc: `TAB' "+" ãŒè£œå®Œã•れã¾ã™ã€‚ Fcc: +`TAB' `TAB' をもㆠ1 度押ã™ã¨å€™è£œãŒè¡¨ç¤ºã•れるã®ã§ã€å€™è£œã‚’見ãªãŒã‚‰é©åˆ‡ãªæ–‡å­— を入力ã—ã¾ã™ã€‚ Fcc: +b`TAB' 候補ãŒä¸€æ„ã«å®šã¾ã‚Œã°è£œå®Œã•れã¾ã™ã€‚ Fcc: +backup  File: mew.ja.info, Node: cheader, Next: addr-comp, Prev: header, Up: Composing ヘッダã®å¾ªç’°çš„ãªè£œå®Œ ==================== ヘッダã§ã¯ã€`C-cTAB' ã«å¾ªç’°çš„ãªè£œå®Œæ©Ÿèƒ½ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚循環的 ãªè£œå®Œæ©Ÿèƒ½ã¨ã¯ã€ã‚るリストã®ã‚る値ãŒãã®ãƒªã‚¹ãƒˆã®æ¬¡ã®å€¤ã«ç½®ãæ›ãˆã‚‰ã‚Œã‚‹ ã“ã¨ã§ã™ã€‚ãƒªã‚¹ãƒˆã®æœ€å¾Œã¯ã€æœ€åˆã«ã¤ãªãŒã£ã¦ã„ã‚‹ã¨è€ƒãˆã¾ã™ã€‚ヘッダ中ã®å¾ª ç’°çš„ãªè£œå®Œæ©Ÿèƒ½ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãƒ•ィールドã”ã¨ã«ç•°ãªã‚Šã¾ã™ã€‚ - ドメインåã®å¾ªç’°çš„ãªè£œå®Œ (To:ã€Cc: ãªã©) - From: ã®å¾ªç’°çš„ãªè£œå®Œ (From:) <ドメインåã®å¾ªç’°çš„ãªè£œå®Œ> アドレスを書ãã¹ãフィールドã§ã¯ã€`C-cTAB' ã§ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’補完ã—ã¾ã™ã€‚補 完ã®å€™è£œã¯ `mew-mail-domain-list' ã‹ã‚‰é¸ã°ã‚Œã¾ã™ã€‚ To: kazu@`C-cTAB' 上記ã®å ´æ‰€ã®ã‚ˆã†ã«å€™è£œãŒä¸€æ„ã«å®šã¾ã‚‰ãªã„å ´åˆã¯ã€ `mew-mail-domain-list' ã®æœ€åˆã®ãƒ‰ãƒ¡ã‚¤ãƒ³åãŒæŒ¿å…¥ã•れã¾ã™ã€‚ To: kazu@example.org`C-cTAB' 補完ã•れãŸå¾Œã€ã•ら㫠`C-cTAB' を押ã™ã¨ `mew-mail-domain-list' ã®æ¬¡ã®å€™ 補ã«å¤‰æ›ã—ã¾ã™ã€‚ To: kazu@example.jp ã¾ãŸã€ä»¥ä¸‹ã®è£œå®ŒãŒä¸€æ„ã«å®šã¾ã‚Œã°ã€ãã®å€™è£œã‚’挿入ã—ã¾ã™ã€‚ To: kazu@w`C-cTAB' 上記ã®ä¾‹ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ To: kazu@example.jp è‰ç¨¿ã«ã¯ã€ã‚らã‹ã˜ã‚ "mew-name " ã¨ã„ã†å½¢å¼ã§ã€ From: ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ãŒæŒ¿å…¥ã•れã¦ã„ã¾ã™ã€‚ From: Kazu Yamamoto (山本和彦) From: フィールド上ã§ã¯ã€`C-cTAB' 㯠`mew-from-list' ã®å€¤ã‚’循環的ã«è£œå®Œ ã—ã¾ã™ã€‚`mew-from-list' ã¯è‡ªåˆ†ã§è¨­å®šã—ã¦ã‚‚よã„ã§ã™ã—ã€è‡ªå‹•çš„ã«è¨­å®šã™ã‚‹ ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚自動設定ã«é–¢ã—ã¦ã¯ã€*Note config:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 値ã®å ´æ‰€ãªã‚‰ã©ã“ã§ã‚‚æ§‹ã„ã¾ã›ã‚“ãŒã€`C-cTAB' ã¨å…¥åŠ›ã™ã‚‹ã¨ã€ã“ã®å€¤ã‚’ `mew-from-list' ã®æ¬¡ã®å€¤ã¨ç½®ãæ›ãˆã¾ã™ã€‚ãŸã¨ãˆã°ã€ From: Kazu Yamamoto (山本和彦) `C-cTAB' ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ From: Kazuhiko Yamamoto  File: mew.ja.info, Node: addr-comp, Next: addrbook, Prev: cheader, Up: Composing アドレスã®è£œå®Œ ============== To: ã‚„ Cc: ã§ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’補完ã§ãã¾ã™ã€‚補完ã«ã¯ `TAB' を用ã„ã¾ã™ã€‚ To: kazu`TAB' 上記ã®ã‚ˆã†ã«ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ä¸€éƒ¨ã§ `TAB' を押ã™ã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒ 補完ã•れる訳ã§ã™ã€‚ To: kazu@example.org アドレスã®è£œå®Œã«åˆ©ç”¨ã•れるアドレスã®ç¨®é¡žã«ã¯ã€ä»¥ä¸‹ã® 3 ã¤ãŒã‚りã¾ã™ã€‚ 1. アドレス帳ã®å±•é–‹è¦å‰‡ 2. アドレス帳ã®å€‹äººæƒ…å ± 3. é€ä¿¡æ™‚ã«å­¦ç¿’ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ アドレスã®è£œå®Œã«ã¯ 2 ã¤ã®æ–¹æ³•ãŒæä¾›ã•れã¦ã„ã¾ã™ã€‚ `mew-use-full-alias' ã«ã‚ˆã£ã¦é¸æŠžã—ã¾ã™(åˆæœŸå€¤ã¯ `nil')。 `mew-use-full-alias' ㌠`nil' ã®å ´åˆã€`@' ã®å‰ã€ã¤ã¾ã‚Šãƒ¦ãƒ¼ã‚¶å(短縮å) ãŒè£œå®Œã®å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚`TAB' を押ã™ã¨ãƒ¦ãƒ¼ã‚¶åãŒè£œå®Œã•れã€è£œå®Œã—ãã£ãŸ ã¨ã“ã‚ã§ã•ら㫠`TAB' を押ã™ã¨ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã€Œå±•é–‹ã€ã•れã¾ã™ã€‚ã“れをアドレ スã®è£œå®Œ(1)ã¨å‘¼ã³ã¾ã—ょã†ã€‚ アドレスã®è£œå®Œ(1)(*Note addr-comp1::)ã®åˆ©ç‚¹ã¯ã€ä¸Šã«æ›¸ã„㟠3 種類ã®ã‚¢ãƒ‰ レスã«å¯¾ã—ã€è£œå®Œãƒ»å±•é–‹ãŒçŸ›ç›¾ãªã実行ã§ãã‚‹ã“ã¨ã§ã™ã€‚後述ã®ã‚ˆã†ã«ã€ã€Œå¼· 制展開ã€ã‚‚ `TAB' ã§å®Ÿè¡Œã§ãã¾ã™ã€‚欠点ã¯ã€ãƒ¦ãƒ¼ã‚¶åã®éƒ¨åˆ†ãŒä¸€æ„ã§ãªã‘れ ã°ãªã‚‰ãªã„ã®ã§ã€ã‚るユーザåãŒç™»éŒ²ã•れã¦ã„ã‚‹å ´åˆã€åŒã˜ãƒ¦ãƒ¼ã‚¶åã‚’æŒã¤åˆ¥ ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’学習ã§ããªã„ã“ã¨ã§ã™ã€‚ `mew-use-full-alias' ㌠`t' ã®å ´åˆã€å­¦ç¿’ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã«é–¢ã—ã¦ã¯ã€ã‚¢ãƒ‰ レスã®å…¨ä½“ãŒè£œå®Œã®å¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚ã“れをアドレスã®è£œå®Œ(2)ã¨å‘¼ã³ã¾ã—ょ ã†ã€‚ アドレスã®è£œå®Œ(2)(*Note addr-comp2::)ã®åˆ©ç‚¹ã¯ã€ãƒ¦ãƒ¼ã‚¶åãŒä¸€è‡´ã—ã¦ã„ã‚‹ 複数ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’学習ã§ãã‚‹ã“ã¨ã§ã™ã€‚欠点ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã®å€‹äººæƒ…å ±ã«ç™»éŒ² ã•れã¦ã„るアドレスã®å…ˆé ­ä»¥å¤–ã¯åˆ©ç”¨ã§ããªã„ã“ã¨ã§ã™ã€‚ã¾ãŸã€ã€Œå¼·åˆ¶å±•開〠ã¯ã€`M-C-e' ã¨ã„ㆠ(`TAB' ã¨ã¯åˆ¥ã®) キーを押ã•ãªã‘れã°ã„ã‘ãªã„ã“ã¨ã§ã™ã€‚  File: mew.ja.info, Node: addrbook, Next: auto-alias, Prev: addr-comp, Up: Composing アドレス帳 ========== Mew ã§ã¯ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³("~/Mail/Addrbook")ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚アドレス帳ã«ã¯ 2 ã¤ã®æ›¸å¼ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚一方ã¯ã€Œå±•é–‹è¦å‰‡ã€ã‚’指定ã™ã‚‹æ›¸å¼ã€ä»–方㯠「個人情報ã€ã‚’記述ã™ã‚‹ãŸã‚ã®æ›¸å¼ã§ã™ã€‚ ã¾ãšã€ã€Œå±•é–‹è¦å‰‡ã€ã‚’記述ã™ã‚‹ãŸã‚ã®æ›¸å¼ã‚’示ã—ã¾ã™ã€‚ : [, , ,...] ã“ã®ã‚ˆã†ã«çŸ­ç¸®åã¨å±•é–‹ã™ã¹ãアドレスを `:' ã§åŒºåˆ‡ã£ã¦æ›¸ãã¾ã™ã€‚複数 ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«å±•é–‹ã™ã‚‹å ´åˆã¯ã€ãれらã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’ `,' ã§åŒºåˆ‡ã‚Šã¾ã™ã€‚ (ã“れã¯ã€To: ãªã©ã§ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒ `,' ã§åŒºåˆ‡ã‚‰ã‚Œã¦ã„ã‚‹ã®ã¨åŒã˜ã§ã™ã€‚) `,' ã®å¾Œã‚ã«ç©ºç™½ã‚’入れã¦ã‚‚æ§‹ã„ã¾ã›ã‚“。以下ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ pooh: winnie-the-pooh@example.net piglet: piglet@example.org friends: pooh, piglet 次ã«ã€ã€Œå€‹äººæƒ…å ±ã€ã‚’記述ã™ã‚‹ãŸã‚ã®æ›¸å¼ã‚’示ã—ã¾ã™ã€‚ [, , ,...] ã“ã®ã‚ˆã†ã« 4 ã¤ã®è¦ç´ ã‚’空白ã§åŒºåˆ‡ã‚Šã¾ã™ã€‚ ãŒçŸ­ç¸®åã§ã™ã€‚ 㨠ã¯ãれãžã‚Œãƒ‹ãƒƒã‚¯ãƒãƒ¼ãƒ ã¨æ­£å¼ãªæ°åã§ã‚ã‚Šã€æ—¥æœ¬ 語ã§ã‚‚æ§‹ã„ã¾ã›ã‚“。(ニックãƒãƒ¼ãƒ ã®ä½¿ã„方㯠*Note summary-mode:: 㨠*Note draft-mode:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。) 2 番目ã®è¦ç´ ã¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã™ã€‚複数ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’ãã®äººãŒæŒã£ã¦ã„ã‚‹å ´åˆã¯ã€ `,' ã§åŒºåˆ‡ã£ã¦æ›¸ãã¾ã™ã€‚`,' ã®å¾Œã«ç©ºç™½ã‚’入れã¦ã‚‚æ§‹ã„ã¾ã›ã‚“。ã¤ã¾ã‚Šã€ã“ ã®ç©ºç™½ã¯è¦ç´ ã®åŒºåˆ‡ã‚Šã§ã¯ã‚りã¾ã›ã‚“。ã¾ãŸã€`"' ã§å›²ã¾ã‚ŒãŸç©ºç™½ã‚‚è¦ç´ ã®åŒº 切りã«ã¯ãªã‚Šã¾ã›ã‚“。以下ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ kazu kazu@example.org, kazu@example.net Kazu-kun "Kazuhiko Yamamoto" 「個人情報ã€ã®æ›¸å¼ã§ã¯ã€å„è¦ç´ ã‚’çœç•¥ã§ãã¾ã™ã€‚中間ã®è¦ç´ ã‚’çœç•¥ã™ã‚‹å ´åˆ ã¯ã€`*' ã¨æ›¸ã„ã¦ä¸‹ã•ã„。以下ã«ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã«å¯¾ã—ã¦ãƒ‹ãƒƒã‚¯ãƒãƒ¼ãƒ ã®ã¿ã‚’定義 ã™ã‚‹ä¾‹ã‚’示ã—ã¾ã™ã€‚ * kazu@example.org, kazu@example.net Kazu-kun ニックãƒãƒ¼ãƒ ã¯ Summary モードã§ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ç½®ãæ›ãˆã¨ã€Draft モード㧠ã®å¼•用記å·ã®ç½®ãæ›ãˆ(*Note cite::)ã«åˆ©ç”¨ã•れã¾ã™ã€‚ アドレス帳ã®ã‚³ãƒ¡ãƒ³ãƒˆæ–‡å­—㯠`;' 㨠`#' ã§ã™ã€‚`;' ã¯è¡Œé ­ã«ã‚ã‚‹å ´åˆã®ã¿ã‚³ メントã¨ãªã‚Šã€ãã®è¡ŒãŒç„¡è¦–ã•れã¾ã™ã€‚`#' ã¯ä»»æ„ã®å ´æ‰€ã§ã‚³ãƒ¡ãƒ³ãƒˆã¨ãªã‚Šã€ ãã“ã‹ã‚‰è¡Œæœ«ã¾ã§ãŒç„¡è¦–ã•れã¾ã™ã€‚ã¾ãŸã€`\' ã¯ç¶™ç¶šè¡Œã‚’表ã‚ã—ã¾ã™ã€‚ Summary モードã«ã¯ã€ç¾åœ¨èª­ã‚“ã§ã„ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æƒ…報を Addrbook ã«ç™»éŒ²ã™ る機能ãŒã‚りã¾ã™ã€‚展開è¦å‰‡ã‚’登録ã™ã‚‹ã«ã¯ `C-cC-a' ã¨æŠ¼ã—ã¦ä¸‹ã•ã„。以下 ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ #If you want to register this entry, type 'C-c C-c'. #If you want to NOT register this entry, type 'C-c C-q'. Shortname: kazu Addresses: kazu@example.org Comments: 個人情報を登録ã™ã‚‹ã«ã¯ `C-uC-cC-a' ã¨æŠ¼ã—ã¦ä¸‹ã•ã„。以下ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ #If you want to register this entry, type C-c C-c. #If you want to NOT register this entry, type C-c C-q. Shortname: kazu Addresses: kazu@example.org Nickname: Name: Kazuhiko Yamamoto Comments: å¿…è¦ã§ã‚れã°åŠ ç­†è¨‚æ­£ã—ã¾ã™ã€‚実際ã«ç™»éŒ²ã™ã‚‹ã«ã¯ `C-cC-c'ã€ç™»éŒ²ã‚’å–り止 ã‚ã‚‹å ´åˆã¯ `C-cC-q' ã¨å…¥åŠ›ã—ã¦ä¸‹ã•ã„。*Note Quit:: ã‚‚å‚ç…§ã—ã¦ä¸‹ã•ã„。 ãªãŠã€Addrbook ã«è¤‡æ•°ã®è¨€èªžã®æ–‡å­—を使ã„ãŸã„å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’ Addrbook ã®å…ˆé ­ã«è¨˜è¿°ã—ã¦ä¸‹ã•ã„。 #-*-coding:ctext;-*-  File: mew.ja.info, Node: auto-alias, Next: addr-comp1, Prev: addrbook, Up: Composing アドレスã®è‡ªå‹•学習 ================== メッセージをé€ä¿¡ã—ãŸå ´åˆã€To: 㨠Cc: ã«æ›¸ã‹ã‚Œã¦ã„るアドレスã¯ã€è‡ªå‹•çš„ ã«å­¦ç¿’ã•れã¾ã™ã€‚以下ã®ä¾‹ã‚’考ãˆã¦ä¸‹ã•ã„。 To: kazu@example.org アドレスã®è£œå®Œ(1)(*Note addr-comp1::)ã®å ´åˆï¼šã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ ã¨ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ "kazu@example.org" ã«å¯¾ã—ã€çŸ­ç¸®å "kazu" ãŒè‡ªå‹•登録ã•れ㾠ã™ã€‚ãŸã ã—ã€ã™ã§ã« "kazu" ã¨ã„ã†çŸ­ç¸®åãŒè‡ªå‹•登録ã•れã¦ã„ã‚‹ãªã‚‰ã€ `mew-addrbook-override-by-newone' ã®å€¤ã«å¿œã˜ã¦ä¸Šæ›¸ãã™ã‚‹ã‹ã‚’決定ã—ã¾ã™ã€‚ `nil' ãªã‚‰å¤ã„設定を残ã—ã€ãれ以外ãªã‚‰ä¸Šæ›¸ãã—ã¾ã™ã€‚展開ã®éš›ã¯ã€ã‚¢ãƒ‰ãƒ¬ ã‚¹å¸³ã®æ–¹ãŒå„ªå…ˆã•れã¾ã™ã€‚ã§ã™ã‹ã‚‰ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã«ç„¡ã„短縮åã®ã¿ãŒæœ‰åйã«ãª りã¾ã™ã€‚ アドレスã®è£œå®Œ(2)(*Note addr-comp2::)ã®å ´åˆï¼šã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ ã¨ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ "kazu@example.org" ãŒè‡ªå‹•登録ã•れã¾ã™ã€‚ 自動登録ã•れるã®ã¯é€šå¸¸ 2000 個(`mew-lisp-max-length')ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¾ã§ã§ ã™ã€‚ãれを越ãˆã¦ç™»éŒ²ã™ã‚‹ã¨ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆé †ã§æœ€å¾Œã®æ–¹ãŒæ¶ˆãˆã¾ã™ã€‚ã“れら ã®æƒ…報㯠Mew を終了ã™ã‚‹éš›ã«ã€"~/Mail/.mew-alias" ã«ä¿å­˜ã•れã¾ã™ã€‚ 自動登録ã§ã™ã‹ã‚‰ã€ä¸è¦ãªçŸ­ç¸®åも登録ã•れã¾ã™ã€‚ä¸è¦ãªçŸ­ç¸®åを削除ã™ã‚‹ã« ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã™ã‚‹ã¨ã„ã„ã§ã—ょã†ã€‚ã¾ãšã€`M-a' を実行ã—〠"~/Mail/.mew-alias" ã‚’é–‹ãã¾ã™ã€‚次ã«ã€ãƒ†ã‚­ã‚¹ãƒˆãƒ•ァイルを編集ã™ã‚‹è¦ é ˜ã§ã€ä¸è¦ãªçŸ­ç¸®åを削除ã—ã¾ã™ã€‚ãã—ã¦ã€`C-xC-s' ã§ä¿å­˜ã—ã¦ä¸‹ã•ã„。 ä¿å­˜ã¨åŒæ™‚ã«ã€ãã®å†…容㌠Mew ã«å映ã•れã¾ã™ã€‚ アドレスã®è£œå®Œ(1)ã¨ã‚¢ãƒ‰ãƒ¬ã‚¹ã®è£œå®Œ(2)ã§ã¯ã€"~/Mail/.mew-alias" ã®æ›¸å¼ãŒ ç•°ãªã‚Šã¾ã™ã€‚`mew-use-full-alias' ã®å€¤ã‚’変ãˆã€æ–¹æ³•を切り替ãˆãŸã‚‰ã€ Summary モードã§ä¸€å›ž `Z' を押ã—ã¦ä¸‹ã•ã„。ã“れã§ã€æ›¸å¼ãŒå¤‰æ›ã•れã¾ã™ã€‚  File: mew.ja.info, Node: addr-comp1, Next: addr-comp2, Prev: auto-alias, Up: Composing アドレスã®è£œå®Œ(1) ================= アドレスã®è£œå®Œ(1)ã§ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã®å±•é–‹è¦å‰‡ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã®å€‹äººæƒ…å ±ã€ãŠ ã‚ˆã³é€ä¿¡æ™‚ã«å­¦ç¿’ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã§ç™»éŒ²ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ã€ãƒ¦ãƒ¼ã‚¶å(短縮å) ãŒä¸€æ„ã§ã‚ã‚‹ã“ã¨ãŒå‰æã¨ãªã£ã¦ã„ã¾ã™ã€‚ ãŸã¨ãˆã°ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã€Œå±•é–‹è¦å‰‡ã€ã‚’設定ã—ãŸã¨ã—ã¾ã™ã€‚ pooh: winnie-the-pooh@example.net Draft モードã®ãƒ˜ãƒƒãƒ€å†…ã§ã€ã‹ã¤ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’書ãã¹ãフィールド上ã§ã€ã—ã‹ ã‚‚ã€1 æ–‡å­—ä»¥ä¸Šã®æ–‡å­—列ãŒå‰ã«ã‚る場所㧠`TAB' を打ã¤ã¨ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã®çŸ­ç¸® åãŒè£œå®Œã•れã¾ã™ã€‚ To: piglet@example.org, po`TAB' ã“ã®ã‚ˆã†ã« `TAB' を押ã™ã¨ã€(ä»–ã«å€™è£œãŒç„¡ã‘れã°) "pooh" ã¾ã§è£œå®Œã•れ㾠ã™ã€‚ To: piglet@example.org, pooh`TAB' ã‚‚ã†ä¸€åº¦ `TAB' を押ã™ã¨ "winnie-the-pooh@example.net" ã«å±•é–‹ã•れã¾ã™ã€‚ To: piglet@example.org, winnie-the-pooh@example.net "@" ã§çµ‚る文字列ã¯å¼·åˆ¶çš„ã«å±•é–‹ã—ã¾ã™ã€‚ãŸã¨ãˆã°ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ä¼¼ãŸã‚ˆã†ãª 短縮åãŒã‚ã£ãŸå ´åˆã‚’考ãˆã¦ä¸‹ã•ã„。 pooh: winnie-the-pooh@example.net pooh-pooh: pooh-pooh@example.org "pooh-" ã¾ã§å…¥åŠ›ã™ã‚Œã°ã€"pooh-pooh" ã¾ã§è£œå®Œã§ãã‚‹ã“ã¨ã¯æ˜Žã‚‰ã‹ã§ã™ã€‚ã— ã‹ã—ã€"pooh" ã¾ã§ã ã¨ã€"pooh" を「展開ã€ã™ã‚‹ã®ã‹ã€"pooh-pooh" ã¾ã§è£œå®Œ ã™ã‚‹ã®ã‹åˆ†ã‚Šã¾ã›ã‚“。"pooh" ã‚’ "winnie-the-pooh@example.net" ã«å¼·åˆ¶çš„㫠展開ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã« `@' を挿入ã—ã€`TAB' を押ã—ã¾ã™ã€‚ To: pooh@`TAB' 強制展開ã¯ã€`@' を挿入ã›ãšã€`M-C-e' を押ã—ã¦ã‚‚実行ã§ãã¾ã™ã€‚ 上記ã®èª¬æ˜Žã¯ã€é€ä¿¡æ™‚ã«å­¦ç¿’ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã‚‚ã‚ã¦ã¯ã¾ã‚Šã¾ã™ã€‚ 「個人情報ã€ã®æ›¸å¼ã§ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒé †ã«ç½®ãæ›ãˆã‚‰ã‚Œã¦ã„ãã¾ã™ã€‚以下ã®ä¾‹ を考ãˆã¦ä¸‹ã•ã„。 kazu kazu@example.org, kazu@example.net Kazu-kun "Kazuhiko Yamamoto" kazu ãŒã©ã†å¤‰åŒ–ã™ã‚‹ã®ã‹è¦‹ã¦ã¿ã¾ã—ょã†ã€‚ To: kazu`TAB' "kazu" ã®å¾Œã§ `TAB' を打ã¤ã¨ã€"kazu@example.org" ã«ç½®ãæ›ã‚りã¾ã™ã€‚ To: kazu@example.org`TAB' 次㫠"kazu@example.org" ã®å¾Œã§ `TAB' を打ã¤ã¨ã€"kazu@example.net" ã«ç½® ãæ›ã‚りã¾ã™ã€‚ To: kazu@example.net`TAB' ã•ら㫠"kazu@example.net" ã®å¾Œã§ `TAB' を打ã¤ã¨ã€"kazu@example.org" 㫠戻りã¾ã™ã€‚ã“ã®ã‚ˆã†ã« `TAB' を押ã™ã¨ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒå¾ªç’°çš„ã«ç½®æ›ã•れã¾ã™ã€‚ アドレスを決定ã—ãŸå¾Œã¯ã€æ­£å¼åç§°ãŒä»˜åŠ ã§ãã¾ã™ã€‚ To: kazu@example.org`M-TAB' ã“ã®ã‚ˆã†ã« `M-TAB' を押ã™ã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ã«æ­£å¼åç§°ãŒä»˜åŠ ã•れã¾ã™ã€‚ To: Kazuhiko Yamamoto  File: mew.ja.info, Node: addr-comp2, Next: send, Prev: addr-comp1, Up: Composing アドレスã®è£œå®Œ(2) ================= アドレスã®è£œå®Œ(2)ã§ã¯ã€å­¦ç¿’ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã«é–¢ã—ã¦ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å…¨ä½“ãŒè£œ 完ã®å¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚アドレス帳ã®å±•é–‹è¦å‰‡ã¯ã€çŸ­ç¸®åãŒè£œå®Œã®å¯¾è±¡ã«ãªã‚Šã€ 一æ„ã«å®šã¾ã‚Œã°å±•é–‹ã•れã¾ã™ã€‚アドレス帳ã®å€‹äººæƒ…å ±ã§ã¯ã€çŸ­ç¸®åãŒè£œå®Œã®å¯¾ 象ã«ãªã‚Šã€ä¸€æ„ã«å®šã¾ã‚Œã°ã€ç™»éŒ²ã•れã¦ã„る先頭ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«å±•é–‹ã•れã¾ã™ã€‚ Draft モードã®ãƒ˜ãƒƒãƒ€å†…ã§ã€ã‹ã¤ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’書ãã¹ãフィールド上ã§ã€ã—ã‹ ã‚‚ã€1 æ–‡å­—ä»¥ä¸Šã®æ–‡å­—列ãŒå‰ã«ã‚る場所㧠`TAB' を打ã¤ã¨ã€çŸ­ç¸®åã‚ã‚‹ã„㯠学習ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ãŒè£œå®Œã•れã¾ã™ã€‚ kazu@example.org を学習ã—ã¦ã„ã‚‹ã¨ã—ã¾ã—ょã†ã€‚ To: ka`TAB' 曖昧ã§ãªã„ã¨ã“ã‚ã¾ã§å…¥åŠ›ã—ã€`TAB' を押ã›ã°ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒè£œå®Œã•れã¾ã™ã€‚ To: kazu@example.org ã•ら㫠kazunori@example.jp を学習ã—ãŸã¨ã—ã¾ã—ょã†ã€‚kazu@example.org 㸠補完ã™ã‚‹ã«ã¯ kazu@ ã¾ã§ã€kazunori@example.jp ã¸è£œå®Œã™ã‚‹ã«ã¯ kazun ã¾ã§ 入力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ 展開è¦å‰‡ã¨å€‹äººæƒ…å ±ã¯ã€`TAB' ã«ã‚ˆã‚Šã€ã¾ãšçŸ­ç¸®åãŒè£œå®Œã•れã¾ã™ã€‚短縮å㌠一æ„ã«å®šã¾ã‚Œã°ã€`TAB' ã§å±•é–‹ã§ãã¾ã™ã€‚ ãŸã¨ãˆã°ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã€Œå±•é–‹è¦å‰‡ã€ã‚’設定ã—ãŸã¨ã—ã¾ã™ã€‚ pooh: winnie-the-pooh@example.net 短縮å "pooh" を補完ã—ã¦ã¿ã¾ã—ょã†ã€‚ To: po`TAB' ã“ã®ã‚ˆã†ã« `TAB' を押ã™ã¨ã€(ä»–ã«å€™è£œãŒç„¡ã‘れã°) "pooh" ã¾ã§è£œå®Œã•れ㾠ã™ã€‚ To: pooh`TAB' ã‚‚ã†ä¸€åº¦ `TAB' を押ã™ã¨ "winnie-the-pooh@example.net" ã«å±•é–‹ã•れã¾ã™ã€‚ To: winnie-the-pooh@example.net å•題ã¯ã€çŸ­ç¸®åãŒä¸€æ„ã«å®šã¾ã‚‰ãªã„å ´åˆã®å±•é–‹ã§ã™ã€‚以下ã®å±•é–‹è¦å‰‡ã‚’考ãˆã¦ 下ã•ã„。 pooh: winnie-the-pooh@example.net pooh-pooh: pooh-pooh@example.org "pooh-" ã¾ã§å…¥åŠ›ã™ã‚Œã°ã€"pooh-pooh" ã¾ã§è£œå®Œã§ãã‚‹ã“ã¨ã¯æ˜Žã‚‰ã‹ã§ã™ã€‚ã— ã‹ã—ã€"pooh" ã¾ã§ã ã¨ã€"pooh" を「展開ã€ã™ã‚‹ã®ã‹ã€"pooh-pooh" ã¾ã§è£œå®Œ ã™ã‚‹ã®ã‹åˆ†ã‚Šã¾ã›ã‚“。"pooh" ã‚’ "winnie-the-pooh@example.net" ã«å¼·åˆ¶çš„㫠展開ã™ã‚‹ã«ã¯ã€`M-C-e' を利用ã—ã¾ã™ã€‚(`TAB' ã§å¼·åˆ¶å±•é–‹ã™ã‚‹æ–¹æ³•ã¯ã‚り㾠ã›ã‚“。) To: pooh`M-C-e' ã“ã®ä¾‹ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«å¼·åˆ¶å±•é–‹ã•れã¾ã™ã€‚ To: winnie-the-pooh@example.net  File: mew.ja.info, Node: send, Next: cite, Prev: addr-comp2, Up: Composing メッセージã®é€ä¿¡ ================ メッセージを書ã上ã’ã€ã„よã„よé€ä¿¡ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã® 2 ã¤ã®ã‚³ãƒžãƒ³ãƒ‰ã®ã© ã¡ã‚‰ã‹ã‚’é¸ã‚“ã§ä¸‹ã•ã„。 `C-cC-m' メッセージを作æˆã— +queue ã¾ãŸã¯ +postq ã«å…¥ã‚Œã€é€ä¿¡å¾…ã¡çŠ¶æ…‹ã«ã™ る。 `C-cC-c' メッセージを作æˆã—é€ä¿¡ã™ã‚‹ã€‚"Really send this message? (y or n) " ã¨è¨Šã‹ã‚Œã‚‹ã€‚`y' を押ã›ã°ã€é€ä¿¡ã•れる。 メッセージãŒé€ä¿¡ã•れる際ã«ã©ã†åŠ å·¥ã•れるã‹èª¬æ˜Žã—ã¾ã™ã€‚以下ã®ã‚ˆã†ãªãƒ¡ãƒƒ セージを考ãˆã¦ä¸‹ã•ã„。 To: pooh Subject: æ˜Žæ—¥ã®æ—¥æ›œæ—¥ From: Piglet X-Mailer: Mew version 6.7 on Emacs 24.4 ---- æ˜Žæ—¥ã®æ—¥æ›œæ—¥ã€éŠã³ã¾ã›ã‚“ã‹ï¼Ÿ // ピグレット ãŸã¨ãˆã°ã€`C-cC-m' ã§ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ +queue ã‚ã‚‹ã„㯠+postq ã«å…¥ã‚Œã‚‹ ã¨ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«åŠ å·¥ã•れã¦ã„ã¾ã™ã€‚ Date: Mon, 13 Mar 2000 19:49:50 +0900 (JST) Message-Id: <20000313.194950.59499544.piglet@example.org> To: winnie-the-pooh@example.net Subject: =?iso-2022-jp?B?GyRCTEBGfCRORnxNS0Z8GyhC?= From: Piglet X-Mailer: Mew version 6.7 on Emacs 24.4 Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit æ˜Žæ—¥ã®æ—¥æ›œæ—¥ã€éŠã³ã¾ã›ã‚“ã‹ï¼Ÿ // ピグレット Date: ã‚„ Message-Id: ãŒä»˜åŠ ã•れãŸã®ã¯ãŠåˆ†ã‹ã‚Šã«ãªã‚‹ã§ã—ょã†ã€‚Subject: ã«ã‚ã£ãŸæ—¥æœ¬èªžã¯ã€é…é€ã«å®‰å…¨ã¨ãªã‚‹ã‚ˆã† ASCII コードã«å¤‰æ›ã•れã¦ã„ã¾ã™ã€‚ ã¾ãŸã€æœ¬æ–‡ã®ãƒ‡ãƒ¼ã‚¿åž‹ã‚„æ–‡å­—ã‚³ãƒ¼ãƒ‰ãŒæŽ¨æ¸¬ã•ã‚Œã€æ­£ã—ã付加ã•れã¦ã„ã‚‹ã“ã¨ã¯ 特筆ã™ã¹ãã§ã—ょã†ã€‚ `C-cC-m' ã‚„ `C-cC-c' ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹ã¨ãã€ãƒ˜ãƒƒãƒ€ã«ä¸å‚™ãŒã‚ã£ãŸ å ´åˆã«æ³¨æ„を促ã—ã¦ãれる機能ãŒã‚りã¾ã™ã€‚ `mew-ask-subject' ã‚’ `t' ã«ã—ã¦ãŠã‘ã°ã€Subject: ãŒç©ºã®ã¨ãã«å€¤ã‚’å°‹ã­ã¦ ãれã¾ã™ã€‚空ã®ã¾ã¾ã«ã—ãŸã„å ´åˆã¯å˜ç´”ã« `RET' を押ã—ã¦ä¸‹ã•ã„。ã“ã®å¤‰æ•° ã®åˆæœŸå€¤ã¯ `nil' ã§ã™ã€‚ `mew-ask-fcc' ã‚’ `t' ã«ã—ã¦ãŠã‘ã°ã€Fcc: ã«å­˜åœ¨ã—ãªã„ãƒ•ã‚©ãƒ«ãƒ€ãŒæŒ‡å®šã—㦠ã‚ã‚‹å ´åˆã€ãã®ãƒ•ォルダを作æˆã™ã‚‹ã‹å°‹ã­ã¦ãれã¾ã™ã€‚作るãªã‚‰ `y'ã€ä½œã‚‰ãª ã„ãªã‚‰ `n' を押ã—ã¦ä¸‹ã•ã„。`n' を押ã™ã¨ã€é€ä¿¡ãŒä¸­æ­¢ã•れã€ã‚«ãƒ¼ã‚½ãƒ«ã¯è‰ ç¨¿ã«æˆ»ã‚Šã¾ã™ã€‚ã“ã®å¤‰æ•°ã®åˆæœŸå€¤ã¯ `nil' ã§ã™ã€‚ Mew ã¯ã€ã‚µãƒ¼ãƒãŒãƒ¦ãƒ¼ã‚¶èªè¨¼ã‚’è¦æ±‚ã™ã‚‹ã¨ã€é€ä¿¡ã®ãŸã‚ã®ãƒ‘スワードをユーザ ã«è¨Šãã¾ã™ã€‚é•·ã„é–“ã€ãƒ¡ãƒ¼ãƒ«ã®é€ä¿¡ã«ã¯ãƒ‘スワードãŒå¿…è¦ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ ã“れãŒã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’è©ç§°ã§ãる原因ã®ä¸€ã¤ã¨ãªã£ã¦ã„ã¾ã™ã€‚ã“れã‹ã‚‰ã¯ã€ メールã®é€ä¿¡ã®éš›ã¯ã€å—ä¿¡ã®ã¨ãã¨åŒã˜ã‚ˆã†ã«ã€ãƒ‘スワードãŒå¿…è¦ãªæ™‚代ã«ãª りã¾ã™ã€‚ +queue ã«æºœã£ã¦ã„るメッセージをé€ä¿¡ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã® 2 ã¤ã®æ–¹æ³•ãŒã‚り㾠ã™ã€‚ã©ã¡ã‚‰ã‚‚ Summary モードã®ã‚³ãƒžãƒ³ãƒ‰ã§ã‚ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¾ã—ょã†ã€‚ `i' `mew-auto-flush-queue' ㌠`t' ã®å ´åˆã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ãŸå¾Œ ã«ã€+queue ã«ã‚るメッセージをé€ä¿¡ã™ã‚‹ã€‚ダイアルアップ環境ã«ãŠã„ã¦ã€æŽ¥ç¶š 料金を節約ã™ã‚‹æ„味ã§ã‚‚ã€é€ä¿¡ã®ãŸã‚ã®èªè¨¼ã¨ã„ã†æ„味ã§ã‚‚ã€ã“れã¯ã‚ˆã„方法。 `mew-auto-flush-queue' ã®åˆæœŸå€¤ã¯ `t'。 `C-cC-c' +queue ã«ã‚るメッセージをé€ä¿¡ã™ã‚‹ã€‚+queue ã«è¡Œã£ã¦ã€ã§ãã‚ãŒã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ ジを見ãŸå¾Œã«ã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’使ã†ã¨ä¾¿åˆ©ã€‚`mew-ask-flush-queue' ㌠`t' ãªã‚‰ã€"Flush queue? (y or n) " ã¨è¨Šã‹ã‚Œã‚‹ã€‚ `mew-ask-flush-queue' ã®åˆæœŸå€¤ã¯ `nil'。  File: mew.ja.info, Node: cite, Next: mime-comp, Prev: send, Up: Composing シグニãƒãƒ£ã¨å¼•用 ================ ã“ã“ã§ã¯ã€æœ¬æ–‡ã®ãƒ†ã‚­ã‚¹ãƒˆã‚’便利ã«å‡¦ç†ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã«ã¤ã„ã¦è¿°ã¹ã¾ã™ã€‚ ã¾ãšã‚·ã‚°ãƒ‹ãƒãƒ£ã«ã¤ã„ã¦ã§ã™ã€‚カーソルã®ã‚る場所㫠"~/.signature" を挿入 ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã¯ `C-cTAB' ã§ã™ã€‚シグニãƒãƒ£ãƒ•ァイルã¯ã€ `mew-signature-file' ã§è¨­å®šã§ãã¾ã™ã€‚`mew-signature-as-lastpart' ã‚„ `mew-signature-insert-last' を設定ã™ã‚‹ã“ã¨ã§ã€`C-cTAB' ã®å‹•作をカスタ マイズã§ãã¾ã™ã€‚ `C-cTAB' カーソルã®ä½ç½®ã« "~/.signature" を挿入ã™ã‚‹ã€‚ 次ã«å¼•用ã«ã¤ã„ã¦ã§ã™ã€‚Summary モード㮠`a' ã‚„ `A' を使ã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« 返答ã™ã‚‹ãŸã‚ã®è‰ç¨¿ã‚’用æ„ã™ã‚‹ã¨ã€Emacs ㌠3 分割ã•れã¾ã™ã€‚上ãŒç¾åœ¨ã® Summary モードã€ä¸­ãŒ Message モードã€ä¸‹ãŒ Draft モードã§ã™ã€‚ Message モードã®ãƒ†ã‚­ã‚¹ãƒˆã‚’引用ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚ `C-cC-y' Message モードã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸€éƒ¨ã‚’コピーã—ã€å¼•用ラベルã¨å¼•用記 å·ä»˜ã§è²¼ã‚Šä»˜ã‘る。 1. ãŠãŠã¾ã‹ã«ã„ãˆã°ã€Message ãƒ¢ãƒ¼ãƒ‰ã®æœ¬æ–‡ãŒã‚³ãƒ”ーã•れる。ãŸã¨ãˆ ã°ã€Text/Plain ãŒè¡¨ç¤ºã•れã¦ã„ã‚‹ã¨ã€Message モード全体ãŒã‚³ãƒ”ー ã•れる。Message/Rfc822 ãŒè¡¨ç¤ºã•れã¦ã„ã‚‹å ´åˆã¯ã€ãƒ˜ãƒƒãƒ€ã‚’é™¤ã„ ãŸæœ¬æ–‡ãŒã‚³ãƒ”ーã•れる。 2. `C-uC-cC-y' ã§ã¯ã€ãƒ˜ãƒƒãƒ€ãŒã‚れã°ãƒ˜ãƒƒãƒ€ã‚’コピーã™ã‚‹ã€‚ 3. Emacs ã®ãƒžãƒ¼ã‚¯ãŒã‚ã‚‹ã¨ã€ãã®ãƒžãƒ¼ã‚¯ã¨ã‚«ãƒ¼ã‚½ãƒ«ã®é–“ãŒå¯¾è±¡ã¨ãªã‚‹ã€‚ `C-cC-t' Message モードã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸€éƒ¨ã‚’コピーã—ã€å¼•用ラベルã¨å¼•用記 å·ãªã—ã§è²¼ã‚Šä»˜ã‘る。 引用ラベルã¨å¼•用記å·ã®åˆæœŸå€¤ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ From: SUMIKAWA Munechika Subject: Wine Date: Wed, 23 Jul 1997 11:40:50 +0900 > ãŠã¯ã‚ˆã†ã‹ã‚‰ãŠã‚„ã™ã¿ã¾ã§ãƒ‹ãƒ¼ãƒˆã§ãŠãªã˜ã¿ã®è§’å·ã§ã™ã€‚ > > ã•ã¦ã€ã¨ã‚ã‘るワイン作戦ã§ã™ãŒã€å®šçŸ³é€šã‚Š '90 ã®ãƒœãƒ«ãƒ‰ãƒ¼ã® > カベルãƒãƒ»ã‚½ãƒ¼ãƒ“ニョンを狙ã„ãŸã„ã¨æ€ã„ã¾ã™ã€‚ Draft モードã§ã¯ Message モードã«è¡¨ç¤ºã•れã¦ã„ã‚‹ã‚‚ã®ãªã‚‰ãªã‚“ã§ã‚‚引用㧠ãã¾ã™ã€‚ã¤ã¾ã‚Šã€è¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç°¡å˜ã«å¼•用ã§ãã‚‹ã®ã§ã™ã€‚引用ã—ãŸã„メッ セージを表示ã•ã›ã¦ã€æœ¬æ–‡ã‚’引用ã™ã‚‹æ‰‹é †ã‚’ã€å¼•用ã—ãŸã„メッセージã®å›žæ•°ã  ã‘繰り返ã—ã¦ä¸‹ã•ã„。ãã®ãŸã‚ã® 3 分割ã§ã™ã€‚ 本文やヘッダã®è‰²ä»˜ã‘ãŒãŠã‹ã—ããªã£ãŸå ´åˆã€`C-cC-l' を実行ã™ã‚‹ã“ã¨ã§ã€ 色付ã‘をやり直ã™ã“ã¨ãŒã§ãã¾ã™ã€‚  File: mew.ja.info, Node: mime-comp, Next: charset-guess, Prev: cite, Up: Composing マルãƒãƒ‘ートã®ä½œæˆ ================== ã•ã¦ã€ã“ã“ã§ãƒžãƒ«ãƒãƒ‘ートã®ä½œã‚Šæ–¹ã‚’披露ã—ã¾ã—ょã†ã€‚ ãŸã¨ãˆã°ã€+draft/1 ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’書ã„ã¦ã„ã‚‹ã¨ãã«ã€`C-cC-a' ã¨å…¥åŠ›ã™ã‚‹ ã¨ã€è‰ç¨¿ã®ä¸€ç•ªä¸‹ã« ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* 2 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- ã¨ã„ã†è¡ŒãŒæŒ¿å…¥ã•れã¾ã™ã€‚"1/" ã¯ãƒžãƒ«ãƒãƒ‘ートを構築ã™ã‚‹ãŸã‚ã®ä¸€æ™‚çš„ãªãƒ‡ã‚£ レクトリã§ã€å®Ÿä½“㯠"~/Mail/attach/1" ã§ã™ã€‚パート 1 ã® CoverPage ã¯æœ¬ 文をæ„味ã—ã¾ã™ã€‚ã“ã“ã§ Draft ãƒ¢ãƒ¼ãƒ‰ã¯æ¬¡ã®ã‚ˆã†ã«ãªã£ã¦ã„ã‚‹ã§ã—ょã†ã€‚ To: mew-dist Subject: ã“ã“ãŒãƒ˜ãƒƒãƒ€ From: Kazu Yamamoto X-Mailer: Mew version 6.7 on Emacs 24.4 ---- 本文ã ã‚ˆã€‚ ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* 2 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- 3 ã¤ã®é ˜åŸŸã‚’以下ã®ã‚ˆã†ã«å‘¼ã¶ã“ã¨ã«ã—ã¾ã™ã€‚ * "----" より上を 「ヘッダ〠* "----" ã‹ã‚‰ "attachments" ã¾ã§ã‚’「本文〠* "attachments" より下を「添付領域〠Draft モードã§ã¯ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚ˆã£ã¦ã‚­ãƒ¼å‰²å½“ãŒé•ã„ã¾ã™ã€‚ ãŸã¨ãˆã°ã€`TAB' ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ヘッダ ã•ã¾ã–ã¾ãªè£œå®Œã€‚ 本文 TAB ã®æŒ¿å…¥ã€‚ 添付領域 ãªã«ã‚‚ã—ãªã„。 `c' ã ã¨ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ヘッダ c を挿入。 本文 c を挿入。 添付領域 ファイルã®ã‚³ãƒ”ー。 ä»¥ä¸‹ã€æ·»ä»˜é ˜åŸŸã§ã®ã‚­ãƒ¼å‰²å½“ã§ã™ã€‚ `C-p' ç¾åœ¨ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å‰ã®ãƒ•ァイルã¸ç§»å‹•。 `C-n' ç¾åœ¨ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å¾Œã®ãƒ•ァイルã¸ç§»å‹•。 `C-f' 1 番目ã®ã‚µãƒ–ディレクトリã«ç§»å‹•。 `C-b' 親ディレクトリã«ç§»å‹•。 `c' ファイルã®ã‚³ãƒ”ー。"." ä¸Šã§æœ‰åŠ¹ã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯çµŒç”±ã§ã‚‚å¯ã€‚リモート ã®ãƒ•ァイルをコピーã™ã‚‹å ´åˆã¯ã€"/[user@]hostname:/filepath" ã®å½¢å¼ ã§ãƒ•ァイルを指定。 `l' ファイルã¸ã‚·ãƒ³ãƒœãƒƒãƒªã‚¯ãƒªãƒ³ã‚¯ã‚’張る。"." ä¸Šã§æœ‰åŠ¹ã€‚æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ `f' を使ã£ã¦èª­ã¿è¾¼ã‚“ã§ç·¨é›†ã™ã‚‹å ´åˆã¯ã€å®Ÿä½“を編集ã—ã¦ã—ã¾ã‚ãªã„よ ã†ã«ã€`l' ã§ã¯ãªã `c' ã§ã‚³ãƒ”ーã™ã¹ã。 `d' ファイルã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®æ¶ˆåŽ»ã€‚ `m' サブディレクトリ(ã¤ã¾ã‚Šãƒžãƒ«ãƒãƒ‘ート)ã®ä½œæˆã€‚"." ä¸Šã§æœ‰åŠ¹ã€‚ `f' ファイルをãƒãƒƒãƒ•ã‚¡ã«èª­ã¿è¾¼ã‚€ã€‚ `F' æ–°è¦ãƒ•ァイルをãƒãƒƒãƒ•ã‚¡ã«èª­ã¿è¾¼ã‚€ã€‚"." ä¸Šã§æœ‰åŠ¹ã€‚ `y' Message モードã«è¡¨ç¤ºã•れã¦ã„るメッセージã«ãƒªãƒ³ã‚¯ã‚’張る。"." 上㧠有効。 `e' external-body ã®å…¥åŠ›ã€‚"." ä¸Šã§æœ‰åŠ¹ã€‚ `a' 音をサンプリングã—オーディオファイルã¨ã—ã¦æŒ¿å…¥ã€‚"." ä¸Šã§æœ‰åŠ¹ã€‚ `p' 入力ã•れãŸãƒ¦ãƒ¼ã‚¶ã® PGP 公開éµã‚’å–り出ã™ã€‚"." ä¸Šã§æœ‰åŠ¹ã€‚ `D' ã¡ã‚‡ã£ã¨ã—ãŸèª¬æ˜Ž(Content-Description:)ã®å…¥åŠ›ã€‚ `T' データ型(Content-Type:)ã®å¤‰æ›´ã€‚ `t' データ型ã«é–¢ã—ã€ãƒ†ã‚­ã‚¹ãƒˆã¨ãƒã‚¤ãƒŠãƒªã‚’å転ã•ã›ã‚‹ã€‚ `I' Text/* åž‹ã®å…¥åŠ› coding-system を指定ã™ã‚‹ã€‚ `C' Text/* åž‹ã®å‡ºåŠ› coding-system を指定ã™ã‚‹ã€‚ `P' å—ä¿¡å´ã§ã“ã®ãƒ‘ートをä¿å­˜ã™ã‚‹éš›ã®ãƒ•ァイルå(Content-Disposition:) ã®å¤‰æ›´ã€‚ファイルåã®å…¥åŠ›ã®éš›ã«ã€å˜ã« `RET' を押ã™ã¨å€¤ãŒæ¶ˆãˆã‚‹ã€‚ã ã—ã¦ã€é€ä¿¡å´ã®ãƒ•ァイルå㌠`*' ã¨å…±ã«è¡¨ç¤ºã•れる。 添付領域ã§ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µå­ã«ã‚ˆã£ã¦ãƒ‡ãƒ¼ã‚¿ã‚’å–り扱ã„ã¾ã™ã€‚ç¾åœ¨ã‚µãƒãƒ¼ トã—ã¦ã„ã‚‹æ‹¡å¼µå­ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ .txt Text/Plain .html Text/Html .xml Text/Xml .rtf Text/Enriched .css Text/Css .sgml Text/Sgml [0-9]+ Message/Rfc822 .ps Application/Postscript .pdf Application/Pdf .doc Application/Msword .xls Application/Vnd.Ms-Execl .ppt Application/Vnd.Ms-Powerpoint .vsd Application/Vnd.Visio .dat Application/Ms-Tnef .tar|.tar.|.gz|.Z|.taz|.tgz|.bz2?|.lzh|.zip|.bin|.pgp|.gpg|.exe|.dll Application/Octet-Stream .gif Image/Gif .tiff Image/Tiff .jpe?g Image/Jpeg .png Image/Png .xwd Image/X-Xwd .xbm Image/X-Xbm .xpm Image/X-Xpm .bmp Image/X-Bmp .pcx Image/X-Pcx .tga Image/X-Tga .au Audio/Basic .wav Audio/X-Wav .aif?f Auido/X-Aiff .midi? Auido/X-Midi .mpga|.mp[23] Audio/X-Mpeg .mpe?g Video/Mpeg .mov Video/Quicktime .avi Video/X-Msvideo コピーã™ã‚‹ã¨ãã®ãƒ•ァイルåã¯ã€é©åˆ‡ãªãƒ‡ãƒ¼ã‚¿åž‹ã‚’推測ã§ãã‚‹ã‚ˆã†æ‹¡å¼µå­ã«æ°— を付ã‘れã°ãªã‚“ã§ã‚‚よã„ã§ã™ã€‚ã‚‚ã—ã€è©²å½“ã™ã‚‹æ‹¡å¼µå­ãŒãªã„å ´åˆã€ `mew-content-type' ã§æŒ‡å®šã•れるデータ型ãŒé¸ã°ã‚Œã¾ã™ã€‚åˆæœŸå€¤ã¯ã€ Text/Plain(テキスト)ã§ã™ã€‚ `c' ã§ãƒ•ァイルをコピーã™ã‚‹ã¨ã€ãŸã¨ãˆã°æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* B 2 Image/Gif MagicPoint ã®ãƒ­ã‚´ mgp.gif Q 3 Application/Postscript 資料 ohp.ps 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- å„行ã¯ã€ - マーク (Content-Transfer-Encoding:) - ãƒ‘ãƒ¼ãƒˆç•ªå· - データ型 (Content-Type:) - 説明 (Content-Description:) - ファイルå (Content-Disposition:) ã‹ã‚‰æ§‹æˆã•れã¦ã„ã¾ã™ã€‚ データ型(Content-Type:)㯠`T' ã«ã‚ˆã£ã¦å¤‰ãˆã‚‰ã‚Œã¾ã™ã€‚データ型ãŒãƒ†ã‚­ã‚¹ãƒˆ (Text/Plain)ã‹ãƒã‚¤ãƒŠãƒª(Application/Octet-Stream)ã®å ´åˆã¯ã€`t' ã«ã‚ˆã£ã¦ 一方を他方ã¸å転ã§ãã¾ã™ã€‚ マーク(Content-Transfer-Encoding:)を変更ã™ã‚‹æ–¹æ³•ã¯ã€*Note mark-b-comp:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。説明(Content-Description:)㯠`D' ã§å…¥ 力ã§ãã¾ã™ã€‚ã“ã®èª¬æ˜Žã®ã‚«ãƒ©ãƒ ã¯ã€*Note mark-b-comp:: ã§èª¬æ˜Žã™ã‚‹æš—å·åŒ–ã® éš›ã«ä¸Šæ›¸ãã•れã¾ã™ã€‚ 第 5 カラムã«è¡¨ç¤ºã•れるã®ã¯ã€å®Ÿéš›ã«ã¯ã‚³ãƒ”ーã—ãŸãƒ•ァイルåã‹ Content-Disposition:ã€ã¤ã¾ã‚Šã€å—信者ãŒãã®ãƒ‘ートをä¿å­˜ã™ã‚‹éš›ã®ãƒ•ァイル åã§ã™ã€‚Content-Disposition: ã®å€¤ãŒã‚れã°ã€ãれãŒè¡¨ç¤ºã•れã¾ã™ã€‚ãªã‘れ ã°ã€ã‚³ãƒ”ーã—ãŸãƒ•ァイルåã« `*' を付加ã—ã¦è¡¨ç¤ºã—ã¾ã™ã€‚ファイルをコ ピーã—ãŸéš›ã® Content-Disposition: ã®å€¤ã¯ã€ã‚³ãƒ”ーã—ãŸãƒ•ァイルåãŒæŒ‡å®šã• れã¦ã„ã¾ã™ã€‚ãŸã ã—ã€Message/* 㨠Multipart/* ã«ã¯ Content-Disposition: ã¯è¨­å®šã•れã¾ã›ã‚“。Message/* ã® Content-Disposition: を指定ã™ã‚‹ã«ã¯ã€ `P' を利用ã—ã¦ä¸‹ã•ã„。 ファイルã¯ã‚·ãƒ³ã‚°ãƒ«ãƒ‘ートã«ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ãƒžãƒ«ãƒãƒ‘ートã«å¯¾å¿œã—ã¾ã™ã€‚ã§ ã™ã‹ã‚‰ã€ãƒ•ァイル構造を作ã£ã¦ã„ãæ„Ÿè¦šã§è¤‡é›‘ãªãƒžãƒ«ãƒãƒ‘ートを作æˆã§ãã¾ã™ã€‚ ç°¡å˜ã§ã—ょ? ディレクトリã«å¯¾ã™ã‚‹ãƒ‡ãƒ¼ã‚¿åž‹ã®åˆæœŸå€¤ã¯ã€ä¸€èˆ¬çš„ãªãƒžãƒ«ãƒãƒ‘ート (Multipart/Mixed)ã§ã™ã€‚ã“れも `T' ã«ã‚ˆã£ã¦å¤‰æ›´ã§ãã¾ã™ã€‚ ãŠå¥½ã¿ã®ãƒžãƒ«ãƒãƒ‘ートãŒä½œæˆã§ããŸã‚‰ã€å‰ç¯€ã§è¿°ã¹ãŸã‚ˆã†ã« `C-cC-m' ã‹ `C-cC-c' を利用ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¦ä¸‹ã•ã„。 パートã®å®Ÿä½“ãŒå¤–部ã«ã‚ã‚‹ external-body を作æˆã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ `e' ã«ã¤ã„㦠説明ã—ã¾ã—ょã†ã€‚access-type ã« ftp ã‹ anon-ftp を入力ã™ã‚‹ã¨ãã¯ã€ ange-ftp ã®ãŠã‹ã’ã§ãƒªãƒ¢ãƒ¼ãƒˆã®ãƒ•ァイルåãŒè£œå®Œã§ãã¾ã™ã€‚access-type ㌠local-file ã®å ´åˆã¯ã€ã‚‚ã¡ã‚んファイルåを補完ã§ãã¾ã™ã€‚ ã‚‚ã—ã€ãƒžãƒ«ãƒãƒ‘ートã®ä½œæˆé€”中ã§ã‚„ã£ã±ã‚Šã‚·ãƒ³ã‚°ãƒ«ãƒ‘ãƒ¼ãƒˆã«æˆ»ã—ãŸããªã£ãŸã‚‰ã€ 一番上ã®ãƒžãƒ«ãƒãƒ‘ート部分㧠`d' を押ã—ã¦ä¸‹ã•ã„。  File: mew.ja.info, Node: charset-guess, Next: longline, Prev: mime-comp, Up: Composing æ–‡å­—ã‚³ãƒ¼ãƒ‰ã®æ±ºå®š ================ Mew ã¯ã‚·ãƒ³ã‚°ãƒ«ãƒ‘ートã¨ãƒžãƒ«ãƒãƒ‘ートã®ä¸¡æ–¹ã«å¯¾ã—ã€é…逿™‚ã®æ–‡å­—コードを決 定ã™ã‚‹æ©Ÿèƒ½ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ <シングルパート> Draft モード㧠`C-cC-m' ã‚„ `C-cC-c' ã¨å…¥åŠ›ã—メッセージを作æˆã™ã‚‹ã¨ã€ Mew ã¯æœ¬æ–‡ã®å†…部表ç¾ã‹ã‚‰é…逿™‚ã®æ–‡å­—コードを決定ã—ã¾ã™ã€‚ãƒã‚¤ãƒªãƒ³ã‚¬ãƒ« Emacs ã§ã¯ã€7 ãƒ“ãƒƒãƒˆã®æ–‡å­—コードã«å¯¾ã— US-ASCII ã‚’é¸ã³ã€8 ãƒ“ãƒƒãƒˆã®æ–‡å­— コードã«å¯¾ã— ISO-8859-1 ã‚’é¸æŠžã—ã¾ã™ã€‚国際化 Emacs ã§ã¯ã€å†…部表ç¾ã‹ã‚‰ Mew ãŒå®šã‚ãŸè¦å‰‡ã«å¾“ã£ã¦ã€é…逿™‚ã®æ–‡å­—コードを決定ã—ã¾ã™ã€‚ <マルãƒãƒ‘ート> マルãƒãƒ‘ートã®ä¸€éƒ¨ã¨ã—ã¦æ·»ä»˜ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã¯ã€ãƒ•ァイルã§ã™ã‹ã‚‰ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã« 存在ã—ã¾ã™ã€‚ãã“ã§ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä½œæˆã®éš›ã«ã€é…逿™‚ã®æ–‡å­—コードを決定㙠るãŸã‚ã«ã¯ã€ã¾ãš Emacs ã®ãƒãƒƒãƒ•ã‚¡ã«å–り込ã¿ã€å†…部表ç¾ã«ç›´ã™å¿…è¦ãŒã‚り ã¾ã™ã€‚内部表ç¾ã«ç›´ã—ãŸå¾Œã¯ã€ã‚·ãƒ³ã‚°ãƒ«ãƒ‘ートã¨åŒæ§˜ã®æ–¹æ³•ã§ã€é…逿™‚ã®æ–‡å­— コードを決定ã—ã¾ã™ã€‚ ãƒã‚¤ãƒªãƒ³ã‚¬ãƒ« Emacs ã§ã¯ã€Mew ã¯ãƒ•ァイルをãã®ã¾ã¾ã®å½¢å¼ã§èª­ã¿è¾¼ã¿ã¾ã™ã€‚ ã§ã™ã‹ã‚‰ã€7 ビットã®ãƒ•ァイルã«ã¯ US-ASCII ãŒã€8 ビットã®ãƒ•ァイルã«ã¯ ISO-8859-1 ãŒé¸ã°ã‚Œã¾ã™ã€‚ 国際化 Emacs ã§ã¯ã€Mew ã¯ç’°å¢ƒ(ã¤ã¾ã‚Š auto conversion)ã«å¾“ã£ã¦ã€æ–‡å­—コー ドを推測ã—ãªãŒã‚‰ãƒ•ァイルを読ã¿è¾¼ã¿ã¾ã™ã€‚国際化 Emacs ã§ã“ã®ç’°å¢ƒã‚’決定 ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã¯ã€`C-x RET l' ã§ã™ã€‚ ãŸã¨ãˆã°ã€æ—¥æœ¬èªžã®ç’°å¢ƒã§ã¯ã€å›½éš›åŒ– Emacs 㯠ISO-2022-JPã€EUC-JPã€ãã— ã¦ã€Shift_JIS ã‚’è¦‹äº‹ã«æŽ¨æ¸¬ã—ã€æ—¥æœ¬èªžç”¨ã®å†…部表ç¾ã«å¤‰æ›ã—ã¦ãƒãƒƒãƒ•ã‚¡ã«æ ¼ ç´ã—ã¾ã™ã€‚Mew ã¯ã“ã®å†…部表ç¾ã‹ã‚‰ã€é…逿™‚ã®æ–‡å­—コードã¨ã—㦠ISO-2022-JP ã‚’é¸æŠžã—ã¾ã™ã€‚ã¤ã¾ã‚Šã€ãƒ•ã‚¡ã‚¤ãƒ«ã®æ–‡å­—コード㌠EUC-JP ã‚„ Shift-JIS ã§ã‚㣠ã¦ã‚‚ã€é…é€ç”¨ã® ISO-2022-JP ã«è‡ªå‹•çš„ã«å¤‰æ›ã•れã¾ã™ã€‚ãã“ã§ãƒ¦ãƒ¼ã‚¶ã¯ã€æ·» 付ã™ã‚‹ãƒ•ã‚¡ã‚¤ãƒ«ã®æ–‡å­—コードを気ã«ã™ã‚‹ã“ã¨ãªã—ã«ã€ãƒ•ァイルを添付å¯èƒ½ã§ã™ã€‚ ã‚‚ã—ã€ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã®ãƒ•ァイル㮠coding-system ã‚’æ˜Žç¤ºçš„ã«æŒ‡å®šã—ãŸã„ãªã‚‰`I' を使ã£ã¦ä¸‹ã•ã„。ã“れを入力文字コードã¨å‘¼ã¶ã“ã¨ã«ã—ã¾ã™ã€‚ã¾ãŸã€é…逿™‚ã® coding-system ã‚’æ˜Žç¤ºçš„ã«æŒ‡ç¤ºã—ãŸã„ãªã‚‰ã€`C' を利用ã—ã¦ä¸‹ã•ã„。 æ–‡å­—ã‚³ãƒ¼ãƒ‰ã®æƒ…å ±ã¯ã€æ·»ä»˜é ˜åŸŸã«ãŠã„ã¦ã€ä¸¸æ‹¬å¼§ã®å†…å´ã«è¡¨ç¤ºã•れã¾ã™ã€‚ã‚‚ã—〠é…逿™‚ã®æ–‡å­—ã‚³ãƒ¼ãƒ‰ãŒæ˜Žç¤ºçš„ã«æŒ‡å®šã•れã¦ã„れã°ã€ãれãŒè¡¨ç¤ºã•れã¾ã™ã€‚ãㆠã§ãªãã¦ã€å…¥åŠ›æ–‡å­—ã‚³ãƒ¼ãƒ‰ãŒæ˜Žç¤ºçš„ã«æŒ‡å®šã•れã¦ã„れã°ã€ãれ㌠"*" ã¨å…±ã« 表示ã•れã¾ã™ã€‚ãã†ã§ãªã‘れã°ã€"guess" ã¨è¡¨ç¤ºã•れã¾ã™ã€‚ 以下ã®ä¾‹ã®è¦‹ã¦ä¸‹ã•ã„。パート 1 ã¯ã€æœ¬æ–‡ã§ã™ã‹ã‚‰ã‚らã‹ã˜ã‚ãƒãƒƒãƒ•ァ内㫠ã‚りã¾ã™ã€‚"guess" ã¨è¡¨ç¤ºã•れã¦ã„ã¾ã™ã‹ã‚‰ã€é…逿™‚ã®æ–‡å­—コードを Mew ㌠定ã‚ãŸè¦å‰‡ã«å¾“ã£ã¦æ±ºå®šã—ã¾ã™ã€‚ パート 2 ã¯ã€å…¥åŠ›æ–‡å­—ã‚³ãƒ¼ãƒ‰ã¨ã—㦠iso-8859-1 ãŒæŒ‡å®šã•れã¦ã„ã¾ã™ã®ã§ã€ ãƒ•ã‚¡ã‚¤ãƒ«ã®æ–‡å­—コードを iso-8859-1 ã§ã‚ã‚‹ã¨ã—ã¦èª­ã¿è¾¼ã¿ã€å†…部表ç¾ã«å¤‰æ› ã—ã¾ã™ã€‚é…逿™‚ã®æ–‡å­—コード㯠Mew ãŒå®šã‚ãŸè¦å‰‡ã«å¾“ã£ã¦æ±ºå®šã—ã¾ã™ã€‚ パート 3 ã®å…¥åŠ›æ–‡å­—ã‚³ãƒ¼ãƒ‰ã¯ã€ã“ã®ä¾‹ã ã‘ã‹ã‚‰ã ã¨æ˜Žç¤ºçš„ã«æŒ‡å®šã•れã¦ã„ã‚‹ ã‹åˆ†ã‹ã‚Šã¾ã›ã‚“。(ã—ã‹ã—ã€ãƒ¦ãƒ¼ã‚¶è‡ªèº«ã¯ã¯å®Ÿéš›ã«æŒ‡å®šã—ãŸã‹åˆ†ã‹ã£ã¦ã„る㯠ãšã§ã™ã€‚) ã¨ã«ã‹ãã€ãƒ•ァイルã¯å†…部表ç¾ã«ç›´ã•れã€é…逿™‚ã®æ–‡å­—ã‚³ãƒ¼ãƒ‰ã«æŒ‡ 定ã•れã¦ã„ã‚‹ EUC-JP ã«å¤‰æ›ã•れã¾ã™ã€‚ ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* 2 Text/Plain(*iso-8859-1) text1 B 3 Text/Plain(euc-jp) text2 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- ãƒã‚¤ãƒªãƒ³ã‚¬ãƒ« Emacs ã§ã¯ `C' 㨠`I' ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。  kazu-yamamoto-Mew-ff9c41b/info/mew.ja.info-2000066400000000000000000002750111256455547000207110ustar00rootroot00000000000000Info file: mew.ja.info, -*-Text-*- produced by `texinfo-format-buffer' from file `mew.texi' using `texinfmt.el' version 2.42 of 7 Jul 2006. INFO-DIR-SECTION Message User Agent START-INFO-DIR-ENTRY * Mew-J: (mew.ja.info). Messaging in the Emacs World. END-INFO-DIR-ENTRY  File: mew.ja.info, Node: longline, Next: reply, Prev: charset-guess, Up: Composing é•·ã„行ã®å–り扱ㄠ================ é•·ã„é–“ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ›¸ã文章ã¯ã€è‡ªåˆ†è‡ªèº«ã§å„行を(英文字ã§)70文字程度㫠折り返ã™ã¹ãã ã¨ã•れã¦ãã¾ã—ãŸã€‚RFC 3676 ã§ Text/Plain ãŒæ‹¡å¼µã•れ〠format パラメータ㫠flowed ã¨ã„ã†å€¤ãŒå®šç¾©ã•れã¾ã—ãŸã€‚ ã“ã®ãŠã‹ã’ã§ã€é€ã‚Šå´ã§é•·ã„行を目å°ã‚’付ã‘ã¦æŠ˜ã‚Šè¿”ã—ã€å—ã‘å–りå´ã§é•·ã„行 ã«æˆ»ã›ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚ユーザã®ç›®ã‹ã‚‰è¦‹ã‚Œã°ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«é•·ã„行を気 è»½ã«æ›¸ã„ã¦ã‚‚よããªã£ãŸã¨ã„ã†ã“ã¨ã§ã™ã€‚ Mew ã§ã€é•·ã„行を flowed ã§æŠ˜ã‚Šè¿”ã™ã«ã¯ 2 ã¤ã®æ–¹æ³•ãŒã‚りã¾ã™ã€‚ 1) æ˜Žç¤ºçš„ã«æŠ˜ã‚Šè¿”ã™ã«ã¯ã€`C-cC-f'を実行ã—ã¾ã™ã€‚ ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€è‰ç¨¿ã«é•·ã„行ãŒã‚ã‚‹ã‹ã‚’調ã¹ã¾ã™ã€‚ `mew-flowed-fold-threshold' ã‚’è¶Šãˆã‚‹è¡ŒãŒè¦‹ã¤ã‹ã£ãŸã‚‰ã€flowed ã§æŠ˜ã‚Šè¿” ã—を実行ã—ã¾ã™ã€‚ã“ã®å¤‰æ•°ã®å€¤ã¯ 78 ã§ã™ã€‚ 折り返ã—ãŸè¡ŒãŒã€ä½•文字以内ã«ãªã‚‹ã‹ã‚’制御ã™ã‚‹å¤‰æ•°ãŒ `mew-flowed-fold-length'ã§ã™ã€‚åˆæœŸå€¤ã¯ 70 ã§ã™ã€‚ æŠ˜ã‚Šè¿”ã™æ–¹æ³•ã¯ã€æ–‡å­—コードã«ã‚ˆã£ã¦å¤‰ã‚りã¾ã™ã€‚分ã‹ã¡æ›¸ãã‚’ã™ã‚‹æ–‡å­—コー ドã§ã¯ã€æ—¢å­˜ã®ç©ºç™½æ–‡å­—ã®å¾Œã«æ”¹è¡Œæ–‡å­—ã‚’å…¥ã‚Œã¦æŠ˜ã‚Šè¿”ã—ã¾ã™(delsp=no)。分 ã‹ã¡æ›¸ãã‚’ã—ãªã„文字コードã§ã¯ã€é©åˆ‡ãªå ´æ‰€ã«ç©ºç™½æ–‡å­—ã¨æ”¹è¡Œæ–‡å­—ã®ä¸¡æ–¹ã‚’ 挿入ã—ã¦æŠ˜ã‚Šè¿”ã—ã¾ã™(delsp=yes)。 ã‚‚ã†ä¸€åº¦ `C-cC-f' を実行ã™ã‚‹ã¨ã€æŠ˜ã‚Šè¿”ã•れãŸè¡ŒãŒå…ƒã«æˆ»ã‚Šã¾ã™ã€‚ 2) `mew-use-format-flowed' ㌠`t' ã®å ´åˆã¯ã€`C-cC-c'ã‚„`C-cC-m'ã§ãƒ¡ãƒƒã‚»ãƒ¼ ジを作æˆã™ã‚‹ã¨ãã«ã€ã“ã®æ©Ÿèƒ½ãŒåƒãã¾ã™ã€‚ã“ã®å¤‰æ•°ã®åˆæœŸå€¤ã¯ `nil' ã§ã™ã€‚ 3) `C-cC-pC-f' ã§ã€`mew-use-format-flowed' ã®å€¤ã‚’å転ã§ãã¾ã™ã€‚ ãªãŠã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹éš›ã¯ã€`mew-use-format-flowed' ã®å€¤ã«é–¢ä¿‚ãªã flowed ã§æŠ˜ã‚Šè¿”ã•れãŸè¡Œã¯ã€å…ƒã«æˆ»ã•れã¾ã™ã€‚é•·ã„行ãŒè¦‹ã«ãã„å ´åˆã¯ã€ Summary モード㧠`_' を利用ã—ã¾ã—ょã†ã€‚ `mew-flowed-auto-wrap' ㌠`t' ã®å ´åˆã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã¨ã€å…ƒã«æˆ»ã• れãŸè¡Œã«ä¸€å›ž `_' ãŒå®Ÿè¡Œã•ã‚Œã€æŠ˜ã‚Šè¿”ã•れãŸçŠ¶æ…‹ã§è¡¨ç¤ºã•れã¾ã™ã€‚ `mew-flowed-auto-wrap' ã®ãƒ‡ãƒ•ォルトã®å€¤ã¯ `t' ã§ã™ã€‚  File: mew.ja.info, Node: reply, Next: forward, Prev: longline, Up: Composing メッセージã¸ã®è¿”ç­”ã¨å®›å…ˆã®æ±ºå®š ============================== æ–°è¦ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’書ãå ´åˆã¯ã€To:ã€Cc:ã€ãŠã‚ˆã³ Newsgroups: ã‚’è‡ªåˆ†ã§æ›¸ ãã“ã¨ã«ãªã‚Šã¾ã™ã€‚一方 Summary モード㧠`a' ã‚„ `A' を使ã£ã¦ã€ã‚るメッ セージã«è¿”ç­”ã—よã†ã¨ã™ã‚‹ã¨ã€To:ã€Cc:ã€Newsgroups: ã¯è‡ªå‹•çš„ã«ç”¨æ„ã•れ㾠ã™ã€‚ Summary モード㧠`a' ã‚„ `A' を使ã†ã¨ã€æ–°ã—ã„è‰ç¨¿ãŒ Draft modeã«ç”¨æ„㕠れã¾ã™ã€‚To:ã€Cc:ã€Newsgroups: ã®å€¤ã¯ã€ä»¥ä¸‹ã®ä¸‰ã¤ã® alist ã«å¾“ã£ã¦ç”¨æ„ ã•れã¾ã™ã€‚ 1. ã‚‚ã— `C-u' 付ãã§å‘¼ã³å‡ºã•れãŸå ´åˆã€é€ä¿¡è€…/投稿者ã®ã¿ã«è¿”ç­”ã™ã‚‹ã€‚ ã“ã®å ´åˆã€`mew-reply-sender-alist' ãŒåˆ©ç”¨ã•れる。 2. ã‚‚ã—対象ãŒè‡ªåˆ†è‡ªèº«ã§é€ã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãªã‚‰ã€ãã®ãƒ˜ãƒƒãƒ€ã‚’加工ã›ãšã« 返答ã—ãŸã„ã®ã§ã‚ã‚ã†ã€‚ã“ã®å ´åˆã€`mew-reply-fromme-alist' ãŒåˆ©ç”¨ã• れる。 3. ãã†ã§ãªã‘れã°ã€ã™ã¹ã¦ã®äººã«è¿”ç­”ã™ã‚‹ã€‚ã“ã®å ´åˆã€ `mew-reply-all-alist' ãŒåˆ©ç”¨ã•れる。 `mew-reply-sender-alist' ã®åˆæœŸå€¤ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ '(("Reply-To:" ("To:" "Reply-To:" "From:")) (t ("To:" "From:"))) ã“れã¯ã€æ¬¡ã®ã‚ˆã†ã«è§£é‡ˆã—ã¾ã™ã€‚ 1. Reply-To: ãŒå­˜åœ¨ã™ã‚Œã°ã€Reply-To: 㨠From: ã®å€¤ã‚’æ–°ã—ã„ To: ã¸ã‚³ ピーã™ã‚‹ã€‚ 2. ãã†ã§ãªã‘れã°ã€From: ã®å€¤ã‚’æ–°ã—ã„ To: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ ã‚‚ã—ã€Reply-To: ã§æŒ‡å®šã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã®ã¿ã«è¿”ç­”ã—ãŸã„å ´åˆã¯ã€ `mew-reply-sender-alist' を以下ã®ã‚ˆã†ã«è¨­å®šã™ã‚‹ã¨ã‚ˆã„ã§ã—ょã†ã€‚ (setq mew-reply-sender-alist '(("Reply-To:" ("To:" "Reply-To:")) (t ("To:" "From:")))) `mew-reply-fromme-alist' ã®åˆæœŸå€¤ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ '((t ("To:" "To:") ("Cc:" "Cc:") ("Newsgroups:" "Newsgroups:")))) ã“れã¯ã€æ¬¡ã®ã‚ˆã†ã«è§£é‡ˆã—ã¾ã™ã€‚ 1. To: ã®å€¤ã‚’æ–°ã—ã„ To: ã¸ã€Cc: ã®å€¤ã‚’æ–°ã—ã„ Cc: ã¸ã€Newsgroups: 㮠値を新ã—ã„ Newsgroups: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ `mew-reply-all-alist' ã®åˆæœŸå€¤ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ '((("Followup-To:" "poster") ("To:" "From:")) ("Followup-To:" ("Newsgroups:" "Followup-To:" "Newsgroups:")) ("Newsgroups:" ("Newsgroups:" "Newsgroups:")) ("Reply-To:" ("To:" "Reply-To:" "From:") ("Cc:" "To:" "Cc:" "Apparently-To:")) (t ("To:" "From:") ("Cc:" "To:" "Cc:" "Apparently-To:"))) ã“れã¯ã€æ¬¡ã®ã‚ˆã†ã«è§£é‡ˆã—ã¾ã™ã€‚ 1. Follwup-To: ã®å€¤ãŒ "poster" ã§ã‚れã°ã€From: ã®å€¤ã‚’æ–°ã—ã„ To: ã¸ã‚³ ピーã™ã‚‹ã€‚ 2. Follwup-To: ãŒå­˜åœ¨ã™ã‚Œã°ã€Follwup-To: 㨠Newsgroups: ã®å€¤ã‚’æ–°ã—ã„ Newsgroups: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ 3. Newsgroups: ãŒå­˜åœ¨ã™ã‚Œã°ã€Newsgroups: ã®å€¤ã‚’æ–°ã—ã„ Newsgroups: 㸠コピーã™ã‚‹ã€‚ 4. Reply-To: ãŒå­˜åœ¨ã™ã‚Œã°ã€Reply-To: 㨠From: ã®å€¤ã‚’æ–°ã—ã„ To: ã¸ã‚³ ピーã™ã‚‹ã€‚ã¾ãŸã€To:ã€Cc:ã€Apparently-To: ã®å€¤ã‚’æ–°ã—ã„ Cc: ã¸ã‚³ãƒ”ー ã™ã‚‹ã€‚ 5. ãã†ã§ãªã‘れã°ã€From: ã®å€¤ã‚’æ–°ã—ã„ To: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ã¾ãŸã€To:〠Cc:ã€Apparently-To: ã®å€¤ã‚’æ–°ã—ã„ Cc: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ `mew-reply-all-alist' を以下ã®ã‚ˆã†ã«è¨­å®šã—ãŸã„ã¨æ€ã†äººã‚‚ã„ã‚‹ã‹ã‚‚ã—れ㾠ã›ã‚“。 (setq mew-reply-all-alist '((("Followup-To:" "poster") ("To:" "From:")) ("Followup-To:" ("Newsgroups:" "Followup-To:")) ("Newsgroups:" ("Newsgroups:" "Newsgroups:")) ("Reply-To:" ("To:" "Reply-To:")) (t ("To:" "From:") ("Cc:" "To:" "Cc:" "Apparently-To:")))) ã‚るアドレスãŒè¤‡æ•°ã‚ã‚‹å ´åˆã¯ã€è‡ªå‹•的㫠1 ã¤ã«ãªã‚Šã¾ã™ã€‚ã¾ãŸã€åŒ¿åã®å®› 先を表㙠":;" ã§çµ‚るアドレスもã€è‡ªå‹•çš„ã«æ¶ˆåŽ»ã•れã¾ã™ã€‚ 自分ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯è‡ªå‹•çš„ã«æ¶ˆåŽ»ã•れã¾ã™ã€‚自分ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ã€ `mew-config-alist' ãªã©ã‹ã‚‰ `mew-mail-address-list' ã«è‡ªå‹•設定ã•れã¾ã™ã€‚ ã“ã®å€¤ãŒæ°—ã«å…¥ã‚‰ãªã„ãªã‚‰ã€ä»¥ä¸‹ã®ã‚ˆã†ã«æ˜Žç¤ºçš„ã«è¨­å®šã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ (setq mew-mail-address-list '("^pooh@[a-z]*.example.org$" "^pooh@example.net$" "^winnie@example.jp$"))  File: mew.ja.info, Node: forward, Next: resend, Prev: reply, Up: Composing メッセージã®è»¢é€ ================ メッセージを転é€ã™ã‚‹ã«ã¯ã€Summary モード㧠`f' ã‚„ `F' を利用ã—ã¾ã™ã€‚ã™ ã‚‹ã¨ã€Draft モードã«ç§»è¡Œã—ã€ã‚らã‹ã˜ã‚ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ·»ä»˜é ˜åŸŸã«æ·»ä»˜ã•れ㟠è‰ç¨¿ãŒæº–å‚™ã•れã¾ã™ã€‚ ã¾ãŸ Draft ãƒ¢ãƒ¼ãƒ‰ã§æ·»ä»˜é ˜åŸŸã‚’用æ„ã—ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’コピー(`c')ã—ãŸã‚Šãƒ¡ãƒƒ セージã«ãƒªãƒ³ã‚¯(`l')ã‚’å¼µã£ãŸã‚Šã—ã¦ã‚‚ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’転é€ã§ãã¾ã™ã€‚ファイ ルåãŒæ•°å­—([0-9]+)ã®å ´åˆã¯ã€è‡ªå‹•çš„ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã ã¨åˆ¤æ–­ã•れã¾ã™ã€‚ã¾ãŸã€ 添付領域㧠`y' を使ã†ã¨ã€Message モードã«è¡¨ç¤ºã—ã¦ã„るメッセージã«ãƒªãƒ³ クを張るã®ã§ä¾¿åˆ©ã§ã™ã€‚ é€šå¸¸ã¯æ·»ä»˜ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å…¨ä½“ãŒè»¢é€ã•れã¾ã™ã€‚ã‚‚ã—ã€ãƒ˜ãƒƒãƒ€ã®ä¸€éƒ¨ã‚’削り㟠ã„å ´åˆã¯ã€`mew-field-delete-for-forwarding' を定義ã—ã¦ä¸‹ã•ã„。以下 ã« "Received:" 㨠"Return-Path:" ã‚’è»¢é€æ™‚ã«å‰Šã‚‹ãŸã‚ã®è¨­å®šä¾‹ã‚’示ã—ã¾ã™ã€‚ (setq mew-field-delete-for-forwarding '("Received:" "Return-Path:"))  File: mew.ja.info, Node: resend, Next: shortcut, Prev: forward, Up: Composing メッセージã®å†é€ ================ メッセージã®ãƒ˜ãƒƒãƒ€ã®ä¸€éƒ¨ã®ã¿ã‚’変更ã—ã¦ã€é€ä¿¡ã—ãŸã„å ´åˆãŒã‚りã¾ã™ã€‚ ãŸã¨ãˆã°ã€åŒã˜å†…容ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã€è¤‡æ•°ã®å®›å…ˆã«ç‹¬ç«‹ã—ã¦é€ã‚ŠãŸã„å ´åˆã§ã™ã€‚ pooh å®›ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã—ã¦ã€+queue ã«å…¥ã‚Œã€ã™ãã•ã¾ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ コピーã—ã€å®›å…ˆã ã‘ã‚’ piglet ã«å¤‰æ›´ã—ãŸã„å ´åˆã‚’想åƒã—ã¦ä¸‹ã•ã„。ã“れを〠メッセージã®å†åˆ©ç”¨ã«ã‚ˆã‚‹é€ä¿¡ã¨å‘¼ã³ã¾ã—ょã†ã€‚ ã¾ãŸã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« Resent-To: ã¨ã„ã†ãƒ•ィールドを付ã‘ã¦å†é€ã—ãŸã„ã“ã¨ã‚‚ ã‚りã¾ã™ã€‚ã“れã¯ã€è»¢é€ã®ä¸€ç¨®ã§ã™ã€‚ã“ã¡ã‚‰ã¯ãƒ˜ãƒƒãƒ€ã ã‘書ãç›´ã™ã®ã§ã€ãƒ˜ãƒƒ ダ変æ›ã¨ã„ã„ã¾ã™ã€‚å‰ç¯€ã§èª¬æ˜Žã—ãŸè»¢é€ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ–°è¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« 包ã¿è¾¼ã‚“ã§è»¢é€ã™ã‚‹ãŸã‚ã€ã‚«ãƒ—セル化ã¨å‘¼ã°ã‚Œã¦ã„ã¾ã™ã€‚ ヘッダã®ä¸€éƒ¨ã ã‘を編集ã—ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ãŸã‚Šã€ã‚­ãƒ¥ãƒ¼ã«å…¥ã‚ŒãŸã‚Šã™ã‚‹ モードã¨ã—ã¦ã€Header モードãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚本文ãŒç·¨é›†ã§ããªã„ Draft モードã ã¨æ€ãˆã°ã„ã„ã§ã—ょã†ã€‚ Header モードã«å…¥ã‚‹ãŸã‚ã«ã€Summary モードã«ã¯ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ãŒç”¨æ„ã•れ ã¦ã„ã¾ã™ã€‚ `W' メッセージã®å†åˆ©ç”¨ã«ã‚ˆã‚‹é€ä¿¡ã€‚対象ã¨ãªã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã® To:ã€Cc:〠From: ãªã©ã‚’æ›¸ãæ›ãˆã‚‹ãŸã‚ã«ã€Header モードã«ç§»è¡Œã™ã‚‹ã€‚典型的ã«ã¯ã€ +queue ã¾ãŸã¯ +postq ã«å…¥ã£ã¦ã„るメッセージã«å¯¾ã—ã¦åˆ©ç”¨ã™ã‚‹ã€‚ `r' メッセージã®å†é€ã€‚対象ã¨ãªã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ˜ãƒƒãƒ€ã«ã€Resent-To:〠Resent-Cc:ã€Resent-From: ãªã©ã‚’追加ã™ã‚‹ãŸã‚ã«ã€Header モードã«ç§» 行ã™ã‚‹ã€‚å†é€ã«ã‚ˆã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®è»¢é€ã¯ã€å—信者を混乱ã•ã›ã‚‹ã“ã¨ãŒã‚ ã‚‹ã®ã§ã€ã‚ˆã考ãˆã¦ã‹ã‚‰åˆ©ç”¨ã™ã‚‹ã“ã¨ã€‚ Header モードã§ã¯ã€Draft モードã®ã‚ˆã†ã«ã€è£œå®Œã‚„循環的ãªè£œå®ŒãŒåˆ©ç”¨ã§ã ã¾ã™ã€‚ヘッダã®å…¥åŠ›ãŒçµ‚ã‚ã£ãŸã‚‰ã€ä»¥ä¸‹ã®ã©ã¡ã‚‰ã‹ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’用ã„ã¦ã€ãƒ¡ãƒƒ セージをé€ä¿¡ã—ã¦ä¸‹ã•ã„。本文ãŒè¡¨ç¤ºã•れã¦ã„ãªã„ã®ã§ä¸å®‰ã‹ã‚‚ã—れã¾ã›ã‚“ãŒã€ ã¡ã‚ƒã‚“ã¨å¯¾è±¡ã¨ãªã£ã¦ã„ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ¬æ–‡ã¨ãƒ˜ãƒƒãƒ€ã®ä¸€éƒ¨ãŒå†åˆ©ç”¨ã•れã¾ã™ã€‚ `C-cC-m' メッセージを作æˆã— +queue ã¾ãŸã¯ +postq ã«å…¥ã‚Œã€é€ä¿¡å¾…ã¡çŠ¶æ…‹ã«ã™ る。 `C-cC-c' メッセージを作æˆã—é€ä¿¡ã™ã‚‹ã€‚"Really send this message? (y or n) " ã¨è¨Šã‹ã‚Œã‚‹ã€‚`y' を押ã›ã°é€ä¿¡ã•れる。  File: mew.ja.info, Node: shortcut, Next: mark-b-comp, Prev: resend, Up: Composing é›»å­ç½²å/æš—å·ãƒ¡ãƒ¼ãƒ«ã‚’作æˆã™ã‚‹ ============================= ã“ã“ã§ã¯ã€ãƒ†ã‚­ã‚¹ãƒˆã§ã‚る本文を PGP ã‚„ S/MIME ã§ç½²åã—ãŸã‚Šæš—å·åŒ–ã—ãŸã‚Š ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚紹介ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ `C-cC-s' è‰ç¨¿å…¨ä½“ã‚’ç½²åã™ã‚‹ã€‚パスフレーズを入力ã™ã‚‹ã“ã¨ã€‚ `C-cC-e' è‰ç¨¿å…¨ä½“ã‚’æš—å·åŒ–ã™ã‚‹ã€‚ `C-cC-b' è‰ç¨¿å…¨ä½“ã‚’ç½²å後暗å·åŒ–ã™ã‚‹ã€‚パスフレーズを入力ã™ã‚‹ã“ã¨ã€‚ `C-cC-r' è‰ç¨¿å…¨ä½“ã‚’æš—å·åŒ–後署åã™ã‚‹ã€‚パスフレーズを入力ã™ã‚‹ã“ã¨ã€‚ メッセージを暗å·åŒ–ã™ã‚‹ã«ã¯å—信者ã®å…¬é–‹éµã‚’使用ã—ã¾ã™ã€‚逆ã«ç½²åã™ã‚‹ã«ã¯ 自分ã®ç§˜å¯†éµã‚’使ã„ã¾ã™ã€‚よã£ã¦ã€ç½²åã™ã‚‹ãŸã‚ã«ã¯ãƒ‘スフレーズを入力ã™ã‚‹ å¿…è¦ãŒã‚りã¾ã™ã€‚ãŸã ã—ã€ãƒ‘スフレーズã®ä¿å­˜æ©Ÿèƒ½ã‚„マスターパスワードを使㣠ã¦ãŠã‚Šã€ãƒ‘スフレーズãŒä¿å­˜ã•れã¦ã„ã‚‹å ´åˆã¯ã€ãƒ‘スフレーズを入力ã™ã‚‹å¿…è¦ ã¯ã‚りã¾ã›ã‚“(*Note password::)。 ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€é€šå¸¸ PGP/MIME を作æˆã—ã¾ã™ã€‚S/MIME を作æˆã—ãŸã„å ´ åˆã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 (setq mew-draft-privacy-method 'smime) ã“ã®å¤‰æ•°ã®å€¤ã¯ã€Draft モード㮠`C-cC-pC-m' ã§ã‚‚変更ã§ãã¾ã™ã€‚ 上記4ã¤ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€æ¬¡ç¯€ã§èª¬æ˜Žã™ã‚‹ãƒžãƒ¼ã‚¯ã‚’使ã£ãŸä½œæˆæ–¹æ³•ã®çœç•¥æ–¹æ³•㫠当ãŸã‚Šã¾ã™ã€‚ メッセージã«ç½²åã‚’æ–½ã™ã«ã¯ã€`C-cC-s' ã¨å…¥åŠ›ã—ã¾ã™ã€‚ç½²åã®éš›ã«ã¯ã€è‡ªåˆ† ã®ç§˜å¯†éµã‚’復å·åŒ–ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã®ã§ã€ãƒ‘スフレーズãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れ㦠ã„ãªã‘れã°ã€å…¥åŠ›ã‚’ä¿ƒã•れã¾ã™ã€‚ç½²åãŒæ–½ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€+queue ã¾ãŸ ã¯+postq ã«æ ¼ç´ã•れã¾ã™ã€‚ 自分ã®ç§˜å¯†éµã¯ã€From: ã«ã‚るアドレスを元ã«ç‰¹å®šã•れã¾ã™ã€‚From: ãŒãªã„å ´ åˆã¯ã€ãƒ‡ãƒ•ォルトã®ç§˜å¯†éµãŒé¸æŠžã•れã¾ã™ã€‚From: ã«ã‚るアドレスã¨ã¯é•ã†ã‚¢ ドレスã§ç§˜å¯†éµã‚’指定ã—ãŸã„å ´åˆã¯ã€`C-uC-cC-s' ã¨å…¥åŠ›ã—ã¦ä¸‹ã•ã„。 メッセージを暗å·åŒ–ã™ã‚‹ã«ã¯ã€`C-cC-e' ã¨ã‚¿ã‚¤ãƒ—ã—ã¦ä¸‹ã•ã„。To: ã‚„ Cc: ㋠らアドレスを切り出ã—ã¦ã€ãã®å—信者ãŒå¾©å·åŒ–ã§ãã‚‹ã‚ˆã†æš—å·åŒ–ã—ã¾ã™ã€‚æš—å· åŒ–ã™ã‚‹ã ã‘ã®ãªã®ã§ã€ãƒ‘スフレーズを訊ã‹ã‚Œã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。作æˆã•れ㟠メッセージã¯ã€+queue ã«æ ¼ç´ã•れã¾ã™ã€‚ ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€å—信者ã®å…¬é–‹éµã«åŠ ãˆã¦ã€è‡ªåˆ†ã®å…¬é–‹éµã§ã‚‚æš—å·åŒ–ã•れ㦠ã„ã¾ã™ã€‚ã§ã™ã‹ã‚‰ã€ä½œæˆã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·åŒ–ã§ãã¾ã™ã€‚ãŸã¨ãˆã°ã€`g' ã§ +queue ã«ç§»å‹•ã—ã€å¿µã®ãŸã‚復å·åŒ–ã—ã¦ç¢ºèªã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ ç½²å後暗å·åŒ–ã™ã‚‹ã«ã¯ã€`C-cC-b' ã¨å…¥åŠ›ã—ã¾ã™ã€‚æš—å·åŒ–後署åã™ã‚‹ã«ã¯ã€ `C-cC-r' ã¨ã‚¿ã‚¤ãƒ—ã—ã¾ã™ã€‚ã©ã¡ã‚‰ã®å ´åˆã‚‚作æˆã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€+queue ã«è“„ãˆã‚‰ã‚Œã¾ã™ã€‚ ç½²åã‚’æ–½ã—ãŸã‚Šã€æš—å·åŒ–ã—ãŸã‚Šã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚ã†ã¨æ€ã£ã¦ã„ã¦ã‚‚ã€ã†ã£ ã‹ã‚Šå¿˜ã‚Œã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ã“れを防ããŸã‚ã«ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹ã‚³ãƒžãƒ³ ド `C-cC-m' ã‚„ `C-cC-c' を実行ã™ã‚‹ã¨ã€è‡ªå‹•çš„ã«ç½²åã‚„æš—å·åŒ–ã‚’æ–½ã™æ©Ÿèƒ½ãŒ ã‚りã¾ã™ã€‚ 作æˆã™ã‚‹ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ—ライãƒã‚·ã‚’ä¿è­·ã—ãŸã„ãªã‚‰ã€ `mew-protect-privacy-always' ã‚’ `t' ã«ã—ã¦ã€ `mew-protect-privacy-always-type' ã«åˆ©ç”¨ã—ãŸã„サービスを設定ã—ã¾ã™ã€‚ æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã™ã‚‹è¿”答メッセージã®ãƒ—ライãƒã‚·ã‚’ä¿è­·ã—ãŸã„㪠らã€`mew-protect-privacy-encrypted' ã‚’ `t' ã«ã—ã¦ã€ `mew-protect-privacy-encrypted-type' ã«åˆ©ç”¨ã—ãŸã„サービスを設定ã—ã¾ã™ã€‚ ã“ã®è¨­å®šã¯ã€æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã®è¿”ç­”ã™ã‚‹å ´åˆã€ä¸Šè¨˜ã®ã™ã¹ã¦ã®ãƒ¡ãƒ¼ ルã«å¯¾ã™ã‚‹è¨­å®šã‚ˆã‚Šã‚‚優先ã•れã¾ã™ã€‚ 以下ã«åˆ©ç”¨ã§ãるサービスを示ã—ã¾ã™ã€‚ã‹ã£ã“内ã¯ãれãžã‚Œã®ã‚µãƒ¼ãƒ“スを表㙠シンボルã§ã™ã€‚`C-cC-m' ã‚„ `C-cC-c' ã¨å…¥åŠ›ã™ã‚‹éš›ã«åˆ©ç”¨ã•れるサービスã¯ã€ モードラインã«è¡¨ç¤ºã•れã¾ã™ã€‚ pgp-signature (PS) PGP ã§ç½²å pgp-encryption (PE) PGP ã§æš—å·åŒ– pgp-signature-encryption (PSPE) PGP ã§ç½²å後暗å·åŒ– pgp-encryption-signature (PEPS) PGP ã§æš—å·åŒ–後署å smime-signature (SS) S/MIME ã§ç½²å smime-encryption (SE) S/MIME ã§æš—å·åŒ– smime-signature-encryption (SSSE) S/MIME ã§ç½²å後暗å·åŒ– smime-encryption-signature (SESS) S/MIME ã§æš—å·åŒ–後署å 以下ã®ä¾‹ã¯ã€ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ç½²åã™ã‚‹è¨­å®šã§ã™ã€‚ (setq mew-protect-privacy-always t) (setq mew-protect-privacy-always-type 'pgp-signature) 以下ã®ä¾‹ã¯ã€æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã®è¿”答メッセージã«å¯¾ã—ã€PGP ã§æš—å· åŒ–ã™ã‚‹è¨­å®šã§ã™ã€‚ (setq mew-protect-privacy-encrypted t) (setq mew-protect-privacy-encrypted-type 'pgp-encryption) Draft モードã§ã¯ã€`C-cC-pC-a' ã§ `mew-protect-privacy-always'〠`C-cC-pC-e' ã§ `mew-protect-privacy-encrypted' ã®å€¤ã‚’å転ã§ãã¾ã™ã€‚ Draft モードã«ãŠã„ã¦ç¾åœ¨æ›¸ã„ã¦ã„ã‚‹è‰ç¨¿ã«å¯¾ã—ã¦ã®ã¿ã‚らã‹ã˜ã‚サービスを 指定ã—ã¦ãŠãã€é€ä¿¡æ™‚ã«ã‚µãƒ¼ãƒ“スを施ã™ã“ã¨ã‚’忘れãªã„よã†ã«ã§ãã¾ã™ã€‚ç¾åœ¨ ã®è‰ç¨¿ã«å¯¾ã— `C-cC-m' ã‚„ `C-cC-c' ã§æ–½ã•れるサービスを指定ã™ã‚‹ã«ã¯ã€ `C-cC-pC-d' ã«ç¶šã„ã¦ä¸Šè¨˜ã®ã‚µãƒ¼ãƒ“ス㮠1 ã¤ã‚’入力ã—ã¦ä¸‹ã•ã„。ç¾åœ¨ã®ã‚µãƒ¼ ビスをキャンセルã™ã‚‹ã«ã¯ã€ã‚µãƒ¼ãƒ“スåã®ä»£ã‚Šã«å˜ã« `RET' を押ã—ã¦ä¸‹ã•ã„。 `C-cC-c' ã‚„ `C-cC-m' ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹éš›ã€ç½²åã‚„æš—å·åŒ–㫠失敗ã—ãŸã‚‰ã€è‰ç¨¿ã«æˆ»ã‚Šã¾ã™ã€‚ã“ã®ã¨ã指定ã—ã¦ã„ãŸã‚µãƒ¼ãƒ“スã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れ ã¾ã™ã€‚ç¶šã‘㦠`C-cC-c' ã‚„ `C-cC-m' ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹ã¨ã€æ™® 通ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½œæˆã•れるã®ã§æ°—ã‚’ã¤ã‘ã¦ä¸‹ã•ã„。å•題をå–り除ã„ãŸå¾Œã€åŒã˜ サービスを望むãªã‚‰ã€æ˜Žç¤ºçš„ã« `C-cC-pC-d' ã§ã‚µãƒ¼ãƒ“スを指定ã™ã‚‹ã‹ã€ `C-cC-s'ã€`C-cC-e' ãªã©ã‚’用ã„ã¦ä¸‹ã•ã„。 `mew-use-old-pgp' ã‚’ `t' ã«è¨­å®šã™ã‚Œã°(åˆæœŸå€¤ã¯ `nil')ã€`C-cC-s' ã‚„ `C-cC-e' 㯠PGP/MIME ã®ä»£ã‚Šã«ã€å¤ã„ PGP ã®æ›¸å¼ã«å¾“ã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç”Ÿæˆ ã—ã¾ã™ã€‚添付領域ãŒã‚ã‚‹å ´åˆã¯ã€ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ã€‚ 上記ã§èª¬æ˜Žã—㟠`mew-protect-privacy-*' ã¯ã€PGP/MIME ã®ã¿ã«æœ‰åйã§ã‚り〠å¤ã„ PGP ã«ã¯æ©Ÿèƒ½ã—ã¾ã›ã‚“。`C-cC-m' ã‚„ `C-cC-c' ã§å¸¸ã«å¤ã„ PGP ã®ç½²å ã‚’æ–½ã™ã«ã¯ã€`mew-protect-privacy-with-old-pgp-signature'ã‚’ `t' ã«ã—㦠下ã•ã„。 PGP/MIME ã‚„ S/MIME ã®ãŸã‚ã« Mew 㯠GnuPG 1.x 㨠2.0 をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ ã™ãŒã€2.1 ã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。  File: mew.ja.info, Node: mark-b-comp, Next: pgp-key, Prev: shortcut, Up: Composing マークを使ã£ãŸé›»å­ç½²å/æš—å·ãƒ¡ãƒ¼ãƒ«ã®ä½œæˆ ======================================= PGP/MIMEã€S/MIMEã€ãŠã‚ˆã³ ZIP をサãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«ã€ãƒžãƒ¼ã‚¯ã‚’使ã£ãŸä½œæˆ æ–¹æ³•ãŒæä¾›ã•れã¦ã„ã¾ã™ã€‚以å‰ã®ä¾‹ã‚’æ€ã„出ã—ã¦ã¿ã¾ã—ょã†ã€‚ ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* B 2 Image/Gif MagicPoint ã®ãƒ­ã‚´ mgp.gif Q 3 Application/Postscript 資料 ohp.ps 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- 行頭㫠`B' ã‚„ `Q' ã¨ã„ã£ãŸãƒžãƒ¼ã‚¯ãŒã‚りã¾ã™ã€‚ã“ã®ãƒžãƒ¼ã‚¯ã¯ç¬¦å·åŒ–ã‚’æ„味㗠ã¦ã„ã¾ã™ã€‚Mew ã§ã¯ã€æ–°ã—ã„æ¦‚念「符å·åŒ–ã€ã‚’å°Žå…¥ã—ã¦ã„ã¾ã™ã€‚符å·åŒ–ã«ã¯ã€ Base64ã€Quoted-Printableã€Gzip64 (Gzip + Base64)ã€ç½²åã€æš—å·åŒ–ãªã©ãŒã‚ りã¾ã™ã€‚ ç¾åœ¨æ¬¡ã® 8 ã¤ã®ãƒžãƒ¼ã‚¯ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™ã€‚ `" "' 符å·åŒ–ã—ãªã„。ãŸã ã—ã€8 ビットã®ãƒ†ã‚­ã‚¹ãƒˆã¯ç¬¦å·åŒ–ã•れるã‹ã‚‚ã—れ㪠ã„。 `B' Base64 `Q' Quoted-Printable `G' Gzip64(gzip 圧縮㗠Base64 ã§ç¬¦å·åŒ–ã™ã‚‹ã€‚Mew ãŒå®Ÿé¨“çš„ã«æŽ¡ç”¨ã—ã¦ã„ る。相手㌠Mew を使ã£ã¦ã„ãªã„å ´åˆã¯ã€ä½¿ç”¨ã™ã¹ãã§ã¯ãªã„。) `PS' PGP ã§é›»å­ç½²å。 `PE' PGP ã§æš—å·åŒ–。 `SS' S/MIME ã§é›»å­ç½²å。 `SE' S/MIME ã§æš—å·åŒ–。 添付領域ã§ã®ãƒžãƒ¼ã‚¯ã«é–¢ä¿‚ã™ã‚‹æ–°ã—ã„キー割当ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ `B' Base64 ã§ç¬¦å·åŒ–ã™ã‚‹ãŸã‚ `B' マークを付ã‘る。 `Q' Quoted-Printable ã§ç¬¦å·åŒ–ã™ã‚‹ãŸã‚ `Q' マークを付ã‘る。 `G' Gzip64 ã§ç¬¦å·åŒ–ã™ã‚‹ãŸã‚ `G' マークを付ã‘る。ãŸã ã—ã€Text/Plain 㨠Application/Postscript ã§ã—ã‹å®Ÿè¡Œã§ããªã„。ã“れ以外ã®åž‹ã«ã¯åœ§ç¸®ã¯ ç„¡æ„味ã§ã‚る。ãªãœãªã‚‰ã€jpeg ãªã©ã¯ã‚らã‹ã˜ã‚圧縮ã•れã¦ã„ã‚‹ã‹ã‚‰ã€‚ `S' PGP ã§ç½²åã™ã‚‹ãŸã‚ `PS' マークを付ã‘る。 `E' PGP ã§æš—å·åŒ–ã™ã‚‹ãŸã‚ `PE' マークを付ã‘る。å—信者ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力 ã™ã‚‹ã€‚ `M-s' S/MIME ã§ç½²åã™ã‚‹ãŸã‚ `SS' マークを付ã‘る。 `M-e' S/MIME ã§æš—å·åŒ–ã™ã‚‹ãŸã‚ `SE' マークを付ã‘る。å—信者ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’å…¥ 力ã™ã‚‹ã€‚ `Z' ZIP ã§ç›´ã¡ã«æš—å·åŒ–ã™ã‚‹ã€‚æš—å·åŒ–ã•れãŸå¾Œã¯ã€`B'マークãŒä»˜ã。 `U' 符å·åŒ–ã‚’å…ƒã«æˆ»ã™ã€‚元々ã®ãƒžãƒ¼ã‚¯ã«æˆ»ã‚‹ã€‚ 次ã®ä¾‹ã‚’考ãˆã¦ã¿ã¾ã—ょã†ã€‚パート 2 㯠PGP ã§ç½²åã•れã€"kazu" 用㫠PGP ã§æš—å·åŒ–ã•れã¾ã™ã€‚安心ã—ã¦ä¸‹ã•ã„。説明ã®éƒ¨åˆ†ã¯ä¸Šæ›¸ãã•れã¦ã„ã¾ã™ãŒã€ä¿ å­˜ã•れã¦ã„ã¾ã™ã€‚パート 3 㯠Gzip64 ã§ç¬¦å·åŒ–ã•れã¾ã™ã€‚ ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* PSPE 2 Image/Gif kazu@example.org mgp.gif G 3 Application/Postscript 資料 ohp.ps 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- マークを付ã‘ãŸå¾Œã¯ã€`C-cC-m' ã‚„ `C-cC-c' を使ã£ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã— ã¦ä¸‹ã•ã„。  File: mew.ja.info, Node: pgp-key, Next: anonymous, Prev: mark-b-comp, Up: Composing PGP ã®éµã®é…布 ============== PGP ã®å…¬é–‹éµã‚’é…布ã™ã‚‹ã«ã¯ã€Draft ãƒ¢ãƒ¼ãƒ‰ã®æ·»ä»˜é ˜åŸŸã§ `p' を押ã—ã¦ä¸‹ã• ã„。ã ã‚Œã®å…¬é–‹éµã‚’é…布ã™ã‚‹ã‹å°‹ã­ã‚‰ã‚Œã¾ã™ã€‚自分ã®å…¬é–‹éµã§ã‚れã°ã€å˜ã« `RET' ã¨å…¥åŠ›ã—ã¦ä¸‹ã•ã„。他人ã®å…¬é–‹éµã§ã‚れã°ã€è£œå®Œã‚’利用ã—ãªãŒã‚‰ãã®äºº ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ä¸‹ã•ã„。PGP ã®å…¬é–‹éµã¯ã€Application/Pgp-Keys ã¨ã„ ã†ãƒ‡ãƒ¼ã‚¿åž‹ã§é…é€ã•れã¾ã™ã€‚ Summary モードã€ã‚ã‚‹ã„ã¯ã€Virtual モードã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読んã§ã„ã‚‹éš›ã«ã€ ã‚るパートã®ãƒ‡ãƒ¼ã‚¿åž‹ãŒ Application/Pgp-Keys ã§ã‚れã°ã€Mew 㯠PGP ã®å…¬ é–‹éµãƒªãƒ³ã‚°ã«ãれを登録ã—よã†ã¨ã—ã¾ã™ã€‚Mew ã¯ã€ã€Œä¿¡ç”¨åº¦ã€ã¨ã€Œæœ‰åŠ¹æ€§ã€ã‚’ å…¨ã考慮ã—ãªã„ã“ã¨ã«æ³¨æ„ã—ã¦ä¸‹ã•ã„。ã“れらã®å€¤ã‚’設定ã™ã‚‹ã®ã¯ã€ã‚ãªãŸè‡ª 身ã§ã™ã€‚設定㯠Mew ãŒè¡¨ç¤ºã™ã‚‹èª¬æ˜Žã«å¾“ã£ã¦ä¸‹ã•ã„。もã—ã€ã€Œä¿¡ç”¨åº¦ã€ã¨ 「有効性ã€ã®æ„味ãŒåˆ†ã‹ã‚‰ãªã‘れã°ã€PGP を使ã£ã¦è‡ªåˆ†ã®ãƒ—ライãƒã‚·ã‚’ä¿è­·ã— よã†ã¨ã™ã‚‹å‰ã«ã€PGP ãŒæä¾›ã™ã‚‹ã€Œä¿¡ç”¨ã®è¼ªã€ã¨ã¯ä½•ã‹ã‚’å­¦ã¶ã¹ãã§ã™ã€‚  File: mew.ja.info, Node: anonymous, Next: Marks, Prev: pgp-key, Up: Composing 宛先を匿åã«ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€ä¿¡ ================================ 宛先を匿åã«ã—ã¦ã€è¤‡æ•°ã®å—信者ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ãŸã„ã“ã¨ãŒã‚りã¾ã™ã€‚ ãŸã¨ãˆã°ã€pooh ãŒãƒ‘ーティーã¸ã®ãŠèª˜ã„を複数ã®å‹é”ã«é€ã‚‹ã“ã¨ã‚’考ãˆã¦ä¸‹ ã•ã„。パーティーã¸å‚加ã™ã‚‹ã¨ã„ㆠpiglet ã‹ã‚‰ã®è¿”事ã¯ã€pooh ã®ã¿ã«é€ã‚‹ ã¹ãã§ã™ã€‚ã—ã‹ã—ã€To: ã«ãŸãã•ã‚“ã®å‹é”を列挙ã—ã¦ã„ã‚‹ã¨ã€piglet ã¯èª¤ã£ ã¦å¤šãã®äººã«è¿”答をé€ã‚Šã¤ã‘ã¦ã—ã¾ã†ã‹ã‚‚ã—れã¾ã›ã‚“。ãã‚‚ãã‚‚ã€pooh ã¯èª° を誘ã£ãŸã®ã‹ã€å½“æ—¥ã¾ã§ãµã›ã¦ãŠããŸã„ã“ã¨ã‚‚ã‚ã‚‹ã§ã—ょã†ã€‚ ã“ã®ã‚ˆã†ãªè¦æœ›ã‚’実ç¾ã™ã‚‹ãŸã‚ã«ã€Mew ã§ã¯åŒ¿åã®å®›å…ˆã¨ã—ã¦ã€":;" を利用 ã—ã¾ã™ã€‚以下ã®ä¾‹ã‚’見ã¦ä¸‹ã•ã„。 To: party:piglet@example.org,roo@example.org; From: Pooh "party" ã¨ã„ã†èª¬æ˜Žæ–‡å­—列ã®å¾Œã« ":" ãŒã‚りã¾ã™ã€‚ãã—ã¦ã€ã„ãã¤ã‹ã‚¢ãƒ‰ãƒ¬ ス㌠"," ã§åŒºåˆ‡ã‚‰ã‚ŒãªãŒã‚‰åˆ—挙ã•れã€";" ã§çµ‚端ã•れã¦ã„ã¾ã™ã€‚ã“ã®ã‚ˆã†ãª å½¢å¼ã§ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’書ãã¨ã€Mew 㯠":" 㨠";" ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’届㑠ã¾ã™ãŒã€ãƒ˜ãƒƒãƒ€ã‹ã‚‰ã¯å‰Šã‚Šå–りã¾ã™ã€‚ã“ã®ä¾‹ã§ã¯ã€piglet 㨠roo ã¯ä»¥ä¸‹ã®ã‚ˆ ã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–りã¾ã™ã€‚ To: party:; From: Pooh å—信者ã¯ã“ã®ãƒ˜ãƒƒãƒ€ã‹ã‚‰ã€é€ä¿¡è€…㯠pooh ã§ã‚ã‚‹ã“ã¨ã¯åˆ†ã‹ã‚Šã¾ã™ãŒã€è‡ªåˆ†ä»¥ 外ã®èª°ã«é€ã‚‰ã‚ŒãŸã®ã‹ã¯ã€æƒ³åƒã™ã‚‹ã»ã‹ã‚りã¾ã›ã‚“。ã¾ãŸã€"party:;" ã¨ã„ㆠ文字列ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã¯ã‚りã¾ã›ã‚“ã‹ã‚‰ã€ã“ã“ã«è¿”ç­”ã™ã‚‹ã“ã¨ã‚‚ä¸å¯èƒ½ã§ã™ã€‚ ãªãŠã€To: ã‚„ Cc: ã«ãŸãã•ã‚“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’列挙ã™ã‚‹ã“ã¨ã¯ã€æœ¬è³ªçš„ã«ã‚ˆã„ã“ ã¨ã§ã¯ã‚りã¾ã›ã‚“。特定ã®äººã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’何度もé€ä¿¡ã™ã‚‹æ©Ÿä¼šãŒã‚ã‚‹ãªã‚‰ã€ 通常メーリングリストを作æˆã—ã¾ã™ã€‚  File: mew.ja.info, Node: Marks, Next: unread mark, Prev: anonymous, Up: Top 愉快ãªãƒžãƒ¼ã‚¯ãŸã¡ **************** ã“ã“ã§ã¯ã€Summary モードã§ãƒ¦ãƒ¼ã‚¶ãŒä»˜ã‘ãŸã‚Šæ¶ˆã—ãŸã‚Šã§ãるマークã«ã¤ã„㦠説明ã—ã¾ã™ã€‚ã“ã®ãƒžãƒ¼ã‚¯ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã€è¡Œé ­ã«ä»˜ãã¾ã™ã€‚(Mew ãŒä»˜ã‘るマー ã‚¯ã¯æ—¥ä»˜ã®å·¦ã«ä»˜ãã“ã¨ã«æ³¨æ„。) D 03/12 Hidenori Ohta 今週末 |日曜ã«ã‚¹ãƒˆãƒ¼ãƒ³ãƒžã‚¸ãƒƒã‚¯ oM03/14 ã‚‚ã‚‚ã¡ã‚ƒã‚“ 能登ã®å†™çœŸ |ã“ã®å‰æ’®ã£ãŸå†™çœŸã‚’添付 * 03/15 Neat Sumikawa Re: ワイン |ã˜ã‚ƒãã€æ°´æ›œæ—¥ã«ä¾‹ã®åº— ç¾åœ¨åˆ©ç”¨ã§ãるマークã¯ä»¥ä¸‹ã® 6 ã¤ã§ã™ã€‚ `U' 未読マーク。 `D' 消去ã®ãƒžãƒ¼ã‚¯ã€‚ `X' 消去ã®ãƒžãƒ¼ã‚¯ã€‚ `o' æ•´é “ã€ã¤ã¾ã‚Šã€ãƒ•ォルダを移動ã•ã›ã‚‹ãƒžãƒ¼ã‚¯ã€‚ `*' 処ç†ã®å¯¾è±¡ã¨ã™ã‚‹ãƒžãƒ¼ã‚¯ã€‚ `$' マークを一時的ã«å¾…é¿ã™ã‚‹ãŸã‚ã®ãƒžãƒ¼ã‚¯ã€‚ マークを付ã‘ã‚‹ã ã‘ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒãªããªã£ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。 `o'ã€`D'ã€`X' ã¨ã„ã£ãŸãƒžãƒ¼ã‚¯ã‚’実際ã«å‡¦ç†ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã¯ã€`x' ã§ã™ã€‚マー クを付ã‘ã‚‹ã®ã¯æ°—軽ã«ã§ãã¾ã™ãŒã€`x' を押ã™ã¨ãã¯æ…Žé‡ã«ãŠé¡˜ã„ã—ã¾ã™ã€‚ 以下ãれãžã‚Œã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ã¾ãŸã€Mew ãŒè¡¨ç¤ºã™ã‚‹ãƒžãƒ¼ã‚¯ã«ã¤ã„ã¦ã‚‚ã¾ ã¨ã‚ã¾ã™ã€‚ * Menu: * unread mark:: 未読 `U' * delete mark:: 消去 `D'ã€`X' * refile mark:: æ•´é “ `o' * target mark:: 対象 `*' * escape mark:: å¾…é¿ `$' * unmark:: ãƒžãƒ¼ã‚¯ã®æ¶ˆåŽ» * mark change:: マークã®å¤‰æ› * sync:: IMAP サーãƒã¨ã®ãƒžãƒ¼ã‚¯ã®æ•´åˆæ€§ * off-line:: IMAP ã®ãŸã‚ã®ãƒžãƒ¼ã‚¯ã®ã‚ªãƒ•ãƒ©ã‚¤ãƒ³å‡¦ç† * mew-mark:: Mew ãŒè¡¨ç¤ºã™ã‚‹ãƒžãƒ¼ã‚¯  File: mew.ja.info, Node: unread mark, Next: delete mark, Prev: Marks, Up: Marks 未読 `U' ======== 以下ã®ã‚ˆã†ã«è¨­å®šã™ã‚‹ã¨ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’一覧表示ã™ã‚‹éš›ã«ã€æœªèª­ãƒžãƒ¼ã‚¯ `U' ãŒãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ä»˜ãã¾ã™ã€‚ (setq mew-use-unread-mark t) `SPC'ã€`n'ã€ãŠã‚ˆã³ `p' ãªã©ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読む㨠`U' ãƒžãƒ¼ã‚¯ã¯æ¶ˆãˆã¾ã™ã€‚ ã“ã®ä¸‰ã¤ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€é€šå¸¸ `*' マークã€`U' マークã€ãŠã‚ˆã³ãƒžãƒ¼ クã®ä»˜ã„ã¦ã„ãªã„メッセージを読ã¿é€²ã¿ã¾ã™ã€‚`zSPC' を押ã™ã¨ã€ã“れら 㯠`*' マーク㨠`U' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ã‚’読ã¿é€²ã‚ã¾ ã™ã€‚ã“れã¯ã€æœªèª­ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読ã¿é€²ã‚ã‚‹å ´åˆã«ä¾¿åˆ©ã§ã™ã€‚ã‚‚ã†ä¸€åº¦ `zSPC' を実行ã™ã‚‹ã¨ã€å¯¾è±¡ã¨ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå…ƒã«æˆ»ã‚Šã¾ã™ã€‚ å‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ãƒžãƒ¼ã‚¯ã‚’付ã‘ã¦ã€ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã—ã¦æ¥ã‚‹ã¨ã€`U' ãƒžãƒ¼ã‚¯ã¯æ¶ˆãˆã¾ã™ã€‚`SPC'ã€`n'ã€ãŠã‚ˆã³ `p' ã§ç§»å‹•ã—ã¦æ¥ãŸå ´åˆã¯ã€ã“ã®ãƒ¡ãƒƒ セージを読むã“ã¨ã‚’æ„図ã—ã¦ã„ã‚‹ã¯ãšã§ã™ãŒã€ãƒžãƒ¼ã‚¯ã‚’付ã‘ã‚‹ã“ã¨ã§ç§»å‹•ã—㟠場åˆã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読むã“ã¨ã‚’æ„図ã—ã¦ã„ãªã„ã‹ã‚‚ã—れã¾ã›ã‚“。ãã®å ´åˆã€ `U' ãƒžãƒ¼ã‚¯ãŒæ¶ˆãˆã‚‹ã¨å°‘ã—ä¸ä¾¿ã§ã™ã€‚マークを付ã‘ã‚‹ã“ã¨ã§ç§»å‹•ã—ãŸéš›ã«ã€ `U' マークを消ã—ãŸããªã„ã®ã§ã‚れã°ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã™ã‚‹ã¨ã‚ˆã„ã§ã—ょã†ã€‚ (setq mew-delete-unread-mark-by-mark nil) 以下㫠`U' マークã«é–¢ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ `zSPC' `SPC'ã€`n'ã€ãŠã‚ˆã³ `p' ãŒèª­ã¿é€²ã‚る対象ã¨ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å転ã•㛠る。å転ã¨ã¯ã€ã€Œ`U' マークã€`*' マークã€ãŠã‚ˆã³ãƒžãƒ¼ã‚¯ãªã—ã€ã¨ã€Œ`U' マークãŠã‚ˆã³ `*' マークã€ã«å¯¾ã—ã€ä¸€æ–¹ã‚’ä»–æ–¹ã¸å¤‰ãˆã‚‹ã“ã¨ã€‚ `M-u' `U' マークを付ã‘る。  File: mew.ja.info, Node: delete mark, Next: refile mark, Prev: unread mark, Up: Marks 消去 `D'ã€`X' ============= メッセージを消去ã™ã‚‹ã«ã¯ã€ã¾ãš Summary モード㧠`d' を押ã—ã¦ã€ `D' マークを付ã‘ã¾ã™ã€‚マークを付ã‘ãŸã ã‘ã§ã¯ä½•ã‚‚èµ·ã“らãªã„ã®ã§ã€é–“ é•ã£ã¦ `d' を押ã—ã¦ã‚‚大丈夫ã§ã™ã€‚デフォルトã§ã¯ã€`x' を押ã™ã¨ `D' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚´ãƒŸç®±ã«ç§»å‹•ã—ã¾ã™ã€‚ ローカル・フォルダã®ãŸã‚ã®ã‚´ãƒŸç®±ã¯ +trash ã§ã™ã€‚IMAP ã®ãŸã‚ã®ã‚´ãƒŸç®±ã¯ã€ %trash ã§ã™ã€‚ ゴミ箱ã®ä¸­ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å®Ÿéš›ã«æ¶ˆåŽ»ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã® 2 ã¤ã®æ–¹æ³•ãŒã‚り㾠ã™ã€‚ 1. Summary モード㧠`D' を実行ã™ã‚‹ã€‚ 2. ゴミ箱㧠`D' マークを付ã‘ã¦ã€`x' を押ã™ã€‚ ã‚‚ã†å°‘ã—æ­£ç¢ºã«è¨€ã†ã¨ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダã§ã¯ä»¥ä¸‹ã®ãƒ«ãƒ¼ãƒ«ãŒé©ç”¨ã•れã¾ã™ã€‚ (`mew-trash-folder' ã®åˆæœŸå€¤ã¯ +trash。 `mew-trash-folder-list' ã®åˆæœŸå€¤ã¯ `nil'。) - `mew-trash-folder' ㌠`nil' ãªã‚‰ã€`D' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ 消去ã•れる。 - `mew-trash-folder-list' ãŒå®šç¾©ã•れã¦ã„ãŸã‚‰ã€ãれらã®ãƒ•ォルダ ã§ `D' マークを付ã‘ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯æ¶ˆåŽ»ã•れる。ãれ以外ã®ãƒ•ォルダã‹ã‚‰ã¯ `mew-trash-folder' ã¸ã€‚ - `mew-trash-folder-list' ㌠`nil' ãªã‚‰ã€ `mew-trash-folder' ã§ `D' マークを付ã‘ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯æ¶ˆåŽ»ã•れる。ãれ以外ã®ãƒ•ォルダã‹ã‚‰ã¯ `mew-trash-folder' ã¸ã€‚(ã“れãŒåˆæœŸå€¤ã€‚) IMAP ã«å¯¾ã—ã¦ã¯ã€`mew-imap-trash-folder' 㨠`mew-imap-trash-folder-list' ã«å¾“ã£ã¦ã€åŒã˜è¦å‰‡ãŒé©ç”¨ã•れã¾ã™ã€‚ ã™ã¹ã¦ã® `*' マークを `D' マークã«å¤‰æ›ã§ãれã°ã€ä¸€åº¦ã«ãŸãã•ã‚“ã® `D' マークを付ã‘られã¦ä¾¿åˆ©ã§ã™ã€‚ã“れã«ã¯ã€`md' を利用ã—ã¦ä¸‹ã•ã„。 ã¾ãŸã€`Md' を使ã†ã¨ã€ç¾åœ¨ã®ãƒ•ォルダ内ã§åŒã˜ Message-Id: ã‚’æŒã¤ãƒ¡ãƒƒã‚»ãƒ¼ ジãŒã‚ã‚‹å ´åˆã€1 ã¤ã‚’残ã—ã¦ä»–ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« `D' ãŒä»˜ãã¾ã™ã€‚ `D' マークã«ä¼¼ãŸã‚‚ã®ã« `X' マークãŒã‚りã¾ã™ã€‚ã“ã®ãƒžãƒ¼ã‚¯ã®ä»˜ã‘られãŸãƒ¡ãƒƒ セージã¯ã€`x' を押ã—ãŸéš›ã«å¿…ãšæ¶ˆåŽ»ã•れã¾ã™ã€‚`X' マークã¯ã€`M-d' ã§ä»˜ã‘ ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ `mxM-d' ã§ã€`X' マークãŒä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã ã‘を処ç†ã§ãã¾ã™ã€‚ ã™ã¹ã¦ã® `*' マークを `X' マークã«å¤‰æ›ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ `mM-d' ã§ã™ã€‚ 以下ã«ã€`D' マーク㨠`X' マークã«é–¢ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ `d' `D' マークを付ã‘る。 `M-d' `X' マークを付ã‘る。 `md' `*' マークを `D' マークã¸å¤‰æ›ã™ã‚‹ã€‚ `mM-d' `*' マークを `X' マークã¸å¤‰æ›ã™ã‚‹ã€‚ `x' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’処ç†ã™ã‚‹ã€‚ `mxd' `D' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ã‚’処ç†ã™ã‚‹ã€‚ `mxM-d' `X' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ã‚’消去ã™ã‚‹ã€‚ `D' ゴミ箱ã®ä¸­ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’全部消去ã™ã‚‹ã€‚ `C-uD' 指定ã•れãŸãƒ•ォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’全部消去ã™ã‚‹ã€‚  File: mew.ja.info, Node: refile mark, Next: target mark, Prev: delete mark, Up: Marks æ•´é “ `o' ======== メッセージを整頓ã™ã‚‹ã«ã¯ `o' を押ã—ã¦ã€ç§»å‹•å…ˆã®ãƒ•ォルダを入力ã—〠`o' マークを付ã‘ã¾ã™ã€‚移動先ã®ãƒ•ォルダã¯ã€è³¢ã推測ã—ã¦ãれるã®ã§ã€ ã»ã©ã‚“ã©ã®å ´åˆã¯ãƒ•ォルダåを入力ã™ã‚‹ä»£ã‚り㫠`RET' を押ã™ã ã‘ã§ã™ã€‚ "," ã§åŒºåˆ‡ã£ã¦è¤‡æ•°ã®ãƒ•ォルダを入力ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã‚‚ã¡ã‚ん〠`TAB' ã§è£œå®Œã§ãã¾ã™ã€‚詳ã—ã㯠*Note Refile:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 `o' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸Šã§ `o' を押ã™ã¨ã€ç§»å‹•先を追加ã—ãŸã‚Šå¤‰ æ›´ã—ãŸã‚Šã§ãã¾ã™ã€‚ã¾ãŸã€å®Ÿéš›ã®ç§»å‹•㯠`x' ã¨å…¥åŠ›ã•れãŸã¨ãã«å®Ÿè¡Œã•れ㾠ã™ã€‚ 複数ã®ãƒ•ォルダを指定ã—ã€ç§»å‹•ã•ã›ãŸã¨ãã®ã“ã¨ã‚’考ãˆã¾ã—ょã†ã€‚ãƒãƒ¼ãƒ‰ãƒªãƒ³ ã‚¯ã®æ©Ÿèƒ½ã‚’æŒã¤ãƒ•ァイルシステムを使ã£ã¦ã„ã‚‹å ´åˆã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯æœ€åˆã® フォルダã«ç§»å‹•ã•れã€ãã®ä»–ã®ãƒ•ォルダã‹ã‚‰ã¯ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ãŒå¼µã‚‰ã‚Œã¾ã™ã€‚ã ã†ã§ãªã„ファイルシステムã®å ´åˆã¯ã€æœ€åˆã®ãƒ•ォルダã«ç§»å‹•後ã€ãã®ä»–ã®ãƒ•ã‚© ルダã¸è¤‡è£½ã•れã¾ã™ã€‚ 指定ã—ãŸãƒ•ォルダ㌠1 ã¤ã§ã€ã—ã‹ã‚‚ãれãŒç¾åœ¨ã®ãƒ•ォルダã§ã‚ã‚‹å ´åˆã€æ•´é “ ã—ã¦ã‚‚ãªã«ã‚‚èµ·ã“りã¾ã›ã‚“。指定ã—ãŸãƒ•ォルダãŒè¤‡æ•°ã§ã€ç¾åœ¨ã®ãƒ•ォルダãŒå« ã¾ã‚Œã‚‹å ´åˆã€ç¾åœ¨ã®ãƒ•ォルダ内ã§ã®ç•ªå·ã‚’ä¿ã£ãŸã¾ã¾ã€ãã®ä»–ã®ãƒ•ォルダã‹ã‚‰ ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ãŒå¼µã‚‰ã‚Œã‚‹ã‹ã€ãã®ä»–ã®ãƒ•ォルダã¸è¤‡è£½ã•れã¾ã™ã€‚ `o' ã«ä¼¼ã¦ã„ã¾ã™ãŒã€ã‹ãªã‚‰ãšç¾åœ¨ã®ãƒ•ォルダも候補ã¨ã—ã¦æç¤ºã™ã‚‹ `c' ã¨ã„ã†ã‚³ãƒžãƒ³ãƒ‰ã‚‚用æ„ã•れã¦ã„ã¾ã™ã€‚ 以下ã«ã€`o' マークã«é–¢ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ `o' `o' マークを付ã‘る。 `c' `o' マークを付ã‘る。推測ã—ãŸãƒ•ォルダã«åŠ ãˆã¦ã€ç¾åœ¨ã®ãƒ•ォルダも候 補ã¨ã—ã¦æç¤ºã™ã‚‹ã€‚ `x' `o' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’移動ã•ã›ã‚‹ã€‚ `mxo' `o' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ã‚’移動ã•ã›ã‚‹ã€‚ä»–ã®ãƒžãƒ¼ã‚¯ã¯å‡¦ç†ã—ãªã„。 `C-umxo' `o' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸­ã§ã€ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¨åŒã˜ç§»å‹•å…ˆ ã‚’æŒã¤ã‚‚ã®ã®ã¿ã‚’移動ã•ã›ã‚‹ã€‚  File: mew.ja.info, Node: target mark, Next: escape mark, Prev: refile mark, Up: Marks 対象 `*' ======== 後ã‹ã‚‰èª­ã¿è¿”ã—ãŸã„メッセージã«ã¯ã€`*' ã§ `*' マークを付ã‘ã¦ä¸‹ã•ã„。㾠ãŸã€é¸æŠžã‚³ãƒžãƒ³ãƒ‰ `?' を使ã†ã¨ã€å…¥åŠ›ã—ãŸæ¡ä»¶ã«ãƒžãƒƒãƒã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« `*' マークãŒä»˜ãã¾ã™(詳ã—ãã¯ã€*Note search:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„)。`N' ã‚„ `P' ã§ `*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã—表示ã§ãã¾ã™ã€‚ 以下ã«ã€`*' ã«é–¢é€£ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’示ã—ã¾ã™ã€‚ `*' `*' マークを付ã‘る。 `N' 下方å‘ã® `*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ç§»å‹•ã—表示。 `P' 上方å‘ã® `*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ç§»å‹•ã—表示。 `ma' マークã®ä»˜ã„ã¦ã„ãªã„メッセージã™ã¹ã¦ã« `*' マークを付ã‘る。 `mr' 入力ã—ãŸæ­£è¦è¡¨ç¾ã«ãƒžãƒƒãƒã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« `*' マークを付ã‘る。 `*' マークã¯ã€è¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’処ç†ã™ã‚‹ãŸã‚ã«ã‚‚利用ã—ã¾ã™ã€‚以下ã«è¤‡æ•° ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’処ç†ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’示ã—ã¾ã™ã€‚ `F' `*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ MIME å½¢å¼ã§è»¢é€ã™ã‚‹ãŸã‚ã®è‰ç¨¿ã‚’準備。 `J' 大ããªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ Message/Partial ã¨ã—ã¦è¤‡æ•°ã«åˆ†å‰²ã•れã¦ã„ã‚‹å ´åˆ ãŒã‚る。ã“れらã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ã€Mew ã«ã‚ˆã£ã¦ `P' マークãŒä»˜ã‘られ ã¦ã„る。ã“ã“ã§ã€ãƒ¦ãƒ¼ã‚¶ãŒãれらã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« `*' マークを付ã‘ã€ã“ ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行ã™ã‚Œã°ã€å…ƒã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¾©å…ƒã•れる。 `mI' `*' マークã®ä»˜ã„ã¦ã„る一部ã ã‘ãŒå–å¾—ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ç¾¤(`T')ã‚’å–å¾— ã™ã‚‹ã€‚ `C-umI' `mI' を実行ã™ã‚‹ã€‚ `M-b' `*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ ¼ç´ã•れã¦ã„るメッセージをå–り出ã™ã€‚ `M-\' `*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’引数ã¨ã—ã¦ã€å¤–部コマンドを起動ã™ã‚‹ã€‚ `M-t' `*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ "uudecode" ã™ã‚‹ã€‚ `M-t' ã§ã¯ã€`*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒãã¡ã‚“ã¨åˆ†å‰²é †ã«ãªã£ã¦ã„ã‚‹å¿… è¦ãŒã‚りã¾ã™ã€‚順番ãŒãã‚‹ã£ã¦ã„ã‚‹ãªã‚‰ã€`S' ã§ã‚½ãƒ¼ãƒˆã™ã‚‹ã¨ã‚ˆã„ã‹ã‚‚ã—れ㾠ã›ã‚“。  File: mew.ja.info, Node: escape mark, Next: unmark, Prev: target mark, Up: Marks å¾…é¿ `$' ======== ãŸã¨ãˆã° `/' ãªã©ã‚’使ã„パターンã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« `*' を付ã‘ã‚‹ã“㨠を考ãˆã¦ä¸‹ã•ã„。`*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã™ã§ã«ã‚ã‚‹ãªã‚‰ã€ã“れら㮠メッセージ㯠`/' ã®çµæžœã¨æ··ã–ã£ã¦ã—ã¾ã„ã¾ã™ã€‚ãã“ã§ã€ç¾åœ¨ã® `*' マーク を一時的ã«ä¿å­˜ã—ãŸããªã‚Šã¾ã™ã€‚ ã“ã®ç›®çš„ã®ãŸã‚ã«ã€å¾…é¿ãƒžãƒ¼ã‚¯ `$' ãŒæä¾›ã•れã¦ã„ã¾ã™ã€‚典型的ãªä½¿ã„æ–¹ã¯ã€ 以下ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ 1. `m$' ã§ `*' マークを一旦 `$' マークã«å¾…é¿ 2. `/' ãªã©ã§ `*' マークを付ã‘ã€`*' マークã®ã¤ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å‡¦ç† 3. `U*' ã§ `*' マークを消去 4. `m*' ã§ `$' マークを `*' ãƒžãƒ¼ã‚¯ã¸æˆ»ã™ `$' マークã«é–¢ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’以下ã«ã¾ã¨ã‚ã¾ã™ã€‚ `m$' `*' マークを `$' マークã¸å¤‰æ›ã€‚ `m*' `$' マークを `*' マークã¸å¤‰æ›ã€‚  File: mew.ja.info, Node: unmark, Next: mark change, Prev: escape mark, Up: Marks ãƒžãƒ¼ã‚¯ã®æ¶ˆåŽ» ============ `o' マークや `D' マークãŒä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ãƒžãƒ¼ã‚¯å®Ÿè¡Œã‚³ãƒžãƒ³ãƒ‰ `x' ã‚’ 押ã•ãªã„é™ã‚Šå‡¦ç†ã•れã¾ã›ã‚“。よã£ã¦ã€`x' を押ã™å‰ã«ã€ãƒžãƒ¼ã‚¯ã‚’å–り止ã‚ã‚‹ コマンド `u' ã§ãƒžãƒ¼ã‚¯ã‚’消ã›ã°ã€èª¤ã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’消ã™ã“ã¨ã¯ã‚りã¾ã›ã‚“。 以下ã«ãƒžãƒ¼ã‚¯ã‚’消去ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ `u' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒžãƒ¼ã‚¯ã‚’消ã™ã€‚ `U' 入力ã—ãŸãƒžãƒ¼ã‚¯ãŒä»˜ã„ã¦ã„ã‚‹ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒžãƒ¼ã‚¯ã‚’消ã™ã€‚ `$' マークを使ã£ã¦ `*' マークを待é¿ã—ã€ãªã‚“らã‹ã®æ“作をã—ã€å…ƒã«æˆ»ã™æ–¹ 法ã¯ã€ç›®ã«è¦‹ãˆã‚‹ã®ã§åˆ†ã‚Šã‚„ã™ã„ã§ã™ã€‚ã—ã‹ã—ãªãŒã‚‰ã€`$' マークãŒä»˜ã„ã¦ã„ るメッセージã¯ã€ãƒžãƒ¼ã‚¯ãŒä»˜ã„ã¦ã„ã‚‹ã®ã§ç›®çš„ã®æ“作ã®å¯¾è±¡å¤–ã«ãªã‚‹ã‹ã‚‚ã—れ ã¾ã›ã‚“。 ã“ã®ãŸã‚ `U*' ã§æ¶ˆåŽ»ã—㟠`*' マークを復活ã•ã›ã‚‹ã‚³ãƒžãƒ³ãƒ‰ãŒã‚りã¾ã™ã€‚ã れã¯ã€`M*' ã§ã™ã€‚ã“ã®æ–¹æ³•ã¯ã€å¾©æ´»ã§ãるマークã¯ç›®ã«è¦‹ãˆãªã„ã®ã§åˆ†ã‚Šã« ãã„ã‹ã‚‚ã—れã¾ã›ã‚“。ã—ã‹ã—ãªãŒã‚‰ã€ãƒžãƒ¼ã‚¯ãŒæ¶ˆãˆã¦ã„ã‚‹ã®ã§ã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ ジã¯ç¢ºå®Ÿã«ç›®çš„ã®æ“作ã®å¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚ `M*' 一番最後㮠`U*' ã§æ¶ˆã—㟠`*' マークを復活ã•ã›ã‚‹ã€‚  File: mew.ja.info, Node: mark change, Next: sync, Prev: unmark, Up: Marks マークã®å¤‰æ› ============ マークã«ã¯å¼·ã•ã®ãƒ¬ãƒ™ãƒ«ãŒã‚りã¾ã™ã€‚åŒã˜ãƒ¬ãƒ™ãƒ«ã®ãƒžãƒ¼ã‚¯ã¯ä¸Šæ›¸ãã§ãã¾ã™ã€‚ å¼·ã„マークã¯å¼±ã„マークを上書ãã§ãã¾ã™ã€‚ マークを強ã„é †ã«ç¤ºã—ã¾ã™ã€‚ `o'ã€`D'ã€`X' æ–°ãŸã«ãƒžãƒ¼ã‚¯ã—ãŸã¨ãã¯ã€æ¬¡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示。上書ãã—ãŸå ´åˆã¯ã€ ãã®è¡Œã«ç•™ã¾ã‚‹ã€‚ `*' 㨠`$' マークを付ã‘ãŸå¾Œã¯ã€ãã®è¡Œã«ç•™ã¾ã‚‹ã€‚ `U' マークを付ã‘ãŸå¾Œã¯ã€ãã®è¡Œã«ç•™ã¾ã‚‹ã€‚ å¼·ã„マークを付ã‘ãŸå¾Œã«ã‚«ãƒ¼ã‚½ãƒ«ãŒå‹•ãæ–¹å‘ã«ã¤ã„ã¦ã¯ã€*Note summary-mode:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 マークã¯ä»¥ä¸‹ã®ã‚ˆã†ã«äº¤æ›ã§ãã¾ã™ã€‚ `m$' `*' -> `$' :: `*' マークを一時的ã«ä¿å­˜ã€‚ `m*' `$' -> `*' :: `*' ãƒžãƒ¼ã‚¯ã‚’å…ƒã«æˆ»ã™ã€‚ `ms' `$' <-> `*' `mM-u' `*' -> `U' :: é¸æŠžã‚³ãƒžãƒ³ãƒ‰ `?' ã§é¸ã‚“ã ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’未読ã«ã™ã‚‹ã¨ã ã«ä¾¿åˆ©ã€‚ `md' `*' -> `D' :: é¸æŠžã‚³ãƒžãƒ³ãƒ‰ `?' ã§é¸ã‚“ã ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’消去ã™ã‚‹ã¨ã㫠便利。 `mM-d' `*' -> `X' :: é¸æŠžã‚³ãƒžãƒ³ãƒ‰ `?' ã§é¸ã‚“ã ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’消去ã™ã‚‹ã¨ã㫠便利。 `mo' `*' -> `o' :: é¸æŠžã‚³ãƒžãƒ³ãƒ‰ `?' ã§é¸ã‚“ã ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã‚るフォルダ㫠移動ã•ã›ã‚‹å ´åˆã«ä¾¿åˆ©ã€‚ `mc' `*' -> `o' :: é¸æŠžã‚³ãƒžãƒ³ãƒ‰ `?' ã§é¸ã‚“ã ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã‚るフォルダ㫠コピーã™ã‚‹å ´åˆã«ä¾¿åˆ©ã€‚ `e' 最åˆã«å…¥åŠ›ã—ãŸãƒžãƒ¼ã‚¯ã‚’次ã«å…¥åŠ›ã—ãŸãƒžãƒ¼ã‚¯ã¸å¤‰æ›ã™ã‚‹ã€‚ãŸã ã—ã€`o' マークã¯å¯¾è±¡å¤–。  File: mew.ja.info, Node: sync, Next: off-line, Prev: mark change, Up: Marks IMAP サーãƒã¨ã®ãƒžãƒ¼ã‚¯ã®æ•´åˆæ€§ ============================= Mew ã§ã¯ã€ä»¥ä¸‹ã®ãƒžãƒ¼ã‚¯ã«å¯¾ã—ã€IMAP サーãƒã¨æ•´åˆæ€§ã‚’確ä¿ã§ãã¾ã™ã€‚ `U' メッセージを読んã ã‹å¦ã‹ã€‚IMAP ã®ãƒ•ラグ㯠\Seen。通常㯠%inbox ã® ã¿ã§æœ‰åŠ¹ã€‚ `*' 注目ã—ã¦ã„るメッセージ。IMAP ã®ãƒ•ラグ㯠\Flagged。 ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã®æ“作を許ã™ãŸã‚ã«ã€Mew ã§ã¯ãƒ¦ãƒ¼ã‚¶ãŒå‹•作を起ã“ã™ãŸã³ã« IMAP サーãƒã¨ãƒžãƒ¼ã‚¯ã®æ•´åˆæ€§ã‚’å–りã¾ã™ã€‚å®šæœŸçš„ã«æ•´åˆæ€§ã‚’å–ã‚‹ã“ã¨ã¯ã—ã¾ã›ã‚“。 Mew ãŒãƒžãƒ¼ã‚¯ã®æ•´åˆæ€§ã‚’å–る方法を以下ã«ç¤ºã—ã¾ã™ã€‚ 1. `s' + 'update - 既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦å¤‰æ›´ã—ãŸãƒžãƒ¼ã‚¯ã‚’サーãƒå´ã¸å映 - æ–°ç€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦ã¯ã€ã‚µãƒ¼ãƒå´ã®ãƒ•ラグをマークã¸å映 2. `x' - 既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦å¤‰æ›´ã—ãŸãƒžãƒ¼ã‚¯ã‚’サーãƒå´ã¸å映 3. `s' + 'sync - 既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦å¤‰æ›´ã—ãŸãƒžãƒ¼ã‚¯ã‚’サーãƒå´ã¸å映 - 既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã® `*',`U', `$', ` ' マークを一旦クリア - サーãƒå´ã®ãƒ•ラグを既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ãƒžãƒ¼ã‚¯ã¨ã—ã¦å映 - サーãƒå´ã§å‰Šé™¤ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’削除  File: mew.ja.info, Node: off-line, Next: mew-mark, Prev: sync, Up: Marks IMAP ã®ãŸã‚ã®ãƒžãƒ¼ã‚¯ã®ã‚ªãƒ•ãƒ©ã‚¤ãƒ³å‡¦ç† =================================== IMAP ユーザã¯ã€ãƒ•ォルダ A ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’キャッシュã—ã€å‡ºå…ˆã§ `o'マーク ã‚„ `D' マークを付ã‘ã€ãã®å ´ã§ãれらã®ãƒžãƒ¼ã‚¯ã‚’処ç†ã—ãŸããªã‚‹ã“ã¨ãŒã‚り ã¾ã™ã€‚ã“ã®å ´åˆã€ãã®å¾Œãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã—ãŸã¨ãã«ã€ãれらã®å‡¦ç†ãŒ IMAP サーãƒã«å映ã•ã‚Œã¦æ¬²ã—ã„ã¨æ€ã„ã¾ã™ã€‚ 通常 IMAP ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’フォルダ A ã‹ã‚‰ãƒ•ォルダ B ã¸ç§»å‹•ã•ã›ãŸå ´åˆã€ フォルダ A ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れã¦ã„ã‚‹ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’削除ã—ã€IMAP サーãƒã‹ らãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’通ã˜ã€ãƒ•ォルダ B ã¸ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’キャッシュã—ç›´ã™å¿… è¦ãŒã‚りã¾ã™ã€‚ãªãœãªã‚‰ã€ãƒ•ォルダ A ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れã¦ã„るメッセージ㫠付éšã™ã‚‹ IMAP ã®æƒ…å ±ã¯ã€ãƒ•ォルダ A 内ã§ã®ã¿æœ‰åйã ã‹ã‚‰ã§ã™ã€‚ 出先ã§ãƒ•ォルダ A ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’フォルダ B ã¸æ•´ç†ã—ãŸã¨ã—ã¾ã—ょã†ã€‚ä»®ã«ã€ ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’フォルダ B ã§èª­ã‚€ãŸã‚ã«ã¯ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã—ã¦ã㮠処ç†ã‚’ IMAP サーãƒã«å映ã—ã€IMAP サーãƒã‹ã‚‰å–り直ã•ãªã„ã¨ã„ã‘ãªã„ã¨ã™ ã‚‹ã¨ä¸ä¾¿ã§ã™ã€‚欲を言ãˆã°ã€å‡ºå…ˆã§ãƒ•ォルダ B ã¸æ•´ç†ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ IMAP サーãƒã‹ã‚‰å–り直ã•ãªãã¨ã‚‚ã€ãƒ•ォルダ B ã¸ç§»å‹•ã™ã‚Œã°èª­ã‚るよã†ã«ãªã£ ã¦ã„ã¦æ¬²ã—ã„ã¨æ€ã„ã¾ã™ã€‚ Mew ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸å‡¦ç†ã‚’後ã‹ã‚‰ IMAP サーãƒã¸å映ã™ã‚‹ã“ã¨ã¨ã€IMAP サー ãƒã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å†å–å¾—ã—ãªãã¦ã‚‚移動先ã®ãƒ•ォルダã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読ã‚ã‚‹ ã“ã¨ã®ä¸¡æ–¹ã‚’実ç¾ã—ã¦ã„ã¾ã™ã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã—ã¦ã„ãªã„状æ³ã§ã€ãƒžãƒ¼ã‚¯ を処ç†ã™ã‚‹ã«ã¯ã€`lx' を使用ã—ã¦ä¸‹ã•ã„。`lx' を実行ã™ã‚‹ã¨ã€ä»¥ä¸‹ã®å‡¦ç†ãŒ ãªã•れã¾ã™ã€‚ 1. `o' マークや `D' マークã®ã¤ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒãƒ•ォルダ A ã‹ã‚‰ãªã㪠る。 2. ã“ã®å‡¦ç†ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸å½¢å¼ã§ã€%queue ã«æºœã‚‹ã€‚ 3. `o' マークã®ã¤ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ãƒ­ãƒ¼ã‚«ãƒ«ã§ãƒ•ォルダ B ã¸ç§»å‹•ã•れ〠無効ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¨ã—ã¦æ‰±ã‚れる。 無効ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¨ã¯ã€èª­ã‚€ã“ã¨ã¯ã§ãã‚‹ãŒã€`o' マークや `D' マークを㤠ã‘られãªã„ã‚‚ã®ã‚’ã„ã„ã¾ã™ã€‚無効ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ã€`#' マークãŒä»˜ã„ã¦ã„ã¾ ã™ã€‚`g' を使ã£ã¦ã€ãƒ•ォルダ B ã¸è¡Œãã¨ã€ç„¡åйãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸€è¦§ãŒè‡ªå‹•çš„ ã«è¡¨ç¤ºã•れã¾ã™ã€‚ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã—ãŸå¾Œã«ã€%queue ã«æºœã£ã¦ã„る処ç†ã‚’ IMAP サーãƒã«å 映ã•ã›ã‚‹ã«ã¯ã€%queue ã§ `C-cC-c' ã¨å…¥åŠ›ã—ã¦ä¸‹ã•ã„。 IMAP サーãƒã«å‡¦ç†ã‚’åæ˜ ã—ãŸå¾Œã«ã€ãƒ•ォルダ B ã§ `s' を押ã™ã¨ã€ç„¡åйãªãƒ¡ãƒƒ セージãŒå‰Šé™¤ã•ã‚Œã€æœ‰åйãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れã¾ã™ã€‚  File: mew.ja.info, Node: mew-mark, Next: Refile, Prev: off-line, Up: Marks Mew ãŒè¡¨ç¤ºã™ã‚‹ãƒžãƒ¼ã‚¯ ==================== 以下㫠Mew ãŒè¡¨ç¤ºã™ã‚‹ãƒžãƒ¼ã‚¯ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ `M' マルãƒãƒ‘ートを表ã™ãƒžãƒ¼ã‚¯ã€‚*Note multipart:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `-' Multipart/Alternative を表ã™ãƒžãƒ¼ã‚¯ã€‚*Note analysis:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `T' メッセージãŒåˆ‡ã‚Šè©°ã‚られãŸã“ã¨ã‚’表ã™ãƒžãƒ¼ã‚¯ã€‚*Note retrieving:: ã‚’ å‚ç…§ã®ã“ã¨ã€‚ `S' ç½²åを表ã™ãƒžãƒ¼ã‚¯ã€‚*Note cipher-viewing:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `E' æš—å·åŒ–を表ã™ãƒžãƒ¼ã‚¯ã€‚*Note cipher-viewing:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `P' 分割ã•れã¦ã„ã‚‹ã“ã¨ã‚’示ã™ãƒžãƒ¼ã‚¯ã€‚*Note target mark:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `#' メッセージãŒç„¡åйã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãƒžãƒ¼ã‚¯ã€‚*Note off-line:: ã‚’å‚ç…§ã® ã“ã¨ã€‚  File: mew.ja.info, Node: Refile, Next: by-folder, Prev: mew-mark, Up: Top æ¥½ã€…æ•´ç†æ•´é “ ************ 1 æ—¥ã«æ•°ç™¾ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–るよã†ã«ãªã‚‹ã¨æ•´ç†æ•´é “ãŒå¤§å¤‰ã«ãªã‚Šã¾ã™ (ãˆã€ãã‚“ãªã«å—ã‘å–らãªã„ã§ã™ã£ã¦ï¼Ÿ 幸ã›ã§ã™ã­ :) 。Mew ã§ã¯ã€`o' ã§ãƒ¡ãƒƒ セージを整頓ã™ã‚‹éš›ã«ã€æ•´é “先を推測ã—åˆæœŸå€¤ã¨ã—ã¦è¡¨ç¤ºã—ã¦ãれã¾ã™ã€‚ãŸã¨ ãˆã°ã€æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ Folder name (+work/mew-dist): + ã‚‚ã—ã€() ã®ä¸­ã®åˆæœŸå€¤ãŒè‡ªåˆ†ã®å¸Œæœ›é€šã‚Šã§ã‚れã°ã€`RET' を押ã™ã ã‘ã§ã‚ˆã„ ã®ã§ã™ã€‚æ•´é “å…ˆãŒæ±ºå®šã—ã¦ã„るメッセージã«ã¯ã€`o' マークãŒä»˜ãã¾ã™ã€‚ メッセージを移動ã§ãã‚‹ã®ã¯ã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå±žã—ã¦ã„る「世界ã€ã®ä¸­ã§ã® ã¿ã§ã™ã€‚å‰è¿°ã®ã‚ˆã†ã«ä¸–界ã¯ã‚±ãƒ¼ã‚¹ã¨ä¿®é£¾å­ã«ã‚ˆã£ã¦å®šã¾ã‚Šã¾ã™ã€‚æ•´é “å…ˆã®ãƒ•ã‚© ルダを指定ã™ã‚‹å ´åˆã«ã¯ã€ã‚±ãƒ¼ã‚¹ã‚’付ã‘ãšã€åŒã˜ä¿®é£¾å­ã‚’æŒã¤ãƒ•ォルダåã‚’å…¥ 力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ケースを付ã‘ãªã„ç†ç”±ã¯ã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚±ãƒ¼ã‚¹ã¯ ã™ã§ã«å®šã¾ã£ã¦ã„ã‚‹ã‹ã‚‰ã§ã™ã€‚ミニãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ãƒ•ォルダåを入力ã™ã‚‹éš›ã€ã‚±ãƒ¼ ス㌠"default" ã§ãªã„ã«ã‚‚é–¢ã‚らãšã‚±ãƒ¼ã‚¹ã‚’明示的ã«å…¥åŠ›ã—ãªã„ã®ã¯ã€æ•´é “ 先を指定ã™ã‚‹å ´åˆã®ã¿ã§ã™ã€‚ `o' ã«ä¼¼ãŸã‚³ãƒžãƒ³ãƒ‰ã« `c' ãŒã‚りã¾ã™ã€‚両者ã®é•ã„ã¯ã€ *Note refile mark:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 ã“ã®æ•´é “å…ˆã®æŽ¨æ¸¬ãŒè³¢ã‘れã°è³¢ã„ç¨‹ãƒ¦ãƒ¼ã‚¶ã¯æ¥½ã«ãªã‚Šã¾ã™ã€‚Mew ã§ã¯ä»¥ä¸‹ã®ã‚ˆ ã†ãªè¦å‰‡ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚ * Menu: * by-folder:: メーリングリスト用ã®ãƒ•ォルダã‹ã‚‰æŽ¨æ¸¬ * by-alist:: 指定ã—ãŸè¦å‰‡ã‹ã‚‰æŽ¨æ¸¬ * by-thread:: 対話関係ã‹ã‚‰æŽ¨æ¸¬ * by-from-folder:: 個人用ã®ãƒ•ォルダã‹ã‚‰æŽ¨æ¸¬ * by-from:: From: ã‹ã‚‰æŽ¨æ¸¬ * by-newsgroups:: Newsgroups: ã‹ã‚‰æŽ¨æ¸¬ * by-default:: デフォルトã®è¦å‰‡ * guess-rule:: è¦å‰‡ã®åˆ¶å¾¡ * auto-refile:: è‡ªå‹•ã§æ•´ç†æ•´é “ * copy-msg:: 世界を越ãˆãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚³ãƒ”ー  File: mew.ja.info, Node: by-folder, Next: by-alist, Prev: Refile, Up: Refile メーリングリスト用ã®ãƒ•ォルダã‹ã‚‰æŽ¨æ¸¬ ==================================== ã‚るメーリングリスト宛ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã€ãã®ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆåã®ãƒ•ォルダ ã«æ•´ç†ã™ã‚‹ã“ã¨ã¯å¤šã„ã¨æ€ã„ã¾ã™ã€‚Mew ã§ã¯ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆå®›ã«å±Šã„ãŸãƒ¡ãƒƒ セージã«å¯¾ã—ã¦ã€ãれ用ã®ãƒ•ォルダを推測ã™ã‚‹æ©Ÿèƒ½ãŒã‚りã¾ã™ã€‚ ãŸã¨ãˆã°ã€+misc/pooh-lovers ã¨ã„ã†ãƒ•ォルダãŒã‚ã£ãŸã¨ã—ã¾ã—ょã†ã€‚次ã®ã‚ˆ ã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ã«æ•´é “ã™ã‚Œã°ã‚ˆã„å¯èƒ½æ€§ãŒé«˜ã„ã¨ã„ãˆã¾ã™ã€‚ To: pooh-lovers@example.org ã“ã®ã‚ˆã†ã«ã€To: ã‚„ Cc: ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒã€ãƒ•ォルダåã®ä¸€ç•ªå³å´ã«ãƒžãƒƒãƒã™ã‚‹ ã‚‚ã®ãŒãªã„ã‹æŽ¢ã™ã‚ã‘ã§ã™ã€‚フォルダを階層化ã—ã¦ã„ãªã„人ãŒå¤šã„よã†ã§ã™ãŒã€ Mew を使ã†é™ã‚Šã€éšŽå±¤åŒ–ã—ãªã„手ã¯ã‚りã¾ã›ã‚“。 ã•ã¦ã€é‹­ã„äººã¯æ¬¡ã®ã‚ˆã†ã«å€‹äººã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒ To: ã‚„ Cc: ã«ã‚ã‚‹å ´åˆã€å›°ã‚‹ã® ã§ã¯ãªã„ã‹ã¨æ€ã†ã§ã—ょã†ã€‚ To: piglet@example.org Cc: pooh-lovers@example.org ãŸã¨ãˆã°ã€pooh 㯠pooh-lovers ã®ä¸€å“¡ã§ã™ã‹ã‚‰ã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå±Šãã¾ã™ã€‚ ã—ã‹ã—ã€piglet ã¨ä»²ãŒã„ã„ã®ã§ã€+from/piglet ã«ãƒžãƒƒãƒã—ã¦ã—ã¾ã„ã¾ã™ã€‚ ãã“ã§ã€Mew ã§ã¯ç„¡è¦–ã™ã‚‹ãƒ•ォルダを設定ã§ãるよã†ã«ãªã£ã¦ã„ã¾ã™ã€‚デフォ ルトã§ã¯ã€+from 以下を無視ã—ã¾ã™ã€‚ã§ã™ã‹ã‚‰ã€å€‹äººã‹ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ +from 以下ã«åŽã‚ã¦ä¸‹ã•ã„ å€™è£œãŒæ±ºå®šã§ããŸã‚‰ Folder name (+misc/pooh-lovers): + ã¨è¨Šã„ã¦ãã¾ã™ã€‚ã‚ã£ã¦ã„れ㰠`RET' ã‚’ã€é•ã£ã¦ã„れã°ãŠæœ›ã¿ã®ãƒ•ォルダを 入力ã—ã¦ä¸‹ã•ã„。 `o' ã§æ–°ã—ã„フォルダを指定ã™ã‚‹ã¨ã€ãã®ãƒ•ォルダãŒè‡ªå‹•çš„ã«ä½œæˆã•ã‚Œã€æ¬¡ã‹ ã‚‰ã¯æŽ¨æ¸¬ç”¨ã®å€™è£œã«ã‚‚加ã‚りã¾ã™ã€‚便利ã§ã—ょ? ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹é–¢æ•°ã¯ `mew-refile-guess-by-folder' ã§ã™ã€‚ ã‚‚ã—ã€ãƒ•ォルダåã«å¤§æ–‡å­—を使ã£ã¦ã„ãªã„ãªã‚‰ã€ä»¥ä¸‹ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®é–¢æ•° ãŒé«˜é€Ÿã«ãªã‚Šã¾ã™ã€‚ (setq mew-use-fast-refile t) デフォルトã§ã¯ã€æœ«ç«¯ã®ãƒ•ォルダã¨ä¸­é–“ã®ãƒ•ォルダãŒå€™è£œã®å¯¾è±¡ã¨ãªã£ã¦ã„ã¾ ã™ã€‚ã‚‚ã—ã€ä¸­é–“ã®ãƒ•ォルダã§ã¯ãªãã€æœ«ç«¯ã®ãƒ•ォルダã ã‘ã‚’é¸ã³ãŸã„å ´åˆã¯ã€ 以下ã®ã‚ˆã†ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 (setq mew-use-node-folder nil)  File: mew.ja.info, Node: by-alist, Next: by-thread, Prev: by-folder, Up: Refile 指定ã—ãŸè¦å‰‡ã‹ã‚‰æŽ¨æ¸¬ ==================== フォルダåã‹ã‚‰æŽ¨æ¸¬ã™ã‚‹æ©Ÿèƒ½ã ã‘ã§ã¯ã€æ€ã†ã‚ˆã†ãªãƒ•ォルダを推測ã—ã¦ãれ㪠ã„å ´åˆãŒã‚りã¾ã™ã€‚ãŸã¨ãˆã°ã€To: ㌠staff@example.jp ã§ã‚るメッセージ㨠To: ㌠staff@example.net ã§ã‚るメッセージã«å¯¾ã—ã€ãƒ•ォルダåã‹ã‚‰ã®æŽ¨æ¸¬ ã§ã¯åŒã˜ãƒ•ォルダ(ãŸã¨ãˆã°ã€"+net/staff")ãŒé¸ã°ã‚Œã¦ã—ã¾ã„ã¾ã™ã€‚ãã“ã§ã€ Mew ã§ã¯ã€å¤‰æ•° `mew-refile-guess-alist' ã«æ˜Žç¤ºçš„ã«è¦å‰‡ã‚’設定ã§ãã¾ã™ã€‚ (`mew-refile-guess-alist' ã¯ã€å¿…ãšæ–°ã—ã„æ›¸å¼ã§æ›¸ã„ã¦ä¸‹ã•ã„。詳ã—ã㯠*Note config2:: ã‚’å‚ç…§ã®ã“ã¨ã€‚) 1 ã¤ä¾‹ã‚’挙ã’ã¦ã¿ã¾ã—ょã†ã€‚ (setq mew-refile-guess-alist '(("To:" ("staff@example.jp" "+jp/staff") ("staff@example.net" "+net/staff")))) ã“れã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ˜ãƒƒãƒ€ä¸­ã® To: ã®æ¨ªã®æ–‡å­—列㫠staff@example.jp ãŒã‚ れ㰠+jp/staff ã¸ã€staff@example.net ãŒã‚れ㰠+net/staff ã¸æ•´é “ã™ã‚‹ã¨ ã„ã†æ„味ã§ã™ã€‚ è¦å‰‡ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«æ›¸ãã¾ã™ã€‚ rule ::= ' ::= (( ) ( ) ... []) 全体㯠( ) ã®ãƒªã‚¹ãƒˆã§ã™ã€‚ ã¯ãƒ•ィールドåを書ãã¾ã™ã€‚ ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ::= ( |) ( |) ... 㯠ã§ç¤ºã—ãŸãƒ•ィールドã«ãる値ã§ã™ã€‚ 㯠㫠マッãƒã—ãŸéš›ã«ã©ã®ãƒ•ã‚©ãƒ«ãƒ€ã«æ•´é “ã™ã‚‹ã‹ã‚’æ„味ã—ã¦ã„ã¾ã™ã€‚ ã®ä»£ り㫠をå†å¸°çš„ã«è¨˜è¿°ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ 特殊㪠ã¨ã—㦠`nil' 㨠`t' ãŒã‚りã¾ã™ã€‚`nil' ã¯ã€ä½•も推測ã§ã㪠ã‹ã£ãŸå ´åˆã«è¿”㙠を指定ã™ã‚‹ãŸã‚ã«ç”¨ã„ã¾ã™ã€‚`t' ã¯ã€æŽ¨æ¸¬ã—ãŸå€¤ ã«åŠ ãˆã¦è¿”㙠を指示ã™ã‚‹ãŸã‚ã«ä½¿ã„ã¾ã™ã€‚ ::= (t ) | (nil ) æ­£è¦è¡¨ç¾ã‚’知ã£ã¦ã„る人ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ãªè¤‡é›‘ãªè¦å‰‡ã‚’設定ã§ãã¾ã™ã€‚ (setq mew-refile-guess-alist '(("Newsgroups:" ("^nifty\\.\\([^ ]+\\)" "+Nifty/\\1") (".*" "+rec/news")) ("To:" ("\\(inet\\|wide\\)@wnoc-fuk" "+wide/\\1-wnoc-fuk")) ("From:" ("uucp@" "+adm/uucp") ("ftpsync@" "+adm/ftpsync")) (nil "+unknown"))) ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹é–¢æ•°ã¯ `mew-refile-guess-by-alist' ã§ã™ã€‚  File: mew.ja.info, Node: by-thread, Next: by-from-folder, Prev: by-alist, Up: Refile 対話関係ã‹ã‚‰æŽ¨æ¸¬ ================ Mew ã«ã¯ã€æ•´é “ã—よã†ã¨ã—ã¦ã„るメッセージã®è¦ªã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä»¥å‰æ•´é “ã•れ ãŸãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãれる機能ãŒã‚りã¾ã™ã€‚ ãŸã¨ãˆã°ã€poohã€pigletã€roo ã¨ã®é–“ã§ã€èœ‚蜜をå–りã«è¡Œã“ã†ã¨ã„ã†è©±é¡ŒãŒç›› り上ãŒã£ãŸã¨ã—ã¾ã—ょã†ã€‚pooh ã¯ã€+project/honey ã¨ã„ã†ãƒ•ォルダを作ã£ã¦ã€ 最åˆã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ãã“ã«æ•´é “ã—ãŸã¨ã—ã¾ã—ょã†ã€‚以é™ã€3 人ã®é–“ã®ãƒ¡ãƒƒã‚»ãƒ¼ ジãŒãã¡ã‚“ã¨ã—ãŸè¿”ç­”ã§ã‚ã‚‹ã‹ãŽã‚Šã€+project/honey を推測ã—ã¦ãれã¾ã™ã€‚ ã‚るメッセージをã©ã“ã«ä¿å­˜ã—ãŸã‹ã¨ã„ã†æƒ…å ±ã¯ã€ "~/Mail/.mew-refile-msgid-alist" ã«ä¿å­˜ã•れã¦ã„ã¾ã™ã€‚ã“ã®æƒ…報をéŽåŽ» 何通ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«é–¢ã—ã¦ä¿å­˜ã™ã‚‹ã‹ã¯ã€`mew-lisp-max-length' ã§æ±ºå®š ã—ã¾ã™ã€‚åˆæœŸå€¤ã¯ 2000 通ã§ã™ã€‚3000 通ã«ã—ãŸã„å ´åˆã¯ "~/.mew.el" 中ã§ä»¥ 下ã®ã‚ˆã†ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 (setq mew-lisp-max-length 3000) ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹é–¢æ•°ã¯ `mew-refile-guess-by-thread' ã§ã™ã€‚  File: mew.ja.info, Node: by-from-folder, Next: by-from, Prev: by-thread, Up: Refile 個人用ã®ãƒ•ォルダã‹ã‚‰æŽ¨æ¸¬ ======================== *Note by-folder:: ã§èª¬æ˜Žã—ãŸãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆç”¨ã®ãƒ•ォルダを推測ã™ã‚‹ã«åŠ  ãˆã¦ã€å€‹äººç”¨ã®ãƒ•ォルダを推測ã™ã‚‹æ©Ÿèƒ½ãŒã‚りã¾ã™ã€‚個人用ã®ãƒ•ォルダ㯠+from 以下ã«ã‚りã¾ã™ã‹ã‚‰ã€+from 以下ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã™ã‚‹æ©Ÿèƒ½ã ã¨ã‚‚ã„㈠ã¾ã™ã€‚以下ã®ä¾‹ã‚’考ãˆã¦ã¿ã¾ã—ょã†ã€‚ To: pooh@example.net From: piglet@example.org piglet ã‹ã‚‰ pooh ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ¥ã¾ã—ãŸã€‚pooh ãŒã“ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€ From: を手ãŒã‹ã‚Šã« +from/piglet ãŒé¸æŠžã•れã¾ã™ã€‚(+from 以下ã¯éšŽå±¤åŒ–㕠れã¦ã„ã¦ã‚‚æ§‹ã„ã¾ã›ã‚“。ã¾ãŸã€ãƒ•ォルダåã¯ãƒ¦ãƒ¼ã‚¶åã ã‘ã§ã¯ãªãアドレス全 体ã§ã‚‚ OK ã§ã™ã€‚) ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹é–¢æ•°ã¯ã€`mew-refile-guess-by-from-folder' ã¨ã„ã„ã¾ã™ã€‚ 次ã«ã€pooh ㌠piglet ã«è¿”ç­”ã—ãŸå ´åˆã‚’考ãˆã¾ã—ょã†ã€‚pooh ã¯è‡ªåˆ†è‡ªèº«ã« Cc: ã—ã¦ã„ãŸã®ã§ã€è‡ªåˆ†ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæˆ»ã£ã¦ãã¾ã—ãŸã€‚ To: piglet@example.org Cc: pooh@example.net From: pooh@example.net pooh ã®ç«‹å ´ã«ãªã£ã¦è€ƒãˆã¦ã¿ã¦ä¸‹ã•ã„。ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ +from/pooh ã«æ•´ é “ã™ã‚‹ã‹ã€ã‚ã‚‹ã„㯠+from/piglet ã«æ•´é “ã™ã‚‹ã®ã‹ã¯ã€å¥½ã¿ãŒåˆ†ã‹ã‚Œã‚‹ã¨ã“ã‚ ã§ã—ょã†ã€‚ãã“ã§ã€ã©ã¡ã‚‰ã‚’é¸æŠžã™ã‚‹ã®ã‹ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã§ãるよã†ã«ãªã£ã¦ã„ ã¾ã™ã€‚ `mew-refile-guess-from-me-is-special' ㌠`t' ãªã‚‰ã€ `mew-refile-guess-by-from-folder' ã¯ã€From: ãŒè‡ªåˆ†ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å ´åˆã«ã€ To: 㨠Cc: ã«ã‚るアドレスをもã¨ã«ã€+from 以下ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¾ã™ã€‚  File: mew.ja.info, Node: by-from, Next: by-newsgroups, Prev: by-from-folder, Up: Refile From: ã‹ã‚‰æŽ¨æ¸¬ ============== From: ã«åŒä¸€ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’æŒã¤ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã€ã‹ã¤ã¦ã©ã“ã«æ•´é “ã•れãŸã‹ã«ã‚ˆã£ ã¦æŽ¨æ¸¬ã™ã‚‹æ©Ÿèƒ½ãŒã‚りã¾ã™ã€‚ ãŸã¨ãˆã°ã€piglet 㯠piglet@example.org 㨠p-p-p@example.org ã® 2 ã¤ã® アドレスをæŒã£ã¦ã„ã‚‹ã¨ã—ã¾ã—ょã†ã€‚ã©ã¡ã‚‰ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå±Šã„ ã¦ã‚‚ã€pooh ã¯ãれらを +from/piglet ã«æ•´é “ã—ãŸã„ã¨æ€ã£ã¦ã„ã¾ã™ã€‚ã‚‚ã¡ã‚ ã‚“ã€ä»¥ä¸‹ã®ã‚ˆã†ã«æ˜Žç¤ºçš„ã«è¦å‰‡ã‚’書ã‘ã°å®Ÿç¾ã§ãã¾ã™ã€‚ (setq mew-refile-guess-alist '(("From:" ("piglet@example.org" "+from/piglet") ("p-p-p@example.org" "+from/piglet")))) ã—ã‹ã—ã€ã„ã¡ã„ã¡è¦å‰‡ã‚’書ãã®ã¯é¢å€’ã§ã™ã€‚ãã“ã§ã€ã¾ãš From: ㌠piglet@example.org ã§ã‚るメッセージを +from/piglet ã«æ•´é “ã—ã¾ã™ã€‚ã“れ ã§ãƒ•ォルダ +from/piglet ãŒä½œæˆã•れã¾ã™ã€‚次ã«ã€From: ㌠p-p-p@example.org ã§ã‚るメッセージを +from/piglet ã«æ•´é “ã—ãŸã¨ã—ã¾ã™ã€‚ ã“ã“ã§ Mew ã¯ã€p-p-p@example.org ㌠+from/piglet ã«æ•´é “ã•れãŸã“ã¨ã‚’å­¦ ç¿’ã—ã¾ã™ã€‚以後 From: ㌠p-p-p@example.org ã§ã‚るメッセージを整頓ã—よㆠã¨ã™ã‚‹ã¨ã€+from/piglet ã‚’é¸æŠžã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ ãã®ä»–ã€æ©Ÿæ¢°ã‹ã‚‰ãるメッセージã¯ã€ã„ã¤ã‚‚ +adm/misc ã«å…¥ã‚Œã‚‹ã“ã¨ã«ã—㟠ã„å ´åˆãªã©ã‚‚ã€æ˜Žç¤ºçš„ãªè¦å‰‡ã‚’書ã‹ãšã«æ¸ˆã¾ã›ã‚‰ã‚Œã¾ã™ã€‚ From: ã¨ãƒ•ã‚©ãƒ«ãƒ€ã®æƒ…å ±ã¯ã€"~/Mail/.mew-refile-from-alist" ã«ä¿å­˜ã•れã¦ã„ ã¾ã™ã€‚ã“ã®æƒ…報をéŽåŽ»ä½•é€šã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«é–¢ã—ã¦ä¿å­˜ã™ã‚‹ã‹ã¯ã€ *Note by-thread:: ã¨åŒæ§˜ã« `mew-lisp-max-length' ã§æ±ºå®šã—ã¾ã™ã€‚ ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹é–¢æ•°ã¯ `mew-refile-guess-by-from' ã§ã™ã€‚ `mew-refile-guess-from-me-is-special' ㌠`t' ã®å ´åˆã€ `mew-refile-guess-by-from' 㯠`mew-refile-guess-by-from-folder'(*Note by-from-folder::)ã¨åŒæ§˜ãªå‹•ãã‚’ã—ã¾ã™ã€‚  File: mew.ja.info, Node: by-newsgroups, Next: by-default, Prev: by-from, Up: Refile Newsgroups: ã‹ã‚‰æŽ¨æ¸¬ ==================== ニュースをメールã¨ã—ã¦å—ä¿¡ã—㦠Mew ã§èª­ã‚“ã§ã„る人ã®ãŸã‚ã«ã€Newsgroups: ã‹ã‚‰ãƒ•ォルダを推測ã™ã‚‹æ©Ÿèƒ½ã‚’用æ„ã—ã¾ã—ãŸã€‚関数å㯠`mew-refile-guess-by-newsgroups' ã§ã™ã€‚  File: mew.ja.info, Node: by-default, Next: guess-rule, Prev: by-newsgroups, Up: Refile デフォルトã®è¦å‰‡ ================ デフォルトã®è¦å‰‡ã¯ã€From: ã‹ã‚‰ãƒ¦ãƒ¼ã‚¶åを切り出ã—ã¦ã€`+from/user' ã‚’é¸ã¶ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ãŸã ã—〠`mew-refile-guess-strip-domainpart' ㌠`nil' ãªã‚‰ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’切 り出ã™ã®ã§ã€`+from/user@domain' ãŒé¸æŠžã•れã¾ã™ã€‚ `mew-refile-guess-strip-domainpart' ã®åˆæœŸå€¤ã¯ `t' ã§ã™ã€‚ 関数åã¯ã€`mew-refile-guess-by-default' ã§ã™ã€‚  File: mew.ja.info, Node: guess-rule, Next: auto-refile, Prev: by-default, Up: Refile è¦å‰‡ã®åˆ¶å¾¡ ========== Mew ã§ã¯ã€ãƒ•ォルダ推測ã®è¦å‰‡ã‚’ 2 ã¤ã®å¤‰æ•°ã€`mew-refile-guess-control' 㨠`mew-refile-ctrl-multi' ã§åˆ¶å¾¡ã—ã¾ã™ã€‚`mew-refile-guess-control' ã¯ã€ 呼ã³å‡ºã™é–¢æ•°ã‚’é †ã«å®šç¾©ã—ã¾ã™ã€‚候補を複数ã«ã—ãŸã„å ´åˆã¯ `mew-refile-ctrl-multi' ã‚’ `t' ã«ã€å˜æ•°ã«ã—ãŸã„å ´åˆã¯ `nil' ã«è¨­å®šã—ã¾ ã™ã€‚ 標準ã§ã¯ã€`mew-refile-guess-control' ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«å®£è¨€ã•れã¦ã„ã¾ã™(宣 言ãªã®ã§ `defvar' ãŒä½¿ã‚れã¦ã„ã¾ã™)。 (defvar mew-refile-guess-control '(mew-refile-guess-by-alist mew-refile-ctrl-throw mew-refile-guess-by-newsgroups mew-refile-guess-by-folder mew-refile-ctrl-throw mew-refile-ctrl-auto-boundary mew-refile-guess-by-thread mew-refile-ctrl-throw mew-refile-guess-by-from-folder mew-refile-ctrl-throw mew-refile-guess-by-from mew-refile-ctrl-throw mew-refile-guess-by-default)) Mew 㯠`mew-refile-guess-control' ã«ä¸¦ã¹ã‚‰ã‚ŒãŸé–¢æ•°ã‚’順番ã«ã™ã¹ã¦å®Ÿè¡Œã— ã¾ã™ã€‚å„々ã®é–¢æ•°ãŒè¤‡æ•°ã®å€™è£œã‚’推測ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ `mew-refile-guess-control' ã®å‹•作例ã¨ã—ã¦ä»¥ä¸‹ã‚’考ãˆã¦ã¿ã¾ã—ょã†ã€‚ `mew-refile-guess-by-alist' ㌠+aaaã€+bbb を推測。 `mew-refile-guess-by-folder' ㌠+cccã€+ddd を推測。 `mew-refile-guess-by-default' ㌠+eee を推測。 +aaa 〜 +eee ã™ã¹ã¦ã‚’ãƒ¦ãƒ¼ã‚¶ã«æç¤ºã—ã¦æ¬²ã—ã„å ´åˆã¯ã€ `mew-refile-ctrl-multi' ã‚’ `t' ã«ã€+aaa ã ã‘ã‚’æç¤ºã—ã¦æ¬²ã—ã„å ´åˆã¯ã€ `nil' ã«è¨­å®šã—ã¾ã™ã€‚ ã¾ãŸã€+aaa 〜 +ddd ã¯æç¤ºã—ã¦æ¬²ã—ã„ã‘れã©ã‚‚ãれ以é™ã¯ã„らãªã„ã€ã¤ã¾ã‚Šã€ +eee ã‚’æç¤ºã™ã‚‹ã®ã¯å…ˆã«å®Ÿè¡Œã•れãŸé–¢æ•°ç¾¤ãŒä½•も推測ã§ããªã‹ã£ãŸã¨ãã ã‘ ã«ã—ãŸã„å ´åˆã¯ã€`mew-refile-ctrl-multi' ã‚’ `t' ã«ã—ã¦ã€ `mew-refile-guess-by-folder' 㨠`mew-refile-guess-by-default' ã®é–“ã« `mew-refile-ctrl-throw' を入れã¦ä¸‹ã•ã„。 `C-uo' ã¯ã€ã“ã®æŽ¨æ¸¬ã®æµã‚Œã‚’ Message ãƒãƒƒãƒ•ã‚¡ã«è¡¨ç¤ºã—ã¾ã™ã€‚  File: mew.ja.info, Node: auto-refile, Next: copy-msg, Prev: guess-rule, Up: Refile è‡ªå‹•ã§æ•´ç†æ•´é “ ============== 毎日メッセージをãŸãã•んもらã†äººã¯ã€ã¾ã æ•´é “ã—ã¦ã„ãªã„メッセージを +inbox (ã‚ã‚‹ã„㯠%inbox) フォルダã«å¤§é‡ã«æºœã‚ã¦ã—ã¾ã†ã“ã¨ãŒã‚りã¾ã™ã€‚ ãã‚“ãªã¨ãã¯ã€ã€Œãƒ¡ãƒƒã‚»ãƒ¼ã‚¸é”よã€ã¨ã«ã‹ãã“ã®ãƒ•ォルダã‹ã‚‰ã©ã“ã‹ã«è¡Œã£ã¦ ã—ã¾ãˆã€ã¨å«ã³ãŸããªã‚‹ã“ã¨ãŒã‚ã‚‹ã§ã—ょã†ã€‚Mew ã¯ã€ãã‚“ãªã‚ãŒã¾ã¾ãªäººã‚’ 満足ã•ã›ã‚‹ãŸã‚ã®è‡ªå‹•æ•´ç†æ•´é “関数をæä¾›ã—ã¦ã„ã¾ã™ã€‚:) `M-o' ãŒãã®å‘ªæ–‡ ã§ã™ã€‚ ã“ã®é–¢æ•°ã‚’実行ã™ã‚‹ã¨ã€ç¾åœ¨ã®ãƒ•ォルダ内ã®ç‰¹å®šã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦ã€è‡ªå‹•çš„ ã« `o' マークを付ã‘ã¦ãれã¾ã™ã€‚特定ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¨ã¯ã€ `mew-refile-auto-refile-skip-any-mark' ㌠`nil' ãªã‚‰ã€`o' ã‚„ `D' マークãŒä»˜ã„ã¦ã„ãªã„メッセージã§ã™ã€‚ `mew-refile-auto-refile-skip-any-mark' ㌠`t' ãªã‚‰ã€ãªã«ã‚‚マー クãŒä»˜ã„ã¦ãªã„(既読)メッセージã§ã™ã€‚ `mew-refile-auto-refile-skip-any-mark' ã®åˆæœŸå€¤ã¯ `nil' ã§ã™ã€‚ `C-uM-o' ã¯ã€`mew-refile-auto-refile-skip-any-mark' ã®å€¤ã¨ã¯é–¢ä¿‚ãªã `*' マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’対象ã«ã—ã¾ã™ã€‚ æ•´é “å…ˆã®æ±ºå®šã«ã¯ã€å…ˆã«èª¬æ˜Žã—ãŸæŽ¨æ¸¬é–¢æ•°ç¾¤ãŒåƒãよã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ã“㮠関数ã¯ã€`o' を付ã‘ã‚‹ã ã‘ã§ã™ã®ã§ã€`x' を押ã•ãªã„é™ã‚Šå®Ÿéš›ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒ ã©ã“ã‹ã«è¡Œã£ã¦ã—ã¾ã†ã“ã¨ã¯ã‚りã¾ã›ã‚“。 Mew ã®æ•´é “先推測ã¯ã‚ã¾ã‚Šã«ã‚‚è³¢ã™ãŽã‚‹ã®ã§ã€ã“ã®æ©Ÿèƒ½ã«ã¯ä»‡ã¨ãªã£ã¦ã—ã¾ã„ ã¾ã™ã€‚ã¨ã„ã†ã®ã¯ã€Mew ãŒæŽ¨æ¸¬æ©Ÿèƒ½ã‚’ãƒ•ãƒ«ã«ä½¿ã£ã¦å‹æ‰‹ã«æ•´é “ã—ã¦ã—ã¾ã†ã¨ã€ 大抵ã®ãƒ¦ãƒ¼ã‚¶ã¯ã©ã“ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ•´é “ã•れãŸã‹åˆ†ã‹ã‚‰ãªããªã£ã¦ã—ã¾ã†ã‹ã‚‰ ã§ã™ã€‚:) ãã®ãŸã‚ã«ã€Mew ãŒä½¿ã†æŽ¨æ¸¬é–¢æ•°ã‚’制é™ã™ã‚‹æ©Ÿèƒ½ãŒæä¾›ã•れã¦ã„ã¾ ã™ã€‚å‰ã«å‡ºã¦ããŸå®£è¨€ã‚’ã‚‚ã†ä¸€åº¦æ€ã„出ã—ã¦ä¸‹ã•ã„。 (defvar mew-refile-guess-control '(mew-refile-guess-by-alist mew-refile-ctrl-throw mew-refile-guess-by-newsgroups mew-refile-guess-by-folder mew-refile-ctrl-throw mew-refile-ctrl-auto-boundary mew-refile-guess-by-thread mew-refile-ctrl-throw mew-refile-guess-by-from-folder mew-refile-ctrl-throw mew-refile-guess-by-from mew-refile-ctrl-throw mew-refile-guess-by-default)) `mew-refile-guess-control' ã®ä¸­ã« `mew-refile-ctrl-auto-boundary' ã¨ã„ ã†é–¢æ•°ãŒã‚りã¾ã™ã€‚ã“れãŒãã®ä»•掛ã§ã™ã€‚è‡ªå‹•æ•´ç†æ•´é “ã®ã¨ãã«é™ã‚Šã€Mew 㯠ã“ã®é–¢æ•°ã‚ˆã‚Šä¸‹ã«è¨˜è¿°ã—ã¦ã‚る推測を無視ã—ã¾ã™ã€‚ `mew-refile-ctrl-auto-boundary' より上ã«è¨˜è¿°ã—ã¦ã„る関数ãŒä½•も推測ã§ã ãªã‹ã£ãŸå ´åˆã¯ã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ `o' ãŒä»˜ãã¾ã›ã‚“。破滅ãŒè¨ªã‚Œã‚‹å‰ã« `mew-refile-ctrl-auto-boundary' ã®å¾¡æœ­ã‚’è²¼ã£ã¦ä¸‹ã•ã„。  File: mew.ja.info, Node: copy-msg, Next: Virtual, Prev: auto-refile, Up: Refile 世界を越ãˆãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚³ãƒ”ー ============================== ã“れã¾ã§èª¬æ˜Žã—ãŸæ•´é “ã¨ã¯ã€åŒã˜ä¸–界ã®ä¸­ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’移動ã•ã›ã‚‹ã“ã¨ã§ã— ãŸã€‚ã“れã«å¯¾ã—ã€ã‚る世界ã‹ã‚‰ä»–ã®ä¸–界ã¸ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’移動ã•ã›ãŸã„ã“ã¨ã‚‚ã‚ ã‚‹ã§ã—ょã†ã€‚ã“れã¯ã€ã‚る世界ã‹ã‚‰ä»–ã®ä¸–界ã¸ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã‚³ãƒ”ーã—ã€ãã®å¾Œ å…ƒã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’削除ã™ã‚‹ã“ã¨ã§å®Ÿç¾ã§ãã¾ã™ã€‚ã“ã“ã§ã¯ã€ã‚る世界ã‹ã‚‰ä»–㮠世界ã¸ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã‚³ãƒ”ーã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ ã‚るフォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ローカルフォルダã¸ã‚³ãƒ”ーã—ãŸããªã‚‹ã“ã¨ãŒã‚り ã¾ã™ã€‚ã“ã®å ´åˆ `lc' を利用ã—ã¦ä¸‹ã•ã„。`lc' ã¯ã€ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダã§å®Ÿ 行ã•れãŸå ´åˆã€ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‹ã‚‰ã€ãã®ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ã‚©ãƒ«ãƒ€ã« ç‰¹æœ‰ã®æƒ…報をヘッダã‹ã‚‰å–り除ãã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダã¸ã‚³ãƒ”ーã—ã¾ã™ã€‚ (`lc' ã¯ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒ•ォルダã§ã‚‚実行ã§ãã¾ã™ã€‚ã“ã®å ´åˆã€åŒã˜ä¸–界内ã§ã®ã‚³ ピーã«ãªã‚Šã¾ã™ã€‚) ã‚るフォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ IMAP ã®ãƒ•ォルダ(サーãƒå´)ã¸ã‚³ãƒ”ーã™ã‚‹ã«ã¯ã€ `li' を利用ã—ã¾ã™ã€‚ `*' ã®ä»˜ã„ãŸè¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ローカル・フォルダã¸ã‚³ãƒ”ーã™ã‚‹ã«ã¯`mlc' を使ã„ã¾ã™ã€‚ã¾ãŸã€`*' ã®ä»˜ã„ãŸè¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ IMAPフォルダã¸ã‚³ãƒ”ー ã™ã‚‹ã«ã¯ `mli' を利用ã—ã¦ä¸‹ã•ã„。 ã‚る世界ã‹ã‚‰ä»–ã®ä¸–界ã¸ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã‚³ãƒ”ーã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’以下ã«ã¾ã¨ã‚ã¾ã™ã€‚ `lc' ã‚るフォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ローカルフォルダã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ `mlc' `*' ã®ä»˜ã„ãŸè¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ローカル・フォルダã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ `li' ã‚るフォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ IMAP ã®ãƒ•ォルダã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ `mli' `*' ã®ä»˜ã„ãŸè¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ IMAP フォルダã¸ã‚³ãƒ”ーã™ã‚‹ã€‚  File: mew.ja.info, Node: Virtual, Next: selection, Prev: copy-msg, Up: Top 仮想フォルダ ************ Virtual モードã¯ã€å¿…è¦ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ãŸã‚ã®ä»®æƒ³çš„ãªãƒ•ォルダã§ã‚ りã€ã€Œã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã€ã¨ã€Œã‚¹ãƒ¬ãƒƒãƒ‰ã€ã®2種類ã«åˆ†é¡žã§ãã¾ã™ã€‚ `セレクション' ã„ã‚ã„ã‚ãªãƒ•ォルダã‹ã‚‰å¿…è¦ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã ã‘を集ã‚ãŸä»®æƒ³ãƒ•ォルダ㧠ã™ã€‚フォルダåã®å·¦å´ã« "*" ãŒä»˜ãã¾ã™ã€‚ `スレッド' フォルダ(Summary)やセレクション(Virtual)を基ã«ã€å¯¾è©±é–¢ä¿‚ã‚’è¡Œé ­æƒ ãˆã«ã‚ˆã£ã¦å¯è¦–化ã—ãŸä»®æƒ³ãƒ•ォルダã§ã™ã€‚フォルダåã®ä¸¡å´ã« "*" ãŒä»˜ ãã¾ã™ã€‚ Summary モードã§åˆ©ç”¨ã§ãるコマンドã®å¤šããŒã€Virtual モードã§åˆ©ç”¨ã§ãã¾ ã™ã€‚ Virtual モードã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ãƒžãƒ¼ã‚¯ã‚’付ã‘ã‚‹ã¨ã€å¯¾å¿œã™ã‚‹ Summary モード ãŒã‚れã°ã€ãã¡ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã‚‚マークãŒä»˜ãã¾ã™ã€‚逆ã«ã€Summary モード ã§ã‚るメッセージã«ãƒžãƒ¼ã‚¯ã‚’付ã‘ã¦ã‚‚ã€Virtual モードã®å¯¾å¿œã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ ã«ã¯ãƒžãƒ¼ã‚¯ã¯ä»˜ãã¾ã›ã‚“。 Virtual モードã‹ã‚‰ãƒžãƒ¼ã‚¯ã‚’処ç†ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。`x' を押ã—マークを 処ç†ã—よã†ã¨ã™ã‚‹ã¨ã€å¯¾å¿œã™ã‚‹ Summary モードãŒã‚れã°ã€ãã¡ã‚‰ã«ç§»å‹•ã—〠もã†ä¸€åº¦ `x' を押ã™ã‚ˆã†ä¿ƒã•れã¾ã™ã€‚ 仮想フォルダã¯ã¾ã•ã—ã仮想ã§ã‚りã€ãƒ•ァイルシステムãªã©ã«ã¯å­˜åœ¨ã—ãªã„ã“ ã¨ã«æ³¨æ„ã—ã¦ä¸‹ã•ã„。Emacs を終了ã™ã‚‹ã¨ã€ä»®æƒ³ãƒ•ォルダã¯ãªããªã‚Šã¾ã™ã€‚ Virtual モードを消去ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€*Note Quit:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 * Menu: * selection:: セレクション * sorting:: ソート * dialog:: 対話 * search:: 検索 * condition:: 検索æ¡ä»¶ã®å…¥åŠ›æ–¹æ³• * dbsearch:: 検索エンジン * keyword:: キーワードã®å¼·èª¿ * thread:: スレッド * thread-op:: ã‚¹ãƒ¬ãƒƒãƒ‰ã®æ“作  File: mew.ja.info, Node: selection, Next: sorting, Prev: Virtual, Up: Virtual セレクション ============ セレクションã¯ã€ã„ã‚ã„ã‚ãªãƒ•ォルダã‹ã‚‰å¿…è¦ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã ã‘を集ã‚ãŸä»®æƒ³ フォルダã§ã™ã€‚セレクションã®ä½œã‚Šæ–¹ã«ã¯ã€ä»¥ä¸‹ã® 5 ã¤ãŒã‚りã¾ã™ã€‚ `m/' ã‚るフォルダã§ã€"*" マークãŒä»˜ã„ã¦ã„るメッセージã®ã¿ã‚’表示ã™ã‚‹ã€‚ `S' ã‚るフォルダã§ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ソートã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚(å…ƒã®ãƒ•ォルダã«ã¯ã€ 何ã®å½±éŸ¿ã‚‚ãªã„。) *Note sorting:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `V' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¨å¯¾è©±é–¢ä¿‚ã«ã‚るメッセージを表示ã™ã‚‹ã€‚*Note dialog:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `/' ã‚るフォルダã‹ã‚‰ã€æ¤œç´¢æ¡ä»¶ã«åˆè‡´ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã€‚*Note search:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `k/' ã™ã¹ã¦ã®ãƒ•ォルダã‹ã‚‰ã€æ¤œç´¢æ¡ä»¶ã«åˆè‡´ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã€‚ *Note dbsearch:: ã‚’å‚ç…§ã®ã“ã¨ã€‚  File: mew.ja.info, Node: sorting, Next: dialog, Prev: selection, Up: Virtual ソート ====== メッセージをソートã—セレクションを作æˆã™ã‚‹ã«ã¯ `S' を使ã„ã¾ã™ã€‚ã“ã®ã¨ ãæ¬¡ã®ã‚ˆã†ã«ã©ã®ãƒ•ィールドã§ã‚½ãƒ¼ãƒˆã™ã‚‹ã‹è¨Šã„ã¦ãã‚‹ã®ã§ã€ã‚½ãƒ¼ãƒˆã—ãŸã„ フィールドåを入力ã—ã¦ä¸‹ã•ã„。 Sort by? (default date): 指定ã—ãŸãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«æ›¸ã‹ã‚Œã¦ã„る文字列ã¯å˜ç´”ã«æ–‡å­—列比較ã§ã‚½ãƒ¼ãƒˆã™ã‚‹ã¹ ãã§ã¯ã‚りã¾ã›ã‚“。ãŸã¨ãˆã°ã€Subject: ã¯ãƒ†ã‚­ã‚¹ãƒˆã¨è€ƒãˆã¦ã‚ˆã„ã®ã§ã™ãŒã€ Date: ã¯æ—¥ä»˜ã€X-Mail-Count: ã¯æ•°å­—ã¨è€ƒãˆã¦ã‚½ãƒ¼ãƒˆã™ã¹ãã§ã™ã€‚ã“ã®ã‚ˆã†ã« 文字列をã©ã†å–り扱ã†ã‹ã‚’モードã¨ã„ã„ã¾ã™ã€‚ソートã«ã‚ˆã指定ã•れるフィー ルドåã«å¯¾ã™ã‚‹ãƒ¢ãƒ¼ãƒ‰ã¯ `mew-sort-key-alist' ã§è¨­å®šã•れã¦ã„ã¾ã™ã€‚ ソートã®ãƒ¢ãƒ¼ãƒ‰ã‚’æ˜Žç¤ºçš„ã«æŒ‡å®šã€å¤‰æ›´ã—ãŸã„å ´åˆã«ã¯ `:' ã§åŒºåˆ‡ã£ã¦æŒ‡å®šã— ã¾ã™ã€‚ãŸã¨ãˆã° X-Mail-Count: フィールドã®å†…容を(テキストã¨ã—ã¦ã§ã¯ãªã) 数値ã¨ã¿ãªã—ã¦ã‚½ãƒ¼ãƒˆã—ãŸã„å ´åˆã«ã¯ã€æ¬¡ã®ã‚ˆã†ã«å…¥åŠ›ã—ã¾ã™ã€‚ x-mail-count:num フィールドåやモード㯠`TAB' ã§è£œå®Œã§ãã¾ã™ã€‚ モードã«ã¯ã€ä»¥ä¸‹ã® 4 ã¤ãŒã‚りã¾ã™ã€‚ `text' 先頭㮠"Re: " ã‚„ "Fw: " ã‚’å–り除ã„ãŸæ–‡å­—列。 `ml' text ã¨åŒã˜ã§ã‚ã‚‹ãŒã€ã•らã«ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆç‰¹æœ‰ã®æ–‡å­—列もå–り除ã。 `num' 数値。 `date' 日付。 "Sort by?" ã¨è¨Šã‹ã‚Œã‚‹éš›ã®ãƒ•ィールドåã®åˆæœŸå€¤ã¯ã€ `mew-sort-default-key' ã§è¨­å®šã§ãã¾ã™ã€‚以下ã¯ã€åˆæœŸå€¤ã§ã‚ã‚‹"date" ã‚’ "x-ml-count" ã«å¤‰æ›´ã™ã‚‹ä¾‹ã§ã™ã€‚ (setq mew-sort-default-key "x-ml-count") `mew-sort-default-key-alist' ã§ã€ãƒ•ォルダã”ã¨ã«ãƒ•ィールドåã®åˆæœŸ 値を設定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“ã“ã§æŒ‡å®šã—ãªã‹ã£ãŸãƒ•ォルダã§ã¯ã€ãƒ•ィール ドåã®åˆæœŸå€¤ã¨ã—㦠`mew-sort-default-key' ã®å€¤ãŒä½¿ã‚れã¾ã™ã€‚以下ã¯ã€ +inbox フォルダã§ã®åˆæœŸå€¤ã‚’ "subject" ã«ã€+mew-dist フォルダã§ã®åˆæœŸå€¤ ã‚’ "x-mail-count" ã«å¤‰æ›´ã™ã‚‹ä¾‹ã§ã™ã€‚ (setq mew-sort-default-key-alist '(("+inbox" "subject") ("+mew-dist" "x-mail-count"))) ãªãŠã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’本当ã«ã‚½ãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«ã¯`M-s' ã‚’ 使ã£ã¦ä¸‹ã•ã„。ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダã§ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。  File: mew.ja.info, Node: dialog, Next: search, Prev: sorting, Up: Virtual 対話 ==== Mew ã§ã¯ã€ã‚るメッセージã«é–¢ä¿‚ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã•ã¾ã–ã¾ãªãƒ•ォルダã‹ã‚‰é›† ã‚ã¦ä»®æƒ³ãƒ•ォルダã«ä¸€è¦§è¡¨ç¤ºã§ãã¾ã™ã€‚ã“れを「対話ã€ã¨å‘¼ã³ã¾ã—ょã†ã€‚後㻠ã©èª¬æ˜Žã™ã‚‹ã‚¹ãƒ¬ãƒƒãƒ‰(*Note thread::)ã¨ã¯ã€ä»¥ä¸‹ã®ç‚¹ã§ç•°ãªã‚Šã¾ã™ã€‚ - スレッドã¯ã€1ã¤ã®ãƒ•ォルダ/仮想フォルダã«å¯¾ã—ã¦ã®ã¿ä½œæˆã§ãる。対 話ã¯ã€é–¢é€£ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¤‡æ•°ã®ãƒ•ã‚©ãƒ«ãƒ€ã«æ•£ã‚‰ã°ã£ã¦ã„ã¦ã‚‚よã„。 - スレッドã¯ã€è¡Œé ­æƒãˆã«ã‚ˆã£ã¦æœ¨æ§‹é€ ã‚’å¯è¦–化ã™ã‚‹ã€‚対話ã¯ã€æ—¥ä»˜é †ã« 一覧表示ã™ã‚‹ã€‚ å¯¾è©±ã®æ©Ÿèƒ½ã‚’使ã†ã«ã¯ã€ã¾ãš `kI' を実行ã—ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’作る必è¦ãŒ ã‚りã¾ã™ã€‚æ–°ã—ã届ãメッセージã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«å…¥ã‚‰ãªã„ã®ã§ã€`kI' ã¯å®šæœŸçš„ã«å®Ÿè¡Œã—ã¦ä¸‹ã•ã„。`kI' ã¯ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’差分更新ã—ã¾ã™ã€‚ ã“ã®æ–¹å¼ã¯æ—©ã„ã®ã§ã™ãŒã€ã‚´ãƒŸãŒæ®‹ã‚‹ã“ã¨ã¯é¿ã‘られãªã„ã®ã§ã€ã¨ãã©ã `C-ukI' を実行ã—ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’一ã‹ã‚‰ä½œã‚Šç›´ã—ã¦ä¸‹ã•ã„。 対話を作æˆã™ã‚‹ã«ã¯ã€æ³¨ç›®ã—ã¦ã„るメッセージã®ä¸Šã§ `V' を押ã—ã¾ã™ã€‚ ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€è‡ªåˆ†ã®å­å­«ã¨ã€è‡ªåˆ†ã®å…ˆç¥–ã€ãã—ã¦è‡ªåˆ†ã ã‘を表示ã—ã¾ã™ã€‚ 自分ã®å…„弟ãªã©ã¯è¡¨ç¤ºã—ã¾ã›ã‚“。一æ—全体を表示ã—ãŸã„ãªã‚‰ã€ä¸€æ—¦ä½œã£ãŸä»®æƒ³ フォルダã®ä¸€ç•ªä¸Šã«ã‚るメッセージã€ã™ãªã‚ã¡ä¸€æ—ã®ç¥–ã®ä¸Šã§ã€ã‚‚ã†ä¸€åº¦ `V' を実行ã—ã¦ä¸‹ã•ã„。  File: mew.ja.info, Node: search, Next: condition, Prev: dialog, Up: Virtual 検索 ==== Mew ã§ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æ¤œç´¢æ©Ÿèƒ½ã‚’æä¾›ã—ã¦ã„ã¾ã™ã€‚ `?' ç¾åœ¨ã®ãƒ•ォルダã§ã€æ¡ä»¶ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« `*' マークを付ã‘る。 入力ã•ã‚ŒãŸæ¡ä»¶ã«ã‚ˆã£ã¦ã€`mewl' ã‹ `grep' ã®ã©ã¡ã‚‰ã‹ãŒå‘¼ã°ã‚Œã‚‹ã€‚ `C-u?' リージョンを指定ã—㟠`?'。 `/' ç¾åœ¨ã®ãƒ•ォルダã§ã€æ¡ä»¶ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‹ã‚‰ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã‚’作る。 入力ã•ã‚ŒãŸæ¡ä»¶ã«ã‚ˆã£ã¦ã€`mewl' ã‹ `grep' ã®ã©ã¡ã‚‰ã‹ãŒå‘¼ã°ã‚Œã‚‹ã€‚ `C-u/' リージョンを指定ã—㟠`/'。 ã¾ãŸã€Spotlight ã‚„ Windows Desktop Search ãªã©ã®æ¤œç´¢ã‚¨ãƒ³ã‚¸ãƒ³ã‚’利用ã—㟠検索もå¯èƒ½ã§ã™ã€‚ã“れã«ã¯ã€ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ãŒã‚りã¾ã™ã€‚ `k?' ç¾åœ¨ã®ãƒ•ォルダã§ã€æ¡ä»¶ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« `*' マークを付ã‘る。 `k/' 全フォルダã«å¯¾ã—ã€æ¡ä»¶ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‹ã‚‰ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã‚’作る。 `C-uk/' 指定ã•れãŸãƒ•ォルダã«å¯¾ã—ã€æ¡ä»¶ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‹ã‚‰ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ ンを作る。フォルダを複数指定ã™ã‚‹ã«ã¯ "," ã§åŒºåˆ‡ã‚‹ã€‚ワイルドカード ã¨ã—ã¦ã€"*"を利用ã§ãる。  File: mew.ja.info, Node: condition, Next: dbsearch, Prev: search, Up: Virtual 検索æ¡ä»¶ã®å…¥åŠ›æ–¹æ³• ================== `?' ã‚„ `/' を実行ã™ã‚‹ã¨ã€Mew ã¯ãƒ¦ãƒ¼ã‚¶ã«å¯¾ã—以下ã®ã‚ˆã†ã«æ¤œç´¢ã®ãƒ‘ターン を訊ãã¾ã™ã€‚ mewl/grep pick pattern: å˜ç´”ã«ã€Œæ–‡å­—列ã€ã‚’ 1 ã¤å…¥åŠ›ã™ã‚‹ã¨ã€Mew 㯠`grep' を呼ã³å‡ºã—ã¾ã™ã€‚ã¾ãŸã€ 「æ¡ä»¶å¼ã€ã‚’入力ã™ã‚‹ã¨ã€`mewl' を呼ã³å‡ºã—ã¾ã™ã€‚ æ¡ä»¶å¼ã®æ›¸å¼ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚(çµåˆåŠ›ã®å¼·ã„é †ã«ä¸¦ã‚“ã§ã„ã¾ã™ã€‚) `field=string' フィールド field ã«æ–‡å­—列 string ãŒå«ã¾ã‚Œã¦ã„ã‚‹ã¨ãマッãƒ(大文字 å°æ–‡å­—を区別ã—ãªã„)。field ã« "head" を指定ã—ãŸå ´åˆã¯ã€ãƒ˜ãƒƒãƒ€å…¨ä½“ ã‚’æ„味ã™ã‚‹ã€‚ `field==string' フィールド field ã«æ–‡å­—列 string ãŒå«ã¾ã‚Œã¦ã„ã‚‹ã¨ãマッãƒ(大文字 å°æ–‡å­—を区別ã™ã‚‹)。field ã« "head" を指定ã—ãŸå ´åˆã¯ã€ãƒ˜ãƒƒãƒ€å…¨ä½“ã‚’ æ„味ã™ã‚‹ã€‚ `field!=string' フィールド field ã«æ–‡å­—列 string ãŒå«ã¾ã‚Œã¦ã„ãªã„ã¨ãマッãƒ(大文 å­—å°æ–‡å­—を区別ã—ãªã„)。field ã« "head" を指定ã—ãŸå ´åˆã¯ã€ãƒ˜ãƒƒãƒ€å…¨ 体をæ„味ã™ã‚‹ã€‚ `field!==string' フィールド field ã«æ–‡å­—列 string ãŒå«ã¾ã‚Œã¦ã„ãªã„ã¨ãマッãƒ(大文 å­—å°æ–‡å­—を区別ã™ã‚‹)。field ã« "head" を指定ã—ãŸå ´åˆã¯ã€ãƒ˜ãƒƒãƒ€å…¨ä½“ ã‚’æ„味ã™ã‚‹ã€‚ `( )' ã®å†…容を先ã«è©•価。 `! ' ã§ãªã„ã¨ãマッãƒã€‚ ` & ' ã‹ã¤ ã®ã¨ãマッãƒã€‚çœç•¥å¯èƒ½ã€‚ ` | ' ã¾ãŸã¯ ã®ã¨ãマッãƒã€‚ 以下ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ (a) From: ã« kazu ãŒå«ã¾ã‚Œã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ from=kazu (b) To: ㌠mewã€ã¾ãŸã¯ã€Cc: ㌠mew ã§ã‚るメッセージ to=mew | cc=mew (c) To: ㌠mewã€ã¾ãŸã¯ã€Cc: ㌠mew ã§ã€ã‹ã¤ã€from ㌠kazu ã§ã‚るメッセー ジ (to=mew | cc=mew) & from=kazu `?' ã‚„ `/' ã§ã€ãƒ‘ターンã«å…¥åŠ›ã®éš›ã«å˜ç´”ã« `RET' を押ã™ã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ã« 利用ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã¾ã§å…¥åŠ›ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ Cmd opts pattern: grep -l -e `k?' ã‚„ `k/' ã§æ¤œç´¢ã‚¨ãƒ³ã‚¸ãƒ³ã‚’利用ã™ã‚‹å ´åˆã¯ã€ä¸Šè¨˜ã®ãƒ‘ターン(æ–‡å­—åˆ—ã‚„æ¡ ä»¶å¼)ãŒè‡ªå‹•çš„ã«æ¤œç´¢ã‚¨ãƒ³ã‚¸ãƒ³ã®æ›¸å¼ã«å¤‰æ›ã•れã¾ã™ã€‚ ãŸã¨ãˆã°ã€kazu ã‹ã‚‰æ¥ãŸãƒ¡ãƒ¼ãƒ«ã§ã€ã€Œwineã€ã‚’å«ã¿ã€ã‹ã¤ã€Œbordeauxã€ã‚’å« ã¾ãªã„ã¨ã„ã†æ¡ä»¶å¼ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«æ›¸ãã¾ã™ã€‚ from=kazu wine ! bordeaux ãªãŠã€`mew-pick-pattern-list' ã«ãƒ‘ターンã®ãƒªã‚¹ãƒˆã‚’定義ã—ã¦ãŠãã¨ã€ `C-cTAB' ã§å„è¦ç´ ã‚’循環的ã«è£œå®Œã§ãã¾ã™ã€‚ã“ã®å ´åˆã€ãƒªã‚¹ãƒˆã®å…ˆé ­ãŒãƒ‡ãƒ•ã‚© ルトã¨ã—ã¦è¡¨ç¤ºã•れã¾ã™ã€‚ 日本語ã®å…¨æ–‡æ¤œç´¢ã‚’ã—ãŸã„å ´åˆã¯ã€("grep" ã®ä»£ã‚りã«) "mg" をインストー ルã—ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 (setq mew-prog-grep "mg") (setq mew-prog-grep-opts '("-j" "jis" "-l" "-e" "-x" "&mime"))  File: mew.ja.info, Node: dbsearch, Next: keyword, Prev: condition, Up: Virtual 検索エンジン ============ 検索エンジンをæ“作ã™ã‚‹ãŸã‚ã«ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚ `km' ãã®ãƒ•ォルダã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’作る。 `kM' 全体ã®ãƒ•ォルダã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’作る。ã‚ã‚‹ã„ã¯ã€ä½œã‚‹ãŸã‚ã«åˆæœŸåŒ–㙠る。 `kc' 検索エンジンを切り替ãˆã‚‹ã€‚ 以下ã«ã€ãれãžã‚Œã®æ¤œç´¢ã‚¨ãƒ³ã‚¸ãƒ³ã®èª¬æ˜Žã‚’示ã—ã¾ã™ã€‚ `Hyper Estraier' 定期的㫠`kM' を実行ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚コマンドラインã§ã€ "mewest" を実行ã—ã¦ã‚‚æ§‹ã„ã¾ã›ã‚“。ã‚るフォルダã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’æ€¥ã„ ã§æ›´æ–°ã—ãŸã„ãªã‚‰ `km' ã§ã‚‚よã„ã§ã—ょã†ã€‚`k?' ã¨`k/' ã®ä¸¡æ–¹ãŒåˆ©ç”¨ ã§ãã¾ã™ã€‚`C-uk/'ã§ãƒ•ォルダを指定ã™ã‚‹ã¨ã€ã‚µãƒ–ディレクトリも検索㫠ãªã‚Šã¾ã™ã€‚ `Spotlight' 一度ã ã‘ `kM' を実行ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚`km' ã¯å¿…è¦ã‚りã¾ã›ã‚“。 `k?' 㨠`k/' ã®ä¸¡æ–¹ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚ `Windows Desktop Search' 一度ã ã‘ `kM' を実行ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚`km' ã¯å¿…è¦ã‚りã¾ã›ã‚“。 `Google Desktop' 一度ã ã‘ `kM' を実行ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚`km' ã¯å¿…è¦ã‚りã¾ã›ã‚“。 `k/' ã®ã¿ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚ 検索エンジンã®åˆæœŸå€¤ã¯ã€æœ€åˆã«è¦‹ã¤ã‹ã£ãŸåˆ©ç”¨ã§ãã‚‹ã‚‚ã®ã«è‡ªå‹•çš„ã«è¨­å®šã• れã¾ã™ã€‚æ˜Žç¤ºçš„ã«æŒ‡å®šã—ãŸã„å ´åˆã¯ã€ `mew-search-method'ã«'estã€'spotlightã€'wds, 'google ã®ã©ã‚Œã‹ã‚’指定㗠ã¦ä¸‹ã•ã„。以下ã¯ã€Hyper Estraier ã«è¨­å®šã™ã‚‹ä¾‹ã§ã™ã€‚ (setq mew-search-method 'est)  File: mew.ja.info, Node: keyword, Next: thread, Prev: dbsearch, Up: Virtual キーワードã®å¼·èª¿ ================ 検索ã«ä½¿ã£ãŸã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã¯ã€ãƒãƒƒãƒ•ã‚¡ã«ä¿å­˜ã•れã¦ã„ã¾ã™ã€‚メッセージを表示 ã—ã€ã•らã«ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹ コマンドã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ `M-n' 下方å‘ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ç§»å‹•ã—キーワードをãƒã‚¤ãƒ©ã‚¤ãƒˆã—ã¦è¡¨ç¤ºã€‚Summary モードã§ã¯ `*' マークã®ã¤ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã€Virtual モードã§ã¯ã™ã¹ ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¯¾è±¡ã¨ãªã‚‹ã€‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’繰り返ã—利用ã™ã‚‹ã¨ã€ã‚­ãƒ¼ ワードã®ä»˜è¿‘ãŒæ¬¡ã€…ã¨è¡¨ç¤ºã•れã¦ã„ã。キーワードãŒè¨­å®šã•れã¦ã„ãªã„ ãªã‚‰ã€ãƒ¦ãƒ¼ã‚¶ã«ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’訊ã。 `C-uM-n' キーワードを明示的ã«è¨­å®šã§ãã‚‹ã“ã¨ä»¥å¤–ã¯ã€`M-n' ã«åŒã˜ã€‚ `M-p' `M-n' を逆方å‘ã«ã—ãŸã‚³ãƒžãƒ³ãƒ‰ã€‚ `C-uM-p' `C-uM-n' を逆方å‘ã«ã—ãŸã‚³ãƒžãƒ³ãƒ‰ã€‚  File: mew.ja.info, Node: thread, Next: thread-op, Prev: keyword, Up: Virtual スレッド ======== メッセージをやりã¨ã‚Šã—ã¦ã„ã‚‹ã¨ã€å¯¾è©±ã®æµã‚Œã¯æœ¨æ§‹é€ ã«ãªã‚Šã¾ã™ã€‚ã“れを行 é ­æƒãˆã«ã‚ˆã‚Šå¯è¦–化ã—ãŸã‚‚ã®ã‚’スレッドã¨å‘¼ã³ã¾ã™ã€‚以下ã«ã‚¹ãƒ¬ãƒƒãƒ‰ã®ä¾‹ã‚’示 ã—ã¾ã™ã€‚ 03/12 Hidenori Ohta 今週末 |日曜ã«ã‚¹ãƒˆãƒ¼ãƒ³ãƒžã‚¸ãƒƒã‚¯ 03/13 ã‹ãšãã‚“ ┣Re: 今週末 |雨ãªã®ã§ã€ä¸­ã«ã—ã¾ã™ã‹ 03/15 Hidenori Ohta ┃┗Re: 今週末 |ãれã§ã¯ã€12:00 ã«é›†åˆ 03/14 ãŠã ã¡ã‚ƒã‚“ â”—Re: 今週末 |ã„ã„ã­ã‡ã€‚次ã¯ã‚ã‚Œã‚’è½ ã‚¹ãƒ¬ãƒƒãƒ‰ã¯ä»®æƒ³ãƒ•ォルダã¨ã—ã¦å®Ÿç¾ã•れã¦ã„ã¾ã™ã€‚ãŸã¨ãˆã°ã€+inbox ã«å¯¾ã— スレッドを作るã¨ã€*+inbox* ã¨ã„ã†ãƒãƒƒãƒ•ã‚¡ãŒç”¨æ„ã•れã¾ã™ã€‚ スレッドを作るãŸã‚ã«ã€ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚ `tt' Summary モードã€ã‚ã‚‹ã¯ã€ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’作る。ãã—ã¦ã€ カーソルをç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã™ã‚‹ã€‚ã‚‚ã—ã€å¯¾å¿œã™ã‚‹ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã™ ã§ã«å­˜åœ¨ã—ã¦ã„ã‚‹ãªã‚‰ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã«è¡¨ç¤ºã‚’切り替ãˆã‚‹ã€‚スレッドã§ä½¿ç”¨ ã•れãŸéš›ã¯ã€å…ƒã®ãƒ•ォルダã¸ç§»ã‚Šã€ã‚«ãƒ¼ã‚½ãƒ«ã‚’ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ç§»å‹• ã™ã‚‹ã€‚ `C-utt' リージョンã«å¯¾ã—ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’作る。 `mt' `*' マークã®ä»˜ã„ã¦ã„るメッセージã«å¯¾ã—ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’作る。 `tr' æ­£è¦è¡¨ç¾ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’作る。  File: mew.ja.info, Node: thread-op, Next: Quit, Prev: thread, Up: Virtual ã‚¹ãƒ¬ãƒƒãƒ‰ã®æ“作 ============== スレッドã«ç‰¹åŒ–ã—ãŸç§»å‹•コマンドを以下ã«ç¤ºã—ã¾ã™ã€‚ `tp' ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®é ­ã«ç§»å‹•ã™ã‚‹ã€‚ã‚‚ã—ã€ã‚るスレッドã®é ­ã«ã‚«ãƒ¼ã‚½ãƒ«ãŒ ã‚ã‚‹å ´åˆã¯ã€å‰ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®é ­ã«ç§»å‹•ã™ã‚‹ã€‚ `tn' 次ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®é ­ã«ç§»å‹•ã™ã‚‹ã€‚ `^' 親ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã™ã‚‹ã€‚(スレッドã§ãªãã¦ã‚‚利用å¯èƒ½) `&' é•·ç”·ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã™ã‚‹ã€‚(スレッドã§ãªãã¦ã‚‚利用å¯èƒ½) `(' å…„ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã™ã‚‹ã€‚ `)' 弟ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã™ã‚‹ã€‚ スレッドã«ãƒžãƒ¼ã‚¯ã‚’付ã‘るコマンドを以下ã«ç¤ºã—ã¾ã™ã€‚ `t*' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é ­ã¨ã™ã‚‹éƒ¨åˆ†æœ¨ã«å±žã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã™ã¹ã¦ã« `*' マー クを付ã‘る。詳ã—ã㯠*Note target mark:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `t$' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é ­ã¨ã™ã‚‹éƒ¨åˆ†æœ¨ã«å±žã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã™ã¹ã¦ã« `$' マー クを付ã‘る。詳ã—ã㯠*Note escape mark:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `td' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é ­ã¨ã™ã‚‹éƒ¨åˆ†æœ¨ã«å±žã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã™ã¹ã¦ã« `D' マー クを付ã‘る。詳ã—ã㯠*Note delete mark:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `tM-d' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é ­ã¨ã™ã‚‹éƒ¨åˆ†æœ¨ã«å±žã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã™ã¹ã¦ã« `X' マー クを付ã‘る。詳ã—ã㯠*Note delete mark:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `to' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é ­ã¨ã™ã‚‹éƒ¨åˆ†æœ¨ã«å±žã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã™ã¹ã¦ã« `o' マー クを付ã‘る。詳ã—ã㯠*Note refile mark:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ スレッドã‹ã‚‰ãƒžãƒ¼ã‚¯ã‚’消ã™ã‚³ãƒžãƒ³ãƒ‰ã¯ã€`tu' ã§ã™ã€‚ 以下ã«ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’加工ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’示ã—ã¾ã™ã€‚ `tSPC' å­ä¾›ä»¥ä¸‹ã‚’éš ã—ã¦è¦ªã ã‘ã«ã™ã‚‹ã€‚å­ä¾›ä»¥ä¸‹ãŒéš ã‚Œã¦ã„る親メッセージ㫠ã¯ã€"+" ãŒä»˜ã。ã¾ãŸã€å­ä¾›ä»¥ä¸‹ãŒéš ã‚Œã¦ã„る親メッセージã§ã“ã®ã‚³ãƒž ンドを実行ã™ã‚‹ã¨ã€å­ä¾›ä»¥ä¸‹ãŒç¾ã‚Œã‚‹ã€‚ `ta' ã™ã¹ã¦ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã«å¯¾ã—ã€å­ä¾›ã®è¡¨ç¤ºã‚’å転ã•ã›ã‚‹ã€‚ `tg' ã‚るスレッドをã‚ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æŽ¥ãŽæœ¨ã™ã‚‹ã€‚æŽ¥ãŽæœ¨ã™ã‚‹ã‚¹ãƒ¬ãƒƒãƒ‰ã¯ã€ `C-SPC' ã§æŒ‡å®šã™ã‚‹ã€‚目的ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®ä¸€ç•ªä¸Šã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã€`C-SPC' を押ã™ã¨ã€ãã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒé¸æŠžã•れãŸã“ã¨ã«ãªã‚‹ã€‚ãã—ã¦ç›®çš„ã®ãƒ¡ãƒƒã‚»ãƒ¼ ジã¸ç§»å‹•ã—ã€`tg' を押ã™ã¨ã€ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å­ä¾›ã¨ã—ã¦æŽ¥ ãŽæœ¨ã•れる。 ãªãŠã€`mew-use-thread-separator' ã‚’ `t' ã«ã™ã‚‹ã¨ã€ã‚¹ãƒ¬ãƒƒãƒ‰é–“ã«å¢ƒç•Œæ–‡å­— 列ã¨ã—㦠`mew-thread-separator' (åˆæœŸå€¤ã¯ "--") ãŒæŒ¿å…¥ã•れã¾ã™ã€‚  File: mew.ja.info, Node: Quit, Next: Customize, Prev: thread-op, Up: Top 一休㿠****** Mew を終了ã•ã›ãŸã‚Šã€ä¸€æ™‚中断ã•ã›ãŸã‚Šã€ãã®ãƒ¢ãƒ¼ãƒ‰(正確ã«ã¯ãƒãƒƒãƒ•ã‚¡)を消 去ã™ã‚‹æ–¹æ³•を以下ã«ç¤ºã—ã¾ã™ã€‚ `q' Mew を一時中断ã—ã€ä»–ã®ãƒãƒƒãƒ•ã‚¡ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã€‚Mew 用ã®ãƒãƒƒãƒ•ã‚¡ã¯ã™ ã¹ã¦æ®‹ã£ã¦ã„ã‚‹ã®ã§ã€ãƒãƒƒãƒ•ã‚¡æ“作ã§é¸ã¹ã°å†é–‹ã§ãる。 `Q' Mew を終了。Mew ãŒä½¿ã£ãŸã™ã¹ã¦ã®ãƒãƒƒãƒ•ァを消去ã™ã‚‹ã€‚ `C-cC-q' ãã®ãƒ¢ãƒ¼ãƒ‰(正確ã«ã¯ãƒãƒƒãƒ•ã‚¡)を消去ã™ã‚‹ã€‚ `C-cC-q' ãã®è‰ç¨¿ã‚’消去ã™ã‚‹ã€‚ `C-cC-q' ãã®ãƒãƒƒãƒ•ァを消去ã™ã‚‹ã€‚  File: mew.ja.info, Node: Customize, Next: summary-mode, Prev: Quit, Up: Top カスタマイズ ************ ã“ã“ã§ã¯ã€Mew ã®ãƒ‡ãƒ•ォルトã®å‹•作を変更ã—ã€è‡ªåˆ†å¥½ã¿ã® Mew ã«ã™ã‚‹æ–¹æ³•ã‚’ 説明ã—ã¾ã™ã€‚主㫠"~/.mew.el" ã§è¨­å®šã—ã¦ä¸‹ã•ã„。 * Menu: * summary-mode:: Summary mode * message-mode:: Message mode * draft-mode:: Draft mode * charset:: 文字コード * highlight:: 色付㑠* hooks:: フック * pop:: POP * imap:: IMAP * nntp:: NNTP * smtp:: SMTP * config:: é€å—ä¿¡ã®å‹•作変化 * config2:: è¨­å®šã®æ›¸å¼ * custom-misc:: ãã®ä»–  File: mew.ja.info, Node: summary-mode, Next: message-mode, Prev: Customize, Up: Customize Summary mode ============ Summary ãƒ¢ãƒ¼ãƒ‰ã®æ›¸å¼ã¯ã€`mew-summary-form' ã§æŒ‡å®šã§ãã¾ã™ã€‚以下ã«åˆæœŸ 値を示ã—ã¾ã™ã€‚ (setq mew-summary-form '(type (5 date) " " (14 from) " " t (30 subj) "|" (0 body))) ã“ã®ã‚ˆã†ã«ã€`mew-summary-form' ã¯ã€ãƒªã‚¹ãƒˆã€ã‚·ãƒ³ãƒœãƒ«ã€æ–‡å­—列ã®ãƒªã‚¹ãƒˆã§ ã™ã€‚ 1. 文字列ã¯ãã®ã¾ã¾å‡ºåŠ›ã•れる 2. リストã¯ã€æ•´æ•°ã¨ã‚·ãƒ³ãƒœãƒ«ã‹ã‚‰æ§‹æˆã•れる。シンボルã¯ã€å‘¼ã³å‡ºã™é–¢æ•° ã‚’æ„味ã™ã‚‹ã€‚関数åã¯ã€"mew-summary-form-" ã¨ã‚·ãƒ³ãƒœãƒ«åを連çµã™ã‚‹ ã“ã¨ã§ä½œã‚‰ã‚Œã‚‹ã€‚(例: 'date ã¨ã„ã†ã‚·ãƒ³ãƒœãƒ«ã¯ã€ `mew-summary-form-date' ã¨ã„ã†é–¢æ•°åã«ãªã‚‹) ã‚らã‹ã˜ã‚定義ã•れ㦠ã„るシンボル㫠ã¯ã€'typeã€'timeã€'dateã€'yearã€'sizeã€'fromã€'subjã€'body ãŒã‚る。 詳細ã¯ã€`mew-summary-form-' ã¨ã„ã†åã‚’æŒã¤é–¢æ•°ã®èª¬æ˜Žã‚’å‚ ç…§ã®ã“ã¨ã€‚æ•´æ•°ã¯ã€é–¢æ•°ãŒè¿”ã™æ–‡å­—列ãŒåŸ‹ã‚るフィールドã®å¹…ã‚’æŒ‡å®šã™ ã‚‹ã€‚æ­£ã®æ•°ã¯ã€å·¦è©°ã‚ã‚’æ„味ã™ã‚‹ã€‚è² ã®æ•°ã¯ã€å³è©°ã‚ã‚’æ„味ã™ã‚‹ã€‚ã‚‚ã—ã€ è² ã®æ•°ã‚’指定ã™ã‚‹å ´åˆã€å¯¾å¿œã™ã‚‹é–¢æ•°ã¯ ASCII 文字列を返ã™å¿…è¦ãŒã‚る。 0 ã¯ã€è¡Œã®æ®‹ã‚Šã‚’æ„味ã—ã€å·¦è©°ã‚ã¨ãªã‚‹ã€‚ 3. `t' 以外ã®ã‚·ãƒ³ãƒœãƒ«ã¯ã€(1 シンボル) ã«ç­‰ã—ã„。 4. `mew-summary-form' ã¯ã€åˆ©ç”¨ã•れる際ã«å…ˆé ­ã« (mark) ãŒä»˜ã‘加ãˆã‚‰ã‚Œã‚‹ã€‚ 5. `t' ã¯ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã®éš›ã«æ®µä»˜ã‘ã™ã‚‹ä½ç½®ã‚’æ„味ã™ã‚‹ã€‚ 例を以下ã«ç¤ºã—ã¾ã™ã€‚ (setq mew-summary-form '(type (5 date) " " (-4 size) " " (14 from) " " t (30 subj) "|" (0 body))) `mew-summary-form-from-me-prefix' ã¯ã€è‡ªåˆ†ã‹ã‚‰é€ä¿¡ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å®› å…ˆã®å…ˆé ­ã«åŠ ãˆã‚‰ã‚Œã‚‹æ–‡å­—列ã§ã™ã€‚åˆæœŸå€¤ã¯ "To:" ã§ã™ã€‚ `mew-summary-form-extract-rule' ã¯ã€From: フィールドã‹ã‚‰ã©ã®éƒ¨åˆ†ã‚’切り 出ã™ã‹æŒ‡å®šã™ã‚‹ãŸã‚ã®ãƒªã‚¹ãƒˆã§ã™ã€‚è¦ç´  ã¯ã€'nameã€'commentã€'addressã€'nicknameã€ã‚ã‚‹ã„ã¯æ­£è¦è¡¨ç¾ã§ã‚ã‚‹å¿…è¦ãŒ ã‚りã¾ã™ã€‚åˆæœŸå€¤ã¯ '(nickname) ã§ã™ã€‚ 次ã®ä¾‹ã‚’考ãˆã¦ä¸‹ã•ã„。 A: Kazu Yamamoto B: kazu@example.org (Kazu Yamamoto) C: Kazuhiko Yamamoto (Kazu) ãれãžã®è¦ç´ ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ãªæ„味をæŒã¡ã¾ã™ã€‚ 1. 'name:: åå‰ã®éƒ¨åˆ† A. Kazu Yamamoto B. (No match) C. Kazuhiko Yamamoto (Kazu) 2. 'comment:: コメントã®éƒ¨åˆ† A: (No match) B: Kazu Yamamoto C: (Kazu) 3. 'address:: アドレスã®éƒ¨åˆ† A: kazu@example.org B: kazu@example.org C: kazu@example.org 4. 'nickname:: `mew-addrbook-for-summary' ã®å€¤ã«å¿œã˜ãŸã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã®å€‹ 人情報ã®ã‚ã‚‹è¦ç´ ã€‚`mew-addrbook-for-summary' ã®åˆæœŸå€¤ã¯ `'nickname' ãªã®ã§ã€é€šå¸¸ã¯ãƒ‹ãƒƒã‚¯ãƒãƒ¼ãƒ ã«å¤‰æ›ã•ã‚Œã‚‹ã€‚ä½•ãŒæŒ‡å®šã§ã ã‚‹ã‹ã¯ã€*Note draft-mode:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ 5. (regex):: 最åˆã«åˆè‡´ã—ãŸæ–‡å­—列 ã‚ã‚‹è¦ç´ ãŒåˆè‡´ã—ãªã„å ´åˆã€æ¬¡ã®è¦ç´ ãŒè©•価ã•れã¾ã™ã€‚ã©ã®è¦ç´ ã‚‚ From: フィー ルドã«åˆè‡´ã—ãªã„å ´åˆã‹ã€ã“ã®å€¤ãŒ `nil' ã®å ´åˆã€From: フィールド全体㌠利用ã•れã¾ã™ã€‚ `mew-summary-form-mark-delete' ㌠`t' ã®å ´åˆã€é‡è¤‡ã—ã¦ã„るメッセージ㫠自動的㫠`D' マークãŒä»˜ãã¾ã™ã€‚åˆæœŸå€¤ã¯ `nil' ã§ã™ã€‚ `mew-summary-form-mark-spam' ㌠`t' ã®å ´åˆã€æœ¬æ–‡ã®ä¸€éƒ¨ã«å¯¾ã™ã‚‹ MD5 ãƒã‚§ãƒƒ クサムãŒä¸€è‡´ã—ã¦ã„るメッセージã«è‡ªå‹•的㫠`D' マークãŒä»˜ãã¾ã™ã€‚åˆæœŸå€¤ 㯠`nil' ã§ã™ã€‚ `mew-summary-form-mark-review' ㌠`t' ã®å ´åˆã€è‡ªåˆ†å®›ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«è‡ª 動的㫠`*' マークãŒä»˜ãã¾ã™ã€‚åˆæœŸå€¤ã¯ `nil' ã§ã™ã€‚ ã„ã¤ã‚‚ Emacs ã®ãƒ•レーム全体㧠Mew を使ã„ãŸã„人ã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’ã—ã¦ä¸‹ã• ã„。 (setq mew-use-full-window t) Summary モード㮠`SPC' ã¯ã€`mew-summary-show-direction' ã«ã‚ˆã£ã¦ã€æ¬¡ã® メッセージã®è¡¨ç¤ºã®ä»•æ–¹ãŒå¤‰ã‚りã¾ã™ã€‚ã¾ãŸåŒæ§˜ã«ã€å¼·ã„マークを付ã‘ãŸå¾Œã‚«ãƒ¼ ソルãŒå‹•ãæ–¹å‘㯠`mew-summary-mark-direction' ã«ã‚ˆã‚ŠæŒ‡å®šã§ãã¾ã™ã€‚以下 ã®å€¤ã‚’設定ã§ãã¾ã™ã€‚ `up' 上ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã€‚ `down' 下ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã€‚ `next' 読ã¿é€²ã‚ã¦ã„ã‚‹æ–¹å‘ã®æ¬¡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã€‚ `stop' 次ã¯è¡¨ç¤ºã—ãªã„。 両方ã¨ã‚‚åˆæœŸå€¤ã¯ `next' ã§ã™ã€‚ã„ã¤ã‚‚メッセージを下ã‹ã‚‰èª­ã‚€äººã¯ã€ä»¥ä¸‹ã® よã†ã«ã™ã‚Œã°ã‚ˆã„ã§ã—ょã†ã€‚ (setq mew-summary-show-direction 'up)  File: mew.ja.info, Node: message-mode, Next: draft-mode, Prev: summary-mode, Up: Customize Message mode ============ Emacs ãŒã‚µãƒãƒ¼ãƒˆã—ã¦ãªã„データ型ã®ãƒ•ァイルã¯ã€Message ãƒãƒƒãƒ•ã‚¡ã«ç›´æŽ¥è¡¨ 示ã§ãã¾ã›ã‚“。ãã®ãƒ‡ãƒ¼ã‚¿ã‚’ãƒ†ã‚­ã‚¹ãƒˆã«æ•´å½¢ã™ã‚‹å¤–部コマンドをインストール ã™ã‚Œã°ã€Message ãƒãƒƒãƒ•ã‚¡ã«è¡¨ç¤ºå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ "w3m" 㨠"emacs-w3m" をインストールã™ã‚‹ã¨ã€Text/Html ã‚’ Message ãƒãƒƒ ファã«è¡¨ç¤ºã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚(以下ã§èª¬æ˜Žã™ã‚‹ "wvHtml"ã€"xlhtml"〠"ppthtml" ã¯ã€å˜ãªã‚‹ "w3m" ã§ã¯ãªãã€å›½éš›åŒ–ã•れ㟠"w3m-m17n" ãŒå¿…è¦ã§ ã™ã€‚) 両者をインストールã—ãŸã‚‰ã€"~/.mew.el" ã«ä»¥ä¸‹ã®è¨­å®šã‚’加ãˆã¦ä¸‹ã•ã„。 (condition-case nil (require 'mew-w3m) (file-error nil)) ã“れã§ã€ã‚ãŸã‹ã‚‚ Text/Plain ã§ã‚ã‚‹ã‹ã®ã‚ˆã†ã«ã€Text/Html ã‚’ Message ãƒãƒƒ ファã«è¡¨ç¤ºã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®éš›ã‚‚ã€ä»¥ä¸‹ã§èª¬æ˜Žã™ã‚‹ `C-cC-e'ã®æ“ ä½œã¯æœ‰åйã§ã™ã€‚ "wvHtml"ã€"xlhtml"ã€"ppthtml" ã¨ã„ã†ã‚³ãƒžãƒ³ãƒ‰ã‚’インストールã™ã‚Œã°ã€ãれ ãžã‚Œ WORDã€Excelã€PowerPoint ファイルã®ãƒ†ã‚­ã‚¹ãƒˆéƒ¨åˆ†ã‚’ã€Message ãƒãƒƒãƒ•ã‚¡ ã«è¡¨ç¤ºå¯èƒ½ã§ã™ã€‚ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€HTML を利用ã™ã‚‹ã®ã§ã€ä¸Šè¨˜ã® Text/Html ã®è¨­å®šã‚’完了ã•ã›ã¦ä¸‹ã•ã„。ã“れã§ã€ãŸã¨ãˆã° WORD ファイルを゠ãŸã‹ã‚‚テキストã®ã‚ˆã†ã«ã€Message ãƒãƒƒãƒ•ã‚¡ã«è¡¨ç¤ºå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ 外部ã®ãƒ—ãƒ­ã‚°ãƒ©ãƒ ã®æ•´å½¢çµæžœã‚’ Message ãƒãƒƒãƒ•ã‚¡ã«è¡¨ç¤ºã™ã‚‹ä»£ã‚りã«ã€å¤–部㮠プログラム自身ã«ãã®ãƒ‡ãƒ¼ã‚¿ã‚’表示ã•ã›ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“れã«ã¯ `C-cC-e' を使ã„ã¾ã™ã€‚ Message ãƒãƒƒãƒ•ã‚¡ã«ç”»åƒã‚’表示ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã¾ãŸ `C-cC-e' を使ã„〠外部ã®ãƒ—ログラムã«è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ HTML 㯠`C-cC-e' を使ã£ã¦å¤–部ã®ãƒ–ラウザã«è¡¨ç¤ºã§ãã¾ã™ã€‚Windows ã‚„Mac ã§ã¯ãƒ‡ãƒ•ォルトã®ãƒ–ラウザãŒåˆ©ç”¨ã•れã¾ã™ã€‚Unix ã§ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã« "mozilla" ãŒåˆæœŸå€¤ã¨ãªã£ã¦ã„ã¾ã™ã€‚ (defvar mew-prog-text/html-ext '("mozilla" ("-remote" "openFile(%s)") t)) ãŸã¨ãˆã°ã€ã“れを "firefox" ã«å¤‰æ›´ã™ã‚‹ã«ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ (setq mew-prog-text/html-ext '("firefox" ("-a" "firefox" "-remote" "openFile(%s)") t)) Office 関連ã®ãƒ•ァイルもã€`C-cC-e' を使ãˆã°ã€ãれãžã‚Œã®ã‚¢ãƒ—リケーション ã§è¡¨ç¤ºå¯èƒ½ã§ã™ã€‚Windows ã‚„ Mac ã§ã¯ã€æ–‡å­—通り Office ã®ã‚¢ãƒ—リケーショ ンãŒèµ·å‹•ã•れã¾ã™ã€‚Unix ã§ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã« "ooffice" ãŒåˆæœŸå€¤ã¨ãªã£ã¦ã„ ã¾ã™ã€‚ (defvar mew-prog-msword-ext "ooffice") (defvar mew-prog-msexcel-ext "ooffice") (defvar mew-prog-mspowerpoint-ext "ooffice") ã“れを "soffice" ã«å¤‰æ›´ã™ã‚‹ã«ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ (setq mew-prog-msword-ext "soffice") (setq mew-prog-msexcel-ext "soffice") (setq mew-prog-mspowerpoint-ext "soffice") ã¾ãŸ Office 関連ã®ã‚¢ãƒ—リケーションã«å¯¾ã—ã€`SPC' ãªã©ã§ã¯å†…容を表示ã›ãšã€ `C-cC-e' ã§ã¯ "wvHtml" ãªã©ã‚’使ã£ã¦ Message ãƒãƒƒãƒ•ã‚¡ã«è¡¨ç¤ºã™ã‚‹ã«ã¯ã€ä»¥ 下ã®ã‚ˆã†ã«è¨­å®šã—ã¾ã™ã€‚ (setq mew-prog-msword '(nil mew-mime-application/msword)) (setq mew-prog-msexcel '(nil mew-mime-application/msexcel)) (setq mew-prog-mspowerpoint '(nil mew-mime-application/mspowerpoint)) ã‚らã‹ã˜ã‚定ã‚られã¦ã„るコマンドã§ã¯ãªãã€ä»»æ„ã®å¤–部コマンドを呼ã³å‡ºã— ãŸã„å ´åˆã¯ã€`C-uC-cC-e' ã¨å…¥åŠ›ã—ã¦ä¸‹ã•ã„。 最近ã€Multipart/Alternative ã®ä¸­ã« Text/Plain 㨠Text/Html ã®ä¸¡æ–¹ãŒå…¥ã£ ã¦ãŠã‚Šã€ã©ã¡ã‚‰ã‹ã‚’é¸ã¶ã‚ˆã†ã«ãªã£ã¦ã„るメッセージを多ã見掛ã‘ã¾ã™ã€‚Mew ã¯ã€æ¨™æº–ã§ã¯ Text/Plain ã®æ–¹ã‚’優先ã—ã¦è¡¨ç¤ºã—ã¾ã™ã€‚"emacs-w3m" をインス トールã™ã‚Œã°ã€Text/Html ã®æ–¹ã‚’優先ã—ãŸããªã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。ãã®å ´åˆã€ 以下ã®è¨­å®šã‚’ "~/.mew.el" ã«åŠ ãˆã¦ä¸‹ã•ã„。(ã“ã“ã§ *Note multipart:: ã‚’ 読ã¿ã€`:' ã®ä½¿ã„方もæ€ã„出ã—ã¦ãŠãã¾ã—ょã†ã€‚) (setq mew-mime-multipart-alternative-list '("Text/Html" "Text/Plain" ".*")) ZIP ã§æš—å·åŒ–ã•ã‚ŒãŸæ·»ä»˜ãƒ•ァイルã¯ã€`zz' ã§å¾©å·åŒ–ã—表示ã§ãã¾ã™ã€‚  kazu-yamamoto-Mew-ff9c41b/info/mew.ja.info-3000066400000000000000000002646511256455547000207220ustar00rootroot00000000000000Info file: mew.ja.info, -*-Text-*- produced by `texinfo-format-buffer' from file `mew.texi' using `texinfmt.el' version 2.42 of 7 Jul 2006. INFO-DIR-SECTION Message User Agent START-INFO-DIR-ENTRY * Mew-J: (mew.ja.info). Messaging in the Emacs World. END-INFO-DIR-ENTRY  File: mew.ja.info, Node: draft-mode, Next: charset, Prev: message-mode, Up: Customize Draft mode ========== 自分㸠Cc: ã—ãŸã„人㯠`mew-cc' を設定ã—ã¦ä¸‹ã•ã„。返答ã®éš›ã«ã¯ã€å¯¾è±¡ã® メッセージã‹ã‚‰ã€åˆ¥é€” Cc: ãŒç”¨æ„ã•れる場åˆãŒã‚りã¾ã™ã€‚複数㮠Cc: ãŒã‚ã‚‹ å ´åˆã€é€ä¿¡æ™‚ã« 1 ã¤ã«ã¾ã¨ã‚られã¾ã™ã€‚ ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®ãŸã‚ã€è‡ªåˆ†ãŒé€ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–りãŸã„ã¨è€ƒãˆã€ã—ã‹ã‚‚ヘッ ダã«è‡ªåˆ†ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’残ã—ãŸããªã„ãªã‚‰ã€Dcc: を使ã£ã¦ä¸‹ã•ã„。 `mew-dcc' ã«è‡ªåˆ†ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã—ã¾ã—ょã†ã€‚ ã„ã¤ã‚‚å…¥ã‚Œã¦æ¬²ã—ã„ヘッダã¯ã€`mew-header-alist' ã«é€£æƒ³ãƒªã‚¹ãƒˆå½¢å¼ã§å®šç¾© ã—ã¦ä¸‹ã•ã„。以下ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ (setq mew-header-alist '(("X-fingerprint:" "6B 63 38 88 67 5E 96 8E CE A4 62 73 3F 11 64 94") ("X-URL:" "http://www.example.org/~kazu/"))) 引用ラベルã¯ã€å¼•用ã™ã‚‹ãƒ•ィールドを `mew-cite-fields'ã€ãƒ©ãƒ™ãƒ«ã®æ›¸å¼ ã‚’ `mew-cite-format' ã«å®šç¾©ã—ã¾ã™ã€‚引用記å·ã¯ `mew-cite-prefix' ã«æŒ‡å®šã—ã¾ã™ã€‚åˆæœŸå€¤ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ (defvar mew-cite-fields '("From:" "Subject:" "Date:")) (defvar mew-cite-format "From: %s\nSubject: %s\nDate: %s\n\n") (defvar mew-cite-prefix "> ") 引用ラベル㫠Message-ID: を加ãˆã‚‹ã«ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ (setq mew-cite-fields '("From:" "Subject:" "Date:" "Message-ID:")) (setq mew-cite-format "From: %s\nSubject: %s\nDate: %s\nMessage-ID: %s\n\n") 引用記å·ã«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ãƒ¦ãƒ¼ã‚¶éƒ¨åˆ†ãŒä»˜ãよã†ã«ã™ã‚‹ã«ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ (setq mew-cite-prefix-function (function mew-cite-prefix-username)) ã“れã§å¼•用記å·ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ From: SUMIKAWA Munechika Subject: Wine Date: Wed, 23 Jul 1997 11:40:50 +0900 sumikawa> ãŠã¯ã‚ˆã†ã‹ã‚‰ãŠã‚„ã™ã¿ã¾ã§ãƒ‹ãƒ¼ãƒˆã§ãŠãªã˜ã¿ã®è§’å·ã§ã™ã€‚ sumikawa> sumikawa> ã•ã¦ã€ã¨ã‚ã‘るワイン作戦ã§ã™ãŒã€å®šçŸ³é€šã‚Š '89 ã®ãƒœãƒ«ãƒ‰ãƒ¼ã® sumikawa> カベルãƒãƒ»ã‚½ãƒ¼ãƒ“ニョンを狙ã„ãŸã„ã¨æ€ã„ã¾ã™ã€‚ 引用ラベル㮠From: ã®éƒ¨åˆ†ã¨ã€å¼•用記å·ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã®å€‹äººæƒ…å ±ã®è¦ç´ ã«å¤‰ æ›ã§ãã¾ã™ã€‚ãれãžã‚Œã€`mew-addrbook-for-cite-label'〠`mew-addrbook-for-cite-prefix' ã§æŒ‡å®šã§ãã¾ã™ã€‚åˆæœŸå€¤ã¯ãれãžã‚Œ `nil' 㨠`'username' ã§ã™ã€‚以下ã®ã‚ˆã†ãªå€¤ãŒè¨­å®šã§ãã¾ã™ã€‚ 'shortname 短縮å 'address アドレス 'username アドレスã®ãƒ¦ãƒ¼ã‚¶éƒ¨åˆ† 'nickname ニックãƒãƒ¼ãƒ  'name æ­£å¼ãªæ°å 例ã¨ã—ã¦ä»¥ä¸‹ã®ã‚ˆã†ãªè¨­å®šã‚’考ãˆã¦ã¿ã¾ã—ょã†ã€‚ (setq mew-addrbook-for-cite-label 'nickname) (setq mew-addrbook-for-cite-prefix 'nickname) 最åˆã®è¨­å®šã§ãƒ©ãƒ™ãƒ«ã®ä¸­ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒãƒ‹ãƒƒã‚¯ãƒãƒ¼ãƒ ã«å¤‰ã‚りã¾ã™ã€‚ã¾ãŸã€æ¬¡ã® 設定ã§å¼•用記å·ã‚‚ニックãƒãƒ¼ãƒ ã«ç½®ãæ›ã‚りã¾ã™ã€‚ From: ã™ã¿ã£ã¡ Subject: Wine Date: Wed, 23 Jul 1997 11:40:50 +0900 ã™ã¿ã£ã¡> ãŠã¯ã‚ˆã†ã‹ã‚‰ãŠã‚„ã™ã¿ã¾ã§ãƒ‹ãƒ¼ãƒˆã§ãŠãªã˜ã¿ã®è§’å·ã§ã™ã€‚ ã™ã¿ã£ã¡> ã™ã¿ã£ã¡> ã•ã¦ã€ã¨ã‚ã‘るワイン作戦ã§ã™ãŒã€å®šçŸ³é€šã‚Š '89 ã®ãƒœãƒ«ãƒ‰ãƒ¼ã® ã™ã¿ã£ã¡> カベルãƒãƒ»ã‚½ãƒ¼ãƒ“ニョンを狙ã„ãŸã„ã¨æ€ã„ã¾ã™ã€‚  File: mew.ja.info, Node: charset, Next: highlight, Prev: draft-mode, Up: Customize 文字コード ========== *Note charset-guess:: ã§èª¬æ˜Žã—ãŸã‚ˆã†ã«ã€Mew ã§ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹éš› ã«é©åˆ‡ãªæ–‡å­—コードを自動的ã«é¸æŠžã—ã¾ã™ã€‚ ã‚‚ã—複数ã®è¨€èªžã®æ–‡å­—ãŒæ··åœ¨ã—ã¦ãŠã‚Šã€å›½éš›åŒ–ã•ã‚ŒãŸæ–‡å­—ã‚³ãƒ¼ãƒ‰ã‚’é¸æŠžã™ã‚‹å¿… è¦ãŒã‚ã‚‹å ´åˆã¯ã€`mew-charset-m17n' ã®å€¤ã‚’利用ã—ã¾ã™ã€‚åˆæœŸå€¤ã¯ã€"utf-8" (Unicode ã¨ç†è§£ã—ã¦ã‚ˆã„)ã§ã™ã€‚"iso-2022-jp-2" ã«ã—ãŸã„人ã¯ã€ä»¥ä¸‹ã®ã‚ˆã† ã«è¨­å®šã™ã‚‹ã¨ã‚ˆã„ã§ã—ょã†ã€‚ (setq mew-charset-m17n "iso-2022-jp-2") メッセージを作æˆã—ãŸéš›ã«ã€æŽ¨æ¸¬ã•ã‚ŒãŸæ–‡å­—コードを確èªã—ãŸã„å ´åˆã¯ã€ `mew-ask-charset' を設定ã—ã¦ä¸‹ã•ã„。 `nil' ã©ã®ã‚ˆã†ãªæ–‡å­—コードãŒåˆ©ç”¨ã•れã¦ã‚‚確èªãªã— `文字コードã®ãƒªã‚¹ãƒˆ' ã“ã®ãƒªã‚¹ãƒˆã«å­˜åœ¨ã—ãªã„文字コードãŒåˆ©ç”¨ã•れãŸå ´åˆã«ç¢ºèª `t' `mew-charset-m17n' ãŒåˆ©ç”¨ã•れãŸå ´åˆã«ç¢ºèª ãŸã¨ãˆã°ã€US-ASCII 㨠ISO-2022-JP ä»¥å¤–ã®æ–‡å­—コードãŒé¸ã°ã‚ŒãŸå ´åˆç¢ºèªã— ãŸã„ã®ã§ã‚れã°ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 (setq mew-ask-charset '("us-ascii" "iso-2022-jp")) ã“ã†è¨­å®šã—ã¦ã„ã‚‹ã¨ãã€ãŸã¨ãˆã° "utf-8" ãŒé¸æŠžã•れるã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨Š ã‹ã‚Œã¾ã™ã€‚ utf-8 is used. OK? (y or n) `y' を押ã™ã¨ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒé€ä¿¡ã•れã¾ã™(ã‚ã‚‹ã„ã¯ã€ã‚­ãƒ¥ãƒ¼ã«æºœã‚Šã¾ã™)。 `n' を押ã™ã¨ã€è‰ç¨¿ãŒå…ƒã®çŠ¶æ…‹ã«æˆ»ã‚Šã¾ã™ã€‚ ヨーロッパã§ã¯ã€Latin 1 (ISO-8859-1) ã®ä»£ã‚Šã«ã€ãƒ¦ãƒ¼ãƒ­è¨˜å·ã‚’å«ã‚€ Latin 9 (ISO-8859-15ã€é€šç§° Latin 0) ãŒä½¿ã‚れ始ã‚ã¦ã„ã¾ã™ã€‚è‰ç¨¿ã«ã€Latin 1 㮠文字㨠Latin 9 ã®æ–‡å­—ãŒæ··åœ¨ã—ã¦ã„ã‚‹ã¨ã€ä»¥ä¸‹ã®æ‰‹é †ã«ã‚ˆã£ã¦ã€æ–‡å­—コード ãŒæ±ºå®šã•れã¾ã™ã€‚ 1. `unify-8859-on-decoding-mode' を利用ã—ã¦ã„ã‚‹å ´åˆï¼š 1. ISO-8859-1 ã«åŽã¾ã‚‹ãªã‚‰ "iso-8859-1" を利用 2. ãã†ã§ãªã„ãªã‚‰ "utf-8" を利用 2. `unify-8859-on-decoding-mode' を利用ã—ã¦ã„ãªã„å ´åˆï¼š 1. ISO-8859-1 㨠ISO-8859-15 ã®ã©ã¡ã‚‰ã«ã‚‚åŽã¾ã‚‹å ´åˆã€"ISO-8859-1" 2. ISO-8859-1 ã«åŽã¾ã‚‹ãªã‚‰ "iso-8859-1" を利用 3. ISO-8859-15 ã«åŽã¾ã‚‹ãªã‚‰ "iso-8859-15" を利用 4. ãã†ã§ãªã„ãªã‚‰ã€"utf-8" を利用 `mew-charset-latin' ã®åˆæœŸå€¤ã¯ã€"iso-8859-15" ã§ã™ã€‚"iso-8859-1" ã«ã— ãŸã„å ´åˆã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¾ã™ã€‚ (setq mew-charset-latin "iso-8859-1") ã‚‚ã—ã€US-ASCII ä»¥å¤–ã®æ–‡å­—ã«å¯¾ã—ã€å¿…ãš UTF-8 を使ã„ãŸã„ãªã‚‰ã€ä»¥ä¸‹ã®ã‚ˆã† ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 (setq mew-cs-database-for-encoding `(((ascii) nil "7bit" "7bit") (nil utf-8 "base64" "B")))  File: mew.ja.info, Node: highlight, Next: hooks, Prev: charset, Up: Customize 色付㑠====== `mew-use-highlight-mark' ㌠`t' ã®å ´åˆã€ãƒžãƒ¼ã‚¯ã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«è‰²ãŒ 付ãã¾ã™ã€‚åˆæœŸå€¤ã¯ `t' ã§ã™ã€‚ `mew-use-highlight-header' ㌠`t' ã®å ´åˆã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ˜ãƒƒãƒ€ã«è‰²ãŒä»˜ã ã¾ã™ã€‚åˆæœŸå€¤ã¯ `t' ã§ã™ã€‚ `mew-use-highlight-body' ㌠`t' ã®å ´åˆã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ¬æ–‡ã«è‰²ãŒä»˜ãã¾ã™ã€‚ åˆæœŸå€¤ã¯ `t' ã§ã™ã€‚色を付ã‘る上é™ã¯ã€`mew-highlight-body-max-size' 㧠指定ã§ãã¾ã™ã€‚åˆæœŸå€¤ã¯ 10000 ãƒã‚¤ãƒˆã§ã™ã€‚ `mew-use-highlight-url' ㌠`t' ã®å ´åˆã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä¸­ã® URL ã«ä»• 掛ã‘ãŒæ–½ã•れã¦ã€ãƒžã‚¦ã‚¹ã‚’æŒã£ã¦ã„ãã¨å…‰ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚åˆæœŸå€¤ã¯ `t' ã§ã™ã€‚ `mew-use-cursor-mark' ㌠`t' ã®å ´åˆã€Summary モードã«ãŠã„ã¦ã€ç¾åœ¨è¡¨ç¤º ã—ã¦ã„るメッセージã®è¡Œé ­ã«ã€`mew-cursor-mark' ã§æŒ‡å®šã•れãŸç›®å°ãŒä»˜ãã¾ ã™ã€‚åˆæœŸå€¤ã¯ `nil' ã§ã™ã€‚`mew-cursor-mark' ã®åˆæœŸå€¤ã¯ ">" ã§ã™ã€‚ `mew-use-highlight-cursor-line' ㌠`t' ã®å ´åˆã€Summary モードã§ã‚«ãƒ¼ã‚½ ルã®ã‚る行ã«ä¸‹ç·šãŒå¼•ã‹ã‚Œã¾ã™ã€‚åˆæœŸå€¤ã¯ `t' ã§ã™ã€‚ `mew-use-highlight-mouse-line' ㌠`t' ã®å ´åˆã€Emacs ãŒãƒžã‚¦ã‚¹ã®è‰²ä»˜ã‘ã‚’ サãƒãƒ¼ãƒˆã—ã¦ã„れã°ã€Summary モードã§ãƒžã‚¦ã‚¹ã®ã‚る行ã«è‰²ãŒã¤ãã¾ã™ã€‚真中 ã®ãƒœã‚¿ãƒ³ã‚’クリックã—ãªãŒã‚‰ã€ãƒžã‚¦ã‚¹ã ã‘ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読む際ã«ã¯ã¨ã¦ã‚‚便 利ã§ã™ã€‚åˆæœŸå€¤ã¯ `nil' ã«ãªã£ã¦ã„ã¾ã™ã€‚ `mew-use-highlight-x-face' ㌠`t' ã§ã€ãƒ˜ãƒƒãƒ€ä¸­ã® X-Face: ㌠Message モードã§ã‚¢ã‚¤ã‚³ãƒ³åŒ–ã•れã¾ã™ã€‚åˆæœŸå€¤ã¯ `t' ã§ã™ã€‚ã“ã®æ©Ÿèƒ½ã‚’ 利用ã™ã‚‹ã«ã¯ã€"netpbm" 㨠"compface" パッケージをインストールã—ã¦ä¸‹ ã•ã„。 色を変更ã™ã‚‹ã«ã¯ã€Mew ã®ã‚½ãƒ¼ã‚¹ã¨ä¸€ç·’ã«é…布ã•れã¦ã„ã‚‹ "dot.theme" ã‚’ é©å½“ãªåå‰ã§ã‚³ãƒ”ーã—内容を変更ã—ã¾ã™ã€‚ã“ã“ã§ã¯ã€ãã®ãƒ•ァイルåã‚’ "~/.mew-theme.el" ã¨ã—ã¾ã—ょã†ã€‚ã¾ãšã€ã“ã®åå‰ã‚’ ".mew.el" ã§ `mew-theme-file' ã«æŒ‡å®šã—ã¦ä¸‹ã•ã„。 (setq mew-theme-file "~/.mew-theme.el") 次ã«ä¸­èº«ã‚’変更ã—ã¾ã™ã€‚ãŸã¨ãˆã°ã€ä»¥ä¸‹ã®ã‚ˆã†ãªè¨­å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã™ã€‚ (mew-setface-bold header-subject :tty "red" :light "Firebrick" :dark "OrangeRed") シンボル `header-subject' ã¯ã€ãƒ˜ãƒƒãƒ€ã® "Subject:" ã®å€¤ã‚’æ„味ã—ã¦ã„ã¾ ã™ã€‚:tty 㯠Emacs をカラーã®ç«¯æœ«ã§èµ·å‹•ã—ãŸå ´åˆã€:light 㨠:dark ã¯ã€ã れãžã‚Œ Emacs をウインドウã§èµ·å‹•ã—ãŸã¨ãã®èƒŒæ™¯ãŒç™½ã¨é»’ã®å ´åˆã‚’æ„味ã—㦠ã„ã¾ã™ã€‚ 端末ã§ã¯ green ã€èƒŒæ™¯ãŒç™½ãªã‚‰ ForestGreenã€èƒŒæ™¯ãŒé»’ãªã‚‰ LimeGreen ã¨è¨­ 定ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ (mew-setface-bold header-subject :tty "green" :light "ForestGreen" :dark "LimeGreen") シンボルã«ä½•ãŒã‚ã‚‹ã®ã‹ã¯ã€"dot.mew" を見ã¦ä¸‹ã•ã„。 ä¸Šè¨˜ã®æ–¹æ³•ã§ã¯ã€ãƒ˜ãƒƒãƒ€ã®ã™ã¹ã¦ã®ãƒ•ィールドåやフィールド値ã«å¯¾ã—ã¦ã‚·ãƒ³ ボルãŒå®šç¾©ã•れã¦ã„る訳ã§ã¯ã‚りã¾ã›ã‚“。ãã“ã§ã€ã©ã‚“ãªãƒ•ィールドã®è‰²ã§ã‚‚ ç°¡å˜ã«å¤‰æ›´ã§ãるよã†ã«ã€`mew-header-color' ã¨`mew-header-color-bold' ã¨ã„ã†é–¢æ•°ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚後者を使ã†ã¨å¤ªå­—ã«ã€å‰è€…を使ã†ã¨æ™®é€šã®æ–‡ å­—ã«ãªã‚Šã¾ã™ã€‚ãŸã¨ãˆã°ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ä½¿ã„ã¾ã™ã€‚ (mew-header-color-bold "Subject:" "LimeGreen" "OrangeRed") ã“ã®è¨­å®šã§ã¯ã€"Subject:" ㌠LimeGreen ã®å¤ªå­—ã«ã€ãã®å€¤ãŒ OrangeRed 㮠太字ã«ãªã‚Šã¾ã™ã€‚ ã“ã®æ–¹æ³•ã§ã¯ã€ç«¯æœ«ã‚„背景ã®è‰²ã‚’考慮ã—ãŸè¨­å®šã¯ã§ãã¾ã›ã‚“。ã¾ãŸã€ãƒ•ィール ド値ã®è‰²ã‚’çœç•¥ã™ã‚‹ã¨ã€ãƒ•ィールドåã¨åŒã˜è‰²ãŒä½¿ç”¨ã•れã¾ã™ã€‚  File: mew.ja.info, Node: hooks, Next: pop, Prev: highlight, Up: Customize フック ====== Mew ã§ç”¨æ„ã•れã¦ã„るフックをã¾ã¨ã‚ã¾ã™ã€‚ `mew-env-hook' Mew ã®èµ·å‹•時ã®ç’°å¢ƒãŒè¨­å®šã•れるå‰ã«è©•価ã•れる。 `mew-init-hook' Mew ã®èµ·å‹•時ã«è©•価ã•れる。 `mew-status-update-hook' çŠ¶æ…‹ã®æ›´æ–°(`Z')ã®ã¨ãã«è©•価ã•れる。 `mew-summary-mode-hook' Summary モードã«å…¥ã‚‹ã¨ãã«è©•価ã•れる。 `mew-virtual-mode-hook' Virtual モードã«å…¥ã‚‹ã¨ãã«è©•価ã•れる。 `mew-thread-display-hook' スレッドãŒè¡¨ç¤ºã•れãŸå¾Œã«è©•価ã•れる。 `mew-header-mode-hook' Header モードã«å…¥ã‚‹ã¨ãã«è©•価ã•れる。 `mew-draft-mode-hook' Draft モードã«å…¥ã‚‹ã¨ãã«è©•価ã•れる。 `mew-draft-mode-newdraft-hook' æ–°ã—ã„è‰ç¨¿ãŒç”¨æ„ã•れãŸéš›ã«ã€Draft モードã«ãŠã„ã¦è©•価ã•れる。 `mew-draft-mode-reedit-hook' +draft ã§ãªã„フォルダã«ã‚ã‚‹å¤ã„è‰ç¨¿ã‚’å†ç·¨é›†ã—ãŸéš›ã«ã€Draft モード ã«ãŠã„ã¦è©•価ã•れる。 `mew-draft-mode-reedit-draft-hook' +draft ã§ãªã„フォルダã«ã‚ã‚‹è‰ç¨¿ã‚’å†ç·¨é›†ã—ãŸéš›ã«ã€Draft モードã«ãŠ ã„ã¦è©•価ã•れる。 `mew-draft-mode-reedit-queue-hook' +queue ã¾ãŸã¯ +postq フォルダã«ã‚るメッセージをå†ç·¨é›†ã—ãŸéš›ã«ã€ Draft モードã«ãŠã„ã¦è©•価ã•れる。 `mew-draft-mode-edit-again-hook' å¤ã„å½¢å¼ã§æˆ»ã£ã¦ããŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å†ç·¨é›†ã—ãŸéš›ã«ã€Draft モードã«ãŠ ã„ã¦è©•価ã•れる。 `mew-message-mode-hook' Message モードã«å…¥ã‚‹ã¨ãã«è©•価ã•れる。 `mew-message-hook' メッセージ㌠Message モードã§è¡¨ç¤ºã•れる度ã«è©•価ã•れる。 `mew-make-message-hook' Draft モード㧠MIME メッセージを作るå‰ã€ã¤ã¾ã‚Š `C-cC-m' ã®éš›ã®æœ€ åˆã«è©•価ã•れる。例:(add-hook 'mew-make-message-hook 'ispell-message) `mew-send-hook' メッセージを SMTP ã§é€ä¿¡/キューイングã™ã‚‹å‰ã«è©•価ã•れる。メッセー ã‚¸ã®æœ€çµ‚å½¢ãŒä½œã‚‰ã‚Œã‚‹å‰ã«è©•価ã•れるã“ã¨ã«æ³¨æ„。 `mew-post-hook' メッセージを NNTP ã§æŠ•ç¨¿/キューイングã™ã‚‹å‰ã«è©•価ã•れる。メッセー ã‚¸ã®æœ€çµ‚å½¢ãŒä½œã‚‰ã‚Œã‚‹å‰ã«è©•価ã•れるã“ã¨ã«æ³¨æ„。 `mew-real-send-hook' メッセージを SMTP ã§é€ä¿¡/キューイングã™ã‚‹å‰ã«è©•価ã•れる。メッセー ã‚¸ã®æœ€çµ‚å½¢ãŒä½œã‚‰ã‚ŒãŸå¾Œã«è©•価ã•れるã“ã¨ã«æ³¨æ„。 `mew-real-post-hook' メッセージを NNTP ã§é€ä¿¡/キューイングã™ã‚‹å‰ã«è©•価ã•れる。メッセー ã‚¸ã®æœ€çµ‚å½¢ãŒä½œã‚‰ã‚ŒãŸå¾Œã«è©•価ã•れるã“ã¨ã«æ³¨æ„。 `mew-smtp-flush-hook' +queue フォルダã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚ã‚‹å ´åˆã«ã€SMTP ãŒèµ·å‹•ã•れるå‰ã«è©• 価ã•れる。 `mew-nntp2-flush-hook' +postq フォルダã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚ã‚‹å ´åˆã«ã€NNTP ãŒèµ·å‹•ã•れるå‰ã«è©• 価ã•れる。 `mew-smtp-sentinel-hook' SMTP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 `mew-nntp-sentinel-hook' å—信用㮠NNTP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 `mew-nntp2-sentinel-hook' é€ä¿¡ç”¨ã® NNTP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 `mew-pop-sentinel-hook' POP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 `mew-pop-sentinel-non-biff-hook' Biff ã§ã¯ãªã„ POP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 `mew-imap-sentinel-hook' IMAP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 `mew-imap-sentinel-non-biff-hook' Biff ã§ã¯ãªã„ IMAP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 `mew-scan-sentinel-hook' Summary モード㮠`s' ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 `mew-summary-ls-no-scan-hook' Summary モード㮠`s' ãŒãƒ•ォルダã®ä¸€è¦§ã‚’å–らãªã‹ã£ãŸå ´åˆã«è©•価ã•れ る。 `mew-summary-exec-hook' Summary モード㮠`x' ã®å®Ÿè¡ŒãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 `mew-refile-guess-by-from-learn-hook' mew-refile-guess-by-from-learn ãŒå®Ÿè¡Œã•れる際ã«è©•価ã•れる。 `mew-sort-hook' Summary モード㮠`M-s' ã®å®Ÿè¡ŒãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 `mew-pack-hook' Summary モード㮠`O' ã®å®Ÿè¡ŒãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 `mew-summary-delete-folder-hook' フォルダãŒå‰Šé™¤ã•れるã¨ãã«è©•価ã•れる。 `mew-summary-rename-folder-hook' フォルダåãŒå¤‰æ›´ã•れるã¨ãã«è©•価ã•れる。 `mew-summary-toggle-disp-msg-hook' Summary モード㮠`v' ã®å®Ÿè¡ŒãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 `mew-syntax-format-hook' マルãƒãƒ‘ãƒ¼ãƒˆã®æ›¸å¼ã‚’作æˆã™ã‚‹é–¢æ•° `mew-syntax-format' ãŒå‘¼ã°ã‚ŒãŸéš› ã«è©•価ã•れる。 `mew-addrbook-mode-hook' アドレス帳ã®ç™»éŒ²ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚‹ã¨ãã«è©•価ã•れる。 `mew-cite-hook' Draft モードã§å¼•用ã™ã‚‹éš›ã«å‘¼ã°ã‚Œã‚‹ã€‚通常 supercite を設定ã™ã‚‹ãŸã‚ ã«ä½¿ã†ã€‚ `mew-before-cite-hook' Draft モードã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’引用ã™ã‚‹ç›´å‰ã«å‘¼ã°ã‚Œã‚‹ã€‚ `mew-suspend-hook' Mew を一時中断ã—ãŸéš›ã«è©•価ã•れる。 `mew-quit-hook' Mew ã®çµ‚了時ã«è©•価ã•れる。 以下ã«ãƒ•ックã®è¨­å®šä¾‹ã‚’示ã—ã¾ã™ã€‚ Draft モードã§ã¯ã€ãƒ•ックを `text-mode-hook'ã€`mew-draft-mode-hook' ã® é †ã§è©•価ã—ã¾ã™ã€‚`text-mode-hook' ã§ `auto-fill-mode' を設定ã—ã¦ã„ãªã„ 人ã¯ã€ `mew-draft-mode-hook' を以下ã®ã‚ˆã†ã«è¨­å®šã™ã‚‹ã®ãŒã‚ˆã„ã‹ã‚‚ã—れ㾠ã›ã‚“。 (add-hook 'mew-draft-mode-hook (lambda () (auto-fill-mode 1) (set-fill-column 70))) ã“ã®ä¾‹ã§ã¯ã€æŠ˜ã‚Šè¿”ã—ã®ã‚«ãƒ©ãƒ æ•°ã‚’70ã«è¨­å®šã—ã¦ã„ã¾ã™ã€‚  File: mew.ja.info, Node: pop, Next: imap, Prev: hooks, Up: Customize POP === Mew ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã™ã‚‹éš›ã« POP を利用ã§ãã¾ã™ã€‚ã“ã“ã§ã¯ã€POP を制御ã™ã‚‹ãŸã‚ã®ä»¥ä¸‹ã®å¤‰æ•°ã«ã¤ã„ã¦ã¾ã¨ã‚ã¾ã™ã€‚ `mew-pop-server' POP サーãƒã®åå‰ã€‚ `mew-pop-ssh-server' POP ã‚’ SSH 経由ã§å–å¾—ã™ã‚‹å ´åˆã® SSH サーãƒã®åå‰ã€‚ `mew-pop-ssl' POP over SSL を使ã†ã‹å¦ã‹ã€‚ `mew-pop-ssl-port' POP over SSL ã®ãƒãƒ¼ãƒˆç•ªå·ã€‚ `mew-pop-user' POP ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆåã€‚åˆæœŸå€¤ã¯ãƒ­ã‚°ã‚¤ãƒ³å。 `mew-pop-auth' POP ã®èªè¨¼æ–¹å¼ã€‚`'pass' 㯠USER/PASS (生パスワード)ã€`'apop' 㯠APOPã€`t' 㯠`mew-pop-auth-list' ã«å¾“ã£ãŸ SASL ã‚’æ„味ã™ã‚‹ã€‚åˆæœŸå€¤ 㯠`'apop'。 `mew-pop-auth-list' SASL ã§åˆ©ç”¨ã™ã‚‹èªè¨¼æ–¹å¼ã®ãƒªã‚¹ãƒˆã€‚優先順ä½ã®é«˜ã„é †ã«ä¸¦ã¹ã‚‹ã€‚ç¾åœ¨ã€ "CRAM-MD5" ãŒåˆ©ç”¨å¯èƒ½ã€‚ `mew-pop-delete' POP サーãƒã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–得後ã€POP サーãƒã«ã‚るメッセージを削 除ã™ã‚‹ã‹å¦ã‹ã€‚`t' ãªã‚‰å‰Šé™¤ã€‚`nil' ãªã‚‰å‰Šé™¤ã—ãªã„。数値 N ãªã‚‰ã€æœ€ åˆã®ã‚¢ã‚¯ã‚»ã‚¹ã‹ã‚‰ N 日後ã«å‰Šé™¤ã™ã‚‹ã€‚åˆæœŸå€¤ã¯ `t'。 `mew-pop-size' POP サーãƒã‹ã‚‰å–å¾—ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¤§ãã•ã®ä¸Šé™ã€‚åˆæœŸå€¤ã¯ 55296 ムイト。0 ã«è¨­å®šã™ã‚‹ã¨ã€ä¸Šé™ãªã—ã®æ„味ã«ãªã‚Šã€ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ å–å¾—ã™ã‚‹ã€‚上é™ã«å¼•ã£æŽ›ã‹ã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å…¨ä½“ã‚’å–å¾—ã™ã‚‹æ–¹æ³•ã«ã¤ã„ ã¦ã¯ã€*Note retrieving:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `mew-pop-body-lines' 大ãã•ã®ä¸Šé™ã«ã²ã£ã‹ã‹ã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ¬æ–‡ã‚’何行å–å¾—ã™ã‚‹ã‹ã¨ã„ã† å€¤ã€‚åˆæœŸå€¤ã¯ 40。 `mew-pop-header-only' POP ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹éš›ã«ã€ãƒ˜ãƒƒãƒ€ã®ã¿ã«ã™ã‚‹ã‹ã€æœ¬æ–‡ã‚‚å–å¾—ã™ã‚‹ã‹ã€‚ `nil' ã§ãªã‘れã°ã€ãƒ˜ãƒƒãƒ€ã®ã¿ã‚’å–å¾—ã€‚åˆæœŸå€¤ã¯ `nil'。  File: mew.ja.info, Node: imap, Next: nntp, Prev: pop, Up: Customize IMAP ==== Mew ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã™ã‚‹éš›ã« IMAP を利用ã§ãã¾ã™ã€‚ã“ã“ã§ã¯ã€IMAP を制御ã™ã‚‹ãŸã‚ã®ä»¥ä¸‹ã®å¤‰æ•°ã«ã¤ã„ã¦ã¾ã¨ã‚ã¾ã™ã€‚ `mew-imap-server' IMAP サーãƒã®åå‰ã€‚ `mew-imap-ssh-server' IMAP ã‚’ SSH 経由ã§å–å¾—ã™ã‚‹å ´åˆã® SSH サーãƒã®åå‰ã€‚ `mew-imap-ssl' IMAP over SSL を使ã†ã‹å¦ã‹ã€‚ `mew-imap-ssl-port' IMAP over SSL ã®ãƒãƒ¼ãƒˆç•ªå·ã€‚ `mew-imap-user' IMAP ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆåã€‚åˆæœŸå€¤ã¯ãƒ­ã‚°ã‚¤ãƒ³å。 `mew-imap-auth' IMAP ã®èªè¨¼æ–¹å¼ã€‚`nil' 㯠LOGIN (生パスワード)ã€`t' 㯠`mew-imap-auth-list' ã«åŸºã¥ã„㟠SASL ã‚’æ„味ã™ã‚‹ã€‚åˆæœŸå€¤ã¯ `t'。 `mew-imap-auth-list' SASL ã§åˆ©ç”¨ã™ã‚‹èªè¨¼æ–¹å¼ã®ãƒªã‚¹ãƒˆã€‚優先順ä½ã®é«˜ã„é †ã«ä¸¦ã¹ã‚‹ã€‚ç¾åœ¨ã€ "CRAM-MD5" 㨠"LOGIN" ãŒåˆ©ç”¨å¯èƒ½ã€‚ `mew-imap-delete' IMAP サーãƒã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–得後ã€IMAP サーãƒã«ã‚るメッセージを 削除ã™ã‚‹ã‹å¦ã‹ã€‚`t' ãªã‚‰å‰Šé™¤ã€‚`nil' ãªã‚‰å‰Šé™¤ã—ãªã„。数値 N ãªã‚‰ã€ 最åˆã®ã‚¢ã‚¯ã‚»ã‚¹ã‹ã‚‰ N 日後ã«å‰Šé™¤ã™ã‚‹ã€‚åˆæœŸå€¤ã¯ `t'。 `mew-imap-size' IMAP サーãƒã‹ã‚‰å–å¾—ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¤§ãã•ã®ä¸Šé™ã€‚åˆæœŸå€¤ã¯ 55296 ãƒã‚¤ãƒˆã€‚ 0 ã«è¨­å®šã™ã‚‹ã¨ã€ä¸Šé™ãªã—ã®æ„味ã«ãªã‚Šã€ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹ã€‚ä¸Šé™ ã«å¼•ã£æŽ›ã‹ã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å…¨ä½“ã‚’å–å¾—ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€ *Note retrieving:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `mew-imap-header-only' IMAP ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹éš›ã«ã€ãƒ˜ãƒƒãƒ€ã®ã¿ã«ã™ã‚‹ã‹ã€æœ¬æ–‡ã‚‚å–å¾—ã™ã‚‹ã‹ã€‚ `nil' ã§ãªã‘れã°ã€ãƒ˜ãƒƒãƒ€ã®ã¿ã‚’å–å¾—ã€‚åˆæœŸå€¤ã¯ `nil'。  File: mew.ja.info, Node: nntp, Next: smtp, Prev: imap, Up: Customize NNTP ==== Mew ã§ã¯ã€ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’èª­ã¿æ›¸ãã™ã‚‹éš›ã« NNTP を利用ã—ã¾ã™ã€‚ã“ã“ã§ã¯ã€NNTP を制御ã™ã‚‹ãŸã‚ã®ä»¥ä¸‹ã®å¤‰æ•°ã«ã¤ã„ã¦ã¾ã¨ã‚ã¾ã™ã€‚ `mew-nntp-server' NNTP サーãƒã®åå‰ã€‚ `mew-nntp-ssh-server' NNTP ã‚’ SSH 経由ã§å–å¾—ã™ã‚‹å ´åˆã® SSH サーãƒã®åå‰ã€‚ `mew-nntp-ssl' NNTP over SSL を使ã†ã‹å¦ã‹ã€‚ `mew-nntp-ssl-port' NNTP over SSL ã®ãƒãƒ¼ãƒˆç•ªå·ã€‚ `mew-nntp-user' NNTP ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå。も㗠`nil' ã§ãªã‘れã°ã€èªè¨¼ã®æ‰‹ç¶šããŒå®Ÿè¡Œã• れる。(mew-nntp-auth ã¨ã„ã†å¤‰æ•°ã¯ãªã„ã“ã¨ã«æ³¨æ„。) `mew-nntp-newsgroup' ニュースグループåã®åˆæœŸå€¤ã€‚ `mew-nntp-size' NNTP サーãƒã‹ã‚‰å–å¾—ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¤§ãã•ã®ä¸Šé™ã€‚åˆæœŸå€¤ã¯ 55296 ãƒã‚¤ãƒˆã€‚ 0 ã«è¨­å®šã™ã‚‹ã¨ã€ä¸Šé™ãªã—ã®æ„味ã«ãªã‚Šã€ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹ã€‚ä¸Šé™ ã«å¼•ã£æŽ›ã‹ã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å…¨ä½“ã‚’å–å¾—ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€ *Note retrieving:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `mew-nntp-header-only' NNTP ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹éš›ã«ã€ãƒ˜ãƒƒãƒ€ã®ã¿ã«ã™ã‚‹ã‹ã€æœ¬æ–‡ã‚‚å–å¾—ã™ã‚‹ã‹ã€‚ `nil' ã§ãªã‘れã°ã€ãƒ˜ãƒƒãƒ€ã®ã¿ã‚’å–å¾—ã€‚åˆæœŸå€¤ã¯ `nil'。 `mew-nntp-msgid-user' Message-Id: を作æˆã™ã‚‹ãŸã‚ã®ãƒ¦ãƒ¼ã‚¶å。`nil' ã§ã‚れ㰠`mew-user' ã®å€¤ãŒåˆ©ç”¨ã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ `nil'。Message-Id: ã®æ›¸å¼ã¯ä»¥ä¸‹ã‚’å‚照。 `mew-nntp-msgid-domain' Message-Id: を作æˆã™ã‚‹ãŸã‚ã®ãƒ‰ãƒ¡ã‚¤ãƒ³å。`nil' ã§ã‚れ㰠`mew-mail-domain' ã®å€¤ãŒåˆ©ç”¨ã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ `nil'。Message-Id: ã®æ›¸å¼ã¯ä»¥ä¸‹ã‚’å‚照。 ãªãŠã€NNTP 用㮠Message-Id: ã®å€¤ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ä½œæˆã•れã¾ã™ã€‚ message-id = *random*.nntp-msgid-user@nntp-msgid-domain  File: mew.ja.info, Node: smtp, Next: config, Prev: nntp, Up: Customize SMTP ==== Mew ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹éš›ã« SMTP を利用ã—ã¾ã™ã€‚SMTP サーãƒãŒèª è¨¼ã‚’è¦æ±‚ã—ãŸå ´åˆã€Mew ã¯è‡ªå‹•çš„ã«ãƒ¦ãƒ¼ã‚¶ã«ãƒã‚¹ãƒ¯ãƒ¼ãƒ‰ã®å…¥åŠ›ã‚’æ±‚ã‚ã¾ã™ã€‚ã“ ã“ã§ã¯ã€SMTP を制御ã™ã‚‹ãŸã‚ã®ä»¥ä¸‹ã®å¤‰æ•°ã«ã¤ã„ã¦ã¾ã¨ã‚ã¾ã™ã€‚ `mew-smtp-server' SMTP サーãƒã®åå‰ã€‚ `mew-smtp-port' SMTP ãƒãƒ¼ãƒˆç•ªå·ã€‚ `mew-smtp-ssh-server' SSH 経由ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹éš›ã® SSH サーãƒã®åå‰ã€‚ `mew-smtp-ssl' SMTP over SSL を使ã†ã‹å¦ã‹ã€‚ `mew-smtp-ssl-port' SMTP over SSL ã®ãƒãƒ¼ãƒˆç•ªå·ã€‚ `mew-smtp-user' SMTP AUTH ã§åˆ©ç”¨ã•れるアカウントå。設定ã•れãªã„å ´åˆã¯ã€è‡ªå‹•的㫠メールアドレスã«è¨­å®šã•れる。 `mew-smtp-auth-list' SMTP AUTH ã§åˆ©ç”¨ã™ã‚‹èªè¨¼æ–¹å¼ã®ãƒªã‚¹ãƒˆã€‚優先順ä½ã®é«˜ã„é †ã«ä¸¦ã¹ã‚‹ã€‚ åˆæœŸå€¤ã¯ã€'("CRAM-MD5" "PLAIN" "LOGIN")。 `mew-smtp-helo-domain' SMTP HELO コマンドã§ä½¿ã‚れるサーãƒåã€‚åˆæœŸå€¤ã¯ "localhost"。 `mew-smtp-mail-from' SMTP MAIL FROM ã‚³ãƒžãƒ³ãƒ‰ã§æŒ‡å®šã•れるアドレス。`nil' ã®å ´åˆã¯ã€ From: フィールドã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒæŒ‡å®šã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ `nil'。 `mew-smtp-msgid-user' Message-Id: を作æˆã™ã‚‹ãŸã‚ã®ãƒ¦ãƒ¼ã‚¶å。`nil' ã§ã‚れ㰠`mew-user' ã®å€¤ãŒåˆ©ç”¨ã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ `nil'。Message-Id: ã®æ›¸å¼ã¯ä»¥ä¸‹ã‚’å‚照。 `mew-smtp-msgid-domain' Message-Id: を作æˆã™ã‚‹ãŸã‚ã®ãƒ‰ãƒ¡ã‚¤ãƒ³å。`nil' ã§ã‚れ㰠`mew-mail-domain' ã®å€¤ãŒåˆ©ç”¨ã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ `nil'。Message-Id: ã®æ›¸å¼ã¯ä»¥ä¸‹ã‚’å‚照。 `mew-use-8bit' 8 ビットテキストを符å·åŒ–ã›ãšã«ãã®ã¾ã¾é€ã‚‹ã‹å¦ã‹ã€‚`nil' ã®å ´åˆã¯ã€ é©åˆ‡ãª MIME 符å·åŒ–ãŒæ–½ã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ `nil'。 ãªãŠã€SMTP 用㮠Message-Id: ã®å€¤ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ä½œæˆã•れã¾ã™ã€‚ message-id = *random*.smtp-msgid-user@smtp-msgid-domain Message Submission (ãƒãƒ¼ãƒˆç•ªå·ãŒ 587 ã§ã‚ã‚‹é€ä¿¡ç”¨ã® SMTP)を使ã„ãŸã„å ´ åˆã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 (setq mew-smtp-port "submission") SSL (*Note SSL::)ã‚„ TLS (*Note TLS::) ã®ç« ã‚‚å‚考ã«ã—ã¦ä¸‹ã•ã„。 SMTP サーãƒã®ä¸­ã«ã¯ã€èªè¨¼ãªã—ã€ã¤ã¾ã‚Šãƒ‘スワードをé€ã‚‰ã‚Œã‚‹ã¨ã‚¨ãƒ©ãƒ¼ã¨è¦‹ ãªã™è¨­å®šã§ã‚ã‚‹ã«ã‚‚é–¢ã‚らãšã€èªè¨¼ã‚’è¦æ±‚ã—ã¦ãã‚‹ã‚‚ã®ãŒã‚りã¾ã™ã€‚Mew ã¯ã€ SMTP サーãƒãŒèªè¨¼ã‚’è¦æ±‚ã™ã‚‹ã¨ã€ãƒ¦ãƒ¼ã‚¶ã«ãƒ‘スワードを尋ã­ã¦ã€å…¥åŠ›ã•れ㟠パスワードをサーãƒã¸é€ã‚Šã¾ã™ã€‚上記ã®ã‚ˆã†ãªãŠã‹ã—㪠SMTP サーãƒã«å¯¾å‡¦ã™ ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã€èªè¨¼ã‚’è¦æ±‚ã•れã¦ã‚‚パスワードをé€ã‚‰ãªãã™ã‚Œ ã°ã‚ˆã„ã§ã—ょã†ã€‚ (setq mew-use-smtp-auth nil) `mew-use-smtp-auth' SMTP サーãƒãŒèªè¨¼ã‚’è¦æ±‚ã—ãŸã¨ãã€ãƒ‘スワードをé€ã‚‹ã‹ã©ã†ã‹ã€‚デフォルト㯠`t'。`nil' ã«ã™ã‚‹ã¨ã€SMTP サーãƒãŒèªè¨¼ã‚’è¦æ±‚ã—ã¦ã‚‚無視ã™ã‚‹ã€‚  File: mew.ja.info, Node: config, Next: config2, Prev: smtp, Up: Customize é€å—ä¿¡ã®å‹•作変化 ================ `mew-config-alist' を使ã†ã¨ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€å—ä¿¡ã«é–¢ã™ã‚‹å‹•作ã«å¤‰åŒ–を㤠ã‘られã¾ã™ã€‚以下ã®è¨­å®šä¾‹ã‚’使ã£ã¦èª¬æ˜Žã—ã¾ã™ã€‚ (setq mew-config-alist '((home (inbox-folder "+inbox-home") (pop-server "pop.iij4u.or.jp")) (ext (pop-ssh-server "ssh.example.org")) (default (proto "%") (imap-server "imap.example.org") (pop-server "pop.example.org")))) ã“ã®ä¾‹ã§ã¯ã€"home"ã€"ext"ã€"default" ã¨ã„ㆠ3 ã¤ã®ã‚±ãƒ¼ã‚¹ã‚’定ã‚ã¦ã„ã¾ã™ã€‚ ãれãžã‚Œã®ã‚±ãƒ¼ã‚¹ã«å¯¾ã—ã¦ã€ã„ãã¤ã‹ã®ã‚­ãƒ¼ã¨å€¤ã®å¯¾ãŒè¨­å®šã•れã¦ã„ã¾ã™ã€‚ ã“ã®ä¾‹ã‚’使ã£ã¦ã€`mew-config-alist' ã®æ„味を説明ã—ã¾ã™ã€‚ケースを "home" ã«ã—㦠"pop-server" ã‚’ç´¢ãã¨ã€"pop.iij4u.or.jp" ãŒå¾—られã¾ã™ã€‚ケー スを "ext" ã«ã—㦠"pop-server" ã‚’ç´¢ãã¨ã€"ext" ã«ã¯è©²å½“ã™ã‚‹ã‚­ãƒ¼ãŒãª ã„ã®ã§ã€"default" を見ã¦ã€"pop.example.org" ãŒå¾—られã¾ã™ã€‚ケースを "default" ã«ã—㦠"pop-server" ã‚’ç´¢ãã¨ã€"pop.example.org" ãŒå¾—られã¾ã™ã€‚ ケースを "home" ã«ã—㦠"inbox-folder" ã‚’ç´¢ãã¨ã€"+inbox-home" ãŒå¾—られ ã¾ã™ã€‚ケースを "ext" ã«ã—㦠"inbox-folder" ã‚’ç´¢ãã¨ã€"ext" ã«ã¯è©²å½“㙠るキーãŒãªãã€ã•ら㫠"default" ã«ã‚‚ãªã„ã®ã§ã€`mew-inbox-folder' ã¨ã„ㆠ変数ã®å€¤ãŒå¾—られã¾ã™ã€‚ケースを "default" ã«ã—㦠"inbox-folder" を索ㄠãŸå ´åˆã‚‚ã€`mew-inbox-folder' ã®å€¤ãŒå¾—られã¾ã™ã€‚ "proto" (`mew-proto')ã¯ã€`M-x mew' ã¨å…¥åŠ›ã•れãŸéš›ã«ã€ã©ã®ãƒ•ォルダã«ç§» å‹•ã™ã‚‹ã‹æŒ‡å®šã™ã‚‹ãŸã‚ã«ä½¿ã„ã¾ã™ã€‚(Mew ã‚’èµ·å‹•ã™ã‚‹ãŸã‚ã«`M-x mew' ã¨å…¥åŠ› ã™ã‚‹å ´åˆã€"default" ケース㮠"proto" ãŒåˆ©ç”¨ã•れã¾ã™ã€‚Mew ãŒèµ·å‹•ã—ã¦ã„ ã‚‹éš›ã«ã€`M-x mew' ã¨å…¥åŠ›ã™ã‚‹ã¨ã‚±ãƒ¼ã‚¹ã«å¾“ã£ã¦ã€"proto" ãŒé¸ã°ã‚Œã¾ã™ã€‚) 値ã®å€™è£œã¯ã€"+"ã€"$"ã€"%"ã€"-" ã§ã™ã€‚ã“ã‚Œã‚‰ã¯æ¨™æº–ã§ã¯ã€"+inbox"〠"$inbox"ã€"%inbox"ã€"-fj.mail.reader.mew" ã‚’æ„味ã—ã¾ã™ã€‚ `mew-config-alist' ã§è¨­å®šã§ãるキーã¯ã€`mew-"キー"' ã¨ã„ã†å¤‰æ•°ã«å¯¾å¿œã— ã¦ã„ã¾ã™ã€‚以下ã«è¨­å®šã§ãる項目を列挙ã—ã¾ã™ã€‚ name, user, mail-domain, cc, fcc, dcc, reply-to, organization, header-alist, proto, smtp-server, smtp-port, smtp-ssh-server, smtp-ssl, smtp-ssl-port, smtp-user, smtp-auth-list, smtp-msgid-user, smtp-msgid-domain, smtp-helo-domain, smtp-mail-from, pop-server, pop-port, pop-ssh-server, pop-ssl, pop-ssl-port, pop-user, pop-auth, pop-auth-list, pop-size, pop-header-only, pop-delete, pop-body-lines, pop-proxy-server, pop-proxy-port, imap-server, imap-port, imap-ssh-server, imap-ssl, imap-ssl-port, imap-user, imap-auth, imap-auth-list, imap-size, imap-header-only, imap-delete, imap-trash-folder, imap-queue-folder, imap-spam-field, imap-spam-word, imap-proxy-server, imap-proxy-port, nntp-server, nntp-port, nntp-ssh-server, nntp-ssl, nntp-ssl-port, nntp-user, nntp-size, nntp-header-only, nntp-msgid-user, nntp-msgid-domain, ssl-cert-directory, ssl-verify-level, inbox-folder, queue-folder, postq-folder, mailbox-type, mbox-command, mbox-command-arg, signature-file, content-type, refile-guess-alist, spam-prog, spam-prog-args, ham-prog, ham-prog-args, use-old-pgp, pgp-signer, smime-signer, privacy-method, protect-privacy-always, protect-privacy-always-type, protect-privacy-encrypted, protect-privacy-encrypted-type, protect-privacy-with-old-pgp-signature, use-format-flowed nameã€userã€mail-domain ã¯ä»¥ä¸‹ã®è¦å‰‡ã«ã—ãŸãŒã£ã¦ã€From: ã®å€¤ã«ãªã‚Šã¾ã™ã€‚ from = name 自分㧠`mew-from-list' を設定ã—ã¦ã„ãªã„å ´åˆã¯ã€ä¸Šè¨˜ã®ãƒ«ãƒ¼ãƒ«ã«å¾“ã„å„ ã‚±ãƒ¼ã‚¹ã® from を集ã‚ã¦ã€`mew-from-list' ãŒè‡ªå‹•çš„ã«è¨­å®šã•れã¾ã™ã€‚ *Note cheader:: ã‚’å‚ç…§ã®ã“ã¨ã€‚ `mew-config-alist' ã«è¨­å®šã—ãŸã‚±ãƒ¼ã‚¹åã‚’ã‚±ãƒ¼ã‚¹ã«æŒ‡å®šã§ãã¾ã™ã€‚Mewã®èµ·å‹• 時ã®ã‚±ãƒ¼ã‚¹ã¯ã€"default" ã«ãªã£ã¦ã„ã¾ã™ã€‚ Summary モードã«ãŠã„ã¦ã€ã‚±ãƒ¼ã‚¹ã‚’変更ã™ã‚‹ã«ã¯ `C' を利用ã—ã¾ã™ã€‚ケース ã«ã¯ã€`TAB' ã§è£œå®Œã€`C-cTAB' ã§å¾ªç’°çš„ãªè£œå®ŒãŒåйãã¾ã™ã€‚ ケース㌠"default" 以外ã®å€¤ã‚’ã¨ã£ãŸå ´åˆã¯ã€Summary モードã®ãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ ンã«è¡¨ç¤ºã•れã¾ã™ã€‚以下ã¯ã‚±ãƒ¼ã‚¹ãŒ "home" ã¨ãªã£ã¦ã„ã‚‹å ´åˆã®ä¾‹ã§ã™ã€‚ (Summary home) Draft モードã§ã¯ã€ã‚±ãƒ¼ã‚¹ãŒ "default" ã§ãªã„å ´åˆã€ãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ã«ãã®å€¤ ãŒè¡¨ç¤ºã•れã¾ã™ã€‚以下ã¯ã€ã‚±ãƒ¼ã‚¹ãŒ "home" ã§ã‚ã‚‹å ´åˆã®ä¾‹ã§ã™ã€‚ (Draft home) Draft モードã«ãŠã„ã¦ã€ãã®è‰ç¨¿ã®ã‚±ãƒ¼ã‚¹ã‚’変更ã™ã‚‹ã«ã¯ã€`C-cC-o' を用ㄠã¾ã™ã€‚mail-domain キーや header-alist キーã«å¯¾å¿œã™ã‚‹å€¤ã«å¿œã˜ã¦ã€ãƒ˜ãƒƒãƒ€ ãŒå‹•çš„ã«å¤‰æ›´ã•れã¾ã™ã€‚ãªãŠã€ã“ã®ã‚±ãƒ¼ã‚¹ã¯ã€ãã® Draft モードã«å›ºæœ‰ã«ãª りã¾ã™ã€‚ Draft モードã§ã¯ã€ã‚±ãƒ¼ã‚¹ã‚’自動的ã«è¨­å®šã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ `mew-case-guess-when-prepared' ã“ã®å¤‰æ•°ãŒ `t' ã®å ´åˆã€è‰ç¨¿ãŒç”¨æ„ã•れãŸã¨ãã«ã€ `mew-case-guess-alist' ã«å¾“ã£ã¦ã‚±ãƒ¼ã‚¹ãŒè¨­å®šã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ `t'。 `mew-case-guess-when-composed' ã“ã®å¤‰æ•°ãŒ `t' ã®å ´åˆã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½œæˆã•れãŸã¨ãã«ã€ `mew-case-guess-alist' ã«å¾“ã£ã¦ã‚±ãƒ¼ã‚¹ãŒè¨­å®šã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ `nil' `mew-case-guess-when-replied' ã“ã®å¤‰æ•°ãŒ `t' ã®å ´åˆã€è¿”ç­”ã«ã‚ˆã£ã¦è‰ç¨¿ãŒç”¨æ„ã•れãŸã¨ãã«ã€ `mew-case-guess-when-replied-alist' ã«å¾“ã£ã¦ã‚±ãƒ¼ã‚¹ãŒè¨­å®šã•れる。 åˆæœŸå€¤ã¯ `t'。 `mew-case-guess-alist' 㨠`mew-case-guess-when-replied-alist' ã®æ›¸å¼ã¯ã€`mew-refile-guess-alist' ã¨åŒã˜ã§ã™ã€‚詳ã—ãã¯ã€ *Note by-alist:: ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 Draft モードã§è‰ç¨¿ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã« `C-cC-c' を使ã†ã¨ã€Draft モードã®ã‚±ãƒ¼ ス㌠SMTP/NNTP サーãƒãªã©ã‚’決定ã™ã‚‹ãŸã‚ã«åˆ©ç”¨ã•れã¾ã™ã€‚Summary モード ã§ +queue/+postq ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚Šå‡ºã™ãŸã‚ã« `C-cC-c' を利用ã™ã‚‹ã¨ã€ Summary モードã®ã‚±ãƒ¼ã‚¹ãŒåˆ©ç”¨ã•れã¾ã™ã€‚ãŸã¨ãˆã€ãã®ã‚±ãƒ¼ã‚¹ãŒ Draftモード ã§æŒ‡å®šã•れã¦ã„ãŸã‚±ãƒ¼ã‚¹ã¨é•ã£ã¦ã‚‚ã§ã™ã€‚Summary モードã§`C-uC-cC-c' を使 ã†ã¨ã€+queue/+postq ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚Šå‡ºã™ãŸã‚ã®ã‚±ãƒ¼ã‚¹ãŒæŒ‡å®šã§ãã¾ã™ã€‚ 以下ã«ã‚±ãƒ¼ã‚¹ã«é–¢ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ `C' Summary モードã«ãŠã„ã¦ã€ã‚±ãƒ¼ã‚¹ã‚’設定ã™ã‚‹ã€‚ `C-cC-o' Draft モードã«ãŠã„ã¦ã€ãã®è‰ç¨¿ã®ã‚±ãƒ¼ã‚¹ã‚’設定ã™ã‚‹ã€‚  File: mew.ja.info, Node: config2, Next: custom-misc, Prev: config, Up: Customize è¨­å®šã®æ›¸å¼ ========== Mew 6.1 ã‹ã‚‰ ".mew.el" ã®è¨­å®šæ–¹æ³•ãŒæ”¹å–„ã•れã¾ã—ãŸã€‚å¤ã„書å¼ã‚‚有効ã§ã™ ãŒã€ã‚ˆã‚Šç°¡å˜ãªæ–°ã—ã„æ›¸å¼ã‚‚利用ã§ãã¾ã™ã€‚ - å¤ã„書å¼ã§ã¯ãƒªã‚¹ãƒˆã®ä¸­ã« "." ãŒç¾ã‚Œã‚‹å ´åˆãŒã‚りã¾ã—ãŸã€‚æ–°ã—ã„æ›¸å¼ ã§ã¯ã€"." ã¯ã¾ã£ãŸã使ã‚れã¾ã›ã‚“。ãŸã¨ãˆã°ã€("foo" . "bar") ã¨æ›¸ ã„ã¦ã„ãŸã¨ã“ã‚ã¯ã€("foo" "bar") ã¨æ›¸ã‘ã¾ã™ã€‚ - å¤ã„書å¼ã§ã¯ã€ãƒãƒ¼ãƒˆç•ªå·ã¯æ–‡å­—åˆ—ã§æ›¸ã„ã¦ã„ã¾ã—ãŸã€‚ãŸã¨ãˆã°ã€"25" ã§ã™ã€‚æ–°ã—ã„æ›¸å¼ã§ã¯ã€æ•°å€¤ã§æ›¸ã„ã¦ã‚‚よããªã‚Šã¾ã—ãŸã€‚ãŸã¨ãˆã°ã€25 ã§ã™ã€‚文字列も有効ã§ã™ã€‚ãŸã¨ãˆã°ã€"smtp" ã§ã™ã€‚ - å¤ã„書å¼ã§ã¯ã€`mew-config-alist' ã®ã‚±ãƒ¼ã‚¹ã‚„ã‚­ãƒ¼ã‚’æ–‡å­—åˆ—ã§æ›¸ã„ã¦ã„ ã¾ã—ãŸã€‚æ–°ã—ã„æ›¸å¼ã§ã¯ã€ã‚·ãƒ³ãƒœãƒ«ã§æ›¸ã‘ã¾ã™ã€‚ 以下㫠mew-config-alist ã‚’æ–°ã—ã„æ›¸å¼ã§æ›¸ã„ãŸä¾‹ã‚’示ã—ã¾ã™ã€‚ (setq mew-config-alist '((home (imap-server "imap.example.org") (imap-ssl t) (imap-ssl-port 993) (smtp-server "smtp.example.org") (smtp-port "submission")))) 以下ã®å¤ã„書å¼ã¨è¦‹æ¯”ã¹ã¦ä¸‹ã•ã„。 (setq mew-config-alist '(("home" ("imap-server" . "imap.example.org") ("imap-ssl" . t) ("imap-ssl-port" . "993") ("smtp-server" . "smtp.example.org") ("smtp-port" . "submission")))) 繰り返ã—ã¾ã™ãŒã€Mew 6.1 ã§ã¯å¤ã„書å¼ã‚‚有効ã§ã™ã€‚å¤ã„書å¼ã¨æ–°ã—ã„æ›¸å¼ã‚’ æ··ãœã¦æ›¸ã„ã¦ã‚‚æ§‹ã„ã¾ã›ã‚“。  File: mew.ja.info, Node: custom-misc, Next: Tips, Prev: config2, Up: Customize ãã®ä»– ====== 環境ã«ã‚ˆã£ã¦ã¯ã€æ·»ä»˜ãƒ•ァイルをセーブã™ã‚‹éš›ã«ã€ãƒ•ァイルåã‚’ SAMBA å½¢å¼ã« ã™ã‚‹ã¨ä¾¿åˆ©ãªã“ã¨ãŒã‚りã¾ã™ã€‚ã“ã®å ´åˆã€`mew-use-samba-encoding' ã‚’ `t' ã«ã—ã¦ä¸‹ã•ã„。ファイルåã¨ã—ã¦ã€ã©ã®æ–‡å­—コードを利用ã™ã‚‹ã‹ã¯ã€ `mew-cs-samba' ã§æŒ‡å®šã§ãã¾ã™ã€‚åˆæœŸå€¤ã¯ `shift_jis' ã§ã™ã€‚ Summary モード㧠`#' ã¨æŠ¼ã™ã¨ã€ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å°åˆ·ã§ãã¾ã™ã€‚å°åˆ·ã« 利用ã™ã‚‹é–¢æ•°ã¯ `mew-print-function' ã§å®šç¾©ã—ã¾ã™ã€‚åˆæœŸå€¤ã¯ã€ `ps-print-buffer' ã§ã™ã‹ã‚‰ã€PostScript ã«å¤‰æ›ã•れã¦å°åˆ·ã•れã¾ã™ã€‚自分 ã®ä½œæˆã—ãŸé–¢æ•°ã‚’利用ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¾ã™ã€‚ (setq mew-print-function 'my-print-function) ヘッダ中ã®ã©ã®ãƒ•ィールドをå°åˆ·ã™ã‚‹ã‹ã¯ã€`mew-field-for-printing'ã§æŒ‡å®š ã§ãã¾ã™ã€‚åˆæœŸå€¤ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ '("Subject:" "From:" "To:" "Cc:" "Date:") ãŸã¨ãˆã°ã€Subject:ã€From:ã€Date: ã®ã¿ã‚’å°åˆ·ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®š ã—ã¾ã—ょã†ã€‚ (setq mew-field-for-printing '("Subject:" "From:" "Date:"))  File: mew.ja.info, Node: Tips, Next: region, Prev: custom-misc, Up: Top ã•らãªã‚‹ä¸€æ­© ************ * Menu: * region:: リージョン * visiting:: 移動 * SSH:: Secure SHell * SSL:: Secure Socket Layer * TLS:: Transport Layer Security * spam:: スパム * spam2:: スパム(2) * addr-warn:: アドレスã®è­¦å‘Š * biff:: Biff * edit:: Edit モード  File: mew.ja.info, Node: region, Next: visiting, Prev: Tips, Up: Tips リージョン ========== Summary モードã«ã¯ã€`C-u' 付ãã§å‘¼ã³å‡ºã™ã¨ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ä½œç”¨ã™ã‚‹ã‚³ãƒžãƒ³ ドãŒã‚りã¾ã™ã€‚ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ãƒ“ジブルãªãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒæŒ‡å®šã•れã¦ã„ã‚‹ å ´åˆã¯ã€`C-u' ãªã—ã§ã‚‚ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ä½œç”¨ã—ã¾ã™ã€‚ Emacs ã§ã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’ "~/.emacs" ã«å…¥ã‚Œã‚‹ã¨ã€ãƒ“ジブルãªãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒ 利用ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ (transient-mark-mode 1) 以下ã«ã€è©²å½“ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’列挙ã—ã¦ãŠãã¾ã™ã€‚ `?', `/', `tt', `x', `lx', `ma', `Md', `S', `mlc', `mli', `*', `$', `d', `u' `*', `$', `d', `u' ã¯ã€ç›´å‰ã«æ•°å­—を入力ã™ã‚‹ã“ã¨ã§ã€ç¹°ã‚Šè¿”ã—ã®å›žæ•°ã‚’指 定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ãŸã¨ãˆã°ã€`3*' 㯠3 ã¤ã®ãƒ¡ãƒ¼ãƒ«ã« `*' マークを付 ã‘ã¾ã™ã€‚æ•°å­—ã®å‰ã« `C-u' ã¯ä¸è¦ã§ã™ã€‚  File: mew.ja.info, Node: visiting, Next: SSH, Prev: region, Up: Tips 移動 ==== Draft モードã«ãŠã„ã¦ã€`C-cC-m' ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã—é€ä¿¡ã‚­ãƒ¥ãƒ¼ã«å…¥ れãŸå¾Œã€+queue ã«ç§»å‹•ã—ãŸã„å ´åˆã¯ã€ `mew-visit-queue-after-sending' ã‚’ `t' ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 Summary モードã«ãŠã„ã¦ã€`C' ã§ã‚±ãƒ¼ã‚¹ã‚’設定ã—ãŸå¾Œã«ã€å„ inbox ã«ç§»å‹•ã— ãŸã„å ´åˆã¯ã€`mew-visit-inbox-after-setting-case' ã‚’ `t'ã«è¨­å®šã—ã¾ã—ょ ã†ã€‚ Summary モードã‹ã‚‰ã€ä¸€ç•ªæ•°å­—ã®å°ã•ã„è‰ç¨¿(Draft モード)ã«ç§»å‹•ã™ã‚‹ã«ã¯ã€ `C-cC-o' ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚  File: mew.ja.info, Node: SSH, Next: SSL, Prev: visiting, Up: Tips Secure SHell ============ Mew 㯠SSH ã¨ã—ã¦ã€SSH ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1ã€2 ãŠã‚ˆã³ OpenSSH をサãƒãƒ¼ãƒˆã—ã¦ã„ ã¾ã™ã€‚Mew ã‹ã‚‰ SSH を利用ã™ã‚‹å‰ã«ã€å¿…ãšã‚³ãƒžãƒ³ãƒ‰ãƒ»ãƒ©ã‚¤ãƒ³ã§ "ssh" を実行 ã—ã€SSH サーãƒã®å…¬é–‹éµã‚’å–å¾—ã—ã¦ä¸‹ã•ã„。ã™ãªã‚ã¡ã€ãƒ¦ãƒ¼ã‚¶ã®ãƒ‘スワードã‹ã€ ローカルã®ãƒžã‚·ãƒ³ã®ç§˜å¯†éµã‚’復å·åŒ–ã™ã‚‹ãŸã‚ã®ãƒ‘スワードを入力ã™ã‚Œã°ã€ã‚µãƒ¼ ãƒã«ãƒ­ã‚°ã‚¤ãƒ³ã§ãる状態ã«ã—ã¦ä¸‹ã•ã„。ãªãŠã€"ssh-agent" を利用ã™ã‚Œã°ã€ç§˜ 密éµã‚’復å·åŒ–ã™ã‚‹ãŸã‚ã®ãƒ‘スワードã®å…¥åŠ›ã‚’çœç•¥ã§ãã¾ã™ã€‚ 後ã¯ã€å„プロトコル㮠SSH ã«é–¢ã™ã‚‹å¤‰æ•°ã‚’設定ã—ã¦ä¸‹ã•ã„。ãŸã¨ãˆã°ã€POP over SSH を利用ã™ã‚‹å ´åˆã¯ã€`mew-pop-ssh-server' ã« SSH サーãƒã®åå‰ã‚’ 設定ã—ã¾ã—ょã†ã€‚ SSH ã§é€šä¿¡ãŒä¿è­·ã•れã¦ã„ã‚‹å ´åˆã€ãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ã«éŒ å‰ã®çµµãŒè¡¨ç¤ºã•れã¾ã™ã€‚ Mew ã®å®Ÿè£…ã§ã¯ã€SSH 㨠SSL/TLS ã‚’åŒæ™‚ã«ã¯ä½¿ãˆã¾ã›ã‚“。SSH トンãƒãƒ«ã®ä¸­ ã§SSL/TLS を使ã†å¿…è¦ãŒã‚ã‚‹å ´åˆã€Mew ã§ã¯ SSL/TLS ã ã‘を設定ã—ã€SSH ト ンãƒãƒ«ã¯ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‹ã‚‰å¼µã‚‹ã‚ˆã†ã«ã—ã¦ä¸‹ã•ã„。  File: mew.ja.info, Node: SSL, Next: TLS, Prev: SSH, Up: Tips Secure Socket Layer =================== SSL を使ã†ã«ã¯ã€èªè¨¼å±€æ–¹å¼ã®ä¿¡ç”¨ãƒ¢ãƒ‡ãƒ«ã‚’ç†è§£ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ç¾ åœ¨ã€Mew 㯠SSL ã®ãŸã‚ã« "stunnel" ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 3 ã¨ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 4 をサãƒãƒ¼ トã—ã¦ã„ã¾ã™ã€‚ Mew ã§åˆ©ç”¨ã™ã‚‹å‰ã«ã€SSL サーãƒã«å¯¾ã—㦠"stunnel" ã§ SSL ã®ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ ãŒå¼µã‚Œã‚‹ã‹ç¢ºã‹ã‚ã¦ä¸‹ã•ã„。"stunnel" ã¯ã€"openssl" ã®ãƒ©ã‚¤ãƒ–ラリをリンク ã—ã¦ã„ã‚‹ã®ã§ã€"openssl" ã®çŸ¥è­˜ãŒå¿…è¦ã§ã™ã€‚ 信用ã™ã‚‹è¨¼æ˜Žæ›¸ã‚’ä¿å­˜ã—ã¦ãŠãディレクトリを "~/.certs" ã ã¨ã—ã¾ã—ょã†ã€‚ ã“ã“ã« "openssl" ã® "certs" ディレクトリã«ä»˜ã„ã¦ãã‚‹ PEM å½¢å¼ã®è¨¼æ˜Žæ›¸ ã‚’"<ãƒãƒƒã‚·ãƒ¥>.0" ã¨ã„ã†åå‰ã§ã‚³ãƒ”ーã—ã¾ã™ã€‚ ã“ã“ã§ã¯ã€PEM å½¢å¼ã®è¨¼æ˜Žæ›¸ã®ãƒ•ァイルåã‚’ "ca.pem" ã ã¨ã—ã¾ã—ょã†ã€‚「< ãƒãƒƒã‚·ãƒ¥>ã€ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«è¨ˆç®—ã§ãã¾ã™ã€‚ % openssl x509 -hash -noout -in ca.pem "~/.certs/" ã¸ã‚³ãƒ”ーã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ % cp ca.pem ~/.certs/`openssl x509 -hash -noout -in ca.pem`.0 "openssl" ã«ä»˜ã„ã¦ãる証明書ã¯ã€ä¸–ã®ä¸­ã§ä½¿ã‚れã¦ã„ã‚‹ CA ã™ã¹ã¦ã‚’網羅㧠ãã¦ã„ã¾ã›ã‚“。ã‚ãªãŸãŒåˆ©ç”¨ã™ã‚‹ã‚µãƒ¼ãƒã®è¨¼æ˜Žæ›¸ãŒã€ä»–ã® CA ã‹ã‚‰ç™ºè¡Œã•れ㟠場åˆã€ãã® CA ã®è¨¼æ˜Žæ›¸ã‚’åŒæ§˜ã«ã‚³ãƒ”ーã—ã¦ãŠãå¿…è¦ãŒã‚りã¾ã™ã€‚以下ã®ãƒšãƒ¼ ジ㫠CA ã®è¨¼æ˜Žæ›¸ãŒãŸãã•ã‚“ç½®ã„ã¦ã‚りã¾ã™ã€‚ http://www.columbia.edu/~ariel/good-certs/ns45/ Mew ã§ "stunnel" を制御ã™ã‚‹é‡è¦ãªå¤‰æ•°ã¯ 2 ã¤ã§ã™ã€‚ `mew-ssl-cert-directory' ã¯ã€ä¿¡ç”¨ã™ã‚‹ CA ã®è¨¼æ˜Žæ›¸ã‚’ç½®ã„ã¦ãŠãディレク トリã§ã‚りã€åˆæœŸå€¤ã¯ "~/.certs" ã§ã™ã€‚ã¾ãŸã€`mew-ssl-verify-level' ã§ã€ 証明書を検証ã™ã‚‹ãƒ¬ãƒ™ãƒ«ã‚’指定ã§ãã¾ã™ã€‚レベルã®åˆæœŸå€¤ã¯ 1 ã§ã™ã€‚ã“ã®æ„ 味ã¯ã€ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ 0 検証ã—ãªã„ 1 サーãƒã®è¨¼æ˜Žæ›¸ãŒã‚ã‚Œã°æ¤œè¨¼ã™ã‚‹ã€‚æ¤œè¨¼çµæžœãŒå¤±æ•—ãªã‚‰ã€SSL/TSL コムクションã¯ä½œã‚‰ã‚Œãªã„。証明書ãŒãªã‘れã°ã€SSL/TLS コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’作 æˆã™ã‚‹ã€‚ 2 サーãƒã®è¨¼æ˜Žæ›¸ã‚’検証ã™ã‚‹ã€‚æ¤œè¨¼çµæžœãŒå¤±æ•—ãªã‚‰ã€SSL/TSL コãƒã‚¯ã‚·ãƒ§ ンã¯ä½œã‚‰ã‚Œãªã„。証明書ãŒãªã‘れã°ã€SSL/TLS コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’作æˆã—㪠ã„。 3 サーãƒãŒé€ã£ã¦ããŸã‚‚ã®ã§ã¯ãªãã€ãƒ­ãƒ¼ã‚«ãƒ«ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„ã‚‹ è¨¼æ˜Žæ›¸ã§æ¤œè¨¼ã™ã‚‹ã€‚ 後ã¯å„プロトコル㮠SSL ã«é–¢ã™ã‚‹å¤‰æ•°ã‚’設定ã—ã¦ä¸‹ã—ã•ã„。ãŸã¨ãˆã°ã€POP over SSL を利用ã™ã‚‹ã«ã¯ã€`mew-pop-ssl' ã‚’ `t' ã«ã—ã¾ã™ã€‚ã¾ãŸã€ãƒãƒ¼ãƒˆç•ª å·ãŒæ¨™æº–ã¨ç•°ãªã‚‹å ´åˆã«ã¯ã€`mew-pop-ssl-port' を設定ã—ã¦ä¸‹ã•ã„。 (setq mew-pop-ssl t) SMTP ã§ SSL を利用ã™ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ (setq mew-smtp-ssl t) SSL ã§é€šä¿¡ãŒä¿è­·ã•れã¦ã„ã‚‹å ´åˆã€ãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ã«éŒ å‰ã®çµµãŒè¡¨ç¤ºã•れã¾ã™ã€‚  File: mew.ja.info, Node: TLS, Next: spam, Prev: SSL, Up: Tips Transport Layer Security ======================== Mew ã§ã¯ SSL ã®ä»£ã‚Šã« TLS を利用ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚TLS ã®å®Ÿç¾ã¯ã€SSL ã¨åŒæ§˜ "stunnel" ã«é ¼ã£ã¦ã„ã¾ã™ã€‚ã§ã™ã®ã§ã€TLS を利用ã™ã‚‹éš›ã«ã¯ã€ *Note SSL:: ã®èª¬æ˜Žã«å¾“ã£ã¦è¨­å®šã—ã¦ä¸‹ã•ã„。 次ã«ã€SSL ã®ãƒãƒ¼ãƒˆç•ªå·ã‚’守りãŸã„プロトコルã¨åŒã˜ãƒãƒ¼ãƒˆç•ªå·ã«è¨­å®šã—ã¾ã™ã€‚ ãŸã¨ãˆã°ã€POP ã§ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ ;; mew-pop-port is default to "pop3" (110) (setq mew-pop-ssl t) (setq mew-pop-ssl-port mew-pop-port) ;; The default is "pop3s" (995) ã™ãªã‚ã¡ã€SSL ã®ãƒãƒ¼ãƒˆç•ªå·ã¨ä¿è­·ã—ãŸã„プロトコルã®ãƒãƒ¼ãƒˆãŒåŒã˜ã§ã‚れ㰠TLSã€ç•°ãªã‚Œã° SSL ãŒåˆ©ç”¨ã•れã¾ã™ã€‚ 以下ã¯ã€Message Submission ã‚’ TLS ã§å®ˆã‚‹ãŸã‚ã®è¨­å®šä¾‹ã§ã™ã€‚ (setq mew-smtp-port "submission") ;; The default is "smtp" (25) (setq mew-smtp-ssl t) (setq mew-smtp-ssl-port mew-smtp-port) ;; The default is 465  File: mew.ja.info, Node: spam, Next: spam2, Prev: TLS, Up: Tips スパム ====== (1) スパムã®ãƒ•ィルタ㌠POP サーãƒã‚„ IMAP サーãƒå´ã§å‹•ã„ã¦ã„ã‚‹å ´åˆï¼š POP ã§ +inbox ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã—ãŸã‚Šã€$inbox ã‚„ %inbox ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ ã®ä¸€è¦§ã‚’å–ã£ãŸã‚Šã™ã‚‹å ´åˆã«ã€ã‚¹ãƒ‘ムã«è‡ªå‹•的㫠`D' マークを付ã‘ã‚‹ã“ã¨ãŒ ã§ãã¾ã™ã€‚ Bogofilter を利用ã—ã¦ã„ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’ "~/.mew.el" ã«å…¥ã‚Œã¦ä¸‹ã• ã„。 (defun mew-spam-bogofilter (val) (let ((case-fold-search t)) (if (string-match "yes" val) ?D))) (setq mew-inbox-action-alist '(("X-Bogosity:" mew-spam-bogofilter))) `D' マークを付ã‘る代ã‚りã«ã€+spam フォルダã¸ãƒªãƒ•ァイルã™ã‚‹ã‚ˆã†ã« `o' マークを付ã‘るよã†ã«ã™ã‚‹ã«ã¯ã€é–¢æ•°ã‚’以下ã®ã‚ˆã†ã«è¨˜è¿°ã—ã¾ã™ã€‚ (defun mew-spam-bogofilter (val) (let ((case-fold-search t)) (if (string-match "yes" val) "+spam"))) Spamassassin ã®å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’ "~/.mew.el" ã«å…¥ã‚Œã¦ä¸‹ã•ã„。 (setq mew-spam: "X-Spam-Flag:") (defun mew-spam-assassin (val) (let ((case-fold-search t)) (if (string-match "yes" val) ?D))) (setq mew-inbox-action-alist '(("X-Spam-Flag:" mew-spam-assassin))) bsfilter を使ã†å ´åˆã¯ã€bsfilter ã«å«ã¾ã‚Œã¦ã„るマニュアルをå‚ç…§ã—ã¦ä¸‹ã• ã„。 (2) スパムã®ãƒ•ィルタ㌠IMAP サーãƒå´ã§å‹•ã„ã¦ã„ã‚‹å ´åˆï¼š %inbox ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸€è¦§ã‚’å–ã‚‹éš›ã«ã€IMAP サーãƒã®ä¸­ã§ã‚¹ãƒ‘ムを消去ã€ã¾ ãŸã¯ã€ä»–ã®ãƒ•ォルダã¸ç§»å‹•ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚Bogofilter を利用ã—ã¦ã„ ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ãªè¨­å®šã‚’ "~/.mew.el" ã«åŠ ãˆã¦ä¸‹ã•ã„。 (setq mew-imap-spam-field "X-Bogosity") (setq mew-imap-spam-word "Yes") `mew-imap-spam-folder' ã‚ã‚‹ã„㯠`mew-imap-trash-folder' ãŒå®šç¾©ã•れã¦ã„ れã°ã€ãã®ãƒ•ォルダã¸ã‚¹ãƒ‘ムãŒç§»å‹•ã—ã¾ã™ã€‚ãã†ã§ãªã‘れã°ã€ã‚¹ãƒ‘ãƒ ã¯æ¶ˆåŽ»ã• ã‚Œã¾ã™ã€‚ (3) ローカル㧠bogofilter ã‚’å‹•ã‹ã—ã¦ã€ä¸€æ‹¬ã—㦠`*' マークを付ã‘る方法 ã‚‚ã‚りã¾ã™ã€‚ã¾ãšã€ä»¥ä¸‹ã®ã‚¹ã‚¯ãƒªãƒ—トをインストールã—ã¦ä¸‹ã•ã„。 #!/bin/sh bogofilter -v -T -B $* | grep S ã“ã®ã‚¹ã‚¯ãƒªãƒ—トåã‚’ "bogo" ã ã¨ã—ã¾ã—ょã†ã€‚Summary モード㧠`?' を実行 ã—ã€`RET' を入力ã—ã€ã‚³ãƒžãƒ³ãƒ‰åã« "bogo" を指定ã™ã‚Œã°ã€ã‚¹ãƒ‘ムã«`*' マー クãŒä»˜ãã¾ã™ã€‚ã‚ã¨ã¯ã€`md' + `x' ãªã©ã§å‡¦ç†ã™ã‚‹ã¨ã„ã„ã§ã—ょã†ã€‚ (4) POP サーãƒã‚’利用ã—ã¦ãŠã‚Šã€ã‚µãƒ¼ãƒå´ã§ã¯ã‚¹ãƒ‘ムã®ãƒ•ィルタを動ã‹ã›ãªã„ ãŒã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å–得時ã«ãƒžãƒ¼ã‚¯ã‚’付ã‘ãŸã„å ´åˆï¼š bsfilter ã¯ã€POP ã®ä»£ç†ã‚µãƒ¼ãƒã¨ãªã‚‹æ©Ÿèƒ½ãŒã‚ã‚‹ã®ã§ã€ã“れを実ç¾ã§ãã¾ã™ã€‚ 詳ã—ã㯠bsfilter ã«å«ã¾ã‚Œã¦ã„るマニュアルをå‚ç…§ã—ã¦ä¸‹ã•ã„。  File: mew.ja.info, Node: spam2, Next: addr-warn, Prev: spam, Up: Tips スパム(2) ========= Summary モードã§èª­ã‚“ã§ã„ã‚‹ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã€ãƒ•ィルターã«ã‚¹ãƒ‘ムã¨ã—㦠学習ã•ã›ã‚‹ã«ã¯ `ls' を使ã„ã¾ã™ã€‚åŒæ§˜ã«ã€ãƒãƒ (スパムã§ãªã„メッセージ)㨠ã—ã¦å­¦ç¿’ã•ã›ã‚‹ã«ã¯ `lh' を利用ã—ã¦ä¸‹ã•ã„。 両者ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’使用ã™ã‚‹ãŸã‚ã«ã¯ã€4 ã¤ã®å¤‰æ•°ã‚’設定ã—ã¦ãŠãå¿…è¦ãŒã‚り㾠ã™ã€‚ã“ã“ã§ã¯ bogofilter を例題ã«ã¨ã‚Šã€3 ã¤ã®å ´åˆã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ (1) ローカルã®ãƒ•ィルターã«å­¦ç¿’ã•ã›ã‚‹å ´åˆï¼š (setq mew-spam-prog "bogofilter") (setq mew-spam-prog-args '("-s" "-N" "-v")) (setq mew-ham-prog "bogofilter") (setq mew-ham-prog-args '("-n" "-S" "-v"))) (2) サーãƒ()å´ã®ãƒ•ィルター㫠SSH 経由ã§å­¦ç¿’ã•ã›ã‚‹å ´åˆï¼š (setq mew-spam-prog "ssh") (setq mew-spam-prog-args '("" "bogofilter" "-s" "-N" "-v")) (setq mew-ham-prog "ssh") (setq mew-ham-prog-args '("" "bogofilter" "-n" "-S" "-v"))) (3) ファイアウォール()ã®å…ˆã®ã‚µãƒ¼ãƒ()ã®ãƒ•ィルターã«å¤š 段㮠SSH 経由ã§å­¦ç¿’ã•ã›ã‚‹å ´åˆï¼š (setq mew-spam-prog "ssh") (setq mew-spam-prog-args '("-A" "" "ssh" "" "bogofilter" "-s" "-N" "-v")) (setq mew-ham-prog "ssh") (setq mew-ham-prog-args '("-A" "" "ssh" "" "bogofilter" "-n" "-S" "-v"))) ãªãŠ SSH を利用ã™ã‚‹å ´åˆã€é–¢é€£ã™ã‚‹ãƒ›ã‚¹ãƒˆã«ã¯ã€ãƒ‘スワードãªã—ã§ãƒ­ã‚°ã‚¤ãƒ³ ã§ãるよã†ã«è¨­å®šã—ã¦ãŠãå¿…è¦ãŒã‚りã¾ã™ã€‚  File: mew.ja.info, Node: addr-warn, Next: biff, Prev: spam2, Up: Tips アドレスã®è­¦å‘Š ============== 社内ã§é–‰ã˜ã‚‹ã¹ãメッセージã®å®›å…ˆã«ã€ã†ã£ã‹ã‚Šç¤¾å¤–ã®äººã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’書ã„㦠ã—ã¾ã†ã“ã¨ãŒã‚りã¾ã™ã€‚Mew ã§ã¯ã€ãŸã¨ãˆã°ç¤¾å†…ã®ãƒ‰ãƒ¡ã‚¤ãƒ³åを列挙ã—ã¦ãŠã ã¨ã€ç¤¾å¤–ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’赤色ã«ã—ã¦è­¦å‘Šã—ã¦ãれã¾ã™ã€‚ ã©ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’警告ã™ã‚‹ã®ã‹ã‚’決定ã™ã‚‹å¤‰æ•°ã¯ 4 ã¤ã‚りã€ã™ã¹ã¦æ–‡å­—列ã®ãƒª ストã«ãªã‚Šã¾ã™ã€‚Mew ã¯ä»¥ä¸‹ã®ãƒ«ãƒ¼ãƒ«ã«å¾“ã£ã¦ã€è­¦å‘Šã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’決ã‚ã¾ã™ã€‚ 1. アドレス㌠`mew-safe-addresses' ã§æŒ‡å®šã•れã¦ã„れã°è­¦å‘Šã—ãªã„。 2. アドレス㌠`mew-warn-addresses' ã§æŒ‡å®šã•れã¦ã„れã°è­¦å‘Šã™ã‚‹ã€‚ 3. ドメイン㌠`mew-safe-domains' ã§æŒ‡å®šã•れã¦ã„れã°è­¦å‘Šã—ãªã„。 4. ドメイン㌠`mew-warn-domains' ã§æŒ‡å®šã•れã¦ã„れã°è­¦å‘Šã™ã‚‹ã€‚ 5. `mew-warn-addresses' ã‹ `mew-safe-domains' ãŒå®šç¾©ã•れã¦ã„れã°è­¦å‘Š ã™ã‚‹ã€‚ 6. 警告ã—ãªã„。 以下㫠"@example.org" 以外ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’æŒã¤ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’警告ã™ã‚‹ä¾‹ã‚’示ã—ã¾ ã™ã€‚ (setq mew-safe-domains '("example.org")) ドメイン㯠"@example.org" ã§ã™ãŒã€"customers@example.org" ã¯è­¦å‘Šã—ãŸã„ å ´åˆã¯ã€ã•らã«ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¾ã™ã€‚ (setq mew-warn-addresses '("customers@example.org"))  File: mew.ja.info, Node: biff, Next: edit, Prev: addr-warn, Up: Tips Biff ==== メッセージãŒåˆ°ç€ã—ãŸã‹å®šæœŸçš„ã«èª¿ã¹ã‚‹æ©Ÿèƒ½ã‚’ biff ã¨ã„ã„ã¾ã™ã€‚Mew ã§ã¯ã€ 以下ã®è¨­å®šã‚’ã™ã‚‹ã¨ã€5 分ã”ã¨ã«æ–°è¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•個ã‚ã‚‹ã‹èª¿ã¹ã‚‹ã‚ˆã†ã«ãª りã¾ã™ã€‚ (setq mew-use-biff t) æ–°è¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚れã°ã€ãã®æ•°ãŒãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ã«è¡¨ç¤ºã•れã¾ã™ã€‚ Biff ã®å¯¾è±¡ã¨ãªã‚‹ã‚µãƒ¼ãƒã¨ãƒ—ロトコルã¯ã€Mew ã®èµ·å‹•時㫠`mew-proto'ã¨ã‚±ãƒ¼ ス(`mew-case')ã‹ã‚‰æ±ºå®šã•れã¾ã™ã€‚ 以下ã®è¨­å®šã‚’ã™ã‚‹ã¨ã€æ–°è¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒãªã„状態ã‹ã‚‰ã‚る状態ã«å¤‰ã£ãŸéš›ã«ã€ ビープ音ãŒé³´ã‚Šã¾ã™ã€‚ (setq mew-use-biff-bell t) メッセージã®åˆ°ç€ã‚’調ã¹ã‚‹é–“隔を変ãˆã‚‹ã«ã¯ã€`mew-biff-interval' を設定㗠ã¦ä¸‹ã•ã„。以下ã¯ã€10 分ã«ã™ã‚‹ä¾‹ã§ã™ã€‚ (setq mew-biff-interval 10)  File: mew.ja.info, Node: edit, Next: Convention, Prev: biff, Up: Tips Edit モード =========== Edit モードã¯ã€æ—¢å­˜ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’編集ã—ã€æ–°ã—ã„メッセージを作æˆã™ã‚‹ãŸ ã‚ã®ãƒ¢ãƒ¼ãƒ‰ã§ã™ã€‚用途ã®å…¸åž‹ä¾‹ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚ - 大ããªæ·»ä»˜ãƒ•ァイルを削除ã—ã¦ä¿å­˜ã™ã‚‹ - PGP/MIME ã‚„ S/MIME ã§æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·åŒ–ã—ãŸçŠ¶æ…‹ã§ä¿å­˜ ã™ã‚‹ ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ Edit モードã§ç·¨é›†ã™ã‚‹ã«ã¯ã€`M-e'を押ã—ã¾ã™ã€‚ã™ã‚‹ã¨ã€ Draft モードã«ä¼¼ãŸå½¢ã§è‰ç¨¿ãŒç”¨æ„ã•れã¾ã™ã€‚Edit モードã§ã¯ã€Draftモード ã¨åŒæ§˜ã®æ“作ã§ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’編集ã§ãã¾ã™ã€‚ 編集ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ–°ã—ã„メッセージã¨ã—ã¦ä¿å­˜ã™ã‚‹ã«ã¯ã€`C-cC-c'ã‹ `C-cC-m'を使ã„ã¾ã™ã€‚両者ã¯ã€ã¾ã£ãŸãåŒã˜ã‚³ãƒžãƒ³ãƒ‰ã§ã™ã€‚ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ を実行ã™ã‚‹ã¨ã€ã©ã®ãƒ•ォルダã«ä¿å­˜ã™ã‚‹ã‹ã‚’訊ã„ã¦ãã¾ã™ã€‚ ãªãŠã€ã“ã®æ©Ÿèƒ½ã¯å†ç·¨é›†(*Note sum-write::)ã¨æ··åŒã—ã‚„ã™ã„ã®ã§æ³¨æ„ã—ã¦ä¸‹ ã•ã„。å†ç·¨é›†ã¯ç·¨é›†å¾Œã«é€ä¿¡ã™ã‚‹ã®ã«å¯¾ã—ã€Edit モードã§ã¯ç·¨é›†ã®å¾Œã«ä¿å­˜ ã—ã¾ã™ã€‚ 以下㫠Edit モードã®ã¾ã¨ã‚を示ã—ã¾ã™ã€‚Summary モードã‹ã‚‰ Edit モード㫠入るã«ã¯ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’使ã„ã¾ã™ã€‚ `M-e' ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’元㫠Edit モードã«å…¥ã‚‹ã€‚ Edit モードã§ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ `C-cC-c' 編集ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ–°ã—ã„メッセージã«ä¿å­˜ã€‚ `C-cC-m' `C-cC-c'ã«åŒã˜ã€‚ `ãã®ä»–' Draft モードã¨åŒã˜ã€‚  File: mew.ja.info, Node: Convention, Next: Implementation, Prev: edit, Up: Top メッセージã®ä½œæ³• **************** メッセージをやりã¨ã‚Šã™ã‚‹éš›ã«ã¯ã€æœ€ä½Žé™ã®ãƒžãƒŠãƒ¼ãŒã‚りã¾ã™ã€‚マナーを守㣠ã¦ã„ãªã„メッセージã¯èª­ã¿ã«ãã„ãŸã‚ã€å¤§å¤‰æã—ã¾ã™ã€‚ç°¡æ½”ã‹ã¤é©åˆ‡ãªæ–‡ç« ã‚’ 書ãã€ãªã‚‹ã¹ã相手ã«ç†è§£ã—ã¦ã‚‚らãˆã‚‹ã‚ˆã†åŠªåŠ›ã—ã¾ã—ょã†ã€‚ メッセージを書ãéš›ã«æ°—を付ã‘ã‚‹ã¹ã項目を以下ã«ç¤ºã—ã¾ã™ã€‚ To: 㨠Cc: ã‚’æ­£ã—ãæ›¸ã To: ãŒç›®çš„ã®äººã§ã€Cc: ã¯å‚考ã¾ã§ã«é€ã‚Šä»˜ã‘る人ã§ã™ã€‚自分ã®ã‚¢ãƒ‰ãƒ¬ ス㌠Cc: ã®å ´åˆã¯ã€èª­ã¿é£›ã°ã™äººãŒã„ã¾ã™ã‹ã‚‰æ³¨æ„ã—ã¦ä¸‹ã•ã„。ã¾ãŸã€ ä¸å¿…è¦ãªã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’ To: ã‚„ Cc: ã«æ›¸ã„ã¦ã€ç›¸æ‰‹ã«è¿·æƒ‘ã‚’ã‹ã‘ã¦ã—ã¾ã† ã“ã¨ãŒãªã„よã†ã«ã—ã¾ã—ょã†ã€‚ To: 㨠Cc: ã«æ›¸ãã‚¢ãƒ‰ãƒ¬ã‚¹ã®æ•°ã¯å°‘ãªãã™ã‚‹ アドレスをãŸãã•ã‚“ To: ã‚„ Cc: ã«æ›¸ãã®ã¯ã‚ˆããªã„ã“ã¨ã§ã™ã€‚é¢å€’㧠もメーリングリストを作りã¾ã—ょã†ã€‚ã‚ã‚‹ã„ã¯ã€å¿…è¦ã«å¿œã˜ã¦å®›å…ˆã‚’匿 åã«ã—ã¾ã—ょã†(*Note anonymous::)。 Subject: ã«ã¯æœ¬æ–‡ã®å†…容を的確ã«çŸ­ã書ã Subject: を見ã¦èª­ã‚€ã‹æ±ºã‚る人ãŒã„ã¾ã™ã‹ã‚‰ã€ä¸é©åˆ‡ãª Subject: ã ã¨ 読んã§ã‚‚らãˆãªã„ã‹ã‚‚ã—れã¾ã›ã‚“。長ㄠSubject: ã¯èª­ã¿ã«ãã„ã®ã§æ­¢ ã‚ã¾ã—ょã†ã€‚ å¿…è¦ãªéƒ¨åˆ†ã ã‘を引用ã™ã‚‹ é¢å€’ã§ã‚‚ä¸è¦ãªéƒ¨åˆ†ã¯å‰Šã‚Šã¾ã—ょã†ã€‚Mew を使ã£ã¦ã„れã°ã€å¼•ç”¨ã¯æ¥½å‹ ã®ã¯ãšã§ã™ã€‚ シグニãƒãƒ£ã¯ç°¡ç´ ã«ã™ã‚‹ é•·ã„シグニãƒãƒ£ã¯å˜ãªã‚‹è‡ªå·±æº€è¶³ã§ã™ã€‚ ã„ãŸãšã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‰ãªã„ ã“ã‚“ãªã“ã¨ã¯æ³¨æ„ã—ãŸãã‚りã¾ã›ã‚“ãŒã€ãれã§ã‚‚ä¸å¹¸ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãªã© ã‚’é€ã£ã¦ãる人ãŒã„ã¾ã™ã€‚人格を疑ã‚れるã“ã¨ã‚’ç†è§£ã™ã¹ãã§ã™ã€‚ 相手ã®èª­ã‚るデータã®ã¿ã‚’添付ã™ã‚‹ ãªã‚“ã®åˆæ„ã‚‚ãªã—ã«é€ã£ã¦ã‚ˆã„データã¯ãƒ†ã‚­ã‚¹ãƒˆã®ã¿ã§ã™ã€‚ãれ以外㮠データをé€ã‚‹å ´åˆã¯ã€ã‚らã‹ã˜ã‚相手ã«é€ã£ã¦ã‚ˆã„ã‹ç¢ºèªã‚’ã¨ã‚Šã¾ã—ょ ã†ã€‚メーリングリストã«ã¯ã€ãƒ†ã‚­ã‚¹ãƒˆã®ã¿ã‚’投稿ã™ã‚‹ã®ãŒç„¡é›£ã§ã—ょã†ã€‚ ã¾ãŸã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã®ãƒžãƒŠãƒ¼ã¯ RFC1855 を読むã¨ã„ã„ã§ã—ょã†ã€‚  File: mew.ja.info, Node: Implementation, Next: Avail, Prev: Convention, Up: Top 実装ã«ã¤ã„㦠************ "mewl" 㨠"mewencode" ãŒå¿…è¦ãªã®ã¯ãªãœï¼Ÿ Mew ã§ã¯ã€Summary mode ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã—ã¦ã„ã‚‹é–“ã‚„ã€ä¸€è¦§ã‚’å†è¡¨ 示ã—ã¦ã„ã‚‹é–“ã«ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読ã¿é€²ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã¯ã€ãƒ— ログラムã®åˆ¶å¾¡ã®æµã‚ŒãŒè¤‡æ•°å¿…è¦ã§ã‚ã‚‹ã“ã¨ã‚’æ„味ã—ã¦ã„ã¾ã™ã€‚Emacs ã§åˆ¶å¾¡ã®æµã‚Œã‚’複数ã«ã™ã‚‹ã«ã¯ã€ã‚µãƒ–プロセスを作るã‹ã€TCP コãƒã‚¯ã‚·ãƒ§ ンを張るã—ã‹æ–¹æ³•ãŒã‚りã¾ã›ã‚“(Emacs Lisp ã«ã¯ light weight process ãŒã‚りã¾ã›ã‚“)。POP ã‚„ SMTP ã«ã¯ã€TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’使ã†ã®ã§å•題゠りã¾ã›ã‚“。ã—ã‹ã—ã€Summary mode ã®ä¸€è¦§ã‚’å†è¡¨ç¤ºã™ã‚‹ãŸã‚ã«ã¯ã€ä½•ã‹ã‚³ マンドを起動ã—ãªã„ã¨ã„ã‘ã¾ã›ã‚“。ã“れãŒã€"mewl" ãŒå­˜åœ¨ã™ã‚‹ç†ç”±ã§ã™ã€‚ "mewencode" ãŒå­˜åœ¨ã™ã‚‹ç†ç”±ã¯ã€å˜ã«é€Ÿåº¦ã®ãŸã‚ã§ã™ã€‚MIME ã®ç¬¦å·åŒ–ã‚’ Emacs Lisp ã§å®Ÿè£…ã—ãŸã¨ã“ã‚ã€ä½¿ã„物ã«ãªã‚‰ãªã„ãらã„é…ã‹ã£ãŸã®ã§ã€ "mewencode" を使ã„ç¶šã‘ã¦ã„ã¾ã™ã€‚(ãŸã ã—ã€Base64 ㌠Emacs ã§å®Ÿè£…㕠れã¦ã„れã°ã€ãã¡ã‚‰ã‚’使ã„ã¾ã™ã€‚) 文字列検索(`C-s'ã€`C-r')ã™ã‚‹ã¨ã€è¡Œæœ«ã«ã‚«ãƒ¼ã‚½ãƒ«ãŒé£›ã¶ã®ã¯ãªãœï¼Ÿ Summary mode ã«ãŠã„ã¦ã€ã‚¹ãƒ¬ãƒƒãƒ‰æƒ…å ±ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。ã“れã¯ã€ Summary mode ã§è¡¨ç¤ºã•れã¦ã„る行ã«é–¢ã—ã¦ã¯ã€è¡¨ç¤ºã™ã‚‹çž¬é–“ã«ã‚¹ãƒ¬ãƒƒãƒ‰ 情報ã«éžè¡¨ç¤ºã®å±žæ€§ã‚’付ã‘ã‚‹ã‹ã‚‰ã§ã™ã€‚éžè¡¨ç¤ºã®å±žæ€§ãŒã¤ã„ã¦ã„る部分 ã¯æ–‡å­—列検索ã®å¯¾è±¡ã«ã¯ãªã‚Šã¾ã›ã‚“。ã—ã‹ã—ã€Summary mode ã«è¡¨ç¤ºã•れ ã¦ã„ãªã„行ã®ã‚¹ãƒ¬ãƒƒãƒ‰æƒ…å ±ã¯ã€éžè¡¨ç¤ºã®å±žæ€§ãŒã¤ã„ã¦ã„ãªã„ãŸã‚ã€æ¤œç´¢ ã®å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚ãã—ã¦ã€åˆè‡´ã—ãŸè¡ŒãŒè¡¨ç¤ºã•れる際ã«éžè¡¨ç¤ºã®å±žæ€§ ãŒã¤ã„ã¦ã€ã‚ãŸã‹ã‚‚行末ã«åˆè‡´ã—ãŸã‹ã®ã‚ˆã†ãªéŒ¯è¦šã‚’å—ã‘ã¾ã™ã€‚Summary mode 全体ã®è¡Œã®ã‚¹ãƒ¬ãƒƒãƒ‰æƒ…å ±ã«ã¯ã€ã‚­ãƒ¼ã®å…¥åŠ›ãŒãªã„時間ã«éžè¡¨ç¤ºã®å±ž 性ãŒä»˜ãã¾ã™ã€‚全体ã«éžè¡¨ç¤ºã®å±žæ€§ãŒä»˜ãã¨ã€Summary mode ã®ãƒ¢ãƒ¼ãƒ‰ãƒ© インã®å³ç«¯ã«ã‚ã‚‹ `*' ãƒžãƒ¼ã‚¯ãŒæ¶ˆãˆã¾ã™ã€‚ã“ã®çŠ¶æ…‹ã§ã¯ã€æ–‡å­—列検索㌠直感通りã«åƒãã¾ã™ã€‚ Mew 4.3 ã§ãƒ•ァイルを添付ã™ã‚‹ã¨ MS ã®ãƒ¡ãƒ¼ãƒ«ãƒªãƒ¼ãƒ€ã§ãƒ•ァイルåãŒèªè­˜ã§ãるよã†ã«ãªã‚Šã¾ã—㟠MS ã®ãƒ¡ãƒ¼ãƒ«ãƒªãƒ¼ãƒ€ã¯ã€ãƒ•ァイルåを符å·åŒ–ã™ã‚‹éš›ã«ã€æ¨™æº–化ã•れã¦ãªã„ ç‹¬è‡ªã®æ–¹æ³•を使ã„ã¾ã™ã€‚MS ã®ãƒ¡ãƒ¼ãƒ«ãƒªãƒ¼ãƒ€ãŒã€æ¨™æº–化ã•れã¦ã„る符å·åŒ– æ–¹å¼ã«ç§»è¡Œã™ã‚Œã°ã„ã„ã®ã§ã™ãŒã€ä½•度ãŠé¡˜ã„ã—ã¦ã‚‚ç„¡ç†ã§ã—ãŸã€‚ãã“ã§ã€ Mew ã§ã¯ä»¥ä¸‹ã®ã‚ˆã†ãªæ–¹æ³•ã§ã€ã“ã®å•題を解決ã—ã¾ã—ãŸã€‚ã™ãªã‚ã¡ã€Mew ã¯åŸºæœ¬çš„ã«ã¯æ¨™æº–化ã•れã¦ã„る方法ã§ã€ãƒ•ァイルåを符å·åŒ–ã—ã¾ã™ã€‚ã れã«åŠ ãˆã¦ã€MS ã®ãƒ¡ãƒ¼ãƒ«ãƒªãƒ¼ãƒ€ãŒå‚ç…§ã™ã‚‹æ¨™æº–化ã•れã¦ãªã„パラメータ ã«å¯¾ã—ã¦ã€ãƒ•ァイルåã‚’ MS ç‹¬è‡ªã®æ–¹æ³•ã§ç¬¦å·åŒ–ã—ã€ä»˜åŠ ã—ã¾ã™ã€‚  File: mew.ja.info, Node: Avail, Next: obtain, Prev: Implementation, Up: Top 入手方法ã¨ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆ ************************** ã“ã“ã§ã¯ã€Mew ã®å…¥æ‰‹æ–¹æ³•ã¨ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã«ã¤ã„ã¦è§¦ã‚Œã¾ã™ã€‚ * Menu: * obtain:: Mew ã®å…¥æ‰‹æ–¹æ³• * ml:: メーリングリスト  File: mew.ja.info, Node: obtain, Next: ml, Prev: Avail, Up: Avail Mew ã®å…¥æ‰‹æ–¹æ³• ============== Mew ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ä»¥ä¸‹ã‹ã‚‰å…¥æ‰‹ã§ãã¾ã™ã€‚ http://www.Mew.org/Release/ Mew ã® Git 版ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã‘れã°ã€ä»¥ä¸‹ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 http://www.mew.org/ja/git/  File: mew.ja.info, Node: ml, Next: Copyright, Prev: obtain, Up: Avail メーリングリスト ================ Mew ã«é–¢ã™ã‚‹ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã«ã¤ã„ã¦ã¯ã€ä»¥ä¸‹ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 http://www.mew.org/mailman/listinfo  File: mew.ja.info, Node: Copyright, Next: Variable Index, Prev: ml, Up: Top 著作権ã«ã¤ã„㦠************** Mew ã¯ä»¥ä¸‹ã®è‘—作権ã«å¾“ã„ã¾ã™ã€‚ Copyright (C) 1994-2013 Mew developing team. All rights reserved. å¤‰æ›´ã®æœ‰ç„¡ã«ã‹ã‹ã‚らãšã€ã‚½ãƒ¼ã‚¹ãŠã‚ˆã³ãƒã‚¤ãƒŠãƒªå½¢å¼ã®å†é…布ãŠã‚ˆã³åˆ©ç”¨ã¯ã€ ä»¥ä¸‹ã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„れã°ã€ã“れを許å¯ã™ã‚‹ã€‚ 1. ソース・コードã®å†é…布ã¯ã€ä¸Šè¨˜ã®è‘—作権表示ã€ã“ã®æ¡ä»¶é …ç›®ã€ãŠã‚ˆã³ã€ 以下ã®å…責事項をä¿å­˜ã—ãªã‘れã°ãªã‚‰ãªã„。 2. ãƒã‚¤ãƒŠãƒªå½¢å¼ã®å†é…布ã¯ã€ä¸Šè¨˜ã®è‘—作権表示ã€ã“ã®æ¡ä»¶é …ç›®ã€ãŠã‚ˆã³ã€ 以下ã®å…責事項をã€ãã®é…布ã«ä»˜éšã™ã‚‹èª¬æ˜Žæ›¸ã€ã‚ã‚‹ã„ã¯ãã®ä»–ã®è³‡æ–™ ã®ã„ãšã‚Œã‹ã«æ˜Žè¨˜ã—ãªã‘れã°ãªã‚‰ãªã„。 3. å‰ã‚‚ã£ã¦ç‰¹åˆ¥ã«è¨±è«¾ã‚’å¾—ãªã„é™ã‚Šã€ã“ã®ã‚½ãƒ•トウェアã‹ã‚‰æ´¾ç”Ÿã—ãŸè£½å“ ã®æŽ¨å¥¨ã‚„è²©å£²ä¿ƒé€²ã®ãŸã‚ã«ã€ã“ã®ãƒãƒ¼ãƒ åã¨è²¢çŒ®è€…é”ã®åå‰ã‚’利用ã—㦠ã¯ãªã‚‰ãªã„。 ã“ã®ã‚½ãƒ•トウェアã¯ã€Œã“ã®ã¾ã¾ã®å½¢ã§ã€æä¾›ã•ã‚Œã€æ˜Žç¤ºçš„ã‚ã‚‹ã„ã¯è¨€å¤–ã®ä¿è¨¼ ã¯ã€å•†ç”¨åˆ©ç”¨ãŠã‚ˆã³ç‰¹å®šç›®çš„ã¸ã®é©åˆã«å¯¾ã™ã‚‹è¨€å¤–ã®ä¿è¨¼ã‚‚å«ã¿ã€ã¾ãŸã“れら ã ã‘ã«é™ã‚‰ãšã€å­˜åœ¨ã—ãªã„。ãŸã¨ãˆä»¥ä¸‹ã®ã‚ˆã†ãªæå®³ã®å¯èƒ½æ€§ã‚’示唆ã•れã¦ã„ ãŸã¨ã—ã¦ã‚‚ã€ã©ã®ã‚ˆã†ãªå½¢ã«ã—ã‚ã“ã®ã‚½ãƒ•トウェアã®åˆ©ç”¨ã‹ã‚‰ç™ºç”Ÿã—ãŸå•題㫠ãŠã„ã¦ã€ã“ã®ãƒãƒ¼ãƒ ã¨è²¢çŒ®è€…é”ã¯ã€(代替製å“やサービスã®èª¿é”; 利用権ã€ãƒ‡ãƒ¼ ã‚¿ã€ã‚ã‚‹ã„ã¯åˆ©ç›Šã®æå¤±; ã‚ã‚‹ã„ã¯å–¶æ¥­ã®ä¸­æ–­ã‚’å«ã‚€ã€ã¾ãŸã“れらã ã‘ã«é™ã‚‰ ãš)直接的ã«ã€é–“接的ã«ã€å¶ç„¶ã«ã€ç‰¹åˆ¥ã«ã€æ‡²ç½°ä¸Šã€ã‚ã‚‹ã„ã¯ã€å¿…ç„¶çš„ã«ç”Ÿã˜ ã¦ã—ã¾ã£ãŸæå®³ã«å¯¾ã—責任ã¯ãªãã€ã„ã‹ãªã‚‹è²¬ä»»ç†è«–上ã§ã‚‚å¥‘ç´„ã®æœ‰ç„¡ã«ä¿‚゠らãšå޳坆ãªè²¬ä»»ã¯ãªãã€ã¾ãŸ(éŽå¤±ã‚ã‚‹ã„ã¯ãã®ä»–ã‚’å«ã‚€)䏿³•行為ã«å¯¾ã—ã¦ã‚‚ 責任ã¯ãªã„。 CD ROM ã«å…¥ã‚Œã¦é…布ã—ãŸã„ã¨ã„ã†æ–¹ã¯ã€ã§ãã‚‹ã ã‘æ•™ãˆã¦ä¸‹ã•ã„。教ãˆã¦ã れãªãã¦ã‚‚怒りã¾ã›ã‚“ãŒã€æ•™ãˆã¦é ‚ã‘ã‚‹ã¨ã‚りãŒãŸã„ã§ã™ã€‚é…布を断ã£ãŸã“㨠ã¯ã‚りã¾ã›ã‚“。 ã“ã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã®è‘—作権ã¯ã€è‘—者ã«å±žã—ã¾ã™ã€‚è¤‡è£½ã€æ”¹å¤‰ã€å†é…布ã¯è‡ªç”±ã§ã™ ãŒã€ç„¡ä¿è¨¼ã§ã™ã€‚ã¾ãŸã€ã“ã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‹ã‚‰ç™ºç”Ÿã—ãŸè¢«å®³ã«å¯¾ã—ã€è‘—者ã¯ä¸€åˆ‡ 責任を負ã„ã¾ã›ã‚“。  File: mew.ja.info, Node: Variable Index, Next: Key Index, Prev: Copyright, Up: Top 変数索引 ******** * Menu: * mail-user-agent: Composing. (line 5) * mail-user-agent: configuration. (line 5) * mail-user-agent: start. (line 5) * mew-addrbook-for-cite-label: draft-mode. (line 5) * mew-addrbook-for-cite-prefix: draft-mode. (line 5) * mew-addrbook-mode-hook: hooks. * mew-addrbook-override-by-newone: auto-alias. (line 5) * mew-ask-charset: charset. (line 5) * mew-ask-fcc: send. (line 5) * mew-ask-subject: send. (line 5) * mew-auto-flush-queue: retrieving. (line 5) * mew-auto-get: start. (line 5) * mew-before-cite-hook: hooks. * mew-biff-interval: biff. (line 5) * mew-case-guess-alist: config. (line 5) * mew-case-guess-when-composed: config. * mew-case-guess-when-prepared: config. * mew-case-guess-when-replied-alist: config. (line 5) * mew-case-guess-when-replied: config. * mew-cc: draft-mode. (line 5) * mew-charset-latin: charset. (line 5) * mew-charset-m17n: charset. (line 5) * mew-cite-fields: draft-mode. (line 5) * mew-cite-format: draft-mode. (line 5) * mew-cite-hook: hooks. * mew-cite-prefix: draft-mode. (line 5) * mew-cite-prefix-function: draft-mode. (line 5) * mew-config-alist: config. (line 5) * mew-config-alist: config2. (line 5) * mew-cs-samba: custom-misc. (line 5) * mew-cursor-mark: highlight. (line 5) * mew-dcc: draft-mode. (line 5) * mew-debug: status-update. (line 5) * mew-decode-broken: analysis. * mew-decode-broken: status-update. (line 5) * mew-decode-quoted: invalid. (line 5) * mew-delete-unread-mark-by-mark: unread mark. (line 5) * mew-draft-mode-edit-again-hook: hooks. * mew-draft-mode-hook: hooks. * mew-draft-mode-newdraft-hook: hooks. * mew-draft-mode-reedit-draft-hook: hooks. * mew-draft-mode-reedit-hook: hooks. * mew-draft-mode-reedit-queue-hook: hooks. * mew-draft-privacy-method: shortcut. (line 5) * mew-end-of-message-string: multipart. (line 5) * mew-end-of-part-string: multipart. (line 5) * mew-env-hook: hooks. * mew-field-delete-for-forwarding: forward. (line 5) * mew-field-for-printing: custom-misc. (line 5) * mew-fields: header. (line 5) * mew-file-max-size: analysis. * mew-flowed-auto-wrap: longline. (line 5) * mew-flowed-fold-length: longline. (line 5) * mew-flowed-fold-threshold: longline. (line 5) * mew-from-list: cheader. (line 5) * mew-ham-prog-args: spam2. (line 5) * mew-ham-prog: spam2. (line 5) * mew-header-alist: draft-mode. (line 5) * mew-header-max-length: analysis. * mew-header-mode-hook: hooks. * mew-header-veil-count: features. (line 5) * mew-highlight-body-max-size: highlight. (line 5) * mew-imap-auth: imap. * mew-imap-auth-list: imap. * mew-imap-delete: imap. * mew-imap-delete: retrieving. (line 5) * mew-imap-header-only: imap. * mew-imap-header-only: retrieving. (line 5) * mew-imap-sentinel-hook: hooks. * mew-imap-sentinel-non-biff-hook: hooks. * mew-imap-server: configuration. (line 5) * mew-imap-server: imap. * mew-imap-size: imap. * mew-imap-spam-field: spam. (line 5) * mew-imap-spam-folder: spam. (line 5) * mew-imap-spam-word: spam. (line 5) * mew-imap-ssh-server: imap. * mew-imap-ssl: imap. * mew-imap-ssl-port: imap. * mew-imap-trash-folder: delete mark. (line 5) * mew-imap-trash-folder-list: delete mark. (line 5) * mew-imap-user: imap. * mew-inbox-action-alist: spam. (line 5) * mew-init-hook: hooks. * mew-lisp-max-length: auto-alias. (line 5) * mew-lisp-max-length: by-from. (line 5) * mew-lisp-max-length: by-thread. (line 5) * mew-mail-address-list: reply. (line 5) * mew-mail-domain-list: cheader. (line 5) * mew-mailbox-type: config. (line 5) * mew-mailbox-type: configuration. (line 5) * mew-mailbox-type: retrieving. (line 5) * mew-mailbox-type: start. (line 5) * mew-make-message-hook: hooks. * mew-mbox-command-arg: configuration. (line 5) * mew-mbox-command: configuration. (line 5) * mew-message-hook: hooks. * mew-message-mode-hook: hooks. * mew-mime-multipart-alternative-list: message-mode. (line 5) * mew-name: configuration. (line 5) * mew-nntp-header-only: nntp. * mew-nntp-header-only: retrieving. (line 5) * mew-nntp-msgid-domain: nntp. * mew-nntp-msgid-user: nntp. * mew-nntp-newsgroup: nntp. * mew-nntp-sentinel-hook: hooks. * mew-nntp-server: configuration. (line 5) * mew-nntp-server: nntp. * mew-nntp-size: nntp. * mew-nntp-ssh-server: nntp. * mew-nntp-ssl: nntp. * mew-nntp-ssl-port: nntp. * mew-nntp-user: nntp. * mew-nntp2-flush-hook: hooks. * mew-nntp2-sentinel-hook: hooks. * mew-pack-hook: hooks. * mew-pick-pattern-list: condition. (line 5) * mew-pop-auth-list: pop. * mew-pop-auth: pop. * mew-pop-body-lines: pop. * mew-pop-delete: pop. * mew-pop-delete: retrieving. (line 5) * mew-pop-header-only: pop. * mew-pop-header-only: retrieving. (line 5) * mew-pop-sentinel-hook: hooks. * mew-pop-sentinel-non-biff-hook: hooks. * mew-pop-server: pop. * mew-pop-size: pop. * mew-pop-ssh-server: SSH. (line 5) * mew-pop-ssh-server: pop. * mew-pop-ssl: SSL. (line 5) * mew-pop-ssl: pop. * mew-pop-ssl-port: SSL. (line 5) * mew-pop-ssl-port: pop. * mew-pop-user: configuration. (line 5) * mew-pop-user: pop. * mew-post-hook: hooks. * mew-print-function: custom-misc. (line 5) * mew-print-function: features. (line 5) * mew-prog-gpg: cipher-viewing. (line 5) * mew-prog-grep: condition. (line 5) * mew-prog-grep-opts: condition. (line 5) * mew-prog-msexcel-ext: message-mode. (line 5) * mew-prog-msexcel: message-mode. (line 5) * mew-prog-mspowerpoint-ext: message-mode. (line 5) * mew-prog-mspowerpoint: message-mode. (line 5) * mew-prog-msword-ext: message-mode. (line 5) * mew-prog-msword: message-mode. (line 5) * mew-prog-pgp: cipher-viewing. (line 5) * mew-prog-pgp2: cipher-viewing. (line 5) * mew-prog-pgp5: cipher-viewing. (line 5) * mew-prog-text/html-ext: message-mode. (line 5) * mew-protect-privacy-always: shortcut. (line 5) * mew-protect-privacy-always-type: shortcut. (line 5) * mew-protect-privacy-encrypted: shortcut. (line 5) * mew-protect-privacy-encrypted-type: shortcut. (line 5) * mew-protect-privacy-with-old-pgp-signature: shortcut. (line 5) * mew-proto: config. (line 5) * mew-proto: configuration. (line 5) * mew-proto: start. (line 5) * mew-quit-hook: hooks. * mew-real-post-hook: hooks. * mew-real-send-hook: hooks. * mew-refile-auto-refile-skip-any-mark: auto-refile. (line 5) * mew-refile-ctrl-multi: guess-rule. (line 5) * mew-refile-guess-alist: by-alist. (line 5) * mew-refile-guess-by-from-learn-hook: hooks. * mew-refile-guess-control: guess-rule. (line 5) * mew-refile-guess-from-me-is-special: by-from-folder. (line 5) * mew-refile-guess-from-me-is-special: by-from. (line 5) * mew-refile-guess-strip-domainpart: by-default. (line 5) * mew-reply-all-alist: reply. (line 5) * mew-reply-fromme-alist: reply. (line 5) * mew-reply-sender-alist: reply. (line 5) * mew-safe-addresses: addr-warn. (line 5) * mew-safe-domains: addr-warn. (line 5) * mew-scan-sentinel-hook: hooks. * mew-search-method: dbsearch. (line 5) * mew-send-hook: hooks. * mew-signature-as-lastpart: cite. (line 5) * mew-signature-file: cite. (line 5) * mew-signature-insert-last: cite. (line 5) * mew-smtp-auth-list: smtp. * mew-smtp-flush-hook: hooks. * mew-smtp-helo-domain: smtp. * mew-smtp-mail-from: smtp. * mew-smtp-msgid-domain: smtp. * mew-smtp-msgid-user: smtp. * mew-smtp-port: smtp. * mew-smtp-sentinel-hook: hooks. * mew-smtp-server: configuration. (line 5) * mew-smtp-server: smtp. * mew-smtp-ssh-server: smtp. * mew-smtp-ssl: SSL. (line 5) * mew-smtp-ssl-port: smtp. * mew-smtp-ssl: smtp. * mew-smtp-user: smtp. * mew-sort-default-key-alist: sorting. (line 5) * mew-sort-default-key: sorting. (line 5) * mew-sort-hook: hooks. * mew-sort-key-alist: sorting. (line 5) * mew-spam-prog-args: spam2. (line 5) * mew-spam-prog: spam2. (line 5) * mew-spam: spam. (line 5) * mew-ssl-cert-directory: SSL. (line 5) * mew-ssl-verify-level: SSL. (line 5) * mew-status-update-hook: hooks. * mew-summary-delete-folder-hook: hooks. * mew-summary-exec-hook: hooks. * mew-summary-form-extract-rule: summary-mode. (line 5) * mew-summary-form-from-me-prefix: summary-mode. (line 5) * mew-summary-form-mark-delete: summary-mode. (line 5) * mew-summary-form-mark-review: summary-mode. (line 5) * mew-summary-form-mark-spam: summary-mode. (line 5) * mew-summary-form: summary-mode. (line 5) * mew-summary-ls-no-scan-hook: hooks. * mew-summary-mark-direction: summary-mode. (line 5) * mew-summary-mode-hook: hooks. * mew-summary-rename-folder-hook: hooks. * mew-summary-show-direction: summary-mode. (line 5) * mew-summary-toggle-disp-msg-hook: hooks. * mew-suspend-hook: hooks. * mew-syntax-format-hook: hooks. * mew-theme-file: highlight. (line 5) * mew-thread-display-hook: hooks. * mew-thread-separator: thread. (line 5) * mew-trash-folder: delete mark. (line 5) * mew-trash-folder-list: delete mark. (line 5) * mew-use-8bit: smtp. * mew-use-8bit: status-update. (line 5) * mew-use-alternative: analysis. * mew-use-biff-bell: biff. (line 5) * mew-use-biff: biff. (line 5) * mew-use-cached-passwd: password. (line 5) * mew-use-cursor-mark: highlight. (line 5) * mew-use-fast-refile: by-folder. (line 5) * mew-use-format-flowed: longline. (line 5) * mew-use-full-window: summary-mode. (line 5) * mew-use-header-veil: features. (line 5) * mew-use-header-veil: status-update. (line 5) * mew-use-highlight-body: highlight. (line 5) * mew-use-highlight-cursor-line: highlight. (line 5) * mew-use-highlight-header: highlight. (line 5) * mew-use-highlight-mark: highlight. (line 5) * mew-use-highlight-mouse-line: highlight. (line 5) * mew-use-highlight-url: highlight. (line 5) * mew-use-highlight-x-face: highlight. (line 5) * mew-use-master-passwd: password. (line 5) * mew-use-node-folder: by-folder. (line 5) * mew-use-old-pgp: shortcut. (line 5) * mew-use-old-pgp: status-update. (line 5) * mew-use-samba-encoding: custom-misc. (line 5) * mew-use-smtp-auth: smtp. * mew-use-text-body: analysis. * mew-use-text/html: analysis. * mew-use-text/xml: analysis. * mew-use-thread-separator: thread. (line 5) * mew-use-unread-mark: unread mark. (line 5) * mew-user: configuration. (line 5) * mew-virtual-mode-hook: hooks. * mew-visit-inbox-after-setting-case: visiting. (line 5) * mew-visit-queue-after-sending: visiting. (line 5) * mew-warn-addresses: addr-warn. (line 5) * mew-warn-domains: addr-warn. (line 5) * mew-warning-field-level: status-update. (line 5) * mew-x-pgp-key-list: cipher-viewing. (line 5) * read-mail-command: configuration. (line 5)  File: mew.ja.info, Node: Key Index, Prev: Variable Index, Up: Top キー索引 ******** * Menu: * A (Summary): Composing. (line 5) * A (Summary): reply. (line 5) * A (Summary): sum-write. (line 5) * B (Attach): mark-b-comp. (line 5) * B (Summary): features. (line 5) * C (Attach): charset-guess. (line 5) * C (Attach): mime-comp. (line 5) * C (Summary): features. (line 5) * C-b (Attach): mime-comp. (line 5) * C-cC-a (Draft): mime-comp. (line 5) * C-cC-a (Summary): addrbook. (line 5) * C-cC-a (Summary): features. (line 5) * C-cC-b (Draft): shortcut. (line 5) * C-cC-c (Addrbook): addrbook. (line 5) * C-cC-c (Draft): send. (line 5) * C-cC-c (Edit): edit. (line 5) * C-cC-c (Header): resend. (line 5) * C-cC-c (Summary): off-line. (line 5) * C-cC-c (Summary): send. (line 5) * C-cC-e (Draft): shortcut. (line 5) * C-cC-e (Summary): message-mode. (line 5) * C-cC-f (Draft): longline. (line 5) * C-cC-f (Summary): cipher-viewing. (line 5) * C-cC-l (Draft): cite. (line 5) * C-cC-l (Summary): invalid. (line 5) * C-cC-m (Draft): send. (line 5) * C-cC-m (Edit): edit. (line 5) * C-cC-m (Header): resend. (line 5) * C-cC-o (Draft): config. (line 5) * C-cC-o (Summary): visiting. (line 5) * C-cC-pC-a (Draft): shortcut. (line 5) * C-cC-pC-e (Draft): shortcut. (line 5) * C-cC-pC-f (Draft): longline. (line 5) * C-cC-pC-m (Draft): shortcut. (line 5) * C-cC-q (Addrbook): Quit. (line 5) * C-cC-q (Addrbook): addrbook. (line 5) * C-cC-q (Draft): Quit. (line 5) * C-cC-q (Header): Quit. (line 5) * C-cC-q (Summary): Quit. (line 5) * C-cC-r (Draft): shortcut. (line 5) * C-cC-r (Summary): features. (line 5) * C-cC-s (Draft): shortcut. (line 5) * C-cC-s (Summary): features. (line 5) * C-cC-t (Draft): cite. (line 5) * C-cC-v (Summary): cipher-viewing. (line 5) * C-cC-v (Summary): features. (line 5) * C-cC-y (Draft): cite. (line 5) * C-cC-z (Summary): cipher-viewing. (line 5) * C-cC-z (Summary): features. (line 5) * C-cTAB (Draft): cheader. (line 5) * C-cTAB (Draft): cite. (line 5) * C-cTAB (Summary): analysis. (line 5) * C-f (Attach): mime-comp. (line 5) * C-n (Attach): mime-comp. (line 5) * C-n (Summary): singlepart. (line 5) * C-p (Attach): mime-comp. (line 5) * C-p (Summary): singlepart. (line 5) * C-u: (Summary): analysis. (line 5) * C-u. (Summary): analysis. (line 5) * C-u. (Summary): invalid. (line 5) * C-u/ (Summary): search. (line 5) * C-u? (Summary): search. (line 5) * C-uA (Summary): reply. (line 5) * C-uC-cC-a (Summary): addrbook. (line 5) * C-uC-cC-e (Summary): message-mode. (line 5) * C-uC-cC-f (Summary): cipher-viewing. (line 5) * C-uC-cC-l (Summary): invalid. (line 5) * C-uD (Summary): delete mark. (line 5) * C-uD (Summary): features. (line 5) * C-uM-n (Summary): keyword. (line 5) * C-uM-o (Summary): auto-refile. (line 5) * C-uM-p (Summary): keyword. (line 5) * C-uM-x mew: start. (line 5) * C-uSPC (Summary): singlepart. (line 5) * C-uZ (Summary): status-update. (line 5) * C-ua (Summary): reply. (line 5) * C-uj (Summary): singlepart. (line 5) * C-uk/ (Summary): search. (line 5) * C-ukI (Summary): dialog. (line 5) * C-umI (Summary): target mark. (line 5) * C-un (Summary): singlepart. (line 5) * C-up (Summary): singlepart. (line 5) * C-us (Summary): retrieving. (line 5) * C-utt (Summary): thread. (line 5) * C-uw (Summary): sum-write. (line 5) * C-x RET l: charset-guess. (line 5) * C-xm: Composing. (line 5) * C-xm: start. (line 5) * D (Attach): mime-comp. (line 5) * D (Summary): delete mark. (line 5) * D (Summary): features. (line 5) * DEL (Summary): singlepart. (line 5) * E (Attach): mark-b-comp. (line 5) * E (Summary): sum-write. (line 5) * F (Attach): mime-comp. (line 5) * F (Summary): Composing. (line 5) * F (Summary): forward. (line 5) * F (Summary): sum-write. (line 5) * F (Summary): target mark. (line 5) * G (Attach): mark-b-comp. (line 5) * I (Attach): charset-guess. (line 5) * I (Summary): retrieving. (line 5) * J (Summary): target mark. (line 5) * M-RET (Summary): singlepart. (line 5) * M-\ (Summary): target mark. (line 5) * M* (Summary): unmark. (line 5) * M-b (Summary): target mark. (line 5) * M-d (Summary): delete mark. (line 5) * M-e (Attach): mark-b-comp. (line 5) * M-e: edit. (line 5) * M-l (Summary): features. (line 5) * M-n (Summary): keyword. (line 5) * M-o (Summary): auto-refile. (line 5) * M-p (Summary): keyword. (line 5) * M-s (Attach): mark-b-comp. (line 5) * M-s (Summary): sorting. (line 5) * M-t (Summary): target mark. (line 5) * M-u: unread mark. (line 5) * M-x mew: Viewing. (line 5) * M-x mew-send: Composing. (line 5) * M-x mew-send: start. (line 5) * M-x mew: start. (line 5) * Md (Summary): delete mark. (line 5) * N (Summary): target mark. (line 5) * P (Attach): mime-comp. (line 5) * P (Summary): target mark. (line 5) * Q (Attach): mark-b-comp. (line 5) * Q (Summary): Quit. (line 5) * RET (Summary): singlepart. (line 5) * Rd (Summary): features. (line 5) * Rr (Summary): features. (line 5) * S (Attach): mark-b-comp. (line 5) * S (Summary): sorting. (line 5) * SPC (Summary): singlepart. (line 5) * : (Summary): analysis. (line 5) * , (Summary): analysis. (line 5) * . (Summary): analysis. (line 5) * ; (Summary): features. (line 5) * = (Summary): features. (line 5) * | (Summary): features. (line 5) * # (Summary): features. (line 5) * _ (Summary): features. (line 5) * _ (Summary): longline. (line 5) * / (Summary): search. (line 5) * ? (Summary): search. (line 5) * - (Summary): singlepart. (line 5) * * (Summary): target mark. (line 5) * T (Attach): mime-comp. (line 5) * TAB (Draft): header. (line 5) * U (Attach): mark-b-comp. (line 5) * U (Summary): unmark. (line 5) * V (Summary): dialog. (line 5) * ) (Virtual): thread. (line 5) * ( (Virtual): thread. (line 5) * & (Virtual): thread. (line 5) * ^ (Virtual): thread. (line 5) * W (Summary): resend. (line 5) * W (Summary): sum-write. (line 5) * Z (Attach): mark-b-comp. (line 5) * Z (Summary): auto-alias. (line 5) * Z (Summary): status-update. (line 5) * a (Attach): mime-comp. (line 5) * a (Summary): Composing. (line 5) * a (Summary): reply. (line 5) * a (Summary): sum-write. (line 5) * b (Summary): features. (line 5) * c (Attach): mime-comp. (line 5) * d (Attach): mime-comp. (line 5) * d (Summary): delete mark. (line 5) * e (Attach): mime-comp. (line 5) * f (Attach): mime-comp. (line 5) * f (Summary): Composing. (line 5) * f (Summary): forward. (line 5) * f (Summary): sum-write. (line 5) * g (Summary): moving. (line 5) * i (Attach): mime-comp. (line 5) * i (Summary): retrieving. (line 5) * i (Summary): send. (line 5) * j (Summary): singlepart. (line 5) * k/ (Summary): search. (line 5) * k? (Summary): search. (line 5) * kI (Summary): dialog. (line 5) * kM: dbsearch. (line 5) * kc: dbsearch. (line 5) * km: dbsearch. (line 5) * lc (Summary): copy-msg. (line 5) * lh (Summary): spam2. (line 5) * li (Summary): copy-msg. (line 5) * ls (Summary): spam2. (line 5) * lx: off-line. (line 5) * m (Attach): mime-comp. (line 5) * m* (Summary): mark change. (line 5) * m$ (Summary): mark change. (line 5) * m*: escape mark. (line 5) * m$: escape mark. (line 5) * mI (Summary): target mark. (line 5) * mM-d (Summary): delete mark. (line 5) * mM-d (Summary): mark change. (line 5) * mM-u (Summary): mark change. (line 5) * ma (Summary): target mark. (line 5) * mc (Summary): mark change. (line 5) * md (Summary): delete mark. (line 5) * md (Summary): mark change. (line 5) * mlc (Summary): copy-msg. (line 5) * mli (Summary): copy-msg. (line 5) * mo (Summary): mark change. (line 5) * mr (Summary): target mark. (line 5) * ms (Summary): mark change. (line 5) * mt (Summary): thread. (line 5) * mxM-d (Summary): delete mark. (line 5) * mxd (Summary): delete mark. (line 5) * n (Summary): singlepart. (line 5) * o (Summary): refile mark. (line 5) * p (Attach): mime-comp. (line 5) * p (Attach): pgp-key. (line 5) * p (Summary): singlepart. (line 5) * q (Summary): Quit. (line 5) * r (Summary): resend. (line 5) * s (Summary): off-line. (line 5) * s (Summary): retrieving. (line 5) * t (Attach): mime-comp. (line 5) * t (Virtual): thread. (line 5) * t* (Virtual): thread. (line 5) * tM-d (Virtual): thread. (line 5) * tSPC (Virtual): thread. (line 5) * ta (Virtual): thread. (line 5) * td (Virtual): thread. (line 5) * tg (Virtual): thread. (line 5) * tn (Virtual): thread. (line 5) * to (Virtual): thread. (line 5) * tp (Virtual): thread. (line 5) * tr (Summary): thread. (line 5) * tt (Summary): thread. (line 5) * tu (Virtual): thread. (line 5) * u (Summary): unmark. (line 5) * v (Summary): features. (line 5) * w (Summary): Composing. (line 5) * w (Summary): sum-write. (line 5) * x (Summary): Marks. (line 5) * x (Summary): delete mark. (line 5) * x (Summary): unmark. (line 5) * y (Attach): mime-comp. (line 5) * y (Summary): features. (line 5) * z8 (Summary): status-update. (line 5) * zSPC: unread mark. (line 5) * zc (Summary): status-update. (line 5) * zd (Summary): status-update. (line 5) * zo (Summary): status-update. (line 5) * zp (Summary): status-update. (line 5) * zv (Summary): features. (line 5) * zv (Summary): status-update. (line 5) * zw (Summary): status-update. (line 5) * zz (Summary): message-mode. (line 5)  kazu-yamamoto-Mew-ff9c41b/info/mew.texi000066400000000000000000016477321256455547000202150ustar00rootroot00000000000000\input texinfo @c -*-texinfo-*- @c %**start of header @setfilename mew.ja.info @settitle Mew (Messaging in the Emacs World) @c %**end of header @clear en @clear ja @set ja @ifset ja @c Mew ã® texinfo @c Copyright (C) 1996-2015 山本和彦 @c M-x texinfo-format-buffer ã§ info ã«ã—ã¦ã­ã€‚ @end ifset @ifset en @c Texinfo for Mew @c Copyright (C) 1996-2015 Kazuhiko Yamamoto @c Try "M-x texinfo-format-buffer" or makeinfo to get the Info. @end ifset @set version 6.7 @set modified 2015/07/03 @set X-Mailer Mew version 6.7 on Emacs 24.4 @titlepage @sp 10 @center @title Mew @ifset ja @author Copyright @copyright{}1996-2015 山本和彦 @end ifset @ifset en @author Copyright @copyright{}1996-2015 Kazuhiko Yamamoto @end ifset @end titlepage @dircategory Message User Agent @direntry @ifset ja * Mew-J: (mew.ja.info). Messaging in the Emacs World. @end ifset @ifset en * Mew: (mew.info). Messaging in the Emacs World. @end ifset @end direntry @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Top @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @ifinfo @node Top, Overview, (dir), (dir) @ifset ja @top Mew @value{version} マニュアル @end ifset @ifset en @top Mew @value{version} Manual @end ifset @flushright @ifset ja 山本和彦 ä½œæˆ 1996/02/19 æ›´æ–° @value{modified} @end ifset @ifset en Kazu YAMAMOTO Created 1996/02/18 Modified @value{modified} @end ifset @end flushright @ifset ja ã“ã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã§ã¯ã€Mew ãƒãƒ¼ã‚¸ãƒ§ãƒ³ @value{version} ã«ã¤ã„ã¦è§£èª¬ã—ã¾ã™ã€‚ ã“ã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã®ä»–ã«ã€Mew ã«é–¢ã™ã‚‹æœ‰ç›Šãªæƒ…報㯠Mew ã®å…¬å¼ãƒ›ãƒ¼ãƒ ãƒšãƒ¼ã‚¸ (http://www.Mew.org/)ã‹ã‚‰å¾—られるã‹ã‚‚ã—れã¾ã›ã‚“。 @end ifset @ifset en This manual documents Mew version @value{version}. In addition to this manual, you may find useful information about Mew from Mew's official home page (http://www.Mew.org/). @end ifset @end ifinfo @menu @ifset ja * Overview:: ã¯ã˜ã‚ã«èª­ã‚“ã§ã­ * Viewing:: メッセージを表示ã™ã‚‹ * Composing:: メッセージを作æˆã™ã‚‹ * Marks:: 愉快ãªãƒžãƒ¼ã‚¯ãŸã¡ * Refile:: æ¥½ã€…æ•´ç†æ•´é “ * Virtual:: 仮想フォルダ * Quit:: 一休㿠* Customize:: カスタマイズ * Tips:: ã•らãªã‚‹ä¸€æ­© * Convention:: メッセージã®ä½œæ³• * Implementation:: 実装ã«ã¤ã„㦠* Avail:: 入手方法ã¨ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆ * Copyright:: 著作権ã«ã¤ã„㦠* Variable Index:: 変数索引 * Key Index:: キー索引 @end ifset @ifset en * Overview:: Read me first * Viewing:: Viewing messages * Composing:: Composing messages * Marks:: Funny marks * Refile:: Happy refiling * Virtual:: Virtual folder * Quit:: Give me a break * Customize:: Customizing Mew * Tips:: Advanced usage * Convention:: E-mail convention * Implementation:: Implementation Issues * Avail:: Availability and mailing-list * Copyright:: Copyright * Variable Index:: Variable Index * Key Index:: Key Index @end ifset @end menu @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Overview @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Overview, characteristic, Top, Top @ifset ja @chapter ã¯ã˜ã‚ã«èª­ã‚“ã§ã­ @end ifset @ifset en @chapter Read me first @end ifset @ifset ja Mew ã¨ã¯ã€ãƒ†ã‚­ã‚¹ãƒˆãƒ»ãƒ¡ãƒ¼ãƒ«ã‚„マルãƒãƒ¡ãƒ‡ã‚£ã‚¢ãƒ»ãƒ¡ãƒ¼ãƒ«(MIME)ã€ãƒ‹ãƒ¥ãƒ¼ã‚¹ã€ã‚» キュリティ機能(PGPã€S/MIMEã€SSHã€SSL)を便利ã«åˆ©ç”¨ã™ã‚‹ãŸã‚ã®ãƒ¦ãƒ¼ã‚¶ã‚¤ãƒ³ã‚¿ãƒ¼ フェイスã§ã™ã€‚æœ€æ–°ã®æ¤œç´¢ã‚µãƒ¼ãƒ“スã¨ã‚‚連動ã—ã¾ã™ã€‚ @end ifset @ifset en Mew is a user interface for text messages, multimedia messages (MIME), news articles and security functionality including PGP, S/MIME, SSH, and SSL. Also, Mew can work with the recent search services. @end ifset @ifset ja Mew 㯠「Messaging in the Emacs World〠ã®ç•¥ã§ã™ã€‚先頭㮠M ã¯å¤§æ–‡å­—ã§è¡¨ 記ã—ã€ã€Œã¿ã‚…ã†ã€ã¨èª­ã¿ã¾ã™ã€‚M ã§å§‹ã¾ã‚‹ã‹ã‚ã„らã—ã„å˜èªžã‚’é¸ã‚“ã çµæžœ Mew ã«ãªã‚Šã¾ã—ãŸã€‚決ã—ã¦æ¼«ç”»ã®é¡Œåã‚„æŸã‚¢ã‚¤ãƒ‰ãƒ«ã®æ­Œã€ã‚ã‚‹ã„ã¯ã€é–¢è¥¿ã®ä¼šç¤¾ã« å› ã‚“ã§ã„ã‚‹ã‚ã‘ã§ã¯ã‚りã¾ã›ã‚“。:p @end ifset @ifset en Mew is an acronym for "Messaging in the Emacs World". You should spell it with the first letter capitalized and pronounce it as it is (i.e. the meow of cats). When the author started programming it, he chose a cute word from his English dictionary. Thus, Mew. @end ifset @menu @ifset ja * characteristic:: Mew ã®ç‰¹é•· * Emacsen:: Emacs ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ * modes:: モード * folder convention:: フォルダã®ç¨®é¡ž * configuration:: åˆæœŸè¨­å®š * password:: パスワード * start:: èµ·å‹• @end ifset @ifset en * characteristic:: Mew's features * Emacsen:: Supported Emacs versions * modes:: Modes * folder convention:: Folder convention * configuration:: Configuration * password:: Password * start:: Starting @end ifset @end menu @c %%%%%%%%%%%%%%%%% @node characteristic, Emacsen, Overview, Overview @ifset ja @section Mew ã®ç‰¹é•· @end ifset @ifset en @section Mew's features @end ifset @ifset ja Mew ãƒãƒ¼ã‚¸ãƒ§ãƒ³ @value{version} ã®ç‰¹é•·ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en The features of Mew @value{version} are as follows: @end ifset @itemize @minus @ifset ja @item è¤‡é›‘ãªæ§‹é€ ã‚’æŒã¤ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç°¡å˜ã«è¡¨ç¤ºã§ãã¾ã™ã€‚メッセージを表示ã™ã‚‹ä½œ 業ã¯ã€@samp{SPC} を押ã™ã ã‘ã§ã™ã€‚ @item コピー程度ã®ãƒ•ã‚¡ã‚¤ãƒ«ã®æ“作を知ã£ã¦ã„る人ãªã‚‰ã ã‚Œã§ã‚‚ç°¡å˜ã«è¤‡é›‘ãªãƒ¡ãƒƒã‚»ãƒ¼ ジを作æˆã§ãã¾ã™ã€‚ @item メッセージã®ä¸€è¦§è¡¨ç¤ºãŒçµ‚了ã™ã‚‹ã¾ã§å¾…ãŸãªãã¦ã‚‚ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読ã¿å§‹ã‚ら れã¾ã™ã€‚ @item Summary モードã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸€è¦§ã‚’ä¿å­˜ã—ã¦ã„ã‚‹ã®ã§ã€ãƒ•ォルダを移動ã—㟠場åˆã¯ã€æ›´æ–°ã•れãŸéƒ¨åˆ†ã ã‘を一覧表示ã—ã¾ã™ã€‚ @item ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æ•´é “å…ˆã‚’è³¢ãæŽ¨æ¸¬ã—ã¾ã™ã€‚ãŸãã•んメッセージをå—ã‘å–る人ã¯ã€ ã“れãŒãªã„ã¨ç”Ÿãã¦ã„ã‘ã¾ã›ã‚“。 @item Draft モードã§ã¯ã€ãƒ•ィールドåã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã€æ°åã€ãƒ‰ãƒ¡ã‚¤ãƒ³åã€ãƒ•ã‚© ルダåを補完ã§ãã¾ã™ã€‚ @item キーワードãªã©ã«ã‚ˆã£ã¦ã€æŽ¢ã—ãŸã„メッセージを簡å˜ã«æ¤œç´¢ã§ãã¾ã™ã€‚ @item PGP ã‚„ S/MIME ã§æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’自動的ã«å¾©å·åŒ–ã—ã¾ã™ã€‚ã¾ãŸã€é›» å­ç½²åã‚’è‡ªå‹•çš„ã«æ¤œè¨¼ã—ã¾ã™ã€‚ @item MIME ã®æ§‹é€ ã‚’è§£æžã—ãŸã‚Šã€PGP ã‚„ S/MIME ã®ç½²åを検証ã—ãŸã‚Šã™ã‚‹ã®ã«ã¯å°‘㗠時間ãŒã‹ã‹ã‚Šã¾ã™ã€‚ãã“ã§ã€ãƒ¦ãƒ¼ã‚¶ãŒã‚るメッセージを読んã§ã„ã‚‹é–“ã«ã€æ¬¡ã® メッセージをã‚らã‹ã˜ã‚処ç†ã—ã¦ãŠãã“ã¨ã§é«˜é€Ÿæ€§ã‚’実ç¾ã—ã¦ã„ã¾ã™ã€‚è§£æžã• れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã—ã°ã‚‰ãã®é–“ä¿å­˜ã•れã¾ã™ã€‚ @item PGP ã‚„ S/MIME を使ã£ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç°¡å˜ã«æš—å·åŒ–ã—ãŸã‚Šã€ç½²åã—ãŸã‚Šã§ã ã¾ã™ã€‚ @item 複数ã®ãƒ•ォルダを 1 ã¤ã®ãƒ•ォルダã«è¦‹ã›ã‹ã‘られã¾ã™ã€‚ @item メッセージã®ã‚„りå–ã‚Šã®æµã‚Œã‚’å¯è¦–化ã™ã‚‹ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã‚„ã‚¹ãƒ¬ãƒƒãƒ‰ã®æ©Ÿèƒ½ã‚’å‚™ ãˆã¦ã„ã¾ã™ã€‚特定ã®ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã‚’作り〠ã•らã«ãã®ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’作æˆã§ãã¾ã™ã€‚ @item フォルダåを入力ã™ã‚‹å ´åˆã€ãƒ•ォルダåã®ä¸€éƒ¨ã‚’キーã¨ã—ã¦æ¤œç´¢ã§ãã¾ã™ã€‚ @end ifset @ifset en @item You can easily display a very complicated structured message. What you should do to view messages is just type @samp{SPC}. @item If you know how to do file operations such as copy, you can compose a very complicated message without any difficulty. @item You can start to read messages before they are all fully listed. @item Since Mew preserves lists of messages in Summary mode, when you move messages to a new folder, they will automatically be listed incrementally. @item Mew neatly suggests default folders for refiling. Those who receive many messages cannot live without this feature. @item In Draft mode, you can complete field names, e-mail addresses, receiver's names, domain names, and folder names. @item You can easily search messages with keywords etc. @item Mew automatically decodes messages encrypted with PGP or S/MIME. It also automatically verifies signed messages. @item You can easily encrypt or sign a message with PGP or S/MIME. @item It takes a bit of time to analyze MIME syntax or to verify a PGP or S/MIME signature. While the user is reading a message, Mew processes the next message so that the next message can be displayed faster. Analyzed messages are cached briefly. @item You can view multiple folders simultaneously. @item Selection/Thread, a mechanism to display the flow of messages, is supported. You can make Selection from messages matched to a keyword and make Thread from the Selection. @item When you input a folder name, you can search it with a substring of the name. @end ifset @end itemize @c %%%%%%%%%%%%%%%%% @node Emacsen, modes, characteristic, Overview @ifset ja @section Emacs ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ @end ifset @ifset en @section Supported Emacs versions @end ifset @ifset ja Emacs 22.3 以é™ã‚’使ã£ã¦ä¸‹ã•ã„。ã“れらよりå‰ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚„ XEmacs ã¯ã€ã‚µ ãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。 @end ifset @ifset en Please use Emacs 22.3 or later. Mew doesn't support earlier versions nor XEmacs. @end ifset @c %%%%%%%%%%%%%%%%% @node modes, folder convention, Emacsen, Overview @ifset ja @section モード @end ifset @ifset en @section Modes @end ifset @ifset ja Mew ã«ã¯æ¬¡ã® 7 ã¤ã®ãƒ¢ãƒ¼ãƒ‰ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en Mew has the following seven modes: @end ifset @table @samp @ifset ja @item Summary モード メッセージã®ä¸€è¦§ã‚’表示ã—é¸æŠžã™ã‚‹ãƒ¢ãƒ¼ãƒ‰ã€‚ @item Virtual モード å˜æ•°ã‚ã‚‹ã„ã¯è¤‡æ•°ã®ãƒ•ォルダã‹ã‚‰ã‚ã‚‹æ¡ä»¶ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–り出ã—〠仮想的㫠1 ã¤ã®ãƒ•ォルダã«ã—ãŸãƒ¢ãƒ¼ãƒ‰ã€‚Summary モードã«ä¼¼ã¦ã„る。 セレクションやスレッドã¨å‘¼ã°ã‚Œã‚‹ã€‚ @item Message モード メッセージã®å†…容を表示ã™ã‚‹ãƒ¢ãƒ¼ãƒ‰ã€‚ @item Draft モード メッセージã®é€ä¿¡ã€è¿”ç­”ã€è»¢é€ã‚’準備ã™ã‚‹ãŸã‚ã®ãƒ¢ãƒ¼ãƒ‰ã€‚ @item Header モード 既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ˜ãƒƒãƒ€ã®ã¿ã‚’編集ã—é€ä¿¡ã™ã‚‹ãŸã‚ã®ãƒ¢ãƒ¼ãƒ‰ã€‚ @item Edit モード 既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’編集ã—ã€æ–°ã—ã„メッセージを作æˆã™ã‚‹ãŸã‚ã®ãƒ¢ãƒ¼ãƒ‰ã€‚ @item Addrbook モード アドレス帳ã«ã‚¨ãƒ³ãƒˆãƒªã‚’登録ã™ã‚‹ãŸã‚ã®ãƒ¢ãƒ¼ãƒ‰ã€‚ @end ifset @ifset en @item Summary mode A mode to list and select messages. @item Virtual mode A mode to list messages selected with a specific condition from one or more folders. This is similar to Summary mode. This mode is categorized to Selection or Thread. @item Message mode A mode to display the content of a message. @item Draft mode A mode to prepare a message to be sent, answered, and forwarded. @item Header mode A mode to edit the header of a message and to send it. @item Edit mode A mode to edit a message to generate another new message. @item Addrbook mode A mode to register an entry to the address book (Addrbook). @end ifset @end table @c %%%%%%%%%%%%%%%%% @node folder convention, configuration, modes, Overview @ifset ja @section フォルダã®ç¨®é¡ž @end ifset @ifset en @section Folder convention @end ifset @ifset ja Mew ã®ç”¨èªžã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå±Šã場所を「メールボックスã€ã¨å‘¼ã³ã¾ã™ã€‚メー ルボックスã®ç¨®é¡žã¨ã—ã¦ã¯ã€ãƒ­ãƒ¼ã‚«ãƒ«ã®ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã€POP サーãƒã€IMAP サー ãƒã€ãŠã‚ˆã³ NNTP サーãƒãŒã‚りã¾ã™ã€‚ @end ifset @ifset en With Mew's terminology, a place where messages are deliver is called 'mailbox'. There are three kinds of mailbox: local, POP server, IMAP server, and NNTP server. @end ifset @ifset ja ã¾ãŸã€Mew 自身ãŒãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ ¼ç´ã™ã‚‹ç®±ã®ã“ã¨ã‚’「フォルダã€ã¨å‘¼ã³ã¾ã™ã€‚ フォルダåã¯ã€ä¸€æ–‡å­—ã®è¨˜å·ã‹ã‚‰ãªã‚‹ä¿®é£¾å­ã¨æ–‡å­—列ãŒé€£çµã•れãŸå½¢å¼ã«ãªã£ ã¦ã„ã¾ã™ã€‚ãŸã¨ãˆã°ã€ã€Œ+inboxã€ã¨ã„ã†ãƒ•ォルダã®ä¿®é£¾å­ã¯ã€Œ+ã€ã§ã™ã€‚ @end ifset @ifset en A box which contains messages used by Mew is called "folder". The name of a folder is in the format that "proto" is followed by a string, where "proto" is one sign letter. For example, the proto of "+inbox" is "+". @end ifset @ifset ja Mew ã®ãƒ•ォルダã«ã¯ã€ã€Œãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダã€ã¨ã€Œãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダã€ã® 2 種 類ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en Mew's folders are categorized to two types: "local folder" and "remote folder". @end ifset @ifset ja ローカル・フォルダã¨ã¯ã€Mew ãŒå‹•ã„ã¦ã„るコンピュータã«ã€Œæœ¬ç‰©ã€ãŒä½œã‚‰ã‚Œ るフォルダã§ã™ã€‚ãã®ãƒ•ã‚©ãƒ«ãƒ€ã«æ ¼ç´ã•れるメッセージも本物ã§ã™ã€‚(ã§ã™ã‹ã‚‰ã€ ã‚‚ã—ãã®ãƒ•ォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’消ã—ã¦ã—ã¾ã†ã¨å¾©å…ƒã§ãã¾ã›ã‚“。) @end ifset @ifset en A local folder is a folder which is *original* and is created the computer on which Mew is running. Also, messages stored in the folder are *original*. (So, if you remove them, you cannot revive them.) @end ifset @ifset ja ローカル・フォルダã®ä¿®é£¾å­ã¯ "+" ã§ã™ã€‚以下ã«ç‰¹æ®Šãªãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダを 挙ã’ã¾ã™ã€‚ @end ifset @ifset en The proto of a local folder is "+". We summarize special local folders as follows: @end ifset @table @samp @ifset ja @item +inbox ローカルã®ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã‚„ POP サーãƒã«å±Šã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã€ãƒ­ãƒ¼ã‚«ãƒ«ã«ç§» å‹•ã•ã›ã¦æœ€åˆã«ä¿å­˜ã™ã‚‹ãŸã‚ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダ。メッセージを整ç†ã™ã‚‹å ´ åˆã¯ã€"+inbox" ã‹ã‚‰ä»–ã®ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダã«ç§»å‹•ã•ã›ã‚‹ã“ã¨ã«ãªã‚‹ã€‚ @item +draft 書ãã‹ã‘ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ä¿å­˜ã—ã¦ãŠãローカル・フォルダ。 @item +queue 書ã終ã£ã¦ãƒ¡ãƒ¼ãƒ«ã®é…é€ã«é©ã—ãŸæ›¸å¼ã«å¤‰æ›ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæºœã‚‹ãƒ­ãƒ¼ã‚«ãƒ«ãƒ» フォルダ。"+queue" ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã„ãšã‚Œ SMTP ã«ã‚ˆã£ã¦é€ä¿¡ã•る。 @item +postq 書ã終ã£ã¦ãƒ‹ãƒ¥ãƒ¼ã‚¹ã«æŠ•稿ã™ã‚‹ã®ã«é©ã—ãŸæ›¸å¼ã«å¤‰æ›ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæºœã‚‹ ローカル・フォルダ。"+postq" ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã„ãšã‚Œ NNTP ã«ã‚ˆã£ã¦é€ä¿¡ã• れる。 @end ifset @ifset en @item +inbox The first local folder to store messages which you fetch from your local mailbox or your POP server. To refile messages, what you do is to move the messages from "+inbox" to other folders. @item +draft A local folder where messages, which you have not completed yet, are stored. @item +queue A local folder where e-mail messages to be sent are stored. The messages in "+queue" will be eventually sent by SMTP. @item +postq A local folder where NetNews message to be sent are stored. The messages in "+postq" will be eventually sent by NNTP. @end ifset @end table @ifset ja リモート・フォルダã¨ã¯ã€ã‚µãƒ¼ãƒå´ã«ã‚るフォルダをローカルã«ã‚³ãƒ”ーã—ãŸã‚‚ ã®ã§ã™ã€‚本物ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã‚ãã¾ã§ã‚µãƒ¼ãƒå´ã«ã‚りã€ãƒ­ãƒ¼ã‚«ãƒ«ã«ã¯ãƒ¡ãƒƒã‚»ãƒ¼ ジã®ã‚³ãƒ”ーãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れã¾ã™ã€‚ @end ifset @ifset en A remote folder is a COPY whose original is on a server side. A message in a remote folder is a cache which is copied from the server. @end ifset @ifset ja 利用ã§ãるリモート・フォルダã®ä¿®é£¾å­ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en Here are a list of available proto of remote folders: @end ifset @table @samp @ifset ja @item % IMAP ã®ãƒ•ォルダ。例:"%inbox" @item $ POP サーãƒã®ã‚µãƒ¼ãƒå´ã®ãƒ•ォルダ。例:"$inbox" (POP サーãƒã®ãƒ•ォルダ㯠1 ã¤ã—ã‹ãªã„ã®ã§ã€"$" ã§å§‹ã¾ã‚‹ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダ㯠"$inbox" ã®ã¿ã€‚) @item - ニュースã®ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚°ãƒ«ãƒ¼ãƒ—。例:"-fj.mail.reader.mew" @end ifset @ifset en @item % Folders on an IMAP servers. Example: "%inbox" @item $ The folder on a POP server. Example: "$inbox" (Since there is only one folder in a POP server, "$inbox" is the only folder whose name starts with "$".) @item - Newsgroups of NetNews. Example: "-fj.mail.reader.mew" @end ifset @end table @ifset ja サーãƒãŒç•°ãªã‚Œã°ã€ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダã®å®Ÿä½“ã‚‚ç•°ãªã‚Šã¾ã™ã€‚複数ã®ã‚µãƒ¼ãƒã¯ã€ ケースã¨ã„ã†æ©Ÿèƒ½ã‚’使ã£ã¦æŒ‡å®šã—ã¾ã™ã€‚詳ã—ãã¯ã€@xref{config} ã‚’å‚ç…§ã—㦠下ã•ã„。ã‚るケースã«å¯¾ã™ã‚‹ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダã¯ã€"case:folder" ã®ã‚ˆã†ã«ã€ フォルダåã®å‰ã«ã‚±ãƒ¼ã‚¹åを付ã‘ã¦æŒ‡å®šã—ã¾ã™ã€‚ケース㌠"default" ã§ã‚ã‚‹å ´ åˆã¯ã€"case:" ã®éƒ¨åˆ†ã‚’çœç•¥å¯èƒ½ã§ã™ã€‚ @end ifset @ifset en If you use several servers, there are multiple sets of remote folders. You can specify several servers by using "case". For more information about the "case", see @ref{config}. To specify a remote folder corresponding to a "case", you should write "case:folder". You can omit "case:" if a case is "default". @end ifset @ifset ja ケースã¨ä¿®é£¾å­ã®çµ„ã¯ã€ã‚るメッセージãŒå±žã™ä¸–界を構æˆã—ã¦ã„ã¾ã™ã€‚メッセー ジã¯ã€ãれãŒå±žã™ä¸–界ã®ä¸­ã‚’移動ã§ãã¾ã™ã€‚å—ã‘å–ã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€å¾Œã§æŽ¢ ã—ã‚„ã™ã„よã†ã«ã€é©åˆ‡ãªãƒ•ォルダã«ç§»å‹•ã•ã›ã¦ä¿å­˜ã—ã¾ã™ã€‚ã“ã®æ•´é “ã®æ–¹æ³•ã« ã¤ã„ã¦ã€@xref{Refile} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en A combination of "case" and proto organized a world to which a message belongs. A message can move within its world. To make it easy to search received messages afterward, they should be moved to proper folders. To know how to refile received messages, see @ref{Refile}. @end ifset @ifset ja ãªãŠã€POP サーãƒã«ã¯ "$inbox" ã¨ã„ã†ãƒ•ォルダã—ã‹ã‚りã¾ã›ã‚“ã‹ã‚‰ã€"$" 㮠世界ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’移動ã•ã›ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。ã¾ãŸã€ãƒ‹ãƒ¥ãƒ¼ã‚¹ã®è¨˜äº‹ã¯è‡ª 分ã®ã‚‚ã®ã§ã¯ã‚りã¾ã›ã‚“ã‹ã‚‰ã€"-" ã®ä¸–界ã§ã‚‚メッセージã®ç§»å‹•ã¯ä¸å¯èƒ½ã§ã™ã€‚ @end ifset @ifset en You cannot move a message in the "$" world because there is only one folder, "$inbox". You cannot move a message in the "-" world either since messages in the "-" world are not yours. @end ifset @ifset ja 世界を超ãˆã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’移動ã•ã›ãŸã„å ´åˆã¯ã€ã‚³ãƒ”ーã—ã¾ã™ã€‚ãŸã ã—ã€ã‚³ãƒ”ー å…ˆã¯ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダã«é™å®šã•れã¾ã™ã€‚ã“ã®æ–¹æ³•ã¯ã€@xref{retrieving} ã§èª¬ 明ã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en If you want to move a message from one world to another, you should COPY it. Its destination is restricted to a local folder. This method is described in @ref{retrieving}. @end ifset @ifset ja フォルダã®ãƒªã‚¹ãƒˆã‚’作æˆã—ã¦ãŠãã¨ã€ãƒ•ォルダåã«å¯¾ã—補完ãŒåˆ©ç”¨ã§ãã¦ä¾¿åˆ© ã§ã™ã€‚フォルダã®ãƒªã‚¹ãƒˆã‚’作æˆã™ã‚‹æ–¹æ³•ã¯ã€@xref{status-update} ã‚’å‚ç…§ã—㦠下ã•ã„。 @end ifset @ifset en If you make a list of folders, you can use the completion functionality for folders. To know how to make a list of folders, please refer to @ref{status-update}. @end ifset @c %%%%%%%%%%%%%%%%% @node configuration, password, folder convention, Overview @ifset ja @section åˆæœŸè¨­å®š @end ifset @ifset en @section Configuration @end ifset @vindex read-mail-command @vindex mail-user-agent @vindex mew-name @vindex mew-user @vindex mew-smtp-server @vindex mew-pop-user @vindex mew-mailbox-type @vindex mew-mbox-command @vindex mew-mbox-command-arg @vindex mew-proto @vindex mew-imap-server @vindex mew-nntp-server @ifset ja Mew ã‚’èµ·å‹•ã™ã‚‹ã«ã¯ã€çµ„ç¹”ã®è¨­å®šãƒ•ァイルã‹è‡ªåˆ†ã® "~/.emacs" ã«ä»¥ä¸‹ã®è¨­å®š ãŒå¿…è¦ã§ã™ã€‚ @end ifset @ifset en To execute Mew, the followings are necessary either in the site configuration file or in your "~/.emacs". @end ifset @lisp (autoload 'mew "mew" nil t) (autoload 'mew-send "mew" nil t) ;; Optional setup (Read Mail menu): (setq read-mail-command 'mew) ;; Optional setup (e.g. C-xm for sending a message): (autoload 'mew-user-agent-compose "mew" nil t) (if (boundp 'mail-user-agent) (setq mail-user-agent 'mew-user-agent)) (if (fboundp 'define-mail-user-agent) (define-mail-user-agent 'mew-user-agent 'mew-user-agent-compose 'mew-draft-send-message 'mew-draft-kill 'mew-send-hook)) @end lisp @ifset ja Latin-1 ã®ãŸã‚ã«ã€Emacs ã‚’ --unibyte オプション付ã§èµ·å‹•ã—ã¦ã„ã‚‹ã‹ã€ç’°å¢ƒ 変数 EMACS_UNIBYTE ã¨å…±ã«èµ·å‹•ã—ã¦ã„ã‚‹å ´åˆã€ä»¥ä¸‹ã®è¨­å®šã‚’ "~/.emacs" ã«å…¥ れã¦ä¸‹ã•ã„。 @end ifset @ifset en If you are using Emacs with the --unibyte option or the EMACS_UNIBYTE environment variable for Latin-1, put the following into your @w{"}~/.emacs". @end ifset @lisp (set-language-environment "Latin-1") (set-input-method "latin-1-prefix") ;; or "latin-1-postfix" @end lisp @ifset ja Latin-1 ã®ãŸã‚ã«ã€ä»¥ä¸‹ã®ã‚ˆã†ãªè¨­å®šã‚’ã—ã¦ã„ã‚‹ãªã‚‰ã€å‰Šã£ã¦ä¸‹ã•ã„。ã“れ㯠Latin-1 ã«ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã™ã‚‹ãŸã‚ã®æ–¹æ³•ã¨ã—ã¦ã¯æŽ¨å¥¨ã•れã¦ã„ã¾ã›ã‚“ã—ã€ã“㮠設定ã§ã¯ Mew ã¯æ­£ã—ãå‹•ãã¾ã›ã‚“。 @end ifset @ifset en If you use the following configuration for Latin-1, please remove it. This is an obsolete handling of Latin-1 that can cause Mew to function incorrectly. @end ifset @lisp (standard-display-european 1) @end lisp @ifset ja Mew ã¯èµ·å‹•時ã«ã€"~/.mew.el" を読ã¿è¾¼ã¿ã¾ã™ã€‚Mew ã«é–¢ã™ã‚‹è¨­å®šã¯ã€ã“ã®ãƒ•ã‚¡ イルã«å…¥ã‚Œã‚‹ã¨ã‚ˆã„ã§ã—ょã†ã€‚ @end ifset @ifset en When booting, Mew reads the file "~/.mew.el". All Mew configurations should be written in this file. @end ifset @ifset ja メールアドレスを指定ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã®è¨­å®šãŒå¿…è¦ã§ã™ã€‚ @end ifset @ifset en To configure your e-mail address, the followings are necessary. @end ifset @lisp ;; (setq mew-name "your name") ;; (user-full-name) ;; (setq mew-user "user name of e-mail address") ;; (user-login-name) (setq mew-mail-domain "domain of e-mail address") @end lisp @ifset ja SMTP を使ã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã«ã¯ã€ä»¥ä¸‹ã®è¨­å®šãŒå¿…è¦ã§ã™ã€‚ @end ifset @ifset en To send e-mail messages by SMTP, the following is necessary. @end ifset @lisp (setq mew-smtp-server "your SMTP server") ;; if not localhost @end lisp @ifset ja POP を使ã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã™ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šãŒå¿…è¦ã§ã™ã€‚ @end ifset @ifset en If you want to use POP to receive e-mail messages, the followings are necessary. @end ifset @lisp ;; (setq mew-pop-user "your POP account") ;; (user-login-name) (setq mew-pop-server "your POP server") ;; if not localhost @end lisp @ifset ja メッセージã®å—ä¿¡ã«ãƒ­ãƒ¼ã‚«ãƒ«ã®ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã‚’利用ã—ãŸã„å ´åˆã¯ã€ä»¥ä¸‹ã®ã‚ˆ ã†ãªè¨­å®šãŒå¿…è¦ã§ã™ã€‚ @end ifset @ifset en If you want to use a local mailbox to receive e-mail messages, the followings are necessary. @end ifset @lisp ;; To use local mailbox "mbox" or "maildir" instead of POP (setq mew-mailbox-type 'mbox) (setq mew-mbox-command "incm") (setq mew-mbox-command-arg "-u -d /path/to/mbox") ;; If /path/to/mbox is a file, it means "mbox". ;; If /path/to/mbox is a directory, it means "maildir". @end lisp @ifset ja IMAP を使ã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã™ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šãŒå¿…è¦ã§ã™ã€‚ @end ifset @ifset en If you want to use IMAP to receive e-mail messages, the followings are necessary. @end ifset @lisp (setq mew-proto "%") ;; (setq mew-imap-user "your IMAP account") ;; (user-login-name) (setq mew-imap-server "your IMAP server") ;; if not localhost @end lisp @ifset ja ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’èª­ã¿æ›¸ãã™ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šãŒå¿…è¦ã§ã™ã€‚ @end ifset @ifset en To read and/or write articles of NetNews, the followings are necessary. @end ifset @lisp ;; (setq mew-nntp-user "your NNTP account") (setq mew-nntp-server "your NNTP server") @end lisp @c %%%%%%%%%%%%%%%%% @node password, start, configuration, Overview @ifset ja @section パスワード @end ifset @ifset en @section Password @end ifset @vindex mew-use-cached-passwd @vindex mew-use-master-passwd @ifset ja メッセージをé€å—ä¿¡ã—ãŸã‚Šã€PGP ã‚„ S/MIME を使ã£ãŸã‚Šã™ã‚‹å ´åˆã«ã¯ã€ãƒ‘スワー ドを訊ã‹ã‚Œã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚パスワードを入力ã™ã‚‹å‰ã«ä»¥ä¸‹ã®æ¡ä»¶ã®ã©ã¡ã‚‰ ã‹ãŒæº€ãŸã•れã¦ã„ã‚‹ã“ã¨ã‚’確èªã—ã¾ã—ょã†ã€‚ @itemize @minus @item Emacs ãŒç›®ã®å‰ã®ã‚³ãƒ³ãƒ”ュータã§å‹•ã„ã¦ã„ã‚‹ @item Emacs ãŒé éš”ã®ã‚³ãƒ³ãƒ”ュータã§å‹•ã„ã¦ã„ã‚‹ãŒã€ãªã‚“らã‹ã®æš—å·æ‰‹æ®µã‚’使ã£ã¦é€šä¿¡ ã—ã¦ã„る。 @end itemize ã©ã¡ã‚‰ã®æ¡ä»¶ã‚‚満ãŸã•れãªã„å ´åˆã¯ã€ãƒ‘スワードを入力ã—ãªã„ã§ä¸‹ã•ã„。入力㙠るã¨ç›—è´ã•れるæã‚ŒãŒã‚りã¾ã™ã€‚ @end ifset @ifset en When fetching/sending messages or using PGP or S/MIME, you may be required to input your password. Before you type your password, check carefully to see if either the following conditions is satisfied: @itemize @minus @item Emacs is running on a local computer @item Emacs is running on a remote computer, but an encryption mechanism is being used for communication. @end itemize If neither of these conditions are satisfied, do not input a password. Your password could be accessed without your knowledge. @end ifset @ifset ja パスワードを何回も入力ã™ã‚‹ã®ãŒé¢å€’ãªäººã¯ã€ãƒ‘スワードをä¿å­˜ã™ã‚‹æ©Ÿèƒ½ã‚’利用 ã—ã¦ä¸‹ã•ã„。2 ã¤ã®æ–¹æ³•ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en If you get sick of inputting your password from time to time, please use one of two password-cache mechanisms. @end ifset @enumerate @ifset ja @item パスワードをメモリã«ä¸€æ™‚çš„ã«è“„ãˆã‚‹ã€‚ファイルã«ã¯æ›¸ã出ã•ãªã„。 @item パスワードをメモリ㫠Mew ãŒèµ·å‹•ã—ã¦ã„る間中蓄ãˆã‚‹ã€‚Mew/Emacs ã®çµ‚了時ã«ã€ パスワードを暗å·åŒ–ã—ãƒ•ã‚¡ã‚¤ãƒ«ã«æ›¸ã出ã™ã€‚ @end ifset @ifset en @item Storing passwords in memory temporarily. Not writing them to a file. @item Storing passwords in memory while Mew is running. When Mew/Emacs quits, Mew encrypts the passwords and writes them to a file. @end ifset @end enumerate @ifset ja 1. ã®æ©Ÿèƒ½ã‚’利用ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¾ã™ã€‚ @end ifset @ifset en To use Feature 1., configure as follows: @end ifset @lisp (setq mew-use-cached-passwd t) @end lisp @ifset ja 2. ã®æ©Ÿèƒ½ã‚’利用ã™ã‚‹ã«ã¯ã€GnuPG をインストールã—ãŸå¾Œã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã— ã¾ã™ã€‚(GnuPG ã¯ã€ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1.xã€2.0ã€2.1ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚) @end ifset @ifset en To use Feature 2., after installing GnuPG, configure as follows (GnuPG version 1.x, 2.0 and 2.1 are supported for this feature): @end ifset @lisp (setq mew-use-master-passwd t) @end lisp @ifset ja 両方ã®å¤‰æ•°ãŒ @samp{t} ã®å ´åˆã€2. ã®æ©Ÿèƒ½ãŒåˆ©ç”¨ã•れã¾ã™ã€‚ @end ifset @ifset en If both variables are @samp{t}, the feature 2. is used. @end ifset @ifset ja 1. ã®æ©Ÿèƒ½ï¼šã‚らゆるパスワード(POPã€PGP ãªã©)ãŒä¸€æ™‚çš„ã«ãƒ¡ãƒ¢ãƒªã«ä¿å­˜ã•れ ã¾ã™ã€‚パスワードãŒä¿å­˜ã•れã¦ã„ã‚‹é–“ã¯ã€ãƒ‘スワードã®å…¥åŠ›ã‚’çœç•¥ã§ãã¾ã™ã€‚ ä¿å­˜ã•れã¦ã„るパスワードã¯ä¸€å®šæ™‚é–“(通常㯠20 分)ãŒéŽãŽã‚‹ã¨æ¶ˆåŽ»ã•れã¾ã™ã€‚ ãŸã ã—ã€ä¿å­˜ã•れã¦ã„るパスワードãŒå†…部ã§åˆ©ç”¨ã•れるã¨ã€ä¿å­˜æœŸé–“ãŒå»¶é•·ã• れã¾ã™(20 åˆ†ã«æˆ»ã‚Šã¾ã™)。 @end ifset @ifset en Feature 1.: Any passwords including POP and PGP are cached in memory. While a password is cached, you can omit to input the password. The cached password will expire after a certain period (20 minutes by default). However, its timer is cleared (reset to 20 minutes) if the password is used internally. @end ifset @ifset ja 2. ã®æ©Ÿèƒ½ï¼šMew ã®èµ·å‹•時ã«ã€ãƒžã‚¹ã‚¿ãƒ¼ãƒ‘スワードを訊ã‹ã‚Œã¾ã™ã€‚Mew ã¯ãã®ãƒž スターパスワードã§ã€æš—å·åŒ–ã•れã¦ã„るパスワードを復å·åŒ–ã—ã€ãƒ¡ãƒ¢ãƒªã«è“„㈠ã¾ã™ã€‚ãŸã¨ãˆã°ã€ä»¥å‰ POP ã®ãƒ‘スワードを入力ã—ã¦ã„れã°ã€ãれãŒãƒ¡ãƒ¢ãƒªã«è“„ ãˆã‚‰ã‚Œã¦ã„ã¾ã™ã‹ã‚‰ã€æ¬¡ã« POP ã®ãƒ‘スワードãŒå¿…è¦ãªéš›ã€POP ã®ãƒ‘スワード㮠入力をçœç•¥ã§ãã¾ã™ã€‚ã¯ã˜ã‚ã¦ãƒžã‚¹ã‚¿ãƒ¼ãƒ‘スワードを利用ã™ã‚‹éš›ã¯ã€ç¢ºèªã®ãŸ ã‚マスターパスワードを 2 回訊ãã¾ã™ã€‚ã¾ãŸã€ãŸã¨ãˆã° POP ã®ãƒ‘スワードも 1 回ã ã‘入力ã™ã‚‹ã‚ˆã†ã«ä¿ƒã•れã¾ã™ã€‚Mew ã®èµ·å‹•時ã«ã€é–“é•ã£ãŸãƒžã‚¹ã‚¿ãƒ¼ãƒ‘スワー ドを入力ã™ã‚‹ã“ã¨ã‚‚ã‚ã‚‹ã§ã—ょã†ã€‚ãã®å ´åˆã€1. ã®æ©Ÿèƒ½ã‚’有効ã«ã—ã¦ã„ã‚‹ãªã‚‰ã€ 1. ã®æ©Ÿèƒ½ãŒä½¿ã‚れã¾ã™ã€‚有効ã§ãªã‘れã°ã€ãƒ‘スワードã®ä¿å­˜æ©Ÿèƒ½ã¯åˆ©ç”¨ã•れ㾠ã›ã‚“。 @end ifset @ifset en Feature 2: When Mew boots, Mew asks you to input a master password. Mew decrypts encrypted passwords in a file and caches them in memory. For instance, if you have already typed POP password, it is to be stored in memory. Thus, when the POP password is required, you can omit to input it. If you use a master password at the first time, you are asked to input it twice. When Mew boots, you might type a wrong master password. In this case, if you enabled Feature 1., it is used. Otherwise, no password-cache mechanisms is used. @end ifset @ifset ja マスターパスワードを変更ã™ã‚‹ã«ã¯ã€Summary モード㧠@samp{C-cC-m} ã¨å…¥åŠ› ã—ã¾ã™ã€‚ @end ifset @ifset en If you want to change the master password, type @samp{C-cC-m} in Summary mode. @end ifset @ifset ja メモリã«ä¿å­˜ã•れã¦ã„るパスワードã¯ã€æš—å·åŒ–ã•れã¦ã„ã¾ã›ã‚“。ãã“ã§ã€1. ã¾ ãŸã¯ 2. ã®æ–¹æ³•を使ã†å ´åˆã¯ã€ä»–ã®äººã«è‡ªåˆ†ãŒèµ·å‹•ã—㟠Emacs を触られãªã„よ ã†ã«æ°—ã‚’ã¤ã‘ã¦ä¸‹ã•ã„。もã—席を空ã‘ã€Emacs をよã知ã£ã¦ã„ã‚‹ä»–ã®äººã« Emacs ã‚’æ“作ã•れãŸå ´åˆã€ãƒ‘スワードを盗ã¿å–られるå¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en Cached passwords in memory are not encrypted. So, if you use either Feature 1. or Feature 2., you should take care so that nobody can touch your Emacs. If you leave your PC and an Emacs expert happens to check your configuration, your passwords could be stolen. @end ifset @c %%%%%%%%%%%%%%%%% @node start, Viewing, password, Overview @ifset ja @section èµ·å‹• @end ifset @ifset en @section Starting @end ifset @vindex mew-auto-get @vindex mew-proto @vindex mew-mailbox-type @vindex mail-user-agent @kindex M-x mew @kindex C-uM-x mew @kindex M-x mew-send @kindex C-xm @ifset ja Mew ã‚’èµ·å‹•ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®æ–¹æ³•ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en To start Mew, you can choose one of the following: @end ifset @table @samp @ifset ja @item M-x mew Mew ãŒèµ·å‹•ã—ã¦ã„ãªã‘れã°ã€ã¾ãš Mew ã‚’èµ·å‹•ã™ã‚‹ã€‚ãã—ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾— ã™ã‚‹ã‹ã€ã‚ã‚‹ã„ã¯å˜ã«ãƒ‡ãƒ•ォルトã®ãƒ•ォルダã¸ç§»å‹•ã™ã‚‹ã€‚ ã¾ãšã€ã€Œä¿®é£¾å­ã€ã¯ @samp{mew-proto} ã¨ã‚±ãƒ¼ã‚¹ã‹ã‚‰æ±ºå®šã•れる。 (@xref{config} ã‚’å‚ç…§) 「修飾å­ã€ãŒ @samp{+}(ローカル・フォルダ)ãªã‚‰ã€@samp{mew-mailbox-type} ã‹ã‚‰ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ãŒæ±ºå®šã•れる。(@xref{retrieving} ã‚’å‚ç…§) ãã®ä»–ã€ã™ãª ã‚ã¡ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダãªã‚‰ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹ãŸã‚ã®ãƒ—ロトコルãŒä¿®é£¾å­ ã«å¿œã˜ã¦æ±ºã‚‹ã€‚ @samp{mew-auto-get} ㌠@samp{t} ãªã‚‰ã€åˆ°ç€ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒéžåŒæœŸã«å–得㕠れã€Summary モードã¸ä¸€è¦§è¡¨ç¤ºã•れる。 @samp{mew-auto-get} ㌠@samp{nil} ãªã‚‰ã€ä¿®é£¾å­ã«ã‚ˆã£ã¦æ±ºå®šã—ãŸãƒ‡ãƒ•ォルト ã®ãƒ•ォルダã¸å˜ã«ç§»å‹•ã™ã‚‹ã€‚ @item C-uM-x mew @samp{mew-auto-get} ã®å€¤ã‚’逆ã ã¨è€ƒãˆã¦ã€@samp{M-x mew} を実行ã™ã‚‹ã€‚ @item C-xm @samp{mail-user-agent} ãŒè¨­å®šã•れã¦ã„ã‚‹å ´åˆã€Draft モードã¸ç§»è¡Œã™ã‚‹ã€‚ @end ifset @ifset en @item M-x mew Execute Mew first unless Mew is running. And retrieve arrived messages or just visit to the default folder. @samp{proto} is determined by @samp{mew-proto} and the "case" (see @ref{config}). If @samp{proto} is @samp{+} (i.e. a local folder), a mailbox is determined according to @samp{mew-mailbox-type} (see @ref{retrieving}). Otherwise (i.e. a remote folder), an appropriate protocol to retrieve messages is chosen according to @samp{proto}. If @samp{mew-auto-get} is @samp{t}, arrived messages are asynchronously fetched and listed up in Summary mode. @samp{mew-auto-get} is @samp{nil}, just visit to the folder determined by @samp{proto}. @item C-uM-x mew Perform @samp{M-x mew} with @samp{mew-auto-get} reversed. @item M-x mew-send Enter Draft mode for message composing. @item C-xm Enter Draft mode for message composing if @samp{mail-user-agent} is configured. @end ifset @end table @ifset ja Emacs ã§ Mew ã‚’èµ·å‹•ã™ã‚‹ã¨å¯æ„›ã„ 2 匹ã®å­ãŒçŒ«ç¾ã‚Œã¾ã™ã€‚ @end ifset @ifset en When Mew is executed on Emacs, two cute cats appear on the cover page. @end ifset @ifset ja ãªãŠã€Mew を終了ã™ã‚‹æ–¹æ³•ã¯ã€@xref{Quit} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en For the methods of quitting Mew, please refer to @ref{Quit}. @end ifset @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Viewing @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Viewing, singlepart, start, Top @ifset ja @chapter メッセージを表示ã™ã‚‹ @end ifset @ifset en @chapter Viewing messages @end ifset @kindex M-x mew @ifset ja (Mew ãŒèµ·å‹•中ã§ã‚‚ã€èµ·å‹•中ã§ã¯ãªãã¦ã‚‚) @samp{M-x mew} ã¨å…¥åŠ›ã™ã‚‹ã¨ã€Mew ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’以下ã®ã‚ˆã†ã«ä¸€è¦§è¡¨ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en If you input @samp{M-x mew} (regardless Mew is running or not), Mew displays a list of message like this: @end ifset @example @ifset ja * 03/12 Hidenori Ohta 今週末 |日曜ã«ã‚¹ãƒˆãƒ¼ãƒ³ãƒžã‚¸ãƒƒã‚¯ M03/14 ã‚‚ã‚‚ã¡ã‚ƒã‚“ 能登ã®å†™çœŸ |ã“ã®å‰æ’®ã£ãŸå†™çœŸã‚’添付 03/15 Neat Sumikawa Re: ワイン |ã˜ã‚ƒãã€æ°´æ›œæ—¥ã«ä¾‹ã®åº— @end ifset @ifset en * 03/12 Hidenori Ohta This weekend |Let's go to StoneMagic M03/14 Momo-chan The pictures of Noto |Attached are the pictu 03/15 Neat Sumikawa Re: wine |OK. I vote for Wednesd @end ifset @end example @ifset ja ã“れを Summary モードã¨ã„ã„ã¾ã™ã€‚ã“ã“ã§ã¯ã€ä¸»ã« Summary モードã§ã®ãƒ¡ãƒƒã‚»ãƒ¼ ジã®èª­ã¿æ–¹ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ @end ifset @ifset en This is called Summary mode. This section mainly explains how to read messages in Summary mode. @end ifset @ifset ja 上記ã®ä¾‹ã®ã‚ˆã†ã« Summary モードã¯ã€ãƒžãƒ¼ã‚¯ã€ãƒ‡ãƒ¼ã‚¿åž‹(Mew ãŒä»˜ã‘るマーク)〠日付ã€å·®å‡ºäººã€Subject:ã€æœ¬æ–‡ã‹ã‚‰æ§‹æˆã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en As you can see the example above, the format of Summary mode consists of a mark, data type (a mark by Mew), date, a sender, Subject:, and a body. @end ifset @ifset ja Summary モードを消去ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€@xref{Quit} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en For the method of terminating Summary mode, please see @ref{Quit}. @end ifset @menu @ifset ja * singlepart:: èª­ã¿æ–¹ã®åŸºç¤Ž * multipart:: MIME を表示ã™ã‚‹ * analysis:: MIME ã®è§£æžã‚’制御ã™ã‚‹ * cipher-viewing:: æš—å·ãƒ¡ãƒ¼ãƒ«ã‚„é›»å­ç½²åを表示ã™ã‚‹ * retrieving:: メッセージã®å–å¾— * moving:: フォルダã®ç§»å‹• * sum-write:: é€ä¿¡ã€è¿”ç­”ã€è»¢é€ * features:: ä¾¿åˆ©ãªæ©Ÿèƒ½ * status-update:: çŠ¶æ…‹ã®æ›´æ–° * invalid:: è¦æ ¼é•åã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ @end ifset @ifset en * singlepart:: Reading Basis * multipart:: Displaying MIME * analysis:: Controlling MIME analysis * cipher-viewing:: Visualizing cipher or signature * retrieving:: Getting messages * moving:: Moving to another folder * sum-write:: Write, answer, and forward * features:: Useful features * status-update:: Updating status * invalid:: Invalid messages @end ifset @end menu @c %%%%%%%%%%%%%%%%% @node singlepart, multipart, Viewing, Viewing @ifset ja @section èª­ã¿æ–¹ã®åŸºç¤Ž @end ifset @ifset en @section Reading Basis @end ifset @kindex SPC (Summary) @kindex C-uSPC (Summary) @kindex DEL (Summary) @kindex RET (Summary) @kindex M-RET (Summary) @kindex - (Summary) @kindex C-n (Summary) @kindex C-p (Summary) @kindex n (Summary) @kindex p (Summary) @kindex C-un (Summary) @kindex C-up (Summary) @kindex j (Summary) @kindex C-uj (Summary) @ifset ja メッセージを上ã‹ã‚‰é †ã«èª­ã‚“ã§ã„ãã®ã§ã‚れã°ã€@samp{SPC} ã‚’é©å®œæŠ¼ã™ã ã‘ã§ ã™ã€‚ç°¡å˜ã§ã—ょ? @end ifset @ifset en To read messages in the order of their arrival, type @samp{SPC} to display them. That's it. It's easy, isn't it? @end ifset @ifset ja ã—ã‹ã—ãれã ã‘ã§ã¯ã‚ã‚“ã¾ã‚Šãªã®ã§ã€ä»¥ä¸‹ã«ãƒšãƒ¼ã‚¸ã‚’æ“作ã™ã‚‹åŸºæœ¬çš„ãªã‚³ãƒžãƒ³ãƒ‰ を示ã—ã¾ã™ã€‚ @end ifset @ifset en Yet this might not be comprehensive, so the basic commands for page processing are listed as follows: @end ifset @table @samp @ifset ja @item SPC メッセージを読ã¿é€²ã‚る。ã¤ã¾ã‚Šã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã€ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã•ã›ã€ä»–㮠メッセージã«ç§»å‹•ã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚カーソルãŒç§»å‹•ã™ã‚‹æ–¹å‘ã¯ã€ @xref{summary-mode} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item C-uSPC メッセージを先頭ã‹ã‚‰å†è¡¨ç¤ºã€‚ @item DEL ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’下ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã•ã›ã‚‹ã€‚ä¸å¿…è¦ãªãƒ˜ãƒƒãƒ€ãƒ•ィールドã¯ã€ã‚¦ã‚¤ ンドウã®ä¸Šã«éš ã‚Œã¦ã„る。よã£ã¦ã€@samp{DEL} を入力ã™ã‚‹ã¨ã€ãれらãŒç¾ã‚Œã‚‹ã€‚ @item RET ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ 1 行上ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã™ã‚‹ã€‚ @item M-RET @item - ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ 1 行下ã«ã‚¹ã‚¯ãƒ­ãƒ¼ãƒ«ã™ã‚‹ã€‚ @end ifset @ifset en @item SPC Read through messages. That is, display a message, scroll it, and move-then-display another message. refer to @ref{summary-mode} to know which direction the cursor moves. @item C-uSPC Redisplay the message from its header. @item DEL Back-scroll this message. Unnecessary header fields are hidden over the window. Type @samp{DEL} to see them when a message is displayed. @item RET Make this message scroll up one line. @item M-RET @item - Make this message scroll down one line. @end ifset @end table @table @samp @ifset ja @item C-n 下ã®è¡Œã¸ç§»å‹•。 @item C-p 上ã®è¡Œã¸ç§»å‹•。 @item n 下方å‘ã«ç§»å‹•ã—表示。対象ã¨ãªã‚‹ã®ã¯ã€ãƒ‘ートã€@samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒ セージã€ãƒžãƒ¼ã‚¯ã®ä»˜ã„ã¦ã„ãªã„メッセージ。 @item C-un 下方å‘ã«ç§»å‹•ã—表示。対象ã¨ãªã‚‹ã®ã¯ã€@samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€ マークã®ä»˜ã„ã¦ã„ãªã„メッセージ。 @item p 上方å‘ã«ç§»å‹•ã—表示。対象ã¨ãªã‚‹ã®ã¯ã€ãƒ‘ートã€@samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒ セージã€ãƒžãƒ¼ã‚¯ã®ä»˜ã„ã¦ã„ãªã„メッセージ。 @item C-up 上方å‘ã«ç§»å‹•ã—表示。対象ã¨ãªã‚‹ã®ã¯ã€@samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€ マークã®ä»˜ã„ã¦ã„ãªã„メッセージ。 @item j 入力ã•れãŸè¡Œç•ªå·ã«å¾“ã£ã¦ãã®è¡Œã¸ç§»å‹•。 @item C-uj 入力ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ç•ªå·ã«å¾“ã£ã¦ãã®è¡Œã¸ç§»å‹•。 @end ifset @ifset en @item C-n Go to the next line. @item C-p Go to the previous line. @item n Move down then display. Targets include parts, messages marked with @samp{*}, and non-marked messages. @item C-un Move down then display. Targets include messages marked with @samp{*}, and non-marked messages. @item p Move up then display. Targets include parts, messages marked with @samp{*}, and non-marked messages. @item C-up Move up then display. Targets include messages marked with @samp{*}, and non-marked messages. @item j Jump to a line according to the line number which you input. @item C-uj Jump to a message according to the message number which you input. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node multipart, analysis, singlepart, Viewing @ifset ja @section MIME を表示ã™ã‚‹ @end ifset @ifset en @section Displaying MIME @end ifset @vindex mew-end-of-message-string @vindex mew-end-of-part-string @ifset ja マルãƒãƒ‘ートを読むã®ã¯åˆ¥ã«å¤§å¤‰ãªã“ã¨ã§ã¯ã‚りã¾ã›ã‚“。今ã¾ã§é€šã‚Šã€ @samp{SPC} を押ã—ã¦ã„ã‘ã°ã‚ˆã„ã ã‘ã§ã™ã€‚ @end ifset @ifset en It's not difficult to read a multipart message. As usual, just type @samp{SPC}. @end ifset @ifset ja マルãƒãƒ‘ートã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«æ—¥ä»˜ã®å·¦ã« @samp{M} ã¨ã„ã†ãƒžãƒ¼ã‚¯ ãŒä»˜ã„ã¦ã„ã¾ã™ã€‚ @end ifset @ifset en A multipart message is marked with @samp{M} on the left side of date as follows: @end ifset @example @ifset ja * 03/12 Hidenori Ohta 今週末 |日曜ã«ã‚¹ãƒˆãƒ¼ãƒ³ãƒžã‚¸ãƒƒã‚¯ M03/14 ã‚‚ã‚‚ã¡ã‚ƒã‚“ 能登ã®å†™çœŸ |ã“ã®å‰æ’®ã£ãŸå†™çœŸã‚’添付 03/15 Neat Sumikawa Re: ワイン |ã˜ã‚ƒãã€æ°´æ›œæ—¥ã«ä¾‹ã®åº— @end ifset @ifset en * 03/12 Hidenori Ohta This weekend |Let's go to StoneMagic M03/14 Momo-chan The pictures of Noto |Attached are the pictu 03/15 Neat Sumikawa Re: wine |OK. I vote for Wednesd @end ifset @end example @ifset ja @samp{M} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ @samp{SPC} を押ã™ã¨ã€ãƒ˜ãƒƒãƒ€ã‚’ Message モードã«è¡¨ç¤ºã™ã‚‹ã¨å…±ã«ã€ä»¥ä¸‹ã®ã‚ˆã†ã« Summary モードã§ãƒžãƒ«ãƒãƒ‘ー ãƒˆã®æ§‹é€ ã‚’ç°¡ç´ ã«è¡¨ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en When you type @samp{SPC} on the message marked with @samp{M}, its header is displayed in Message mode. Then its multipart structure is displayed in Summary mode as follows: @end ifset @example @ifset ja * 03/12 Hidenori Ohta 今週末 |日曜ã«ã‚¹ãƒˆãƒ¼ãƒ³ãƒžã‚¸ãƒƒã‚¯ M03/14 ã‚‚ã‚‚ã¡ã‚ƒã‚“ 能登ã®å†™çœŸ |ã“ã®å‰æ’®ã£ãŸå†™çœŸã‚’添付 B 2 Image/Jpeg 写真1 noto1.jpg Q 3 Application/Postscript 能登ã®åœ°å›³ map.ps 03/15 Neat Sumikawa Re: ワイン |ã˜ã‚ƒãã€æ°´æ›œæ—¥ã«ä¾‹ã®åº— @end ifset @ifset en * 03/12 Hidenori Ohta This weekend |Let's go to StoneMagic M03/14 Momo-chan The pictures of Noto |Attached are the pictu B 2 Image/Jpeg picture 1 noto1.jpg Q 3 Application/Postscript Note map map.ps 03/15 Neat Sumikawa Re: wine |OK. I vote for Wednesd @end ifset @end example @ifset ja ã‚‚ã—ã€ãƒ‘ート 1 ㌠Text/ ãªã‚‰ã€Summary モードã«ã¯ãƒ‘ート 1 ã¯å¯è¦–化ã•れãšã€ ãã®ã‹ã‚りパート 1 ãŒãƒ˜ãƒƒãƒ€ã¨å…±ã« Message モードã«è¡¨ç¤ºã•れã¾ã™ã€‚ @end ifset @ifset en If the first part is Text/, the first part is not displayed in Summary mode but the first part is displayed with its header in Message mode. @end ifset @ifset ja マルãƒãƒ‘ートã®å„行㯠@itemize @minus @item マーク (Content-Transfer-Encoding:) @item ãƒ‘ãƒ¼ãƒˆç•ªå· @item データ型 (Content-Type:) @item 説明 (Content-Description:) @item ファイルå (Content-Disposition:) @end itemize ã‹ã‚‰æ§‹æˆã•れã¦ã„ã¾ã™ã€‚Content-Description: ã¯ãƒ‘ートã«å¯¾ã™ã‚‹ Subject: 㨠考ãˆã¦ã„ã„ã§ã—ょã†ã€‚ã“ã®è¡¨ç¤ºã¯ Draft ãƒ¢ãƒ¼ãƒ‰ã®æ·»ä»˜é ˜åŸŸã¨ã»ã¨ã‚“ã©åŒã˜ã§ã™ã€‚ @end ifset @ifset en Each line of multipart consists of @itemize @minus @item marks (Content-Transfer-Encoding:) @item part number @item data type (Content-Type:) @item description (Content-Description:) @item file name (Content-Disposition:). @end itemize Content-Description can be considered Subject: for each part. This format is very similar to that of the attachment region in Draft mode. @end ifset @ifset ja @samp{SPC} ã‚„ @samp{n} ã§ãƒ‘ート 2 ã¸é€²ã‚ã°ã€ãã®ãƒ‘ートãŒãƒ‡ãƒ¼ã‚¿åž‹ã«å¿œã˜ã¦ 表示ã•れã¾ã™ã€‚ãŸã¨ãˆã°ã€Text/Plain ãªã‚‰ Message モードã§ã€PostScript 㪠ら @w{"}ghostview" ã§è¡¨ç¤ºã•れã¾ã™ã€‚ @end ifset @ifset en If you type @samp{SPC} or @samp{n}, the cursor moves onto part 2 and the content is displayed according to its data type. For instance, Text/Plain is showed in Message mode and PostScript is visualized with "ghostview". @end ifset @ifset ja @samp{n} ã‚„ @samp{p} ã¯ã€ãƒ‘ート部分ã¾ã§å«ã‚“ã è¡Œã‚’移動ã™ã‚‹ã“ã¨ã«æ³¨æ„ã—㦠下ã•ã„。パート部分を飛ã°ã—ã¦ä¸‹ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã«ã¯ @samp{C-un} 㨠入力ã—ã¦ä¸‹ã•ã„。ã¾ãŸã€ãƒ‘ート部分を飛ã°ã—㦠1 ã¤ä¸Šã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ ã«ã¯ @samp{C-up} ã¨å…¥åŠ›ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Please note that @samp{n} and @samp{p} move lines including multipart. To display the message below skipping multipart, type @samp{C-un}. Likewise, to display the message above (not this message), input @samp{C-up}. @end ifset @ifset ja Mew ã¯ã€MIME ã‚’å†å¸°çš„ã«å‡¦ç†ã—ã¾ã™ã€‚以下ã¯è»¢é€ã•れãŸãƒžãƒ«ãƒãƒ‘ートã®ãƒ¡ãƒƒã‚»ãƒ¼ ジã®ä¾‹ã§ã™ã€‚ @end ifset @ifset en Mew processes MIME recursively. The following example is a forwarded multipart message. @end ifset @example @ifset ja M03/15 ã‹ãšãã‚“ Fw: 能登ã®å†™çœŸ |写真ãŒé€ã‚‰ã‚Œã¦ããŸã®ã§ 2 Message/Rfc822 能登ã®å†™çœŸ B 2.2 Image/Jpeg 写真1 noto1.jpg Q 2.3 Application/Postscript 能登ã®åœ°å›³ map.ps @end ifset @ifset en M03/15 Kazu yamamoto Fw: The pictures of Noto |Attached are the pictu 2 Message/Rfc822 The pictures of Noto B 2.2 Image/Jpeg picture 1 noto1.jpg Q 2.3 Application/Postscript Note map map.ps @end ifset @end example @ifset ja (メモ) テキスト以外ã®ãƒ‡ãƒ¼ã‚¿ã‚’ã€ã‚·ãƒ³ã‚°ãƒ«ãƒ‘ートã¨ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ ¼ç´ã™ã‚‹ ã®ã¯ã€æ›¸å¼ã¨ã—ã¦ã¯é–“é•ã„ã§ã¯ã‚りã¾ã›ã‚“ãŒã€ãŠå‹§ã‚ã§ãã¾ã›ã‚“。マルãƒãƒ‘ート を作æˆã—ã€ãã®ãƒ‘ート 1 ã«èª¬æ˜Žã®ãƒ†ã‚­ã‚¹ãƒˆã‚’ã€ãƒ‘ート 2 ã«ãƒ†ã‚­ã‚¹ãƒˆä»¥å¤–ã®ãƒ‡ãƒ¼ タを入れる作法をãŠå‹§ã‚ã—ã¾ã™ã€‚ @end ifset @ifset en Note: We strongly recommend that you not embed any object other than text as a top level single part to a message directly. Instead, it is better to make a multipart message whose part 1 is a textual description of part 2 and part 2 is a non-text object. @end ifset @ifset ja テキスト以外ã®ãƒ‡ãƒ¼ã‚¿ãŒæœ¬æ–‡ã«ç›´æŽ¥æ ¼ç´ã•れã¦ã„るメッセージã«å¯¾ã—ã€Mew ã¯ã“ れをã‚ãŸã‹ã‚‚マルãƒãƒ‘ートã®ã‚ˆã†ã«è¡¨ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en A message which contains a single part other than text is displayed as multipart. @end ifset @ifset ja ã“ã®ã‚ˆã†ã« MIME ã®æ§‹é€ ã¯è¤‡é›‘ã«ãªã‚Šã†ã‚‹ã®ã§ã€è§£æžã™ã‚‹ã®ã«ã¯æ™‚é–“ãŒã‹ã‹ã‚‹å ´ åˆãŒã‚りã¾ã™ã€‚ã—ã‹ã—ã€Mew ã¯æ¬¡ã«èª­ã¾ã‚Œã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’予想ã—ã€ãƒ¦ãƒ¼ã‚¶ãŒç¾åœ¨ ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読んã§ã„ã‚‹é–“ã«ã€æ¬¡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã‚らã‹ã˜ã‚è§£æžã—ã¦ãŠãã“㨠ã§é«˜é€Ÿæ€§ã‚’実ç¾ã—ã¦ã„ã¾ã™ã€‚è§£æžã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã—ã°ã‚‰ãã®é–“ä¿å­˜ã•れ㾠ã™ã€‚ @end ifset @ifset en Since the syntax of MIME messages can be complex, it sometime takes a bit of time to analyze the syntax. However, Mew guesses the message to be read next and analyzes it beforehand while the user is reading the current message. Analyzed messages are temporarily cached. @end ifset @ifset ja メッセージã®çµ‚りã®éƒ¨åˆ†ãŒã¯ã£ãりã¨åˆ†ã‹ã‚‹ã‚ˆã†ã«ã€Mew ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ€å¾Œã« "[End of message]" ã¨ã„ã†æ–‡å­—列を表示ã—ã¾ã™ã€‚ã¾ãŸã€ãƒ‘ートã®çµ‚りã§ã¯ã€ "[Message is continued]" ã¨ã„ã†æ–‡å­—列を表示ã—ã¾ã™ã€‚ã“ã‚Œã‚‰ã®æ–‡å­—列ã¯ãれ ãžã‚Œã€@samp{mew-end-of-message-string} 㨠@samp{mew-end-of-part-string} ã§æŒ‡å®šã§ãã¾ã™ã€‚ @end ifset @ifset en To make it clear where the message ends, Mew displays the string "[End of message]" in the end of the message. At the end of each part, Mew displays the string "[Message is continued]". These strings are customized by @samp{mew-end-of-message-string} and @samp{mew-end-of-part-string}, respectively. @end ifset @c %%%%%%%%%%%%%%%%% @node analysis, cipher-viewing, multipart, Viewing @ifset ja @section MIME ã®è§£æžã‚’制御ã™ã‚‹ @end ifset @ifset en @section Controlling MIME analysis @end ifset @kindex . (Summary) @kindex C-u. (Summary) @kindex , (Summary) @kindex C-cTAB (Summary) @kindex : (Summary) @kindex C-u: (Summary) @ifset ja メッセージã®è§£æžã‚’制御ã™ã‚‹ãŸã‚ã«ã€ä»¥ä¸‹ã®å¤‰æ•°ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en There are several variables for controlling message analysis. @end ifset @vtable @samp @ifset ja @item mew-file-max-size è§£æžã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¤§ãã•ã®ä¸Šé™ã€‚メッセージã®å¤§ãã•ãŒã“ã®å€¤ä»¥ä¸‹ãªã‚‰ã€è§£ æžã—表示ã™ã‚‹ã€‚è¶Šãˆã¦ã„ã‚‹ãªã‚‰ã€è§£æžã›ãšã«ç”Ÿã®ã¾ã¾è¡¨ç¤ºã™ã‚‹ã€‚åˆæœŸå€¤ã¯ 100000 ãƒã‚¤ãƒˆã€‚ @item mew-header-max-length è§£æžã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ˜ãƒƒãƒ€é•·ã®ä¸Šé™ã€‚ヘッダã®è¡Œæ•°ãŒã“ã®å€¤ä»¥ä¸‹ãªã‚‰ã€ãƒ¡ãƒƒã‚»ãƒ¼ ジを解æžã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚è¶Šãˆã¦ã„ã‚‹ãªã‚‰ã€è§£æžã‚’é€”ä¸­ã§æ­¢ã‚ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’壊れ ãŸå½¢ã§è¡¨ç¤ºã™ã‚‹ã€‚åˆæœŸå€¤ã¯ 100 行。 @item mew-decode-broken è¦æ ¼é•åã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’è§£æžã™ã‚‹éš›ã«ã€å¯›å®¹ã«ãªã‚‹ã‹å¦ã‹ã€‚@samp{t} ãªã‚‰å¯›å®¹ ã«ã€@samp{nil} ãªã‚‰å޳坆ã«è§£æžã™ã‚‹ã€‚寛容ã«è§£æžã™ã‚‹éš›ã«è¦æ ¼é•åãŒã‚ã£ãŸå ´ åˆã¯ã€X-Mew: フィールドã«è¡¨ç¤ºã™ã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{t}。 @item mew-use-text-body 本文ã®ãƒ†ã‚­ã‚¹ãƒˆã‚’ヘッダã¨åŒæ™‚ã«è¡¨ç¤ºã™ã‚‹ã‹å¦ã‹ã€‚@samp{t} ãªã‚‰ã€æœ¬æ–‡ãŒã‚·ãƒ³ グルã®ãƒ†ã‚­ã‚¹ãƒˆã€ãŠã‚ˆã³ã€æœ¬æ–‡ãŒãƒžãƒ«ãƒãƒ‘ãƒ¼ãƒˆã§æœ€åˆã®ãƒ‘ートãŒãƒ†ã‚­ã‚¹ãƒˆã®å ´åˆã€ ãã®ãƒ†ã‚­ã‚¹ãƒˆã‚’ヘッダã¨åŒæ™‚ã«è¡¨ç¤ºã™ã‚‹ã€‚@samp{nil} ã®å ´åˆã¯ã€ãƒžãƒ«ãƒãƒ‘ート内 ã®ãƒ‘ートã®ã‚ˆã†ã«è¡¨ç¤ºã™ã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{t}。 @item mew-use-alternative Multipart/Alternative ã®å–り扱ã„。Multipart/Alternative ã§ã‚るメッセー ジã«ã¯@samp{-} マークãŒä»˜ã„ã¦ã„る。@samp{t} ãªã‚‰ã€ @samp{mew-mime-multipart-alternative-list} ã®å„ªå…ˆé †ä½ã«å¾“ã£ã¦ã€1 ã¤ã®ãƒ‘ー トを表示ã™ã‚‹ã€‚@samp{nil} ãªã‚‰ã€é€šå¸¸ã®ãƒžãƒ«ãƒãƒ‘ートã¨ã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚åˆæœŸå€¤ 㯠@samp{t}。 @item mew-use-text/html Text/Html ã®å–扱ã„。@samp{nil} ã®å ´åˆã¯ HTML ã‚’è§£æžã›ãšã«è¡¨ç¤ºã€‚ãれ以外 ãªã‚‰ HTML ã‚’è§£æžã—ã¦è¡¨ç¤ºã€‚åˆæœŸå€¤ã¯ @samp{nil}。 @item mew-use-text/xml Text/Xml ã®å–扱ã„。@samp{nil} ã®å ´åˆã¯ XML ã‚’è§£æžã›ãšã«è¡¨ç¤ºã€‚ãれ以外 ãªã‚‰ XML ã‚’è§£æžã—ã¦è¡¨ç¤ºã€‚åˆæœŸå€¤ã¯ @samp{nil}。 @end ifset @ifset en @item mew-file-max-size The size limit of messages to be analyzed. If the size of a message is less than or equal to this value, it is analyzed and displayed. Otherwise, the raw message is displayed without analysis. The default value is 10000 bytes. @item mew-header-max-length The length limit of header to be analyzed. If the length of a header is less than or equal to this value, it is analyzed and displayed. Otherwise, the message is displayed as fragmentarily since the analysis is stopped. The default value is 100 lines. @item mew-decode-broken Whether Mew be liberal or conservative to invalid messages. If the value is @samp{t}, the setting is liberal. If the value is @samp{nil}, the setting is for conservative. If conservative and invalid portions are found, they are reported in the X-Mew: field. The default value is @samp{t}. @item mew-use-text-body Whether or not the text part of a body is displayed with its header. If the value is @samp{t}, both the body which is a single part text and the first text part in a multipart body are displayed with its header. If the value is @samp{nil}, they are displayed as a single part in a multipart. The default value is @samp{t}. @item mew-use-alternative How to treat Multipart/Alternative. Messages containing Multipart/Alternative are marked with @samp{-}. If the value is @samp{t}, one part is displayed according to the preference defined in @samp{mew-mime-multipart-alternative-list}. If the value is @samp{nil}, it is displayed as a multipart. The default value is @samp{t}. @item mew-use-text/html How to treat Text/Html. If @samp{nil}, HTML is displayed as is (without parsing). Otherwise, HTML is parsed and displayed. The default value is @samp{nil}. @item mew-use-text/xml How to treat Text/Xml. If @samp{nil}, XML is displayed as is (without parsing). Otherwise, XML is parsed and displayed. The default value is @samp{t}. @end ifset @end vtable @ifset ja ã“れらã®å¤‰æ•°ã«é–¢ã™ã‚‹åŸºæœ¬çš„ãªã‚³ãƒžãƒ³ãƒ‰ã¯ã€@samp{.} ã§ã™ã€‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ 以下ã®ã‚ˆã†ã«å‹•ãã¾ã™ã€‚ @end ifset @ifset en The basic command relating to the variables above is @samp{.}. The command acts as follows: @end ifset @ifset ja 1) ã“ã®ã‚³ãƒžãƒ³ãƒ‰ãŒãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä¸Šã§å®Ÿè¡Œã•れるã¨ã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ ãŒå‰Šé™¤ã•れã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè§£æžã•れã¦å†è¡¨ç¤ºã•れã¾ã™ã€‚ @end ifset @ifset en 1) If this command executed on a message, the cache of the message is removed and the message is analyzed then displayed. @end ifset @ifset ja 1a) ã‚‚ã—ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¤§ãã•㌠@samp{mew-file-max-size} ã‚’è¶Šãˆã¦ã„ ã‚‹ãªã‚‰ã€MIME ã¯è§£æžã•れãšã€ãã®ã¾ã¾è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ã“ã®ã‚³ãƒž ンドã¯ã“ã®ä¸Šé™ã«é–¢ã‚らãšã«ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’è§£æžã—ã€å†è¡¨ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en 1a) If the size of the current message exceeds @samp{mew-file-max-size}, MIME analysis is skipped then the beginning of the raw message is displayed. In this situation, this command analyzes the current message without the limitation then displays it. @end ifset @ifset ja 1b) ã‚‚ã—ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ˜ãƒƒãƒ€é•·ãŒ @samp{mew-header-max-length} ã‚’è¶Š ãˆã¦ã„ã‚‹ãªã‚‰ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå£Šã‚ŒãŸã‚ˆã†ã«è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ã“㮠コマンドã¯ã“ã®ä¸Šé™ã«é–¢ã‚らãšã«ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’è§£æžã—ã€å†è¡¨ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en 1b) If the length of a header exceeds @samp{mew-header-max-length}, a broken message is displayed. In this situation, this command analyzes the current message without the limitation then displays it. @end ifset @ifset ja 1c) ã‚‚ã—ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒ @samp{:} ã§è¡¨ç¤ºã•れã¦ã„ã‚‹ãªã‚‰ã€ãƒžãƒ«ãƒãƒ‘ート ã®æ§‹é€ ã¯ã€é€šå¸¸ã¨ã¯é•ã†ã‚ˆã†ã«è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ マルãƒãƒ‘ãƒ¼ãƒˆã®æ§‹é€ ã‚’通常ã¨åŒã˜ã‚ˆã†ã«å†è¡¨ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en 1c) If the current message is displayed by @samp{:}, the multipart structure is displayed different from the normal display. In this situation, this command gets the multipart structure back to the normal display. @end ifset @ifset ja 1d) ã‚‚ã— @samp{mew-use-text/html} ㌠@samp{nil} ãªã‚‰ã€HTML ã¯è§£æžã•れãšã€ãã® ã¾ã¾è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ HTML ã‚’è§£æžã—ã€å†è¡¨ç¤ºã— ã¾ã™ã€‚ @end ifset @ifset en 1d) If @samp{mew-use-text/html} is @samp{nil}, its HTML body is displayed as is. In this situation, this command analyzes the HTML body and displays it. @end ifset @ifset ja 2) ã‚‚ã—ã“ã®ã‚³ãƒžãƒ³ãƒ‰ãŒãƒ‘ート上ã§å®Ÿè¡Œã•れãŸå ´åˆã€ãã®ãƒ‘ートãŒå†è¡¨ç¤ºã•れ㾠ã™ã€‚ @end ifset @ifset en 2) If this command is called on a part, the part is displayed again. @end ifset @ifset ja 2a) ã‚‚ã— @samp{mew-use-text/html} ㌠@samp{nil} ãªã‚‰ã€HTML ã¯è§£æžã•れãšã€ãã® ã¾ã¾è¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚ã“ã®å ´åˆã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ HTML ã‚’è§£æžã—ã€å†è¡¨ç¤ºã— ã¾ã™ã€‚ @end ifset @ifset en 2a) If 'mew-use-text/html' is @samp{nil}, its HTML part is displayed as is. In this situation, this command analyzes the HTML part and displays it. @end ifset @ifset ja @samp{.} 以外ã«ã‚‚ã€ä»¥ä¸‹ã®ã‚ˆã†ãªä¾¿åˆ©ãªã‚³ãƒžãƒ³ãƒ‰ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en In addition to @samp{.}, the following commands are prepared: @end ifset @table @samp @ifset ja @item . メッセージを解æžã—ã€å†è¡¨ç¤ºã™ã‚‹ã€‚ @item C-u. @samp{mew-decode-broken} を逆ã«ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’è§£æžã—ç›´ã™ã€‚ @xref{invalid} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item : @samp{mew-use-alternative} 㨠@samp{mew-use-text-body} ã‚’å転ã•ã›ãŸ @samp{.}. @item C-u: @samp{mew-use-alternative} 㨠@samp{mew-use-text-body} ã‚’å転ã•ã›ãŸ @samp{C-u.}. @item , ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚„ãƒ‘ãƒ¼ãƒˆã‚’ç”Ÿã®æ›¸å¼ã§ Message モードã«è¡¨ç¤ºã™ã‚‹ã€‚ @item C-cTAB メッセージ全体をファイルã¨ã—㦠read only ã§é–‹ã。 @item C-uC-cTAB メッセージ全体をファイルã¨ã—ã¦é–‹ã。 @end ifset @ifset en @item . Analyze the message and re-display it. @item C-u. Analyze the message with @samp{mew-decode-broken} reversed (see @ref{invalid}). @item : The same as @samp{.} with @samp{mew-use-alternative} and @samp{mew-use-text-body} reversed. @item C-u: The same as @samp{C-u.} with @samp{mew-use-alternative} and @samp{mew-use-text-body} reversed. @item , Insert a message or a part into Message mode in raw format. @item C-cTAB Open an entire message as a file in read-only mode. @item C-uC-cTAB Open an entire message as a file. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node cipher-viewing, retrieving, analysis, Viewing @ifset ja @section æš—å·ãƒ¡ãƒ¼ãƒ«ã‚„é›»å­ç½²åを表示ã™ã‚‹ @end ifset @ifset en @section Visualizing cipher or signature @end ifset @vindex mew-x-pgp-key-list @vindex mew-prog-pgp @vindex mew-prog-pgp2 @vindex mew-prog-pgp5 @vindex mew-prog-gpg @kindex C-cC-f (Summary) @kindex C-uC-cC-f (Summary) @kindex C-cC-v (Summary) @kindex C-cC-z (Summary) @ifset ja 今ã¾ã§ã¨åŒæ§˜ @samp{SPC} ãªã©ã‚’利用ã™ã‚‹ã“ã¨ã§ã€Mew ã§ã¯æš—å·åŒ–ã‚„é›»å­ç½²å ã‚’æ–½ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç°¡å˜ã«è¡¨ç¤ºã§ãã¾ã™ã€‚ã¾ãšã€ç°¡å˜ãªä¾‹ã‹ã‚‰ç´¹ä»‹ã—ã¾ã—ょ ã†ã€‚ @end ifset @ifset en Basic commands such as @samp{SPC} visualize messages signed or encrypted as well. Let's start with a simple example: @end ifset @example @ifset ja S03/18 神田パソコン館 è¦‹ç©æ›¸ |先日承りã¾ã—ãŸãƒŽãƒ¼ãƒˆPC E03/21 匿å希望 秘密ã®ãƒ¡ãƒ¼ãƒ« | @end ifset @ifset en S03/18 Kanda PC shop A written estimate |Here is a written esti E03/21 Anonymous Secret message | @end ifset @end example @ifset ja 上記ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ã€ãれãžã‚Œ @samp{S} マーク㨠@samp{E} マークãŒä»˜ã„㦠ã„ã¾ã™ã€‚ã“れã¯ãれãžã‚Œã€æœ¬æ–‡å…¨ä½“ãŒç½²åã•れã¦ã„ã‚‹ã€ãŠã‚ˆã³ã€æš—å·åŒ–ã•れã¦ã„ ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ @end ifset @ifset en Messages above are marked with @samp{S} and @samp{E}, respectively. This means that the body of the first message is signed and that of the second message is encrypted. @end ifset @ifset ja PGP/MIME ã‚„ S/MIME ã§ã¯ã€ä¸€éƒ¨ã®ãƒ‘ートã«é›»å­ç½²åã‚’æ–½ã—ãŸã‚Šã€æš—å·åŒ–ã—ãŸã‚Š ã§ãã¾ã™ã€‚ã“ã®å ´åˆã“ã®ã‚ˆã†ãªãƒžãƒ¼ã‚¯ã¯ä»˜ãã¾ã›ã‚“。@samp{S} マークや @samp{E} マークãŒä»˜ãã®ã¯ã€æœ¬æ–‡å…¨ä½“ãŒå¯¾è±¡ã«ãªã£ã¦ã„ã‚‹å ´åˆã§ã™ã€‚ @end ifset @ifset en PGP/MIME and/or S/MIME also allow to sign and/or encrypt some parts of a message. In this case, these marks do not appear. The @samp{S} or @samp{E} mark appears only when the entire body of the message is signed or encrypted. @end ifset @ifset ja ã¾ãŸã€å˜ã«ç½²åã‚„æš—å·åŒ–ã¨ã„ã„ã¾ã—ãŸãŒã€ã“ã‚Œã¯æœ€çµ‚çš„ãªå‡¦ç†ãŒç½²åã‚„æš—å·åŒ–ã§ ã‚ã£ãŸã“ã¨ã‚’æ„味ã—ã¦ã„ã¾ã™ã€‚やや複雑ãªè©±ã«ãªã‚Šã¾ã™ãŒã€ã‚‚ã—ã‹ã™ã‚‹ã¨å‰è€…㯠本文全体を暗å·åŒ–ã—ãŸå¾Œã€ç½²åã—ãŸã®ã‹ã‚‚ã—れã¾ã›ã‚“ã—ã€å¾Œè€…ã¯ä¸€éƒ¨ã®ãƒ‘ート㫠署åã—ã€ã•らã«å…¨ä½“ã‚’æš—å·åŒ–ã—ã¦ã„ã‚‹å¯èƒ½æ€§ã‚‚ã‚りã¾ã™ã€‚ @end ifset @ifset en The terms "sign" and "encrypt" used above mean the last procedure applied the body is "sign" and "encryption", respectively. The above examples may have been produced with more complex processes. For instance, in the case of the former message, the body may have been signed after encrypting the body. It is likely that some part of the latter message was first signed then the body was encrypted. @end ifset @ifset ja 本文全体ã€ã‚ã‚‹ã„ã¯ã€ä¸€éƒ¨ã®ãƒ‘ãƒ¼ãƒˆãŒæš—å·åŒ–ã•れã¦ã„ã‚‹å ´åˆã€Mew ã¯ãƒ‘スフレー ズを訊ã„ã¦ãã¾ã™ã€‚パスフレーズを入力ã™ã‚‹éš›ã®æ³¨æ„事項ã«ã¤ã„ã¦ã¯ã€ @xref{start} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。入力ã•れãŸãƒ‘スフレーズã¯ã€ã‚ãªãŸã®ç§˜å¯†éµ を復å·åŒ–ã™ã‚‹ã®ã«ä½¿ã‚れã¾ã™ã€‚ãã—ã¦ã€å¾©å·åŒ–ã•れãŸç§˜å¯†éµã«ã‚ˆã£ã¦ã€æš—å·åŒ–㕠れã¦ã„るメッセージを解ãã‚ã‘ã§ã™ã€‚ @end ifset @ifset en If some parts or the entire body is encrypted, Mew asks you to input your pass-phrase to get plain text. Please refer to @ref{start} to know what you should pay attention when inputting pass-phrase. The pass-phrase is used to decrypt your secret key. The secret key is then used to decrypt cipher text. @end ifset @ifset ja æš—å·ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã«ã¯ã€æš—å·åŒ–ã•ã‚ŒãŸæ•°ã ã‘パスフレーズを入力ã™ã‚‹ å¿…è¦ãŒã‚りã¾ã™ã€‚ã“れ㯠Mew ãŒå®‰å…¨ã‚’期ã—ã¦ã€é€šå¸¸ãƒ‘スフレーズをä¿å­˜ã—ãªã„ ã‹ã‚‰ã§ã™ã€‚ã‚‚ã—ã“れãŒã‚ãšã‚‰ã‚ã—ã„ãªã‚‰ã€Mew ã«ãƒ‘スフレーズをä¿å­˜ã•ã›ã‚‹ã“ ã¨ã‚‚å¯èƒ½ã§ã™ã€‚詳ã—ãã¯ã€@xref{password} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en To visualize a cipher message, you need to input your pass-phrase every time you encounter cipher text. This is because Mew does not cache pass-phrases anywhere for security reasons. If you feel this is inconvenient, you can configure Mew to cache your pass-phrase. Please refer to @ref{password} for more information. @end ifset @ifset ja パスフレーズをä¿å­˜ã—ãªã„通常ã®è¨­å®šã§ã‚‚ã€ä¸€æ—¦å¾©å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã—㰠らãä¿å­˜ã•れるã®ã§ã€2 回目ã®è¡¨ç¤ºã«ã¯ãƒ‘スフレーズを訊ã‹ã‚Œãªã„ã‹ã‚‚ã—れã¾ã› ん。 @end ifset @ifset en Since decrypted messages are cached for a while, you may not be asked for your pass-phrase at the next time you display the message, even if you are not using the pass-phrase cache. @end ifset @ifset ja 一方ã€é€šä¿¡ç›¸æ‰‹ã®ç½²åを検証ã™ã‚‹ãŸã‚ã«ã¯ç›¸æ‰‹ã®å…¬é–‹éµãŒåˆ©ç”¨ã§ãれã°ã‚ˆã„ã®ã§ã€ パスフレーズを訊ã‹ã‚Œã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。 @end ifset @ifset en To verify signatures, senders' public keys are used. Hence you are not asked to type your pass-phrase. @end ifset @ifset ja Mew ã¯è‡ªå‹•çš„ã«é›»å­ç½²åを検証ã—ãŸã‚Šã€å…¥åŠ›ã•れãŸãƒ‘スフレーズを使ã£ã¦æš—å·ãƒ¡ãƒƒ セージを復å·åŒ–ã—ãŸã‚Šã—ã¦ã€å…ƒã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã—ã¾ã™ã€‚ãã“ã§ã€ãƒ¦ãƒ¼ã‚¶ãŒç½² åã®å­˜åœ¨ã«æ°—ã¥ã‹ãªã„ã‹ã‚‚ã—れã¾ã›ã‚“ã—ã€ã©ã®éƒ¨åˆ†ãŒæš—å·åŒ–ã•れã¦ã„ãŸã®ã‹åˆ†ã‹ らãªã„ã‹ã‚‚ã—れã¾ã›ã‚“。 @end ifset @ifset en Since Mew automatically verifies signatures and/or decrypts cipher text with a pass-phrase, it is likely that users do not notice that the original message has signatures and/or which parts were encrypted. @end ifset @ifset ja ãã“ã§ã€æ¤œè¨¼ã®çµæžœã‚„ã©ã®éƒ¨åˆ†ãŒæš—å·åŒ–ã•れã¦ã„ã‚‹ã‹ã‚’ユーザã«é€šçŸ¥ã™ã‚‹ãŸã‚ã«ã€ Mew ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ãƒ˜ãƒƒãƒ€ã« X-Mew: フィールドを挿入ã—ã¾ã™ã€‚ @end ifset @ifset en To inform users the results of verification of signatures or which parts were decrypted, Mew inserts the X-Mew: field in the header as follows: @end ifset @example X-Mew: PGP decrypted. Good PGP sign "kazu@@example.org" COMPLETE @end example @ifset ja "<>" 内ã®ç•ªå·ã¯ã€ã©ã®ãƒ‘ートã®çµæžœã§ã‚ã‚‹ã‹ã‚’示ã—ã¦ã„ã¾ã™ã€‚"body" ã¯ã€ãƒ¡ãƒƒ ã‚»ãƒ¼ã‚¸ã®æœ¬æ–‡å…¨ä½“ãŒä¿è­·ã•れã¦ã„ã‚‹ã“ã¨ã‚’æ„味ã—ã¾ã™ã€‚ã“ã®ä¾‹ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ 全体㌠kazu ã«ã‚ˆã£ã¦ç½²åã•れã€å—信者ã®ãŸã‚ã«æš—å·åŒ–ã•れã¦ã„ã¾ã™ã€‚Mew ã¯ã¾ ãšã“れを復å·åŒ–ã—ã€ãã—ã¦ç½²åを検証ã—ã¦ã„ã¾ã™ã€‚ç½²åã¯æ­£ã—ã„ã®ã§ã€ kazu@@example.org ã¨ã„ㆠID ã®ä»˜ã„ãŸç§˜å¯†éµã§ç½²åã•れãŸã¨ãã‹ã‚‰ã€å†…容ã¯å¤‰æ›´ã• れã¦ã„ãªã„ã¨åˆ†ã‹ã‚Šã¾ã™ã€‚ã“ã®ç½²åã®æ¤œè¨¼ã«ä½¿ã‚れãŸå…¬é–‹éµã®ã€Œæœ‰åŠ¹æ€§ã€ã¯ "complete" ã§ã™ã€‚よã£ã¦ã€å—信者ã¯ã“ã®å…¬é–‹éµãŒ ID ãŒç¤ºã™ãƒ¦ãƒ¼ã‚¶ã«å±žã—ã¦ã„ ã‚‹ã¨ä¿¡é ¼ã—ã¦ã„ã‚‹ã“ã¨ã«ãªã‚Šã¾ã™ã€‚ã¤ã¾ã‚Šã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ä¿¡é ¼ã‚’ãŠã„ã¦ã„ã‚‹ 公開éµã«ã‚ˆã£ã¦æ¤œè¨¼ã•ã‚ŒçµæžœãŒæ­£ã—ã„ã®ã§ã€æ”¹ç«„ã•れã¦ã„ãªã„ã¨ã„ã†ã“ã¨ã«ãªã‚Š ã¾ã™ã€‚ @end ifset @ifset en The number enclosed by "<>" indicates which part was protected with PGP. "body" means the body was protected. This example tells us that the body was singed by kazu then encrypted for the reader. Mew first decrypted the message and then verified its signature of the decrypted message. The fact that the signature is valid indicates that no one has modified the content of the message since it was signed by the secret key whose ID is kazu@@example.org. The validity of the public key used to verify the signature is "complete". Thus, the receiver can be sure that the public key actually belongs to the user indicated by the ID. That is, this message was verified by a reliable public key AND its results were correct, so no alternation was found. @end ifset @ifset ja 以下ã®ä¾‹ã§ã¯ã€ã¾ãšãƒžãƒ«ãƒãƒ‘ートã§ã‚る本文全体ã®é›»å­ç½²åãŒæ¤œè¨¼ã•れã€ãã®å¾Œ パート 2 ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸å…¨ä½“ãŒå¾©å·åŒ–ã•れã¦ã„ã¾ã™ã€‚ã¤ã¾ã‚Šã€ä½œæˆæ™‚ã«ã¯ã€ã¾ãš パート 2 ãŒæš—å·åŒ–ã•れã€ãã—ã¦æœ¬æ–‡å…¨ä½“ãŒç½²åã•れãŸã“ã¨ãŒåˆ†ã‹ã‚Šã¾ã™ã€‚ @end ifset @ifset en In the following example, the signature of the body (multipart), is first verified, then part 2 (a message), is decrypted. That is, the composing process was that part 2 is first encrypted then the entire body is signed. @end ifset @example X-Mew: Good PGP sign "kazu@@example.org" COMPLETE X-Mew: <2 message> PGP decrypted. @end example @ifset ja ã™ã‚‹ã©ã„人ãªã‚‰ã€æ‚ªã„人ãŒã‚らã‹ã˜ã‚ X-Mew: フィールドを挿入ã—ã¦ãŠãã€ã‚ãªãŸ ã‚’ã ã¾ã™ã‹ã‚‚ã—れãªã„ã¨æ€ã†ã‹ã‚‚ã—れã¾ã›ã‚“。ã§ã‚‚大丈夫ã§ã™ã€‚Mew ã¯ã€ãƒ˜ãƒƒãƒ€ã« ã‚ã‚‹ X-Mew: ã‚’ã‚らã‹ã˜ã‚å‰Šã‚Šã€æœ¬ç‰©ã® X-Mew: フィールドを挿入ã—ã¾ã™ã‹ã‚‰ã€‚ @end ifset @ifset en Intelligent users may wonder what happens in the case where a devious person sends a message that contains an invalid X-Mew: field. This is not a problem. First Mew carefully removes the X-Mew: field, and then inserts a valid X-Mew: field into the header. @end ifset @ifset ja PGP/MIME ã«ã¤ã„ã¦ï¼š @end ifset @ifset en About PGP/MIME: @end ifset @ifset ja X-Mew: フィールドã¯ä»–ã«ã‚‚ã•ã¾ã–ã¾ãªçµæžœã‚’ä¼ãˆã¦ãれã¾ã™ã€‚ãŸã¨ãˆã°ã€ç½²å を検証ã™ã‚‹ãŸã‚ã®å…¬é–‹éµãŒãªã„ã¨ã‹ã€å¾©å·åŒ–ã«å¤±æ•—ã—ãŸãªã©ã§ã™ã€‚以下ã®ä¾‹ã¯ã€ éµ ID ㌠0x1B8BF431 ã§ã‚る公開éµãŒãªã„ã“ã¨ã‚’示ã—ã¦ã„ã¾ã™ã€‚ @end ifset @ifset en X-Mew: informs the user of various other types of results. For example, the lack of availability of a public key, decryption failures, etc. The following example indicates the absence of a public key whose key ID is 0x1B8BF431. @end ifset @example X-Mew: No his/her public key. ID = 0x1B8BF431 @end example @ifset ja ã“ã®å ´åˆã€@samp{C-cC-f} ã¨å…¥åŠ›ã™ã‚‹ã¨ã€Mew ã¯ã“ã®å…¬é–‹éµã®å…¥æ‰‹ã‚’試ã¿ã¾ã™ã€‚ ãã®éš›ã€å…¬é–‹éµã‚µãƒ¼ãƒã‚’é¸æŠžã§ãã¾ã™ã€‚ã‚‚ã—ã€X-Mew: フィールドãŒãªã„å ´åˆã¯ã€ @samp{C-cC-f} 㯠From: ã‚’ ID ã¨è€ƒãˆã¾ã™ã€‚ã¾ãŸã€@samp{C-uC-cC-f} ã¯ã€ X-Mew: フィールドã«åŠ ãˆã¦ @samp{mew-x-pgp-key-list} ã«æŒ‡å®šã•れãŸãƒ•ィー ãƒ«ãƒ‰ã‚‚éµ ID を切り出ã™å¯¾è±¡ã¨ã—ã€å…¬é–‹éµã®å…¥æ‰‹ã‚’試ã¿ã¾ã™ã€‚ @end ifset @ifset en In this case, if you type @samp{C-cC-f}, Mew tries fetching this public key. You can interactively select a public key server. If the X-Mew: field does not exist, @samp{C-c C-f} takes the From: field as ID. Also, @samp{C-uC-cC-f} extracts key IDs from fields specified in @samp{mew-x-pgp-key-list} in addition to the X-Mew: field, and then tries to fetch them. @end ifset @ifset ja Mew ã§ã¯ PGPv2ã€PGPv5ã€GNUPG ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚ã“れら㯠Summary モード㫠ãŠã„ã¦ã€@samp{C-cC-v} ã§åˆ‡æ›¿ãˆå¯èƒ½ã§ã™ã€‚ã“れら複数㮠PGP を使ã„ãŸã„人㯠@samp{mew-prog-pgp2}ã€@samp{mew-prog-pgp5}ã€@samp{mew-prog-gpg} ã«å¯¾ã—〠ãれãžã‚Œ PGPv2ã€PGPv5ã€GNUPG ã®ã‚³ãƒžãƒ³ãƒ‰åを設定ã—ã¦ä¸‹ã•ã„。ã¾ãŸã€Mew 㮠起動直後ã«åˆ©ç”¨ã™ã‚‹ PGP ã®ã‚³ãƒžãƒ³ãƒ‰åã‚’ @samp{mew-prog-pgp} ã«è¨­å®šã—ã¦ä¸‹ã• ã„。ãªãŠãƒ‘スフレーズã¯ã€ãれãžã‚Œã® PGP ã«å¯¾ã—独立ã«ä¿å­˜ã•れã¾ã™ã€‚ @end ifset @ifset en Mew supports PGPv2, PGPv5, and GNUPG. You can select one of these by typing @samp{C-cC-v} in Summary mode. If you want to use those PGPs, you should set the command name of PGPv2, PGPv5, and GNUPG to @samp{mew-prog-pgp2}, @samp{mew-prog-pgp5}, and @samp{mew-prog-gpg}, respectively. Also, set the default PGP name to @samp{mew-prog-pgp}. Note that pass-phrases are cached independently for each PGP. @end ifset @ifset ja ãªãŠæ˜”ãªãŒã‚‰ã® PGP メッセージã¯ã€è‡ªå‹•çš„ã«å‡¦ç†ã§ãã¾ã›ã‚“。ã“ã®ã‚ˆã†ãª PGP メッセージã«å¯¾ã—ã¦ã¯ã€@samp{C-cC-z} ã§å¾©å·åŒ–ã‚„ç½²åã®æ¤œè¨¼ãŒã§ãã¾ã™ã€‚ @end ifset @ifset en Old fashioned PGP messages cannot be processed automatically. You can decrypt and/or verify this kind messages with @samp{C-cC-z}. @end ifset @c %%%%%%%%%%%%%%%%% @node retrieving, moving, cipher-viewing, Viewing @ifset ja @section メッセージã®å–å¾— @end ifset @ifset en @section Getting messages @end ifset @vindex mew-mailbox-type @vindex mew-auto-flush-queue @vindex mew-pop-delete @vindex mew-imap-delete @vindex mew-pop-header-only @vindex mew-imap-header-only @vindex mew-nntp-header-only @kindex i (Summary) @kindex I (Summary) @kindex s (Summary) @kindex C-us (Summary) @ifset ja メールボックスã¸åˆ°ç€ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ +inbox ã¸ã‚³ãƒ”ーã—一覧表示ã™ã‚‹ã«ã¯ã€ @samp{i} を使ã„ã¾ã™ã€‚コピー元ã®ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã¯ @samp{mew-mailbox-type} ã«ã‚ˆã£ã¦æ±ºã‚Šã¾ã™ã€‚(@samp{M-x mew} を実行ã—ãŸéš›ã«ã€@samp{mew-proto} ㌠@samp{+} ã®å ´åˆã‚‚ã€@samp{mew-mailbox-type} ã«å¾“ã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚³ãƒ”ー㕠れã¾ã™ã€‚) 以下ã«å–りã†ã‚‹å€¤ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en To copy arrived messages to your mailbox to +inbox and list up a list of the messages, use @samp{i}. The mailbox is determined according to @samp{mew-mailbox-type}. (When you type @samp{M-x mew} and if @samp{mew-proto} is @samp{+}, messages are also copied according to @samp{mew-mailbox-type}.) Here are summary of its values. @end ifset @table @samp @ifset ja @item 'mbox ローカルã®ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã€‚デフォルトã§ã¯ "incm" ã¨ã„ã†å¤–部コマンドを使ã„〠メッセージをå–å¾—ã™ã‚‹ã€‚設定方法ã¯ã€@xref{configuration} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item 'pop POP サーãƒã€‚POP ã‚’ POP らã—ãä½¿ã†æ–¹æ³•。(åˆæœŸå€¤) @item 'imap IMAP サーãƒã€‚IMAP らã—ããªã„利用方法ãªã®ã§ã€æŽ¨å¥¨ã•れã¦ã„ãªã„。 @end ifset @ifset en @item 'mbox A local mailbox. "incm" is used to copy messages for the local mailbox by default. To know how to configure it, see @ref{configuration}. @item 'pop A POP server. To use POP as it is. (This is a default value.) @item 'imap An IMAP server. This is not recommended. @end ifset @end table @ifset ja ローカル・フォルダã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸€è¦§ã‚’å†è¡¨ç¤ºã™ã‚‹ã«ã¯ã€@samp{s} を使ã„ã¾ ã™ã€‚ @end ifset @ifset en To flush a list of messages in a local folder and display them again, use @samp{s}. @end ifset @ifset ja リモート・フォルダã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã€ã‚ã‚‹ã„ã¯å†å–å¾—ã™ã‚‹å ´åˆã«ã‚‚ @samp{s} を使ã„ã¾ã™ã€‚IMAP やニュースã§ã¯ã€@samp{i} ã¯åˆ©ç”¨ã›ãšã€@samp{s} を使ã†ã®ãŒä¸€èˆ¬çš„ã§ã™ã€‚ @end ifset @ifset en To retrieve messages or flush-then-retrieve messages again in a remote folder, type @samp{s}. It is recommended to use @samp{s}, not @samp{i}, for IMAP and NetNews. @end ifset @ifset ja @samp{s} を使ã†ã¨ç¯„囲を訊ã„ã¦ãã¾ã™ã€‚Mew ã§é‡è¦ãªç¯„å›²ã®æ„味を以下ã«ç¤ºã— ã¾ã™ã€‚ @end ifset @ifset en If you use @samp{s}, it asks you a range. Here are a summary of important ranges for Mew. @end ifset @table @samp @ifset ja @item update 「Summary ãƒ¢ãƒ¼ãƒ‰ã®æœ€å¾Œã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æ¬¡ã€ã‹ã‚‰ã€Œãƒ•ã‚©ãƒ«ãƒ€å†…ã®æœ€å¾Œã®ãƒ¡ãƒƒã‚»ãƒ¼ ジã€ã¾ã§ã€‚ã¤ã¾ã‚Šã€Summary モードã¨å®Ÿéš›ã®ãƒ•ォルダ内ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å·®åˆ†ã€‚ @item all フォルダ内ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã™ã¹ã¦ã€‚ローカル・フォルダã§ã¯ã€Summary モードã®è¡¨ 示ãŒãŠã‹ã—ããªã£ãŸã¨ãã«ã€å†…容を一新ã™ã‚‹ãŸã‚ã«ç”¨ã„る。リモート・フォルダ ã§ã¯ã€ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å†å–得。 @item sync ã‚るリモート・フォルダã«å¯¾ã—ã€ã‚µãƒ¼ãƒå´ã§ã¯æ¶ˆãˆãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’ 削除ã™ã‚‹ã€‚リモート・フォルダã«å¯¾ã—ã¦ã®ã¿æœ‰åŠ¹ã€‚ @end ifset @ifset en @item update From "the last message in the Summary mode + 1" to "the last message in the corresponding folder". That is, the gap between the Summary mode and the existing folder @item all All messages in the folder. When Summary mode in a local folder becomes inconsistent, use this range to flush the list. For a remote folder, this range results in retrieval of all messages again. @item sync Deleting cache messages whose originals were removed in the server side. Valid for remote folders only. @end ifset @end table @ifset ja +draftã€+queueã€+postq ã§ã¯ã€ãƒ‡ãƒ•ォルトã®ç¯„囲㯠@samp{all} ã¨ãªã£ã¦ã„ã¾ ã™ã€‚ãれ以外ã®ãƒ•ォルダã§ã¯ã€ãƒ‡ãƒ•ォルトã®ç¯„囲㌠@samp{update} ã¨ãªã£ã¦ã„ ã¾ã™ã€‚ã§ã™ã‹ã‚‰ã€+draftã€+queueã€+postq 以外ã§ã¯ã€@samp{s} ã®å¾Œã« @samp{RET} を押ã™ã ã‘ã§ã€ç¾åœ¨ã®ãƒ•ォルダã«å¯¾ã—最新ã®ä¸€è¦§ã‚’得られるã“ã¨ã« ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en The default range both for +draft, +queue, and +postq is @samp{all}. For other folders, the default is @samp{update}. So, just type @samp{RET} after @samp{s} to get the up-to-date list of the current folder except +draft, +queue, and +postq. @end ifset @ifset ja Mew ã§ã¯ã‚ã¾ã‚Šé‡è¦ã§ã¯ã‚りã¾ã›ã‚“ãŒã€ä»¥ä¸‹ã®ç¯„囲も指定ã§ãã¾ã™ã€‚ @end ifset @ifset en Although they are not especially important in Mew, you can specify the following ranges: @end ifset @table @samp @ifset ja @item - ã‹ã‚‰ ã¾ã§ã€‚ローカル・フォルダã«å¯¾ã—ã¦ã®ã¿æœ‰åŠ¹ã€‚ @item - ã‹ã‚‰æœ€å¾Œã¾ã§ã€‚ローカル・フォルダã«å¯¾ã—ã¦ã®ã¿æœ‰åŠ¹ã€‚ @item - 最åˆã‹ã‚‰ ã¾ã§ã€‚ローカル・フォルダã«å¯¾ã—ã¦ã®ã¿æœ‰åŠ¹ã€‚ @item last: 最後㮠個。 @end ifset @ifset en @item - From to . Valid for local folders only. @item - From to the last. Valid for local folders only. @item - From the first to . Valid for local folders only. @item last: Last messages. @end ifset @end table @ifset ja リモート・フォルダ㧠@samp{s} ã‚’ @samp{C-u} 付ãã§å‘¼ã³å‡ºã™ã¨ã€ã€Œãƒ˜ãƒƒãƒ€ã® ã¿ã®ã‚³ãƒ”ーã€ã¨ã€Œãƒ˜ãƒƒãƒ€ã¨æœ¬æ–‡ã®ä¸¡æ–¹ã®ã‚³ãƒ”ーã€ã‚’å転ã§ãã¾ã™ã€‚ã“れらã®å‹•作 ã¯ã€POPã€IMAPã€NNTP ã«å¯¾ã—ã€ãれãžã‚Œ @samp{mew-pop-header-only}〠@samp{mew-imap-header-only}ã€@samp{mew-nntp-header-only} ã§å®šç¾©ã§ãã€åˆ 期値ã¯ã™ã¹ã¦ @samp{nil} ã§ã™ã€‚ã¤ã¾ã‚Šã€åˆæœŸå€¤ã¯ã€Œãƒ˜ãƒƒãƒ€ã¨æœ¬æ–‡ã®ä¸¡æ–¹ã®ã‚³ ピーã€ã«ãªã£ã¦ã„ã¾ã™ã€‚ @end ifset @ifset en If you execute @samp{s} with @samp{C-u} on a remote folder, you can toggle "copying a header only" and "copying both a header and a body". This action can be defined by @samp{mew-pop-header-only}, @samp{mew-imap-header-only}, and @samp{mew-nntp-header-only} for POP, IMAP, and NNTP, respectively. The default values of these are @samp{nil}, that is, "copying both a header and a body". @end ifset @ifset ja サイズãŒå¤§ããªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€å…¨ä½“ã§ã¯ãªã一部ãŒå–å¾—ã•れã¦ã„ã‚‹ã‹ã‚‚ã—れã¾ã› ん。ã“ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ã€@samp{T} マークãŒã¤ã„ã¦ã„ã¾ã™ã€‚ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ ジã®å…¨ä½“ã‚’å–å¾—ã™ã‚‹ã«ã¯ã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä¸Šã§ @samp{I} ã¨å…¥åŠ›ã—ã¾ã™ã€‚ @end ifset @ifset en Messages that are of large size may be truncated. This kind of message is marked with @samp{T}. To retrieve the rest of this kind of message, type @samp{I} on the message. @end ifset @ifset ja ãŸã¨ãˆã°ã€$inbox ã« @samp{T} マークã®ã¤ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚ã‚‹ã¨ã—ã¾ã—ょã†ã€‚ ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸Šã§ @samp{I} を押ã™ã¨ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å…¨ä½“ãŒå–å¾—ã§ãã¾ã™ã€‚ @end ifset @ifset en Suppose that there is a message marked with @samp{T} in $inbox. If you type @samp{I} on it, you can retrieve the entire message. @end ifset @ifset ja メッセージã®å–å¾—ã«é–¢ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’以下ã«ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en Here is a summary of the commands concerned with message retrieval: @end ifset @table @samp @ifset ja @item i ローカル・フォルダã§ã¯ã€+inbox フォルダã«ç§»å‹•ã—ã€åˆ°ç€ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å– å¾—ã—ã¦ä¸€è¦§ã‚’表示ã™ã‚‹ã€‚@samp{mew-auto-flush-queue} ㌠@samp{t} ãªã‚‰ã€ +queue ã«ã‚るメッセージをé€ä¿¡ã™ã‚‹ã€‚詳ã—ãã¯ã€@xref{send} ã‚’å‚ç…§ã®ã“ã¨ã€‚ リモート・フォルダã§ã¯ã€ãã®ãƒ‡ãƒ•ォルトã®ãƒ•ォルダã«ç§»å‹•ã—ã€@samp{s} + @samp{update} を実行ã™ã‚‹ã€‚ @item C-ui @samp{mew-auto-flush-queue} ã®å€¤ã‚’逆ã ã¨æ€ã£ã¦ã€@samp{i} を実行ã™ã‚‹ã€‚ @item I @samp{T} マークã®ä»˜ã„ã¦ã„る一部ã ã‘ãŒå–å¾—ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å…¨ä½“ã‚’å–得㙠る。 ローカル・フォルダã§å®Ÿè¡Œã—ãŸå ´åˆã€ã‚±ãƒ¼ã‚¹ã¨ @samp{mew-mailbox-type} ã«ã‚ˆ りå–å¾—æ–¹æ³•ãŒæ±ºã‚‹ã€‚@samp{mew-pop-delete} ã¾ãŸã¯ @samp{mew-imap-delete} ã®å€¤ãŒ @samp{t} ãªã‚‰ã€ãƒ¡ãƒ¼ãƒ«ãƒœãƒƒã‚¯ã‚¹ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’削除ã™ã‚‹ã€‚ リモート・フォルダã§å®Ÿè¡Œã—ãŸå ´åˆã€ã‚±ãƒ¼ã‚¹ã¨å–得方法ã¯ãã®ãƒ•ォルダã‹ã‚‰æ±ºã‚‹ã€‚ サーãƒå´ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯å¸¸ã«ä¿å­˜ã•れる。 @item C-uI @samp{mew-pop-delete} ã¾ãŸã¯ @samp{mew-imap-delete} を逆転ã•ã›ã¦ @samp{I} を実行ã™ã‚‹ã€‚ @item s フォルダã®ä¸€è¦§ã‚’å–る。 @item C-us リモート・フォルダã«ãŠã„ã¦ã€ã€Œãƒ˜ãƒƒãƒ€ã®ã¿ã®ã‚³ãƒ”ーã€ã¨ã€Œãƒ˜ãƒƒãƒ€ã¨æœ¬æ–‡ã®ä¸¡æ–¹ ã®ã‚³ãƒ”ーã€ã‚’å転ã•ã›ã¦ã€ä¸€è¦§ã‚’å–る。 @item lc リモート・フォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ローカル・フォルダã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ @end ifset @ifset en @item i In a local folder, fetch arrived messages, store them to the +inbox folder and create a list. If @samp{mew-auto-flush-queue} is @samp{t}, send messages in +queue. Please refer to @ref{send} for more information. In a remote folder, visit to its inbox folder and execute @samp{s} + @samp{update}. @item C-ui Perform @samp{i} with @samp{mew-auto-flush-queue} reversed. @item I Retrieve the rest of a truncated(@samp{T}) message. If you use this command in a local folder, a method to retrieve the message is determined by the "case" and @samp{mew-mailbox-type}. If @samp{mew-pop-delete}/@samp{mew-imap-delete} is @samp{t}, delete the message from the mailbox. If you use this command in a remote folder, a "case" and protocol is determined by the folder. The message in the server side is always retained. @item C-uI Perform @samp{I} with @samp{mew-pop-delete} or @samp{mew-imap-delete} reversed. @item s List up messages in Summary mode or flush them. @item C-us On a remote folder, list up messages in Summary mode by toggling "copying a header only" and "copying both a header and a body". @item lc Copy a cached message in a remote folder to a local folder. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node moving, sum-write, retrieving, Viewing @ifset ja @section フォルダã®ç§»å‹• @end ifset @ifset en @section Moving to another folder @end ifset @kindex g (Summary) @ifset ja フォルダã®ç§»å‹•ã«ã¯ @samp{g} を入力ã—ã¦ä¸‹ã•ã„。以下ã®ã‚ˆã†ã«ãƒ•ォルダåを訊 ã‹ã‚Œã¾ã™ã€‚ @end ifset @ifset en To go to another folder, type @samp{g}. Mew asks you to input a folder name as follows: @end ifset @example Folder name (+inbox): + @end example @ifset ja ":" ã®å³å´ã‚’編集å¯èƒ½é ˜åŸŸã¨å‘¼ã¶ã“ã¨ã«ã—ã¾ã—ょã†ã€‚ã“ã®ä¾‹ã§ã¯ã€ç·¨é›†å¯èƒ½é ˜åŸŸ ã«ä¿®é£¾å­ "+" ãŒè¡¨ç¤ºã•れã¦ã„ã¾ã™ã€‚修飾å­ã«ç¶šã‘ã¦ä»»æ„ã®æ–‡å­—列を入力ã—〠@samp{RET} を押ã›ã°ã€ãƒ•ォルダåãŒæ±ºå®šã•れãŸã“ã¨ã«ãªã‚Šã€ãã®ãƒ•ォルダã¸ç§» å‹•ã—ã¾ã™ã€‚ @end ifset @ifset en Let's call the right side of ":" 'writable area'. In this example, proto "+" is displayed in the writable area. Typing an appropriate string following proto and typing @samp{RET} decides a folder name, then Mew moves to the folder. @end ifset @ifset ja フォルダを移動ã—ãŸéš›ã« Summary モードã®ä¸€è¦§ãŒå¤ã„ã¨åˆ¤æ–­ã—ãŸå ´åˆã¯ã€è‡ªå‹• çš„ã«å·®åˆ†ãŒè¿½åŠ è¡¨ç¤ºã•れã¾ã™ã€‚ @end ifset @ifset en When you move to a folder and if Mew finds its list of messages old, Mew automatically displays the differences. @end ifset @ifset ja "()" 内ãŒãƒ‡ãƒ•ォルトã®ãƒ•ォルダã§ã™ã€‚å˜ã« @samp{RET} を押㗠"+" を入力ã™ã‚‹ ã¨ã€ãƒ‡ãƒ•ォルトã®ãƒ•ォルダを入力ã—ãŸã‚‚ã®ã¨ã—ã¦æ‰±ã‚れã¾ã™ã€‚ @end ifset @ifset en The string in "()" is a default. If you specifies "+" by simply typing @samp{RET}, Mew considers that the default folder name is specified. @end ifset @ifset ja 補完を利用ã™ã‚‹ã«ã¯ã€@samp{TAB} ã‚„ @samp{SPC} を押ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en To make use of completion, type @samp{TAB} or @samp{SPC}. @end ifset @ifset ja ã•ã¦ã€è©±ã‚’ @samp{g} を押ã—ãŸç›´å¾Œã«æˆ»ã—ã¾ã—ょã†ã€‚ @end ifset @ifset en Now, lets get back to the state just after typing @samp{g}. @end ifset @example Folder name (+inbox): + @end example @ifset ja ãŸã¨ãˆã°ã€"+" ã‚’ "%" ã«å¤‰æ›´ã™ã‚‹ã«ã¯ã€é€šå¸¸ãªã‚‰ "+" を削りã€"%" を入力ã™ã‚‹ å¿…è¦ãŒã‚りã¾ã™ã€‚ã“れã§ã¯é¢å€’ãªã®ã§ã€"+" ã®å¾Œã§ "%" を入力ã™ã‚‹ã¨ã€"+" ㌠"%" ã«ç½®ãæ›ã‚るよã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ã“ã®ã‚ˆã†ã«ã€ä¿®é£¾å­ã®ç›´å¾Œã§ä»–ã®ä¿®é£¾å­ を入力ã™ã‚Œã°ã€å‰Šã‚‹ä½œæ¥­ã‚’ã›ãšã«ç½®ãæ›ãˆå¯èƒ½ã§ã™ã€‚ @end ifset @ifset en If you want to change, for example, "+" to "%", you have to delete "+" first then type "%" in normal situation. But this is inconvenient. So, typing "%" just after "+" removes "+" automatically. Like this, typing another proto just after a proto replaces the previous one without deletion. @end ifset @ifset ja リモート・フォルダを入力ã™ã‚‹å ´åˆã€@xref{config} ã§èª¬æ˜Žã™ã‚‹ã‚±ãƒ¼ã‚¹ã‚’指定㗠ãŸã„å ´åˆã‚‚ã‚ã‚‹ã§ã—ょã†ã€‚ケースã¯ã€ãƒ•ォルダåã®å‰ã« ":" ã§åŒºåˆ‡ã£ã¦å…¥åŠ›ã— ã¾ã™ã€‚ãŸã¨ãˆã°ã€"home" ã¨ã„ã†ã‚±ãƒ¼ã‚¹ã® "%inbox" ã«ç§»å‹•ã—ãŸã„ã¨ã—ã¾ã—ょã†ã€‚ ã“ã®ã¨ãã€"home:%inbox" ã¨å…¥åŠ›ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã—ã‹ã—ã“れã¯é¢å€’ãªã®ã§ã€ ä»»æ„ã®å ´æ‰€ã§ @samp{C-cTAB} を押ã™ã¨åˆ©ç”¨å¯èƒ½ãªã‚±ãƒ¼ã‚¹ãŒã€ãƒ•ォルダåã®å‰ã« 循環的ã«è£œå®Œã•れã¾ã™ã€‚次ã®ä¾‹ã‚’考ãˆã¦ä¸‹ã•ã„。 @end ifset @ifset en When you type a remote folder, you may want to specify the "case" (described in @ref{config}). The "case" must be specified before a folder, separated by ":". Consider moving "%inbox" for a "case" @w{"}home". In this case, you should type "home:%inbox". Yes, this is inconvenient. So, typing @samp{C-cTAB} in any position does circular completion for available "cases". Let's look at the following example. @end ifset @example Folder name (+inbox): %inbox @end example @ifset ja ã“ã“ã§ @samp{C-cTAB} を入力ã™ã‚‹ã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en Typing @samp{C-cTAB} here results in the following: @end ifset @example Folder name (+inbox): home:%inbox @end example @ifset ja フォルダåã®ä¸€éƒ¨ã‚’指定ã—ã¦ã€ãƒ•ォルダを検索ã—ãŸã„ã“ã¨ã‚‚ã‚ã‚‹ã§ã—ょã†ã€‚ã“ã® å ´åˆã«ã¯ã€å‰æ–¹æ¤œç´¢ã® @samp{C-s} ã‹å¾Œæ–¹æ¤œç´¢ã® @samp{C-r} ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚ 以下ã¯ã€@samp{C-s} を押ã—ãŸã¨ãã®ãƒŸãƒ‹ãƒãƒƒãƒ•ã‚¡ã®çŠ¶æ…‹ã§ã™ã€‚ @end ifset @ifset en You may want to search a folder by specifying a substring of the folder. For this purpose, @samp{C-s} and @samp{C-r} are available. The following is the state of the minibuffer after typing @samp{C-s}. @end ifset @example Folder name (+inbox): () @end example @ifset ja 編集領域ã«ç¾ã‚ŒãŸ "()" ãŒã€æ¤œç´¢ãƒ¢ãƒ¼ãƒ‰ã«ç§»è¡Œã—ãŸã“ã¨ã‚’表ã‚ã—ã¦ã„ã¾ã™ã€‚ã“ã“ ã§æ–‡å­—を入力ã—ã¦ã„ãã¨ã€ãƒžãƒƒãƒã—ãŸå€™è£œãŒ "()" ã®ä¸­ã«è¡¨ç¤ºã•れã¾ã™ã€‚以下㯠"mew" ã§æ¤œç´¢ã—ãŸã¨ãã®ä¾‹ã§ã™ã€‚ @end ifset @ifset en "()" appeared in the writable area indicates you have switched to search mode. While you are typing here, a matched candidate is shown in "()". The following is the case where a search key is "mew". @end ifset @example Folder name (+inbox): (+work/mew-release) mew @end example @ifset ja 候補を確定ã™ã‚‹éš›ã«ã¯ã€@samp{RET} を入力ã—ã¦ä¸‹ã•ã„。ãã†ã™ã‚‹ã¨æ¤œç´¢ãƒ¢ãƒ¼ãƒ‰ を抜ã‘ã¦ã€ç·¨é›†é ˜åŸŸã«ã“ã®å€™è£œãŒè¡¨ç¤ºã•れã¾ã™ã€‚ @end ifset @ifset en To select the matched candidate, type @samp{RET}. Then the search mode is finished and the matched candidate is displayed in the writable area. @end ifset @example Folder name (+inbox): +work/mew-release @end example @ifset ja ã•ら㫠@samp{RET} を押ã›ã°ã€ã“ã®ãƒ•ォルダãŒå…¥åŠ›ã•れãŸã“ã¨ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en Typing @samp{RET} again means that you decide the folder. @end ifset @ifset ja 検索対象ã¨ãªã‚‹ãƒ•ォルダã®ä¸€è¦§ã¯ã€ã‚±ãƒ¼ã‚¹ã¨ä¿®é£¾å­ã®çµ„ã§æ±ºå®šã•れã¾ã™ã€‚ @samp{C-s} ã‚„ @samp{C-r} ã§æ¤œç´¢ãƒ¢ãƒ¼ãƒ‰ã«ç§»ã‚‹ã¨ãã«ç·¨é›†é ˜åŸŸã«ã‚る文字列㋠らã€ã‚±ãƒ¼ã‚¹ã¨ä¿®é£¾å­ãŒåˆ‡ã‚Šå‡ºã•れã€ãƒ•ォルダã®ä¸€è¦§ãŒæ±ºå®šã•れる訳ã§ã™ã€‚ @end ifset @ifset en A list of folders to be searched is decided by a combination of "case" and proto. When you enter the search mode by typing @samp{C-s} or @samp{C-r}, a pair of "case" and proto is extracted from the writable area, and a list of folders is selected according to the pair. @end ifset @c %%%%%%%%%%%%%%%%% @node sum-write, features, moving, Viewing @ifset ja @section é€ä¿¡ã€è¿”ç­”ã€è»¢é€ @end ifset @ifset en @section Write, answer, and forward @end ifset @kindex w (Summary) @kindex C-uw (Summary) @kindex W (Summary) @kindex a (Summary) @kindex A (Summary) @kindex f (Summary) @kindex F (Summary) @kindex E (Summary) @ifset ja メッセージã®é€ä¿¡ã€è¿”ç­”ã€è»¢é€ã«ã¯ã€ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’使ã„ã¾ã™ã€‚ @end ifset @ifset en Please use the following commands for writing, replying, and forwarding messages. @end ifset @table @samp @ifset ja @item w メッセージを書ã。新ã—ã„è‰ç¨¿ãŒ Draft モードã«ç”¨æ„ã•れる。 @xref{Composing} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item C-uw メッセージを書ã。新ã—ã„è‰ç¨¿ãŒ Draft モードã«ç”¨æ„ã•れる。ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ ジ㮠From: ã«ã‚るアドレスãŒã€è‰ç¨¿ã® To: ã¸ã‚³ãƒ”ーã•れる。 @item W ã‚るメッセージã®ãƒ˜ãƒƒãƒ€ã®ä¸€éƒ¨ã ã‘を編集ã—メッセージをé€ä¿¡ã™ã‚‹ãŸã‚ã« Header モードã«å…¥ã‚‹ã€‚@xref{resend} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item a ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«è¿”ç­”ã™ã‚‹ã€‚Draft モードã«è‰ç¨¿ãŒç”¨æ„ã•れã€To: ã‚„ Cc: ãŒ è‡ªå‹•çš„ã«æ±ºå®šã•れる。@xref{reply} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item C-ua ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—é€ä¿¡è€…å®›ã«è¿”ç­”ã™ã‚‹ã€‚ @item A ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«è¿”ç­”ã™ã‚‹ã€‚Draft モードã«è‰ç¨¿ãŒç”¨æ„ã•れã€To: ã‚„ Cc: ãŒ è‡ªå‹•çš„ã«æ±ºå®šã•れãŸå¾Œã€æœ¬æ–‡ãŒå¼•用ã•れる。@xref{reply} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item C-uA ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã€å¼•用付ãã§é€ä¿¡è€…å®›ã«è¿”ç­”ã™ã‚‹ã€‚ @item f ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’第 3 者ã«è»¢é€ã™ã‚‹ã€‚Draft モードã«è‰ç¨¿ãŒç”¨æ„ã•れã€ç¾åœ¨ã® メッセージãŒè‡ªå‹•çš„ã«æ·»ä»˜ã•れる。@xref{forward} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item F @samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’第 3 者ã«è»¢é€ã™ã‚‹ã€‚Draft モードã«è‰ç¨¿ ãŒç”¨æ„ã•れã€@samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè‡ªå‹•çš„ã«æ·»ä»˜ã•れる。詳㗠ã㯠@xref{target mark} ã‚’å‚ç…§ã®ã“ã¨ã€‚@xref{forward} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @end ifset @ifset en @item w Write a message. A new draft is prepared in Draft mode. Please refer to @ref{Composing}. @item C-uw Write a message. A new draft is prepared in Draft mode. The From: address of the current message is copied to the To: field in the draft. @item W Send a message by modifying a part of the header of another message. Please refer to @ref{resend}. @item a Answer to this message. A new draft is prepared in Draft mode. Mew automatically inserts the content of the fields To: and Cc:. Please refer to @ref{reply}. @item C-ua Answer to this message only to the sender. @item A Answer to this message. A new draft is prepared in Draft mode. Mew automatically inserts the content of the fields To: and Cc: and cites the body. Please refer to @ref{reply}. @item C-uA Answer to this message only to the sender with citation. @item f Forward this message to a third person. A new draft is prepared in Draft mode and this message is automatically attached. Please refer to @ref{forward}. @item F Forward messages marked with @samp{*} to a third person. A new draft is prepared in Draft mode and this message is automatically attached. For more information, refer to @ref{target mark}. Please refer to @ref{forward}. @end ifset @end table @ifset ja エラーメッセージãŒè¿”ã£ã¦ããŸã‚‰ã€ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ã§ä¿®æ­£ã—冿Œ‘戦ã—ã¾ã—ょã†ã€‚ @end ifset @ifset en If an error message returns, please try again with the following commands. @end ifset @table @samp @ifset ja @item E メッセージã®å†ç·¨é›†ã€‚ã¾ãŸã¯ã€MIME å½¢å¼ã§ã‚«ãƒ—セル化ã•ã‚Œã¦æˆ»ã£ã¦ããŸãƒ¡ãƒƒã‚»ãƒ¼ ジã®å†ç·¨é›†ã€‚ @enumerate @item +draft ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå˜ã«ç·¨é›†ã•れる。 @item +queue 㨠+postq ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒ +draft ã«ç§»å‹•ã•れã¦ã€ç·¨é›†ã•れる。 @item ãれ以外ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒ +draft ã«ã‚³ãƒ”ーã•れã¦ã€ç·¨é›†ã•れる。 @end enumerate +draftã€+queueã€+postq ã§ã¯ã€ã‚±ãƒ¼ã‚¹ãŒå¾©æ´»ã™ã‚‹ã€‚ ä»–ã®ãƒ•ォルダã§ã¯ã€@samp{mew-case-guess-when-prepared} ㌠@samp{t} ãªã‚‰ã€ ヘッダã®ãれãžã‚Œã®ãƒ•ィールドãŒã‚±ãƒ¼ã‚¹ã«å¾“ã£ã¦ç½®ãæ›ãˆã‚‰ã‚Œã‚‹ã€‚詳ã—ã㯠@xref{config} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item C-uE @samp{E} ã¨åŒã˜ã€‚ãŸã ã—ã€+draftã€+queueã€+postq 以外ã®ãƒ•ォルダã§åˆ©ç”¨ã•れ ãŸå ´åˆã¯ã€@samp{mew-case-guess-when-prepared} ㌠@samp{t} ã§ã‚‚ã€ã‚ªãƒªã‚¸ãƒŠ ルã®ãƒ˜ãƒƒãƒ€ãŒä¿å­˜ã•れる。 @end ifset @ifset en @item E Edit this message again to retry sending. Or edit this RFC822 part typically included in a MIME-encapsulated error message. @enumerate @item In +draft, the message is just edited. @item In +queue or +postq, the message is moved to +draft and is edited. @item Otherwise, the message is copied to +draft and is edited. @end enumerate For +draft, +queue, and +postq, the "case" revives. For the other folders, if @samp{mew-case-guess-when-prepared} is @samp{t}, each field of the original header is replaced according to a guessed "case". For more information, see @ref{config}. @item C-uE The same as @samp{E}. But, when used for other folders than +draft, +queue, and +postq, the original header is retained even if @samp{mew-case-guess-when-prepared} is @samp{t}. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node features, status-update, sum-write, Viewing @ifset ja @section ä¾¿åˆ©ãªæ©Ÿèƒ½ @end ifset @ifset en @section Useful features @end ifset @vindex mew-print-function @vindex mew-use-header-veil @vindex mew-header-veil-count @kindex v (Summary) @kindex zv (Summary) @kindex _ (Summary) @kindex M-l (Summary) @kindex C-cC-s (Summary) @kindex C-cC-r (Summary) @kindex y (Summary) @kindex b (Summary) @kindex # (Summary) @kindex | (Summary) @kindex B (Summary) @kindex D (Summary) @kindex C-uD (Summary) @kindex C-cC-a (Summary) @kindex C-cC-v (Summary) @kindex C-cC-z (Summary) @kindex C (Summary) @kindex = (Summary) @kindex ; (Summary) @kindex Rd (Summary) @kindex Rr (Summary) @ifset ja Mew ã§ã¯ã€Summary モードã«ä»¥ä¸‹ã®ã‚ˆã†ãªä¾¿åˆ©ãªã‚³ãƒžãƒ³ãƒ‰ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en Mew provides you with the following useful commands in Summary mode: @end ifset @table @samp @ifset ja @item v 「Summary モードã®ã¿ã€ã¨ã€ŒSummary & Message モードã€ã®åˆ‡ã‚Šæ›¿ãˆã€‚ 「Summary モードã®ã¿ã€ã‚’é¸ã‚“ã§ã„ã‚‹å ´åˆã¯ã€@samp{d} ã¯æ¬¡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表 示ã—ãªã„ã®ã§ã€é€£ç¶šã—ã¦ã™ã°ã‚„ã @samp{D} マークを付ã‘られる。 @item zv @samp{mew-use-header-veil} ㌠@samp{nil} ã§ãªã„ã¨ãã€To: 㨠Cc: ã§ @samp{mew-header-veil-count} ã‚’è¶Šãˆã‚‹è¡Œã¯ã€Œãƒ™ãƒ¼ãƒ«ã€ã§éš ã•れã¦ã„る。ã“㮠コマンドã¯ã€ãれらã®è¡Œã®è¦‹ãˆã‚‹ï¼è¦‹ãˆãªã„ã‚’å転ã•ã›ã‚‹ã€‚ @samp{mew-use-header-veil} 㨠@samp{mew-header-veil-count} ã®åˆæœŸå€¤ã¯ã€ ãれãžã‚Œ @samp{t} 㨠4。 @item _ 通常ã®è¡Œã€æŠ˜ã‚Šè¿”ã•れãŸè¡Œã€é•·ã„行ã®é †ã«è¡Œã®è¡¨ç¤ºã‚’変ãˆã‚‹ã€‚ @item M-l ç¾åœ¨ã®è¡Œã‚’ Summary モードã®ä¸­å¤®ã«ç§»å‹•ã•ã›ã‚‹ã€‚ @item C-cC-s Message モードã§é †æ–¹å‘段階的検索。 @item C-cC-r Message モードã§é€†æ–¹å‘段階的検索。 @item y メッセージã€ã‚ã‚‹ã„ã¯ã€ãƒ‘ートを入力ã—ãŸãƒ•ァイルåã§ä¿å­˜ã™ã‚‹ã€‚ @item b Message モードã®å†…容ãã®ã‚‚ã®ã‚’入力ã—ãŸãƒ•ァイルåã§ä¿å­˜ã™ã‚‹ã€‚ @item C-uy ä¿å­˜ã™ã‚‹ãƒ†ã‚­ã‚¹ãƒˆã® coding-system を指定ã—ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã€ã‚ã‚‹ã„ã¯ã€ãƒ‘ー トを入力ã—ãŸãƒ•ァイルåã§ä¿å­˜ã™ã‚‹ã€‚ @item # @samp{mew-print-function} を利用ã—㦠Message モードã®å†…容をå°åˆ·ã™ã‚‹ã€‚ @item C-u# プリンタåを指定ã—㦠Message モードã®å†…容をå°åˆ·ã™ã‚‹ã€‚ @item | Message モードã®å†…å®¹ã‚’ãƒ‘ã‚¤ãƒ—ã§æŒ‡å®šã•れãŸã‚³ãƒžãƒ³ãƒ‰ã«å‡ºåŠ›ã™ã‚‹ã€‚ @item C-u| Message ãƒ¢ãƒ¼ãƒ‰ã®æœ¬æ–‡(ヘッダを除ã)ã‚’ãƒ‘ã‚¤ãƒ—ã§æŒ‡å®šã•れãŸã‚³ãƒžãƒ³ãƒ‰ã«å‡ºåŠ›ã™ã‚‹ã€‚ @item \ ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’引数ã«ã—ã¦ã€å…¥åŠ›ã•れãŸå¤–部コマンドを起動ã™ã‚‹ã€‚ @item B æ ¼ç´ã•れã¦ã„るメッセージをå–り出ã™ã€‚ @item C-uB æ ¼ç´ã•れã¦ã„るファイルをå–り出ã™ã€‚ @item C-cC-a ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æƒ…報をアドレス帳ã«ç™»éŒ²ã™ã‚‹(@xref{addrbook})。 @item C-cC-v PGP ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã‚’切替ãˆã‚‹(@xref{cipher-viewing})。 @item C-cC-z 昔ãªãŒã‚‰ã®è‡ªå‹•処ç†ã§ããªã„ PGP メッセージを PGP ã«å¾©å·åŒ–ã€æ¤œè¨¼ã•ã›ã‚‹(@xref{cipher-viewing})。 @item C ケースを変更ã™ã‚‹ã€‚詳ã—ãã¯ã€@xref{config} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item = フォルダåã¨ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ç•ªå·ã‚’表示ã™ã‚‹ã€‚キャッシュ・メッセージã®å ´åˆã¯ã€ 加ãˆã¦ ID ã¨ã‚µã‚¤ã‚ºã‚‚表示ã™ã‚‹ã€‚メッセージã¸ã®ãƒ•ルパスãŒã€ã‚¦ã‚¤ãƒ³ãƒ‰ã‚¦ãƒžãƒãƒ¼ ジャã®ã‚«ãƒƒãƒˆãƒãƒƒãƒ•ã‚¡ã«å…¥ã‚‹ã€‚ @item ; Received: フィールドを解æžã—ã€åˆ†ã‚Šã‚„ã™ã Message モードã«è¡¨ç¤ºã™ã‚‹ã€‚ @item Rd フォルダを削除ã™ã‚‹ã€‚ @item Rr フォルダã®åå‰ã‚’変ãˆã‚‹ã€‚ @end ifset @ifset en @item v Toggle "Summary mode only" and "Summary & Message mode". If you choose "Summary mode only", you can quickly put the @samp{D} mark since the next message is not displayed. @item _ Toggle normal lines, wrapped lines and long lines. @item zv If @samp{mew-use-header-veil} is non-nil, field lines of To: and Cc: over @samp{mew-header-veil-count} are covered with invisible veils. This commands toggles visibility of these lines. @samp{mew-use-header-veil} and @samp{mew-header-veil-count} are default to @samp{t} and 4, respectively. @item M-l Make the current line the center of the Summary mode. @item C-cC-s Incremental search forward in Message mode. @item C-cC-r Incremental search backward in Message mode. @item y Save this message or this part into the file whose name is specified by you. @item b Save the buffer of Message mode as is into the file whose name is specified by you. @item C-uy Save this message or this part into the file whose name is specified by you, specifying coding-system for text. @item # Print the content of Message mode according to @samp{mew-print-function}. @item C-u# Print the content of Message mode with a specified printer name. @item | Send the content of Message buffer to a command via pipe. @item C-u| Send the body of Message buffer (excluding its header) to a command via pipe. @item \ Executing an external command specifying this message as an argument. @item B De-capsulate embedded messages in MIME format. @item C-uB Decompose embedded files in this message. @item C-cC-a Register the information on the current message to Addrbook (@pxref{addrbook}). @item C-cC-v Select PGP version (@xref{cipher-viewing}). @item C-cC-z Let PGP decrypt and/or verify old fashioned PGP messages (@pxref{cipher-viewing}). @item C Change the value of the "case". For more information, please refer to @ref{config}. @item = Display the folder name of this message and the message number. If this is a cache message, both the unique id and the size are also shown. The full path to the message is set to the cut buffer of your window manager. @item ; Parse the Received: fields and display them in Message mode. @item Rd Delete this folder. @item Rr Rename this folder. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node status-update, invalid, features, Viewing @ifset ja @section çŠ¶æ…‹ã®æ›´æ–° @end ifset @ifset en @section Updating status @end ifset @vindex mew-use-8bit @vindex mew-debug @vindex mew-decode-broken @vindex mew-warning-field-level @vindex mew-use-old-pgp @vindex mew-use-header-veil @kindex Z (Summary) @kindex C-uZ (Summary) @kindex z8 (Summary) @kindex zc (Summary) @kindex zd (Summary) @kindex zo (Summary) @kindex zp (Summary) @kindex zv (Summary) @kindex zw (Summary) @ifset ja ã„ãã¤ã‹ã®è¨­å®šã®å¤‰æ›´ã«ã¯ã€ãã®å¤‰æ›´ã‚’åæ˜ ã™ã‚‹ãŸã‚ã«ã€çŠ¶æ…‹ã‚’æ›´æ–°ã—ãªã‘れ㰠ãªã‚‰ãªã„å ´åˆãŒã‚りã¾ã™ã€‚変更ãŒå映ã•れãªã‹ã£ãŸã‚Šã€å¤‰æ›´ã®ãŸã‚ã«ã‚¨ãƒ©ãƒ¼ãŒç”Ÿ ã˜ã‚‹ã‚ˆã†ã«ãªã£ãŸã‚Šã—ãŸå ´åˆã¯ã€ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’利用ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en In some cases of configuration modifications, you have to update status to reflect them. When you think configuration modifications don't make any effects or some errors occur, use one of the following commands: @end ifset @table @samp @ifset ja @item Z アドレス帳(@xref{addrbook})ãªã©ã®æƒ…報を更新ã™ã‚‹ã€‚ @item C-uZ ç¾åœ¨ã®ä¸–界ã«å¯¾ã™ã‚‹ãƒ•ォルダã®ãƒªã‚¹ãƒˆã®æƒ…報を更新ã™ã‚‹ã€‚ @end ifset @ifset en @item Z Update information including Addrbook (@pxref{addrbook}). @item C-uZ Update information about folders of the current world. @end ifset @end table @ifset ja 状態をå転ã•ã›ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’以下ã«ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en Here is a summary of toggle commands. @end ifset @table @samp @ifset ja @item z8 8 ビット・モード(@samp{mew-use-8bit})ã‚’å転ã•ã›ã‚‹ã€‚ @item zc è§£æžã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã‚’消去ã™ã‚‹ã€‚ @item zd @samp{mew-debug} ã‚’å転ã•ã›ã‚‹ã€‚ @item zo PGP ã‚’çœç•¥æ–¹æ³•ã§ä½œæˆã™ã‚‹å ´åˆã€PGP/MIME ãªã®ã‹å¤ã„ PGP ã®æ›¸å¼ãªã®ã‹ (@samp{mew-use-old-pgp})ã‚’å転ã•ã›ã‚‹ã€‚ @item zp è§£æžã€å¾©å·åŒ–ã®ãƒãƒªã‚·(@samp{mew-decode-broken})ã‚’å転ã•ã›ã‚‹ã€‚ @item zv Message モードã§ãƒ™ãƒ¼ãƒ«ã‚’使ã†ã‹å¦ã‹(@samp{mew-use-header-veil})ã‚’å転㕠ã›ã‚‹ã€‚ @item zw 警告ã®ãƒ¬ãƒ™ãƒ«(@samp{mew-warning-field-level})㌠2 ãªã‚‰ 1 ã¸ã€1 ãªã‚‰ 2 㸠設定ã™ã‚‹ã€‚ @end ifset @ifset en @item z8 Toggle 8bit mode (i.e. @samp{mew-use-8bit}). @item zc Clean-up caches of analyzed messages. @item zd Toggle @samp{mew-debug}. @item zo Toggle PGP/MIME or old-fashioned PGP (@samp{mew-use-old-pgp}) when composing with shortcut methods. @item zp Toggle decode policy (i.e. @samp{mew-decode-broken}). @item zv Toggle whether or not veil is used in Message mode(@samp{mew-use-header-veil}). @item zw Toggle warning level. If @samp{mew-warning-field-level} is 2, set it to 1. If @samp{mew-warning-field-level} is 1, set it to 2. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node invalid, Composing, status-update, Viewing @ifset ja @section è¦æ ¼é•åã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ @end ifset @ifset en @section Invalid messages @end ifset @vindex mew-decode-quoted @kindex C-u. (Summary) @kindex C-cC-l (Summary) @kindex C-uC-cC-l (Summary) @ifset ja 以下ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€Content-Type: ã§ charset ãŒæŒ‡å®šã•れã¦ã„ãªã„ã® ã§ã€æœ¬æ¥ US-ASCII ã¨èªè­˜ã•れã¦ã—ã¾ã„ã¾ã™ã€‚ @end ifset @ifset en The following message contains Japanese text in its body. The charset parameter is not specified in the Content-Type: field. So, the body should be treated as US-ASCII. @end ifset @example @ifset ja To: piglet Subject: è¦æ ¼é•åã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ From: pooh MIME-Version: 1.0 Content-Type: Text/Plain æ—¥æœ¬èªžã®æœ¬æ–‡ @end ifset @ifset en To: piglet Subject: an invalid message From: pooh MIME-Version: 1.0 Content-Type: Text/Plain Japanese comes here. @end ifset @end example @ifset ja ã¾ãŸä»¥ä¸‹ã®ã‚ˆã†ãªãƒ˜ãƒƒãƒ€ã‚‚è¦æ ¼é•åã§ã™ã€‚ @end ifset @ifset en The following header is invalid as well. @end ifset @example From: "=?iso-2022-jp?B?GyRCOzNLXE9CSScbKEI=?=" @end example @ifset ja 上ã®ä¾‹ã§ã¯ "=?" 㨠"?=" ã§å›²ã¾ã‚ŒãŸéƒ¨åˆ†ã¯ã‚‚ã¨ã‚‚ã¨æ—¥æœ¬èªžã§ã—ãŸã€‚メッセージ ã®è¦æ ¼ã§ã¯ãƒ˜ãƒƒãƒ€ã«ã¯ ASCII ã®ã¿ãŒæ ¼ç´ã§ãã‚‹ã¨å®šã‚られã¦ã„ã¾ã™ã€‚よã£ã¦ã€ ASCII ä»¥å¤–ã®æ–‡å­—ã‚³ãƒ¼ãƒ‰ã‚’ãƒ˜ãƒƒãƒ€ã«æ ¼ç´ã™ã‚‹ã«ã¯ã€ã‚ã‚‹è¦å‰‡ã«å¾“ã£ã¦ ASCII 㫠符å·åŒ–ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ã—ã‹ã—ã€ã“ã®ç¬¦å·åŒ–ã•ã‚ŒãŸæ–‡å­—列を 「"〠ã§å›²ã‚€ ã®ã¯é–“é•ã„ã§ã™ã€‚「"ã€ã§å›²ã¾ã‚ŒãŸæ–‡å­—列ã¯ã€ãã®ã¾ã¾ã®å½¢ã§å–り扱ã‚れã¾ã™ã€‚ よã£ã¦ã€ä¸Šã®ä¾‹ã® "=?" 㨠"?=" ã§å›²ã¾ã‚ŒãŸéƒ¨åˆ†ãŒæ—¥æœ¬èªžã«å¾©å·åŒ–ã•れるã“ã¨ã¯ 本æ¥ã‚りã¾ã›ã‚“。 @end ifset @ifset en The string delimited by "=?" and "?=" in the above example was originally Japanese. Since the spec of mail limits the content of headers to ASCII characters, if a string whose character set is other than ASCII, is to be stored in a header, the string must be encoded with ASCII strings according to the defined rule. But it is certainly invalid to embed the ASCII strings with @samp{"}. Strings surrounded by @samp{"} are treated as is. Therefore, the string between "=?" and "?=" in the example will not be decoded into Japanese. @end ifset @ifset ja è¦æ ¼ã«ç„¡é “ç€ãªä¸€éƒ¨ã®ãƒ¡ãƒ¼ãƒ©ã§ã¯ã“ã®ã‚ˆã†ãªé–“é•ã„を平気ã§çНã—ã¾ã™ã€‚æ­£ã—ã„対 処方法ã¯ã€ã“ã®ã‚ˆã†ãªãƒ¡ãƒ¼ãƒ©ã®ä½œè€…ã«é ¼ã‚“ã§ã€è¦æ ¼ã‚’æ­£ã—ã実装ã™ã‚‹ã‚ˆã†ã«å¤‰æ›´ ã—ã¦ã‚‚らã†ã“ã¨ã§ã™ã€‚ã—ã‹ã—ã€ã“ã®ã‚ˆã†ãªãƒ¡ãƒ¼ãƒ©ã¯ã‚ã¾ã‚Šã«ã‚‚多ã„ã®ã§ã€Mew ã§ ã¯ã§ãã‚‹é™ã‚Šå¾©å·åŒ–ã™ã‚‹ã‚ˆã†è©¦ã¿ã¾ã™ã€‚ãã—ã¦ã€ä»¥ä¸‹ã®ã‚ˆã†ãªè­¦å‘Šã‚’ヘッダã«å‡º ã—ã¾ã™ã€‚ @end ifset @ifset en Several mailers are careless about the spec and regularly violate these rules. The right way to do is ask the programmers of such mailers to make the programs conformant to the spec. However, since there are so many mailers of this kind around the world, Mew tries to decode as many different formats as possible. In these cases Mew displays warnings such as: @end ifset @example X-Mew: Charset for body is not specified. To: has encoded-words in quoted text. @end example @ifset ja ã‚‚ã—ã€è¦æ ¼ã«å޳坆ã«å¾©å·åŒ–ã—ãŸã„ã®ãªã‚‰ã€@samp{mew-decode-broken} ã‚’ @samp{nil} 㫠設定ã—ã¦ä¸‹ã•ã„。ã“ã®å€¤ã¯ @samp{C-u.} を使ã†ã¨å‹•çš„ã«å転ã§ãã¾ã™ (@xref{singlepart} ã‚’å‚ç…§)。 @end ifset @ifset en If you want to decode messages strictly, set @samp{mew-decode-broken} to @samp{nil}. This value can be toggled dynamically by @samp{C-u.} (see @ref{singlepart}). @end ifset @ifset ja 次ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€charset ã§æŒ‡ç¤ºã•れã¦ã„る文字コードã¨å®Ÿéš›ã®æ–‡å­—ãŒç•° ãªã‚‹ãŸã‚ã€æ–‡å­—化ã‘ã‚’èµ·ã“ã—ã¾ã™ã€‚ @end ifset @ifset en The following message is displayed as a mess since the character set specified with the charset parameter and the actual character set of its body are different. @end ifset @ifset ja @example Content-Type: Text/Plain; charset=ISO-2022-JP Shift_JIS ã§æ›¸ã‹ã‚ŒãŸæ—¥æœ¬èªžã®æœ¬æ–‡ @end example @end ifset @ifset en @example Content-Type: Text/Plain; charset=ISO-2022-JP Japanese text written in Shift_JIS @end example @end ifset @ifset ja @samp{C-cC-l} を使ãˆã°ã€charset ã§æŒ‡å®šã•ã‚ŒãŸæ–‡å­—コードを無視ã—ã€æŒ‡å®šã—ãŸ è¨€èªžã®æŽ¨æ¸¬è¦å‰‡ã«å¾“ã£ã¦æ–‡å­—コードを推測ã—ã€å†è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã¾ ãŸã€@samp{C-uC-cC-l} ã§æ˜Žç¤ºçš„ã«æ–‡å­—コードを指定ã—ã€å†è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ã‚‚å¯ èƒ½ã§ã™ã€‚ @end ifset @ifset en By using @samp{C-cC-l}, the text is re-displayed with charset guessed according to a specified language, ignoring the character set specified by the charset parameter. If you type @samp{C-uC-cC-l}, you can re-display the text by specifying a character set explicitly. @end ifset @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Composing @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Composing, header, invalid, Top @ifset ja @chapter メッセージを作æˆã™ã‚‹ @end ifset @ifset en @chapter Composing messages @end ifset @vindex mail-user-agent @kindex M-x mew-send @kindex C-xm @kindex w (Summary) @kindex a (Summary) @kindex A (Summary) @kindex f (Summary) @kindex F (Summary) @ifset ja ã“ã“ã§ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä½œæˆæ–¹æ³•ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ @end ifset @ifset en This section explains how to compose a message. @end ifset @ifset ja æ–°ã—ã„メッセージを書ããŸã‚ã«ã€Draft モードã«ç§»è¡Œã™ã‚‹ã«ã¯ã€æ¬¡ã®æ‰‹æ®µãŒã‚り ã¾ã™ã€‚ @end ifset @ifset en Methods to enter Draft mode to write a new message are given below. @end ifset @enumerate @ifset ja @item @samp{M-x mew-send} ã¨å…¥åŠ›ã™ã‚‹ã€‚ @item @samp{mail-user-agent} ãŒè¨­å®šã•れã¦ã„ã‚‹å ´åˆã€@samp{C-xm} ã¨å…¥åŠ›ã™ã‚‹ã€‚ @item Summary モード㧠@samp{w} を押ã™ã€‚ @end ifset @ifset en @item Type @samp{M-x mew-send}. @item Type @samp{C-xm} if @samp{mail-user-agent} is configured. @item Press @samp{w} in Summary mode. @end ifset @end enumerate @ifset ja ã™ã‚‹ã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ãªãƒãƒƒãƒ•ã‚¡ãŒç”¨æ„ã•れã¾ã™ã€‚ @end ifset @ifset en Then a buffer like the following is prepared. @end ifset @example To: Subject: From: Kazu Yamamoto X-Mailer: @value{X-Mailer} ---- @end example @ifset ja ã“れを Draft モードã¨ã„ã„ã¾ã™ã€‚Draft モードã«ãŠã„ã¦ã€"----" より上をヘッ ダã€ä¸‹ã‚’本文ã¨å‘¼ã³ã¾ã™ã€‚ @end ifset @ifset en We call this "Draft mode". In Draft mode, we call the region above @w{"}----" the header, and the region below "----" the body. @end ifset @ifset ja ã¾ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã®è¿”ç­”(@samp{a} ã‚„ @samp{A})や転é€(@samp{f} ã‚„ @samp{F}) ã§ã‚‚ Summary モードã‹ã‚‰ Draft モードã¸ç§»è¡Œã—ã¾ã™ã€‚ @end ifset @ifset en Also, replying a message (@samp{a} or @samp{A}) and/or forwarding messages (@samp{f} or @samp{F}) lead you to Draft mode from Summary mode. @end ifset @ifset ja è‰ç¨¿ã¯ã€+draft フォルダã®ä¸‹ã«ä½œæˆã•れã¾ã™ã€‚åŒæ™‚ã«è¤‡æ•°ã®è‰ç¨¿ã‚’æŒã¤ã“ã¨ãŒ å¯èƒ½ã§ã™ã€‚ @end ifset @ifset en Drafts are temporarily stored in the +draft folder. You can write multiple messages simultaneously. @end ifset @ifset ja 一旦用æ„ã—ãŸè‰ç¨¿ã‚’削除ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€@xref{Quit} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en For the method of deleting a prepared draft, please refer to @ref{Quit}. @end ifset @ifset ja 以下ã€Draft モードã®ä½¿ã„方を説明ã—ã¾ã™ã€‚ @end ifset @ifset en Now let's see how to use Draft mode. @end ifset @menu @ifset ja * header:: ヘッダã®è£œå®Œ * cheader:: ヘッダã®å¾ªç’°çš„ãªè£œå®Œ * addr-comp:: アドレスã®è£œå®Œ * addrbook:: アドレス帳 * auto-alias:: アドレスã®è‡ªå‹•学習 * addr-comp1:: アドレスã®è£œå®Œ(1) * addr-comp2:: アドレスã®è£œå®Œ(2) * send:: メッセージã®é€ä¿¡ * cite:: シグニãƒãƒ£ã¨å¼•用 * mime-comp:: マルãƒãƒ‘ートã®ä½œæˆ * charset-guess:: æ–‡å­—ã‚³ãƒ¼ãƒ‰ã®æ±ºå®š * longline:: é•·ã„行ã®å–り扱ㄠ* reply:: メッセージã¸ã®è¿”ç­”ã¨å®›å…ˆã®æ±ºå®š * forward:: メッセージã®è»¢é€ * resend:: メッセージã®å†é€ * shortcut:: é›»å­ç½²å/æš—å·ãƒ¡ãƒ¼ãƒ«ã‚’作æˆã™ã‚‹ * mark-b-comp:: マークを使ã£ãŸé›»å­ç½²å/æš—å·ãƒ¡ãƒ¼ãƒ«ã®ä½œæˆ * pgp-key:: PGP ã®éµã®é…布 * anonymous:: 宛先を匿åã«ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€ä¿¡ @end ifset @ifset en * header:: Completions in a header * cheader:: Circular completions in a header * addr-comp:: Address Completion * addrbook:: Address book * auto-alias:: Learning addresses * addr-comp1:: Address Completion(1) * addr-comp2:: Address Completion(2) * send:: Sending a message * cite:: Signature and citation * mime-comp:: Composing multipart * charset-guess:: Defining charset * longline:: Handling long lines * reply:: Replying to a message and deciding recipients * forward:: Forwarding messages * resend:: Re-sending messages * shortcut:: Creating signature or cipher message * mark-b-comp:: Mark based composer * pgp-key:: PGP key distribution * anonymous:: Sending messages with anonymous receivers @end ifset @end menu @c %%%%%%%%%%%%%%%%% @node header, cheader, Composing, Composing @ifset ja @section ヘッダã®è£œå®Œ @end ifset @ifset en @section Completions in a header @end ifset @vindex mew-fields @kindex TAB (Draft) @ifset ja ヘッダã§ã¯ @samp{TAB} ã«å¯¾ã—ã€ä»¥ä¸‹ã®ã‚ˆã†ã«å„フィールド用ã®è£œå®Œæ©Ÿèƒ½ãŒå‰²ã‚Šå½“㦠られã¦ã„ã¾ã™ã€‚ @end ifset @ifset en In the header, completions for each field are assigned to @samp{TAB} as follows: @end ifset @itemize @minus @ifset ja @item フィールドåã®è£œå®Œ @item アドレスã®è£œå®Œ (To:ã€Cc: ãªã©) (@xref{addr-comp} ã‚’å‚ç…§) @item フォルダåã®è£œå®Œ (Fcc:) @end ifset @ifset en @item Field completion @item Address completion (To:, Cc:, etc) (see @ref{addr-comp}) @item Folder completion (Fcc:) @end ifset @end itemize @ifset ja <フィールドåã®è£œå®Œ> @end ifset @ifset en @end ifset @ifset ja 行頭ã®å˜èªžä¸­ã§ã€ã—ã‹ã‚‚ã€ä¸Šã®è¡Œã®æœ€å¾ŒãŒ "," ã§çµ‚る継続行ã§ãªã‘れã°ã€ @samp{TAB} ã§ @samp{mew-fields} ã«å®šç¾©ã•れã¦ã„るフィールドåを補完ã§ãã¾ ã™ã€‚ @end ifset @ifset en If the cursor is at the beginning of a line and the previous line does not end with ",", you can complete field defined in the @samp{mew-fields} variable with @samp{TAB}. @end ifset @example To: kazu@@example.org R@samp{TAB} @end example @ifset ja 上記ã®å ´æ‰€ã§ @samp{TAB} を押ã™ã¨ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en At the point above, if you type @samp{TAB}, you get: @end ifset @example To: kazu@@example.org Reply-To: @end example @ifset ja <フォルダåã®è£œå®Œ> @end ifset @ifset en @end ifset @ifset ja Fcc: ãªã©ã®ã‚ˆã†ã«ãƒ•ォルダを補完ã™ã¹ãã¨ã“ã‚ã§ã¯ã€@samp{TAB} ã§ãƒ•ォルダを 補完ã§ãã¾ã™ã€‚以下ã«ä¾‹ã‚’挙ã’ã¦ã¿ã¾ã™ã€‚ @end ifset @ifset en At a point, such as Fcc:, you can complete folder name with @samp{TAB}. For example: @end ifset @example Fcc: @samp{TAB} @end example @ifset ja "+" ãŒè£œå®Œã•れã¾ã™ã€‚ @end ifset @ifset en Here, "+" is completed. @end ifset @example Fcc: +@samp{TAB} @end example @ifset ja @samp{TAB} をもㆠ1 度押ã™ã¨å€™è£œãŒè¡¨ç¤ºã•れるã®ã§ã€å€™è£œã‚’見ãªãŒã‚‰é©åˆ‡ãªæ–‡å­— を入力ã—ã¾ã™ã€‚ @end ifset @ifset en One more type of @samp{TAB} shows candidates. Please type in the appropriate characters then type @samp{TAB}. @end ifset @example Fcc: +b@samp{TAB} @end example @ifset ja 候補ãŒä¸€æ„ã«å®šã¾ã‚Œã°è£œå®Œã•れã¾ã™ã€‚ @end ifset @ifset en If a single candidate can be determined, you get a completion. @end ifset @example Fcc: +backup @end example @c %%%%%%%%%%%%%%%%% @node cheader, addr-comp, header, Composing @ifset ja @section ヘッダã®å¾ªç’°çš„ãªè£œå®Œ @end ifset @ifset en @section Circular completions in a header @end ifset @vindex mew-mail-domain-list @vindex mew-from-list @kindex C-cTAB (Draft) @ifset ja ヘッダã§ã¯ã€@samp{C-cTAB} ã«å¾ªç’°çš„ãªè£œå®Œæ©Ÿèƒ½ãŒå‰²ã‚Šå½“ã¦ã‚‰ã‚Œã¦ã„ã¾ã™ã€‚循環 çš„ãªè£œå®Œæ©Ÿèƒ½ã¨ã¯ã€ã‚るリストã®ã‚る値ãŒãã®ãƒªã‚¹ãƒˆã®æ¬¡ã®å€¤ã«ç½®ãæ›ãˆã‚‰ã‚Œã‚‹ ã“ã¨ã§ã™ã€‚ãƒªã‚¹ãƒˆã®æœ€å¾Œã¯ã€æœ€åˆã«ã¤ãªãŒã£ã¦ã„ã‚‹ã¨è€ƒãˆã¾ã™ã€‚ヘッダ中ã®å¾ªç’° çš„ãªè£œå®Œæ©Ÿèƒ½ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãƒ•ィールドã”ã¨ã«ç•°ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en In a header, circular completions are assigned to @samp{C-cTAB}. Circular completion means that a value of a list is replaced by the next value of the list. The end of the list is considered continuous to the top of the list. Circular completions in a header are different for each field as follows: @end ifset @itemize @minus @ifset ja @item ドメインåã®å¾ªç’°çš„ãªè£œå®Œ (To:ã€Cc: ãªã©) @item From: ã®å¾ªç’°çš„ãªè£œå®Œ (From:) @end ifset @ifset en @item Circular completion of domain name (To:, Cc:, etc) @item Circular completion of From: (From:) @end ifset @end itemize @ifset ja <ドメインåã®å¾ªç’°çš„ãªè£œå®Œ> @end ifset @ifset en @end ifset @ifset ja アドレスを書ãã¹ãフィールドã§ã¯ã€@samp{C-cTAB} ã§ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’補完ã—ã¾ã™ã€‚ 補完ã®å€™è£œã¯ @samp{mew-mail-domain-list} ã‹ã‚‰é¸ã°ã‚Œã¾ã™ã€‚ @end ifset @ifset en On a field where addresses are written, use @samp{C-cTAB} for domain completion. Candidates are selected from @samp{mew-mail-domain-list}. @end ifset @example To: kazu@@@samp{C-cTAB} @end example @ifset ja 上記ã®å ´æ‰€ã®ã‚ˆã†ã«å€™è£œãŒä¸€æ„ã«å®šã¾ã‚‰ãªã„å ´åˆã¯ã€ @samp{mew-mail-domain-list} ã®æœ€åˆã®ãƒ‰ãƒ¡ã‚¤ãƒ³åãŒæŒ¿å…¥ã•れã¾ã™ã€‚ @end ifset @ifset en If you try to complete just after "@@" as up above, the first domain of @samp{mew-mail-domain-list} is inserted. @end ifset @example To: kazu@@example.org@samp{C-cTAB} @end example @ifset ja 補完ã•れãŸå¾Œã€ã•ら㫠@samp{C-cTAB} を押ã™ã¨ @samp{mew-mail-domain-list} ã®æ¬¡ã®å€™è£œã«å¤‰æ›ã—ã¾ã™ã€‚ @end ifset @ifset en After completion, pressing @samp{C-cTAB} one more times inserts the next domain of @samp{mew-mail-domain-list}. This completion is looped. @end ifset @example To: kazu@@example.jp @end example @ifset ja ã¾ãŸã€ä»¥ä¸‹ã®è£œå®ŒãŒä¸€æ„ã«å®šã¾ã‚Œã°ã€ãã®å€™è£œã‚’挿入ã—ã¾ã™ã€‚ @end ifset @ifset en If a single candidate can be determined, it is inserted. @end ifset @example To: kazu@@w@samp{C-cTAB} @end example @ifset ja 上記ã®ä¾‹ã¯æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en The above example gives: @end ifset @example To: kazu@@example.jp @end example @ifset ja @end ifset @ifset en @end ifset @ifset ja è‰ç¨¿ã«ã¯ã€ã‚らã‹ã˜ã‚ "mew-name " ã¨ã„ã†å½¢å¼ã§ã€ From: ãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ãŒæŒ¿å…¥ã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en In Draft mode, the From: field is inserted with the format of "mew-name ". @end ifset @example @ifset ja From: Kazu Yamamoto (山本和彦) @end ifset @ifset en From: Kazu Yamamoto @end ifset @end example @ifset ja From: フィールド上ã§ã¯ã€@samp{C-cTAB} 㯠@samp{mew-from-list} ã®å€¤ã‚’循環 çš„ã«è£œå®Œã—ã¾ã™ã€‚@samp{mew-from-list} ã¯è‡ªåˆ†ã§è¨­å®šã—ã¦ã‚‚よã„ã§ã™ã—ã€è‡ªå‹• çš„ã«è¨­å®šã™ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚自動設定ã«é–¢ã—ã¦ã¯ã€@xref{config} ã‚’å‚ç…§ã—㦠下ã•ã„。 @end ifset @ifset en On the From: field, @samp{C-cTAB} circularly completes its value from @samp{mew-from-list}. You can set @samp{mew-from-list} by yourself. Also, @samp{mew-from-list} can be set automatically. For automatic setup, please refer to @ref{config}. @end ifset @ifset ja 値ã®å ´æ‰€ãªã‚‰ã©ã“ã§ã‚‚æ§‹ã„ã¾ã›ã‚“ãŒã€@samp{C-cTAB} ã¨å…¥åŠ›ã™ã‚‹ã¨ã€ ã“ã®å€¤ã‚’ @samp{mew-from-list} ã®æ¬¡ã®å€¤ã¨ç½®ãæ›ãˆã¾ã™ã€‚ãŸã¨ãˆã°ã€ @end ifset @ifset en Typing @samp{C-cTAB} anywhere on the value replaces the value with the next value of @samp{mew-from-list}. For example, @end ifset @example @ifset ja From: Kazu Yamamoto (山本和彦) @samp{C-cTAB} @end ifset @ifset en From: Kazu Yamamoto @samp{C-cTAB} @end ifset @end example @ifset ja ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en becomes as follows: @end ifset @example From: Kazuhiko Yamamoto @end example @c %%%%%%%%%%%%%%%%% @node addr-comp, addrbook, cheader, Composing @ifset ja @section アドレスã®è£œå®Œ @end ifset @ifset en @section Address Completion @end ifset @ifset ja To: ã‚„ Cc: ã§ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’補完ã§ãã¾ã™ã€‚補完ã«ã¯ @samp{TAB} を用ã„ã¾ã™ã€‚ @end ifset @ifset en You can complete addresses on To: or Cc:. This completion command is bound to @samp{TAB}. @end ifset @example To: kazu@samp{TAB} @end example @ifset ja 上記ã®ã‚ˆã†ã«ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ä¸€éƒ¨ã§ @samp{TAB} を押ã™ã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã‚¢ãƒ‰ãƒ¬ スãŒè£œå®Œã•れる訳ã§ã™ã€‚ @end ifset @ifset en When you type @samp{TAB} after a part of an address as the example above, the entire address is completed as follows: @end ifset @example To: kazu@@example.org @end example @ifset ja アドレスã®è£œå®Œã«åˆ©ç”¨ã•れるアドレスã®ç¨®é¡žã«ã¯ã€ä»¥ä¸‹ã® 3 ã¤ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en There are three kinds of registered addresses to be used for the completion. @end ifset @enumerate @ifset ja @item アドレス帳ã®å±•é–‹è¦å‰‡ @item アドレス帳ã®å€‹äººæƒ…å ± @item é€ä¿¡æ™‚ã«å­¦ç¿’ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ @end ifset @ifset en @item The expansion rule in an address book @item The personal information in the address book @item Learned addresses when sending @end ifset @end enumerate @ifset ja アドレスã®è£œå®Œã«ã¯ 2 ã¤ã®æ–¹æ³•ãŒæä¾›ã•れã¦ã„ã¾ã™ã€‚ @samp{mew-use-full-alias} ã«ã‚ˆã£ã¦é¸æŠžã—ã¾ã™(åˆæœŸå€¤ã¯ @samp{nil})。 @end ifset @ifset en Mew provides two ways to complete addresses. You can select one of them with @samp{mew-use-full-alias}, which is default to @samp{nil}. @end ifset @ifset ja @samp{mew-use-full-alias} ㌠@samp{nil} ã®å ´åˆã€@samp{@@} ã®å‰ã€ã¤ã¾ã‚Šãƒ¦ãƒ¼ ã‚¶å(短縮å)ãŒè£œå®Œã®å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚@samp{TAB} を押ã™ã¨ãƒ¦ãƒ¼ã‚¶åãŒè£œå®Œã• れã€è£œå®Œã—ãã£ãŸã¨ã“ã‚ã§ã•ら㫠@samp{TAB} を押ã™ã¨ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã€Œå±•é–‹ã€ã• れã¾ã™ã€‚ã“れをアドレスã®è£œå®Œ(1)ã¨å‘¼ã³ã¾ã—ょã†ã€‚ @end ifset @ifset en If @samp{mew-use-full-alias} is @samp{nil}, the portion before @samp{@@}, a user name or a short name, is a target of the completion. When you type @samp{TAB}, the user name is completed. And if the user name is uniquely completed and you type @samp{TAB} again, it is expanded to its entire address. Let's call this Address Completion(1). @end ifset @ifset ja アドレスã®è£œå®Œ(1)(@xref{addr-comp1})ã®åˆ©ç‚¹ã¯ã€ä¸Šã«æ›¸ã„㟠3 種類ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ ã«å¯¾ã—ã€è£œå®Œãƒ»å±•é–‹ãŒçŸ›ç›¾ãªã実行ã§ãã‚‹ã“ã¨ã§ã™ã€‚後述ã®ã‚ˆã†ã«ã€ã€Œå¼·åˆ¶å±• é–‹ã€ã‚‚ @samp{TAB} ã§å®Ÿè¡Œã§ãã¾ã™ã€‚欠点ã¯ã€ãƒ¦ãƒ¼ã‚¶åã®éƒ¨åˆ†ãŒä¸€æ„ã§ãªã‘れ ã°ãªã‚‰ãªã„ã®ã§ã€ã‚るユーザåãŒç™»éŒ²ã•れã¦ã„ã‚‹å ´åˆã€åŒã˜ãƒ¦ãƒ¼ã‚¶åã‚’æŒã¤åˆ¥ ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’学習ã§ããªã„ã“ã¨ã§ã™ã€‚ @end ifset @ifset en An advantage of Address Completion(1) (@pxref{addr-comp1}) is that you can use the completion/expansion against the three kinds of addresses seamlessly. You can also explicitly expand the user name with @samp{TAB} as described later. A disadvantage is that user names must be unique. So, if a user name is already registered, other addresses with the same user name cannot be learned. @end ifset @ifset ja @samp{mew-use-full-alias} ㌠@samp{t} ã®å ´åˆã€å­¦ç¿’ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã«é–¢ã—㦠ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å…¨ä½“ãŒè£œå®Œã®å¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚ã“れをアドレスã®è£œå®Œ(2)ã¨å‘¼ã³ ã¾ã—ょã†ã€‚ @end ifset @ifset en If @samp{mew-use-full-alias} is @samp{t}, for learned addresses when sending, completion target is an entire address. Let's call this Address Completion(2). @end ifset @ifset ja アドレスã®è£œå®Œ(2)(@xref{addr-comp2})ã®åˆ©ç‚¹ã¯ã€ãƒ¦ãƒ¼ã‚¶åãŒä¸€è‡´ã—ã¦ã„る複 æ•°ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’学習ã§ãã‚‹ã“ã¨ã§ã™ã€‚欠点ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã®å€‹äººæƒ…å ±ã«ç™»éŒ²ã• れã¦ã„るアドレスã®å…ˆé ­ä»¥å¤–ã¯åˆ©ç”¨ã§ããªã„ã“ã¨ã§ã™ã€‚ã¾ãŸã€ã€Œå¼·åˆ¶å±•é–‹ã€ã¯ã€ @samp{M-C-e} ã¨ã„ㆠ(@samp{TAB} ã¨ã¯åˆ¥ã®) キーを押ã•ãªã‘れã°ã„ã‘ãªã„ã“ ã¨ã§ã™ã€‚ @end ifset @ifset en An advantage of Address Completion(2) (@pxref{addr-comp1}) is that Mew can learn addresses whose user names are the same. One of disadvantages is that only the first address of personal information can be used (the other addresses are useless). And for the explicit expansion, you have to type @samp{M-C-e}, a different key from @samp{TAB}. @end ifset @c %%%%%%%%%%%%%%%%% @node addrbook, auto-alias, addr-comp, Composing @ifset ja @section アドレス帳 @end ifset @ifset en @section Address Book @end ifset @kindex C-cC-a (Summary) @kindex C-uC-cC-a (Summary) @kindex C-cC-c (Addrbook) @kindex C-cC-q (Addrbook) @ifset ja Mew ã§ã¯ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³("~/Mail/Addrbook")ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚アドレス帳ã«ã¯ 2 ã¤ ã®æ›¸å¼ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚一方ã¯ã€Œå±•é–‹è¦å‰‡ã€ã‚’指定ã™ã‚‹æ›¸å¼ã€ä»–æ–¹ã¯ã€Œå€‹äºº 情報ã€ã‚’記述ã™ã‚‹ãŸã‚ã®æ›¸å¼ã§ã™ã€‚ @end ifset @ifset en Mew provides an address book ("~/Mail/Addrbook). The address book has 2 formats. One specifies expansion rules, while the other defines personal information. @end ifset @ifset ja ã¾ãšã€ã€Œå±•é–‹è¦å‰‡ã€ã‚’記述ã™ã‚‹ãŸã‚ã®æ›¸å¼ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en First, let's look at the format that specifies expansion rules. @end ifset @example : [, , ,...] @end example @ifset ja ã“ã®ã‚ˆã†ã«çŸ­ç¸®åã¨å±•é–‹ã™ã¹ãアドレスを @samp{:} ã§åŒºåˆ‡ã£ã¦æ›¸ãã¾ã™ã€‚複数 ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«å±•é–‹ã™ã‚‹å ´åˆã¯ã€ãれらã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’ @samp{,} ã§åŒºåˆ‡ã‚Šã¾ã™ã€‚ (ã“れã¯ã€To: ãªã©ã§ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒ @samp{,} ã§åŒºåˆ‡ã‚‰ã‚Œã¦ã„ã‚‹ã®ã¨åŒã˜ã§ã™ã€‚) @samp{,} ã®å¾Œã‚ã«ç©ºç™½ã‚’入れã¦ã‚‚æ§‹ã„ã¾ã›ã‚“。以下ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en In this way, you should specify a short name and a full address separated by @samp{:}. If you want to expand the short name to multiple addresses, you can delimit them with a comma @samp{,}. (This is exactly same as addresses delimited by @samp{,} in the To: field, for instance.) A space SPC is allowed after the comma @samp{,}. For example: @end ifset @example pooh: winnie-the-pooh@@example.net piglet: piglet@@example.org friends: pooh, piglet @end example @ifset ja 次ã«ã€ã€Œå€‹äººæƒ…å ±ã€ã‚’記述ã™ã‚‹ãŸã‚ã®æ›¸å¼ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en Next, the format to define personal information is shown below: @end ifset @example [, , ,...] @end example @ifset ja ã“ã®ã‚ˆã†ã« 4 ã¤ã®è¦ç´ ã‚’空白ã§åŒºåˆ‡ã‚Šã¾ã™ã€‚ ãŒçŸ­ç¸®åã§ã™ã€‚ 㨠ã¯ãれãžã‚Œãƒ‹ãƒƒã‚¯ãƒãƒ¼ãƒ ã¨æ­£å¼ãªæ°åã§ã‚ã‚Šã€æ—¥æœ¬ 語ã§ã‚‚æ§‹ã„ã¾ã›ã‚“。(ニックãƒãƒ¼ãƒ ã®ä½¿ã„方㯠@xref{summary-mode} 㨠@xref{draft-mode} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。) @end ifset @ifset en In this way, four elements are separated by SPC. is a short name. and are the person's nickname and full name, respectively. (For proper usage of the nickname, please refer to @ref{summary-mode} and/or @ref{draft-mode}.) @end ifset @ifset ja 2 番目ã®è¦ç´ ã¯ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã™ã€‚複数ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’ãã®äººãŒæŒã£ã¦ã„ã‚‹å ´åˆã¯ã€ @samp{,} ã§åŒºåˆ‡ã£ã¦æ›¸ãã¾ã™ã€‚@samp{,} ã®å¾Œã«ç©ºç™½ã‚’入れã¦ã‚‚æ§‹ã„ã¾ã›ã‚“。㤠ã¾ã‚Šã€ã“ã®ç©ºç™½ã¯è¦ç´ ã®åŒºåˆ‡ã‚Šã§ã¯ã‚りã¾ã›ã‚“。ã¾ãŸã€@samp{"} ã§å›²ã¾ã‚ŒãŸç©º 白もè¦ç´ ã®åŒºåˆ‡ã‚Šã«ã¯ãªã‚Šã¾ã›ã‚“。以下ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en The second element is the addresses. If the person has multiple addresses, delimit them using @samp{,}. SPC is allowed after @samp{,}, which means that it does not function as the delimiter. SPC surrounded by quotes @samp{"} also has no delimiting function here. For example: @end ifset @example kazu kazu@@example.org, kazu@@example.net Kazu-kun "Kazuhiko Yamamoto" @end example @ifset ja 「個人情報ã€ã®æ›¸å¼ã§ã¯ã€å„è¦ç´ ã‚’çœç•¥ã§ãã¾ã™ã€‚中間ã®è¦ç´ ã‚’çœç•¥ã™ã‚‹å ´åˆã¯ã€ @samp{*} ã¨æ›¸ã„ã¦ä¸‹ã•ã„。以下ã«ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã«å¯¾ã—ã¦ãƒ‹ãƒƒã‚¯ãƒãƒ¼ãƒ ã®ã¿ã‚’定義 ã™ã‚‹ä¾‹ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en In the personal information format, you can omit any element. When you want to omit an intermediate element, specify @samp{*}. The following is an example to define nicknames for addresses. @end ifset @example * kazu@@example.org, kazu@@example.net Kazu-kun @end example @ifset ja ニックãƒãƒ¼ãƒ ã¯ Summary モードã§ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ç½®ãæ›ãˆã¨ã€Draft モードã§ã® 引用記å·ã®ç½®ãæ›ãˆ(@xref{cite})ã«åˆ©ç”¨ã•れã¾ã™ã€‚ @end ifset @ifset en The nickname is used to replace addresses in Summary mode and to replace the citation prefix (@pxref{cite}) in Draft mode. @end ifset @ifset ja アドレス帳ã®ã‚³ãƒ¡ãƒ³ãƒˆæ–‡å­—㯠@samp{;} 㨠@samp{#} ã§ã™ã€‚@samp{;} ã¯è¡Œé ­ã« ã‚ã‚‹å ´åˆã®ã¿ã‚³ãƒ¡ãƒ³ãƒˆã¨ãªã‚Šã€ãã®è¡ŒãŒç„¡è¦–ã•れã¾ã™ã€‚@samp{#} ã¯ä»»æ„ã®å ´æ‰€ ã§ã‚³ãƒ¡ãƒ³ãƒˆã¨ãªã‚Šã€ãã“ã‹ã‚‰è¡Œæœ«ã¾ã§ãŒç„¡è¦–ã•れã¾ã™ã€‚ã¾ãŸã€@samp{\} ã¯ç¶™ç¶š 行を表ã‚ã—ã¾ã™ã€‚ @end ifset @ifset en The comment letters are @samp{;} and @samp{#}. @samp{;} is valid only when it appears at the beginning of lines, resulting in the disregarding of the entire line. The comment marker @samp{#} is valid everywhere. The strings between @samp{#} and the end of the line are ignored. Also, @samp{\} means a continuous line. @end ifset @ifset ja Summary モードã«ã¯ã€ç¾åœ¨èª­ã‚“ã§ã„ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æƒ…報を Addrbook ã«ç™»éŒ²ã™ る機能ãŒã‚りã¾ã™ã€‚展開è¦å‰‡ã‚’登録ã™ã‚‹ã«ã¯ @samp{C-cC-a} ã¨æŠ¼ã—ã¦ä¸‹ã•ã„。 以下ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en Summary mode includes the feature of directly registering the information of the current message into Addrbook. To register a expansion rule, type @samp{C-cC-a}. @end ifset @example #If you want to register this entry, type 'C-c C-c'. #If you want to NOT register this entry, type 'C-c C-q'. Shortname: kazu Addresses: kazu@@example.org Comments: @end example @ifset ja 個人情報を登録ã™ã‚‹ã«ã¯ @samp{C-uC-cC-a} ã¨æŠ¼ã—ã¦ä¸‹ã•ã„。以下ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en To register personal information, type @samp{C-uC-cC-a}. @end ifset @example #If you want to register this entry, type C-c C-c. #If you want to NOT register this entry, type C-c C-q. Shortname: kazu Addresses: kazu@@example.org Nickname: Name: Kazuhiko Yamamoto Comments: @end example @ifset ja å¿…è¦ã§ã‚れã°åŠ ç­†è¨‚æ­£ã—ã¾ã™ã€‚実際ã«ç™»éŒ²ã™ã‚‹ã«ã¯ @samp{C-cC-c}ã€ç™»éŒ²ã‚’å–り æ­¢ã‚ã‚‹å ´åˆã¯ @samp{C-cC-q} ã¨å…¥åŠ›ã—ã¦ä¸‹ã•ã„。@xref{Quit} ã‚‚å‚ç…§ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Add or modify the information if necessary. To register this information, type @samp{C-cC-c}. To quit the registration, type @samp{C-cC-q}. You should also refer to @ref{Quit}. @end ifset @ifset ja ãªãŠã€Addrbook ã«è¤‡æ•°ã®è¨€èªžã®æ–‡å­—を使ã„ãŸã„å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’ Addrbook ã®å…ˆé ­ã«è¨˜è¿°ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en If you want to use characters of multiple languages, put the following onto the beginning of Addrbook. @end ifset @example #-*-coding:ctext;-*- @end example @c %%%%%%%%%%%%%%%%% @node auto-alias, addr-comp1, addrbook, Composing @ifset ja @section アドレスã®è‡ªå‹•学習 @end ifset @ifset en @section Learning addresses @end ifset @kindex Z (Summary) @vindex mew-addrbook-override-by-newone @vindex mew-lisp-max-length @ifset ja メッセージをé€ä¿¡ã—ãŸå ´åˆã€To: 㨠Cc: ã«æ›¸ã‹ã‚Œã¦ã„るアドレスã¯ã€è‡ªå‹•的㫠学習ã•れã¾ã™ã€‚以下ã®ä¾‹ã‚’考ãˆã¦ä¸‹ã•ã„。 @end ifset @ifset en When you send a message, addresses on the To: and Cc: field are automatically registered. Consider the following: @end ifset @example To: kazu@@example.org @end example @ifset ja アドレスã®è£œå®Œ(1)(@xref{addr-comp1})ã®å ´åˆï¼šã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ã¨ã€ アドレス "kazu@@example.org" ã«å¯¾ã—ã€çŸ­ç¸®å "kazu" ãŒè‡ªå‹•登録ã•れã¾ã™ã€‚ãŸã  ã—ã€ã™ã§ã« "kazu" ã¨ã„ã†çŸ­ç¸®åãŒè‡ªå‹•登録ã•れã¦ã„ã‚‹ãªã‚‰ã€ @samp{mew-addrbook-override-by-newone} ã®å€¤ã«å¿œã˜ã¦ä¸Šæ›¸ãã™ã‚‹ã‹ã‚’決定㗠ã¾ã™ã€‚@samp{nil} ãªã‚‰å¤ã„設定を残ã—ã€ãれ以外ãªã‚‰ä¸Šæ›¸ãã—ã¾ã™ã€‚展開ã®éš› ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã®æ–¹ãŒå„ªå…ˆã•れã¾ã™ã€‚ã§ã™ã‹ã‚‰ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã«ç„¡ã„短縮åã®ã¿ ãŒæœ‰åйã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en In the case of Address Completion(1) (@pxref{addr-comp1}): When this message is sent, a short name "kazu" is automatically registered for the address "kazu@@example.org". If there is already a short name of @w{"}kazu", the next action is decided according to @samp{mew-addrbook-override-by-newone}. If @samp{nil}, the old entry remains. Otherwise, the new entry overrides the old one. When expanded, the address book short name has priority over the automatic short name. Only automatic short names which are not contained in the address book are valid. @end ifset @ifset ja アドレスã®è£œå®Œ(2)(@xref{addr-comp2})ã®å ´åˆï¼šã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹ã¨ã€ アドレス "kazu@@example.org" ãŒè‡ªå‹•登録ã•れã¾ã™ã€‚ @end ifset @ifset en In the case of Address Completion(1) (@pxref{addr-comp2}): When this message is sent, the address "kazu@@example.org" is automatically registered. @end ifset @ifset ja 自動登録ã•れるã®ã¯é€šå¸¸ 2000 個(@samp{mew-lisp-max-length})ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¾ ã§ã§ã™ã€‚ãれを越ãˆã¦ç™»éŒ²ã™ã‚‹ã¨ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆé †ã§æœ€å¾Œã®æ–¹ãŒæ¶ˆãˆã¾ã™ã€‚ã“ ã‚Œã‚‰ã®æƒ…報㯠Mew を終了ã™ã‚‹éš›ã«ã€"~/Mail/.mew-alias" ã«ä¿å­˜ã•れã¾ã™ã€‚ @end ifset @ifset en The limit number of automatic short names is 2000 (@samp{mew-lisp-max-length}). Once the number exceeds 2000, the tail entries in the alphabetical order are removed. This information is automatically saved to the file "~/Mail/.mew-alias". @end ifset @ifset ja 自動登録ã§ã™ã‹ã‚‰ã€ä¸è¦ãªçŸ­ç¸®åも登録ã•れã¾ã™ã€‚ä¸è¦ãªçŸ­ç¸®åを削除ã™ã‚‹ã« ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã™ã‚‹ã¨ã„ã„ã§ã—ょã†ã€‚ã¾ãšã€@samp{M-a} を実行ã—〠@w{"}~/Mail/.mew-alias" ã‚’é–‹ãã¾ã™ã€‚次ã«ã€ãƒ†ã‚­ã‚¹ãƒˆãƒ•ァイルを編集ã™ã‚‹è¦ é ˜ã§ã€ä¸è¦ãªçŸ­ç¸®åを削除ã—ã¾ã™ã€‚ãã—ã¦ã€@samp{C-xC-s} ã§ä¿å­˜ã—ã¦ä¸‹ã•ã„。 ä¿å­˜ã¨åŒæ™‚ã«ã€ãã®å†…容㌠Mew ã«å映ã•れã¾ã™ã€‚ @end ifset @ifset en The automatic registration would register unnecessary short names. If you want to remove these entry, take the following steps. First, type @samp{M-a} to open "~/Mail/.mew-alias". Then edit it as you do against a text file. Lastly, type @samp{C-xC-s} to save it. When saving it, the modifications are automatically reflected to Mew. @end ifset @ifset ja アドレスã®è£œå®Œ(1)ã¨ã‚¢ãƒ‰ãƒ¬ã‚¹ã®è£œå®Œ(2)ã§ã¯ã€"~/Mail/.mew-alias" ã®æ›¸å¼ãŒ ç•°ãªã‚Šã¾ã™ã€‚@samp{mew-use-full-alias} ã®å€¤ã‚’変ãˆã€æ–¹æ³•を切り替ãˆãŸã‚‰ã€ Summary モードã§ä¸€å›ž @samp{Z} を押ã—ã¦ä¸‹ã•ã„。ã“れã§ã€æ›¸å¼ãŒå¤‰æ›ã•れ㾠ã™ã€‚ @end ifset @ifset en The formats of Address Completion (1) and (2) are different. When you change the value of @samp{mew-use-full-alias} to switch one to the other, type @samp{Z} once in Summary mode. This converts the format properly. @end ifset @c %%%%%%%%%%%%%%%%% @node addr-comp1, addr-comp2, auto-alias, Composing @ifset ja @section アドレスã®è£œå®Œ(1) @end ifset @ifset en @section Address Completion(1) @end ifset @ifset ja アドレスã®è£œå®Œ(1)ã§ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã®å±•é–‹è¦å‰‡ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã®å€‹äººæƒ…報〠ãŠã‚ˆã³é€ä¿¡æ™‚ã«å­¦ç¿’ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã§ç™»éŒ²ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ã€ ユーザå(短縮å)ãŒä¸€æ„ã§ã‚ã‚‹ã“ã¨ãŒå‰æã¨ãªã£ã¦ã„ã¾ã™ã€‚ @end ifset @ifset en As far as Address Completion (2) is concerned, there is an assumption: user names or short names of expansion rules, personal information and learned addresses are unique. @end ifset @ifset ja ãŸã¨ãˆã°ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã€Œå±•é–‹è¦å‰‡ã€ã‚’設定ã—ãŸã¨ã—ã¾ã™ã€‚ @end ifset @ifset en For example, consider the following configuration of expansion rules: @end ifset @example pooh: winnie-the-pooh@@example.net @end example @ifset ja Draft モードã®ãƒ˜ãƒƒãƒ€å†…ã§ã€ã‹ã¤ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’書ãã¹ãフィールド上ã§ã€ã—ã‹ã‚‚〠1 æ–‡å­—ä»¥ä¸Šã®æ–‡å­—列ãŒå‰ã«ã‚る場所㧠@samp{TAB} を打ã¤ã¨ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã®çŸ­ç¸®å ãŒè£œå®Œã•れã¾ã™ã€‚ @end ifset @ifset en When you are in a header in Draft mode, working within an address field, after typing one or more characters, you can complete a short name for an address by pressing the @samp{TAB} key. @end ifset @example To: piglet@@example.org, po@samp{TAB} @end example @ifset ja ã“ã®ã‚ˆã†ã« @samp{TAB} を押ã™ã¨ã€(ä»–ã«å€™è£œãŒç„¡ã‘れã°) "pooh" ã¾ã§è£œå®Œã•れ ã¾ã™ã€‚ @end ifset @ifset en If you press the @samp{TAB} key, "pooh" is completed (unless other candidates exist). @end ifset @example To: piglet@@example.org, pooh@samp{TAB} @end example @ifset ja ã‚‚ã†ä¸€åº¦ @samp{TAB} を押ã™ã¨ "winnie-the-pooh@@example.net" ã«å±•é–‹ã•れ ã¾ã™ã€‚ @end ifset @ifset en One more press of the @samp{TAB} key expands the name to @w{"}winnie-the-pooh@@example.net". @end ifset @example To: piglet@@example.org, winnie-the-pooh@@example.net @end example @ifset ja "@@" ã§çµ‚る文字列ã¯å¼·åˆ¶çš„ã«å±•é–‹ã—ã¾ã™ã€‚ãŸã¨ãˆã°ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ä¼¼ãŸã‚ˆã†ãª 短縮åãŒã‚ã£ãŸå ´åˆã‚’考ãˆã¦ä¸‹ã•ã„。 @end ifset @ifset en A string ending with "@@" is explicitly expanded. Please pay attention to the following case where similar short names are defined. @end ifset @example pooh: winnie-the-pooh@@example.net pooh-pooh: pooh-pooh@@example.org @end example @ifset ja "pooh-" ã¾ã§å…¥åŠ›ã™ã‚Œã°ã€"pooh-pooh" ã¾ã§è£œå®Œã§ãã‚‹ã“ã¨ã¯æ˜Žã‚‰ã‹ã§ã™ã€‚ã— ã‹ã—ã€"pooh" ã¾ã§ã ã¨ã€"pooh" を「展開ã€ã™ã‚‹ã®ã‹ã€"pooh-pooh" ã¾ã§è£œå®Œ ã™ã‚‹ã®ã‹åˆ†ã‚Šã¾ã›ã‚“。"pooh" ã‚’ "winnie-the-pooh@@example.net" ã«å¼·åˆ¶çš„㫠展開ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã« @samp{@@} を挿入ã—ã€@samp{TAB} を押ã—ã¾ã™ã€‚ @end ifset @ifset en It is obvious that "pooh-" is completed to "pooh-pooh". But if you input "pooh", Mew cannot tell whether it should be expanded or completed to "pooh-pooh". Thus, if you want to explicitly complete "pooh" to "winnie-the-pooh@@example.net", insert @samp{@@} and type @samp{TAB}. @end ifset @example To: pooh@@@samp{TAB} @end example @ifset ja 強制展開ã¯ã€@samp{@@} を挿入ã›ãšã€@samp{M-C-e} を押ã—ã¦ã‚‚実行ã§ãã¾ã™ã€‚ @end ifset @ifset en Explicit expansion can be accomplished by @samp{M-C-e} instead of insertion of @samp{@@}. @end ifset @ifset ja 上記ã®èª¬æ˜Žã¯ã€é€ä¿¡æ™‚ã«å­¦ç¿’ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã«ã‚‚ã‚ã¦ã¯ã¾ã‚Šã¾ã™ã€‚ @end ifset @ifset en The explanation above can be applied to learned addresses when sending. @end ifset @ifset ja 「個人情報ã€ã®æ›¸å¼ã§ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒé †ã«ç½®ãæ›ãˆã‚‰ã‚Œã¦ã„ãã¾ã™ã€‚以下ã®ä¾‹ を考ãˆã¦ä¸‹ã•ã„。 @end ifset @ifset en The format of personal information means that each subsequently generated address will replace the former one. For example: @end ifset @example kazu kazu@@example.org, kazu@@example.net Kazu-kun "Kazuhiko Yamamoto" @end example @ifset ja kazu ãŒã©ã†å¤‰åŒ–ã™ã‚‹ã®ã‹è¦‹ã¦ã¿ã¾ã—ょã†ã€‚ @end ifset @ifset en Let's watch how it will be converted: @end ifset @example To: kazu@samp{TAB} @end example @ifset ja "kazu" ã®å¾Œã§ @samp{TAB} を打ã¤ã¨ã€"kazu@@example.org" ã«ç½®ãæ›ã‚りã¾ã™ã€‚ @end ifset @ifset en Typing @samp{TAB} after "kazu" generates "kazu@@example.org". @end ifset @example To: kazu@@example.org@samp{TAB} @end example @ifset ja 次㫠"kazu@@example.org" ã®å¾Œã§ @samp{TAB} を打ã¤ã¨ã€"kazu@@example.net" ã« ç½®ãæ›ã‚りã¾ã™ã€‚ @end ifset @ifset en Typing @samp{TAB} after "kazu@@example.org" brings about "kazu@@example.net". @end ifset @example To: kazu@@example.net@samp{TAB} @end example @ifset ja ã•ら㫠"kazu@@example.net" ã®å¾Œã§ @samp{TAB} を打ã¤ã¨ã€ "kazu@@example.org" ã«æˆ»ã‚Šã¾ã™ã€‚ã“ã®ã‚ˆã†ã« @samp{TAB} を押ã™ã¨ã€ã‚¢ãƒ‰ãƒ¬ スãŒå¾ªç’°çš„ã«ç½®æ›ã•れã¾ã™ã€‚ @end ifset @ifset en Then "kazu@@example.org" will appear again if you type @samp{TAB} after @w{"}kazu@@example.net". In this way, each address is replaced one by one. @end ifset @ifset ja アドレスを決定ã—ãŸå¾Œã¯ã€æ­£å¼åç§°ãŒä»˜åŠ ã§ãã¾ã™ã€‚ @end ifset @ifset en After deciding an address, you can add its full name. @end ifset @example To: kazu@@example.org@samp{M-TAB} @end example @ifset ja ã“ã®ã‚ˆã†ã« @samp{M-TAB} を押ã™ã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ã«æ­£å¼åç§°ãŒä»˜åŠ ã•れã¾ã™ã€‚ @end ifset @ifset en Like this, typing @samp{M-TAB} replace the address with the following format. @end ifset @example To: Kazuhiko Yamamoto @end example @c %%%%%%%%%%%%%%%%% @node addr-comp2, send, addr-comp1, Composing @ifset ja @section アドレスã®è£œå®Œ(2) @end ifset @ifset en @section Address Completion(2) @end ifset @ifset ja アドレスã®è£œå®Œ(2)ã§ã¯ã€å­¦ç¿’ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã«é–¢ã—ã¦ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å…¨ä½“ãŒè£œå®Œ ã®å¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚アドレス帳ã®å±•é–‹è¦å‰‡ã¯ã€çŸ­ç¸®åãŒè£œå®Œã®å¯¾è±¡ã«ãªã‚Šã€ä¸€ æ„ã«å®šã¾ã‚Œã°å±•é–‹ã•れã¾ã™ã€‚アドレス帳ã®å€‹äººæƒ…å ±ã§ã¯ã€çŸ­ç¸®åãŒè£œå®Œã®å¯¾è±¡ ã«ãªã‚Šã€ä¸€æ„ã«å®šã¾ã‚Œã°ã€ç™»éŒ²ã•れã¦ã„る先頭ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«å±•é–‹ã•れã¾ã™ã€‚ @end ifset @ifset en As far as Address Completion(2) is concerned, for learned addresses when sending, the entire addresses are completion targets. For expansion rules in the address book, short names are completion targets and unique short names are expanded to corresponding addresses. For personal information in the address book, short names are completion targets and unique short names are expanded to their first addresses. @end ifset @ifset ja Draft モードã®ãƒ˜ãƒƒãƒ€å†…ã§ã€ã‹ã¤ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’書ãã¹ãフィールド上ã§ã€ã—ã‹ ã‚‚ã€1 æ–‡å­—ä»¥ä¸Šã®æ–‡å­—列ãŒå‰ã«ã‚る場所㧠@samp{TAB} を打ã¤ã¨ã€çŸ­ç¸®åã‚ã‚‹ ã„ã¯å­¦ç¿’ã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ãŒè£œå®Œã•れã¾ã™ã€‚ @end ifset @ifset en When you are in a header in Draft mode, working within an address field, after typing one or more characters, you can complete a short name or a learned address by pressing the @samp{TAB} key. @end ifset @ifset ja kazu@@example.org を学習ã—ã¦ã„ã‚‹ã¨ã—ã¾ã—ょã†ã€‚ @end ifset @ifset en Suppose that kazu@@example.org is already learned. @end ifset @example To: ka@samp{TAB} @end example @ifset ja 曖昧ã§ãªã„ã¨ã“ã‚ã¾ã§å…¥åŠ›ã—ã€@samp{TAB} を押ã›ã°ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒè£œå®Œã•れã¾ã™ã€‚ @end ifset @ifset en When you type some characters and press @samp{TAB}, its address is completed: @end ifset @example To: kazu@@example.org @end example @ifset ja ã•ら㫠kazunori@@example.jp を学習ã—ãŸã¨ã—ã¾ã—ょã†ã€‚kazu@@example.org ã¸è£œ 完ã™ã‚‹ã«ã¯ kazu@@ ã¾ã§ã€kazunori@@example.jp ã¸è£œå®Œã™ã‚‹ã«ã¯ kazun ã¾ã§ 入力ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en Also suppose that "kazunori@@example.jp" is learned. To expand a user name to "kazu@@example.org", you should input "kazu@@". To convert it to @w{"}kazunori@@example.jp", you need to input "kazun". @end ifset @ifset ja 展開è¦å‰‡ã¨å€‹äººæƒ…å ±ã¯ã€@samp{TAB} ã«ã‚ˆã‚Šã€ã¾ãšçŸ­ç¸®åãŒè£œå®Œã•れã¾ã™ã€‚短縮 åãŒä¸€æ„ã«å®šã¾ã‚Œã°ã€@samp{TAB} ã§å±•é–‹ã§ãã¾ã™ã€‚ @end ifset @ifset en For expansion rules and personal information, @samp{TAB} completes short names first. You can expand a unique short name to corresponding address with @samp{TAB}. @end ifset @ifset ja ãŸã¨ãˆã°ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã€Œå±•é–‹è¦å‰‡ã€ã‚’設定ã—ãŸã¨ã—ã¾ã™ã€‚ @end ifset @ifset en For example, consider the following configuration of expansion rules: @end ifset @example pooh: winnie-the-pooh@@example.net @end example @ifset ja 短縮å "pooh" を補完ã—ã¦ã¿ã¾ã—ょã†ã€‚ @end ifset @ifset en Let's complete "pooh": @end ifset @example To: po@samp{TAB} @end example @ifset ja ã“ã®ã‚ˆã†ã« @samp{TAB} を押ã™ã¨ã€(ä»–ã«å€™è£œãŒç„¡ã‘れã°) "pooh" ã¾ã§è£œå®Œã•れ ã¾ã™ã€‚ @end ifset @ifset en If you press the @samp{TAB} key, "pooh" is completed (unless other candidates exist). @end ifset @example To: pooh@samp{TAB} @end example @ifset ja ã‚‚ã†ä¸€åº¦ @samp{TAB} を押ã™ã¨ "winnie-the-pooh@@example.net" ã«å±•é–‹ã•れ ã¾ã™ã€‚ @end ifset @ifset en One more press of the @samp{TAB} key expands the name to @w{"}winnie-the-pooh@@example.net". @end ifset @example To: winnie-the-pooh@@example.net @end example @ifset ja å•題ã¯ã€çŸ­ç¸®åãŒä¸€æ„ã«å®šã¾ã‚‰ãªã„å ´åˆã®å±•é–‹ã§ã™ã€‚以下ã®å±•é–‹è¦å‰‡ã‚’考ãˆã¦ 下ã•ã„。 @end ifset @ifset en A problem occurs when a short name is not unique. Consider the following example: @end ifset @example pooh: winnie-the-pooh@@example.net pooh-pooh: pooh-pooh@@example.org @end example @ifset ja "pooh-" ã¾ã§å…¥åŠ›ã™ã‚Œã°ã€"pooh-pooh" ã¾ã§è£œå®Œã§ãã‚‹ã“ã¨ã¯æ˜Žã‚‰ã‹ã§ã™ã€‚ã— ã‹ã—ã€"pooh" ã¾ã§ã ã¨ã€"pooh" を「展開ã€ã™ã‚‹ã®ã‹ã€"pooh-pooh" ã¾ã§è£œå®Œ ã™ã‚‹ã®ã‹åˆ†ã‚Šã¾ã›ã‚“。"pooh" ã‚’ "winnie-the-pooh@@example.net" ã«å¼·åˆ¶çš„㫠展開ã™ã‚‹ã«ã¯ã€@samp{M-C-e} を利用ã—ã¾ã™ã€‚(@samp{TAB} ã§å¼·åˆ¶å±•é–‹ã™ã‚‹æ–¹æ³• ã¯ã‚りã¾ã›ã‚“。) @end ifset @ifset en It is obvious that "pooh-" is completed to "pooh-pooh". But if you input "pooh", Mew cannot tell whether it should be expanded or completed to "pooh-pooh". Thus, if you want to explicitly complete @w{"}pooh" to "winnie-the-pooh@@example.net", type @samp{M-C-e}. (There is no way to accomplish this with @samp{TAB}.) @end ifset @example To: pooh@samp{M-C-e} @end example @ifset ja ã“ã®ä¾‹ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«å¼·åˆ¶å±•é–‹ã•れã¾ã™ã€‚ @end ifset @ifset en This example is explicitly expanded as follows: @end ifset @example To: winnie-the-pooh@@example.net @end example @c %%%%%%%%%%%%%%%%% @node send, cite, addr-comp2, Composing @ifset ja @section メッセージã®é€ä¿¡ @end ifset @ifset en @section Sending a message @end ifset @vindex mew-ask-subject @vindex mew-ask-fcc @kindex C-cC-m (Draft) @kindex C-cC-c (Draft) @kindex i (Summary) @kindex C-cC-c (Summary) @ifset ja メッセージを書ã上ã’ã€ã„よã„よé€ä¿¡ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã® 2 ã¤ã®ã‚³ãƒžãƒ³ãƒ‰ã®ã©ã¡ らã‹ã‚’é¸ã‚“ã§ä¸‹ã•ã„。 @end ifset @ifset en When you are ready to send a message after completing composition, choose one of the following two commands. @end ifset @table @samp @ifset ja @item C-cC-m メッセージを作æˆã— +queue ã¾ãŸã¯ +postq ã«å…¥ã‚Œã€é€ä¿¡å¾…ã¡çŠ¶æ…‹ã«ã™ã‚‹ã€‚ @item C-cC-c メッセージを作æˆã—é€ä¿¡ã™ã‚‹ã€‚"Really send this message? (y or n) " ã¨è¨Šã‹ れる。@samp{y} を押ã›ã°ã€é€ä¿¡ã•れる。 @end ifset @ifset en @item C-cC-m Compose a message, put it into +queue or +postq, and leave it for later sending. @item C-cC-c Compose a message and send it. You receive the prompt: "Really send this message? (y or n) ". Type @samp{y} to send it. @end ifset @end table @ifset ja メッセージãŒé€ä¿¡ã•れる際ã«ã©ã†åŠ å·¥ã•れるã‹èª¬æ˜Žã—ã¾ã™ã€‚以下ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ ジを考ãˆã¦ä¸‹ã•ã„。 @end ifset @ifset en Let's look at how a message is modified when sent. Please see the following example: @end ifset @example @ifset ja To: pooh Subject: æ˜Žæ—¥ã®æ—¥æ›œæ—¥ From: Piglet X-Mailer: @value{X-Mailer} ---- æ˜Žæ—¥ã®æ—¥æ›œæ—¥ã€éŠã³ã¾ã›ã‚“ã‹ï¼Ÿ // ピグレット @end ifset @ifset en To: pooh Subject: the next Sunday From: Piglet X-Mailer: @value{X-Mailer} ---- Would you like to play with me next Sunday? // Piglet @end ifset @end example @ifset ja ãŸã¨ãˆã°ã€@samp{C-cC-m} ã§ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ +queue ã‚ã‚‹ã„㯠+postq ã«å…¥ã‚Œ ã‚‹ã¨ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«åŠ å·¥ã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en This message is modified as follows, for example, if it is put into +queue or +postq by @samp{C-cC-m}. @end ifset @example @ifset ja Date: Mon, 13 Mar 2000 19:49:50 +0900 (JST) Message-Id: <20000313.194950.59499544.piglet@@example.org> To: winnie-the-pooh@@example.net Subject: =?iso-2022-jp?B?GyRCTEBGfCRORnxNS0Z8GyhC?= From: Piglet X-Mailer: @value{X-Mailer} Mime-Version: 1.0 Content-Type: Text/Plain; charset=iso-2022-jp Content-Transfer-Encoding: 7bit æ˜Žæ—¥ã®æ—¥æ›œæ—¥ã€éŠã³ã¾ã›ã‚“ã‹ï¼Ÿ // ピグレット @end ifset @ifset en Date: Mon, 13 Mar 2000 19:49:50 +0900 (JST) Message-Id: <20000313.194950.59499544.piglet@@example.org> To: winnie-the-pooh@@example.net Subject: the next Sunday From: Piglet X-Mailer: @value{X-Mailer} Mime-Version: 1.0 Content-Type: Text/Plain; charset=us-ascii Content-Transfer-Encoding: 7bit Would you like to play with me in the next Sunday? // Piglet @end ifset @end example @ifset ja Date: ã‚„ Message-Id: ãŒä»˜åŠ ã•れãŸã®ã¯ãŠåˆ†ã‹ã‚Šã«ãªã‚‹ã§ã—ょã†ã€‚Subject: ã« ã‚ã£ãŸæ—¥æœ¬èªžã¯ã€é…é€ã«å®‰å…¨ã¨ãªã‚‹ã‚ˆã† ASCII コードã«å¤‰æ›ã•れã¦ã„ã¾ã™ã€‚ã¾ ãŸã€æœ¬æ–‡ã®ãƒ‡ãƒ¼ã‚¿åž‹ã‚„æ–‡å­—ã‚³ãƒ¼ãƒ‰ãŒæŽ¨æ¸¬ã•ã‚Œã€æ­£ã—ã付加ã•れã¦ã„ã‚‹ã“ã¨ã¯ç‰¹ç­† ã™ã¹ãã§ã—ょã†ã€‚ @end ifset @ifset en As you can see, Data: and Message-Id: are added. You should note that both its data type and its character set are guessed correctly and added. @end ifset @ifset ja @samp{C-cC-m} ã‚„ @samp{C-cC-c} ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹ã¨ãã€ãƒ˜ãƒƒãƒ€ã«ä¸å‚™ ãŒã‚ã£ãŸå ´åˆã«æ³¨æ„を促ã—ã¦ãれる機能ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en When composing a message using @samp{C-cC-m} and @samp{C-cC-c}, you can make use of a feature that identifies errors in a header. @end ifset @ifset ja @samp{mew-ask-subject} ã‚’ @samp{t} ã«ã—ã¦ãŠã‘ã°ã€Subject: ãŒç©ºã®ã¨ãã«å€¤ ã‚’å°‹ã­ã¦ãれã¾ã™ã€‚空ã®ã¾ã¾ã«ã—ãŸã„å ´åˆã¯å˜ç´”ã« @samp{RET} を押ã—ã¦ä¸‹ã•ã„。 ã“ã®å¤‰æ•°ã®åˆæœŸå€¤ã¯ @samp{nil} ã§ã™ã€‚ @end ifset @ifset en Suppose you set @samp{mew-ask-subject} to @samp{t}. If Subject: is empty, Mew asks you its value. If you want to leave it empty, just type @samp{RET}. The default value of this variable is @samp{nil}. @end ifset @ifset ja @samp{mew-ask-fcc} ã‚’ @samp{t} ã«ã—ã¦ãŠã‘ã°ã€Fcc: ã«å­˜åœ¨ã—ãªã„フォルダ㌠指定ã—ã¦ã‚ã‚‹å ´åˆã€ãã®ãƒ•ォルダを作æˆã™ã‚‹ã‹å°‹ã­ã¦ãれã¾ã™ã€‚作るãªã‚‰ @samp{y}ã€ä½œã‚‰ãªã„ãªã‚‰ @samp{n} を押ã—ã¦ä¸‹ã•ã„。@samp{n} を押ã™ã¨ã€é€ä¿¡ ãŒä¸­æ­¢ã•れã€ã‚«ãƒ¼ã‚½ãƒ«ã¯è‰ç¨¿ã«æˆ»ã‚Šã¾ã™ã€‚ã“ã®å¤‰æ•°ã®åˆæœŸå€¤ã¯ @samp{nil} ã§ã™ã€‚ @end ifset @ifset en Suppose you set @samp{mew-ask-fcc} to @samp{t}. If there is a folder that doesn't exist, Mew asks you whether or not you want to create it. If you want to create it, type @samp{y}. Otherwise, type @samp{n}. If you type @samp{n}, sending is aborted and the cursor returns to the draft. The default value of this variable is @samp{nil}. @end ifset @ifset ja Mew ã¯ã€ã‚µãƒ¼ãƒãŒãƒ¦ãƒ¼ã‚¶èªè¨¼ã‚’è¦æ±‚ã™ã‚‹ã¨ã€é€ä¿¡ã®ãŸã‚ã®ãƒ‘スワードをユーザ ã«è¨Šãã¾ã™ã€‚é•·ã„é–“ã€ãƒ¡ãƒ¼ãƒ«ã®é€ä¿¡ã«ã¯ãƒ‘スワードãŒå¿…è¦ã‚りã¾ã›ã‚“ã§ã—ãŸã€‚ ã“れãŒã€ãƒ¡ãƒ¼ãƒ«ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’è©ç§°ã§ãる原因ã®ä¸€ã¤ã¨ãªã£ã¦ã„ã¾ã™ã€‚ã“れã‹ã‚‰ã¯ã€ メールã®é€ä¿¡ã®éš›ã¯ã€å—ä¿¡ã®ã¨ãã¨åŒã˜ã‚ˆã†ã«ã€ãƒ‘スワードãŒå¿…è¦ãªæ™‚代ã«ãª りã¾ã™ã€‚ @end ifset @ifset en Mew asks you to input your password for sending if the server requires user authentication. Historically speaking, passwords are not necessary to send e-mail messages. This is one reason why e-mail addresses can be faked. In the near future, passwords are always required for sending messages as are for receiving messages. @end ifset @ifset ja +queue ã«æºœã£ã¦ã„るメッセージをé€ä¿¡ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã® 2 ã¤ã®æ–¹æ³•ãŒã‚りã¾ã™ã€‚ ã©ã¡ã‚‰ã‚‚ Summary モードã®ã‚³ãƒžãƒ³ãƒ‰ã§ã‚ã‚‹ã“ã¨ã«æ³¨æ„ã—ã¾ã—ょã†ã€‚ @end ifset @ifset en There are two ways to send messages waiting in +queue. Please note that both of these are commands in Summary mode. @end ifset @table @samp @ifset ja @item i @samp{mew-auto-flush-queue} ㌠@samp{t} ã®å ´åˆã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã—ãŸå¾Œ ã«ã€+queue ã«ã‚るメッセージをé€ä¿¡ã™ã‚‹ã€‚ダイアルアップ環境ã«ãŠã„ã¦ã€æŽ¥ç¶š 料金を節約ã™ã‚‹æ„味ã§ã‚‚ã€é€ä¿¡ã®ãŸã‚ã®èªè¨¼ã¨ã„ã†æ„味ã§ã‚‚ã€ã“れã¯ã‚ˆã„方法。 @samp{mew-auto-flush-queue} ã®åˆæœŸå€¤ã¯ @samp{t}。 @item C-cC-c +queue ã«ã‚るメッセージをé€ä¿¡ã™ã‚‹ã€‚+queue ã«è¡Œã£ã¦ã€ã§ãã‚ãŒã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ ジを見ãŸå¾Œã«ã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’使ã†ã¨ä¾¿åˆ©ã€‚@samp{mew-ask-flush-queue} ㌠@samp{t} ãªã‚‰ã€"Flush queue? (y or n) " ã¨è¨Šã‹ã‚Œã‚‹ã€‚ @samp{mew-ask-flush-queue} ã®åˆæœŸå€¤ã¯ @samp{nil}。 @end ifset @ifset en @item i If @samp{mew-auto-flush-queue} is @samp{t}, the messages being held in +queue will be sent after the incoming messages have been received. This method is appropriate for dial-up environments, since one can save on connection fees and repeated authentication for sending. @samp{mew-auto-flush-queue} is default to @samp{t}. @item C-cC-c Send messages in +queue. Method is appropriate if you like to preview composed messages first in +queue and then send them. If @samp{mew-ask-flush-queue} is @samp{t}, you are asked, Flush queue? (y or n) ". @samp{mew-ask-flush-queue} is default to @samp{nil}. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node cite, mime-comp, send, Composing @ifset ja @section シグニãƒãƒ£ã¨å¼•用 @end ifset @ifset en @section Signature and citation @end ifset @vindex mew-signature-file @vindex mew-signature-as-lastpart @vindex mew-signature-insert-last @kindex C-cTAB (Draft) @kindex C-cC-y (Draft) @kindex C-cC-t (Draft) @kindex C-cC-l (Draft) @ifset ja ã“ã“ã§ã¯ã€æœ¬æ–‡ã®ãƒ†ã‚­ã‚¹ãƒˆã‚’便利ã«å‡¦ç†ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã«ã¤ã„ã¦è¿°ã¹ã¾ã™ã€‚ @end ifset @ifset en Next is the explanation of the commands for processing the text in the body of the message. @end ifset @ifset ja ã¾ãšã‚·ã‚°ãƒ‹ãƒãƒ£ã«ã¤ã„ã¦ã§ã™ã€‚カーソルã®ã‚る場所㫠"~/.signature" を挿入㙠るコマンド㯠@samp{C-cTAB} ã§ã™ã€‚シグニãƒãƒ£ãƒ•ァイルã¯ã€ @samp{mew-signature-file} ã§è¨­å®šã§ãã¾ã™ã€‚ @samp{mew-signature-as-lastpart} ã‚„ @samp{mew-signature-insert-last} ã‚’ 設定ã™ã‚‹ã“ã¨ã§ã€@samp{C-cTAB} ã®å‹•作をカスタマイズã§ãã¾ã™ã€‚ @end ifset @ifset en The first one is signature. To insert your signature file ("~/.signature") on the cursor point, type @samp{C-cTAB}. You can define your own signature file to @samp{mew-signature-file}. Setting @samp{mew-signature-as-lastpart} and @samp{mew-signature-insert-last}, you can customize the action of @samp{C-cTAB}. @end ifset @table @samp @ifset ja @item C-cTAB カーソルã®ä½ç½®ã« "~/.signature" を挿入ã™ã‚‹ã€‚ @end ifset @ifset en @item C-cTAB Insert "~/.signature" on the cursor point. @end ifset @end table @ifset ja 次ã«å¼•用ã«ã¤ã„ã¦ã§ã™ã€‚Summary モード㮠@samp{a} ã‚„ @samp{A} を使ã£ã¦ãƒ¡ãƒƒ セージã«è¿”ç­”ã™ã‚‹ãŸã‚ã®è‰ç¨¿ã‚’用æ„ã™ã‚‹ã¨ã€Emacs ㌠3 分割ã•れã¾ã™ã€‚上ãŒç¾åœ¨ ã® Summary モードã€ä¸­ãŒ Message モードã€ä¸‹ãŒ Draft モードã§ã™ã€‚ @end ifset @ifset en The next one is citation. If you use @samp{a} or @samp{A} in Summary mode, a draft for reply is opened up and Emacs is split into three windows. The top is Summary mode, the middle is Message mode, and the bottom is Draft mode. @end ifset @ifset ja Message モードã®ãƒ†ã‚­ã‚¹ãƒˆã‚’引用ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en Here are the commands for citing text from Message mode to Draft mode. @end ifset @table @samp @ifset ja @item C-cC-y Message モードã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸€éƒ¨ã‚’コピーã—ã€å¼•用ラベルã¨å¼•用記å·ä»˜ã§è²¼ り付ã‘る。 @enumerate @item ãŠãŠã¾ã‹ã«ã„ãˆã°ã€Message ãƒ¢ãƒ¼ãƒ‰ã®æœ¬æ–‡ãŒã‚³ãƒ”ーã•れる。ãŸã¨ãˆã°ã€ Text/Plain ãŒè¡¨ç¤ºã•れã¦ã„ã‚‹ã¨ã€Message モード全体ãŒã‚³ãƒ”ーã•れる。 Message/Rfc822 ãŒè¡¨ç¤ºã•れã¦ã„ã‚‹å ´åˆã¯ã€ãƒ˜ãƒƒãƒ€ã‚’除ã„ãŸæœ¬æ–‡ãŒã‚³ãƒ”ーã•れる。 @item @samp{C-uC-cC-y} ã§ã¯ã€ãƒ˜ãƒƒãƒ€ãŒã‚れã°ãƒ˜ãƒƒãƒ€ã‚’コピーã™ã‚‹ã€‚ @item Emacs ã®ãƒžãƒ¼ã‚¯ãŒã‚ã‚‹ã¨ã€ãã®ãƒžãƒ¼ã‚¯ã¨ã‚«ãƒ¼ã‚½ãƒ«ã®é–“ãŒå¯¾è±¡ã¨ãªã‚‹ã€‚ @end enumerate @item C-cC-t Message モードã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸€éƒ¨ã‚’コピーã—ã€å¼•用ラベルã¨å¼•用記å·ãªã—㧠貼り付ã‘る。 @end ifset @ifset en @item C-cC-y Copy and paste a part of a message from Message mode WITH citation prefix and label. @enumerate @item Roughly speaking, it copies the body in Message mode. For example, if Text/Plain is displayed, the entire Message mode is copied. If Message/Rfc822 is displayed, the body without the header is copied. @item If you type @samp{C-uC-cC-y}, the header is also copied if exists. @item If an Emacs mark exists, the target is the region between the mark and the cursor. @end enumerate @item C-cC-t Copy and paste a part of the message from Message mode WITHOUT citation prefix and label. @end ifset @end table @ifset ja 引用ラベルã¨å¼•用記å·ã®åˆæœŸå€¤ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en The default label and prefix is as follows: @end ifset @example @ifset ja From: SUMIKAWA Munechika Subject: Wine Date: Wed, 23 Jul 1997 11:40:50 +0900 > ãŠã¯ã‚ˆã†ã‹ã‚‰ãŠã‚„ã™ã¿ã¾ã§ãƒ‹ãƒ¼ãƒˆã§ãŠãªã˜ã¿ã®è§’å·ã§ã™ã€‚ > > ã•ã¦ã€ã¨ã‚ã‘るワイン作戦ã§ã™ãŒã€å®šçŸ³é€šã‚Š '90 ã®ãƒœãƒ«ãƒ‰ãƒ¼ã® > カベルãƒãƒ»ã‚½ãƒ¼ãƒ“ニョンを狙ã„ãŸã„ã¨æ€ã„ã¾ã™ã€‚ @end ifset @ifset en From: SUMIKAWA Munechika Subject: Wine Date: Wed, 23 Jul 1997 11:40:50 +0900 > Hi, it's Sumikawa, the guy who's neat from good morning > to good night. > > Talking about the wonderful wine party, I would propose > Cabernet Sauvignon, Bordeaux, '90. @end ifset @end example @ifset ja Draft モードã§ã¯ Message モードã«è¡¨ç¤ºã•れã¦ã„ã‚‹ã‚‚ã®ãªã‚‰ãªã‚“ã§ã‚‚引用ã§ã ã¾ã™ã€‚ã¤ã¾ã‚Šã€è¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ç°¡å˜ã«å¼•用ã§ãã‚‹ã®ã§ã™ã€‚引用ã—ãŸã„メッセー ジを表示ã•ã›ã¦ã€æœ¬æ–‡ã‚’引用ã™ã‚‹æ‰‹é †ã‚’ã€å¼•用ã—ãŸã„メッセージã®å›žæ•°ã ã‘繰り è¿”ã—ã¦ä¸‹ã•ã„。ãã®ãŸã‚ã® 3 分割ã§ã™ã€‚ @end ifset @ifset en In Draft mode, you can cite any text displayed in Message mode. So, you can cite text from multiple messages easily. Select a message in Summary mode and display it in Message mode, then cite it in Draft mode. Please repeat this procedure as you like. Triple windows are opened for this purpose. @end ifset @ifset ja 本文やヘッダã®è‰²ä»˜ã‘ãŒãŠã‹ã—ããªã£ãŸå ´åˆã€@samp{C-cC-l} を実行ã™ã‚‹ã“ã¨ã§ã€ 色付ã‘をやり直ã™ã“ã¨ãŒã§ãã¾ã™ã€‚ @end ifset @ifset en When highlighting gets wrong, type @samp{C-cC-l} to re-highlight both the header and the body @end ifset @c %%%%%%%%%%%%%%%%% @node mime-comp, charset-guess, cite, Composing @ifset ja @section マルãƒãƒ‘ートã®ä½œæˆ @end ifset @ifset en @section Composing multipart @end ifset @kindex C-cC-a (Draft) @kindex C-p (Attach) @kindex C-n (Attach) @kindex C-f (Attach) @kindex C-b (Attach) @kindex c (Attach) @kindex i (Attach) @kindex d (Attach) @kindex m (Attach) @kindex f (Attach) @kindex F (Attach) @kindex y (Attach) @kindex e (Attach) @kindex a (Attach) @kindex p (Attach) @kindex D (Attach) @kindex T (Attach) @kindex t (Attach) @kindex C (Attach) @kindex P (Attach) @ifset ja ã•ã¦ã€ã“ã“ã§ãƒžãƒ«ãƒãƒ‘ートã®ä½œã‚Šæ–¹ã‚’披露ã—ã¾ã—ょã†ã€‚ @end ifset @ifset en Now let's see how to create multipart messages. @end ifset @ifset ja ãŸã¨ãˆã°ã€+draft/1 ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’書ã„ã¦ã„ã‚‹ã¨ãã«ã€@samp{C-cC-a} ã¨å…¥åŠ› ã™ã‚‹ã¨ã€è‰ç¨¿ã®ä¸€ç•ªä¸‹ã« @end ifset @ifset en When you are writing a message in +draft/1 and type @samp{C-cC-a}, the following lines are inserted at the bottom of the draft. @end ifset @example ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* 2 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- @end example @ifset ja ã¨ã„ã†è¡ŒãŒæŒ¿å…¥ã•れã¾ã™ã€‚"1/" ã¯ãƒžãƒ«ãƒãƒ‘ートを構築ã™ã‚‹ãŸã‚ã®ä¸€æ™‚çš„ãªãƒ‡ã‚£ レクトリã§ã€å®Ÿä½“㯠"~/Mail/attach/1" ã§ã™ã€‚パート 1 ã® CoverPage ã¯æœ¬ 文をæ„味ã—ã¾ã™ã€‚ã“ã“ã§ Draft ãƒ¢ãƒ¼ãƒ‰ã¯æ¬¡ã®ã‚ˆã†ã«ãªã£ã¦ã„ã‚‹ã§ã—ょã†ã€‚ @end ifset @ifset en "1/" is a temporary directory to create multipart and provides a location for "~/Mail/attach/1". The part 1, "CoverPage", refers to the body. Now the entire draft looks like: @end ifset @example @ifset ja To: mew-dist Subject: ã“ã“ãŒãƒ˜ãƒƒãƒ€ From: Kazu Yamamoto X-Mailer: @value{X-Mailer} ---- 本文ã ã‚ˆã€‚ ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* 2 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- @end ifset @ifset en To: mew-dist Subject: This is header X-Mailer: @value{X-Mailer} ---- This is the body. ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* 2 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- @end ifset @end example @ifset ja 3 ã¤ã®é ˜åŸŸã‚’以下ã®ã‚ˆã†ã«å‘¼ã¶ã“ã¨ã«ã—ã¾ã™ã€‚ @end ifset @ifset en Here we designate three regions as follows: @end ifset @itemize @bullet @ifset ja @item "----" より上を 「ヘッダ〠@item "----" ã‹ã‚‰ "attachments" ã¾ã§ã‚’「本文〠@item "attachments" より下を「添付領域〠@end ifset @ifset en @item the region above "----" @samp{header} @item the region from "----" to "attachments" @samp{body} @item the region below "attachments" @samp{attachments} @end ifset @end itemize @ifset ja Draft モードã§ã¯ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ã‚ˆã£ã¦ã‚­ãƒ¼å‰²å½“ãŒé•ã„ã¾ã™ã€‚ @end ifset @ifset en In Draft mode, the key bindings differ according to the region. @end ifset @ifset ja ãŸã¨ãˆã°ã€@samp{TAB} ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en To @samp{TAB}, for instance, the following functions are assigned: @end ifset @table @asis @ifset ja @item ヘッダ ã•ã¾ã–ã¾ãªè£œå®Œã€‚ @item 本文 TAB ã®æŒ¿å…¥ã€‚ @item 添付領域 ãªã«ã‚‚ã—ãªã„。 @end ifset @ifset en @item header Completions. @item body Insert TAB. @item attachments Do nothing. @end ifset @end table @ifset ja @samp{c} ã ã¨ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en To @samp{c}, functions are assigned as follows: @end ifset @table @asis @ifset ja @item ヘッダ c を挿入。 @item 本文 c を挿入。 @item 添付領域 ファイルã®ã‚³ãƒ”ー。 @end ifset @ifset en @item header Insert c. @item body Insert c. @item attachments Copy a file. @end ifset @end table @ifset ja ä»¥ä¸‹ã€æ·»ä»˜é ˜åŸŸã§ã®ã‚­ãƒ¼å‰²å½“ã§ã™ã€‚ @end ifset @ifset en The following is a summary of commands in the attachments region. @end ifset @table @samp @ifset ja @item C-p ç¾åœ¨ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å‰ã®ãƒ•ァイルã¸ç§»å‹•。 @item C-n ç¾åœ¨ã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®å¾Œã®ãƒ•ァイルã¸ç§»å‹•。 @item C-f 1 番目ã®ã‚µãƒ–ディレクトリã«ç§»å‹•。 @item C-b 親ディレクトリã«ç§»å‹•。 @item c ファイルã®ã‚³ãƒ”ー。"." ä¸Šã§æœ‰åŠ¹ã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯çµŒç”±ã§ã‚‚å¯ã€‚リモートã®ãƒ•ァイ ルをコピーã™ã‚‹å ´åˆã¯ã€"/[user@@]hostname:/filepath" ã®å½¢å¼ã§ãƒ•ァイルを指 定。 @item l ファイルã¸ã‚·ãƒ³ãƒœãƒƒãƒªã‚¯ãƒªãƒ³ã‚¯ã‚’張る。"." ä¸Šã§æœ‰åŠ¹ã€‚æ·»ä»˜ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ @samp{f} を使ã£ã¦èª­ã¿è¾¼ã‚“ã§ç·¨é›†ã™ã‚‹å ´åˆã¯ã€å®Ÿä½“を編集ã—ã¦ã—ã¾ã‚ãªã„よㆠã«ã€@samp{l} ã§ã¯ãªã @samp{c} ã§ã‚³ãƒ”ーã™ã¹ã。 @item d ファイルã¨ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã®æ¶ˆåŽ»ã€‚ @item m サブディレクトリ(ã¤ã¾ã‚Šãƒžãƒ«ãƒãƒ‘ート)ã®ä½œæˆã€‚"." ä¸Šã§æœ‰åŠ¹ã€‚ @item f ファイルをãƒãƒƒãƒ•ã‚¡ã«èª­ã¿è¾¼ã‚€ã€‚ @item F æ–°è¦ãƒ•ァイルをãƒãƒƒãƒ•ã‚¡ã«èª­ã¿è¾¼ã‚€ã€‚"." ä¸Šã§æœ‰åŠ¹ã€‚ @item y Message モードã«è¡¨ç¤ºã•れã¦ã„るメッセージã«ãƒªãƒ³ã‚¯ã‚’張る。"." ä¸Šã§æœ‰åŠ¹ã€‚ @item e external-body ã®å…¥åŠ›ã€‚"." ä¸Šã§æœ‰åŠ¹ã€‚ @item a 音をサンプリングã—オーディオファイルã¨ã—ã¦æŒ¿å…¥ã€‚"." ä¸Šã§æœ‰åŠ¹ã€‚ @item p 入力ã•れãŸãƒ¦ãƒ¼ã‚¶ã® PGP 公開éµã‚’å–り出ã™ã€‚"." ä¸Šã§æœ‰åŠ¹ã€‚ @item D ã¡ã‚‡ã£ã¨ã—ãŸèª¬æ˜Ž(Content-Description:)ã®å…¥åŠ›ã€‚ @item T データ型(Content-Type:)ã®å¤‰æ›´ã€‚ @item t データ型ã«é–¢ã—ã€ãƒ†ã‚­ã‚¹ãƒˆã¨ãƒã‚¤ãƒŠãƒªã‚’å転ã•ã›ã‚‹ã€‚ @item I Text/* åž‹ã®å…¥åŠ› coding-system を指定ã™ã‚‹ã€‚ @item C Text/* åž‹ã®å‡ºåŠ› coding-system を指定ã™ã‚‹ã€‚ @item P å—ä¿¡å´ã§ã“ã®ãƒ‘ートをä¿å­˜ã™ã‚‹éš›ã®ãƒ•ァイルå(Content-Disposition:)ã®å¤‰æ›´ã€‚ ファイルåã®å…¥åŠ›ã®éš›ã«ã€å˜ã« @samp{RET} を押ã™ã¨å€¤ãŒæ¶ˆãˆã‚‹ã€‚ãã—ã¦ã€é€ä¿¡ å´ã®ãƒ•ァイルå㌠@samp{*} ã¨å…±ã«è¡¨ç¤ºã•れる。 @end ifset @ifset en @item C-p Go to the previous file in the current directory. @item C-n Go to the next file in the current directory. @item C-f Go to the first subdirectory. @item C-b Go to the parent directory. @item c Copy a file (possibly via networks) on ".". To copy a remote file, use the "/[user@@]hostname:/filepath" syntax. @item l Link a file with a symbolic link on ".". If you want to edit the attached file, you should @samp{c} instead of @samp{l} so that you do not edit the original file. @item d Delete this file or this directory. @item m Create a subdirectory (i.e. multipart) on ".". @item f Open this file into a buffer. @item F Open a new file into a buffer on ".". @item y Link the message which is displayed in Message mode on ".". @item e Input external-body on ".". @item a Sampling voice and insert as audio file on ".". @item p Extract the PGP key for the specified user on ".". @item D Input a description (Content-Description:). @item T Change the data type (Content-Type:). @item t Toggle text and binary for the data type. @item I Specify input coding-system for a Text/* object. @item C Specify output coding-system for a Text/* object. @item P Specify a file name (Content-Disposition:) to save this part in the receiver side. If you type just @samp{RET} without any string, its value is cleared. Then the file name in the sender side is displayed with @samp{*}. @end ifset @end table @ifset ja 添付領域ã§ã¯ã€ãƒ•ã‚¡ã‚¤ãƒ«ã®æ‹¡å¼µå­ã«ã‚ˆã£ã¦ãƒ‡ãƒ¼ã‚¿ã‚’å–り扱ã„ã¾ã™ã€‚ç¾åœ¨ã‚µãƒãƒ¼ãƒˆ ã—ã¦ã„ã‚‹æ‹¡å¼µå­ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ @end ifset @ifset en In attachments, data types are guessed by suffix. The currently supported suffixes are as follows: @end ifset @example .txt Text/Plain .html Text/Html .xml Text/Xml .rtf Text/Enriched .css Text/Css .sgml Text/Sgml [0-9]+ Message/Rfc822 .ps Application/Postscript .pdf Application/Pdf .doc Application/Msword .xls Application/Vnd.Ms-Execl .ppt Application/Vnd.Ms-Powerpoint .vsd Application/Vnd.Visio .dat Application/Ms-Tnef .tar|.tar.|.gz|.Z|.taz|.tgz|.bz2?|.lzh|.zip|.bin|.pgp|.gpg|.exe|.dll Application/Octet-Stream .gif Image/Gif .tiff Image/Tiff .jpe?g Image/Jpeg .png Image/Png .xwd Image/X-Xwd .xbm Image/X-Xbm .xpm Image/X-Xpm .bmp Image/X-Bmp .pcx Image/X-Pcx .tga Image/X-Tga .au Audio/Basic .wav Audio/X-Wav .aif?f Auido/X-Aiff .midi? Auido/X-Midi .mpga|.mp[23] Audio/X-Mpeg .mpe?g Video/Mpeg .mov Video/Quicktime .avi Video/X-Msvideo @end example @ifset ja コピーã™ã‚‹ã¨ãã®ãƒ•ァイルåã¯ã€é©åˆ‡ãªãƒ‡ãƒ¼ã‚¿åž‹ã‚’推測ã§ãã‚‹ã‚ˆã†æ‹¡å¼µå­ã«æ°— を付ã‘れã°ãªã‚“ã§ã‚‚よã„ã§ã™ã€‚ã‚‚ã—ã€è©²å½“ã™ã‚‹æ‹¡å¼µå­ãŒãªã„å ´åˆã€ @samp{mew-content-type} ã§æŒ‡å®šã•れるデータ型ãŒé¸ã°ã‚Œã¾ã™ã€‚åˆæœŸå€¤ã¯ã€ Text/Plain(テキスト)ã§ã™ã€‚ @end ifset @ifset en Please choose an appropriate suffix for the file name so that Mew can guess its data type. If there is no matched suffix, the data type specified by @samp{mew-content-type} is chosen. Its default value is Text/Plain. @end ifset @ifset ja @samp{c} ã§ãƒ•ァイルをコピーã™ã‚‹ã¨ã€ãŸã¨ãˆã°æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en For instance, if you copy files with @samp{c}, the part becomes as follows: @end ifset @ifset ja @example ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* B 2 Image/Gif MagicPoint ã®ãƒ­ã‚´ mgp.gif Q 3 Application/Postscript 資料 ohp.ps 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- @end example @end ifset @ifset en @example ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* B 2 Image/Gif MagicPoint logo mgp.gif Q 3 Application/Postscript Presentation Material ohp.ps 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- @end example @end ifset @ifset ja å„行ã¯ã€ @itemize @minus @item マーク (Content-Transfer-Encoding:) @item ãƒ‘ãƒ¼ãƒˆç•ªå· @item データ型 (Content-Type:) @item 説明 (Content-Description:) @item ファイルå (Content-Disposition:) @end itemize ã‹ã‚‰æ§‹æˆã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en Each line of a multipart message consists of @itemize @minus @item marks (Content-Transfer-Encoding:) @item part number @item data type (Content-Type:) @item description (Content-Description:) @item file name (Content-Disposition:). @end itemize @end ifset @ifset ja データ型(Content-Type:)㯠@samp{T} ã«ã‚ˆã£ã¦å¤‰ãˆã‚‰ã‚Œã¾ã™ã€‚データ型ãŒãƒ†ã‚­ スト(Text/Plain)ã‹ãƒã‚¤ãƒŠãƒª(Application/Octet-Stream)ã®å ´åˆã¯ã€@samp{t} ã«ã‚ˆã£ã¦ä¸€æ–¹ã‚’ä»–æ–¹ã¸å転ã§ãã¾ã™ã€‚ @end ifset @ifset en You can change data types (Content-Type:) by pressing @samp{T} at any time. If the data type is either text (Text/Plain) or binary (Application/Octet-Stream), you can toggle between them using @samp{t}. @end ifset @ifset ja マーク(Content-Transfer-Encoding:)を変更ã™ã‚‹æ–¹æ³•ã¯ã€@xref{mark-b-comp} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。説明(Content-Description:)㯠@samp{D} ã§å…¥åŠ›ã§ãã¾ã™ã€‚ ã“ã®èª¬æ˜Žã®ã‚«ãƒ©ãƒ ã¯ã€@xref{mark-b-comp} ã§èª¬æ˜Žã™ã‚‹æš—å·åŒ–ã®éš›ã«ä¸Šæ›¸ãã•れ ã¾ã™ã€‚ @end ifset @ifset en Please refer to @ref{mark-b-comp} for explanation on changing the mark (Content-Transfer-Encoding:). You can also insert descriptions (Content-Description:) by @samp{D}. This description column is overwritten when encrypted as described in @ref{mark-b-comp}. @end ifset @ifset ja 第 5 カラムã«è¡¨ç¤ºã•れるã®ã¯ã€å®Ÿéš›ã«ã¯ã‚³ãƒ”ーã—ãŸãƒ•ァイルåã‹ Content-Disposition:ã€ã¤ã¾ã‚Šã€å—信者ãŒãã®ãƒ‘ートをä¿å­˜ã™ã‚‹éš›ã®ãƒ•ァイル åã§ã™ã€‚Content-Disposition: ã®å€¤ãŒã‚れã°ã€ãれãŒè¡¨ç¤ºã•れã¾ã™ã€‚ãªã‘れ ã°ã€ã‚³ãƒ”ーã—ãŸãƒ•ァイルåã« @samp{*} を付加ã—ã¦è¡¨ç¤ºã—ã¾ã™ã€‚ファイルをコ ピーã—ãŸéš›ã® Content-Disposition: ã®å€¤ã¯ã€ã‚³ãƒ”ーã—ãŸãƒ•ァイルåãŒæŒ‡å®šã• れã¦ã„ã¾ã™ã€‚ãŸã ã—ã€Message/* 㨠Multipart/* ã«ã¯ Content-Disposition: ã¯è¨­å®šã•れã¾ã›ã‚“。Message/* ã® Content-Disposition: を指定ã™ã‚‹ã«ã¯ã€ @samp{P} を利用ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Strictly speaking, the fifth column is the copied file name or the value of Content-Disposition:, namely the file name to which the receiver saves the part. If Content-Disposition: exists, Mew displays it. Otherwise, Mew displays the copied file name with @samp{*} appended. When you copy a file, the file name is specified as Content-Disposition:. But this is not true for both Message/* and Multipart/*. To specify Content-Disposition: for Message/*, use @samp{P}. @end ifset @ifset ja ファイルã¯ã‚·ãƒ³ã‚°ãƒ«ãƒ‘ートã«ã€ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã¯ãƒžãƒ«ãƒãƒ‘ートã«å¯¾å¿œã—ã¾ã™ã€‚ã§ ã™ã‹ã‚‰ã€ãƒ•ァイル構造を作ã£ã¦ã„ãæ„Ÿè¦šã§è¤‡é›‘ãªãƒžãƒ«ãƒãƒ‘ートを作æˆã§ãã¾ã™ã€‚ ç°¡å˜ã§ã—ょ? @end ifset @ifset en Files are treated as singlepart while directories are treated as being multipart. Therefore you can create very complex multipart MIME messages in the same way as you would create a file system. Very easy, isn't it? @end ifset @ifset ja ディレクトリã«å¯¾ã™ã‚‹ãƒ‡ãƒ¼ã‚¿åž‹ã®åˆæœŸå€¤ã¯ã€ä¸€èˆ¬çš„ãªãƒžãƒ«ãƒãƒ‘ート (Multipart/Mixed)ã§ã™ã€‚ã“れも @samp{T} ã«ã‚ˆã£ã¦å¤‰æ›´ã§ãã¾ã™ã€‚ @end ifset @ifset en The default data type for directories is Multipart/Mixed. Of course, you can change it by pressing @samp{T}. @end ifset @ifset ja ãŠå¥½ã¿ã®ãƒžãƒ«ãƒãƒ‘ートãŒä½œæˆã§ããŸã‚‰ã€å‰ç¯€ã§è¿°ã¹ãŸã‚ˆã†ã« @samp{C-cC-m} ã‹ @samp{C-cC-c} を利用ã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Once you are ready to send a multipart message, type @samp{C-cC-m} or @samp{C-c C-c} to send it as described the previous subsection. @end ifset @ifset ja パートã®å®Ÿä½“ãŒå¤–部ã«ã‚ã‚‹ external-body を作æˆã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ @samp{e} ã«ã¤ã„ ã¦èª¬æ˜Žã—ã¾ã—ょã†ã€‚access-type ã« ftp ã‹ anon-ftp を入力ã™ã‚‹ã¨ãã¯ã€ ange-ftp ã®ãŠã‹ã’ã§ãƒªãƒ¢ãƒ¼ãƒˆã®ãƒ•ァイルåãŒè£œå®Œã§ãã¾ã™ã€‚access-type ㌠local-file ã®å ´åˆã¯ã€ã‚‚ã¡ã‚んファイルåを補完ã§ãã¾ã™ã€‚ @end ifset @ifset en Next is the explanation of the creation of a Message/External-body by pressing @samp{e}. If the access-type is "ftp" or "anon-ftp", you can take advantage of remote filename completion due to the existence of the native Emacs mode of ange-ftp. Of course file completion is available for the access-type of "local-file". @end ifset @ifset ja ã‚‚ã—ã€ãƒžãƒ«ãƒãƒ‘ートã®ä½œæˆé€”中ã§ã‚„ã£ã±ã‚Šã‚·ãƒ³ã‚°ãƒ«ãƒ‘ãƒ¼ãƒˆã«æˆ»ã—ãŸããªã£ãŸã‚‰ã€ 一番上ã®ãƒžãƒ«ãƒãƒ‘ート部分㧠@samp{d} を押ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en If you want to abort creating multipart and to get back to singlepart, type @samp{d} in the top level of the multipart message. @end ifset @c %%%%%%%%%%%%%%%%% @node charset-guess, longline, mime-comp, Composing @ifset ja @section æ–‡å­—ã‚³ãƒ¼ãƒ‰ã®æ±ºå®š @end ifset @ifset en @section Defining charset @end ifset @kindex I (Attach) @kindex C (Attach) @kindex C-x RET l @ifset ja Mew ã¯ã‚·ãƒ³ã‚°ãƒ«ãƒ‘ートã¨ãƒžãƒ«ãƒãƒ‘ートã®ä¸¡æ–¹ã«å¯¾ã—ã€é…逿™‚ã®æ–‡å­—コードを決定 ã™ã‚‹æ©Ÿèƒ½ã‚’æŒã£ã¦ã„ã¾ã™ã€‚ @end ifset @ifset en Mew has a mechanism for determining the character set of the transfer form for both singlepart and multipart. @end ifset @ifset ja <シングルパート> @end ifset @ifset en @end ifset @ifset ja Draft モード㧠@samp{C-cC-m} ã‚„ @samp{C-cC-c} ã¨å…¥åŠ›ã—メッセージを作æˆã™ ã‚‹ã¨ã€Mew ã¯æœ¬æ–‡ã®å†…部表ç¾ã‹ã‚‰é…逿™‚ã®æ–‡å­—コードを決定ã—ã¾ã™ã€‚ãƒã‚¤ãƒªãƒ³ã‚¬ ル Emacs ã§ã¯ã€7 ãƒ“ãƒƒãƒˆã®æ–‡å­—コードã«å¯¾ã— US-ASCII ã‚’é¸ã³ã€8 ãƒ“ãƒƒãƒˆã®æ–‡å­— コードã«å¯¾ã— ISO-8859-1 ã‚’é¸æŠžã—ã¾ã™ã€‚国際化 Emacs ã§ã¯ã€å†…部表ç¾ã‹ã‚‰ Mew ãŒå®šã‚ãŸè¦å‰‡ã«å¾“ã£ã¦ã€é…逿™‚ã®æ–‡å­—コードを決定ã—ã¾ã™ã€‚ @end ifset @ifset en When you type @samp{C-cC-m} or @samp{C-cC-c} to compose a message in Draft mode, Mew decides the character set of the transfer based on the internal representation of its body. On Bilingual Emacs, US-ASCII is chosen for 7bit character sets while ISO-8859-1 is selected for 8bit character sets. On Internationalized Emacs, the character set of the transfer form is chosen based on rules defined by Mew. @end ifset @ifset ja <マルãƒãƒ‘ート> @end ifset @ifset en @end ifset @ifset ja マルãƒãƒ‘ートã®ä¸€éƒ¨ã¨ã—ã¦æ·»ä»˜ã™ã‚‹ãƒ‡ãƒ¼ã‚¿ã¯ã€ãƒ•ァイルã§ã™ã‹ã‚‰ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã«å­˜ 在ã—ã¾ã™ã€‚ãã“ã§ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä½œæˆã®éš›ã«ã€é…逿™‚ã®æ–‡å­—コードを決定ã™ã‚‹ãŸ ã‚ã«ã¯ã€ã¾ãš Emacs ã®ãƒãƒƒãƒ•ã‚¡ã«å–り込ã¿ã€å†…部表ç¾ã«ç›´ã™å¿…è¦ãŒã‚りã¾ã™ã€‚ 内部表ç¾ã«ç›´ã—ãŸå¾Œã¯ã€ã‚·ãƒ³ã‚°ãƒ«ãƒ‘ートã¨åŒæ§˜ã®æ–¹æ³•ã§ã€é…逿™‚ã®æ–‡å­—コードを 決定ã—ã¾ã™ã€‚ @end ifset @ifset en Since the data to be attached as a part of multipart is a file, it is stored on disk. Therefore, in order to determine its character set for the transfer form, it is necessary to load the file into an Emacs buffer converting it into internal representation. After that, Mew determines the character set of the transfer form for the file by the same method as singlepart. @end ifset @ifset ja ãƒã‚¤ãƒªãƒ³ã‚¬ãƒ« Emacs ã§ã¯ã€Mew ã¯ãƒ•ァイルをãã®ã¾ã¾ã®å½¢å¼ã§èª­ã¿è¾¼ã¿ã¾ã™ã€‚ ã§ã™ã‹ã‚‰ã€7 ビットã®ãƒ•ァイルã«ã¯ US-ASCII ãŒã€8 ビットã®ãƒ•ァイルã«ã¯ ISO-8859-1 ãŒé¸ã°ã‚Œã¾ã™ã€‚ @end ifset @ifset en On Bilingual Emacs, Mew reads a file as is. So if the file is 7bit, US-ASCII is chosen. Otherwise ISO-8859-1 is selected. @end ifset @ifset ja 国際化 Emacs ã§ã¯ã€Mew ã¯ç’°å¢ƒ(ã¤ã¾ã‚Š auto conversion)ã«å¾“ã£ã¦ã€æ–‡å­—コー ドを推測ã—ãªãŒã‚‰ãƒ•ァイルを読ã¿è¾¼ã¿ã¾ã™ã€‚国際化 Emacs ã§ã“ã®ç’°å¢ƒã‚’決定㙠るコマンドã¯ã€@samp{C-x RET l} ã§ã™ã€‚ @end ifset @ifset en On Internationalized Emacs, Mew reads a file according to the local convention (i.e. auto conversion). The command to set a local convention is @samp{C-x RET l}. @end ifset @ifset ja ãŸã¨ãˆã°ã€æ—¥æœ¬èªžã®ç’°å¢ƒã§ã¯ã€å›½éš›åŒ– Emacs 㯠ISO-2022-JPã€EUC-JPã€ãã—ã¦ã€ Shift_JIS ã‚’è¦‹äº‹ã«æŽ¨æ¸¬ã—ã€æ—¥æœ¬èªžç”¨ã®å†…部表ç¾ã«å¤‰æ›ã—ã¦ãƒãƒƒãƒ•ã‚¡ã«æ ¼ç´ã—ã¾ ã™ã€‚Mew ã¯ã“ã®å†…部表ç¾ã‹ã‚‰ã€é…逿™‚ã®æ–‡å­—コードã¨ã—㦠ISO-2022-JP ã‚’é¸æŠž ã—ã¾ã™ã€‚ã¤ã¾ã‚Šã€ãƒ•ã‚¡ã‚¤ãƒ«ã®æ–‡å­—コード㌠EUC-JP ã‚„ Shift-JIS ã§ã‚ã£ã¦ã‚‚〠é…é€ç”¨ã® ISO-2022-JP ã«è‡ªå‹•çš„ã«å¤‰æ›ã•れã¾ã™ã€‚ãã“ã§ãƒ¦ãƒ¼ã‚¶ã¯ã€æ·»ä»˜ã™ã‚‹ãƒ•ã‚¡ ã‚¤ãƒ«ã®æ–‡å­—コードを気ã«ã™ã‚‹ã“ã¨ãªã—ã«ã€ãƒ•ァイルを添付å¯èƒ½ã§ã™ã€‚ @end ifset @ifset en For example, in Japan, ISO-2022-JP, EUC-JP, and Shift_JIS is readily guessed and stored in buffer as internal representations for Japanese. Mew chooses ISO-2022-JP as the character set of the transfer form from the internal representation. That is, even if the character set of the file is EUC-JP or Shift_JIS, it is automatically converted into ISO-2022-JP, which is the transfer form for Japanese. This means that you can attach a file without needing to pay attention to its character set. @end ifset @ifset ja ã‚‚ã—ã€ãƒ‡ã‚£ã‚¹ã‚¯ä¸Šã®ãƒ•ァイル㮠coding-system ã‚’æ˜Žç¤ºçš„ã«æŒ‡å®šã—ãŸã„ãªã‚‰ @samp{I} を使ã£ã¦ä¸‹ã•ã„。ã“れを入力文字コードã¨å‘¼ã¶ã“ã¨ã«ã—ã¾ã™ã€‚ã¾ãŸã€ é…逿™‚ã® coding-system ã‚’æ˜Žç¤ºçš„ã«æŒ‡ç¤ºã—ãŸã„ãªã‚‰ã€@samp{C} を利用ã—ã¦ä¸‹ ã•ã„。 @end ifset @ifset en If you want to specify the coding-system of a file to be attached, type @samp{I}. Let's call the character set "input character set". Also, if you want to specify the coding-system of the transfer form, use @samp{C}. @end ifset @ifset ja æ–‡å­—ã‚³ãƒ¼ãƒ‰ã®æƒ…å ±ã¯ã€æ·»ä»˜é ˜åŸŸã«ãŠã„ã¦ã€ä¸¸æ‹¬å¼§ã®å†…å´ã«è¡¨ç¤ºã•れã¾ã™ã€‚ã‚‚ã—〠é…逿™‚ã®æ–‡å­—ã‚³ãƒ¼ãƒ‰ãŒæ˜Žç¤ºçš„ã«æŒ‡å®šã•れã¦ã„れã°ã€ãれãŒè¡¨ç¤ºã•れã¾ã™ã€‚ãã†ã§ ãªãã¦ã€å…¥åŠ›æ–‡å­—ã‚³ãƒ¼ãƒ‰ãŒæ˜Žç¤ºçš„ã«æŒ‡å®šã•れã¦ã„れã°ã€ãれ㌠"*" ã¨å…±ã«è¡¨ç¤º ã•れã¾ã™ã€‚ãã†ã§ãªã‘れã°ã€"guess" ã¨è¡¨ç¤ºã•れã¾ã™ã€‚ @end ifset @ifset en Information regarding the character set is displayed in parentheses. If the character set of the transfer form is specified explicitly, it is displayed. Otherwise, if the input character set is specified, it is displayed with "*". Otherwise, "guess" is displayed. @end ifset @ifset ja 以下ã®ä¾‹ã®è¦‹ã¦ä¸‹ã•ã„。パート 1 ã¯ã€æœ¬æ–‡ã§ã™ã‹ã‚‰ã‚らã‹ã˜ã‚ãƒãƒƒãƒ•ァ内ã«ã‚り ã¾ã™ã€‚"guess" ã¨è¡¨ç¤ºã•れã¦ã„ã¾ã™ã‹ã‚‰ã€é…逿™‚ã®æ–‡å­—コードを Mew ãŒå®šã‚㟠è¦å‰‡ã«å¾“ã£ã¦æ±ºå®šã—ã¾ã™ã€‚ @end ifset @ifset en Let's look at the following example. Since part 1 is a body, it is stored in an Emacs buffer. Because "guess" is displayed, it is Mew that determines the character set of the transfer form according to the rules that Mew defines. @end ifset @ifset ja パート 2 ã¯ã€å…¥åŠ›æ–‡å­—ã‚³ãƒ¼ãƒ‰ã¨ã—㦠iso-8859-1 ãŒæŒ‡å®šã•れã¦ã„ã¾ã™ã®ã§ã€ãƒ•ã‚¡ ã‚¤ãƒ«ã®æ–‡å­—コードを iso-8859-1 ã§ã‚ã‚‹ã¨ã—ã¦èª­ã¿è¾¼ã¿ã€å†…部表ç¾ã«å¤‰æ›ã—ã¾ã™ã€‚ é…逿™‚ã®æ–‡å­—コード㯠Mew ãŒå®šã‚ãŸè¦å‰‡ã«å¾“ã£ã¦æ±ºå®šã—ã¾ã™ã€‚ @end ifset @ifset en Since iso-8859-1 is specified as the input character set, Mew loads the file considering that its character set is iso-8859-1, and then converts it into internal representation. The character set of the transfer form is decided according to rules defined by Mew. @end ifset @ifset ja パート 3 ã®å…¥åŠ›æ–‡å­—ã‚³ãƒ¼ãƒ‰ã¯ã€ã“ã®ä¾‹ã ã‘ã‹ã‚‰ã ã¨æ˜Žç¤ºçš„ã«æŒ‡å®šã•れã¦ã„る㋠分ã‹ã‚Šã¾ã›ã‚“。(ã—ã‹ã—ã€ãƒ¦ãƒ¼ã‚¶è‡ªèº«ã¯ã¯å®Ÿéš›ã«æŒ‡å®šã—ãŸã‹åˆ†ã‹ã£ã¦ã„ã‚‹ã¯ãšã§ ã™ã€‚) ã¨ã«ã‹ãã€ãƒ•ァイルã¯å†…部表ç¾ã«ç›´ã•れã€é…逿™‚ã®æ–‡å­—ã‚³ãƒ¼ãƒ‰ã«æŒ‡å®šã•れ ã¦ã„ã‚‹ EUC-JP ã«å¤‰æ›ã•れã¾ã™ã€‚ @end ifset @ifset en The input character set in part 3 cannot be identified just from this example. (But a user certainly knows what it is since he actually specified it.) In any case, a file will be loaded and be converted into internal representation, then be converted into EUC-JP which is specified as the character set of the transfer form. @end ifset @example ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* 2 Text/Plain(*iso-8859-1) text1 B 3 Text/Plain(euc-jp) text2 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- @end example @ifset ja ãƒã‚¤ãƒªãƒ³ã‚¬ãƒ« Emacs ã§ã¯ @samp{C} 㨠@samp{I} ã¯åˆ©ç”¨ã§ãã¾ã›ã‚“。 @end ifset @ifset en Note that both @samp{C} and @samp{I} are not available on Bilingual Emacs. @end ifset @c %%%%%%%%%%%%%%%%% @node longline, reply, charset-guess, Composing @ifset ja @section é•·ã„行ã®å–り扱ㄠ@end ifset @ifset en @section Handling long lines @end ifset @vindex mew-use-format-flowed @vindex mew-flowed-fold-threshold @vindex mew-flowed-fold-length @vindex mew-flowed-auto-wrap @kindex C-cC-f (Draft) @kindex C-cC-pC-f (Draft) @kindex _ (Summary) @ifset ja é•·ã„é–“ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ›¸ã文章ã¯ã€è‡ªåˆ†è‡ªèº«ã§å„行を(英文字ã§)70文字程度㫠折り返ã™ã¹ãã ã¨ã•れã¦ãã¾ã—ãŸã€‚RFC 3676 ã§ Text/Plain ãŒæ‹¡å¼µã•れ〠format パラメータ㫠flowed ã¨ã„ã†å€¤ãŒå®šç¾©ã•れã¾ã—ãŸã€‚ @end ifset @ifset en For a long period, when you are writing a message, you should fold each line around 70 characters by yourself. RFC 3676 extended Text/Plain and defined "flowed" as a value of the "format" parameter. @end ifset @ifset ja ã“ã®ãŠã‹ã’ã§ã€é€ã‚Šå´ã§é•·ã„行を目å°ã‚’付ã‘ã¦æŠ˜ã‚Šè¿”ã—ã€å—ã‘å–りå´ã§é•·ã„行 ã«æˆ»ã›ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã—ãŸã€‚ユーザã®ç›®ã‹ã‚‰è¦‹ã‚Œã°ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«é•·ã„行を気 è»½ã«æ›¸ã„ã¦ã‚‚よããªã£ãŸã¨ã„ã†ã“ã¨ã§ã™ã€‚ @end ifset @ifset en Thanks to this, long lines can be automatically folded on a sender side while they can be unfolded on a receiver side. From the point of user view, you can write long lines casually. @end ifset @ifset ja Mew ã§ã€é•·ã„行を flowed ã§æŠ˜ã‚Šè¿”ã™ã«ã¯ 2 ã¤ã®æ–¹æ³•ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en There are two ways to apply the flowed folding. @end ifset @ifset ja 1) æ˜Žç¤ºçš„ã«æŠ˜ã‚Šè¿”ã™ã«ã¯ã€@samp{C-cC-f}を実行ã—ã¾ã™ã€‚ @end ifset @ifset en 1) To apply the flowed folding explicitly, type @samp{C-cC-f}. @end ifset @ifset ja ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€è‰ç¨¿ã«é•·ã„行ãŒã‚ã‚‹ã‹ã‚’調ã¹ã¾ã™ã€‚ @samp{mew-flowed-fold-threshold} ã‚’è¶Šãˆã‚‹è¡ŒãŒè¦‹ã¤ã‹ã£ãŸã‚‰ã€flowed 㧠折り返ã—を実行ã—ã¾ã™ã€‚ã“ã®å¤‰æ•°ã®å€¤ã¯ 78 ã§ã™ã€‚ @end ifset @ifset en Then, Mew sees if long lines exist in a draft. If long lines whose length is over @samp{mew-flowed-fold-threshold} are found, Mew applies the @w{"}flowed" folding. This variable defaults to 78. @end ifset @ifset ja 折り返ã—ãŸè¡ŒãŒã€ä½•文字以内ã«ãªã‚‹ã‹ã‚’制御ã™ã‚‹å¤‰æ•°ãŒ @samp{mew-flowed-fold-length}ã§ã™ã€‚åˆæœŸå€¤ã¯ 70 ã§ã™ã€‚ @end ifset @ifset en @samp{mew-flowed-fold-length} controls the max length of folded lines. Its initial value is 70. @end ifset @ifset ja æŠ˜ã‚Šè¿”ã™æ–¹æ³•ã¯ã€æ–‡å­—コードã«ã‚ˆã£ã¦å¤‰ã‚りã¾ã™ã€‚分ã‹ã¡æ›¸ãã‚’ã™ã‚‹æ–‡å­—コー ドã§ã¯ã€æ—¢å­˜ã®ç©ºç™½æ–‡å­—ã®å¾Œã«æ”¹è¡Œæ–‡å­—ã‚’å…¥ã‚Œã¦æŠ˜ã‚Šè¿”ã—ã¾ã™(delsp=no)。分 ã‹ã¡æ›¸ãã‚’ã—ãªã„文字コードã§ã¯ã€é©åˆ‡ãªå ´æ‰€ã«ç©ºç™½æ–‡å­—ã¨æ”¹è¡Œæ–‡å­—ã®ä¸¡æ–¹ã‚’ 挿入ã—ã¦æŠ˜ã‚Šè¿”ã—ã¾ã™(delsp=yes)。 @end ifset @ifset en Folding method is decided according to character set. If the language is separated by SPC, the new line characters are inserted after existing SPCs(delsp=no). Otherwise, pairs of SPC and the new line character are inserted in appropriate positions(delsp=yes). @end ifset @ifset ja ã‚‚ã†ä¸€åº¦ @samp{C-cC-f} を実行ã™ã‚‹ã¨ã€æŠ˜ã‚Šè¿”ã•れãŸè¡ŒãŒå…ƒã«æˆ»ã‚Šã¾ã™ã€‚ @end ifset @ifset en If you type @samp{C-cC-f} again, the folded lines are unfolded. @end ifset @ifset ja 2) @samp{mew-use-format-flowed} ㌠@samp{t} ã®å ´åˆã¯ã€@samp{C-cC-c}ã‚„ @samp{C-cC-m}ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹ã¨ãã«ã€ã“ã®æ©Ÿèƒ½ãŒåƒãã¾ã™ã€‚ã“ã®å¤‰æ•° ã®åˆæœŸå€¤ã¯ @samp{nil} ã§ã™ã€‚ @end ifset @ifset en 2) If @samp{mew-use-format-flowed} is @samp{t}, this functionality is took into account automatically at composing with @samp{C-cC-c} or @samp{C-cC-m}. Its default value is @samp{nil}. @end ifset @ifset ja 3) @samp{C-cC-pC-f} ã§ã€@samp{mew-use-format-flowed} ã®å€¤ã‚’å転ã§ãã¾ã™ã€‚ @end ifset @ifset en 3) You can toggle the value of @samp{mew-use-format-flowed} by @samp{C-cC-pC-f}. @end ifset @ifset ja ãªãŠã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹éš›ã¯ã€@samp{mew-use-format-flowed} ã®å€¤ã«é–¢ä¿‚ ãªã flowed ã§æŠ˜ã‚Šè¿”ã•れãŸè¡Œã¯ã€å…ƒã«æˆ»ã•れã¾ã™ã€‚é•·ã„行ãŒè¦‹ã«ãã„å ´åˆã¯ã€ Summary モード㧠@samp{_} を利用ã—ã¾ã—ょã†ã€‚ @end ifset @ifset en Note that folded lines with the "flowed" folding are always unfolded on viewing regardless of the value of @samp{mew-use-format-flowed}. If you feel it is hard to see long lines, use @samp{_} in Summary mode. @end ifset @ifset ja @samp{mew-flowed-auto-wrap} ㌠@samp{t} ã®å ´åˆã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã¨ã€ å…ƒã«æˆ»ã•れãŸè¡Œã«ä¸€å›ž @samp{_} ãŒå®Ÿè¡Œã•ã‚Œã€æŠ˜ã‚Šè¿”ã•れãŸçŠ¶æ…‹ã§è¡¨ç¤ºã•れ㾠ã™ã€‚@samp{mew-flowed-auto-wrap} ã®ãƒ‡ãƒ•ォルトã®å€¤ã¯ @samp{t} ã§ã™ã€‚ @end ifset @ifset en If @samp{mew-flowed-auto-wrap} is @samp{t}, at visualizing a message, @samp{_} is automatically executed so as unfolded lines are folded. The default value of @samp{mew-flowed-auto-wrap} is @samp{t}. @end ifset @c %%%%%%%%%%%%%%%%% @node reply, forward, longline, Composing @ifset ja @section メッセージã¸ã®è¿”ç­”ã¨å®›å…ˆã®æ±ºå®š @end ifset @ifset en @section Replying to a message and deciding recipients @end ifset @vindex mew-mail-address-list @vindex mew-reply-all-alist @vindex mew-reply-sender-alist @vindex mew-reply-fromme-alist @kindex a (Summary) @kindex A (Summary) @kindex C-ua (Summary) @kindex C-uA (Summary) @ifset ja æ–°è¦ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’書ãå ´åˆã¯ã€To:ã€Cc:ã€ãŠã‚ˆã³ Newsgroups: ã‚’è‡ªåˆ†ã§æ›¸ã ã“ã¨ã«ãªã‚Šã¾ã™ã€‚一方 Summary モード㧠@samp{a} ã‚„ @samp{A} を使ã£ã¦ã€ã‚ るメッセージã«è¿”ç­”ã—よã†ã¨ã™ã‚‹ã¨ã€To:ã€Cc:ã€Newsgroups: ã¯è‡ªå‹•çš„ã«ç”¨æ„㕠れã¾ã™ã€‚ @end ifset @ifset en As distinguished from the case of a new message, where the writer specifies the addresses of the To:, Cc: or Newsgroups: fields, in a reply message addresses are automatically generated. @end ifset @ifset ja Summary モード㧠@samp{a} ã‚„ @samp{A} を使ã†ã¨ã€æ–°ã—ã„è‰ç¨¿ãŒ Draft mode ã«ç”¨æ„ã•れã¾ã™ã€‚To:ã€Cc:ã€Newsgroups: ã®å€¤ã¯ã€ä»¥ä¸‹ã®ä¸‰ã¤ã® alist ã«å¾“㣠ã¦ç”¨æ„ã•れã¾ã™ã€‚ @end ifset @ifset en When @samp{a} and @samp{A} is used in Summary mode, a new draft is prepared in Draft mode. Values of To:, Cc:, and Newsgroups: are prepared according to three alists. @end ifset @enumerate @ifset ja @item ã‚‚ã— @samp{C-u} 付ãã§å‘¼ã³å‡ºã•れãŸå ´åˆã€é€ä¿¡è€…/投稿者ã®ã¿ã«è¿”ç­”ã™ã‚‹ã€‚ã“ ã®å ´åˆã€@samp{mew-reply-sender-alist} ãŒåˆ©ç”¨ã•れる。 @item ã‚‚ã—対象ãŒè‡ªåˆ†è‡ªèº«ã§é€ã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãªã‚‰ã€ãã®ãƒ˜ãƒƒãƒ€ã‚’加工ã›ãšã«è¿”ç­”ã—㟠ã„ã®ã§ã‚ã‚ã†ã€‚ã“ã®å ´åˆã€@samp{mew-reply-fromme-alist} ãŒåˆ©ç”¨ã•れる。 @item ãã†ã§ãªã‘れã°ã€ã™ã¹ã¦ã®äººã«è¿”ç­”ã™ã‚‹ã€‚ã“ã®å ´åˆã€ @samp{mew-reply-all-alist} ãŒåˆ©ç”¨ã•れる。 @end ifset @ifset en @item If called with @samp{C-u}, replying to the sender/poster only. In this case, @samp{mew-reply-sender-alist} is used. @item If this message is sent by ME, you probably intend to reply with the original header. In this case, @samp{mew-reply-fromme-alist} is used. @item Otherwise, replying to all people listed. In this case, @samp{mew-reply-all-alist} is used. @end ifset @end enumerate @ifset ja @samp{mew-reply-sender-alist} ã®åˆæœŸå€¤ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ @end ifset @ifset en The default value of @samp{mew-reply-sender-alist} is as follows: @end ifset @lisp '(("Reply-To:" ("To:" "Reply-To:" "From:")) (t ("To:" "From:"))) @end lisp @ifset ja ã“れã¯ã€æ¬¡ã®ã‚ˆã†ã«è§£é‡ˆã—ã¾ã™ã€‚ @end ifset @ifset en This is read as follows: @end ifset @enumerate @ifset ja @item Reply-To: ãŒå­˜åœ¨ã™ã‚Œã°ã€Reply-To: 㨠From: ã®å€¤ã‚’æ–°ã—ã„ To: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ @item ãã†ã§ãªã‘れã°ã€From: ã®å€¤ã‚’æ–°ã—ã„ To: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ @end ifset @ifset en @item If Reply-To: exists, copy the values of Reply-To: and From: to new To:. @item Otherwise, copy the value of From: to To:. @end ifset @end enumerate @ifset ja ã‚‚ã—ã€Reply-To: ã§æŒ‡å®šã•れãŸã‚¢ãƒ‰ãƒ¬ã‚¹ã®ã¿ã«è¿”ç­”ã—ãŸã„å ´åˆã¯ã€ @samp{mew-reply-sender-alist} を以下ã®ã‚ˆã†ã«è¨­å®šã™ã‚‹ã¨ã‚ˆã„ã§ã—ょã†ã€‚ @end ifset @ifset en If you would like to reply only to the address on Reply-To: (if any), set @samp{mew-reply-sender-alist} like this: @end ifset @lisp (setq mew-reply-sender-alist '(("Reply-To:" ("To:" "Reply-To:")) (t ("To:" "From:")))) @end lisp @ifset ja @samp{mew-reply-fromme-alist} ã®åˆæœŸå€¤ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ @end ifset @ifset en The default value of @samp{mew-reply-fromme-alist} is as follows: @end ifset @lisp '((t ("To:" "To:") ("Cc:" "Cc:") ("Newsgroups:" "Newsgroups:")))) @end lisp @ifset ja ã“れã¯ã€æ¬¡ã®ã‚ˆã†ã«è§£é‡ˆã—ã¾ã™ã€‚ @end ifset @ifset en This is read as follows: @end ifset @enumerate @item @ifset ja To: ã®å€¤ã‚’æ–°ã—ã„ To: ã¸ã€ Cc: ã®å€¤ã‚’æ–°ã—ã„ Cc: ã¸ã€ Newsgroups: ã®å€¤ã‚’æ–°ã—ã„ Newsgroups: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ @end ifset @ifset en Copying the value of To: to new To: and copying the value of Cc: to new Cc: and copying the value of Newsgroups: to new Newsgroups:. @end ifset @end enumerate @ifset ja @samp{mew-reply-all-alist} ã®åˆæœŸå€¤ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ @end ifset @ifset en The default value of @samp{mew-reply-all-alist} is as follows: @end ifset @lisp '((("Followup-To:" "poster") ("To:" "From:")) ("Followup-To:" ("Newsgroups:" "Followup-To:" "Newsgroups:")) ("Newsgroups:" ("Newsgroups:" "Newsgroups:")) ("Reply-To:" ("To:" "Reply-To:" "From:") ("Cc:" "To:" "Cc:" "Apparently-To:")) (t ("To:" "From:") ("Cc:" "To:" "Cc:" "Apparently-To:"))) @end lisp @ifset ja ã“れã¯ã€æ¬¡ã®ã‚ˆã†ã«è§£é‡ˆã—ã¾ã™ã€‚ @end ifset @ifset en This is read as follows: @end ifset @enumerate @ifset ja @item Follwup-To: ã®å€¤ãŒ "poster" ã§ã‚れã°ã€From: ã®å€¤ã‚’æ–°ã—ã„ To: ã¸ã‚³ãƒ”ー㙠る。 @item Follwup-To: ãŒå­˜åœ¨ã™ã‚Œã°ã€Follwup-To: 㨠Newsgroups: ã®å€¤ã‚’æ–°ã—ã„ Newsgroups: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ @item Newsgroups: ãŒå­˜åœ¨ã™ã‚Œã°ã€Newsgroups: ã®å€¤ã‚’æ–°ã—ã„ Newsgroups: ã¸ã‚³ãƒ”ー ã™ã‚‹ã€‚ @item Reply-To: ãŒå­˜åœ¨ã™ã‚Œã°ã€Reply-To: 㨠From: ã®å€¤ã‚’æ–°ã—ã„ To: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ ã¾ãŸã€To:ã€Cc:ã€Apparently-To: ã®å€¤ã‚’æ–°ã—ã„ Cc: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ @item ãã†ã§ãªã‘れã°ã€From: ã®å€¤ã‚’æ–°ã—ã„ To: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ã¾ãŸã€To:ã€Cc:〠Apparently-To: ã®å€¤ã‚’æ–°ã—ã„ Cc: ã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ @end ifset @ifset en @item If the value of Followup-To: is "poster", copying the value of From: to new To:. @item If Followup-To: exists, copying the values of Followup-To: and Newsgroups: to new Newsgroups:. @item If Newsgroups: exists, copying the value of Newsgroups: to Newsgroups:. @item If Reply-To: exists, copying the values of Reply-To: and From: to new To:. And copying the values of To:, Cc:, and Apparently-To: to new Cc:. @item Otherwise, copying the value of From: to new To:. And copying the values of To:, Cc:, and Apparently-To: to new Cc:. @end ifset @end enumerate @ifset ja @samp{mew-reply-all-alist} を以下ã®ã‚ˆã†ã«è¨­å®šã—ãŸã„ã¨æ€ã†äººã‚‚ã„ã‚‹ã‹ã‚‚㗠れã¾ã›ã‚“。 @end ifset @ifset en You may want to set @samp{mew-reply-all-alist} like this: @end ifset @lisp (setq mew-reply-all-alist '((("Followup-To:" "poster") ("To:" "From:")) ("Followup-To:" ("Newsgroups:" "Followup-To:")) ("Newsgroups:" ("Newsgroups:" "Newsgroups:")) ("Reply-To:" ("To:" "Reply-To:")) (t ("To:" "From:") ("Cc:" "To:" "Cc:" "Apparently-To:")))) @end lisp @ifset ja ã‚るアドレスãŒè¤‡æ•°ã‚ã‚‹å ´åˆã¯ã€è‡ªå‹•的㫠1 ã¤ã«ãªã‚Šã¾ã™ã€‚ã¾ãŸã€åŒ¿åã®å®›å…ˆ を表㙠":;" ã§çµ‚るアドレスもã€è‡ªå‹•çš„ã«æ¶ˆåŽ»ã•れã¾ã™ã€‚ @end ifset @ifset en If there are multiple entries for a certain address, they are unified. Addresses ending with ":;", which indicates anonymous recipients, are automatically removed. @end ifset @ifset ja 自分ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯è‡ªå‹•çš„ã«æ¶ˆåŽ»ã•れã¾ã™ã€‚自分ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã¯ã€ @samp{mew-config-alist} ãªã©ã‹ã‚‰ @samp{mew-mail-address-list} ã«è‡ªå‹•設定 ã•れã¾ã™ã€‚ã“ã®å€¤ãŒæ°—ã«å…¥ã‚‰ãªã„ãªã‚‰ã€ä»¥ä¸‹ã®ã‚ˆã†ã«æ˜Žç¤ºçš„ã«è¨­å®šã™ã‚‹ã“ã¨ã‚‚å¯ èƒ½ã§ã™ã€‚ @end ifset @ifset en Your addresses are automatically removed. Your addresses are automatically defined to @samp{mew-mail-address-list} according to, for example, @samp{mew-config-alist}. If you dislike this value, you can also explicitly set it like this: @end ifset @lisp (setq mew-mail-address-list '("^pooh@@[a-z]*.example.org$" "^pooh@@example.net$" "^winnie@@example.jp$")) @end lisp @c %%%%%%%%%%%%%%%%% @node forward, resend, reply, Composing @ifset ja @section メッセージã®è»¢é€ @end ifset @ifset en @section Forwarding messages @end ifset @vindex mew-field-delete-for-forwarding @kindex f (Summary) @kindex F (Summary) @ifset ja メッセージを転é€ã™ã‚‹ã«ã¯ã€Summary モード㧠@samp{f} ã‚„ @samp{F} を利用㗠ã¾ã™ã€‚ã™ã‚‹ã¨ã€Draft モードã«ç§»è¡Œã—ã€ã‚らã‹ã˜ã‚ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ·»ä»˜é ˜åŸŸã«æ·»ä»˜ ã•れãŸè‰ç¨¿ãŒæº–å‚™ã•れã¾ã™ã€‚ @end ifset @ifset en To forward messages, type @samp{f} or @samp{F} in Summary mode. Then Draft mode appears and the messages are already attached in the attachments region. @end ifset @ifset ja ã¾ãŸ Draft ãƒ¢ãƒ¼ãƒ‰ã§æ·»ä»˜é ˜åŸŸã‚’用æ„ã—ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’コピー(@samp{c})ã—ãŸã‚Š ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ãƒªãƒ³ã‚¯(@samp{l})ã‚’å¼µã£ãŸã‚Šã—ã¦ã‚‚ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’転é€ã§ãã¾ã™ã€‚ ファイルåãŒæ•°å­—([0-9]+)ã®å ´åˆã¯ã€è‡ªå‹•çš„ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã ã¨åˆ¤æ–­ã•れã¾ã™ã€‚ã¾ ãŸã€æ·»ä»˜é ˜åŸŸã§ @samp{y} を使ã†ã¨ã€Message モードã«è¡¨ç¤ºã—ã¦ã„るメッセージ ã«ãƒªãƒ³ã‚¯ã‚’張るã®ã§ä¾¿åˆ©ã§ã™ã€‚ @end ifset @ifset en Also, you can prepare the attachments region by yourself, then copy (@samp{c}) the messages or make links (@samp{l}) to the messages. If the file names of the messages are numeric ([0-9]+), they are automatically considered as messages. @samp{y} is very convenient because it make a link to the message displayed in Message mode. @end ifset @ifset ja é€šå¸¸ã¯æ·»ä»˜ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å…¨ä½“ãŒè»¢é€ã•れã¾ã™ã€‚ã‚‚ã—ã€ãƒ˜ãƒƒãƒ€ã®ä¸€éƒ¨ã‚’削り㟠ã„å ´åˆã¯ã€@samp{mew-field-delete-for-forwarding} を定義ã—ã¦ä¸‹ã•ã„。以下 ã« @w{"}Received:" 㨠"Return-Path:" ã‚’è»¢é€æ™‚ã«å‰Šã‚‹ãŸã‚ã®è¨­å®šä¾‹ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en By default, the entire message is forwarded. If you want to remove some parts of its header, define @samp{mew-field-delete-for-forwarding}. The following is an example to remove "Received:" and "Return-Path:" when forwarded. @end ifset @lisp (setq mew-field-delete-for-forwarding '("Received:" "Return-Path:")) @end lisp @c %%%%%%%%%%%%%%%%% @node resend, shortcut, forward, Composing @ifset ja @section メッセージã®å†é€ @end ifset @ifset en @section Re-sending messages @end ifset @kindex r (Summary) @kindex W (Summary) @kindex C-cC-c (Header) @kindex C-cC-m (Header) @ifset ja メッセージã®ãƒ˜ãƒƒãƒ€ã®ä¸€éƒ¨ã®ã¿ã‚’変更ã—ã¦ã€é€ä¿¡ã—ãŸã„å ´åˆãŒã‚りã¾ã™ã€‚ @end ifset @ifset en You may occasionally wish to send messages modifying the header of a message. @end ifset @ifset ja ãŸã¨ãˆã°ã€åŒã˜å†…容ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã€è¤‡æ•°ã®å®›å…ˆã«ç‹¬ç«‹ã—ã¦é€ã‚ŠãŸã„å ´åˆã§ã™ã€‚ pooh å®›ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã—ã¦ã€+queue ã«å…¥ã‚Œã€ã™ãã•ã¾ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’コ ピーã—ã€å®›å…ˆã ã‘ã‚’ piglet ã«å¤‰æ›´ã—ãŸã„å ´åˆã‚’想åƒã—ã¦ä¸‹ã•ã„。ã“れをã€ãƒ¡ãƒƒ セージã®å†åˆ©ç”¨ã«ã‚ˆã‚‹é€ä¿¡ã¨å‘¼ã³ã¾ã—ょã†ã€‚ @end ifset @ifset en For instance, you may want to send a message with the same body to multiple receivers independently. Please imagine the case where you put a created message destined to Pooh in +queue and then you wish to send an another message to Piglet by copying it and modifying its header. Let's call this recycle sending. @end ifset @ifset ja ã¾ãŸã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« Resent-To: ã¨ã„ã†ãƒ•ィールドを付ã‘ã¦å†é€ã—ãŸã„ã“ã¨ã‚‚゠りã¾ã™ã€‚ã“れã¯ã€è»¢é€ã®ä¸€ç¨®ã§ã™ã€‚ã“ã¡ã‚‰ã¯ãƒ˜ãƒƒãƒ€ã ã‘書ãç›´ã™ã®ã§ã€ãƒ˜ãƒƒãƒ€å¤‰ æ›ã¨ã„ã„ã¾ã™ã€‚å‰ç¯€ã§èª¬æ˜Žã—ãŸè»¢é€ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ–°è¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«åŒ…ã¿è¾¼ ã‚“ã§è»¢é€ã™ã‚‹ãŸã‚ã€ã‚«ãƒ—セル化ã¨å‘¼ã°ã‚Œã¦ã„ã¾ã™ã€‚ @end ifset @ifset en Also, you occasionally wish to send a message adding the Resent-To: field to a target message. This is a kind of forwarding. This is called header conversion because a message header is modified. The forwarding described the previous subsection is called encapsulation because a message is embedded into another new message. @end ifset @ifset ja ヘッダã®ä¸€éƒ¨ã ã‘を編集ã—ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ãŸã‚Šã€ã‚­ãƒ¥ãƒ¼ã«å…¥ã‚ŒãŸã‚Šã™ã‚‹ãƒ¢ãƒ¼ ドã¨ã—ã¦ã€Header モードãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚本文ãŒç·¨é›†ã§ããªã„ Draft モー ドã ã¨æ€ãˆã°ã„ã„ã§ã—ょã†ã€‚ @end ifset @ifset en Header mode exists for this reason, modifying a part of the header, sending/queuing the created message. You can think this is a kind of Draft mode which prohibits modifications of its body. @end ifset @ifset ja Header モードã«å…¥ã‚‹ãŸã‚ã«ã€Summary モードã«ã¯ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ãŒç”¨æ„ã•れ㦠ã„ã¾ã™ã€‚ @end ifset @ifset en The following commands are provided in Summary mode to enter Header mode. @end ifset @table @samp @ifset ja @item W メッセージã®å†åˆ©ç”¨ã«ã‚ˆã‚‹é€ä¿¡ã€‚対象ã¨ãªã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã® To:ã€Cc:ã€From: 㪠ã©ã‚’æ›¸ãæ›ãˆã‚‹ãŸã‚ã«ã€Header モードã«ç§»è¡Œã™ã‚‹ã€‚典型的ã«ã¯ã€+queue ã¾ãŸã¯ +postq ã«å…¥ã£ã¦ã„るメッセージã«å¯¾ã—ã¦åˆ©ç”¨ã™ã‚‹ã€‚ @item r メッセージã®å†é€ã€‚対象ã¨ãªã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ˜ãƒƒãƒ€ã«ã€Resent-To:ã€Resent-Cc:〠Resent-From: ãªã©ã‚’追加ã™ã‚‹ãŸã‚ã«ã€Header モードã«ç§»è¡Œã™ã‚‹ã€‚å†é€ã«ã‚ˆã‚‹ãƒ¡ãƒƒ セージã®è»¢é€ã¯ã€å—信者を混乱ã•ã›ã‚‹ã“ã¨ãŒã‚ã‚‹ã®ã§ã€ã‚ˆã考ãˆã¦ã‹ã‚‰åˆ©ç”¨ã™ã‚‹ ã“ã¨ã€‚ @end ifset @ifset en @item W Recycle sending. Enter Header mode in order to modify To:, Cc:, From: of a target message. Typical usage is for messages in +queue or +postq. @item r Re-sending. Enter Header mode in order to add Resent-To:, Resent-Cc:, Resent-From: of a target message. Re-sending may confuse receivers, so you should think carefully before using it. @end ifset @end table @ifset ja Header モードã§ã¯ã€Draft モードã®ã‚ˆã†ã«ã€è£œå®Œã‚„循環的ãªè£œå®ŒãŒåˆ©ç”¨ã§ãã¾ ã™ã€‚ヘッダã®å…¥åŠ›ãŒçµ‚ã‚ã£ãŸã‚‰ã€ä»¥ä¸‹ã®ã©ã¡ã‚‰ã‹ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’用ã„ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ ジをé€ä¿¡ã—ã¦ä¸‹ã•ã„。本文ãŒè¡¨ç¤ºã•れã¦ã„ãªã„ã®ã§ä¸å®‰ã‹ã‚‚ã—れã¾ã›ã‚“ãŒã€ã¡ã‚ƒ ã‚“ã¨å¯¾è±¡ã¨ãªã£ã¦ã„ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ¬æ–‡ã¨ãƒ˜ãƒƒãƒ€ã®ä¸€éƒ¨ãŒå†åˆ©ç”¨ã•れã¾ã™ã€‚ @end ifset @ifset en In Header mode, you can make use of completion and circular completion like in Draft mode. When you are finished inputting the header, send the message using one of the following commands. You may be concerned because the body of the message is not displayed in your new message. But you need not worry, since the body and a part of the target message is certainly used. @end ifset @table @samp @ifset ja @item C-cC-m メッセージを作æˆã— +queue ã¾ãŸã¯ +postq ã«å…¥ã‚Œã€é€ä¿¡å¾…ã¡çŠ¶æ…‹ã«ã™ã‚‹ã€‚ @item C-cC-c メッセージを作æˆã—é€ä¿¡ã™ã‚‹ã€‚"Really send this message? (y or n) " ã¨è¨Šã‹ れる。@samp{y} を押ã›ã°é€ä¿¡ã•れる。 @end ifset @ifset en @item C-cC-m Compose a message, put it into +queue or +postq, and let it be waiting to be sent. @item C-cC-c Compose a message and send it. You are asked, "Really send this message? (y or n) ". Type @samp{y} to send it. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node shortcut, mark-b-comp, resend, Composing @ifset ja @section é›»å­ç½²å/æš—å·ãƒ¡ãƒ¼ãƒ«ã‚’作æˆã™ã‚‹ @end ifset @ifset en @section Creating signature or cipher message @end ifset @vindex mew-draft-privacy-method @vindex mew-protect-privacy-always @vindex mew-protect-privacy-always-type @vindex mew-protect-privacy-encrypted @vindex mew-protect-privacy-encrypted-type @vindex mew-use-old-pgp @vindex mew-protect-privacy-with-old-pgp-signature @kindex C-cC-s (Draft) @kindex C-cC-e (Draft) @kindex C-cC-b (Draft) @kindex C-cC-r (Draft) @kindex C-cC-pC-m (Draft) @kindex C-cC-pC-a (Draft) @kindex C-cC-pC-e (Draft) @ifset ja ã“ã“ã§ã¯ã€ãƒ†ã‚­ã‚¹ãƒˆã§ã‚る本文を PGP ã‚„ S/MIME ã§ç½²åã—ãŸã‚Šæš—å·åŒ–ã—ãŸã‚Šã™ る方法ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚紹介ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ @end ifset @ifset en This section explains the method for signing or encrypting "text only" messages with PGP or S/MIME. The following commands are explained. @end ifset @table @samp @ifset ja @item C-cC-s è‰ç¨¿å…¨ä½“ã‚’ç½²åã™ã‚‹ã€‚パスフレーズを入力ã™ã‚‹ã“ã¨ã€‚ @item C-cC-e è‰ç¨¿å…¨ä½“ã‚’æš—å·åŒ–ã™ã‚‹ã€‚ @item C-cC-b è‰ç¨¿å…¨ä½“ã‚’ç½²å後暗å·åŒ–ã™ã‚‹ã€‚パスフレーズを入力ã™ã‚‹ã“ã¨ã€‚ @item C-cC-r è‰ç¨¿å…¨ä½“ã‚’æš—å·åŒ–後署åã™ã‚‹ã€‚パスフレーズを入力ã™ã‚‹ã“ã¨ã€‚ @end ifset @ifset en @item C-cC-s Sign the entire draft. Input your pass-phrase. @item C-cC-e Encrypt the entire draft. @item C-cC-b Sign, and then encrypt the entire draft. Input your pass-phrase. @item C-cC-r Encrypt, and then sign the entire draft. Input your pass-phrase. @end ifset @end table @ifset ja メッセージを暗å·åŒ–ã™ã‚‹ã«ã¯å—信者ã®å…¬é–‹éµã‚’使用ã—ã¾ã™ã€‚逆ã«ç½²åã™ã‚‹ã«ã¯ 自分ã®ç§˜å¯†éµã‚’使ã„ã¾ã™ã€‚よã£ã¦ã€ç½²åã™ã‚‹ãŸã‚ã«ã¯ãƒ‘スフレーズを入力ã™ã‚‹ å¿…è¦ãŒã‚りã¾ã™ã€‚ãŸã ã—ã€ãƒ‘スフレーズã®ä¿å­˜æ©Ÿèƒ½ã‚„マスターパスワードを使㣠ã¦ãŠã‚Šã€ãƒ‘スフレーズãŒä¿å­˜ã•れã¦ã„ã‚‹å ´åˆã¯ã€ãƒ‘スフレーズを入力ã™ã‚‹å¿…è¦ ã¯ã‚りã¾ã›ã‚“(@xref{password})。 @end ifset @ifset en To encrypt a message, receivers' public keys are used. On the other hand, your secret key is used to sign a message, and so you need to input your pass-phrase when applying the signature. Note that if you are using the pass-phrase cache or the master password mechanism and there are pass-phrases presently cached, you do not have to type your pass-phrase (@pxref{password}). @end ifset @ifset ja ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€é€šå¸¸ PGP/MIME を作æˆã—ã¾ã™ã€‚S/MIME を作æˆã—ãŸã„å ´åˆ ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en These commands create a PGP/MIME message by default. If you want to use S/MIME, configure as follows: @end ifset @lisp (setq mew-draft-privacy-method 'smime) @end lisp @ifset ja ã“ã®å¤‰æ•°ã®å€¤ã¯ã€Draft モード㮠@samp{C-cC-pC-m} ã§ã‚‚変更ã§ãã¾ã™ã€‚ @end ifset @ifset en You can change this variable with @samp{C-cC-pC-m} in Draft mode. @end ifset @ifset ja 上記4ã¤ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€æ¬¡ç¯€ã§èª¬æ˜Žã™ã‚‹ãƒžãƒ¼ã‚¯ã‚’使ã£ãŸä½œæˆæ–¹æ³•ã®çœç•¥æ–¹æ³•ã«å½“ ãŸã‚Šã¾ã™ã€‚ @end ifset @ifset en We can consider that these four commands above are shortcut methods of mark based composing described in the next section. @end ifset @ifset ja メッセージã«ç½²åã‚’æ–½ã™ã«ã¯ã€@samp{C-cC-s} ã¨å…¥åŠ›ã—ã¾ã™ã€‚ç½²åã®éš›ã«ã¯ã€è‡ª 分ã®ç§˜å¯†éµã‚’復å·åŒ–ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã®ã§ã€ãƒ‘スフレーズãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れ㦠ã„ãªã‘れã°ã€å…¥åŠ›ã‚’ä¿ƒã•れã¾ã™ã€‚ç½²åãŒæ–½ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€+queue ã¾ãŸã¯ +postq ã«æ ¼ç´ã•れã¾ã™ã€‚ @end ifset @ifset en To sign a message, type @samp{C-cC-s}. When signing, because your secret key is needed to be decrypted, you may be asked for your pass-phrase if it is not cached. Created messages are stored in +queue or +postq. @end ifset @ifset ja 自分ã®ç§˜å¯†éµã¯ã€From: ã«ã‚るアドレスを元ã«ç‰¹å®šã•れã¾ã™ã€‚From: ãŒãªã„å ´ åˆã¯ã€ãƒ‡ãƒ•ォルトã®ç§˜å¯†éµãŒé¸æŠžã•れã¾ã™ã€‚From: ã«ã‚るアドレスã¨ã¯é•ã†ã‚¢ ドレスã§ç§˜å¯†éµã‚’指定ã—ãŸã„å ´åˆã¯ã€@samp{C-uC-cC-s} ã¨å…¥åŠ›ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Your secret key is identified in From: address. If From: does not exist, your default secret key is selected. When you want to specify a secret key that is not identified the address of From:, type @samp{C-uC-cC-s}. @end ifset @ifset ja メッセージを暗å·åŒ–ã™ã‚‹ã«ã¯ã€@samp{C-cC-e} ã¨ã‚¿ã‚¤ãƒ—ã—ã¦ä¸‹ã•ã„。To: ã‚„ Cc: ã‹ã‚‰ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’切り出ã—ã¦ã€ãã®å—信者ãŒå¾©å·åŒ–ã§ãã‚‹ã‚ˆã†æš—å·åŒ–ã—ã¾ã™ã€‚æš—å· åŒ–ã™ã‚‹ã ã‘ã®ãªã®ã§ã€ãƒ‘スフレーズを訊ã‹ã‚Œã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。作æˆã•れãŸãƒ¡ãƒƒ セージã¯ã€+queue ã«æ ¼ç´ã•れã¾ã™ã€‚ @end ifset @ifset en To encrypt a message, type @samp{C-cC-e}. A message is encrypted with public keys identified with the addresses on To: and Cc:. Since this is encryption only, you are not asked for your pass-phrase. Created cipher messages are stored in +queue. @end ifset @ifset ja ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€å—信者ã®å…¬é–‹éµã«åŠ ãˆã¦ã€è‡ªåˆ†ã®å…¬é–‹éµã§ã‚‚æš—å·åŒ–ã•れã¦ã„ ã¾ã™ã€‚ã§ã™ã‹ã‚‰ã€ä½œæˆã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·åŒ–ã§ãã¾ã™ã€‚ãŸã¨ãˆã°ã€@samp{g} ã§ +queue ã«ç§»å‹•ã—ã€å¿µã®ãŸã‚復å·åŒ–ã—ã¦ç¢ºèªã™ã‚‹ã“ã¨ãŒå¯èƒ½ã§ã™ã€‚ @end ifset @ifset en This message is encrypted with your public key in addition to those of the receivers. Therefore you can decrypt created messages. For example, you can go to +queue by @samp{g} and preview a created message to reconfirm this. @end ifset @ifset ja ç½²å後暗å·åŒ–ã™ã‚‹ã«ã¯ã€@samp{C-cC-b} ã¨å…¥åŠ›ã—ã¾ã™ã€‚æš—å·åŒ–後署åã™ã‚‹ã«ã¯ã€ @samp{C-cC-r} ã¨ã‚¿ã‚¤ãƒ—ã—ã¾ã™ã€‚ã©ã¡ã‚‰ã®å ´åˆã‚‚作æˆã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ +queue ã«è“„ãˆã‚‰ã‚Œã¾ã™ã€‚ @end ifset @ifset en To sign a draft and then encrypt it, type @samp{C-cC-b}. To encrypt a draft and then sign it, type @samp{C-cC-r}. In both cases, created messages are stored in +queue. @end ifset @ifset ja ç½²åã‚’æ–½ã—ãŸã‚Šã€æš—å·åŒ–ã—ãŸã‚Šã—ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚ã†ã¨æ€ã£ã¦ã„ã¦ã‚‚ã€ã†ã£ ã‹ã‚Šå¿˜ã‚Œã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ã“れを防ããŸã‚ã«ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹ã‚³ãƒžãƒ³ ド @samp{C-cC-m} ã‚„ @samp{C-cC-c} を実行ã™ã‚‹ã¨ã€è‡ªå‹•çš„ã«ç½²åã‚„æš—å·åŒ–ã‚’ æ–½ã™æ©Ÿèƒ½ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en It is very likely that you will forget to sign and/or encrypt a draft even if you intended to do so. To prevent this, Mew provides an mechanism to automatically sign or encrypt a message when @samp{C-cC-m} or @samp{C-cC-c} is typed. @end ifset @ifset ja 作æˆã™ã‚‹ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ—ライãƒã‚·ã‚’ä¿è­·ã—ãŸã„ãªã‚‰ã€ @samp{mew-protect-privacy-always} ã‚’ @samp{t} ã«ã—ã¦ã€ @samp{mew-protect-privacy-always-type} ã«åˆ©ç”¨ã—ãŸã„サービスを設定ã—ã¾ã™ã€‚ @end ifset @ifset en If you want to protect privacy of all drafts, set @samp{mew-protect-privacy-always} to @samp{t} and set @samp{mew-protect-privacy-always-type} to one of services. @end ifset @ifset ja æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã™ã‚‹è¿”答メッセージã®ãƒ—ライãƒã‚·ã‚’ä¿è­·ã—ãŸã„ãªã‚‰ã€ @samp{mew-protect-privacy-encrypted} ã‚’ @samp{t} ã«ã—ã¦ã€ @samp{mew-protect-privacy-encrypted-type} ã«åˆ©ç”¨ã—ãŸã„サービスを設定ã—ã¾ ã™ã€‚ã“ã®è¨­å®šã¯ã€æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã®è¿”ç­”ã™ã‚‹å ´åˆã€ä¸Šè¨˜ã®ã™ã¹ã¦ã®ãƒ¡ãƒ¼ ルã«å¯¾ã™ã‚‹è¨­å®šã‚ˆã‚Šã‚‚優先ã•れã¾ã™ã€‚ @end ifset @ifset en If you want to protect the privacy of drafts when replying encrypted messages, set @samp{mew-protect-privacy-encrypted} to @samp{t} and set @samp{mew-protect-privacy-encrypted-type} to one of the services. This configuration is preferred to the configuration for all drafts described above in the case of replying encrypted messages. @end ifset @ifset ja 以下ã«åˆ©ç”¨ã§ãるサービスを示ã—ã¾ã™ã€‚ã‹ã£ã“内ã¯ãれãžã‚Œã®ã‚µãƒ¼ãƒ“スを表ã™ã‚· ンボルã§ã™ã€‚@samp{C-cC-m} ã‚„ @samp{C-cC-c} ã¨å…¥åŠ›ã™ã‚‹éš›ã«åˆ©ç”¨ã•れるサー ビスã¯ã€ãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ã«è¡¨ç¤ºã•れã¾ã™ã€‚ @end ifset @ifset en The following services are available. The strings enclosed in braces are the symbols for each service. The service applied when typing @samp{C-cC-m} or @samp{C-cC-c} is displayed in the mode line. @end ifset @table @asis @ifset ja @item pgp-signature (PS) PGP ã§ç½²å @item pgp-encryption (PE) PGP ã§æš—å·åŒ– @item pgp-signature-encryption (PSPE) PGP ã§ç½²å後暗å·åŒ– @item pgp-encryption-signature (PEPS) PGP ã§æš—å·åŒ–後署å @item smime-signature (SS) S/MIME ã§ç½²å @item smime-encryption (SE) S/MIME ã§æš—å·åŒ– @item smime-signature-encryption (SSSE) S/MIME ã§ç½²å後暗å·åŒ– @item smime-encryption-signature (SESS) S/MIME ã§æš—å·åŒ–後署å @end ifset @ifset en @item pgp-signature (PS) Sign with PGP @item pgp-encryption (PE) Encrypt with PGP @item pgp-signature-encryption (PSPE) Sign then encrypt with PGP @item pgp-encryption-signature (PEPS) Encrypt then sign with PGP @item pgp-signature (SS) Sign with S/MIME @item pgp-encryption (sE) Encrypt with S/MIME @item pgp-signature-encryption (SSSE) Sign then encrypt with S/MIME @item pgp-encryption-signature (SESS) Encrypt then sign with S/MIME @end ifset @end table @ifset ja 以下ã®ä¾‹ã¯ã€ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ç½²åã™ã‚‹è¨­å®šã§ã™ã€‚ @end ifset @ifset en The following example works for signing all drafts. @end ifset @lisp (setq mew-protect-privacy-always t) (setq mew-protect-privacy-always-type 'pgp-signature) @end lisp @ifset ja 以下ã®ä¾‹ã¯ã€æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã®è¿”答メッセージã«å¯¾ã—ã€PGP ã§æš—å· åŒ–ã™ã‚‹è¨­å®šã§ã™ã€‚ @end ifset @ifset en The following example is for encrypting drafts with PGP when replying encrypted messages. @end ifset @lisp (setq mew-protect-privacy-encrypted t) (setq mew-protect-privacy-encrypted-type 'pgp-encryption) @end lisp @ifset ja Draft モードã§ã¯ã€@samp{C-cC-pC-a} ã§ @samp{mew-protect-privacy-always}〠@samp{C-cC-pC-e} ã§ @samp{mew-protect-privacy-encrypted} ã®å€¤ã‚’å転ã§ã ã¾ã™ã€‚ @end ifset @ifset en In Draft mode, @samp{C-cC-pC-a} toggles @samp{mew-protect-privacy-always} and @samp{C-cC-pC-e} toggles @samp{mew-protect-privacy-encrypted}. @end ifset @ifset ja Draft モードã«ãŠã„ã¦ç¾åœ¨æ›¸ã„ã¦ã„ã‚‹è‰ç¨¿ã«å¯¾ã—ã¦ã®ã¿ã‚らã‹ã˜ã‚サービスを指定 ã—ã¦ãŠãã€é€ä¿¡æ™‚ã«ã‚µãƒ¼ãƒ“スを施ã™ã“ã¨ã‚’忘れãªã„よã†ã«ã§ãã¾ã™ã€‚ç¾åœ¨ã®è‰ç¨¿ ã«å¯¾ã— @samp{C-cC-m} ã‚„ @samp{C-cC-c} ã§æ–½ã•れるサービスを指定ã™ã‚‹ã«ã¯ã€ @samp{C-cC-pC-d} ã«ç¶šã„ã¦ä¸Šè¨˜ã®ã‚µãƒ¼ãƒ“ス㮠1 ã¤ã‚’入力ã—ã¦ä¸‹ã•ã„。ç¾åœ¨ã®ã‚µãƒ¼ ビスをキャンセルã™ã‚‹ã«ã¯ã€ã‚µãƒ¼ãƒ“スåã®ä»£ã‚Šã«å˜ã« @samp{RET} を押ã—ã¦ä¸‹ã• ã„。 @end ifset @ifset en You can specify privacy services for the current draft in Draft mode beforehand so that you do not forget to apply the privacy services when sending. To set privacy services to the current draft evaluated when typing @samp{C-cC-m} or @samp{C-cC-c}, type @samp{C-cC-pC-d}, and then input one of privacy services listed above. To cancel the current privacy service, just type @samp{RET} instead of selecting the privacy service. @end ifset @ifset ja @samp{C-cC-c} ã‚„ @samp{C-cC-m} ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹éš›ã€ç½²åã‚„æš—å·åŒ–㫠失敗ã—ãŸã‚‰ã€è‰ç¨¿ã«æˆ»ã‚Šã¾ã™ã€‚ã“ã®ã¨ã指定ã—ã¦ã„ãŸã‚µãƒ¼ãƒ“スã¯ã‚­ãƒ£ãƒ³ã‚»ãƒ«ã•れ ã¾ã™ã€‚ç¶šã‘㦠@samp{C-cC-c} ã‚„ @samp{C-cC-m} ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹ã¨ã€æ™® 通ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½œæˆã•れるã®ã§æ°—ã‚’ã¤ã‘ã¦ä¸‹ã•ã„。å•題をå–り除ã„ãŸå¾Œã€åŒã˜ サービスを望むãªã‚‰ã€æ˜Žç¤ºçš„ã« @samp{C-cC-pC-d} ã§ã‚µãƒ¼ãƒ“スを指定ã™ã‚‹ã‹ã€ @samp{C-cC-s}ã€@samp{C-cC-e} ãªã©ã‚’用ã„ã¦ä¸‹ã•ã„。 @end ifset @ifset en When you compose a message by @samp{C-cC-c} or @samp{C-cC-m}, and if signing and/or encryption fails, the cursor gets back to the draft. At this time, the service that you specified is canceled. If you type @samp{C-cC-c} or @samp{C-cC-m} in this situation, a plain message is created, so please be careful. After correcting the cause of the failure, if you want the same service, type @samp{C-cC-pC-d} to specify your service explicitly or use @samp{C-cC-s}, @samp{C-cC-e}, etc. @end ifset @ifset ja @samp{mew-use-old-pgp} ã‚’ @samp{t} ã«è¨­å®šã™ã‚Œã°(åˆæœŸå€¤ã¯ @samp{nil})〠@samp{C-cC-s} ã‚„ @samp{C-cC-e} 㯠PGP/MIME ã®ä»£ã‚Šã«ã€å¤ã„ PGP ã®æ›¸å¼ã«å¾“㣠ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’生æˆã—ã¾ã™ã€‚添付領域ãŒã‚ã‚‹å ´åˆã¯ã€ã‚¨ãƒ©ãƒ¼ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en If @samp{mew-use-old-pgp} is set to @samp{t} (the default value is @samp{nil}), @samp{C-cC-s} and @samp{C-cC-e}, etc create old fashioned PGP message instead of PGP/MIME. If the attachment region exists, an error occurs. @end ifset @ifset ja 上記ã§èª¬æ˜Žã—㟠@samp{mew-protect-privacy-*} ã¯ã€PGP/MIME ã®ã¿ã«æœ‰åйã§ã‚ りã€å¤ã„ PGP ã«ã¯æ©Ÿèƒ½ã—ã¾ã›ã‚“。@samp{C-cC-m} ã‚„ @samp{C-cC-c} ã§å¸¸ã« å¤ã„ PGP ã®ç½²åã‚’æ–½ã™ã«ã¯ã€@samp{mew-protect-privacy-with-old-pgp-signature} ã‚’ @samp{t} ã«ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en @samp{mew-protect-privacy-*} described above are effective only to PGP/MIME, not to old PGP. If you want to create old PGP signature with @samp{C-cC-m} or @samp{C-cC-c} always, set @samp{mew-protect-privacy-with-old-pgp-signature} to @samp{t}. @end ifset @ifset ja PGP/MIME ã‚„ S/MIME ã®ãŸã‚ã« Mew 㯠GnuPG 1.x 㨠2.0 をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã™ãŒã€ 2.1 ã¯ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ã¾ã›ã‚“。 @end ifset @ifset en For PGP/MIME and S/MIME, Mew supports GnuPG 1.x and 2.0, not 2.1. @end ifset @c %%%%%%%%%%%%%%%%% @node mark-b-comp, pgp-key, shortcut, Composing @ifset ja @section マークを使ã£ãŸé›»å­ç½²å/æš—å·ãƒ¡ãƒ¼ãƒ«ã®ä½œæˆ @end ifset @ifset en @section Mark based composer @end ifset @kindex B (Attach) @kindex Q (Attach) @kindex G (Attach) @kindex S (Attach) @kindex E (Attach) @kindex Z (Attach) @kindex M-s (Attach) @kindex M-e (Attach) @kindex U (Attach) @ifset ja PGP/MIMEã€S/MIMEã€ãŠã‚ˆã³ ZIP をサãƒãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«ã€ãƒžãƒ¼ã‚¯ã‚’使ã£ãŸä½œæˆæ–¹ æ³•ãŒæä¾›ã•れã¦ã„ã¾ã™ã€‚以å‰ã®ä¾‹ã‚’æ€ã„出ã—ã¦ã¿ã¾ã—ょã†ã€‚ @end ifset @ifset en To support PGP/MIME, S/MIME and ZIP, mark based composing is provided. Remember the previous example. @end ifset @ifset ja @example ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* B 2 Image/Gif MagicPoint ã®ãƒ­ã‚´ mgp.gif Q 3 Application/Postscript 資料 ohp.ps 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- @end example @end ifset @ifset en @example ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* B 2 Image/Gif MagicPoint logo mgp.gif Q 3 Application/Postscript Presentation Material ohp.ps 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- @end example @end ifset @ifset ja 行頭㫠@samp{B} ã‚„ @samp{Q} ã¨ã„ã£ãŸãƒžãƒ¼ã‚¯ãŒã‚りã¾ã™ã€‚ã“ã®ãƒžãƒ¼ã‚¯ã¯ç¬¦å· 化をæ„味ã—ã¦ã„ã¾ã™ã€‚Mew ã§ã¯ã€æ–°ã—ã„æ¦‚念「符å·åŒ–ã€ã‚’å°Žå…¥ã—ã¦ã„ã¾ã™ã€‚符 å·åŒ–ã«ã¯ã€Base64ã€Quoted-Printableã€Gzip64 (Gzip + Base64)ã€ç½²åã€æš—å· åŒ–ãªã©ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en You can find the @samp{B} mark and the @samp{Q} mark at the beginning of the line. Mew provides you with a new concept of "encoding". Encoding includes Base64, Quoted-Printable, Gzip64 (Gzip + Base64), signature, encryption. @end ifset @ifset ja ç¾åœ¨æ¬¡ã® 8 ã¤ã®ãƒžãƒ¼ã‚¯ãŒã‚µãƒãƒ¼ãƒˆã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en At present, 8 marks are prepared. @end ifset @table @samp @ifset ja @item " " 符å·åŒ–ã—ãªã„。ãŸã ã—ã€8 ビットã®ãƒ†ã‚­ã‚¹ãƒˆã¯ç¬¦å·åŒ–ã•れるã‹ã‚‚ã—れãªã„。 @item B Base64 @item Q Quoted-Printable @item G Gzip64(gzip 圧縮㗠Base64 ã§ç¬¦å·åŒ–ã™ã‚‹ã€‚Mew ãŒå®Ÿé¨“çš„ã«æŽ¡ç”¨ã—ã¦ã„る。相手 ㌠Mew を使ã£ã¦ã„ãªã„å ´åˆã¯ã€ä½¿ç”¨ã™ã¹ãã§ã¯ãªã„。) @item PS PGP ã§é›»å­ç½²å。 @item PE PGP ã§æš—å·åŒ–。 @item SS S/MIME ã§é›»å­ç½²å。 @item SE S/MIME ã§æš—å·åŒ–。 @end ifset @ifset en @item " " No encoding. But 8bit text would be encoded. @item B Base64 @item Q Quoted-Printable @item G Gzip64 (compressed with gzip then encoded with Base64. This is experimental. Do not use this if receivers do not use Mew.) @item PS Sign with PGP @item PE Encrypt with PGP @item SS Sign with S/MIME @item SE Encrypt with S/MIME @end ifset @end table @ifset ja 添付領域ã§ã®ãƒžãƒ¼ã‚¯ã«é–¢ä¿‚ã™ã‚‹æ–°ã—ã„キー割当ã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ @end ifset @ifset en Additional key binding for marks in attachments is as follows: @end ifset @table @samp @ifset ja @item B Base64 ã§ç¬¦å·åŒ–ã™ã‚‹ãŸã‚ @samp{B} マークを付ã‘る。 @item Q Quoted-Printable ã§ç¬¦å·åŒ–ã™ã‚‹ãŸã‚ @samp{Q} マークを付ã‘る。 @item G Gzip64 ã§ç¬¦å·åŒ–ã™ã‚‹ãŸã‚ @samp{G} マークを付ã‘る。ãŸã ã—ã€Text/Plain 㨠Application/Postscript ã§ã—ã‹å®Ÿè¡Œã§ããªã„。ã“れ以外ã®åž‹ã«ã¯åœ§ç¸®ã¯ç„¡æ„味 ã§ã‚る。ãªãœãªã‚‰ã€jpeg ãªã©ã¯ã‚らã‹ã˜ã‚圧縮ã•れã¦ã„ã‚‹ã‹ã‚‰ã€‚ @item S PGP ã§ç½²åã™ã‚‹ãŸã‚ @samp{PS} マークを付ã‘る。 @item E PGP ã§æš—å·åŒ–ã™ã‚‹ãŸã‚ @samp{PE} マークを付ã‘る。å—信者ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力㙠る。 @item M-s S/MIME ã§ç½²åã™ã‚‹ãŸã‚ @samp{SS} マークを付ã‘る。 @item M-e S/MIME ã§æš—å·åŒ–ã™ã‚‹ãŸã‚ @samp{SE} マークを付ã‘る。å—信者ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’å…¥ 力ã™ã‚‹ã€‚ @item Z ZIP ã§ç›´ã¡ã«æš—å·åŒ–ã™ã‚‹ã€‚æš—å·åŒ–ã•れãŸå¾Œã¯ã€@samp{B}マークãŒä»˜ã。 @item U 符å·åŒ–ã‚’å…ƒã«æˆ»ã™ã€‚元々ã®ãƒžãƒ¼ã‚¯ã«æˆ»ã‚‹ã€‚ @end ifset @ifset en @item B Put the @samp{B} mark to encode with Base64. @item Q Put the @samp{Q} mark to encode with Quoted-Printable. @item G Put the @samp{G} mark to encode with Gzip64. This is applicable only to Text/Plain and Application/Postscript since compression is not effective with other objects. For example, JPEG is already compressed. @item S Put the @samp{PS} mark to sign with PGP. @item E Put the @samp{PE} mark to encrypt with PGP. Input decrypters' addresses. @item M-s Put the @samp{SS} mark to sign with S/MIME. @item M-e Put the @samp{SE} mark to encrypt with S/MIME. Input decrypters' addresses. @item Z Encrypt the part with ZIP immediately. After the encryption, the @samp{B} mark appears. @item U Unmark. The original mark appears. @end ifset @end table @ifset ja 次ã®ä¾‹ã‚’考ãˆã¦ã¿ã¾ã—ょã†ã€‚パート 2 㯠PGP ã§ç½²åã•れã€"kazu" 用㫠PGP ã§ æš—å·åŒ–ã•れã¾ã™ã€‚安心ã—ã¦ä¸‹ã•ã„。説明ã®éƒ¨åˆ†ã¯ä¸Šæ›¸ãã•れã¦ã„ã¾ã™ãŒã€ä¿å­˜ã• れã¦ã„ã¾ã™ã€‚パート 3 㯠Gzip64 ã§ç¬¦å·åŒ–ã•れã¾ã™ã€‚ @end ifset @ifset en Consider the following example: The second part will be signed with PGP then encrypted with PGP for "kazu". Don't be alarmed. Its description is overwritten but saved. The third part will be encoded with Gzip64. @end ifset @ifset ja @example ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* PSPE 2 Image/Gif kazu@@example.org mgp.gif G 3 Application/Postscript 資料 ohp.ps 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- @end example @end ifset @ifset en @example ----------------------------- attachments ----------------------------- Multipart/Mixed 1/ 1 Text/Plain(guess) CoverPage* PSPE 2 Image/Gif kazu@@example.org mgp.gif G 3 Application/Postscript Presentation Material ohp.ps 4 . --------0-1-2-3-4-5-6-7-8-9-------------------------------------------- @end example @end ifset @ifset ja マークを付ã‘ãŸå¾Œã¯ã€@samp{C-cC-m} ã‚„ @samp{C-cC-c} を使ã£ã¦ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ を作æˆã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en After applying marks, type @samp{C-cC-m} or @samp{C-cC-c} to create messages. @end ifset @c %%%%%%%%%%%%%%%%% @node pgp-key, anonymous, mark-b-comp, Composing @ifset ja @section PGP ã®éµã®é…布 @end ifset @ifset en @section PGP key distribution @end ifset @kindex p (Attach) @ifset ja PGP ã®å…¬é–‹éµã‚’é…布ã™ã‚‹ã«ã¯ã€Draft ãƒ¢ãƒ¼ãƒ‰ã®æ·»ä»˜é ˜åŸŸã§ @samp{p} を押ã—ã¦ä¸‹ ã•ã„。ã ã‚Œã®å…¬é–‹éµã‚’é…布ã™ã‚‹ã‹å°‹ã­ã‚‰ã‚Œã¾ã™ã€‚自分ã®å…¬é–‹éµã§ã‚れã°ã€å˜ã« @samp{RET} ã¨å…¥åŠ›ã—ã¦ä¸‹ã•ã„。他人ã®å…¬é–‹éµã§ã‚れã°ã€è£œå®Œã‚’利用ã—ãªãŒã‚‰ã ã®äººã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’入力ã—ã¦ä¸‹ã•ã„。PGP ã®å…¬é–‹éµã¯ã€Application/Pgp-Keys 㨠ã„ã†ãƒ‡ãƒ¼ã‚¿åž‹ã§é…é€ã•れã¾ã™ã€‚ @end ifset @ifset en To distribute a PGP public key, please use @samp{p} on attachments in Draft mode. It asks whose public key you want to distribute. Just type @samp{RET} if it is yours. If you want to distribute someone else's key, input his e-mail address with completion. The PGP public key will distributed as Content-Type: Application/Pgp-Keys. @end ifset @ifset ja Summary モードã€ã‚ã‚‹ã„ã¯ã€Virtual モードã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読んã§ã„ã‚‹éš›ã«ã€ã‚ るパートã®ãƒ‡ãƒ¼ã‚¿åž‹ãŒ Application/Pgp-Keys ã§ã‚れã°ã€Mew 㯠PGP ã®å…¬é–‹éµ リングã«ãれを登録ã—よã†ã¨ã—ã¾ã™ã€‚Mew ã¯ã€ã€Œä¿¡ç”¨åº¦ã€ã¨ã€Œæœ‰åŠ¹æ€§ã€ã‚’å…¨ã考 æ…®ã—ãªã„ã“ã¨ã«æ³¨æ„ã—ã¦ä¸‹ã•ã„。ã“れらã®å€¤ã‚’設定ã™ã‚‹ã®ã¯ã€ã‚ãªãŸè‡ªèº«ã§ã™ã€‚ 設定㯠Mew ãŒè¡¨ç¤ºã™ã‚‹èª¬æ˜Žã«å¾“ã£ã¦ä¸‹ã•ã„。もã—ã€ã€Œä¿¡ç”¨åº¦ã€ã¨ã€Œæœ‰åŠ¹æ€§ã€ ã®æ„味ãŒåˆ†ã‹ã‚‰ãªã‘れã°ã€PGP を使ã£ã¦è‡ªåˆ†ã®ãƒ—ライãƒã‚·ã‚’ä¿è­·ã—よã†ã¨ã™ã‚‹å‰ ã«ã€PGP ãŒæä¾›ã™ã‚‹ã€Œä¿¡ç”¨ã®è¼ªã€ã¨ã¯ä½•ã‹ã‚’å­¦ã¶ã¹ãã§ã™ã€‚ @end ifset @ifset en If Mew finds that the part is Application/Pgp-keys, it tries to add the PGP public key onto your PGP public keyring. Remember that Mew is not responsible for TRUST or VALIDITY. It is YOU who set these values. Please use the commands described by Mew to set these as necessary. If you do not know the meaning of TRUST and VALIDITY, you should learn the web of trust system provided by PGP BEFORE using PGP to protect your privacy. @end ifset @c %%%%%%%%%%%%%%%%% @node anonymous, Marks, pgp-key, Composing @ifset ja @section 宛先を匿åã«ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€ä¿¡ @end ifset @ifset en @section Sending messages with anonymous receivers @end ifset @ifset ja 宛先を匿åã«ã—ã¦ã€è¤‡æ•°ã®å—信者ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã—ãŸã„ã“ã¨ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en You may occasionally wish to send a message to anonymous receivers. @end ifset @ifset ja ãŸã¨ãˆã°ã€pooh ãŒãƒ‘ーティーã¸ã®ãŠèª˜ã„を複数ã®å‹é”ã«é€ã‚‹ã“ã¨ã‚’考ãˆã¦ä¸‹ã• ã„。パーティーã¸å‚加ã™ã‚‹ã¨ã„ㆠpiglet ã‹ã‚‰ã®è¿”事ã¯ã€pooh ã®ã¿ã«é€ã‚‹ã¹ã ã§ã™ã€‚ã—ã‹ã—ã€To: ã«ãŸãã•ã‚“ã®å‹é”を列挙ã—ã¦ã„ã‚‹ã¨ã€piglet ã¯èª¤ã£ã¦å¤šã ã®äººã«è¿”答をé€ã‚Šã¤ã‘ã¦ã—ã¾ã†ã‹ã‚‚ã—れã¾ã›ã‚“。ãã‚‚ãã‚‚ã€pooh ã¯èª°ã‚’誘ã£ãŸ ã®ã‹ã€å½“æ—¥ã¾ã§ãµã›ã¦ãŠããŸã„ã“ã¨ã‚‚ã‚ã‚‹ã§ã—ょã†ã€‚ @end ifset @ifset en For instance, please imagine that Pooh is trying to invite multiple friends to a party. Piglet should reply only to Pooh. However, Piglet might make a mistake of replying to other people if the addresses of all the invitees are listed in Cc:. Moreover, Pooh does not want to disclose the names of those who he invited until the day of the party. @end ifset @ifset ja ã“ã®ã‚ˆã†ãªè¦æœ›ã‚’実ç¾ã™ã‚‹ãŸã‚ã«ã€Mew ã§ã¯åŒ¿åã®å®›å…ˆã¨ã—ã¦ã€":;" を利用㗠ã¾ã™ã€‚以下ã®ä¾‹ã‚’見ã¦ä¸‹ã•ã„。 @end ifset @ifset en To handle this, Mew makes use of ":;" for anonymous addresses. Please look at the following example. @end ifset @example To: party:piglet@@example.org,roo@@example.org; From: Pooh @end example @ifset ja "party" ã¨ã„ã†èª¬æ˜Žæ–‡å­—列ã®å¾Œã« ":" ãŒã‚りã¾ã™ã€‚ãã—ã¦ã€ã„ãã¤ã‹ã‚¢ãƒ‰ãƒ¬ã‚¹ ㌠"," ã§åŒºåˆ‡ã‚‰ã‚ŒãªãŒã‚‰åˆ—挙ã•れã€";" ã§çµ‚端ã•れã¦ã„ã¾ã™ã€‚ã“ã®ã‚ˆã†ãªå½¢å¼ ã§ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’書ãã¨ã€Mew 㯠":" 㨠";" ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’届ã‘ã¾ã™ãŒã€ ヘッダã‹ã‚‰ã¯å‰Šã‚Šå–りã¾ã™ã€‚ã“ã®ä¾‹ã§ã¯ã€piglet 㨠roo ã¯ä»¥ä¸‹ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ ジをå—ã‘å–りã¾ã™ã€‚ @end ifset @ifset en Here, there is a colon (":") after the explanatory comment @w{"}party". This is followed by some addresses that are delimited by "," and terminated by ";". If you write addresses in this format, Mew sends the message to the addresses with them removed form the header. In this example, Piglet and Roo will receive the following message. @end ifset @example To: party:; From: Pooh @end example @ifset ja å—信者ã¯ã“ã®ãƒ˜ãƒƒãƒ€ã‹ã‚‰ã€é€ä¿¡è€…㯠pooh ã§ã‚ã‚‹ã“ã¨ã¯åˆ†ã‹ã‚Šã¾ã™ãŒã€è‡ªåˆ†ä»¥å¤– ã®èª°ã«é€ã‚‰ã‚ŒãŸã®ã‹ã¯ã€æƒ³åƒã™ã‚‹ã»ã‹ã‚りã¾ã›ã‚“。ã¾ãŸã€"party:;" ã¨ã„ã†æ–‡å­— 列ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹ã§ã¯ã‚りã¾ã›ã‚“ã‹ã‚‰ã€ã“ã“ã«è¿”ç­”ã™ã‚‹ã“ã¨ã‚‚ä¸å¯èƒ½ã§ã™ã€‚ @end ifset @ifset en The receiver knows that the sender is Pooh, but will not know who else received the message. Also, the string "party:;" is not address, so the receiver cannot reply to it. @end ifset @ifset ja ãªãŠã€To: ã‚„ Cc: ã«ãŸãã•ã‚“ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’列挙ã™ã‚‹ã“ã¨ã¯ã€æœ¬è³ªçš„ã«ã‚ˆã„ã“㨠ã§ã¯ã‚りã¾ã›ã‚“。特定ã®äººã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’何度もé€ä¿¡ã™ã‚‹æ©Ÿä¼šãŒã‚ã‚‹ãªã‚‰ã€é€šå¸¸ メーリングリストを作æˆã—ã¾ã™ã€‚ @end ifset @ifset en You should understand that enumerating many addresses on To: or Cc: is basically not a good practice anyway. If you often have the occasion to send messages a set group of people, you should create a mailing-list. @end ifset @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Marks @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Marks, unread mark, anonymous, Top @ifset ja @chapter 愉快ãªãƒžãƒ¼ã‚¯ãŸã¡ @end ifset @ifset en @chapter Funny marks @end ifset @kindex x (Summary) @ifset ja ã“ã“ã§ã¯ã€Summary モードã§ãƒ¦ãƒ¼ã‚¶ãŒä»˜ã‘ãŸã‚Šæ¶ˆã—ãŸã‚Šã§ãるマークã«ã¤ã„㦠説明ã—ã¾ã™ã€‚ã“ã®ãƒžãƒ¼ã‚¯ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã€è¡Œé ­ã«ä»˜ãã¾ã™ã€‚(Mew ãŒä»˜ã‘るマー ã‚¯ã¯æ—¥ä»˜ã®å·¦ã«ä»˜ãã“ã¨ã«æ³¨æ„。) @end ifset @ifset en Here is a listing of marks that a user can use for insertion or deletion in Summary mode. This mark is displayed in the beginning of a line as follows: (Note that the marks that Mew inserts are displayed left side of date.) @end ifset @example @ifset ja D 03/12 Hidenori Ohta 今週末 |日曜ã«ã‚¹ãƒˆãƒ¼ãƒ³ãƒžã‚¸ãƒƒã‚¯ oM03/14 ã‚‚ã‚‚ã¡ã‚ƒã‚“ 能登ã®å†™çœŸ |ã“ã®å‰æ’®ã£ãŸå†™çœŸã‚’添付 * 03/15 Neat Sumikawa Re: ワイン |ã˜ã‚ƒãã€æ°´æ›œæ—¥ã«ä¾‹ã®åº— @end ifset @ifset en D 03/12 Hidenori Ohta This weekend |Let's go to StoneMagic oM03/14 Momo-chan The pictures of Noto |Attached are the pictu * 03/15 Neat Sumikawa Re: wine |OK. I vote for Wednesd @end ifset @end example @ifset ja ç¾åœ¨åˆ©ç”¨ã§ãるマークã¯ä»¥ä¸‹ã® 6 ã¤ã§ã™ã€‚ @end ifset @ifset en There are six marks at present. @end ifset @table @samp @ifset ja @item U 未読マーク。 @item D 消去ã®ãƒžãƒ¼ã‚¯ã€‚ @item X 消去ã®ãƒžãƒ¼ã‚¯ã€‚ @item o æ•´é “ã€ã¤ã¾ã‚Šã€ãƒ•ォルダを移動ã•ã›ã‚‹ãƒžãƒ¼ã‚¯ã€‚ @item * 処ç†ã®å¯¾è±¡ã¨ã™ã‚‹ãƒžãƒ¼ã‚¯ã€‚ @item $ マークを一時的ã«å¾…é¿ã™ã‚‹ãŸã‚ã®ãƒžãƒ¼ã‚¯ã€‚ @end ifset @ifset en @item U The unread mark. @item D The delete mark. @item X The delete mark. @item o The refile mark, that is, to move a message to another folder. @item * The target mark. @item $ The mark to save another mark temporarily. @end ifset @end table @ifset ja マークを付ã‘ã‚‹ã ã‘ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒãªããªã£ãŸã‚Šã™ã‚‹ã“ã¨ã¯ã‚りã¾ã›ã‚“。 @samp{o}ã€@samp{D}ã€@samp{X} ã¨ã„ã£ãŸãƒžãƒ¼ã‚¯ã‚’実際ã«å‡¦ç†ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ @samp{x} ã§ã™ã€‚マークを付ã‘ã‚‹ã®ã¯æ°—軽ã«ã§ãã¾ã™ãŒã€@samp{x} を押ã™ã¨ã ã¯æ…Žé‡ã«ãŠé¡˜ã„ã—ã¾ã™ã€‚ @end ifset @ifset en Just putting a mark on to a message does NOT process anything at all. It is typing @samp{x} that processes the marks including @samp{o}, @samp{D}, @samp{X}. So, take it easy to put marks but take care to type @samp{x}. @end ifset @ifset ja 以下ãれãžã‚Œã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ã¾ãŸã€Mew ãŒè¡¨ç¤ºã™ã‚‹ãƒžãƒ¼ã‚¯ã«ã¤ã„ã¦ã‚‚ã¾ ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en The marks above are explained in sequence. The marks which Mew inserts are summarized here as well. @end ifset @menu @ifset ja * unread mark:: 未読 @samp{U} * delete mark:: 消去 @samp{D}ã€@samp{X} * refile mark:: æ•´é “ @samp{o} * target mark:: 対象 @samp{*} * escape mark:: å¾…é¿ @samp{$} * unmark:: ãƒžãƒ¼ã‚¯ã®æ¶ˆåŽ» * mark change:: マークã®å¤‰æ› * sync:: IMAP サーãƒã¨ã®ãƒžãƒ¼ã‚¯ã®æ•´åˆæ€§ * off-line:: IMAP ã®ãŸã‚ã®ãƒžãƒ¼ã‚¯ã®ã‚ªãƒ•ãƒ©ã‚¤ãƒ³å‡¦ç† * mew-mark:: Mew ãŒè¡¨ç¤ºã™ã‚‹ãƒžãƒ¼ã‚¯ @end ifset @ifset en * unread mark:: Unread @samp{U} * delete mark:: Delete @samp{D} and @samp{X} * refile mark:: Refile @samp{o} * target mark:: Target @samp{*} * escape mark:: Escape @samp{$} * unmark:: Deleting marks * mark change:: Overwriting marks * sync:: Mark consistency against an IMAP server * off-line:: Processing marks off-line for IMAP * mew-mark:: Marks displayed by Mew @end ifset @end menu @c %%%%%%%%%%%%%%%%% @node unread mark, delete mark, Marks, Marks @ifset ja @section 未読 @samp{U} @end ifset @ifset en @section Unread @samp{U} @end ifset @kindex zSPC @kindex M-u @vindex mew-use-unread-mark @vindex mew-delete-unread-mark-by-mark @ifset ja 以下ã®ã‚ˆã†ã«è¨­å®šã™ã‚‹ã¨ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’一覧表示ã™ã‚‹éš›ã«ã€æœªèª­ãƒžãƒ¼ã‚¯ @samp{U} ãŒãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ä»˜ãã¾ã™ã€‚ @end ifset @ifset en With the following configuration, messages are marked with the unread mark @samp{U} when scanning the messages. @end ifset @lisp (setq mew-use-unread-mark t) @end lisp @ifset ja @samp{SPC}ã€@samp{n}ã€ãŠã‚ˆã³ @samp{p} ãªã©ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読む㨠@samp{U} ãƒžãƒ¼ã‚¯ã¯æ¶ˆãˆã¾ã™ã€‚ @end ifset @ifset en When you read a message with @samp{SPC}, @samp{n}, or @samp{p} and etc, the @samp{U} mark disappears. @end ifset @ifset ja ã“ã®ä¸‰ã¤ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€é€šå¸¸ @samp{*} マークã€@samp{U} マークã€ãŠã‚ˆã³ãƒžãƒ¼ クã®ä»˜ã„ã¦ã„ãªã„メッセージを読ã¿é€²ã¿ã¾ã™ã€‚@samp{zSPC} を押ã™ã¨ã€ã“れら 㯠@samp{*} マーク㨠@samp{U} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ã‚’読ã¿é€²ã‚ã¾ ã™ã€‚ã“れã¯ã€æœªèª­ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読ã¿é€²ã‚ã‚‹å ´åˆã«ä¾¿åˆ©ã§ã™ã€‚ã‚‚ã†ä¸€åº¦ @samp{zSPC} を実行ã™ã‚‹ã¨ã€å¯¾è±¡ã¨ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå…ƒã«æˆ»ã‚Šã¾ã™ã€‚ @end ifset @ifset en These three commands read through messages marked with the @samp{*} mark, the @samp{U} mark, and non-marked messages. If you type @samp{zSPC}, they read through messages marked with the @samp{*} mark and the @samp{U} mark only. This is convenient to read through unread messages. Typing @samp{zSPC} again gets the target messages back. @end ifset @ifset ja å‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ãƒžãƒ¼ã‚¯ã‚’付ã‘ã¦ã€ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã—ã¦æ¥ã‚‹ã¨ã€ @samp{U} ãƒžãƒ¼ã‚¯ã¯æ¶ˆãˆã¾ã™ã€‚@samp{SPC}ã€@samp{n}ã€ãŠã‚ˆã³ @samp{p} ã§ç§»å‹•ã— ã¦æ¥ãŸå ´åˆã¯ã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読むã“ã¨ã‚’æ„図ã—ã¦ã„ã‚‹ã¯ãšã§ã™ãŒã€ãƒžãƒ¼ã‚¯ を付ã‘ã‚‹ã“ã¨ã§ç§»å‹•ã—ãŸå ´åˆã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読むã“ã¨ã‚’æ„図ã—ã¦ã„ãªã„ã‹ã‚‚㗠れã¾ã›ã‚“。ãã®å ´åˆã€@samp{U} ãƒžãƒ¼ã‚¯ãŒæ¶ˆãˆã‚‹ã¨å°‘ã—ä¸ä¾¿ã§ã™ã€‚マークを付㑠るã“ã¨ã§ç§»å‹•ã—ãŸéš›ã«ã€@samp{U} マークを消ã—ãŸããªã„ã®ã§ã‚れã°ã€ä»¥ä¸‹ã®ã‚ˆ ã†ã«è¨­å®šã™ã‚‹ã¨ã‚ˆã„ã§ã—ょã†ã€‚ @end ifset @ifset en When you move onto the current message by putting a mark on the previous message, the @samp{U} mark is deleted. It's sure that you want to read the current message if you move onto it by @samp{SPC}, @samp{n}, and @samp{p}. However, you might not intend to read the current message when you move onto it by putting a mark. If this is the case, this spec is inconvenient for you. If you want to retain the unread mark on the current message when you move onto it by putting a mark on the previous message, configure as follows: @end ifset @lisp (setq mew-delete-unread-mark-by-mark nil) @end lisp @ifset ja 以下㫠@samp{U} マークã«é–¢ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en The followings are summary of commands related to the @samp{U} mark. @end ifset @table @samp @ifset ja @item zSPC @samp{SPC}ã€@samp{n}ã€ãŠã‚ˆã³ @samp{p} ãŒèª­ã¿é€²ã‚る対象ã¨ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ ã‚’å転ã•ã›ã‚‹ã€‚å転ã¨ã¯ã€ã€Œ@samp{U} マークã€@samp{*} マークã€ãŠã‚ˆã³ãƒžãƒ¼ クãªã—ã€ã¨ã€Œ@samp{U} マークãŠã‚ˆã³ @samp{*} マークã€ã«å¯¾ã—ã€ä¸€æ–¹ã‚’他方㸠変ãˆã‚‹ã“ã¨ã€‚ @item M-u @samp{U} マークを付ã‘る。 @end ifset @ifset en @item zSPC Toggle the target of @samp{SPC}, @samp{n}, and @samp{p}. Toggling means change one to the other out of ``the @samp{U} mark, the @samp{*} mark, and non-mark'' and ``the @samp{U} mark and the @samp{*} mark''. @item M-u Put the @samp{U} mark to the current message. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node delete mark, refile mark, unread mark, Marks @ifset ja @section 消去 @samp{D}ã€@samp{X} @end ifset @ifset en @section Delete @samp{D} and @samp{X} @end ifset @vindex mew-trash-folder @vindex mew-trash-folder-list @vindex mew-imap-trash-folder @vindex mew-imap-trash-folder-list @kindex d (Summary) @kindex M-d (Summary) @kindex x (Summary) @kindex mxd (Summary) @kindex mxM-d (Summary) @kindex md (Summary) @kindex mM-d (Summary) @kindex Md (Summary) @kindex D (Summary) @kindex C-uD (Summary) @ifset ja メッセージを消去ã™ã‚‹ã«ã¯ã€ã¾ãš Summary モード㧠@samp{d} を押ã—ã¦ã€ @samp{D} マークを付ã‘ã¾ã™ã€‚マークを付ã‘ãŸã ã‘ã§ã¯ä½•ã‚‚èµ·ã“らãªã„ã®ã§ã€é–“ é•ã£ã¦ @samp{d} を押ã—ã¦ã‚‚大丈夫ã§ã™ã€‚デフォルトã§ã¯ã€@samp{x} を押ã™ã¨ @samp{D} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚´ãƒŸç®±ã«ç§»å‹•ã—ã¾ã™ã€‚ @end ifset @ifset en If you want to delete a message, type @samp{d} in Summary mode to put the @samp{D} mark on it. Don't be worried about losing the message by mistake. Since putting the @samp{D} mark has no immediate effect, it does not result in a serious mistake. By default, typing @samp{x} moves messages marked with @samp{D} to a trash. @end ifset @ifset ja ローカル・フォルダã®ãŸã‚ã®ã‚´ãƒŸç®±ã¯ +trash ã§ã™ã€‚IMAP ã®ãŸã‚ã®ã‚´ãƒŸç®±ã¯ã€ %trash ã§ã™ã€‚ @end ifset @ifset en For local folders, a trash is +trash. For IMAP, it is %trash. @end ifset @ifset ja ゴミ箱ã®ä¸­ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å®Ÿéš›ã«æ¶ˆåŽ»ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã® 2 ã¤ã®æ–¹æ³•ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en To really delete messages in the trashes, there are two methods: @end ifset @enumerate @ifset ja @item Summary モード㧠@samp{D} を実行ã™ã‚‹ã€‚ @item ゴミ箱㧠@samp{D} マークを付ã‘ã¦ã€@samp{x} を押ã™ã€‚ @end ifset @ifset en @item Type @samp{D} in Summary mode. @item Put the @samp{D} mark in the trashes then type @samp{x}. @end ifset @end enumerate @ifset ja ã‚‚ã†å°‘ã—æ­£ç¢ºã«è¨€ã†ã¨ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダã§ã¯ä»¥ä¸‹ã®ãƒ«ãƒ¼ãƒ«ãŒé©ç”¨ã•れã¾ã™ã€‚ (@samp{mew-trash-folder} ã®åˆæœŸå€¤ã¯ +trash。 @samp{mew-trash-folder-list} ã®åˆæœŸå€¤ã¯ @samp{nil}。) @end ifset @ifset en Exactly speaking, the following rule is applied for local folders. (@samp{mew-trash-folder} is default to +trash. @samp{mew-trash-folder-list} is default to @samp{nil}.) @end ifset @itemize @minus @ifset ja @item @samp{mew-trash-folder} ㌠@samp{nil} ãªã‚‰ã€@samp{D} マークã®ä»˜ã„ãŸãƒ¡ãƒƒ ã‚»ãƒ¼ã‚¸ã¯æ¶ˆåŽ»ã•れる。 @item @samp{mew-trash-folder-list} ãŒå®šç¾©ã•れã¦ã„ãŸã‚‰ã€ãれらã®ãƒ•ォルダ ã§ @samp{D} マークを付ã‘ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯æ¶ˆåŽ»ã•れる。ãれ以外ã®ãƒ•ォルダã‹ã‚‰ã¯ @samp{mew-trash-folder} ã¸ã€‚ @item @samp{mew-trash-folder-list} ㌠@samp{nil} ãªã‚‰ã€ @samp{mew-trash-folder} ã§ @samp{D} マークを付ã‘ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯æ¶ˆåŽ»ã•れる。ã れ以外ã®ãƒ•ォルダã‹ã‚‰ã¯ @samp{mew-trash-folder} ã¸ã€‚(ã“れãŒåˆæœŸå€¤ã€‚) @end ifset @ifset en @item If @samp{mew-trash-folder} is @samp{nil}, messages marked with @samp{D} are deleted. @item If @samp{mew-trash-folder-list} is defined, messages marked with @samp{D} in one of the folders defined in it are deleted. Otherwise, they are moved to the trash. @item If @samp{mew-trash-folder-list} is @samp{nl}, messages marked with @samp{D} in @samp{mew-trash-folder} are deleted. Otherwise, they are moved to the trash. (This is default.) @end ifset @end itemize @ifset ja IMAP ã«å¯¾ã—ã¦ã¯ã€@samp{mew-imap-trash-folder} 㨠@samp{mew-imap-trash-folder-list} ã«å¾“ã£ã¦ã€åŒã˜è¦å‰‡ãŒé©ç”¨ã•れã¾ã™ã€‚ @end ifset @ifset en For IMAP, the same rule is applied according to both @samp{mew-imap-trash-folder} and @samp{mew-imap-trash-folder-list} @end ifset @ifset ja ã™ã¹ã¦ã® @samp{*} マークを @samp{D} マークã«å¤‰æ›ã§ãれã°ã€ä¸€åº¦ã«ãŸãã• ã‚“ã® @samp{D} マークを付ã‘られã¦ä¾¿åˆ©ã§ã™ã€‚ã“れã«ã¯ã€@samp{md} を利用ã—㦠下ã•ã„。 @end ifset @ifset en It is convenient if you can change the @samp{*} mark to the @samp{D} mark since you can put many the @samp{D} marks at once. To achieve this, use @samp{md}. @end ifset @ifset ja ã¾ãŸã€@samp{Md} を使ã†ã¨ã€ç¾åœ¨ã®ãƒ•ォルダ内ã§åŒã˜ Message-Id: ã‚’æŒã¤ãƒ¡ãƒƒ セージãŒã‚ã‚‹å ´åˆã€1 ã¤ã‚’残ã—ã¦ä»–ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« @samp{D} ãŒä»˜ãã¾ã™ã€‚ @end ifset @ifset en Also, typing @samp{Md} put the @samp{D} mark to all duplicated messages excluding one for each. @end ifset @ifset ja @samp{D} マークã«ä¼¼ãŸã‚‚ã®ã« @samp{X} マークãŒã‚りã¾ã™ã€‚ã“ã®ãƒžãƒ¼ã‚¯ã®ä»˜ã‘ られãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€@samp{x} を押ã—ãŸéš›ã«å¿…ãšæ¶ˆåŽ»ã•れã¾ã™ã€‚@samp{X} マー クã¯ã€@samp{M-d} ã§ä»˜ã‘ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ @end ifset @ifset en There is also another mark, @samp{X}, which is like the mark @samp{D}. Messages marked with @samp{X} are deleted when @samp{x} is typed. The @samp{X} mark can be put by @samp{M-d}. @end ifset @ifset ja @samp{mxM-d} ã§ã€@samp{X} マークãŒä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã ã‘を処ç†ã§ãã¾ã™ã€‚ ã™ã¹ã¦ã® @samp{*} マークを @samp{X} マークã«å¤‰æ›ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ @samp{mM-d} ã§ã™ã€‚ @end ifset @ifset en @samp{mxM-d} processes messages marked with @samp{X} only. Typing @samp{mM-d} converts all @samp{*} marks to @samp{X}. @end ifset @ifset ja 以下ã«ã€@samp{D} マーク㨠@samp{X} マークã«é–¢ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en The following is a summary regarding with the @samp{D} mark and the @samp{X} mark. @end ifset @table @samp @ifset ja @item d @samp{D} マークを付ã‘る。 @item M-d @samp{X} マークを付ã‘る。 @item md @samp{*} マークを @samp{D} マークã¸å¤‰æ›ã™ã‚‹ã€‚ @item mM-d @samp{*} マークを @samp{X} マークã¸å¤‰æ›ã™ã‚‹ã€‚ @item x マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’処ç†ã™ã‚‹ã€‚ @item mxd @samp{D} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ã‚’処ç†ã™ã‚‹ã€‚ @item mxM-d @samp{X} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ã‚’消去ã™ã‚‹ã€‚ @item D ゴミ箱ã®ä¸­ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’全部消去ã™ã‚‹ã€‚ @item C-uD 指定ã•れãŸãƒ•ォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’全部消去ã™ã‚‹ã€‚ @end ifset @ifset en @item d Put the @samp{D} mark. @item M-d Put the @samp{X} mark. @item md Convert all @samp{*} marks to @samp{D}. @item mM-d Convert all @samp{*} marks to @samp{X}. @item x Process marked messages. @item mxd Process messages marked with @samp{D} only. @item mxM-d Delete messages marked with @samp{X} only. @item D Delete all messages in a trash. @item C-uD Delete all messages in a specified folder. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node refile mark, target mark, delete mark, Marks @ifset ja @section æ•´é “ @samp{o} @end ifset @ifset en @section Refile @samp{o} @end ifset @kindex o (Summary) @ifset ja メッセージを整頓ã™ã‚‹ã«ã¯ @samp{o} を押ã—ã¦ã€ç§»å‹•å…ˆã®ãƒ•ォルダを入力ã—〠@samp{o} マークを付ã‘ã¾ã™ã€‚移動先ã®ãƒ•ォルダã¯ã€è³¢ã推測ã—ã¦ãれるã®ã§ã€ ã»ã©ã‚“ã©ã®å ´åˆã¯ãƒ•ォルダåを入力ã™ã‚‹ä»£ã‚り㫠@samp{RET} を押ã™ã ã‘ã§ã™ã€‚ "," ã§åŒºåˆ‡ã£ã¦è¤‡æ•°ã®ãƒ•ォルダを入力ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã‚‚ã¡ã‚ん〠@samp{TAB} ã§è£œå®Œã§ãã¾ã™ã€‚詳ã—ã㯠@xref{Refile} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en To refile a message, type @samp{o} and input a folder name, then @samp{o} is put. A folder is guessed neatly, so most time what you should to is just type @samp{RET}. For more information, refer to @ref{Refile}. @end ifset @ifset ja @samp{o} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸Šã§ @samp{o} を押ã™ã¨ã€ç§»å‹•先を追加 ã—ãŸã‚Šå¤‰æ›´ã—ãŸã‚Šã§ãã¾ã™ã€‚ã¾ãŸã€å®Ÿéš›ã®ç§»å‹•㯠@samp{x} ã¨å…¥åŠ›ã•れãŸã¨ã㫠実行ã•れã¾ã™ã€‚ @end ifset @ifset en If you type @samp{o} on a message marked with @samp{o}, the refile folder is shown. When typing @samp{x}, messages marked with @samp{o} are actually refiled. @end ifset @ifset ja 複数ã®ãƒ•ォルダを指定ã—ã€ç§»å‹•ã•ã›ãŸã¨ãã®ã“ã¨ã‚’考ãˆã¾ã—ょã†ã€‚ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ ã®æ©Ÿèƒ½ã‚’æŒã¤ãƒ•ァイルシステムを使ã£ã¦ã„ã‚‹å ´åˆã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯æœ€åˆã®ãƒ•ã‚© ルダã«ç§»å‹•ã•れã€ãã®ä»–ã®ãƒ•ォルダã‹ã‚‰ã¯ãƒãƒ¼ãƒ‰ãƒªãƒ³ã‚¯ãŒå¼µã‚‰ã‚Œã¾ã™ã€‚ãã†ã§ãª ã„ファイルシステムã®å ´åˆã¯ã€æœ€åˆã®ãƒ•ォルダã«ç§»å‹•後ã€ãã®ä»–ã®ãƒ•ォルダã¸è¤‡ 製ã•れã¾ã™ã€‚ @end ifset @ifset en Consider that you specify multiple folders and refiles actually. If your file system has hard link, the message is moved to the first folder, and hard links are created from the other folders. Otherwise, the message is moved to the first folder, and it is copied to the other folders. @end ifset @ifset ja 指定ã—ãŸãƒ•ォルダ㌠1 ã¤ã§ã€ã—ã‹ã‚‚ãれãŒç¾åœ¨ã®ãƒ•ォルダã§ã‚ã‚‹å ´åˆã€æ•´é “ã— ã¦ã‚‚ãªã«ã‚‚èµ·ã“りã¾ã›ã‚“。指定ã—ãŸãƒ•ォルダãŒè¤‡æ•°ã§ã€ç¾åœ¨ã®ãƒ•ォルダãŒå«ã¾ã‚Œ ã‚‹å ´åˆã€ç¾åœ¨ã®ãƒ•ォルダ内ã§ã®ç•ªå·ã‚’ä¿ã£ãŸã¾ã¾ã€ãã®ä»–ã®ãƒ•ォルダã‹ã‚‰ãƒãƒ¼ãƒ‰ リンクãŒå¼µã‚‰ã‚Œã‚‹ã‹ã€ãã®ä»–ã®ãƒ•ォルダã¸è¤‡è£½ã•れã¾ã™ã€‚ @end ifset @ifset en If the number of specified folders are 1, and it is the current folder, refiling means do nothing. If the number is more than two and the current folder is included, refiling means that the message number in the current folder remains and hard links are created from the other folders (or it is copied to the other folders). @end ifset @ifset ja @samp{o} ã«ä¼¼ã¦ã„ã¾ã™ãŒã€ã‹ãªã‚‰ãšç¾åœ¨ã®ãƒ•ォルダも候補ã¨ã—ã¦æç¤ºã™ã‚‹ @samp{c} ã¨ã„ã†ã‚³ãƒžãƒ³ãƒ‰ã‚‚用æ„ã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en Mew provides @samp{c} which is very similar to @samp{o}. @samp{c} shows the current folder as a candidate in addition to guessed folders. @end ifset @ifset ja 以下ã«ã€@samp{o} マークã«é–¢ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en A summary about the @samp{o} mark is here. @end ifset @table @samp @ifset ja @item o @samp{o} マークを付ã‘る。 @item c @samp{o} マークを付ã‘る。推測ã—ãŸãƒ•ォルダã«åŠ ãˆã¦ã€ç¾åœ¨ã®ãƒ•ォルダも候補 ã¨ã—ã¦æç¤ºã™ã‚‹ã€‚ @item x @samp{o} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’移動ã•ã›ã‚‹ã€‚ @item mxo @samp{o} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã¿ã‚’移動ã•ã›ã‚‹ã€‚ä»–ã®ãƒžãƒ¼ã‚¯ã¯å‡¦ç†ã—ãªã„。 @item C-umxo @samp{o} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸­ã§ã€ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¨åŒã˜ç§»å‹•先を æŒã¤ã‚‚ã®ã®ã¿ã‚’移動ã•ã›ã‚‹ã€‚ @end ifset @ifset en @item o Put the @samp{o} mark. @item c Put the @samp{o} mark. Showing the current folder as a candidate in addition to guessed folders. @item x Refile messages marked with @samp{o}. @item mxo Refile messages marked with @samp{o} only. This command does not process other marks. @item C-umxo Refile messages marked with @samp{o}, whose destination is the same as that of the current message. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node target mark, escape mark, refile mark, Marks @ifset ja @section 対象 @samp{*} @end ifset @ifset en @section Target @samp{*} @end ifset @kindex * (Summary) @kindex N (Summary) @kindex P (Summary) @kindex ma (Summary) @kindex mr (Summary) @kindex F (Summary) @kindex J (Summary) @kindex mI (Summary) @kindex C-umI (Summary) @kindex M-b (Summary) @kindex M-\ (Summary) @kindex M-t (Summary) @ifset ja 後ã‹ã‚‰èª­ã¿è¿”ã—ãŸã„メッセージã«ã¯ã€@samp{*} ã§ @samp{*} マークを付ã‘ã¦ä¸‹ ã•ã„。ã¾ãŸã€é¸æŠžã‚³ãƒžãƒ³ãƒ‰ @samp{?} を使ã†ã¨ã€å…¥åŠ›ã—ãŸæ¡ä»¶ã«ãƒžãƒƒãƒã™ã‚‹ãƒ¡ãƒƒ セージ㫠@samp{*} マークãŒä»˜ãã¾ã™(詳ã—ãã¯ã€@xref{search} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„)。 @samp{N} ã‚„ @samp{P} ã§ @samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã—表示㧠ãã¾ã™ã€‚ @end ifset @ifset en Please put the @samp{*} mark onto messages that you want to review later. @samp{?} also put the @samp{*} mark onto matched messages (for more information, refer to @ref{search}). Use @samp{N} and @samp{P} to walk around messages marked with @samp{*}. @end ifset @ifset ja 以下ã«ã€@samp{*} ã«é–¢é€£ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en Here is a summary for @samp{*} commands. @end ifset @table @samp @ifset ja @item * @samp{*} マークを付ã‘る。 @item N 下方å‘ã® @samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ç§»å‹•ã—表示。 @item P 上方å‘ã® @samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ç§»å‹•ã—表示。 @item ma マークã®ä»˜ã„ã¦ã„ãªã„メッセージã™ã¹ã¦ã« @samp{*} マークを付ã‘る。 @item mr 入力ã—ãŸæ­£è¦è¡¨ç¾ã«ãƒžãƒƒãƒã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« @samp{*} マークを付ã‘る。 @end ifset @ifset en @item * Put the @samp{*} mark. @item N Jump to the message marked with @samp{*} below and display it. @item P Jump to the message marked with @samp{*} above and display it. @item ma Put the @samp{*} mark to all unmarked messages. @item mr Put the @samp{*} mark to all matching messages with specified regular expression. @end ifset @end table @ifset ja @samp{*} マークã¯ã€è¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’処ç†ã™ã‚‹ãŸã‚ã«ã‚‚利用ã—ã¾ã™ã€‚ 以下ã«è¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’処ç†ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en The @samp{*} mark is used to handle multiple messages. The following is a list of commands which handle multiple messages. @end ifset @table @samp @ifset ja @item F @samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ MIME å½¢å¼ã§è»¢é€ã™ã‚‹ãŸã‚ã®è‰ç¨¿ã‚’準備。 @item J 大ããªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ Message/Partial ã¨ã—ã¦è¤‡æ•°ã«åˆ†å‰²ã•れã¦ã„ã‚‹å ´åˆãŒã‚る。 ã“れらã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ã€Mew ã«ã‚ˆã£ã¦ @samp{P} マークãŒä»˜ã‘られã¦ã„る。㓠ã“ã§ã€ãƒ¦ãƒ¼ã‚¶ãŒãれらã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« @samp{*} マークを付ã‘ã€ã“ã®ã‚³ãƒžãƒ³ãƒ‰ を実行ã™ã‚Œã°ã€å…ƒã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå¾©å…ƒã•れる。 @item mI @samp{*} マークã®ä»˜ã„ã¦ã„る一部ã ã‘ãŒå–å¾—ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ç¾¤(@samp{T})ã‚’ å–å¾—ã™ã‚‹ã€‚ @item C-umI @samp{mI} を実行ã™ã‚‹ã€‚ @item M-b @samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æ ¼ç´ã•れã¦ã„るメッセージをå–り出ã™ã€‚ @item M-\ @samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’引数ã¨ã—ã¦ã€å¤–部コマンドを起動ã™ã‚‹ã€‚ @item M-t @samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ "uudecode" ã™ã‚‹ã€‚ @end ifset @ifset en @item F Prepare a draft to forward multiple messages marked with @samp{*} in MIME format. @item J A large message is occasionally fragmented into multiple messages whose Content-Type: is Message/Partial. Mew puts the @samp{P} mark to these messages. Now a user marks these messages with @samp{*} and executing this commands results in producing the original message. @item mI Retrieve the rest of truncated(@samp{T}) messages marked with @samp{*}. @item C-umI Perform @samp{mI}. @item M-b De-capsulate messages embedded in the messages marked with @samp{*}. @item M-\ Executing an external command specifying messages marked with @samp{*} as arguments. @item M-t Apply "uudecode" on messages marked with @samp{*}. @end ifset @end table @ifset ja @samp{M-t} ã§ã¯ã€@samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒãã¡ã‚“ã¨åˆ†å‰²é †ã«ãªã£ ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚順番ãŒãã‚‹ã£ã¦ã„ã‚‹ãªã‚‰ã€@samp{S} ã§ã‚½ãƒ¼ãƒˆã™ã‚‹ã¨ã‚ˆ ã„ã‹ã‚‚ã—れã¾ã›ã‚“。 @end ifset @ifset en For @samp{M-t}, messages marked with @samp{*} are supposed to be in the right order. If out of order, sorting with @samp{S} would help. @end ifset @c %%%%%%%%%%%%%%%%% @node escape mark, unmark, target mark, Marks @ifset ja @section å¾…é¿ @samp{$} @end ifset @ifset en @section Escape @samp{$} @end ifset @kindex m$ @kindex m* @ifset ja ãŸã¨ãˆã° @samp{/} ãªã©ã‚’使ã„パターンã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« @samp{*} ã‚’ 付ã‘ã‚‹ã“ã¨ã‚’考ãˆã¦ä¸‹ã•ã„。@samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã™ã§ã«ã‚ã‚‹ ãªã‚‰ã€ã“れらã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ @samp{/} ã®çµæžœã¨æ··ã–ã£ã¦ã—ã¾ã„ã¾ã™ã€‚ãã“ã§ã€ ç¾åœ¨ã® @samp{*} マークを一時的ã«ä¿å­˜ã—ãŸããªã‚Šã¾ã™ã€‚ @end ifset @ifset en Suppose that you want to put the @samp{*} marks to messages matched to a pattern specified to the @samp{/} command. If there are messages marked with @samp{*} already, these messages are merged to the results of @samp{/}. Thus, you would want to escape the current messages marked with @samp{*}. @end ifset @ifset ja ã“ã®ç›®çš„ã®ãŸã‚ã«ã€å¾…é¿ãƒžãƒ¼ã‚¯ @samp{$} ãŒæä¾›ã•れã¦ã„ã¾ã™ã€‚å…¸åž‹çš„ãª ä½¿ã„æ–¹ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en For this sake, the escape mark @samp{$} is provided. A typical usage is as follows: @end ifset @enumerate @ifset ja @item @samp{m$} ã§ @samp{*} マークを一旦 @samp{$} マークã«å¾…é¿ @item @samp{/} ãªã©ã§ @samp{*} マークを付ã‘ã€@samp{*} マークã®ã¤ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å‡¦ç† @item @samp{U*} ã§ @samp{*} マークを消去 @item @samp{m*} ã§ @samp{$} マークを @samp{*} ãƒžãƒ¼ã‚¯ã¸æˆ»ã™ @end ifset @ifset en @item Change the @samp{*} marks to the @samp{$} marks with @samp{m$}. @item Put the @samp{*} marks to messages, for instance, with @samp{/} and process the messages marked with @samp{*}. @item Cancel the @samp{*} marks with @samp{U*}. @item Get the old @samp{*} marks back with @samp{m*}. @end ifset @end enumerate @ifset ja @samp{$} マークã«é–¢ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’以下ã«ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en Here is summary of the commands related to the @samp{$} mark. @end ifset @table @samp @ifset ja @item m$ @samp{*} マークを @samp{$} マークã¸å¤‰æ›ã€‚ @item m* @samp{$} マークを @samp{*} マークã¸å¤‰æ›ã€‚ @end ifset @ifset en @item m$ Change the @samp{*} marks to the @samp{$} marks. @item m* Change the @samp{$} marks to the @samp{*} marks. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node unmark, mark change, escape mark, Marks @ifset ja @section ãƒžãƒ¼ã‚¯ã®æ¶ˆåŽ» @end ifset @ifset en @section Deleting marks @end ifset @kindex x (Summary) @kindex u (Summary) @kindex U (Summary) @kindex M* (Summary) @ifset ja @samp{o} マークや @samp{D} マークãŒä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ãƒžãƒ¼ã‚¯å®Ÿè¡Œã‚³ãƒžãƒ³ ド @samp{x} を押ã•ãªã„é™ã‚Šå‡¦ç†ã•れã¾ã›ã‚“。よã£ã¦ã€@samp{x} を押ã™å‰ã«ã€ マークをå–り止ã‚るコマンド @samp{u} ã§ãƒžãƒ¼ã‚¯ã‚’消ã›ã°ã€èª¤ã£ã¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ 消ã™ã“ã¨ã¯ã‚りã¾ã›ã‚“。 @end ifset @ifset en Refiling and deleting is not processed unless you type @samp{x}. So, if you press @samp{u} to unmark before you type @samp{x}, messages do not disappear accidentally. @end ifset @ifset ja 以下ã«ãƒžãƒ¼ã‚¯ã‚’消去ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en Here is a summary for unmark commands. @end ifset @table @samp @ifset ja @item u ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒžãƒ¼ã‚¯ã‚’消ã™ã€‚ @item U 入力ã—ãŸãƒžãƒ¼ã‚¯ãŒä»˜ã„ã¦ã„ã‚‹ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒžãƒ¼ã‚¯ã‚’消ã™ã€‚ @end ifset @ifset en @item u Cancel the mark on this message. @item U Cancel all marks according to what you input. @end ifset @end table @ifset ja @samp{$} マークを使ã£ã¦ @samp{*} マークを待é¿ã—ã€ãªã‚“らã‹ã®æ“作をã—ã€å…ƒ ã«æˆ»ã™æ–¹æ³•ã¯ã€ç›®ã«è¦‹ãˆã‚‹ã®ã§åˆ†ã‚Šã‚„ã™ã„ã§ã™ã€‚ã—ã‹ã—ãªãŒã‚‰ã€@samp{$} マー クãŒä»˜ã„ã¦ã„るメッセージã¯ã€ãƒžãƒ¼ã‚¯ãŒä»˜ã„ã¦ã„ã‚‹ã®ã§ç›®çš„ã®æ“作ã®å¯¾è±¡å¤–ã« ãªã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。 @end ifset @ifset en The method with the @samp{$} mark, that is, preserve the @samp{*} marks and operate something then get them back, is friendly to users since it is visible. But since messages are marked, they would not be the targets of the operation. @end ifset @ifset ja ã“ã®ãŸã‚ @samp{U*} ã§æ¶ˆåŽ»ã—㟠@samp{*} マークを復活ã•ã›ã‚‹ã‚³ãƒžãƒ³ãƒ‰ãŒã‚り ã¾ã™ã€‚ãれã¯ã€@samp{M*} ã§ã™ã€‚ã“ã®æ–¹æ³•ã¯ã€å¾©æ´»ã§ãるマークã¯ç›®ã«è¦‹ãˆãª ã„ã®ã§åˆ†ã‚Šã«ãã„ã‹ã‚‚ã—れã¾ã›ã‚“。ã—ã‹ã—ãªãŒã‚‰ã€ãƒžãƒ¼ã‚¯ãŒæ¶ˆãˆã¦ã„ã‚‹ã®ã§ã€ ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ç¢ºå®Ÿã«ç›®çš„ã®æ“作ã®å¯¾è±¡ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en To solve this problem, a method to recover @samp{*} marks is provided. The command is bound to @samp{M*}. This method would not be friendly to users since the @samp{*} marks to recover are invisible. But because the marks are canceled, these message are surely the target of any operations. @end ifset @table @samp @ifset ja @item M* 一番最後㮠@samp{U*} ã§æ¶ˆã—㟠@samp{*} マークを復活ã•ã›ã‚‹ã€‚ @end ifset @ifset en @item M* Recover the @samp{*} marks which are canceled by the last @samp{U*}. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node mark change, sync, unmark, Marks @ifset ja @section マークã®å¤‰æ› @end ifset @ifset en @section Overwriting marks @end ifset @kindex m$ (Summary) @kindex m* (Summary) @kindex ms (Summary) @kindex mM-u (Summary) @kindex md (Summary) @kindex mM-d (Summary) @kindex mo (Summary) @kindex mc (Summary) @ifset ja マークã«ã¯å¼·ã•ã®ãƒ¬ãƒ™ãƒ«ãŒã‚りã¾ã™ã€‚åŒã˜ãƒ¬ãƒ™ãƒ«ã®ãƒžãƒ¼ã‚¯ã¯ä¸Šæ›¸ãã§ãã¾ã™ã€‚ å¼·ã„マークã¯å¼±ã„マークを上書ãã§ãã¾ã™ã€‚ @end ifset @ifset en Marks have levels of strength. You can override a mark by another same-level mark weak mark. Also stronger marks can override weaker marks. @end ifset @ifset ja マークを強ã„é †ã«ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en The followings shows the marks in the strong order: @end ifset @table @asis @ifset ja @item @samp{o}ã€@samp{D}ã€@samp{X} æ–°ãŸã«ãƒžãƒ¼ã‚¯ã—ãŸã¨ãã¯ã€æ¬¡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示。上書ãã—ãŸå ´åˆã¯ã€ãã®è¡Œã« ç•™ã¾ã‚‹ã€‚ @item @samp{*} 㨠@samp{$} マークを付ã‘ãŸå¾Œã¯ã€ãã®è¡Œã«ç•™ã¾ã‚‹ã€‚ @item @samp{U} マークを付ã‘ãŸå¾Œã¯ã€ãã®è¡Œã«ç•™ã¾ã‚‹ã€‚ @end ifset @ifset en @item @samp{o}, @samp{D}, and @samp{X} After marking a message newly, the next message is shown. After overriding another mark, the cursor stays on the message. @item @samp{*} and @samp{$} After marking a message, the cursor stays on the message. @item @samp{U} After marking a message, the cursor stays on the message. @end ifset @end table @ifset ja å¼·ã„マークを付ã‘ãŸå¾Œã«ã‚«ãƒ¼ã‚½ãƒ«ãŒå‹•ãæ–¹å‘ã«ã¤ã„ã¦ã¯ã€@xref{summary-mode} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en refer to @ref{summary-mode} to know which direction the cursor moves after putting a strong mark. @end ifset @ifset ja マークã¯ä»¥ä¸‹ã®ã‚ˆã†ã«äº¤æ›ã§ãã¾ã™ã€‚ @end ifset @ifset en You can exchange marks as follows: @end ifset @table @samp @ifset ja @item m$ @samp{*} -> @samp{$} :: @samp{*} マークを一時的ã«ä¿å­˜ã€‚ @item m* @samp{$} -> @samp{*} :: @samp{*} ãƒžãƒ¼ã‚¯ã‚’å…ƒã«æˆ»ã™ã€‚ @item ms @samp{$} <-> @samp{*} @item mM-u @samp{*} -> @samp{U} :: é¸æŠžã‚³ãƒžãƒ³ãƒ‰ @samp{?} ã§é¸ã‚“ã ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’未読 ã«ã™ã‚‹ã¨ãã«ä¾¿åˆ©ã€‚ @item md @samp{*} -> @samp{D} :: é¸æŠžã‚³ãƒžãƒ³ãƒ‰ @samp{?} ã§é¸ã‚“ã ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’消去㙠るã¨ãã«ä¾¿åˆ©ã€‚ @item mM-d @samp{*} -> @samp{X} :: é¸æŠžã‚³ãƒžãƒ³ãƒ‰ @samp{?} ã§é¸ã‚“ã ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’消去㙠るã¨ãã«ä¾¿åˆ©ã€‚ @item mo @samp{*} -> @samp{o} :: é¸æŠžã‚³ãƒžãƒ³ãƒ‰ @samp{?} ã§é¸ã‚“ã ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã‚るフォ ルダã«ç§»å‹•ã•ã›ã‚‹å ´åˆã«ä¾¿åˆ©ã€‚ @item mc @samp{*} -> @samp{o} :: é¸æŠžã‚³ãƒžãƒ³ãƒ‰ @samp{?} ã§é¸ã‚“ã ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã‚るフォ ルダã«ã‚³ãƒ”ーã™ã‚‹å ´åˆã«ä¾¿åˆ©ã€‚ @item e 最åˆã«å…¥åŠ›ã—ãŸãƒžãƒ¼ã‚¯ã‚’次ã«å…¥åŠ›ã—ãŸãƒžãƒ¼ã‚¯ã¸å¤‰æ›ã™ã‚‹ã€‚ãŸã ã—ã€@samp{o} マー クã¯å¯¾è±¡å¤–。 @end ifset @ifset en @item m$ @samp{*} -> @samp{$} :: Preserve the @samp{*} marks temporarily. @item m* @samp{$} -> @samp{*} :: Get the @samp{*} marks back. @item ms @samp{$} <-> @samp{*} @item mM-u @samp{*} -> @samp{U} :: It is useful when you put @samp{U} marks to messages picked by @samp{?}. @item md @samp{*} -> @samp{D} :: It is useful when you put @samp{D} marks to messages picked by @samp{?}. @item mM-d @samp{*} -> @samp{X} :: It is useful when you put @samp{X} marks to messages picked by @samp{?}. @item mo @samp{*} -> @samp{o} :: It is useful when you put @samp{o} marks to messages to be moved picked by @samp{?}. @samp{*} -> @samp{o} :: It is useful when you put @samp{o} marks to messages to be copied picked by @samp{?}. @item e Exchange the first input mark to the second one. The @samp{o} mark is not exchangeable. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node sync, off-line, mark change, Marks @ifset ja @section IMAP サーãƒã¨ã®ãƒžãƒ¼ã‚¯ã®æ•´åˆæ€§ @end ifset @ifset en @section Mark consistency against an IMAP server @end ifset @ifset ja Mew ã§ã¯ã€ä»¥ä¸‹ã®ãƒžãƒ¼ã‚¯ã«å¯¾ã—ã€IMAP サーãƒã¨æ•´åˆæ€§ã‚’確ä¿ã§ãã¾ã™ã€‚ @end ifset @ifset en Mew can maintain consistency of the following marks against an IMAP server: @end ifset @table @samp @ifset ja @item U メッセージを読んã ã‹å¦ã‹ã€‚IMAP ã®ãƒ•ラグ㯠\Seen。通常㯠%inbox ã®ã¿ã§æœ‰ 効。 @item * 注目ã—ã¦ã„るメッセージ。IMAP ã®ãƒ•ラグ㯠\Flagged。 @end ifset @ifset en @item U Whether a message is read or not. This IMAP flag is \Seen. This is usually valid in %inbox only. @item * Review mark. This IMAP flag is \Flagged. @end ifset @end table @ifset ja ã‚ªãƒ•ãƒ©ã‚¤ãƒ³ã®æ“作を許ã™ãŸã‚ã«ã€Mew ã§ã¯ãƒ¦ãƒ¼ã‚¶ãŒå‹•作を起ã“ã™ãŸã³ã« IMAP サーãƒã¨ãƒžãƒ¼ã‚¯ã®æ•´åˆæ€§ã‚’å–りã¾ã™ã€‚å®šæœŸçš„ã«æ•´åˆæ€§ã‚’å–ã‚‹ã“ã¨ã¯ã—ã¾ã›ã‚“。 Mew ãŒãƒžãƒ¼ã‚¯ã®æ•´åˆæ€§ã‚’å–る方法を以下ã«ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en To allow off-line operations, Mew synchronizes marks with an IMAP server everytime when a user makes an action. Mew does not automatically synchronize marks repeatedly. The followings are how Mew synchronizes marks. @end ifset @enumerate @ifset ja @item @samp{s} + 'update @itemize @minus @item 既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦å¤‰æ›´ã—ãŸãƒžãƒ¼ã‚¯ã‚’サーãƒå´ã¸å映 @item æ–°ç€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦ã¯ã€ã‚µãƒ¼ãƒå´ã®ãƒ•ラグをマークã¸å映 @end itemize @item @samp{x} @itemize @minus @item 既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦å¤‰æ›´ã—ãŸãƒžãƒ¼ã‚¯ã‚’サーãƒå´ã¸å映 @end itemize @item @samp{s} + 'sync @itemize @minus @item 既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦å¤‰æ›´ã—ãŸãƒžãƒ¼ã‚¯ã‚’サーãƒå´ã¸å映 @item 既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã® @samp{*},@samp{U}, @samp{$}, @samp{ } マークを一旦クリア @item サーãƒå´ã®ãƒ•ラグを既存ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ãƒžãƒ¼ã‚¯ã¨ã—ã¦å映 @item サーãƒå´ã§å‰Šé™¤ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’削除 @end itemize @end ifset @ifset en @item @samp{s} + 'update @itemize @minus @item Reflecting modified marks of the existing messages to the server @item For newly arrived messages, reflecting flags of the server to the messages. @end itemize @item @samp{x} @itemize @minus @item Reflecting modified marks of the existing messages to the server @end itemize @item @samp{s} + 'sync @itemize @minus @item Reflecting modified marks of the existing messages to the server @item Clearing @samp{*},@samp{U}, @samp{$}, @samp{ } mark on the existing messages. @item Reflecting flags of the server to the existing messages @item Removing messages which were deleted in the server @end itemize @end ifset @end enumerate @c %%%%%%%%%%%%%%%%% @node off-line, mew-mark, sync, Marks @ifset ja @section IMAP ã®ãŸã‚ã®ãƒžãƒ¼ã‚¯ã®ã‚ªãƒ•ãƒ©ã‚¤ãƒ³å‡¦ç† @end ifset @ifset en @section Processing marks off-line for IMAP @end ifset @kindex lx @kindex C-cC-c (Summary) @kindex s (Summary) @ifset ja IMAP ユーザã¯ã€ãƒ•ォルダ A ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’キャッシュã—ã€å‡ºå…ˆã§ @samp{o} マークや @samp{D} マークを付ã‘ã€ãã®å ´ã§ãれらã®ãƒžãƒ¼ã‚¯ã‚’処ç†ã—ãŸããªã‚‹ ã“ã¨ãŒã‚りã¾ã™ã€‚ã“ã®å ´åˆã€ãã®å¾Œãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã—ãŸã¨ãã«ã€ãれら㮠処ç†ãŒ IMAP サーãƒã«å映ã•ã‚Œã¦æ¬²ã—ã„ã¨æ€ã„ã¾ã™ã€‚ @end ifset @ifset en An IMAP user may want to cache messages in folder A and go out. Then he may want to put the @samp{o} and/or @samp{D} marks, and process the marks off-line. In this story, these jobs should be done in his IMAP server after connecting the Internet. @end ifset @ifset ja 通常 IMAP ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’フォルダ A ã‹ã‚‰ãƒ•ォルダ B ã¸ç§»å‹•ã•ã›ãŸå ´åˆã€ フォルダ A ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れã¦ã„ã‚‹ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’削除ã—ã€IMAP サーãƒã‹ã‚‰ ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã‚’通ã˜ã€ãƒ•ォルダ B ã¸ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’キャッシュã—ç›´ã™å¿…è¦ãŒ ã‚りã¾ã™ã€‚ãªãœãªã‚‰ã€ãƒ•ォルダ A ã«ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れã¦ã„るメッセージã«ä»˜éšã™ ã‚‹ IMAP ã®æƒ…å ±ã¯ã€ãƒ•ォルダ A 内ã§ã®ã¿æœ‰åйã ã‹ã‚‰ã§ã™ã€‚ @end ifset @ifset en If a message in folder A is moved to folder B with IMAP, the cached message in folder A usually must be deleted and a corresponding message in folder B must be retrieved from his IMAP server again. This is because information embedded in a cached message in folder A is valid only in folder A. @end ifset @ifset ja 出先ã§ãƒ•ォルダ A ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’フォルダ B ã¸æ•´ç†ã—ãŸã¨ã—ã¾ã—ょã†ã€‚ä»®ã«ã€ ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’フォルダ B ã§èª­ã‚€ãŸã‚ã«ã¯ã€ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã—ã¦ãã®å‡¦ ç†ã‚’ IMAP サーãƒã«å映ã—ã€IMAP サーãƒã‹ã‚‰å–り直ã•ãªã„ã¨ã„ã‘ãªã„ã¨ã™ã‚‹ã¨ ä¸ä¾¿ã§ã™ã€‚欲を言ãˆã°ã€å‡ºå…ˆã§ãƒ•ォルダ B ã¸æ•´ç†ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€IMAP サー ãƒã‹ã‚‰å–り直ã•ãªãã¨ã‚‚ã€ãƒ•ォルダ B ã¸ç§»å‹•ã™ã‚Œã°èª­ã‚るよã†ã«ãªã£ã¦ã„ã¦æ¬² ã—ã„ã¨æ€ã„ã¾ã™ã€‚ @end ifset @ifset en Suppose you refile a message in folder A to folder B off-line. It is very inconvenient for you to retrieve a corresponding message in folder B from your IMAP server , in order to read it, after refile jobs are done online. You may want to read the messages refiled to folder B by just going to the folder B, without retrieval form the IMAP server. @end ifset @ifset ja Mew ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸å‡¦ç†ã‚’後ã‹ã‚‰ IMAP サーãƒã¸å映ã™ã‚‹ã“ã¨ã¨ã€IMAP サー ãƒã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å†å–å¾—ã—ãªãã¦ã‚‚移動先ã®ãƒ•ォルダã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読ã‚ã‚‹ã“ ã¨ã®ä¸¡æ–¹ã‚’実ç¾ã—ã¦ã„ã¾ã™ã€‚ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã—ã¦ã„ãªã„状æ³ã§ã€ãƒžãƒ¼ã‚¯ã‚’処 ç†ã™ã‚‹ã«ã¯ã€@samp{lx} を使用ã—ã¦ä¸‹ã•ã„。@samp{lx} を実行ã™ã‚‹ã¨ã€ä»¥ä¸‹ã®å‡¦ ç†ãŒãªã•れã¾ã™ã€‚ @end ifset @ifset en Mew implements delayed jobs processing and viewing refiled messages without retrieval. If you want to process marks off-line, type @samp{lx}. @samp{lx} carries out the following jobs. @end ifset @enumerate @ifset ja @item @samp{o} マークや @samp{D} マークã®ã¤ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒãƒ•ォルダ A ã‹ã‚‰ãªã ãªã‚‹ã€‚ @item ã“ã®å‡¦ç†ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸å½¢å¼ã§ã€%queue ã«æºœã‚‹ã€‚ @item @samp{o} マークã®ã¤ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ãƒ­ãƒ¼ã‚«ãƒ«ã§ãƒ•ォルダ B ã¸ç§»å‹•ã•れã€ç„¡ 効ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¨ã—ã¦æ‰±ã‚れる。 @end ifset @ifset en @item Deleting messages marked with @samp{o} and/or @samp{D} from folder A. @item Queuing these jobs in %queue. @item Moving messages marked with @samp{o} to folder B and marking them invalid. @end ifset @end enumerate @ifset ja 無効ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¨ã¯ã€èª­ã‚€ã“ã¨ã¯ã§ãã‚‹ãŒã€@samp{o} マークや @samp{D} マー クをã¤ã‘られãªã„ã‚‚ã®ã‚’ã„ã„ã¾ã™ã€‚無効ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ã€@samp{#} マーク㌠付ã„ã¦ã„ã¾ã™ã€‚@samp{g} を使ã£ã¦ã€ãƒ•ォルダ B ã¸è¡Œãã¨ã€ç„¡åйãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ ã®ä¸€è¦§ãŒè‡ªå‹•çš„ã«è¡¨ç¤ºã•れã¾ã™ã€‚ @end ifset @ifset en 'invalid' means that you can read it but you cannot put the @samp{o}/@samp{D} mark on it. Invalid messages are marked with @samp{#}. When you go to folder B by typing @samp{g}, a list of invalid messages is displayed automatically. @end ifset @ifset ja ãƒãƒƒãƒˆãƒ¯ãƒ¼ã‚¯ã«æŽ¥ç¶šã—ãŸå¾Œã«ã€%queue ã«æºœã£ã¦ã„る処ç†ã‚’ IMAP サーãƒã«å映㕠ã›ã‚‹ã«ã¯ã€%queue ã§ @samp{C-cC-c} ã¨å…¥åŠ›ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en If you want to let your IMAP server process jobs in %queue after you get back online, type @samp{C-cC-c} in %queue. @end ifset @ifset ja IMAP サーãƒã«å‡¦ç†ã‚’åæ˜ ã—ãŸå¾Œã«ã€ãƒ•ォルダ B ã§ @samp{s} を押ã™ã¨ã€ç„¡åŠ¹ãª ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå‰Šé™¤ã•ã‚Œã€æœ‰åйãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れã¾ã™ã€‚ @end ifset @ifset en Typing @samp{s} in folder B after jobs in %queue are done in your IMAP server results in deletion of invalid messages and caching valid messages. @end ifset @c %%%%%%%%%%%%%%%%% @node mew-mark, Refile, off-line, Marks @ifset ja @section Mew ãŒè¡¨ç¤ºã™ã‚‹ãƒžãƒ¼ã‚¯ @end ifset @ifset en @section Marks displayed by Mew @end ifset @ifset ja 以下㫠Mew ãŒè¡¨ç¤ºã™ã‚‹ãƒžãƒ¼ã‚¯ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en Here is a summary of marks displayed by Mew. @end ifset @table @samp @ifset ja @item M マルãƒãƒ‘ートを表ã™ãƒžãƒ¼ã‚¯ã€‚@xref{multipart} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item - Multipart/Alternative を表ã™ãƒžãƒ¼ã‚¯ã€‚@xref{analysis} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item T メッセージãŒåˆ‡ã‚Šè©°ã‚られãŸã“ã¨ã‚’表ã™ãƒžãƒ¼ã‚¯ã€‚@xref{retrieving} ã‚’å‚ç…§ã®ã“ ã¨ã€‚ @item S ç½²åを表ã™ãƒžãƒ¼ã‚¯ã€‚@xref{cipher-viewing} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item E æš—å·åŒ–を表ã™ãƒžãƒ¼ã‚¯ã€‚@xref{cipher-viewing} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item P 分割ã•れã¦ã„ã‚‹ã“ã¨ã‚’示ã™ãƒžãƒ¼ã‚¯ã€‚@xref{target mark} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item # メッセージãŒç„¡åйã§ã‚ã‚‹ã“ã¨ã‚’示ã™ãƒžãƒ¼ã‚¯ã€‚@xref{off-line} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @end ifset @ifset en @item M This message is a multipart. Please refer to @ref{multipart}. @item - This message contains a Multipart/Alternative content. Please refer to @ref{analysis}. @item T This message was truncated by Mew. Please refer to @ref{retrieving}. @item S This message is signed. Please refer to @ref{cipher-viewing}. @item E This is a cipher message. Please refer to @ref{cipher-viewing}. @item P This message is fragmented. Please refer to @ref{target mark}. @item # This message is invalid. Please refer to @ref{off-line}. @end ifset @end table @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Refile @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Refile, by-folder, mew-mark, Top @ifset ja @chapter æ¥½ã€…æ•´ç†æ•´é “ @end ifset @ifset en @chapter Happy refiling @end ifset @ifset ja 1 æ—¥ã«æ•°ç™¾ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–るよã†ã«ãªã‚‹ã¨æ•´ç†æ•´é “ãŒå¤§å¤‰ã«ãªã‚Šã¾ã™(ãˆã€ ãã‚“ãªã«å—ã‘å–らãªã„ã§ã™ã£ã¦ï¼Ÿ 幸ã›ã§ã™ã­ :) 。Mew ã§ã¯ã€@samp{o} ã§ãƒ¡ãƒƒ セージを整頓ã™ã‚‹éš›ã«ã€æ•´é “先を推測ã—åˆæœŸå€¤ã¨ã—ã¦è¡¨ç¤ºã—ã¦ãれã¾ã™ã€‚ãŸã¨ ãˆã°ã€æ¬¡ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en When you come to receive hundreds of messages in a day (do not you believe it?), refiling messages becomes a very tough job. Mew neatly guesses default folders where the message is supposed to be refiled when you type @samp{o}. You can see an example below. @end ifset @example Folder name (+work/mew-dist): + @end example @ifset ja ã‚‚ã—ã€() ã®ä¸­ã®åˆæœŸå€¤ãŒè‡ªåˆ†ã®å¸Œæœ›é€šã‚Šã§ã‚れã°ã€@samp{RET} を押ã™ã ã‘㧠よã„ã®ã§ã™ã€‚æ•´é “å…ˆãŒæ±ºå®šã—ã¦ã„るメッセージã«ã¯ã€@samp{o} マークãŒä»˜ãã¾ ã™ã€‚ @end ifset @ifset en If the default value in () is proper, just type @samp{RET}. The messages will be marked with @samp{o} if its refiling folders are decided. @end ifset @ifset ja メッセージを移動ã§ãã‚‹ã®ã¯ã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå±žã—ã¦ã„る「世界ã€ã®ä¸­ã§ã®ã¿ ã§ã™ã€‚å‰è¿°ã®ã‚ˆã†ã«ä¸–界ã¯ã‚±ãƒ¼ã‚¹ã¨ä¿®é£¾å­ã«ã‚ˆã£ã¦å®šã¾ã‚Šã¾ã™ã€‚æ•´é “å…ˆã®ãƒ•ォル ダを指定ã™ã‚‹å ´åˆã«ã¯ã€ã‚±ãƒ¼ã‚¹ã‚’付ã‘ãšã€åŒã˜ä¿®é£¾å­ã‚’æŒã¤ãƒ•ォルダåを入力㙠る必è¦ãŒã‚りã¾ã™ã€‚ケースを付ã‘ãªã„ç†ç”±ã¯ã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚±ãƒ¼ã‚¹ã¯ã™ã§ã« 定ã¾ã£ã¦ã„ã‚‹ã‹ã‚‰ã§ã™ã€‚ミニãƒãƒƒãƒ•ã‚¡ã‹ã‚‰ãƒ•ォルダåを入力ã™ã‚‹éš›ã€ã‚±ãƒ¼ã‚¹ãŒ "default" ã§ãªã„ã«ã‚‚é–¢ã‚らãšã‚±ãƒ¼ã‚¹ã‚’明示的ã«å…¥åŠ›ã—ãªã„ã®ã¯ã€æ•´é “先を指定 ã™ã‚‹å ´åˆã®ã¿ã§ã™ã€‚ @end ifset @ifset en You can refile a message to folders of the same world to which the message belong. As described above, a world is identified by a combination of "case" and proto. When you input a folder to which the message is refiled, you must not specify "case" and you must input a folder whose proto is the same. The reason why you must not specify @w{"}case" is that the "case" is already known. With other commands, you have to specify the "case", if necessary, when you input folder name in minibuffer. This command is only the exception. @end ifset @ifset ja @samp{o} ã«ä¼¼ãŸã‚³ãƒžãƒ³ãƒ‰ã« @samp{c} ãŒã‚りã¾ã™ã€‚両者ã®é•ã„ã¯ã€ @xref{refile mark} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Mew also provides @samp{c} which is very similar to @samp{o}. To know the difference, please refer to @ref{refile mark}. @end ifset @ifset ja ã“ã®æ•´é “å…ˆã®æŽ¨æ¸¬ãŒè³¢ã‘れã°è³¢ã„ç¨‹ãƒ¦ãƒ¼ã‚¶ã¯æ¥½ã«ãªã‚Šã¾ã™ã€‚Mew ã§ã¯ä»¥ä¸‹ã®ã‚ˆã† ãªè¦å‰‡ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en As you know, the more excellent refiling guess algorithms become, the less user's job troublesome. Mew provides you with the following rules. @end ifset @menu @ifset ja * by-folder:: メーリングリスト用ã®ãƒ•ォルダã‹ã‚‰æŽ¨æ¸¬ * by-alist:: 指定ã—ãŸè¦å‰‡ã‹ã‚‰æŽ¨æ¸¬ * by-thread:: 対話関係ã‹ã‚‰æŽ¨æ¸¬ * by-from-folder:: 個人用ã®ãƒ•ォルダã‹ã‚‰æŽ¨æ¸¬ * by-from:: From: ã‹ã‚‰æŽ¨æ¸¬ * by-newsgroups:: Newsgroups: ã‹ã‚‰æŽ¨æ¸¬ * by-default:: デフォルトã®è¦å‰‡ * guess-rule:: è¦å‰‡ã®åˆ¶å¾¡ * auto-refile:: è‡ªå‹•ã§æ•´ç†æ•´é “ * copy-msg:: 世界を越ãˆãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚³ãƒ”ー @end ifset @ifset en * by-folder:: Guess by mailing-list folders * by-alist:: Guess by user defined rules * by-thread:: Guess by thread * by-from-folder:: Guess by private folders * by-from:: Guess by From: * by-newsgroups:: Guess by Newsgroups: * by-default:: Guess by default rule * guess-rule:: Controlling rules * auto-refile:: Auto refile * copy-msg:: Copying messages across worlds @end ifset @end menu @c %%%%%%%%%%%%%%%%% @node by-folder, by-alist, Refile, Refile @ifset ja @section メーリングリスト用ã®ãƒ•ォルダã‹ã‚‰æŽ¨æ¸¬ @end ifset @ifset en @section Guess by mailing-list folders @end ifset @vindex mew-use-fast-refile @vindex mew-use-node-folder @ifset ja ã‚るメーリングリスト宛ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã€ãã®ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆåã®ãƒ•ォルダ㫠整ç†ã™ã‚‹ã“ã¨ã¯å¤šã„ã¨æ€ã„ã¾ã™ã€‚Mew ã§ã¯ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆå®›ã«å±Šã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ ジã«å¯¾ã—ã¦ã€ãれ用ã®ãƒ•ォルダを推測ã™ã‚‹æ©Ÿèƒ½ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en Many users tend to refile messages destined to a mailing-list to a folder whose name is the same as the mailing-list. Mew provides a mechanism to guess a mailing-list folder for messages destined to mailing-lists. @end ifset @ifset ja ãŸã¨ãˆã°ã€+misc/pooh-lovers ã¨ã„ã†ãƒ•ォルダãŒã‚ã£ãŸã¨ã—ã¾ã—ょã†ã€‚次ã®ã‚ˆã† ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ã€ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ã«æ•´é “ã™ã‚Œã°ã‚ˆã„å¯èƒ½æ€§ãŒé«˜ã„ã¨ã„ãˆã¾ã™ã€‚ @end ifset @ifset en Suppose that you have a folder named +misc/pooh-lovers. The following message is probably to be refiled to this folder. @end ifset @example To: pooh-lovers@@example.org @end example @ifset ja ã“ã®ã‚ˆã†ã«ã€To: ã‚„ Cc: ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒã€ãƒ•ォルダåã®ä¸€ç•ªå³å´ã«ãƒžãƒƒãƒã™ã‚‹ã‚‚ ã®ãŒãªã„ã‹æŽ¢ã™ã‚ã‘ã§ã™ã€‚フォルダを階層化ã—ã¦ã„ãªã„人ãŒå¤šã„よã†ã§ã™ãŒã€ Mew を使ã†é™ã‚Šã€éšŽå±¤åŒ–ã—ãªã„手ã¯ã‚りã¾ã›ã‚“。 @end ifset @ifset en Likewise, Mew searches a matching folder forward with addresses on To: and Cc:. There are many people who do not use recursive folders. With Mew, however, you would not be smart if you do not use it. @end ifset @ifset ja ã•ã¦ã€é‹­ã„äººã¯æ¬¡ã®ã‚ˆã†ã«å€‹äººã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒ To: ã‚„ Cc: ã«ã‚ã‚‹å ´åˆã€å›°ã‚‹ã®ã§ ã¯ãªã„ã‹ã¨æ€ã†ã§ã—ょã†ã€‚ @end ifset @ifset en Smart users may wonder that they get a trouble in the following situation where private addresses are on To: or Cc:. @end ifset @example To: piglet@@example.org Cc: pooh-lovers@@example.org @end example @ifset ja ãŸã¨ãˆã°ã€pooh 㯠pooh-lovers ã®ä¸€å“¡ã§ã™ã‹ã‚‰ã€ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå±Šãã¾ã™ã€‚ ã—ã‹ã—ã€piglet ã¨ä»²ãŒã„ã„ã®ã§ã€+from/piglet ã«ãƒžãƒƒãƒã—ã¦ã—ã¾ã„ã¾ã™ã€‚ @end ifset @ifset en Since Pooh is a member of pooh-lovers, he receives this message. But he has a folder for his friend, Piglet. So, +from/piglet may be chosen. @end ifset @ifset ja ãã“ã§ã€Mew ã§ã¯ç„¡è¦–ã™ã‚‹ãƒ•ォルダを設定ã§ãるよã†ã«ãªã£ã¦ã„ã¾ã™ã€‚デフォル トã§ã¯ã€+from 以下を無視ã—ã¾ã™ã€‚ã§ã™ã‹ã‚‰ã€å€‹äººã‹ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¯ +from 以下ã«åŽã‚ã¦ä¸‹ã•ã„ @end ifset @ifset en To avoid this, Mew allows you to specify which folders are to be ignored. The default is +from. So, please take a convention to refile personal messages under +from. @end ifset @ifset ja å€™è£œãŒæ±ºå®šã§ããŸã‚‰ @end ifset @ifset en When Mew guesses a candidate by the folders, it asks you: @end ifset @example Folder name (+misc/pooh-lovers): + @end example @ifset ja ã¨è¨Šã„ã¦ãã¾ã™ã€‚ã‚ã£ã¦ã„れ㰠@samp{RET} ã‚’ã€é•ã£ã¦ã„れã°ãŠæœ›ã¿ã®ãƒ•ォルダ を入力ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Just type @samp{RET} if the default is exactly what you want. @end ifset @ifset ja @samp{o} ã§æ–°ã—ã„フォルダを指定ã™ã‚‹ã¨ã€ãã®ãƒ•ォルダãŒè‡ªå‹•çš„ã«ä½œæˆã•れ〠次ã‹ã‚‰ã¯æŽ¨æ¸¬ç”¨ã®å€™è£œã«ã‚‚加ã‚りã¾ã™ã€‚便利ã§ã—ょ? @end ifset @ifset en If you specify a new folder with @samp{o}, the folder is created and added to the folder list to be used for guess. Convenient, isn't it? @end ifset @ifset ja ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹é–¢æ•°ã¯ @samp{mew-refile-guess-by-folder} ã§ã™ã€‚ @end ifset @ifset en The function name to provide this feature is @samp{mew-refile-guess-by-folder}. @end ifset @ifset ja ã‚‚ã—ã€ãƒ•ォルダåã«å¤§æ–‡å­—を使ã£ã¦ã„ãªã„ãªã‚‰ã€ä»¥ä¸‹ã®è¨­å®šã«ã‚ˆã‚Šã€ã“ã®é–¢æ•°ãŒ 高速ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en If you don't use capital letters for folder names, configure as follows to make this function faster: @end ifset @lisp (setq mew-use-fast-refile t) @end lisp @ifset ja デフォルトã§ã¯ã€æœ«ç«¯ã®ãƒ•ォルダã¨ä¸­é–“ã®ãƒ•ォルダãŒå€™è£œã®å¯¾è±¡ã¨ãªã£ã¦ã„ã¾ ã™ã€‚ã‚‚ã—ã€ä¸­é–“ã®ãƒ•ォルダã§ã¯ãªãã€æœ«ç«¯ã®ãƒ•ォルダã ã‘ã‚’é¸ã³ãŸã„å ´åˆã¯ã€ 以下ã®ã‚ˆã†ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en By default, candidate includes node folders as well as leaf folders. If you want to not select node folders but leave folders only, configure as follows: @end ifset @lisp (setq mew-use-node-folder nil) @end lisp @c %%%%%%%%%%%%%%%%% @node by-alist, by-thread, by-folder, Refile @ifset ja @section 指定ã—ãŸè¦å‰‡ã‹ã‚‰æŽ¨æ¸¬ @end ifset @ifset en @section Guess by user defined rules @end ifset @vindex mew-refile-guess-alist @ifset ja フォルダåã‹ã‚‰æŽ¨æ¸¬ã™ã‚‹æ©Ÿèƒ½ã ã‘ã§ã¯ã€æ€ã†ã‚ˆã†ãªãƒ•ォルダを推測ã—ã¦ãれ㪠ã„å ´åˆãŒã‚りã¾ã™ã€‚ãŸã¨ãˆã°ã€To: ㌠staff@@example.jp ã§ã‚るメッセージ㨠To: ㌠staff@@example.net ã§ã‚るメッセージã«å¯¾ã—ã€ãƒ•ォルダåã‹ã‚‰ã®æŽ¨æ¸¬ ã§ã¯åŒã˜ãƒ•ォルダ(ãŸã¨ãˆã°ã€"+net/staff")ãŒé¸ã°ã‚Œã¦ã—ã¾ã„ã¾ã™ã€‚ãã“ã§ã€ Mew ã§ã¯ã€å¤‰æ•° @samp{mew-refile-guess-alist} ã«æ˜Žç¤ºçš„ã«è¦å‰‡ã‚’設定ã§ãã¾ ã™ã€‚(@samp{mew-refile-guess-alist} ã¯ã€å¿…ãšæ–°ã—ã„æ›¸å¼ã§æ›¸ã„ã¦ä¸‹ã•ã„。詳 ã—ã㯠@xref{config2} ã‚’å‚ç…§ã®ã“ã¨ã€‚) @end ifset @ifset en There are some cases where the refile guess mechanism by folders does not work as you wish. For example, for both a message whose To: is staff@@example.jp and another message whose To: is staff@@example.net, the same folder would be selected with guess by folders (e.g. "+net/staff"). So, Mew allows you to define your own rules explicitly. (You must use the new format for @samp{mew-refile-guess-alist}. For more information, see @end ifset @ifset ja 1 ã¤ä¾‹ã‚’挙ã’ã¦ã¿ã¾ã—ょã†ã€‚ @end ifset @ifset en Let's look at an example. @end ifset @lisp (setq mew-refile-guess-alist '(("To:" ("staff@@example.jp" "+jp/staff") ("staff@@example.net" "+net/staff")))) @end lisp @ifset ja ã“れã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãƒ˜ãƒƒãƒ€ä¸­ã® To: ã®æ¨ªã®æ–‡å­—列㫠staff@@example.jp ãŒã‚ れ㰠+jp/staff ã¸ã€staff@@example.net ãŒã‚れ㰠+net/staff ã¸æ•´é “ã™ã‚‹ã¨ ã„ã†æ„味ã§ã™ã€‚ @end ifset @ifset en This means that if To: contains staff@@example.jp +jp/staff is selected and if To: has staff@@example.net +net/staff is chosen. @end ifset @ifset ja è¦å‰‡ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«æ›¸ãã¾ã™ã€‚ @end ifset @ifset en The format of this rule is as follow: @end ifset @example rule ::= ' ::= (( ) ( ) ... []) @end example @ifset ja 全体㯠( ) ã®ãƒªã‚¹ãƒˆã§ã™ã€‚ ã¯ãƒ•ィールドåを書ãã¾ã™ã€‚ ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en The whole is a list of ( ). A field name is specified for . The format for is as follows: @end ifset @example ::= ( |) ( |) ... @end example @ifset ja 㯠ã§ç¤ºã—ãŸãƒ•ィールドã«ãる値ã§ã™ã€‚ 㯠ã«ãƒžãƒƒ ãƒã—ãŸéš›ã«ã©ã®ãƒ•ã‚©ãƒ«ãƒ€ã«æ•´é “ã™ã‚‹ã‹ã‚’æ„味ã—ã¦ã„ã¾ã™ã€‚ ã®ä»£ã‚Šã« ã‚’å†å¸°çš„ã«è¨˜è¿°ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ @end ifset @ifset en is a field value for . means a folder to be chosen if matched. You can write recursively instead of . (@xref{config2}.) @end ifset @ifset ja 特殊㪠ã¨ã—㦠@samp{nil} 㨠@samp{t} ãŒã‚りã¾ã™ã€‚@samp{nil} ã¯ã€ä½• も推測ã§ããªã‹ã£ãŸå ´åˆã«è¿”㙠を指定ã™ã‚‹ãŸã‚ã«ç”¨ã„ã¾ã™ã€‚@samp{t} ã¯ã€æŽ¨æ¸¬ã—ãŸå€¤ã«åŠ ãˆã¦è¿”㙠を指示ã™ã‚‹ãŸã‚ã«ä½¿ã„ã¾ã™ã€‚ @end ifset @ifset en There are two special s: @samp{nil} and @samp{t}. @samp{nil} is used to specify to be returned when nothing is guessed. @samp{t} can specify to be returned in addition to guessed values. @end ifset @example ::= (t ) | (nil ) @end example @ifset ja æ­£è¦è¡¨ç¾ã‚’知ã£ã¦ã„る人ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ãªè¤‡é›‘ãªè¦å‰‡ã‚’設定ã§ãã¾ã™ã€‚ @end ifset @ifset en If you know regular expression, a more advanced rule can be defined like this. @end ifset @lisp (setq mew-refile-guess-alist '(("Newsgroups:" ("^nifty\\.\\([^ ]+\\)" "+Nifty/\\1") (".*" "+rec/news")) ("To:" ("\\(inet\\|wide\\)@@wnoc-fuk" "+wide/\\1-wnoc-fuk")) ("From:" ("uucp@@" "+adm/uucp") ("ftpsync@@" "+adm/ftpsync")) (nil "+unknown"))) @end lisp @ifset ja ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹é–¢æ•°ã¯ @samp{mew-refile-guess-by-alist} ã§ã™ã€‚ @end ifset @ifset en The function name to provide this feature is @samp{mew-refile-guess-by-alist}. @end ifset @c %%%%%%%%%%%%%%%%% @node by-thread, by-from-folder, by-alist, Refile @ifset ja @section 対話関係ã‹ã‚‰æŽ¨æ¸¬ @end ifset @ifset en @section Guess by thread @end ifset @vindex mew-lisp-max-length @ifset ja Mew ã«ã¯ã€æ•´é “ã—よã†ã¨ã—ã¦ã„るメッセージã®è¦ªã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä»¥å‰æ•´é “ã•ã‚ŒãŸ ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¦ãれる機能ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en Mew provides a mechanism to guess a folder where the parent message of a current message was refiled before. @end ifset @ifset ja ãŸã¨ãˆã°ã€poohã€pigletã€roo ã¨ã®é–“ã§ã€èœ‚蜜をå–りã«è¡Œã“ã†ã¨ã„ã†è©±é¡ŒãŒç››ã‚Š ä¸ŠãŒã£ãŸã¨ã—ã¾ã—ょã†ã€‚pooh ã¯ã€+project/honey ã¨ã„ã†ãƒ•ォルダを作ã£ã¦ã€æœ€ åˆã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ãã“ã«æ•´é “ã—ãŸã¨ã—ã¾ã—ょã†ã€‚以é™ã€3 人ã®é–“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒ ãã¡ã‚“ã¨ã—ãŸè¿”ç­”ã§ã‚ã‚‹ã‹ãŽã‚Šã€+project/honey を推測ã—ã¦ãれã¾ã™ã€‚ @end ifset @ifset en For example, Pooh, Piglet, and Roo had a chat to go and get honey. So, Pooh made +project/honey then refiled the message to it. The further messages, if they are properly replied, they are supposed to be refiled to +project/honey. @end ifset @ifset ja ã‚るメッセージをã©ã“ã«ä¿å­˜ã—ãŸã‹ã¨ã„ã†æƒ…å ±ã¯ã€ @w{"}~/Mail/.mew-refile-msgid-alist" ã«ä¿å­˜ã•れã¦ã„ã¾ã™ã€‚ã“ã®æƒ…報をéŽåŽ» 何通ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«é–¢ã—ã¦ä¿å­˜ã™ã‚‹ã‹ã¯ã€@samp{mew-lisp-max-length} ã§æ±ºå®š ã—ã¾ã™ã€‚åˆæœŸå€¤ã¯ 2000 通ã§ã™ã€‚3000 通ã«ã—ãŸã„å ´åˆã¯ "~/.mew.el" 中ã§ä»¥ 下ã®ã‚ˆã†ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Information that which folder was chosen for messages is stored to @w{"}~/Mail/.mew-refile-msgid-alist". @samp{mew-lisp-max-length} controls the amount of this information. The default value is 2000 messages. If you want limits it to 3000 messages, put the following to "~/.mew.el". @end ifset @lisp (setq mew-lisp-max-length 3000) @end lisp @ifset ja ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹é–¢æ•°ã¯ @samp{mew-refile-guess-by-thread} ã§ã™ã€‚ @end ifset @ifset en The function name to provide this feature is @samp{mew-refile-guess-by-message-id}. @end ifset @c %%%%%%%%%%%%%%%%% @node by-from-folder, by-from, by-thread, Refile @ifset ja @section 個人用ã®ãƒ•ォルダã‹ã‚‰æŽ¨æ¸¬ @end ifset @ifset en @section Guess by private folders @end ifset @vindex mew-refile-guess-from-me-is-special @ifset ja @xref{by-folder} ã§èª¬æ˜Žã—ãŸãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆç”¨ã®ãƒ•ォルダを推測ã™ã‚‹ã«åŠ ãˆ ã¦ã€å€‹äººç”¨ã®ãƒ•ォルダを推測ã™ã‚‹æ©Ÿèƒ½ãŒã‚りã¾ã™ã€‚個人用ã®ãƒ•ォルダ㯠+from 以下ã«ã‚りã¾ã™ã‹ã‚‰ã€+from 以下ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã™ã‚‹æ©Ÿèƒ½ã ã¨ã‚‚ã„ãˆã¾ã™ã€‚以 下ã®ä¾‹ã‚’考ãˆã¦ã¿ã¾ã—ょã†ã€‚ @end ifset @ifset en In addition to the mechanism to select a mailing-list folder described in @ref{by-folder}, Mew provides a mechanism to choose a private folder. Since private folders locate under +from, we can say that this mechanism select a folder from the folders under +from. Let's see the following example: @end ifset @example To: pooh@@example.net From: piglet@@example.org @end example @ifset ja piglet ã‹ã‚‰ pooh ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ¥ã¾ã—ãŸã€‚pooh ãŒã“ã®æ©Ÿèƒ½ã‚’使ã†ã¨ã€From: を手ãŒã‹ã‚Šã« +from/piglet ãŒé¸æŠžã•れã¾ã™ã€‚(+from 以下ã¯éšŽå±¤åŒ–ã•れã¦ã„㦠も構ã„ã¾ã›ã‚“。ã¾ãŸã€ãƒ•ォルダåã¯ãƒ¦ãƒ¼ã‚¶åã ã‘ã§ã¯ãªãアドレス全体ã§ã‚‚ OK ã§ã™ã€‚) @end ifset @ifset en Pooh received a message from Piglet. If Pooh uses this mechanism, +from/piglet will be chosen according to From:. (Folders under +from can be recurse. And you can select the entire address for a folder name instead of the user part.) @end ifset @ifset ja ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹é–¢æ•°ã¯ã€@samp{mew-refile-guess-by-from-folder} ã¨ã„ã„ã¾ã™ã€‚ @end ifset @ifset en The function to provide this feature is @samp{mew-refile-guess-by-from-folder}. @end ifset @ifset ja 次ã«ã€pooh ㌠piglet ã«è¿”ç­”ã—ãŸå ´åˆã‚’考ãˆã¾ã—ょã†ã€‚pooh ã¯è‡ªåˆ†è‡ªèº«ã« Cc: ã—ã¦ã„ãŸã®ã§ã€è‡ªåˆ†ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæˆ»ã£ã¦ãã¾ã—ãŸã€‚ @end ifset @ifset en Next, let's consider a care where Pooh replied to Piglet. Since Pooh Cc:ed the message to himself, the message was also delivered to him. @end ifset @example To: piglet@@example.org Cc: pooh@@example.net From: pooh@@example.net @end example @ifset ja pooh ã®ç«‹å ´ã«ãªã£ã¦è€ƒãˆã¦ã¿ã¦ä¸‹ã•ã„。ã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ +from/pooh ã«æ•´é “ ã™ã‚‹ã‹ã€ã‚ã‚‹ã„㯠+from/piglet ã«æ•´é “ã™ã‚‹ã®ã‹ã¯ã€å¥½ã¿ãŒåˆ†ã‹ã‚Œã‚‹ã¨ã“ã‚ã§ ã—ょã†ã€‚ãã“ã§ã€ã©ã¡ã‚‰ã‚’é¸æŠžã™ã‚‹ã®ã‹ã‚«ã‚¹ã‚¿ãƒžã‚¤ã‚ºã§ãるよã†ã«ãªã£ã¦ã„ã¾ ã™ã€‚ @end ifset @ifset en How do you feel if you are Pooh? You may want to refile this to +from/pooh. Also, you may want to move this to +from/piglet. So, it can be customized. @end ifset @ifset ja @samp{mew-refile-guess-from-me-is-special} ㌠@samp{t} ãªã‚‰ã€ @samp{mew-refile-guess-by-from-folder} ã¯ã€From: ãŒè‡ªåˆ†ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã®å ´åˆ ã«ã€To: 㨠Cc: ã«ã‚るアドレスをもã¨ã«ã€+from 以下ã®ãƒ•ã‚©ãƒ«ãƒ€ã‚’é¸æŠžã—ã¾ã™ã€‚ @end ifset @ifset en If @samp{mew-refile-guess-from-me-is-special} is @samp{t} and if an address in From: is yourself, @samp{mew-refile-guess-by-from-folder} select a folder under +from according to To: and/or Cc:. @end ifset @c %%%%%%%%%%%%%%%%% @node by-from, by-newsgroups, by-from-folder, Refile @ifset ja @section From: ã‹ã‚‰æŽ¨æ¸¬ @end ifset @ifset en @section Guess by From: @end ifset @vindex mew-lisp-max-length @vindex mew-refile-guess-from-me-is-special @ifset ja From: ã«åŒä¸€ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’æŒã¤ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã€ã‹ã¤ã¦ã©ã“ã«æ•´é “ã•れãŸã‹ã«ã‚ˆã£ ã¦æŽ¨æ¸¬ã™ã‚‹æ©Ÿèƒ½ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en Mew also provides a mechanism to guess a folder by the place where a message that has the same From: field is refiled. @end ifset @ifset ja ãŸã¨ãˆã°ã€piglet 㯠piglet@@example.org 㨠p-p-p@@example.org ã® 2 ã¤ã®ã‚¢ ドレスをæŒã£ã¦ã„ã‚‹ã¨ã—ã¾ã—ょã†ã€‚ã©ã¡ã‚‰ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒå±Šã„ã¦ã‚‚〠pooh ã¯ãれらを +from/piglet ã«æ•´é “ã—ãŸã„ã¨æ€ã£ã¦ã„ã¾ã™ã€‚ã‚‚ã¡ã‚ã‚“ã€ä»¥ä¸‹ ã®ã‚ˆã†ã«æ˜Žç¤ºçš„ã«è¦å‰‡ã‚’書ã‘ã°å®Ÿç¾ã§ãã¾ã™ã€‚ @end ifset @ifset en Suppose that Piglet has two addresses, piglet@@example.org and p-p-p@@example.org. Pooh wants to refile messages from Piglet to +from/piglet no matter what his From: is. This policy can, of course, be implemented if Pooh specifies rules explicitly as follows: @end ifset @lisp (setq mew-refile-guess-alist '(("From:" ("piglet@@example.org" "+from/piglet") ("p-p-p@@example.org" "+from/piglet")))) @end lisp @ifset ja ã—ã‹ã—ã€ã„ã¡ã„ã¡è¦å‰‡ã‚’書ãã®ã¯é¢å€’ã§ã™ã€‚ãã“ã§ã€ã¾ãš From: ㌠piglet@@example.org ã§ã‚るメッセージを +from/piglet ã«æ•´é “ã—ã¾ã™ã€‚ã“れ ã§ãƒ•ォルダ +from/piglet ãŒä½œæˆã•れã¾ã™ã€‚次ã«ã€From: ㌠p-p-p@@example.org ã§ ã‚るメッセージを +from/piglet ã«æ•´é “ã—ãŸã¨ã—ã¾ã™ã€‚ã“ã“ã§ Mew ã¯ã€ p-p-p@@example.org ㌠+from/piglet ã«æ•´é “ã•れãŸã“ã¨ã‚’学習ã—ã¾ã™ã€‚以後 From: ㌠p-p-p@@example.org ã§ã‚るメッセージを整頓ã—よã†ã¨ã™ã‚‹ã¨ã€+from/piglet ã‚’ é¸æŠžã™ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en But such a work may bother you. So, first refile a message whose From: is piglet@@example.org to +from/piglet. At this time, +from/piglet is created. Next, refile a message whose From: is p-p-p@@example.org to +from/piglet. Here Mews learns that p-p-p@@example.org was refiled to +from/piglet. After this, when messages whose From: is p-p-p@@example.org are refiled, +from/piglet is chosen. @end ifset @ifset ja ãã®ä»–ã€æ©Ÿæ¢°ã‹ã‚‰ãるメッセージã¯ã€ã„ã¤ã‚‚ +adm/misc ã«å…¥ã‚Œã‚‹ã“ã¨ã«ã—ãŸã„ å ´åˆãªã©ã‚‚ã€æ˜Žç¤ºçš„ãªè¦å‰‡ã‚’書ã‹ãšã«æ¸ˆã¾ã›ã‚‰ã‚Œã¾ã™ã€‚ @end ifset @ifset en For another example, you can refile messages from machinery to +adm/misc without defining an explicit rule. @end ifset @ifset ja From: ã¨ãƒ•ã‚©ãƒ«ãƒ€ã®æƒ…å ±ã¯ã€"~/Mail/.mew-refile-from-alist" ã«ä¿å­˜ã•れã¦ã„ ã¾ã™ã€‚ã“ã®æƒ…報をéŽåŽ»ä½•é€šã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«é–¢ã—ã¦ä¿å­˜ã™ã‚‹ã‹ã¯ã€ @xref{by-thread} ã¨åŒæ§˜ã« @samp{mew-lisp-max-length} ã§æ±ºå®šã—ã¾ã™ã€‚ @end ifset @ifset en Information for relationship between From: and folder is stored to @w{"}~/Mail/.mew-refile-from-alist". @samp{mew-lisp-max-length} controls the amount of this information as the same as @ref{by-thread}. @end ifset @ifset ja ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹é–¢æ•°ã¯ @samp{mew-refile-guess-by-from} ã§ã™ã€‚ @end ifset @ifset en The function name to provide this feature is @samp{mew-refile-guess-by-from}. @end ifset @ifset ja @samp{mew-refile-guess-from-me-is-special} ㌠@samp{t} ã®å ´åˆã€ @samp{mew-refile-guess-by-from} 㯠@samp{mew-refile-guess-by-from-folder}(@xref{by-from-folder})ã¨åŒæ§˜ãªå‹• ãã‚’ã—ã¾ã™ã€‚ @end ifset @ifset en If the value of @samp{mew-refile-guess-from-me-is-special} is @samp{t}, @samp{mew-refile-guess-by-from} acts as @samp{mew-refile-guess-by-from-folder} (@pxref{by-from-folder}). @end ifset @c %%%%%%%%%%%%%%%%% @node by-newsgroups, by-default, by-from, Refile @ifset ja @section Newsgroups: ã‹ã‚‰æŽ¨æ¸¬ @end ifset @ifset en @section Guess by Newsgroups: @end ifset @ifset ja ニュースをメールã¨ã—ã¦å—ä¿¡ã—㦠Mew ã§èª­ã‚“ã§ã„る人ã®ãŸã‚ã«ã€Newsgroups: ã‹ã‚‰ãƒ•ォルダを推測ã™ã‚‹æ©Ÿèƒ½ã‚’用æ„ã—ã¾ã—ãŸã€‚関数å㯠@samp{mew-refile-guess-by-newsgroups} ã§ã™ã€‚ @end ifset @ifset en For those who read articles of NetNews received by e-mail with Mew, Mew provides a mechanism to guess a folder by Newsgroups:. The function name to provide this feature is @samp{mew-refile-guess-by-newsgroups}. @end ifset @c %%%%%%%%%%%%%%%%% @node by-default, guess-rule, by-newsgroups, Refile @ifset ja @section デフォルトã®è¦å‰‡ @end ifset @ifset en @section Guess by default rule @end ifset @vindex mew-refile-guess-strip-domainpart @ifset ja デフォルトã®è¦å‰‡ã¯ã€From: ã‹ã‚‰ãƒ¦ãƒ¼ã‚¶åを切り出ã—ã¦ã€@samp{+from/user} ã‚’é¸ã¶ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ãŸã ã—〠@samp{mew-refile-guess-strip-domainpart} ㌠@samp{nil} ãªã‚‰ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’切 り出ã™ã®ã§ã€@samp{+from/user@@domain} ãŒé¸æŠžã•れã¾ã™ã€‚ @samp{mew-refile-guess-strip-domainpart} ã®åˆæœŸå€¤ã¯ @samp{t} ã§ã™ã€‚ @end ifset @ifset en The default rule is to extract a user name from From: and to choose @samp{+from/user}. But if @samp{mew-refile-guess-strip-domainpart} is @samp{nil}, it extracts the entire address. So, @samp{+from/user@@domain} is chosen. The default value of @samp{mew-refile-guess-strip-domainpart} is @samp{t}. @end ifset @ifset ja 関数åã¯ã€@samp{mew-refile-guess-by-default} ã§ã™ã€‚ @end ifset @ifset en The function name is @samp{mew-refile-guess-by-default}. @end ifset @c %%%%%%%%%%%%%%%%% @node guess-rule, auto-refile, by-default, Refile @ifset ja @section è¦å‰‡ã®åˆ¶å¾¡ @end ifset @ifset en @section Controlling rules @end ifset @vindex mew-refile-guess-control @vindex mew-refile-ctrl-multi @ifset ja Mew ã§ã¯ã€ãƒ•ォルダ推測ã®è¦å‰‡ã‚’ 2 ã¤ã®å¤‰æ•°ã€@samp{mew-refile-guess-control} 㨠@samp{mew-refile-ctrl-multi} ã§åˆ¶å¾¡ã—ã¾ã™ã€‚ @samp{mew-refile-guess-control} ã¯ã€å‘¼ã³å‡ºã™é–¢æ•°ã‚’é †ã«å®šç¾©ã—ã¾ã™ã€‚候補を 複数ã«ã—ãŸã„å ´åˆã¯ @samp{mew-refile-ctrl-multi} ã‚’ @samp{t} ã«ã€å˜æ•°ã«ã— ãŸã„å ´åˆã¯ @samp{nil} ã«è¨­å®šã—ã¾ã™ã€‚ @end ifset @ifset en Mew controls guess rules by two variables, @samp{mew-refile-guess-control} and @samp{mew-refile-ctrl-multi}. If you want multiple candidates, set @samp{mew-refile-ctrl-multi} @samp{t}. Otherwise, set it @samp{nil}. @end ifset @ifset ja 標準ã§ã¯ã€@samp{mew-refile-guess-control} ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«å®£è¨€ã•れã¦ã„ã¾ã™ (宣言ãªã®ã§ @samp{defvar} ãŒä½¿ã‚れã¦ã„ã¾ã™)。 @end ifset @ifset en By default, @samp{mew-refile-guess-control} is declared as follows (since it is a declaration, @samp{defvar} is used): @end ifset @lisp (defvar mew-refile-guess-control '(mew-refile-guess-by-alist mew-refile-ctrl-throw mew-refile-guess-by-newsgroups mew-refile-guess-by-folder mew-refile-ctrl-throw mew-refile-ctrl-auto-boundary mew-refile-guess-by-thread mew-refile-ctrl-throw mew-refile-guess-by-from-folder mew-refile-ctrl-throw mew-refile-guess-by-from mew-refile-ctrl-throw mew-refile-guess-by-default)) @end lisp @ifset ja Mew 㯠@samp{mew-refile-guess-control} ã«ä¸¦ã¹ã‚‰ã‚ŒãŸé–¢æ•°ã‚’順番ã«ã™ã¹ã¦å®Ÿ 行ã—ã¾ã™ã€‚å„々ã®é–¢æ•°ãŒè¤‡æ•°ã®å€™è£œã‚’推測ã™ã‚‹ã“ã¨ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en Mew executes every function defined in @samp{mew-refile-guess-control} in order. Each function may guess multiple candidates. @end ifset @ifset ja @samp{mew-refile-guess-control} ã®å‹•作例ã¨ã—ã¦ä»¥ä¸‹ã‚’考ãˆã¦ã¿ã¾ã—ょã†ã€‚ @end ifset @ifset en Let's see the following example of @samp{mew-refile-guess-control} action. @end ifset @table @samp @ifset ja @item mew-refile-guess-by-alist ㌠+aaaã€+bbb を推測。 @item mew-refile-guess-by-folder ㌠+cccã€+ddd を推測。 @item mew-refile-guess-by-default ㌠+eee を推測。 @end ifset @ifset en @item mew-refile-guess-by-alist guessed +aaa and +bbb. @item mew-refile-guess-by-folder guessed +ccc and +ddd. @item mew-refile-guess-by-default guessed +eee. @end ifset @end table @ifset ja +aaa 〜 +eee ã™ã¹ã¦ã‚’ãƒ¦ãƒ¼ã‚¶ã«æç¤ºã—ã¦æ¬²ã—ã„å ´åˆã¯ã€ @samp{mew-refile-ctrl-multi} ã‚’ @samp{t} ã«ã€+aaa ã ã‘ã‚’æç¤ºã—ã¦æ¬²ã—ã„å ´ åˆã¯ã€@samp{nil} ã«è¨­å®šã—ã¾ã™ã€‚ @end ifset @ifset en If you want to provide all candidates, +aaa - +eee, set @samp{mew-refile-ctrl-multi} @samp{t}. If you want to provide +aaa only, set it @samp{nil}. @end ifset @ifset ja ã¾ãŸã€+aaa 〜 +ddd ã¯æç¤ºã—ã¦æ¬²ã—ã„ã‘れã©ã‚‚ãれ以é™ã¯ã„らãªã„ã€ã¤ã¾ã‚Šã€ +eee ã‚’æç¤ºã™ã‚‹ã®ã¯å…ˆã«å®Ÿè¡Œã•れãŸé–¢æ•°ç¾¤ãŒä½•も推測ã§ããªã‹ã£ãŸã¨ãã ã‘ã« ã—ãŸã„å ´åˆã¯ã€@samp{mew-refile-ctrl-multi} ã‚’ @samp{t} ã«ã—ã¦ã€ @samp{mew-refile-guess-by-folder} 㨠@samp{mew-refile-guess-by-default} ã®é–“ã« @samp{mew-refile-ctrl-throw} を入れã¦ä¸‹ã•ã„。 @end ifset @ifset en If you want +aaa - +ddd but do not want left candidates, in other words, you want +eee only when no candidate is guessed by functions executed before, set @samp{mew-refile-ctrl-multi} @samp{t} and insert @samp{mew-refile-ctrl-throw} between @samp{mew-refile-guess-by-folder} and @samp{mew-refile-guess-by-default}. @end ifset @ifset ja @samp{C-uo} ã¯ã€ã“ã®æŽ¨æ¸¬ã®æµã‚Œã‚’ Message ãƒãƒƒãƒ•ã‚¡ã«è¡¨ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en @samp{C-uo} displays the flow of guess rules in Message buffer. @end ifset @c %%%%%%%%%%%%%%%%% @node auto-refile, copy-msg, guess-rule, Refile @ifset ja @section è‡ªå‹•ã§æ•´ç†æ•´é “ @end ifset @ifset en @section Auto refile @end ifset @vindex mew-refile-auto-refile-skip-any-mark @kindex M-o (Summary) @kindex C-uM-o (Summary) @ifset ja 毎日メッセージをãŸãã•んもらã†äººã¯ã€ã¾ã æ•´é “ã—ã¦ã„ãªã„メッセージを +inbox (ã‚ã‚‹ã„㯠%inbox) フォルダã«å¤§é‡ã«æºœã‚ã¦ã—ã¾ã†ã“ã¨ãŒã‚りã¾ã™ã€‚ã ã‚“ãªã¨ãã¯ã€ã€Œãƒ¡ãƒƒã‚»ãƒ¼ã‚¸é”よã€ã¨ã«ã‹ãã“ã®ãƒ•ォルダã‹ã‚‰ã©ã“ã‹ã«è¡Œã£ã¦ã—ã¾ ãˆã€ã¨å«ã³ãŸããªã‚‹ã“ã¨ãŒã‚ã‚‹ã§ã—ょã†ã€‚Mew ã¯ã€ãã‚“ãªã‚ãŒã¾ã¾ãªäººã‚’満足ã•ã› ã‚‹ãŸã‚ã®è‡ªå‹•æ•´ç†æ•´é “関数をæä¾›ã—ã¦ã„ã¾ã™ã€‚:) @samp{M-o} ãŒãã®å‘ªæ–‡ã§ã™ã€‚ @end ifset @ifset en Those who receives many messages everyday is prone to store thousands of messages in the +inbox (or %inbox) folder. In such a case, they may want to speak out like this, "Hey messages, get out of the folder to somewhere". Mew provides a feature to satisfy such laziness. :) @samp{M-o} is the spell. @end ifset @ifset ja ã“ã®é–¢æ•°ã‚’実行ã™ã‚‹ã¨ã€ç¾åœ¨ã®ãƒ•ォルダ内ã®ç‰¹å®šã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã¦ã€è‡ªå‹•çš„ ã« @samp{o} マークを付ã‘ã¦ãれã¾ã™ã€‚特定ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¨ã¯ã€ @samp{mew-refile-auto-refile-skip-any-mark} ㌠@samp{nil} ãªã‚‰ã€@samp{o} ã‚„ @samp{D} マークãŒä»˜ã„ã¦ã„ãªã„メッセージã§ã™ã€‚ @samp{mew-refile-auto-refile-skip-any-mark} ㌠@samp{t} ãªã‚‰ã€ãªã«ã‚‚マー クãŒä»˜ã„ã¦ãªã„(既読)メッセージã§ã™ã€‚ @samp{mew-refile-auto-refile-skip-any-mark} ã®åˆæœŸå€¤ã¯ @samp{nil} ã§ã™ã€‚ @end ifset @ifset en When you execute this function, it marks specific messages with @samp{o}. The specific messages mean messages which are not marked with @samp{o} nor @samp{D} if @samp{mew-refile-auto-refile-skip-any-mark} is @samp{nil}. If @samp{mew-refile-auto-refile-skip-any-mark} is @samp{t}, they mean non-marked messages (i.e. read). The default value of @samp{mew-refile-auto-refile-skip-any-mark} is @samp{nil}. @end ifset @ifset ja @samp{C-uM-o} ã¯ã€@samp{mew-refile-auto-refile-skip-any-mark} ã®å€¤ã¨ã¯é–¢ ä¿‚ãªã @samp{*} マークã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’対象ã«ã—ã¾ã™ã€‚ @end ifset @ifset en @samp{C-uM-o} targets messages marked with @samp{*} regardless the value of @samp{mew-refile-auto-refile-skip-any-mark}. @end ifset @ifset ja æ•´é “å…ˆã®æ±ºå®šã«ã¯ã€å…ˆã«èª¬æ˜Žã—ãŸæŽ¨æ¸¬é–¢æ•°ç¾¤ãŒåƒãよã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ã“ã®é–¢ æ•°ã¯ã€@samp{o} を付ã‘ã‚‹ã ã‘ã§ã™ã®ã§ã€@samp{x} を押ã•ãªã„é™ã‚Šå®Ÿéš›ã«ãƒ¡ãƒƒã‚»ãƒ¼ ジãŒã©ã“ã‹ã«è¡Œã£ã¦ã—ã¾ã†ã“ã¨ã¯ã‚りã¾ã›ã‚“。 @end ifset @ifset en Refile rule is the same described in the previous section. Please note that what this function does is just mark messages with @samp{o}. Messages are not refiled until you will press @samp{x}. @end ifset @ifset ja Mew ã®æ•´é “先推測ã¯ã‚ã¾ã‚Šã«ã‚‚è³¢ã™ãŽã‚‹ã®ã§ã€ã“ã®æ©Ÿèƒ½ã«ã¯ä»‡ã¨ãªã£ã¦ã—ã¾ã„ ã¾ã™ã€‚ã¨ã„ã†ã®ã¯ã€Mew ãŒæŽ¨æ¸¬æ©Ÿèƒ½ã‚’ãƒ•ãƒ«ã«ä½¿ã£ã¦å‹æ‰‹ã«æ•´é “ã—ã¦ã—ã¾ã†ã¨ã€ 大抵ã®ãƒ¦ãƒ¼ã‚¶ã¯ã©ã“ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒæ•´é “ã•れãŸã‹åˆ†ã‹ã‚‰ãªããªã£ã¦ã—ã¾ã†ã‹ らã§ã™ã€‚:) ãã®ãŸã‚ã«ã€Mew ãŒä½¿ã†æŽ¨æ¸¬é–¢æ•°ã‚’制é™ã™ã‚‹æ©Ÿèƒ½ãŒæä¾›ã•れã¦ã„ ã¾ã™ã€‚å‰ã«å‡ºã¦ããŸå®£è¨€ã‚’ã‚‚ã†ä¸€åº¦æ€ã„出ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Mew's refile mechanism is so smart that it would be harmful for this function. That is, most users would not understand where messages have been refiled if Mew made most use of its guess mechanism. :) For this reason, break is provided to limit usage of guess functions. Recall the declaration up above. @end ifset @lisp (defvar mew-refile-guess-control '(mew-refile-guess-by-alist mew-refile-ctrl-throw mew-refile-guess-by-newsgroups mew-refile-guess-by-folder mew-refile-ctrl-throw mew-refile-ctrl-auto-boundary mew-refile-guess-by-thread mew-refile-ctrl-throw mew-refile-guess-by-from-folder mew-refile-ctrl-throw mew-refile-guess-by-from mew-refile-ctrl-throw mew-refile-guess-by-default)) @end lisp @ifset ja @samp{mew-refile-guess-control} ã®ä¸­ã« @samp{mew-refile-ctrl-auto-boundary} ã¨ã„ã†é–¢æ•°ãŒã‚りã¾ã™ã€‚ã“れãŒãã®ä»• 掛ã§ã™ã€‚è‡ªå‹•æ•´ç†æ•´é “ã®ã¨ãã«é™ã‚Šã€Mew ã¯ã“ã®é–¢æ•°ã‚ˆã‚Šä¸‹ã«è¨˜è¿°ã—ã¦ã‚る推測 を無視ã—ã¾ã™ã€‚@samp{mew-refile-ctrl-auto-boundary} より上ã«è¨˜è¿°ã—ã¦ã„ã‚‹ 関数ãŒä½•も推測ã§ããªã‹ã£ãŸå ´åˆã¯ã€ãã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã¯ @samp{o} ãŒä»˜ãã¾ã› ん。破滅ãŒè¨ªã‚Œã‚‹å‰ã« @samp{mew-refile-ctrl-auto-boundary} ã®å¾¡æœ­ã‚’è²¼ã£ã¦ 下ã•ã„。 @end ifset @ifset en You can find the @samp{mew-refile-ctrl-auto-boundary} function in @samp{mew-refile-guess-control}. Only when auto refile is used, Mew ignores guess functions below this function. If guess functions above @samp{mew-refile-ctrl-auto-boundary} didn't guess any folder for a message, the message is not marked with @samp{o}. Insert @samp{mew-refile-ctrl-auto-boundary} before you ruin. @end ifset @c %%%%%%%%%%%%%%%%% @node copy-msg, Virtual, auto-refile, Refile @ifset ja @section 世界を越ãˆãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ã‚³ãƒ”ー @end ifset @ifset en @section Copying messages across worlds @end ifset @kindex lc (Summary) @kindex mlc (Summary) @kindex li (Summary) @kindex mli (Summary) @ifset ja ã“れã¾ã§èª¬æ˜Žã—ãŸæ•´é “ã¨ã¯ã€åŒã˜ä¸–界ã®ä¸­ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’移動ã•ã›ã‚‹ã“ã¨ã§ã— ãŸã€‚ã“れã«å¯¾ã—ã€ã‚る世界ã‹ã‚‰ä»–ã®ä¸–界ã¸ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’移動ã•ã›ãŸã„ã“ã¨ã‚‚ã‚ ã‚‹ã§ã—ょã†ã€‚ã“れã¯ã€ã‚る世界ã‹ã‚‰ä»–ã®ä¸–界ã¸ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã‚³ãƒ”ーã—ã€ãã®å¾Œ å…ƒã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’削除ã™ã‚‹ã“ã¨ã§å®Ÿç¾ã§ãã¾ã™ã€‚ã“ã“ã§ã¯ã€ã‚る世界ã‹ã‚‰ä»–㮠世界ã¸ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã‚³ãƒ”ーã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ @end ifset @ifset en "Refile" described above is moving messages in the same world. By contrast, you may want to move messages from a world to another world. You can accomplish this by copying messages from a world to another and deleting the original messages. Here we describe how to copy messages to another world. @end ifset @ifset ja ã‚るフォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ローカルフォルダã¸ã‚³ãƒ”ーã—ãŸããªã‚‹ã“ã¨ãŒã‚り ã¾ã™ã€‚ã“ã®å ´åˆ @samp{lc} を利用ã—ã¦ä¸‹ã•ã„。@samp{lc} ã¯ã€ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ã‚© ルダã§å®Ÿè¡Œã•れãŸå ´åˆã€ã‚­ãƒ£ãƒƒã‚·ãƒ¥ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‹ã‚‰ã€ãã®ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ã‚© ルダã«ç‰¹æœ‰ã®æƒ…報をヘッダã‹ã‚‰å–り除ãã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダã¸ã‚³ãƒ”ーã—ã¾ã™ã€‚ (@samp{lc} ã¯ã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒ•ォルダã§ã‚‚実行ã§ãã¾ã™ã€‚ã“ã®å ´åˆã€åŒã˜ä¸–界内㧠ã®ã‚³ãƒ”ーã«ãªã‚Šã¾ã™ã€‚) @end ifset @ifset en You may want to copy a message to a local folder. For this, type @samp{lc}. If you execute @samp{lc} in a remote folder, Mew removes information related to the remote folder from the cached message and copy it to a local folder. (You can use @samp{lc} in a local folder, too. In this case, a message is moved in the same world.) @end ifset @ifset ja ã‚るフォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ IMAP ã®ãƒ•ォルダ(サーãƒå´)ã¸ã‚³ãƒ”ーã™ã‚‹ã«ã¯ã€ @samp{li} を利用ã—ã¾ã™ã€‚ @end ifset @ifset en To opy a message in a folder to an IMAP folder (the server side), type @samp{li}. @end ifset @ifset ja @samp{*} ã®ä»˜ã„ãŸè¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ローカル・フォルダã¸ã‚³ãƒ”ーã™ã‚‹ã«ã¯ @samp{mlc} を使ã„ã¾ã™ã€‚ã¾ãŸã€@samp{*} ã®ä»˜ã„ãŸè¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ IMAP フォルダã¸ã‚³ãƒ”ーã™ã‚‹ã«ã¯ @samp{mli} を利用ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en To copy messages marked with @samp{*} to a local folder, use @samp{mlc}. To copy messages marked with @samp{*} to an IMAP folder, use @samp{mli}. @end ifset @ifset ja ã‚る世界ã‹ã‚‰ä»–ã®ä¸–界ã¸ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ã‚³ãƒ”ーã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’以下ã«ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en Here is a summary of commands which copy messages from a world to another. @end ifset @table @samp @ifset ja @item lc ã‚るフォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ローカルフォルダã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ @item mlc @samp{*} ã®ä»˜ã„ãŸè¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ローカル・フォルダã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ @item li ã‚るフォルダã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ IMAP ã®ãƒ•ォルダã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ @item mli @samp{*} ã®ä»˜ã„ãŸè¤‡æ•°ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ IMAP フォルダã¸ã‚³ãƒ”ーã™ã‚‹ã€‚ @end ifset @ifset en @item lc Copy a message to a local folder. @item mlc Copy messages marked with @samp{*} to a local folder. @item li Copy a message to the server side of IMAP. @item mli Copy messages marked with @samp{*} to the server side of IMAP. @end ifset @end table @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Virtual @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Virtual, selection, copy-msg, Top @ifset ja @chapter 仮想フォルダ @end ifset @ifset en @chapter Virtual folder @end ifset @ifset ja Virtual モードã¯ã€å¿…è¦ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ãŸã‚ã®ä»®æƒ³çš„ãªãƒ•ォルダã§ã‚ りã€ã€Œã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã€ã¨ã€Œã‚¹ãƒ¬ãƒƒãƒ‰ã€ã®2種類ã«åˆ†é¡žã§ãã¾ã™ã€‚ @end ifset @ifset en Virtual mode is a virtual folder and it consists of "selection" and @w{"}thread". @end ifset @table @samp @ifset ja @item セレクション ã„ã‚ã„ã‚ãªãƒ•ォルダã‹ã‚‰å¿…è¦ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã ã‘を集ã‚ãŸä»®æƒ³ãƒ•ォルダã§ã™ã€‚フォ ルダåã®å·¦å´ã« "*" ãŒä»˜ãã¾ã™ã€‚ @item スレッド フォルダ(Summary)やセレクション(Virtual)を基ã«ã€å¯¾è©±é–¢ä¿‚を行頭æƒãˆã«ã‚ˆã£ ã¦å¯è¦–化ã—ãŸä»®æƒ³ãƒ•ォルダã§ã™ã€‚フォルダåã®ä¸¡å´ã« "*" ãŒä»˜ãã¾ã™ã€‚ @end ifset @ifset en @item Selection A virtual folder collecting necessary messages from several folders. Its folder name has "*" on the left side. @item Thread A virtual folder to visualize message flow with indentation, created from a folder or a virtual folder. Its folder name has "*" on the both sides. @end ifset @end table @ifset ja Summary モードã§åˆ©ç”¨ã§ãるコマンドã®å¤šããŒã€Virtual モードã§åˆ©ç”¨ã§ãã¾ ã™ã€‚ @end ifset @ifset en In Virtual mode, you can use most commands that you can find in Summary mode. @end ifset @ifset ja Virtual モードã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ãƒžãƒ¼ã‚¯ã‚’付ã‘ã‚‹ã¨ã€å¯¾å¿œã™ã‚‹ Summary モード㌠ã‚れã°ã€ãã¡ã‚‰ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ã‚‚マークãŒä»˜ãã¾ã™ã€‚逆ã«ã€Summary モード㧠ã‚るメッセージã«ãƒžãƒ¼ã‚¯ã‚’付ã‘ã¦ã‚‚ã€Virtual モードã®å¯¾å¿œã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« ã¯ãƒžãƒ¼ã‚¯ã¯ä»˜ãã¾ã›ã‚“。 @end ifset @ifset en If you put a mark on a message in Virtual mode and if corresponding Summary mode exists, the mark is also put onto the corresponding message there. But if you put a mark on a message in Summary mode, the mark is not put any corresponding messages in Virtual mode. @end ifset @ifset ja Virtual モードã‹ã‚‰ãƒžãƒ¼ã‚¯ã‚’処ç†ã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“。@samp{x} を押ã—マー クを処ç†ã—よã†ã¨ã™ã‚‹ã¨ã€å¯¾å¿œã™ã‚‹ Summary モードãŒã‚れã°ã€ãã¡ã‚‰ã«ç§»å‹• ã—ã€ã‚‚ã†ä¸€åº¦ @samp{x} を押ã™ã‚ˆã†ä¿ƒã•れã¾ã™ã€‚ @end ifset @ifset en You cannot process marks in Virtual mode. Even if you type @samp{x} to process marks in Virtual mode, the cursor moves to corresponding Summary mode, if exsists, and you are asked to type @samp{x} again. @end ifset @ifset ja 仮想フォルダã¯ã¾ã•ã—ã仮想ã§ã‚りã€ãƒ•ァイルシステムãªã©ã«ã¯å­˜åœ¨ã—ãªã„ã“ ã¨ã«æ³¨æ„ã—ã¦ä¸‹ã•ã„。Emacs を終了ã™ã‚‹ã¨ã€ä»®æƒ³ãƒ•ォルダã¯ãªããªã‚Šã¾ã™ã€‚ Virtual モードを消去ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€@xref{Quit} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en You should take note that Virtual folder is really virtual and it does not exist in file system. If you exit Mew, it then disappears. To know how to delete Virtual mode, please refer to @ref{Quit}. @end ifset @menu @ifset ja * selection:: セレクション * sorting:: ソート * dialog:: 対話 * search:: 検索 * condition:: 検索æ¡ä»¶ã®å…¥åŠ›æ–¹æ³• * dbsearch:: 検索エンジン * keyword:: キーワードã®å¼·èª¿ * thread:: スレッド * thread-op:: ã‚¹ãƒ¬ãƒƒãƒ‰ã®æ“作 @end ifset @ifset en * selection:: Selection * sorting:: Sorting * dialog:: Dialog * search:: Searching * condition:: How to input search conditions * dbsearch:: Search Engine * keyword:: Highlighting a keyword * thread:: Thread * thread-op:: Thread operations @end ifset @end menu @c %%%%%%%%%%%%%%%%% @node selection, sorting, Virtual, Virtual @ifset ja @section セレクション @end ifset @ifset en @section Selection @end ifset @ifset ja セレクションã¯ã€ã„ã‚ã„ã‚ãªãƒ•ォルダã‹ã‚‰å¿…è¦ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã ã‘を集ã‚ãŸä»®æƒ³ フォルダã§ã™ã€‚セレクションã®ä½œã‚Šæ–¹ã«ã¯ã€ä»¥ä¸‹ã® 5 ã¤ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en Selection is a virtual folder collecting necessary messages from several folders. There are five ways to create selection: @end ifset @table @samp @ifset ja @item m/ ã‚るフォルダã§ã€"*" マークãŒä»˜ã„ã¦ã„るメッセージã®ã¿ã‚’表示ã™ã‚‹ã€‚ @item S ã‚るフォルダã§ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ソートã—ã¦è¡¨ç¤ºã™ã‚‹ã€‚(å…ƒã®ãƒ•ォルダã«ã¯ã€ä½•ã®å½±éŸ¿ã‚‚ãªã„。) @xref{sorting} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item V ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¨å¯¾è©±é–¢ä¿‚ã«ã‚るメッセージを表示ã™ã‚‹ã€‚@xref{dialog} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item / ã‚るフォルダã‹ã‚‰ã€æ¤œç´¢æ¡ä»¶ã«åˆè‡´ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã€‚@xref{search} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item k/ ã™ã¹ã¦ã®ãƒ•ォルダã‹ã‚‰ã€æ¤œç´¢æ¡ä»¶ã«åˆè‡´ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã€‚@xref{dbsearch} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @end ifset @ifset en @item m/ Listing messages marked with @samp{*} on a folder. see @ref{sorting}. @item S Sorting messages on a folder and display them. (No effect to the original folder.) see @ref{dialog}. @item V Listing messages which have relationship with the current message. See @ref{dialog}. @item / Listing messaged matched to a search condition on a folder. see @ref{search}. @item k/ Listing messaged matched to a search condition from all folders. See @ref{search}. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node sorting, dialog, selection, Virtual @ifset ja @section ソート @end ifset @ifset en @section Sorting @end ifset @vindex mew-sort-key-alist @vindex mew-sort-default-key @vindex mew-sort-default-key-alist @kindex S (Summary) @kindex M-s (Summary) @ifset ja メッセージをソートã—セレクションを作æˆã™ã‚‹ã«ã¯ @samp{S} を使ã„ã¾ã™ã€‚ã“ ã®ã¨ã次ã®ã‚ˆã†ã«ã©ã®ãƒ•ィールドã§ã‚½ãƒ¼ãƒˆã™ã‚‹ã‹è¨Šã„ã¦ãã‚‹ã®ã§ã€ã‚½ãƒ¼ãƒˆã—㟠ã„フィールドåを入力ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en To make selection by sorting messages, use @samp{S}. Then you will be asked to input the field name as follows: @end ifset @example Sort by? (default date): @end example @ifset ja 指定ã—ãŸãƒ•ã‚£ãƒ¼ãƒ«ãƒ‰ã«æ›¸ã‹ã‚Œã¦ã„る文字列ã¯å˜ç´”ã«æ–‡å­—列比較ã§ã‚½ãƒ¼ãƒˆã™ã‚‹ã¹ ãã§ã¯ã‚りã¾ã›ã‚“。ãŸã¨ãˆã°ã€Subject: ã¯ãƒ†ã‚­ã‚¹ãƒˆã¨è€ƒãˆã¦ã‚ˆã„ã®ã§ã™ãŒã€ Date: ã¯æ—¥ä»˜ã€X-Mail-Count: ã¯æ•°å­—ã¨è€ƒãˆã¦ã‚½ãƒ¼ãƒˆã™ã¹ãã§ã™ã€‚ã“ã®ã‚ˆã†ã« 文字列をã©ã†å–り扱ã†ã‹ã‚’モードã¨ã„ã„ã¾ã™ã€‚ソートã«ã‚ˆã指定ã•れるフィー ルドåã«å¯¾ã™ã‚‹ãƒ¢ãƒ¼ãƒ‰ã¯ @samp{mew-sort-key-alist} ã§è¨­å®šã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en There are some cases where strings stored in the specified field should not be compared as text. For example, while Subject: can be considered as text, Date: and X-Mail-Count: should be treated as date and number, respectively. In this way, we call the distinctions in methods of string sorting "modes". Default modes for typical field names are configured in @samp{mew-sort-key-alist}. @end ifset @ifset ja ソートã®ãƒ¢ãƒ¼ãƒ‰ã‚’æ˜Žç¤ºçš„ã«æŒ‡å®šã€å¤‰æ›´ã—ãŸã„å ´åˆã«ã¯ @samp{:} ã§åŒºåˆ‡ã£ã¦æŒ‡å®š ã—ã¾ã™ã€‚ãŸã¨ãˆã° X-Mail-Count: フィールドã®å†…容を(テキストã¨ã—ã¦ã§ã¯ãªã) 数値ã¨ã¿ãªã—ã¦ã‚½ãƒ¼ãƒˆã—ãŸã„å ´åˆã«ã¯ã€æ¬¡ã®ã‚ˆã†ã«å…¥åŠ›ã—ã¾ã™ã€‚ @end ifset @ifset en When you want to specify the mode of sorting, the mode is followed by @samp{:}. For example, to sort with the X-Mail-Count: field as arithmetic value (not text), input like this: @end ifset @example x-mail-count:num @end example @ifset ja フィールドåやモード㯠@samp{TAB} ã§è£œå®Œã§ãã¾ã™ã€‚ @end ifset @ifset en You can complete field names and modes with @samp{TAB}. @end ifset @ifset ja モードã«ã¯ã€ä»¥ä¸‹ã® 4 ã¤ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en Mew provides four modes for sorting: @end ifset @table @samp @ifset ja @item text 先頭㮠"Re: " ã‚„ "Fw: " ã‚’å–り除ã„ãŸæ–‡å­—列。 @item ml text ã¨åŒã˜ã§ã‚ã‚‹ãŒã€ã•らã«ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆç‰¹æœ‰ã®æ–‡å­—列もå–り除ã。 @item num 数値。 @item date 日付。 @end ifset @ifset en @item text String with preceding "Re: " and or "Fw: " removed. @item ml The same as text but preceding mailing-list-string removed. @item num Number. @item date Date. @end ifset @end table @ifset ja "Sort by?" ã¨è¨Šã‹ã‚Œã‚‹éš›ã®ãƒ•ィールドåã®åˆæœŸå€¤ã¯ã€ @samp{mew-sort-default-key} ã§è¨­å®šã§ãã¾ã™ã€‚以下ã¯ã€åˆæœŸå€¤ã§ã‚ã‚‹"date" ã‚’ @w{"}x-ml-count" ã«å¤‰æ›´ã™ã‚‹ä¾‹ã§ã™ã€‚ @end ifset @ifset en The default field name, your response to the prompt "Sort by?", can be specified in @samp{mew-sort-default-key}. The following example changes the default value from "date" to "x-ml-count". @end ifset @lisp (setq mew-sort-default-key "x-ml-count") @end lisp @ifset ja @samp{mew-sort-default-key-alist} ã§ã€ãƒ•ォルダã”ã¨ã«ãƒ•ィールドåã®åˆæœŸ 値を設定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“ã“ã§æŒ‡å®šã—ãªã‹ã£ãŸãƒ•ォルダã§ã¯ã€ãƒ•ィール ドåã®åˆæœŸå€¤ã¨ã—㦠@samp{mew-sort-default-key} ã®å€¤ãŒä½¿ã‚れã¾ã™ã€‚以下ã¯ã€ +inbox フォルダã§ã®åˆæœŸå€¤ã‚’ "subject" ã«ã€+mew-dist フォルダã§ã®åˆæœŸå€¤ ã‚’ @w{"}x-mail-count" ã«å¤‰æ›´ã™ã‚‹ä¾‹ã§ã™ã€‚ @end ifset @ifset en You can also set a default field name for each folder by @samp{mew-sort-default-key-alist}. For folders not explicitly specified here, @samp{mew-sort-default-key} is used for their default field name. The following is an example that specifies "subject" for the +inbox folder and "x-mail-count" for the +mew-dist folder. @end ifset @lisp (setq mew-sort-default-key-alist '(("+inbox" "subject") ("+mew-dist" "x-mail-count"))) @end lisp @ifset ja ãªãŠã€ãƒ­ãƒ¼ã‚«ãƒ«ãƒ»ãƒ•ォルダã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’本当ã«ã‚½ãƒ¼ãƒˆã™ã‚‹ãŸã‚ã«ã¯ @samp{M-s} を使ã£ã¦ä¸‹ã•ã„。ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ãƒªãƒ¢ãƒ¼ãƒˆãƒ»ãƒ•ォルダã§ã¯åˆ©ç”¨ã§ ãã¾ã›ã‚“。 @end ifset @ifset en To really sort messages in a local folder, use @samp{M-s}. This command is not available in remote folders. @end ifset @c %%%%%%%%%%%%%%%%% @node dialog, search, sorting, Virtual @ifset ja @section 対話 @end ifset @ifset en @section Dialog @end ifset @kindex V (Summary) @kindex kI (Summary) @kindex C-ukI (Summary) @ifset ja Mew ã§ã¯ã€ã‚るメッセージã«é–¢ä¿‚ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã•ã¾ã–ã¾ãªãƒ•ォルダã‹ã‚‰é›† ã‚ã¦ä»®æƒ³ãƒ•ォルダã«ä¸€è¦§è¡¨ç¤ºã§ãã¾ã™ã€‚ã“れを「対話ã€ã¨å‘¼ã³ã¾ã—ょã†ã€‚後㻠ã©èª¬æ˜Žã™ã‚‹ã‚¹ãƒ¬ãƒƒãƒ‰(@xref{thread})ã¨ã¯ã€ä»¥ä¸‹ã®ç‚¹ã§ç•°ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en Mew can list messages which have relationship with the current message. Let's call this "dialog". This is different from thread described later in the following points: @end ifset @itemize @minus @ifset ja @item スレッドã¯ã€1ã¤ã®ãƒ•ォルダ/仮想フォルダã«å¯¾ã—ã¦ã®ã¿ä½œæˆã§ãる。対話ã¯ã€ 関連ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒè¤‡æ•°ã®ãƒ•ã‚©ãƒ«ãƒ€ã«æ•£ã‚‰ã°ã£ã¦ã„ã¦ã‚‚よã„。 @item スレッドã¯ã€è¡Œé ­æƒãˆã«ã‚ˆã£ã¦æœ¨æ§‹é€ ã‚’å¯è¦–化ã™ã‚‹ã€‚対話ã¯ã€æ—¥ä»˜é †ã«ä¸€è¦§è¡¨ 示ã™ã‚‹ã€‚ @end ifset @ifset en @item Thread can be made from one folder or one virtual folder. Messages relating to dialog can ubiquitously exists in several folders. @item Thread visualizes tree structres with indentation. while dialog lists up messages in order of time. @end ifset @end itemize @ifset ja å¯¾è©±ã®æ©Ÿèƒ½ã‚’使ã†ã«ã¯ã€ã¾ãš @samp{kI} を実行ã—ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’作る必è¦ãŒ ã‚りã¾ã™ã€‚æ–°ã—ã届ãメッセージã¯ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã«å…¥ã‚‰ãªã„ã®ã§ã€@samp{kI} ã¯å®šæœŸçš„ã«å®Ÿè¡Œã—ã¦ä¸‹ã•ã„。@samp{kI} ã¯ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’差分更新ã—ã¾ã™ã€‚ ã“ã®æ–¹å¼ã¯æ—©ã„ã®ã§ã™ãŒã€ã‚´ãƒŸãŒæ®‹ã‚‹ã“ã¨ã¯é¿ã‘られãªã„ã®ã§ã€ã¨ãã©ã @samp{C-ukI} を実行ã—ã€ãƒ‡ãƒ¼ã‚¿ãƒ™ãƒ¼ã‚¹ã‚’一ã‹ã‚‰ä½œã‚Šç›´ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en To use the feature of dialog, execute @samp{kI} to create database. New messages are not automatically registered in to the database, you should periodically execute @samp{kI}. @samp{kI} updates the database incrementally by default. This method is fast but garbages are left. So, sometime you should type @samp{C-ukI} to update the database fully. @end ifset @ifset ja 対話を作æˆã™ã‚‹ã«ã¯ã€æ³¨ç›®ã—ã¦ã„るメッセージã®ä¸Šã§ @samp{V} を押ã—ã¾ã™ã€‚ ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€è‡ªåˆ†ã®å­å­«ã¨ã€è‡ªåˆ†ã®å…ˆç¥–ã€ãã—ã¦è‡ªåˆ†ã ã‘を表示ã—ã¾ã™ã€‚ 自分ã®å…„弟ãªã©ã¯è¡¨ç¤ºã—ã¾ã›ã‚“。一æ—全体を表示ã—ãŸã„ãªã‚‰ã€ä¸€æ—¦ä½œã£ãŸä»®æƒ³ フォルダã®ä¸€ç•ªä¸Šã«ã‚るメッセージã€ã™ãªã‚ã¡ä¸€æ—ã®ç¥–ã®ä¸Šã§ã€ã‚‚ã†ä¸€åº¦ @samp{V} を実行ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en To make dialog, type @samp{V} on the current message. This command displays him, his ancestors, and his children only. His brothers and so on are not shown. If you display the entire of the family, type @samp{V} again on the first message of the dialog, which is the origin of the family. @end ifset @c %%%%%%%%%%%%%%%%% @node search, condition, dialog, Virtual @ifset ja @section 検索 @end ifset @ifset en @section Searching @end ifset @kindex ? (Summary) @kindex C-u? (Summary) @kindex / (Summary) @kindex C-u/ (Summary) @kindex k? (Summary) @kindex k/ (Summary) @kindex C-uk/ (Summary) @ifset ja Mew ã§ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ãªãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æ¤œç´¢æ©Ÿèƒ½ã‚’æä¾›ã—ã¦ã„ã¾ã™ã€‚ @end ifset @ifset en Mew provides the following method to search messages: @end ifset @table @samp @ifset ja @item ? ç¾åœ¨ã®ãƒ•ォルダã§ã€æ¡ä»¶ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« @samp{*} マークを付ã‘る。 入力ã•ã‚ŒãŸæ¡ä»¶ã«ã‚ˆã£ã¦ã€@samp{mewl} ã‹ @samp{grep} ã®ã©ã¡ã‚‰ã‹ãŒå‘¼ã°ã‚Œã‚‹ã€‚ @item C-u? リージョンを指定ã—㟠@samp{?}。 @item / ç¾åœ¨ã®ãƒ•ォルダã§ã€æ¡ä»¶ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‹ã‚‰ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã‚’作る。入力 ã•ã‚ŒãŸæ¡ä»¶ã«ã‚ˆã£ã¦ã€@samp{mewl} ã‹ @samp{grep} ã®ã©ã¡ã‚‰ã‹ãŒå‘¼ã°ã‚Œã‚‹ã€‚ @item C-u/ リージョンを指定ã—㟠@samp{/}。 @end ifset @ifset en @item ? Put the @samp{*} mark onto messages in this folder, which are matched to a specified pattern. Either @samp{mewl} or @samp{grep} is called according to the specified pattern. @item C-u? @samp{?} with a region specified. @item / Make selection with messages in this folder, which are matched to a specified pattern. Either @samp{mewl} or @samp{grep} is called according to the specified pattern. @item C-u/ @samp{/} with a region specified. @end ifset @end table @ifset ja ã¾ãŸã€Spotlight ã‚„ Windows Desktop Search ãªã©ã®æ¤œç´¢ã‚¨ãƒ³ã‚¸ãƒ³ã‚’利用ã—㟠検索もå¯èƒ½ã§ã™ã€‚ã“れã«ã¯ã€ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en We can also search messages with a search engine, including Spotlight, Windows Desktop Search, etc. This feature is supported by the following commands. @end ifset @table @samp @ifset ja @item k? ç¾åœ¨ã®ãƒ•ォルダã§ã€æ¡ä»¶ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã« @samp{*} マークを付ã‘る。 @item k/ 全フォルダã«å¯¾ã—ã€æ¡ä»¶ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‹ã‚‰ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã‚’作る。 @item C-uk/ 指定ã•れãŸãƒ•ォルダã«å¯¾ã—ã€æ¡ä»¶ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‹ã‚‰ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã‚’作 る。フォルダを複数指定ã™ã‚‹ã«ã¯ "," ã§åŒºåˆ‡ã‚‹ã€‚ワイルドカードã¨ã—ã¦ã€"*" を利用ã§ãる。 @end ifset @ifset en @item k? Put the @samp{*} mark onto messages in this folder, which are matched to a specified pattern. @item k/ Make selection with messages in all folders, which are matched to a specified pattern. @item C-uk/ Make selection with messages in specified folders, which are matched to a specified pattern. If you want to specify multiple folders, separate them with ",". You can also use a wildcar "*". @end ifset @end table @c %%%%%%%%%%%%%%%%% @node condition, dbsearch, search, Virtual @ifset ja @section 検索æ¡ä»¶ã®å…¥åŠ›æ–¹æ³• @end ifset @ifset en @section How to input search conditions @end ifset @vindex mew-pick-pattern-list @vindex mew-prog-grep @vindex mew-prog-grep-opts @ifset ja @samp{?} ã‚„ @samp{/} を実行ã™ã‚‹ã¨ã€Mew ã¯ãƒ¦ãƒ¼ã‚¶ã«å¯¾ã—以下ã®ã‚ˆã†ã«æ¤œç´¢ã® パターンを訊ãã¾ã™ã€‚ @end ifset @ifset en If you type @samp{?} or @samp{/}, Mew asks you to input search pattern as follows: @end ifset @example mewl/grep pick pattern: @end example @ifset ja å˜ç´”ã«ã€Œæ–‡å­—列ã€ã‚’ 1 ã¤å…¥åŠ›ã™ã‚‹ã¨ã€Mew 㯠@samp{grep} を呼ã³å‡ºã—ã¾ã™ã€‚ã¾ ãŸã€ã€Œæ¡ä»¶å¼ã€ã‚’入力ã™ã‚‹ã¨ã€@samp{mewl} を呼ã³å‡ºã—ã¾ã™ã€‚ @end ifset @ifset en If you specify just a keyword, Mew executes @samp{grep}. On the contrast if you type an expression, Mew calls @samp{mewl}. @end ifset @ifset ja æ¡ä»¶å¼ã®æ›¸å¼ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚(çµåˆåŠ›ã®å¼·ã„é †ã«ä¸¦ã‚“ã§ã„ã¾ã™ã€‚) @end ifset @ifset en Here is a list of expression elements. (In the strong order) @end ifset @table @samp @ifset ja @item field=string フィールド field ã«æ–‡å­—列 string ãŒå«ã¾ã‚Œã¦ã„ã‚‹ã¨ãマッãƒ(å¤§æ–‡å­—å°æ–‡å­—ã‚’ 区別ã—ãªã„)。field ã« "head" を指定ã—ãŸå ´åˆã¯ã€ãƒ˜ãƒƒãƒ€å…¨ä½“ã‚’æ„味ã™ã‚‹ã€‚ @item field==string フィールド field ã«æ–‡å­—列 string ãŒå«ã¾ã‚Œã¦ã„ã‚‹ã¨ãマッãƒ(å¤§æ–‡å­—å°æ–‡å­—ã‚’ 区別ã™ã‚‹)。field ã« "head" を指定ã—ãŸå ´åˆã¯ã€ãƒ˜ãƒƒãƒ€å…¨ä½“ã‚’æ„味ã™ã‚‹ã€‚ @item field!=string フィールド field ã«æ–‡å­—列 string ãŒå«ã¾ã‚Œã¦ã„ãªã„ã¨ãマッãƒ(å¤§æ–‡å­—å°æ–‡å­— を区別ã—ãªã„)。field ã« "head" を指定ã—ãŸå ´åˆã¯ã€ãƒ˜ãƒƒãƒ€å…¨ä½“ã‚’æ„味ã™ã‚‹ã€‚ @item field!==string フィールド field ã«æ–‡å­—列 string ãŒå«ã¾ã‚Œã¦ã„ãªã„ã¨ãマッãƒ(å¤§æ–‡å­—å°æ–‡å­— を区別ã™ã‚‹)。field ã« "head" を指定ã—ãŸå ´åˆã¯ã€ãƒ˜ãƒƒãƒ€å…¨ä½“ã‚’æ„味ã™ã‚‹ã€‚ @item ( ) ã®å†…容を先ã«è©•価。 @item ! ã§ãªã„ã¨ãマッãƒã€‚ @item & ã‹ã¤ ã®ã¨ãマッãƒã€‚çœç•¥å¯èƒ½ã€‚ @item | ã¾ãŸã¯ ã®ã¨ãマッãƒã€‚ @end ifset @ifset en @item field=string Match if the "field" field contains the "string" string (case-insensitive). If you specify "head", it means the entire header. @item field==string Match if the "field" field contains the "string" string (case-sensitive). If you specify "head", it means the entire header. @item field!=string Match if the "field" field does not the "string" string (case-insensitive). If you specify "head", it means the entire header. @item field!==string Match if the "field" field does not the "string" string (case-sensitive). If you specify "head", it means the entire header. @item ( ) Evaluate first. @item ! Match if not . @item & Match if AND . You can omit this. @item | Match if OR . @end ifset @end table @ifset ja 以下ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en Some examples are shown below. @end ifset @ifset ja (a) From: ã« kazu ãŒå«ã¾ã‚Œã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ @end ifset @ifset en (a) Messages whose From: contains "kazu". @end ifset @example from=kazu @end example @ifset ja (b) To: ㌠mewã€ã¾ãŸã¯ã€Cc: ㌠mew ã§ã‚るメッセージ @end ifset @ifset en (b) Messages whose To: contains "mew" OR Cc: contains "mew". @end ifset @example to=mew | cc=mew @end example @ifset ja (c) To: ㌠mewã€ã¾ãŸã¯ã€Cc: ㌠mew ã§ã€ã‹ã¤ã€from ㌠kazu ã§ã‚ã‚‹ メッセージ @end ifset @ifset en (c) Messages whose To: contains "mew" OR Cc: contains "mew" AND From: contains "kazu". @end ifset @example (to=mew | cc=mew) & from=kazu @end example @ifset ja @samp{?} ã‚„ @samp{/} ã§ã€ãƒ‘ターンã«å…¥åŠ›ã®éš›ã«å˜ç´”ã« @samp{RET} を押ã™ã¨ã€ 以下ã®ã‚ˆã†ã«åˆ©ç”¨ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã¾ã§å…¥åŠ›ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en When you execute @samp{?} or @samp{/} and if you just type @samp{RET} to a pattern, you can specify a command to be executed. @end ifset @example Cmd opts pattern: grep -l -e @end example @ifset ja @samp{k?} ã‚„ @samp{k/} ã§æ¤œç´¢ã‚¨ãƒ³ã‚¸ãƒ³ã‚’利用ã™ã‚‹å ´åˆã¯ã€ä¸Šè¨˜ã®ãƒ‘ターン(文字 列やæ¡ä»¶å¼)ãŒè‡ªå‹•çš„ã«æ¤œç´¢ã‚¨ãƒ³ã‚¸ãƒ³ã®æ›¸å¼ã«å¤‰æ›ã•れã¾ã™ã€‚ @end ifset @ifset en When you use an search engine with @samp{k?} or @samp{k/}, the pattern (including just a keyword and an expression) will be converted to the syntax of the search engine. @end ifset @ifset ja ãŸã¨ãˆã°ã€kazu ã‹ã‚‰æ¥ãŸãƒ¡ãƒ¼ãƒ«ã§ã€ã€Œwineã€ã‚’å«ã¿ã€ã‹ã¤ã€Œbordeauxã€ã‚’å«ã¾ ãªã„ã¨ã„ã†æ¡ä»¶å¼ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«æ›¸ãã¾ã™ã€‚ @end ifset @ifset en For example, you can write an expression, that From: is "kazu" and body contains "wine" but does not contain "bordeaux", as follows: @end ifset @example from=kazu wine ! bordeaux @end example @ifset ja ãªãŠã€@samp{mew-pick-pattern-list} ã«ãƒ‘ターンã®ãƒªã‚¹ãƒˆã‚’定義ã—ã¦ãŠãã¨ã€ @samp{C-cTAB} ã§å„è¦ç´ ã‚’循環的ã«è£œå®Œã§ãã¾ã™ã€‚ã“ã®å ´åˆã€ãƒªã‚¹ãƒˆã®å…ˆé ­ãŒ デフォルトã¨ã—ã¦è¡¨ç¤ºã•れã¾ã™ã€‚ @end ifset @ifset en If you set @samp{mew-pick-pattern-list} to a list of pattern, you can enjoy circular completion with @samp{C-cTAB}. In this case, the first member is displayed as a default value. @end ifset @ifset ja 日本語ã®å…¨æ–‡æ¤œç´¢ã‚’ã—ãŸã„å ´åˆã¯ã€("grep" ã®ä»£ã‚りã«) "mg" をインストール ã—ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 @lisp (setq mew-prog-grep "mg") (setq mew-prog-grep-opts '("-j" "jis" "-l" "-e" "-x" "&mime")) @end lisp @end ifset @c %%%%%%%%%%%%%%%%% @node dbsearch, keyword, condition, Virtual @ifset ja @section 検索エンジン @end ifset @ifset en @section Search Engine @end ifset @kindex km @kindex kM @kindex kc @vindex mew-search-method @ifset ja 検索エンジンをæ“作ã™ã‚‹ãŸã‚ã«ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en To operate search engines, the following commands are provided: @end ifset @table @samp @ifset ja @item km ãã®ãƒ•ォルダã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’作る。 @item kM 全体ã®ãƒ•ォルダã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’作る。ã‚ã‚‹ã„ã¯ã€ä½œã‚‹ãŸã‚ã«åˆæœŸåŒ–ã™ã‚‹ã€‚ @item kc 検索エンジンを切り替ãˆã‚‹ã€‚ @end ifset @ifset en @item km Make index for the current folder. @item kM Make index for all folders. @item kc Switch one search engine to another. @end ifset @end table @ifset ja 以下ã«ã€ãれãžã‚Œã®æ¤œç´¢ã‚¨ãƒ³ã‚¸ãƒ³ã®èª¬æ˜Žã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en The followings are expiation of each search engines. @end ifset @table @samp @ifset ja @item Hyper Estraier 定期的㫠@samp{kM} を実行ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚コマンドラインã§ã€ "mewest" を実行ã—ã¦ã‚‚æ§‹ã„ã¾ã›ã‚“。ã‚るフォルダã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ã‚’急ã„ã§æ›´æ–° ã—ãŸã„ãªã‚‰ @samp{km} ã§ã‚‚よã„ã§ã—ょã†ã€‚@samp{k?} ã¨@samp{k/} ã®ä¸¡æ–¹ãŒåˆ© 用ã§ãã¾ã™ã€‚@samp{C-uk/}ã§ãƒ•ォルダを指定ã™ã‚‹ã¨ã€ã‚µãƒ–ディレクトリも検索 ã«ãªã‚Šã¾ã™ã€‚ @item Spotlight 一度ã ã‘ @samp{kM} を実行ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚@samp{km} ã¯å¿…è¦ã‚りã¾ã›ã‚“。 @samp{k?} 㨠@samp{k/} ã®ä¸¡æ–¹ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚ @item Windows Desktop Search 一度ã ã‘ @samp{kM} を実行ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚@samp{km} ã¯å¿…è¦ã‚りã¾ã›ã‚“。 @item Google Desktop 一度ã ã‘ @samp{kM} を実行ã™ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚@samp{km} ã¯å¿…è¦ã‚りã¾ã›ã‚“。 @samp{k/} ã®ã¿ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚ @end ifset @ifset en @item Hyper Estraier Type @samp{kM} periodically. It's OK to execute "mewest" on the command line instead. If you want to update the index for the current folder quickly, you can use @samp{km}. Both @samp{k?} and @samp{k/} are available. When you specify folders with @samp{C-uk/}, sub-folders, if any, are included in the target. @item Spotlight Type @samp{kM} just once. @samp{km} is not necessary. Both @samp{k?} and @samp{k/} are available. @item Windows Desktop Search Type @samp{kM} just once. @samp{km} is not necessary. @item Google Desktop Type @samp{kM} just once. @samp{km} is not necessary. Only @samp{k/} is available. @end ifset @end table @ifset ja 検索エンジンã®åˆæœŸå€¤ã¯ã€æœ€åˆã«è¦‹ã¤ã‹ã£ãŸåˆ©ç”¨ã§ãã‚‹ã‚‚ã®ã«è‡ªå‹•çš„ã«è¨­å®šã• れã¾ã™ã€‚æ˜Žç¤ºçš„ã«æŒ‡å®šã—ãŸã„å ´åˆã¯ã€@samp{mew-search-method} ã«'estã€'spotlightã€'wds, 'google ã®ã©ã‚Œã‹ã‚’指定ã—ã¦ä¸‹ã•ã„。以下ã¯ã€ Hyper Estraier ã«è¨­å®šã™ã‚‹ä¾‹ã§ã™ã€‚ @end ifset @ifset en The default search engine is automatically set to the one found first. If you explicitly specify it, set @samp{mew-search-method} to one out of 'est, 'spotlight, 'wds, and 'google. The following is an example to choose Hyper Estraier. @end ifset @lisp (setq mew-search-method 'est) @end lisp @c %%%%%%%%%%%%%%%%% @node keyword, thread, dbsearch, Virtual @ifset ja @section キーワードã®å¼·èª¿ @end ifset @ifset en @section Highlighting a keyword @end ifset @kindex M-n (Summary) @kindex C-uM-n (Summary) @kindex M-p (Summary) @kindex C-uM-p (Summary) @ifset ja 検索ã«ä½¿ã£ãŸã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã¯ã€ãƒãƒƒãƒ•ã‚¡ã«ä¿å­˜ã•れã¦ã„ã¾ã™ã€‚メッセージを表示 ã—ã€ã•らã«ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’ãƒã‚¤ãƒ©ã‚¤ãƒˆã™ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“ã®æ©Ÿèƒ½ã‚’æä¾›ã™ã‚‹ コマンドã¯ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ @end ifset @ifset en The keyword which you specified on search is shorted in a buffer. You can display messages with the keyword highlighted. The commands to enable this functionality are as follows: @end ifset @table @samp @ifset ja @item M-n 下方å‘ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ç§»å‹•ã—キーワードをãƒã‚¤ãƒ©ã‚¤ãƒˆã—ã¦è¡¨ç¤ºã€‚Summary モー ドã§ã¯ @samp{*} マークã®ã¤ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã€Virtual モードã§ã¯ã™ã¹ã¦ã® メッセージãŒå¯¾è±¡ã¨ãªã‚‹ã€‚ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’繰り返ã—利用ã™ã‚‹ã¨ã€ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã® ä»˜è¿‘ãŒæ¬¡ã€…ã¨è¡¨ç¤ºã•れã¦ã„ã。キーワードãŒè¨­å®šã•れã¦ã„ãªã„ãªã‚‰ã€ãƒ¦ãƒ¼ã‚¶ ã«ã‚­ãƒ¼ãƒ¯ãƒ¼ãƒ‰ã‚’訊ã。 @item C-uM-n キーワードを明示的ã«è¨­å®šã§ãã‚‹ã“ã¨ä»¥å¤–ã¯ã€@samp{M-n} ã«åŒã˜ã€‚ @item M-p @samp{M-n} を逆方å‘ã«ã—ãŸã‚³ãƒžãƒ³ãƒ‰ã€‚ @item C-uM-p @samp{C-uM-n} を逆方å‘ã«ã—ãŸã‚³ãƒžãƒ³ãƒ‰ã€‚ @end ifset @ifset en @item M-n Display a message in the forward direction and find a keyword and highlight it. In Summary mode, the target is messages marked with @samp{*}. In Virtual mode, it is all messages. If you repeat this command, text around the keyword is displayed from one to another. If no key word is set to the variable, this command first asks you a keyword. @item C-uM-n The same as @samp{M-n} except that you can change the stored keyword explicitly. @item M-p A reverse version of @samp{M-n}. @item C-uM-p A reverse version of @samp{C-uM-n}. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node thread, thread-op, keyword, Virtual @ifset ja @section スレッド @end ifset @ifset en @section Thread @end ifset @vindex mew-use-thread-separator @vindex mew-thread-separator @kindex tt (Summary) @kindex C-utt (Summary) @kindex mt (Summary) @kindex tr (Summary) @kindex tp (Virtual) @kindex tn (Virtual) @kindex ^ (Virtual) @kindex & (Virtual) @kindex ( (Virtual) @kindex ) (Virtual) @kindex t* (Virtual) @kindex t@ (Virtual) @kindex td (Virtual) @kindex tM-d (Virtual) @kindex to (Virtual) @kindex tu (Virtual) @kindex tSPC (Virtual) @kindex ta (Virtual) @kindex tg (Virtual) @ifset ja メッセージをやりã¨ã‚Šã—ã¦ã„ã‚‹ã¨ã€å¯¾è©±ã®æµã‚Œã¯æœ¨æ§‹é€ ã«ãªã‚Šã¾ã™ã€‚ã“れを行 é ­æƒãˆã«ã‚ˆã‚Šå¯è¦–化ã—ãŸã‚‚ã®ã‚’スレッドã¨å‘¼ã³ã¾ã™ã€‚以下ã«ã‚¹ãƒ¬ãƒƒãƒ‰ã®ä¾‹ã‚’示 ã—ã¾ã™ã€‚ @end ifset @ifset en When in the process of exchanging messages, the relationship of the messages is presented in a tree structure. Visualization of the structure with indentation is called thread. Here is an example: @end ifset @example @ifset ja 03/12 Hidenori Ohta 今週末 |日曜ã«ã‚¹ãƒˆãƒ¼ãƒ³ãƒžã‚¸ãƒƒã‚¯ 03/13 ã‹ãšãã‚“ ┣Re: 今週末 |雨ãªã®ã§ã€ä¸­ã«ã—ã¾ã™ã‹ 03/15 Hidenori Ohta ┃┗Re: 今週末 |ãれã§ã¯ã€12:00 ã«é›†åˆ 03/14 ãŠã ã¡ã‚ƒã‚“ â”—Re: 今週末 |ã„ã„ã­ã‡ã€‚次ã¯ã‚ã‚Œã‚’è½ @end ifset @ifset en 03/12 Hidenori Ohta This weekend |Let's go to StoneMagic 03/13 Kazu-kun +Re: This weekend |Since it'll be rainy, 03/15 Hidenori Ohta | +Re: This weekend |OK. Get together at 12 03/14 Oda-chan +Re: This weekend |Sounds lovely. I'd lik @end ifset @end example @ifset ja スレッドã¯ä»®æƒ³ãƒ•ォルダã¨ã—ã¦å®Ÿç¾ã•れã¦ã„ã¾ã™ã€‚ãŸã¨ãˆã°ã€+inbox ã«å¯¾ã—ス レッドを作るã¨ã€*+inbox* ã¨ã„ã†ãƒãƒƒãƒ•ã‚¡ãŒç”¨æ„ã•れã¾ã™ã€‚ @end ifset @ifset en The thread feature is implemented as virtual folder. For instance, if you make threads for +inbox, a buffer *+inbox* is prepared. @end ifset @ifset ja スレッドを作るãŸã‚ã«ã€ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en To make thread, the following commands exist. @end ifset @table @samp @ifset ja @item tt Summary モードã€ã‚ã‚‹ã¯ã€ã‚»ãƒ¬ã‚¯ã‚·ãƒ§ãƒ³ã‹ã‚‰ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’作る。ãã—ã¦ã€ã‚«ãƒ¼ã‚½ ルをç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã™ã‚‹ã€‚ã‚‚ã—ã€å¯¾å¿œã™ã‚‹ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã™ã§ã«å­˜åœ¨ã—㦠ã„ã‚‹ãªã‚‰ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã«è¡¨ç¤ºã‚’切り替ãˆã‚‹ã€‚スレッドã§ä½¿ç”¨ã•れãŸéš›ã¯ã€å…ƒã®ãƒ•ã‚© ルダã¸ç§»ã‚Šã€ã‚«ãƒ¼ã‚½ãƒ«ã‚’ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã¸ç§»å‹•ã™ã‚‹ã€‚ @item C-utt リージョンã«å¯¾ã—ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’作る。 @item mt @samp{*} マークã®ä»˜ã„ã¦ã„るメッセージã«å¯¾ã—ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’作る。 @item tr æ­£è¦è¡¨ç¾ã«åˆè‡´ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«å¯¾ã—ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’作る。 @end ifset @ifset en @item tt Make threads from Summary mode or selection and move the cursor to the current message. If corresponding threads already exist, switch to the Virtual mode. When this command is executed on threads, switch to the original folder and move the cursor to the current message. @item C-utt Make threads for messages in the region. @item mt Make threads for messages marked with @samp{*}. @item tr Make threads for messages matched to a regular expression. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node thread-op, Quit, thread, Virtual @ifset ja @section ã‚¹ãƒ¬ãƒƒãƒ‰ã®æ“作 @end ifset @ifset en @section Thread operations @end ifset @ifset ja スレッドã«ç‰¹åŒ–ã—ãŸç§»å‹•コマンドを以下ã«ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en Here are the commands used for moving to thread presentation. @end ifset @table @samp @ifset ja @item tp ç¾åœ¨ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®é ­ã«ç§»å‹•ã™ã‚‹ã€‚ã‚‚ã—ã€ã‚るスレッドã®é ­ã«ã‚«ãƒ¼ã‚½ãƒ«ãŒã‚ã‚‹å ´åˆ ã¯ã€å‰ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®é ­ã«ç§»å‹•ã™ã‚‹ã€‚ @item tn 次ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®é ­ã«ç§»å‹•ã™ã‚‹ã€‚ @item ^ 親ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã™ã‚‹ã€‚(スレッドã§ãªãã¦ã‚‚利用å¯èƒ½) @item & é•·ç”·ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã™ã‚‹ã€‚(スレッドã§ãªãã¦ã‚‚利用å¯èƒ½) @item ( å…„ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã™ã‚‹ã€‚ @item ) 弟ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«ç§»å‹•ã™ã‚‹ã€‚ @end ifset @ifset en @item tp Move to the top of the current thread. If the current message is a top node, move to the top of the next thread. @item tn Move to the top of the next thread. @item ^ Move to the parent message of the current message. (Available in both Summary and Virtual) @item & Move to the child message of the current message. (Available in both Summary and Virtual) @item ( Search backward by one sibling message of the current message. @item ) Search forward by one sibling message of the current message. @end ifset @end table @ifset ja スレッドã«ãƒžãƒ¼ã‚¯ã‚’付ã‘るコマンドを以下ã«ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en Here are commands to mark messages in a thread. @end ifset @table @samp @ifset ja @item t* ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é ­ã¨ã™ã‚‹éƒ¨åˆ†æœ¨ã«å±žã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã™ã¹ã¦ã« @samp{*} マー クを付ã‘る。詳ã—ã㯠@xref{target mark} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item t$ ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é ­ã¨ã™ã‚‹éƒ¨åˆ†æœ¨ã«å±žã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã™ã¹ã¦ã« @samp{$} マー クを付ã‘る。詳ã—ã㯠@xref{escape mark} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item td ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é ­ã¨ã™ã‚‹éƒ¨åˆ†æœ¨ã«å±žã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã™ã¹ã¦ã« @samp{D} マー クを付ã‘る。詳ã—ã㯠@xref{delete mark} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item tM-d ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é ­ã¨ã™ã‚‹éƒ¨åˆ†æœ¨ã«å±žã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã™ã¹ã¦ã« @samp{X} マー クを付ã‘る。詳ã—ã㯠@xref{delete mark} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item to ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é ­ã¨ã™ã‚‹éƒ¨åˆ†æœ¨ã«å±žã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã™ã¹ã¦ã« @samp{o} マー クを付ã‘る。詳ã—ã㯠@xref{refile mark} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @end ifset @ifset en @item t* Put the @samp{*} mark all messages of the current sub-thread. Please refer to @ref{target mark} for more information. @item t$ Put the @samp{$} mark all messages of the current sub-thread. Please refer to @ref{escape mark} for more information. @item td Put the @samp{D} mark all messages of the current sub-thread. Please refer to @ref{delete mark} for more information. @item tM-d Put the @samp{X} mark all messages of the current sub-thread. Please refer to @ref{delete mark} for more information. @item to Put the @samp{o} mark all messages of the current sub-thread. Please refer to @ref{refile mark} for more information. @end ifset @end table @ifset ja スレッドã‹ã‚‰ãƒžãƒ¼ã‚¯ã‚’消ã™ã‚³ãƒžãƒ³ãƒ‰ã¯ã€@samp{tu} ã§ã™ã€‚ @end ifset @ifset en A command to unmark all messages of the current sub-thread is @samp{tu}. @end ifset @ifset ja 以下ã«ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã‚’加工ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en Here are commands to manipulate a thread: @end ifset @table @samp @ifset ja @item tSPC å­ä¾›ä»¥ä¸‹ã‚’éš ã—ã¦è¦ªã ã‘ã«ã™ã‚‹ã€‚å­ä¾›ä»¥ä¸‹ãŒéš ã‚Œã¦ã„る親メッセージã«ã¯ã€ "+" ãŒä»˜ã。ã¾ãŸã€å­ä¾›ä»¥ä¸‹ãŒéš ã‚Œã¦ã„る親メッセージã§ã“ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’実行 ã™ã‚‹ã¨ã€å­ä¾›ä»¥ä¸‹ãŒç¾ã‚Œã‚‹ã€‚ @item ta ã™ã¹ã¦ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã«å¯¾ã—ã€å­ä¾›ã®è¡¨ç¤ºã‚’å転ã•ã›ã‚‹ã€‚ @item tg ã‚るスレッドをã‚ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã«æŽ¥ãŽæœ¨ã™ã‚‹ã€‚æŽ¥ãŽæœ¨ã™ã‚‹ã‚¹ãƒ¬ãƒƒãƒ‰ã¯ã€ @samp{C-SPC} ã§æŒ‡å®šã™ã‚‹ã€‚目的ã®ã‚¹ãƒ¬ãƒƒãƒ‰ã®ä¸€ç•ªä¸Šã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã§ã€ @samp{C-SPC} を押ã™ã¨ã€ãã®ã‚¹ãƒ¬ãƒƒãƒ‰ãŒé¸æŠžã•れãŸã“ã¨ã«ãªã‚‹ã€‚ãã—ã¦ç›®çš„㮠メッセージã¸ç§»å‹•ã—ã€@samp{tg} を押ã™ã¨ã€ã‚¹ãƒ¬ãƒƒãƒ‰ãŒã“ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å­ä¾› ã¨ã—ã¦æŽ¥ãŽæœ¨ã•れる。 @end ifset @ifset en @item tSPC Hide children and leave the parent only. If its children are hidden, "+" is displayed on the parent. Also, if this command is executed on a message whose children are hidden, they appear. @item ta Toggle appearance of children for all threads. @item tg Graft a thread to a message. To specify which thread is grafted, type @samp{C-SPC} on the root of the thread. Then move onto your target message, and typing @samp{tg} grafts the thread to the target message as children. @end ifset @end table @ifset ja ãªãŠã€@samp{mew-use-thread-separator} ã‚’ @samp{t} ã«ã™ã‚‹ã¨ã€ã‚¹ãƒ¬ãƒƒãƒ‰é–“ ã«å¢ƒç•Œæ–‡å­—列ã¨ã—㦠@samp{mew-thread-separator} (åˆæœŸå€¤ã¯ "--") ãŒæŒ¿å…¥ã• れã¾ã™ã€‚ @end ifset @ifset en If @samp{mew-use-thread-separator} is @samp{t}, threads are distinguished by a separator defined by @samp{mew-thread-separator} (its default value is @w{"}--"). @end ifset @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Quit @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Quit, Customize, thread-op, Top @ifset ja @chapter 一休㿠@end ifset @ifset en @chapter Give me a break @end ifset @kindex q (Summary) @kindex Q (Summary) @kindex C-cC-q (Summary) @kindex C-cC-q (Draft) @kindex C-cC-q (Header) @kindex C-cC-q (Addrbook) @ifset ja Mew を終了ã•ã›ãŸã‚Šã€ä¸€æ™‚中断ã•ã›ãŸã‚Šã€ãã®ãƒ¢ãƒ¼ãƒ‰(正確ã«ã¯ãƒãƒƒãƒ•ã‚¡)を消去 ã™ã‚‹æ–¹æ³•を以下ã«ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en Here are how to quit and suspend Mew and how to erase a mode (buffer). @end ifset @ifset ja @end ifset @ifset en @end ifset @table @samp @ifset ja @item q Mew を一時中断ã—ã€ä»–ã®ãƒãƒƒãƒ•ã‚¡ã«åˆ‡ã‚Šæ›¿ãˆã‚‹ã€‚Mew 用ã®ãƒãƒƒãƒ•ã‚¡ã¯ã™ã¹ã¦æ®‹ã£ ã¦ã„ã‚‹ã®ã§ã€ãƒãƒƒãƒ•ã‚¡æ“作ã§é¸ã¹ã°å†é–‹ã§ãる。 @item Q Mew を終了。Mew ãŒä½¿ã£ãŸã™ã¹ã¦ã®ãƒãƒƒãƒ•ァを消去ã™ã‚‹ã€‚ @item C-cC-q ãã®ãƒ¢ãƒ¼ãƒ‰(正確ã«ã¯ãƒãƒƒãƒ•ã‚¡)を消去ã™ã‚‹ã€‚ @end ifset @ifset en @item q Suspend Mew then switch to another buffer. All buffers of Mew remain, so you can resume with buffer operations. @item Q Quit Mew. All buffers of Mew are erased. @item C-cC-q Erase the current mode (buffer). @end ifset @end table @ifset ja @end ifset @ifset en @end ifset @table @samp @ifset ja @item C-cC-q ãã®è‰ç¨¿ã‚’消去ã™ã‚‹ã€‚ @end ifset @ifset en @item C-cC-q Erase the draft. @end ifset @end table @ifset ja @end ifset @ifset en @end ifset @table @samp @ifset ja @item C-cC-q ãã®ãƒãƒƒãƒ•ァを消去ã™ã‚‹ã€‚ @end ifset @ifset en @item C-cC-q Erase the buffer. @end ifset @end table @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Customize @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Customize, summary-mode, Quit, Top @ifset ja @chapter カスタマイズ @end ifset @ifset en @chapter Customizing Mew @end ifset @ifset ja ã“ã“ã§ã¯ã€Mew ã®ãƒ‡ãƒ•ォルトã®å‹•作を変更ã—ã€è‡ªåˆ†å¥½ã¿ã® Mew ã«ã™ã‚‹æ–¹æ³•を説 明ã—ã¾ã™ã€‚主㫠"~/.mew.el" ã§è¨­å®šã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Here are explained how to change default setting of Mew and make Mew your favorite. Edit "~/.mew.el" to do it! @end ifset @menu @ifset ja * summary-mode:: Summary mode * message-mode:: Message mode * draft-mode:: Draft mode * charset:: 文字コード * highlight:: 色付㑠* hooks:: フック * pop:: POP * imap:: IMAP * nntp:: NNTP * smtp:: SMTP * config:: é€å—ä¿¡ã®å‹•作変化 * config2:: è¨­å®šã®æ›¸å¼ * custom-misc:: ãã®ä»– @end ifset @ifset en * summary-mode:: Summary mode * message-mode:: Message mode * draft-mode:: Draft mode * charset:: Character set * highlight:: Highlighting * hooks:: Hooks * pop:: POP * imap:: IMAP * nntp:: NNTP * smtp:: SMTP * config:: Changing receiving/sending behavior * config2:: The format of configuration * custom-misc:: Miscellaneous @end ifset @end menu @c %%%%%%%%%%%%%%%%% @node summary-mode, message-mode, Customize, Customize @ifset ja @section Summary mode @end ifset @ifset en @section Summary mode @end ifset @vindex mew-summary-form @vindex mew-summary-form-from-me-prefix @vindex mew-summary-form-extract-rule @vindex mew-summary-form-mark-delete @vindex mew-summary-form-mark-spam @vindex mew-summary-form-mark-review @vindex mew-use-full-window @vindex mew-summary-show-direction @vindex mew-summary-mark-direction @ifset ja Summary ãƒ¢ãƒ¼ãƒ‰ã®æ›¸å¼ã¯ã€@samp{mew-summary-form} ã§æŒ‡å®šã§ãã¾ã™ã€‚ä»¥ä¸‹ã« åˆæœŸå€¤ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en You can specify the format of Summary mode by @samp{mew-summary-form}. The default value is as follows: @end ifset @lisp (setq mew-summary-form '(type (5 date) " " (14 from) " " t (30 subj) "|" (0 body))) @end lisp @ifset ja ã“ã®ã‚ˆã†ã«ã€@samp{mew-summary-form} ã¯ã€ãƒªã‚¹ãƒˆã€ã‚·ãƒ³ãƒœãƒ«ã€æ–‡å­—列ã®ãƒªã‚¹ãƒˆã§ ã™ã€‚ @end ifset @ifset en Like this, @samp{mew-summary-form} is a list of list, symbol, and string. @end ifset @enumerate @ifset ja @item 文字列ã¯ãã®ã¾ã¾å‡ºåŠ›ã•れる @item リストã¯ã€æ•´æ•°ã¨ã‚·ãƒ³ãƒœãƒ«ã‹ã‚‰æ§‹æˆã•れる。シンボルã¯ã€å‘¼ã³å‡ºã™é–¢æ•°ã‚’æ„味㙠る。関数åã¯ã€"mew-summary-form-" ã¨ã‚·ãƒ³ãƒœãƒ«åを連çµã™ã‚‹ã“ã¨ã§ä½œã‚‰ã‚Œã‚‹ã€‚ (例: 'date ã¨ã„ã†ã‚·ãƒ³ãƒœãƒ«ã¯ã€@samp{mew-summary-form-date} ã¨ã„ã†é–¢æ•°å ã«ãªã‚‹) ã‚らã‹ã˜ã‚定義ã•れã¦ã„るシンボルã«ã¯ã€'typeã€'timeã€'dateã€'year〠'sizeã€'fromã€'subjã€'body ãŒã‚る。詳細ã¯ã€ @samp{mew-summary-form-} ã¨ã„ã†åã‚’æŒã¤é–¢æ•°ã®èª¬æ˜Žã‚’å‚ç…§ã®ã“ã¨ã€‚ æ•´æ•°ã¯ã€é–¢æ•°ãŒè¿”ã™æ–‡å­—列ãŒåŸ‹ã‚るフィールドã®å¹…を指定ã™ã‚‹ã€‚æ­£ã®æ•°ã¯ã€å·¦è©° ã‚ã‚’æ„味ã™ã‚‹ã€‚è² ã®æ•°ã¯ã€å³è©°ã‚ã‚’æ„味ã™ã‚‹ã€‚ã‚‚ã—ã€è² ã®æ•°ã‚’指定ã™ã‚‹å ´åˆã€å¯¾ 応ã™ã‚‹é–¢æ•°ã¯ ASCII 文字列を返ã™å¿…è¦ãŒã‚る。0 ã¯ã€è¡Œã®æ®‹ã‚Šã‚’æ„味ã—ã€å·¦è©° ã‚ã¨ãªã‚‹ã€‚ @item @samp{t} 以外ã®ã‚·ãƒ³ãƒœãƒ«ã¯ã€(1 シンボル) ã«ç­‰ã—ã„。 @item @samp{mew-summary-form} ã¯ã€åˆ©ç”¨ã•れる際ã«å…ˆé ­ã« (mark) ãŒä»˜ã‘加ãˆã‚‰ã‚Œã‚‹ã€‚ @item @samp{t} ã¯ã€ã‚¹ãƒ¬ãƒƒãƒ‰ã®éš›ã«æ®µä»˜ã‘ã™ã‚‹ä½ç½®ã‚’æ„味ã™ã‚‹ã€‚ @end ifset @ifset en @item A string is printed as it is. @item A list consists of an integer and a symbol. The symbol specifies a function to be called. The name of the function is produced by concatenating "mew-summary-form-" and the symbol name. (e.g. @samp{mew-summary-form-date} for the symbol 'date'). Pre-defined symbols are 'type, 'time, 'date, 'year, 'size, 'from, 'subj and 'body. For more details, see the explanation of the functions called @samp{mew-summary-form-}. The integer specifies the width of field which will be filled with a return string of the function. A positive value means padding SPCs on the right if necessary. A negative value means padding SPCs on the left if necessary. If a negative value is specified, the corresponding function must return an ASCII string. 0 means the remaining width of the line and is treated as a positive value. @item A symbol is equivalent to (1 symbol). @item '(mark) is appended to @samp{mew-summary-form} when used. @item @samp{t} means the position of thread indentation. @end ifset @end enumerate @ifset ja 例を以下ã«ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en An example is as follows: @end ifset @lisp (setq mew-summary-form '(type (5 date) " " (-4 size) " " (14 from) " " t (30 subj) "|" (0 body))) @end lisp @ifset ja @samp{mew-summary-form-from-me-prefix} ã¯ã€è‡ªåˆ†ã‹ã‚‰é€ä¿¡ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å®› å…ˆã®å…ˆé ­ã«åŠ ãˆã‚‰ã‚Œã‚‹æ–‡å­—列ã§ã™ã€‚åˆæœŸå€¤ã¯ "To:" ã§ã™ã€‚ @end ifset @ifset en @samp{mew-summary-form-from-me-prefix} is the prefix to be prepend to an destination address if the message is originated by me. The default is @w{"}To:". @end ifset @ifset ja @samp{mew-summary-form-extract-rule} ã¯ã€From: フィールドã‹ã‚‰ã©ã®éƒ¨åˆ†ã‚’切り 出ã™ã‹æŒ‡å®šã™ã‚‹ãŸã‚ã®ãƒªã‚¹ãƒˆã§ã™ã€‚è¦ç´ ã¯ã€'nameã€'commentã€'address〠'nicknameã€ã‚ã‚‹ã„ã¯æ­£è¦è¡¨ç¾ã§ã‚ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚åˆæœŸå€¤ã¯ '(nickname) ã§ ã™ã€‚ @end ifset @ifset en @samp{mew-summary-form-extract-rule} is a list to specify what part to extract from the From: field. Each element must be 'name, 'comment, 'address, 'nickname, or appropriate "regex". The default value is '(nickname). @end ifset @ifset ja 次ã®ä¾‹ã‚’考ãˆã¦ä¸‹ã•ã„。 @end ifset @ifset en Consider the following examples: @end ifset @example A: Kazu Yamamoto B: kazu@@example.org (Kazu Yamamoto) C: Kazuhiko Yamamoto (Kazu) @end example @ifset ja ãれãžã®è¦ç´ ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ãªæ„味をæŒã¡ã¾ã™ã€‚ @end ifset @ifset en Each element returns the following value: @end ifset @enumerate @ifset ja @item 'name:: åå‰ã®éƒ¨åˆ† @example A. Kazu Yamamoto B. (No match) C. Kazuhiko Yamamoto (Kazu) @end example @item 'comment:: コメントã®éƒ¨åˆ† @example A: (No match) B: Kazu Yamamoto C: (Kazu) @end example @item 'address:: アドレスã®éƒ¨åˆ† @example A: kazu@@example.org B: kazu@@example.org C: kazu@@example.org @end example @item 'nickname:: @samp{mew-addrbook-for-summary} ã®å€¤ã«å¿œã˜ãŸã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã®å€‹äºº 情報ã®ã‚ã‚‹è¦ç´ ã€‚@samp{mew-addrbook-for-summary} ã®åˆæœŸå€¤ã¯ @samp{'nickname} ãªã®ã§ã€é€šå¸¸ã¯ãƒ‹ãƒƒã‚¯ãƒãƒ¼ãƒ ã«å¤‰æ›ã•ã‚Œã‚‹ã€‚ä½•ãŒæŒ‡å®šã§ãã‚‹ ã‹ã¯ã€@xref{draft-mode} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item (regex):: 最åˆã«åˆè‡´ã—ãŸæ–‡å­—列 @end ifset @ifset en @item 'name:: Name part, if any @example A. Kazu Yamamoto B. (No match) C. Kazuhiko Yamamoto (Kazu) @end example @item 'comment:: Comment part, if any @example A: (No match) B: Kazu Yamamoto C: (Kazu) @end example @item 'address:: Address part @example A: kazu@@example.org B: kazu@@example.org C: kazu@@example.org @end example @item 'nickname:: one element of personal information in Addrbook according to @samp{mew-addrbook-for-summary}. The default value of @samp{mew-addrbook-for-summary} is @samp{'nickname}. So, From: is converted a nickname by default. To know what kind of value can be used, refer to @ref{draft-mode}. @item (regex):: The substring first matched. @end ifset @end enumerate @ifset ja ã‚ã‚‹è¦ç´ ãŒåˆè‡´ã—ãªã„å ´åˆã€æ¬¡ã®è¦ç´ ãŒè©•価ã•れã¾ã™ã€‚ã©ã®è¦ç´ ã‚‚ From: フィー ルドã«åˆè‡´ã—ãªã„å ´åˆã‹ã€ã“ã®å€¤ãŒ @samp{nil} ã®å ´åˆã€From: フィールド全体 ãŒåˆ©ç”¨ã•れã¾ã™ã€‚ @end ifset @ifset en If a element does not match, the next element is applied. If no element matches to the From: field, or this value is @samp{nil}, the whole of the From: field is used. @end ifset @ifset ja @samp{mew-summary-form-mark-delete} ㌠@samp{t} ã®å ´åˆã€é‡è¤‡ã—ã¦ã„るメッセー ジã«è‡ªå‹•的㫠@samp{D} マークãŒä»˜ãã¾ã™ã€‚åˆæœŸå€¤ã¯ @samp{nil} ã§ã™ã€‚ @end ifset @ifset en If @samp{mew-summary-form-mark-delete} is @samp{t}, the @samp{D} mark automatically is put onto duplicated messages. The default is @samp{nil}. @end ifset @ifset ja @samp{mew-summary-form-mark-spam} ㌠@samp{t} ã®å ´åˆã€æœ¬æ–‡ã®ä¸€éƒ¨ã«å¯¾ã™ ã‚‹ MD5 ãƒã‚§ãƒƒã‚¯ã‚µãƒ ãŒä¸€è‡´ã—ã¦ã„るメッセージã«è‡ªå‹•的㫠@samp{D} マーク㌠付ãã¾ã™ã€‚åˆæœŸå€¤ã¯ @samp{nil} ã§ã™ã€‚ @end ifset @ifset en If @samp{mew-summary-form-mark-spam} is @samp{t}, the @samp{D} mark automatically is put onto SPAM messages. A message is considered a SPAM message if the MD5 checksum of its body is duplicated in a scan. The default is @samp{nil}. @end ifset @ifset ja @samp{mew-summary-form-mark-review} ㌠@samp{t} ã®å ´åˆã€è‡ªåˆ†å®›ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ ジã«è‡ªå‹•的㫠@samp{*} マークãŒä»˜ãã¾ã™ã€‚åˆæœŸå€¤ã¯ @samp{nil} ã§ã™ã€‚ @end ifset @ifset en If @samp{mew-summary-form-mark-review} is @samp{t}, the @samp{*} mark automatically is put onto messages destined to me. The default is @samp{nil}. @end ifset @ifset ja ã„ã¤ã‚‚ Emacs ã®ãƒ•レーム全体㧠Mew を使ã„ãŸã„人ã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en If you want to use Mew with full Emacs frame, set like this. @end ifset @lisp (setq mew-use-full-window t) @end lisp @ifset ja Summary モード㮠@samp{SPC} ã¯ã€@samp{mew-summary-show-direction} ã«ã‚ˆã£ ã¦ã€æ¬¡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®è¡¨ç¤ºã®ä»•æ–¹ãŒå¤‰ã‚りã¾ã™ã€‚ã¾ãŸåŒæ§˜ã«ã€å¼·ã„マークを付㑠ãŸå¾Œã‚«ãƒ¼ã‚½ãƒ«ãŒå‹•ãæ–¹å‘㯠@samp{mew-summary-mark-direction} ã«ã‚ˆã‚ŠæŒ‡å®šã§ ãã¾ã™ã€‚以下ã®å€¤ã‚’設定ã§ãã¾ã™ã€‚ @end ifset @ifset en @samp{SPC} in Summary mode decide the next action to view a message according to @samp{mew-summary-show-direction}. Likewise, you can specify the cursor direction after putting a strong mark by @samp{mew-summary-mark-direction}. You can select one from the following candidates. @end ifset @table @samp @ifset ja @item up 上ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã€‚ @item down 下ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã€‚ @item next 読ã¿é€²ã‚ã¦ã„ã‚‹æ–¹å‘ã®æ¬¡ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’表示ã™ã‚‹ã€‚ @item stop 次ã¯è¡¨ç¤ºã—ãªã„。 @end ifset @ifset en @item up Display the message above. @item down Display the message below. @item next Display the next message in the direction. @item stop Do not display the next message. @end ifset @end table @ifset ja 両方ã¨ã‚‚åˆæœŸå€¤ã¯ @samp{next} ã§ã™ã€‚ã„ã¤ã‚‚メッセージを下ã‹ã‚‰èª­ã‚€äººã¯ã€ä»¥ 下ã®ã‚ˆã†ã«ã™ã‚Œã°ã‚ˆã„ã§ã—ょã†ã€‚ @end ifset @ifset en The default value for both is @samp{next}. If you read messages from the bottom, set as follows: @end ifset @lisp (setq mew-summary-show-direction 'up) @end lisp @c %%%%%%%%%%%%%%%%% @node message-mode, draft-mode, summary-mode, Customize @ifset ja @section Message mode @end ifset @ifset en @section Message mode @end ifset @kindex C-cC-e (Summary) @kindex C-uC-cC-e (Summary) @kindex zz (Summary) @vindex mew-prog-text/html-ext @vindex mew-prog-msword-ext @vindex mew-prog-msexcel-ext @vindex mew-prog-mspowerpoint-ext @vindex mew-prog-msword @vindex mew-prog-msexcel @vindex mew-prog-mspowerpoint @vindex mew-mime-multipart-alternative-list @ifset ja Emacs ãŒã‚µãƒãƒ¼ãƒˆã—ã¦ãªã„データ型ã®ãƒ•ァイルã¯ã€Message ãƒãƒƒãƒ•ã‚¡ã«ç›´æŽ¥è¡¨ 示ã§ãã¾ã›ã‚“。ãã®ãƒ‡ãƒ¼ã‚¿ã‚’ãƒ†ã‚­ã‚¹ãƒˆã«æ•´å½¢ã™ã‚‹å¤–部コマンドをインストール ã™ã‚Œã°ã€Message ãƒãƒƒãƒ•ã‚¡ã«è¡¨ç¤ºå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en It is impossible to display a file to the Message buffer if its data type is not supported by Emacs. Install an external program which converts the data to text and you can display the file to the Message buffer. @end ifset @ifset ja @w{"}w3m" 㨠"emacs-w3m" をインストールã™ã‚‹ã¨ã€Text/Html ã‚’ Message ãƒãƒƒ ファã«è¡¨ç¤ºã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚(以下ã§èª¬æ˜Žã™ã‚‹ "wvHtml"ã€"xlhtml"〠"ppthtml" ã¯ã€å˜ãªã‚‹ "w3m" ã§ã¯ãªãã€å›½éš›åŒ–ã•れ㟠"w3m-m17n" ãŒå¿…è¦ã§ ã™ã€‚) 両者をインストールã—ãŸã‚‰ã€"~/.mew.el" ã«ä»¥ä¸‹ã®è¨­å®šã‚’加ãˆã¦ä¸‹ã•ã„。 @end ifset @ifset en Text/Html can be displayed in Message mode, if you add the following to "~/.mew.el". @end ifset @lisp (setq mew-use-text/html t) ; decode HTML for all folders @end lisp @ifset ja ã“れã§ã€ã‚ãŸã‹ã‚‚ Text/Plain ã§ã‚ã‚‹ã‹ã®ã‚ˆã†ã«ã€Text/Html ã‚’ Message ãƒãƒƒ ファã«è¡¨ç¤ºã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ã“ã®éš›ã‚‚ã€ä»¥ä¸‹ã§èª¬æ˜Žã™ã‚‹ @samp{C-cC-e} ã®æ“ä½œã¯æœ‰åйã§ã™ã€‚ @end ifset @ifset en With this, Text/Html can be displayed in Message mode as if it were Text/Plain. Even in this situation, @samp{C-cC-e} described below is a valid operation. By default, Text/Html is displayed using Emacs's built-in HTML renderer. Alternatively, you can display Text/Html using the w3m browser. First, install "w3m" and "emacs-w3m". (Please note that multilingualized "w3m", not pure @w{"}w3m", is necessary for "wvHtml", "xlhtml", and "ppthtml" described below.) When you install both of them, add the following to "~/.mew.el". @end ifset @lisp (condition-case nil (require 'mew-w3m) (file-error nil)) @end lisp @ifset ja "wvHtml"ã€"xlhtml"ã€"ppthtml" ã¨ã„ã†ã‚³ãƒžãƒ³ãƒ‰ã‚’インストールã™ã‚Œã°ã€ãれ ãžã‚Œ WORDã€Excelã€PowerPoint ファイルã®ãƒ†ã‚­ã‚¹ãƒˆéƒ¨åˆ†ã‚’ã€Message ãƒãƒƒãƒ•ã‚¡ ã«è¡¨ç¤ºå¯èƒ½ã§ã™ã€‚ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€HTML を利用ã™ã‚‹ã®ã§ã€ä¸Šè¨˜ã® Text/Html ã®è¨­å®šã‚’完了ã•ã›ã¦ä¸‹ã•ã„。ã“れã§ã€ãŸã¨ãˆã° WORD ファイルを゠ãŸã‹ã‚‚テキストã®ã‚ˆã†ã«ã€Message ãƒãƒƒãƒ•ã‚¡ã«è¡¨ç¤ºå¯èƒ½ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en If you install "wvHtml", "xlhtml", and "ppthtml", you can display text parts of WORD, Excel, and PowerPoint file in Message, respectively. Since these commands uses HTML, the configuration of Text/Html above is required. With this, a WORD file, for example, can be displayed in Message mode as if it were text. @end ifset @ifset ja 外部ã®ãƒ—ãƒ­ã‚°ãƒ©ãƒ ã®æ•´å½¢çµæžœã‚’ Message ãƒãƒƒãƒ•ã‚¡ã«è¡¨ç¤ºã™ã‚‹ä»£ã‚りã«ã€å¤–部㮠プログラム自身ã«ãã®ãƒ‡ãƒ¼ã‚¿ã‚’表示ã•ã›ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã“れã«ã¯ @samp{C-cC-e} を使ã„ã¾ã™ã€‚ @end ifset @ifset en You can display the file with an external application itself instead of displaying it in the Message buffer. For this, type @samp{C-cC-e}. @end ifset @ifset ja Message ãƒãƒƒãƒ•ã‚¡ã«ç”»åƒã‚’表示ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ã¾ãŸ @samp{C-cC-e} を使 ã„ã€å¤–部ã®ãƒ—ログラムã«è¡¨ç¤ºã•ã›ã‚‹ã“ã¨ã‚‚å¯èƒ½ã§ã™ã€‚ @end ifset @ifset en You can visualize an image file into the Message buffer. Also, you can display it with an external application by typing @samp{C-cC-e}, of course. @end ifset @ifset ja HTML 㯠@samp{C-cC-e} を使ã£ã¦å¤–部ã®ãƒ–ラウザã«è¡¨ç¤ºã§ãã¾ã™ã€‚Windows ã‚„ Mac ã§ã¯ãƒ‡ãƒ•ォルトã®ãƒ–ラウザãŒåˆ©ç”¨ã•れã¾ã™ã€‚Unix ã§ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã« "mozilla" ãŒåˆæœŸå€¤ã¨ãªã£ã¦ã„ã¾ã™ã€‚ @end ifset @ifset en You can display an HTML file to a browser with @samp{C-cC-e}. A default browser is used on Windows and Mac. On Unix, "mozilla" is set to a default browser as follows: @end ifset @lisp (defvar mew-prog-text/html-ext '("mozilla" ("-remote" "openFile(%s)") t)) @end lisp @ifset ja ãŸã¨ãˆã°ã€ã“れを "firefox" ã«å¤‰æ›´ã™ã‚‹ã«ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ @end ifset @ifset en If you want to set it to "firefox", for example, configure like this: @end ifset @lisp (setq mew-prog-text/html-ext '("firefox" ("-a" "firefox" "-remote" "openFile(%s)") t)) @end lisp @ifset ja Office 関連ã®ãƒ•ァイルもã€@samp{C-cC-e} を使ãˆã°ã€ãれãžã‚Œã®ã‚¢ãƒ—リケーショ ンã§è¡¨ç¤ºå¯èƒ½ã§ã™ã€‚Windows ã‚„ Mac ã§ã¯ã€æ–‡å­—通り Office ã®ã‚¢ãƒ—リケーショ ンãŒèµ·å‹•ã•れã¾ã™ã€‚Unix ã§ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã« "ooffice" ãŒåˆæœŸå€¤ã¨ãªã£ã¦ã„ ã¾ã™ã€‚ @end ifset @ifset en You can visualize an Office-family file to each application by typing @samp{C-cC-e}. On Windows and Mac, an Office-family application is executed. On Unix, "ooffice" is set to the default application as follows: @end ifset @lisp (defvar mew-prog-msword-ext "ooffice") (defvar mew-prog-msexcel-ext "ooffice") (defvar mew-prog-mspowerpoint-ext "ooffice") @end lisp @ifset ja ã“れを "soffice" ã«å¤‰æ›´ã™ã‚‹ã«ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ @end ifset @ifset en If you want to set it to "soffice", for instace, do like this: @end ifset @lisp (setq mew-prog-msword-ext "soffice") (setq mew-prog-msexcel-ext "soffice") (setq mew-prog-mspowerpoint-ext "soffice") @end lisp @ifset ja ã¾ãŸ Office 関連ã®ã‚¢ãƒ—リケーションã«å¯¾ã—ã€@samp{SPC} ãªã©ã§ã¯å†…容を表示 ã›ãšã€@samp{C-cC-e} ã§ã¯ "wvHtml" ãªã©ã‚’使ã£ã¦ Message ãƒãƒƒãƒ•ã‚¡ã«è¡¨ç¤ºã™ ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¾ã™ã€‚ @end ifset @ifset en If you want to not visualize an Office-family file into the Message buffer, but want to display it with "wvHtml", configure as follows: @end ifset @lisp (setq mew-prog-msword '(nil mew-mime-application/msword)) (setq mew-prog-msexcel '(nil mew-mime-application/msexcel)) (setq mew-prog-mspowerpoint '(nil mew-mime-application/mspowerpoint)) @end lisp @ifset ja ã‚らã‹ã˜ã‚定ã‚られã¦ã„るコマンドã§ã¯ãªãã€ä»»æ„ã®å¤–部コマンドを呼ã³å‡ºã— ãŸã„å ´åˆã¯ã€@samp{C-uC-cC-e} ã¨å…¥åŠ›ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en If you want to specify an application instead of the pre-defined application, type @samp{C-uC-cC-e}. @end ifset @ifset ja 最近ã€Multipart/Alternative ã®ä¸­ã« Text/Plain 㨠Text/Html ã®ä¸¡æ–¹ãŒå…¥ã£ ã¦ãŠã‚Šã€ã©ã¡ã‚‰ã‹ã‚’é¸ã¶ã‚ˆã†ã«ãªã£ã¦ã„るメッセージを多ã見掛ã‘ã¾ã™ã€‚Mew ã¯ã€æ¨™æº–ã§ã¯ Text/Plain ã®æ–¹ã‚’優先ã—ã¦è¡¨ç¤ºã—ã¾ã™ã€‚"emacs-w3m" をインス トールã™ã‚Œã°ã€Text/Html ã®æ–¹ã‚’優先ã—ãŸããªã‚‹ã‹ã‚‚ã—れã¾ã›ã‚“。ãã®å ´åˆã€ 以下ã®è¨­å®šã‚’ "~/.mew.el" ã«åŠ ãˆã¦ä¸‹ã•ã„。(ã“ã“ã§ @xref{multipart} を読 ã¿ã€@samp{:} ã®ä½¿ã„方もæ€ã„出ã—ã¦ãŠãã¾ã—ょã†ã€‚) @end ifset @ifset en Recently there are many message whose have Multipart/Alternative, which consists of Text/Plain and Text/Html. By default, Mew selects Text/Plain. If you prefer to choose Text/Html, add the following to "~/.mew.el". (Now, it's a good idea to get back to @ref{multipart} to review how to use @samp{:}.) @end ifset @lisp (setq mew-mime-multipart-alternative-list '("Text/Html" "Text/Plain" ".*")) @end lisp @ifset ja ZIP ã§æš—å·åŒ–ã•ã‚ŒãŸæ·»ä»˜ãƒ•ァイルã¯ã€@samp{zz} ã§å¾©å·åŒ–ã—表示ã§ãã¾ã™ã€‚ @end ifset @ifset en You can decrypt a ZIP attach file and display it with @samp{zz}. @end ifset @c %%%%%%%%%%%%%%%%% @node draft-mode, charset, message-mode, Customize @ifset ja @section Draft mode @end ifset @ifset en @section Draft mode @end ifset @vindex mew-cc @vindex mew-dcc @vindex mew-header-alist @vindex mew-cite-fields @vindex mew-cite-format @vindex mew-cite-prefix @vindex mew-cite-prefix-function @vindex mew-addrbook-for-cite-label @vindex mew-addrbook-for-cite-prefix @ifset ja 自分㸠Cc: ã—ãŸã„人㯠@samp{mew-cc} を設定ã—ã¦ä¸‹ã•ã„。返答ã®éš›ã«ã¯ã€å¯¾è±¡ ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‹ã‚‰ã€åˆ¥é€” Cc: ãŒç”¨æ„ã•れる場åˆãŒã‚りã¾ã™ã€‚複数㮠Cc: ãŒã‚ã‚‹ å ´åˆã€é€ä¿¡æ™‚ã« 1 ã¤ã«ã¾ã¨ã‚られã¾ã™ã€‚ @end ifset @ifset en Define @samp{mew-cc} to use Cc:. When replying, another Cc: field may be prepared from the target message. If there are multiple Cc: fields, they are combined to one field on sending. @end ifset @ifset ja ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã®ãŸã‚ã€è‡ªåˆ†ãŒé€ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ã‘å–りãŸã„ã¨è€ƒãˆã€ã—ã‹ã‚‚ヘッ ダã«è‡ªåˆ†ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’残ã—ãŸããªã„ãªã‚‰ã€Dcc: を使ã£ã¦ä¸‹ã•ã„。 @samp{mew-dcc} ã«è‡ªåˆ†ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’設定ã—ã¾ã—ょã†ã€‚ @end ifset @ifset en If you want to receive your originating messages for backup without specifying your address, use Dcc:. Set your address to @samp{mew-dcc}. @end ifset @ifset ja ã„ã¤ã‚‚å…¥ã‚Œã¦æ¬²ã—ã„ヘッダã¯ã€@samp{mew-header-alist} ã«é€£æƒ³ãƒªã‚¹ãƒˆå½¢å¼ã§å®š 義ã—ã¦ä¸‹ã•ã„。以下ã«ä¾‹ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en Set header fields that you want to insert every time when you write messages to @samp{mew-header-alist} as an associate list. The following is an example. @end ifset @lisp (setq mew-header-alist '(("X-fingerprint:" "6B 63 38 88 67 5E 96 8E CE A4 62 73 3F 11 64 94") ("X-URL:" "http://www.example.org/~kazu/"))) @end lisp @ifset ja 引用ラベルã¯ã€å¼•用ã™ã‚‹ãƒ•ィールドを @samp{mew-cite-fields}ã€ãƒ©ãƒ™ãƒ«ã®æ›¸å¼ ã‚’ @samp{mew-cite-format} ã«å®šç¾©ã—ã¾ã™ã€‚引用記å·ã¯ @samp{mew-cite-prefix} ã«æŒ‡å®šã—ã¾ã™ã€‚åˆæœŸå€¤ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ @end ifset @ifset en To customize citation label, define field to cite in @samp{mew-cite-fields} and format in @samp{mew-cite-format}. Define citation prefix to @samp{mew-cite-prefix}. The default declaration is as follows: @end ifset @lisp (defvar mew-cite-fields '("From:" "Subject:" "Date:")) (defvar mew-cite-format "From: %s\nSubject: %s\nDate: %s\n\n") (defvar mew-cite-prefix "> ") @end lisp @ifset ja 引用ラベル㫠Message-ID: を加ãˆã‚‹ã«ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ @end ifset @ifset en To add Message-ID: to citation label, take this way. @end ifset @lisp (setq mew-cite-fields '("From:" "Subject:" "Date:" "Message-ID:")) (setq mew-cite-format "From: %s\nSubject: %s\nDate: %s\nMessage-ID: %s\n\n") @end lisp @ifset ja 引用記å·ã«ã‚¢ãƒ‰ãƒ¬ã‚¹ã®ãƒ¦ãƒ¼ã‚¶éƒ¨åˆ†ãŒä»˜ãよã†ã«ã™ã‚‹ã«ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ @end ifset @ifset en To add a user part of an address to the citation prefix, configure as follows: @end ifset @lisp (setq mew-cite-prefix-function (function mew-cite-prefix-username)) @end lisp @ifset ja ã“れã§å¼•用記å·ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en With this, the citation prefix becomes like this: @end ifset @example @ifset ja From: SUMIKAWA Munechika Subject: Wine Date: Wed, 23 Jul 1997 11:40:50 +0900 sumikawa> ãŠã¯ã‚ˆã†ã‹ã‚‰ãŠã‚„ã™ã¿ã¾ã§ãƒ‹ãƒ¼ãƒˆã§ãŠãªã˜ã¿ã®è§’å·ã§ã™ã€‚ sumikawa> sumikawa> ã•ã¦ã€ã¨ã‚ã‘るワイン作戦ã§ã™ãŒã€å®šçŸ³é€šã‚Š '89 ã®ãƒœãƒ«ãƒ‰ãƒ¼ã® sumikawa> カベルãƒãƒ»ã‚½ãƒ¼ãƒ“ニョンを狙ã„ãŸã„ã¨æ€ã„ã¾ã™ã€‚ @end ifset @ifset en From: SUMIKAWA Munechika Subject: Wine Date: Wed, 23 Jul 1997 11:40:50 +0900 sumikawa> Hi, it's Sumikawa, the guy who's neat from good morning sumikawa> to good night. sumikawa> sumikawa> Talking about the wonderful wine party, I would propose sumikawa> Cabernet Sauvignon, Bordeaux, '90. @end ifset @end example @ifset ja 引用ラベル㮠From: ã®éƒ¨åˆ†ã¨ã€å¼•用記å·ã¯ã€ã‚¢ãƒ‰ãƒ¬ã‚¹å¸³ã®å€‹äººæƒ…å ±ã®è¦ç´ ã«å¤‰ æ›ã§ãã¾ã™ã€‚ãれãžã‚Œã€@samp{mew-addrbook-for-cite-label}〠@samp{mew-addrbook-for-cite-prefix} ã§æŒ‡å®šã§ãã¾ã™ã€‚åˆæœŸå€¤ã¯ãれãžã‚Œ @samp{nil} 㨠@samp{'username} ã§ã™ã€‚以下ã®ã‚ˆã†ãªå€¤ãŒè¨­å®šã§ãã¾ã™ã€‚ @end ifset @ifset en Both an address in the citation label and the citation prefix can be converted to an element of a personal information in Addrbook. They can be configured by @samp{mew-addrbook-for-cite-label} and @samp{mew-addrbook-for-cite-prefix}, respectively. The default values are @samp{nil} and @samp{'username}, respectively. You can set out of the following values. @end ifset @table @asis @ifset ja @item 'shortname 短縮å @item 'address アドレス @item 'username アドレスã®ãƒ¦ãƒ¼ã‚¶éƒ¨åˆ† @item 'nickname ニックãƒãƒ¼ãƒ  @item 'name æ­£å¼ãªæ°å @end ifset @ifset en @item 'shortname Short name @item 'address Address @item 'username User part of address @item 'nickname Nickname @item 'name Full name @end ifset @end table @ifset ja 例ã¨ã—ã¦ä»¥ä¸‹ã®ã‚ˆã†ãªè¨­å®šã‚’考ãˆã¦ã¿ã¾ã—ょã†ã€‚ @end ifset @ifset en Let's consider the following example. @end ifset @lisp (setq mew-addrbook-for-cite-label 'nickname) (setq mew-addrbook-for-cite-prefix 'nickname) @end lisp @ifset ja 最åˆã®è¨­å®šã§ãƒ©ãƒ™ãƒ«ã®ä¸­ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒãƒ‹ãƒƒã‚¯ãƒãƒ¼ãƒ ã«å¤‰ã‚りã¾ã™ã€‚ã¾ãŸã€æ¬¡ã®è¨­ 定ã§å¼•用記å·ã‚‚ニックãƒãƒ¼ãƒ ã«ç½®ãæ›ã‚りã¾ã™ã€‚ @end ifset @ifset en With the first line, an address in the citation label is replaced with its nickname. The second line indicates that the cite prefix is replaced with its nickname. @end ifset @example @ifset ja From: ã™ã¿ã£ã¡ Subject: Wine Date: Wed, 23 Jul 1997 11:40:50 +0900 ã™ã¿ã£ã¡> ãŠã¯ã‚ˆã†ã‹ã‚‰ãŠã‚„ã™ã¿ã¾ã§ãƒ‹ãƒ¼ãƒˆã§ãŠãªã˜ã¿ã®è§’å·ã§ã™ã€‚ ã™ã¿ã£ã¡> ã™ã¿ã£ã¡> ã•ã¦ã€ã¨ã‚ã‘るワイン作戦ã§ã™ãŒã€å®šçŸ³é€šã‚Š '89 ã®ãƒœãƒ«ãƒ‰ãƒ¼ã® ã™ã¿ã£ã¡> カベルãƒãƒ»ã‚½ãƒ¼ãƒ“ニョンを狙ã„ãŸã„ã¨æ€ã„ã¾ã™ã€‚ @end ifset @ifset en From: sumitch Subject: Wine Date: Wed, 23 Jul 1997 11:40:50 +0900 sumitch> Hi, it's Sumikawa, the guy who's neat from good morning sumitch> to good night. sumitch> sumitch> Talking about the wonderful wine party, I would propose sumitch> Cabernet Sauvignon, Bordeaux, '90. @end ifset @end example @c %%%%%%%%%%%%%%%%% @node charset, highlight, draft-mode, Customize @ifset ja @section 文字コード @end ifset @ifset en @section Character set @end ifset @vindex mew-charset-m17n @vindex mew-ask-charset @vindex mew-charset-latin @ifset ja @xref{charset-guess} ã§èª¬æ˜Žã—ãŸã‚ˆã†ã«ã€Mew ã§ã¯ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã™ã‚‹éš›ã« é©åˆ‡ãªæ–‡å­—コードを自動的ã«é¸æŠžã—ã¾ã™ã€‚ @end ifset @ifset en As described in @ref{charset-guess}, Mew automatically chooses an appropriate charset for the message when composing. @end ifset @ifset ja ã‚‚ã—複数ã®è¨€èªžã®æ–‡å­—ãŒæ··åœ¨ã—ã¦ãŠã‚Šã€å›½éš›åŒ–ã•ã‚ŒãŸæ–‡å­—ã‚³ãƒ¼ãƒ‰ã‚’é¸æŠžã™ã‚‹å¿…è¦ ãŒã‚ã‚‹å ´åˆã¯ã€@samp{mew-charset-m17n} ã®å€¤ã‚’利用ã—ã¾ã™ã€‚åˆæœŸå€¤ã¯ã€ "utf-8" (Unicode ã¨ç†è§£ã—ã¦ã‚ˆã„)ã§ã™ã€‚"iso-2022-jp-2" ã«ã—ãŸã„人ã¯ã€ä»¥ä¸‹ ã®ã‚ˆã†ã«è¨­å®šã™ã‚‹ã¨ã‚ˆã„ã§ã—ょã†ã€‚ @end ifset @ifset en If characters of multiple languages exist, and if it is necessary to use an international charset, @samp{mew-charset-m17n} is used. Its default value is "utf-8" (equivalent to Unicode). If you want to set it to @w{"}iso-2022-jp-2", configure like this: @end ifset @lisp (setq mew-charset-m17n "iso-2022-jp-2") @end lisp @ifset ja メッセージを作æˆã—ãŸéš›ã«ã€æŽ¨æ¸¬ã•ã‚ŒãŸæ–‡å­—コードを確èªã—ãŸã„å ´åˆã¯ã€ @samp{mew-ask-charset} を設定ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en If you want to check a chosen charset when composing, configure @samp{mew-ask-charset}. @end ifset @table @samp @ifset ja @item nil ã©ã®ã‚ˆã†ãªæ–‡å­—コードãŒåˆ©ç”¨ã•れã¦ã‚‚確èªãªã— @item 文字コードã®ãƒªã‚¹ãƒˆ ã“ã®ãƒªã‚¹ãƒˆã«å­˜åœ¨ã—ãªã„文字コードãŒåˆ©ç”¨ã•れãŸå ´åˆã«ç¢ºèª @item t @samp{mew-charset-m17n} ãŒåˆ©ç”¨ã•れãŸå ´åˆã«ç¢ºèª @end ifset @ifset en @item nil Not ask. @item A list of charset Ask if the charset is not a member of the list. @item t Ask if @samp{mew-charset-m17n} is used. @end ifset @end table @ifset ja ãŸã¨ãˆã°ã€US-ASCII 㨠ISO-2022-JP ä»¥å¤–ã®æ–‡å­—コードãŒé¸ã°ã‚ŒãŸå ´åˆç¢ºèªã—㟠ã„ã®ã§ã‚れã°ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 @lisp (setq mew-ask-charset '("us-ascii" "iso-2022-jp")) @end lisp @end ifset @ifset en For instance, if you want to check when charset other than US-ASCII, ISO-8859-1, and ISO-8859-15, configure like this: @lisp (setq mew-ask-charset '("us-ascii" "iso-8859-1" "iso-8859-15")) @end lisp @end ifset @ifset ja ã“ã†è¨­å®šã—ã¦ã„ã‚‹ã¨ãã€ãŸã¨ãˆã° "utf-8" ãŒé¸æŠžã•れるã¨ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨Šã‹ れã¾ã™ã€‚ @end ifset @ifset en For example, when "utf-8" is chosen for a message with this configuration, you are asked like this: @end ifset @example utf-8 is used. OK? (y or n) @end example @ifset ja @samp{y} を押ã™ã¨ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒé€ä¿¡ã•れã¾ã™(ã‚ã‚‹ã„ã¯ã€ã‚­ãƒ¥ãƒ¼ã«æºœã‚Šã¾ã™)。 @samp{n} を押ã™ã¨ã€è‰ç¨¿ãŒå…ƒã®çŠ¶æ…‹ã«æˆ»ã‚Šã¾ã™ã€‚ @end ifset @ifset en Typing @samp{y} makes the composed message sent (or queued). If you type @samp{n}, you will go back to the original draft. @end ifset @ifset ja ヨーロッパã§ã¯ã€Latin 1 (ISO-8859-1) ã®ä»£ã‚Šã«ã€ãƒ¦ãƒ¼ãƒ­è¨˜å·ã‚’å«ã‚€ Latin 9 (ISO-8859-15ã€é€šç§° Latin 0) ãŒä½¿ã‚れ始ã‚ã¦ã„ã¾ã™ã€‚è‰ç¨¿ã«ã€Latin 1 ã®æ–‡å­— 㨠Latin 9 ã®æ–‡å­—ãŒæ··åœ¨ã—ã¦ã„ã‚‹ã¨ã€ä»¥ä¸‹ã®æ‰‹é †ã«ã‚ˆã£ã¦ã€æ–‡å­—ã‚³ãƒ¼ãƒ‰ãŒæ±ºå®š ã•れã¾ã™ã€‚ @end ifset @ifset en In Europe Latin 9 (ISO-8859-15 or Latin 0), which includes the euro sign, is getting more and more popular instead of Latin 1 (ISO-8859-1). If characters of both Latin 1 and Lain 9 exist in a draft, Mew takes the following step to decide a charset. @end ifset @enumerate @ifset ja @item @samp{unify-8859-on-decoding-mode} を利用ã—ã¦ã„ã‚‹å ´åˆï¼š @enumerate @item ISO-8859-1 ã«åŽã¾ã‚‹ãªã‚‰ "iso-8859-1" を利用 @item ãã†ã§ãªã„ãªã‚‰ "utf-8" を利用 @end enumerate @item @samp{unify-8859-on-decoding-mode} を利用ã—ã¦ã„ãªã„å ´åˆï¼š @enumerate @item ISO-8859-1 㨠ISO-8859-15 ã®ã©ã¡ã‚‰ã«ã‚‚åŽã¾ã‚‹å ´åˆã€@w{"}ISO-8859-1" @item ISO-8859-1 ã«åŽã¾ã‚‹ãªã‚‰ "iso-8859-1" を利用 @item ISO-8859-15 ã«åŽã¾ã‚‹ãªã‚‰ "iso-8859-15" を利用 @item ãã†ã§ãªã„ãªã‚‰ã€"utf-8" を利用 @end enumerate @end ifset @ifset en @item If @samp{unify-8859-on-decoding-mode} is used: @enumerate @item Use "iso-8859-1" if no loss. @item Otherwise, use "utf-8". @end enumerate @item If @samp{unify-8859-on-decoding-mode} is not used: @enumerate @item If both ISO-8859-1 and ISO-8859-15 can be used with no loss, @w{"}ISO-8859-1" is used. @item Use "iso-8859-1" if no loss. @item Use "iso-8859-15" if no loss. @item Otherwise, use "utf-8". @end enumerate @end ifset @end enumerate @ifset ja @samp{mew-charset-latin} ã®åˆæœŸå€¤ã¯ã€"iso-8859-15" ã§ã™ã€‚"iso-8859-1" ã« ã—ãŸã„å ´åˆã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¾ã™ã€‚ @end ifset @ifset en The default value of @samp{mew-charset-latin} is "iso-8859-15". If you want to set it to "iso-8859-1", configure like this: @end ifset @lisp (setq mew-charset-latin "iso-8859-1") @end lisp @ifset ja ã‚‚ã—ã€US-ASCII ä»¥å¤–ã®æ–‡å­—ã«å¯¾ã—ã€å¿…ãš UTF-8 を使ã„ãŸã„ãªã‚‰ã€ä»¥ä¸‹ã®ã‚ˆã† ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en If you want to always use UTF-8 for any characters other than US-ASCII, configure as follows: @end ifset @lisp (setq mew-cs-database-for-encoding `(((ascii) nil "7bit" "7bit") (nil utf-8 "base64" "B"))) @end lisp @c %%%%%%%%%%%%%%%%% @node highlight, hooks, charset, Customize @ifset ja @section 色付㑠@end ifset @ifset en @section Highlighting @end ifset @vindex mew-use-highlight-mark @vindex mew-use-highlight-header @vindex mew-use-highlight-body @vindex mew-highlight-body-max-size @vindex mew-use-highlight-url @vindex mew-use-cursor-mark @vindex mew-cursor-mark @vindex mew-use-highlight-cursor-line @vindex mew-use-highlight-mouse-line @vindex mew-use-highlight-x-face @vindex mew-theme-file @ifset ja @samp{mew-use-highlight-mark} ㌠@samp{t} ã®å ´åˆã€ãƒžãƒ¼ã‚¯ã®ä»˜ã„ãŸãƒ¡ãƒƒã‚»ãƒ¼ ジã«è‰²ãŒä»˜ãã¾ã™ã€‚åˆæœŸå€¤ã¯ @samp{t} ã§ã™ã€‚ @end ifset @ifset en If @samp{mew-use-highlight-mark} is @samp{t}, marked message are highlighted. The default is @samp{t}. @end ifset @ifset ja @samp{mew-use-highlight-header} ㌠@samp{t} ã®å ´åˆã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ãƒ˜ãƒƒãƒ€ã« 色ãŒä»˜ãã¾ã™ã€‚åˆæœŸå€¤ã¯ @samp{t} ã§ã™ã€‚ @end ifset @ifset en If @samp{mew-use-highlight-header} is @samp{t}, the header of a message is highlighted. The default is @samp{t}. @end ifset @ifset ja @samp{mew-use-highlight-body} ㌠@samp{t} ã®å ´åˆã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ¬æ–‡ã«è‰²ãŒ 付ãã¾ã™ã€‚åˆæœŸå€¤ã¯ @samp{t} ã§ã™ã€‚色を付ã‘る上é™ã¯ã€ @samp{mew-highlight-body-max-size} ã§æŒ‡å®šã§ãã¾ã™ã€‚åˆæœŸå€¤ã¯ 10000 ãƒã‚¤ãƒˆ ã§ã™ã€‚ @end ifset @ifset en If @samp{mew-use-highlight-body} is @samp{t}, the body of a message is highlighted. The default is @samp{t}. The limit to be highlighted can be set by @samp{mew-highlight-body-max-size}. The default is 10000 bytes. @end ifset @ifset ja @samp{mew-use-highlight-url} ㌠@samp{t} ã®å ´åˆã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ä¸­ã® URL ã«ä»• 掛ã‘ãŒæ–½ã•れã¦ã€ãƒžã‚¦ã‚¹ã‚’æŒã£ã¦ã„ãã¨å…‰ã‚‹ã‚ˆã†ã«ãªã‚Šã¾ã™ã€‚åˆæœŸå€¤ã¯ @samp{t} ã§ã™ã€‚ @end ifset @ifset en If @samp{mew-use-highlight-url} is @samp{t}, a spell is cast to URL strings in a message. So, when you move the cursor onto the URL, it is highlighted. The default is @samp{t}. @end ifset @ifset ja @samp{mew-use-cursor-mark} ㌠@samp{t} ã®å ´åˆã€Summary モードã«ãŠã„ã¦ã€ ç¾åœ¨è¡¨ç¤ºã—ã¦ã„るメッセージã®è¡Œé ­ã«ã€@samp{mew-cursor-mark} ã§æŒ‡å®šã•れ㟠目å°ãŒä»˜ãã¾ã™ã€‚åˆæœŸå€¤ã¯ @samp{nil} ã§ã™ã€‚@samp{mew-cursor-mark} ã®åˆæœŸ 値㯠">" ã§ã™ã€‚ @end ifset @ifset en If @samp{mew-use-cursor-mark} is @samp{t}, the mark specified @samp{mew-cursor-mark} is putted to the beginning of the current line. The default is @samp{nil}. The default of @samp{mew-cursor-mark} is ">". @end ifset @ifset ja @samp{mew-use-highlight-cursor-line} ㌠@samp{t} ã®å ´åˆã€Summary モード ã§ã‚«ãƒ¼ã‚½ãƒ«ã®ã‚る行ã«ä¸‹ç·šãŒå¼•ã‹ã‚Œã¾ã™ã€‚åˆæœŸå€¤ã¯ @samp{t} ã§ã™ã€‚ @end ifset @ifset en If @samp{mew-use-highlight-cursor-line} is @samp{t}, underline is put on the cursor line in Summary mode. The default is @samp{t}. @end ifset @ifset ja @samp{mew-use-highlight-mouse-line} ㌠@samp{t} ã®å ´åˆã€Emacs ãŒãƒžã‚¦ã‚¹ã® 色付ã‘をサãƒãƒ¼ãƒˆã—ã¦ã„れã°ã€Summary モードã§ãƒžã‚¦ã‚¹ã®ã‚る行ã«è‰²ãŒã¤ãã¾ã™ã€‚ 真中ã®ãƒœã‚¿ãƒ³ã‚’クリックã—ãªãŒã‚‰ã€ãƒžã‚¦ã‚¹ã ã‘ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読む際ã«ã¯ã¨ã¦ã‚‚ 便利ã§ã™ã€‚åˆæœŸå€¤ã¯ @samp{nil} ã«ãªã£ã¦ã„ã¾ã™ã€‚ @end ifset @ifset en If @samp{mew-use-highlight-mouse-line} is @samp{t} on Emacs which supports mouse highlight, the mouse line is painted in Summary mode. This is very convenient to read messages clicking the middle button of the mouse. The default value is @samp{nil}. @end ifset @ifset ja @samp{mew-use-highlight-x-face} ㌠@samp{t} ã§ã€ãƒ˜ãƒƒãƒ€ä¸­ã® X-Face: ㌠Message モードã§ã‚¢ã‚¤ã‚³ãƒ³åŒ–ã•れã¾ã™ã€‚åˆæœŸå€¤ã¯ @samp{t} ã§ã™ã€‚ã“ã®æ©Ÿèƒ½ã‚’ 利用ã™ã‚‹ã«ã¯ã€@w{"}netpbm" 㨠"compface" パッケージをインストールã—ã¦ä¸‹ ã•ã„。 @end ifset @ifset en If @samp{mew-use-highlight-x-face} is @samp{t}, X-Face: in a header is iconified in Message mode. The default value is @samp{t}. To use this feature, install the "netpbm" package and the "compface" package. @end ifset @ifset ja 色を変更ã™ã‚‹ã«ã¯ã€Mew ã®ã‚½ãƒ¼ã‚¹ã¨ä¸€ç·’ã«é…布ã•れã¦ã„ã‚‹ "dot.theme" ã‚’ é©å½“ãªåå‰ã§ã‚³ãƒ”ーã—内容を変更ã—ã¾ã™ã€‚ã“ã“ã§ã¯ã€ãã®ãƒ•ァイルåã‚’ "~/.mew-theme.el" ã¨ã—ã¾ã—ょã†ã€‚ã¾ãšã€ã“ã®åå‰ã‚’ ".mew.el" ã§ @samp{mew-theme-file} ã«æŒ‡å®šã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en To modify colors, copy "dot.theme" contained Mew's source file to an appropriate place, say "~/.mew-theme.el". First, set @samp{mew-theme-file} to this file name in ".mew.el" as follows: @end ifset @lisp (setq mew-theme-file "~/.mew-theme.el") @end lisp @ifset ja 次ã«ä¸­èº«ã‚’変更ã—ã¾ã™ã€‚ãŸã¨ãˆã°ã€ä»¥ä¸‹ã®ã‚ˆã†ãªè¨­å®šãŒè¦‹ã¤ã‹ã‚Šã¾ã™ã€‚ @end ifset @ifset en Then, change the contents. For instance, you can find the following configuration. @end ifset @lisp (mew-setface-bold header-subject :tty "red" :light "Firebrick" :dark "OrangeRed") @end lisp @ifset ja シンボル @samp{header-subject} ã¯ã€ãƒ˜ãƒƒãƒ€ã® "Subject:" ã®å€¤ã‚’æ„味ã—ã¦ã„ ã¾ã™ã€‚:tty 㯠Emacs をカラーã®ç«¯æœ«ã§èµ·å‹•ã—ãŸå ´åˆã€:light 㨠:dark ã¯ã€ ãれãžã‚Œ Emacs をウインドウã§èµ·å‹•ã—ãŸã¨ãã®èƒŒæ™¯ãŒç™½ã¨é»’ã®å ´åˆã‚’æ„味ã—㦠ã„ã¾ã™ã€‚ @end ifset @ifset en The symbol @samp{header-subject} means the value of the "Subject:" field in a header. :tty is the case where Emacs is executed on a terminal while :light and :dark indicates the case where the background of Emacs executed with a window is white and black, respectively. @end ifset @ifset ja 端末ã§ã¯ green ã€èƒŒæ™¯ãŒç™½ãªã‚‰ ForestGreenã€èƒŒæ™¯ãŒé»’ãªã‚‰ LimeGreen ã¨è¨­ 定ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ @end ifset @ifset en If you wish green for a terminal, ForestGreen for the white background, and LimeGreen for the black background, modify the configuration as follows: @end ifset @lisp (mew-setface-bold header-subject :tty "green" :light "ForestGreen" :dark "LimeGreen") @end lisp @ifset ja シンボルã«ä½•ãŒã‚ã‚‹ã®ã‹ã¯ã€"dot.mew" を見ã¦ä¸‹ã•ã„。 @end ifset @ifset en To know what kind of symbols are prepared, see the "dot.mew". @end ifset @ifset ja ä¸Šè¨˜ã®æ–¹æ³•ã§ã¯ã€ãƒ˜ãƒƒãƒ€ã®ã™ã¹ã¦ã®ãƒ•ィールドåやフィールド値ã«å¯¾ã—ã¦ã‚·ãƒ³ ボルãŒå®šç¾©ã•れã¦ã„る訳ã§ã¯ã‚りã¾ã›ã‚“。ãã“ã§ã€ã©ã‚“ãªãƒ•ィールドã®è‰²ã§ã‚‚ ç°¡å˜ã«å¤‰æ›´ã§ãるよã†ã«ã€@samp{mew-header-color} 㨠@samp{mew-header-color-bold} ã¨ã„ã†é–¢æ•°ãŒç”¨æ„ã•れã¦ã„ã¾ã™ã€‚後者を使ã†ã¨ 太字ã«ã€å‰è€…を使ã†ã¨æ™®é€šã®æ–‡å­—ã«ãªã‚Šã¾ã™ã€‚ãŸã¨ãˆã°ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ä½¿ã„ã¾ ã™ã€‚ @end ifset @ifset en The method above does not prepare symbols for all field names and field value. So, @samp{mew-header-color} and @samp{mew-header-color-bold} exist to change colors easily. If you use the latter, characters become bold. The former results in normal. The following is a typical usage: @end ifset @lisp (mew-header-color-bold "Subject:" "LimeGreen" "OrangeRed") @end lisp @ifset ja ã“ã®è¨­å®šã§ã¯ã€"Subject:" ㌠LimeGreen ã®å¤ªå­—ã«ã€ãã®å€¤ãŒ OrangeRed ã®å¤ª å­—ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en With this configuration, "Subject:" becomes bold LimeGreen and its value turns into bold OrangeRed. @end ifset @ifset ja ã“ã®æ–¹æ³•ã§ã¯ã€ç«¯æœ«ã‚„背景ã®è‰²ã‚’考慮ã—ãŸè¨­å®šã¯ã§ãã¾ã›ã‚“。ã¾ãŸã€ãƒ•ィール ド値ã®è‰²ã‚’çœç•¥ã™ã‚‹ã¨ã€ãƒ•ィールドåã¨åŒã˜è‰²ãŒä½¿ç”¨ã•れã¾ã™ã€‚ @end ifset @ifset en The second method cannot specify the cases of terminal or background. If you omit the field value color, the field name color is used for the field value. @end ifset @node hooks, pop, highlight, Customize @ifset ja @section フック @end ifset @ifset en @section Hooks @end ifset @ifset ja Mew ã§ç”¨æ„ã•れã¦ã„るフックをã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en Here is a summary of hooks used in Mew. @end ifset @vtable @samp @ifset ja @item mew-env-hook Mew ã®èµ·å‹•時ã®ç’°å¢ƒãŒè¨­å®šã•れるå‰ã«è©•価ã•れる。 @item mew-init-hook Mew ã®èµ·å‹•時ã«è©•価ã•れる。 @item mew-status-update-hook çŠ¶æ…‹ã®æ›´æ–°(@samp{Z})ã®ã¨ãã«è©•価ã•れる。 @item mew-summary-mode-hook Summary モードã«å…¥ã‚‹ã¨ãã«è©•価ã•れる。 @item mew-virtual-mode-hook Virtual モードã«å…¥ã‚‹ã¨ãã«è©•価ã•れる。 @item mew-thread-display-hook スレッドãŒè¡¨ç¤ºã•れãŸå¾Œã«è©•価ã•れる。 @item mew-header-mode-hook Header モードã«å…¥ã‚‹ã¨ãã«è©•価ã•れる。 @item mew-draft-mode-hook Draft モードã«å…¥ã‚‹ã¨ãã«è©•価ã•れる。 @item mew-draft-mode-newdraft-hook æ–°ã—ã„è‰ç¨¿ãŒç”¨æ„ã•れãŸéš›ã«ã€Draft モードã«ãŠã„ã¦è©•価ã•れる。 @item mew-draft-mode-reedit-hook +draft ã§ãªã„フォルダã«ã‚ã‚‹å¤ã„è‰ç¨¿ã‚’å†ç·¨é›†ã—ãŸéš›ã«ã€Draft モードã«ãŠã„ ã¦è©•価ã•れる。 @item mew-draft-mode-reedit-draft-hook +draft ã§ãªã„フォルダã«ã‚ã‚‹è‰ç¨¿ã‚’å†ç·¨é›†ã—ãŸéš›ã«ã€Draft モードã«ãŠã„ã¦è©• 価ã•れる。 @item mew-draft-mode-reedit-queue-hook +queue ã¾ãŸã¯ +postq フォルダã«ã‚るメッセージをå†ç·¨é›†ã—ãŸéš›ã«ã€Draft モー ドã«ãŠã„ã¦è©•価ã•れる。 @item mew-draft-mode-edit-again-hook å¤ã„å½¢å¼ã§æˆ»ã£ã¦ããŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å†ç·¨é›†ã—ãŸéš›ã«ã€Draft モードã«ãŠã„ã¦è©•価 ã•れる。 @item mew-message-mode-hook Message モードã«å…¥ã‚‹ã¨ãã«è©•価ã•れる。 @item mew-message-hook メッセージ㌠Message モードã§è¡¨ç¤ºã•れる度ã«è©•価ã•れる。 @item mew-make-message-hook Draft モード㧠MIME メッセージを作るå‰ã€ã¤ã¾ã‚Š @samp{C-cC-m} ã®éš›ã®æœ€åˆ ã«è©•価ã•れる。例:(add-hook 'mew-make-message-hook 'ispell-message) @item mew-send-hook メッセージを SMTP ã§é€ä¿¡/キューイングã™ã‚‹å‰ã«è©•価ã•ã‚Œã‚‹ã€‚ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ€ 終形ãŒä½œã‚‰ã‚Œã‚‹å‰ã«è©•価ã•れるã“ã¨ã«æ³¨æ„。 @item mew-post-hook メッセージを NNTP ã§æŠ•ç¨¿/キューイングã™ã‚‹å‰ã«è©•価ã•ã‚Œã‚‹ã€‚ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ€ 終形ãŒä½œã‚‰ã‚Œã‚‹å‰ã«è©•価ã•れるã“ã¨ã«æ³¨æ„。 @item mew-real-send-hook メッセージを SMTP ã§é€ä¿¡/キューイングã™ã‚‹å‰ã«è©•価ã•ã‚Œã‚‹ã€‚ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ€ 終形ãŒä½œã‚‰ã‚ŒãŸå¾Œã«è©•価ã•れるã“ã¨ã«æ³¨æ„。 @item mew-real-post-hook メッセージを NNTP ã§é€ä¿¡/キューイングã™ã‚‹å‰ã«è©•価ã•ã‚Œã‚‹ã€‚ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ€ 終形ãŒä½œã‚‰ã‚ŒãŸå¾Œã«è©•価ã•れるã“ã¨ã«æ³¨æ„。 @item mew-smtp-flush-hook +queue フォルダã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚ã‚‹å ´åˆã«ã€SMTP ãŒèµ·å‹•ã•れるå‰ã«è©•価ã•れ る。 @item mew-nntp2-flush-hook +postq フォルダã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚ã‚‹å ´åˆã«ã€NNTP ãŒèµ·å‹•ã•れるå‰ã«è©•価ã•れ る。 @item mew-smtp-sentinel-hook SMTP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 @item mew-nntp-sentinel-hook å—信用㮠NNTP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 @item mew-nntp2-sentinel-hook é€ä¿¡ç”¨ã® NNTP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 @item mew-pop-sentinel-hook POP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 @item mew-pop-sentinel-non-biff-hook Biff ã§ã¯ãªã„ POP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 @item mew-imap-sentinel-hook IMAP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 @item mew-imap-sentinel-non-biff-hook Biff ã§ã¯ãªã„ IMAP ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 @item mew-scan-sentinel-hook Summary モード㮠@samp{s} ãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 @item mew-summary-ls-no-scan-hook Summary モード㮠@samp{s} ãŒãƒ•ォルダã®ä¸€è¦§ã‚’å–らãªã‹ã£ãŸå ´åˆã«è©•価ã•れる。 @item mew-summary-exec-hook Summary モード㮠@samp{x} ã®å®Ÿè¡ŒãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 @item mew-refile-guess-by-from-learn-hook mew-refile-guess-by-from-learn ãŒå®Ÿè¡Œã•れる際ã«è©•価ã•れる。 @item mew-sort-hook Summary モード㮠@samp{M-s} ã®å®Ÿè¡ŒãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 @item mew-pack-hook Summary モード㮠@samp{O} ã®å®Ÿè¡ŒãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 @item mew-summary-delete-folder-hook フォルダãŒå‰Šé™¤ã•れるã¨ãã«è©•価ã•れる。 @item mew-summary-rename-folder-hook フォルダåãŒå¤‰æ›´ã•れるã¨ãã«è©•価ã•れる。 @item mew-summary-toggle-disp-msg-hook Summary モード㮠@samp{v} ã®å®Ÿè¡ŒãŒçµ‚了ã™ã‚‹éš›ã«è©•価ã•れる。 @item mew-syntax-format-hook マルãƒãƒ‘ãƒ¼ãƒˆã®æ›¸å¼ã‚’作æˆã™ã‚‹é–¢æ•° @samp{mew-syntax-format} ãŒå‘¼ã°ã‚ŒãŸéš›ã« 評価ã•れる。 @item mew-addrbook-mode-hook アドレス帳ã®ç™»éŒ²ãƒ¢ãƒ¼ãƒ‰ã«å…¥ã‚‹ã¨ãã«è©•価ã•れる。 @item mew-cite-hook Draft モードã§å¼•用ã™ã‚‹éš›ã«å‘¼ã°ã‚Œã‚‹ã€‚通常 supercite を設定ã™ã‚‹ãŸã‚ã«ä½¿ã†ã€‚ @item mew-before-cite-hook Draft モードã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’引用ã™ã‚‹ç›´å‰ã«å‘¼ã°ã‚Œã‚‹ã€‚ @item mew-suspend-hook Mew を一時中断ã—ãŸéš›ã«è©•価ã•れる。 @item mew-quit-hook Mew ã®çµ‚了時ã«è©•価ã•れる。 @end ifset @ifset en @item mew-env-hook Hook called at initialize time before setting environment. @item mew-init-hook Hook called at initialize time. @item mew-status-update-hook Hook called at status update(@samp{Z}). @item mew-summary-mode-hook Hook called in Summary mode. @item mew-virtual-mode-hook Hook called in Virtual mode. @item mew-thread-display-hook Hook called after new threads are displayed. @item mew-header-mode-hook Hook called in Header mode. @item mew-draft-mode-hook Hook called in Draft mode. @item mew-draft-mode-newdraft-hook Hook called in Draft mode only when new draft is prepared. @item mew-draft-mode-reedit-hook Hook called in Draft mode when a message not in +draft is re-edited. @item mew-draft-mode-reedit-draft-hook Hook called in Draft mode when a message in +draft is re-edited. @item mew-draft-mode-reedit-queue-hook Hook called in Draft mode when a message in +queue or +postq is re-edited. @item mew-draft-mode-edit-again-hook Hook called in Draft mode when a message returned with the old style is edited again. @item mew-message-mode-hook Hook called in Message mode. @item mew-message-hook Hook called whenever message displayed. @item mew-make-message-hook Hook called before making a message in Draft mode. A good example is as follows: (add-hook 'mew-make-message-hook 'ispell-message) @item mew-send-hook Hook called before sending/queuing an e-mail message in Draft mode. Note that this hook is called before composition of the message @item mew-post-hook Hook called before posting/queuing a NetNews message in Draft mode. Note that this hook is called before composition of the message. @item mew-real-send-hook Hook called before sending/queuing an e-mail message in Draft mode. Note that this hook is called after composition of the message. @item mew-real-post-hook Hook called before sending/queuing a NetNews message in Draft mode. Note that this hook is called after composition of the message. @item mew-smtp-flush-hook Hook called before SMTP runs if messages exist in +queue. @item mew-nntp2-flush-hook Hook called before NNTP runs if messages exist in +postq. @item mew-smtp-sentinel-hook Hook called when a SMTP process finished. @item mew-nntp-sentinel-hook Hook called when a NNTP process to receive messages finished. @item mew-nntp2-sentinel-hook Hook called when a NNTP process to post messages finished. @item mew-pop-sentinel-hook Hook called when a POP process finished. @item mew-pop-sentinel-non-biff-hook Hook called when a non-Biff POP process finished. @item mew-imap-sentinel-hook Hook called when a NNTP process to post messages finished. @item mew-imap-sentinel-hook Hook called when an IMAP process finished. @item mew-imap-sentinel-non-biff-hook Hook called when a non-Biff IMAP process finished. @item mew-scan-sentinel-hook Hook called when scan finished. @item mew-summary-ls-no-scan-hook Hook called when mew-summary-ls does not scan a folder. @item mew-summary-exec-hook Hook called when @samp{x} in Summary mode finished. @item mew-refile-guess-by-from-learn-hook Hook called in mew-refile-guess-by-from-learn. @item mew-sort-hook Hook called when @samp{M-s} in Summary mode finished. @item mew-pack-hook Hook called when @samp{O} in Summary mode finished. @item mew-summary-delete-folder-hook Hook called when a folder deleted. @item mew-summary-rename-folder-hook Hook called when a folder renamed. @item mew-summary-toggle-disp-msg-hook Hook called when @samp{v} in Summary finished. @item mew-syntax-format-hook Hook called when mew-syntax-format is called. @item mew-addrbook-mode-hook Hook called in Addrbook mode. @item mew-cite-hook Hook for an external cite mechanism. If you want to use super-cite, (setq mew-cite-hook 'sc-cite-original). @item mew-before-cite-hook Called in mew-summary-reply-with-citation before citation. @item mew-suspend-hook Hook called on suspend. @item mew-quit-hook Hook called on quit. @end ifset @end vtable @ifset ja 以下ã«ãƒ•ックã®è¨­å®šä¾‹ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en Here are some example configurations of hook @end ifset @ifset ja Draft モードã§ã¯ã€ãƒ•ックを @samp{text-mode-hook}〠@samp{mew-draft-mode-hook} ã®é †ã§è©•価ã—ã¾ã™ã€‚@samp{text-mode-hook} ã§ @samp{auto-fill-mode} を設定ã—ã¦ã„ãªã„人ã¯ã€ @samp{mew-draft-mode-hook} を以下ã®ã‚ˆã†ã«è¨­å®šã™ã‚‹ã®ãŒã‚ˆã„ã‹ã‚‚ã—れã¾ã›ã‚“。 @end ifset @ifset en Draft mode evaluates @samp{text-mode-hook} and @samp{mew-draft-mode-hook} in order. If you do not set @samp{auto-fill-mode} to @samp{text-mode-hook}, It would be useful to define @samp{mew-draft-mode-hook} as follows: @end ifset @lisp (add-hook 'mew-draft-mode-hook (lambda () (auto-fill-mode 1) (set-fill-column 70))) @end lisp @ifset ja ã“ã®ä¾‹ã§ã¯ã€æŠ˜ã‚Šè¿”ã—ã®ã‚«ãƒ©ãƒ æ•°ã‚’70ã«è¨­å®šã—ã¦ã„ã¾ã™ã€‚ @end ifset @ifset en In this example, the number of fill column is also set to 70. @end ifset @c %%%%%%%%%%%%%%%%% @node pop, imap, hooks, Customize @ifset ja @section POP @end ifset @ifset en @section POP @end ifset @ifset ja Mew ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã™ã‚‹éš›ã« POP を利用ã§ãã¾ã™ã€‚ã“ã“ã§ã¯ã€POP ã‚’ 制御ã™ã‚‹ãŸã‚ã®ä»¥ä¸‹ã®å¤‰æ•°ã«ã¤ã„ã¦ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en Mew can POP to retrieve messages. This section describes following variables to control POP. @end ifset @vtable @samp @ifset ja @item mew-pop-server POP サーãƒã®åå‰ã€‚ @item mew-pop-ssh-server POP ã‚’ SSH 経由ã§å–å¾—ã™ã‚‹å ´åˆã® SSH サーãƒã®åå‰ã€‚ @item mew-pop-ssl POP over SSL を使ã†ã‹å¦ã‹ã€‚ @item mew-pop-ssl-port POP over SSL ã®ãƒãƒ¼ãƒˆç•ªå·ã€‚ @item mew-pop-user POP ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆåã€‚åˆæœŸå€¤ã¯ãƒ­ã‚°ã‚¤ãƒ³å。 @item mew-pop-auth POP ã®èªè¨¼æ–¹å¼ã€‚@samp{'pass} 㯠USER/PASS (生パスワード)ã€@samp{'apop} 㯠APOPã€@samp{t} 㯠@samp{mew-pop-auth-list} ã«å¾“ã£ãŸ SASL ã‚’æ„味ã™ã‚‹ã€‚ åˆæœŸå€¤ã¯ @samp{'apop}。 @item mew-pop-auth-list SASL ã§åˆ©ç”¨ã™ã‚‹èªè¨¼æ–¹å¼ã®ãƒªã‚¹ãƒˆã€‚優先順ä½ã®é«˜ã„é †ã«ä¸¦ã¹ã‚‹ã€‚ç¾åœ¨ã€ "CRAM-MD5" ãŒåˆ©ç”¨å¯èƒ½ã€‚ @item mew-pop-delete POP サーãƒã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–得後ã€POP サーãƒã«ã‚るメッセージを削除ã™ã‚‹ã‹ å¦ã‹ã€‚@samp{t} ãªã‚‰å‰Šé™¤ã€‚@samp{nil} ãªã‚‰å‰Šé™¤ã—ãªã„。数値 N ãªã‚‰ã€æœ€åˆã® アクセスã‹ã‚‰ N 日後ã«å‰Šé™¤ã™ã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{t}。 @item mew-pop-size POP サーãƒã‹ã‚‰å–å¾—ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¤§ãã•ã®ä¸Šé™ã€‚åˆæœŸå€¤ã¯ 55296 ãƒã‚¤ãƒˆã€‚0 ã«è¨­å®šã™ã‚‹ã¨ã€ä¸Šé™ãªã—ã®æ„味ã«ãªã‚Šã€ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹ã€‚上é™ã« å¼•ã£æŽ›ã‹ã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å…¨ä½“ã‚’å–å¾—ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€@xref{retrieving} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item mew-pop-body-lines 大ãã•ã®ä¸Šé™ã«ã²ã£ã‹ã‹ã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®æœ¬æ–‡ã‚’何行å–å¾—ã™ã‚‹ã‹ã¨ã„ã†å€¤ã€‚åˆ æœŸå€¤ã¯ 40。 @item mew-pop-header-only POP ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹éš›ã«ã€ãƒ˜ãƒƒãƒ€ã®ã¿ã«ã™ã‚‹ã‹ã€æœ¬æ–‡ã‚‚å–å¾—ã™ã‚‹ã‹ã€‚ @samp{nil} ã§ãªã‘れã°ã€ãƒ˜ãƒƒãƒ€ã®ã¿ã‚’å–å¾—ã€‚åˆæœŸå€¤ã¯ @samp{nil}。 @end ifset @ifset en @item mew-pop-server The name of your POP server. @item mew-pop-ssh-server The name of SSH server which forwards the POP3 port. @item mew-pop-ssl If non-nil, POP connections are made over SSL. @item mew-pop-ssl-port The port for POP over SSL. @item mew-pop-user The user name on your POP server. The default is your login name. @item mew-pop-auth The authentication method for POP3. 'pass means the authentication with USER/PASS (i.e. plain password). 'apop means the authentication with APOP. @samp{t} means SASL according to @samp{mew-pop-auth-list}. The default is 'apop. @item mew-pop-auth-list A list of SASL methods in the preferred order. Currently, "CRAM-MD5" can be used. @item mew-pop-delete Whether or not delete messages on a POP server after retrieval by POP. If @samp{t}, delete the messages. If @samp{nil}, retain the messages. If number N, delete the messages N days after the first access. The default is @samp{t}. @item mew-pop-size The limit size of messages to be retrieved by POP. The default is 55296 byte. 0 means unlimited, so you can get all messages from the POP server. To know how to retrieve the rest of a truncated message, please refer to @ref{retrieving}. @item mew-pop-body-lines *The limit of body lines to get when the size of message exceeds @samp{mew-pop-size}. The default is 40. @item mew-pop-header-only Whether or not the body of a message is retrieved by POP. If non-nil, only header is retrieved. The default is @samp{nil} @end ifset @end vtable @c %%%%%%%%%%%%%%%%% @node imap, nntp, pop, Customize @ifset ja @section IMAP @end ifset @ifset en @section IMAP @end ifset @ifset ja Mew ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å—ä¿¡ã™ã‚‹éš›ã« IMAP を利用ã§ãã¾ã™ã€‚ã“ã“ã§ã¯ã€IMAP を制御ã™ã‚‹ãŸã‚ã®ä»¥ä¸‹ã®å¤‰æ•°ã«ã¤ã„ã¦ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en Mew can use IMAP to retrieve messages. This section describes following variables to control IMAP. @end ifset @vtable @samp @ifset ja @item mew-imap-server IMAP サーãƒã®åå‰ã€‚ @item mew-imap-ssh-server IMAP ã‚’ SSH 経由ã§å–å¾—ã™ã‚‹å ´åˆã® SSH サーãƒã®åå‰ã€‚ @item mew-imap-ssl IMAP over SSL を使ã†ã‹å¦ã‹ã€‚ @item mew-imap-ssl-port IMAP over SSL ã®ãƒãƒ¼ãƒˆç•ªå·ã€‚ @item mew-imap-user IMAP ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆåã€‚åˆæœŸå€¤ã¯ãƒ­ã‚°ã‚¤ãƒ³å。 @item mew-imap-auth IMAP ã®èªè¨¼æ–¹å¼ã€‚@samp{nil} 㯠LOGIN (生パスワード)ã€@samp{t} 㯠@samp{mew-imap-auth-list} ã«åŸºã¥ã„㟠SASL ã‚’æ„味ã™ã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{t}。 @item mew-imap-auth-list SASL ã§åˆ©ç”¨ã™ã‚‹èªè¨¼æ–¹å¼ã®ãƒªã‚¹ãƒˆã€‚優先順ä½ã®é«˜ã„é †ã«ä¸¦ã¹ã‚‹ã€‚ç¾åœ¨ã€ "CRAM-MD5" 㨠"LOGIN" ãŒåˆ©ç”¨å¯èƒ½ã€‚ @item mew-imap-delete IMAP サーãƒã‹ã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–得後ã€IMAP サーãƒã«ã‚るメッセージを削除ã™ã‚‹ã‹ å¦ã‹ã€‚@samp{t} ãªã‚‰å‰Šé™¤ã€‚@samp{nil} ãªã‚‰å‰Šé™¤ã—ãªã„。数値 N ãªã‚‰ã€æœ€åˆã® アクセスã‹ã‚‰ N 日後ã«å‰Šé™¤ã™ã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{t}。 @item mew-imap-size IMAP サーãƒã‹ã‚‰å–å¾—ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¤§ãã•ã®ä¸Šé™ã€‚åˆæœŸå€¤ã¯ 55296 ãƒã‚¤ãƒˆã€‚ 0 ã«è¨­å®šã™ã‚‹ã¨ã€ä¸Šé™ãªã—ã®æ„味ã«ãªã‚Šã€ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹ã€‚ä¸Šé™ ã«å¼•ã£æŽ›ã‹ã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å…¨ä½“ã‚’å–å¾—ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€ @xref{retrieving} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item mew-imap-header-only IMAP ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹éš›ã«ã€ãƒ˜ãƒƒãƒ€ã®ã¿ã«ã™ã‚‹ã‹ã€æœ¬æ–‡ã‚‚å–å¾—ã™ã‚‹ã‹ã€‚ @samp{nil} ã§ãªã‘れã°ã€ãƒ˜ãƒƒãƒ€ã®ã¿ã‚’å–å¾—ã€‚åˆæœŸå€¤ã¯ @samp{nil}。 @end ifset @ifset en @item mew-imap-server The name of your IMAP server. @item mew-imap-ssh-server The name of SSH server which forwards the IMAP4 port. @item mew-imap-ssl If non-nil, IMAP connections are made over SSL. @item mew-imap-ssl-port The port for IMAP over SSL. @item mew-imap-user The user name on the IMAP server. The default is your login name. @item mew-imap-auth The authentication method for IMAP4. @samp{nil} means the authentication with LOGIN (i.e. plain password). @samp{t} means SASL according to @samp{mew-imap-auth-list}. The default is @samp{t}. @item mew-imap-auth-list A list of SASL methods in the preferred order. Currently, "CRAM-MD5" and "LOGIN" can be used. @item mew-imap-delete Whether or not delete messages on an IMAP server after retrieval by IMAP. If @samp{t}, delete the messages. If @samp{nil}, retain the messages. If number N, delete the messages N days after the first access. Otherwise they are not deleted. The default is @samp{t}. @item mew-imap-size The limit size of messages to be retrieved by IMAP. The default is 55296 byte. 0 means unlimited, so you can get all messages from the IMAP server. To know how to retrieve the rest of a truncated message, please refer to @ref{retrieving}. @item mew-imap-header-only Whether or not the body of a message is retrieved by IMAP. If non-nil, only header is retrieved. The default is @samp{nil} @end ifset @end vtable @c %%%%%%%%%%%%%%%%% @node nntp, smtp, imap, Customize @ifset ja @section NNTP @end ifset @ifset en @section NNTP @end ifset @ifset ja Mew ã§ã¯ã€ãƒ‹ãƒ¥ãƒ¼ã‚¹ã‚’èª­ã¿æ›¸ãã™ã‚‹éš›ã« NNTP を利用ã—ã¾ã™ã€‚ã“ã“ã§ã¯ã€NNTP を制御ã™ã‚‹ãŸã‚ã®ä»¥ä¸‹ã®å¤‰æ•°ã«ã¤ã„ã¦ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en Mew uses NNTP to read/write News articles. This section describes following variables to control NNTP. @end ifset @vtable @samp @ifset ja @item mew-nntp-server NNTP サーãƒã®åå‰ã€‚ @item mew-nntp-ssh-server NNTP ã‚’ SSH 経由ã§å–å¾—ã™ã‚‹å ´åˆã® SSH サーãƒã®åå‰ã€‚ @item mew-nntp-ssl NNTP over SSL を使ã†ã‹å¦ã‹ã€‚ @item mew-nntp-ssl-port NNTP over SSL ã®ãƒãƒ¼ãƒˆç•ªå·ã€‚ @item mew-nntp-user NNTP ã®ã‚¢ã‚«ã‚¦ãƒ³ãƒˆå。も㗠@samp{nil} ã§ãªã‘れã°ã€èªè¨¼ã®æ‰‹ç¶šããŒå®Ÿè¡Œã•れ る。(mew-nntp-auth ã¨ã„ã†å¤‰æ•°ã¯ãªã„ã“ã¨ã«æ³¨æ„。) @item mew-nntp-newsgroup ニュースグループåã®åˆæœŸå€¤ã€‚ @item mew-nntp-size NNTP サーãƒã‹ã‚‰å–å¾—ã™ã‚‹ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å¤§ãã•ã®ä¸Šé™ã€‚åˆæœŸå€¤ã¯ 55296 ãƒã‚¤ãƒˆã€‚ 0 ã«è¨­å®šã™ã‚‹ã¨ã€ä¸Šé™ãªã—ã®æ„味ã«ãªã‚Šã€ã™ã¹ã¦ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹ã€‚ä¸Šé™ ã«å¼•ã£æŽ›ã‹ã£ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®å…¨ä½“ã‚’å–å¾—ã™ã‚‹æ–¹æ³•ã«ã¤ã„ã¦ã¯ã€ @xref{retrieving} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @item mew-nntp-header-only NNTP ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã™ã‚‹éš›ã«ã€ãƒ˜ãƒƒãƒ€ã®ã¿ã«ã™ã‚‹ã‹ã€æœ¬æ–‡ã‚‚å–å¾—ã™ã‚‹ã‹ã€‚ @samp{nil} ã§ãªã‘れã°ã€ãƒ˜ãƒƒãƒ€ã®ã¿ã‚’å–å¾—ã€‚åˆæœŸå€¤ã¯ @samp{nil}。 @item mew-nntp-msgid-user Message-Id: を作æˆã™ã‚‹ãŸã‚ã®ãƒ¦ãƒ¼ã‚¶å。@samp{nil} ã§ã‚れ㰠@samp{mew-user} ã®å€¤ãŒåˆ©ç”¨ã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{nil}。 Message-Id: ã®æ›¸å¼ã¯ä»¥ä¸‹ã‚’å‚照。 @item mew-nntp-msgid-domain Message-Id: を作æˆã™ã‚‹ãŸã‚ã®ãƒ‰ãƒ¡ã‚¤ãƒ³å。@samp{nil} ã§ã‚れ㰠@samp{mew-mail-domain} ã®å€¤ãŒåˆ©ç”¨ã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{nil}。 Message-Id: ã®æ›¸å¼ã¯ä»¥ä¸‹ã‚’å‚照。 @end ifset @ifset en @item mew-nntp-server The name of your NNTP server. @item mew-nntp-ssh-server The name of SSH server which forwards the NNTP port. @item mew-nntp-ssl If non-nil, NNTP connections are made over SSL. @item mew-nntp-ssl-port The port for NNTP over SSL. @item mew-nntp-user The user name on the NNTP server. If non-nil, authentication is used. (Note that mew-nntp-auth does not exist.) @item mew-nntp-newsgroup The name of default Newsgroup. @item mew-nntp-size The limit size of messages to be retrieved by NNTP. The default is 55296 byte. 0 means unlimited, so you can get all messages from the NNTP server. @item mew-nntp-header-only Whether or not the body of a message is retrieved by NNTP. If non-nil, only header is retrieved. @item mew-nntp-msgid-user A user name for creation of Message-Id:. If @samp{nil}, the value of @samp{mew-user} is used. The default is @samp{nil}. @item mew-nntp-msgid-domain A domain name for creation of Message-Id:. If @samp{nil}, the value of @samp{mew-mail-domain} is used. The default is @samp{nil}. @end ifset @end vtable @ifset ja ãªãŠã€NNTP 用㮠Message-Id: ã®å€¤ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ä½œæˆã•れã¾ã™ã€‚ @end ifset @ifset en A value of Message-Id: for NNTP is created by the following rule: @end ifset @example message-id = *random*.nntp-msgid-user@@nntp-msgid-domain @end example @c %%%%%%%%%%%%%%%%% @node smtp, config, nntp, Customize @ifset ja @section SMTP @end ifset @ifset en @section SMTP @end ifset @ifset ja Mew ã§ã¯ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ä¿¡ã™ã‚‹éš›ã« SMTP を利用ã—ã¾ã™ã€‚SMTP サーãƒãŒèªè¨¼ ã‚’è¦æ±‚ã—ãŸå ´åˆã€Mew ã¯è‡ªå‹•çš„ã«ãƒ¦ãƒ¼ã‚¶ã«ãƒã‚¹ãƒ¯ãƒ¼ãƒ‰ã®å…¥åŠ›ã‚’æ±‚ã‚ã¾ã™ã€‚ã“ã“ ã§ã¯ã€SMTP を制御ã™ã‚‹ãŸã‚ã®ä»¥ä¸‹ã®å¤‰æ•°ã«ã¤ã„ã¦ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en Mew uses SMTP to send messages. If an SMTP server requires authentication, Mew automatically asks you to input your password. This section describes following variables to control SMTP. @end ifset @vtable @samp @ifset ja @item mew-smtp-server SMTP サーãƒã®åå‰ã€‚ @item mew-smtp-port SMTP ãƒãƒ¼ãƒˆç•ªå·ã€‚ @item mew-smtp-ssh-server SSH 経由ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‹éš›ã® SSH サーãƒã®åå‰ã€‚ @item mew-smtp-ssl SMTP over SSL を使ã†ã‹å¦ã‹ã€‚ @item mew-smtp-ssl-port SMTP over SSL ã®ãƒãƒ¼ãƒˆç•ªå·ã€‚ @item mew-smtp-user SMTP AUTH ã§åˆ©ç”¨ã•れるアカウントå。設定ã•れãªã„å ´åˆã¯ã€è‡ªå‹•çš„ã«ãƒ¡ãƒ¼ãƒ« アドレスã«è¨­å®šã•れる。 @item mew-smtp-auth-list SMTP AUTH ã§åˆ©ç”¨ã™ã‚‹èªè¨¼æ–¹å¼ã®ãƒªã‚¹ãƒˆã€‚優先順ä½ã®é«˜ã„é †ã«ä¸¦ã¹ã‚‹ã€‚åˆæœŸå€¤ ã¯ã€'("CRAM-MD5" "PLAIN" "LOGIN")。 @item mew-smtp-helo-domain SMTP HELO コマンドã§ä½¿ã‚れるサーãƒåã€‚åˆæœŸå€¤ã¯ "localhost"。 @item mew-smtp-mail-from SMTP MAIL FROM ã‚³ãƒžãƒ³ãƒ‰ã§æŒ‡å®šã•れるアドレス。@samp{nil} ã®å ´åˆã¯ã€From: フィールドã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒæŒ‡å®šã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{nil}。 @item mew-smtp-msgid-user Message-Id: を作æˆã™ã‚‹ãŸã‚ã®ãƒ¦ãƒ¼ã‚¶å。@samp{nil} ã§ã‚れ㰠@samp{mew-user} ã®å€¤ãŒåˆ©ç”¨ã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{nil}。 Message-Id: ã®æ›¸å¼ã¯ä»¥ä¸‹ã‚’å‚照。 @item mew-smtp-msgid-domain Message-Id: を作æˆã™ã‚‹ãŸã‚ã®ãƒ‰ãƒ¡ã‚¤ãƒ³å。@samp{nil} ã§ã‚れ㰠@samp{mew-mail-domain} ã®å€¤ãŒåˆ©ç”¨ã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{nil}。 Message-Id: ã®æ›¸å¼ã¯ä»¥ä¸‹ã‚’å‚照。 @item mew-use-8bit 8 ビットテキストを符å·åŒ–ã›ãšã«ãã®ã¾ã¾é€ã‚‹ã‹å¦ã‹ã€‚@samp{nil} ã®å ´åˆã¯ã€é© 切㪠MIME 符å·åŒ–ãŒæ–½ã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{nil}。 @end ifset @ifset en @item mew-smtp-server The name of your SMTP server. @item mew-smtp-port The port for SMTP. @item mew-smtp-ssh-server The name of SSH server which forwards the SMTP port. @item mew-smtp-ssl If non-nil, SMTP connections are made over SSL. @item mew-smtp-ssl-port The port for SMTP over SSL. @item mew-smtp-user The user name on your SMTP server. If not configured, your e-mail address is automatically set. @item mew-smtp-auth-list A list of SMTP AUTH methods in the preferred order. Currently, "CRAM-MD5", "PLAIN", and "LOGIN" can be used. @item mew-smtp-helo-domain An e-mail domain to tell a SMTP server with HELO/EHLO. The default is "localhost". @item mew-smtp-mail-from The default is @samp{nil}. An e-mail address to tell a SMTP server with MAIL FROM:. If @samp{nil}, an address specified by the From: field is used. @item mew-smtp-msgid-user A user name for creation of Message-Id:. If @samp{nil}, the value of @samp{mew-user} is used. The default is @samp{nil}. @item mew-smtp-msgid-domain A domain name for creation of Message-Id:. If @samp{nil}, the value of @samp{mew-mail-domain} is used. The default is @samp{nil}. @item mew-use-8bit Whether or not send 8bit text without MIME encoding. If @samp{nil}, an appropriate MIME encoding is applied. The default is @samp{nil}. @end ifset @end vtable @ifset ja ãªãŠã€SMTP 用㮠Message-Id: ã®å€¤ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ä½œæˆã•れã¾ã™ã€‚ @end ifset @ifset en A value of Message-Id: for SMTP is created by the following rule: @end ifset @example message-id = *random*.smtp-msgid-user@@smtp-msgid-domain @end example @ifset ja Message Submission (ãƒãƒ¼ãƒˆç•ªå·ãŒ 587 ã§ã‚ã‚‹é€ä¿¡ç”¨ã® SMTP)を使ã„ãŸã„å ´åˆ ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en If you want to use Message Submission (SMTP for submission whose port number is 587), configure as follows: @end ifset @lisp (setq mew-smtp-port "submission") @end lisp @ifset ja SSL (@xref{SSL})ã‚„ TLS (@xref{TLS}) ã®ç« ã‚‚å‚考ã«ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Please refer also to SSL (@pxref{SSL}) and TLS (@pxref{TLS}). @end ifset @ifset ja SMTP サーãƒã®ä¸­ã«ã¯ã€èªè¨¼ãªã—ã€ã¤ã¾ã‚Šãƒ‘スワードをé€ã‚‰ã‚Œã‚‹ã¨ã‚¨ãƒ©ãƒ¼ã¨è¦‹ãª ã™è¨­å®šã§ã‚ã‚‹ã«ã‚‚é–¢ã‚らãšã€èªè¨¼ã‚’è¦æ±‚ã—ã¦ãã‚‹ã‚‚ã®ãŒã‚りã¾ã™ã€‚Mew ã¯ã€ SMTP サーãƒãŒèªè¨¼ã‚’è¦æ±‚ã™ã‚‹ã¨ã€ãƒ¦ãƒ¼ã‚¶ã«ãƒ‘スワードを尋ã­ã¦ã€å…¥åŠ›ã•れãŸãƒ‘ スワードをサーãƒã¸é€ã‚Šã¾ã™ã€‚上記ã®ã‚ˆã†ãªãŠã‹ã—㪠SMTP サーãƒã«å¯¾å‡¦ã™ã‚‹ ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã€èªè¨¼ã‚’è¦æ±‚ã•れã¦ã‚‚パスワードをé€ã‚‰ãªãã™ã‚Œã°ã‚ˆ ã„ã§ã—ょã†ã€‚ @end ifset @ifset en Some SMTP servers are mis-configured. They requests authentication though errors occur if passwords are received. Mew automatically ask a user to input user's password and send it to an SMTP server if it requires authentication. To get along with such SMTP servers above, configure as follows: @end ifset @lisp (setq mew-use-smtp-auth nil) @end lisp @vtable @samp @ifset ja @item mew-use-smtp-auth SMTP サーãƒãŒèªè¨¼ã‚’è¦æ±‚ã—ãŸã¨ãã€ãƒ‘スワードをé€ã‚‹ã‹ã©ã†ã‹ã€‚デフォルト㯠@samp{t}。@samp{nil} ã«ã™ã‚‹ã¨ã€SMTP サーãƒãŒèªè¨¼ã‚’è¦æ±‚ã—ã¦ã‚‚無視ã™ã‚‹ã€‚ @end ifset @ifset en @item mew-use-smtp-auth If non-nil, Mew send user's password if an SMTP server requests authentication. The default value is @samp{t}. If @samp{nil}, Mew does not send user's password even if the (mis-configured) SMTP server requests authentication. @end ifset @end vtable @c %%%%%%%%%%%%%%%%% @node config, config2, smtp, Customize @ifset ja @section é€å—ä¿¡ã®å‹•作変化 @end ifset @ifset en @section Changing receiving/sending behavior @end ifset @vindex mew-config-alist @vindex mew-case-guess-alist @vindex mew-case-guess-when-replied-alist @vindex mew-mailbox-type @vindex mew-proto @kindex C-cC-o (Draft) @ifset ja @samp{mew-config-alist} を使ã†ã¨ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®é€å—ä¿¡ã«é–¢ã™ã‚‹å‹•作ã«å¤‰åŒ–ã‚’ ã¤ã‘られã¾ã™ã€‚以下ã®è¨­å®šä¾‹ã‚’使ã£ã¦èª¬æ˜Žã—ã¾ã™ã€‚ @end ifset @ifset en With @samp{mew-config-alist}, you can differ actions of sending/receiving messages. Let's look at the following example: @end ifset @lisp (setq mew-config-alist '((home (inbox-folder "+inbox-home") (pop-server "pop.iij4u.or.jp")) (ext (pop-ssh-server "ssh.example.org")) (default (proto "%") (imap-server "imap.example.org") (pop-server "pop.example.org")))) @end lisp @ifset ja ã“ã®ä¾‹ã§ã¯ã€"home"ã€"ext"ã€"default" ã¨ã„ㆠ3 ã¤ã®ã‚±ãƒ¼ã‚¹ã‚’定ã‚ã¦ã„ã¾ã™ã€‚ ãれãžã‚Œã®ã‚±ãƒ¼ã‚¹ã«å¯¾ã—ã¦ã€ã„ãã¤ã‹ã®ã‚­ãƒ¼ã¨å€¤ã®å¯¾ãŒè¨­å®šã•れã¦ã„ã¾ã™ã€‚ @end ifset @ifset en This example defines three "cases": "home", "ext", and "default". For each case, some pair of key and value are defined. @end ifset @ifset ja ã“ã®ä¾‹ã‚’使ã£ã¦ã€@samp{mew-config-alist} ã®æ„味を説明ã—ã¾ã™ã€‚ケースを "home" ã«ã—㦠"pop-server" ã‚’ç´¢ãã¨ã€"pop.iij4u.or.jp" ãŒå¾—られã¾ã™ã€‚ケー スを @w{"}ext" ã«ã—㦠"pop-server" ã‚’ç´¢ãã¨ã€"ext" ã«ã¯è©²å½“ã™ã‚‹ã‚­ãƒ¼ãŒãª ã„ã®ã§ã€@w{"}default" を見ã¦ã€"pop.example.org" ãŒå¾—られã¾ã™ã€‚ケースを "default" ã«ã—㦠"pop-server" ã‚’ç´¢ãã¨ã€"pop.example.org" ãŒå¾—られã¾ã™ã€‚ @end ifset @ifset en We explain the semantics of @samp{mew-config-alist} with this example. If the "case" is "home", looking up "pop-server" results in @w{"}pop.iij4u.or.jp". If the "case" is "ext", looking up "pop-server" results in "pop.example.org" since there is no specified key for the @w{"}case" and the "default" is used. If the "case" is "default", looking up "pop-server" results in "pop.example.org". @end ifset @ifset ja ケースを "home" ã«ã—㦠"inbox-folder" ã‚’ç´¢ãã¨ã€"+inbox-home" ãŒå¾—られ㾠ã™ã€‚ケースを "ext" ã«ã—㦠"inbox-folder" ã‚’ç´¢ãã¨ã€"ext" ã«ã¯è©²å½“ã™ã‚‹ã‚­ãƒ¼ ãŒãªãã€ã•ら㫠"default" ã«ã‚‚ãªã„ã®ã§ã€@samp{mew-inbox-folder} ã¨ã„ã†å¤‰ æ•°ã®å€¤ãŒå¾—られã¾ã™ã€‚ケースを "default" ã«ã—㦠"inbox-folder" ã‚’ç´¢ã„ãŸå ´ åˆã‚‚ã€@samp{mew-inbox-folder} ã®å€¤ãŒå¾—られã¾ã™ã€‚ @end ifset @ifset en If the "case" is "home", looking up "inbox-folder" results in "+inbox-home". If the "case" is "ext", looking up "inbox-folder" results in the value of @samp{mew-inbox-folder} since there is no specified key for both "ext" and "default". If the "case" is "default", looking up "inbox-folder" also results in the value of @samp{mew-inbox-folder}. @end ifset @ifset ja "proto" (@samp{mew-proto})ã¯ã€@samp{M-x mew} ã¨å…¥åŠ›ã•れãŸéš›ã«ã€ã©ã®ãƒ•ã‚© ルダã«ç§»å‹•ã™ã‚‹ã‹æŒ‡å®šã™ã‚‹ãŸã‚ã«ä½¿ã„ã¾ã™ã€‚(Mew ã‚’èµ·å‹•ã™ã‚‹ãŸã‚ã« @samp{M-x mew} ã¨å…¥åŠ›ã™ã‚‹å ´åˆã€"default" ケース㮠"proto" ãŒåˆ©ç”¨ã•れ㾠ã™ã€‚Mew ãŒèµ·å‹•ã—ã¦ã„ã‚‹éš›ã«ã€@samp{M-x mew} ã¨å…¥åŠ›ã™ã‚‹ã¨ã‚±ãƒ¼ã‚¹ã«å¾“ã£ã¦ã€ "proto" ãŒé¸ã°ã‚Œã¾ã™ã€‚) @end ifset @ifset en "proto" (@samp{mew-proto}) is used to specify a folder which is selected when you type @samp{M-x mew}. (If you input @samp{M-x mew} when Mew is not executed, ""proto" for the "default" "case" is used. If you type @samp{M-x mew} when Mew is running, "proto" is chosen according to the value of the "case". @end ifset @ifset ja 値ã®å€™è£œã¯ã€"+"ã€"$"ã€"%"ã€"-" ã§ã™ã€‚ã“ã‚Œã‚‰ã¯æ¨™æº–ã§ã¯ã€"+inbox"〠@w{"}$inbox"ã€"%inbox"ã€"-fj.mail.reader.mew" ã‚’æ„味ã—ã¾ã™ã€‚ @end ifset @ifset en Candidates of the value are "+", "$", "%", and "-". These means @w{"}+inbox", "$inbox", "%inbox", and "-fj.mail.reader.mew" without any special configuration. @end ifset @ifset ja @samp{mew-config-alist} ã§è¨­å®šã§ãるキーã¯ã€@samp{mew-"キー"} ã¨ã„ã†å¤‰ æ•°ã«å¯¾å¿œã—ã¦ã„ã¾ã™ã€‚以下ã«è¨­å®šã§ãる項目を列挙ã—ã¾ã™ã€‚ @end ifset @ifset en Each key which can be specified in @samp{mew-config-alist} corresponds to the variable @samp{mew-"key"}. The following list enumerates such keys. @end ifset @example name, user, mail-domain, cc, fcc, dcc, reply-to, organization, header-alist, proto, smtp-server, smtp-port, smtp-ssh-server, smtp-ssl, smtp-ssl-port, smtp-user, smtp-auth-list, smtp-msgid-user, smtp-msgid-domain, smtp-helo-domain, smtp-mail-from, pop-server, pop-port, pop-ssh-server, pop-ssl, pop-ssl-port, pop-user, pop-auth, pop-auth-list, pop-size, pop-header-only, pop-delete, pop-body-lines, pop-proxy-server, pop-proxy-port, imap-server, imap-port, imap-ssh-server, imap-ssl, imap-ssl-port, imap-user, imap-auth, imap-auth-list, imap-size, imap-header-only, imap-delete, imap-trash-folder, imap-queue-folder, imap-spam-field, imap-spam-word, imap-proxy-server, imap-proxy-port, nntp-server, nntp-port, nntp-ssh-server, nntp-ssl, nntp-ssl-port, nntp-user, nntp-size, nntp-header-only, nntp-msgid-user, nntp-msgid-domain, ssl-cert-directory, ssl-verify-level, inbox-folder, queue-folder, postq-folder, mailbox-type, mbox-command, mbox-command-arg, signature-file, content-type, refile-guess-alist, spam-prog, spam-prog-args, ham-prog, ham-prog-args, use-old-pgp, pgp-signer, smime-signer, privacy-method, protect-privacy-always, protect-privacy-always-type, protect-privacy-encrypted, protect-privacy-encrypted-type, protect-privacy-with-old-pgp-signature, use-format-flowed @end example @ifset ja nameã€userã€mail-domain ã¯ä»¥ä¸‹ã®è¦å‰‡ã«ã—ãŸãŒã£ã¦ã€From: ã®å€¤ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en A value for From: is made of 'name', 'user', and 'mail-domain' according to the following rule: @end ifset @example from = name @end example @ifset ja 自分㧠@samp{mew-from-list} を設定ã—ã¦ã„ãªã„å ´åˆã¯ã€ä¸Šè¨˜ã®ãƒ«ãƒ¼ãƒ«ã«å¾“ã„å„ ã‚±ãƒ¼ã‚¹ã® from を集ã‚ã¦ã€@samp{mew-from-list} ãŒè‡ªå‹•çš„ã«è¨­å®šã•れã¾ã™ã€‚ @xref{cheader} ã‚’å‚ç…§ã®ã“ã¨ã€‚ @end ifset @ifset en Unless you set @samp{mew-from-list} by yourself, @samp{mew-from-list} is automatically set collecting 'from' for each "case" according to the rule above. see @ref{cheader}. @end ifset @ifset ja @samp{mew-config-alist} ã«è¨­å®šã—ãŸã‚±ãƒ¼ã‚¹åã‚’ã‚±ãƒ¼ã‚¹ã«æŒ‡å®šã§ãã¾ã™ã€‚Mew ã®èµ·å‹•時ã®ã‚±ãƒ¼ã‚¹ã¯ã€"default" ã«ãªã£ã¦ã„ã¾ã™ã€‚ @end ifset @ifset en Cases configured in @samp{mew-config-alist} can be specified to the @w{"}case". When Mew boots up, both the "case" is "default". @end ifset @ifset ja Summary モードã«ãŠã„ã¦ã€ã‚±ãƒ¼ã‚¹ã‚’変更ã™ã‚‹ã«ã¯ @samp{C} を利用ã—ã¾ã™ã€‚ケー スã«ã¯ã€@samp{TAB} ã§è£œå®Œã€@samp{C-cTAB} ã§å¾ªç’°çš„ãªè£œå®ŒãŒåйãã¾ã™ã€‚ @end ifset @ifset en If you want to change the "case", type @samp{C}. You can use completion by @samp{TAB} and circular completion by @samp{C-cTAB}. @end ifset @ifset ja ケース㌠"default" 以外ã®å€¤ã‚’ã¨ã£ãŸå ´åˆã¯ã€Summary モードã®ãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ ã«è¡¨ç¤ºã•れã¾ã™ã€‚以下ã¯ã‚±ãƒ¼ã‚¹ãŒ "home" ã¨ãªã£ã¦ã„ã‚‹å ´åˆã®ä¾‹ã§ã™ã€‚ @end ifset @ifset en If the "case" is not "default", they are displayed in the mode line of Summary mode. The following is an example where the "case" is "home". @end ifset @example (Summary home) @end example @ifset ja Draft モードã§ã¯ã€ã‚±ãƒ¼ã‚¹ãŒ "default" ã§ãªã„å ´åˆã€ãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ã«ãã®å€¤ãŒ 表示ã•れã¾ã™ã€‚以下ã¯ã€ã‚±ãƒ¼ã‚¹ãŒ "home" ã§ã‚ã‚‹å ´åˆã®ä¾‹ã§ã™ã€‚ @end ifset @ifset en In Draft mode, if the "case" is not "default", the value is displayed in mode line. The following is an example that the "case" is "home". @end ifset @example (Draft home) @end example @ifset ja Draft モードã«ãŠã„ã¦ã€ãã®è‰ç¨¿ã®ã‚±ãƒ¼ã‚¹ã‚’変更ã™ã‚‹ã«ã¯ã€@samp{C-cC-o} ã‚’ 用ã„ã¾ã™ã€‚mail-domain キーや header-alist キーã«å¯¾å¿œã™ã‚‹å€¤ã«å¿œã˜ã¦ã€ãƒ˜ãƒƒ ダãŒå‹•çš„ã«å¤‰æ›´ã•れã¾ã™ã€‚ãªãŠã€ã“ã®ã‚±ãƒ¼ã‚¹ã¯ã€ãã® Draft モードã«å›ºæœ‰ã«ãª りã¾ã™ã€‚ @end ifset @ifset en To change the "case" of a draft in Draft mode, use @samp{C-cC-o}. Its header is dynamically modified according to the value of the 'mail-domain' key and the 'header-alist' key. Note that the "case" is a local variable of the Draft mode. @end ifset @ifset ja Draft モードã§ã¯ã€ã‚±ãƒ¼ã‚¹ã‚’自動的ã«è¨­å®šã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ @end ifset @ifset en You can automatically set the "case" in Draft mode. @end ifset @vtable @samp @ifset ja @item mew-case-guess-when-prepared ã“ã®å¤‰æ•°ãŒ @samp{t} ã®å ´åˆã€è‰ç¨¿ãŒç”¨æ„ã•れãŸã¨ãã«ã€ @samp{mew-case-guess-alist} ã«å¾“ã£ã¦ã‚±ãƒ¼ã‚¹ãŒè¨­å®šã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{t}。 @item mew-case-guess-when-composed ã“ã®å¤‰æ•°ãŒ @samp{t} ã®å ´åˆã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½œæˆã•れãŸã¨ãã«ã€ @samp{mew-case-guess-alist} ã«å¾“ã£ã¦ã‚±ãƒ¼ã‚¹ãŒè¨­å®šã•ã‚Œã‚‹ã€‚åˆæœŸå€¤ã¯ @samp{nil} @item mew-case-guess-when-replied ã“ã®å¤‰æ•°ãŒ @samp{t} ã®å ´åˆã€è¿”ç­”ã«ã‚ˆã£ã¦è‰ç¨¿ãŒç”¨æ„ã•れãŸã¨ãã«ã€ @samp{mew-case-guess-when-replied-alist} ã«å¾“ã£ã¦ã‚±ãƒ¼ã‚¹ãŒè¨­å®šã•ã‚Œã‚‹ã€‚åˆ æœŸå€¤ã¯ @samp{t}。 @end ifset @ifset en @item mew-case-guess-when-prepared If this variable is @samp{t}, the "case" is automatically guessed according @samp{mew-case-guess-alist} when a draft is prepared. The default is @samp{t}. @item mew-case-guess-when-composed If this variable is @samp{t}, the "case" is automatically guessed according @samp{mew-case-guess-alist} when a message is composed. The default is @samp{nil}. @item mew-case-guess-when-replied If this variable is @samp{t}, the "case" is automatically guessed according @samp{mew-case-guess-when-replied-alist} when a draft is prepared by replying. The default is @samp{t}. @end ifset @end vtable @ifset ja @samp{mew-case-guess-alist} 㨠@samp{mew-case-guess-when-replied-alist} ã®æ›¸å¼ã¯ã€@samp{mew-refile-guess-alist} ã¨åŒã˜ã§ã™ã€‚詳ã—ãã¯ã€ @xref{by-alist} ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en The syntax of @samp{mew-case-guess-alist} and @samp{mew-case-guess-when-replied-alist} is the same as @samp{mew-refile-guess-alist}. For more information, please refer to @ref{by-alist}. @end ifset @ifset ja Draft モードã§è‰ç¨¿ã‚’é€ä¿¡ã™ã‚‹ãŸã‚ã« @samp{C-cC-c} を使ã†ã¨ã€Draft モード ã®ã‚±ãƒ¼ã‚¹ãŒ SMTP/NNTP サーãƒãªã©ã‚’決定ã™ã‚‹ãŸã‚ã«åˆ©ç”¨ã•れã¾ã™ã€‚Summary モー ド㧠+queue/+postq ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚Šå‡ºã™ãŸã‚ã« @samp{C-cC-c} を利用㙠るã¨ã€Summary モードã®ã‚±ãƒ¼ã‚¹ãŒåˆ©ç”¨ã•れã¾ã™ã€‚ãŸã¨ãˆã€ãã®ã‚±ãƒ¼ã‚¹ãŒ Draft ãƒ¢ãƒ¼ãƒ‰ã§æŒ‡å®šã•れã¦ã„ãŸã‚±ãƒ¼ã‚¹ã¨é•ã£ã¦ã‚‚ã§ã™ã€‚Summary モード㧠@samp{C-uC-cC-c} を使ã†ã¨ã€+queue/+postq ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚Šå‡ºã™ãŸã‚ã®ã‚±ãƒ¼ ã‚¹ãŒæŒ‡å®šã§ãã¾ã™ã€‚ @end ifset @ifset en When typing @samp{C-cC-c} in Draft mode to send a draft, the "case" in Draft mode is used to determine an SMTP/NNTP server, etc. When typing @samp{C-cC-c} in Summary mode to flush messages in +queue/+postq, the @w{"}case" in Summary mode is used even if it is different from the one which was used in Draft mode. @samp{C-uC-cC-c} in Summary mode let you specify the "case" to flush messages in +queue/postq. @end ifset @ifset ja 以下ã«ã‚±ãƒ¼ã‚¹ã«é–¢ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en The following is a summary of commands concerned with the "case". @end ifset @table @samp @ifset ja @item C Summary モードã«ãŠã„ã¦ã€ã‚±ãƒ¼ã‚¹ã‚’設定ã™ã‚‹ã€‚ @item C-cC-o Draft モードã«ãŠã„ã¦ã€ãã®è‰ç¨¿ã®ã‚±ãƒ¼ã‚¹ã‚’設定ã™ã‚‹ã€‚ @end ifset @ifset en @item C In Summary mode, set the "case". @item C-cC-o In Draft mode, set the "case" of a draft. @end ifset @end table @c %%%%%%%%%%%%%%%%% @node config2, custom-misc, config, Customize @ifset ja @section è¨­å®šã®æ›¸å¼ @end ifset @ifset en @section The format of configuration @end ifset @vindex mew-config-alist @ifset ja Mew 6.1 ã‹ã‚‰ ".mew.el" ã®è¨­å®šæ–¹æ³•ãŒæ”¹å–„ã•れã¾ã—ãŸã€‚å¤ã„書å¼ã‚‚有効ã§ã™ãŒã€ より簡å˜ãªæ–°ã—ã„æ›¸å¼ã‚‚利用ã§ãã¾ã™ã€‚ @end ifset @ifset en In Mew 6.1, configuration format of "mew.el" is improved. You can use a new format as well as the old format. @end ifset @itemize @minus @ifset ja @item å¤ã„書å¼ã§ã¯ãƒªã‚¹ãƒˆã®ä¸­ã« "." ãŒç¾ã‚Œã‚‹å ´åˆãŒã‚りã¾ã—ãŸã€‚æ–°ã—ã„æ›¸å¼ã§ã¯ã€ "." ã¯ã¾ã£ãŸã使ã‚れã¾ã›ã‚“。ãŸã¨ãˆã°ã€("foo" . "bar") ã¨æ›¸ã„ã¦ã„ãŸã¨ã“ ã‚ã¯ã€("foo" "bar") ã¨æ›¸ã‘ã¾ã™ã€‚ @item å¤ã„書å¼ã§ã¯ã€ãƒãƒ¼ãƒˆç•ªå·ã¯æ–‡å­—åˆ—ã§æ›¸ã„ã¦ã„ã¾ã—ãŸã€‚ãŸã¨ãˆã°ã€"25" ã§ã™ã€‚ æ–°ã—ã„æ›¸å¼ã§ã¯ã€æ•°å€¤ã§æ›¸ã„ã¦ã‚‚よããªã‚Šã¾ã—ãŸã€‚ãŸã¨ãˆã°ã€25 ã§ã™ã€‚文字列 も有効ã§ã™ã€‚ãŸã¨ãˆã°ã€"smtp" ã§ã™ã€‚ @item å¤ã„書å¼ã§ã¯ã€@samp{mew-config-alist} ã®ã‚±ãƒ¼ã‚¹ã‚„ã‚­ãƒ¼ã‚’æ–‡å­—åˆ—ã§æ›¸ã„ã¦ã„ ã¾ã—ãŸã€‚æ–°ã—ã„æ›¸å¼ã§ã¯ã€ã‚·ãƒ³ãƒœãƒ«ã§æ›¸ã‘ã¾ã™ã€‚ @end ifset @ifset en @item In the old format, sometime "." appears. In the new fomat, no "." appears at all. For instance, you can write ("foo" "bar") instead of ("foo" . "bar"). @item In the old format, a numeric port is specified as string. An example is "25". In the new format, you can write it as integer. An example is 25. The string is still valid. An example is "smtp". @item In the old format, the cases and the keys of @samp{mew-config-alist} are written as string. In the new format, you can specify them as symbol. @end ifset @end itemize @ifset ja 以下㫠mew-config-alist ã‚’æ–°ã—ã„æ›¸å¼ã§æ›¸ã„ãŸä¾‹ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en Here is an example of the new format: @end ifset @lisp (setq mew-config-alist '((home (imap-server "imap.example.org") (imap-ssl t) (imap-ssl-port 993) (smtp-server "smtp.example.org") (smtp-port "submission")))) @end lisp @ifset ja 以下ã®å¤ã„書å¼ã¨è¦‹æ¯”ã¹ã¦ä¸‹ã•ã„。 @end ifset @ifset en Compare this with the following old one: @end ifset @lisp (setq mew-config-alist '(("home" ("imap-server" . "imap.example.org") ("imap-ssl" . t) ("imap-ssl-port" . "993") ("smtp-server" . "smtp.example.org") ("smtp-port" . "submission")))) @end lisp @ifset ja 繰り返ã—ã¾ã™ãŒã€Mew 6.1 ã§ã¯å¤ã„書å¼ã‚‚有効ã§ã™ã€‚å¤ã„書å¼ã¨æ–°ã—ã„æ›¸å¼ã‚’ æ··ãœã¦æ›¸ã„ã¦ã‚‚æ§‹ã„ã¾ã›ã‚“。 @end ifset @ifset en Again, the old format is still valid. You can also mix the new format and the old format. @end ifset @c %%%%%%%%%%%%%%%%% @node custom-misc, Tips, config2, Customize @ifset ja @section ãã®ä»– @end ifset @ifset en @section Miscellaneous @end ifset @vindex mew-use-samba-encoding @vindex mew-cs-samba @vindex mew-print-function @vindex mew-field-for-printing @ifset ja 環境ã«ã‚ˆã£ã¦ã¯ã€æ·»ä»˜ãƒ•ァイルをセーブã™ã‚‹éš›ã«ã€ãƒ•ァイルåã‚’ SAMBA å½¢å¼ã« ã™ã‚‹ã¨ä¾¿åˆ©ãªã“ã¨ãŒã‚りã¾ã™ã€‚ã“ã®å ´åˆã€@samp{mew-use-samba-encoding} ã‚’ @samp{t} ã«ã—ã¦ä¸‹ã•ã„。ファイルåã¨ã—ã¦ã€ã©ã®æ–‡å­—コードを利用ã™ã‚‹ã‹ã¯ã€ @samp{mew-cs-samba} ã§æŒ‡å®šã§ãã¾ã™ã€‚åˆæœŸå€¤ã¯ @samp{shift_jis} ã§ã™ã€‚ @end ifset @ifset en In a certain environment, it would be useful to encode a file with SAMBA encoding when saving an attached file. For this, set @samp{mew-use-samba-encoding} to @samp{t}. You can set @samp{mew-cs-samba} to a character set for the file name. The default is @samp{shift_jis}. @end ifset @ifset ja Summary モード㧠@samp{#} ã¨æŠ¼ã™ã¨ã€ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å°åˆ·ã§ãã¾ã™ã€‚å° åˆ·ã«åˆ©ç”¨ã™ã‚‹é–¢æ•°ã¯ @samp{mew-print-function} ã§å®šç¾©ã—ã¾ã™ã€‚åˆæœŸå€¤ã¯ã€ @samp{ps-print-buffer} ã§ã™ã‹ã‚‰ã€PostScript ã«å¤‰æ›ã•れã¦å°åˆ·ã•れã¾ã™ã€‚ 自分ã®ä½œæˆã—ãŸé–¢æ•°ã‚’利用ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¾ã™ã€‚ @end ifset @ifset en You can print the current message by typing @samp{#} in Summary mode. A function for printing can be set to @samp{mew-print-function}. Since its default value is @samp{ps-print-buffer}, a message is converted into a PostScript file before sent to a printer. You can set your own print function as follows: @end ifset @lisp (setq mew-print-function 'my-print-function) @end lisp @ifset ja ヘッダ中ã®ã©ã®ãƒ•ィールドをå°åˆ·ã™ã‚‹ã‹ã¯ã€@samp{mew-field-for-printing} ã§æŒ‡å®šã§ãã¾ã™ã€‚åˆæœŸå€¤ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ãªã£ã¦ã„ã¾ã™ã€‚ @end ifset @ifset en You can set fields in a header to be printed to @samp{mew-field-for-printing}. Its default value is as follows: @end ifset @lisp '("Subject:" "From:" "To:" "Cc:" "Date:") @end lisp @ifset ja ãŸã¨ãˆã°ã€Subject:ã€From:ã€Date: ã®ã¿ã‚’å°åˆ·ã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã— ã¾ã—ょã†ã€‚ @end ifset @ifset en For instance, if you want to print Subject:, From:, and Date: only, configure as follows: @end ifset @lisp (setq mew-field-for-printing '("Subject:" "From:" "Date:")) @end lisp @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Tips @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Tips, region, custom-misc, Top @ifset ja @chapter ã•らãªã‚‹ä¸€æ­© @end ifset @ifset en @chapter Advanced usage @end ifset @menu @ifset ja * region:: リージョン * visiting:: 移動 * SSH:: Secure SHell * SSL:: Secure Socket Layer * TLS:: Transport Layer Security * spam:: スパム * spam2:: スパム(2) * addr-warn:: アドレスã®è­¦å‘Š * biff:: Biff * edit:: Edit モード @end ifset @ifset en * region:: Region * visiting:: Visiting another buffer * SSH:: Secure SHell * SSL:: Secure Socket Layer * TLS:: Transport Layer Security * spam:: Spam messages * spam2:: Spam messages (2) * addr-warn:: Warning addresses * biff:: Biff * edit:: Edit mode @end ifset @end menu @c %%%%%%%%%%%%%%%%% @node region, visiting, Tips, Tips @ifset ja @section リージョン @end ifset @ifset en @section Region @end ifset @ifset ja Summary モードã«ã¯ã€@samp{C-u} 付ãã§å‘¼ã³å‡ºã™ã¨ã€ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ä½œç”¨ã™ã‚‹ã‚³ マンドãŒã‚りã¾ã™ã€‚ã“れらã®ã‚³ãƒžãƒ³ãƒ‰ã¯ã€ãƒ“ジブルãªãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒæŒ‡å®šã•れ㦠ã„ã‚‹å ´åˆã¯ã€@samp{C-u} ãªã—ã§ã‚‚ãã®ãƒªãƒ¼ã‚¸ãƒ§ãƒ³ã«ä½œç”¨ã—ã¾ã™ã€‚ @end ifset @ifset en In Summary mode, there are commands which work for a region if called with @samp{C-u}. If a visible region is specified, these commands work for the region without @samp{C-u}. @end ifset @ifset ja Emacs ã§ã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’ "~/.emacs" ã«å…¥ã‚Œã‚‹ã¨ã€ãƒ“ジブルãªãƒªãƒ¼ã‚¸ãƒ§ãƒ³ãŒ 利用ã§ãるよã†ã«ãªã‚Šã¾ã™ã€‚ @end ifset @ifset en For Emacs, you can use the visible region feature by putting the following into your "~/.emacs". @end ifset @lisp (transient-mark-mode 1) @end lisp @ifset ja 以下ã«ã€è©²å½“ã™ã‚‹ã‚³ãƒžãƒ³ãƒ‰ã‚’列挙ã—ã¦ãŠãã¾ã™ã€‚ @end ifset @ifset en Here is a summary of such commands. @end ifset @example @samp{?}, @samp{/}, @samp{tt}, @samp{x}, @samp{lx}, @samp{ma}, @samp{Md}, @samp{S}, @samp{mlc}, @samp{mli}, @samp{*}, @samp{$}, @samp{d}, @samp{u} @end example @ifset ja @samp{*}, @samp{$}, @samp{d}, @samp{u} ã¯ã€ç›´å‰ã«æ•°å­—を入力ã™ã‚‹ã“ã¨ã§ã€ 繰り返ã—ã®å›žæ•°ã‚’指定ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚ãŸã¨ãˆã°ã€@samp{3*} 㯠3 ã¤ã®ãƒ¡ãƒ¼ ル㫠@samp{*} マークを付ã‘ã¾ã™ã€‚æ•°å­—ã®å‰ã« @samp{C-u} ã¯ä¸è¦ã§ã™ã€‚ @end ifset @ifset en Also you can specify a repeat count before you call @samp{*}, @samp{$}, @samp{d}, and @samp{u}. For example, typing @samp{3d} puts the @samp{*} mark onto three messages. You don't have to type @samp{C-u} before the number. @end ifset @c %%%%%%%%%%%%%%%%% @node visiting, SSH, region, Tips @ifset ja @section 移動 @end ifset @ifset en @section Visiting another buffer @end ifset @vindex mew-visit-queue-after-sending @vindex mew-visit-inbox-after-setting-case @kindex C-cC-o (Summary) @ifset ja Draft モードã«ãŠã„ã¦ã€@samp{C-cC-m} ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’作æˆã—é€ä¿¡ã‚­ãƒ¥ãƒ¼ã«å…¥ れãŸå¾Œã€+queue ã«ç§»å‹•ã—ãŸã„å ´åˆã¯ã€ @samp{mew-visit-queue-after-sending} ã‚’ @samp{t} ã«è¨­å®šã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en If you want to move to +queue after making a message and putting it to +queue with @samp{C-cC-m} in Draft mode, set @samp{mew-visit-queue-after-sending} to @samp{t}. @end ifset @ifset ja Summary モードã«ãŠã„ã¦ã€@samp{C} ã§ã‚±ãƒ¼ã‚¹ã‚’設定ã—ãŸå¾Œã«ã€å„ inbox ã«ç§» å‹•ã—ãŸã„å ´åˆã¯ã€@samp{mew-visit-inbox-after-setting-case} ã‚’ @samp{t} ã«è¨­å®šã—ã¾ã—ょã†ã€‚ @end ifset @ifset en If you want to visit to an appropriate inbox after setting the "case" with @samp{C} in Summary mode, set @samp{mew-visit-inbox-after-setting-case} to @samp{t}. @end ifset @ifset ja Summary モードã‹ã‚‰ã€ä¸€ç•ªæ•°å­—ã®å°ã•ã„è‰ç¨¿(Draft モード)ã«ç§»å‹•ã™ã‚‹ã«ã¯ã€ @samp{C-cC-o} ãŒåˆ©ç”¨ã§ãã¾ã™ã€‚ @end ifset @ifset en If you want to move from Summary mode to a draft (Draft mode) whose name is the smallest number, type @samp{C-cC-o}. @end ifset @c %%%%%%%%%%%%%%%%% @node SSH, SSL, visiting, Tips @ifset ja @section Secure SHell @end ifset @ifset en @section Secure SHell @end ifset @vindex mew-pop-ssh-server @ifset ja Mew 㯠SSH ã¨ã—ã¦ã€SSH ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 1ã€2 ãŠã‚ˆã³ OpenSSH をサãƒãƒ¼ãƒˆã—ã¦ã„ ã¾ã™ã€‚Mew ã‹ã‚‰ SSH を利用ã™ã‚‹å‰ã«ã€å¿…ãšã‚³ãƒžãƒ³ãƒ‰ãƒ»ãƒ©ã‚¤ãƒ³ã§ "ssh" を実行 ã—ã€SSH サーãƒã®å…¬é–‹éµã‚’å–å¾—ã—ã¦ä¸‹ã•ã„。ã™ãªã‚ã¡ã€ãƒ¦ãƒ¼ã‚¶ã®ãƒ‘スワードã‹ã€ ローカルã®ãƒžã‚·ãƒ³ã®ç§˜å¯†éµã‚’復å·åŒ–ã™ã‚‹ãŸã‚ã®ãƒ‘スワードを入力ã™ã‚Œã°ã€ã‚µãƒ¼ ãƒã«ãƒ­ã‚°ã‚¤ãƒ³ã§ãる状態ã«ã—ã¦ä¸‹ã•ã„。ãªãŠã€"ssh-agent" を利用ã™ã‚Œã°ã€ç§˜ 密éµã‚’復å·åŒ–ã™ã‚‹ãŸã‚ã®ãƒ‘スワードã®å…¥åŠ›ã‚’çœç•¥ã§ãã¾ã™ã€‚ @end ifset @ifset en Mew supports SSH version 1 and version 2 and OpenSSH for SSH. You must execute "ssh" on the command and obtain server's public key before you use Mew with SSH. That is, you should set up so that you can login the server with your user password or with the password to decrypt the secret key of the local machine. Of source, you can omit the password to decrypt the secret key if you use "ssh-agent". @end ifset @ifset ja 後ã¯ã€å„プロトコル㮠SSH ã«é–¢ã™ã‚‹å¤‰æ•°ã‚’設定ã—ã¦ä¸‹ã•ã„。ãŸã¨ãˆã°ã€POP over SSH を利用ã™ã‚‹å ´åˆã¯ã€@samp{mew-pop-ssh-server} ã« SSH サーãƒã®å å‰ã‚’設定ã—ã¾ã—ょã†ã€‚ @end ifset @ifset en After that, you should configure SSH variables relating to each protocol. For example, if you want to use POP over SSH, set @samp{mew-pop-ssh-server} to your SSH server name. @end ifset @ifset ja SSH ã§é€šä¿¡ãŒä¿è­·ã•れã¦ã„ã‚‹å ´åˆã€ãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ã«éŒ å‰ã®çµµãŒè¡¨ç¤ºã•れã¾ã™ã€‚ @end ifset @ifset en While a connection is protected by SSH, a picture of a lock is shown in the mode line. @end ifset @ifset ja Mew ã®å®Ÿè£…ã§ã¯ã€SSH 㨠SSL/TLS ã‚’åŒæ™‚ã«ã¯ä½¿ãˆã¾ã›ã‚“。SSH トンãƒãƒ«ã®ä¸­ã§ SSL/TLS を使ã†å¿…è¦ãŒã‚ã‚‹å ´åˆã€Mew ã§ã¯ SSL/TLS ã ã‘を設定ã—ã€SSH トンムルã¯ã‚³ãƒžãƒ³ãƒ‰ãƒ©ã‚¤ãƒ³ã‹ã‚‰å¼µã‚‹ã‚ˆã†ã«ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en The implementation of Mew does not allow to use both SSH and SSL/TLS at the same time. If you need to use SSL/TLS over an SSH tunnel, please configure SSL/TLS only with Mew and set up an SSH tunnel on a command line. @end ifset @c %%%%%%%%%%%%%%%%% @node SSL, TLS, SSH, Tips @ifset ja @section Secure Socket Layer @end ifset @ifset en @section Secure Socket Layer @end ifset @vindex mew-ssl-cert-directory @vindex mew-ssl-verify-level @vindex mew-pop-ssl @vindex mew-pop-ssl-port @vindex mew-smtp-ssl @ifset ja SSL を使ã†ã«ã¯ã€èªè¨¼å±€æ–¹å¼ã®ä¿¡ç”¨ãƒ¢ãƒ‡ãƒ«ã‚’ç†è§£ã—ã¦ã„ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚ç¾ åœ¨ã€Mew 㯠SSL ã®ãŸã‚ã« "stunnel" ãƒãƒ¼ã‚¸ãƒ§ãƒ³ 3ã€4ã€5 をサãƒãƒ¼ãƒˆã—ã¦ã„ã¾ ã™ã€‚ @end ifset @ifset en Before you use SSL, you should understand the trust model of certificate authorities (CA). Currently, Mew supports "stunnel" version 3, 4 and 5 for SSL. @end ifset @ifset ja Mew ã§åˆ©ç”¨ã™ã‚‹å‰ã«ã€SSL サーãƒã«å¯¾ã—㦠"stunnel" ã§ SSL ã®ã‚³ãƒã‚¯ã‚·ãƒ§ãƒ³ ãŒå¼µã‚Œã‚‹ã‹ç¢ºã‹ã‚ã¦ä¸‹ã•ã„。"stunnel" ã¯ã€"openssl" ã®ãƒ©ã‚¤ãƒ–ラリをリンク ã—ã¦ã„ã‚‹ã®ã§ã€"openssl" ã®çŸ¥è­˜ãŒå¿…è¦ã§ã™ã€‚ @end ifset @ifset en Before you use Mew with SSL, you must be sure that an SSL connection can be established to your SSL server. Since "stunnel" is linked to the "openssl" library, you should understand "openssl". @end ifset @ifset ja 信用ã™ã‚‹è¨¼æ˜Žæ›¸ã‚’ä¿å­˜ã—ã¦ãŠãディレクトリを "~/.certs" ã ã¨ã—ã¾ã—ょã†ã€‚ ã“ã“ã« "openssl" ã® "certs" ディレクトリã«ä»˜ã„ã¦ãã‚‹ PEM å½¢å¼ã®è¨¼æ˜Žæ›¸ã‚’ "<ãƒãƒƒã‚·ãƒ¥>.0" ã¨ã„ã†åå‰ã§ã‚³ãƒ”ーã—ã¾ã™ã€‚ @end ifset @ifset en Suppose we use "~/.certs" as a directory where certificates of trusted CAs are contained. You need to copy PEM-format certificates embedded in the source of "openssl" to this director. Each name should be @w{"}.0". @end ifset @ifset ja ã“ã“ã§ã¯ã€PEM å½¢å¼ã®è¨¼æ˜Žæ›¸ã®ãƒ•ァイルåã‚’ "ca.pem" ã ã¨ã—ã¾ã—ょã†ã€‚「<ãƒãƒƒ シュ>ã€ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«è¨ˆç®—ã§ãã¾ã™ã€‚ @end ifset @ifset en Here we call a sample CA certificate "ca.pem". You can calculate as follows: @end ifset @example % openssl x509 -hash -noout -in ca.pem @end example @ifset ja "~/.certs/" ã¸ã‚³ãƒ”ーã™ã‚‹ã«ã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ @end ifset @ifset en To copy the certificate, do as follows: @end ifset @example % cp ca.pem ~/.certs/`openssl x509 -hash -noout -in ca.pem`.0 @end example @ifset ja "openssl" ã«ä»˜ã„ã¦ãる証明書ã¯ã€ä¸–ã®ä¸­ã§ä½¿ã‚れã¦ã„ã‚‹ CA ã™ã¹ã¦ã‚’網羅㧠ãã¦ã„ã¾ã›ã‚“。ã‚ãªãŸãŒåˆ©ç”¨ã™ã‚‹ã‚µãƒ¼ãƒã®è¨¼æ˜Žæ›¸ãŒã€ä»–ã® CA ã‹ã‚‰ç™ºè¡Œã•れ㟠場åˆã€ãã® CA ã®è¨¼æ˜Žæ›¸ã‚’åŒæ§˜ã«ã‚³ãƒ”ーã—ã¦ãŠãå¿…è¦ãŒã‚りã¾ã™ã€‚以下ã®ãƒšãƒ¼ ジ㫠CA ã®è¨¼æ˜Žæ›¸ãŒãŸãã•ã‚“ç½®ã„ã¦ã‚りã¾ã™ã€‚ @end ifset @ifset en The certificates in the source of "openssl" do not cover all CAs. If the certificate of your SSL server is signed by another CA, you must copy the certificate of the CA to the directory. You may be able to find appropriate certificate from the following page: @end ifset @example http://www.columbia.edu/~ariel/good-certs/ns45/ @end example @ifset ja Mew ã§ "stunnel" を制御ã™ã‚‹é‡è¦ãªå¤‰æ•°ã¯ 2 ã¤ã§ã™ã€‚ @samp{mew-ssl-cert-directory} ã¯ã€ä¿¡ç”¨ã™ã‚‹ CA ã®è¨¼æ˜Žæ›¸ã‚’ç½®ã„ã¦ãŠãディ レクトリã§ã‚りã€åˆæœŸå€¤ã¯ "~/.certs" ã§ã™ã€‚ã¾ãŸã€ @samp{mew-ssl-verify-level} ã§ã€è¨¼æ˜Žæ›¸ã‚’検証ã™ã‚‹ãƒ¬ãƒ™ãƒ«ã‚’指定ã§ãã¾ã™ã€‚ レベルã®åˆæœŸå€¤ã¯ 1 ã§ã™ã€‚ã“ã®æ„味ã¯ã€ä»¥ä¸‹ã®é€šã‚Šã§ã™ã€‚ @end ifset @ifset en There are two important Mew variables to control "stunnel". @samp{mew-ssl-cert-directory} is the directory where you install certificates of trusted CAs. It's default value if "~/.certs". Also, you can set the verification level with @samp{mew-ssl-verify-level}. It's default to 1. The meanings of the values are as follows: @end ifset @table @asis @ifset ja @item 0 検証ã—ãªã„ @item 1 サーãƒã®è¨¼æ˜Žæ›¸ãŒã‚ã‚Œã°æ¤œè¨¼ã™ã‚‹ã€‚æ¤œè¨¼çµæžœãŒå¤±æ•—ãªã‚‰ã€SSL/TSL コãƒã‚¯ã‚·ãƒ§ ンã¯ä½œã‚‰ã‚Œãªã„。証明書ãŒãªã‘れã°ã€SSL/TLS コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’作æˆã™ã‚‹ã€‚ @item 2 サーãƒã®è¨¼æ˜Žæ›¸ã‚’検証ã™ã‚‹ã€‚æ¤œè¨¼çµæžœãŒå¤±æ•—ãªã‚‰ã€SSL/TSL コãƒã‚¯ã‚·ãƒ§ãƒ³ã¯ä½œ られãªã„。証明書ãŒãªã‘れã°ã€SSL/TLS コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’作æˆã—ãªã„。 @item 3 サーãƒãŒé€ã£ã¦ããŸã‚‚ã®ã§ã¯ãªãã€ãƒ­ãƒ¼ã‚«ãƒ«ã«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã•れã¦ã„る証明書 ã§æ¤œè¨¼ã™ã‚‹ã€‚ @end ifset @ifset en @item 0 No verification. @item 1 Verify server's certificate if present. If verification failed, an SSL/TLS connection is not created. If not present, an SSL/TLS connection is created. @item 2 Verify server's certificate. If verification failed, an SSL/TLS connection is not created. If not present, an SSL/TLS connection is not created. @item 3 Verify server's certificate which locally installed (not one from the server). @end ifset @end table @ifset ja 後ã¯å„プロトコル㮠SSL ã«é–¢ã™ã‚‹å¤‰æ•°ã‚’設定ã—ã¦ä¸‹ã—ã•ã„。ãŸã¨ãˆã°ã€POP over SSL を利用ã™ã‚‹ã«ã¯ã€@samp{mew-pop-ssl} ã‚’ @samp{t} ã«ã—ã¾ã™ã€‚ã¾ãŸã€ ãƒãƒ¼ãƒˆç•ªå·ãŒæ¨™æº–ã¨ç•°ãªã‚‹å ´åˆã«ã¯ã€@samp{mew-pop-ssl-port} を設定ã—ã¦ä¸‹ ã•ã„。 @end ifset @ifset en Then configure SSL-related variables of each protocol. For example, if you want to use POP over SSL, set @samp{mew-pop-ssl} to @samp{t}. Also, if its port is not a standard one, configure @samp{mew-pop-ssl-port}. @end ifset @lisp (setq mew-pop-ssl t) @end lisp @ifset ja SMTP ã§ SSL を利用ã™ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ @end ifset @ifset en To use SSL for SMTP, configure as follows: @end ifset @lisp (setq mew-smtp-ssl t) @end lisp @ifset ja SSL ã§é€šä¿¡ãŒä¿è­·ã•れã¦ã„ã‚‹å ´åˆã€ãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ã«éŒ å‰ã®çµµãŒè¡¨ç¤ºã•れã¾ã™ã€‚ @end ifset @ifset en While a connection is protected by SSL, a picture of a lock is shown in the mode line. @end ifset @c %%%%%%%%%%%%%%%%% @node TLS, spam, SSL, Tips @ifset ja @section Transport Layer Security @end ifset @ifset en @section Transport Layer Security @end ifset @ifset ja Mew ã§ã¯ SSL ã®ä»£ã‚Šã« TLS を利用ã™ã‚‹ã“ã¨ã‚‚ã§ãã¾ã™ã€‚TLS ã®å®Ÿç¾ã¯ã€SSL ã¨åŒæ§˜ "stunnel" ã«é ¼ã£ã¦ã„ã¾ã™ã€‚ã§ã™ã®ã§ã€TLS を利用ã™ã‚‹éš›ã«ã¯ã€ @xref{SSL} ã®èª¬æ˜Žã«å¾“ã£ã¦è¨­å®šã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Mew can use TLS instead of SSL. To enable TLS, Mew relies on @w{"}stunnel", too. So, before using TLS, you should configure according to the explanations in @ref{SSL}. @end ifset @ifset ja 次ã«ã€SSL ã®ãƒãƒ¼ãƒˆç•ªå·ã‚’守りãŸã„プロトコルã¨åŒã˜ãƒãƒ¼ãƒˆç•ªå·ã«è¨­å®šã—ã¾ã™ã€‚ ãŸã¨ãˆã°ã€POP ã§ã¯ä»¥ä¸‹ã®ã‚ˆã†ã«ã—ã¾ã™ã€‚ @end ifset @ifset en Then, set the SSL port to the same one of the protocol to be protected. For instance, configure as follows for POP: @end ifset @lisp ;; mew-pop-port is default to "pop3" (110) (setq mew-pop-ssl t) (setq mew-pop-ssl-port mew-pop-port) ;; The default is "pop3s" (995) @end lisp @ifset ja ã™ãªã‚ã¡ã€SSL ã®ãƒãƒ¼ãƒˆç•ªå·ã¨ä¿è­·ã—ãŸã„プロトコルã®ãƒãƒ¼ãƒˆãŒåŒã˜ã§ã‚れ㰠TLSã€ç•°ãªã‚Œã° SSL ãŒåˆ©ç”¨ã•れã¾ã™ã€‚ @end ifset @ifset en That is, if the SSL port is the same as the port of the protocol to be protected, TLS is used. Otherwise, SSL is used. @end ifset @ifset ja 以下ã¯ã€Message Submission ã‚’ TLS ã§å®ˆã‚‹ãŸã‚ã®è¨­å®šä¾‹ã§ã™ã€‚ @end ifset @ifset en The following is an example to protect Message Submission with TLS. @end ifset @lisp (setq mew-smtp-port "submission") ;; The default is "smtp" (25) (setq mew-smtp-ssl t) (setq mew-smtp-ssl-port mew-smtp-port) ;; The default is 465 @end lisp @c %%%%%%%%%%%%%%%%% @node spam, spam2, TLS, Tips @ifset ja @section スパム @end ifset @ifset en @section Spam messages @end ifset @vindex mew-spam @vindex mew-inbox-action-alist @vindex mew-imap-spam-field @vindex mew-imap-spam-word @vindex mew-imap-spam-folder @ifset ja (1) スパムã®ãƒ•ィルタ㌠POP サーãƒã‚„ IMAP サーãƒå´ã§å‹•ã„ã¦ã„ã‚‹å ´åˆï¼š POP ã§ +inbox ã«ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã—ãŸã‚Šã€$inbox ã‚„ %inbox ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã® 一覧をå–ã£ãŸã‚Šã™ã‚‹å ´åˆã«ã€ã‚¹ãƒ‘ムã«è‡ªå‹•的㫠@samp{D} マークを付ã‘ã‚‹ã“㨠ãŒã§ãã¾ã™ã€‚ @end ifset @ifset en (1) In the case where a spam filter is running on your POP server or your IMAP server. You can put the @samp{D} mark to spam messages while you are retrieving messages in +inbox or you are scanning messages in $inbox/%inbox. @end ifset @ifset ja Bogofilter を利用ã—ã¦ã„ã‚‹å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’ "~/.mew.el" ã«å…¥ã‚Œã¦ä¸‹ã• ã„。 @end ifset @ifset en If you use "bogofilter", put the following to your "~/.mew.el". @end ifset @lisp (defun mew-spam-bogofilter (val) (let ((case-fold-search t)) (if (string-match "yes" val) ?D))) (setq mew-inbox-action-alist '(("X-Bogosity:" mew-spam-bogofilter))) @end lisp @ifset ja @samp{D} マークを付ã‘る代ã‚りã«ã€+spam フォルダã¸ãƒªãƒ•ァイルã™ã‚‹ã‚ˆã†ã« @samp{o} マー クを付ã‘るよã†ã«ã™ã‚‹ã«ã¯ã€é–¢æ•°ã‚’以下ã®ã‚ˆã†ã«è¨˜è¿°ã—ã¾ã™ã€‚ @end ifset @ifset en If you want to put the @samp{o} mark so as to be refiled to the +spam folder, instead of putting to th @samp{D} mark, you should program the function as follows: @end ifset @lisp (defun mew-spam-bogofilter (val) (let ((case-fold-search t)) (if (string-match "yes" val) "+spam"))) @end lisp @ifset ja Spamassassin ã®å ´åˆã¯ã€ä»¥ä¸‹ã®è¨­å®šã‚’ "~/.mew.el" ã«å…¥ã‚Œã¦ä¸‹ã•ã„。 @end ifset @ifset en If you use "spamassassin", put the following to your "~/.mew.el". @end ifset @lisp (setq mew-spam: "X-Spam-Flag:") (defun mew-spam-assassin (val) (let ((case-fold-search t)) (if (string-match "yes" val) ?D))) (setq mew-inbox-action-alist '(("X-Spam-Flag:" mew-spam-assassin))) @end lisp @ifset ja bsfilter を使ã†å ´åˆã¯ã€bsfilter ã«å«ã¾ã‚Œã¦ã„るマニュアルをå‚ç…§ã—ã¦ä¸‹ã• ã„。 @end ifset @ifset en In the case where you want to use bsfilter, see a document in the bsfilter package. @end ifset @ifset ja (2) スパムã®ãƒ•ィルタ㌠IMAP サーãƒå´ã§å‹•ã„ã¦ã„ã‚‹å ´åˆï¼š %inbox ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã®ä¸€è¦§ã‚’å–ã‚‹éš›ã«ã€IMAP サーãƒã®ä¸­ã§ã‚¹ãƒ‘ムを消去ã€ã¾ ãŸã¯ã€ä»–ã®ãƒ•ォルダã¸ç§»å‹•ã•ã›ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚Bogofilter を利用ã—ã¦ã„ã‚‹ å ´åˆã¯ã€ä»¥ä¸‹ã®ã‚ˆã†ãªè¨­å®šã‚’ "~/.mew.el" ã«åŠ ãˆã¦ä¸‹ã•ã„。 @end ifset @ifset en (2) In the case where a spam filter is running in your IMAP server. You can delete or move spam messages while you are scanning %inbox. If you use "bogofilter", put the following to your "~/.mew.el". @end ifset @lisp (setq mew-imap-spam-field "X-Bogosity") (setq mew-imap-spam-word "Yes") @end lisp @ifset ja @samp{mew-imap-spam-folder} ã‚ã‚‹ã„㯠@samp{mew-imap-trash-folder} ãŒå®š 義ã•れã¦ã„れã°ã€ãã®ãƒ•ォルダã¸ã‚¹ãƒ‘ムãŒç§»å‹•ã—ã¾ã™ã€‚ãã†ã§ãªã‘れã°ã€ã‚¹ãƒ‘ ãƒ ã¯æ¶ˆåŽ»ã•れã¾ã™ã€‚ @end ifset @ifset en If @samp{mew-imap-spam-folder} or @samp{mew-imap-trash-folder} is defined, spam messages are moved to the folder. Otherwise, they are removed. @end ifset @ifset ja (3) ローカル㧠bogofilter ã‚’å‹•ã‹ã—ã¦ã€ä¸€æ‹¬ã—㦠@samp{*} マークを付ã‘ã‚‹ 方法もã‚りã¾ã™ã€‚ã¾ãšã€ä»¥ä¸‹ã®ã‚¹ã‚¯ãƒªãƒ—トをインストールã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en (3) In the case where you installed "bogofilter" in your local machine, you can put the @samp{*} mark to spam messages. First you need to install the following script, say "bogo": @end ifset @example #!/bin/sh bogofilter -v -T -B $* | grep S @end example @ifset ja ã“ã®ã‚¹ã‚¯ãƒªãƒ—トåã‚’ "bogo" ã ã¨ã—ã¾ã—ょã†ã€‚Summary モード㧠@samp{?} ã‚’ 実行ã—ã€@samp{RET} を入力ã—ã€ã‚³ãƒžãƒ³ãƒ‰åã« "bogo" を指定ã™ã‚Œã°ã€ã‚¹ãƒ‘ム㫠@samp{*} マークãŒä»˜ãã¾ã™ã€‚ã‚ã¨ã¯ã€@samp{md} + @samp{x} ãªã©ã§å‡¦ç†ã™ã‚‹ ã¨ã„ã„ã§ã—ょã†ã€‚ @end ifset @ifset en Type @samp{?} and @samp{RET}, then specify "bogo", and spam messages are marked with @samp{*}. After that, you may want to process them with @samp{md} + @samp{x}. @end ifset @ifset ja (4) POP サーãƒã‚’利用ã—ã¦ãŠã‚Šã€ã‚µãƒ¼ãƒå´ã§ã¯ã‚¹ãƒ‘ムã®ãƒ•ィルタを動ã‹ã›ãªã„ãŒã€ メッセージã®å–得時ã«ãƒžãƒ¼ã‚¯ã‚’付ã‘ãŸã„å ´åˆï¼š @end ifset @ifset en (4) In the case where you use POP and a spam filter does not run on the POP server but you want to mark spam messages when retrieving @end ifset @ifset ja bsfilter ã¯ã€POP ã®ä»£ç†ã‚µãƒ¼ãƒã¨ãªã‚‹æ©Ÿèƒ½ãŒã‚ã‚‹ã®ã§ã€ã“れを実ç¾ã§ãã¾ã™ã€‚ 詳ã—ã㯠bsfilter ã«å«ã¾ã‚Œã¦ã„るマニュアルをå‚ç…§ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en Since bsfilter can be a POP proxy server, you can implement your policy. See a document in the bsfilter package. @end ifset @c %%%%%%%%%%%%%%%%% @node spam2, addr-warn, spam, Tips @ifset ja @section スパム(2) @end ifset @ifset en @section Spam messages(2) @end ifset @kindex lh (Summary) @kindex ls (Summary) @vindex mew-spam-prog @vindex mew-spam-prog-args @vindex mew-ham-prog @vindex mew-ham-prog-args @ifset ja Summary モードã§èª­ã‚“ã§ã„ã‚‹ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ã€ãƒ•ィルターã«ã‚¹ãƒ‘ムã¨ã—㦠学習ã•ã›ã‚‹ã«ã¯ @samp{ls} を使ã„ã¾ã™ã€‚åŒæ§˜ã«ã€ãƒãƒ (スパムã§ãªã„メッセー ジ)ã¨ã—ã¦å­¦ç¿’ã•ã›ã‚‹ã«ã¯ @samp{lh} を利用ã—ã¦ä¸‹ã•ã„。 @end ifset @ifset en If you want to let your filter learn the current message in Summary as a spam, type @samp{ls}. Likewise type @samp{lh} to let your filter learn it as a ham (non-spam). @end ifset @ifset ja 両者ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’使用ã™ã‚‹ãŸã‚ã«ã¯ã€4 ã¤ã®å¤‰æ•°ã‚’設定ã—ã¦ãŠãå¿…è¦ãŒã‚りã¾ã™ã€‚ ã“ã“ã§ã¯ bogofilter を例題ã«ã¨ã‚Šã€3 ã¤ã®å ´åˆã«ã¤ã„ã¦èª¬æ˜Žã—ã¾ã™ã€‚ @end ifset @ifset en To use these commands, you need to configure four variables in advance. We consider bogofilter as an example and see three cases. @end ifset @ifset ja (1) ローカルã®ãƒ•ィルターã«å­¦ç¿’ã•ã›ã‚‹å ´åˆï¼š @end ifset @ifset en (2) To let your local filter learn: @end ifset @lisp (setq mew-spam-prog "bogofilter") (setq mew-spam-prog-args '("-s" "-N" "-v")) (setq mew-ham-prog "bogofilter") (setq mew-ham-prog-args '("-n" "-S" "-v"))) @end lisp @ifset ja (2) サーãƒ()å´ã®ãƒ•ィルター㫠SSH 経由ã§å­¦ç¿’ã•ã›ã‚‹å ´åˆï¼š @end ifset @ifset en (2) To let your filter on your learn via SSH: @end ifset @lisp (setq mew-spam-prog "ssh") (setq mew-spam-prog-args '("" "bogofilter" "-s" "-N" "-v")) (setq mew-ham-prog "ssh") (setq mew-ham-prog-args '("" "bogofilter" "-n" "-S" "-v"))) @end lisp @ifset ja (3) ファイアウォール()ã®å…ˆã®ã‚µãƒ¼ãƒ()ã®ãƒ•ィルター㫠多段㮠SSH 経由ã§å­¦ç¿’ã•ã›ã‚‹å ´åˆï¼š @end ifset @ifset en (3) To pass through your with SSH and to let your filter on your learn via SSH: @end ifset @lisp (setq mew-spam-prog "ssh") (setq mew-spam-prog-args '("-A" "" "ssh" "" "bogofilter" "-s" "-N" "-v")) (setq mew-ham-prog "ssh") (setq mew-ham-prog-args '("-A" "" "ssh" "" "bogofilter" "-n" "-S" "-v"))) @end lisp @ifset ja ãªãŠ SSH を利用ã™ã‚‹å ´åˆã€é–¢é€£ã™ã‚‹ãƒ›ã‚¹ãƒˆã«ã¯ã€ãƒ‘スワードãªã—ã§ãƒ­ã‚°ã‚¤ãƒ³ã§ ãるよã†ã«è¨­å®šã—ã¦ãŠãå¿…è¦ãŒã‚りã¾ã™ã€‚ @end ifset @ifset en If you use SSH, you need to configure related hosts so that you can login them without passwords. @end ifset @c %%%%%%%%%%%%%%%%% @node addr-warn, biff, spam2, Tips @ifset ja @section アドレスã®è­¦å‘Š @end ifset @ifset en @section Warning addresses @end ifset @vindex mew-safe-addresses @vindex mew-warn-addresses @vindex mew-safe-domains @vindex mew-warn-domains @ifset ja 社内ã§é–‰ã˜ã‚‹ã¹ãメッセージã®å®›å…ˆã«ã€ã†ã£ã‹ã‚Šç¤¾å¤–ã®äººã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’書ã„㦠ã—ã¾ã†ã“ã¨ãŒã‚りã¾ã™ã€‚Mew ã§ã¯ã€ãŸã¨ãˆã°ç¤¾å†…ã®ãƒ‰ãƒ¡ã‚¤ãƒ³åを列挙ã—ã¦ãŠã ã¨ã€ç¤¾å¤–ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’赤色ã«ã—ã¦è­¦å‘Šã—ã¦ãれã¾ã™ã€‚ @end ifset @ifset en Suppose you are writing a message which must be closed in your company. You might write an non-employee's address by mistake. If you tells your company's domains, for instance, to Mew, it turns non-employee's addresses to red. @end ifset @ifset ja ã©ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’警告ã™ã‚‹ã®ã‹ã‚’決定ã™ã‚‹å¤‰æ•°ã¯ 4 ã¤ã‚りã€ã™ã¹ã¦æ–‡å­—列ã®ãƒªã‚¹ トã«ãªã‚Šã¾ã™ã€‚Mew ã¯ä»¥ä¸‹ã®ãƒ«ãƒ¼ãƒ«ã«å¾“ã£ã¦ã€è­¦å‘Šã™ã‚‹ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’決ã‚ã¾ã™ã€‚ @end ifset @ifset en There are four variables to decide which address should trun red. They are all a list of strings. Mew takes the following rules: @end ifset @enumerate @ifset ja @item アドレス㌠@samp{mew-safe-addresses} ã§æŒ‡å®šã•れã¦ã„れã°è­¦å‘Šã—ãªã„。 @item アドレス㌠@samp{mew-warn-addresses} ã§æŒ‡å®šã•れã¦ã„れã°è­¦å‘Šã™ã‚‹ã€‚ @item ドメイン㌠@samp{mew-safe-domains} ã§æŒ‡å®šã•れã¦ã„れã°è­¦å‘Šã—ãªã„。 @item ドメイン㌠@samp{mew-warn-domains} ã§æŒ‡å®šã•れã¦ã„れã°è­¦å‘Šã™ã‚‹ã€‚ @item @samp{mew-warn-addresses} ã‹ @samp{mew-safe-domains} ãŒå®šç¾©ã•れã¦ã„れ㰠警告ã™ã‚‹ã€‚ @item 警告ã—ãªã„。 @end ifset @ifset en @item If an address is specified in @samp{mew-safe-addresses}, no warning. @item If the address is specified in @samp{mew-warn-addresses}, warning. @item If its domain is specified in @samp{mew-safe-domains}, no warning. @item If its domain is specified in @samp{mew-warn-domains}, warning. @item If either @samp{mew-warn-addresses} or @samp{mew-safe-domains} defined, warning. @item No warning. @end ifset @end enumerate @ifset ja 以下㫠"@@example.org" 以外ã®ãƒ‰ãƒ¡ã‚¤ãƒ³ã‚’æŒã¤ã‚¢ãƒ‰ãƒ¬ã‚¹ã‚’警告ã™ã‚‹ä¾‹ã‚’示ã—ã¾ã™ã€‚ @end ifset @ifset en Here is an example that an address whose domain is not "@@example.org" turns red. @end ifset @lisp (setq mew-safe-domains '("example.org")) @end lisp @ifset ja ドメイン㯠"@@example.org" ã§ã™ãŒã€"customers@@example.org" ã¯è­¦å‘Šã—ãŸã„å ´åˆã¯ã€ ã•らã«ä»¥ä¸‹ã®ã‚ˆã†ã«è¨­å®šã—ã¾ã™ã€‚ @end ifset @ifset en If you want "customers@@example.org" to turn red even its domain is @w{"}@@example.org", add the following line. @end ifset @lisp (setq mew-warn-addresses '("customers@@example.org")) @end lisp @c %%%%%%%%%%%%%%%%% @node biff, edit, addr-warn, Tips @ifset ja @section Biff @end ifset @ifset en @section Biff @end ifset @vindex mew-use-biff @vindex mew-use-biff-bell @vindex mew-biff-interval @ifset ja メッセージãŒåˆ°ç€ã—ãŸã‹å®šæœŸçš„ã«èª¿ã¹ã‚‹æ©Ÿèƒ½ã‚’ biff ã¨ã„ã„ã¾ã™ã€‚Mew ã§ã¯ã€ 以下ã®è¨­å®šã‚’ã™ã‚‹ã¨ã€5 分ã”ã¨ã«æ–°è¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒä½•個ã‚ã‚‹ã‹èª¿ã¹ã‚‹ã‚ˆã†ã«ãª りã¾ã™ã€‚ @end ifset @ifset en The functionality to check new messages is called biff. With the following configuration Mew sees how many new messages have arrived every 5 minutes. @end ifset @lisp (setq mew-use-biff t) @end lisp @ifset ja æ–°è¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒã‚れã°ã€ãã®æ•°ãŒãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ã«è¡¨ç¤ºã•れã¾ã™ã€‚ @end ifset @ifset en If one or more new messages exist, the total number is displayed in the mode line. @end ifset @ifset ja Biff ã®å¯¾è±¡ã¨ãªã‚‹ã‚µãƒ¼ãƒã¨ãƒ—ロトコルã¯ã€Mew ã®èµ·å‹•時㫠@samp{mew-proto} ã¨ã‚±ãƒ¼ã‚¹(@samp{mew-case})ã‹ã‚‰æ±ºå®šã•れã¾ã™ã€‚ @end ifset @ifset en The server and the protocol, which Mew checks, are decided according to @samp{mew-proto} and the "case" (@samp{mew-case}) on boot time. @end ifset @ifset ja 以下ã®è¨­å®šã‚’ã™ã‚‹ã¨ã€æ–°è¦ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãŒãªã„状態ã‹ã‚‰ã‚る状態ã«å¤‰ã£ãŸéš›ã«ã€ ビープ音ãŒé³´ã‚Šã¾ã™ã€‚ @end ifset @ifset en With the following configuration, Mew beeps when the number of new messages changes from zero to one or more. @end ifset @lisp (setq mew-use-biff-bell t) @end lisp @ifset ja メッセージã®åˆ°ç€ã‚’調ã¹ã‚‹é–“隔を変ãˆã‚‹ã«ã¯ã€@samp{mew-biff-interval} を設 定ã—ã¦ä¸‹ã•ã„。以下ã¯ã€10 分ã«ã™ã‚‹ä¾‹ã§ã™ã€‚ @end ifset @ifset en To change the interval time of biff, set @samp{mew-biff-interval}. Below is an example to set it to 10 minutes. @end ifset @lisp (setq mew-biff-interval 10) @end lisp @c %%%%%%%%%%%%%%%%% @node edit, Convention, biff, Tips @ifset ja @section Edit モード @end ifset @ifset en @section Edit @end ifset @kindex M-e @kindex C-cC-c (Edit) @kindex C-cC-m (Edit) @ifset ja Edit モードã¯ã€æ—¢å­˜ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’編集ã—ã€æ–°ã—ã„メッセージを作æˆã™ã‚‹ãŸã‚ ã®ãƒ¢ãƒ¼ãƒ‰ã§ã™ã€‚用途ã®å…¸åž‹ä¾‹ã‚’以下ã«ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en Edit mode is a mode to edit a message to generate another new message. The followings are typical examples: @end ifset @itemize @minus @ifset ja @item 大ããªæ·»ä»˜ãƒ•ァイルを削除ã—ã¦ä¿å­˜ã™ã‚‹ @item PGP/MIME ã‚„ S/MIME ã§æš—å·åŒ–ã•れãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’復å·åŒ–ã—ãŸçŠ¶æ…‹ã§ä¿å­˜ã™ã‚‹ @end ifset @ifset en @item Saving a new message with big attachments removed @item Saving a decrypted message whose original one is encrypted with PGP/MIME or S/MIME @end ifset @end itemize @ifset ja ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’ Edit モードã§ç·¨é›†ã™ã‚‹ã«ã¯ã€@samp{M-e}を押ã—ã¾ã™ã€‚ã™ ã‚‹ã¨ã€Draft モードã«ä¼¼ãŸå½¢ã§è‰ç¨¿ãŒç”¨æ„ã•れã¾ã™ã€‚Edit モードã§ã¯ã€Draft モードã¨åŒæ§˜ã®æ“作ã§ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’編集ã§ãã¾ã™ã€‚ @end ifset @ifset en To edit a current message in Edit mode, type @samp{M-e}. Then, a new draft is prepared like Draft mode. In Edit mode, you can edit a message as if you were in Draft mode. @end ifset @ifset ja 編集ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ–°ã—ã„メッセージã¨ã—ã¦ä¿å­˜ã™ã‚‹ã«ã¯ã€@samp{C-cC-c}ã‹ @samp{C-cC-m}を使ã„ã¾ã™ã€‚両者ã¯ã€ã¾ã£ãŸãåŒã˜ã‚³ãƒžãƒ³ãƒ‰ã§ã™ã€‚ã“れらã®ã‚³ãƒž ンドを実行ã™ã‚‹ã¨ã€ã©ã®ãƒ•ォルダã«ä¿å­˜ã™ã‚‹ã‹ã‚’訊ã„ã¦ãã¾ã™ã€‚ @end ifset @ifset en To save edited message to a new message, type @samp{C-cC-c} or @samp{C-cC-m}. They are the exactly same command. To execute one of them, you are asked a folder to save the new message. @end ifset @ifset ja ãªãŠã€ã“ã®æ©Ÿèƒ½ã¯å†ç·¨é›†(@xref{sum-write})ã¨æ··åŒã—ã‚„ã™ã„ã®ã§æ³¨æ„ã—ã¦ä¸‹ã• ã„。å†ç·¨é›†ã¯ç·¨é›†å¾Œã«é€ä¿¡ã™ã‚‹ã®ã«å¯¾ã—ã€Edit モードã§ã¯ç·¨é›†ã®å¾Œã«ä¿å­˜ã—ã¾ ã™ã€‚ @end ifset @ifset en Please take care that you may confuse this command as retry sending (@pxref{sum-write}). Retry seinding is to send a message after editing while Edit mode is to save a message after modifying. @end ifset @ifset ja 以下㫠Edit モードã®ã¾ã¨ã‚を示ã—ã¾ã™ã€‚Summary モードã‹ã‚‰ Edit モード㫠入るã«ã¯ä»¥ä¸‹ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’使ã„ã¾ã™ã€‚ @end ifset @ifset en The following is summary of commands relating to Edit mode. To enter Edit mode from Summary mode, use the following command. @end ifset @table @samp @ifset ja @item M-e ç¾åœ¨ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’元㫠Edit モードã«å…¥ã‚‹ã€‚ @end ifset @ifset en @item M-e Entering Edit mode with the current message. @end ifset @end table @ifset ja Edit モードã§ã®ã‚³ãƒžãƒ³ãƒ‰ã‚’ã¾ã¨ã‚ã¾ã™ã€‚ @end ifset @ifset en The following is a summary of commands in Edit mode. @end ifset @table @samp @ifset ja @item C-cC-c 編集ã—ãŸãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’æ–°ã—ã„メッセージã«ä¿å­˜ã€‚ @item C-cC-m @samp{C-cC-c}ã«åŒã˜ã€‚ @item ãã®ä»– Draft モードã¨åŒã˜ã€‚ @end ifset @ifset en @item C-cC-c Saving the edited message to a new message. @item C-cC-m The same as @samp{C-cC-c} @item Other commands The same as the other commands in Edit mode @end ifset @end table @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Message Convention @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Convention, Implementation, edit, Top @ifset ja @chapter メッセージã®ä½œæ³• @end ifset @ifset en @chapter E-mail convention @end ifset @ifset ja メッセージをやりã¨ã‚Šã™ã‚‹éš›ã«ã¯ã€æœ€ä½Žé™ã®ãƒžãƒŠãƒ¼ãŒã‚りã¾ã™ã€‚マナーを守ã£ã¦ ã„ãªã„メッセージã¯èª­ã¿ã«ãã„ãŸã‚ã€å¤§å¤‰æã—ã¾ã™ã€‚ç°¡æ½”ã‹ã¤é©åˆ‡ãªæ–‡ç« ã‚’書ã〠ãªã‚‹ã¹ã相手ã«ç†è§£ã—ã¦ã‚‚らãˆã‚‹ã‚ˆã†åŠªåŠ›ã—ã¾ã—ょã†ã€‚ @end ifset @ifset en When you exchange messages with other people, you should obey minimum manner. It gives a bad impression to the people if you violate the manner since such messages are hard to read. We always should try to write concise yet comprehensive explanations and make an effort to make receivers well-understood. @end ifset @ifset ja メッセージを書ãéš›ã«æ°—を付ã‘ã‚‹ã¹ã項目を以下ã«ç¤ºã—ã¾ã™ã€‚ @end ifset @ifset en We should take good care of the following items. @end ifset @table @asis @ifset ja @item To: 㨠Cc: ã‚’æ­£ã—ãæ›¸ã To: ãŒç›®çš„ã®äººã§ã€Cc: ã¯å‚考ã¾ã§ã«é€ã‚Šä»˜ã‘る人ã§ã™ã€‚自分ã®ã‚¢ãƒ‰ãƒ¬ã‚¹ãŒ Cc: ã®å ´åˆã¯ã€èª­ã¿é£›ã°ã™äººãŒã„ã¾ã™ã‹ã‚‰æ³¨æ„ã—ã¦ä¸‹ã•ã„。ã¾ãŸã€ä¸å¿…è¦ãªã‚¢ãƒ‰ãƒ¬ã‚¹ ã‚’ To: ã‚„ Cc: ã«æ›¸ã„ã¦ã€ç›¸æ‰‹ã«è¿·æƒ‘ã‚’ã‹ã‘ã¦ã—ã¾ã†ã“ã¨ãŒãªã„よã†ã«ã—ã¾ã—ょ ã†ã€‚ @item To: 㨠Cc: ã«æ›¸ãã‚¢ãƒ‰ãƒ¬ã‚¹ã®æ•°ã¯å°‘ãªãã™ã‚‹ アドレスをãŸãã•ã‚“ To: ã‚„ Cc: ã«æ›¸ãã®ã¯ã‚ˆããªã„ã“ã¨ã§ã™ã€‚é¢å€’ã§ã‚‚メーリ ングリストを作りã¾ã—ょã†ã€‚ã‚ã‚‹ã„ã¯ã€å¿…è¦ã«å¿œã˜ã¦å®›å…ˆã‚’匿åã«ã—ã¾ã—ょㆠ(@xref{anonymous})。 @item Subject: ã«ã¯æœ¬æ–‡ã®å†…容を的確ã«çŸ­ã書ã Subject: を見ã¦èª­ã‚€ã‹æ±ºã‚る人ãŒã„ã¾ã™ã‹ã‚‰ã€ä¸é©åˆ‡ãª Subject: ã ã¨èª­ã‚“㧠もらãˆãªã„ã‹ã‚‚ã—れã¾ã›ã‚“。長ㄠSubject: ã¯èª­ã¿ã«ãã„ã®ã§æ­¢ã‚ã¾ã—ょã†ã€‚ @item å¿…è¦ãªéƒ¨åˆ†ã ã‘を引用ã™ã‚‹ é¢å€’ã§ã‚‚ä¸è¦ãªéƒ¨åˆ†ã¯å‰Šã‚Šã¾ã—ょã†ã€‚Mew を使ã£ã¦ã„れã°ã€å¼•ç”¨ã¯æ¥½å‹ã®ã¯ãšã§ ã™ã€‚ @item シグニãƒãƒ£ã¯ç°¡ç´ ã«ã™ã‚‹ é•·ã„シグニãƒãƒ£ã¯å˜ãªã‚‹è‡ªå·±æº€è¶³ã§ã™ã€‚ @item ã„ãŸãšã‚‰ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’é€ã‚‰ãªã„ ã“ã‚“ãªã“ã¨ã¯æ³¨æ„ã—ãŸãã‚りã¾ã›ã‚“ãŒã€ãれã§ã‚‚ä¸å¹¸ã®ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ãªã©ã‚’é€ã£ã¦ ãる人ãŒã„ã¾ã™ã€‚人格を疑ã‚れるã“ã¨ã‚’ç†è§£ã™ã¹ãã§ã™ã€‚ @item 相手ã®èª­ã‚るデータã®ã¿ã‚’添付ã™ã‚‹ ãªã‚“ã®åˆæ„ã‚‚ãªã—ã«é€ã£ã¦ã‚ˆã„データã¯ãƒ†ã‚­ã‚¹ãƒˆã®ã¿ã§ã™ã€‚ãれ以外ã®ãƒ‡ãƒ¼ã‚¿ã‚’ é€ã‚‹å ´åˆã¯ã€ã‚らã‹ã˜ã‚相手ã«é€ã£ã¦ã‚ˆã„ã‹ç¢ºèªã‚’ã¨ã‚Šã¾ã—ょã†ã€‚メーリングリ ストã«ã¯ã€ãƒ†ã‚­ã‚¹ãƒˆã®ã¿ã‚’投稿ã™ã‚‹ã®ãŒç„¡é›£ã§ã—ょã†ã€‚ @end ifset @ifset en @item Fill To: and Cc: fields precisely To: is for target receivers and Cc: is for those who are received for their information. If his address is not on To:, he might skip to read the message. We should take care not to deliver to wrong people by mistaking the addresses. @item The number of addresses To: and Cc: should be small It is discouraged to specify a lot of mail addresses on To: and Cc:. You should create a mailing-list instead. Or, if necessary, you should make the destination anonymous (@pxref{anonymous}). @item Write a short and clear summary of body in Subject: There are people who decide to read contents from their Subject:. So, they might skip messages with improper Subject:. We should not write a long subject since it is hard to read. @item Cite only necessary sentences You should not bother to remove unnecessary sentences. With Mew, citation must be a piece of cake. @item Make your signature simple A long signature is just self-satisfaction. @item Do not send prank messages I do not want to warn this kind of stuff. Nonetheless, someone sends Happy or Unhappy messages to others. You should understand that people doubt your character. @item Attach data files that the receivers can read It is text only that you can send without any agreement with the receivers. If you want to send data files other than text, you should make an agreement with the receivers. To mailing-list, you should send text only. @end ifset @end table @ifset ja ã¾ãŸã€ã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã®ãƒžãƒŠãƒ¼ã¯ RFC1855 を読むã¨ã„ã„ã§ã—ょã†ã€‚ @end ifset @ifset en If you wish to learn manner on the Internet more comprehensively, please refer to RFC1855. @end ifset @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Implementation @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Implementation, Avail, Convention, Top @ifset ja @chapter 実装ã«ã¤ã„㦠@end ifset @ifset en @chapter Implementation Issues @end ifset @table @asis @ifset ja @item "mewl" 㨠"mewencode" ãŒå¿…è¦ãªã®ã¯ãªãœï¼Ÿ Mew ã§ã¯ã€Summary mode ã§ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’å–å¾—ã—ã¦ã„ã‚‹é–“ã‚„ã€ä¸€è¦§ã‚’å†è¡¨ç¤ºã—㦠ã„ã‚‹é–“ã«ã€ãƒ¡ãƒƒã‚»ãƒ¼ã‚¸ã‚’読ã¿é€²ã‚ã‚‹ã“ã¨ãŒã§ãã¾ã™ã€‚ã“れã¯ã€ãƒ—ログラムã®åˆ¶å¾¡ ã®æµã‚ŒãŒè¤‡æ•°å¿…è¦ã§ã‚ã‚‹ã“ã¨ã‚’æ„味ã—ã¦ã„ã¾ã™ã€‚Emacs ã§åˆ¶å¾¡ã®æµã‚Œã‚’複数ã«ã™ ã‚‹ã«ã¯ã€ã‚µãƒ–プロセスを作るã‹ã€TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’張るã—ã‹æ–¹æ³•ãŒã‚りã¾ã›ã‚“ (Emacs Lisp ã«ã¯ light weight process ãŒã‚りã¾ã›ã‚“)。POP ã‚„ SMTP ã«ã¯ã€ TCP コãƒã‚¯ã‚·ãƒ§ãƒ³ã‚’使ã†ã®ã§å•題ã‚りã¾ã›ã‚“。ã—ã‹ã—ã€Summary mode ã®ä¸€è¦§ã‚’ å†è¡¨ç¤ºã™ã‚‹ãŸã‚ã«ã¯ã€ä½•ã‹ã‚³ãƒžãƒ³ãƒ‰ã‚’èµ·å‹•ã—ãªã„ã¨ã„ã‘ã¾ã›ã‚“。ã“れãŒã€ "mewl" ãŒå­˜åœ¨ã™ã‚‹ç†ç”±ã§ã™ã€‚"mewencode" ãŒå­˜åœ¨ã™ã‚‹ç†ç”±ã¯ã€å˜ã«é€Ÿåº¦ã®ãŸã‚ ã§ã™ã€‚MIME ã®ç¬¦å·åŒ–ã‚’ Emacs Lisp ã§å®Ÿè£…ã—ãŸã¨ã“ã‚ã€ä½¿ã„物ã«ãªã‚‰ãªã„ãら ã„é…ã‹ã£ãŸã®ã§ã€"mewencode" を使ã„ç¶šã‘ã¦ã„ã¾ã™ã€‚(ãŸã ã—ã€Base64 ㌠Emacs ã§å®Ÿè£…ã•れã¦ã„れã°ã€ãã¡ã‚‰ã‚’使ã„ã¾ã™ã€‚) @item 文字列検索(@samp{C-s}ã€@samp{C-r})ã™ã‚‹ã¨ã€è¡Œæœ«ã«ã‚«ãƒ¼ã‚½ãƒ«ãŒé£›ã¶ã®ã¯ãªãœï¼Ÿ Summary mode ã«ãŠã„ã¦ã€ã‚¹ãƒ¬ãƒƒãƒ‰æƒ…å ±ã¯è¡¨ç¤ºã•れã¾ã›ã‚“。ã“れã¯ã€Summary mode ã§è¡¨ç¤ºã•れã¦ã„る行ã«é–¢ã—ã¦ã¯ã€è¡¨ç¤ºã™ã‚‹çž¬é–“ã«ã‚¹ãƒ¬ãƒƒãƒ‰æƒ…å ±ã«éžè¡¨ç¤º ã®å±žæ€§ã‚’付ã‘ã‚‹ã‹ã‚‰ã§ã™ã€‚éžè¡¨ç¤ºã®å±žæ€§ãŒã¤ã„ã¦ã„ã‚‹éƒ¨åˆ†ã¯æ–‡å­—列検索ã®å¯¾è±¡ ã«ã¯ãªã‚Šã¾ã›ã‚“。ã—ã‹ã—ã€Summary mode ã«è¡¨ç¤ºã•れã¦ã„ãªã„行ã®ã‚¹ãƒ¬ãƒƒãƒ‰æƒ… å ±ã¯ã€éžè¡¨ç¤ºã®å±žæ€§ãŒã¤ã„ã¦ã„ãªã„ãŸã‚ã€æ¤œç´¢ã®å¯¾è±¡ã¨ãªã‚Šã¾ã™ã€‚ãã—ã¦ã€åˆ 致ã—ãŸè¡ŒãŒè¡¨ç¤ºã•れる際ã«éžè¡¨ç¤ºã®å±žæ€§ãŒã¤ã„ã¦ã€ã‚ãŸã‹ã‚‚行末ã«åˆè‡´ã—ãŸã‹ ã®ã‚ˆã†ãªéŒ¯è¦šã‚’å—ã‘ã¾ã™ã€‚Summary mode 全体ã®è¡Œã®ã‚¹ãƒ¬ãƒƒãƒ‰æƒ…å ±ã«ã¯ã€ã‚­ãƒ¼ ã®å…¥åŠ›ãŒãªã„時間ã«éžè¡¨ç¤ºã®å±žæ€§ãŒä»˜ãã¾ã™ã€‚全体ã«éžè¡¨ç¤ºã®å±žæ€§ãŒä»˜ãã¨ã€ Summary mode ã®ãƒ¢ãƒ¼ãƒ‰ãƒ©ã‚¤ãƒ³ã®å³ç«¯ã«ã‚ã‚‹ @samp{*} ãƒžãƒ¼ã‚¯ãŒæ¶ˆãˆã¾ã™ã€‚ã“ ã®çŠ¶æ…‹ã§ã¯ã€æ–‡å­—列検索ãŒç›´æ„Ÿé€šã‚Šã«åƒãã¾ã™ã€‚ @item Mew 4.3 ã§ãƒ•ァイルを添付ã™ã‚‹ã¨ MS ã®ãƒ¡ãƒ¼ãƒ«ãƒªãƒ¼ãƒ€ã§ãƒ•ァイルåãŒèªè­˜ã§ãるよã†ã«ãªã‚Šã¾ã—㟠MS ã®ãƒ¡ãƒ¼ãƒ«ãƒªãƒ¼ãƒ€ã¯ã€ãƒ•ァイルåを符å·åŒ–ã™ã‚‹éš›ã«ã€æ¨™æº–化ã•れã¦ãªã„独自㮠方法を使ã„ã¾ã™ã€‚MS ã®ãƒ¡ãƒ¼ãƒ«ãƒªãƒ¼ãƒ€ãŒã€æ¨™æº–化ã•れã¦ã„る符å·åŒ–æ–¹å¼ã«ç§»è¡Œã™ れã°ã„ã„ã®ã§ã™ãŒã€ä½•度ãŠé¡˜ã„ã—ã¦ã‚‚ç„¡ç†ã§ã—ãŸã€‚ãã“ã§ã€Mew ã§ã¯ä»¥ä¸‹ã®ã‚ˆ ã†ãªæ–¹æ³•ã§ã€ã“ã®å•題を解決ã—ã¾ã—ãŸã€‚ã™ãªã‚ã¡ã€Mew ã¯åŸºæœ¬çš„ã«ã¯æ¨™æº–化㕠れã¦ã„る方法ã§ã€ãƒ•ァイルåを符å·åŒ–ã—ã¾ã™ã€‚ãれã«åŠ ãˆã¦ã€MS ã®ãƒ¡ãƒ¼ãƒ«ãƒªãƒ¼ ダãŒå‚ç…§ã™ã‚‹æ¨™æº–化ã•れã¦ãªã„パラメータã«å¯¾ã—ã¦ã€ãƒ•ァイルåã‚’ MS 独自㮠方法ã§ç¬¦å·åŒ–ã—ã€ä»˜åŠ ã—ã¾ã™ã€‚ @end ifset @ifset en @item Why are "mewl" and "mewencode" necessary? With Mew, you can read throw messages in Summary mode while you are retrieving messages or listing the messages again. This means that multiple control flows of program are necessary. To make multiple control flows by Emacs, the only way is to make a TCP connection or to execute sub-process (Emacs Lisp does NOT provide a feature of light weight process). For POP and SMTP, Mew makes a TCP connection, so they are not a problem. However, to list the messages in Summary mode again, we have to execute a command. This is why "mewl" exists. The reason why "mewencode" exists is just for speed. When I programmed MIME encoding by Emacs Lisp in several ways, they are too slow to use. So, I decided to continue to use "mewencode". (If Base64 is implemented by Emacs, Mew uses the native function.) @item Why does the cursor jump onto the end of line when searching(@samp{C-s}, @samp{C-r})? Thread informations are not displayed in Summary mode. This is because the "invisible" property is dynamically put onto them when displayed. Strings with this property is not a target of the string search. But, thread informations of undisplayed lines do not have this property, so the string search targets them. Then a matched line is displayed and the "invisible" property is put. So, it seems to you that the string search matches the end of the line. Mew puts the "invisible" property for all lines in Summary mode in background while there are no user key inputs. When this word is finished, the @samp{*} mark in the right side of the mode line in Summary mode disappears. In this situation, string search works exactly as you expect. @item MS's mailers can handle file names well if I attach files with Mew 4.3 MS's mailers use "non-standard MS original" encoding to encode file names. MS mailers should migrate to the standard encoding. I repeatedly asked MS to do so, but they did not. So, Mew took the following workaround: Mew basically uses the standard encoding. In addition, Mew add "MS original parameter" with file names encoded with "MS original" encoding. @end ifset @end table @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Avail @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Avail, obtain, Implementation, Top @ifset ja @chapter 入手方法ã¨ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆ @end ifset @ifset en @chapter Availability and mailing-list @end ifset @ifset ja ã“ã“ã§ã¯ã€Mew ã®å…¥æ‰‹æ–¹æ³•ã¨ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã«ã¤ã„ã¦è§¦ã‚Œã¾ã™ã€‚ @end ifset @ifset en This chapter describes how to get Mew and related mailing-lists. @end ifset @menu @ifset ja * obtain:: Mew ã®å…¥æ‰‹æ–¹æ³• * ml:: メーリングリスト @end ifset @ifset en * obtain:: How to get Mew? * ml:: Mailing list @end ifset @end menu @c %%%%%%%%%%%%%%%%% @node obtain, ml, Avail, Avail @ifset ja @section Mew ã®å…¥æ‰‹æ–¹æ³• @end ifset @ifset en @section How to get Mew? @end ifset @ifset ja Mew ã®æœ€æ–°ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¯ä»¥ä¸‹ã‹ã‚‰å…¥æ‰‹ã§ãã¾ã™ã€‚ @end ifset @ifset en The latest Mew is available from the following repository. @end ifset @example http://www.Mew.org/Release/ @end example @ifset ja Mew ã® Git 版ã«ã¤ã„ã¦çŸ¥ã‚ŠãŸã‘れã°ã€ä»¥ä¸‹ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 @example http://www.mew.org/ja/git/ @end example @end ifset @ifset en If you want to know about Git versions of Mew, please refer to: @example http://www.mew.org/en/git/ @end example @end ifset @c %%%%%%%%%%%%%%%%% @node ml, Copyright, obtain, Avail @ifset ja @section メーリングリスト @end ifset @ifset en @section Mailing list @end ifset @ifset ja Mew ã«é–¢ã™ã‚‹ãƒ¡ãƒ¼ãƒªãƒ³ã‚°ãƒªã‚¹ãƒˆã«ã¤ã„ã¦ã¯ã€ä»¥ä¸‹ã‚’å‚ç…§ã—ã¦ä¸‹ã•ã„。 @example https://groups.google.com/forum/#!forum/mew-ja @end example @end ifset @ifset en If you want to receive release announcements, ask questions, and/or discuss features in English, please subscribe yourself to mew-en. @example https://groups.google.com/forum/#!forum/mew-en @end example @end ifset @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Copyright @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Copyright, Variable Index, ml, Top @ifset ja @chapter 著作権ã«ã¤ã„㦠@end ifset @ifset en @chapter Copyright @end ifset @ifset ja Mew ã¯ä»¥ä¸‹ã®è‘—作権ã«å¾“ã„ã¾ã™ã€‚ Copyright (C) 1994-2013 Mew developing team.@* All rights reserved. å¤‰æ›´ã®æœ‰ç„¡ã«ã‹ã‹ã‚らãšã€ã‚½ãƒ¼ã‚¹ãŠã‚ˆã³ãƒã‚¤ãƒŠãƒªå½¢å¼ã®å†é…布ãŠã‚ˆã³åˆ©ç”¨ã¯ã€ä»¥ ä¸‹ã®æ¡ä»¶ã‚’満ãŸã—ã¦ã„れã°ã€ã“れを許å¯ã™ã‚‹ã€‚ @enumerate @item ソース・コードã®å†é…布ã¯ã€ä¸Šè¨˜ã®è‘—作権表示ã€ã“ã®æ¡ä»¶é …ç›®ã€ãŠã‚ˆã³ã€ä»¥ä¸‹ã® å…責事項をä¿å­˜ã—ãªã‘れã°ãªã‚‰ãªã„。 @item ãƒã‚¤ãƒŠãƒªå½¢å¼ã®å†é…布ã¯ã€ä¸Šè¨˜ã®è‘—作権表示ã€ã“ã®æ¡ä»¶é …ç›®ã€ãŠã‚ˆã³ã€ä»¥ä¸‹ã®å… 責事項をã€ãã®é…布ã«ä»˜éšã™ã‚‹èª¬æ˜Žæ›¸ã€ã‚ã‚‹ã„ã¯ãã®ä»–ã®è³‡æ–™ã®ã„ãšã‚Œã‹ã«æ˜Žè¨˜ ã—ãªã‘れã°ãªã‚‰ãªã„。 @item å‰ã‚‚ã£ã¦ç‰¹åˆ¥ã«è¨±è«¾ã‚’å¾—ãªã„é™ã‚Šã€ã“ã®ã‚½ãƒ•トウェアã‹ã‚‰æ´¾ç”Ÿã—ãŸè£½å“ã®æŽ¨å¥¨ã‚„ 販売促進ã®ãŸã‚ã«ã€ã“ã®ãƒãƒ¼ãƒ åã¨è²¢çŒ®è€…é”ã®åå‰ã‚’利用ã—ã¦ã¯ãªã‚‰ãªã„。 @end enumerate ã“ã®ã‚½ãƒ•トウェアã¯ã€Œã“ã®ã¾ã¾ã®å½¢ã§ã€æä¾›ã•ã‚Œã€æ˜Žç¤ºçš„ã‚ã‚‹ã„ã¯è¨€å¤–ã®ä¿è¨¼ ã¯ã€å•†ç”¨åˆ©ç”¨ãŠã‚ˆã³ç‰¹å®šç›®çš„ã¸ã®é©åˆã«å¯¾ã™ã‚‹è¨€å¤–ã®ä¿è¨¼ã‚‚å«ã¿ã€ã¾ãŸã“れら ã ã‘ã«é™ã‚‰ãšã€å­˜åœ¨ã—ãªã„。ãŸã¨ãˆä»¥ä¸‹ã®ã‚ˆã†ãªæå®³ã®å¯èƒ½æ€§ã‚’示唆ã•れã¦ã„ ãŸã¨ã—ã¦ã‚‚ã€ã©ã®ã‚ˆã†ãªå½¢ã«ã—ã‚ã“ã®ã‚½ãƒ•トウェアã®åˆ©ç”¨ã‹ã‚‰ç™ºç”Ÿã—ãŸå•題㫠ãŠã„ã¦ã€ã“ã®ãƒãƒ¼ãƒ ã¨è²¢çŒ®è€…é”ã¯ã€(代替製å“やサービスã®èª¿é”; 利用権ã€ãƒ‡ãƒ¼ ã‚¿ã€ã‚ã‚‹ã„ã¯åˆ©ç›Šã®æå¤±; ã‚ã‚‹ã„ã¯å–¶æ¥­ã®ä¸­æ–­ã‚’å«ã‚€ã€ã¾ãŸã“れらã ã‘ã«é™ã‚‰ ãš)直接的ã«ã€é–“接的ã«ã€å¶ç„¶ã«ã€ç‰¹åˆ¥ã«ã€æ‡²ç½°ä¸Šã€ã‚ã‚‹ã„ã¯ã€å¿…ç„¶çš„ã«ç”Ÿã˜ ã¦ã—ã¾ã£ãŸæå®³ã«å¯¾ã—責任ã¯ãªãã€ã„ã‹ãªã‚‹è²¬ä»»ç†è«–上ã§ã‚‚å¥‘ç´„ã®æœ‰ç„¡ã«ä¿‚゠らãšå޳坆ãªè²¬ä»»ã¯ãªãã€ã¾ãŸ(éŽå¤±ã‚ã‚‹ã„ã¯ãã®ä»–ã‚’å«ã‚€)䏿³•行為ã«å¯¾ã—ã¦ã‚‚ 責任ã¯ãªã„。 @end ifset @ifset en Mew conforms the following copyright. Copyright (C) 1994-2013 Mew developing team.@* All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: @enumerate @item Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. @item Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. @item Neither the name of the team nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. @end enumerate THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. @end ifset @ifset ja CD ROM ã«å…¥ã‚Œã¦é…布ã—ãŸã„ã¨ã„ã†æ–¹ã¯ã€ã§ãã‚‹ã ã‘æ•™ãˆã¦ä¸‹ã•ã„。教ãˆã¦ãれ ãªãã¦ã‚‚怒りã¾ã›ã‚“ãŒã€æ•™ãˆã¦é ‚ã‘ã‚‹ã¨ã‚りãŒãŸã„ã§ã™ã€‚é…布を断ã£ãŸã“ã¨ã¯ ã‚りã¾ã›ã‚“。 @end ifset @ifset en If you wish to distribute Mew in CD or something, please let me know. I do not go mad even if you do not tell me but I'm very glad if you do so. I never have declined requirements. @end ifset @ifset ja ã“ã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã®è‘—作権ã¯ã€è‘—者ã«å±žã—ã¾ã™ã€‚è¤‡è£½ã€æ”¹å¤‰ã€å†é…布ã¯è‡ªç”±ã§ã™ ãŒã€ç„¡ä¿è¨¼ã§ã™ã€‚ã¾ãŸã€ã“ã®ãƒžãƒ‹ãƒ¥ã‚¢ãƒ«ã‹ã‚‰ç™ºç”Ÿã—ãŸè¢«å®³ã«å¯¾ã—ã€è‘—者ã¯ä¸€åˆ‡ 責任を負ã„ã¾ã›ã‚“。 @end ifset @ifset en The copyright of this manual belongs to the author. Permission is granted to copy, modify, redistribute this manual but no warranty. @end ifset @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Variable Index @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Variable Index, Key Index, Copyright, Top @ifset ja @chapter 変数索引 @end ifset @ifset en @chapter Variable Index @end ifset @printindex vr @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Key Index @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @node Key Index, , Variable Index, Top @ifset ja @chapter キー索引 @end ifset @ifset en @chapter Key Index @end ifset @printindex ky @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @c Tailer @c %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% @shortcontents @contents @bye kazu-yamamoto-Mew-ff9c41b/install-sh000077500000000000000000000127361256455547000175700ustar00rootroot00000000000000#!/bin/sh # # install - install a program, script, or datafile # This comes from X11R5 (mit/util/scripts/install.sh). # # Copyright 1991 by the Massachusetts Institute of Technology # # Permission to use, copy, modify, distribute, and sell this software and its # documentation for any purpose is hereby granted without fee, provided that # the above copyright notice appear in all copies and that both that # copyright notice and this permission notice appear in supporting # documentation, and that the name of M.I.T. not be used in advertising or # publicity pertaining to distribution of the software without specific, # written prior permission. M.I.T. makes no representations about the # suitability of this software for any purpose. It is provided "as is" # without express or implied warranty. # # Calling this script install-sh is preferred over install.sh, to prevent # `make' implicit rules from creating a file called install from it # when there is no Makefile. # # This script is compatible with the BSD install script, but was written # from scratch. It can only install one file at a time, a restriction # shared with many OS's install programs. # set DOITPROG to echo to test this script # Don't use :- since 4.3BSD and earlier shells don't like it. doit="${DOITPROG-}" # put in absolute paths if you don't have them in your path; or use env. vars. mvprog="${MVPROG-mv}" cpprog="${CPPROG-cp}" chmodprog="${CHMODPROG-chmod}" chownprog="${CHOWNPROG-chown}" chgrpprog="${CHGRPPROG-chgrp}" stripprog="${STRIPPROG-strip}" rmprog="${RMPROG-rm}" mkdirprog="${MKDIRPROG-mkdir}" transformbasename="" transform_arg="" instcmd="$mvprog" chmodcmd="$chmodprog 0755" chowncmd="" chgrpcmd="" stripcmd="" rmcmd="$rmprog -f" mvcmd="$mvprog" src="" dst="" dir_arg="" while [ x"$1" != x ]; do case $1 in -c) instcmd="$cpprog" shift continue;; -d) dir_arg=true shift continue;; -m) chmodcmd="$chmodprog $2" shift shift continue;; -o) chowncmd="$chownprog $2" shift shift continue;; -g) chgrpcmd="$chgrpprog $2" shift shift continue;; -s) stripcmd="$stripprog" shift continue;; -t=*) transformarg=`echo $1 | sed 's/-t=//'` shift continue;; -b=*) transformbasename=`echo $1 | sed 's/-b=//'` shift continue;; *) if [ x"$src" = x ] then src=$1 else # this colon is to work around a 386BSD /bin/sh bug : dst=$1 fi shift continue;; esac done if [ x"$src" = x ] then echo "install: no input file specified" exit 1 else true fi if [ x"$dir_arg" != x ]; then dst=$src src="" if [ -d $dst ]; then instcmd=: chmodcmd="" else instcmd=mkdir fi else # Waiting for this to be detected by the "$instcmd $src $dsttmp" command # might cause directories to be created, which would be especially bad # if $src (and thus $dsttmp) contains '*'. if [ -f $src -o -d $src ] then true else echo "install: $src does not exist" exit 1 fi if [ x"$dst" = x ] then echo "install: no destination specified" exit 1 else true fi # If destination is a directory, append the input filename; if your system # does not like double slashes in filenames, you may need to add some logic if [ -d $dst ] then dst="$dst"/`basename $src` else true fi fi ## this sed command emulates the dirname command dstdir=`echo $dst | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` # Make sure that the destination directory exists. # this part is taken from Noah Friedman's mkinstalldirs script # Skip lots of stat calls in the usual case. if [ ! -d "$dstdir" ]; then defaultIFS=' ' IFS="${IFS-${defaultIFS}}" oIFS="${IFS}" # Some sh's can't handle IFS=/ for some reason. IFS='%' set - `echo ${dstdir} | sed -e 's@/@%@g' -e 's@^%@/@'` IFS="${oIFS}" pathcomp='' while [ $# -ne 0 ] ; do pathcomp="${pathcomp}${1}" shift if [ ! -d "${pathcomp}" ] ; then $mkdirprog "${pathcomp}" else true fi pathcomp="${pathcomp}/" done fi if [ x"$dir_arg" != x ] then $doit $instcmd $dst && if [ x"$chowncmd" != x ]; then $doit $chowncmd $dst; else true ; fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dst; else true ; fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dst; else true ; fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dst; else true ; fi else # If we're going to rename the final executable, determine the name now. if [ x"$transformarg" = x ] then dstfile=`basename $dst` else dstfile=`basename $dst $transformbasename | sed $transformarg`$transformbasename fi # don't allow the sed command to completely eliminate the filename if [ x"$dstfile" = x ] then dstfile=`basename $dst` else true fi # Make a temp file name in the proper directory. dsttmp=$dstdir/#inst.$$# # Move or copy the file name to the temp name $doit $instcmd $src $dsttmp && trap "rm -f ${dsttmp}" 0 && # and set any options; do chmod last to preserve setuid bits # If any of these fail, we abort the whole thing. If we want to # ignore errors from any of these, just make sure not to ignore # errors from the above "$doit $instcmd $src $dsttmp" command. if [ x"$chowncmd" != x ]; then $doit $chowncmd $dsttmp; else true;fi && if [ x"$chgrpcmd" != x ]; then $doit $chgrpcmd $dsttmp; else true;fi && if [ x"$stripcmd" != x ]; then $doit $stripcmd $dsttmp; else true;fi && if [ x"$chmodcmd" != x ]; then $doit $chmodcmd $dsttmp; else true;fi && # Now rename the file to the real destination. $doit $rmcmd -f $dstdir/$dstfile && $doit $mvcmd $dsttmp $dstdir/$dstfile fi && exit 0 kazu-yamamoto-Mew-ff9c41b/mew-addrbook.el000066400000000000000000000470541256455547000204620ustar00rootroot00000000000000;; mew-addrbook.el --- Aliases and personal information ;; Author: Kazu Yamamoto ;; Created: Mar 22, 1999 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Address book ;;; (defvar mew-addrbook-mode-alias "Alias") (defvar mew-addrbook-mode-personalinfo "Personal Info") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Internal syntax of mew-addrbook-alist ;;; ;; for mew-complete (defalias 'mew-addrbook-alias-hit 'assoc) ;; (defvar mew-addrbook-orig-alist nil "(key (addr1, addr2) nickname name) or (key addr)") (defun mew-adbkorigent-by-shortname (user) (mew-addrbook-alias-hit user mew-addrbook-orig-alist)) ;; (defvar mew-addrbook-alist nil ;; mew-alias-auto-alist is appended "(key addr) or (key (addr1, addr2) nickname name)") (defun mew-adbkent-by-addr-with-alist (addr alist) (mew-assoc-member-case-equal addr alist 1)) (defun mew-adbkent-by-addr (addr) (mew-adbkent-by-addr-with-alist addr mew-addrbook-alist)) (defun mew-adbkent-by-addr2 (addr) ;; for nickname and name, mew-addrbook-orig-alist is enough and fast (mew-adbkent-by-addr-with-alist addr mew-addrbook-orig-alist)) (defun mew-adbkent-shortname (adbkent) (nth 0 adbkent)) (defun mew-adbkent-addrs (adbkent) (nth 1 adbkent)) (defun mew-adbkent-nickname (adbkent) (nth 2 adbkent)) (defun mew-adbkent-name (adbkent) (nth 3 adbkent)) (defun mew-addrbook-shortname-get (addr) (mew-adbkent-shortname (mew-adbkent-by-addr addr))) (defun mew-addrbook-addrs-get (addr) (mew-adbkent-addrs (mew-adbkent-by-addr addr))) (defun mew-addrbook-nickname-get (addr) (mew-adbkent-nickname (mew-adbkent-by-addr2 addr))) (defun mew-addrbook-name-get (addr) (mew-adbkent-name (mew-adbkent-by-addr2 addr))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Internal syntax of mew-alias-auto-alist ;;; (defvar mew-alias-auto-alist nil "(key addr)") (defun mew-autoent-by-shortname (user) (assoc user mew-alias-auto-alist)) (defun mew-autoent-shortname (autoent) (nth 0 autoent)) (defun mew-autoent-addr (autoent) (nth 1 autoent)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Setup ;;; (defun mew-alias-short-to-full (alist) (mapcar (lambda (x) (cdr x)) alist)) ;; duplicated? (defun mew-alias-full-to-short (alist) (mapcar (lambda (x) (cons (downcase (mew-addrstr-extract-user x)) x)) alist)) (defun mew-addrbook-setup () (if (and mew-alias-auto-file (null mew-alias-auto-alist)) ;; make auto-alist only at the initialization time ;; not at update time (auto-alist have not been saved yet) (setq mew-alias-auto-alist (mew-lisp-load mew-alias-auto-file))) (if mew-use-full-alias (if (mew-autoent-addr (car mew-alias-auto-alist)) (setq mew-alias-auto-alist (mew-alias-short-to-full mew-alias-auto-alist))) (if (null (mew-autoent-addr (car mew-alias-auto-alist))) (setq mew-alias-auto-alist (mew-alias-full-to-short mew-alias-auto-alist)))) (setq mew-addrbook-orig-alist (mew-addrbook-make-alist)) (mew-addrbook-concat-uniq) (add-hook 'kill-emacs-hook 'mew-addrbook-clean-up)) (defun mew-addrbook-concat-uniq () (setq mew-addrbook-alist (append mew-addrbook-orig-alist (copy-sequence mew-alias-auto-alist))) (setq mew-addrbook-alist (mew-uniq-alist mew-addrbook-alist))) (defun mew-addrbook-clean-up () (remove-hook 'kill-emacs-hook 'mew-addrbook-clean-up) (when (and mew-alias-auto-file mew-alias-auto-alist) (mew-lisp-save mew-alias-auto-file mew-alias-auto-alist)) (setq mew-alias-auto-alist nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Due to the spec of mew-complete, alist must be passed. ;;; (defvar mew-alias-expand-prefix nil "A variable to make 'mew-alias-expand' elegant.") ;; for completion (defun mew-addrbook-alias-get (key alist) (let* ((mew-alias-expand-prefix nil) (addrs (mew-alias-expand key alist 0)) (addrx (mapcar 'mew-addrstr-append-domain addrs)) (ret (mapconcat 'identity addrx ", "))) (if mew-alias-expand-prefix (concat mew-alias-expand-prefix ":" ret ";") ret))) (defun mew-alias-expand-addrs (key alist count) (let ((keys (delete "" (mapcar 'mew-chop (mew-split key ?,)))) ret) (dolist (key keys) (setq ret (nconc ret (mew-alias-expand key alist count)))) ret)) (defun mew-alias-expand (key alist count) "Expand KEY to a list of addresses according to ALIST. Infinite loop is prevented by COUNT and 'mew-expand-max-depth'. Before calling, 'mew-alias-expand-prefix' must be set 'nil'. If \"prefix:a,b,c;\" is given, 'mew-alias-expand-prefix' is set to \"prefix\", and (expanded-a expanded-b expanded-c) is returned." (cond ((> count mew-expand-max-depth) key) ((string-match "^\\([^:]+\\):\\([^;]+\\);$" key) (if mew-alias-expand-prefix (error ":; must not recurse!")) (setq mew-alias-expand-prefix (match-string 1 key)) (setq key (match-string 2 key)) (mew-alias-expand-addrs key alist (1+ count))) (t (let ((crnt (mew-adbkent-addrs (mew-addrbook-alias-hit key alist)))) (cond ((null crnt) (list key)) ((listp crnt) (list (car crnt))) ((string-match "[^:]+:[^;]+;" crnt) (mew-alias-expand crnt alist (1+ count))) ((string-match "," crnt) (mew-alias-expand-addrs crnt alist (1+ count))) (t (list crnt))))))) (defun mew-addrbook-alias-next (key alist) (let* ((addrs (mew-adbkent-addrs (mew-adbkent-by-addr-with-alist key alist)))) (if (and addrs (listp addrs)) (mew-get-next addrs key)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; For mew-encode-learn-aliases ;;; (defun mew-addrbook-alias-add (addr) ;; Let's downcase user-name for .mew-alias since it is automatically ;; maintained. (when (and (stringp addr) (string-match "@" addr) (or (null mew-addrbook-alias-not-learn-list) (not (mew-member-match addr mew-addrbook-alias-not-learn-list)))) (if mew-use-full-alias (unless (member (list addr) mew-alias-auto-alist) (mew-addrbook-alias-cons (list addr))) (let* ((user (downcase (mew-addrstr-extract-user addr))) (match-auto (mew-autoent-by-shortname user)) (match-adbk-orig (mew-adbkorigent-by-shortname user))) (cond ((string= user "") ;; do nothing ) (match-adbk-orig ;; do nothing ) (match-auto (cond ((string= addr (mew-autoent-addr match-auto)) ;; Move the entry to the top for the recent-used-first. (setq mew-alias-auto-alist (delq match-auto mew-alias-auto-alist)) (setq mew-alias-auto-alist (cons match-auto mew-alias-auto-alist))) (mew-addrbook-override-by-newone ;; override match-auto by (user addr) (setq mew-alias-auto-alist (delq match-auto mew-alias-auto-alist)) (setq mew-addrbook-alist (delete match-auto mew-addrbook-alist)) (mew-addrbook-alias-cons (list user addr))) (t ;; the old entry remains ))) (t (mew-addrbook-alias-cons (list user addr)))))))) (defun mew-addrbook-alias-cons (user-addr) (setq mew-alias-auto-alist (cons user-addr mew-alias-auto-alist)) ;; Ideally, user-addr should be inserted in between ;; mew-addrbook-orig-alist and mew-alist-auto-alist. ;; But mew-alist-auto-alist is the newest-first order. ;; So, just cons user-addr to mew-addrbook-alist. ;; This produces a different alist made by mew-addrbook-setup. ;; But we do not care. (setq mew-addrbook-alist (cons user-addr mew-addrbook-alist))) (defun mew-addrbook-alias-delete (addr) (when (and (stringp addr) (string-match "@" addr)) (let* ((user (downcase (mew-addrstr-extract-user addr))) (ent (mew-autoent-by-shortname user))) (when (and ent (string= addr (mew-autoent-addr addr))) (setq mew-addrbook-alist (delete ent mew-addrbook-alist)) (setq mew-alias-auto-alist (delq ent mew-alias-auto-alist)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Loading Addrbook files ;;; (defun mew-addrbook-insert-file (file cregex &optional unquote) (let* ((case-fold-search t) (pars (mew-split file ?,)) ;; parents (files pars) ;; included par chr path beg end qchar ret) ;; include parents files (dolist (ent pars) (setq par (expand-file-name ent mew-conf-path)) (when (file-readable-p par) (setq ret t) (mew-insert-file-contents par) (setq path (file-name-directory par)) ;; include children files (while (re-search-forward "^<[ \t]*\\([^ \t\n]+\\).*$" nil t) (setq chr (expand-file-name (mew-match-string 1) path)) (replace-match "" nil t) (when (and (file-readable-p chr) (not (member chr files))) (mew-insert-file-contents chr) (setq files (cons chr files)))) (goto-char (point-max)))) ;; remove comments (goto-char (point-min)) (while (re-search-forward cregex nil t) (setq beg (match-beginning 0)) (setq end (match-end 0)) (beginning-of-line) (if (/= (point) beg) (forward-line) (forward-line) (setq end (point))) (delete-region beg end)) ;; concat continuation lines ;; "\" must locate on the end of line (goto-char (point-min)) (while (re-search-forward "\\\\\n" nil t) (replace-match "" nil t)) ;; concat separated lines by comma (goto-char (point-min)) (while (re-search-forward ",$" nil t) (end-of-line) (forward-char 1) (delete-char -1)) ;; replace ", " to "\0" inside/outside quote. (goto-char (point-min)) (while (re-search-forward ",[ \t]+" nil t) (replace-match ",\0" nil t)) ;; unquote, replace white spaces to "\0". (goto-char (point-min)) (if unquote (catch 'quote (while (re-search-forward "[\"']" nil t) (setq qchar (char-before (point))) ;; (point) is for backward compatibility (backward-delete-char 1) ;; delete quote (setq beg (point)) (if (not (re-search-forward (char-to-string qchar) nil t)) (throw 'quote nil) ;; error (backward-delete-char 1) ;; delete quote (save-restriction (narrow-to-region beg (point)) (goto-char (point-min)) (while (re-search-forward "[ \t]+" nil t) (replace-match "\0" nil t)) (goto-char (point-max))))))) ;; just in case ;; remove optional white spaces (goto-char (point-min)) (while (re-search-forward "[ \t]+" nil t) (replace-match " " nil t)) ret)) (defun mew-addrbook-strsafe (var) (if (or (string= "" var) (string= "*" var)) nil (mew-replace-character var 0 mew-sp))) (defun mew-addrbook-make-alist () (let (alias colon addrs nick name alist) (with-temp-buffer (when (mew-addrbook-insert-file mew-addrbook-file mew-addrbook-comment-regex 'unquote) (goto-char (point-min)) (while (re-search-forward "^ ?\\([^ \n:]+\\) ?\\(:?\\) ?\\([^ \t\n]+\\)" nil t) (setq alias (mew-addrbook-strsafe (mew-match-string 1))) (setq colon (mew-match-string 2)) (setq addrs (mew-addrbook-strsafe (mew-match-string 3))) (if (string= colon ":") (setq alist (cons (list alias addrs) alist)) (and addrs (setq addrs (mapcar 'mew-chop (mew-split addrs ?,)))) (if (looking-at " ?\\([^ \n]*\\) ?\\([^ \n]*\\)") (progn (setq nick (mew-addrbook-strsafe (mew-match-string 1))) (setq name (mew-addrbook-strsafe (mew-match-string 2)))) (setq nick nil) (setq name nil)) (setq alist (cons (list alias addrs nick name) alist)))))) (nreverse alist))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Addrbook mode ;;; (defun mew-summary-addrbook-add (&optional personalinfo) "Adding the value of From: in Message mode to Addrbook. When executed with '\\[universal-argument]', it will add personal information. Otherwise, it will add an alias." (interactive "P") (let ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) from shortname addrs name) (save-excursion (mew-summary-set-message-buffer fld msg) (setq from (mew-header-get-value mew-from:))) (if (null from) (message "No address to be registered") ;; assuming From: contains just one address (setq addrs (mew-addrstr-parse-address from)) (if (mew-is-my-address mew-regex-my-address-list addrs) (if personalinfo (setq addrs (car (mew-header-parse-address-list (list mew-to:)))) (setq addrs (mapconcat 'identity (mew-header-parse-address-list (list mew-to: mew-cc:)) ","))) (when (string-match "\\(.*\\)<.*>" from) (setq name (match-string 1 from)) (setq name (mew-chop name))) (if mew-addrbook-strip-domainpart (setq shortname (downcase (mew-addrstr-extract-user addrs))) (setq shortname (downcase addrs)))) (if (not addrs) (message "No address to be registered") (mew-addrbook-prepare-template personalinfo shortname addrs nil name))))) (defun mew-addrbook-prepare-template (personalinfop shortname addrs &optional nickname name) (delete-other-windows) (switch-to-buffer (get-buffer-create mew-buffer-addrbook)) (mew-erase-buffer) (mew-insert-manual "#If you want to register this entry, type " "'\\\\[mew-addrbook-register]'.\n" "#If you want to NOT register this entry, type " "'\\\\[mew-addrbook-kill]'.\n") (mew-addrbook-insert-template "Shortname" shortname) (mew-addrbook-insert-template "Addresses" addrs) (cond (personalinfop (mew-addrbook-insert-template "Nickname" nickname) (mew-addrbook-insert-template "Name" name) (mew-addrbook-mode mew-addrbook-mode-personalinfo)) (t (mew-addrbook-mode mew-addrbook-mode-alias))) (mew-addrbook-insert-template "Comments" nil) (goto-char (point-min)) (search-forward ": " nil t)) (defun mew-addrbook-insert-template (key val) (mew-elet (let ((beg (point))) (insert key ": ") (put-text-property beg (point) 'read-only t) (mew-rear-nonsticky beg (point)) (and val (insert val)) (insert "\n")))) (defun mew-addrbook-mode (mname) "A major mode to register Addrbook. \\{mew-addrbook-mode-map}" (interactive) (setq major-mode 'mew-addrbook-mode) (setq mode-name mname) (setq mode-line-buffer-identification (mew-mode-line-id)) (use-local-map mew-addrbook-mode-map) (mew-run-mode-hooks 'mew-addrbook-mode-hook) (setq buffer-undo-list nil)) (defun mew-addrbook-nconc (ent) (setq mew-addrbook-orig-alist (nconc mew-addrbook-orig-alist (list ent))) (mew-addrbook-concat-uniq)) (defun mew-addrbook-register () "Register information in Addrbook mode to Addrbook." (interactive) (let ((shortname (mew-header-get-value "Shortname:")) (addrs (mew-header-get-value "Addresses:")) (nickname (mew-header-get-value "Nickname:")) (name (mew-header-get-value "Name:")) (comments (mew-header-get-value "Comments:")) (mode mode-name) (uniqp t) buf addrsl errmsg) (cond ((string= mode mew-addrbook-mode-alias) (cond ((and (null shortname) (null addrs)) (setq errmsg "Must fill both Shortname and Addresses")) ((null shortname) (setq errmsg "Must fill Shortname")) ((null addrs) (setq errmsg "Must fill Addresses")))) (t (cond ((null addrs) (setq errmsg "Must fill Addresses")) ((and (null shortname) (null nickname) (null name)) (setq errmsg "Must fill Shortname or Nickname or Name")) ((and name (string-match "^\"[^\"]*[^\000-\177]" name)) (setq errmsg "Remove quote around non-ASCII Name"))))) (if errmsg (message "%s" errmsg) (save-excursion (setq buf (mew-find-file-noselect2 (expand-file-name mew-addrbook-file mew-conf-path))) (set-buffer buf) (goto-char (point-min)) (if (and shortname (re-search-forward (concat "^" (regexp-quote shortname) "[ \t]*:?[ \t]+") nil t)) (setq uniqp nil)) (when uniqp ;; All errors are checked. (goto-char (point-max)) (unless (bolp) (insert "\n")) (cond ((string= mode mew-addrbook-mode-alias) (insert shortname ":\t" addrs) (mew-addrbook-nconc (list shortname addrs))) (t (setq addrsl (mew-addrstr-parse-address-list addrs)) ;; Set mew-addrbook-orig-alist with unquoted strings. (mew-addrbook-nconc (list shortname addrsl nickname name)) (unless shortname (setq shortname "*")) (if (and nickname (string-match "^[^\" \t]+[ \t]+.*$" nickname)) (setq nickname (concat "\"" nickname "\""))) (if (and name (string-match "^[^\" \t]+[ \t]+.*$" name)) (setq name (concat "\"" name "\""))) (if name (insert shortname "\t" addrs "\t" (or nickname "*") "\t" name) (if nickname (insert shortname "\t" addrs "\t" nickname) (insert shortname "\t" addrs))))) (if comments (insert "\t#" comments "\n") (insert "\n")) (save-buffer))) ;; Addrbook buffer (mew-remove-buffer buf) (cond (uniqp (mew-addrbook-kill 'no-msg) (message "Registered to Addrbook")) (t (message "Shortname is already used. Change Shortname")))))) (defun mew-addrbook-kill (&optional no-msg) "Kill Addrbook mode." (interactive "P") (mew-remove-buffer (current-buffer)) (or no-msg (message "Not registered"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Editing auto-alist ;;; (defun mew-summary-alias-read-buffer () (save-excursion (goto-char (point-min)) ;; An error occurs if the expression is broken. ;; This is intentional. (setq mew-alias-auto-alist (read (current-buffer))) (mew-addrbook-concat-uniq) nil)) ;; to write (defun mew-summary-alias-edit () "Editing the auto alias file which contains a list of alias-address pairs. Remove unnecessary entries and save the file by '\\[save-buffer]'. After saving, the modification is automatically reflected." (interactive) (let ((file mew-alias-auto-file)) (setq mew-alias-auto-alist (sort mew-alias-auto-alist (lambda (x y) (string< (car x) (car y))))) (mew-lisp-save mew-alias-auto-file mew-alias-auto-alist) (unless (file-name-absolute-p file) (setq file (expand-file-name file mew-conf-path))) (switch-to-buffer (mew-find-file-noselect file)) (emacs-lisp-mode) (if (boundp 'write-file-functions) (add-hook 'write-file-functions 'mew-summary-alias-read-buffer nil 'local) (add-hook 'local-write-file-hooks 'mew-summary-alias-read-buffer)))) (provide 'mew-addrbook) ;;; Copyright Notice: ;; Copyright (C) 1999-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-addrbook.el ends here kazu-yamamoto-Mew-ff9c41b/mew-attach.el000066400000000000000000000742601256455547000201400ustar00rootroot00000000000000;;; mew-attach.el --- attachments for Mew Draft mode ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; goodies ;; (defun mew-draft-prepare-attachments (&optional no-scroll) "Prepare an attachment region in the bottom of the draft. To compose a multipart message, you should execute this command first." (interactive) (if (mew-attach-p) (message "Attachments region has already been prepared") (let* ((attachdir (mew-attachdir)) (cp (expand-file-name mew-draft-coverpage attachdir)) (dir (file-name-nondirectory attachdir))) (if (mew-attach-p) (message "Attachments already exist") (mew-attach-set) (mew-check-directory attachdir) (unless (file-exists-p cp) (write-region "" nil cp 'append 'no-msg)) (unless mew-encode-syntax (setq mew-encode-syntax (mew-encode-syntax-initial dir))) (mew-encode-syntax-print mew-encode-syntax) (mew-attach-goto-number 'here '(2)) (if (and (not no-scroll) (not (pos-visible-in-window-p (point-max) (get-buffer-window (current-buffer))))) (set-window-start (get-buffer-window (current-buffer)) (mew-attach-begin))) (setq buffer-undo-list nil))))) (defun mew-attach-expand-path (syntax nums) ;; Ignore the first dir (let ((path "")) (while (cdr nums) (setq syntax (aref syntax (+ mew-syntax-magic (1- (car nums))))) (setq path (concat path (mew-syntax-get-file syntax))) (setq nums (cdr nums))) path)) (defun mew-attach-line () "Return the line number for the cursor from the beginning of the attachments region. 0 if on the beginning boundary. -1 if on the ending boundary." (let (ret max) (save-excursion (beginning-of-line) (setq ret (count-lines (1+ (mew-attach-begin)) (point))) (goto-char (point-max)) (beginning-of-line) (setq max (count-lines (1+ (mew-attach-begin)) (point))) (if (or (= ret max) (= ret (1- max))) -1 ret)))) (defun mew-attach-line-lastp () (let ((here (point))) (save-excursion (goto-char (point-max)) (beginning-of-line) (= (count-lines here (point)) 2)))) (defun mew-attach-move-onto-file () (end-of-line) (re-search-backward " [^ ]" nil t) (forward-char)) (defun mew-attach-move-onto-body () (goto-char (1+ (mew-attach-begin))) (forward-char -1)) (defun mew-attach-directory-p () (save-excursion (mew-attach-move-onto-file) (looking-at (file-name-as-directory "[^ ]+")))) (defun mew-attach-dot-p () (save-excursion (mew-attach-move-onto-file) (looking-at "\\. *$"))) ;; cursor only (defun mew-attach-line0-1 () (when (mew-attach-p) (let ((line (mew-attach-line))) (or (= line 0) (= line -1))))) ;; cursor only (defun mew-attach-line01-1 () (when (mew-attach-p) (let ((line (mew-attach-line))) (or (= line 0) (= line 1) (= line -1))))) ;; insert commands (defun mew-attach-not-line012-1 () (when (mew-attach-p) (let ((line (mew-attach-line))) (not (or (= line 0) (= line 1) (= line 2) (= line -1)))))) ;; find commands (defun mew-attach-not-line012-1-dot () (when (mew-attach-p) (let ((line (mew-attach-line))) (not (or (mew-attach-dot-p) (= line 0) (= line 1) (= line 2) (= line -1)))))) ;; delete commands (defun mew-attach-not-line02-1-dot () (when (mew-attach-p) (let ((line (mew-attach-line))) (not (or (mew-attach-dot-p) (= line 0) (= line 2) (= line -1)))))) ;; modify commands (defun mew-attach-not-line0-1-dot () (when (mew-attach-p) (let ((line (mew-attach-line))) (not (or (mew-attach-dot-p) (= line 0) (= line -1)))))) ;; cursor (defun mew-attach-line1-dot () (when (mew-attach-p) (let ((line (mew-attach-line))) (or (mew-attach-dot-p) (= line 1))))) (defun mew-attach-goto-number (direction nums) (let (numreg) (setq nums (nreverse nums)) (cond ((eq direction 'next) (setq nums (cons (1+ (car nums)) (cdr nums)))) ((eq direction 'prev) (setq nums (cons (1- (car nums)) (cdr nums)))) ((eq direction 'up) (setq nums (cdr nums))) ((eq direction 'down) (setq nums (cons 1 nums))) (t ())) (if (null nums) (progn (goto-char (1- (mew-attach-begin))) (re-search-forward "^..... " nil t) (mew-attach-move-onto-file)) (setq numreg (number-to-string (car nums))) (setq nums (cdr nums)) (dolist (num nums) (setq numreg (concat (number-to-string num) "." numreg))) (setq numreg (regexp-quote numreg)) (goto-char (1+ (mew-attach-begin))) (re-search-forward (concat "^....." numreg " ") nil t) (mew-attach-move-onto-file)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Dialog ;;; (defun mew-substitute-for-attach (msg) (substitute-command-keys (concat "\\" msg))) (defun mew-message-for-attach (msg) (message "%s" (mew-substitute-for-attach msg))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; commands ;; ;; ;; cursor commands ;; (defun mew-attach-newline () "Insert RET before the attachments region." (interactive) (when (= (point) (1+ (mew-attach-begin))) (insert "\n") (mew-draft-attach-keymap))) (defun mew-attach-forward () "Go to the first subdirectory in attachments." (interactive) (if (mew-attach-line0-1) (mew-attach-goto-number 'here nil) (mew-attach-move-onto-file) (if (mew-attach-directory-p) (mew-attach-goto-number 'down (mew-syntax-nums)) (mew-attach-goto-number 'here (mew-syntax-nums))))) (defun mew-attach-backforward () "Go to the parent directory in attachments." (interactive) (if (mew-attach-line0-1) (mew-attach-move-onto-body) (let ((nums (mew-syntax-nums))) (if (= (length nums) 1) (mew-attach-goto-number 'here nil) (mew-attach-goto-number 'up (mew-syntax-nums)))))) (defun mew-attach-previous () "Go to the previous file in the current directory in attachments." (interactive) (if (mew-attach-line01-1) (mew-attach-move-onto-body) (if mew-attach-move-by-line (progn (forward-line -1) (mew-attach-move-onto-file)) (let* ((nums (mew-syntax-nums)) (last (nth (1- (length nums)) nums))) (if (= last 1) (mew-attach-goto-number 'here (mew-syntax-nums)) (mew-attach-goto-number 'prev (mew-syntax-nums))))))) (defun mew-attach-next () "Go to the next file in the current directory in attachments." (interactive) (if (mew-attach-line0-1) (mew-attach-goto-number 'here nil) (if mew-attach-move-by-line (if (mew-attach-line-lastp) () (forward-line) (mew-attach-move-onto-file)) (if (mew-attach-line1-dot) (mew-attach-goto-number 'here (mew-syntax-nums)) (mew-attach-goto-number 'next (mew-syntax-nums)))))) ;; ;; delete commands ;; (defun mew-attach-delete () "Delete this file or this directory in attachments." (interactive) (if (not (mew-attach-not-line02-1-dot)) (message "Cannot delete here") (if (= (mew-attach-line) 1) (if (not (y-or-n-p "Delete entire attachments? ")) (message "Attachments were not deleted") (mew-delete-directory-recursively (mew-attachdir)) (setq mew-encode-syntax nil) (mew-attach-clear) (message "Attachments were deleted")) (let* ((nums (mew-syntax-nums)) (subdir (mew-attach-expand-path mew-encode-syntax nums)) (attachdir (mew-attachdir)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (name (mew-syntax-get-file syntax)) (ename (if (string= subdir "") name (concat subdir name))) (fullname (expand-file-name ename attachdir)) (dirp (string-match (concat mew-path-separator "$") name)) (msg (if dirp "Delete %s with contained files? " "Delete %s? "))) ;; attachdir / {subdir/} name (when (y-or-n-p (format msg ename)) (message "Deleting %s..." ename) (if (file-exists-p fullname) (if dirp (mew-delete-directory-recursively fullname) (mew-delete-file fullname))) (message "Deleting %s...done" ename) (setq mew-encode-syntax (mew-syntax-remove-entry mew-encode-syntax nums)) (mew-encode-syntax-print mew-encode-syntax)))))) ;; ;; insert commands ;; (defun mew-attach-multipart () "Create a subdirectory(i.e. multipart) on '.' in attachments." (interactive) (if (not (mew-attach-not-line012-1)) (message "Cannot create a sub-multipart here") (let* ((nums (mew-syntax-nums)) (subdir (mew-attach-expand-path mew-encode-syntax nums)) (insert-default-directory nil) (attachdir (mew-attachdir)) dir dirpath) ;; attachdir / {subdir/} dir (unless (string= subdir "") (setq attachdir (expand-file-name subdir attachdir))) ;; attachdir / dir (setq dirpath (mew-random-filename attachdir 1 nil)) (if (file-exists-p dirpath) (message "Cannot make a directory, sorry") (setq dir (file-name-nondirectory dirpath)) (mew-make-directory dirpath) (setq mew-encode-syntax (mew-syntax-insert-entry mew-encode-syntax nums (mew-encode-syntax-multi dir mew-type-mlm))) (mew-encode-syntax-print mew-encode-syntax))))) (defun mew-attach-duplicate (func action setmode &optional from to default) (if (not (mew-attach-not-line012-1)) (message "Cannot %s here" action) (let* ((completion-ignored-extensions nil) (nums (mew-syntax-nums)) (subdir (mew-attach-expand-path mew-encode-syntax nums)) (attachdir (mew-attachdir)) (frompath from) (efile (and to (concat subdir to))) (tofile to) ct msg FILE) (while (or (null frompath) (file-directory-p (file-chase-links frompath)) (not (file-exists-p (file-chase-links frompath)))) (setq frompath (mew-draft-input-file-name (concat (mew-capitalize action) " from: ") default))) (while (or (null efile) (file-exists-p (expand-file-name efile attachdir))) (setq tofile (mew-input-string (concat (mew-capitalize action) " to %s(%s): ") subdir (file-name-nondirectory frompath))) (setq efile (concat subdir tofile))) (setq FILE (expand-file-name efile attachdir)) (funcall func frompath FILE) (if setmode (mew-set-file-modes FILE)) (setq ct (mew-ctdb-ct (mew-ctdb-by-file tofile))) (unless ct (setq ct (mew-content-type (mew-tinfo-get-case))) (cond ((string= ct mew-ct-txt) (setq msg (mew-substitute-for-attach "Attached as text. Type '\\[mew-attach-toggle]' to toggle text to binary"))) ((string= ct mew-ct-apo) (setq msg (mew-substitute-for-attach "Attached as binary. Type '\\[mew-attach-toggle]' to toggle binary to text"))))) (setq mew-encode-syntax (mew-syntax-insert-entry mew-encode-syntax nums (mew-encode-syntax-single tofile (list ct) nil nil nil 'cdp))) (mew-encode-syntax-print mew-encode-syntax) (if mew-attach-move-next-after-copy (mew-attach-next)) (if msg (message "%s" msg))))) (defun mew-attach-link (&optional from to) "Link a file with a symbolic link on '.' in attachments. FROM must be absolute path. TO must be a file name." (interactive) (mew-attach-duplicate 'mew-symbolic-link "link" nil from to)) (defun mew-attach-copy (&optional from to) "Copy a file (via networks) on '.' in attachments. FROM must be absolute path. TO must be a file name. To copy a remote file, use the \"/[user@]hostname:/filepath\" syntax." (interactive) (mew-attach-duplicate 'copy-file "copy" t from to)) (defun mew-attach-toggle () "Toggle text/binary in attachments." (interactive) (if (not (mew-attach-not-line0-1-dot)) (message "Cannot change %s here" mew-ct:) (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (file (mew-syntax-get-file syntax)) (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap)) cte) (if (not (or (string= ct mew-ct-txt) (string= ct mew-ct-apo))) (message "Cannot toggle %s" ct) (if (string= ct mew-ct-txt) (setq ct mew-ct-apo) (setq ct mew-ct-txt)) (setq ctl (list ct)) (mew-syntax-set-ct syntax ctl) (setq cte (mew-ctdb-cte (mew-ctdb-by-ct ct))) (mew-syntax-set-cte syntax cte) (mew-syntax-set-cdp syntax (mew-syntax-cdp-format ct file)) (mew-encode-syntax-print mew-encode-syntax))))) (defun mew-attach-link-message () "Link the message displayed in Message mode with a symbolic link on '.' in attachments." (interactive) (let* ((fid (mew-frame-id)) (fld (mew-current-get-fld fid)) (msg (mew-current-get-msg fid)) default) (if fld (setq default (mew-expand-msg fld msg))) (if mew-use-symbolic-link-for-forwarding (mew-attach-duplicate 'mew-symbolic-link "link" nil nil nil default) (mew-attach-duplicate 'copy-file "copy" nil nil nil default)))) (defun mew-attach-find-new-file () "Open a new file into a buffer on '.' in attachments." (interactive) (if (not (mew-attach-not-line012-1)) (message "Cannot find a new file here") (let* ((nums (mew-syntax-nums)) (subdir (mew-attach-expand-path mew-encode-syntax nums)) (attachdir (mew-attachdir)) file filepath) ;; attachdir / {subdir/} dir (unless (string= subdir "") (setq attachdir (expand-file-name subdir attachdir))) ;; attachdir / file (setq filepath (mew-random-filename attachdir 1 nil mew-text-suffix)) (if (null filepath) (message "Cannot make a text file, sorry") (setq file (file-name-nondirectory filepath)) (setq mew-encode-syntax (mew-syntax-insert-entry mew-encode-syntax nums (mew-encode-syntax-single file (list mew-ct-txt) ;; for charset nil nil nil nil))) (mew-encode-syntax-print mew-encode-syntax) ;; (switch-to-buffer (mew-find-file-noselect2 filepath)) (text-mode) ;; buffer switched (local-set-key "\C-c\C-q" 'mew-kill-buffer))))) (defun mew-attach-audio () "Sampling voice and insert as audio file on '.' in attachments" (interactive) (if (not (mew-attach-not-line012-1)) (message "Cannot attach audio data here") (let* ((nums (mew-syntax-nums)) (subdir (mew-attach-expand-path mew-encode-syntax nums)) (attachdir (mew-attachdir)) file filepath recorded) ;; attachdir / {subdir/} dir (unless (string= subdir "") (setq attachdir (expand-file-name subdir attachdir))) ;; attachdir / file (setq filepath (mew-random-filename attachdir 1 nil mew-audio-suffix)) (if (null filepath) (message "Cannot make a file for audio, sorry") (setq file (file-name-nondirectory filepath)) (with-temp-buffer (condition-case nil (progn (if (not (y-or-n-p "Are you ready to record audio? ")) (message "Nothing is recoded") (mew-message-for-attach "Type '\\[keyboard-quit]' to finish recording...") (mew-plet (apply 'call-process (nth 0 mew-prog-audio2) nil t nil (nth 1 mew-prog-audio2))))) (quit (mew-message-for-attach "Type '\\[keyboard-quit]' to finish recording...done") (setq recorded t) (mew-flet (write-region (point-min) (point-max) filepath nil 'no-msg))))) (if recorded (setq mew-encode-syntax ;; buffer local (mew-syntax-insert-entry mew-encode-syntax nums (mew-encode-syntax-single file mew-type-ado nil nil nil 'cdp)))) (mew-encode-syntax-print mew-encode-syntax))))) ;; ;; modify commands ;; (defun mew-attach-undo () "Unmark. The original mark appears." (interactive) (if (not (mew-attach-not-line0-1-dot)) (message "Cannot undo encoding here") (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums))) (mew-syntax-set-privacy syntax nil) (mew-syntax-set-decrypters syntax nil) ;; (mew-syntax-set-cte syntax (mew-ctdb-cte (mew-ctdb-by-ct (car (mew-syntax-get-ct syntax))))) (mew-encode-syntax-print mew-encode-syntax)))) (defun mew-attach-type () "Change the data type(Content-Type:) in attachments." (interactive) (if (not (mew-attach-not-line0-1-dot)) (message "Cannot change %s here" mew-ct:) (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (file (mew-syntax-get-file syntax)) (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap)) cte) (setq ct (mew-input-type "Type for %s (%s): " file ct (if (mew-syntax-multipart-p syntax) mew-mime-content-type-multipart-list mew-mime-content-type-list))) (setq ctl (list ct)) (mew-syntax-set-ct syntax ctl) (setq cte (mew-ctdb-cte (mew-ctdb-by-ct ct))) (mew-syntax-set-cte syntax cte) (mew-syntax-set-cdp syntax (mew-syntax-cdp-format ct file)) (mew-encode-syntax-print mew-encode-syntax)))) (defun mew-attach-charset () "Specify the charset parameter for a Text/* object in attachments." (interactive) (mew-attach-charset-base "charset")) (defun mew-attach-icharset () "Specify a input coding-system for a text file in attachments." (interactive) (mew-attach-charset-base "icharset")) (defun mew-attach-charset-base (param) (if (not (mew-attach-not-line0-1-dot)) (message "Cannot specify character set here") (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (file (mew-syntax-get-file syntax)) (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap)) (params (mew-syntax-get-params ctl)) (char (mew-syntax-get-param ctl param)) charset) (if (not (mew-ct-textp ct)) (message "Cannot use character set %s" ct) (unless char (setq char "guess")) (setq charset (mew-input-type (if (string= param "charset") "Output message charset for %s (%s): " "Input file charset for %s (%s): ") file char (cons "guess" mew-charset-list))) (setq params (mew-delete param params)) (if (string= charset "guess") (setq ctl (cons ct params)) (setq ctl (cons ct (cons (list param charset) params)))) (mew-syntax-set-ct syntax ctl) (mew-encode-syntax-print mew-encode-syntax))))) (defun mew-attach-description () "Input a description(Content-Description:) in attachments." (interactive) (if (not (mew-attach-not-line0-1-dot)) (message "Cannot describe here") (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (ocd (or (mew-syntax-get-cd syntax) (mew-syntax-get-file syntax))) (cd (read-string "Description: " ocd))) (if (string= cd "") (mew-syntax-set-cd syntax nil) (mew-syntax-set-cd syntax cd)) (mew-encode-syntax-print mew-encode-syntax)))) (defun mew-attach-disposition () "Input Content-Disposition: in attachments." (interactive) (if (not (mew-attach-not-line0-1-dot)) (message "Cannot set disposition here") (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap)) (oldfile (or (mew-syntax-get-param (mew-syntax-get-cdp syntax) "filename") (mew-syntax-get-file syntax))) (file (read-string "Filename: " oldfile))) (if (string= file "") (mew-syntax-set-cdp syntax nil) (mew-syntax-set-cdp syntax (mew-syntax-cdp-format ct file nil 'force-file))) (mew-encode-syntax-print mew-encode-syntax)))) (defun mew-attach-base64 () "Put the 'B' mark to encode with Base64 in attachments." (interactive) (if (not (mew-attach-not-line0-1-dot)) (message "Cannot encode with base64 here") (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap))) (if (or (mew-ct-messagep ct) (mew-ct-multipartp ct)) (message "Cannot encode with base64 here") (mew-syntax-set-cte syntax mew-b64) (mew-encode-syntax-print mew-encode-syntax))))) (defun mew-attach-quoted-printable () "Put the 'Q' mark to encode with Quoted-Printable in attachments" (interactive) (if (not (mew-attach-not-line0-1-dot)) (message "Cannot encode with quoted-printable here") (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap))) (if (or (mew-ct-messagep ct) (mew-ct-multipartp ct)) (message "Cannot encode with quoted-printable here") (mew-syntax-set-cte syntax mew-qp) (mew-encode-syntax-print mew-encode-syntax))))) (defun mew-attach-gzip64 () "Put the 'G' mark to encode with Gzip64 in attachments. This is applicable only to Text/Plain and Application/Postscript since compression is not effective other objects. For example, JPEG is already compressed." (interactive) (if (not (mew-attach-not-line0-1-dot)) (message "Cannot apply gzip here") (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap))) (if (or (mew-ct-messagep ct) (mew-ct-multipartp ct) (not (mew-ct-linebasep ct))) ;; never use compress to types other than text/plain or ;; application/postscript. Indeed, compression is not ;; effective to compressed data such as jpeg. (message "Cannot apply gzip to %s" ct) (mew-syntax-set-cte syntax mew-xg) (mew-encode-syntax-print mew-encode-syntax))))) (defun mew-attach-zip () "Put the 'Z' mark and encrypt it with \"zip\" in attachments." (interactive) (if (not (mew-attach-not-line02-1-dot)) (message "Cannot encrypt with zip here") (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap))) (if (or (mew-ct-messagep ct) (mew-ct-multipartp ct)) (message "Cannot encrypt with zip here") (if (not (mew-which-exec mew-prog-zip)) (message "\"zip\" not found") (let ((password (mew-read-passwd "Zip password: ")) (password1 (mew-read-passwd "Zip password again: "))) (if (not (string= password password1)) (message "Password mismatch!") (let* ((subdir (mew-attach-expand-path mew-encode-syntax nums)) (attachdir (mew-attachdir)) (name (mew-syntax-get-file syntax)) (ename (if (string= subdir "") name (concat subdir name))) (fullname (expand-file-name ename attachdir)) (zname (concat name ".zip")) (zfullname (concat fullname ".zip")) (zct "application/zip") (default-directory (file-name-directory fullname))) ;; must not specify the "-e" option due to ;; variety of zip versions. (call-process mew-prog-zip nil nil nil "-P" password zname name) (if (not (file-exists-p zfullname)) (if (string= password "") (message "\"zip\" does not allow zero length password") (message "\"zip\" does not support encryption")) (mew-syntax-set-ct syntax (list zct)) (mew-syntax-set-cte syntax mew-b64) (mew-syntax-set-file syntax zname) (mew-syntax-set-cdp syntax (mew-syntax-cdp-format zct zname)) (mew-encode-syntax-print mew-encode-syntax)))))))))) (defun mew-attach-pgp-sign () "Put the 'PS' mark to sign with PGP in attachments." (interactive) (cond ((not (mew-attach-not-line0-1-dot)) (message "Cannot PGP sign here")) ((null mew-pgp-ver) (message "%s does not exist" mew-prog-pgp)) (t (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (privacy (mew-syntax-get-privacy syntax)) (pgp-sign (mew-pcdb-ct (mew-pcdb-by-service 'pgp-signature)))) (cond ((>= (length privacy) 2) (message "Too many marks")) ((member (car pgp-sign) privacy) ;; xxx hard coding (message "Already marked")) (t (mew-syntax-set-privacy syntax (append privacy pgp-sign)) (mew-encode-syntax-print mew-encode-syntax))))))) (defun mew-attach-pgp-enc () "Put the 'PE' mark to encrypt with PGP in attachment. Input decrypters' addresses." (interactive) (cond ((not (mew-attach-not-line0-1-dot)) (message "Cannot PGP encrypt here")) ((null mew-pgp-ver) (message "%s does not exist" mew-prog-pgp)) (t (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (privacy (mew-syntax-get-privacy syntax)) (towhom (mew-header-parse-address-list mew-destination:-list)) (pgp-enc (mew-pcdb-ct (mew-pcdb-by-service 'pgp-encryption)))) (cond ((>= (length privacy) 2) (message "Too many marks")) ((member (car pgp-enc) privacy) ;; xxx hard coding (message "Already marked")) (t ;; ask towhom before set privacy for C-g (if towhom (setq towhom (mew-input-address "To (%s): " (mew-join "," towhom))) (setq towhom (mew-input-address "To: "))) ;; towhom is already canonicalized. (mew-syntax-set-privacy syntax (append privacy pgp-enc)) (mew-syntax-set-decrypters syntax towhom) (mew-encode-syntax-print mew-encode-syntax))))))) (defun mew-attach-smime-sign () "Put the 'PS' mark to sign with S/MIME in attachments." (interactive) (cond ((not (mew-attach-not-line0-1-dot)) (message "Cannot S/MIME sign here")) ((null mew-smime-ver) (message "%s does not exist" mew-prog-smime)) (t (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (privacy (mew-syntax-get-privacy syntax)) (smime-sign (mew-pcdb-ct (mew-pcdb-by-service 'smime-signature)))) (cond ((>= (length privacy) 2) (message "Too many marks")) ((member (car smime-sign) privacy) ;; xxx hard coding (message "Already marked")) (t (mew-syntax-set-privacy syntax (append privacy smime-sign)) (mew-encode-syntax-print mew-encode-syntax))))))) (defun mew-attach-smime-enc () "Put the 'SE' mark to encrypt with S/MIME in attachment. Input decrypters' addresses." (interactive) (cond ((not (mew-attach-not-line0-1-dot)) (message "Cannot S/MIME encrypt here")) ((null mew-smime-ver) (message "%s does not exist" mew-prog-smime)) (t (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (privacy (mew-syntax-get-privacy syntax)) (towhom (mew-header-parse-address-list mew-destination:-list)) (smime-enc (mew-pcdb-ct (mew-pcdb-by-service 'smime-encryption)))) (cond ((>= (length privacy) 2) (message "Too many marks")) ((member (car smime-enc) privacy) ;; xxx hard coding (message "Already marked")) (t ;; ask towhom before set privacy for C-g (if towhom (setq towhom (mew-input-address "To (%s): " (mew-join "," towhom))) (setq towhom (mew-input-address "To: "))) ;; towhom is already canonicalized. (mew-syntax-set-privacy syntax (append privacy smime-enc)) (mew-syntax-set-decrypters syntax towhom) (mew-encode-syntax-print mew-encode-syntax))))))) ;; ;; find commands ;; (defun mew-attach-find-file () "Open this file into a buffer in attachments." (interactive) (if (not (mew-attach-not-line012-1-dot)) (message "Cannot find a file here") (let* ((nums (mew-syntax-nums)) (subdir (mew-attach-expand-path mew-encode-syntax nums)) (attachdir (mew-attachdir)) (syntax (mew-syntax-get-entry mew-encode-syntax nums)) (file (mew-syntax-get-file syntax)) efile FILE) (setq efile (if (string= subdir "") file (concat subdir file))) (setq FILE (expand-file-name efile attachdir)) (switch-to-buffer (mew-find-file-noselect2 FILE)) ;; buffer switched (local-set-key "\C-c\C-q" 'mew-kill-buffer) (if (file-symlink-p FILE) (message "This file is a symbolic link. Take care"))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Drag & Drop ;; (defun mew-draft-dnd-handle-local-file (uri action) (let* ((from (dnd-get-local-file-name uri t)) (to (if from (file-name-nondirectory from) (error "Can not read %s" uri) nil))) (when from (unless (mew-attach-p) (mew-draft-prepare-attachments)) (goto-char (point-max)) (forward-line -2) (mew-attach-next) (cond ((file-directory-p from) (message "Directory cannot be attached")) ((or (eq action 'copy) (eq action 'private) (eq action 'move)) (mew-attach-copy from to)) ((eq action 'link) (mew-attach-link from to)) (t (message "Nothing happened")))))) (defun mew-draft-dnd-handle-remote-url (uri _action) (error "Remote files not supported") nil) (defvar mew-draft-dnd-handle-remote-file-function (if (eq system-type 'windows-nt) 'mew-draft-dnd-handle-local-file 'mew-draft-dnd-handle-remote-url)) (defun mew-draft-dnd-handle-file (uri action) (let ((local-file (dnd-get-local-file-uri uri))) (if local-file (mew-draft-dnd-handle-local-file local-file action) (if mew-draft-dnd-handle-remote-file-function (funcall mew-draft-dnd-handle-remote-file-function uri action) (error "Remote files not supported") nil)))) (provide 'mew-attach) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-attach.el ends here kazu-yamamoto-Mew-ff9c41b/mew-auth.el000066400000000000000000000065211256455547000176300ustar00rootroot00000000000000;;; mew-auth.el ;; Author: Kazu Yamamoto ;; Created: Aug 17, 1999 ;;; Code: (require 'mew) (defun mew-auth-select (grt lst) (mew-auth-select2 (mew-split grt mew-sp) lst)) (defun mew-auth-select2 (auths lst) (let (n preference strongest) (dolist (auth auths) (setq n (mew-member-case-equal auth lst)) (cond ((null n) ()) ((null preference) (setq preference n) (setq strongest auth)) ((< n preference) (setq preference n) (setq strongest auth)))) strongest)) (defun mew-md5-raw (str) (let* ((md5str (mew-md5 str)) (len (length md5str)) (md5raw (make-string (/ len 2) 0)) (i 0) (j 0)) (while (< i len) (aset md5raw j (+ (* (mew-hexchar-to-int (aref md5str i)) 16) (mew-hexchar-to-int (aref md5str (1+ i))))) (setq i (+ i 2)) (setq j (1+ j))) md5raw)) ;; (mew-hmac-md5 "what do ya want for nothing?" "Jefe") ;; -> 0x750c783e6ab0b503eaa86e310a5db738 (defun mew-hmac-md5 (message key) "HMAC-MD5 defined in RFC 2104" (let* ((keylen (length key)) (ipad 54) ;; 0x36 (opad 92) ;; 0x5c (ikey (make-string 64 0)) okey digest) (when (< keylen 64) (dotimes (i keylen) (aset ikey i (aref key i)))) (setq okey (copy-sequence ikey)) (dotimes (i 64) (aset ikey i (logxor (aref ikey i) ipad)) (aset okey i (logxor (aref okey i) opad))) (setq digest (mew-md5-raw (concat ikey message))) (mew-md5 (concat okey digest)))) (defun mew-cram-md5 (user passwd b64-challenge) "CRAM-MD5 defined in RFC 2195" (let* ((challenge (mew-base64-decode-string b64-challenge)) (response (mew-hmac-md5 challenge passwd))) (mew-base64-encode-string (format "%s %s" user response)))) ;; (defun mew-keyed-md5 (key passwd) (mew-md5 (concat key passwd))) (provide 'mew-auth) ;;; Copyright Notice: ;; Copyright (C) 2000-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-auth.el ends here kazu-yamamoto-Mew-ff9c41b/mew-blvs.el000066400000000000000000000062011256455547000176300ustar00rootroot00000000000000;;; mew-blvs.el ;; Author: Kazu Yamamoto ;; Created: Feb 1, 1999 ;;; Code: (require 'mew) ;;; ;;; Buffer local variables ;;; ;; All buffer local variables which Mew defines should be here. ;; They are made buffer local by make-variable-buffer-local. ;; They are used internal purpose only (i.e. not user options). ;; When Mew makes a buffer local variable which another package ;; defines, make-local-variable should be used. ;; Inevitable due to mode-line. (defvar mew-summary-buffer-process nil) (defvar mew-summary-buffer-process-status nil) (defvar mew-summary-buffer-process-error nil) (defvar mew-summary-buffer-secure-process nil) (defvar mew-summary-buffer-left-msgs nil) (defvar mew-summary-buffer-raw nil) (defvar mew-decode-syntax nil) ;; just for convenience (defvar mew-encode-syntax nil) ;; just for convenience (defvar mew-ainfo nil) ;; Any buffers (defvar mew-cinfo nil) ;; Cache (defvar mew-dinfo nil) ;; Decode (defvar mew-minfo nil) ;; Message mode (defvar mew-sinfo nil) ;; Summary mode (defvar mew-tinfo nil) ;; Draft mode (defvar mew-vinfo nil) ;; Virtual mode (defvar mew-xinfo nil) ;; Analyzed (mapc 'make-variable-buffer-local (list 'mew-summary-buffer-process 'mew-summary-buffer-process-status 'mew-summary-buffer-process-error 'mew-summary-buffer-secure-process 'mew-summary-buffer-left-msgs 'mew-summary-buffer-raw 'mew-decode-syntax 'mew-encode-syntax 'mew-ainfo 'mew-cinfo 'mew-dinfo 'mew-minfo 'mew-sinfo 'mew-tinfo 'mew-vinfo 'mew-xinfo)) (provide 'mew-blvs) ;;; Copyright Notice: ;; Copyright (C) 2000-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-blvs.el ends here kazu-yamamoto-Mew-ff9c41b/mew-bq.el000066400000000000000000001141221256455547000172660ustar00rootroot00000000000000;;; mew-bq.el --- Base64 and Quoted-Printable encoding for Mew ;; Author: Kazu Yamamoto ;; Created: Aug 20, 1997 ;;; Code: (require 'mew) (defvar mew-header-encode-switch '(("B" . mew-base64-encode-string) ("Q" . mew-q-encode-string))) (defun mew-header-encode-get-func (b-or-q) (cdr (mew-assoc-case-equal b-or-q mew-header-encode-switch 0))) (defvar mew-header-decode-switch `(("B" mew-base64-decode-string mew-base64-decode-error-string ,mew-error-invalid-b-encoding) ("Q" mew-q-decode-string nil ,mew-error-invalid-q-encoding))) (defun mew-header-decode-get-func (b-or-q) (nth 1 (mew-assoc-case-equal b-or-q mew-header-decode-switch 0))) (defun mew-header-decode-get-error-func (b-or-q) (nth 2 (mew-assoc-case-equal b-or-q mew-header-decode-switch 0))) (defun mew-header-decode-get-error-str (b-or-q) (nth 3 (mew-assoc-case-equal b-or-q mew-header-decode-switch 0))) (defconst mew-header-decode-regex "=\\?\\([^? \t]+\\)\\?\\(.\\)\\?\\([^? \t]+\\)\\?=") (defconst mew-header-decode-regex2 "[ \t]*=\\?\\([^? \t]+\\)\\?\\(.\\)\\?\\([^? \t]+\\)\\?=") (defconst mew-header-decode-regex3 "^\\([ \t]+\\)=\\?[^? \t]+\\?.\\?[^? \t]+\\?=") (defconst mew-header-param-regex "^\\([^=*]+\\)\\(\\|\\*[0-9]+\\)\\(\\*?\\)=\\(.*\\)$") ;;; ;;; ;;; (defun mew-header-sanity-check-string (str) (if (null str) str (let ((regex mew-regex-ctls)) (while (string-match regex str) (setq str (replace-match "" nil t str))) str))) (defun mew-header-sanity-check-string2 (str key) (if (null str) str (let ((regex mew-regex-ctls-wo-tab)) (if (not (string-match regex str)) str (mew-decode-warning-fields key 'ctl) (setq str (replace-match "" nil t str)) (while (string-match regex str) (setq str (replace-match "" nil t str))) str)))) (defun mew-header-sanity-check-region (beg end &optional key) (let ((regex mew-regex-ctls-wo-tab-lf)) ;; meaningless tabs are removed by mew-header-decode-region (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (when (re-search-forward regex nil t) (if key (mew-decode-warning-fields key 'ctl)) (replace-match "" nil t) (while (re-search-forward regex nil t) (replace-match "" nil t)))))) (defun mew-header-encode (charset b-or-q fun hcs str) ;; sanity check should be done (let* ((estr (mew-cs-encode-string str hcs))) (concat "=?" charset "?" b-or-q "?" (funcall fun estr) "?="))) (defun mew-header-decode (charset b-or-q estr &optional key) (let* ((fun (mew-header-decode-get-func b-or-q)) (cs (mew-charset-to-cs charset)) str) (when (and mew-use-autoconv-when-unknown (not (mew-coding-system-p cs))) (setq cs mew-cs-autoconv)) (cond ((not (mew-coding-system-p cs)) mew-error-unknown-charset) (fun ;; if cs is nil, mew-cs-decode-string does not cs-decode. (setq str (funcall fun estr)) (unless str (setq str (mew-header-decode-error key b-or-q estr))) (if (null str) (mew-header-decode-get-error-str b-or-q) (when (and mew-decode-broken (not (eq cs mew-cs-autoconv)) (or (null charset) (mew-case-equal charset mew-us-ascii) (mew-case-equal charset mew-utf-8)) (string-match mew-regex-singlebyte-nonascii str)) (setq cs mew-cs-autoconv)) (if (null cs) str (mew-cs-decode-string str cs)))) (t estr)))) (defun mew-header-decode-error (key b-or-q estr) (let ((func (mew-header-decode-get-error-func b-or-q))) (if func (funcall func key b-or-q estr)))) (defun mew-base64-decode-error-string (key b-or-q estr) (let ((str estr) strlen r ret) (when (string-match "^\\([^=]*\\)=*$" str) (setq str (mew-match-string 1 str))) (setq strlen (length str)) (setq r (% strlen 4)) (cond ((= r 0) (setq ret (mew-base64-decode-string str))) ((= r 1) ) ((= r 2) (setq ret (mew-base64-decode-string (concat str "==")))) ((= r 3) (setq ret (mew-base64-decode-string (concat str "="))))) (if ret (mew-decode-warning-fields key 'padding)) ret)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Quoted-printable encoding ;;; (defun mew-q-encode-string (str &optional prefix) (let* ((len (length str)) (ret (mew-make-string (* len 3))) (j 0) char) (dotimes (i len) (setq char (aref str i)) (cond ((char-equal char mew-sp) (aset ret j ?_)) ((and (> char mew-sp) (< char 126) (not (char-equal char ?=)) (not (char-equal char ??)) (not (char-equal char ?_)) ;; space (or (not prefix) (not (memq char '(?# ?@))))) (aset ret j char)) (t (aset ret j (or prefix ?=)) (setq j (1+ j)) (aset ret j (aref "0123456789ABCDEF" (lsh char -4))) (setq j (1+ j)) (aset ret j (aref "0123456789ABCDEF" (logand char 15))))) (setq j (1+ j))) (substring ret 0 j))) (defun mew-samba-encoding (str) (setq str (mew-cs-encode-string str mew-cs-samba)) (let* ((len (length str)) (ret (mew-make-string (* len 3))) (j 0) char type) (cond ((eq mew-use-samba-encoding-type 'cap) (setq type 'cap)) (t (setq type 'hex))) (dotimes (i len) (setq char (aref str i)) (if (and (eq type 'cap) (< char 128)) (aset ret j char) (aset ret j ?:) (setq j (1+ j)) (aset ret j (aref "0123456789abcdef" (lsh char -4))) (setq j (1+ j)) (aset ret j (aref "0123456789abcdef" (logand char 15)))) (setq j (1+ j))) (substring ret 0 j))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Quoted-printable decoding ;;; (defun mew-hexchar-to-int (hex) ;; would return nil if error (cond ((and (<= ?0 hex) (<= hex ?9)) (- hex ?0)) ((and (<= ?A hex) (<= hex ?F)) (+ (- hex ?A) 10)) ((and (<= ?a hex) (<= hex ?f)) (+ (- hex ?a) 10)))) (defun mew-q-decode-string (qpstr &optional okey) (condition-case nil (let* ((len (length qpstr)) (ret (mew-make-string len)) (j 0) char key) (setq key (or okey ?=)) (dotimes (i len) (setq char (aref qpstr i)) (cond ((and (not okey) (char-equal char ?_)) (aset ret j mew-sp)) ((char-equal char key) (aset ret j (+ (* (mew-hexchar-to-int (aref qpstr (1+ i))) 16) (mew-hexchar-to-int (aref qpstr (+ i 2))))) (setq i (+ i 2))) (t (aset ret j char))) (setq j (1+ j))) (substring ret 0 j)) (error nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; RFC 2047 encoding ;; ;; RFC2822 says that each line SHOULD be no more than 78 characters, ;; excluding the CRLF. ;; RFC 2047 says that encoded-word must be less than or equal to 75. ;; RFC 2047 says that each line which includes one or more encoded-words ;; must be less than or equal to 76. (defvar mew-encode-word-max-length 75) (defvar mew-field-max-length 76) ;; If possible, mew-header-encode-string should expect the length of ;; results and split 'str' before encoding so that every 'encoded-word' ;; fits in 75 length. However, it is very difficult first because ;; it is very difficult to know actual length of 'str' after convention ;; from the internal representation to charset encoding. Second because ;; ISO-2022-JP cannot be simply split. If split, extra escape sequences ;; appear. Moreover, it is not effective to expect the length of results ;; because 'str' is short enough in most cases. So, we measure the length ;; of results. If it is longer than 75, 'str' is split and 'substr1' and ;; 'substr2' are encoded.... Repeat this recursively but not so deeply. (defun mew-header-encode-string (str &optional key-len) (let* ((ecsdb (or (mew-ecsdb-guess-string str) (mew-charset-to-ecsdb (mew-charset-m17n)))) (hcs (mew-ecsdb-hcs ecsdb)) charset b-or-q fun) (if (not (mew-coding-system-p hcs)) (mew-encode-error (format "Unknown coding system %s in the header" (symbol-name hcs))) (setq charset (mew-cs-to-charset hcs)) (setq b-or-q (mew-ecsdb-get-b-or-q ecsdb)) (setq fun (mew-header-encode-get-func b-or-q)) (if (null fun) (mew-encode-error (format "Unknown encoding function for %s" b-or-q)) (mew-header-encode-string1 charset b-or-q fun hcs str key-len))))) (defun mew-header-encode-string1 (charset b-or-q fun hcs str &optional key-len) (let* ((max mew-encode-word-max-length) (encoded-word (mew-header-encode charset b-or-q fun hcs str))) (if key-len (setq max (- max key-len))) (if (> (length encoded-word) max) (let ((med (/ (length str) 2))) (append (mew-header-encode-string1 charset b-or-q fun hcs (substring str 0 med) key-len) (mew-header-encode-string1 charset b-or-q fun hcs (substring str med)))) (list encoded-word)))) (defun mew-header-encode-split-string (str) "Split STR to need-to-encode string and non-encode-string." (let ((start 0) beg end ret) (while (string-match "\\(^\\|[ \t]+\\)[\t -~]+\\($\\|[ \t]+\\)" str start) (setq beg (match-beginning 0)) (setq end (match-end 0)) (if (= start beg) (setq ret (cons (substring str beg end) ret)) (setq ret (cons (substring str beg end) (cons (substring str start beg) ret)))) (setq start end)) (if (/= start (length str)) (setq ret (cons (substring str start) ret))) (nreverse ret))) (defun mew-header-encode-comma-text (str) (let ((str-list (mapcar 'mew-chop (mew-split str ?,)))) (mew-header-encode-text (car str-list)) (setq str-list (cdr str-list)) (dolist (sl str-list) (insert ", ") ;; must be fold here (mew-header-encode-text sl)))) (defmacro mew-header-encode-cond (c) `(cond ((> ,c 127) ;; non-ascii (when (eq status 'space) (insert (substring str bound i)) (setq bound i)) (setq status 'non-ascii)) ;; end of non-ascii (t ;; ascii (cond ((eq status 'space) (insert (substring str bound i)) ;; spaces (setq bound i) (setq status 'ascii)) ((eq status 'ascii) (setq status 'ascii)) ((eq status 'non-ascii) (setq status 'non-ascii)) ((eq status 'non-ascii-space) (mew-header-encode-text (substring str bound SBOUND)) ;; non-ascii (insert (substring str SBOUND i)) ;; spaces (setq bound i) (setq status 'ascii)))) ;; end of ascii )) (defmacro mew-header-encode-cond2 (opt) `(cond ((eq status 'ascii) (insert (substring str bound i))) ((eq status 'space) (insert (substring str bound i))) ((eq status 'non-ascii) (mew-header-encode-text (substring str bound i)) ,opt) ((eq status 'non-ascii-space) (mew-header-encode-text (substring str bound SBOUND) ,opt) (insert (substring str SBOUND i))))) (defun mew-header-encode-addr (str) (let* ((len (length str)) (i 0) (bound 0) (status 'space) SBOUND open c I) ;; status space, ascii, non-ascii, non-ascii-space ;; assumptions: ;; <> does not contain non-ascii characters. ;; () does not recurse. ;; if " " contains non-ascii, cause an error. (while (< i len) (setq c (aref str i)) (cond ;; quote ((char-equal c ?\") (setq I (1+ i)) (setq open t) (catch 'quote (while (< I len) (setq c (aref str I)) (cond ((char-equal c ?\") (setq open nil) (throw 'quote nil)) ((> c 127) (mew-encode-error "Only ASCII is allowed in quoted-string in the header"))) (setq I (1+ I)))) (if open (mew-encode-error "Quote string must be closed in the header")) (mew-header-encode-cond ?a) (setq i I)) ;; end of quote ;; comment ((char-equal c ?\() (mew-header-encode-cond2 nil) (insert "(") (setq i (1+ i)) (setq bound i) (setq status 'ascii) (setq open t) (let (qp) (catch 'comment (while (< i len) (setq c (aref str i)) (cond ((char-equal c ?\)) (setq open nil) (throw 'comment nil)) ((char-equal c ?\") (setq qp t)) ((> c 127) (setq status 'non-ascii))) (setq i (1+ i)))) (if (and qp (eq status 'non-ascii)) (mew-encode-error "Only ASCII is allowed in quoted-string in the header"))) (if open (mew-encode-error "Comment must be closed in the header")) (mew-header-encode-cond2 'comment) (if (= i len) () (insert ")") (setq bound (1+ i))) (setq status 'space)) ;; end of () ;; route ((char-equal c ?<) (mew-header-encode-cond2 nil) (if (or (char-equal (char-before (point)) mew-sp) (char-equal (char-before (point)) ?\t)) (insert "<") (insert " <")) (setq i (1+ i)) (setq bound i) (setq status 'ascii) (setq open t) (catch 'route (while (< i len) (setq c (aref str i)) (cond ((char-equal c ?>) (setq open nil) (throw 'route nil)) ((> c 127) (mew-encode-error "<> must contain ASCII only")) (t (insert c))) (setq i (1+ i)))) (if open (mew-encode-error "<> must be closed in the header")) (if (= i len) () (insert ">") (setq bound (1+ i))) (setq status 'space)) ((char-equal c ?>) (mew-encode-error "Unbalanced <> in the header")) ;; end of <> ;; group ;; 'mailbox' between ":" and ";" should be 'addr-spec', ;; not be 'phrase route-addr' in Mew because they are to be ;; removed. ((char-equal c ?:) (mew-header-encode-cond2 nil) ;; RFC 2047 says: ;; An 'encoded-word' that appears within a ;; 'phrase' MUST be separated from any adjacent 'word', 'text' or ;; 'special' by 'linear-white-space'. ;; However, we do not care if an 'encoded-word' is followed by ;; ":". The spec is believed too strict. 'encoded-word' can be ;; recognized because of the token rule. (insert ":") (setq i (1+ i)) (unless (char-equal (aref str i) ?\;) (mew-encode-error ": must be followed by ; in the header")) (insert ";") (setq bound (1+ i)) (setq status 'space)) ;; end of group ;; space ((or (char-equal c mew-sp) (char-equal c ?\t)) (cond ((or (eq status 'ascii) (eq status 'space)) (insert (substring str bound i)) ;; 'ascii (setq bound i) (setq status 'space)) ((eq status 'non-ascii) (setq status 'non-ascii-space) (setq SBOUND i)))) ;; end of white space ;; comma ((char-equal c ?,) (mew-header-encode-cond2 nil) (insert ", ") (setq i (1+ i)) (catch 'comma (while (< i len) (setq c (aref str i)) (if (or (char-equal c mew-sp) (char-equal c ?\t) (char-equal c ?\n)) () ;; loop (throw 'comma nil)) (setq i (1+ i)))) ;; get back to the end of white spaces (setq bound i) (setq c mew-sp) (setq i (1- i)) (setq status 'space)) ;; end of comma ;; the others (t (mew-header-encode-cond c))) ;; end of outside cond (setq i (1+ i))) ;; end of while (mew-header-encode-cond2 nil))) (defun mew-header-encode-text (str &optional comment key-len) ;; 'comment' means that we are in RFC822 comment "(...)". (let ((str-list (mew-header-encode-split-string str)) head-is-e e-list) (if (string-match "^[\t -~]+$" (car str-list)) (progn ;; ascii (insert (car str-list)) (setq str-list (cdr str-list))) (setq head-is-e t)) (while str-list ;; encoded-words (if (and key-len head-is-e) (progn (setq e-list (mew-header-encode-string (car str-list) key-len)) (setq head-is-e nil)) (setq e-list (mew-header-encode-string (car str-list)))) (insert (mapconcat 'identity e-list " ")) ;; ascii (setq str-list (cdr str-list)) (when (car str-list) (insert (car str-list)) (setq str-list (cdr str-list)))))) (defun mew-header-fold-region (beg end med &optional use-tab) (let ((limit1 med) limit2) (save-restriction (narrow-to-region beg end) (goto-char beg) (while (not (eobp)) (while (> (- (setq limit2 (save-excursion (end-of-line) (point))) (point)) mew-field-max-length) (forward-char mew-field-max-length) (if (re-search-backward "[ \t]" limit1 t) (progn (insert "\n") (if use-tab (progn (delete-char 1) (insert "\t")))) ;; Ugh! (if (re-search-forward "[ \t]" limit2 t) ;; hold on anyway (progn (backward-char) (insert "\n") (if use-tab (progn (delete-char 1) (insert "\t")))) (forward-line))) ;; give up this line (setq limit1 (1+ (point)))) (forward-line) (setq limit1 (1+ (point))))))) (defun mew-header-resent-p (field) (let ((case-fold-search t)) (string-match mew-resent-regex field))) (defun mew-header-encode-region (beg end &optional resentp) (let (key med type str start last fast-path) (save-restriction (narrow-to-region beg end) (mew-header-sanity-check-region (point-min) (point-max)) (mew-charset-sanity-check (point-min) (point-max)) (goto-char (point-min)) (while (not (eobp)) (setq start (point)) (if (not (looking-at mew-keyval)) (forward-line) (setq key (mew-match-string 1)) (setq med (match-end 0)) (setq type (mew-field-type-for-encoding key)) (setq fast-path t) (if (eq type 'mailbox) (if resentp (if (mew-header-resent-p key) (setq fast-path nil)) (if (not (mew-header-resent-p key)) (setq fast-path nil)))) (forward-line) (mew-header-goto-next) (setq last (1- (point))) (unless (= last med) (if (and (string= (mew-charset-guess-region med last) mew-us-ascii) fast-path) () ;; fast path ;; if us-ascii AND mailbox, need to check syntax (setq str (mew-buffer-substring med (1- (point)))) ;; excluding \n (delete-region med (point)) (cond ((eq type 'mailbox) (mew-header-encode-addr str)) ((eq type 'mime) (mew-header-encode-addr str)) ((eq type 'comma-text) (mew-header-encode-comma-text str)) ((eq type 'text) (mew-header-encode-text str nil (length key))) ((eq type 'unstruct) (mew-header-encode-text str nil (length key)))) (insert "\n")) ;; previously deleted, so insert here (mew-header-fold-region start (point) med))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; RFC 2047 decoding ;; (defun mew-header-unfold-region (type) (goto-char (point-min)) (cond ((eq type 'struct) ;; If each line does not end with ",", unfold it. ;; In Page 5 of RFC822 says, "Unfolding is accomplished by ;; regarding CRLF immediately followed by a LWSP-char as ;; equivalent to the LWSP-char". However, it also says, ;; "In structured field bodies, multiple linear space ASCII ;; characters (namely HTABs and SPACEs) are treated as single ;; spaces and may freely surround any symbol." So, remove ;; continuous white spaces. (when (and mew-decode-broken (looking-at "\n[ \t]+")) (replace-match "" nil t)) (goto-char (point-min)) (while (re-search-forward ",[ \t]+\n" nil t) (replace-match ",\n" nil t)) (goto-char (point-min)) (while (re-search-forward "\\([^,]\\)[ \t]*\n[ \t]+" nil t) (replace-match "\\1 "))) ((eq type 'struct2) ;; for Authentication-Results: (while (re-search-forward "[ \t]*\n[ \t]+" nil t) (replace-match " ")) (goto-char (point-min)) (while (search-forward ";" nil t) (insert "\n") (if (looking-at "[\t ]+") (replace-match "\t") (insert "\t")))) ((eq type 'text) ;; In Page 5 of RFC822 says, "Unfolding is accomplished by ;; regarding CRLF immediately followed by a LWSP-char as ;; equivalent to the LWSP-char". (while (re-search-forward "\n\\([ \t]\\)" nil t) (replace-match "\\1"))) (t ;; unstruct ))) (defun mew-header-decode-string (key) (let ((beg (match-beginning 0)) (end (match-end 0)) (css (mew-header-decode (mew-match-string 1) (mew-match-string 2) (mew-match-string 3) key))) (setq css (mew-header-sanity-check-string2 css key)) (delete-region beg end) (insert css))) (defun mew-header-decode-in-quotedp () (save-excursion (beginning-of-line) (char-equal (following-char) ?\"))) (defun mew-header-decode-in-addr-spec () (eq (get-text-property (match-beginning 0) 'mew-addr-spec) t)) (defun mew-decode-warning-body (err msg) (mew-xinfo-set-warning (cons (cond ((eq err 'unknown-charset) (format "Charset (%s) for body is not supported.\n" msg)) ((eq err 'no-charset) (if msg (format "Charset (%s) for body is mis-matched.\n" msg) "Charset for body is not specified.\n")) ((eq err 'multi) (format "Invalid encoding (%s) for multipart.\n" msg))) (mew-xinfo-get-warning)))) (defun mew-decode-warning-fields (key err) (unless (member key mew-no-warning-fields) (let (wmsg level) (cond ((eq err 'spc) (setq level 1) (setq wmsg (concat "tab/spc characters on " key " are simplified.\n"))) ((eq err 'ctl) (setq level 1) (setq wmsg (concat "some control code on " key " are removed.\n"))) ((eq err 'raw) (setq level 2) (setq wmsg (concat key " has raw text strings.\n"))) ((eq err 'padding) (setq level 2) (setq wmsg (concat key " has illegal padding in encoded text.\n"))) ((eq err 'quoted) (setq level 2) (setq wmsg (concat key " has encoded-words in quoted text.\n")))) (if (>= level mew-warning-field-level) (mew-xinfo-set-warning (cons wmsg (mew-xinfo-get-warning))))))) (defun mew-decode-warning-params (param err) (unless (and param (member (downcase param) mew-no-warning-params)) (mew-xinfo-set-warning (cons (cond ((eq err 'raw) (concat "The '" param "' parameter has raw text.\n")) ((eq err 'ctl) (concat "The '" param "' has invalid control codes.\n")) ((eq err 'enc) (concat "The '" param "' parameter has encoded-word.\n")) ((eq err 'char) (concat "The '" param "' has invalid characters.\n"))) (mew-xinfo-get-warning))))) (defun mew-header-decode-region (key rbeg rend &optional draftp) "RFC 2047 decoding. This is liberal on the one point from RFC 2047. That is, each line may be more than 75." (setq key (capitalize key)) (let* ((type (mew-field-type-for-decoding key)) (nl "\0")) (save-restriction (narrow-to-region rbeg rend) ;; Handling invalid raw text. (goto-char (point-min)) (if draftp (mew-cs-decode-region (point-min) (point-max) mew-cs-m17n) (when (and mew-decode-broken (re-search-forward mew-regex-esc-or-nonascii nil t)) (mew-decode-warning-fields key 'raw) (mew-cs-decode-region (point-min) (point-max) mew-cs-autoconv))) ;; (mew-header-unfold-region type) ;; (goto-char (point-min)) (when (re-search-forward mew-header-decode-regex nil t) ;; In Page 10 of RFC 2047 says, "When displaying a particular ;; header field that contains multiple 'encoded-word's, any ;; 'linear-white-space' that separates a pair of adjacent ;; 'encoded-word's is ignored". So, use looking-at. (cond ((memq type '(text comma-text)) ;; This is text field. We do not care quote! ;; make use of the search above (mew-header-decode-string key) (while (looking-at mew-header-decode-regex2) (mew-header-decode-string key)) ;; (while (re-search-forward mew-header-decode-regex nil t) (mew-header-decode-string key) (while (looking-at mew-header-decode-regex2) (mew-header-decode-string key)))) (t ;; This is structured field. ;; encoded-word in quoted-string should not be decoded ;; according to RFC 2047. However, if users wish ;; (ie mew-decode-broken is *non-nil*), decode it. ;; Regular expression cannot express a quoted string in ;; general case. So, canonicalize as follows: ;; Not quoted line (may be null line) ;; "quoted line" ;; Not quoted line ;; "quoted line" ;; ... ;; For this purpose, "\n" is converted to ^\@(\0). (goto-char (point-min)) (while (re-search-forward "\n" nil t) (replace-match nl nil t)) ;; (goto-char (point-min)) (while (re-search-forward mew-regex-id nil t) (put-text-property (match-beginning 0) (match-end 0) 'mew-addr-spec t)) ;; (goto-char (point-min)) ;; Perfect regular expression for quoted strings. ;; See "Mastering Regular Expressions", O'REILLY (while (re-search-forward "\"\\([^\"\\\\]\\|\\\\.\\)*\"" nil t) (goto-char (match-beginning 0)) (insert "\n") (goto-char (1+ (match-end 0))) (insert "\n")) ;; (goto-char (point-min)) ;; anyway ;; (while (re-search-forward mew-header-decode-regex nil t) (cond ((mew-header-decode-in-addr-spec) ) ;; do nothing ((mew-header-decode-in-quotedp) (when mew-decode-broken (mew-decode-warning-fields key 'quoted) (mew-header-decode-string key) (while (looking-at mew-header-decode-regex2) (mew-header-decode-string key)))) (t (mew-header-decode-string key) (while (looking-at mew-header-decode-regex2) (mew-header-decode-string key))))) ;; Getting back to the original (goto-char (point-min)) (while (re-search-forward "\n" nil t) (replace-match "" nil t)) (goto-char (point-min)) (while (re-search-forward nl nil t) (replace-match "\n" nil t)) (remove-text-properties (point-min) (point-max) '(mew-addr-spec t))))) ;; (if (and mew-decode-broken (member key mew-decode-ws-fields)) (let (ws) ;; We want to warn only in the case of ^\t. (goto-char (point-min)) ;; Because lines are already unfolded, we cannot tell ;; whether or not this TABs locate on the beginning ;; of a line. But this should be acceptable. (while (re-search-forward "\t+" nil t) (or ws (setq ws t)) (replace-match " " nil t)) (goto-char (point-min)) ;; Continuous SPCs are not invalid, just for appearance. (while (re-search-forward " +" nil t) (or ws (setq ws t)) (replace-match " " nil t)) (if ws (mew-decode-warning-fields key 'spc)))) ;; (mew-header-sanity-check-region (point-min) (point-max) key) (goto-char (point-max))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; RFC 2231 ;; (defun mew-param-encode (str) (let* ((ecsdb (or (mew-ecsdb-guess-string str) (mew-charset-to-ecsdb (mew-charset-m17n)))) (hcs (mew-ecsdb-hcs ecsdb)) (charset (mew-cs-to-charset hcs)) (estr (mew-cs-encode-string str hcs)) (len (length estr)) (ret (mew-make-string (* len 3))) (j 0) char) (dotimes (i len) (setq char (aref estr i)) (if (or (and (<= ?0 char) (<= char ?9)) (and (<= ?a char) (<= char ?z)) (and (<= ?A char) (<= char ?Z))) (aset ret j char) (aset ret j ?%) (setq j (1+ j)) (aset ret j (aref "0123456789ABCDEF" (lsh char -4))) (setq j (1+ j)) (aset ret j (aref "0123456789ABCDEF" (logand char 15)))) (setq j (1+ j))) (concat charset "''" (substring ret 0 j)))) (defun mew-param-decode (whole-value) (let* ((value-params (mew-addrstr-parse-value-list whole-value)) (value (car value-params)) (params (cdr value-params)) (max 0) num ret ext ext-sort entry charset cs paramname-value paramname paramvalue) (dolist (param params) (setq paramname-value (mew-param-analyze param)) (when paramname-value (setcar paramname-value (downcase (nth 0 paramname-value))) (if (= (length paramname-value) 2) (setq ret (cons paramname-value ret)) (setq ext (cons paramname-value ext)) (setq num (nth 2 paramname-value)) (if (> num max) (setq max num))))) (if (null ext) (cons value (nreverse ret)) ;; fast return (setq max (1+ max)) (dolist (ea ext) (mew-set '(paramname paramvalue num) ea) (if (setq entry (assoc paramname ext-sort)) (progn (aset (nth 1 entry) num paramvalue) (when (= num 0) (setcar (nthcdr 2 entry) (nth 3 ea)) ;; charset (setcar (nthcdr 3 entry) (nth 4 ea)))) ;; lang (setq entry (make-vector max nil)) (aset entry num paramvalue) (setq ext-sort (cons (list paramname entry (nth 3 ea) (nth 4 ea)) ext-sort)))) (dolist (ea ext-sort) (setq paramvalue nil) (mew-set '(paramname entry charset) ea) (setq num 0) (catch 'concat-loop (while (< num max) (if (aref entry num) (setq paramvalue (concat paramvalue (aref entry num))) ;; xxx (throw 'concat-loop nil)) (setq num (1+ num)))) (when charset (setq cs (mew-charset-to-cs charset)) (when (and mew-use-autoconv-when-unknown (not (mew-coding-system-p cs))) (setq cs mew-cs-autoconv)) (when (and mew-decode-broken (not (eq cs mew-cs-autoconv)) (or (null charset) (mew-case-equal charset mew-us-ascii) (mew-case-equal charset mew-utf-8)) (string-match mew-regex-singlebyte-nonascii paramvalue)) (setq cs mew-cs-autoconv)) (if (mew-coding-system-p cs) (setq paramvalue (mew-cs-decode-string paramvalue cs)) (setq paramvalue mew-error-unknown-charset))) (setq ret (cons (list paramname paramvalue) ret))) (setq ret (mapcar 'mew-param-sanity-check ret)) (cons value (nreverse ret))))) ;; late return (defun mew-param-analyze (param) "Return (paramname paramvalue) or (paramname paramvalue section charset lang)." (let (name section asterisk value charset lang) (when (string-match mew-header-param-regex param) (setq name (match-string 1 param)) (setq section (match-string 2 param)) ;; *21 (setq asterisk (string= (match-string 3 param) "*")) (setq value (match-string 4 param)) (if (string= section "") (if asterisk (setq section 0) (setq section nil)) (setq section (string-to-number (substring section 1)))) (if (null asterisk) ;; delete quote (progn (if (and (< 1 (length value)) (char-equal (aref value 0) 34) (char-equal (aref value (1- (length value))) 34)) (setq value (substring value 1 -1))) (if mew-decode-broken (setq value (mew-param-analyze-broken value name)))) (when (and (= section 0) ;; broken UAs quote extended-value, sigh (string-match "^\"?\\([^']*\\)'\\([^']*\\)'\\([^\"]*\\)\"?$" value)) (setq charset (match-string 1 value)) (setq lang (match-string 2 value)) (if (string= lang "") (setq lang nil)) (setq value (match-string 3 value)) (if (string= value "") (setq value nil))) ;; broken UAs quote extended-value, sigh (if (string-match "^\"\\([^\"]*\\)\"$" value) (setq value (mew-match-string 1 value))) (setq value (mew-q-decode-string value ?%))) (if section (list name value section charset lang) (list name value))))) (defun mew-param-analyze-broken (value name) ;; broken message handling (when (and (mew-member-case-equal name mew-broken-parameter-list) (string-match mew-regex-esc-or-nonascii value)) (mew-decode-warning-params name 'raw) (setq value (mew-cs-decode-string value mew-cs-autoconv))) (when (string-match mew-header-decode-regex value) (let (pre med pst) (mew-decode-warning-params name 'enc) (while (string-match mew-header-decode-regex value) ;; We cannot ensure that sub-function does not use match functions. ;; So, pre/pst prevents infinite loop. (setq pre (substring value 0 (match-beginning 0))) (setq pst (substring value (match-end 0))) (setq med (mew-header-decode (match-string 1 value) (match-string 2 value) (match-string 3 value))) (if (string-match mew-header-decode-regex3 pst) (setq pst (substring pst (match-end 1)))) (setq value (concat pre med pst))))) value) (defun mew-param-sanity-check (ent) (let (param value new) (mew-set '(param value) ent) (setq new (mew-header-sanity-check-string value)) (unless (string= value new) (mew-decode-warning-params param 'ctl)) (list param new))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Punycode:: RFC 3492 ;;; (defconst mew-puny-base 36) (defconst mew-puny-tmin 1) (defconst mew-puny-tmax 26) (defconst mew-puny-damp 700) (defconst mew-puny-skew 38) (defconst mew-puny-initial-bias 72) (defconst mew-puny-initial-n 128) (defconst mew-puny-delimiter ?-) (defun mew-puny-adapt (delta numpoints firsttime) (let ((k 0)) (if firsttime (setq delta (/ delta mew-puny-damp)) (setq delta (/ delta 2))) (setq delta (+ delta (/ delta numpoints))) (while (> delta (/ (* (- mew-puny-base mew-puny-tmin) mew-puny-tmax) 2)) (setq delta (/ delta (- mew-puny-base mew-puny-tmin))) (setq k (+ k mew-puny-base))) (+ k (/ (* (1+ (- mew-puny-base mew-puny-tmin)) delta) (+ delta mew-puny-skew))))) (defun mew-puny-decode-digit (cp) (if (< (- cp 48) 10) (- cp 22) (if (< (- cp 65) 26) (- cp 65) (if (< (- cp 97) 26) (- cp 97) mew-puny-base)))) (defun mew-puny-encode-digit (d) (if (< d 26) (+ d 22 75) ;; a-z (+ d 22))) ;; 0-9 (defun mew-puny-decode (input) (when mew-cs-utf-16be (condition-case nil (mew-cs-decode-string (mew-puny-decode1 (substring input 4)) ;; xn-- mew-cs-utf-16be) (error nil)))) (defun mew-puny-decode1 (input) (let* ((n mew-puny-initial-n) (bias mew-puny-initial-bias) (len (length input)) (in 0) (out 0) (i 0) (b 0) digit thr oldi w k output ret) (dotimes (j len) (if (= (aref input j) mew-puny-delimiter) (setq b j))) (dotimes (j b) (setq output (cons (aref input j) output)) (setq out (1+ out))) (setq output (nreverse output)) (if (> b 0) (setq in (1+ b)) (setq in 0)) (while (< in len) (setq oldi i) (setq w 1) (setq k mew-puny-base) (catch 'loop (while t (if (>= in len) (error "punycode bad input")) (setq digit (mew-puny-decode-digit (aref input in))) (if (>= digit mew-puny-base) (error "punycode bad input")) (setq in (1+ in)) (setq i (+ i (* digit w))) (if (<= k bias) (setq thr mew-puny-tmin) (if (>= k (+ bias mew-puny-tmax)) (setq thr mew-puny-tmax) (setq thr (- k bias)))) (if (< digit thr) (throw 'loop nil)) (setq w (* w (- mew-puny-base thr))) (setq k (+ k mew-puny-base)))) (setq out (1+ out)) (setq bias (mew-puny-adapt (- i oldi) out (= oldi 0))) (setq n (+ n (/ i out))) (setq i (% i out)) (if (= i 0) (setq output (cons n (nthcdr i output))) (setcdr (nthcdr (1- i) output) (cons n (nthcdr i output)))) (setq i (1+ i))) (setq ret (mew-make-string (* out 2))) (let ((j 0)) (dolist (op output) (aset ret j (/ op 256)) (setq j (1+ j)) (aset ret j (% op 256)) (setq j (1+ j)))) ret)) (defun mew-puny-encode (input) (when mew-cs-utf-16be (condition-case nil (concat "xn--" (mew-puny-encode1 (mew-cs-encode-string input mew-cs-utf-16be))) (error nil)))) (defun mew-puny-encode1 (input) (let* ((len (length input)) (h-len (/ len 2)) (n mew-puny-initial-n) (bias mew-puny-initial-bias) (delta 0) (out 0) (output (mew-make-string (* len 4))) h b m q k thr uni) (dotimes (j len) (setq uni (aref input j)) (setq j (1+ j)) (setq uni (+ (* uni 256) (aref input j))) (when (< uni 128) ;; basic (aset output out uni) (setq out (1+ out)))) (setq h out) (setq b out) (when (> b 0) (aset output out mew-puny-delimiter) (setq out (1+ out))) (while (< h h-len) (setq m 65536) ;; 17bits (dotimes (j len) (setq uni (aref input j)) (setq j (1+ j)) (setq uni (+ (* uni 256) (aref input j))) (if (and (>= uni n) (< uni m)) (setq m uni))) (setq delta (+ delta (* (- m n) (1+ h)))) (setq n m) (dotimes (j len) (setq uni (aref input j)) (setq j (1+ j)) (setq uni (+ (* uni 256) (aref input j))) (when (< uni n) (setq delta (1+ delta)) (if (= delta 0) (error "punycode overflow"))) (when (= uni n) (setq q delta) (setq k mew-puny-base) (catch 'loop (while t (if (<= k bias) (setq thr mew-puny-tmin) (if (>= k (+ bias mew-puny-tmax)) (setq thr mew-puny-tmax) (setq thr (- k bias)))) (if (< q thr) (throw 'loop nil)) (aset output out (mew-puny-encode-digit (+ thr (% (- q thr) (- mew-puny-base thr))))) (setq out (1+ out)) (setq q (/ (- q thr) (- mew-puny-base thr))) (setq k (+ k mew-puny-base)))) (aset output out (mew-puny-encode-digit q)) (setq out (1+ out)) (setq bias (mew-puny-adapt delta (1+ h) (= h b))) (setq delta 0) (setq h (1+ h)))) (setq delta (1+ delta)) (setq n (1+ n))) (substring output 0 out))) (defun mew-puny-encode-url (url) (let (beg end idn) (with-temp-buffer (insert url) (goto-char (point-min)) (if (search-forward "://" nil t) (setq beg (point)) (setq beg (point-min))) (if (search-forward "/" nil t) (setq end (1- (point))) (setq end (point-max))) (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (while (re-search-forward "[^.]?[^.\000-\177][^.]*" nil t) (setq idn (mew-match-string 0)) (delete-region (match-beginning 0) (match-end 0)) (insert (mew-puny-encode idn)))) (mew-buffer-substring (point-min) (point-max))))) (provide 'mew-bq) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-bq.el ends here kazu-yamamoto-Mew-ff9c41b/mew-cache.el000066400000000000000000000213411256455547000177270ustar00rootroot00000000000000;;; mew-cache.el --- Cache management for Mew ;; Author: Kazu Yamamoto ;; Created: Mar 23, 1997 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Cache info ;;; (defvar mew-cinfo-list '("fld" "msg" "time" "size" "decode-broken")) (mew-blinfo-defun 'mew-cinfo mew-cinfo-list) (defun mew-cinfo-set (fld msg time size decode-broken) (mew-cinfo-set-fld fld) (mew-cinfo-set-msg msg) (mew-cinfo-set-time time) (mew-cinfo-set-size size) (mew-cinfo-set-decode-broken decode-broken)) (defun mew-cinfo-equal (fld msg time size) (and (string= (mew-cinfo-get-fld) fld) (string= (mew-cinfo-get-msg) msg) (equal (mew-cinfo-get-time) time) (eq (mew-cinfo-get-size) size))) (defun mew-cache-dinfo-get-decode-broken (buf) (when buf (with-current-buffer buf (mew-cinfo-get-decode-broken)))) (defvar mew-xinfo-list '("decode-err" "warning" "info" "action" "multi-form" "icon-spec" "pri-result" "not-decrypted" "text-body")) (mew-blinfo-defun 'mew-xinfo mew-xinfo-list) (defun mew-xinfo-copy (buf) (set 'mew-xinfo (with-current-buffer buf (symbol-value 'mew-xinfo)))) (defun mew-xinfo-clear () (set 'mew-xinfo nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Prepare new message --- caching ;; (defun mew-cache-decode-syntax (buf) (with-current-buffer buf mew-decode-syntax)) (defvar mew-cache nil "A list of decoded messages cache. The (new ... old) order of ((\"+folder\" . \"message\") . cache-buffer)") (defun mew-cache-key (fld msg) (cons fld msg)) (defun mew-cache-buffer-get (entry) (cdr entry)) (defun mew-cache-entry-make (fld msg buf) (cons (mew-cache-key fld msg) buf)) (defun mew-cache-get (fld msg) (assoc (mew-cache-key fld msg) mew-cache)) (defun mew-cache-hit (fld msg &optional must-hit) "Return the buffer associated with FLD and MSG. If no cache entry is found, nil is returned. If a cache entry is invalid, the entry is removed and nil is returned. If MUST-HIT is non-nil and no valid cache entry is found, an error occurs." (let ((entry (mew-cache-get fld msg)) cache file time size ok) (if (null entry) (if must-hit (error "Cache not found") nil) (setq cache (mew-cache-buffer-get entry)) (setq file (mew-expand-msg fld msg)) (unless (file-readable-p file) (error "%s does not exist" (mew-concat-folder fld msg))) (setq time (mew-file-get-time file)) (setq size (mew-file-get-size file)) (with-current-buffer cache (setq ok (mew-cinfo-equal fld msg time size))) (if ok (progn (mew-cache-sort entry) cache) (if must-hit (error "Cache not found") (mew-cache-delete2 fld msg) nil))))) (defun mew-cache-sort (entry) (setq mew-cache (cons entry (delq entry mew-cache)))) (defun mew-cache-add (fld msg) (let ((len (length mew-cache)) buf) (if (< len mew-cache-size) (setq buf (get-buffer-create (format "%s%d" mew-buffer-cache len))) (setq buf (mew-cache-buffer-get (nth (1- len) mew-cache))) (setcdr (nthcdr (- len 2) mew-cache) nil)) (setq mew-cache (cons (mew-cache-entry-make fld msg buf) mew-cache)) buf)) (defun mew-cache-delete () "Delete the most recent cache entry." (let ((buf (mew-cache-buffer-get (car mew-cache)))) ;; must preserve the buffer itself because the buffer creation ;; depends on the length of mew-cache. (setq mew-cache (nconc (cdr mew-cache) (list (mew-cache-entry-make nil nil buf)))))) (defun mew-cache-delete2 (fld msg) "Delete the specific cache entry." (let ((entry (mew-cache-get fld msg)) buf) (if (null entry) () (setq buf (mew-cache-buffer-get entry)) (setq mew-cache (delq entry mew-cache)) (setq mew-cache (nconc mew-cache (list (mew-cache-entry-make nil nil buf))))))) (defvar mew-fields-xcc (list mew-fcc: mew-dcc: mew-bcc: mew-resent-fcc: mew-resent-bcc: mew-resent-dcc:)) (defun mew-xinfo-get-xcc (fld msg) (when (or (mew-folder-queuep fld) (mew-folder-postqp fld)) (let ((info (concat (mew-expand-msg fld msg) mew-queue-info-suffix)) (headers mew-fields-xcc) data addr xinfo) (when (and (file-readable-p info) (setq data (aref (mew-lisp-load info) 0))) (with-temp-buffer (insert data) (goto-char (point-min)) (dolist (header headers) (when (setq addr (mew-header-get-value header)) (setq xinfo (cons (format "%s %s\n" header addr) xinfo))))) (nreverse xinfo))))) (defun mew-disable-alternative-check () (let ((xmailer (mew-header-get-value mew-x-mailer:)) (regexs mew-disable-alternative-regex-list)) (if (null xmailer) t (catch 'loop (dolist (regex regexs t) (if (string-match regex xmailer) (throw 'loop nil))))))) (defun mew-cache-message (fld msg &optional unlimit no-err) "Cache the message specified by FLD and MSG. If an invalid message are cached, deletes it and caches the message again. If UNLIMIT is non-nil, decodes the message to be cached without the limitations. If NO-ERR is non-nil, an error is caused if decode fails." (let* ((cbuf (current-buffer)) (cache (mew-cache-hit fld msg)) (use-alternative mew-use-alternative) tim-siz decode errormsg) (catch 'return (if cache (progn (set-buffer cache) ;; Decryption may fail if password is wrong. So, try ;; to decode this again. (if (or (and unlimit (mew-xinfo-get-not-decrypted)) (and unlimit (mew-xinfo-get-decode-err))) ;; cache is invalid (setq decode t))) (setq cache (mew-cache-add fld msg)) (setq decode t)) (if (not decode) (throw 'return nil)) ;; (set-buffer cache) ;; in cache buffer (mew-erase-buffer) (condition-case errmsg (setq tim-siz (mew-insert-message fld msg mew-cs-text-for-read nil)) (error ;; file not exist (mew-cache-delete) (setq errormsg (nth 1 errmsg)) (throw 'return (setq cache nil)))) (mew-cinfo-set fld msg (car tim-siz) (cdr tim-siz) mew-decode-broken) (if (and use-alternative mew-disable-alternative-regex-list) (setq use-alternative (mew-disable-alternative-check))) (mew-dinfo-set nil t t use-alternative) (mew-decode-syntax-clear) (mew-xinfo-set-text-body mew-use-text-body) (condition-case nil (if unlimit (let ((mew-header-max-length nil) (mew-header-max-depth nil)) (mew-decode)) (mew-decode)) ;; Don't put error handing here. Because (mew-decode) would ;; set debug-on-error to t. (quit ;; prefetching an encrypted message (mew-cache-delete) ;; The following message is not friendly to users. ;; (message "MIME decoding for %s/%s aborted" fld msg) (throw 'return (setq cache nil)))) (mew-ainfo-set-icon msg) (mew-xinfo-set-info (append (mew-xinfo-get-info) (mew-xinfo-get-xcc fld msg))) (mew-decode-syntax-set)) ;; (set-buffer cbuf) (if errormsg (if no-err (message "%s" errormsg) (error "%s" errormsg))) cache)) ;; return value (defun mew-cache-clean-up () "A function to flush all decoded messages in cache list." (interactive) (dotimes (n mew-cache-size) (mew-kill-buffer (format "%s%d" mew-buffer-cache n))) (mew-summary-reset) (setq mew-cache nil)) (defalias 'mew-cache-flush 'mew-cache-clean-up) (provide 'mew-cache) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-cache.el ends here kazu-yamamoto-Mew-ff9c41b/mew-complete.el000066400000000000000000000632301256455547000204770ustar00rootroot00000000000000;;; mew-complete.el --- Completion magic for Mew ;; Author: Kazu Yamamoto ;; Created: May 30, 1997 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Low level functions ;;; (defun mew-draft-on-field-p () (if (bolp) (if (bobp) t (save-excursion (forward-line -1) (if (looking-at ".*,[ \t]?$") nil t))) (let ((pos (point))) (save-excursion (beginning-of-line) (if (looking-at mew-lwsp) nil (if (search-forward ":" pos t) nil t)))))) (defun mew-draft-on-value-p (switch) (save-excursion (beginning-of-line) (while (and (< (point-min) (point)) (looking-at mew-lwsp)) (forward-line -1)) (if (looking-at "\\([^:]*:\\)") (mew-field-get-func (match-string 1) switch) nil))) ;; what a case reaches here? ;; ;; Window management for completion candidates ;; (defvar mew-complete-candidates nil) (defun mew-complete-window-delete (&optional force) (when (mew-ainfo-get-win-cfg) ;; (mew-ainfo-get-win-cfg) remains when the last completion ;; finished with multiple candidates. ;; (e.g. foo when foo and foobar are displayed.) ;; In this case, this function is called in another ;; completion thread but setting window configuration is not ;; desired. If we set window configuration with the old ;; (mew-ainfo-get-win-cfg), the cursor jumps to mini buffer. ;; This was a stupid bug of Mew. So, let's see if the complete ;; buffer is displayed or not. (if (or force (get-buffer-window mew-buffer-completions)) (set-window-configuration (mew-ainfo-get-win-cfg))) (mew-ainfo-set-win-cfg nil)) (mew-remove-buffer mew-buffer-completions) (setq mew-complete-candidates nil)) (defun mew-complete-insert-folder-function (choice buffer mini-p base-size) (let ((start (mew-minibuf-point-min)) (proto (substring choice 0 1)) (pos (point))) (while (not (or (= start (point)) (not (char-before)) (char-equal (char-before) ?,))) (forward-char -1)) (if (and (member proto mew-folder-prefixes) (looking-at (concat "\\(" (regexp-opt mew-config-cases t) ":\\)" (regexp-quote proto)))) (progn (delete-region (match-end 1) pos) (goto-char (match-end 1))) (delete-region (point) pos)) (insert choice) (remove-text-properties start (point-max) '(mouse-face nil)) (mew-complete-window-delete 'force) t)) (defun mew-complete-window-show (all) (unless (mew-ainfo-get-win-cfg) (mew-ainfo-set-win-cfg (current-window-configuration))) (if (and (get-buffer-window mew-buffer-completions) (equal mew-complete-candidates all)) (let ((win (get-buffer-window mew-buffer-completions))) (with-current-buffer mew-buffer-completions (if (pos-visible-in-window-p (point-max) win) (set-window-start win 1) (scroll-other-window)))) (setq mew-complete-candidates all) (with-output-to-temp-buffer mew-buffer-completions (when mew-inherit-complete-folder (make-local-variable 'choose-completion-string-functions) (add-hook 'choose-completion-string-functions 'mew-complete-insert-folder-function)) (display-completion-list all)))) (defun mew-complete-backscroll () "Backscroll the *Completion* buffer." (interactive) (let* ((win (get-buffer-window mew-buffer-completions)) (height (and win (window-height win)))) (and win (scroll-other-window (- 3 height))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Completion function for a draft only ;;; (defun mew-draft-set-completion-ignore-case (case) ;; Need to set the global variable "completion-ignore-case", ;; since clicking a candidate on a completion buffer checks ;; the global variable. ;; Yes, this has side-effect. (when (mew-draft-or-header-p) (setq completion-ignore-case case))) (defun mew-draft-header-comp () "Complete and expand address short names. First, a short name is completed. When completed solely or the @ character is inserted before the cursor, the short name is expanded to its address." (interactive) (if (mew-draft-on-field-p) (mew-complete-field) (let ((func (mew-draft-on-value-p mew-field-completion-switch))) (if func (funcall func) (tab-to-tab-stop))))) ;; default keybinding (defun mew-complete-field () "Field complete function." (interactive) (let ((word (mew-delete-key))) ;; capitalized (if (null word) (mew-complete-window-show mew-fields) (mew-complete word (mapcar (lambda (x) (list (concat (mew-capitalize x) " "))) mew-fields) "field" nil)))) (defun mew-complete-newsgroups () "Newsgroup complete function." (interactive) (let ((word (mew-delete-backward-char))) (if (null word) (tab-to-tab-stop) (mew-complete word (mew-nntp-folder-alist2 (mew-tinfo-get-case)) "newsgroup" nil)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Completion function for both a draft and the minibuffer ;;; (defun mew-complete-address () "Complete and expand an address short name. First alias key is completed. When completed solely or the @ character is inserted before the cursor, the short name is expanded to its address." (interactive) (mew-draft-set-completion-ignore-case mew-complete-address-ignore-case) (let ((word (mew-delete-backward-char)) (completion-ignore-case mew-complete-address-ignore-case)) (if (null word) (tab-to-tab-stop) (if mew-use-full-alias (mew-complete word mew-addrbook-alist "alias" nil nil nil 'mew-addrbook-alias-get 'mew-addrbook-alias-hit) (if (string-match "@." word) (insert (or (mew-addrbook-alias-next word mew-addrbook-alist) word)) (mew-complete word mew-addrbook-alist "alias" ?@ nil nil 'mew-addrbook-alias-get 'mew-addrbook-alias-hit)))))) (defun mew-draft-addrbook-expand () (interactive) (mew-draft-set-completion-ignore-case mew-complete-address-ignore-case) (let ((word (mew-delete-backward-char)) (completion-ignore-case mew-complete-address-ignore-case) try) (if (null word) (message "No expand key") (setq try (try-completion word mew-addrbook-alist)) (if (or (eq try t) (and (stringp try) (string= word try))) (insert (mew-addrbook-alias-get word mew-addrbook-alist)) (insert word) (message "'%s' cannot be expanded" word))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Completing folders ;;; (defmacro mew-complete-proto-folder (sym &rest body) ;; (declare (indent 1)) `(if mew-input-folder-search-direction (mew-input-folder-search-complete) (mew-draft-set-completion-ignore-case mew-complete-folder-ignore-case) (let ((,sym (mew-delete-backward-char)) (completion-ignore-case mew-complete-folder-ignore-case) (mew-inherit-complete-folder t)) ,@body))) (put 'mew-complete-proto-folder 'lisp-indent-function 1) (defun mew-complete-local-folder () "Local folder complete function." (interactive) (mew-complete-proto-folder word (if (null word) (mew-complete-window-show (list "+")) (if (and (mew-folder-absolutep word) (not (mew-draft-or-header-p))) (mew-complete word (mew-complete-directory-alist word) "directory" nil) (mew-complete word (mew-local-folder-alist) "folder" nil))))) ;; case is specified by mew-inherit-case. (defun mew-complete-imap-folder () "IMAP folder complete function." (interactive) (mew-complete-proto-folder word (if (null word) (mew-complete-window-show (list "%")) (mew-complete word (mew-imap-folder-alist mew-inherit-case) ;; ie mew-sinfo-get-case "mailbox" nil)))) (defun mew-complete-fcc-folder () "Fcc: folder complete function." (interactive) (mew-complete-proto-folder word (if (null word) (mew-complete-window-show (list "+" "%")) (cond ((and (mew-folder-absolutep word) (not (mew-draft-or-header-p))) (mew-complete word (mew-complete-directory-alist word) "directory" nil)) ((mew-folder-imapp word) (mew-complete word (mew-imap-folder-alist (mew-tinfo-get-case)) "mailbox" nil)) (t (mew-complete word (mew-local-folder-alist) "folder" nil)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Completion function for the minibuffer only ;;; (defun mew-complete-folder () "Folder complete function." (interactive) (if mew-input-folder-search-direction (mew-input-folder-search-complete) (mew-complete-folder2))) (defun mew-input-folder-search-complete () (let ((mew-inherit-complete-folder t) keys) (with-current-buffer mew-input-folder-search-buf (save-excursion (goto-char (point-min)) (while (search-forward (or mew-input-folder-search-key "\n") nil t) (setq keys (cons (buffer-substring (progn (beginning-of-line) (point)) (progn (end-of-line) (point))) keys))))) (mew-complete-window-show (nreverse (delete "" keys))) (mew-highlight-folder-comp-search-window))) (defun mew-complete-folder2 () (let ((word (mew-delete-backward-char nil ", \t\n")) (completion-ignore-case mew-complete-folder-ignore-case) (mew-inherit-complete-folder t) case folder) (cond ((null word) (mew-complete-window-show mew-config-cases2)) ((setq case (mew-case:folder-case word)) (setq folder (mew-case:folder-folder word)) (cond ((mew-folder-localp folder) (mew-complete2 folder (mew-local-folder-alist) case)) ((mew-folder-popp folder) (mew-complete2 folder (mew-pop-folder-alist) case)) ((mew-folder-nntpp folder) (mew-complete2 folder (mew-nntp-folder-alist case) case)) ((mew-folder-imapp folder) (mew-complete2 folder (mew-imap-folder-alist case) case)) ((mew-folder-virtualp folder) (mew-complete word (mew-buffer-list "^\\*" t 'mew-virtual-mode) "folder" nil)) ((string= folder "") (insert word) (mew-complete-window-show (mapcar (lambda (x) (concat case ":" x)) mew-folder-prefixes))) (t (insert word) (if (window-minibuffer-p (get-buffer-window (current-buffer))) (mew-temp-minibuffer-message " [No matching folder]") (message "No matching folder"))))) (t (cond ((mew-folder-localp word) (mew-complete word (mew-local-folder-alist) "folder" nil)) ((mew-folder-popp word) (mew-complete word (mew-pop-folder-alist) "folder" nil)) ((mew-folder-nntpp word) (mew-complete word (mew-nntp-folder-alist nil) "newsgroup" nil)) ((mew-folder-imapp word) (mew-complete word (mew-imap-folder-alist nil) "mailbox" nil)) ((mew-folder-virtualp word) (mew-complete word (mew-buffer-list "^\\*" t 'mew-virtual-mode) "folder" nil)) ((mew-folder-absolutep word) (mew-complete word (mew-complete-directory-alist word) "directory" nil)) (t (mew-complete word (mapcar (lambda (x) (list (concat x ":"))) mew-config-cases) "case" nil))))))) (defun mew-complete-case () "Complete function for cases." (interactive) (let ((word (or (mew-delete-backward-char) "")) (completion-ignore-case mew-complete-case-ignore-case)) (mew-complete word (mapcar 'list mew-config-cases) "case" nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Circular completion function for a draft only ;;; (defun mew-draft-circular-comp () "Switch function for circular complete functions." (interactive) (let ((func (mew-draft-on-value-p mew-field-circular-completion-switch))) (if func (funcall func) (message "No circular completion here")))) (defun mew-circular-complete-domain () "Circular completion of domains for To:, Cc:, etc. If the @ character does not exist, the first value of mew-mail-domain-list is inserted. If exists, the next value of mew-mail-domain-list concerned with the string between @ and the cursor is inserted." (interactive) (mew-draft-set-completion-ignore-case mew-circular-complete-domain-ignore-case) (let ((word (mew-delete-backward-char "@")) (completion-ignore-case mew-circular-complete-domain-ignore-case)) (cond ((eq word nil) ;; @ does not exist. (if (null mew-mail-domain-list) (message "For domain circular completion, set mew-mail-domain-list") (insert "@") (insert (car mew-mail-domain-list)) (mew-complete-window-delete))) ((eq word t) ;; just after @ (if (null mew-mail-domain-list) (message "For domain circular completion, set mew-mail-domain-list") (insert (car mew-mail-domain-list)) (mew-complete-window-delete))) (t ;; cannot use mew-get-next since completion is necessary sometime. (mew-complete word (mew-slide-pair mew-mail-domain-list) "domain" t))))) ;; use cdr (defun mew-circular-complete (msg sym &optional minibuf) ;; xxx msg "General circular complete function." (interactive) (let ((name (symbol-name sym)) (val (symbol-value sym)) str alst match) (if (null val) (mew-temp-minibuffer-message (format "[Set '%s']" name)) (setq str (mew-delete-value nil minibuf)) (setq alst (mew-slide-pair val)) (if (or (null str) ;; draft (and (string= str "") (null (assoc "" alst)))) ;; minibuf (insert (car val)) (setq match (assoc str alst)) (if match (insert (cdr match)) (insert str) (mew-temp-minibuffer-message (format "[No matching %s]" msg))))))) (defun mew-circular-complete-from () "Circular complete function for From:." (interactive) (mew-circular-complete "from" 'mew-from-list)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Circular completion function for the minibuffer only ;;; (defvar mew-circular-complete-function nil) (defun mew-circular-complete-switch () "A switch function to call a function defined to 'mew-circular-complete-function'." (interactive) (if mew-circular-complete-function (funcall mew-circular-complete-function))) (defun mew-circular-complete-pick-pattern () (mew-circular-complete "pick pattern" 'mew-pick-pattern-list 'minibuf)) (defun mew-circular-complete-case () (mew-circular-complete "case" 'mew-config-cases 'minibuf)) (defun mew-circular-complete-case: () (cond ((eq mew-input-complete-function 'mew-complete-local-folder) ()) (mew-input-folder-search-direction (mew-input-folder-self-insert)) (t (let (cases oldcase newcase insert-:) (save-excursion (if (search-backward "," nil t) (forward-char 1) (beginning-of-line)) (if (looking-at mew-regex-case2) (progn (setq oldcase (mew-match-string 1)) (delete-region (match-beginning 1) (match-end 1))) (setq oldcase mew-case-default) (setq insert-: t)) (if (setq cases (member oldcase mew-config-cases)) (if (> (length cases) 1) (setq newcase (nth 1 cases)) (setq newcase (car mew-config-cases))) (setq newcase mew-case-default)) (if (string= newcase mew-case-default) (unless insert-: (delete-char 1)) (insert newcase) (if insert-: (insert ":")))) (if (or (= (point) (mew-minibuf-point-min)) (save-excursion (forward-char -1) (looking-at "[:,]"))) (if (search-forward "," nil t) (forward-char -1) (goto-char (point-max)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Expansion for a draft only ;;; (defun mew-draft-expand () "Switch function for expand functions." (interactive) (let ((func (mew-draft-on-value-p mew-field-expansion-switch))) (if func (funcall func) (message "No expansion here")))) (defun mew-expand-address () "Address expansion function for To:, Cc:, etc. 'user@domain' will be expands 'name ' if the name exists." (interactive) (let ((word (mew-delete-backward-char)) func name) (if (null word) (message "No address here") (setq func (mew-addrbook-func mew-addrbook-for-address-expansion)) (if (null func) (insert word) (setq name (funcall func word)) (insert (if name (format "%s <%s>" name word) word)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Other completion stuff ;;; ;; dummy (defvar mew-ext-host "") (defvar mew-ext-user "") (defun mew-complete-rfile () "Complete a remote file." (interactive) (let* ((path-file (mew-delete-file-name)) (path (car path-file)) (file (cdr path-file)) rpath) (setq rpath (format "/%s@%s:%s" mew-ext-user mew-ext-host path)) (mew-complete file rpath "remote file" nil 'mew-ext-file-name-completion 'mew-ext-file-name-all-completions))) (defun mew-complete-pick-pattern () "Complete pick patterns." (interactive) (let* ((pat (mew-delete-pattern)) (clist (append '("(" "!") mew-pick-field-list (mapcar 'car mew-pick-macro-alist)))) (if (null pat) (mew-complete-window-show clist) (mew-complete pat (mapcar 'list clist) "pick pattern" nil)))) (defun mew-complete-sort-key () "Complete sort keys." (interactive) (let* ((word (mew-delete-line)) field alist) (if (string-match ":" word) (progn ;; If WORD contains ':', change alist for completion. (setq field (car (mew-split word ?:))) (setq alist (mapcar (lambda (str) (list (concat field ":" str))) mew-sort-modes))) ;; Otherwise, alist is mew-sort-key-alist itself. (setq alist mew-sort-key-alist)) (mew-complete word alist "sort key" nil))) (defun mew-complete-directory-alist (dir) "Return alist of directories for completion." (let ((odir dir) odir1 dirs1 sub dirs2) (setq dir (mew-file-chase-links (expand-file-name dir))) (when (file-directory-p dir) (setq odir1 (file-name-as-directory odir)) (setq dirs1 (mapcar (lambda (x) (when (file-directory-p (expand-file-name x dir)) (cons (concat odir1 (file-name-as-directory x)) x))) (directory-files dir nil "[^.]" 'nosort)))) (setq sub (file-name-nondirectory dir)) (setq odir (file-name-directory odir)) (setq dir (file-name-directory dir)) (when (and dir odir sub (not (string= sub ""))) (setq odir (file-name-as-directory odir)) (setq dirs2 (mapcar (lambda (x) (when (file-directory-p (expand-file-name x dir)) (cons (concat odir (file-name-as-directory x)) x))) (directory-files dir nil (concat "^" (regexp-quote sub)) 'nosort)))) (sort (delq nil (append dirs2 dirs1)) (lambda (x y) (string< (car x) (car y)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Hart function for completions ;;; (defalias 'mew-complete-hit 'assoc) (defun mew-complete-get (key alist) (cdr (mew-complete-hit key alist))) (defun mew-complete (WORD ALIST MSG EXPAND-CHAR &optional TRY ALL GET HIT) (let* ((ftry (or TRY 'try-completion)) (fall (or ALL 'all-completions)) (fget (or GET 'mew-complete-get)) (fhit (or HIT 'mew-complete-hit)) (cmp (funcall ftry WORD ALIST)) (all (funcall fall WORD ALIST)) (len (length WORD)) subkey) (cond ;; already completed ((eq cmp t) (if EXPAND-CHAR ;; may be "t" (insert (funcall fget WORD ALIST)) ;; use cdr (insert WORD)) ;; use car (mew-complete-window-delete)) ;; EXPAND ((and (mew-characterp EXPAND-CHAR) (char-equal (aref WORD (1- len)) EXPAND-CHAR) (setq subkey (substring WORD 0 (1- len))) (funcall fhit subkey ALIST)) (insert (funcall fget subkey ALIST)) ;; use cdr (mew-complete-window-delete)) ;; just one candidate ((= 1 (length all)) (insert cmp) (if (window-minibuffer-p (get-buffer-window (current-buffer))) (mew-temp-minibuffer-message " [Sole completion]") (message "Sole completion")) (mew-complete-window-delete)) ;; two or more candidates ((stringp cmp) ;; (length all) > 1 (insert cmp) (mew-complete-window-show all) (if (and (mew-characterp EXPAND-CHAR) (funcall fhit cmp ALIST)) (message "To expand '%s', type '%c' then '%s'" cmp EXPAND-CHAR (substitute-command-keys "\\\\[mew-draft-header-comp]")))) ;; no candidate (t (insert WORD) ;;(mew-complete-window-delete) (if (window-minibuffer-p (get-buffer-window (current-buffer))) (mew-temp-minibuffer-message (format " [No matching %s]" MSG)) (message "No matching %s" MSG)))))) (defun mew-complete2-insert (case word) (if case (insert case ":" word) (insert word))) (defun mew-complete2 (word alist case) (let* ((cmp (try-completion word alist)) (all (all-completions word alist))) (cond ;; already completed ((eq cmp t) (mew-complete2-insert case word) ;; use car (mew-complete-window-delete)) ;; just one candidate ((= 1 (length all)) (mew-complete2-insert case cmp) (if (window-minibuffer-p (get-buffer-window (current-buffer))) (mew-temp-minibuffer-message " [Sole completion]") (message "Sole completion")) (mew-complete-window-delete)) ;; two or more candidates ((stringp cmp) ;; (length all) > 1 (mew-complete2-insert case cmp) (mew-complete-window-show all)) ;; no candidate (t (mew-complete2-insert case word) ;;(mew-complete-window-delete) (if (window-minibuffer-p (get-buffer-window (current-buffer))) (mew-temp-minibuffer-message " [No matching folder]") (message "No matching folder")))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Minibuf magic ;;; (defun mew-temp-minibuffer-message (m) (let ((savemax (point-max))) (save-excursion (goto-char (point-max)) (insert m)) (let ((inhibit-quit t)) (mew-let-user-read) (delete-region savemax (point-max)) (when quit-flag (setq quit-flag nil) (setq unread-command-events (list 7)))))) ;; 7 == C-g ;; ;; Extracting completion key ;; (defun mew-delete-backward-char (&optional here sep) "Delete appropriate preceding word and return it." (interactive) (let ((case-fold-search t) (start nil) (end (point)) (regex (concat "[^" (or sep mew-address-separator) "]"))) (save-excursion (while (and (not (bobp)) (string-match regex (mew-buffer-substring (1- (point)) (point)))) (forward-char -1)) (if (and here (not (re-search-forward (regexp-quote here) end t))) nil ;; "here" does not exist. (setq start (point)) (if (= start end) (if here t nil) ;; just after "here", just after separator (prog1 (mew-buffer-substring start end) (delete-region start end))))))) (defun mew-delete-file-name () (if (search-backward mew-path-separator nil t) (forward-char 1) (beginning-of-line)) (prog1 (cons (mew-buffer-substring (mew-minibuf-point-min) (point)) (mew-buffer-substring (point) (point-max))) (delete-region (point) (point-max)))) (defun mew-delete-pattern () (let ((pos (point))) (if (re-search-backward " \\|(\\|&\\||\\|!\\|," nil t) (forward-char 1) (beginning-of-line)) (prog1 (mew-buffer-substring (point) pos) (delete-region (point) pos)))) (defun mew-delete-line () (let ((pos (point))) (beginning-of-line) (prog1 (mew-buffer-substring (point) pos) (delete-region (point) pos)))) (defun mew-delete-key () (let ((pos (point))) (beginning-of-line) (prog1 (mew-capitalize (mew-buffer-substring (point) pos)) (delete-region (point) pos)))) (defun mew-delete-value (&optional here minibuf) (beginning-of-line) (if minibuf (let ((start (point)) ret) (end-of-line) (setq ret (mew-buffer-substring start (point))) (delete-region start (point)) ret) (when (looking-at "[^:]+:") (goto-char (match-end 0)) (if (looking-at "[ \t]") (forward-char 1) (insert " ")) (if (eolp) nil (let ((start (point)) ret) (end-of-line) (if (and here (re-search-backward (regexp-quote here) start t)) (progn (setq start (1+ (point))) (end-of-line))) (setq ret (mew-buffer-substring start (point))) (delete-region start (point)) ret))))) ;; ;; Making alist ;; (defun mew-slide-pair (x) (let ((len (length x)) (ret nil) (first (car x))) (cond ((= len 0) nil) ((= len 1) (list (cons first first))) (t (while (cdr x) (setq ret (cons (cons (nth 0 x) (nth 1 x)) ret)) (setq x (cdr x))) (setq ret (cons (cons (car x) first) ret)) (nreverse ret))))) (provide 'mew-complete) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-complete.el ends here kazu-yamamoto-Mew-ff9c41b/mew-config.el000066400000000000000000000515611256455547000201400ustar00rootroot00000000000000;;; mew-config.el ;; Author: Kazu Yamamoto ;; Created: Dec 14, 1999 ;;; Code: (require 'mew) (defun mew-case-default-p (case) (or (null case) (string= case mew-case-default))) (defvar mew-generate-mail-address-list nil) (defvar mew-generate-mail-domain-list nil) (defvar mew-generate-from-list nil) ;; ;; ;; (defun mew-cfent-value (case key def &optional type) (let ((cases (and case (mapcar 'mew-chop (mew-split case ?,)))) ent ret cfent) (or (member mew-case-default cases) (setq cases (cons mew-case-default cases))) (setq cases (nreverse cases)) (catch 'loop (dolist (cs cases) (setq cfent (mew-cfent-by-case cs)) (setq ent (or (assoc key cfent) ;; old (assoc (intern key) cfent))) ;; new (when ent (setq ret (cdr ent)) ;; old (cond ((eq type 'symbol) (if (consp ret) (setq ret (car ret))) (setq ret (symbol-value ret))) ((eq type 'list) (if (and (consp (car ret)) (null (cdr ret))) ;; new (setq ret (car ret))) (if (equal ret '(nil)) (setq ret nil))) (t (if (consp ret) (setq ret (car ret))))) ;; new (if ent (throw 'loop nil)))) (setq ret def)) ret)) (defvar mew-config-cases nil) (defvar mew-config-cases2 nil) (defvar mew-inbox-folders nil) (defvar mew-queue-folders nil) (defvar mew-postq-folders nil) (defun mew-config-init () (if (null mew-mail-address-list) (setq mew-generate-mail-address-list t)) (if (null mew-mail-domain-list) (setq mew-generate-mail-domain-list t)) (if (null mew-from-list) (setq mew-generate-from-list t))) (defun mew-config-case-name (ent) (let ((case (car ent))) (if (symbolp case) (symbol-name case) case))) (defun mew-config-setup () (if mew-generate-mail-address-list (setq mew-mail-address-list nil)) (if mew-generate-mail-domain-list (setq mew-mail-domain-list nil)) (if mew-generate-from-list (setq mew-from-list nil)) (setq mew-inbox-folders nil) (setq mew-queue-folders nil) (setq mew-postq-folders nil) (setq mew-config-cases (mapcar 'mew-config-case-name mew-config-alist)) (or (member mew-case-default mew-config-cases) (setq mew-config-cases (cons mew-case-default mew-config-cases))) (setq mew-config-cases2 (append mew-folder-prefixes (mapcar (lambda (x) (concat x ":")) mew-config-cases))) (let ((cases (reverse mew-config-cases)) ;; must copy val) (dolist (case cases) (setq val (mew-inbox-folder case)) (or (mew-folder-inboxp val) (setq mew-inbox-folders (cons val mew-inbox-folders))) (setq val (mew-queue-folder case)) (or (mew-folder-queuep val) (setq mew-queue-folders (cons val mew-queue-folders))) (setq val (mew-postq-folder case)) (or (mew-folder-postqp val) (setq mew-postq-folders (cons val mew-postq-folders))) (when mew-generate-mail-address-list (setq val (concat "^" (regexp-quote (mew-mail-address case)) "$")) (or (member val mew-mail-address-list) (setq mew-mail-address-list (cons val mew-mail-address-list)))) (when mew-generate-mail-domain-list (setq val (mew-mail-domain case)) (or (member val mew-mail-domain-list) (setq mew-mail-domain-list (cons val mew-mail-domain-list)))) (when mew-generate-from-list (setq val (mew-from case)) (or (member val mew-from-list) (setq mew-from-list (cons val mew-from-list))))))) ;;; ;;; ;;; (defun mew-name (&optional case) (mew-cfent-value case "name" mew-name)) (defun mew-user (&optional case) (mew-cfent-value case "user" mew-user)) (defun mew-mail-domain (&optional case) (mew-cfent-value case "mail-domain" mew-mail-domain)) (defun mew-mail-address (&optional case) (concat (mew-user case) "@" (mew-mail-domain case))) ;; mew-from is really strange to maintain backword compatibility. (defun mew-from (&optional case) (or (unless mew-config-alist (if mew-generate-from-list mew-from (car mew-from-list))) (let ((name (mew-name case)) (addr (mew-mail-address case))) (if (and name (string-match "[^ \t]" name)) (format "%s <%s>" name addr) addr)))) (defun mew-cc (&optional case) (let ((cc (mew-cfent-value case "cc" mew-cc))) (if (eq cc 'me) (mew-mail-address case) cc))) (defun mew-fcc (&optional case) (mew-cfent-value case "fcc" mew-fcc)) (defun mew-bcc (&optional case) (mew-cfent-value case "bcc" mew-bcc)) (defun mew-dcc (&optional case) (let ((dcc (mew-cfent-value case "dcc" mew-dcc))) (if (eq dcc 'me) (mew-mail-address case) dcc))) (defun mew-reply-to (&optional case) (mew-cfent-value case "reply-to" mew-reply-to)) (defun mew-organization (&optional case) (mew-cfent-value case "organization" mew-organization)) ;; (defun mew-ssl-cert-directory (&optional case) (mew-cfent-value case "ssl-cert-directory" mew-ssl-cert-directory)) (defun mew-ssl-verify-level (&optional case) (mew-cfent-value case "ssl-verify-level" mew-ssl-verify-level)) ;; (defun mew-smtp-server (&optional case) (mew-cfent-value case "smtp-server" mew-smtp-server)) (defun mew-smtp-port (&optional case) (mew-cfent-value case "smtp-port" mew-smtp-port)) (defun mew-smtp-ssh-server (&optional case) (mew-cfent-value case "smtp-ssh-server" mew-smtp-ssh-server)) (defun mew-smtp-ssl (&optional case) (mew-cfent-value case "smtp-ssl" mew-smtp-ssl)) (defun mew-smtp-ssl-port (&optional case) (mew-cfent-value case "smtp-ssl-port" mew-smtp-ssl-port)) (defun mew-smtp-helo-domain (&optional case) (mew-cfent-value case "smtp-helo-domain" mew-smtp-helo-domain)) (defun mew-smtp-user-only (&optional case) (let ((user-domain (mew-smtp-user case))) (if (string-match "^\\([^@]+\\)@" user-domain) (mew-match-string 1 user-domain) user-domain))) (defun mew-smtp-user (&optional case) (or (mew-cfent-value case "smtp-user" mew-smtp-user) (mew-mail-address case))) (defun mew-smtp-auth-list (&optional case) (mew-cfent-value case "smtp-auth-list" mew-smtp-auth-list 'list)) (defun mew-smtp-mail-from (&optional case) (mew-cfent-value case "smtp-mail-from" mew-smtp-mail-from)) (defun mew-smtp-msgid-user (&optional case) (or (mew-cfent-value case "smtp-msgid-user" mew-smtp-msgid-user) (mew-user case))) (defun mew-smtp-msgid-domain (&optional case) (or (mew-cfent-value case "smtp-msgid-domain" mew-smtp-msgid-domain) (mew-mail-domain case))) (defun mew-smtp-message-id (&optional case) (let* ((random (format "%08d" (mew-random))) (domain (mew-smtp-msgid-domain case)) (user (mew-smtp-msgid-user case)) (time (mew-time-ctz-to-msgid (current-time)))) (concat "<" time "." random "." user "@" domain ">"))) (defun mew-use-smtp-auth (&optional case) (mew-cfent-value case "use-smtp-auth" mew-use-smtp-auth)) (defun mew-smtp-auth-plain-authorize-id (&optional case) (mew-cfent-value case "smtp-auth-plain-authorize-id" mew-smtp-auth-plain-authorize-id)) ;; (defun mew-mailbox-type (&optional case) (mew-cfent-value case "mailbox-type" mew-mailbox-type)) ;; (defun mew-mbox-command (&optional case) (mew-cfent-value case "mbox-command" mew-mbox-command)) (defun mew-mbox-command-arg (&optional case) (mew-cfent-value case "mbox-command-arg" mew-mbox-command-arg)) ;; (defun mew-pop-server (&optional case) (mew-cfent-value case "pop-server" mew-pop-server)) (defun mew-pop-port (&optional case) (mew-cfent-value case "pop-port" mew-pop-port)) (defun mew-pop-auth (&optional case) (mew-cfent-value case "pop-auth" mew-pop-auth)) (defun mew-pop-ssh-server (&optional case) (mew-cfent-value case "pop-ssh-server" mew-pop-ssh-server)) (defun mew-pop-ssl (&optional case) (mew-cfent-value case "pop-ssl" mew-pop-ssl)) (defun mew-pop-ssl-port (&optional case) (mew-cfent-value case "pop-ssl-port" mew-pop-ssl-port)) (defun mew-pop-proxy-server (&optional case) (mew-cfent-value case "pop-proxy-server" mew-pop-proxy-server)) (defun mew-pop-proxy-port (&optional case) (mew-cfent-value case "pop-proxy-port" mew-pop-proxy-port)) (defun mew-pop-user (&optional case) (mew-cfent-value case "pop-user" mew-pop-user)) (defun mew-pop-auth-list (&optional case) (mew-cfent-value case "pop-auth-list" mew-pop-auth-list 'list)) (defun mew-pop-size (&optional case) (mew-cfent-value case "pop-size" mew-pop-size)) (defun mew-pop-body-lines (&optional case) (mew-cfent-value case "pop-body-lines" mew-pop-body-lines)) (defun mew-pop-delete (&optional case) (mew-cfent-value case "pop-delete" mew-pop-delete)) (defun mew-pop-header-only (&optional case) (mew-cfent-value case "pop-header-only" mew-pop-header-only)) ;; (defun mew-imap-server (&optional case) (mew-cfent-value case "imap-server" mew-imap-server)) (defun mew-imap-port (&optional case) (mew-cfent-value case "imap-port" mew-imap-port)) (defun mew-imap-auth (&optional case) (mew-cfent-value case "imap-auth" mew-imap-auth)) (defun mew-imap-ssh-server (&optional case) (mew-cfent-value case "imap-ssh-server" mew-imap-ssh-server)) (defun mew-imap-ssl (&optional case) (mew-cfent-value case "imap-ssl" mew-imap-ssl)) (defun mew-imap-ssl-port (&optional case) (mew-cfent-value case "imap-ssl-port" mew-imap-ssl-port)) (defun mew-imap-proxy-server (&optional case) (mew-cfent-value case "imap-proxy-server" mew-imap-proxy-server)) (defun mew-imap-proxy-port (&optional case) (mew-cfent-value case "imap-proxy-port" mew-imap-proxy-port)) (defun mew-imap-user (&optional case) (mew-cfent-value case "imap-user" mew-imap-user)) (defun mew-imap-auth-list (&optional case) (mew-cfent-value case "imap-auth-list" mew-imap-auth-list 'list)) (defun mew-imap-size (&optional case) (mew-cfent-value case "imap-size" mew-imap-size)) (defun mew-imap-delete (&optional case) (mew-cfent-value case "imap-delete" mew-imap-delete)) (defun mew-imap-header-only (&optional case) (mew-cfent-value case "imap-header-only" mew-imap-header-only)) (defun mew-imap-prefix-list (&optional case) (mew-cfent-value case "imap-prefix-list" mew-imap-prefix-list 'list)) ;; (defun mew-nntp-server (&optional case) (mew-cfent-value case "nntp-server" mew-nntp-server)) (defun mew-nntp-port (&optional case) (mew-cfent-value case "nntp-port" mew-nntp-port)) (defun mew-nntp-ssh-server (&optional case) (mew-cfent-value case "nntp-ssh-server" mew-nntp-ssh-server)) (defun mew-nntp-ssl (&optional case) (mew-cfent-value case "nntp-ssl" mew-nntp-ssl)) (defun mew-nntp-ssl-port (&optional case) (mew-cfent-value case "nntp-ssl-port" mew-nntp-ssl-port)) (defun mew-nntp-user (&optional case) (mew-cfent-value case "nntp-user" mew-nntp-user)) (defun mew-nntp-size (&optional case) (mew-cfent-value case "nntp-size" mew-nntp-size)) (defun mew-nntp-header-only (&optional case) (mew-cfent-value case "nntp-header-only" mew-nntp-header-only)) (defun mew-nntp-msgid-user (&optional case) (or (mew-cfent-value case "nntp-msgid-user" mew-nntp-msgid-user) (mew-user case))) (defun mew-nntp-msgid-domain (&optional case) (or (mew-cfent-value case "nntp-msgid-domain" mew-nntp-msgid-domain) (mew-mail-domain case))) (defun mew-nntp-message-id (&optional case) (let* ((random (format "%08d" (mew-random))) (domain (mew-nntp-msgid-domain case)) (user (mew-nntp-msgid-user case)) (time (mew-time-ctz-to-msgid (current-time)))) (concat "<" time "." random "." user "@" domain ">"))) ;; (defun mew-inbox-folder (&optional case) (mew-cfent-value case "inbox-folder" mew-inbox-folder)) (defun mew-imap-inbox-folder (&optional case) (mew-cfent-value case "imap-inbox-folder" mew-imap-inbox-folder)) (defun mew-nntp-newsgroup (&optional case) (mew-cfent-value case "nntp-newsgroup" mew-nntp-newsgroup)) (defun mew-imap-friend-folder (&optional case) (mew-cfent-value case "imap-friend-folder" mew-imap-friend-folder)) (defun mew-queue-folder (&optional case) (mew-cfent-value case "queue-folder" mew-queue-folder)) (defun mew-postq-folder (&optional case) (mew-cfent-value case "postq-folder" mew-postq-folder)) (defun mew-imap-queue-folder (&optional case) (mew-cfent-value case "imap-queue-folder" mew-imap-queue-folder)) (defun mew-imap-trash-folder (&optional case) (mew-cfent-value case "imap-trash-folder" mew-imap-trash-folder)) (defun mew-imap-trash-folder-list (&optional case) (mew-cfent-value case "imap-trash-folder-list" mew-imap-trash-folder-list 'list)) (defun mew-header-alist (&optional case) (mew-cfent-value case "header-alist" mew-header-alist 'list)) (defun mew-signature-file (&optional case) (mew-cfent-value case "signature-file" mew-signature-file)) (defun mew-content-type (&optional case) (mew-capitalize (mew-cfent-value case "content-type" mew-content-type))) (defun mew-imap-spam-field (&optional case) (mew-cfent-value case "imap-spam-field" mew-imap-spam-field)) (defun mew-imap-spam-word (&optional case) (mew-cfent-value case "imap-spam-word" mew-imap-spam-word)) (defun mew-imap-spam-pattern (&optional case) (mew-cfent-value case "imap-spam-pattern" mew-imap-spam-pattern)) (defun mew-imap-spam-folder (&optional case) (mew-cfent-value case "imap-spam-folder" mew-imap-spam-folder)) ;; (defun mew-warn-addresses (&optional case) (mew-cfent-value case "warn-addresses" mew-warn-addresses)) (defun mew-safe-addresses (&optional case) (mew-cfent-value case "safe-addresses" mew-safe-addresses)) (defun mew-warn-domains (&optional case) (mew-cfent-value case "warn-domains" mew-warn-domains)) (defun mew-safe-domains (&optional case) (mew-cfent-value case "safe-domains" mew-safe-domains)) ;; (defun mew-proto (&optional case) (mew-cfent-value case "proto" mew-proto)) ;; (defun mew-ssh-prog (&optional case) (mew-cfent-value case "ssh-prog" mew-ssh-prog)) (defun mew-ssh-prog-args (&optional case) (mew-cfent-value case "ssh-prog-args" mew-ssh-prog-args)) (defun mew-ssh-prog-ver (&optional case) (mew-cfent-value case "ssh-prog-ver" mew-ssh-prog-ver)) (defun mew-spam-prog (&optional case) (mew-cfent-value case "spam-prog" mew-spam-prog)) (defun mew-spam-prog-args (&optional case) (mew-cfent-value case "spam-prog-args" mew-spam-prog-args)) (defun mew-ham-prog (&optional case) (mew-cfent-value case "ham-prog" mew-ham-prog)) (defun mew-ham-prog-args (&optional case) (mew-cfent-value case "ham-prog-args" mew-ham-prog-args)) ;; (defun mew-refile-guess-alist (&optional case) (mew-cfent-value case "refile-guess-alist" mew-refile-guess-alist 'symbol)) ;; (defun mew-use-old-pgp (&optional case) (mew-cfent-value case "use-old-pgp" mew-use-old-pgp)) ;; (defun mew-inbox-action-alist (&optional case) (mew-cfent-value case "inbox-action-alist" mew-inbox-action-alist 'list)) ;; (defun mew-draft-privacy-method (&optional case) (mew-cfent-value case "draft-privacy-method" mew-draft-privacy-method)) (defun mew-protect-privacy-always (&optional case) (mew-cfent-value case "protect-privacy-always" mew-protect-privacy-always)) (defun mew-protect-privacy-always-type (&optional case) (mew-cfent-value case "protect-privacy-always-type" mew-protect-privacy-always-type)) (defun mew-protect-privacy-encrypted (&optional case) (mew-cfent-value case "protect-privacy-encrypted" mew-protect-privacy-encrypted)) (defun mew-protect-privacy-encrypted-type (&optional case) (mew-cfent-value case "protect-privacy-encrypted-type" mew-protect-privacy-encrypted-type)) (defun mew-protect-privacy-with-old-pgp-signature (&optional case) (mew-cfent-value case "protect-privacy-with-old-pgp-signature" mew-protect-privacy-with-old-pgp-signature)) ;; (defun mew-pgp-signer (&optional case) (mew-cfent-value case "pgp-signer" mew-pgp-signer)) (defun mew-smime-signer (&optional case) (mew-cfent-value case "smime-signer" mew-smime-signer)) (defun mew-use-x-mailer (&optional case) (mew-cfent-value case "use-x-mailer" mew-use-x-mailer)) (defun mew-use-format-flowed (&optional case) (mew-cfent-value case "use-format-flowed" mew-use-format-flowed)) ;;; ;;; Setting case ;;; (defvar mew-case nil) (defun mew-case-set () "Set the case both for input and output." (interactive) (setq mew-case (mew-input-case mew-case))) (defun mew-summary-set-case () "Set the case." (interactive) (let ((case (mew-case-set))) ;; side effect (save-excursion (dolist (buf mew-buffers) (when (get-buffer buf) (set-buffer buf) (cond ((mew-summary-p) (mew-summary-mode-name mew-mode-name-summary)) ((mew-virtual-p) (mew-summary-mode-name mew-mode-name-virtual)))))) (when mew-visit-inbox-after-setting-case (let ((inbox (mew-case-folder case (mew-proto-inbox-folder (mew-proto case) case)))) (mew-summary-visit-folder inbox))))) (defun mew-draft-set-case (&optional arg) "Guess case and set the case for output to it. The value is locally stored in Draft mode. If called with '\\[universal-argument]', you can modify the locally stored value. Then this command replace fields in the header according to the new value." (interactive "P") (let ((old-case (mew-tinfo-get-case)) new-case) (if arg (setq new-case (mew-input-case old-case 'edit)) (setq new-case (mew-draft-get-case-by-guess)) (if mew-case-guess-addition (setq new-case (mew-draft-add-case old-case new-case))) (setq new-case (mew-input-case (or new-case mew-case)))) (mew-tinfo-set-case new-case) (mew-tinfo-set-use-flowed (mew-use-format-flowed new-case)) (mew-draft-mode-name (mew-tinfo-get-hdr-file)) (mew-draft-replace-fields old-case) (mew-highlight-header) (unless (mew-tinfo-get-hdr-file) (mew-draft-header-keymap)) (save-buffer))) (defun mew-draft-replace-fields (old-case) (save-excursion (goto-char (point-min)) (let ((new-case (mew-tinfo-get-case)) from fcc dcc eoh) ;; (mew-header-end) cannot be used here (mew-header-goto-end) (setq eoh (point)) (goto-char (point-min)) (cond ((mew-draft-resent-p eoh) (setq from mew-resent-from:) ;; (setq cc mew-resent-cc:) (setq fcc mew-resent-fcc:) (setq dcc mew-resent-dcc:)) (t (setq from mew-from:) ;; (setq cc mew-cc:) (setq fcc mew-fcc:) (setq dcc mew-dcc:))) (mew-header-replace-value from (mew-from new-case)) ;; (mew-header-replace-value cc (mew-cc new-case)) (mew-header-replace-value dcc (mew-dcc new-case)) (mew-header-replace-value fcc (mew-fcc new-case)) (mew-header-replace-value mew-reply-to: (mew-reply-to new-case)) (mew-header-replace-value mew-organization: (mew-organization new-case)) (mew-header-delete-lines (mapcar 'mew-alist-get-key (mew-header-alist old-case))) (mew-header-delete-lines (mapcar 'mew-alist-get-key (mew-header-alist new-case))) (mew-header-delete-lines (list mew-x-face: mew-x-mailer:)) (mew-header-goto-end) (mew-draft-header-insert-xface) (mew-draft-header-insert-alist (mew-header-alist new-case)) ;; X-Mailer: must be the last (if (mew-use-x-mailer new-case) (mew-draft-header-insert mew-x-mailer: mew-x-mailer))))) (defun mew-draft-get-case-by-guess (&optional alist) "Guess case according to 'mew-case-guess-alist'." (unless alist (setq alist mew-case-guess-alist)) (let ((cases (mew-refile-guess-by-alist1 alist))) (if cases (mew-join "," cases) nil))) (defun mew-draft-set-case-by-guess () (let ((case (mew-draft-get-case-by-guess))) (when case (if mew-case-guess-addition (setq case (mew-draft-add-case (mew-tinfo-get-case) case))) (mew-tinfo-set-case case)))) (defun mew-draft-add-case (dst src) (if (mew-case-default-p dst) src (if (> (length src) 0) (mew-join "," (nreverse (mew-uniq-list (nreverse (mew-split (concat dst "," src) ?,))))) dst))) (provide 'mew-config) ;;; Copyright Notice: ;; Copyright (C) 1999-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-config.el ends here kazu-yamamoto-Mew-ff9c41b/mew-const.el000066400000000000000000000274211256455547000200170ustar00rootroot00000000000000;;; mew-const.el ;; Author: Kazu Yamamoto ;; Created: Feb 1, 1999 ;;; Code: (require 'mew) ;; Constants which are used in two or more files must be here. ;; Constants used only in a file should be defined in the file. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Suffix ;;; (defconst mew-suffix ".mew") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Readability ;;; (defconst mew-sp ?\ ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Message fields ;;; ;; Must be capitalized! (defconst mew-subj: "Subject:") (defconst mew-to: "To:") (defconst mew-cc: "Cc:") (defconst mew-from: "From:") (defconst mew-sender: "Sender:") (defconst mew-date: "Date:") (defconst mew-bcc: "Bcc:") (defconst mew-dcc: "Dcc:") (defconst mew-fcc: "Fcc:") (defconst mew-message-id: "Message-Id:") (defconst mew-references: "References:") (defconst mew-in-reply-to: "In-Reply-To:") (defconst mew-resent-to: "Resent-To:") (defconst mew-resent-cc: "Resent-Cc:") (defconst mew-resent-from: "Resent-From:") (defconst mew-resent-sender: "Resent-Sender:") (defconst mew-resent-date: "Resent-Date:") (defconst mew-resent-bcc: "Resent-Bcc:") (defconst mew-resent-dcc: "Resent-Dcc:") (defconst mew-resent-fcc: "Resent-Fcc:") (defconst mew-resent-regex "^Resent-") (defconst mew-resent-message-id: "Resent-Message-Id:") (defconst mew-reply-to: "Reply-To:") (defconst mew-organization: "Organization:") (defconst mew-newsgroups: "Newsgroups:") (defconst mew-distribution: "Distribution:") (defconst mew-followup-to: "Followup-To:") (defconst mew-apparently-to: "Apparently-To:") ;; Must not include Bcc:. (defconst mew-destination:-list `(,mew-to: ,mew-cc: ,mew-dcc: ,mew-bcc: ,mew-apparently-to:)) (defconst mew-resent-dest:-list `(,mew-resent-to: ,mew-resent-cc: ,mew-resent-bcc: ,mew-resent-dcc:)) (defconst mew-received: "Received:") (defconst mew-x-mailer: "X-Mailer:") (defconst mew-x-face: "X-Face:") (defconst mew-face: "Face:") (defconst mew-x-mew: "X-Mew:") (defconst mew-x-mew-uidl: "X-Mew-Uidl:") (defconst mew-x-mew-ref: "X-Mew-Ref:") (defconst mew-keywords: "Keywords:") (defconst mew-body: "Body:") (defconst mew-mv: "Mime-Version:") (defconst mew-mv:-num "1.0") (defconst mew-ct: "Content-Type:") (defconst mew-cte: "Content-Transfer-Encoding:") (defconst mew-cd: "Content-Description:") (defconst mew-cid: "Content-Id:") (defconst mew-cdp: "Content-Disposition:") (defconst mew-ct-txt "Text/Plain") (defconst mew-ct-htm "Text/Html") (defconst mew-ct-xml "Text/Xml") (defconst mew-ct-trh "Text/Rfc822-Headers") (defconst mew-ct-msg "Message/Rfc822") (defconst mew-ct-ext "Message/External-Body") (defconst mew-ct-sts "Message/Delivery-Status") (defconst mew-ct-mlm "Multipart/Mixed") (defconst mew-ct-mla "Multipart/Alternative") (defconst mew-ct-mls "Multipart/Signed") (defconst mew-ct-mle "Multipart/Encrypted") (defconst mew-ct-mld "Multipart/Digest") (defconst mew-ct-ado "Audio/Basic") (defconst mew-ct-apo "Application/Octet-Stream") (defconst mew-ct-aps "Application/Postscript") (defconst mew-ct-apk "Application/Pgp-Keys") (defconst mew-ct-pgs "application/pgp-signature") ;; due to the RFC 1847 bug (defconst mew-ct-pge "application/pgp-encrypted") ;; due to the RFC 1847 bug (defconst mew-ct-smm "Application/Pkcs7-Mime") (defconst mew-ct-xsmm "Application/X-Pkcs7-Mime") (defconst mew-ct-smm-enc "enveloped-data") (defconst mew-ct-smm-sig "signed-data") (defconst mew-ct-sms "application/pkcs7-signature") ;; due to the RFC 1847 bug (defconst mew-ct-xsms "application/x-pkcs7-signature") ;; due to the RFC 1847 bug (defconst mew-us-ascii "us-ascii") (defconst mew-utf-8 "utf-8") (defconst mew-iso-2022-jp-2 "iso-2022-jp-2") (defconst mew-cs-unknown 'unknown) (defconst mew-cs-m17n-list `(,mew-utf-8 ,mew-iso-2022-jp-2)) (defconst mew-type-txt `(,mew-ct-txt ("charset" ,mew-us-ascii))) (defconst mew-type-msg `(,mew-ct-msg)) (defconst mew-type-mlm `(,mew-ct-mlm)) (defconst mew-type-ado `(,mew-ct-ado)) (defconst mew-type-apo `(,mew-ct-apo)) (defconst mew-type-apk `(,mew-ct-apk)) (defconst mew-b64 "base64") (defconst mew-qp "quoted-printable") (defconst mew-xg "x-gzip64") (defconst mew-7bit "7bit") (defconst mew-8bit "8bit") (defconst mew-bin "binary") (defconst mew-xuu "x-uuencode") (defconst mew-decode-value `(,mew-b64 ,mew-qp ,mew-xg ,mew-7bit ,mew-8bit ,mew-bin ,mew-xuu)) (defconst mew-decode-composite-value `(,mew-7bit ,mew-8bit ,mew-bin)) (defun mew-cte-p (cte) (member (downcase cte) mew-decode-value)) (defun mew-cte-composite-p (cte) (member (downcase cte) mew-decode-composite-value)) ;; must be list of list. (defconst mew-mime-fields `((,mew-ct: 0 analyze) (,mew-cte: 1 extract) (,mew-cd: 2 decode) (,mew-cid: 3 id) (,mew-cdp: 4 analyze))) (defconst mew-syntax-magic (+ (length [key beg end pri]) (length mew-mime-fields))) (defconst mew-x-mailer (format "%s on Emacs %s / Mule %s" mew-version (when (string-match "^\\([.0-9]+\\)\\.[0-9]+$" emacs-version) (match-string 1 emacs-version)) mule-version) "*A value inserted into X-Mailer: field in Draft mode if *non-nil*.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Buffers ;;; (defconst mew-buffer-prefix " *Mew* ") (defconst mew-buffer-regex "^ ?\\*Mew\\* ") (defconst mew-buffer-cache " *mew cache*") (defconst mew-buffer-cache-prefix (concat "^" (regexp-quote mew-buffer-cache))) (defconst mew-buffer-message "*Mew message*") (defconst mew-buffer-completions "*Mew completions*") (defconst mew-buffer-addrbook "*Mew Addrbook*") (defconst mew-buffer-debug "*Mew debug*") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Suffix ;;; (defconst mew-ext-suffix ".ext") (defconst mew-text-suffix ".txt") (defconst mew-audio-suffix ".au") (defconst mew-pgp-key-suffix ".pka") (defconst mew-pgp-ascii-suffix ".asc") (defconst mew-queue-work-suffix ".wrk") (defconst mew-queue-info-suffix ".mqi") (defconst mew-draft-info-suffix ".mdi") (defconst mew-imapq-info-suffix ".iqi") (defconst mew-backup-suffix ".old") (defconst mew-backup-prefix "#") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Regular expressions ;;; (defconst mew-regex-files "^[^.]\\|^.[^.]") ;; xxx "[^.]" is enough? ;;; ;;; Sumsyn ;;; (defconst mew-regex-mark "^\\([^ \n]\\)") (defun mew-sumsyn-mark () (string-to-char (mew-match-string 1))) ;; fld msg (defconst mew-regex-sumsyn-short "\r \\([^ \n]*\\) \\([^ \n]+\\)") ;; fld msg my-id par-id uid siz (defconst mew-regex-sumsyn-long "\r \\([^ \n]*\\) \\([^ \n]+\\) \\([^ \n]*\\) \\([^ \n]*\\) \\([^ \n]*\\) \\([0-9]*\\)") ;; fld msg (defun mew-regex-sumsyn-msg (msg) (format "\r \\([^ \n]*\\) \\(%s\\) " msg)) (defun mew-summary-search-msg (msg) (let ((regex (mew-regex-sumsyn-msg msg))) (when (or (re-search-forward regex nil t) (re-search-backward regex nil t)) (beginning-of-line) t))) (defconst mew-regex-sumsyn-valid "\r \\([^ \n]*\\) \\([^ \n]+\\)") (defconst mew-regex-sumsyn-invalid "\r [^ \n]* 0[1-9][0-9]*") (defun mew-msg-validp (msg) (and msg (string-match mew-regex-message-files msg))) (defun mew-msg-invalidp (msg) (and msg (string-match "^0" msg))) (defun mew-msg-truncatedp (siz) (and siz (string-match "^0" siz))) ;; fld msg my-id par-id uid siz (defun mew-regex-sumsyn-my-id (my-id) (format "\r [^ \n]* [0-9]+ %s [^ \n]*" (regexp-quote my-id))) (defun mew-regex-sumsyn-par-id (par-id) (format "\r [^ \n]* [0-9]+ [^ \n]* %s" (regexp-quote par-id))) ;;; ;;; ;;; (defconst mew-regex-msg-icon "^\\([0-9]+\\) ") (defconst mew-regex-part "^.... \\([.0-9]+\\) ") (defconst mew-regex-part-icon "<\\([.0-9]+\\)>") (defun mew-regex-jmp-part (part) (format "^.... \\(%s\\) " part)) ;; [\033\200-\377] does not work due to the multibyte (defconst mew-regex-esc-or-nonascii "[^\000-\032\034-\177]") ;; \033 = esc (defconst mew-regex-nonascii "[^\000-\177]") (defconst mew-regex-singlebyte-nonascii "\\(\\`\\|[\000-\177]\\)[^\000-\177]\\([\000-\177]\\|\\'\\)") ;; The followings MUST contain "+" for conversion. ;; \011 = tab, \012 = lf (defconst mew-regex-ctls "[\000-\037\177]+") (defconst mew-regex-ctls-wo-tab "[\000-\010\012-\037\177]+") (defconst mew-regex-ctls-wo-tab-lf "[\000-\010\013-\037\177]+") ;; Can skip \n. Match the first id. For example: ;; In-Reply-To: Your message of "Mon, 5 Oct 1998 13:33:14 +0900" ;; <19981005133317N.kazu@example.org> (defconst mew-regex-id "<[^>\n\t]+>") (defconst mew-regex-case "^\\([^-+$%*,:][^,:]+\\):\\(.*\\)") (defconst mew-regex-case1 "^\\([^-+$%*,:][^,:]+\\(,[^,:]+\\)*\\):\\(.*\\)") (defconst mew-regex-case2 "\\([^-+$%*,:][^,:]+\\(,[^,:]+\\)*\\):") (defconst mew-regex-punycode "xn--\\([-0-9a-zA-z]+\\)") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folder ;;; (defconst mew-folder-local "+") (defconst mew-folder-pop "$") (defconst mew-folder-imap "%") (defconst mew-folder-nntp "-") (defconst mew-folder-virtual "*") (defconst mew-folder-prefixes `(,mew-folder-local ,mew-folder-pop ,mew-folder-imap ,mew-folder-nntp ,mew-folder-virtual)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Misc ;;; (defconst mew-home (file-name-as-directory "~")) (defconst mew-case-default "default" "The default value for case.") (defconst mew-draft-coverpage "Cover.txt") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Inherit ;;; (defconst mew-inherit-case nil) (defconst mew-inherit-exec-case nil) (defconst mew-inherit-alt nil) (defconst mew-inherit-7bit nil) (defconst mew-inherit-offline nil) (defconst mew-inherit-decode-signer nil) (defconst mew-inherit-encode-pgp-signer nil) (defconst mew-inherit-encode-smime-signer nil) (defconst mew-inherit-prefetching nil) (defconst mew-inherit-refile-case nil) (defconst mew-inherit-refile-proto nil) (defconst mew-inherit-grep-cmd nil) (defconst mew-inherit-after-marking nil) (defconst mew-inherit-pick-tokens nil) (defconst mew-inherit-pick-ret nil) (defconst mew-inherit-pick-mewlp nil) (defconst mew-inherit-pick-omit-and nil) (defconst mew-inherit-pick-omit-and2 nil) (defconst mew-inherit-submission nil) (defconst mew-inherit-complete-folder nil) (provide 'mew-const) ;;; Copyright Notice: ;; Copyright (C) 2000-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-const.el ends here kazu-yamamoto-Mew-ff9c41b/mew-darwin.el000066400000000000000000000112511256455547000201470ustar00rootroot00000000000000;;; mew-darwin.el --- Settings for Mew on Darwin ;; Author: Kazu Yamamoto ;; Created: Oct 30, 2002 ;;; Code: ;; ;; MIME setting ;; (defvar mew-darwin-exec "open") (defvar mew-default-external-program mew-darwin-exec) (defvar mew-prog-plain 'mew-mime-text/plain) (defvar mew-prog-html '(mew-mime-text/html mew-mime-text/html-ext)) (defvar mew-prog-xml '(mew-mime-text/xml mew-mime-text/xml-ext)) (defvar mew-prog-patch '(mew-mime-text/plain mew-mime-text/patch-ext)) (defvar mew-prog-enriched 'mew-mime-text/enriched) (defvar mew-prog-text 'mew-mime-text/plain) (defvar mew-prog-audio mew-darwin-exec) (defvar mew-prog-audio2 mew-darwin-exec) ;; dummy (defvar mew-prog-image '(mew-mime-image/* mew-mime-image/*-ext)) (defvar mew-prog-iges mew-darwin-exec) (defvar mew-prog-vrml mew-darwin-exec) (defvar mew-prog-mesh mew-darwin-exec) (defvar mew-prog-video mew-darwin-exec) (defvar mew-prog-rfc822 'mew-mime-message/rfc822) (defvar mew-prog-rfc822-headers 'mew-mime-text/rfc822-headers) (defvar mew-prog-external-body '(mew-mime-external-body mew-mime-external-body-ext)) (defvar mew-prog-delivery-status 'mew-mime-text/plain) (defvar mew-prog-postscript mew-darwin-exec) (defvar mew-prog-pgp-keys '(mew-mime-pgp-keys mew-mime-pgp-keys-ext)) (defvar mew-prog-application/pdf "pdftotext") (defvar mew-prog-pdf-ext mew-darwin-exec) (defvar mew-prog-pdf `(mew-mime-application/pdf ,mew-prog-pdf-ext)) (defvar mew-prog-xml2 '(mew-mime-application/xml mew-mime-application/xml-ext)) (defvar mew-prog-oasys mew-darwin-exec) (defvar mew-prog-octet-stream mew-darwin-exec) (defvar mew-prog-msword mew-darwin-exec) (defvar mew-prog-msexcel mew-darwin-exec) (defvar mew-prog-mspowerpoint mew-darwin-exec) (defvar mew-prog-visio mew-darwin-exec) (defvar mew-prog-ooffice mew-darwin-exec) (defvar mew-prog-rtf mew-darwin-exec) (defvar mew-prog-unzip mew-darwin-exec) ;;; ;;; Text/Html, Application/Xml, Image ;;; (defvar mew-format-html "%s.html") (defvar mew-format-xml "%s.xml") (defvar mew-prog-text/html (if (and (fboundp 'shr-render-region) (fboundp 'libxml-parse-html-region)) 'shr-render-region 'mew-mime-text/html-w3m)) ;; See w3m.el (defvar mew-prog-text/html-ext mew-darwin-exec) (defvar mew-prog-text/xml (if (and (fboundp 'shr-render-region) (fboundp 'libxml-parse-html-region)) 'shr-render-region 'mew-mime-text/html-w3m)) ;; See w3m.el (defvar mew-prog-text/xml-ext mew-darwin-exec) (defvar mew-prog-application/xml nil) (defvar mew-prog-application/xml-ext mew-darwin-exec) (defvar mew-prog-image/* 'mew-mime-image/*) (defvar mew-prog-image/*-ext mew-darwin-exec) (defvar mew-prog-application/msword nil) (defvar mew-prog-application/msexcel nil) (defvar mew-prog-application/mspowerpoint nil) (defvar mew-prog-application/rtf nil) ;; (setq mew-delete-temp-file nil) (defvar mew-dir-list-function 'mew-dir-list-with-link-count) (provide 'mew-darwin) ;;; Copyright Notice: ;; Copyright (C) 2002-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-darwin.el ends here kazu-yamamoto-Mew-ff9c41b/mew-decode.el000066400000000000000000001225351256455547000201160ustar00rootroot00000000000000;;; mew-decode.el --- MIME syntax decoder for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Decode info ;;; ;; limit: ;; Depth of RFC 822 messages. ;; The cnt starts with 0. ;; Decode if cnt <= limit ;; nil means that limit is 0. ;; ;; decode-text: ;; If t, decode a text MIME body. ;; Otherwise, it is treated as 'no-cs-conv ;; ;; decode-binary: ;; If t, decode a binary (non-text) MIME body. ;; ;; use-alt: ;; If t, one part in Multipart/Alternative is used. ;; Otherwise, it is treated as Multipart/Mixed. (defvar mew-dinfo-list '("limit" "decode-text" "decode-binary" "use-alt" "encap-html")) (mew-blinfo-defun 'mew-dinfo mew-dinfo-list) (defun mew-dinfo-set (lim dt db alt &optional encap) (mew-dinfo-set-limit lim) (mew-dinfo-set-decode-text dt) (mew-dinfo-set-decode-binary db) (mew-dinfo-set-use-alt alt) (mew-dinfo-set-encap-html encap)) (defun mew-cache-dinfo-get-use-alt (buf) (when buf (with-current-buffer buf (mew-dinfo-get-use-alt)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Decode switch ;;; (defvar mew-prog-mime-decode-switch `((,mew-b64 "-d" "-b") (,mew-qp "-d" "-q") (,mew-xg "-d" "-g") (,mew-xuu "-d" "-u"))) (defvar mew-prog-mime-decode-text-switch `((,mew-b64 "-d" "-b" "-t") (,mew-qp "-d" "-q") (,mew-xg "-d" "-g" "-t") (,mew-xuu "-d" "-u"))) (defun mew-prog-mime-decode-get-opt (cte switch) (cdr (mew-assoc-case-equal cte switch 0))) (defvar mew-decode-multipart-encrypted-switch `((,mew-ct-pge mew-pgp-decrypt mew-pgp-ver mew-prog-pgp))) (defvar mew-decode-multipart-signed-switch `((,mew-ct-pgs mew-pgp-verify mew-pgp-ver mew-prog-pgp) (,mew-ct-sms mew-smime-detach-verify mew-smime-ver mew-prog-smime) (,mew-ct-xsms mew-smime-detach-verify mew-smime-ver mew-prog-smime))) ;; (defun mew-decode-get-security-func (proto switch) (nth 1 (mew-assoc-case-equal proto switch 0))) (defun mew-decode-get-security-existence (proto switch) (symbol-value (nth 2 (mew-assoc-case-equal proto switch 0)))) (defun mew-decode-get-security-prog (proto switch) (symbol-value (nth 3 (mew-assoc-case-equal proto switch 0)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; MIME decoder ;;; (defun mew-decode-error (error-msg) (mew-xinfo-set-decode-err error-msg) (error error-msg)) (defun mew-decode-error2 (error-msg) (mew-xinfo-set-decode-err error-msg)) ;;; ;;; Decoding a header ;;; (defmacro mew-decode-narrow-to-header (&rest body) `(progn (if (re-search-forward mew-eoh nil t) (beginning-of-line) (goto-char (point-max)) (insert "\n")) (when (and (integerp mew-header-max-length) (> (count-lines (point-min) (point)) mew-header-max-length)) (mew-xinfo-set-action (mew-substitute-for-summary "Too long header. To see the message, type '\\[mew-summary-analyze-again]'")) (error "")) (save-restriction (narrow-to-region (point-min) (point)) (goto-char (point-min)) ,@body))) (defun mew-summary-toggle-header-veil () "If 'mew-use-header-veil' is non-nil, field lines of To: and Cc: over 'mew-header-veil-count' are covered with invisible veils. This commands toggles visibility of these lines." (interactive) (when (and mew-use-header-veil (get-buffer (mew-buffer-message))) (mew-summary-msg-or-part (with-current-buffer (mew-buffer-message) (when (mew-msghdr-p) (let* ((win (get-buffer-window (current-buffer))) (pos (window-start win))) (mew-toggle-header-veil (mew-minfo-get-veil-to)) (mew-toggle-header-veil (mew-minfo-get-veil-cc)) (set-window-start win pos))))))) (defun mew-header-veil-put (key ov) (let ((case-fold-search t) (regex (concat "^" key))) (goto-char (point-min)) (when (re-search-forward regex nil t) (beginning-of-line) (let ((start (point)) end) (forward-line) (mew-header-goto-next) (setq end (point)) (when (> (count-lines start end) mew-header-veil-count) (goto-char start) (forward-line mew-header-veil-count) (move-overlay ov (1- (point)) (1- end))))))) (defun mew-header-veil () (when mew-use-header-veil (unless (mew-minfo-get-veil-to) (mew-minfo-set-veil-to (mew-header-veil-make))) (unless (mew-minfo-get-veil-cc) (mew-minfo-set-veil-cc (mew-header-veil-make))) (mew-header-veil-put "To:" (mew-minfo-get-veil-to)) (mew-header-veil-put "Cc:" (mew-minfo-get-veil-cc)))) (defun mew-header-arrange (beg end) (let (vispos) (save-restriction (narrow-to-region beg end) (mew-elet (let (ch-beg ch-end vs-beg vs-end contents cbeg) (setq ch-beg (next-single-property-change (point-min) 'mew-noncontents)) (when ch-beg (setq vs-beg (next-single-property-change (point-min) 'mew-visible)) (cond (vs-beg (setq vs-end (next-single-property-change vs-beg 'mew-visible))) (mew-field-other-visible (setq vs-beg (next-single-property-change (point-min) 'mew-others)) (if vs-beg (setq vs-end (next-single-property-change vs-beg 'mew-others)) (setq vs-beg ch-beg) (setq vs-end ch-beg))) (t (setq vs-beg ch-beg) (setq vs-end ch-beg))) (setq ch-end (point-max)) (unless vs-end (setq vs-end (point-max))) (mew-decode-header-property-region ch-beg ch-end) ;; This must be "buffer-substring". (setq contents (buffer-substring ch-beg ch-end)) (delete-region ch-beg ch-end) (cond ((mew-nspec-visiblep (mew-nspec-by-key "Content-")) ;; visible (goto-char vs-end) (setq cbeg (point)) (insert contents) (put-text-property cbeg (point) 'mew-visible t)) ;; used later (t ;; invisible (goto-char vs-beg) (setq cbeg (point)) (insert contents))) (goto-char (point-max))) (mew-decode-syntax-insert-privacy) (mew-decode-syntax-insert-warning) (save-excursion (mew-highlight-x-face (point-min) (point-max))) (setq vispos (if (get-text-property (point-min) 'mew-visible) (point-min) (or (next-single-property-change (point-min) 'mew-visible) (point-max))))))) (mew-header-veil) (mew-header-goto-end) (if (eobp) (mew-header-set "\n") ;; analyzed (mew-header-set nil)) ;; asis ;; Emacs 21.3.50 or later need this. (set-window-start (selected-window) vispos))) (defun mew-decode-header-property-region (BEG END) ;; see also mew-highlight-header (when mew-use-highlight-header (mew-elet (let (key beg med nspec key-face val-face) (save-restriction (narrow-to-region BEG END) (goto-char (point-min)) (while (not (eobp)) (if (not (looking-at mew-keyval)) (forward-line) (setq key (mew-match-string 1)) (setq beg (match-beginning 0)) (setq med (match-end 0)) (forward-line) (setq nspec (mew-nspec-by-key key)) (setq key-face (mew-key-face key nspec)) (setq val-face (mew-val-face key nspec)) (put-text-property beg med 'face key-face) (put-text-property med (1- (point)) 'face val-face) (while (looking-at mew-lwsp+) (forward-line) (put-text-property (match-end 0) (1- (point)) 'face val-face))))))))) (defun mew-decode-rfc822-header (&optional cnt) "A function to handle RFC822 header. Called on the beginning of the header in the narrowed region. - Decode and highlight RFC822 fields excluding MIME fields. - Delete X-Mew: fields. - Arrange decoded-RFC822-fields, mew-mv:, MIME fields in order. The cursor moves between mew-mv: and MIME fields. Return the existence MIME-Version: and the value of Subject:." (let* ((case-fold-search t) (visibles (make-list (length mew-field-spec) nil)) (prop mew-use-highlight-header) key beg med subj from contents others key-face val-face N nspec visiblep mimep mimep2 size ext ext-str ext-face) (mew-decode-narrow-to-header (while (not (eobp)) (if (not (looking-at mew-keyval)) (forward-line) (setq key (mew-capitalize (mew-match-string 1))) (setq beg (match-beginning 0)) (setq med (match-end 0)) (forward-line) (mew-header-goto-next) (setq nspec (mew-nspec-by-key key)) (setq N (mew-nspec-n nspec)) (setq visiblep (mew-nspec-visiblep nspec)) (if (fboundp visiblep) (setq visiblep (funcall visiblep (mew-buffer-substring med (1- (point)))))) (cond ((string= key mew-x-mew:) ;; deleting X-Mew: on the RFC822 header (delete-region beg (point))) ((string= key mew-x-mew-uidl:) (setq size (mew-scan-uid-size (mew-buffer-substring med (1- (point))))) (when (and (eq cnt 1) (mew-msg-truncatedp size)) (mew-xinfo-set-action (mew-substitute-for-summary "Too large, truncated (the 'T' mark). To get the entire message, type '\\[mew-summary-retrieve-message]'")))) ((string-match "^Content-" key) ;; Due to PGP/MIME, properties are not put here. :; This must be "buffer-substring". (setq mimep2 t) (setq contents (cons (buffer-substring beg (point)) contents)) (delete-region beg (point))) (t ;; Let's decode the field anyway. ;; If a user want to preserve this RFC 822 header, he ;; set the limit, so never reaches here. ;; Moreover this function may be called with ;; mew-dinfo-set unset. (mew-header-decode-region key med (point)) (cond ((string= key mew-from:) (setq from (mew-addrstr-parse-address (mew-buffer-substring med (1- (point)))))) ((string= key mew-subj:) (setq subj (mew-buffer-substring med (1- (point))))) ((string= key mew-mv:) ;; MIME-Version: (setq mimep (string-match mew-mv:-num (or (mew-addrstr-parse-value (mew-buffer-substring med (point))) ""))))) (when prop (setq key-face (mew-key-face key nspec)) (setq val-face (mew-val-face key nspec)) (put-text-property beg med 'face key-face) (goto-char med) (forward-line) (put-text-property med (1- (point)) 'face val-face) (while (looking-at mew-lwsp+) (forward-line) (put-text-property (match-end 0) (1- (point)) 'face val-face)) (when (setq ext (mew-nspec-extraface nspec)) (save-restriction (narrow-to-region med (point)) (while ext ;; cannot use dolist (goto-char (point-min)) (setq ext-str (car ext)) (setq ext (cdr ext)) (setq ext-face (car ext)) (setq ext (cdr ext)) (while (re-search-forward ext-str nil t) (put-text-property (match-beginning 0) (match-end 0) 'face ext-face))) (goto-char (point-max))))) (cond ((null nspec) ;; others ;; This must be "buffer-substring". (setq others (cons (buffer-substring beg (point)) others)) (delete-region beg (point))) (visiblep ;; This must be "buffer-substring". (setcar (nthcdr N visibles) (concat (nth N visibles) (buffer-substring beg (point)))) (delete-region beg (point))) (t ;; invisible ()))))))) (put-text-property (point-min) (point) 'mew-invisible t) (put-text-property (point-min) (point) 'mew-noncontents t) (unless mew-field-other-visible (setq beg (point)) (mapc 'insert (nreverse others)) (put-text-property beg (point) 'mew-others t) (put-text-property beg (point) 'mew-noncontents t)) (setq beg (point)) (mapc (lambda (x) (and (stringp x) (insert x))) visibles) ;; for recenter in Message mode (put-text-property beg (point) 'mew-visible t) (put-text-property beg (point) 'mew-noncontents t) (mew-rear-nonsticky beg (point)) (when mew-field-other-visible (setq beg (point)) (mapc 'insert (nreverse others)) (put-text-property beg (point) 'mew-others t) (put-text-property beg (point) 'mew-noncontents t) (mew-rear-nonsticky beg (point))) ;; the beginning of the content header (save-excursion (mapc 'insert (nreverse contents))) ;; 'mew-contents does not work due to PGP/MIME (if (and (null mimep) mimep2) (mew-xinfo-set-warning (cons "No MIME-Version\n" (mew-xinfo-get-warning)))) (list (or mimep mimep2) subj from))) (defun mew-decode-mime-header (&optional dct) "A function to handle content header. Called on the beginning of the content header in the narrowed region Return a part syntax after moving the beginning of the content body." (let ((case-fold-search t) (vec (make-vector (length mew-mime-fields) nil)) key med attr n act value syntax) (mew-decode-narrow-to-header (while (not (eobp)) (if (not (looking-at mew-keyval)) (forward-line) (setq key (mew-capitalize (mew-match-string 1))) (setq med (match-end 0)) (forward-line) (mew-header-goto-next) (setq attr (assoc key mew-mime-fields)) (when attr (mew-set '(nil n act) attr) (cond ((eq act 'analyze) (setq value (mew-param-decode (mew-buffer-substring med (1- (point)))))) ((eq act 'extract) (setq value (mew-addrstr-parse-value (mew-buffer-substring med (1- (point)))))) ((eq act 'decode) ;; If a user want to preserve this MIME header, he ;; set the limit, so never reaches here. (mew-header-decode-region key med (point)) ;; mew-header-decode-region goes to the max point in ;; the narrowed region. So, this must be (point). (setq value (mew-buffer-substring med (1- (point))))) ((eq act 'id) (setq value (mew-buffer-substring med (1- (point)))) (setq value (mew-idstr-get-first-id value)))) (aset vec n value))))) (if (eobp) (insert "\n") (forward-line)) ;; the beginning of the content body (setq syntax (vconcat (list 'single (point) nil nil) vec)) (or (mew-syntax-get-ct syntax) (mew-syntax-set-ct syntax (or dct mew-type-txt))) syntax)) ;;; ;;; Decoding a message ;;; (defun mew-decode () "Decode a message. Execute mew-dinfo-set before calling this." ;; in cache buffer (mew-set-buffer-multibyte t) ;; ;; Illegal messages may not have end-of-header. ;; Truncated messages may not have end-of-header. ;; (goto-char (point-min)) ;; just in case (unless (re-search-forward mew-eoh nil t) (goto-char (point-max)) (if (not (bolp)) (insert "\n")) (insert "\n")) (goto-char (point-min)) ;; (if (mew-debug 'decode) (let ((debug-on-error t)) (setq mew-decode-syntax (mew-decode-message (mew-decode-syntax-rfc822-head) 0))) (condition-case nil (setq mew-decode-syntax (mew-decode-message ;; Call internalform with VIRTUAL content header ;; CT: message/rfc822 (virtual) ;; ;; Header(RFC822 header + content header) ;; ;; Body(content body) (mew-decode-syntax-rfc822-head) 0)) (error (widen) (mew-header-goto-body) ;; min, point - 1, point, point-max (setq mew-decode-syntax (mew-decode-syntax-rfc822)))))) (defun mew-decode-message (syntax cnt) ;; Called on the beginning of the RFC822 header in the narrowed region ;; hbeg is certainly the beginning of the VIRTUAL content body(i.e. min). ;; hend will have to set to the end of PHYSICAL content header(i.e. end) ;; after analyzing the physical content header and body since CD:'s ;; length in the physical content header will change(no need to say ;; about the end of the physical content header). ;; ;; Content-Type: Message/Rfc822 == virtual content header ;; ;;(min)Decoded RFC822 fields == virtual content body ;; MIME-Version: 1.0 ;;(cur)MIME fields == physical content header ;;(end) ;; Content-Body == physical content body ;;(max) (setq cnt (1+ cnt)) (cond ((and (mew-dinfo-get-limit) (> cnt (mew-dinfo-get-limit))) ;; Don't analyze recursively. ;; We need to analyze the header and the body since a user ;; may want to save the body only. ;; the beginning of the meaningless physical content header (if (re-search-forward mew-eoh nil t) (forward-line) (mew-decode-error "No end-of-header(null line) in RFC822 message")) ;; the beginning of the BODY(i.e. the physical content body) (mew-syntax-set-key syntax 'message) (mew-syntax-set-end syntax (1- (point))) ;; (point-min), (point) - 1, (point), (point-max) (mew-decode-syntax-rfc822 syntax)) ;; return value (t ;; Analyze recursively. (let* ((msf (mew-decode-rfc822-header cnt)) ;; on the physical (mimep (nth 0 msf)) (subj (nth 1 msf)) (mew-inherit-decode-signer (nth 2 msf)) ;; signature verification part) ;; the beginning of the physical content header (cur) (cond (mimep ;; MIME (save-restriction (narrow-to-region (point) (point-max)) (setq part (mew-decode-singlepart cnt nil 'message)) ;; hend is always 1 char smaller than the beginning of ;; the physical content body. ;; If multipart/alternative mew-syntax-get-begin2 gets ;; correct value like other cases. (mew-syntax-set-key syntax 'message) (mew-syntax-set-end syntax (1- (mew-syntax-get-begin2 part))) (or (mew-syntax-get-cd syntax) (mew-syntax-set-cd syntax subj)) (mew-syntax-cat syntax part))) ;; return value (t ;; RFC822 ;; the beginning of the meaningless physical content header (if (re-search-forward mew-eoh nil t) (forward-line) (mew-decode-error "No end-of-header(null line) in RFC822 message")) ;; the beginning of the BODY(i.e. the physical content body) (if (eq (mew-dinfo-get-decode-text) t) ;; not 'no-cs-conv (mew-cs-decode-region (point) (point-max) mew-cs-autoconv)) (mew-syntax-set-key syntax 'message) (mew-syntax-set-end syntax (1- (point))) (or (mew-syntax-get-cd syntax) (mew-syntax-set-cd syntax subj)) ;; (point-min), (point) - 1, (point), (point-max) (mew-highlight-body-region (point) (point-max)) (mew-decode-syntax-rfc822 syntax (not (mew-xinfo-get-text-body))))))))) ;; return value ;;; ;;; Decoding singlepart ;;; (defun mew-decode-mime-body (textp ct cte &optional charset) ;; ((point), (point-max)) (not point-min) (let* ((linebasep (mew-ct-linebasep ct)) (beg (point)) opt file decoded switch) (unless (or (null cte) (mew-cte-composite-p cte)) (when (and (mew-case-equal cte mew-b64) (fboundp 'base64-decode-region)) (condition-case nil (setq decoded (base64-decode-region beg (point-max))) (error (setq decoded nil))) (when (and decoded linebasep) (goto-char beg) (mew-crlf-to-lf))) ;; base64-decode-region may fail if garbage exists. (cond (decoded ()) ((mew-which-exec mew-prog-mime-decode) (setq switch (if linebasep mew-prog-mime-decode-text-switch mew-prog-mime-decode-switch)) (setq opt (mew-prog-mime-decode-get-opt cte switch)) (if (null opt) ;; Treated as Application/Octet-Stream. ;; Never reach here when decoding. (mew-decode-error (concat "Unknown CTE: " cte)) (setq file (mew-make-temp-name)) (mew-frwlet mew-cs-dummy (if linebasep mew-cs-text-for-write mew-cs-text-for-net) ;; Due to broken MUAs, we need to write CRLF. ;; NEVER use call-process-region for privacy reasons (write-region beg (point-max) file nil 'no-msg)) (delete-region beg (point-max)) (mew-piolet mew-cs-binary mew-cs-dummy ;; mew-prog-mime-decode converts CRLF to LF, so ;; read input as binary. (apply 'call-process mew-prog-mime-decode file '(t nil) nil opt)) (mew-delete-file file))) (t (mew-decode-error (concat mew-prog-mime-decode " does not exist"))))) ;; charset conversion (if (and textp (eq (mew-dinfo-get-decode-text) t)) ;; not 'no-cs-conv (mew-decode-charset-conv charset beg)))) (defun mew-decode-charset-conv (charset beg) (let* ((fromcs (and charset (mew-charset-to-cs charset)))) ;; fromcs is nil if charset is "us-ascii" ;; (mew-coding-system-p nil) returns t. (unless (mew-coding-system-p fromcs) (mew-decode-warning-body 'unknown-charset charset)) (when (and mew-use-autoconv-when-unknown (not (mew-coding-system-p fromcs))) (setq fromcs mew-cs-autoconv)) (when (and mew-decode-broken (not (eq fromcs mew-cs-autoconv)) (or (null charset) (mew-case-equal charset mew-us-ascii))) ;; anyway (goto-char beg) (when (re-search-forward mew-regex-esc-or-nonascii nil t) (mew-decode-warning-body 'no-charset charset) (setq fromcs mew-cs-autoconv)) (goto-char beg)) (when (and mew-decode-broken (not (eq fromcs mew-cs-autoconv)) (or (null charset) (mew-case-equal charset mew-us-ascii) (mew-case-equal charset mew-utf-8))) (goto-char beg) (when (re-search-forward mew-regex-singlebyte-nonascii nil t) (mew-decode-warning-body 'no-charset charset) (setq fromcs mew-cs-autoconv)) (goto-char beg)) (if (mew-coding-system-p fromcs) (mew-cs-decode-region beg (point-max) fromcs)))) (defun mew-decode-singlepart (cnt &optional dct parent) ;; Called on the beginning of the content header in the narrowed region (let* ((case-fold-search t) (begin (point)) (syntax (mew-decode-mime-header dct)) (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap)) (textp (mew-ct-textp ct)) (cte (or (mew-syntax-get-cte syntax) mew-7bit)) (multi-err t) (encap nil) type hend format delsp) ;; the beginning of the content body (cond ((not (mew-cte-p cte)) (mew-syntax-set-ct syntax mew-type-apo) (if (eq parent 'message) (setq encap t))) ((mew-ct-messagep ct) (if (not (mew-cte-composite-p cte)) (mew-syntax-set-ct syntax mew-type-apo) (cond ((string= mew-ct-msg ct) (if (eq parent 'message) (setq encap t)) (save-restriction (narrow-to-region (point) (point-max)) (setq syntax (mew-decode-message syntax cnt)))) ((string= mew-ct-ext ct) (let* ((at (mew-syntax-get-param ctl "access-type")) (func (mew-ext-include-get-func at))) (when (and func (fboundp func)) (save-excursion (goto-char (point-max)) ;; phantom body (funcall func ctl)) (delete-region begin (point)) (setq syntax (mew-decode-singlepart cnt))))) ((string= mew-ct-sts ct) ;; do nothing ) (t ;; xxx how about message/partial? (mew-syntax-set-ct syntax mew-type-apo) )))) ((or (string= ct mew-ct-smm) (string= ct mew-ct-xsmm)) (mew-decode-mime-body nil ct cte) (mew-syntax-set-end syntax (point-max)) (setq syntax (mew-decode-smime syntax cnt))) ;; Multipart, decoding is not required ((mew-ct-multipartp ct) (if (mew-cte-composite-p cte) (setq multi-err nil) (mew-decode-warning-body 'multi cte) (if mew-decode-broken (setq multi-err nil))) (if multi-err (mew-syntax-set-ct syntax mew-type-apo) (cond ((string= mew-ct-mld ct) ;; semantics into digest (setq syntax (mew-decode-multipart syntax cnt mew-type-msg))) ((string= mew-ct-mls ct) (setq syntax (mew-decode-multipart-signed syntax cnt))) ((string= mew-ct-mle ct) ;; xxx making use of password cache? (if mew-inherit-prefetching (signal 'quit "") (setq syntax (mew-decode-multipart-encrypted syntax cnt)))) (t (setq syntax (mew-decode-multipart syntax cnt nil)))))) ;; Others ((string= mew-ct-trh ct) (save-restriction ;; Eliminating the content the header so that Rfc822 header ;; comes the beginning. (narrow-to-region (point) (point-max)) (mew-decode-rfc822-header))) (t (if (and (eq parent 'message) (or (not (mew-xinfo-get-text-body)) (if (mew-dinfo-get-encap-html) (not (string= ct mew-ct-txt)) (not textp)))) (setq encap t)) ;; even if cte is nil, call mew-decode-mime-body for charset conversion (if textp (if (mew-dinfo-get-decode-text) (let ((charset (mew-syntax-get-param ctl "charset"))) (mew-decode-mime-body t ct cte charset))) (if (mew-dinfo-get-decode-binary) (mew-decode-mime-body nil ct cte))))) ;; ct may be changed to apo ;; or single in multipart/alternative ;; or single in multipart/security (setq type (mew-syntax-get-value (mew-syntax-get-ct syntax) 'cap)) (setq hend (mew-syntax-get-end syntax)) (unless hend (mew-syntax-set-end syntax (point-max))) (when (and (string= type mew-ct-txt) (setq format (mew-syntax-get-param ctl "format")) (mew-case-equal format "flowed")) (setq delsp (mew-syntax-get-param ctl "delsp")) (if (and delsp (mew-case-equal delsp "yes")) (setq delsp t) (setq delsp nil)) (mew-decode-flowed (mew-syntax-get-begin syntax) (point-max) delsp) (setq hend nil)) ;; highlight in the cache buffers only (when (and (string= type mew-ct-txt) (string-match mew-buffer-cache-prefix (buffer-name))) (mew-highlight-body-region (mew-syntax-get-begin syntax) (point-max))) (unless hend (mew-syntax-set-end syntax (point-max))) ;; ajusting (if encap ;; Mew allows text/plain and multipart/* for body. ;; If other CT: is embedded under message, it should be ;; encapsulated in multipart/mixed. (let ((head (mew-decode-syntax-multi-head))) ;; begin for multipart syntax is important because ;; the begin will be used by the parent to set hend (mew-syntax-set-begin head (mew-syntax-get-begin syntax)) (mew-syntax-set-end head (point-max)) (mew-syntax-cat head syntax)) ;; return value ;; return value syntax))) (defun mew-decode-flowed-level () (cond ((looking-at "^$") -1) ((looking-at "^>*") (let ((level (- (match-end 0) (match-beginning 0)))) (goto-char (match-end 0)) ;; we don't remove space-stuff after > (if (and (/= level 0) (looking-at " ")) (forward-char)) level)))) (defconst mew-flowed-quoted ?>) (defconst mew-flowed-stuffed mew-sp) (defconst mew-flowed-break mew-sp) (defconst mew-flowed-netnews "-- ") (defvar mew-flowed-broken-list '("----- Original Message ----- ")) ;; OE (defun mew-decode-flowed (beg end delsp) "Decoding wrapped lines encoded with RFC 3676" (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (let (level prev-level softbreak) (setq level (mew-decode-flowed-level)) (if (= level 0) (mew-decode-flowed-remove-stuffed)) (setq softbreak (mew-decode-flowed-soft-breakp delsp)) (while (= (forward-line) 0) (setq prev-level level) (setq level (mew-decode-flowed-level)) (cond ((and (= prev-level level) softbreak) (mew-decode-flowed-remove-quoted-stuffed softbreak)) (t (if (= level 0) (mew-decode-flowed-remove-stuffed)))) (setq softbreak (mew-decode-flowed-soft-breakp delsp)))))) (defun mew-decode-flowed-remove-quoted-stuffed (beg) (delete-region beg (point))) (defun mew-decode-flowed-remove-stuffed () (if (and (char-after) (char-equal (char-after) mew-flowed-stuffed)) (delete-char 1))) (defun mew-decode-flowed-soft-breakp (delsp) (let ((beg (point)) line) (end-of-line) (setq line (mew-buffer-substring beg (point))) (if (string= line mew-flowed-netnews) nil (if (and mew-decode-broken (member line mew-flowed-broken-list)) (progn (mew-xinfo-set-warning (cons "Illegal flowed lines\n" (mew-xinfo-get-warning))) nil) (if (and (char-before) (char-equal (char-before) mew-flowed-break)) (if delsp (1- (point)) (point)) nil))))) ;;; ;;; Decoding multipart ;;; (defun mew-decode-multipart-boundary-regex (boundary) ;; for broken MUAs which uses non-ASCII boundaries ;; This works only on Emacs 21. (let ((mboundary (mew-set-string-multibyte boundary))) ;; Some MUAs use invalid character like "<>". (when (or (string-match "[!-&*;<>@[-^`{-~]" mboundary) (not (string= mboundary boundary))) (if mew-decode-broken (mew-decode-warning-params "boundary" 'char) (mew-decode-error "Boundary has invalid character"))) (concat "^--" (regexp-quote mboundary) "\\(--\\|\\)[ \t]*$"))) (defun mew-decode-multipart-end-boundary-regex (boundary) (let ((mboundary (mew-set-string-multibyte boundary))) (concat "^--" (regexp-quote mboundary) "--[ \t]*$"))) (defun mew-decode-multipart-boundary-cont () (string= (mew-match-string 1) "")) (defun mew-decode-multipart-boundary-end () (string= (mew-match-string 1) "--")) (defun mew-decode-multipart-beginning-of-first-part (bregex ct) ;; RFC 2046 says, "An exact match of the entire candidate ;; line is not required; it is sufficient that the boundary ;; appear in its entirety following the CRLF". (unless (and (re-search-forward bregex nil t) (mew-decode-multipart-boundary-cont)) (mew-decode-error (format "No first boundary for %s" ct))) (forward-line)) ;; the beginning of the first part (defun mew-decode-multipart-beginning-of-part (break) (if break () ;; close-delimiter need not be followed by CRLF (forward-line))) ;; the beginning of the next part (defun mew-decode-multipart-end-of-part (break) (unless break (forward-line -1)) (beginning-of-line) (forward-char -1) ;; skip the preceding CRLF ;; the end of the part ) (defun mew-decode-multipart-singlepart (break start cnt dct) (save-excursion (mew-decode-multipart-end-of-part break) (save-restriction (narrow-to-region start (point)) (goto-char (point-min)) ;; the beginning of the part (mew-decode-singlepart cnt dct nil)))) (defun mew-decode-multipart-duplicate-boundary (start cnt dct err boundary bregex) (if (not (string-match "^No first boundary" (nth 1 err))) (error "") ;; duplicate boundary error recovering, sigh (widen) ;; breaking save-restriction (goto-char start) ;; breaking save-excursion (let ((eregex (mew-decode-multipart-end-boundary-regex boundary)) break part) (if (not (and (re-search-forward eregex nil t) (forward-line) (re-search-forward bregex nil t))) (error "") (mew-xinfo-set-warning (cons "Duplicate boundary\n" (mew-xinfo-get-warning))) (mew-xinfo-set-decode-err nil) (setq break (mew-decode-multipart-boundary-end)) (mew-decode-multipart-beginning-of-part break) (setq part (mew-decode-multipart-singlepart break start cnt dct)) (list part break))))) (defun mew-decode-multipart-alternative-choice (part prefpart lastpref lastatpref) (let ((pref (or (mew-multipart-alternative-preference part) (length mew-mime-multipart-alternative-list))) (atpref (mew-mime-external-body-preference part))) ;; returns '(prefpart lastpref lastatpref) (cond ((or (null prefpart) (<= pref lastpref)) (list part pref atpref)) ((and (= pref lastpref) atpref (or (null lastatpref) (<= atpref lastatpref))) ;; If external-body and internal-body are alternative, ;; what should we do? (list part lastpref atpref)) (t (list prefpart lastpref lastatpref))))) (defun mew-decode-multipart-alternative-part (prefpart syntax) (let* ((beg (mew-syntax-get-begin prefpart)) (ctl (mew-syntax-get-ct prefpart)) (ct (mew-syntax-get-value ctl 'cap)) (multibeg (mew-syntax-get-begin syntax))) (mew-syntax-set-begin prefpart (cons beg multibeg)) (mew-xinfo-set-info (cons (format "%s in Multipart/Alternative as a singlepart\n" ct) (mew-xinfo-get-info))) prefpart)) (defun mew-decode-multipart (syntax cnt &optional dct) (let* ((case-fold-search nil) ;; boundary is case sensitive (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap)) (boundary (mew-syntax-get-param ctl "boundary")) (count 0) (parts []) part (use-alt (and (mew-dinfo-get-use-alt) (string= ct mew-ct-mla))) prefpart lastpref lastatpref bregex start break) (unless boundary (mew-decode-error "No boundary parameter for multipart")) (mew-syntax-set-key syntax 'multi) (setq bregex (mew-decode-multipart-boundary-regex boundary)) (mew-decode-multipart-beginning-of-first-part bregex ct) (setq start (point)) ;; the beginning of the first part (catch 'multipart (while (re-search-forward bregex nil t) (setq break (mew-decode-multipart-boundary-end)) (mew-decode-multipart-beginning-of-part break) (condition-case err (setq part (mew-decode-multipart-singlepart break start cnt dct)) (error ;; rescue duplicate boundary (let ((pb (mew-decode-multipart-duplicate-boundary start cnt dct err boundary bregex))) (mew-set '(part break) pb)))) (setq count (1+ count)) (setq start (point)) ;; the beginning of the part (if use-alt (let ((pll (mew-decode-multipart-alternative-choice part prefpart lastpref lastatpref))) (mew-set '(prefpart lastpref lastatpref) pll)) (setq parts (vconcat parts (vector part)))) (when break (if use-alt (throw 'multipart (mew-decode-multipart-alternative-part prefpart syntax)) (throw 'multipart (vconcat syntax parts))))) ;; Let's try to decode the first part even if boundary is not found. ;; This should save truncated messages. (when (= count 0) (save-restriction (narrow-to-region start (point-max)) (goto-char (point-min)) (mew-decode-singlepart cnt dct nil))) (mew-decode-error (format "No last boundary for %s" ct))))) ;;; ;;; Privacy services ;;; (mew-defstruct privacy-dinfo ct proto result) (defun mew-decode-multipart-encrypted (syntax cnt) ;; called in narrowed region ;; ;; CT: M/E; proto; bound; ;; ;;(cur)--bound ;; (the key part) ;; --bound ;; (the encrypted part) ;; --bound-- (let* ((case-fold-search nil) ;; boundary is case sensitive (ctl (mew-syntax-get-ct syntax)) (boundary (mew-syntax-get-param ctl "boundary")) (switch mew-decode-multipart-encrypted-switch) file1 file2 file3 syntax1 syntax3 func unknown existp proto start result file3result privacy bregex) (unless boundary (mew-decode-error "No boundary parameter for multipart")) (setq bregex (mew-decode-multipart-boundary-regex boundary)) ;; (unless (and (re-search-forward bregex nil t) (mew-decode-multipart-boundary-cont)) (mew-decode-error "No first boundary for Multipart/Encrypted")) (forward-line) ;; the beginning of the key part (setq start (point)) ;; (unless (and (re-search-forward bregex nil t) (mew-decode-multipart-boundary-cont)) (mew-decode-error "No second boundary for Multipart/Encrypted")) (beginning-of-line) (setq syntax1 (mew-decode-security-singlepart start (1- (point)))) (setq proto (mew-syntax-get-value (mew-syntax-get-ct syntax1) 'cap)) (setq func (mew-decode-get-security-func proto switch)) (setq existp (mew-decode-get-security-existence proto switch)) (if func (if existp (setq file1 (mew-save-decode-form syntax1))) (setq unknown t)) (forward-line) ;; the beginning of the encrypted part (setq start (point)) ;; (unless (and (re-search-forward bregex nil t) (mew-decode-multipart-boundary-end)) (mew-decode-error "No third boundary for Multipart/Encrypted")) (beginning-of-line) (if (and func existp) (setq file2 (mew-save-decode-form (mew-decode-security-singlepart start (1- (point)))))) ;; (delete-region (point-min) (point-max)) ;; ;; Call protocol function (cond (unknown (setq result (concat "unknown protocol " proto))) ((not existp) (setq result (concat (mew-decode-get-security-prog proto switch) " does not exist"))) (t (setq file3result (funcall func file1 file2)) (mew-set '(file3 result) file3result))) ;; (if (and func existp (file-exists-p file3)) (mew-flet (mew-insert-file-contents file3) (put-text-property (point-min) (point-max) 'mew-noncontents nil) ;; because of RICH functionality of RFC1847... Gee dirty! (mew-decode-crlf-magic)) (insert "\n") ;; CT: text/plain; charset=us-ascii (insert "Multipart/Encrypted could not be decrypted.\n") (mew-xinfo-set-not-decrypted t)) ;; Throw away garbage (mew-delete-file file1) (mew-delete-file file2) (mew-delete-file file3) ;; Analyze the decrypted part (goto-char (point-min)) (setq syntax3 (mew-decode-singlepart cnt nil nil)) (setq privacy (mew-syntax-get-privacy syntax3)) (if privacy (setq result (concat result "\n\t"))) (mew-syntax-set-privacy syntax3 (cons (mew-make-privacy-dinfo :ct mew-ct-mle :proto proto :result result) privacy)) syntax3)) (defun mew-decode-multipart-signed (syntax cnt) ;; called in narrowed region ;; ;; CT: M/S; proto; bound; micalg; ;; ;;(cur)--bound ;; (the signed part) ;; --bound ;; (the key part) ;; --bound-- (let* ((case-fold-search nil) ;; boundary is case sensitive (ctl (mew-syntax-get-ct syntax)) (boundary (mew-syntax-get-param ctl "boundary")) (switch mew-decode-multipart-signed-switch) file1 file2 syntax2 syntax3 func unknown existp proto end1 start2 result privacy bregex) (unless boundary (mew-decode-error "No boundary parameter for multipart")) (setq bregex (mew-decode-multipart-boundary-regex boundary)) ;; (unless (and (re-search-forward bregex nil t) (mew-decode-multipart-boundary-cont)) (mew-decode-error2 "No first boundary for Multipart/Signed")) (forward-line) ;; the beginning of the signed part (delete-region (point-min) (point)) ;; deleting content-header (goto-char (point-min)) ;; just in case ;; (unless (and (re-search-forward bregex nil t) (mew-decode-multipart-boundary-cont)) (mew-decode-error2 "No second boundary for Multipart/Signed")) (beginning-of-line) (setq end1 (1- (point))) ;; the end of the signed part (forward-line) ;; the beginning of the key part (setq start2 (point)) ;; (unless (and (re-search-forward bregex nil t) (mew-decode-multipart-boundary-end)) (mew-decode-error2 "No third boundary for Multipart/Signed")) (beginning-of-line) ;; the end of the encrypted part + 1 (setq syntax2 (mew-decode-security-singlepart start2 (1- (point)))) (setq proto (mew-syntax-get-value (mew-syntax-get-ct syntax2) 'cap)) (setq func (mew-decode-get-security-func proto switch)) (setq existp (mew-decode-get-security-existence proto switch)) (if func (when existp (setq file1 (mew-save-transfer-form (point-min) end1 'retain)) (setq file2 (mew-save-decode-form syntax2 (concat file1 ".sig")))) (setq unknown t)) ;; (delete-region end1 (point-max)) ;; Now the signed part only ;; Call protocol function (cond (unknown (setq result (concat "unknown protocol " proto))) ((not existp) (setq result (concat (mew-decode-get-security-prog proto switch) " does not exist"))) (t (setq result (funcall func file1 file2)))) ;; Throw away garbage (mew-delete-file file1) (mew-delete-file file2) ;; Analyze the signed part (goto-char (point-min)) (setq syntax3 (mew-decode-singlepart cnt nil nil)) (setq privacy (mew-syntax-get-privacy syntax3)) (if privacy (setq result (concat result "\n\t"))) (mew-syntax-set-privacy syntax3 (cons (mew-make-privacy-dinfo :ct mew-ct-mls :proto proto :result result) privacy)) syntax3)) (defun mew-decode-security-singlepart (beg end) (save-excursion (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (mew-decode-singlepart 0)))) ;; 0 is dummy (defun mew-save-decode-form (syntax &optional file) (mew-flet (unless file (setq file (mew-make-temp-name))) (write-region (mew-syntax-get-begin syntax) (mew-syntax-get-end syntax) file nil 'no-msg) file)) (defun mew-decode-crlf-magic () (let ((case-fold-search t) (cte mew-7bit) key start match) (save-excursion (goto-char (point-min)) (catch 'header (while (re-search-forward "^\r?$\\|^Content-Transfer-Encoding:[ \t]*" nil t) (setq key (mew-match-string 0)) (setq start (match-end 0)) (when (string-match "^\r?$" key) (save-restriction (if (string-match mew-bin cte) ;; cte may include \r (narrow-to-region (point-min) (1+ start)) (narrow-to-region (point-min) (point-max))) (goto-char (point-min)) (mew-crlf-to-lf)) (throw 'header nil)) (forward-line) (mew-header-goto-next) (setq match (mew-buffer-substring start (1- (point)))) (setq cte (mew-addrstr-parse-value match))))))) (provide 'mew-decode) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-decode.el ends here kazu-yamamoto-Mew-ff9c41b/mew-demo.el000066400000000000000000000106021256455547000176060ustar00rootroot00000000000000;;; mew-demo.el --- Startup demo for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew-vars) (defvar mew-logo nil) (defconst mew-icon-mew "Mew.png") (defconst mew-hello-message " Welcome to Mew world. Mew -- Messaging in the Emacs World %s Copyright (C) 1994-2015 Kazu Yamamoto Please send comments to Kazu@Mew.org. " ) (defconst mew-demo-string '( "/\\\\ - \\\\/" "-\\\\ - \\\\/" "\\\\\\ - \\\\/" "|\\\\ - \\\\/" "/\\\\ - \\\\/" "-\\\\ - \\\\/" "\\\\\\ - \\\\/" "|\\\\ - \\\\/" "/\\\\ - \\\\/" "/|\\ - \\\\/" "//\\ - \\\\/" "/-\\ - \\\\/" "/\\\\ - \\\\/" "/|\\ - \\\\/" "//\\ - \\\\/" "/-\\ - \\\\/" "/\\\\ - \\\\/" "/\\| - \\\\/" "/\\/ - \\\\/" "/\\- - \\\\/" "/\\\\ - \\\\/" "/\\| - \\\\/" "/\\/ - \\\\/" "/\\- - \\\\/" "/\\\\ - \\\\/" "/\\\\ - |\\/" "/\\\\ - /\\/" "/\\\\ - -\\/" "/\\\\ - \\\\/" "/\\\\ - |\\/" "/\\\\ - /\\/" "/\\\\ - -\\/" "/\\\\ - \\\\/" "/\\\\ - \\|/" "/\\\\ - \\//" "/\\\\ - \\-/" "/\\\\ - \\\\/" "/\\\\ - \\|/" "/\\\\ - \\//" "/\\\\ - \\-/" "/\\\\ - \\\\/" "/\\\\ - \\\\-" "/\\\\ - \\\\\\" "/\\\\ - \\\\|" "/\\\\ - \\\\/" "/\\\\ - \\\\-" "/\\\\ - \\\\\\" "/\\\\ - \\\\|" "/\\\\ - \\\\/" ) ) (defun mew-hello () (let ((time mew-demo-sit-for) (left-margin 0) (fill-column (window-width)) indent) (if (not (integerp time)) (setq time 0)) (insert (format mew-hello-message mew-version)) (center-region (point-min) (point-max)) (if (null mew-demo-picture) (mew-hello-text time) (cond ((and window-system (fboundp 'image-type-available-p) (image-type-available-p 'png)) (goto-char (point-max)) (setq mew-logo (mew-create-image (expand-file-name mew-icon-mew mew-icon-directory))) (setq indent (/ (- (window-width) (truncate (car (image-size mew-logo)))) 2)) (setq indent (max 0 indent)) (insert (make-string indent mew-sp)) (insert-image mew-logo) (goto-char (point-min)) (mew-redraw time)) (t (mew-hello-text time))) (set-buffer-modified-p nil)))) (defun mew-hello-text (time) (insert "/\\\\ - \\\\/") (center-line) (end-of-line) (insert (make-string (1- (- (window-width) (current-column))) mew-sp)) (end-of-line) (mew-redraw time) (if (and mew-demo window-system) (mew-demo))) (defun mew-demo (&optional string) (let* ((strs (or string mew-demo-string)) (wl (window-width)) (ul (length (regexp-quote "/\\ - \\/"))) (pl (/ (- wl ul) 2)) (pre (make-string pl mew-sp)) (suf (make-string (1- (- (- wl pl) ul)) mew-sp))) (save-window-excursion (dolist (str strs) (mew-demo-print str pre suf) (mew-demo-loop))))) (defun mew-demo-print (string prefix suffix) (goto-char (point-max)) (let ((end (point))) (beginning-of-line) (delete-region (point) end)) (insert prefix string suffix)) (defun mew-demo-loop () (mew-redraw 0.02)) (provide 'mew-demo) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-demo.el ends here kazu-yamamoto-Mew-ff9c41b/mew-draft.el000066400000000000000000001071051256455547000177670ustar00rootroot00000000000000;;; mew-draft.el --- Draft mode for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Draft info ;;; (defvar mew-tinfo-list '("header-keymap" "attach-keymap" "case" "encrypted-p" "privacy-err" "encode-err" "privacy-type" "hdr-file" "field-del" "other-frame" "preserved-header" "src-folder" "flowed" "use-flowed")) (mew-blinfo-defun 'mew-tinfo mew-tinfo-list) (defvar mew-draft-mode-syntax-table nil "*Syntax table used while in Draft mode.") (unless mew-draft-mode-syntax-table (setq mew-draft-mode-syntax-table (make-syntax-table text-mode-syntax-table)) (modify-syntax-entry ?% "." mew-draft-mode-syntax-table)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Draft mode ;;; (defun mew-draft-set-local-variables () (auto-save-mode mew-draft-mode-auto-save) (make-local-variable 'completion-ignore-case) (make-local-variable 'paragraph-start) (setq paragraph-start (concat mew-eoh "\\|[ \t]*$\\|" page-delimiter)) (make-local-variable 'paragraph-separate) (setq paragraph-separate paragraph-start) (make-local-variable 'mail-header-separator) (setq mail-header-separator mew-header-separator) (make-local-variable 'comment-start) (setq comment-start mew-comment-start) (make-local-variable 'comment-start-skip) (setq comment-start-skip mew-comment-start-skip) (add-hook 'after-change-functions 'mew-draft-dynamic-highlight nil 'local) (if (boundp 'write-file-functions) (add-hook 'write-file-functions 'mew-encode-make-backup nil 'local) (add-hook 'local-write-file-hooks 'mew-encode-make-backup)) (make-local-variable 'after-save-hook) (when mew-require-final-newline (make-local-variable 'require-final-newline) (setq require-final-newline t)) (when (featurep 'dnd) (make-local-variable 'dnd-protocol-alist) (setq dnd-protocol-alist (append '(("^file:///" . mew-draft-dnd-handle-local-file) ("^file://" . mew-draft-dnd-handle-file) ("^file:" . mew-draft-dnd-handle-local-file)) dnd-protocol-alist)))) (defun mew-draft-mode (&optional encrypted) "A major mode for composing a MIME message. \\{mew-draft-mode-map}" (interactive) (setq major-mode 'mew-draft-mode) (setq mode-line-buffer-identification (mew-mode-line-id)) (mew-draft-set-local-variables) (use-local-map mew-draft-mode-map) (set-syntax-table mew-draft-mode-syntax-table) (cd (expand-file-name mew-home)) (mew-draft-setup-decoration) (mew-ainfo-set-icon (file-name-nondirectory (buffer-file-name))) (mew-tinfo-set-encrypted-p encrypted) (mew-tinfo-set-privacy-err nil) (mew-tinfo-set-privacy-type nil) (mew-tinfo-set-use-flowed (mew-use-format-flowed (mew-tinfo-get-case))) (mew-draft-mode-name) ;; must be after (mew-tinfo-set-encrypted-p encrypted) (mew-run-mode-hooks 'text-mode-hook 'mew-draft-mode-hook) ;; auto-fill-function is set by mew-draft-mode-hook (when auto-fill-function (make-local-variable 'auto-fill-function) (setq auto-fill-function 'mew-draft-auto-fill)) (setq buffer-undo-list nil)) (defun mew-draft-mode-name (&optional header) (let ((case (mew-tinfo-get-case)) pcdb sub) (cond ((or (mew-tinfo-get-privacy-type) (mew-tinfo-get-privacy-err)) ;; If privacy err, don't display mew-protect-privacy-always-type etc. (setq pcdb (mew-pcdb-by-service (mew-tinfo-get-privacy-type))) (setq sub (mew-pcdb-mark pcdb))) ((and (mew-tinfo-get-encrypted-p) (mew-protect-privacy-encrypted case)) (setq pcdb (mew-pcdb-by-service (mew-protect-privacy-encrypted-type case))) (setq sub (mew-pcdb-mark pcdb))) ((mew-protect-privacy-always case) (setq pcdb (mew-pcdb-by-service (mew-protect-privacy-always-type case))) (setq sub (mew-pcdb-mark pcdb)))) (setq mode-name (if header mew-mode-name-header mew-mode-name-draft)) (if sub (setq mode-name (concat mode-name " " sub))) (unless (mew-case-default-p (mew-tinfo-get-case)) (setq mode-name (concat mode-name " " (mew-tinfo-get-case)))) (if (mew-tinfo-get-use-flowed) (setq mode-name (concat mode-name " F"))) (force-mode-line-update))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Draft subfunctions ;;; (defun mew-draft-dynamic-highlight (beg end len) (when (mew-in-header-p) (save-match-data (mew-highlight-header) (when (mew-draft-p) (mew-draft-header-keymap))))) (defun mew-draft-auto-fill () (let ((ret1 (do-auto-fill)) ret2) (when (mew-in-header-p) (save-excursion (beginning-of-line) (while (not (or (looking-at "[^ \t\n]+:\\|[ \t]") (bobp))) (setq ret2 t) (insert "\t") (forward-line -1) (beginning-of-line)))) (or ret1 ret2))) ;; if modifies, return t. (defun mew-draft-find-and-switch (draft-path &optional switch-func) ;; switch-func = nil :: switch-to-buffer ;; switch-func = t :: switch-to-buffer-other-window (let* ((display-buffer-alist nil) (same-window-buffer-names nil) (same-window-regexps nil) (draftname (mew-path-to-folder draft-path))) (when (get-buffer draftname) (with-current-buffer draftname (clear-visited-file-modtime) (set-buffer-modified-p nil) ;; just in case (mew-delete-file buffer-auto-save-file-name) (mew-remove-buffer draftname))) (cond (mew-use-other-frame-for-draft (setq switch-func 'switch-to-buffer-other-frame)) ((eq switch-func nil) (setq switch-func 'switch-to-buffer)) ((eq switch-func t) (setq switch-func 'switch-to-buffer-other-window))) (mew-frwlet mew-cs-m17n mew-cs-dummy (funcall switch-func (mew-find-file-noselect draft-path))) ;; draft buffer (mew-set-buffer-cs mew-cs-m17n) ;; copy config, first (mew-tinfo-set-case mew-case) (when mew-use-other-frame-for-draft (mew-tinfo-set-other-frame t) ;; to ensure to cite a message from summary frame. (mew-remove-buffer (mew-buffer-message))) (rename-buffer draftname))) (defun mew-draft-to-attach (draft) "Converting draft to attach. E.g. +draft/1 -> +attach/1" (mew-concat-folder mew-attach-folder (file-name-nondirectory draft))) (defun mew-attachdir (&optional draft) (mew-expand-folder (mew-draft-to-attach (or draft (buffer-name))))) (defun mew-draft-header-insert-alist (halist) "Insert field-body: and field-value. Return the value of the Body: field." (let ((case-fold-search t) key val ret) (dolist (ent halist) (setq key (mew-alist-get-key ent)) (setq val (mew-alist-get-value ent)) (unless (string-match ":$" key) (setq key (concat key ":"))) (if (string-match mew-body: key) (setq ret val) (mew-draft-header-insert key val))) ret)) (defun mew-insert-address-list (field adrs del force-insert) (let ((cnt 0) (beg (point)) med) (dolist (adr adrs) (unless (mew-is-my-address del adr) (if (= cnt 0) (insert adr) (insert ", " adr)) (setq del (cons (concat "^" (regexp-quote adr) "$") del)) (setq cnt (1+ cnt)))) (when (or force-insert (> cnt 0)) (beginning-of-line) (insert field " ") (setq med (point)) (end-of-line) (insert "\n") (mew-header-fold-region beg (point) med 'use-tab)) del)) (defun mew-insert-address-list2 (field adrs) (when adrs (let ((beg (point)) med) (insert field " ") (setq med (point)) (insert (car adrs)) (setq adrs (cdr adrs)) (dolist (adr adrs) (insert ", " adr)) (insert "\n") (mew-header-fold-region beg (point) med 'use-tab)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Draft header ;;; (defun mew-draft-header (&optional subject nl to cc newsgroups in-reply-to references other-headers fromme) ;; to -- string or list ;; cc -- string or list ;; nl -- one empty line under "----", which is necessary if ;; attachment is prepared (let ((del (unless fromme mew-regex-my-address-list)) ;; deleting list case body) (goto-char (point-min)) (if newsgroups (cond ((stringp newsgroups) (mew-draft-header-insert mew-newsgroups: newsgroups)) ((listp newsgroups) (mew-insert-address-list2 mew-newsgroups: newsgroups))) ;; Insert To: first. ;; All addresses inserted on To: are appended to del. (cond ((null to) (mew-draft-header-insert mew-to: "")) ((stringp to) ;; To: specified from the mini-buffer. ;; do not check to is mine. Cc: is also string ;; We believe that user never specifies the same address of To: to Cc:. (mew-draft-header-insert mew-to: to)) ;; To: collected by reply ((listp to) (setq del (mew-insert-address-list mew-to: to del t)))) (cond ((null cc) ()) ;; do nothing ((stringp cc) ;; Cc: specified from the mini-buffer. (mew-draft-header-insert mew-cc: cc)) ((listp cc) ;; Cc: collected by reply. (mew-insert-address-list mew-cc: cc del nil)))) (if mew-case-guess-when-prepared (mew-draft-set-case-by-guess)) (setq case (mew-tinfo-get-case)) (unless newsgroups (mew-draft-header-insert mew-cc: (mew-cc case))) (mew-draft-header-insert mew-subj: (or subject "")) (mew-draft-header-insert mew-from: (mew-from case)) (mew-draft-header-insert mew-fcc: (mew-fcc case)) (unless newsgroups (mew-draft-header-insert mew-bcc: (mew-bcc case)) (mew-draft-header-insert mew-dcc: (mew-dcc case))) (mew-draft-header-insert mew-reply-to: (mew-reply-to case)) (unless newsgroups (mew-draft-header-insert mew-in-reply-to: in-reply-to)) (mew-draft-header-insert mew-references: references) (mew-draft-header-insert-xface) (mew-draft-header-insert mew-organization: (mew-organization case)) (setq body (mew-draft-header-insert-alist other-headers)) ;; Deleting fields defined in mew-header-alist to replace them. (mew-header-delete-lines (mapcar 'mew-alist-get-key (mew-header-alist case))) (mew-header-goto-end) (mew-draft-header-insert-alist (mew-header-alist case)) ;; X-Mailer: must be the last (if (mew-use-x-mailer case) (mew-draft-header-insert mew-x-mailer: mew-x-mailer)) ;; (mew-header-set "\n") is enough. But highlighting delayed. (mew-header-prepared) ;; on the body (if nl (insert "\n")) (if body (save-excursion (insert body))) ;; move the cursor after "To: " (goto-char (point-min)) (search-forward ": " nil t))) (defun mew-draft-header-insert-xface () (if (and mew-x-face-file (file-exists-p (expand-file-name mew-x-face-file))) (let (xface) (with-temp-buffer (mew-insert-file-contents (expand-file-name mew-x-face-file)) (setq xface (mew-buffer-substring (point-min) (max (buffer-size) 1)))) (mew-draft-header-insert mew-x-face: xface)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Citation ;;; (defun mew-draft-auto-set-input-method () (if (and (fboundp 'activate-input-method) mew-charset-input-method-alist) (let* ((charset (mew-charset-guess-region (mew-header-end) (or (mew-attach-begin) (point-max)))) (method (mew-charset-to-input-method charset))) (when (stringp method) (activate-input-method method) (message "Set input method to %s" method))))) (defun mew-draft-yank (&optional arg force) "Copy and paste a part of message from Message mode WITHOUT citation prefix and label. 1. Roughly speaking, it copies the body in Message mode. For example, if text/plain is displayed, the entire Message mode is copied. If message/rfc822 is displayed, the body without the header is copied. 2. If called with '\\[universal-argument]', the header is also copied if exists. 3. If an Emacs mark exists, the target is the region between the mark and the cursor." ;; MUST take care of C-x C-x ;; MUST be able to cancel by C-x u (interactive "P") (if (and (not force) (or (mew-in-header-p) (mew-in-attach-p))) (message "Cannot cite a message here") (let (cite beg end) (save-excursion (cond ((get-buffer (mew-buffer-message)) (set-buffer (mew-buffer-message))) ((get-buffer mew-message-last-buffer) (set-buffer mew-message-last-buffer))) (set-buffer (mew-buffer-message)) (save-restriction (widen) (let ((mark-active t)) (cond (arg (setq beg (point-min) end (point-max))) ((and (not mew-cite-ignore-region) (mew-mark) (/= (point) (mew-mark)) (not (and mew-cite-ignore-mouse-region (mew-mouse-region-p)))) (setq beg (region-beginning) end (region-end))) ((mew-msghdr-p) ;; header exists in Message mode (mew-header-goto-body) (setq beg (point) end (point-max))) (t (setq beg (point-min) end (point-max))))) (setq cite (mew-buffer-substring beg end)))) (mew-push-mark) (insert cite) (mew-draft-auto-set-input-method)))) (defvar mew-message-citation-buffer nil "This value is used by mew-gnus.el to specify a buffer from where you can cite.") (defvar mew-message-citation-frame-id nil) (defun mew-draft-cite (&optional arg force) "Copy and paste a part of message from Message mode with citation prefix and label. 1. Roughly speaking, it copies the body in Message mode. For example, if text/plain is displayed, the entire Message mode is copied. If message/rfc822 is displayed, the body without the header is copied. 2. If called with '\\[universal-argument]', the header is also copied if exists. 3. If an Emacs mark exists, the target is the region between the mark and the cursor." ;; MUST take care of C-x C-x ;; MUST be able to cancel by C-x u (interactive "P") (if (and (not force) (or (mew-in-header-p) (mew-in-attach-p))) (message "Cannot cite a message here") (let* ((nonmewbuf mew-message-citation-buffer) ;; may be buffer local (fid (or mew-message-citation-frame-id (mew-frame-id))) (fld (mew-current-get-fld fid)) (msg (mew-current-get-msg fid)) (msg-buf (mew-buffer-message)) cite beg end tbuf irt-msgid) (unless (get-buffer msg-buf) (setq msg-buf mew-message-last-buffer)) (save-excursion ;; ;; extract the body without header ;; (setq tbuf (or nonmewbuf msg-buf)) (if (get-buffer tbuf) (set-buffer tbuf) (error "No buffer to be cited")) (save-restriction ;; first prepare "cite" (widen) (let ((mark-active t)) (cond ;; arg will be effect in mew-cite-original ((and (not mew-cite-ignore-region) (mew-mark) (/= (point) (mew-mark)) (not (and mew-cite-ignore-mouse-region (mew-mouse-region-p)))) (setq beg (region-beginning) end (region-end))) ((mew-msghdr-p) ;; header exists in Message mode. Skip the header ;; because we will concatenate it to cite later. (mew-header-goto-body) (setq beg (point) end (point-max))) (t (setq beg (point-min) end (point-max))))) (setq cite (mew-buffer-substring beg end))) ;; ;; concat the header ;; (setq tbuf (or nonmewbuf (save-excursion (when (get-buffer msg-buf) (set-buffer msg-buf) (if (mew-msghdr-p) (current-buffer)))) ;; header exists only in cache if multipart (mew-cache-hit fld msg))) (if (get-buffer tbuf) (set-buffer tbuf) (error "No buffer to be cited")) (save-restriction (widen) (mew-header-goto-end) (setq cite (concat (mew-buffer-substring (point-min) (point)) "\n" cite)) (setq irt-msgid (mew-idstr-get-first-id (mew-header-get-value mew-message-id:))))) ;; ;; Draft mode, insert the header and the body. ;; ;; Append message-id to In-Reply-To: (if (and irt-msgid (mew-msghdr-p)) (save-excursion (let* ((mew-references-max-count nil) (irt (mew-header-get-value mew-in-reply-to:)) (irtl (mew-idstr-to-id-list irt 'rev)) irtstr) (mew-addq irtl irt-msgid) (setq irtl (nreverse irtl)) (setq irtstr (mew-id-list-to-idstr irtl)) (mew-header-delete-lines (list mew-in-reply-to:)) (unless irt (goto-char (mew-header-end))) (mew-draft-header-insert mew-in-reply-to: irtstr)))) (save-restriction ;; this gets complicated due to supercite, please do not care (narrow-to-region (point) (point)) ;; for (goto-char (point-min)) (insert cite) ;; not for C-x C-x. Do not use mew-push-mark. (push-mark (point) t t) (goto-char (point-min))) (cond (mew-cite-hook (run-hooks 'mew-cite-hook)) (t (mew-cite-original arg))) ;; (mark-marker) indicates the point after label. ;; Should we include the label too? (or force (mew-highlight-body-region (mark-marker) (point) 'draft)) (mew-draft-auto-set-input-method)))) (defconst mew-cite-default-prefix "> ") (defun mew-cite-original (&optional arg) (if (< (marker-position (mark-marker)) (point)) (exchange-point-and-mark)) (let ((beg (point)) (end (marker-position (mark-marker))) label prefix) (save-restriction (narrow-to-region beg end) (condition-case nil (setq label (funcall mew-cite-strings-function)) (error (error "Syntax of mew-cite-format was changed. Read explanation of mew-cite-fields"))) (cond (mew-cite-prefix-function (setq prefix (funcall mew-cite-prefix-function))) (mew-cite-prefix (setq prefix mew-cite-prefix)) (t (setq prefix mew-cite-default-prefix))) (if (and mew-cite-prefix-confirmp (not mew-use-format-flowed)) (let ((ask (read-string (format "Prefix (\"%s\"): " prefix) ""))) (if (not (string= ask "")) (setq prefix ask)))) ;; C-u C-c C-y cites body with header. (if (eq arg nil) ;; header has been already cited. So, delete it. (delete-region beg (progn (mew-header-goto-body) (point)))) (insert label) (mew-push-mark) (if (or mew-cite-prefix-function mew-cite-prefix) (progn (and (bolp) (insert prefix)) (while (= 0 (forward-line)) (or (= (point) (point-max)) (insert prefix)))) (if (bolp) (mew-cite-format-flowed)) (while (= 0 (forward-line)) (unless (= (point) (point-max)) (mew-cite-format-flowed))))))) (defun mew-cite-format-flowed () (insert mew-flowed-quoted) (unless (char-equal (char-after) mew-flowed-quoted) (insert mew-flowed-stuffed))) (defun mew-cite-get-value (field) (let ((value (mew-header-get-value field)) repl func) (when (and (string= mew-from: field) value (setq func (mew-addrbook-func mew-addrbook-for-cite-label))) (setq repl (funcall func (mew-addrstr-parse-address value))) (if repl (setq value repl))) (or value ""))) (defun mew-cite-strings () "A function to create cite labels according to 'mew-cite-format' and 'mew-cite-fields'." (if (null mew-cite-fields) "" (let* ((vals (mapcar 'mew-cite-get-value mew-cite-fields)) (label (apply 'format mew-cite-format vals)) (ellipses (if (stringp mew-draft-cite-ellipses) mew-draft-cite-ellipses "")) beg eol) (if (not (or (eq mew-draft-cite-fill-mode 'truncate) (eq mew-draft-cite-fill-mode 'wrap))) label (with-temp-buffer (let ((fill-column (or mew-draft-cite-label-fill-column fill-column))) (insert label) (goto-char (point-min)) (while (not (eobp)) (cond ((eq mew-draft-cite-fill-mode 'truncate) (end-of-line) (if (>= fill-column (current-column)) () (setq eol (point)) (insert ellipses) (goto-char eol) (while (< fill-column (current-column)) (delete-char -1)))) ((eq mew-draft-cite-fill-mode 'wrap) (setq beg (point)) (end-of-line) (if (= (current-column) 0) () (fill-region beg (point))))) (forward-line))) (buffer-string)))))) (defun mew-cite-prefix-username () "A good candidate for mew-cite-prefix-function. The citation style is 'from_address> ', e.g. 'kazu> '" (let* ((from (mew-header-parse-address mew-from:)) (user (mew-addrstr-extract-user from)) (func (mew-addrbook-func mew-addrbook-for-cite-prefix)) nickname prefix) (if func (setq nickname (funcall func from))) (setq prefix (or nickname user)) (if mew-ask-cite-prefix (setq prefix (read-string "Citation prefix: " prefix))) (concat prefix mew-cite-default-prefix))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; format=flowed ;;; (defun mew-draft-encode-flowed (&optional arg) "Manually encode the body with format=flowed. If called with '\\[universal-argument]', toggle whether or not format=flowed is used on composing." (interactive "P") (if arg (progn (mew-tinfo-set-use-flowed (not (mew-tinfo-get-use-flowed))) (mew-draft-mode-name)) (save-excursion (goto-char (mew-header-end)) (forward-line) (if (mew-tinfo-get-flowed) (progn (mew-decode-flowed (point) (point-max) (if (string= (mew-tinfo-get-flowed) "yes") t nil)) (mew-tinfo-set-flowed nil)) (let* ((charset (mew-charset-guess-region (point) (point-max))) (flowed-delsp (mew-encode-flowed (point) (point-max) charset)) flowed delsp) (mew-set '(flowed delsp) flowed-delsp) (if (not flowed) (message "No line folded") (mew-tinfo-set-flowed (if delsp "yes" "no"))))) (mew-draft-rehighlight) (setq buffer-undo-list nil)))) (defun mew-draft-use-format-flowed (&optional arg) "Toggle the use of format=flowed for the current draft. If called with '\\[universal-argument]', enable format=flowed if the argument is positive. You can use `mew-draft-use-format-flowed-hooks' to enable interesting minor modes according to whether the message is flowed or not. Here is an example: \(add-hook 'mew-draft-use-format-flowed-hooks '(lambda() (if mew-use-format-flowed (progn (auto-fill-mode 0) (visual-line-mode 1)) (progn (auto-fill-mode 1) (visual-line-mode 0))) ))" (interactive "P") (set (make-local-variable 'mew-use-format-flowed) (if (null arg) (not (mew-use-format-flowed)) (> (prefix-numeric-value arg) 0))) (mew-tinfo-set-use-flowed mew-use-format-flowed) (mew-draft-mode-name) ;; Display "F" if Flowed (run-hooks 'mew-draft-use-format-flowed-hooks)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Misc ;;; (defun mew-draft-save-buffer () "Save this draft." (interactive) (let ((after-change-functions nil)) (save-excursion (mew-header-clear 'keep-read-only) (insert-before-markers "\n") ;; for mew-summary-reply (save-buffer) (delete-region (1- (point)) (point)) (mew-header-prepared) (set-buffer-modified-p nil)))) (defun mew-draft-kill () "Kill this draft." (interactive) (if (not (y-or-n-p "Kill draft message? ")) (message "Draft was not killed") (let* ((attachdir (mew-attachdir)) ;; attachdir must be here (draft (buffer-file-name)) (buf (current-buffer)) (mdi (concat draft mew-draft-info-suffix))) (mew-elet (mew-overlay-delete-buffer)) (save-buffer) (mew-delete-file draft) (mew-delete-file mdi) (if (and (mew-tinfo-get-other-frame) (> (length (frame-list)) 1)) (delete-frame) (mew-current-get-window-config)) (mew-delete-directory-recursively attachdir) (mew-remove-buffer buf) (message "Draft was killed")))) (defun mew-draft-insert-signature (&optional arg) "Insert the signature file specified by mew-signature-file. If attachments exist and mew-signature-as-lastpart is *non-nil*, the file is attached to the last part. Otherwise, the file is inserted into the body. If mew-signature-insert-last is *non-nil*, the file is inserted to the end of the body. Otherwise, inserted the cursor position. If executed with '\\[universal-argument]', you can set the case." (interactive "P") (let (case sigfile) (cond ((stringp arg) (setq case arg)) (arg (setq case (mew-input-case (mew-tinfo-get-case) "Signature"))) (t (setq case (mew-tinfo-get-case)))) (setq sigfile (expand-file-name (mew-signature-file case))) (if (not (file-exists-p sigfile)) (message "No signature file %s" sigfile) (if (and (mew-attach-p) mew-signature-as-lastpart) (progn (goto-char (point-max)) (forward-line -2) (mew-attach-forward) (mew-attach-copy sigfile "Signature") (let* ((nums (mew-syntax-nums)) (syntax (mew-syntax-get-entry mew-encode-syntax nums))) (mew-syntax-set-cdp syntax nil) (mew-syntax-set-cd syntax mew-signature-description)) (mew-encode-syntax-print mew-encode-syntax)) (when mew-signature-insert-last (if (null (mew-attach-p)) (goto-char (point-max)) (goto-char (1- (mew-attach-begin)))) (end-of-line) (unless (bolp) (insert "\n"))) (mew-insert-file-contents sigfile))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Re-highlight ;;; (defun mew-draft-rehighlight-body () (save-excursion (let ((beg (progn (goto-char (mew-header-end)) (forward-line) (point))) (end (or (mew-attach-begin) (point-max)))) (mew-highlight-body-region beg end 'draft 'rehighlight)))) (defun mew-draft-rehighlight () "Highlight header and body again." (interactive) (let ((mod (buffer-modified-p))) (mew-highlight-header) (mew-draft-header-keymap) (mew-draft-rehighlight-body) (set-buffer-modified-p mod))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Privacy ;;; (defun mew-draft-toggle-privacy-always () "Toggle whether or not all drafts are protected." (interactive) (setq mew-protect-privacy-always (not mew-protect-privacy-always)) (message "Set mew-protect-privacy-always to %s" mew-protect-privacy-always) (mew-draft-mode-name)) (defun mew-draft-toggle-privacy-encrypted () "Toggle whether or not drafts replying to encrypted messages are protected." (interactive) (setq mew-protect-privacy-encrypted (not mew-protect-privacy-encrypted)) (message "Set mew-protect-privacy-encrypted to %s" mew-protect-privacy-encrypted) (mew-draft-mode-name)) (defun mew-draft-set-privacy-type () "\\ Set privacy service which will be effective when \\[mew-draft-make-message]." (interactive) (let* ((services (mew-pcdb-services)) (alist (mapcar (lambda (x) (cons (symbol-name x) x)) services)) str) (setq str (completing-read "Input privacy services: " alist nil t)) (when (stringp str) (mew-tinfo-set-privacy-type (cdr (assoc str alist))) (mew-tinfo-set-privacy-err nil))) (mew-draft-mode-name)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sending and Queuing ;;; (defun mew-draft-make-message (&optional privacy signer) "Compose a MIME message then put it into a queue folder." (interactive) (if (string= mode-name "Edit") (mew-edit-make) (if (and (mew-called-interactively-p) ;; prevent the loop mew-use-old-pgp mew-protect-privacy-with-old-pgp-signature) (mew-pgp-sign-message) (mew-draft-process-message 'queue privacy signer)))) (defun mew-draft-send-message () "Compose a MIME message then send it." (interactive) (if (string= mode-name "Edit") (mew-edit-make) (if (and (mew-called-interactively-p) ;; just in case mew-use-old-pgp mew-protect-privacy-with-old-pgp-signature) (mew-pgp-sign-message) (mew-draft-process-message 'send)))) (defun mew-draft-process-message (action &optional privacy signer) (if (and (boundp 'visual-line-mode) visual-line-mode) (visual-line-mode -1)) (run-hooks 'mew-make-message-hook) (let* ((case (or (mew-tinfo-get-case) mew-case-default)) (old-case case) guessed-case) (when mew-case-guess-when-composed (setq guessed-case (mew-draft-get-case-by-guess)) (when guessed-case (if mew-case-guess-addition (setq case (mew-draft-add-case case guessed-case)) (setq case guessed-case)))) (unless (string= old-case case) (mew-tinfo-set-case case) (mew-draft-mode-name (mew-tinfo-get-hdr-file)) (mew-draft-replace-fields old-case) (when (eq action 'send) (mew-highlight-header) (unless (mew-tinfo-get-hdr-file) (mew-draft-header-keymap))) (save-buffer)) (if (mew-header-existp mew-newsgroups:) (mew-draft-nntp-process-message case action privacy signer) (mew-draft-smtp-process-message case action privacy signer)))) (defun mew-draft-resent-p (end) (let ((case-fold-search t)) (save-excursion (re-search-forward mew-resent-regex end t)))) (defun mew-draft-smtp-process-message (case action &optional privacy signer) (run-hooks 'mew-send-hook) (let* ((buf (current-buffer)) (pnm (mew-smtp-info-name case)) (queue (mew-queue-folder case)) resentp fcc sendit msg err) (if (get-process pnm) (message "Another message is being sent. Try later") (mew-draft-remove-invalid-fields) ;; Check resentp (save-excursion (goto-char (point-min)) (setq resentp (mew-draft-resent-p (mew-header-end)))) ;; Ask Subject: before the query of "Really send". ;; Typing C-g here gets back to the draft. (mew-encode-ask-subject) (setq fcc (mew-encode-ask-fcc resentp)) (if (eq action 'queue) (setq sendit t) (if mew-ask-send (setq sendit (y-or-n-p "Really send this message? ")) (setq sendit t))) (when sendit ;; password should be asked in Summary mode. (if (and (mew-tinfo-get-other-frame) (> (length (frame-list)) 1)) (delete-frame) (mew-current-get-window-config) (delete-windows-on buf)) ;; just in case (save-excursion (save-window-excursion (set-buffer buf) (if (mew-smtp-encode pnm case resentp fcc privacy signer) (let ((mdi (concat (buffer-file-name) mew-draft-info-suffix))) (mew-delete-file mdi) (setq msg (mew-smtp-queue case "from Draft mode")) (mew-remove-buffer buf) (if (eq action 'send) (mew-smtp-send-message case queue (list msg)))) (setq err t)))) ;; now +queue/1 exists (if err (progn (mew-current-set-window-config) (switch-to-buffer buf) (delete-other-windows)) (if (and (eq action 'queue) mew-visit-queue-after-sending) (mew-summary-visit-folder queue)) (run-hooks 'mew-real-send-hook)))))) (defun mew-draft-nntp-process-message (case action &optional privacy signer) (run-hooks 'mew-post-hook) (let* ((buf (current-buffer)) (pnm (mew-nntp2-info-name case)) (postq (mew-postq-folder case)) fcc sendit msg err) (if (get-process pnm) (message "Another message is being posted. Try later") (mew-draft-remove-invalid-fields) ;; Ask Subject: before the query of "Really post". ;; Typing C-g here gets back to the draft. (mew-encode-ask-subject) (setq fcc (mew-encode-ask-fcc nil)) (if (eq action 'queue) (setq sendit t) (if mew-ask-post (setq sendit (y-or-n-p "Really post this message? ")) (setq sendit t))) (when sendit ;; password should be asked in Summary mode. (if (and (mew-tinfo-get-other-frame) (> (length (frame-list)) 1)) (delete-frame) (mew-current-get-window-config) (delete-windows-on buf)) ;; just in case (save-excursion (save-window-excursion (set-buffer buf) (if (mew-nntp2-encode pnm case fcc privacy signer) (let ((mdi (concat (buffer-file-name) mew-draft-info-suffix))) (mew-delete-file mdi) (setq msg (mew-nntp2-queue case "from Draft mode")) (mew-remove-buffer buf) (if (eq action 'send) (mew-nntp2-send-message case postq (list msg)))) (setq err t)))) (if err (progn (mew-current-set-window-config) (switch-to-buffer buf) (delete-other-windows)) (if (and (eq action 'queue) mew-visit-queue-after-sending) (mew-summary-visit-folder postq)) (run-hooks 'mew-real-post-hook)))))) (defun mew-draft-remove-invalid-fields () (when (mew-header-end) (save-excursion (save-restriction (goto-char (mew-header-end)) (if (not (bolp)) (insert "\n")) (narrow-to-region (point-min) (mew-header-end)) (let (beg med str) (mew-elet ;; removing null lines (goto-char (point-min)) (while (and (re-search-forward "^$" nil t) (not (eobp))) (delete-char 1)) ;; removing fields which do not have value. (goto-char (point-min)) (while (not (eobp)) (if (not (looking-at mew-keyval)) (forward-line) (setq beg (match-beginning 0)) (setq med (match-end 0)) (forward-line) (mew-header-goto-next) (setq str (mew-buffer-substring med (1- (point)))) ;; str may consists of multiple lines ;; So, "$" does not work. We need to use "[^ ]". (unless (string-match "[^ \t\n]" str) (delete-region beg (point))))))))))) ;; backward-compatibility (defalias 'mew-draft-send-letter 'mew-draft-send-message) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Privacy ;;; (defvar mew-draft-privacy-method-alist '(("pgp" . pgp) ("smime" . smime))) (defun mew-draft-set-privacy-method () "Set mew-draft-privacy-method. 'pgp or 'smime." (interactive) (let ((method (completing-read "Privacy method: " mew-draft-privacy-method-alist nil t))) (setq mew-draft-privacy-method (cdr (assoc method mew-draft-privacy-method-alist))))) (defmacro mew-draft-privacy-switch (&rest form) `(let ((method (mew-draft-privacy-method (mew-tinfo-get-case)))) (cond ,@(mapcar (lambda (x) (if (eq (car x) t) x `((eq method ',(car x)) ,(car (cdr x))))) form) (t (message "'%s' is not supported" method))))) (defun mew-draft-sign-message (&optional arg) "Sign the entire draft. Input your passphrase." (interactive "P") (mew-draft-privacy-switch (pgp (mew-pgp-sign-message arg)) (smime (mew-smime-sign-message arg)))) (defun mew-draft-encrypt-message () "Encrypt the entire draft with PGP." (interactive) (mew-draft-privacy-switch (pgp (mew-pgp-encrypt-message)) (smime (mew-smime-encrypt-message)))) (defun mew-draft-sign-encrypt-message (&optional arg) "Sign then encrypt the entire draft. Input your passphrase." (interactive "P") (mew-draft-privacy-switch (pgp (mew-pgp-sign-encrypt-message arg)) (smime (mew-smime-sign-encrypt-message arg)))) (defun mew-draft-encrypt-sign-message (&optional arg) "Encrypt then sign the entire draft. Input your passphrase." (interactive "P") (mew-draft-privacy-switch (pgp (mew-pgp-encrypt-sign-message arg)) (smime (mew-smime-encrypt-sign-message arg)))) (provide 'mew-draft) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-draft.el ends here kazu-yamamoto-Mew-ff9c41b/mew-edit.el000066400000000000000000001247361256455547000176250ustar00rootroot00000000000000;;; mew-edit.el ;; Author: Kazu Yamamoto ;; Created: Nov 9, 1999 ;;; Code: (require 'mew) (defun mew-decode-for-edit () "Decode a message without limitations. Execute mew-dinfo-set before calling this." ;; See also mew-decode. (mew-decode-syntax-clear) (mew-xinfo-set-text-body t) (mew-set-buffer-multibyte t) (let ((mew-header-max-length nil) (mew-header-max-depth nil)) (if (mew-debug 'decode) (let ((debug-on-error t)) (setq mew-decode-syntax (mew-decode-message (mew-decode-syntax-rfc822-head) 0))) (condition-case nil (setq mew-decode-syntax (mew-decode-message (mew-decode-syntax-rfc822-head) 0)) (error (error "MIME decoding error: %s" (mew-xinfo-get-decode-err))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Header mode ;;; (defun mew-header-mode () "A major mode for composing a MIME message by editing its header only. \\{mew-header-mode-map}" (interactive) (mew-draft-set-local-variables) (setq major-mode 'mew-header-mode) (use-local-map mew-header-mode-map) (cd (expand-file-name mew-home)) (mew-header-setup-decoration) (mew-draft-mode-name 'header) (force-mode-line-update) (mew-run-mode-hooks 'mew-header-mode-hook) ;; auto-fill-function is set by mew-header-mode-hook (when auto-fill-function (make-local-variable 'auto-fill-function) (setq auto-fill-function 'mew-draft-auto-fill))) (defmacro mew-summary-header-mode (fields &rest body) ;; (declare (indent 1)) `(mew-summary-msg-or-part (mew-summary-display 'redisplay) (mew-current-set-window-config) (let* ((draft (mew-folder-new-message mew-draft-folder)) (attachdir (mew-attachdir draft)) (fid (mew-frame-id)) (fld (mew-current-get-fld fid)) (msg (mew-current-get-msg fid))) (mew-summary-prepare-draft (mew-draft-find-and-switch draft) (mew-delete-directory-recursively attachdir) ,@body (mew-header-mode) ;; (mew-header-set "\n") is enough. But highlighting delayed. (mew-header-prepared) (goto-char (point-min)) (end-of-line) (mew-tinfo-set-hdr-file (mew-expand-msg fld msg)) (mew-tinfo-set-field-del ,fields))))) (put 'mew-summary-header-mode 'lisp-indent-function 1) (defun mew-summary-send-to-others () "Prepare Header mode so that this message is to be sent other people by a header re-write." (interactive) (mew-summary-header-mode mew-field-delete-for-others (let ((case (mew-tinfo-get-case))) (mew-draft-header-insert mew-to: "") (mew-draft-header-insert mew-cc: (mew-cc case)) (mew-draft-header-insert mew-from: (mew-from case)) (mew-draft-header-insert mew-fcc: (mew-fcc case)) (mew-draft-header-insert mew-bcc: (mew-bcc case)) (mew-draft-header-insert mew-dcc: (mew-dcc case)) (mew-draft-header-insert mew-organization: (mew-organization case))))) (defun mew-summary-resend () "Prepare Header mode so that this message is to be forwarded by a header re-write." (interactive) (mew-summary-header-mode mew-field-delete-for-resending (let ((case (mew-tinfo-get-case))) (mew-draft-header-insert mew-resent-to: "") (mew-draft-header-insert mew-resent-cc: (mew-cc case)) (mew-draft-header-insert mew-resent-from: (mew-from case)) (mew-draft-header-insert mew-resent-fcc: (mew-fcc case)) (mew-draft-header-insert mew-resent-bcc: (mew-bcc case)) (mew-draft-header-insert mew-resent-dcc: (mew-dcc case))))) (defun mew-header-process-message (action) (if (not (file-readable-p (mew-tinfo-get-hdr-file))) (message "No corresponding message!") (if (mew-header-existp mew-newsgroups:) (mew-header-nntp-process-message action) (mew-header-smtp-process-message action)))) (defun mew-header-smtp-process-message (action) (let* ((buf (current-buffer)) (case (mew-tinfo-get-case)) (pnm (mew-smtp-info-name case)) (queue (mew-queue-folder case)) sendit resentp fcc msg err) (if (get-process pnm) (message "Another message is being sent. Try later") (mew-draft-remove-invalid-fields) (goto-char (point-min)) (setq resentp (mew-draft-resent-p (mew-header-end))) (setq fcc (mew-encode-ask-fcc resentp)) (if (and (eq action 'send) mew-ask-send) (setq sendit (y-or-n-p "Really send this message? ")) (setq sendit t)) (when sendit (mew-current-get-window-config) (mew-redraw) (save-excursion (with-current-buffer buf (mew-encode-make-backup) (mew-header-clear) ;; the end of the header (save-restriction (narrow-to-region (point) (point)) (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write (mew-insert-file-contents (mew-tinfo-get-hdr-file))) (goto-char (point-min)) (mew-header-goto-end) (mew-header-set mew-header-separator) (mew-header-delete-lines mew-field-delete-common) (mew-header-delete-lines (mew-tinfo-get-field-del))) (if (mew-smtp-encode pnm case resentp fcc nil nil 'header) (let ((mdi (concat (buffer-file-name) mew-draft-info-suffix))) (mew-delete-file mdi) (setq msg (mew-smtp-queue case "from Draft mode")) (mew-remove-buffer buf) (if (eq action 'send) (mew-smtp-send-message case queue (list msg)))) (setq err t)))) (if err (progn (mew-current-set-window-config) (switch-to-buffer buf) (delete-other-windows)) (if (and (eq action 'queue) mew-visit-queue-after-sending) (mew-summary-visit-folder queue))))))) (defun mew-header-nntp-process-message (action) (let* ((buf (current-buffer)) (case (mew-tinfo-get-case)) (pnm (mew-nntp2-info-name case)) (postq (mew-postq-folder case)) sendit resentp fcc msg err) (if (get-process pnm) (message "Another message is being posted. Try later") (mew-draft-remove-invalid-fields) (goto-char (point-min)) (setq resentp (mew-draft-resent-p (mew-header-end))) (setq fcc (mew-encode-ask-fcc resentp)) (if (and (eq action 'send) mew-ask-send) (setq sendit (y-or-n-p "Really post this message? ")) (setq sendit t)) (when sendit (mew-current-get-window-config) (mew-redraw) (save-excursion (with-current-buffer buf (mew-encode-make-backup) (mew-header-clear) ;; the end of the header (save-restriction (narrow-to-region (point) (point)) (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write (mew-insert-file-contents (mew-tinfo-get-hdr-file))) (goto-char (point-min)) (mew-header-goto-end) (mew-header-set mew-header-separator) (mew-header-delete-lines mew-field-delete-common) (mew-header-delete-lines (mew-tinfo-get-field-del))) (if (mew-nntp2-encode pnm case fcc nil nil 'header) (let ((mdi (concat (buffer-file-name) mew-draft-info-suffix))) (mew-delete-file mdi) (setq msg (mew-nntp2-queue case "from Draft mode")) (mew-remove-buffer buf) (if (eq action 'send) (mew-nntp2-send-message case postq (list msg)))) (setq err t)))) (if err (progn (mew-current-set-window-config) (switch-to-buffer buf) (delete-other-windows)) (if (and (eq action 'queue) mew-visit-queue-after-sending) (mew-summary-visit-folder postq))))))) (defun mew-header-make-message () "Compose a MIME message from the header and its body then put it into a queue folder." (interactive) (mew-header-process-message 'queue)) (defun mew-header-send-message () "Compose a MIME message from the header and its body then send it." (interactive) (mew-header-process-message 'send)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Saving ;;; (defun mew-summary-save (&optional askcs) "Save any parts. If the target is a message, you are asked which you want to save, the entire message or its body. If the target is a non-message part, the part is saved (with line delimiter conversion if it is a text object). When executed with '\\[universal-argument]', coding-system for a text object to be saved can be specified." (interactive "P") (mew-summary-msg-or-part ;; need to make a cache or a message buffer. (mew-summary-toggle-disp-msg 'on) (mew-summary-display) (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) (num (mew-syntax-number)) (nums (mew-syntax-number-to-nums num)) (cbuf (mew-cache-hit fld msg)) (alt (mew-cache-dinfo-get-use-alt cbuf)) (cache (or cbuf (mew-buffer-message))) (syntax (mew-syntax-get-entry (mew-cache-decode-syntax cache) nums)) (action "Save") PLUS1P limit have-hdrp bodyp beg end cdpl file ct ctl doit append-p) ;; Due to mew-decode-broken, the filename may be changed. ;; So, save it here. (and syntax (setq cdpl (mew-syntax-get-cdp syntax))) (setq ctl (mew-syntax-get-ct syntax)) (setq file (mew-syntax-get-filename cdpl ctl)) ;; First of all, we should determine which part the user want to ;; save due to the ambiguity. ;; "y" on Message/Rfc822 ;; - msg/txt the entire msg or its body? ;; - msg/mul/txt the entire msg or its part 1? ;; We have to make use of mew-decode-syntax ;; in the cache buffer due to the PGP/MIME dilemma. ;; We need the correct LIMIT. (if (mew-syntax-message-p syntax) (let ((bodyname "the body") body bct plus1p) (setq body (mew-syntax-get-part syntax)) (when (mew-syntax-multipart-p body) (setq plus1p t) (setq bodyname "the part 1 text") (setq body (mew-syntax-get-entry body '(1)))) (setq bct (mew-syntax-get-value (mew-syntax-get-ct body) 'cap)) (if (mew-ct-textp bct) (if (y-or-n-p (format "Save the entire message (y) or %s (n)? " bodyname)) (setq have-hdrp t) (if plus1p (setq nums (nconc nums '(1))) (setq bodyp t)) (setq PLUS1P (mew-syntax-get-privacy body))) (setq have-hdrp t)))) ;; Now, let's analyze the message in the burst buffer. ;; This is lengthy, though, avoidable. (setq limit (length nums)) (if (or PLUS1P bodyp) ;; VERY important for PGP/MIME (setq limit (1+ limit))) ;; (with-temp-buffer (mew-insert-message fld msg mew-cs-text-for-read nil) (mew-dinfo-set limit 'no-cs-conv t alt) (mew-decode-for-edit) ;; (setq syntax (mew-syntax-get-entry mew-decode-syntax nums)) (if bodyp (setq syntax (mew-syntax-get-part syntax))) (setq beg (mew-syntax-get-begin syntax)) (if (mew-syntax-message-p syntax) (setq end (mew-syntax-get-end (mew-syntax-get-part syntax))) (setq end (mew-syntax-get-end syntax))) (setq ctl (mew-syntax-get-ct syntax)) (setq cdpl (mew-syntax-get-cdp syntax)) (setq file (mew-syntax-get-filename cdpl ctl)) ;; (if (and mew-use-samba-encoding file (string-match mew-regex-nonascii file)) (setq file (mew-samba-encoding file))) (setq file (mew-summary-input-file-name nil file)) (if (not (file-exists-p file)) (setq doit t) (if (null mew-file-append-p) (setq action "Overwrite") (setq action "Append") (setq append-p t)) (if (y-or-n-p (format "File exists. %s it to %s? " action file)) (setq doit t))) ;; (if (not doit) (message "Did not save anything") (let (linebasep fromcs tocs charset writecs) (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (setq ct (mew-syntax-get-value ctl 'cap)) ;; Allow Message/Rfc822. It's user's risk. (setq linebasep (or (mew-ct-textp ct) (mew-ct-linebasep ct))) (if linebasep (setq writecs mew-cs-text-for-write) (setq writecs mew-cs-binary)) (when (and askcs linebasep) (setq tocs (read-coding-system "Coding-system: ")) (if (mew-cs-raw-p tocs) (setq writecs tocs tocs nil))) (when have-hdrp (goto-char (point-min)) (mew-header-delete-lines mew-field-delete-common) (mew-header-delete-lines mew-field-delete-for-saving)) (when tocs (setq charset (mew-syntax-get-param ctl "charset")) (if charset (setq fromcs (mew-charset-to-cs charset))) ;; When saving an entire message or its body, ;; its charset is unknown since it is not analyzed. ;; So, we make use of mew-cs-autoconv. (unless (mew-coding-system-p fromcs) (error "Unknown coding system %s" (symbol-name fromcs))) (unless (mew-coding-system-p tocs) (error "Unknown coding system %s" (symbol-name tocs))) (mew-cs-decode-region (point-min) (point-max) (or fromcs mew-cs-autoconv)) (mew-cs-encode-region (point-min) (point-max) tocs)) (mew-frwlet mew-cs-dummy writecs ;; do not specify 'no-msg (write-region (point-min) (point-max) file append-p))))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Local cs ;;; (defun mew-summary-convert-local-cs (&optional askcs) "Convert the character set of body by using autoconv according to a specified language. If executed with '\\[universal-argument]', coding-system is asked." (interactive "P") (mew-summary-msg-or-part ;; need to make a cache or a message buffer. (mew-summary-toggle-disp-msg 'on) (mew-summary-display) (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) (num (mew-syntax-number)) (nums (mew-syntax-number-to-nums num)) (cbuf (mew-cache-hit fld msg)) (alt (mew-cache-dinfo-get-use-alt cbuf)) (cache (or cbuf (mew-buffer-message))) (syntax (mew-syntax-get-entry (mew-cache-decode-syntax cache) nums)) (buf (generate-new-buffer mew-buffer-prefix)) (win (selected-window)) (orig-lang current-language-environment) PLUS1P limit bodyp hbeg hend beg end start lang prompt tocs cs-env) (save-excursion ;; First of all, we should determine which part the user want to ;; save due to the ambiguity. ;; "y" on Message/Rfc822 ;; - msg/txt the entire msg or its body? ;; - msg/mul/txt the entire msg or its part 1? ;; We have to make use of mew-decode-syntax ;; in the cache buffer due to the PGP/MIME dilemma. ;; We need the correct LIMIT. (when (mew-syntax-message-p syntax) (let (body plus1p) (setq body (mew-syntax-get-part syntax)) (when (mew-syntax-multipart-p body) (setq plus1p t) (setq body (mew-syntax-get-entry body '(1)))) (if plus1p (setq nums (nconc nums '(1))) (setq bodyp t)) (setq PLUS1P (mew-syntax-get-privacy body)))) ;; Now, let's analyze the message in the burst buffer. ;; This is lengthy, though, avoidable. (setq limit (length nums)) (if (or PLUS1P bodyp) ;; VERY important for PGP/MIME (setq limit (1+ limit))) ;; (set-buffer buf) (mew-erase-buffer) (mew-insert-message fld msg mew-cs-text-for-read nil) ;; (cond (askcs (setq prompt (format "Coding-system (autoconv for %s): " orig-lang)) (setq tocs (or (read-coding-system prompt) mew-cs-autoconv))) (t (setq tocs mew-cs-autoconv) (setq prompt (format "Language (%s): " orig-lang)) (setq lang (read-language-name nil prompt orig-lang)) (setq cs-env (mew-set-language-environment-coding-systems lang)))) (mew-dinfo-set limit 'no-cs-conv t alt) (mew-decode-for-edit) ;; (setq syntax (mew-syntax-get-entry mew-decode-syntax nums)) (when bodyp (setq hbeg (mew-syntax-get-begin syntax)) (setq hend (mew-syntax-get-end syntax)) (setq syntax (mew-syntax-get-part syntax))) (setq beg (mew-syntax-get-begin syntax)) (setq end (mew-syntax-get-end syntax)) ;; (set-buffer (mew-buffer-message)) (select-window (get-buffer-window (current-buffer))) (widen) (mew-elet (delete-region (point-min) (point-max)) (when bodyp ;; This must be "insert-buffer-substring". (insert-buffer-substring buf hbeg hend) (mew-header-arrange (point-min) (point-max))) (setq start (point)) (save-excursion (mew-insert-buffer-substring buf beg end) (mew-cs-decode-region start (point-max) tocs) (mew-highlight-body-region start (point-max))) ;; Page breaks (when mew-break-pages (goto-char (point-min)) (mew-message-narrow-to-page)) (when (and (not askcs) cs-env) (mew-reset-coding-systems (car cs-env) (cdr cs-env)))) (mew-summary-display-postscript 'no-hook) (select-window win)) (mew-remove-buffer buf)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Burst ;;; (defvar mew-burst-last-folder nil) (defun mew-input-burst-folder () (let (default) (if (and mew-use-burst-folder-history mew-burst-last-folder) (setq default mew-burst-last-folder) (setq default (mew-inbox-folder))) ;; local folder (setq mew-burst-last-folder (mew-input-local-folder default)) mew-burst-last-folder)) (defun mew-summary-burst-part (part folder newmsg &optional num) (let (n len nums entry file) (setq n 1) (cond (num (setq nums (mew-syntax-number-to-nums num)) (setq len 1)) (t (setq nums (list n)) (setq len (- (length part) mew-syntax-magic)))) (while (<= n len) (setq entry (mew-syntax-get-entry part nums)) (cond ((mew-syntax-multipart-p entry) (setq newmsg (mew-summary-burst-part entry folder newmsg))) ((string= (mew-syntax-get-value (mew-syntax-get-ct entry) 'cap) mew-ct-msg) (setq file (mew-expand-new-msg folder (number-to-string newmsg))) (mew-frwlet mew-cs-dummy mew-cs-text-for-write (write-region (mew-syntax-get-begin entry) ;; This is RFC 822 message. ;; So, body is a single text/plain. (mew-syntax-get-end (mew-syntax-get-part entry)) file nil 'no-msg)) (mew-set-file-modes file) (setq newmsg (1+ newmsg)))) (setq n (1+ n)) (setq nums (list n))) newmsg)) (defun mew-summary-burst-body (fld msg folder &optional num) (let (ret errmsg mstr m) (with-temp-buffer (mew-insert-message fld msg mew-cs-text-for-read nil) (mew-dinfo-set 1 nil nil nil) (mew-decode-for-edit) (cond ((not (mew-syntax-multipart-p (mew-syntax-get-part mew-decode-syntax))) (message "Cannot burst")) ((not (setq mstr (mew-folder-new-message folder 'num-only))) (setq errmsg (format "Error in %s. Nothing was processed" folder))) (t (setq m (mew-summary-burst-part (mew-syntax-get-part mew-decode-syntax) folder (string-to-number mstr) num)) (if (= m (string-to-number mstr)) (message "Nothing was processed") (mew-touch-folder folder) (setq ret (list mstr (number-to-string (1- m))))))) (if errmsg (error "%s" errmsg)) ret))) (defun mew-summary-burst-files (fld msg dir) (with-temp-buffer (let (cnt syntax len stx ctl ct) (mew-insert-message fld msg mew-cs-text-for-read nil) ;; must be a message, not a part, so limit is nil (mew-dinfo-set nil 'no-cs-conv t nil) (mew-decode-for-edit) (setq syntax (mew-syntax-get-part mew-decode-syntax)) (if (mew-syntax-singlepart-p syntax) (progn (mew-syntax-set-cdp syntax (mew-syntax-cdp-format mew-ct-txt mew-draft-coverpage)) (mew-d2e-singlepart syntax dir)) (setq cnt mew-syntax-magic) (setq len (length syntax)) (while (< cnt len) (setq stx (aref syntax cnt)) (setq ctl (mew-syntax-get-ct stx)) (setq ct (mew-syntax-get-value ctl 'cap)) (cond ((string= mew-ct-msg ct) (mew-d2e-message stx dir)) ((mew-ct-multipartp ct) (mew-d2e-multipart stx (mew-random-filename dir 1 nil))) (t (if (= cnt mew-syntax-magic) (mew-syntax-set-cdp stx (mew-syntax-cdp-format mew-ct-txt mew-draft-coverpage))) (mew-d2e-singlepart stx dir))) (setq cnt (1+ cnt))))))) (defun mew-summary-burst (&optional arg) "Decompose messages embedded in this message. You are asked a folder for the decomposition. If executed on a part, only the message part is saved to a folder which you specify. If called with '\\[universal-argument]', any files in this message are decomposed. You are asked a new directory name for the decomposition." (interactive "P") (mew-summary-msg-or-part (let ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) (num (mew-syntax-number)) folder dir ret) (cond (arg ;; file decomposition (setq dir (read-file-name "New directory: " mew-home)) (while (file-exists-p dir) (setq dir (read-file-name (format "\"%s\" exists. New directory: " dir) mew-home))) (mew-make-directory dir) (message "Bursting...") (mew-summary-burst-files fld msg dir) (message "Bursting...done")) (t (setq folder (mew-input-burst-folder)) (when (and folder (mew-local-folder-check folder 'ask)) (message "Bursting...") (setq ret (mew-summary-burst-body fld msg folder num)) (when ret (message "Bursting...done") (when mew-ask-folder-after-burst (if (y-or-n-p (format "Go to %s? " folder)) (mew-summary-visit-folder folder 'goend))) (message "Messages from %s to %s were extracted in %s" (nth 0 ret) (nth 1 ret) folder)))))))) (defun mew-summary-burst-multi () "Decompose messages embedded in the messages marked with '*'." (interactive) (mew-summary-multi-msgs (let ((folder (mew-input-burst-folder)) (targets FLD-MSG-LIST)) (when (and folder (mew-local-folder-check folder 'ask)) (message "Bursting...") (dolist (target targets) (mew-summary-burst-body (car target) (cdr target) folder)) (message "Bursting...done") (when mew-ask-folder-after-burst (if (y-or-n-p (format "Go to %s? " folder)) (mew-summary-visit-folder folder 'goend))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Old burst ;;; (defun mew-summary-old-burst () "Decompose old-fashioned encapsulated messages." (interactive) (mew-summary-msg (let ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number)) (sep1 (make-string 70 ?-)) (sep2 (make-string 30 ?-)) (folder (mew-input-burst-folder)) start mstr m done) (with-temp-buffer (mew-insert-message fld msg mew-cs-text-for-read nil) (mew-set-buffer-multibyte t) (if (not (re-search-forward sep1 nil t)) (message "Cannot burst this message") (message "Bursting...") (forward-line 2) (setq start (point)) (setq mstr (mew-folder-new-message folder 'num-only)) (setq m (string-to-number mstr)) (while (re-search-forward sep2 nil t) (save-excursion (beginning-of-line) (save-restriction (narrow-to-region start (1- (point))) (goto-char (point-min)) (while (re-search-forward "^- " nil t) (replace-match "" nil t)) (mew-frwlet mew-cs-dummy mew-cs-text-for-write (write-region (point-min) (point-max) (mew-expand-new-msg folder mstr) nil 'no-msg)))) (forward-line 2) (setq start (point)) (setq m (1+ m)) (setq mstr (number-to-string m))) (message "Bursting...done") (mew-touch-folder folder) (setq done t))) (when mew-ask-folder-after-burst (if (and done (y-or-n-p (format "Go to %s? " folder))) (mew-summary-visit-folder folder 'goend)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Re-editing ;;; (defun mew-summary-reedit (&optional keep-hdr) "Edit this message again to retry sending. Or edit this RFC822 part typically included in a MIME-encapsulated error message. 1. In +draft, the message is just edited. 2. In +queue or +postq, the message is moved to +draft and is edited. 3. Otherwise, the message is copied to +draft and is edited. For the other folders, if mew-case-guess-when-prepared is 't', each fields of the original header is replaced according to a guessed sending case. If called with '\\[universal-argument]', the original header is reserved. See also mew-summary-edit-again." (interactive "P") (mew-summary-msg-or-part (let ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) (part (mew-syntax-nums)) draftname) (cond ((string= fld mew-draft-folder) (setq draftname (mew-path-to-folder (mew-expand-msg fld msg))) (if (get-buffer draftname) (progn (mew-current-set-window-config) ;; xxx necessary? (mew-window-configure 'draft) (switch-to-buffer draftname)) (mew-summary-reedit-for-draft fld msg) (run-hooks 'mew-draft-mode-reedit-draft-hook))) ((and (or (mew-folder-queuep fld) (mew-folder-postqp fld)) (null part)) (mew-summary-reedit-for-queue fld msg) (run-hooks 'mew-draft-mode-reedit-queue-hook)) (t (if part (let* ((cache (mew-cache-hit fld msg 'must-hit)) (alt nil) (syntax (mew-cache-decode-syntax cache)) (stx (mew-syntax-get-entry syntax part)) (ct (mew-syntax-get-value (mew-syntax-get-ct stx) 'cap))) (if (not (string= mew-ct-msg ct)) (message "Cannot reedit here") (mew-summary-reedit-for-message fld msg part keep-hdr alt) (run-hooks 'mew-draft-mode-reedit-hook))) (mew-summary-reedit-for-message fld msg nil keep-hdr nil) (run-hooks 'mew-draft-mode-reedit-hook))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Header ;;; (defun mew-summary-edit-header-common () (mew-header-delete-lines (list mew-x-mailer:)) (mew-header-goto-end) ;; X-Mailer: must be the last (if (mew-use-x-mailer (mew-tinfo-get-case)) (mew-draft-header-insert mew-x-mailer: mew-x-mailer)) (mew-header-clear) ;; erase the old header separator (mew-header-set "\n")) (defun mew-summary-edit-header-for-draft () (mew-elet (mew-summary-edit-header-common))) (defun mew-summary-edit-header-for-queue (hdr) (mew-elet (mew-header-goto-end) (delete-region (point-min) (point)) (insert hdr) (mew-summary-edit-header-common))) (defun mew-summary-edit-header-for-message (keep-hdr) (mew-elet (mew-header-delete-lines mew-field-delete-common) (mew-header-delete-lines mew-field-delete-for-reediting) (mew-header-sort mew-field-order-for-reediting) (unless keep-hdr (if mew-case-guess-when-prepared (mew-draft-set-case-by-guess)) (mew-draft-replace-fields nil)) (mew-summary-edit-header-common))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Body ;;; (defun mew-summary-reedit-for-draft (fld msg) "Edit a message in the draft folder. Use the message as draft. Note that the message is not a valid MIME message." ;; Message mode will be invalid so hide it. (mew-mark-kill-line) (set-buffer-modified-p nil) ;; Need to delete Message window because the target message will be ;; modified and its content will be changed. (mew-window-configure 'summary) (mew-current-set-window-config) (mew-window-configure 'draft) (mew-summary-prepare-draft ;; mew-cs-m17n ;; case is copied here (mew-draft-find-and-switch (mew-expand-new-msg fld msg)) (mew-summary-edit-header-for-draft) (mew-draft-mode) (mew-draft-rehighlight-body) (save-excursion (when (and (mew-encode-load-syntax) mew-encode-syntax) (mew-encode-syntax-delete 'all) (mew-draft-prepare-attachments t))) (mew-draft-mode-name))) (defun mew-summary-reedit-for-queue (fld msg) "Edit a message in a folder other than the draft folder. The message is assumed to be a valid MIME message." ;; Message mode will be invalid so hide it. (mew-decode-syntax-delete) (mew-mark-kill-line) (set-buffer-modified-p nil) ;; Need to delete Message window because the target message will be ;; modified and its content wiil be changed. (mew-current-set-window-config) (mew-window-configure 'draft) ;; main part (mew-summary-prepare-draft (mew-summary-edit-message fld msg nil nil) (let* ((file (mew-expand-msg fld msg)) (work (concat file mew-queue-work-suffix)) (info (concat file mew-queue-info-suffix)) inf hdr) (when (file-readable-p file) (rename-file file work 'override) (setq inf (mew-lisp-load info)) (cond ((mew-folder-queuep fld) (setq hdr (mew-smtp-get-raw-header inf)) (mew-tinfo-set-case (mew-smtp-get-case inf))) ((mew-folder-postqp fld) (setq hdr (mew-nntp2-get-raw-header inf)) (mew-tinfo-set-case (mew-nntp2-get-case inf)))) (mew-queue-backup work mew-queue-info-suffix) (and hdr (mew-summary-edit-header-for-queue hdr)))) (mew-draft-mode) (mew-draft-rehighlight-body) (when mew-encode-syntax (save-excursion (mew-draft-prepare-attachments t))) (mew-draft-mode-name))) (defun mew-summary-reedit-for-message (fld msg part keep-hdr alt) "Edit a message in a folder other than the draft folder. The message is assumed to be a valid MIME message." (mew-current-set-window-config) (mew-window-configure 'draft) ;; main part (mew-summary-prepare-draft ;; case is copied here (mew-summary-edit-message fld msg part alt) ;; get info before backup the original (mew-summary-edit-header-for-message keep-hdr) (mew-draft-mode) (mew-draft-rehighlight-body) (when mew-encode-syntax (save-excursion (mew-draft-prepare-attachments t))) (mew-draft-mode-name))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Edit again ;;; (defvar mew-summary-edit-again-regex "----- Original message follows -----\\|----- Unsent message follows -----\\|--- Undelivered message follows ---\\|--- Below this line is a copy of the message.") (defun mew-summary-edit-again () "Edit an old fashioned error message in which the original message is encapsulated after strings defined in 'mew-summary-edit-again-regex' An example is \"----- Original message follows -----\". See also mew-summary-reedit." (interactive) (mew-summary-msg (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number)) (nfld mew-temp-dir) (nmsg (mew-folder-new-message nfld 'num-only)) nfile) (with-temp-buffer ;; First, let's remove garbage and make a valid message ;; into a file. (mew-insert-message fld msg mew-cs-text-for-read nil) (mew-set-buffer-multibyte t) (goto-char (point-min)) (if (not (re-search-forward mew-summary-edit-again-regex nil t)) (message "Cannot edit this message again") (forward-line) ;; skip blank lines (while (looking-at "^$") (forward-line)) (delete-region (point-min) (point)) (setq nfile (mew-expand-new-msg nfld nmsg)) (mew-frwlet mew-cs-dummy mew-cs-text-for-write (write-region (point-min) (point-max) nfile nil 'no-msg)) ;; A new message is stored in the temporary directory (mew-summary-reedit-for-message nfld nmsg nil nil nil) (run-hooks 'mew-draft-mode-edit-again-hook) (mew-delete-file nfile)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sub functions ;;; (defun mew-ct-suffix (ct) "Get an appropriate suffix from content type." (let* ((base (mew-ctdb-regex (mew-ctdb-by-ct ct))) (len (length base)) (ret (mew-make-string len)) (j 0) char) (if (not (stringp base)) nil (dotimes (i len) (setq char (aref base i)) (if (or (char-equal char ?.) (and (>= char ?a) (<= char ?z))) (progn (aset ret j char) (setq j (1+ j))))) (setq ret (substring ret 0 j)) (if (string-match "^\\.[a-z]+$" ret) ret nil)))) (defun mew-summary-edit-message (fld msg part alt) "Prepare a header and a body, optionally attachments." (let* ((draft (mew-folder-new-message mew-draft-folder)) (attachdir (mew-attachdir draft)) (buf (generate-new-buffer mew-buffer-prefix)) syntax hbeg hend beg end len cnt stx ctl ct charset start cs) ;; prepare draft file (mew-draft-find-and-switch draft) (mew-delete-directory-recursively attachdir) ;; De-compose the message in the burst buffer. ;; do not decode Message/Rfc822 parts. ;; They will be just a attachment message. (with-current-buffer buf ;; Let's decode the message without limitations (mew-erase-buffer) (mew-insert-message fld msg mew-cs-text-for-read nil) (mew-dinfo-set (1+ (length part)) 'no-cs-conv t alt 'encap-html) (mew-decode-for-edit) (setq syntax (mew-syntax-get-entry mew-decode-syntax part)) ;; syntax is now for the message (setq hbeg (mew-syntax-get-begin syntax)) (setq hend (mew-syntax-get-end syntax)) ;; Outer 'message is not necessary for mew-encoding-syntax ;; syntax is now for the multipart (setq syntax (mew-syntax-get-part syntax)) (if (mew-syntax-singlepart-p syntax) (progn (setq beg (mew-syntax-get-begin syntax)) (setq end (mew-syntax-get-end syntax)) (setq ctl (mew-syntax-get-ct syntax)) (setq charset (mew-syntax-get-param ctl "charset")) (setq syntax nil)) ;; Let's store each part (setq cnt mew-syntax-magic) (unless (string= mew-ct-txt (mew-syntax-get-value (mew-syntax-get-ct (aref syntax cnt)) 'cap)) (setq syntax (mew-syntax-insert-entry syntax '(1) (mew-encode-syntax-text)))) (setq len (length syntax)) (mew-make-directory attachdir) (while (< cnt len) (setq stx (aref syntax cnt)) (setq ctl (mew-syntax-get-ct stx)) (setq ct (mew-syntax-get-value ctl 'cap)) (cond ((string= mew-ct-msg ct) (mew-d2e-message stx attachdir)) ((mew-ct-multipartp ct) (mew-d2e-multipart stx (mew-random-filename attachdir 1 nil))) (t (if (/= cnt mew-syntax-magic) (mew-d2e-singlepart stx attachdir) (setq beg (mew-syntax-get-begin stx)) (setq end (mew-syntax-get-end stx)) (setq charset (mew-syntax-get-param ctl "charset")) (mew-delete "charset" ctl) (mew-syntax-set-file stx mew-draft-coverpage) (mew-syntax-set-decrypters stx nil)))) (setq cnt (1+ cnt))) (mew-syntax-set-file syntax (file-name-as-directory (file-name-nondirectory attachdir))) (mew-syntax-set-decrypters syntax nil) (mew-syntax-set-privacy syntax nil) (mew-syntax-set-ct syntax mew-type-mlm) (mew-syntax-set-cte syntax nil) (mew-syntax-set-cd syntax nil) (mew-syntax-set-cid syntax nil) (mew-syntax-set-cdp syntax nil))) ;; draft buffer ;; header (mew-insert-buffer-substring buf hbeg hend) (insert "\n") ;; coverpage (setq start (point)) ;; The first part may not be Text/Plain. (if (and beg end) (mew-insert-buffer-substring buf beg end)) (if (or (null charset) (string= charset mew-us-ascii)) (setq cs mew-cs-autoconv) ;; for RFC822 (setq cs (mew-charset-to-cs charset))) (unless (mew-coding-system-p cs) (error "Unknown coding system %s" (symbol-name cs))) (mew-cs-decode-region start (point-max) cs) (setq mew-encode-syntax syntax) (mew-remove-buffer buf))) (defun mew-d2e-singlepart (syntax dir) "De-compose singlepart" (let* ((ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap)) (cdpl (mew-syntax-get-cdp syntax)) (file (mew-syntax-get-filename cdpl ctl)) (beg (mew-syntax-get-begin syntax)) (end (mew-syntax-get-end syntax)) (linebasep (or (mew-ct-textp ct) (mew-ct-linebasep ct)))) (if (stringp file) (setq file (expand-file-name file dir)) (setq file (mew-random-filename dir 2 nil (mew-ct-suffix ct))) (mew-syntax-set-cdp syntax nil)) (mew-frwlet mew-cs-dummy (if linebasep mew-cs-text-for-write mew-cs-binary) (write-region beg end file nil 'no-msg)) (if (and (mew-ct-textp ct) (mew-syntax-get-param ctl "charset")) (mew-delete "charset" ctl)) ;; side effect (mew-syntax-set-file syntax (file-name-nondirectory file)) (mew-syntax-set-decrypters syntax nil) (mew-syntax-set-privacy syntax nil) (mew-syntax-set-cid syntax nil))) (defun mew-d2e-multipart (syntax dir) "De-compose multipart" (let ((len (length syntax)) (cnt mew-syntax-magic) ct part) (mew-make-directory dir) (while (< cnt len) (setq part (aref syntax cnt)) (setq ct (mew-syntax-get-value (mew-syntax-get-ct part) 'cap)) (cond ((string= mew-ct-msg ct) (mew-d2e-message part dir)) ((mew-ct-multipartp ct) (mew-d2e-multipart part (mew-random-filename dir 1 nil))) (t (mew-d2e-singlepart part dir))) (setq cnt (1+ cnt))) (mew-syntax-set-file syntax (file-name-as-directory (file-name-nondirectory dir))) (mew-syntax-set-decrypters syntax nil) (mew-syntax-set-privacy syntax nil) (mew-syntax-set-ct syntax mew-type-mlm) (mew-syntax-set-cte syntax nil) (mew-syntax-set-cd syntax nil) (mew-syntax-set-cid syntax nil) (mew-syntax-set-cdp syntax nil))) (defun mew-d2e-message (syntax dir) "De-compose message like singlepart" (let ((file (mew-random-filename dir 2 t)) (beg (mew-syntax-get-begin syntax)) (end (mew-syntax-get-end (mew-syntax-get-part syntax)))) (mew-frwlet mew-cs-dummy mew-cs-text-for-write (write-region beg end file nil 'no-msg)) (mew-syntax-set-key syntax 'single) (mew-syntax-set-file syntax (file-name-nondirectory file)) (mew-syntax-set-decrypters syntax nil) (mew-syntax-set-privacy syntax nil) (mew-syntax-set-cid syntax nil) (mew-syntax-set-cdp syntax nil) (mew-syntax-set-part syntax nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Edit mode ;;; (defun mew-summary-edit () (interactive) (mew-summary-not-in-queue (mew-summary-not-in-draft (mew-summary-msg-or-part (let ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) (part (mew-syntax-nums))) (if part (let* ((cache (mew-cache-hit fld msg 'must-hit)) (alt nil) (syntax (mew-cache-decode-syntax cache)) (stx (mew-syntax-get-entry syntax part)) (ct (mew-syntax-get-value (mew-syntax-get-ct stx) 'cap))) (if (not (string= mew-ct-msg ct)) (message "Cannot edit here") (mew-summary-edit-for-message fld msg part alt) (run-hooks 'mew-draft-mode-edit-hook))) (mew-summary-edit-for-message fld msg nil nil) (setq mode-name "Edit") (force-mode-line-update) (run-hooks 'mew-draft-mode-edit-hook))))))) (defun mew-summary-edit-for-message (fld msg part alt) (mew-current-set-window-config) (mew-window-configure 'draft) ;; main part (mew-summary-prepare-draft ;; case is copied here (mew-summary-edit-message fld msg part alt) ;; get info before backup the original (mew-summary-edit-header-for-edit) (let ((fields (mew-summary-edit-obtain-fields-key))) (mew-tinfo-set-preserved-header (mew-summary-edit-obtain-fields fld msg fields))) (mew-tinfo-set-src-folder fld) (mew-draft-mode) (mew-draft-rehighlight-body) (when mew-encode-syntax (save-excursion (mew-draft-prepare-attachments t))) (mew-draft-mode-name))) (defun mew-summary-edit-header-for-edit () (mew-elet (mew-header-delete-lines '("From " ">From")) (mew-header-delete-lines mew-field-delete-for-editing) (mew-header-sort mew-field-order-for-editing) (mew-header-clear) ;; erase the old header separator (mew-header-set "\n"))) (defun mew-summary-edit-obtain-fields-key () (let ((case-fold-search t) fields) (save-excursion (mew-header-goto-end) (save-restriction (narrow-to-region (point-min) (point)) (goto-char (point-min)) (while (not (eobp)) (if (not (looking-at mew-keyval)) (forward-line) (setq fields (cons (mew-match-string 1) fields)) (forward-line) (mew-header-goto-next)))) fields))) (defun mew-summary-edit-obtain-fields (fld msg fields) (with-temp-buffer (mew-insert-message fld msg mew-cs-text-for-read mew-header-reasonable-size) (mew-header-goto-end) (delete-region (point) (point-max)) (mew-header-delete-lines fields) (mew-header-delete-lines (list mew-mv: "Content-" "X-Mew-")) (mew-buffer-substring (point-min) (point-max)))) (defun mew-edit-make-delete-window (buf) (if (and (mew-tinfo-get-other-frame) (> (length (frame-list)) 1)) (delete-frame) (mew-current-get-window-config) (delete-windows-on buf))) ;; just in case (defun mew-edit-make-message (buf) (let (multip) (save-excursion (save-window-excursion (set-buffer buf) (mew-set-buffer-multibyte t) (if (buffer-modified-p) (save-buffer)) ;; to make backup (widen) (if (mew-attach-p) (progn (setq multip t) (mew-attach-clear)) (unless mew-encode-syntax (setq mew-encode-syntax (mew-encode-syntax-single "text.txt" (list mew-ct-txt))))) (goto-char (mew-header-end)) (forward-line) (if multip (mew-encode-make-multi) (mew-encode-make-single)) (mew-encode-make-header) (mew-encode-save-draft) (mew-overlay-delete-buffer) (goto-char (point-min)) (insert (mew-tinfo-get-preserved-header)) (save-buffer) (buffer-file-name))))) (defun mew-edit-make-refile (case:srcfld srcfile) (let* ((case:dstfld (car (mew-input-folders case:srcfld))) (dstfld (mew-case:folder-folder case:dstfld)) (case (mew-case:folder-case case:dstfld)) dstfile) (cond ((mew-folder-imapp dstfld) (mew-imap2-copy-message case 'move (list srcfile) dstfld)) (t (setq dstfile (mew-folder-new-message dstfld)) (rename-file srcfile dstfile) (mew-set-file-modes dstfile) (mew-touch-folder dstfld) (message "Saved in %s" dstfld))))) (defun mew-edit-make () (interactive) (let ((buf (current-buffer)) (case:srcfld (mew-tinfo-get-src-folder)) srcfile) (mew-edit-make-delete-window buf) (setq srcfile (mew-edit-make-message buf)) (mew-remove-buffer buf) (mew-edit-make-refile case:srcfld srcfile))) (provide 'mew-edit) ;;; Copyright Notice: ;; Copyright (C) 1999-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-edit.el ends here kazu-yamamoto-Mew-ff9c41b/mew-encode.el000066400000000000000000001337001256455547000201240ustar00rootroot00000000000000;;; mew-encode.el --- MIME syntax encoder for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) (defvar mew-prog-mime-encode-switch `((,mew-b64 "-b") (,mew-qp "-q") (,mew-xg "-g"))) (defvar mew-prog-mime-encode-text-switch `((,mew-b64 "-b" "-t") (,mew-qp "-q") (,mew-xg "-g""-t"))) (defun mew-prog-mime-encode-get-opt (cte switch) (cdr (mew-assoc-case-equal cte switch 0))) (defvar mew-encode-multipart-encrypted-switch `((,mew-ct-pge mew-pgp-encrypt))) (defvar mew-encode-multipart-signed-switch `((,mew-ct-pgs mew-pgp-sign mew-pgp-canonicalize) (,mew-ct-sms mew-smime-detach-sign))) ;; (defun mew-encode-get-security-func (proto switch) (nth 1 (mew-assoc-case-equal proto switch 0))) (defun mew-encode-get-canonicalize-func (proto switch) (nth 2 (mew-assoc-case-equal proto switch 0))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; MIME encoder ;;; (defun mew-encode-error (error-msg) (mew-tinfo-set-encode-err error-msg) (error "")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; RFC 2822 comments ;;; ;; RFC 2822 defines the limitations of the number of fields. ;; ;; * Overriding ;; Date: (exactly once) ;; Message-Id: ;; ;; * Put multiple fields to a single field ;; From: (exactly once) ;; Reply-To: ;; To: ;; Cc: ;; ;; * Error and undo ;; Sender: (if exist, exactly one address) ;; ;; In-Reply-To: ;; References: ;; Subject: ;; (defconst mew-multiple-field-error-list (list mew-subj: mew-in-reply-to: mew-references:)) (defconst mew-multiple-field-combine-list (list mew-from: mew-reply-to: mew-to: mew-cc:)) (defun mew-header-count-field (field) (let ((case-fold-search t) (regex (format "^%s" field)) (i 0)) (goto-char (point-min)) (while (re-search-forward regex nil t) (setq i (1+ i)) (forward-line)) i)) (defun mew-header-combine-field (field) (let ((case-fold-search t) (regex (format "^%s" field)) beg med here value) (goto-char (point-min)) (when (re-search-forward regex nil t) (forward-line) (mew-header-goto-next) (setq here (1- (point))) (while (re-search-forward regex nil t) (setq beg (match-beginning 0)) (setq med (match-end 0)) (forward-line) (mew-header-goto-next) (setq value (mew-buffer-substring med (1- (point)))) (delete-region beg (point)) (save-excursion (goto-char here) (insert ",\n\t" value) (setq here (point))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Header sanity check ;;; (defun mew-encode-remove-invalid-fields () (when (mew-header-end) (save-excursion (save-restriction (narrow-to-region (point-min) (mew-header-end)) (dolist (field mew-multiple-field-error-list) (if (> (mew-header-count-field field) 1) (mew-encode-error (format "Multiple %s!" field)))) (mapcar 'mew-header-combine-field mew-multiple-field-combine-list))))) (defun mew-encode-ask-subject () (when (and mew-ask-subject (not (mew-header-existp mew-subj:))) ;; Subject: does not exist (let ((subj (read-string (concat mew-subj: " ")))) (mew-header-replace-value mew-subj: subj)))) (defun mew-encode-fcc-folder-check (fld) (let ((folder (mew-canonicalize-folder fld))) (when (and mew-ask-fcc (mew-folder-localp folder) (not (file-directory-p (mew-expand-folder folder)))) (if (y-or-n-p (format "%s does not exist. Create it? " folder)) (mew-local-folder-check folder) (mew-encode-error "Edit Fcc:"))) folder)) (defun mew-encode-ask-fcc (resentp) (let* ((target (if resentp mew-resent-fcc: mew-fcc:)) (folders (mew-header-get-value target))) (when folders (mapcar 'mew-encode-fcc-folder-check (mew-addrstr-parse-value-list2 folders))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; To:, Cc: ;;; (defvar mew-draft-append-domain-p t) (defun mew-draft-append-domain (addr) (if (string-match "@" addr) addr (if mew-draft-append-domain-p (concat addr "@" (mew-mail-domain (mew-tinfo-get-case))) (throw 'jump addr)))) (defun mew-encode-canonicalize-address (resentp) (catch 'jump (let ((case-fold-search t) (regex (mew-make-field-regex (if resentp mew-resent-dest:-list mew-destination:-list))) key start vals val addrs addr ret insl ins prefix suffix) (save-excursion (save-restriction (narrow-to-region (point-min) (mew-header-end)) (goto-char (point-min)) (while (re-search-forward regex nil t) (setq key (match-string 1)) (setq start (match-end 0)) (forward-line) (while (looking-at mew-lwsp) (delete-char -1) (forward-line)) (setq val (mew-buffer-substring start (1- (point)))) (delete-region start (1- (point))) (backward-char 1) ;; single quote is allowed for local-part (setq vals (mapcar 'mew-chop (mew-split-quoted val ?, ?: ?\; 'no-single))) (dolist (val vals) (setq ins nil addrs nil) (cond ;; phrase:addr1,addr2; ((string-match "[^:]+:[^;]+;" val) (let ((mew-alias-expand-prefix nil)) (setq addrs (mew-alias-expand val mew-addrbook-alist 0)) (setq addrs (mapcar 'mew-draft-append-domain addrs)) (setq ins (list (concat mew-alias-expand-prefix ":;"))))) ;; Name ((and (setq addr (mew-addrstr-parse-address val)) (string-match (concat "\\(.*<\\)" (regexp-quote addr) "\\(>.*\\)") val)) (setq prefix (match-string 1 val)) (setq suffix (match-string 2 val)) (setq addr (mew-draft-append-domain addr)) (setq addrs (list addr)) (setq ins (list (concat prefix addr suffix)))) ;; addr (t (let ((mew-alias-expand-prefix nil)) (setq addrs (mew-alias-expand val mew-addrbook-alist 0)) (setq addrs (mapcar 'mew-draft-append-domain addrs)) (if mew-alias-expand-prefix (setq ins (list (concat mew-alias-expand-prefix ":;"))) (setq ins (copy-sequence addrs)))))) (setq insl (nconc insl ins)) (unless (string-match "bcc" key) ;; Removing Bcc: (setq ret (nconc ret addrs)))) ;; end of dolist (insert " " (mapconcat 'identity insl ", ")) (setq insl nil) (forward-line)))) ret))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Dcc:, Bcc: ;;; (defun mew-encode-delete-dcc (resentp) (let* ((target (list (if resentp mew-resent-dcc: mew-dcc:))) (dcc (mew-header-parse-address-list target))) ;; Dcc: is already contained in recipients. ;; So, just delete it. ;; Delete {Resent-,}Dcc: anyway. (mew-header-delete-lines (list mew-dcc: mew-resent-dcc:)) dcc)) (defun mew-encode-delete-bcc (resentp) (let* ((target (list (if resentp mew-resent-bcc: mew-bcc:))) (bcc (mew-header-parse-address-list target))) (mew-header-delete-lines (list mew-bcc: mew-resent-bcc:)) ;; anyway bcc)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Message-Id:, Date: ;;; (defun mew-encode-id-date (pnm msgid &optional resentp) (let ((time (current-time))) (cond (resentp (mew-header-delete-lines (list mew-resent-date: mew-resent-message-id:)) (save-excursion (goto-char (point-min)) (mew-header-insert mew-resent-date: (mew-time-ctz-to-rfc time)) (mew-header-insert mew-resent-message-id: msgid))) (t (mew-header-delete-lines (list mew-date: mew-message-id:)) (save-excursion (goto-char (point-min)) (mew-header-insert mew-date: (mew-time-ctz-to-rfc time)) (mew-header-insert mew-message-id: msgid)))) (list msgid (mew-time-ctz-to-logtime time)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; From:, Sender: ;;; (defun mew-encode-check-sender (resentp) (if (< 1 (length (mew-addrstr-parse-address-list (mew-header-get-value (if resentp mew-resent-sender: mew-sender:))))) (mew-encode-error "Sender: must contain one address!"))) (defun mew-encode-from (case resentp) (unless (mew-header-existp mew-from:) (let ((from (mew-from case))) (save-excursion (goto-char (point-min)) (if resentp (mew-header-insert mew-resent-from: from) (mew-header-insert mew-from: from)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Learning aliases ;;; ;; xxx Bcc: and/or Dcc:? (defun mew-encode-learn-aliases (resentp) (if (and mew-use-auto-alias mew-addrbook-append-domain-p) ;; If mew-addrbook-append-domain-p is nil, automatic ;; short names would be conflicted to local users. (mapcar 'mew-addrbook-alias-add (mew-header-parse-address-list (if resentp (list mew-resent-to: mew-resent-cc:) (list mew-to: mew-cc:)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Misc ;;; (defun mew-encode-set-privacy (pnm privacy case) (unless (or (mew-syntax-get-privacy mew-encode-syntax) ;; specified ;; encryption previously failed, so bypass. (and (null privacy) (mew-tinfo-get-privacy-err))) (let (type) (cond (privacy (setq type privacy)) ((mew-tinfo-get-privacy-type) (setq type (mew-tinfo-get-privacy-type))) ((and (mew-tinfo-get-encrypted-p) (mew-protect-privacy-encrypted case)) (setq type (mew-protect-privacy-encrypted-type case))) ((mew-protect-privacy-always case) (setq type (mew-protect-privacy-always-type case)))) (mew-syntax-set-privacy mew-encode-syntax (mew-pcdb-ct (mew-pcdb-by-service type))) ;; recipients are ignored when signing (mew-syntax-set-decrypters mew-encode-syntax (mew-smtp-get-recipients pnm))))) (defun mew-encode-make-header (&optional addsep resentp) (unless (mew-header-existp mew-mv:) (goto-char (mew-header-end)) (mew-header-insert mew-mv: mew-mv:-num)) (mew-header-encode-region (point-min) (mew-header-end) resentp) (cond (addsep ;; reedit ;; To: ;; Content-* ;; ---- (mew-header-clear) ;; mew-in-header-p() returns nil ;; To: ;; Content-* (insert "\n")) (t ;; To: ;; ---- ;; Content-* (mew-header-clear) ;; mew-in-header-p returns nil ;; To: ;; Content-* )) (mew-header-goto-end) (mew-highlight-header-region (point-min) (point))) (defun mew-encode-save-draft () (mew-frwlet mew-cs-dummy mew-cs-text-for-write (write-region (point-min) (point-max) (buffer-file-name) nil 'no-msg) (clear-visited-file-modtime) (mew-delete-file buffer-auto-save-file-name) (set-buffer-modified-p nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Encoding a message ;;; (defun mew-smtp-encode (pnm case resentp fcc &optional privacy signer headerp) (let ((ret t)) (if (mew-debug 'encode) (let ((debug-on-error t)) (mew-smtp-encode-message pnm case resentp fcc privacy signer headerp)) (condition-case nil (mew-smtp-encode-message pnm case resentp fcc privacy signer headerp) (error (mew-encode-undo) (message "%s" (mew-tinfo-get-encode-err)) (setq ret nil)) (quit (mew-encode-undo) (message "quit") (setq ret nil)))) ret)) (defun mew-smtp-encode-message (pnm case resentp fcc &optional privacy signer headerp) (mew-set-buffer-multibyte t) (if (buffer-modified-p) (save-buffer)) ;; to make backup (widen) (let (multip recipients msgid logtime) (mew-smtp-set-raw-header pnm (mew-buffer-substring (point-min) (mew-header-end))) (unless headerp ;; Let's backup (if (mew-attach-p) (progn (setq multip t) (mew-attach-clear)) (unless mew-encode-syntax (setq mew-encode-syntax (mew-encode-syntax-single "text.txt" (list mew-ct-txt))))) (mew-encode-make-backup)) ;; Errors can be caused from here. (goto-char (point-min)) (mew-encode-remove-invalid-fields) ;; Destination check (setq recipients (mew-encode-canonicalize-address resentp)) ;; Bcc: is not included. (mew-smtp-set-recipients pnm recipients) (mew-smtp-set-orig-recipients pnm recipients) (cond ((null recipients) (mew-encode-error "No recipient!")) ((stringp recipients) (mew-encode-error (format "'%s' is not in the right form!" recipients)))) ;; Header modifications which are not remained. (mew-header-delete-lines (list mew-fcc: mew-resent-fcc:)) ;; anyway (mew-encode-delete-dcc resentp) (mew-smtp-set-bcc pnm (mew-encode-delete-bcc resentp)) (mew-smtp-set-fcc pnm fcc) ;; (mew-encode-check-sender resentp) (mew-encode-from case resentp) ;; (mew-set '(msgid logtime) (mew-encode-id-date pnm (mew-smtp-message-id case) resentp)) (mew-smtp-set-msgid pnm msgid) (mew-smtp-set-logtime pnm logtime) ;; (goto-char (mew-header-end)) (forward-line) ;; necessary for PGP ;; (message "Making a message...") ;; save syntax before setting privacy (unless headerp (mew-encode-set-privacy pnm privacy case) (let (mew-inherit-encode-pgp-signer mew-inherit-encode-smime-signer) (setq mew-inherit-encode-pgp-signer (or signer (mew-pgp-signer (mew-tinfo-get-case)) (mew-get-my-address))) (setq mew-inherit-encode-smime-signer (or signer (mew-smime-signer (mew-tinfo-get-case)) (mew-get-my-address))) (goto-char (mew-header-end)) ;; due to invalid null lines in the header (forward-line) (if multip (mew-encode-make-multi) (mew-encode-make-single)))) (mew-encode-make-header headerp resentp) ;; Learn aliases after no error occurred (mew-encode-learn-aliases resentp) (mew-encode-save-draft) (mew-overlay-delete-buffer) (message "Making a message...done"))) (defun mew-nntp2-encode (pnm case fcc &optional privacy signer headerp) (let ((ret t)) (if (mew-debug 'encode) (let ((debug-on-error t)) (mew-nntp2-encode-message pnm case fcc privacy signer headerp)) (condition-case nil (mew-nntp2-encode-message pnm case fcc privacy signer headerp) (error (mew-encode-undo) (message "%s" (mew-tinfo-get-encode-err)) (setq ret nil)) (quit (mew-encode-undo) (message "quit") (setq ret nil)))) ret)) (defun mew-nntp2-encode-message (pnm case fcc &optional privacy signer headerp) (mew-set-buffer-multibyte t) (if (buffer-modified-p) (save-buffer)) ;; to make backup (widen) (let (multip newsgroups msgid logtime) (mew-nntp2-set-raw-header pnm (mew-buffer-substring (point-min) (mew-header-end))) ;; Let's backup (unless headerp (if (mew-attach-p) (progn (setq multip t) (mew-attach-clear)) (setq mew-encode-syntax (mew-encode-syntax-single "text.txt" (list mew-ct-txt)))) (mew-encode-make-backup)) ;; Errors can be caused from here. (goto-char (point-min)) (mew-encode-remove-invalid-fields) ;; Newsgroups check (setq newsgroups (mew-header-get-value mew-newsgroups:)) (mew-nntp2-set-newsgroups pnm newsgroups) (unless newsgroups (mew-encode-error "No newsgroups!")) ;; Header modifications which are not remained. (mew-header-delete-lines (list mew-fcc: mew-resent-fcc:)) ;; anyway (mew-nntp2-set-fcc pnm fcc) ;; (mew-encode-from case nil) ;; (mew-set '(msgid logtime) (mew-encode-id-date pnm (mew-nntp-message-id case))) (mew-nntp2-set-msgid pnm msgid) (mew-nntp2-set-logtime pnm logtime) ;; (goto-char (mew-header-end)) (forward-line) ;; necessary for PGP ;; (message "Making a message...") ;; save syntax before setting privacy (unless headerp (mew-encode-set-privacy pnm privacy case) (let (mew-inherit-encode-pgp-signer mew-inherit-encode-smime-signer) (setq mew-inherit-encode-pgp-signer (or signer (mew-pgp-signer (mew-tinfo-get-case)) (mew-get-my-address))) (setq mew-inherit-encode-smime-signer (or signer (mew-smime-signer (mew-tinfo-get-case)) (mew-get-my-address))) (goto-char (mew-header-end)) ;; due to invalid null lines in the header (forward-line) (if multip (mew-encode-make-multi) (mew-encode-make-single)))) (mew-encode-make-header nil) (mew-encode-save-draft) (mew-overlay-delete-buffer) (message "Making a message...done"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Encoding singlepart ;;; (defun mew-encode-make-single () ;; Just after the header ;; Using Multipart/Signed if the body is a single part. (if (equal (mew-syntax-get-privacy mew-encode-syntax) `((,mew-ct-smm ,mew-ct-smm-sig))) (mew-syntax-set-privacy mew-encode-syntax `((,mew-ct-mls ,mew-ct-sms)))) (mew-encode-singlepart mew-encode-syntax nil nil t 'cover)) (defun mew-encode-charset-8bitp (charset) (let ((case-fold-search t)) (if (or (mew-case-equal mew-us-ascii charset) (string-match "^iso-2022" charset)) nil t))) (defun mew-encode-file-8bitp (file) (if (and (mew-which-exec mew-prog-8bit) (file-readable-p file)) (eq (call-process mew-prog-8bit file nil nil "-8") 1))) (defun mew-encode-limit-7bitp (privacy) ;; Only parts to be signed FIRST are limited to 7bit. (and privacy (mew-case-equal mew-ct-mls (car (car privacy))))) (defvar mew-encode-max-line-length 990) ;; RFC 2822 defines 1000 but Sendmail uses 990 (defvar mew-ask-encoding t) (defvar mew-default-encoding mew-b64) (defvar mew-draft-keep-text-charset nil) (defun mew-encode-mime-body (ctl cte file no-encoding) ;; If file is 't', target is buffered. ;; text should be buffered ;; - specified charset is a rare case ;; - copy overhead may be small (let* ((ct (mew-syntax-get-value ctl 'cap)) (textp (mew-ct-textp ct)) (charset (if textp (mew-syntax-get-param ctl "charset"))) (icharset (if textp (mew-syntax-get-param ctl "icharset"))) (linebasep (or textp (mew-ct-linebasep ct))) (switch (if linebasep mew-prog-mime-encode-text-switch mew-prog-mime-encode-switch)) (beg (point)) buffer cs opt last flowed delsp flowed-delsp) (if (and (stringp file) (setq buffer (get-file-buffer file)) (buffer-modified-p buffer)) (with-current-buffer buffer (save-buffer))) (when textp (when (and (stringp file) (file-readable-p file)) (when icharset (setq cs (mew-charset-to-cs icharset)) (unless (mew-coding-system-p cs) (mew-encode-error (format "Unknown coding system %s in the body" (symbol-name cs))))) ;; If a user want to keep text charset, (when (and mew-draft-keep-text-charset (null charset)) (let ((cs (mew-cs-strip-lineinfo (mew-file-guess-coding-system file)))) (if cs (setq charset (mew-cs-to-charset cs))))) (mew-frwlet (or cs mew-cs-autoconv) mew-cs-dummy (mew-insert-file-contents file))) ;; A user may specify charset to convey JIS X 0201 Katakana. ;; So, we need to avoid the sanity check. (unless charset (if mew-use-charset-sanity-check (mew-charset-sanity-check beg (point-max))) (setq charset (mew-charset-guess-region beg (point-max)))) (setq cs (mew-charset-to-cs charset)) (when (string= mew-ct-txt ct) (cond ((mew-tinfo-get-flowed) (setq flowed t) (if (string= (mew-tinfo-get-flowed) "yes") (setq delsp t))) ((mew-tinfo-get-use-flowed) (setq flowed-delsp (mew-encode-flowed beg (point-max) charset)) (mew-set '(flowed delsp) flowed-delsp)))) (unless (mew-coding-system-p cs) (mew-encode-error (format "Unknown coding system %s in the body" (symbol-name cs)))) (mew-cs-encode-region beg (point-max) cs)) ;; decide cte (cond (textp (cond ((and cte (or (mew-case-equal cte mew-b64) (mew-case-equal cte mew-qp))) ;; user specified and in 7bit domain, so do nothing. ) (t (if (or (null cte) (mew-case-equal cte mew-bin)) ;; retain the user-specified cte (setq cte (mew-charset-to-cte charset))) (if (or (null cte) (mew-case-equal cte mew-bin)) ;; unknown charset (setq cte mew-default-encoding)) (cond (no-encoding (if (mew-encode-charset-8bitp charset) (setq cte mew-8bit) (setq cte mew-7bit))) (mew-inherit-7bit (if (mew-case-equal cte mew-8bit) (setq cte mew-default-encoding))) (mew-use-8bit (if (mew-encode-charset-8bitp charset) (setq cte mew-8bit)))) (when (and (not no-encoding) (or (mew-case-equal cte mew-7bit) (mew-case-equal cte mew-8bit))) (save-excursion (goto-char beg) (mew-set-buffer-multibyte nil) (catch 'long-line (while t (setq last (point)) (if (/= (forward-line) 0) (end-of-line)) (when (>= (- (point) last) mew-encode-max-line-length) ;; including LF (if (not mew-ask-encoding) (setq cte mew-default-encoding) (setq cte (mew-input-encoding))) (throw 'long-line nil)) (if (eobp) (throw 'long-line nil)))) (mew-set-buffer-multibyte t)))))) ((string= ct mew-ct-msg) (if (mew-encode-file-8bitp file) (setq cte mew-8bit) (setq cte mew-7bit))) (t (if (and no-encoding cte (mew-case-equal cte mew-b64)) (setq cte mew-bin)) ;; There are 7bit ascii bodies such as ;; application/pgp-encrypted and message/external-body. ;; If 7bit or 8bit, it should be linebase. (if (null cte) (setq cte mew-7bit)))) (cond ((mew-case-equal cte mew-bin) (mew-frwlet mew-cs-binary mew-cs-dummy (mew-insert-file-contents file))) ((or (mew-case-equal cte mew-7bit) (mew-case-equal cte mew-8bit)) ;; Certainly linebase here. (unless textp (mew-frwlet mew-cs-text-for-read mew-cs-dummy (mew-insert-file-contents file))) (when (and (string= ct mew-ct-msg) (or mew-inherit-7bit (not mew-use-8bit)) (mew-case-equal cte mew-8bit)) (save-restriction (setq cte mew-7bit) (narrow-to-region beg (point-max)) (mew-convert-message)))) ((and (mew-case-equal cte mew-b64) (fboundp 'base64-encode-region)) (unless textp (mew-frwlet (if linebasep mew-cs-text-for-read mew-cs-binary) mew-cs-dummy (mew-insert-file-contents file))) (when linebasep (goto-char beg) (mew-lf-to-crlf)) (base64-encode-region beg (point-max)) (goto-char (point-max)) (insert "\n")) ((mew-which-exec mew-prog-mime-encode) (setq opt (mew-prog-mime-encode-get-opt cte switch)) (if (null opt) (mew-encode-error (concat "Unknown CTE: " cte)) (when textp (setq file (mew-make-temp-name)) (mew-frwlet mew-cs-dummy mew-cs-text-for-write ;; NEVER use call-process-region for privacy reasons (write-region beg (point-max) file nil 'no-msg)) (delete-region beg (point-max))) (mew-piolet mew-cs-text-for-read mew-cs-dummy (apply 'call-process mew-prog-mime-encode file t nil opt)) (if textp (mew-delete-file file)))) (t (mew-encode-error (concat mew-prog-mime-encode " does not exist")))) (list cte charset flowed delsp))) (defun mew-encode-no-mime-encoding (privacy) (let ((first (car privacy))) (and (listp first) (or (string= (car first) mew-ct-mle) (string= (car first) mew-ct-smm))))) (defun mew-broken-name (cdpl) (let ((mew-encode-word-max-length 1000) ;; xxx (file (nth 1 (assoc "filename" cdpl))) name) (when (and file (string-match mew-regex-nonascii file)) (setq name (car (mew-header-encode-string file))) ;; name must not be double-quoted here. ;; mew-heaer-insert will do this later (list "name" name)))) (defun mew-encode-flowed (beg end charset) "Encoding lines with RFC 3676" (let (flowed delsp column) (save-excursion (goto-char beg) (save-restriction (narrow-to-region beg end) (when (mew-encode-flowed-check) (setq flowed t) (setq delsp (mew-charset-to-delsp charset)) (setq column mew-flowed-fold-length) (if delsp (setq column (1- column))) (while (not (eobp)) (mew-encode-flowed-line column delsp) (forward-line))))) (list flowed delsp))) (defun mew-encode-flowed-remove-trailing-sp () (while (and (not (bobp)) (= (char-before) mew-sp)) (delete-char -1))) (defun mew-encode-flowed-line (column delsp) (let (prefix beg) (looking-at "^>*") (setq prefix (mew-match-string 0)) (goto-char (match-end 0)) (if (looking-at " ") (if (string= prefix "") (insert mew-flowed-stuffed) (progn (setq prefix (format "%s%c" prefix mew-flowed-stuffed)) (forward-char))) (when (looking-at "From ") (insert mew-flowed-stuffed) (setq prefix (format "%s%c" prefix mew-flowed-stuffed)))) (setq beg (point)) (save-excursion (end-of-line) (unless (and (= (- (point) beg) 3) (string= (mew-buffer-substring beg (point)) "-- ")) (mew-encode-flowed-remove-trailing-sp))) (move-to-column column) (catch 'loop (while (not (eolp)) (cond (delsp (while (> (current-column) column) (backward-char 1)) (insert " \n")) (t (if (search-backward " " beg t) (forward-char) (unless (search-forward " " (save-excursion (end-of-line) (point)) t) (throw 'loop (end-of-line)))) (insert "\n"))) (insert prefix) (setq beg (point)) (move-to-column column))))) (defun mew-encode-flowed-check () (catch 'loop (save-excursion (save-restriction (narrow-to-region (point-min) (min (point-max) mew-file-max-size)) (goto-char (point-min)) (while (not (eobp)) (end-of-line) (if (> (current-column) mew-flowed-fold-threshold) (throw 'loop t)) (forward-line)))))) (defun mew-encode-singlepart (syntax &optional path depth buffered coverp) ;; path is nil if called make-single or security multipart ;; buffered is t if called make-single (run-hook-with-args 'mew-encode-singlepart-hook syntax path depth buffered) (let* ((file (expand-file-name (mew-syntax-get-file syntax) path)) (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap)) (cte (mew-syntax-get-cte syntax)) (cd (mew-syntax-get-cd syntax)) (cdpl (mew-syntax-get-cdp syntax)) (privacy (mew-syntax-get-privacy syntax)) (no-encoding (mew-encode-no-mime-encoding privacy)) (mew-inherit-7bit (mew-encode-limit-7bitp privacy)) (beg (point)) mret charset bodybeg cst ask-cst broken-name flowed delsp) (setq mret (mew-encode-mime-body ctl cte (or buffered file) no-encoding)) (goto-char beg) (mew-set '(cte charset flowed delsp) mret) (setq ctl (mew-delete "icharset" ctl)) (when charset (setq ctl (mew-syntax-get-params ctl)) (setq ctl (mew-delete "charset" ctl)) (setq ctl (cons ct (cons (list "charset" charset) ctl)))) (when flowed (setq ctl (nconc ctl (list (list "format" "flowed")))) (if delsp (setq ctl (nconc ctl (list (list "delsp" "yes")))))) ;; (setq ctl (mew-delete "name" ctl)) (setq broken-name (mew-broken-name cdpl)) (if broken-name (setq ctl (nconc ctl (list broken-name)))) ;; (mew-header-insert mew-ct: ctl) (mew-header-insert mew-cte: cte) (and cd (mew-header-insert mew-cd: cd)) (and cdpl (mew-header-insert mew-cdp: cdpl)) (insert "\n") ;; header "\n" (cur) [text] (setq bodybeg (point)) (goto-char (point-max)) (when (and (string= ct mew-ct-msg) mew-field-delete-for-forwarding) (save-restriction (narrow-to-region bodybeg (point-max)) (mew-header-delete-lines mew-field-delete-common) (mew-header-delete-lines mew-field-delete-for-forwarding))) (when privacy (mew-encode-security-multipart beg privacy depth (mew-syntax-get-decrypters syntax) cte)) (goto-char (point-max)) (when (and coverp (setq cst charset)) (cond ((null mew-ask-charset) ;; not ask ) ((eq mew-ask-charset t) (if (mew-member-case-equal cst mew-cs-m17n-list) (setq ask-cst t))) ((listp mew-ask-charset) (unless (mew-member-case-equal cst mew-ask-charset) (setq ask-cst t)))) (if (and ask-cst (not (y-or-n-p (format "%s is used. OK? " cst)))) (mew-encode-error "Modify body"))) (mew-case-equal cte mew-8bit))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Encoding multipart ;;; (defun mew-encode-make-multi () ;; Just after the header (let (beg path multip buffered privacy decrypters first ct) (if (mew-encode-syntax-have-one-part) ;; A user may want to do any MIME stuff to the body (progn (setq mew-encode-syntax (mew-syntax-get-part mew-encode-syntax)) (setq buffered t)) ;; See if a cover page is empty or not (setq beg (point)) (save-excursion (while (and (looking-at "^$") (not (eobp))) (forward-line)) (unless (eobp) ;; The cover page exists. (setq buffered t))) (setq path (mew-expand-folder mew-attach-folder)) (if buffered ;; The cover page exists. (setq multip t) ;; The cover page does not exist. (delete-region beg (point-max)) ;; Remove the cover page entry from the syntax. (setq mew-encode-syntax (mew-syntax-remove-entry mew-encode-syntax '(1))) ;; After removing the over page, see if this message has ;; only one text part. (if (not (mew-encode-syntax-have-one-part)) (setq multip t) (setq first (mew-syntax-get-part mew-encode-syntax)) (setq ct (mew-syntax-get-value (mew-syntax-get-ct first) 'cap)) (if (not (mew-ct-textp ct)) (setq multip t) (setq path (expand-file-name (mew-syntax-get-file mew-encode-syntax) path)) (setq privacy (mew-syntax-get-privacy mew-encode-syntax)) (setq decrypters (mew-syntax-get-decrypters mew-encode-syntax)) (setq mew-encode-syntax (mew-syntax-get-part mew-encode-syntax)) (mew-syntax-set-privacy mew-encode-syntax privacy) (mew-syntax-set-decrypters mew-encode-syntax decrypters))))) (if multip (mew-encode-multipart mew-encode-syntax path 0 buffered) (mew-encode-singlepart mew-encode-syntax path nil nil 'cover)))) (defvar mew-default-boundary "--%s(%s_%s)--") (defun mew-boundary-get (&optional string) ;; boundary is less than or equal to 70 (unless string (setq string "Next_Part")) (format mew-default-boundary string (mew-replace-character (mew-replace-character (current-time-string) mew-sp ?_) ?: ?_) (mew-random-string 3 t))) (defun mew-encode-multipart (syntax path depth &optional buffered cte) (let* ((boundary (mew-boundary-get ;; 0 is nil for Next_Part (if (> depth 0) (format "BOUNDARY%s" (number-to-string depth))))) (fullname (expand-file-name (mew-syntax-get-file syntax) path)) (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap)) (cd (mew-syntax-get-cd syntax)) (privacy (mew-syntax-get-privacy syntax)) (mew-inherit-7bit (mew-encode-limit-7bitp privacy)) (len (length syntax)) (beg (point)) (cnt mew-syntax-magic) (8bit-cnt 0) 8bitp cte-pos cover) (mew-header-insert mew-ct: (list ct (list "boundary" boundary))) (setq cte-pos (point)) (and cd (mew-header-insert mew-cd: cd)) (while (< cnt len) (insert "\n--" boundary "\n") (if (mew-syntax-multipart-p (aref syntax cnt)) (setq 8bitp (mew-encode-multipart (aref syntax cnt) fullname (1+ depth))) (if (and (= depth 0) (= cnt mew-syntax-magic )) (setq cover t) (setq cover nil)) (setq 8bitp (mew-encode-singlepart (aref syntax cnt) fullname (1+ depth) (if (eq cnt mew-syntax-magic) buffered nil) cover))) (if 8bitp (setq 8bit-cnt (1+ 8bit-cnt))) (setq cnt (1+ cnt))) (insert "\n--" boundary "--\n") (save-excursion (goto-char cte-pos) (mew-header-insert mew-cte: (if (> 8bit-cnt 0) mew-8bit mew-7bit))) (when privacy (mew-encode-security-multipart beg privacy depth (mew-syntax-get-decrypters syntax) cte)) (goto-char (point-max)) (> 8bit-cnt 0))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Privacy services ;;; (defun mew-encode-security-multipart (beg privacy depth decrypters cte) (save-restriction (narrow-to-region beg (point-max)) (let (proto ct) (dolist (ent privacy) (goto-char (point-min)) (mew-set '(ct proto) ent) (setq ct (mew-capitalize ct)) (cond ((string= ct mew-ct-mle) (mew-encode-multipart-encrypted ct proto depth decrypters cte)) ((string= ct mew-ct-mls) (mew-encode-multipart-signed ct proto depth)) ((string= ct mew-ct-smm) (mew-encode-smime proto cte decrypters))))))) (defun mew-security-multipart-boundary (depth) (if depth (mew-boundary-get (format "Security_Multipart%s" (number-to-string depth))) (mew-boundary-get "Security_Multipart"))) (defun mew-save-transfer-form (beg end retain &optional cte) ;; called in the narrowed region (let ((sbeg beg) (send end) (draft-buf (current-buffer)) (ocs mew-cs-text-for-net) tmpbuf file) (if retain (progn (setq tmpbuf (generate-new-buffer mew-buffer-prefix)) (set-buffer tmpbuf) (mew-erase-buffer) (mew-insert-buffer-substring draft-buf beg end) (setq sbeg (point-min) send (point-max)))) (goto-char sbeg) ;; just in case (if (and cte (mew-case-equal cte mew-bin) (re-search-forward mew-eoh)) (progn (setq ocs mew-cs-binary) (forward-line) (save-restriction (narrow-to-region sbeg (point)) (goto-char sbeg) (mew-lf-to-crlf))) (unless mew-cs-text-for-net (goto-char sbeg) ;; just in case (mew-lf-to-crlf))) (setq send (point-max)) (setq file (mew-make-temp-name)) (mew-frwlet mew-cs-dummy ocs (write-region sbeg send file nil 'no-msg)) (if retain (mew-remove-buffer tmpbuf) (delete-region sbeg send)) (set-buffer draft-buf) file)) ;; return value (defun mew-encode-multipart-encrypted (ct proto depth decrypters cte) ;; called in the narrowed region (let* ((boundary (mew-security-multipart-boundary depth)) (switch mew-encode-multipart-encrypted-switch) ;; save length (func (mew-encode-get-security-func proto switch)) file1 file2 file3 cte2 cte3 fc errmsg) ;; Write the part converting line breaks. (setq file1 (mew-save-transfer-form (point-min) (point-max) nil cte)) ;; The narrowed region stores nothing ;; Call the protocol function (condition-case nil (setq fc (funcall func file1 decrypters)) (error (mew-delete-file file1) (mew-encode-error (format "unknown error for %s. Check %s, anyway" mew-ct-mle mew-temp-dir)))) (mew-set '(file2 cte2 file3 cte3 errmsg) fc) (if errmsg (progn (mew-delete-file file1) (mew-delete-file file2) (mew-delete-file file3) (mew-tinfo-set-privacy-err t) (mew-tinfo-set-privacy-type nil) (mew-draft-mode-name) (mew-encode-error errmsg)) ;; Create multipart content-header (mew-header-insert mew-ct: (list ct (list "protocol" proto) (list "boundary" boundary))) (mew-header-insert mew-cte: mew-7bit) (insert (format "\n--%s\n" boundary)) ;; Insert control keys (mew-encode-singlepart (mew-encode-syntax-single file2 (list proto) cte2)) (insert (format "\n--%s\n" boundary)) ;; Insert encrypted body (mew-encode-singlepart (mew-encode-syntax-single file3 mew-type-apo cte3)) (insert (format "\n--%s--\n" boundary)) ;; Throw away the garbage (mew-delete-file file1) (mew-delete-file file2) (mew-delete-file file3)))) (defun mew-encode-multipart-signed (ct proto depth) ;; called in the narrowed region (let* ((boundary (mew-security-multipart-boundary depth)) (switch mew-encode-multipart-signed-switch) ;; save length (func (mew-encode-get-security-func proto switch)) (canon-func (mew-encode-get-canonicalize-func proto switch)) file1 file2 micalg cte2 fmc errmsg ct2 cdp2) (if (fboundp canon-func) (funcall canon-func)) (setq file1 (mew-save-transfer-form (point-min) (point-max) 'retain)) ;; The narrowed region still the ORIGINAL part (i.e. line breaks are LF) ;; Call the protocol function (condition-case nil (setq fmc (funcall func file1)) (error (mew-delete-file file1) (mew-encode-error (format "unknown error for %s. Check %s, anyway" mew-ct-mls mew-temp-dir)))) (mew-set '(file2 cte2 micalg errmsg ct2 cdp2) fmc) (if errmsg (progn (mew-delete-file file1) (mew-delete-file file2) (mew-tinfo-set-privacy-err t) (mew-tinfo-set-privacy-type nil) (mew-draft-mode-name) (mew-encode-error errmsg)) (goto-char (point-min)) ;; Before the signed part ;; Create multipart content-header (mew-header-insert mew-ct: (list ct (list "protocol" proto) (list "micalg" micalg) (list "boundary" boundary))) (mew-header-insert mew-cte: mew-7bit) (insert (format "\n--%s\n" boundary)) (goto-char (point-max)) ;; After the signed part (insert (format "\n--%s\n" boundary)) (mew-encode-singlepart (mew-encode-syntax-single file2 (or ct2 (list proto)) cte2 nil nil cdp2)) (insert (format "\n--%s--\n" boundary)) ;; Throw away the garbage (mew-delete-file file1) (mew-delete-file file2)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; 8bit to 7bit conversion for Multipart/Security ;;; (defun mew-convert-mime-body (beg end cte linebasep) (let* ((switch (if linebasep mew-prog-mime-encode-text-switch mew-prog-mime-encode-switch)) file opt) (save-restriction (narrow-to-region beg end) (cond ((and (mew-case-equal cte mew-b64) (fboundp 'base64-encode-region)) (when linebasep (goto-char (point-min)) (mew-lf-to-crlf)) (base64-encode-region (point-min) (point-max)) (goto-char (point-max)) (insert "\n")) ((mew-which-exec mew-prog-mime-encode) (setq opt (mew-prog-mime-encode-get-opt cte switch)) (if (null opt) (mew-encode-error (concat "Unknown CTE: " cte)) (setq file (mew-make-temp-name)) (mew-frwlet mew-cs-dummy (if linebasep mew-cs-text-for-write mew-cs-binary) ;; NEVER use call-process-region for privacy reasons (write-region (point-min) (point-max) file nil 'no-msg) (delete-region (point-min) (point-max))) (mew-piolet mew-cs-text-for-read mew-cs-dummy (apply 'call-process mew-prog-mime-encode file t nil opt)) (mew-delete-file file))) (t (mew-encode-error (concat mew-prog-mime-encode " does not exist"))))))) (defun mew-convert-message () ;; called on the beginning of a header (let ((case-fold-search t) (buf (current-buffer)) hd-end mimep charset cte body-beg body-end) (unless (re-search-forward mew-eoh nil t) (goto-char (point-max))) (setq hd-end (point-marker)) (goto-char (point-min)) (if (re-search-forward (concat "^" mew-mv:) (marker-position hd-end) t) (setq mimep t)) (cond (mimep (goto-char (point-min)) (mew-convert-singlepart) (mew-header-delete-lines (list mew-mv:)) (goto-char hd-end) (mew-header-insert mew-mv: (concat mew-mv:-num " " mew-field-comment))) (t (goto-char hd-end) (forward-line) (setq body-beg (point)) (setq body-end (point-max)) (with-temp-buffer (mew-insert-buffer-substring buf body-beg body-end) (mew-cs-decode-region (point-min) (point-max) mew-cs-autoconv) (setq charset (mew-charset-guess-region (point-min) (point-max)))) (when (mew-encode-charset-8bitp charset) (setq cte (mew-charset-to-cte charset)) (if (null cte) (setq cte mew-b64)) (mew-convert-mime-body body-beg (point-max) cte 'linebasep) (goto-char (point-min)) (mew-header-delete-lines (list "Content-")) (goto-char hd-end) (mew-header-insert mew-mv: mew-mv:-num) (mew-header-insert mew-ct: (list mew-ct-txt (list "charset" charset))) (mew-header-insert mew-cte: cte)))))) (defun mew-convert-singlepart (&optional dctl) ;; called on the beginning of a content-header (let ((case-fold-search t) cthd-end ctbody-beg ct-val cte-val ctl ct cte charset) (unless (re-search-forward mew-eoh nil t) (goto-char (point-max))) (setq cthd-end (point-marker)) (forward-line) (setq ctbody-beg (point)) (goto-char (point-min)) (if (not (re-search-forward (concat "^" mew-cte: "[ \t]*") nil t)) (setq cte mew-7bit) (setq cte-val (point-marker)) (forward-line) (mew-header-goto-next) (setq cte (mew-addrstr-parse-value (mew-buffer-substring cte-val (1- (point)))))) (when (or (mew-case-equal cte mew-8bit) (mew-case-equal cte mew-bin)) (goto-char (point-min)) (if (not (re-search-forward (concat "^" mew-ct: "[ \t]*") nil t)) (setq ctl (or dctl mew-type-txt)) (setq ct-val (point)) (forward-line) (mew-header-goto-next) (setq ctl (mew-param-decode (mew-buffer-substring ct-val (1- (point))))) (setq ct (mew-syntax-get-value ctl 'cap)) (cond ((mew-ct-multipartp ct) (if (or (string= ct mew-ct-mle) (string= ct mew-ct-mls)) () (mew-convert-multipart ctl)) (setq cte mew-7bit)) ((mew-ct-messagep ct) (if (string= ct mew-ct-msg) (mew-convert-message)) (setq cte mew-7bit)) ((mew-ct-textp ct) (setq charset (mew-syntax-get-param ctl "charset")) (setq cte (mew-charset-to-cte charset)) (if (or (null cte) (mew-case-equal cte mew-8bit) (mew-case-equal cte mew-bin)) (setq cte mew-b64)) (unless (mew-case-equal cte mew-7bit) (mew-convert-mime-body ctbody-beg (point-max) cte 'linebasep))) (t ;; rare case (setq cte (mew-ctdb-cte (mew-ctdb-by-ct ct))) (if (or (null cte) (mew-case-equal cte mew-8bit) (mew-case-equal cte mew-bin)) (setq cte mew-b64)) (unless (mew-case-equal cte mew-7bit) (mew-convert-mime-body ctbody-beg (point-max) cte (mew-ct-linebasep ct)))) (goto-char (point-min))) (mew-header-delete-lines (list mew-cte:)) (goto-char cthd-end) (mew-header-insert mew-cte: (concat cte " " mew-field-comment)))))) (defun mew-convert-multipart (ctl) (let* ((case-fold-search nil) ;; boundary is case sensitive (ct (mew-syntax-get-value ctl 'cap)) (dctl (if (string= ct mew-ct-mld) mew-type-msg)) (boundary (regexp-quote (mew-syntax-get-param ctl "boundary"))) obound ebound bregex start break) (unless boundary (mew-encode-error "No boundary parameter for multipart")) (setq obound (concat "--" boundary)) (setq ebound (concat "--" boundary "--")) (setq bregex (concat "^--" boundary "\\(\\|--\\)$")) (unless (re-search-forward (concat "^" obound "$") nil t) (mew-encode-error (format "No first boundary for %s" ct))) (forward-line) (setq start (point)) ;; the beginning of the part (catch 'multipart (while t (unless (re-search-forward bregex nil t) (mew-encode-error (format "No last boundary for %s" ct))) (setq break (string= (regexp-quote (match-string 0)) ebound)) (forward-line) ;; the beginning of the next part (save-excursion (forward-line -1) (beginning-of-line) ;; just in case (forward-char -1) ;; skip the preceding CRLF ;; the end of the part (save-restriction (narrow-to-region start (point)) (goto-char (point-min)) ;; the beginning of the part (mew-convert-singlepart dctl))) (setq start (point)) ;; the beginning of the part (if break (throw 'multipart nil)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Backup and undo ;;; (defun mew-encode-make-backup () (let* ((file (buffer-file-name)) (back (mew-prepend-prefix file mew-backup-prefix)) (info (concat file mew-draft-info-suffix))) (mew-frwlet mew-cs-dummy mew-cs-m17n (write-region (point-min) (point-max) back nil 'no-msg)) (mew-lisp-save info (list (cons "Syntax:" mew-encode-syntax) (cons "Case:" (mew-tinfo-get-case)) (cons "Flowed:" (mew-tinfo-get-flowed)) (cons "Use-Flowed:" (mew-tinfo-get-use-flowed)) (cons "Message:" (mew-tinfo-get-hdr-file))) ;; Header mode 'nobackup) nil)) ;; to save (defun mew-encode-load-syntax () (let* ((file (buffer-file-name)) (info (concat file mew-draft-info-suffix)) syntax) (when (file-exists-p info) (setq syntax (mew-lisp-load info)) (setq mew-encode-syntax (cdr (assoc "Syntax:" syntax))) (if (and mew-encode-syntax (mew-syntax-singlepart-p mew-encode-syntax)) (setq mew-encode-syntax nil)) (mew-tinfo-set-case (cdr (assoc "Case:" syntax))) (mew-tinfo-set-flowed (cdr (assoc "Flowed:" syntax))) (mew-tinfo-set-flowed (cdr (assoc "Use-Flowed:" syntax))) (mew-tinfo-set-hdr-file (cdr (assoc "Message:" syntax))) ;; Header mode t))) (defun mew-encode-insert-backup () (let* ((file (buffer-file-name)) (back (mew-prepend-prefix file mew-backup-prefix))) (when (file-exists-p back) (mew-frwlet mew-cs-m17n mew-cs-dummy (mew-insert-file-contents back))))) (defun mew-encode-undo () "Get back to the draft before making MIME message." (interactive) (mew-elet (if (not (mew-encode-load-syntax)) (message "Cannot undo") (mew-erase-buffer) (if (not (mew-encode-insert-backup)) (message "Cannot undo") (mew-header-clear) ;; erase the old header separator (mew-header-prepared) (if mew-encode-syntax (mew-draft-prepare-attachments)) (mew-draft-toolbar-update) (setq buffer-undo-list nil))))) (provide 'mew-encode) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-encode.el ends here kazu-yamamoto-Mew-ff9c41b/mew-env.el000066400000000000000000000253031256455547000174560ustar00rootroot00000000000000;;; mew-env.el --- Environment setup for Mew ;; Author: Kazu Yamamoto ;; Created: Mar 6, 1997 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Suppressing warnings at compile ;;; (defmacro mew-no-warning-defvar (var-name) `(unless (boundp ',var-name) (defvar ,var-name nil))) (defmacro mew-no-warning-defun (func-name) `(unless (fboundp ',func-name) (defun ,func-name(&rest args) nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; ;;; ;; to avoid competition with mh-e.el, sigh. (let ((ent (rassq 'mh-letter-mode auto-mode-alist))) (and ent (setq auto-mode-alist (delq ent auto-mode-alist)))) (defvar mew-connection-type1 nil "Connection type for many processes. 't' means PTY and 'nil' means PIPE. PIPE is usually recommended for speed but some OSes such as Linux requires PTY.") (defvar mew-connection-type2 t "Connection type for processes that requires a password.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Emacsen ;;; (if window-system (require 'faces)) (defvar mew-icon-p (and (featurep 'tool-bar) window-system)) (defvar mew-internal-utf-8p nil) (if (or (fboundp 'utf-translate-cjk-mode) ;; Emacs 22.1 or later (coding-system-p 'utf-8-emacs)) (setq mew-internal-utf-8p t)) (require 'mew-key) (require 'mew-gemacs) (require 'mew-mule3) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Misc ;;; (defun mew-mark () (marker-position (mark-marker))) (defun mew-md5 (str) (md5 str nil nil 'binary)) (defun mew-timer (sec func) (run-at-time sec sec func)) (if (fboundp 'characterp) (defalias 'mew-characterp 'characterp) (defalias 'mew-characterp 'integerp)) (if (fboundp 'mouse-region-match) (defalias 'mew-mouse-region-p 'mouse-region-match) (defmacro mew-mouse-region-p (&rest args) nil)) (cond ((boundp 'auto-hscroll-mode) ;; Emacs 21.3.50 or later (defun mew-hscroll () (set (make-local-variable 'auto-hscroll-mode) t))) ((boundp 'automatic-hscrolling) ;; Emacs 21.3 or earlier (defun mew-hscroll () (set (make-local-variable 'automatic-hscrolling) t)))) (if (fboundp 'minibuffer-prompt-end) (defalias 'mew-minibuf-point-min 'minibuffer-prompt-end) (defalias 'mew-minibuf-point-min 'point-min)) (eval-when-compile (unless (fboundp 'with-no-warnings) (defmacro with-no-warnings (&rest body) `(progn ,@body)))) (if (fboundp 'set-process-query-on-exit-flag) (defun mew-process-silent-exit (pro) (set-process-query-on-exit-flag pro nil)) (with-no-warnings (defun mew-process-silent-exit (pro) (process-kill-without-query pro)))) ;; Emacs 21.4 (with-no-warnings (defun mew-set-coding-priority (pri) (set-coding-priority pri))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sticky ;;; (defun mew-front-sticky (beg end) (put-text-property beg end 'front-sticky t)) (defun mew-front-nonsticky (beg end) (put-text-property beg end 'front-sticky nil)) (defun mew-rear-sticky (beg end) (put-text-property beg end 'rear-nonsticky nil)) (defun mew-rear-nonsticky (beg end) (put-text-property beg end 'rear-nonsticky t)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Overlay ;;; (defun mew-overlay-make (beg end) (let ((ovl (make-overlay beg end))) (overlay-put ovl 'mew t) ovl)) (defun mew-overlay-delete (ovl) (and (overlay-get ovl 'mew) (delete-overlay ovl))) (defun mew-overlay-delete-region (beg end) "Delete overlays in the region." (interactive "r") (mapc 'mew-overlay-delete (overlays-in beg end)) (if (fboundp 'remove-images) (remove-images beg end))) ;; xxx (defun mew-overlay-delete-buffer () (save-restriction (widen) (mew-overlay-delete-region (point-min) (point-max)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; File operations ;;; (cond ((fboundp 'make-symbolic-link) (defun mew-symbolic-link (filename newname &optional OK-IF-ALREADY-EXISTS) (if (file-directory-p (file-chase-links filename)) (error "Cannot make a symbolic link to directory") (make-symbolic-link filename newname OK-IF-ALREADY-EXISTS))) (defun mew-link (filename newname &optional OK-IF-ALREADY-EXISTS) (if (file-directory-p (file-chase-links filename)) (error "Cannot make a link to directory") (condition-case nil (add-name-to-file filename newname OK-IF-ALREADY-EXISTS) (file-error (copy-file filename newname OK-IF-ALREADY-EXISTS 'keepdate)))))) (t (defun mew-symbolic-link (filename newname &optional OK-IF-ALREADY-EXISTS) (if (file-directory-p filename) (error "Cannot make a copy of directory") (copy-file filename newname OK-IF-ALREADY-EXISTS 'keepdate))) (defun mew-link (filename newname &optional OK-IF-ALREADY-EXISTS) (if (file-directory-p filename) (error "Cannot make a copy of directory") (copy-file filename newname OK-IF-ALREADY-EXISTS 'keepdate))))) (if (and (fboundp 'set-file-times) (memq system-type '(darwin windows-nt cygwin))) (defalias 'mew-set-file-times 'set-file-times) (defmacro mew-set-file-times (&rest args) nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Property ;;; (defalias 'mew-buffer-substring 'buffer-substring-no-properties) (if (fboundp 'match-string-no-properties) (defalias 'mew-match-string 'match-string-no-properties) (defalias 'mew-match-string 'match-string)) (defun mew-insert-buffer-substring (buf beg end) (insert (with-current-buffer buf (mew-buffer-substring beg end)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Base64 ;;; (defun mew-base64-encode-string (str) (base64-encode-string str 'no-line-break)) (defun mew-base64-decode-string (str64) (condition-case nil (base64-decode-string str64) (error nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Language ;;; ;; to load the thread separator (cond ((and (boundp 'current-language-environment) (string= current-language-environment "Japanese")) (require 'mew-lang-jp)) ((and (boundp 'current-language-environment) (string= current-language-environment "Korean")) (require 'mew-lang-kr))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Unix and Mac ;;; (if (fboundp 'unix-sync) (defalias 'mew-unix-sync 'unix-sync) (defmacro mew-unix-sync (&rest args) nil)) (if (fboundp 'mac-set-file-type) (defalias 'mew-mac-set-file-type 'mac-set-file-type) (defmacro mew-mac-set-file-type (&rest args) nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Face ;;; (cond ((fboundp 'face-all-attributes) ;; Emacs 23 (defalias 'mew-face-spec-func 'cons) (defun mew-face-spec-primitive (col bold) (if col (if bold (list :foreground col :weight 'bold) (list :foreground col :weight 'normal)) (if bold (list :weight 'bold) (list :weight 'normal))))) (t (defalias 'mew-face-spec-func 'list) (defun mew-face-spec-primitive (col bold) (if col (if bold (list :foreground col :bold t) (list :foreground col)) (if bold (list :bold t) nil))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Misc ;;; (if (fboundp 'fill-match-adaptive-prefix) (defalias 'mew-fill-match-adaptive-prefix 'fill-match-adaptive-prefix) ;; Emacs 21.4 (defun mew-fill-match-adaptive-prefix () (let ((str (or (and adaptive-fill-function (funcall adaptive-fill-function)) (and adaptive-fill-regexp (looking-at adaptive-fill-regexp) (match-string-no-properties 0))))) (if (>= (+ (current-left-margin) (length str)) (current-fill-column)) ;; Death to insanely long prefixes. nil str)))) (if (fboundp 'create-animated-image) (defalias 'mew-create-image 'create-animated-image) (defalias 'mew-create-image 'create-image)) (if (fboundp 'run-mode-hooks) (defun mew-run-mode-hooks (&rest funcs) (apply 'run-mode-hooks funcs)) (defun mew-run-mode-hooks (&rest funcs) (apply 'run-hooks funcs))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Unix/Mac/Win ;;; (cond ((memq system-type '(windows-nt cygwin)) (defun mew-set-file-type (file) ()) (defvar mew-cs-est 'shift_jis) (defun mew-focus-frame (frame) (if (fboundp 'w32-focus-frame) (w32-focus-frame frame)))) ((eq system-type 'darwin) (defun mew-set-file-type (file) (unless mew-use-suffix (mew-mac-set-file-type file mew-file-type))) (defvar mew-cs-est 'utf-8) (defun mew-focus-frame (frame) (when focus-follows-mouse (set-mouse-position (selected-frame) (1- (frame-width)) 0)))) (t (defun mew-set-file-type (file) ()) (defvar mew-cs-est 'utf-8) (defun mew-focus-frame (frame) (when focus-follows-mouse (set-mouse-position (selected-frame) (1- (frame-width)) 0))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Unix/Mac/Win ;;; (cond ((>= emacs-major-version 24) ;; this must be macro. If implemented as a function, its behavior ;; is changed. (defmacro mew-called-interactively-p () '(called-interactively-p 'interactive))) (t (defalias 'mew-called-interactively-p 'called-interactively-p))) (provide 'mew-env) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-env.el ends here kazu-yamamoto-Mew-ff9c41b/mew-exec.el000066400000000000000000000550331256455547000176150ustar00rootroot00000000000000;;; mew-exec.el ;; Author: Kazu Yamamoto ;; Created: Mar 2, 1997 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; exec-func ;;; (defun mew-mark-kill-refile (src msg) (let ((refinfo (mew-refile-get msg)) myself) (setq myself (or (null refinfo) (member src refinfo))) (if myself (mew-summary-refile-remove-body)) (not myself))) (defun mew-mark-exec-refile (src msgs) "Refile MSGs from the SRC folder." (let (dsts tmp msg-dsts dsts-msgses) (dolist (msg msgs) (setq msg-dsts (mew-refile-get msg)) (setq dsts (cdr msg-dsts)) (if dsts ;; sanity check (if (setq tmp (assoc dsts dsts-msgses)) (nconc tmp (list msg)) (setq dsts-msgses (cons (list dsts msg) dsts-msgses)))) (mew-refile-reset msg)) ;; refile at once (dolist (dsts-msgs dsts-msgses) (mew-summary-mv-msgs src dsts-msgs)))) (defun mew-mark-exec-unlink (src dels) "Unlink DELS from the SRC folder. DELS represents the messages to be deleted." (when dels (mew-summary-unlink-msgs src dels))) (defun mew-mark-exec-delete (src dels) "Delete messages from the SRC folder according to 'mew-trash-folder' and 'mew-trash-folder-list'. DELS represents the messages to be deleted." (when dels ;; see also mew-summary-exec-remote-get-execinfo. (cond ((null mew-trash-folder) (mew-summary-unlink-msgs src dels)) (mew-trash-folder-list (if (or (member src mew-trash-folder-list) (string= src mew-trash-folder)) (mew-summary-unlink-msgs src dels) (mew-summary-totrash-msgs src dels))) (t (if (string= src mew-trash-folder) (mew-summary-unlink-msgs src dels) (mew-summary-totrash-msgs src dels)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; sanity-func ;;; (defun mew-mark-sanity-refile (msgs) "Check the destination folder for MSGS." (let (uniq-dsts udst err-dsts dir) (dolist (msg msgs) (dolist (dst (cdr (mew-refile-get msg))) (mew-addq uniq-dsts dst))) (mew-addq uniq-dsts mew-trash-folder) (dolist (uniq-dst uniq-dsts) (setq udst (mew-case-folder mew-inherit-exec-case uniq-dst)) (setq dir (mew-expand-folder udst)) (if (file-exists-p dir) (if (file-directory-p dir) (unless (file-writable-p dir) (set-file-modes dir mew-folder-mode)) (setq err-dsts (cons udst err-dsts))) ;; NG (mew-make-directory dir))) err-dsts)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Unlinking, moving, to-trash ;;; (defun mew-folder-suffix (folder) (if (or (mew-folder-queuep folder) (mew-folder-postqp folder)) mew-queue-info-suffix (if (mew-folder-draftp folder) mew-draft-info-suffix))) (defun mew-summary-unlink-msgs (src dels) (let ((suffix (mew-folder-suffix src)) file infofile) (dolist (del dels) (setq file (mew-expand-msg src del)) ;; if file does not exist, the marked line will be deleted anyway. (mew-delete-file file) (when suffix (setq infofile (concat file suffix)) (mew-delete-file infofile))))) (defun mew-i2s (num cache) (if cache (concat "0" (number-to-string num)) ;; "0" is the mark for invalid messages (number-to-string num))) (defun mew-summary-mv-msgs (src dsts-msgs) (let* ((dsts (car dsts-msgs)) ;; (+foo +bar) (msgs (cdr dsts-msgs)) ;; (1 2 3) (srcx (mew-case:folder-folder src)) (myselfp (member srcx dsts)) (cache mew-inherit-offline) (suffix (mew-folder-suffix srcx)) msgs- srcfile dstfile dst num strnum infofile) (if myselfp ;; msg stays in the src folder with the same number (progn (setq dsts (delete srcx dsts)) (dolist (msg msgs) (if (file-regular-p (mew-expand-msg src msg)) (setq msgs- (cons msg msgs-)))) (setq msgs- (nreverse msgs-)) (setq msgs msgs-)) (setq dst (mew-case-folder mew-inherit-exec-case (car dsts))) (setq dsts (cdr dsts)) (setq num (string-to-number (mew-folder-new-message dst 'num-only cache))) (dolist (msg msgs) (setq srcfile (mew-expand-msg src msg)) (when (and (file-exists-p srcfile) (file-writable-p srcfile)) (setq strnum (mew-i2s num cache)) (setq msgs- (cons strnum msgs-)) (setq dstfile (mew-expand-new-msg dst strnum)) (setq num (1+ num)) (rename-file srcfile dstfile 'override) (mew-set-file-times dstfile) (when suffix (setq infofile (concat srcfile suffix)) (mew-delete-file infofile)))) (mew-touch-folder dst) (setq msgs- (nreverse msgs-)) (setq src dst)) ;; myselfp (dolist (ent dsts) (setq dst (mew-case-folder mew-inherit-exec-case ent)) (setq num (string-to-number (mew-folder-new-message dst 'num-only cache))) (dolist (msg msgs-) (setq srcfile (mew-expand-msg src msg)) (setq strnum (mew-i2s num cache)) (setq dstfile (mew-expand-new-msg dst strnum)) (setq num (1+ num)) (mew-link srcfile dstfile)) (mew-touch-folder dst)))) (defun mew-summary-totrash-msgs (src dels) (let* ((trash (mew-case-folder mew-inherit-exec-case mew-trash-folder)) (trashdir (mew-expand-folder trash)) (cache mew-inherit-offline) (suffix (mew-folder-suffix src)) num srcfile dstfile infofile) (unless (file-directory-p trashdir) (make-directory trashdir)) (setq num (string-to-number (mew-folder-new-message trash 'num-only cache))) ;; must be here after ensuring that +trash exists. (dolist (del dels) (setq srcfile (mew-expand-msg src del)) ;; xxx (setq dstfile (mew-expand-new-msg trash (mew-i2s num cache))) (setq num (1+ num)) (when (file-regular-p srcfile) ;; if not, the marked line will be deleted anyway. (rename-file srcfile dstfile 'override) (mew-set-file-times dstfile)) (when suffix (setq infofile (concat srcfile suffix)) (mew-delete-file infofile))) (mew-touch-folder trash))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Commands for mark processing ;;; (defun mew-summary-exec (&optional arg) "\\ Process marked messages. When called with '\\[universal-argument]', process marked messages in the specified region. To cancel the '*' mark, use '\\[mew-summary-undo]' or '\\[mew-summary-undo-all]'." (interactive "P") (let (beg end region) (if (mew-mark-active-p) (setq arg t)) (cond (arg (setq region (mew-summary-get-region)) (setq beg (car region)) (setq end (cdr region))) (t (setq beg (point-min)) (setq end (point-max)))) (mew-summary-exec-region beg end))) (defun mew-summary-exec-one (&optional arg) "Process the current marked message. When called with '\\[universal-argument]', process all marked messages before the current message." (interactive "P") (mew-summary-goto-message) (mew-decode-syntax-delete) (save-window-excursion (let (beg end) (save-excursion (beginning-of-line) (setq beg (if arg (point-min) (point))) (end-of-line) (setq end (1+ (point)))) (if (> end (point-max)) (message "No message") (mew-summary-exec-region beg end))))) (defun mew-summary-exec-delete () "Process messages marked with 'D'." (interactive) (let* ((ent (assoc mew-mark-delete mew-mark-spec)) (mew-mark-spec (list ent))) (mew-summary-exec-region (point-min) (point-max)))) (defun mew-summary-exec-unlink () "Process messages marked with 'X'." (interactive) (let* ((ent (assoc mew-mark-unlink mew-mark-spec)) (mew-mark-spec (list ent))) (mew-summary-exec-region (point-min) (point-max)))) (defun mew-summary-exec-refile (&optional arg) "Process messages marked with 'o'. If called with '\\[universal-argument]', only messages whose destination is the same as that of the current message are processed." (interactive "P") (let* ((ent (assoc mew-mark-refile mew-mark-spec)) (mew-mark-spec (list ent))) (if (not arg) (mew-summary-exec-region (point-min) (point-max)) (let* ((msg (mew-summary-message-number)) (dst (cdr (mew-refile-get msg))) func) (if (not dst) (message "No message to be refiled here") (setq func (lambda (num) (equal dst (cdr (mew-refile-get num))))) (mew-summary-exec-region (point-min) (point-max) func)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Exec region ;;; (defun mew-summary-move-and-display (msg &optional redisplay) (when (mew-summary-search-msg msg) (mew-summary-display redisplay))) (defun mew-summary-go-back-summary (key) (let ((msg (mew-summary-message-number)) (fld (mew-summary-physical-folder))) (if (not (and fld (get-buffer fld))) (message "No physical folder") (mew-summary-visit-folder fld nil 'no-ls) (if msg (mew-summary-move-and-display msg) (goto-char (point-max))) (message "Now in %s. Type '%s' again" fld key)))) (defun mew-summary-exec-region (beg end &optional func) (let ((folder (mew-sinfo-get-folder))) (cond ((mew-folder-nntpp folder) (message "This command cannot be used in this folder")) ((mew-folder-remotep folder) (message "Refiling and deleting...") (force-mode-line-update) (mew-summary-exec-remote beg end func)) ((mew-virtual-p) (mew-summary-go-back-summary (mew-substitute-for-summary "\\[mew-summary-exec]"))) (t (message "Refiling and deleting...") (force-mode-line-update) (mew-summary-exec-local beg end func))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Refile log ;;; (defun mew-exec-refile-log (buf) (when (get-buffer buf) (with-current-buffer buf (mew-frwlet mew-cs-dummy mew-cs-m17n (write-region (point-min) (point-max) (expand-file-name mew-refile-log-file mew-conf-path) 'append 'no-msg))) (mew-remove-buffer buf))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Processing marks for local ;;; (defun mew-mark-kill-line () (let (start) (beginning-of-line) (setq start (point)) (forward-line) (mew-elet (delete-region start (point))))) (defun mew-summary-exec-local (beg end &optional func-decide) (when (mew-summary-exclusive-p) (save-excursion (condition-case nil (let* ((marks (mew-mark-get-all-marks)) (src (mew-summary-folder-name 'ext)) (lbuf (mew-refile-log-buffer src)) (m (copy-marker end)) (cnt 0) (case-fold-search nil) msg msgs err-folders func-exec func-sanity killp regex) (dolist (mark marks) (setq func-exec (mew-markdb-func-exec mark)) (when func-exec (setq killp (mew-markdb-killp mark)) (setq regex (mew-mark-regex mark)) (setq msgs nil) (goto-char beg) (while (re-search-forward regex m t) (setq msg (mew-summary-message-number)) (when (or (not func-decide) (funcall func-decide msg)) (setq msgs (cons msg msgs)) (cond ((fboundp killp) (if (funcall killp src msg) (mew-mark-kill-line) (mew-mark-remove))) ((eq killp t) (mew-mark-kill-line))))) (setq msgs (nreverse msgs)) (when msgs (when (= cnt 0) ;; opening... (mew-summary-lock t "Executing") (mew-summary-reset)) (setq cnt (1+ cnt)) ;; refiling and deleting... (setq func-sanity (mew-markdb-func-sanity mark)) (when (and func-sanity (setq err-folders (funcall func-sanity msgs))) (mew-summary-unlock) (mew-warn "Nothing proceeded. Folder(s) MUST be a file!: %s" (mew-join "," err-folders))) (funcall func-exec src msgs)))) (if (= cnt 0) (message "No marks") ;; ending... (mew-cache-clean-up) (mew-summary-folder-cache-save) (set-buffer-modified-p nil) (mew-summary-unlock) (when (and (eobp) (not (pos-visible-in-window-p))) (forward-line -1) ;; This ensures that some messages are displayed in Summary. (recenter)) (run-hooks 'mew-summary-exec-hook) (mew-exec-refile-log lbuf) (message "Refiling and deleting...done"))) (quit (set-buffer-modified-p nil) (mew-summary-unlock)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Processing marks for remote ;;; (defun mew-mark-invisible-line () (let (start) (beginning-of-line) (setq start (point)) (forward-line) (mew-elet (put-text-property start (point) 'invisible t) ;; For Emacs only. To make invisible text act as we want (put-text-property start (point) 'front-sticky t)))) (mew-defstruct execinfo remove kill refile move rttl dttl) (mew-defstruct refileinfo uid size delete folders) (defun mew-summary-exec-remote-get-execinfo (beg end modify &optional func-decide) ;; for POP or IMAP ;; If modify, marked lines get invisible. They are removed ;; IMAP's sentinel. ;; Otherwise, marked lines retain and they are to be processed ;; by mew-summary-exec-local(). (let* ((case (mew-sinfo-get-case)) (folder (mew-sinfo-get-folder)) (m (copy-marker end)) (case-fold-search nil) (rttl 0) (dttl 0) trash trash-list lomov siz msg uid ref flds del regex trss rmvs kils refs movs refinfo refile-back) (when (mew-folder-imapp folder) ;; see also mew-mark-exec-delete. (setq trash (mew-imap-trash-folder case)) (setq trash-list (mew-imap-trash-folder-list case)) (setq lomov t) (cond ((null trash) ) (trash-list (if (or (member folder trash-list) (string= folder trash)) (setq trash nil))) (t (if (string= folder trash) (setq trash nil))))) (save-excursion (mew-decode-syntax-delete) ;; ;; refile ;; (when (mew-markdb-by-mark mew-mark-refile) (setq regex (mew-mark-regex mew-mark-refile)) (goto-char beg) (while (re-search-forward regex m t) (re-search-forward mew-regex-sumsyn-long) (setq msg (mew-sumsyn-message-number)) (setq uid (mew-sumsyn-message-uid)) (setq siz (mew-sumsyn-message-size)) (when (or (not func-decide) (funcall func-decide msg)) (setq refinfo (mew-refile-get msg)) (setq refile-back (cons refinfo refile-back)) (setq flds (cdr refinfo)) ;; (setq del nil) (if (member folder flds) (setq flds (delete folder flds)) ;; destructive (setq del t) (when modify (if lomov (setq movs (cons msg movs)) (setq kils (cons msg kils))))) (when flds (setq ref (mew-make-refileinfo :uid uid :size siz :delete del :folders flds)) (setq refs (cons ref refs))) (if modify (if del (mew-mark-invisible-line) (mew-summary-refile-remove-body) (mew-mark-remove))))) (setq refs (nreverse refs)) (setq rttl (length refs)) (setq movs (nreverse movs)) (if modify (mew-sinfo-set-refile-back refile-back)) (when lomov (let ((mew-inherit-exec-case case)) (mew-mark-sanity-refile movs)))) ;; ;; delete ;; (when (mew-markdb-by-mark mew-mark-delete) (setq regex (mew-mark-regex mew-mark-delete)) (goto-char beg) (while (re-search-forward regex m t) (re-search-forward mew-regex-sumsyn-long) (setq msg (mew-sumsyn-message-number)) (setq uid (mew-sumsyn-message-uid)) (setq siz (mew-sumsyn-message-size)) (if trash (setq trss (cons (mew-make-refileinfo :uid uid :size siz :delete t :folders (list trash)) trss)) (setq rmvs (cons uid rmvs))) (when modify (setq kils (cons msg kils)) (mew-mark-invisible-line)) (setq dttl (1+ dttl)))) ;; ;; unlink ;; (when (mew-markdb-by-mark mew-mark-unlink) (setq regex (mew-mark-regex mew-mark-unlink)) (goto-char beg) (while (re-search-forward regex m t) (re-search-forward mew-regex-sumsyn-long) (setq msg (mew-sumsyn-message-number)) (setq uid (mew-sumsyn-message-uid)) (setq siz (mew-sumsyn-message-size)) (setq rmvs (cons uid rmvs)) (when modify (setq kils (cons msg kils)) (mew-mark-invisible-line)) (setq dttl (1+ dttl)))) ;; (setq rmvs (nreverse rmvs)) (setq trss (nreverse trss)) (if trss (setq refs (nconc trss refs))) ;; (set-buffer-modified-p nil) (cond ((and (null rmvs) (null refs)) nil) (modify (force-mode-line-update) ;; xxx (mew-make-execinfo :remove rmvs :kill kils :refile refs :move movs :rttl rttl :dttl dttl)) (t (mew-make-execinfo :remove rmvs :refile refs :rttl 0 :dttl 0)))))) (defun mew-summary-exec-remote (beg end &optional func-decide) (if (mew-folder-nntpp (mew-sinfo-get-folder)) (message "This command cannot be used in this folder") (when (mew-summary-exclusive-p) (let* ((case (mew-sinfo-get-case)) (folder (mew-sinfo-get-folder)) (bnm (mew-summary-folder-name 'ext)) (lbuf (mew-refile-log-buffer bnm)) (execinfo (mew-summary-exec-remote-get-execinfo beg end 'modify func-decide))) (if (not execinfo) (message "No messages to be processed") (mew-summary-reset) (while (eq (get-text-property (point) 'invisible) t) (forward-line)) (cond ((mew-folder-popp folder) (mew-pop-retrieve case 'exec bnm execinfo)) ((mew-folder-imapp folder) (mew-imap-retrieve case 'exec bnm execinfo))) (mew-exec-refile-log lbuf)))))) (defun mew-mark-kill-invisible () (save-excursion (goto-char (point-min)) (while (not (eobp)) (if (get-text-property (point) 'invisible) (mew-mark-kill-line) (forward-line))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Processing marks for offline ;;; (defun mew-summary-exec-offline (&optional arg) "\\Process marked messages in an IMAP folder *offline*. Messages to be refiled in a remote folder are moved to the corresponding folder but they are marked invalid. Invalid message are marked with '#'. Invalid messages will be overridden when the remote folder is scanned online. A job to delete or refile messages, which is created by this command, is queued in a queue folder (%queue for IMAP). To flush jobs in the queue, type '\\[mew-summary-send-message]' in the queue online." (interactive "P") (cond ((mew-virtual-p) (mew-summary-go-back-summary (mew-substitute-for-summary "\\[mew-summary-exec-offline]"))) ((not (mew-folder-imapp (mew-sinfo-get-folder))) (message "This command cannot be used in this folder")) (t (if (mew-mark-active-p) (setq arg t)) (let (beg end region) (cond (arg (setq region (mew-summary-get-region)) (setq beg (car region)) (setq end (cdr region))) (t (setq beg (point-min)) (setq end (point-max)))) (message "Refiling and deleting...") (force-mode-line-update) (mew-summary-exec-offline-region beg end))))) (mew-defstruct jobinfo mailbox execinfo mark-hist) (defun mew-summary-exec-offline-region (beg end) "Process the current marked message offline." (interactive) (let* ((execinfo (mew-summary-exec-remote-get-execinfo beg end nil)) (rmvs (mew-execinfo-get-remove execinfo)) (refs (mew-execinfo-get-refile execinfo)) job) (if (not execinfo) (message "No messages to be processed") (let* ((fld (mew-sinfo-get-folder)) (case (mew-sinfo-get-case)) (imapq (mew-case-folder case (mew-imap-queue-folder case))) (imapq-dir (mew-expand-folder imapq)) file file-info) (unless (file-directory-p imapq-dir) (mew-make-directory imapq-dir)) (setq file (mew-folder-new-message imapq)) (setq file-info (concat file mew-imapq-info-suffix)) (setq job (mew-make-jobinfo :mailbox fld :execinfo execinfo :mark-hist (mew-sinfo-get-mark-hist))) (mew-lisp-save file-info job 'nobackup 'unlimit) (with-temp-buffer (mew-header-insert mew-subj: (format "IMAP jobs for %s" fld)) (mew-header-insert mew-date: (mew-time-ctz-to-rfc (current-time))) (mew-header-insert mew-from: "Mew IMAP manager") (insert "\n") (insert "Messages to be refiled:\n") (dolist (ref refs) (insert (format (if (mew-refileinfo-get-delete ref) "\t%s will be copied to %s\n" "\t%s will be moved to %s\n") (mew-refileinfo-get-uid ref) (mew-join "," (mew-refileinfo-get-folders ref))))) (insert "\n") (when rmvs (insert "Messages to be deleted:\n") (insert "\t" (mew-join "," rmvs) "\n")) (mew-frwlet mew-cs-dummy nil (write-region (point-min) (point-max) file nil 'no-msg))) (mew-touch-folder imapq) ;; refile log is not necessary since mew-summary-exec-local does it. (let ((mew-inherit-exec-case case) (mew-inherit-offline t) (mew-trash-folder (mew-imap-trash-folder case))) (mew-summary-exec-local beg end)))))) (defun mew-summary-exec-offline-one (&optional arg) "Process the message on the cursor offline." (interactive "P") (if (not (mew-folder-imapp (mew-sinfo-get-folder))) (message "This command cannot be used in this folder") (mew-summary-goto-message) (mew-decode-syntax-delete) (save-window-excursion (let (beg end) (save-excursion (beginning-of-line) (setq beg (if arg (point-min) (point))) (end-of-line) (setq end (1+ (point)))) (if (> end (point-max)) (message "No message") (force-mode-line-update) ;; xxx (mew-summary-exec-offline-region beg end)))))) (provide 'mew-exec) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-exec.el ends here kazu-yamamoto-Mew-ff9c41b/mew-ext.el000066400000000000000000000436501256455547000174730ustar00rootroot00000000000000;;; mew-ext.el --- Message/External-Body support for Mew ;; Author: Kazu Yamamoto ;; Created: Nov 13, 1996 ;;; Code: (require 'mew) (eval-when-compile (cond ;; ((mew-which-el "efs") ;; (require 'efs)) ((mew-which-el "ange-ftp") (require 'ange-ftp)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Variables for encoding ;;; (defvar mew-ext-default-access-type "anon-ftp") (defvar mew-ext-ftp-server-list '("ftp.example.org" "ftp.example.jp")) (defvar mew-ext-encode-switch '(("ftp" . mew-ext-encode-ftp) ;; ("tftp" . mew-ext-encode-tftp) ("anon-ftp" . mew-ext-encode-anon-ftp) ("local-file" . mew-ext-encode-local-file) ("mail-server" . mew-ext-encode-mail-server) ("url" . mew-ext-encode-url))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Variables for decoding ;;; (defvar mew-ext-switch '(("ftp" mew-ext-ftp mew-ext-ftp-ext) ("tftp" mew-ext-tftp nil) ("anon-ftp" mew-ext-anon-ftp mew-ext-anon-ftp-ext) ("mail-server" mew-ext-mail-server mew-ext-mail-server-ext) ("url" mew-ext-url mew-ext-url-ext))) ;; RFC 2017 (defun mew-ext-get-func (acc-type) (nth 1 (mew-assoc-match acc-type mew-ext-switch 0))) (defun mew-ext-get-func-ext (acc-type) (nth 2 (mew-assoc-match acc-type mew-ext-switch 0))) (defvar mew-ext-include-switch '(("local-file" mew-ext-include-local-file))) (defun mew-ext-include-get-func (acc-type) (nth 1 (mew-assoc-case-equal acc-type mew-ext-include-switch 0))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; environment variables ;;; (cond ;; ((mew-which-el "efs") ;; (defun mew-ext-file-name-completion (file path) ;; (require 'efs) ;; (let ((efs-tmp-name-template mew-temp-file)) ;; (efs-file-name-completion file path))) ;; (defun mew-ext-file-name-all-completions (file path) ;; (require 'efs) ;; (let ((efs-tmp-name-template mew-temp-file)) ;; (efs-file-name-all-completions file path))) ;; (defun mew-ext-expand-dir (host user dir) ;; (require 'efs) ;; (let ((efs-tmp-name-template mew-temp-file) exp) ;; (setq exp (efs-expand-file-name (format "/%s@%s:%s" user host dir))) ;; (if (string-match ".*:\\(.*\\)$" exp) ;; (match-string 1 exp)))) ;; (defun mew-ext-copy-file-internal (remote local passwd) ;; (require 'efs) ;; (let ((efs-tmp-name-template mew-temp-file) ;; (efs-generate-anonymous-password passwd) ;; (parsed (efs-ftp-path remote))) ;; (efs-copy-file-internal remote parsed local nil ;; nil nil nil nil t 'image)))) ((mew-which-el "ange-ftp") (defun mew-ext-file-name-completion (file path) (require 'ange-ftp) (let ((ange-ftp-tmp-name-template mew-temp-file)) (ange-ftp-file-name-completion file path))) (defun mew-ext-file-name-all-completions (file path) (require 'ange-ftp) (let ((ange-ftp-tmp-name-template mew-temp-file)) (ange-ftp-file-name-all-completions file path))) (defun mew-ext-expand-dir (host user dir) (require 'ange-ftp) (let ((ange-ftp-tmp-name-template mew-temp-file) exp) (setq exp (ange-ftp-expand-file-name (format "/%s@%s:%s" user host dir))) (if (string-match ".*:\\(.*\\)$" exp) (match-string 1 exp)))) (defun mew-ext-copy-file-internal (remote local passwd) (require 'ange-ftp) (let ((ange-ftp-tmp-name-template mew-temp-file) (ange-ftp-generate-anonymous-password passwd)) (ange-ftp-copy-file-internal remote local t nil nil nil t))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Encode ;;; (defun mew-attach-external-body () "Specify external body." (interactive) (if (not (mew-attach-not-line012-1)) (message "Cannot insert external-body here") (let* ((nums (mew-syntax-nums)) (subdir (mew-attach-expand-path mew-encode-syntax nums)) (attachdir (mew-attachdir)) file filepath ct) ;; attachdir / {subdir/} dir (if (not (string= subdir "")) (setq attachdir (expand-file-name subdir attachdir))) ;; attachdir / file (setq filepath (mew-random-filename attachdir 1 nil mew-ext-suffix)) (if (file-exists-p filepath) (message "Cannot make a file for external-body, sorry") (setq file (file-name-nondirectory filepath)) (setq ct (mew-ext-encode filepath)) (setq mew-encode-syntax (mew-syntax-insert-entry mew-encode-syntax nums (mew-encode-syntax-single file ct))) (mew-encode-syntax-print mew-encode-syntax))))) (defun mew-create-content-id () ;; this is not unique if used with very short interval. ;; but it's ok (format "<%s.%s.%s@%s>" (nth 0 (current-time)) (nth 1 (current-time)) (emacs-pid) (system-name))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mew-ext-encode (filename) (let (ret access-type ct name) (with-temp-buffer ;;content-header (setq access-type (mew-input-general "Access type" mew-ext-encode-switch t mew-ext-default-access-type)) (setq ret (funcall (cdr (assoc access-type mew-ext-encode-switch)))) ;;message-header (cond ((string= access-type "url") (setq name "URL") (setq ct "Text/Html")) ((string= access-type "mail-server") (setq name "Mail server's file") (setq ct mew-ct-apo)) (t (setq name (file-name-nondirectory (mew-chop (mew-syntax-get-param ret "name")))) ;; name is quoted (if (string= name "") (setq ct mew-ct-apo) (setq ct (or (mew-ctdb-ct (mew-ctdb-by-file name)) (mew-content-type (mew-tinfo-get-case))))))) (setq ct (mew-input-type "Type for %s (%s): " name ct mew-mime-content-type-list)) (mew-header-insert mew-ct: ct) (mew-header-insert mew-cid: (mew-create-content-id)) (insert "\n") (when (string= access-type "mail-server") ;;message-body (insert (read-string "Input message to the mail-server: ")) (insert "\n")) (write-file filename)) (cons mew-ct-ext (cons (list "access-type" access-type) ret)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mew-ext-encode-ftp () ;; "name" "site" "directory" "mode" (let ((mew-ext-host (mew-input-general "FTP server" (if mew-ext-ftp-server-list (mapcar 'list mew-ext-ftp-server-list)) nil (car mew-ext-ftp-server-list))) mew-ext-user path dir file ret) (setq ret (list (list "site" mew-ext-host))) (setq mew-ext-user (read-string (format "User name at %s: " mew-ext-host) (mew-user))) (setq path (mew-input-rfile "Filename:")) (setq file (file-name-nondirectory path)) (setq dir (file-name-directory path)) (if (and dir (string-match mew-home dir)) (setq dir (mew-ext-expand-dir mew-ext-host mew-ext-user dir))) (cond (dir (setq ret (cons (list "directory" dir) ret)) (setq ret (cons (list "name" file) ret))) (t (setq ret (cons (list "name" file) ret)))) ret)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mew-ext-encode-tftp () ;; xxx not yet ) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mew-ext-encode-anon-ftp () ;; "name" "site" "directory" "mode" (let ((mew-ext-user "anonymous") (mew-ext-host (mew-input-general "FTP server" (if mew-ext-ftp-server-list (mapcar 'list mew-ext-ftp-server-list)) nil (car mew-ext-ftp-server-list))) path dir file ret) (setq ret (list (list "site" mew-ext-host))) (setq path (mew-input-rfile "Filename:")) (setq file (file-name-nondirectory path)) (setq dir (file-name-directory path)) (if (and dir (string-match mew-home dir)) (setq dir (mew-ext-expand-dir mew-ext-host mew-ext-user dir))) (cond (dir (setq ret (cons (list "directory" dir) ret)) (setq ret (cons (list "name" file) ret))) (t (setq ret (cons (list "name" file) ret)))) ret)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mew-ext-encode-local-file () ;; "name" "site" (let ((file (mew-draft-input-file-name "File name: "))) (list (list "name" (expand-file-name file))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mew-ext-encode-mail-server () ;; "server" "subject" (let (server subject) (setq server (car (mew-input-address "Server address: "))) (setq subject (read-string (concat mew-subj: " "))) (list (list "server" server) (list "subject" subject)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mew-ext-encode-url () ;; "url" (let ((url (read-string "URL: "))) (list (list "url" url)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Decode ;;; ;; ;; exclude ;; (defun mew-mime-external-body (cache begin end &optional params) ;; message-buffer (let* ((access-type (mew-syntax-get-param params "access-type")) (func (mew-ext-get-func access-type))) (if (and (symbolp func) (fboundp func)) (funcall func cache begin end params)))) (defun mew-mime-external-body-ext (cache begin end &optional params) (let* ((access-type (mew-syntax-get-param params "access-type")) (func (mew-ext-get-func-ext access-type))) (if (and (symbolp func) (fboundp func)) (funcall func cache begin end params)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mew-ext-ftp (cache begin end &optional params) (mew-elet (let* ((site (mew-syntax-get-param params "site")) (directory (mew-syntax-get-param params "directory")) (name (mew-syntax-get-param params "name")) (size (mew-syntax-get-param params "size")) filepath) (if directory (setq filepath (mew-concat-folder directory name)) (setq filepath name)) (setq filepath (mew-remove-drive-letter filepath)) (mew-erase-buffer) (insert " ####### ####### ###### \n" " # # # # \n" " # # # # \n" " ##### # ###### \n" " # # # \n" " # # # \n" " # # # \n" "\n\n") (insert "You can get the message content by FTP\n\n") (mew-insert "Site:\t%s\n" site) (mew-insert "File:\t%s\n" filepath) (mew-insert "Size:\t%s bytes\n" size) (insert "\n") (mew-insert-manual "To get this file, type " "'\\\\[mew-summary-execute-external]'.\n")))) (defun mew-ext-ftp-ext (cache begin end &optional params) (let* ((site (mew-syntax-get-param params "site")) (directory (mew-syntax-get-param params "directory")) (name (mew-syntax-get-param params "name")) (getit t) (username "") filepath localfile lfname remotefile) (if directory (setq filepath (mew-concat-folder directory name)) (setq filepath name)) (setq filepath (mew-remove-drive-letter filepath)) (setq username (read-string (format "User name at %s: " site) (mew-user))) (setq remotefile (format "/%s@%s:%s" username site filepath)) (setq localfile (mew-summary-input-file-name "Save to: " name)) (setq lfname (file-name-nondirectory localfile)) (if (file-exists-p localfile) (if (y-or-n-p (format "%s exists. Overwrite? " lfname)) (mew-delete-file localfile) (setq getit nil) (message "The file was not retrieved"))) (if getit (mew-ext-copy-file-internal remotefile localfile nil)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mew-ext-tftp (cache begin end &optional params) (message "Access-type TFTP is not supported yet")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mew-ext-anon-ftp (cache begin end &optional params) (mew-elet (let* ((site (mew-syntax-get-param params "site")) (directory (mew-syntax-get-param params "directory")) (name (mew-syntax-get-param params "name")) (size (mew-syntax-get-param params "size")) filepath) (if directory (setq filepath (mew-concat-folder directory name)) (setq filepath name)) (setq filepath (mew-remove-drive-letter filepath)) (mew-erase-buffer) (insert " Anonymous \n" " ####### ####### ###### \n" " # # # # \n" " # # # # \n" " ##### # ###### \n" " # # # \n" " # # # \n" " # # # \n" "\n\n") (insert "You can get the message content by FTP\n\n") (mew-insert "Site:\t%s\n" site) (mew-insert "File:\t%s\n" filepath) (mew-insert "Size:\t%s bytes\n" size) (insert "\n") (mew-insert-manual "To get this file, type " "'\\\\[mew-summary-execute-external]'.\n")))) (defun mew-ext-anon-ftp-ext (cache begin end &optional params) (let* ((site (mew-syntax-get-param params "site")) (directory (mew-syntax-get-param params "directory")) (name (mew-syntax-get-param params "name")) (getit t) filepath localfile lfname remotefile) (if directory (setq filepath (mew-concat-folder directory name)) (setq filepath name)) (setq filepath (mew-remove-drive-letter filepath)) (setq remotefile (format "/%s@%s:%s" "anonymous" site filepath)) (setq localfile (mew-summary-input-file-name "Save to: " name)) (setq lfname (file-name-nondirectory localfile)) (if (file-exists-p localfile) (if (y-or-n-p (format "%s exists. Overwrite? " lfname)) (mew-delete-file localfile) (setq getit nil) (message "The file was not retrieved"))) (if getit (mew-ext-copy-file-internal remotefile localfile (mew-mail-address))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mew-ext-mail-server (cache begin end &optional params) (mew-elet (let* ((server (mew-syntax-get-param params "server")) (size (mew-syntax-get-param params "size"))) (mew-erase-buffer) (insert " # # # ### #\n" " ## ## # # # #\n" " # # # # # # # #\n" " # # # # # # #\n" " # # ####### # #\n" " # # # # # #\n" " # # # # ### #######\n" "\n\n") (insert "You can get the message by e-mail\n\n") (mew-insert "Server:\t\t%s\n" server) (mew-insert "Size:\t%s bytes\n" size) (insert "\n") ;; picked up source from 'mew-send (mew-insert-manual "To send this mail, type " "'\\\\[mew-summary-execute-external]'.\n")))) (defun mew-ext-mail-server-ext (cache begin end &optional params) (let* ((server (mew-syntax-get-param params "server")) (subject (mew-syntax-get-param params "subject")) (syntax (mew-ext-decode-message-header cache begin end)) (start (mew-syntax-get-begin syntax))) (mew-summary-send server nil subject) (goto-char (point-max)) (mew-insert-buffer-substring cache start end) (mew-draft-make-message))) (defun mew-ext-decode-message-header (cache begin end) (let (syntax start) (with-current-buffer cache (save-restriction (narrow-to-region begin end) (goto-char (point-min)) (setq syntax (mew-decode-mime-header)) (setq start (point))) (mew-syntax-set-key syntax 'phantom) (mew-syntax-set-begin syntax start) (mew-syntax-set-end syntax end) syntax))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defun mew-ext-url (cache begin end &optional params) (mew-elet (let* ((url (mew-syntax-get-param params "url")) (size (mew-syntax-get-param params "size")) (process-connection-type mew-connection-type1) (syntax (mew-ext-decode-message-header cache begin end)) (mct (car (mew-syntax-get-ct syntax))) (spec mew-prog-text/html-ext) (prog (mew-progspec-get-prog spec))) (mew-erase-buffer) (insert "# # ###### #\n" "# # # # #\n" "# # # # #\n" "# # ###### #\n" "# # # # #\n" "# # # # #\n" " ##### # # #######\n" "\n\n") (mew-insert "URL:\t\t%s\n" url) (mew-insert "Content-Type:\t%s\n" mct) (mew-insert "Size:\t%s bytes\n" size) (mew-insert "Operation:\t%s\n" (or prog "not defined")) (insert "\n") (mew-insert-manual "To operate this URL, type " "'\\\\[mew-summary-execute-external]'.\n")))) (defun mew-ext-url-ext (cache begin end &optional params) (let* ((url (mew-syntax-get-param params "url")) (process-connection-type mew-connection-type1) (spec mew-prog-text/html-ext) (prog (mew-progspec-get-prog spec)) (args (mew-progsec-args-convert (mew-progspec-get-args spec) url))) (apply 'call-process prog nil nil nil args))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; include ;; (defun mew-ext-include-local-file (params) (mew-flet (let* ((file (mew-syntax-get-param params "name"))) (if (file-exists-p file) (mew-insert-file-contents file))))) (provide 'mew-ext) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-ext.el ends here kazu-yamamoto-Mew-ff9c41b/mew-fib.el000066400000000000000000000105601256455547000174250ustar00rootroot00000000000000;;; mew-fib.el --- Filling blanks for Mew ;; Author: Yoshinari NOMURA ;; Created: Nov 29, 1994 ;;; Code: (require 'mew-func) (defvar mew-fib-item-alist nil) (defun mew-fib-split (str) (let (ret match) (while (string-match "[\t \n]*\\([^,]+\\)" str) (setq match (substring str (match-beginning 1) (match-end 1))) (setq str (substring str (match-end 0))) (setq match (if (string-match "[\t \n]+$" match) (substring match 0 (match-beginning 0)) match)) (setq ret (cons match ret))) (nreverse ret))) (defun mew-fib-make-alist () (let ((fib-file (expand-file-name mew-fib-item-file)) item val ret tmp-val) (setq mew-fib-item-alist nil) (with-temp-buffer (if (file-exists-p fib-file) (mew-insert-file-contents fib-file)) (goto-char (point-min)) (delete-matching-lines "^[ \t]*[;#%]") (while (re-search-forward "^\\([^:]+\\):[ \t]*\\(.*\\)$" nil t) (setq item (mew-buffer-substring (match-beginning 1) (match-end 1)) tmp-val (mew-buffer-substring (match-beginning 2) (match-end 2)) val (if (string= tmp-val "") val tmp-val) ret (append ret (mapcar (lambda (arg) (cons (downcase arg) val)) (mew-fib-split item)))))) ret)) (defun mew-fib-fill-default () "Fill |>item<| according to the information from .mew-fib" (interactive) (save-excursion (let (begin end str) (setq mew-fib-item-alist (mew-fib-make-alist)) (goto-char (point-min)) (while (re-search-forward "|>\\([^<]+\\)<|" nil t) (setq begin (match-beginning 1) end (match-end 1) str (mew-buffer-substring begin end)) (delete-region begin end) (backward-char 2) (insert (or (cdr (assoc (downcase str) mew-fib-item-alist)) str)))))) (defun mew-fib-delete-frame () "Delete all quotations, '|>' and '<|'. This is the finishing stroke." (interactive) (save-excursion (goto-char (point-min)) (while (re-search-forward "|>\\|<|" nil t) (replace-match "" nil t)))) (defun mew-fib-flush-input () "Flush the fib item on the current point." (interactive) (save-excursion (let ((ptr (point))) (if (and (search-backward "|>" nil t) (looking-at "|>\\([^<]+\\)<|") (>= ptr (match-beginning 1)) (<= ptr (match-end 1))) (delete-region (match-beginning 1) (match-end 1)))))) (defun mew-fib-next-item () "Jump to the next fib item." (interactive) (if (re-search-forward "|>\\([^<]+\\)<|" nil t) (backward-char 2) (goto-char (point-min)) (re-search-forward "|>\\([^<]+\\)<|" nil t))) (defun mew-fib-previous-item () "Jump to the previous fib item." (interactive) (if (re-search-backward "|>\\([^<]+\\)<|" nil t) (forward-char 2) (goto-char (point-max)) (re-search-backward "|>\\([^<]+\\)<|" nil t))) (provide 'mew-fib) ;;; Copyright Notice: ;; Copyright (C) 1994-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-fib.el ends here kazu-yamamoto-Mew-ff9c41b/mew-func.el000066400000000000000000001416551256455547000176320ustar00rootroot00000000000000;;; mew-func.el --- Basic functions for Mew ;; Author: Kazu Yamamoto ;; Created: Mar 23, 1997 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Mode ;;; (defun mew-summary-p () (eq major-mode 'mew-summary-mode)) (defun mew-virtual-p () (eq major-mode 'mew-virtual-mode)) (defun mew-message-p () (eq major-mode 'mew-message-mode)) (defun mew-draft-p () (eq major-mode 'mew-draft-mode)) (defun mew-header-p () (eq major-mode 'mew-header-mode)) (defun mew-draft-or-header-p () (memq major-mode '(mew-draft-mode mew-header-mode))) (defun mew-selection-p () (eq (mew-vinfo-get-mode) 'selection)) (defun mew-thread-p () (eq (mew-vinfo-get-mode) 'thread)) (defun mew-summary-or-virtual-p () (or (mew-summary-p) (mew-virtual-p))) (defun mew-virtual-for-one-summary () (mew-vinfo-get-physical-folder)) (defun mew-pickable-p () (or (mew-summary-p) (mew-virtual-for-one-summary))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; List functions ;;; (defun mew-case-equal (str1 str2) (string= (downcase str1) (downcase str2))) (defun mew-folder-recursive-match (key folder) "Initial substring match for folders. If FOLDER is a sub-folder of KEY or KEY itself, t is returned." ;; file-name-as-directory should be first ;; because the path separator may be regex-non-safe. (let ((regex (if (string-match "^[-+%$]$" key) (mew-folder-regex key) (mew-folder-regex (file-name-as-directory key))))) (string-match regex (file-name-as-directory folder)))) (defun mew-member-case-equal (str list) "Return the position equal to STR in LIST. Case is ignored." (let ((n 0) (dstr (downcase str))) (catch 'member (dolist (x list) (if (string= (downcase x) dstr) (throw 'member n)) (setq n (1+ n)))))) (defun mew-member* (x list) "Member in a nested list." (catch 'found (dolist (ent list) (if (consp ent) (if (mew-member* x ent) (throw 'found t)) (if (equal x ent) (throw 'found t)))))) (defun mew-member-match (str list &optional ignore-case) "Return the position matched to STR in LIST. If IGNORE-CASE is t, matching is performed by ignoring case." (let ((n 0) (case-fold-search ignore-case)) (catch 'member (dolist (x list) (if (string-match x str) (throw 'member n)) (setq n (1+ n)))))) (defun mew-member-match2 (regex list &optional ignore-case) (let ((case-fold-search ignore-case)) (catch 'member (dolist (x list) (if (string-match regex x) (throw 'member x)))))) (defun mew-uniq-list (lst) "Destructively uniqfy elements of LST. This is O(N^2). So, do not use this function with a large LST." (let ((tmp lst)) (while tmp (setq tmp (setcdr tmp (delete (car tmp) (cdr tmp)))))) lst) (defun mew-uniq-alist (alist) "Uniqfy elements of ALIST." (let ((vec (make-vector 511 0)) ;; hash str ret) (dolist (ent alist) (setq str (car ent)) (cond ((not (stringp str)) (setq ret (cons ent ret))) ((intern-soft str vec) ()) (t (setq ret (cons ent ret)) (intern str vec)))) (nreverse ret))) (defun mew-delete (key alist) "Destructively delete elements whose first member is equal to key" (if (null key) alist (let (ret) (while (and (listp (nth 0 alist)) (equal (car (nth 0 alist)) key)) (setq alist (cdr alist))) (setq ret alist) (while alist ;; cannot use dolist (if (and (listp (nth 1 alist)) (equal (car (nth 1 alist)) key)) (setcdr alist (cdr (cdr alist))) (setq alist (cdr alist)))) ret))) (defmacro mew-ntake (n lst) `(if (> (length ,lst) ,n) (setcdr (nthcdr (1- ,n) ,lst) nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Associative list functions ;;; (defun mew-assoc-equal (key alist nth &optional equal-func) (let ((func (or equal-func 'equal)) n) (catch 'loop (dolist (a alist) (setq n (nth nth a)) (if (or (funcall func n key) (eq n t)) (throw 'loop a)))))) (defun mew-assoc-case-equal (key alist nth) (let ((skey (downcase key)) n) (catch 'loop (dolist (a alist) (setq n (nth nth a)) (if (or (and (stringp n) (string= (downcase n) skey)) (eq n t)) (throw 'loop a)))))) (defun mew-assoc-match (key alist nth) "Return list in ALIST that KEY regex is matched to its NTH element. Case is ignored. Note that the NTH element is 't', the list is always selected." (let ((case-fold-search t) n) (catch 'loop (dolist (a alist) (setq n (nth nth a)) (if (or (and (stringp n) (string-match key n)) (equal n key) (eq n t)) (throw 'loop a)))))) (defun mew-assoc-match2 (key alist nth) "Return list in ALIST whose NTH regex is matched to KEY. Case is ignored. Note that the NTH element is 't', the list is always selected." (let ((case-fold-search t) n) (catch 'loop (dolist (a alist) (setq n (nth nth a)) (if (or (and (stringp n) (string-match n key)) (equal n key) (eq n t)) (throw 'loop a)))))) (defun mew-assoc-match3 (key alist nth) "Return list in ALIST whose NTH regex is matched to KEY. Case is ignored. Note that the NTH element is 't', the list is always selected. The deference from mew-assoc-match2 is that this returns the position of a selected list in addition to the list itself." (let ((case-fold-search t) (i 0) n) (catch 'loop (dolist (a alist) (setq n (nth nth a)) (if (or (and (stringp n) (string-match n key)) (equal n key) (eq n t)) (throw 'loop (cons i a))) (setq i (1+ i)))))) (defun mew-assoc-member (key lol nth) "Return a list member of LoL whose NTH list contains a member equal to KEY." (mew-assoc-member-base key lol nth 'member)) (defun mew-assoc-member-case-equal (key lol nth) "Return a list member of LoL whose NTH list contains a member equal to KEY ignoring case." (mew-assoc-member-base key lol nth 'mew-member-case-equal)) (defun mew-assoc-member-base (key lol nth func) "Return a list member of LoL whose NTH list contains KEY in the context of FUNC." (catch 'loop (dolist (l lol) (if (and (listp (nth nth l)) (funcall func key (nth nth l))) (throw 'loop l))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; backward compatibility of alist ;;; (defalias 'mew-alist-get-key 'car) (defun mew-alist-get-value (ent) (let ((value (cdr ent))) (if (consp value) (car value) ;; new value))) ;; old ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; getting next ;;; (defun mew-get-next (LIST MEM) "Return of a member in LIST which is the next member of MEM." (let (frst next crnt) (setq frst (car LIST)) (setq LIST (cdr LIST)) (setq next (car LIST)) (if (equal frst MEM) (if next next frst) (catch 'loop (while LIST ;; cannot use dolist (setq crnt next) (setq LIST (cdr LIST)) (setq next (car LIST)) (if (equal crnt MEM) (throw 'loop (if next next frst)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Modifying list ;;; (defmacro mew-add-first (variable value) `(setq ,variable (cons ,value ,variable))) (defmacro mew-addq (variable value) `(if (and ,value (not (member ,value ,variable))) (setq ,variable (cons ,value ,variable)))) (defmacro mew-insert-after (variable value key) `(let ((var ,variable)) (catch 'loop (while var ;; cannot use dolist (if (equal (nth 0 (car var)) ,key) (throw 'loop (setcdr var (cons ,value (cdr var))))) (setq var (cdr var)))))) (defmacro mew-replace-with (variable value key) `(let ((var ,variable)) (catch 'loop (while var ;; cannot use dolist (if (equal (nth 0 (car var)) ,key) (throw 'loop (setcar var ,value))) (setq var (cdr var)))))) (defmacro mew-remove-entry (variable key) `(let ((crn ,variable) prv) (if (equal (nth 0 (car crn)) ,key) (setq ,variable (cdr crn)) (setq prv crn) (setq crn (cdr crn)) (catch 'loop (while crn ;; cannot use dolist (if (equal (nth 0 (car crn)) ,key) (throw 'loop (setcdr prv (cdr crn)))) (setq prv crn) (setq crn (cdr crn))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; String ;;; (defun mew-make-string (len) (make-string len ?a)) (defun mew-replace-character (string from to) "Replace characters equal to FROM to TO in STRING." (dotimes (cnt (length string) string) (if (char-equal (aref string cnt) from) (aset string cnt to)))) (defun mew-replace-white-space (string) "Replace white characters to a space." (while (string-match "[\n\t]+" string) (setq string (replace-match " " nil t string))) (while (string-match " +" string) (setq string (replace-match " " nil t string))) string) (defun mew-replace-white-space2 (string) "Replace white characters to under score." (while (string-match "[\n\t\r ]+" string) (setq string (replace-match "_" nil t string))) string) (defun mew-capitalize (ostr) "Syntax table independent version of capitalize. Words are separated by '/' and '-'." (let* ((len (length ostr)) (nstr (mew-make-string len)) (topp t) c) (dotimes (i len nstr) (setq c (aref ostr i)) (cond (topp (aset nstr i (upcase c)) (setq topp nil)) ((or (char-equal c ?/) (char-equal c ?-)) (aset nstr i c) (setq topp t)) (t (aset nstr i (downcase c))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Insertion ;;; (defun mew-insert (form str) (when str (if form (insert (format form str)) (insert str)))) (defun mew-insert-message (fld msg rcs size) (let ((file (mew-expand-msg fld msg))) (cond ((not (file-readable-p file)) (error "%s does not exist" (mew-concat-folder fld msg))) ((= (mew-file-get-size file) 0) (error "The size of %s is 0" (mew-concat-folder fld msg))) ((file-readable-p file) (let ((old-cs (and (boundp 'buffer-file-coding-system) buffer-file-coding-system))) (mew-frwlet rcs mew-cs-dummy (mew-insert-file-contents file nil 0 size)) (if (boundp 'buffer-file-coding-system) (setq buffer-file-coding-system old-cs))) ;; return physical size (cons (mew-file-get-time file) (mew-file-get-size file)))))) (defun mew-insert-manual (&rest args) (insert (substitute-command-keys (apply 'concat args)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Stolen form Perl ;;; (defun mew-join (separator string-list) (mapconcat 'identity string-list separator)) (defun mew-split (str sepchar) "Return a list of strings splitting STR with SEPCHAR." (let ((len (length str)) (start 0) ret) (dotimes (i len) (when (char-equal (aref str i) sepchar) (setq ret (cons (substring str start i) ret)) (setq start (1+ i)))) (if (/= start len) (setq ret (cons (substring str start) ret))) (nreverse ret))) (defun mew-remove-single-quote (str) (let* ((len (length str)) (ret (mew-make-string len)) (j 0)) (dotimes (i len) (unless (char-equal (aref str i) ?') (aset ret j (aref str i)) (setq j (1+ j)))) (substring ret 0 j))) (defun mew-split-quoted (str sepchar &optional qopen qclose no-single) "Return a list of strings splitting STR with SEPCHAR. SEPCHARs in double-quoted strings are ignored. If QUOTEDCHAR is provided, SEPCHARs between QOPEN and QCLOSE are also ignored." (let ((qlevel 0) (len (length str)) (start 0) dblq sub ret c) (if (and qopen (not qclose)) (setq qclose qopen)) (dotimes (i len) (setq c (aref str i)) (cond ((char-equal ?\\ c) (setq i (1+ i))) ((or (char-equal ?\" c) (and (not no-single) (char-equal ?' c))) (setq dblq (not dblq))) ((and qopen (char-equal c qopen)) (setq qlevel (1+ qlevel))) ((and qclose (char-equal c qclose)) (setq qlevel (1- qlevel))) ((char-equal c sepchar) (unless (or dblq (>= qlevel 1)) (setq sub (substring str start i)) (unless no-single (setq sub (mew-remove-single-quote sub))) (setq ret (cons sub ret)) (setq start (1+ i)))))) (when (/= start len) (setq sub (substring str start)) (unless no-single (setq sub (mew-remove-single-quote sub))) (setq ret (cons sub ret))) (nreverse ret))) (defun mew-chop (str) "Split off preceding and following white spaces." (let ((i 0) (j (length str)) c) (catch 'loop (while (< i j) (setq c (aref str i)) (if (or (char-equal c mew-sp) (char-equal c ?\t)) (setq i (1+ i)) (throw 'loop nil)))) (setq j (1- j)) (catch 'loop (while (< i j) (setq c (aref str j)) (if (or (char-equal c mew-sp) (char-equal c ?\t)) (setq j (1- j)) (throw 'loop nil)))) (substring str i (1+ j)))) (defun mew-quote-string (str qchar targets) "If characters in STR is a member of TARGETS, QCHAR is prepended to them." (let* ((len (length str)) (ret (mew-make-string (* len 2))) (j 0) c) (dotimes (i len) (setq c (aref str i)) (when (member c targets) (aset ret j qchar) (setq j (1+ j))) (aset ret j c) (setq j (1+ j))) (substring ret 0 j))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folder ;;; (defun mew-folder-regex (folder) (concat "^" (regexp-quote folder))) ;; (defun mew-case:folder-case (case:folder) "Extract case from case:folder. If case does not exist, nil is returned." ;; "case" must be distinguished from drive (if (string-match mew-regex-case1 case:folder) (mew-match-string 1 case:folder))) (defun mew-case:folder-folder (case:folder) "Extract folder from case:folder." ;; "case" must be distinguished from drive (if (string-match mew-regex-case1 case:folder) (mew-match-string 3 case:folder) case:folder)) (defun mew-case-folder (case folder) "Concat case and folder to produce case:folder. If case is \"default\", it is not prepended." (if (and case (not (string= case mew-case-default)) (mew-folder-remotep folder)) (concat case ":" folder) folder)) ;; (defun mew-folder-absolutep (folder) (or (string-match mew-regex-file-absolute folder) (string-match mew-regex-drive-letter folder))) (defun mew-folder-localp (folder) (string-match "^\\+" folder)) (defun mew-folder-remotep (folder) (string-match "^[-%$]" folder)) (defun mew-folder-popp (folder) (string-match "^\\$" folder)) (defun mew-folder-nntpp (folder) (string-match "^-" folder)) (defun mew-folder-imapp (folder) (string-match "^%" folder)) ;; (concat "^" (regexp-quote mew-folder-virtual)) (defun mew-folder-virtualp (folder) (string-match "^\\*" folder)) (defun mew-virtual-thread-p (vfolder) (with-current-buffer vfolder (mew-thread-p))) ;; (defun mew-folder-prefix (folder) (substring folder 0 1)) (defun mew-folder-string (folder) (substring folder 1)) (defun mew-string-to-local (folder) (concat mew-folder-local folder)) (defun mew-folder-path-to-folder (path &optional has-proto) (let (case proto) ;; depends on folder (mew-set '(case proto) (mew-summary-case-proto)) (if (mew-folder-localp proto) (if has-proto path (mew-string-to-local path)) (let* ((base-path (mew-folder-string (mew-path-to-folder (mew-expand-folder (mew-case-folder case proto))))) (path-regex (concat "^" (regexp-quote base-path))) (no-proto-path path)) (when has-proto (setq no-proto-path (mew-case:folder-folder no-proto-path)) (setq no-proto-path (mew-folder-string no-proto-path))) (if (string-match path-regex no-proto-path) (mew-case-folder case (concat proto (substring no-proto-path (match-end 0)))) path))))) ;; (defun mew-folder-to-selection (folder) (concat mew-folder-virtual (mew-folder-basename folder))) (defun mew-folder-to-thread (folder) (concat mew-folder-virtual (mew-folder-basename folder) mew-folder-virtual)) (defun mew-folder-basename (folder) ;; Upper functions may use string-match. ;; So, string-match must not be used here. (if (eq (aref folder 0) ?*) (if (eq (aref folder (1- (length folder))) ?*) (substring folder 1 -1) (substring folder 1)) folder)) ;; (defun mew-summary-physical-folder () (cond ((mew-summary-p) (mew-summary-folder-name 'ext)) ((mew-virtual-p) (mew-vinfo-get-physical-folder)))) ;; (defun mew-local-to-dir (folder) (if (string-match "^[+]" folder) (substring folder 1) folder)) ;; (defun mew-folder-inboxp (folder) (member folder mew-inbox-folders)) (defun mew-folder-queuep (folder) (member folder mew-queue-folders)) (defun mew-folder-postqp (folder) (member folder mew-postq-folders)) (defun mew-folder-draftp (folder) (equal folder mew-draft-folder)) ;; (defun mew-folder-imap-queuep () (string= (mew-sinfo-get-folder) (mew-imap-queue-folder (mew-sinfo-get-case)))) ;; (defun mew-canonicalize-folder (folder) (cond ((mew-folder-localp folder) folder) ((mew-folder-imapp folder) folder) ((file-name-absolute-p folder) folder) (t (mew-string-to-local folder)))) (defun mew-path-to-folder (path) (let ((regex (concat "^" (regexp-quote (file-name-as-directory (expand-file-name mew-mail-path)))))) (if (string-match regex path) (mew-string-to-local (substring path (match-end 0))) path))) (defun mew-canonicalize-case-folder (case:folder) (let ((case (mew-case:folder-case case:folder)) (folder (mew-case:folder-folder case:folder)) len) (cond ((mew-folder-localp folder) (directory-file-name folder)) ((mew-folder-absolutep folder)(directory-file-name folder)) ((mew-folder-virtualp folder) folder) (t (if (null case) (setq folder case:folder) (if (string= case mew-case-default) (progn (setq case nil) (setq case:folder folder)))) (cond ((mew-folder-popp folder) case:folder) ((mew-folder-imapp folder) (mew-imap-directory-file-name case:folder (or case ;; visit mew-inherit-case))) ;; refile ((mew-folder-nntpp folder) (setq len (1- (length case:folder))) (if (char-equal (aref case:folder len) ?.) (substring case:folder 0 len) case:folder))))))) ;; (defun mew-expand-folder2 (case:folder) "Expanding FOLDER to a relative path to '+'" (let ((case (mew-case:folder-case case:folder)) (folder (mew-case:folder-folder case:folder)) subdir) ;; The length of "case" must be longer than or equal to 2. (setq subdir (mew-folder-string folder)) (cond ((mew-folder-popp folder) (mew-concat-folder (mew-pop-folder case) subdir)) ((mew-folder-nntpp folder) (mew-concat-folder (mew-nntp-folder case) subdir)) ((mew-folder-imapp folder) (mew-concat-folder (mew-imap-folder case) (mew-imap-expand-folder case (mew-imap-utf-7-encode-string subdir)))) (t folder)))) (defun mew-expand-folder (folder) "Expanding FOLDER to its absolute path" (when (stringp folder) (let (dir) (setq folder (mew-expand-folder2 folder)) (if (mew-folder-localp folder) (setq dir (expand-file-name (mew-folder-string folder) mew-mail-path)) ;; absolute path ;; "C:/" -> t, "C:" -> nil , "CC:/" -> nil (setq dir (expand-file-name folder))) dir))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Suffix support ;;; (defvar mew-use-suffix nil) (defun mew-msg-new-filename (file) (if mew-use-suffix (format "%s%s" file mew-suffix) file)) (defun mew-msg-get-filename (file) (let ((sfile (format "%s%s" file mew-suffix))) (if (file-exists-p sfile) sfile file))) (defun mew-expand-msg (folder message) (let ((file (expand-file-name message (mew-expand-folder folder)))) (mew-msg-get-filename file))) (defun mew-expand-new-msg (folder message) (mew-msg-new-filename (expand-file-name message (mew-expand-folder folder)))) (defun mew-expand-file (folder file) (expand-file-name file (mew-expand-folder folder))) (defun mew-concat-folder (folder subfolder) (concat (file-name-as-directory folder) subfolder)) (defun mew-concat-folder2 (folder subfolder case) (if (mew-folder-imapp folder) (concat (mew-imap-file-name-as-directory folder case) subfolder) (concat (file-name-as-directory folder) subfolder))) (defun mew-dir-messages (dir &optional regex full) ;; directory_files uses ENCODE_FILE() for DIR and ;; DECODE_FILE() for results(FILES). ;; Both ENCODE_FILE() and DECODE_FILE() are quite slow. ;; Since DECODE_FILE() is used many times, directory_files is ;; too slow when {default-,}file-name-coding-system are non-nil. ;; If {default-,}file-name-coding-system are bound to nil, ;; ENCODE_FILE() and DECODE_FILE() are skipped, resulting speed up. ;; So, we need to encode DIR by ourselves. (let ((edir (expand-file-name dir)) (cs default-file-name-coding-system)) (setq edir (mew-cs-encode-string edir cs)) (or regex (setq regex mew-regex-message-files)) (mew-alet (directory-files edir full regex 'no-sort)))) (defun mew-folder-messages (folder) (let* ((dir (mew-expand-folder folder)) msgs nums) (when (file-directory-p dir) (setq msgs (mew-dir-messages dir)) (setq nums (sort (mapcar 'string-to-number msgs) '<)) (mapcar 'number-to-string nums)))) (defun mew-folder-new-message (folder &optional num-only cache) (let* ((dir (mew-expand-folder folder)) (regex (if cache mew-regex-message-files3 mew-regex-message-files)) (max 0) cur maxfile maxpath) ;; xxx create if there is no directory? (when (file-directory-p dir) (dolist (msg (mew-dir-messages dir regex)) (setq cur (string-to-number (file-name-sans-extension msg))) (if (> cur max) (setq max cur))) (setq max (1+ max)) (setq maxfile (number-to-string max)) (setq maxpath (mew-expand-new-msg folder maxfile)) (while (get-file-buffer maxpath) ;; xxx ;; file not exist but there is a buffer. (setq max (1+ max)) (setq maxfile (number-to-string max)) (setq maxpath (mew-expand-new-msg folder maxfile))) (while (file-exists-p maxpath) (setq maxfile (read-string (format "%s/%s exists. Input a message number: " max folder))) (while (not (string-match mew-regex-message-files maxfile)) (setq maxfile (read-string "Input NUMBER: "))) (setq maxpath (mew-expand-new-msg folder maxfile))) (if num-only (mew-msg-new-filename maxfile) maxpath)))) (defun mew-touch-folder (fld) (when (stringp mew-summary-touch-file) (let ((file (mew-expand-file fld mew-summary-touch-file))) (when (file-writable-p file) (write-region "touched by Mew." nil file nil 'no-msg) (mew-set-file-modes file))))) ;; this kind of defmacro can't recurse ;; if +foo exists and we insert +foo/bar, ;; +foo/ should be inserted, too. But +foo/ does not match to +foo... (defmacro mew-folder-insert (folder lst subdir) `(unless (mew-assoc-equal ,folder ,lst 0) (let ((case-fold-search nil) (max (1- (length ,lst))) (pair (mew-folder-func ,folder ,subdir)) (min 0) mid crr prv) (while (> (- max min) 20) ;; 20 is enough? (setq mid (/ (+ min max) 2)) (if (string< (car (nth mid ,lst)) ,folder) (setq min mid) (setq max mid))) (setq crr (nthcdr min ,lst)) (while (and crr (string< (car (car crr)) ,folder)) (setq prv crr) (setq crr (cdr crr))) (if prv (setcdr prv (cons pair crr)) (setq ,lst (cons pair crr)))))) (defmacro mew-folder-delete (folder lst) `(setq ,lst (delete (assoc ,folder ,lst) ,lst))) (defun mew-folder-node-p (folder &optional case) (cond ((mew-folder-localp folder) (let* ((dir (file-name-as-directory folder)) (regex (concat "^" (regexp-quote dir)))) (mew-assoc-match regex (mew-local-folder-alist) 0))) ((mew-folder-imapp folder) (let* ((dir (mew-imap-file-name-as-directory folder case)) (regex (concat "^" (regexp-quote dir)))) (mew-assoc-match regex (mew-imap-folder-alist case) 0))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folder spec ;;; (defconst mew-folder-spec-type '((regex . string-match) (recursive . mew-folder-recursive-match) (string . string=))) (defun mew-folder-spec-func (type) (or (cdr (assq type mew-folder-spec-type)) 'string=)) (defun mew-folder-spec (folder lst str-type lst-type) (let ((str-func (mew-folder-spec-func str-type)) (lst-func (mew-folder-spec-func lst-type)) keys values ret) (setq folder (mew-case:folder-folder folder)) (catch 'loop (dolist (ent lst) (setq keys (car ent)) (setq values (cdr ent)) (cond ((eq keys t) (throw 'loop (setq ret values))) ((stringp keys) (if (funcall str-func keys folder) (throw 'loop (setq ret values)))) ((listp keys) (dolist (key keys) (if (funcall lst-func key folder) (throw 'loop (setq ret values)))))))) ret)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Directory ;;; (defun mew-parent-directory (path) (directory-file-name (file-name-directory path))) (defun mew-rename-directory (src dst) (let ((parent (mew-parent-directory (directory-file-name dst)))) (mew-make-directory parent) (rename-file src dst))) (defun mew-make-directory (path) (let ((parent (mew-parent-directory path))) (unless (file-directory-p parent) (mew-make-directory parent)) (cond ((file-directory-p path) ()) ;; do nothing ((file-exists-p path) (delete-file path) (make-directory path)) (t (make-directory path))) (if (/= mew-folder-mode (file-modes path)) (set-file-modes path mew-folder-mode)))) (defun mew-delete-directory-recursively (dir) (when (file-directory-p dir) (dolist (file (directory-files dir 'full mew-regex-files 'no-sort)) (cond ((file-symlink-p file) ;; never chase symlink which points a directory (delete-file file)) ((file-directory-p file) (mew-delete-directory-recursively file)) (t (delete-file file)))) (unless (directory-files dir 'full mew-regex-files 'no-sort) (delete-directory dir)))) (defun mew-check-directory (dir) (unless (file-directory-p dir) (unless (file-exists-p dir) (mew-make-directory dir)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; File existence ;;; (defun mew-which (file path) (catch 'loop (dolist (dir path) (if (file-exists-p (expand-file-name file dir)) (throw 'loop (expand-file-name file dir)))))) (defun mew-which-el (elfile) (or (mew-which (concat elfile ".el") load-path) (mew-which (concat elfile ".elc") load-path))) (defvar mew-which-exec-suffixes '("")) (defun mew-which-exec (execfile) (let (file) (catch 'detect (dolist (suffix mew-which-exec-suffixes) (when (setq file (mew-which (concat execfile suffix) exec-path)) (throw 'detect file)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; File attribute ;;; ;; Functions to get other attributes are implemented in C level. (defun mew-file-get-links (file) (let ((w32-get-true-file-link-count t)) ;; for Meadow (nth 1 (file-attributes file)))) (defun mew-file-get-time (file) (nth 5 (file-attributes file))) (defun mew-file-get-size (file) (nth 7 (file-attributes file))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; File ;;; (defun mew-file-chase-links (file) "Chase links in FILENAME until a name that is not a link. Does not examine containing directories for links." (let ((ret file) exp) (while (setq exp (file-symlink-p ret)) (setq ret (expand-file-name exp (file-name-directory ret)))) ret)) (defun mew-file-from-home (str) (if (string-match (expand-file-name mew-home) str) (concat mew-home (substring str (match-end 0))) str)) (defun mew-prepend-prefix (file prefix) (if (file-name-absolute-p file) (concat (file-name-directory file) prefix (file-name-nondirectory file)) (concat prefix file))) (defun mew-rotate-log-files (file-name) (let ((i 8) (file (expand-file-name file-name mew-conf-path))) (when (and (file-exists-p file) (>= (mew-file-get-size file) mew-log-max-size)) (while (>= i 0) (if (file-exists-p (format "%s.%d" file i)) (rename-file (format "%s.%d" file i) (format "%s.%d" file (1+ i)) t)) (setq i (1- i))) (rename-file file (format "%s.0" file))))) (defun mew-remove-drive-letter (file) (if (string-match mew-regex-drive-letter file) (substring file 2) file)) (defun mew-get-file-modes (path) (let* ((dir (file-name-directory path)) (dirmode (file-modes dir))) (logand dirmode mew-file-mode-mask))) (defun mew-set-file-modes (path) (set-file-modes path (mew-get-file-modes path))) (defun mew-delete-file (file) (if (and (stringp file) (file-exists-p file)) (delete-file file))) (defun mew-insert-file-contents (&rest args) "A safe version of insert-file-contents. This checks -*-coding:ctext;-*- internally when including a file." (let ((after-insert-file-functions nil)) ;; preventing after-insert-file-set-buffer-file-coding-system (apply 'mew-insert-file-contents2 args))) (defun mew-insert-file-contents2 (&rest args) "Mew version of insert-file-contents. This sets buffer-file-coding-system." (let ((auto-image-file-mode nil)) (apply 'insert-file-contents args))) (defun mew-find-file-noselect (&rest args) "A safe version of find-file-noselect. This checks -*-coding:ctext;-*- internally when including a file. But this does not set buffer-file-coding-system." (let ((after-insert-file-functions nil)) ;; preventing after-insert-file-set-buffer-file-coding-system (apply 'mew-find-file-noselect2 args))) (defun mew-find-file-noselect2 (&rest args) "A safe version of find-file-noselect. This checks -*-coding:ctext;-*- internally when including a file and sets buffer-file-coding-system." (let ((auto-image-file-mode nil) (format-alist nil) (auto-mode-alist nil) (enable-local-variables nil) (find-file-hook nil) (large-file-warning-threshold nil)) (apply 'find-file-noselect args))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; temp name ;;; (defun mew-make-temp-name (&optional fname) (unless (file-exists-p mew-temp-dir) (mew-make-directory mew-temp-dir)) ;; just in case (if fname (let ((exist (file-exists-p (expand-file-name fname mew-temp-dir)))) (if (and (not exist) (or (not (featurep 'meadow)) (string-match "^[ -~]+$" fname))) (expand-file-name fname mew-temp-dir) (if (string-match "\\.[ -~]+$" fname) (concat (make-temp-name mew-temp-file) (mew-match-string 0 fname)) (make-temp-name mew-temp-file)))) (make-temp-name mew-temp-file))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Random ;;; (defvar mew-random-base-09 "0123456789") (defvar mew-random-base-az "abcdefghijklmnopqrstuvwxwz") (defun mew-random () (let* ((vec (recent-keys)) (ran (+ (random) (emacs-pid))) c) (dotimes (i (length vec)) (setq c (aref vec i)) (if (integerp c) (setq ran (+ ran c)))) (abs ran))) (defun mew-random-string (len nump) (let* ((base (if nump mew-random-base-09 mew-random-base-az)) (baselen (length base)) (ret (mew-make-string len))) (dotimes (i len ret) (aset ret i (aref base (% (mew-random) baselen)))))) (defun mew-random-filename (dir len nump &optional suffix) (let ((cnt 0) (max 20) ;; ad hoc file filepath) (setq file (concat (mew-random-string len nump) suffix)) (setq filepath (expand-file-name file dir)) (while (and (file-exists-p filepath) (< cnt max)) (setq file (concat (mew-random-string len nump) suffix)) (setq filepath (expand-file-name file dir)) (setq cnt (1+ cnt))) (if (file-exists-p filepath) nil filepath))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Buffer ;;; (defun mew-erase-buffer () (mew-elet (widen) (erase-buffer) (buffer-disable-undo))) (defun mew-remove-buffer (buf) (if (and buf (get-buffer buf)) (kill-buffer buf))) (defmacro mew-elet (&rest body) `(let ((buffer-read-only nil) (inhibit-read-only t) (after-change-functions nil) (mark-active nil)) ,@body)) (defun mew-push-mark () "Set the mark for \\[exchange-point-and-mark]" (let ((mark-active nil)) (push-mark (point) t t))) (defun mew-region-bytes (beg end buf) ;; string-bytes() acts differently on each Emacs. ;; set-buffer-multibyte is also buggy. ;; So, use this way. (with-current-buffer buf (if (fboundp 'string-as-unibyte) (length (string-as-unibyte (mew-buffer-substring beg end))) (- end beg)))) (defun mew-count-lines (beg end) "Return number of lines between BEG and END." (save-excursion (goto-char beg) (beginning-of-line) (setq beg (point)) (goto-char end) (beginning-of-line) (setq end (point)) (if (or (not (mew-decode-syntax-p)) (not (equal (mew-decode-syntax-buffer) (current-buffer)))) (mew-count-lines1 beg end) (let ((mbeg (mew-decode-syntax-begin)) (mend (mew-decode-syntax-end))) (if (or (<= end mbeg) (>= beg mend)) (mew-count-lines1 beg end) (+ (mew-count-lines1 beg mbeg) (mew-count-lines1 mend end))))))) (defun mew-count-lines1 (beg end) (if (>= beg end) 0 (save-restriction (narrow-to-region beg end) (goto-char (point-min)) (if (not (and (mew-thread-p) mew-use-thread-separator)) (- (buffer-size) (forward-line (buffer-size))) (let ((regex mew-regex-thread-separator) (lines 0)) (while (not (eobp)) (unless (looking-at regex) (setq lines (1+ lines))) (forward-line)) lines))))) (defun mew-buffer-list (regex &optional listp mode) (let (ret) (dolist (buf (mapcar 'buffer-name (buffer-list))) (when (and (string-match regex buf) (or (not mode) (and mode (get-buffer buf) (with-current-buffer buf (eq major-mode mode))))) (if listp (setq ret (cons (list buf) ret)) (setq ret (cons buf ret))))) (nreverse ret))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; process ;;; (defmacro mew-filter (&rest body) `(let ((pbuf (process-buffer process)) ;; MUST use 'process' (obuf (buffer-name)) (inhibit-eol-conversion nil)) ;; \r\n as is (if (and (bufferp pbuf) (buffer-name pbuf)) ;; check a killed buffer ;; must use buffer-name instead of current-buffer ;; so that get-buffer can detect killed buffer. (unwind-protect (progn ;; buffer surely exists. (set-buffer (process-buffer process)) ;; necessary ,@body) (if (get-buffer obuf) ;; the body sometimes kills obuf. (set-buffer obuf)))))) (defun mew-start-process-disp (name buffer program &rest program-args) (let ((disp (cdr (assq 'display (frame-parameters)))) (process-environment (copy-sequence process-environment))) (if disp (setenv "DISPLAY" disp)) (apply 'start-process name buffer program program-args))) (defun mew-start-process-lang (name buffer program &rest program-args) (let ((process-environment (copy-sequence process-environment))) (setenv "LANGUAGE" "C") (setenv "LC_ALL" "C") (setenv "LANG" "C") (apply 'start-process name buffer program program-args))) (defun mew-call-process-lang (prog &optional infile buffer display &rest args) (let ((process-environment (copy-sequence process-environment))) (setenv "LANGUAGE" "C") (setenv "LC_ALL" "C") (setenv "LANG" "C") (apply 'call-process prog infile buffer display args))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Global info ;;; (defun mew-info (name) (cond ((vectorp name) name) ;; just for .mqi ((stringp name) (if (or (not (intern-soft name)) (not (boundp (intern name)))) (if (string-match "^mew-[^-]+-info-" name) (let* ((sym (intern (concat (mew-match-string 0 name) "list"))) (lst (symbol-value sym)) (len (length lst))) (set (intern name) (make-vector len nil))))) (symbol-value (intern-soft name))))) (defun mew-info-defun (prefix lst) (let ((i 0)) (dolist (ent lst) (fset (intern (concat prefix "get-" ent)) `(lambda (arg) (cond ((stringp arg) (aref (mew-info arg) ,i)) ((vectorp arg) (aref arg ,i))))) (fset (intern (concat prefix "set-" ent)) `(lambda (arg value) (cond ((stringp arg) (aset (mew-info arg) ,i value)) ((vectorp arg) (aset arg ,i value))))) (setq i (1+ i))))) (defun mew-info-clean-up (arg &optional start) (let ((i (or start 0)) vec len) (cond ((stringp arg) (setq vec (mew-info arg))) ((vectorp arg) (setq vec arg))) (setq len (length vec)) (while (< i len) (aset vec i nil) (setq i (1+ i))))) (defun mew-net-get-ssh-process (pnm) (aref (mew-info pnm) 3)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Buffer local info ;;; (defun mew-blinfo (sym) (let* ((name (symbol-name sym)) (lname (concat name "-list")) (lsym (intern lname)) (lst (symbol-value lsym)) (len (length lst))) (set sym (make-vector len nil)) (symbol-value sym))) (defun mew-blinfo-defun (blv-sym lst) (let ((i 0)) (dolist (ent lst) (fset (intern (concat (symbol-name blv-sym) "-get-" ent)) `(lambda () (cond ((null ,blv-sym) (aref (mew-blinfo (quote ,blv-sym)) ,i)) ((vectorp ,blv-sym) (aref ,blv-sym ,i))))) (fset (intern (concat (symbol-name blv-sym) "-set-" ent)) `(lambda (value) (cond ((null ,blv-sym) (aset (mew-blinfo (quote ,blv-sym)) ,i value)) ((vectorp ,blv-sym) (aset ,blv-sym ,i value))))) (setq i (1+ i))))) (defvar mew-ainfo-list '("icon" "win-cfg")) (mew-blinfo-defun 'mew-ainfo mew-ainfo-list) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Address ;;; (defun mew-get-my-address () (or (mew-header-parse-address mew-from:) (mew-mail-address))) ;; (defun mew-get-my-address-regex-list () "This creates a list of regular expression used to tell whether or not a given address is mine. The list is created from (mew-user), (mew-mail-address), and 'mew-mail-address-list'." (cons (concat "^" (regexp-quote (mew-user)) "$") (cons (concat "^" (regexp-quote (mew-mail-address)) "$") mew-mail-address-list))) (defun mew-is-my-address (addrs from) (and from (let ((case-fold-search t)) (catch (quote match) (car (mapcar (lambda (arg) (and (string-match arg from) (throw (quote match) t))) addrs)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Lisp load/save ;;; (defun mew-lisp-load (filename) "Load lisp from FILENAME" (let ((fullname (if (file-name-absolute-p filename) filename (expand-file-name filename mew-conf-path)))) (if (file-readable-p fullname) (with-temp-buffer (mew-frwlet mew-cs-m17n mew-cs-dummy (mew-insert-file-contents fullname)) (goto-char (point-min)) (condition-case nil (read (current-buffer)) (error ())))))) (defun mew-lisp-save (filename lisp &optional nobackup unlimit) "Save LISP to FILENAME. LISP is truncated to mew-lisp-max-length by side-effect." (let* ((fullname (if (file-name-absolute-p filename) filename (expand-file-name filename mew-conf-path))) (backname (concat fullname mew-backup-suffix)) print-length print-level) ;; for Emacs 21 (when (file-writable-p fullname) (if nobackup (mew-delete-file fullname) (if (file-exists-p fullname) (rename-file fullname backname 'override))) (when (and (not unlimit) (> (length lisp) mew-lisp-max-length)) (setq lisp (copy-sequence lisp)) ;; no side effect (mew-ntake mew-lisp-max-length lisp)) (with-temp-buffer (if (> (length lisp) mew-lisp-max-length) (print lisp (current-buffer)) (pp lisp (current-buffer))) (mew-frwlet mew-cs-dummy mew-cs-m17n (write-region (point-min) (point-max) fullname nil 'no-msg))) (mew-set-file-modes fullname)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Month ;;; (defvar mew-time-mon-alist '(("Jan" . 1) ("Feb" . 2) ("Mar" . 3) ("Apr" . 4) ("May" . 5) ("Jun" . 6) ("Jul" . 7) ("Aug" . 8) ("Sep" . 9) ("Oct" . 10) ("Nov" . 11) ("Dec" . 12))) (defun mew-time-mon-str-to-int (str) (or (cdr (assoc (capitalize str) mew-time-mon-alist)) 0)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Time Zone ;;; ;; Define symbol time zone defined in RFC822 only. (defvar mew-time-tmzn-alist '(("UT" . 0) ("GMT" . 0) ("EST" . -5) ("EDT" . -4) ("CST" . -6) ("CDT" . -5) ("MST" . -7) ("MDT" . -6) ("PST" . -8) ("PDT" . -7))) (defun mew-time-tmzn-str-to-int (str) (cdr (assoc (upcase str) mew-time-tmzn-alist))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; RFC 822 ;;; Date: Wed, 26 Jul 2000 21:18:35 +0900 (JST) ;;; (defvar mew-time-rfc-regex "\\([0-9]+\\)[ \t\n\r]+\\([a-zA-Z]+\\)[ \t\n\r]+\\([0-9]+\\)[ \t\n\r]+\\([0-9]+\\):\\([0-9]+\\)\\(:\\([0-9]+\\)\\)?\\([ \t\n\r]+\\([-+0-9a-zA-Z]+\\)\\)?") (defmacro mew-time-rfc-day () '(string-to-number (substring s (match-beginning 1) (match-end 1)))) (defmacro mew-time-rfc-mon () '(substring s (match-beginning 2) (match-end 2))) (defmacro mew-time-rfc-year () '(string-to-number (substring s (match-beginning 3) (match-end 3)))) (defmacro mew-time-rfc-hour () '(string-to-number (substring s (match-beginning 4) (match-end 4)))) (defmacro mew-time-rfc-min () '(string-to-number (substring s (match-beginning 5) (match-end 5)))) (defmacro mew-time-rfc-sec () '(if (match-beginning 7) (string-to-number (substring s (match-beginning 7) (match-end 7))) 0)) ;; returns seconds (defmacro mew-time-rfc-tmzn () '(if (match-beginning 9) (let ((tmzn (substring s (match-beginning 9) (match-end 9))) int) (cond ((string-match "^[-+][0-9]+$" tmzn) (setq int (string-to-number tmzn)) (+ (* (/ int 100) 3600) (* (% int 100) 60))) ((setq int (mew-time-tmzn-str-to-int tmzn)) (* int 3600)) (t 0))) 0)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sort key for Date: ;;; ;; "20000726121835" (defun mew-time-ctz-to-sortkey (time) (let ((system-time-locale "C")) (format-time-string "%Y%m%d%H%M%S" time))) (defun mew-time-ctz-to-sortkey-invalid (sec min hour day mon year) (format "%04d%02d%02d%02d%02d%02d" year mon day hour min sec)) ;; "20000726121835" (defun mew-time-rfc-to-sortkey (s &optional tzadj) (if (string-match mew-time-rfc-regex s) (let ((year (mew-time-rfc-year)) (mon (mew-time-mon-str-to-int (mew-time-rfc-mon))) (day (mew-time-rfc-day)) (hour (mew-time-rfc-hour)) (min (mew-time-rfc-min)) (sec (mew-time-rfc-sec)) (tmzn (mew-time-rfc-tmzn))) (cond ((< year 50) (setq year (+ year 2000))) ((< year 150) (setq year (+ year 1900)))) (if (or (< year 1970) (>= year 2038)) ;; invalid data (mew-time-ctz-to-sortkey-invalid sec min hour day mon year) (setq sec (- sec tmzn)) (if tzadj (setq sec (+ sec (car (current-time-zone))))) (mew-time-ctz-to-sortkey (encode-time sec min hour day mon year)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; User friendly time ;;; (defun mew-time-tmzn-int () (let ((tz (car (current-time-zone)))) (if (< tz 0) (format "-%02d%02d" (/ (- tz) 3600) (/ (% (- tz) 3600) 60)) (format "+%02d%02d" (/ tz 3600) (/ (% tz 3600) 60))))) ;; Wed, 26 Jul 2000 21:18:35 +0900 (JST) (defun mew-time-ctz-to-rfc (time) (let* ((system-time-locale "C") ;; A bug of Emacs 22.3 on Windows (time-zone-name (format-time-string "%Z" time)) (date (format-time-string "%a, %d %b %Y %T %z" time))) (if (string= time-zone-name "") date (concat date (format " (%s)" time-zone-name))))) ;; 2000/07/12 16:22:30 (defun mew-time-ctz-to-logtime (time) (let ((system-time-locale "C")) (format-time-string "%Y/%m/%d %H:%M:%S" time))) ;; 20000712.155559 (defun mew-time-ctz-to-msgid (time) (let ((system-time-locale "C")) (format-time-string "%Y%m%d.%H%M%S" time))) ;; (defun mew-time-calc (new old) (let ((million 1000000) (sec (+ (* 65536 (- (nth 0 new) (nth 0 old))) (- (nth 1 new) (nth 1 old)))) (usec (- (nth 2 new) (nth 2 old)))) (if (< usec 0) (setq sec (1- sec) usec (+ usec million)) (if (>= usec million) (setq sec (1+ sec) usec (- usec million)))) (+ sec (/ usec (float million))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Multibyte ;;; (defun mew-set-buffer-multibyte (arg) (if (fboundp 'set-buffer-multibyte) (set-buffer-multibyte arg))) (defun mew-set-string-multibyte (str) (if (fboundp 'string-as-multibyte) (string-as-multibyte str) str)) (defun mew-multibyte-string-p (str) (if (fboundp 'multibyte-string-p) (multibyte-string-p str))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Network ;;; (defun mew-dot-insert () (goto-char (point-min)) (while (re-search-forward "^\\." nil t) (insert ".") (forward-line))) (defun mew-dot-delete () (goto-char (point-max)) (forward-line -1) (delete-region (point) (point-max)) (goto-char (point-min)) (while (re-search-forward "^\\." nil t) (delete-char -1) (forward-line))) (defun mew-crlf-to-lf () (while (search-forward "\r\n" nil t) (replace-match "\n" nil t))) (defun mew-lf-to-crlf () (while (search-forward "\n" nil t) (replace-match "\r\n" nil t))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; sit-for ;;; (defun mew-redraw (&optional time) (sit-for (or time 0))) (defmacro mew-rendezvous (who) ;; Wait for the termination of WHO. ;; Emacs does not provide synchronize mechanism with ;; an asynchronous process. So, take this way. `(while ,who (sit-for 0.1) ;; accept-process-output or sleep-for is not enough (discard-input))) (defun mew-let-user-read () (sit-for 1.5)) (defun mew-warn (&rest msg) (apply 'message msg) (ding) (mew-let-user-read)) (defun mew-timing () (sit-for 0.01)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Multiple set ;;; (defun mew-set (vars vals) (dolist (var vars) (if var (set var (car vals))) ;; var can be nil to skip (setq vals (cdr vals)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Structure ;;; ;;; ;;; Some old code uses assoc. So, you cannot put the structure name ;;; into the car. ;;; (defun mew-keyword-number-pair (spec) (let ((len (length spec)) key ret) (dotimes (i len (nreverse ret)) (setq key (intern (concat ":" (symbol-name (car spec))))) (setq ret (cons (cons key i) ret)) (setq spec (cdr spec))))) (defmacro mew-defstruct (type &rest spec) `(progn (mew-defstruct-constructor ,type ,@spec) (mew-defstruct-s/getter ,type ,@spec))) (defmacro mew-defstruct-constructor (type &rest spec) `(defun ,(intern (concat "mew-make-" (symbol-name type))) (&rest args) (let* ((alist (quote ,(mew-keyword-number-pair spec))) (struct (make-list (length alist) nil)) key val key-num) (while args ;; cannot use dolist (setq key (car args)) (setq args (cdr args)) (setq val (car args)) (setq args (cdr args)) (unless (keywordp key) (error "'%s' is not a keyword" key)) (setq key-num (assoc key alist)) (if key-num (setcar (nthcdr (cdr key-num) struct) val) (error "'%s' is unknown" key))) struct))) (defmacro mew-defstruct-s/getter (type &rest spec) `(let* ((type-name (symbol-name ',type)) (keys ',spec) (len (length keys)) member-name setter getter) (dotimes (i len) (setq member-name (symbol-name (car keys))) (setq setter (intern (format "mew-%s-set-%s" type-name member-name))) (fset setter (list 'lambda '(struct value) (list 'setcar (list 'nthcdr i 'struct) 'value) 'struct)) (setq getter (intern (format "mew-%s-get-%s" type-name member-name))) (fset getter (list 'lambda '(struct) (list 'nth i 'struct))) (setq keys (cdr keys))))) (provide 'mew-func) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-func.el ends here kazu-yamamoto-Mew-ff9c41b/mew-gemacs.el000066400000000000000000000343121256455547000201250ustar00rootroot00000000000000;;; mew-gemacs.el --- Environment of Graphical Emacs for Mew ;; Author: Kazu Yamamoto ;; Created: Jun 22, 2000 ;;; Code: (defvar mew-prog-pamscale (or (executable-find "pamscale") "pnmscale")) (defvar mew-prog-pamscale-opt (cond ((string-match "pamscale" mew-prog-pamscale) "-xyfit") ((string-match "pnmscale" mew-prog-pamscale) "-xysize"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Menu setting ;;; (easy-menu-define mew-summary-mode-menu mew-summary-mode-map "Menu used in Summary mode." mew-summary-mode-menu-spec) (easy-menu-define mew-message-mode-menu mew-message-mode-map "Menu used in Message mode." mew-message-mode-menu-spec) (easy-menu-define mew-draft-mode-menu mew-draft-mode-map "Menu used in Draft mode." mew-draft-mode-menu-spec) (easy-menu-define mew-header-mode-menu mew-header-mode-map "Menu used in Header mode." mew-header-mode-menu-spec) (easy-menu-define mew-draft-header-menu mew-draft-header-map "Menu used in Draft mode." mew-draft-mode-menu-spec) (easy-menu-define mew-draft-attach-menu mew-draft-attach-map "Menu used in Draft mode." mew-draft-mode-menu-spec) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Toolbar functions ;;; (defvar mew-summary-toolbar nil) (defvar mew-draft-toolbar nil) (defun mew-toolbar-make (map alist) (let ((tool-bar-map (make-sparse-keymap)) ;; for tool-bar-add-item-from-menu (data-directory mew-icon-directory)) (dolist (a alist) (if (fboundp 'tool-bar-local-item-from-menu) ;; Emacs 21.3.50 or later (tool-bar-local-item-from-menu (car a) (cdr a) tool-bar-map map) ;; Emacs 21.3 or earlier ;; The target map is tool-bar-map (tool-bar-add-item-from-menu (car a) (cdr a) map))) tool-bar-map)) (defun mew-summary-setup-decoration () (if mew-icon-p (set (make-local-variable 'tool-bar-map) (mew-toolbar-make mew-summary-mode-map mew-summary-toolbar-spec)))) (defun mew-message-setup-decoration () (if mew-icon-p (set (make-local-variable 'tool-bar-map) (mew-toolbar-make mew-message-mode-map mew-message-toolbar-spec)))) (defun mew-draft-setup-decoration () (if mew-icon-p (set (make-local-variable 'tool-bar-map) (mew-toolbar-make mew-draft-mode-map mew-draft-toolbar-spec)))) (defun mew-header-setup-decoration () (if mew-icon-p (set (make-local-variable 'tool-bar-map) (mew-toolbar-make mew-header-mode-map mew-header-toolbar-spec)))) (defun mew-summary-toolbar-update ()) (defun mew-message-toolbar-update ()) (defun mew-draft-toolbar-update ()) (defun mew-header-toolbar-update ()) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; End of messages ;;; (defun mew-message-set-end-of-message () (overlay-put (mew-minfo-get-eom) 'before-string mew-end-of-message-string)) (defun mew-message-set-end-of-part () (overlay-put (mew-minfo-get-eom) 'before-string mew-end-of-part-string)) (defun mew-message-set-end-of-nil () (overlay-put (mew-minfo-get-eom) 'before-string nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Veil ;;; (defun mew-header-veil-make () (let ((ov (mew-overlay-make 1 1))) (overlay-put ov 'invisible t) (overlay-put ov 'before-string mew-header-veil-string) (delete-overlay ov) ;; detach from the buffer ov)) (defun mew-toggle-header-veil (ov) (cond ((overlay-get ov 'invisible) (overlay-put ov 'invisible nil) (overlay-put ov 'before-string nil)) (t (overlay-put ov 'invisible t) (overlay-put ov 'before-string mew-header-veil-string)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Image ;;; (defcustom mew-image-display-resize t "*If non-nil, image will be displayed with fitting to frame size" :group 'mew-message :type 'boolean) (defcustom mew-image-display-resize-always nil "*If nil, only a larger image than frame size will be displayed with fitting to frame size" :group 'mew-message :type 'boolean) (defcustom mew-image-display-resize-care-height t "*If nil, image will be displayed with fitting to only frame width" :group 'mew-message :type 'boolean) (defcustom mew-image-width-margin 45 "*A value for width margin to display image when resizing" :group 'mew-message :type 'integer) (defcustom mew-image-height-margin 200 "A value for height margin to display image when resizing" :group 'mew-message :type 'integer) (defvar mew-image-l-endian ?\x49) (defvar mew-image-b-endian ?\x4d) (defun mew-image-inline-p (format) ;; display-graphic-p (or (and window-system (image-type-available-p format)) (let* ((ent (mew-image-format-ent format)) (prog (mew-image-get-prog ent))) (and prog (mew-which-exec prog) t)))) (defun mew-img-get-n (op len) (let* ((size 0)) (if (eq op ?\x49) ; I(?\x49) or M(?\x4d) (dotimes (n len) (setq size (+ size (* (char-after) (expt ?\x100 n)))) (forward-char)) (while (< 0 len) (setq len (- len 1)) (setq size (+ size (* (char-after) (expt ?\x100 len)))) (forward-char))) size)) (defun mew-jpeg-size () (let (c size width height) (save-excursion (catch 'loop (while t (setq c (char-after)) (forward-char) (unless (eq c ?\xff) (throw 'loop nil)) (setq c (char-after)) (forward-char) (cond ((or (eq c ?\xd8) ;; SOI (eq c ?\xd9) ;; EOI (and (>= c ?\xd0) (<= c ?\xd7)))) ;; RSTm ((eq c ?\xc0) (forward-char 3) (setq height (mew-img-get-n mew-image-b-endian 2)) (setq width (mew-img-get-n mew-image-b-endian 2)) (backward-char) (throw 'loop nil)) ((and (>= c ?\xc1) (<= c ?\xfe)) (setq size (mew-img-get-n mew-image-b-endian 2)) (forward-char (- size 2))) (t (throw 'loop nil)))))) (cons width height))) (defun mew-png-size () (let (width height) (save-excursion (forward-char 18) ;; length is four bytes ;; but we takes lower two bytes (setq width (mew-img-get-n mew-image-b-endian 2)) (forward-char 2) (setq height (mew-img-get-n mew-image-b-endian 2)) (cons width height)))) (defun mew-gif-size () (let (width height) (save-excursion (forward-char 6) (setq width (mew-img-get-n mew-image-l-endian 2)) (setq height (mew-img-get-n mew-image-l-endian 2)) (cons width height)))) (defun mew-tiff-size () (let (endian size entry tag width height) (save-excursion (setq endian (char-after)) (forward-char 4) (setq size (mew-img-get-n endian 4)) (forward-char (- size 8)) ;; jump to IFD ;; IFD (setq entry (mew-img-get-n endian 2)) (catch 'loop (while t (setq entry (- entry 1)) (setq tag (mew-img-get-n endian 2)) (cond ((eq tag 256) (forward-char 6) (setq width (mew-img-get-n endian 2)) (forward-char 2)) ((eq tag 257) (forward-char 6) (setq height (mew-img-get-n endian 2)) (forward-char 2)) (t (forward-char 10))) (unless (< 1 entry) (throw 'loop nil))))) (cons width height))) (defun mew-bmp-size () (let (width height) (save-excursion (forward-char 18) ;; length is four bytes ;; but we takes lower two bytes (setq width (mew-img-get-n mew-image-l-endian 2)) (forward-char 2) (setq height (mew-img-get-n mew-image-l-endian 2)) (cons width height)))) (defun mew-pbm-size () (let (width height) (save-excursion (cond ((looking-at "^P[1-6][\t\n\v\f\r ]*\\(#[^\r\n]*[\r\n][\t\n\v\f\r ]*\\)*\\([0-9]+\\)[\t\n\v\f\r ]*\\(#[^\r\n]*[\r\n][\t\n\v\f\r ]*\\)*\\([0-9]+\\)[\t\n\v\f\r #]") ;; PBM, PGM, PPM, PNM (setq width (string-to-number (match-string 2))) (setq height (string-to-number (match-string 4)))) ((looking-at "^P7$") ;; PAM (when (re-search-forward "^WIDTH[ \t]+\\([0-9]+\\)[ \t]*$" nil t) (setq width (string-to-number (match-string 1)))) (goto-char (point-min)) (when (re-search-forward "^HEIGHT[ \t]+\\([0-9]+\\)[ \t]*$" nil t) (setq height (string-to-number (match-string 1)))))) (cons width height)))) (defvar mew-image-alist '((jpeg mew-jpeg-size "jpegtopnm" "pnmtojpeg") (png mew-png-size "pngtopam" "pnmtopng") (gif mew-gif-size "giftopnm" "pamtogif") (tiff mew-tiff-size "tifftopnm" "pamtotiff") (xwd nil "xwdtopnm" "pnmtoxwd") (xbm nil "xbmtopbm" "pbmtoxbm") (xpm nil "xpmtoppm" "ppmtoxpm") (bmp mew-bmp-size "bmptopnm" "ppmtobmp") (PCX nil "pcxtoppm" "ppmtopcx") (TGA nil "tgatoppm" "pamtotga") (ICO nil "winicontoppm" "ppmtowinicon") (pbm mew-pbm-size nil nil) (PAM mew-pbm-size "pamtopnm" "pamtopam"))) (defun mew-image-format-ent (format) (assoc format mew-image-alist)) (defun mew-image-get-func (ent) (nth 1 ent)) (defun mew-image-get-prog (ent) (nth 2 ent)) (defun mew-image-get-prog2 (ent) (nth 3 ent)) (defun mew-mime-image (cache begin end format) (message "Loading image...") (set-buffer (mew-buffer-message)) (let* ((width (- (frame-pixel-width (selected-frame)) mew-image-width-margin)) (height (- (frame-pixel-height (selected-frame)) mew-image-height-margin)) (ent (mew-image-format-ent format)) (prog (mew-image-get-prog ent)) (func-size (mew-image-get-func ent)) image-size image-width image-height image) (with-temp-buffer (mew-plet (insert-buffer-substring cache begin end) (mew-set-buffer-multibyte nil) (goto-char (point-min)) (cond ((and mew-image-display-resize (not mew-image-display-resize-always) func-size) (setq image-size (funcall func-size)) (setq image-width (car image-size)) (setq image-height (cdr image-size))) (t (setq image-width nil) (setq image-height nil))) (when (and (not (image-type-available-p format)) prog (mew-which-exec prog)) (message "Converting image...") (call-process-region (point-min) (point-max) prog t '(t nil) nil) (setq format 'pbm) (unless (or image-width image-height) (goto-char (point-min)) (setq image-size (mew-pbm-size)) (setq image-width (car image-size)) (setq image-height (cdr image-size))) (message "Converting image...done")) (when (and mew-image-display-resize (or mew-image-display-resize-always (and image-width image-height (or (< width image-width) (and mew-image-display-resize-care-height (< height image-height))))) (or (eq format 'pbm) (mew-which-exec prog))) (message "Resizing image...") (unless (eq format 'pbm) (call-process-region (point-min) (point-max) prog t '(t nil) nil) (setq format 'pbm)) (if mew-image-display-resize-care-height (call-process-region (point-min) (point-max) mew-prog-pamscale t '(t nil) nil mew-prog-pamscale-opt (format "%d" width) (format "%d" height)) (call-process-region (point-min) (point-max) mew-prog-pamscale t '(t nil) nil "-xsize" (format "%d" width))) (message "Resizing image...done")) (setq image (mew-buffer-substring (point-min) (point-max))))) (mew-elet (condition-case nil (insert-image (mew-create-image image format t)) (error ())))) (goto-char (point-min)) (message "Loading image...done")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Transient ;;; (defun mew-mark-active-p () (and transient-mark-mode mark-active)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; X Face ;;; (defun mew-x-face-create () (mew-create-image (string-as-unibyte (mew-buffer-substring (point-min) (point-max))) nil t)) (defun mew-x-face-display (xface) (save-excursion (goto-char (point-min)) (let ((regex2 (concat "^\\(" mew-from: "\\).*"))) (when (re-search-forward regex2 nil t) (goto-char (match-end 1)) (insert-image xface))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; SSL/SSH/TLS notification ;;; (defvar mew-secure-format nil) ;; Emacs 21.x has a bug that an image cannot be displayed ;; if it is specified in mode-line-process. (defvar mew-secure-format2 (if (display-graphic-p) (let ((data-directory mew-icon-directory)) (concat " " (propertize "Sec" 'display (find-image '((:type xpm :file "mew-lock.xpm" :ascent center)))))) " [Sec]")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Click hack ;;; (define-key mew-message-mode-map [mouse-2] 'mew-browse-url-at-mouse) (if (and (featurep 'emacs) ;; preventing XEmacs's byte compiler from hanging (eq system-type 'darwin)) ;; for Mac (define-key mew-message-mode-map [M-down-mouse-1] 'mew-browse-url-at-mouse)) (provide 'mew-gemacs) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-gemacs.el ends here kazu-yamamoto-Mew-ff9c41b/mew-header.el000066400000000000000000000376011256455547000201220ustar00rootroot00000000000000;; mew-header.el --- Mail header stuff for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) (defvar mew-anonymous-recipients ":;") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Header functions ;;; (defun mew-header-goto-next () (while (looking-at mew-lwsp) (forward-line))) ;; see also mew-header-end (defun mew-header-goto-end () (goto-char (point-min)) (if (re-search-forward mew-eoh nil t) (beginning-of-line) (goto-char (point-max)) (if (eolp) (insert "\n")))) (defun mew-header-goto-body () (mew-header-goto-end) (forward-line)) (defun mew-header-get-value (field &optional as-list) "currently, when no match, it returns nil." ;; maybe called in narrowed region. ;; we cannot widen for citation. (let ((case-fold-search t) (regex (format "^%s[ \t]*" field)) start match ret) (save-excursion (mew-header-goto-end) (save-restriction (narrow-to-region (point-min) (point)) (goto-char (point-min)) (catch 'only-one (while (re-search-forward regex nil t) (setq start (match-end 0)) (forward-line) (mew-header-goto-next) (setq match (mew-buffer-substring start (1- (point)))) (unless (string= "" match) (if ret (if as-list (setq ret (cons match ret)) (setq ret (concat ret "," match))) (if as-list (setq ret (list match)) (setq ret match)) (if (string= field mew-from:) (throw 'only-one nil)))))))) (if as-list (nreverse ret) ret))) (defalias 'mew-header-existp 'mew-header-get-value) (defun mew-header-replace-value (field value) (let ((case-fold-search t) (regex (format "^%s[ \t]*" field)) start) (save-excursion (mew-header-goto-end) (save-restriction (narrow-to-region (point-min) (point)) (goto-char (point-min)) ;; make value with evaluating (if (and (listp value) (stringp (car value))) (setq value (cons 'format value))) (setq value (condition-case e (eval value) (error (format "*** ERROR: %s: %s ***" (car e) (car (cdr e)))))) (unless (or (stringp value) (null value)) (setq value (format "%s" value))) ;; at this time, value is string or nil (cond ((re-search-forward regex nil t) (setq start (match-beginning 0)) (forward-line) (mew-header-goto-next) (delete-region start (point)) (if value (mew-draft-header-insert field value))) (value ;; insert when value is exist (mew-header-goto-end) (mew-draft-header-insert field value))))))) (defun mew-make-field-regex (fields) (concat "^\\(" (mapconcat 'identity fields "\\|") "\\)")) (defun mew-header-delete-lines (fields) (when fields (let ((case-fold-search t) (regex (mew-make-field-regex fields)) start) (mew-header-goto-end) (save-restriction (narrow-to-region (point-min) (point)) (goto-char (point-min)) (while (re-search-forward regex nil t) (setq start (match-beginning 0)) (forward-line) (mew-header-goto-next) (delete-region start (point))))))) (defun mew-header-delete-other-lines (fields) (when fields (let ((case-fold-search t) (regex (mew-make-field-regex fields)) start) (mew-header-goto-end) (save-restriction (narrow-to-region (point-min) (point)) (goto-char (point-min)) (while (not (eobp)) (if start (delete-region start (point))) (if (looking-at regex) (setq start nil) (setq start (point))) (forward-line) (mew-header-goto-next)) (if start (delete-region start (point))))))) (defun mew-header-replace-lines (fields prefix) (when fields (let ((case-fold-search t) (regex (mew-make-field-regex fields))) (mew-header-goto-end) (save-restriction (narrow-to-region (point-min) (point)) (goto-char (point-min)) (while (re-search-forward regex nil t) (beginning-of-line) (insert prefix) (forward-line)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Header sort ;;; (defun mew-header-sort (order) (when order (let* ((case-fold-search t) (len (length order)) (vec (make-vector len nil)) key beg n line other) (mew-header-goto-end) (save-restriction (narrow-to-region (point-min) (point)) (goto-char (point-min)) (while (not (eobp)) (if (not (looking-at mew-keyval)) (forward-line) (setq key (mew-match-string 1)) (setq beg (match-beginning 0)) (forward-line) (mew-header-goto-next) (setq line (mew-buffer-substring beg (point))) (delete-region beg (point)) (setq n (mew-member-case-equal key order)) (if n (aset vec n (concat (aref vec n) line)) (setq other (concat other line))))) (dotimes (i len) (and (aref vec i) (insert (aref vec i)))) (and other (insert other)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Header insertion ;;; (defun mew-draft-header-insert (field value) "No encoding. Just insert." (if (and value (stringp field)) (insert field " " value "\n"))) (defun mew-draft-header-fill (field value) (unless (mew-header-existp field) (mew-draft-header-insert field value))) (defun mew-header-insert (key value &optional no-fold) (if (and value (stringp key)) (let ((beg (point)) params med parname parval) (when (listp value) (setq params (cdr value)) (setq value (car value))) (insert key) (insert " ") (setq med (point)) (if (string-match "^[\t -~]*$" value) (insert value) (mew-header-encode-text value nil (length key))) (dolist (par params) (mew-set '(parname parval) par) (insert ";") (cond ((string-match "^[-a-zA-Z0-9]+$" parval) ) ;; do nothing ((and (string= (mew-charset-guess-string parval) mew-us-ascii) (not (string-match "\"" parval))) (setq parval (concat "\"" parval "\""))) (t (setq parval (mew-param-encode parval)) (setq parname (concat parname "*")))) (insert " " parname "=" parval)) (insert "\n") (unless no-fold (mew-header-fold-region beg (point) med))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Low-level functions to parse fields ;;; ;; ;; The purpose of this function is to purse and extract value ;; of address or content header. text is not target! ;; ;; ADDRP is t if STR are addresses. ;; ADDRP is nil if STR is a value of content-*. ;; ;; 'Winnie (The) Pooh <"W. Pooh" (loves "honey") @ (somewhere in) England>' ;; -> ;; '"W. Pooh"@England' ;; ;; For 'destination', SEP is ",". ;; For Content-*, SEP is ";". ;; ;; The special (i.e. SEP) is one of delimiters. ;; 'linear-white-space' is another delimiter. ;; 'quoted-string', 'comment', and 'domain-literal' is self-delimiting. ;; But 'domain-literal' (e.g. [1.2.3.4]) is meaningless. ;; So, the delimiters consists of SEP, SP, TAB, CRLF, "(", ")", and <">. ;; ;; 'qtext' remains. (It will be removed by mew-param-decode.) ;; ## how about 'quoted-pair'? ;; ;; 'comment' must be symmetric. That is, it must have the exact number of ;; ")" against that of ")". The entire 'comment', even if nested, is ;; ignored. ;; ;; 'encoded-word' is meaningless. ;; (1) Remove 'comment' so 'encoded-word' in 'comment' is meaningless. ;; (2) 'phrase' of 'mailbox' will be ignored because 'addr-spec' in ;; 'route-addr' will be extracted. So, 'encoded-word' in 'phrase' is ;; meaningless. (defmacro mew-addrstr-parse-syntax-list-check-depth (&optional depth) `(progn (setq sep-cnt (1+ sep-cnt)) (if (and ,depth (>= sep-cnt ,depth)) (throw 'max nil)) (when (and (integerp mew-header-max-depth) (>= sep-cnt mew-header-max-depth)) (mew-warn "Too many values. Truncate values over mew-header-max-depth") (throw 'max nil)))) (defun mew-addrstr-parse-syntax-list (str sep addrp &optional depth allow-spc) (if str (mew-addrstr-parse-syntax-list1 str sep addrp depth allow-spc))) (defun mew-addrstr-parse-syntax-list1 (str sep addrp depth allow-spc) (let* ((i 0) (len (length str)) (par-cnt 0) (tmp-cnt 0) (sep-cnt 0) ;; Emacs 23 has non-safe aset. (tmp (mew-set-string-multibyte (mew-make-string len))) c ret prevc (do-clear (lambda () (setq tmp-cnt 0) (mew-addrstr-parse-syntax-list-check-depth depth))) (do-cons-ret (lambda () (setq ret (cons (substring tmp 0 tmp-cnt) ret)))) (do-copy (lambda () (aset tmp tmp-cnt c) (setq tmp-cnt (1+ tmp-cnt)))) (in-fold-quote (lambda () (setq i (1+ i)) (catch 'fold-quote (while (< i len) (setq c (aref str i)) (cond ;; ((or (char-equal c ?\t) (char-equal c mew-sp)) ;; (setq i (1+ i))) ((char-equal c ?\") (funcall do-copy) (throw 'quote nil)) (t (funcall do-copy) (throw 'fold-quote nil))))))) (in-quote (lambda () (funcall do-copy) (setq i (1+ i)) (catch 'quote (while (< i len) (setq prevc c) (setq c (aref str i)) (cond ((and (char-equal c ?\") (not (char-equal prevc ?\\))) (funcall do-copy) (throw 'quote nil)) ((char-equal c ?\n) (funcall in-fold-quote)) (t (funcall do-copy))) (setq i (1+ i)))))) (in-comment (lambda () (setq par-cnt 1) (setq i (1+ i)) (catch 'comment (while (< i len) (setq c (aref str i)) (cond ((char-equal c ?\() (setq par-cnt (1+ par-cnt))) ((char-equal c ?\)) (setq par-cnt (1- par-cnt)) (if (eq par-cnt 0) (throw 'comment nil)))) (setq i (1+ i)))))) (do-skip-until (lambda (target) (while (and (< i len) (not (char-equal (aref str i) target))) (setq i (1+ i))))) (in-addr (lambda () (cond (addrp (let (rbeg rend) (setq i (1+ i)) (setq rbeg i) (funcall do-skip-until ?>) (when (> i rbeg) (setq rend i) ;; note: to be used for substring, so not 1-. ;; should not be nested but easy to implement... (setq ret (cons (car (mew-addrstr-parse-syntax-list (substring str rbeg rend) sep t)) ret)))) (funcall do-skip-until sep) (funcall do-clear)) (t ;; just ignore (funcall do-skip-until ?>))))) (do-sep (lambda () ;; broken quoted string cannot be rescued because ;; the separator cannot be distinguished (if (> tmp-cnt 0) (funcall do-cons-ret)) (funcall do-clear))) (do-rescue (lambda (var) (save-match-data (if (and addrp (string-match "<\\([^>]+\\)>" var)) (setq ret (cons (mew-match-string 1 var) ret)) (funcall do-cons-ret)))))) ;; main (catch 'max (while (< i len) (setq c (aref str i)) (cond ((char-equal c ?\") (funcall in-quote)) ((char-equal c ?\() (funcall in-comment)) ((char-equal c ?<) (funcall in-addr)) ((or (char-equal c ?\n) (char-equal c ?\t) (and (not allow-spc) (char-equal c mew-sp))) ) ;; do nothing ((char-equal c sep) (funcall do-sep)) (t (funcall do-copy))) (setq i (1+ i))) ;; broken quoted string can be rescued if it appears solely (cond ((> par-cnt 0) (funcall do-rescue str)) ((> tmp-cnt 0) (funcall do-rescue tmp)))) (setq ret (delete nil ret)) (when allow-spc (setq ret (mapcar (lambda (str) (if (string-match "^ +\\(.*\\)" str) (mew-match-string 1 str) str)) ret))) (nreverse ret))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; High-level functions to parse fields ;;; (defun mew-addrstr-parse-value (value) (car (mew-addrstr-parse-syntax-list value ?\; nil 1))) (defun mew-addrstr-parse-value-list (value) (mew-addrstr-parse-syntax-list value ?\; nil)) (defun mew-addrstr-parse-value2 (value) (car (mew-addrstr-parse-syntax-list value ?, nil 1))) (defun mew-addrstr-parse-value-list2 (value) (mew-addrstr-parse-syntax-list value ?, nil nil t)) ;; (defun mew-addrstr-parse-address (address) (car (mew-addrstr-parse-syntax-list address ?, t 1))) (defun mew-addrstr-parse-address-list (address) (mew-addrstr-parse-syntax-list address ?, t)) (defun mew-header-parse-address (field) (car (mew-addrstr-parse-syntax-list (mapconcat 'mew-header-get-value (list field) ",") ?, t 1))) (defun mew-header-parse-address-list (field-list) (mew-addrstr-parse-syntax-list (mapconcat 'mew-header-get-value field-list ",") ?, t)) (defun mew-header-parse-address-list2 (field-list) "Collect addresses from FIELD-LIST. Remove anonymous addresses." (let ((vals (mew-addrstr-parse-syntax-list (mapconcat 'mew-header-get-value field-list ",") ?, t)) ret) (dolist (val vals) (unless (string-match mew-anonymous-recipients val) (setq ret (cons val ret)))) (nreverse ret))) ;; (defun mew-addrstr-extract-user-list (addr-list) (mapcar 'mew-addrstr-extract-user addr-list)) (defun mew-addrstr-extract-user (addr) "Extracts username from ADDR" (if (string-match "@.*:" addr) ;; xxx what's this? (setq addr (substring addr (match-end 0))) (setq addr (mew-replace-character addr mew-sp ?_)) (setq addr (substring addr 0 (string-match "%" addr))) (setq addr (substring addr 0 (string-match "@" addr))) ;; just for refile: "To: recipients:;" -> recipients (setq addr (substring addr 0 (string-match mew-anonymous-recipients addr))) ;; removing Notes domain (setq addr (substring addr 0 (string-match "/" addr))))) ;; (defun mew-addrstr-append-domain (addr) (if mew-addrbook-append-domain-p (if (string-match "@" addr) addr (concat addr "@" (mew-mail-domain))) ;; xxx addr)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Functions for ID ;;; (defun mew-idstr-get-first-id (idstr) (when (stringp idstr) (if (string-match mew-regex-id idstr) (mew-replace-white-space2 (match-string 0 idstr))))) (defun mew-idstr-get-last-id (idstr) (when (stringp idstr) (let (beg end start) (while (string-match mew-regex-id idstr start) (setq beg (match-beginning 0)) (setq end (match-end 0)) (setq start (match-end 0))) (if (and beg end) (mew-replace-white-space2 (substring idstr beg end)))))) (defun mew-idstr-to-id-list (idstr &optional rev) (when (stringp idstr) (let (ret start) (while (string-match mew-regex-id idstr start) (setq start (match-end 0)) (setq ret (cons (mew-replace-white-space2 (match-string 0 idstr)) ret))) (if rev ret (nreverse ret))))) (defun mew-id-list-to-idstr (id-list) (let (skip) (if (integerp mew-references-max-count) (setq skip (- (length id-list) mew-references-max-count))) (if (and (integerp skip) (> skip 0)) (setq id-list (nthcdr skip id-list))) (mew-join "\n\t" id-list))) (provide 'mew-header) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-header.el ends here kazu-yamamoto-Mew-ff9c41b/mew-highlight.el000066400000000000000000000330511256455547000206340ustar00rootroot00000000000000;;; mew-highlight.el --- Highlight for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 18, 1997 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Cursor line ;;; (defun mew-highlight-cursor-line () "A function to highlight the cursor line in Summary and Virtual mode." (when mew-use-highlight-cursor-line (mew-elet (if (overlayp (mew-sinfo-get-cursor-line)) (move-overlay (mew-sinfo-get-cursor-line) (save-excursion (beginning-of-line) (point)) (save-excursion (end-of-line) (point))) (mew-sinfo-set-cursor-line (mew-overlay-make (save-excursion (beginning-of-line) (point)) (save-excursion (end-of-line) (point)))) (overlay-put (mew-sinfo-get-cursor-line) 'face mew-highlight-cursor-line-face)))) (when mew-use-cursor-mark (unless (markerp overlay-arrow-position) (make-local-variable 'overlay-arrow-position) (setq overlay-arrow-position (make-marker))) (unless (and overlay-arrow-string (string= overlay-arrow-string mew-cursor-mark)) (make-local-variable 'overlay-arrow-string) (setq overlay-arrow-string mew-cursor-mark)) (set-marker overlay-arrow-position (save-excursion (beginning-of-line) (point))))) (defun mew-unhighlight-cursor-line () (when (overlayp (mew-sinfo-get-cursor-line)) (move-overlay (mew-sinfo-get-cursor-line) 1 1) ;; (goto-char (point-max)) works wrong if underline exists. ;; Redisplays it so that it works well. ;; (sit-for 0) ;; This code rocks Summary mode when typing "x", sigh. )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Marks ;;; (defun mew-highlight-mark-line (mark) (when mew-use-highlight-mark (let ((face (mew-highlight-mark-get-face mark))) (unless face (setq face 'default)) (put-text-property (save-excursion (beginning-of-line) (point)) (save-excursion (end-of-line) (point)) 'face face)))) (defun mew-highlight-unmark-line () (remove-text-properties (save-excursion (beginning-of-line) (point)) (save-excursion (end-of-line) (point)) '(face nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Header ;;; (defun mew-unhighlight-region (BEG END) (mew-overlay-delete-region BEG END)) (defun mew-unhighlight-header () (save-restriction (widen) (mew-unhighlight-region (point-min) (mew-header-end)))) (defun mew-highlight-header-region (BEG END) "A function to highlight header in Message and Draft mode." (when mew-use-highlight-header (let (key beg med nspec overlay key-face val-face start) (save-excursion (mew-elet (mew-unhighlight-region BEG END) (save-restriction (narrow-to-region BEG END) (goto-char (point-min)) (while (not (eobp)) (if (not (looking-at mew-keyval)) (forward-line) (setq start (point)) (setq key (mew-match-string 1)) (setq beg (match-beginning 0)) (setq med (match-end 0)) (forward-line) (setq nspec (mew-nspec-by-key key)) (setq key-face (mew-key-face key nspec)) (setq val-face (mew-val-face key nspec)) (setq overlay (mew-overlay-make beg med)) (overlay-put overlay 'face key-face) (setq overlay (mew-overlay-make med (1- (point)))) (overlay-put overlay 'face val-face) (while (looking-at mew-lwsp+) (forward-line) (setq overlay (mew-overlay-make (match-end 0) (1- (point)))) (overlay-put overlay 'face val-face)) (if (member (mew-capitalize key) mew-draft-address-warning-fields) (mew-highlight-header-address-region start (point))))))))))) (defun mew-highlight-header-address-region (beg end) (let ((case (mew-tinfo-get-case)) addr domain overlay begovl endovl warnp) (save-excursion (goto-char beg) (while (re-search-forward "[^\n\t, <>:;]+@\\([^\n\t, <>:;]+\\)" end t) (setq addr (downcase (mew-match-string 0))) (setq domain (downcase (mew-match-string 1))) (setq begovl (match-beginning 0)) (setq endovl (match-end 0)) (cond ((member addr (mew-safe-addresses case)) (setq warnp nil)) ((member addr (mew-warn-addresses case)) (setq warnp t)) ((member domain (mew-safe-domains case)) (setq warnp nil)) ((member domain (mew-warn-domains case)) (setq warnp t)) ((or (mew-warn-addresses case) (mew-safe-domains case)) (setq warnp t)) (t (setq warnp nil))) (when warnp (setq overlay (mew-overlay-make begovl endovl)) (overlay-put overlay 'face 'mew-face-header-warning) (overlay-put overlay 'priority 2)))))) ;; a bug of Meadow (defun mew-highlight-header () (save-restriction (widen) (mew-highlight-header-region (point-min) (mew-header-end)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Body ;;; (defun mew-highlight-body-region (BEG END &optional draft rehighlight) (when (and (or mew-use-highlight-body mew-use-highlight-url) (or (= 0 mew-highlight-body-max-size) (<= BEG mew-highlight-body-max-size))) (unless (or (= 0 mew-highlight-body-max-size) (<= END mew-highlight-body-max-size)) (setq END mew-highlight-body-max-size)) (let* ((inhibit-point-motion-hooks t) (cite-regex mew-highlight-body-regex-cite) (cmt-regex mew-highlight-body-regex-comment) (url-regex mew-regex-url) (fancy-num 0) (fancy-length (length mew-highlight-body-cite-faces)) beg end face fancy-alst fancy-prefix idn url) (save-excursion (mew-elet (when draft (mew-rear-nonsticky BEG END) (if rehighlight (remove-text-properties BEG END '(face nil mouse-face nil)))) (when mew-use-highlight-body (goto-char BEG) (while (and (<= (point) END) (re-search-forward cite-regex END t)) (setq beg (match-beginning 0)) (setq end (match-end 0)) (if (match-beginning 1) (setq fancy-prefix (mew-match-string 1)) (setq fancy-prefix nil)) (when (and fancy-prefix (< (string-width fancy-prefix) mew-highlight-body-prefix-width)) (if (setq face (cdr (assoc fancy-prefix fancy-alst))) (put-text-property beg end 'face face) (setq face (nth fancy-num mew-highlight-body-cite-faces)) (setq fancy-alst (cons (cons fancy-prefix face) fancy-alst)) (setq fancy-num (1+ fancy-num)) (when (= fancy-length fancy-num) (setq fancy-num 0)) (put-text-property beg end 'face face))) (forward-line)) (goto-char BEG) (while (and (<= (point) END) (re-search-forward cmt-regex END t)) (setq beg (match-beginning 0)) (setq end (match-end 0)) (put-text-property beg end 'face 'mew-face-body-comment))) (when mew-use-highlight-url (goto-char BEG) (while (and (<= (point) END) (re-search-forward url-regex END t)) (save-restriction (setq beg (match-beginning 0)) (setq end (match-end 0)) (narrow-to-region beg end) (goto-char (point-min)) (setq url (mew-buffer-substring (point-min) (point-max))) (while (and mew-use-punycode (re-search-forward mew-regex-punycode nil t)) (setq idn (mew-puny-decode (mew-buffer-substring (match-beginning 0) (match-end 0)))) (when idn (delete-region (match-beginning 0) (match-end 0)) (insert idn))) (goto-char (point-max)) (put-text-property (point-min) (point-max) 'mew-url url) (put-text-property (point-min) (point-max) 'face 'mew-face-body-url) (put-text-property (point-min) (point-max) 'mouse-face mew-highlight-url-mouse-face) (setq END (- END (- end (point-max)))))))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; X Face ;;; (defun mew-highlight-x-face (beg end) "Display X-Face." (if (and mew-use-highlight-x-face window-system (fboundp mew-highlight-x-face-function)) (funcall mew-highlight-x-face-function beg end))) (defvar mew-highlight-x-face-function (if mew-icon-p 'mew-highlight-x-face-original) "*A function to display-Xface") (defun mew-highlight-x-face-original (beg end) (save-excursion (goto-char beg) (mew-elet (let ((regex1 "^X-Face: *\\(.*\\(\n[ \t].*\\)*\\)\n") (buf (current-buffer)) overlay xface beg0 end0 xbmp) (while (re-search-forward regex1 end t) (setq beg0 (match-beginning 0)) (setq end0 (match-end 0)) (with-temp-buffer (mew-insert-buffer-substring buf (match-beginning 1) (match-end 1)) (setq xbmp (mew-x-face-compface-to-xbm)) (if xbmp (setq xface (mew-x-face-create)))) (when xface (setq overlay (mew-overlay-make beg0 end0)) (overlay-put overlay 'invisible t) (save-restriction (narrow-to-region beg end) (mew-x-face-display xface )))))))) (defun mew-x-face-compface-to-xbm () (when (and (mew-which-exec mew-prog-uncompface) (mew-which-exec mew-prog-icontopbm) (mew-which-exec mew-prog-pbmtoxbm)) (mew-set-buffer-multibyte nil) (mew-flet (call-process-region (point-min) (point-max) mew-prog-uncompface t t nil) (goto-char (point-min)) (insert "/* Format_version=1, Width=48, Height=48, Depth=1, Valid_bits_per_item=16 */\n") (call-process-region (point-min) (point-max) mew-prog-icontopbm t t nil) (if mew-use-highlight-x-face-inversion (call-process-region (point-min) (point-max) mew-prog-pbminvert t t nil)) (call-process-region (point-min) (point-max) mew-prog-pbmtoxbm t t nil)) t)) ;; return value ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Cooking ;;; (defun mew-summary-cook-window (&optional WIN BEG) (let* ((win (or WIN (selected-window))) (beg (or BEG (window-start win))) (end (window-end win t)) (buf (window-buffer win))) (with-current-buffer buf (funcall mew-summary-cook-function beg end)))) ;; See also mew-scan-insert-line (defun mew-summary-cook-region (beg end &optional interrupt) (when (and (mew-summary-or-virtual-p) mew-summary-buffer-raw) (let ((inhibit-point-motion-hooks t) ret mark face start med) (catch 'loop (save-excursion (mew-elet (goto-char beg) (if (mew-in-decode-syntax-p) (goto-char (mew-decode-syntax-end))) (if (and (mew-thread-p) mew-use-thread-separator (not (mew-summary-message-number))) (forward-line)) (setq start (point)) (while (and (< (point) end) ;; we cannot trust end (search-forward "\r" end t)) (if (and interrupt (input-pending-p)) (throw 'loop (setq ret t))) (setq med (match-beginning 0)) (forward-line) (if (and mew-use-highlight-mouse-line window-system) (put-text-property start med 'mouse-face mew-highlight-mouse-line-face)) (put-text-property med (1- (point)) 'invisible t) (if (mew-in-decode-syntax-p) (goto-char (mew-decode-syntax-end))) (if (and (mew-thread-p) mew-use-thread-separator (not (mew-summary-message-number))) (forward-line)) (setq start (point))) (when mew-use-highlight-mark (goto-char beg) (while (and (< (point) end) ;; we cannot trust end (re-search-forward mew-regex-mark end t)) (if (and interrupt (input-pending-p)) (throw 'loop (setq ret t))) (setq mark (mew-sumsyn-mark)) (setq face (mew-highlight-mark-get-face mark)) (beginning-of-line) (setq start (point)) (forward-line) (if face (put-text-property start (1- (point)) 'face face))))))) (set-buffer-modified-p nil) ret))) (defun mew-summary-cook-folders () (save-excursion (dolist (buf mew-buffers) (when (and (get-buffer buf) (not (input-pending-p))) (set-buffer buf) (setq mew-summary-buffer-raw (mew-summary-cook-region (point-min) (point-max) 'interrupt)))))) (defvar mew-highlight-timer-id nil) (defun mew-highlight-timer-setup () (if mew-highlight-timer-id (cancel-timer mew-highlight-timer-id)) (setq mew-highlight-timer-id (run-with-idle-timer mew-highlight-timer-interval t 'mew-summary-cook-folders))) (defun mew-highlight-timer-clean-up () (if mew-highlight-timer-id (cancel-timer mew-highlight-timer-id)) (setq mew-highlight-timer-id nil)) (provide 'mew-highlight) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-highlight.el ends here kazu-yamamoto-Mew-ff9c41b/mew-imap.el000066400000000000000000001774371256455547000176340ustar00rootroot00000000000000;;; mew-imap.el for reading ;; Author: Kazu Yamamoto ;; Created: Feb 21, 2002 ;;; Code: (require 'mew) (defvar mew-imap-msgid-file ".mew-msgid") (defvar mew-imap-folder-alist-file ".mew-folder-alist") (defvar mew-imap-folder-alist nil) (defvar mew-imap-friend-folder-list-file ".mew-friend-folder-list") (defvar mew-imap-friend-folder-list nil) (defconst mew-imap-inbox-string "inbox") (defun mew-imap-inbox-str-p (mailbox) (mew-case-equal mailbox mew-imap-inbox-string)) (defvar mew-imap-skip-uidl t) (defvar mew-imap-marks-to-clean (list mew-mark-read mew-mark-unread mew-mark-escape mew-mark-review)) (defvar mew-imap-marks-to-sync (list mew-mark-read mew-mark-unread mew-mark-review)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; IMAP info ;;; (defvar mew-imap-info-list '("server" "port" "process" "ssh-process" "ssl-process" "status" "directive" "bnm" "mdb" "rmvs" "kils" "refs" "movs" "rtrs" "dels" "uidl" "range" "rttl" "rcnt" "dttl" "rgttl" "rgcnt" "dgttl" "dgcnt" "jcnt" "rfl" "hlds" "user" "auth" "auth-list" "passwd" "account" "size" "truncated" "get-body" "flush" "no-msg" "msgdb" "done" "dispatched" "error" "delete" "case" "mailbox" "msgid" "max" "tag" "wrk" "jobs" "namespace" "authl" "spam" "spam-field" "spam-word" "spam-pattern" "new-mailbox" "my-prefix" "specials" "bytes" "virtual-info" "disp-info" "status-buf" "mark-hist")) (mew-info-defun "mew-imap-" mew-imap-info-list) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; FSM ;;; (defvar mew-imap-fsm '(("greeting" ("OK" . "capability")) ("capability" ("OK" . "post-capability")) ("auth-cram-md5" ("OK" . "pwd-cram-md5") ("NO" . "wpwd")) ("pwd-cram-md5" ("OK" . "next") ("NO" . "wpwd")) ("auth-login" ("OK" . "user-login") ("NO" . "wpwd")) ("user-login" ("OK" . "pwd-login") ("NO" . "wpwd")) ("pwd-login" ("OK" . "next") ("NO" . "wpwd")) ("login" ("OK" . "next") ("NO" . "wpwd")) ("select" ("OK" . "post-select")) ("flags" ("OK" . "flags")) ;; xxx NG but loop ("uid" ("OK" . "umsg")) ("copy" ("OK" . "copy") ("NO \\[TRYCREATE\\]" . "create") ("NO" . "wmbx")) ("create" ("OK" . "copy") ("NO" . "wmbx")) ("dels" ("OK" . "dels")) ;; xxx NG but loop ("expunge" ("OK" . "post-expunge")) ;; ("search" ("OK" . "post-search")) ;; ("fetch" ("OK" . "post-fetch")) ;; ("namespace" ("OK" . "post-namespace") ("NO\\|BAD" . "list")) ("list" ("OK" . "post-list")) ;; ("delete" ("OK" . "logout") ("NO" . "logout3")) ("rename" ("OK" . "logout") ("NO" . "logout3")) ;; ("logout" ("OK" . "noop")) ("logout2" ("OK" . "noop")) ("logout3" ("OK" . "noop")))) (defun mew-imap-fsm-by-status (status) (assoc status mew-imap-fsm)) (defun mew-imap-fsm-next (status code) (cdr (mew-assoc-match2 code (nthcdr 1 (mew-imap-fsm-by-status status)) 0))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Structure ;;; ;; 'get, 'exec and 'jobs (mew-defstruct copyinfo dst uid) ;; uid = "uid1,uid2" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filters ;;; (defun mew-imap-secure-p (pnm) (or (mew-imap-get-ssh-process pnm) (mew-imap-get-ssl-process pnm))) (defun mew-imap-command-capability (pro pnm) (mew-net-status (mew-imap-get-status-buf pnm) "Auth'ing" nil (mew-imap-secure-p pnm)) (mew-imap-process-send-string pro pnm "CAPABILITY")) (defun mew-imap-command-post-capability (pro pnm) (let ((case-fold-search t) authl) (save-excursion (goto-char (point-min)) (while (re-search-forward "AUTH=\\([^ \r\n]+\\)" nil t) (setq authl (cons (mew-match-string 1) authl))) (goto-char (point-min)) (mew-imap-set-authl pnm authl) (mew-imap-set-status pnm "authentication") (mew-imap-command-authentication pro pnm)))) (defun mew-imap-command-authentication (pro pnm) (cond ((eq (mew-imap-get-auth pnm) t) ;; t means SASL (let* ((auth-list (mew-imap-get-auth-list pnm)) (authl (mew-imap-get-authl pnm)) auth func) (if (and authl (setq auth (mew-auth-select2 authl auth-list)) (setq func (mew-imap-auth-get-func auth)) (fboundp func)) (progn (mew-imap-set-auth pnm auth) (funcall func pro pnm)) (mew-imap-debug "" "No preferred IMAP AUTH.\n") (mew-imap-set-status pnm "login") (mew-imap-command-login pro pnm)))) (t (mew-imap-set-status pnm "login") (mew-imap-command-login pro pnm)))) (defun mew-imap-command-login (pro pnm) (let* ((user (mew-imap-get-user pnm)) (prompt (format "IMAP password (%s): " (mew-imap-get-account pnm))) (pass (mew-input-passwd prompt (mew-imap-passtag pnm)))) (setq user (mew-quote-string user ?\\ '(?\\ ?\"))) (setq pass (mew-quote-string pass ?\\ '(?\\ ?\"))) (mew-imap-process-send-string pro pnm "LOGIN \"%s\" \"%s\"" user pass))) (defun mew-imap-command-wpwd (pro pnm) (mew-imap-set-error pnm "IMAP password is wrong!") (mew-passwd-set-passwd (mew-imap-passtag pnm) nil) (mew-imap-set-status pnm "logout2") (mew-imap-command-logout2 pro pnm)) (defun mew-imap-command-next (pro pnm) (let ((directive (mew-imap-get-directive pnm)) (jobs (mew-imap-get-jobs pnm))) (when (and (eq directive 'jobs) jobs) (let* ((case (mew-imap-get-case pnm)) (bnm (mew-imap-get-bnm pnm)) (file (mew-expand-msg bnm (car jobs))) (work (concat file mew-queue-work-suffix)) (data (concat file mew-imapq-info-suffix)) (data-work (concat data mew-queue-work-suffix)) jobinfo execinfo mailbox) (rename-file file work 'override) (setq jobinfo (mew-lisp-load data)) (rename-file data data-work 'override) (setq mailbox (mew-jobinfo-get-mailbox jobinfo)) (setq mailbox (mew-imap-utf-7-encode-string mailbox)) (setq mailbox (mew-imap-expand-mailbox case mailbox)) (mew-imap-set-mailbox pnm mailbox) (setq execinfo (mew-jobinfo-get-execinfo jobinfo)) (mew-imap-set-rmvs pnm (mew-execinfo-get-remove execinfo)) (mew-imap-set-kils pnm (mew-execinfo-get-kill execinfo)) (mew-imap-set-refs pnm (mew-execinfo-get-refile execinfo)) (mew-imap-set-movs pnm (mew-execinfo-get-move execinfo)) (mew-imap-set-rttl pnm (mew-execinfo-get-rttl execinfo)) (mew-imap-set-dttl pnm (mew-execinfo-get-dttl execinfo)) (mew-imap-set-mark-hist pnm (mew-imap-make-mark-hist (mew-jobinfo-get-mark-hist jobinfo))) (mew-imap-set-rcnt pnm 1) (mew-imap-set-rgcnt pnm 1) (mew-imap-set-dgcnt pnm 1) (mew-imap-set-wrk pnm work) (mew-imap-set-jobs pnm (cdr jobs)))) (mew-imap-set-status pnm "select") (mew-imap-command-select pro pnm))) (defun mew-imap-command-select (pro pnm) (let ((directive (mew-imap-get-directive pnm)) (mailbox (mew-imap-get-mailbox pnm))) (cond ((eq directive 'list) (mew-imap-set-status pnm "namespace") (mew-imap-command-namespace pro pnm)) ((eq directive 'delete) (mew-imap-set-status pnm "delete") (mew-imap-command-delete pro pnm)) ((eq directive 'rename) (mew-imap-set-status pnm "rename") (mew-imap-command-rename pro pnm)) (t (mew-imap-process-send-string pro pnm "SELECT \"%s\"" mailbox))))) (defun mew-imap-command-post-select (pro pnm) (let ((mark-hist (mew-imap-get-mark-hist pnm))) (cond (mark-hist (mew-imap-set-status pnm "flags") ;; come back (mew-imap-command-flags pro pnm)) ((mew-imap-get-spam pnm) (mew-imap-set-status pnm "search") ;; goto "uid" (mew-imap-command-search pro pnm)) (t (mew-imap-set-status pnm "uid") (mew-imap-command-uid pro pnm))))) (defun mew-imap-command-flags (pro pnm) (let ((mark-hist (mew-imap-get-mark-hist pnm)) ent msg mark flag) (cond (mark-hist (setq ent (car mark-hist)) (setq msg (mew-mark-hist-get-msg ent)) (setq mark (mew-mark-hist-get-mark ent)) (mew-imap-set-mark-hist pnm (cdr mark-hist)) (cond ((char-equal mark mew-mark-review) (setq flag "+FLAGS (\\Seen \\Flagged)")) ((char-equal mark mew-mark-read) (mew-imap-set-mark-hist pnm (cons (mew-make-mark-hist :msg msg :mark mew-mark-tmp) (cdr mark-hist))) (setq flag "+FLAGS (\\Seen)")) ((char-equal mark mew-mark-unread) (setq flag "-FLAGS (\\Seen)")) ((char-equal mark mew-mark-tmp) (setq flag "-FLAGS (\\Flagged)"))) (mew-imap-process-send-string pro pnm "UID STORE %s %s" msg flag)) (t (mew-imap-set-status pnm "post-select") (mew-imap-command-post-select pro pnm))))) (defun mew-imap-command-uid (pro pnm) (let ((directive (mew-imap-get-directive pnm)) (refs (mew-imap-get-refs pnm)) (rmvs (mew-imap-get-rmvs pnm)) (bnm (mew-imap-get-bnm pnm)) (range (mew-imap-get-range pnm)) max) (if (and mew-imap-skip-uidl (or (eq directive 'exec) (eq directive 'jobs))) (mew-imap-command-dispatch pro pnm directive refs rmvs nil) (mew-net-status (mew-imap-get-status-buf pnm) "Checking" nil (mew-imap-secure-p pnm)) (if (eq directive 'get) (mew-imap-process-send-string pro pnm "UID FETCH %s:%s (UID RFC822.SIZE FLAGS)" (mew-refileinfo-get-uid (car refs)) (mew-refileinfo-get-uid (nth (1- (length refs)) refs))) (cond ((eq directive 'biff) (setq max (mew-lisp-load (mew-expand-file bnm mew-imap-msgid-file)))) ((eq directive 'scan) (if (eq range nil) ;; update (setq max (mew-lisp-load (mew-expand-file bnm mew-imap-msgid-file)))))) (if max (setq max (string-to-number max)) (setq max 0)) (mew-imap-set-max pnm max) (mew-imap-process-send-string pro pnm "UID FETCH %d:* (UID RFC822.SIZE FLAGS)" (1+ max)))))) (defun mew-imap-command-umsg (pro pnm) (let* ((directive (mew-imap-get-directive pnm)) (max (mew-imap-get-max pnm)) (refs (mew-imap-get-refs pnm)) (rmvs (mew-imap-get-rmvs pnm)) (del-time (mew-imap-get-delete pnm)) (range (mew-imap-get-range pnm)) (ctime (current-time)) rtr rtrs dels uid siz uidl old-uidl uid-time hlds flags mdb) (if (eq directive 'inc) (setq old-uidl (mew-net-uidl-db-get (mew-imap-passtag pnm)))) (goto-char (point-min)) (while (re-search-forward "^\\* [0-9]+ FETCH (" nil t) (when (looking-at ".*UID \\([0-9]+\\)") (setq uid (mew-match-string 1))) (when (looking-at ".*RFC822.SIZE \\([0-9]+\\)") (setq siz (mew-match-string 1))) (when (looking-at ".*FLAGS (\\([^)]*\\)") ;; MUST be a list of flags (setq flags (mew-match-string 1)) (if (string-match "Flagged" flags) ;; \\\\ is urgly (setq mdb (cons (list uid mew-mark-review) mdb)) (if (string-match "Seen" flags) (setq mdb (cons (list uid mew-mark-read) mdb))))) (cond ((or (eq directive 'exec) (eq directive 'jobs) (eq directive 'get)) (cond ((setq rtr (assoc uid refs)) (setq rtrs (cons rtr rtrs))) ((member uid rmvs) (setq dels (cons uid dels))))) ((eq directive 'biff) (if (and uid (> (string-to-number uid) max)) (setq rtrs (cons (mew-make-refileinfo :uid uid :size siz) rtrs)))) ((eq directive 'scan) (if (and uid (or range ;; all, last:n (> (string-to-number uid) max))) ;; update (setq rtrs (cons (mew-make-refileinfo :uid uid :size siz) rtrs)))) ((eq directive 'sync) (if uid (setq hlds (cons uid hlds)))) ((eq directive 'inc) (if uid (setq uid-time (cdr (assoc uid old-uidl)))) (cond (uid-time (setq uidl (cons (cons uid uid-time) uidl)) (if (mew-expired-p uid-time del-time) (setq dels (cons uid dels)))) (t (setq uidl (cons (cons uid ctime) uidl)) (if (eq del-time t) (setq dels (cons uid dels))) (setq rtr (mew-make-refileinfo :uid uid :size siz)) (setq rtrs (cons rtr rtrs))))))) (mew-imap-set-msgid pnm (or (mew-refileinfo-get-uid (car rtrs)) max)) ;; 'scan (mew-imap-set-uidl pnm uidl) ;; 'inc ;; last:n (when (and (eq directive 'scan) (integerp range)) (mew-ntake range rtrs)) (setq rtrs (nreverse rtrs)) (setq dels (nreverse dels)) (setq hlds (nreverse hlds)) (mew-imap-set-mdb pnm (nreverse mdb)) (mew-imap-command-dispatch pro pnm directive rtrs dels hlds))) (defun mew-imap-command-dispatch (pro pnm directive rtrs dels hlds) (cond ((or (eq directive 'exec) (eq directive 'jobs)) ;; '((uid1 siz1 t (dst1 dst2)) ;; (uid2 siz2 t (dst1)) ;; (uid3 siz3 nil (dst1 dst2)) ;; (uid4 siz4 nil (dst3))) ;; => ;; '((dst1 uid1 uid2) ;; (dst2 uid1 uid2 uid3) ;; (dst3 uid4)) ;; dels2 = (uid1 uid2) ;; => ;; '((dst1 uid1,uid2) ;; (dst2 uid1,uid2) ;; (dst2 uid3) ;; (dst3 uid4)) (let (uid del fld flds ents dels2 fld-uids uids) (setq ents rtrs) (setq rtrs nil) (dolist (ent ents) (setq uid (mew-refileinfo-get-uid ent)) (setq del (mew-refileinfo-get-delete ent)) (setq flds (mew-refileinfo-get-folders ent)) (if del (setq dels2 (cons uid dels2))) (dolist (fld flds) (if (setq fld-uids (assoc fld rtrs)) (nconc fld-uids (list uid)) (setq rtrs (cons (list fld uid) rtrs))))) ;; (setq ents rtrs) (setq rtrs nil) (dolist (ent ents) (setq fld (car ent)) (setq uids (cdr ent)) (setq uids (mew-net-msg-group uids)) (setq uids (mapcar (lambda (arg) (mew-make-copyinfo :dst fld :uid arg)) uids)) (setq rtrs (nconc rtrs uids))) ;; (mew-imap-set-rtrs pnm rtrs) (mew-imap-set-rgttl pnm (length rtrs)) ;; (setq dels (mew-net-msg-group dels)) (setq dels2 (nreverse dels2)) (setq dels2 (mew-net-msg-group dels2)) (setq dels (nconc dels dels2)))) (t (mew-imap-set-rttl pnm (length rtrs)) (mew-imap-set-rtrs pnm rtrs) (mew-imap-set-dttl pnm (length dels)) ;; We can't use mew-net-msg-group since a member will be ;; deleted from dels. ;; (setq dels (mew-net-msg-group dels)) )) ;; (mew-imap-set-dels pnm dels) (mew-imap-set-dgttl pnm (length dels)) (mew-imap-set-hlds pnm hlds) (mew-imap-set-dispatched pnm t) (cond ((or (eq directive 'sync) (eq directive 'biff)) (mew-imap-set-status pnm "logout") (mew-imap-command-logout pro pnm)) ((or (eq directive 'exec) (eq directive 'jobs)) (if rtrs (mew-imap-command-pre-copy pro pnm) (mew-imap-command-pre-dels pro pnm))) (t ;; 'get and 'inc (mew-imap-command-pre-fetch pro pnm)))) (defun mew-imap-command-pre-copy (pro pnm) (let ((rtt (length (mew-imap-get-rtrs pnm))) (rttl (mew-imap-get-rttl pnm)) (dttl (mew-imap-get-dttl pnm)) (jcnt (mew-imap-get-jcnt pnm))) (cond ((= rtt 0) ;; should not occur (mew-imap-set-status pnm "dels") ;; logout (mew-imap-command-dels pro pnm)) (t (cond (jcnt (cond ((= jcnt 1) (mew-imap-message pnm "Processing 1 job in background...")) (t (mew-imap-message pnm "Processing %d jobs in background..." jcnt)))) ((= rttl 0) (cond ((= dttl 1) (mew-imap-message pnm "Deleting 1 message in background...")) (t (mew-imap-message pnm "Deleting %d messages in background..." dttl)))) ((= rttl 1) (mew-imap-message pnm "Refiling 1 message in background...")) (t (mew-imap-message pnm "Refiling %d messages in background..." rttl))) (mew-imap-set-status pnm "copy") (mew-imap-command-copy pro pnm))))) (defun mew-imap-command-copy (pro pnm) (mew-net-status1 (mew-imap-get-status-buf pnm) "Refiling" (mew-imap-get-rgttl pnm) (mew-imap-get-rgcnt pnm) (mew-imap-secure-p pnm)) (let* ((case (mew-imap-get-case pnm)) (spam (mew-imap-get-spam pnm)) (rtrs (mew-imap-get-rtrs pnm)) (rtr (car rtrs)) (dst (mew-copyinfo-get-dst rtr)) (uid (mew-copyinfo-get-uid rtr))) (if (null rtr) (cond ((mew-imap-get-dels pnm) (mew-imap-set-status pnm "dels") (mew-imap-command-dels pro pnm)) (t (mew-imap-set-status pnm "logout") (mew-imap-command-logout pro pnm))) (mew-imap-set-rgcnt pnm (1+ (mew-imap-get-rgcnt pnm))) (mew-imap-set-rtrs pnm (cdr rtrs)) (setq dst (mew-imap-expand-mailbox case (mew-imap-utf-7-encode-string dst))) (mew-imap-set-rfl pnm rtr) (if spam (mew-imap-process-send-string pro pnm "COPY %s \"%s\"" uid dst) (mew-imap-process-send-string pro pnm "UID COPY %s \"%s\"" uid dst))))) (defun mew-imap-command-create (pro pnm) (let* ((case (mew-imap-get-case pnm)) (rtrs (mew-imap-get-rtrs pnm)) (rtr (mew-imap-get-rfl pnm)) (dst (mew-copyinfo-get-dst rtr))) ;; 'exec or 'jobs (mew-imap-set-rgcnt pnm (1- (mew-imap-get-rgcnt pnm))) (mew-imap-set-rtrs pnm (cons rtr rtrs)) (setq dst (mew-imap-expand-mailbox case (mew-imap-utf-7-encode-string dst))) (mew-imap-process-send-string pro pnm "CREATE \"%s\"" dst))) (defun mew-imap-escape-format (str) (if (mew-folder-imapp str) (concat "%" str) str)) (defun mew-imap-command-wmbx (pro pnm) (let* ((rtr (mew-imap-get-rfl pnm)) (dst (mew-copyinfo-get-dst rtr))) (mew-imap-set-error pnm (format "Cannot create '%s' or the messages do not exist" (mew-imap-escape-format dst))) (mew-imap-set-status pnm "logout2") (mew-imap-command-logout2 pro pnm))) (defun mew-imap-command-pre-dels (pro pnm) (let ((dtt (length (mew-imap-get-dels pnm))) (dttl (mew-imap-get-dttl pnm)) (jcnt (mew-imap-get-jcnt pnm))) (cond ((= dtt 0) ;; should not occur (mew-imap-set-status pnm "logout") (mew-imap-command-logout pro pnm)) (t (cond (jcnt (cond ((= jcnt 1) (mew-imap-message pnm "Processing 1 job in background...")) (t (mew-imap-message pnm "Processing %d jobs in background..." jcnt)))) ((= dttl -1) (mew-imap-message pnm "Deleting all messages in background...")) ((= dttl 1) (mew-imap-message pnm "Deleting 1 message in background...")) (t (mew-imap-message pnm "Deleting %d messages in background..." dttl))) (mew-imap-set-status pnm "dels") (mew-imap-command-dels pro pnm))))) (defun mew-imap-command-dels (pro pnm) (mew-net-status1 (mew-imap-get-status-buf pnm) "Deleting" (mew-imap-get-dgttl pnm) (mew-imap-get-dgcnt pnm) (mew-imap-secure-p pnm)) (let ((dels (mew-imap-get-dels pnm)) (spam (mew-imap-get-spam pnm)) num) (cond (dels (mew-imap-set-dgcnt pnm (1+ (mew-imap-get-dgcnt pnm))) (setq num (car dels)) (mew-imap-set-dels pnm (cdr dels)) (if spam (mew-imap-process-send-string pro pnm "STORE %s +FLAGS (\\Deleted)" num) (mew-imap-process-send-string pro pnm "UID STORE %s +FLAGS (\\Deleted)" num))) (t (mew-imap-set-status pnm "expunge") (mew-imap-command-expunge pro pnm))))) ;; (defun mew-imap-command-search (pro pnm) (mew-net-status (mew-imap-get-status-buf pnm) "Filtering" nil (mew-imap-secure-p pnm)) (let ((pattern (mew-imap-get-spam-pattern pnm))) (if pattern (mew-imap-process-send-string pro pnm "SEARCH %s" pattern) (mew-imap-process-send-string pro pnm "SEARCH HEADER %s %s" (mew-imap-get-spam-field pnm) (mew-imap-get-spam-word pnm))))) (defun mew-imap-command-post-search (pro pnm) (let* ((case (mew-imap-get-case pnm)) (trash (or (mew-imap-spam-folder case) (mew-imap-trash-folder case))) dels rtrs beg) (goto-char (point-min)) (mew-crlf-to-lf) (goto-char (point-min)) (when (looking-at "^\\* SEARCH ") (setq beg (match-end 0)) (goto-char (point-max)) (forward-line -1) (if (bolp) (forward-char -1)) (setq dels (mew-split (mew-buffer-substring beg (point)) mew-sp)) (when trash (setq rtrs (copy-sequence dels)) (mew-imap-set-rttl pnm (length rtrs)) (setq rtrs (mew-net-msg-group rtrs)) (setq rtrs (mapcar (lambda (arg) (mew-make-copyinfo :dst trash :uid arg)) rtrs)) (mew-imap-set-rtrs pnm rtrs) (mew-imap-set-rgttl pnm (length rtrs))) (mew-imap-set-dttl pnm (length dels)) (setq dels (mew-net-msg-group dels)) (mew-imap-set-dels pnm dels) (mew-imap-set-dgttl pnm (length dels))) (cond (rtrs (mew-imap-command-pre-copy pro pnm)) (dels (mew-imap-command-pre-dels pro pnm)) (t (mew-imap-set-status pnm "uid") (mew-imap-command-uid pro pnm))))) ;; (defun mew-imap-command-pre-fetch (pro pnm) (let* ((rtt (length (mew-imap-get-rtrs pnm)))) (cond ((= rtt 0) (mew-imap-message pnm "No new messages") (mew-imap-command-logout pro pnm)) ((= rtt 1) (mew-imap-message pnm "Retrieving 1 message in background...") (mew-imap-set-status pnm "fetch") (mew-imap-command-fetch pro pnm)) (t (mew-imap-message pnm "Retrieving %d messages in background..." rtt) (mew-imap-set-status pnm "fetch") (mew-imap-command-fetch pro pnm))))) (defun mew-imap-command-fetch (pro pnm) (mew-net-status2 (mew-imap-get-status-buf pnm) (mew-imap-get-rttl pnm) (mew-imap-get-rcnt pnm) (mew-refileinfo-get-size (car (mew-imap-get-rtrs pnm))) 'zero (mew-imap-secure-p pnm)) (let* ((directive (mew-imap-get-directive pnm)) (rtrs (mew-imap-get-rtrs pnm)) (dels (mew-imap-get-dels pnm)) (rtr (car rtrs)) (uid (mew-refileinfo-get-uid rtr)) (siz (mew-refileinfo-get-size rtr)) (lim (mew-imap-get-size pnm)) (get-body (mew-imap-get-get-body pnm))) (cond ((or (null rtr) (eq directive 'biff)) (mew-imap-set-truncated pnm nil) (if dels (progn (mew-imap-set-status pnm "dels") (mew-imap-command-dels pro pnm)) (mew-imap-set-status pnm "logout") (mew-imap-command-logout pro pnm))) ((or (eq directive 'exec) (eq directive 'jobs) (eq directive 'get)) (mew-imap-set-truncated pnm nil) ;; RFC822 turns the Seen flag "on" ;; BODY.PEEK[] keeps the Seen flag "off" (mew-imap-process-send-string pro pnm "UID FETCH %s BODY.PEEK[]" uid)) ((and (eq directive 'scan) (not get-body)) (mew-imap-set-truncated pnm t) (mew-imap-process-send-string pro pnm "UID FETCH %s BODY.PEEK[HEADER]" uid)) ((or (= lim 0) (< (string-to-number siz) lim)) (mew-imap-set-truncated pnm nil) (mew-imap-process-send-string pro pnm "UID FETCH %s BODY.PEEK[]" uid)) (t (mew-imap-set-truncated pnm t) (mew-imap-process-send-string pro pnm "UID FETCH %s BODY.PEEK[HEADER]" uid))))) (defun mew-imap-command-post-fetch (pro pnm) (let* ((directive (mew-imap-get-directive pnm)) (width (1- (mew-scan-width))) (rtrs (mew-imap-get-rtrs pnm)) (rtr (car rtrs)) (uid (mew-refileinfo-get-uid rtr)) (siz (mew-refileinfo-get-size rtr)) (del (mew-refileinfo-get-delete rtr)) (union (mew-refileinfo-get-folders rtr)) ;; 'exec, 'jobs, 'scan, ... (truncated (mew-imap-get-truncated pnm)) (case (mew-imap-get-case pnm)) fld msg vec file msg-file lmsg mark folder) (cond ((or (eq directive 'exec) (eq directive 'jobs)) (setq fld (car union))) ((eq directive 'get) (mew-set '(fld msg) union) (setq lmsg msg)) (t ;; 'biff, 'scan, 'sync (setq fld (mew-imap-get-bnm pnm)))) (setq folder (mew-case:folder-folder fld)) ;; line delimiters (goto-char (point-min)) (mew-crlf-to-lf) (cond ((eq directive 'scan) (setq msg uid) (setq file (mew-expand-new-msg fld msg))) (t (setq msg-file (mew-net-get-new-message pnm fld msg 'mew-imap-get-msgdb 'mew-imap-set-msgdb)) (setq msg (car msg-file) file (cdr msg-file)))) (goto-char (point-min)) (cond (truncated (mew-header-insert-xmu uid siz t (and (eq directive 'inc) (or (mew-imap-get-case pnm) mew-case-default)))) ((eq directive 'scan) (mew-header-insert-xmu uid siz nil)) ((and (eq directive 'get) (mew-folder-imapp folder)) (mew-header-insert-xmu uid siz nil))) (catch 'write-error (condition-case nil (let ((write-region-inhibit-fsync mew-use-async-write)) (mew-frwlet mew-cs-dummy mew-cs-text-for-write (write-region (point-min) (point-max) file nil 'no-msg))) (error (mew-imap-set-status pnm "logout") (mew-imap-command-logout pro pnm) (throw 'write-error nil))) (mew-imap-set-rcnt pnm (1+ (mew-imap-get-rcnt pnm))) (when (file-exists-p file) (mew-set-file-modes file) (unless (string= folder (mew-imap-trash-folder case)) (mew-set-file-type file)) ;; (mew-set-buffer-multibyte t) (setq vec (mew-scan-header)) (mew-scan-set-folder vec fld) (mew-scan-set-message vec msg) (if (and (eq directive 'scan) (string= folder mew-imap-inbox-folder)) (setq mark (mew-scan-inbox-action vec case))) (mew-scan-body vec) (mew-set-buffer-multibyte nil) (mew-scan-insert-line fld vec width lmsg mark)) (mew-imap-set-rtrs pnm (cdr rtrs)) (cond ((eq directive 'inc) (if truncated (mew-imap-set-dels pnm (delete uid (mew-imap-get-dels pnm))))) ((eq directive 'get) (if del (mew-imap-set-dels pnm (cons uid (mew-imap-get-dels pnm)))))) (mew-imap-set-status pnm "fetch") (mew-imap-set-bytes pnm nil) (mew-imap-command-fetch pro pnm)))) (defun mew-imap-command-expunge (pro pnm) (mew-imap-process-send-string pro pnm "EXPUNGE")) (defun mew-imap-command-post-expunge (pro pnm) (if (mew-imap-get-spam pnm) (progn (mew-imap-set-status pnm "uid") (mew-imap-command-uid pro pnm )) (mew-imap-set-status pnm "logout") (mew-imap-command-logout pro pnm))) (defun mew-imap-command-namespace (pro pnm) (mew-imap-process-send-string pro pnm "NAMESPACE")) (defun mew-imap-read-sexp () (condition-case nil (read (current-buffer)) (error ()))) (defun mew-imap-command-post-namespace (pro pnm) (when (looking-at "^\\* NAMESPACE ") (let* ((beg (match-end 0)) (case (mew-imap-get-case pnm)) (prefix-list (mew-imap-prefix-list case)) (my-prefix "") user-prefix sexp sep sharp namespace ent my sp specials) (goto-char (point-max)) (forward-line -1) (save-restriction (narrow-to-region beg (point)) ;; xxx (1- (point))? (goto-char (point-min)) (while (search-forward "NIL" nil t) (replace-match "nil" t t)) (goto-char (point-min)) (setq sexp (mew-imap-read-sexp)) (cond ((null prefix-list) (setq ent (car sexp)) (setq my-prefix (nth 0 ent)) (setq sep (nth 1 ent))) (t (dolist (ent sexp) (mew-set '(my sp) ent) (when (member my prefix-list) (cond (sp (setq my-prefix my) (setq sep sp)) (t (setq specials (cons (cons (concat mew-folder-imap my) my) specials)))))))) (mew-imap-set-my-prefix pnm my-prefix) (mew-imap-set-specials pnm specials) (setq sexp (mew-imap-read-sexp)) (setq user-prefix (or (nth 0 (car sexp)) "")) (setq sexp (mew-imap-read-sexp)) (setq sharp (mew-assoc-match "^#" sexp 0))) (setq namespace (mew-imap-namespace-create sep my-prefix user-prefix sharp)) (mew-imap-set-namespace pnm namespace))) (mew-imap-set-status pnm "list") (mew-imap-command-list pro pnm)) (defun mew-imap-command-list (pro pnm) (mew-net-status (mew-imap-get-status-buf pnm) "Listing" nil (mew-imap-secure-p pnm)) (let* ((my-prefix (mew-imap-get-my-prefix pnm)) (case (mew-imap-get-case pnm)) (prefix-list (mew-imap-prefix-list case))) (mew-imap-message pnm "Collecting mailbox list...") (mew-imap-process-send-string pro pnm "LIST \"%s\" *" (or (and prefix-list my-prefix) "")))) (defun mew-imap-command-post-list (pro pnm) (let* ((case (mew-imap-get-case pnm)) (queue (mew-imap-queue-folder case)) (namespace (mew-imap-get-namespace pnm)) (specials (mew-imap-get-specials pnm)) ret mailboxes friends) (unless namespace (setq namespace (mew-imap-namespace-create nil "" "" nil)) ;; xxx separator? (mew-imap-set-namespace pnm namespace)) (setq ret (mew-imap-command-post-list-tree namespace case)) (mew-set '(mailboxes friends) ret) (unless case (setq case mew-case-default)) (if specials (setq mailboxes (nconc specials mailboxes))) (if queue (mew-folder-insert queue mailboxes nil)) (mew-imap-folder-set case mailboxes friends) (mew-imap-set-status pnm "logout") (mew-imap-command-logout pro pnm))) (defun mew-imap-command-post-list-tree (namespace case) (let* ((case-fold-search t) (my (format "^%s" (regexp-quote (or (mew-imap-namespace-my-prefix namespace) "")))) (user (format "^%s" (regexp-quote (or (mew-imap-namespace-user-prefix namespace) "")))) (sep (mew-imap-namespace-sep namespace)) subfolder friendp mbx mailbox mailboxes subnm friends) (goto-char (point-min)) (mew-crlf-to-lf) (goto-char (point-min)) (when sep (setq subfolder (format "\\([^%s\n\r]+\\)$" sep)) (setq friendp (mew-imap-friend-regex sep case))) (while (not (eobp)) (catch 'break (when (looking-at "^\\* LIST ([^)\n]*) \"?\\([^\"\n]*\\)\"? \"?\\([^\"\n]*\\)\"?") (unless sep ;; NAMESPACE may return NIL NIL NIL (setq sep (mew-match-string 1)) (mew-imap-namespace-change-sep namespace sep) (setq subfolder (format "\\([^%s\n\r]+\\)$" sep)) (setq friendp (mew-imap-friend-regex sep case))) (setq mbx (mew-match-string 2)) (setq mbx (mew-imap-utf-7-decode-string mbx)) (cond ((mew-imap-inbox-str-p mbx) (throw 'break nil)) ((string-match my mbx) (setq mbx (substring mbx (match-end 0))) (setq mailbox (concat mew-folder-imap mbx)) (cond ((string-match friendp mailbox) (setq friends (cons mailbox friends)) (setq mailboxes (cons (mew-folder-func mailbox) mailboxes))) ((string-match subfolder mbx) (setq subnm (match-string 1 mbx)) (setq mailboxes (cons (mew-folder-func mailbox subnm) mailboxes))))) ((string-match user mbx) (setq mbx (substring mbx (match-end 0))) (setq mailbox (concat mew-folder-imap "~" mbx)) (when (string-match subfolder mbx) (setq subnm (match-string 1 mbx)) (setq mailboxes (cons (mew-folder-func mailbox subnm) mailboxes)))) (t (setq mailbox (concat mew-folder-imap "#" mbx)) (when (string-match subfolder mbx) (setq subnm (match-string 1 mbx)) (setq mailboxes (cons (mew-folder-func mailbox subnm) mailboxes))))))) (forward-line)) (setq mailboxes (sort mailboxes (lambda (x y) (string< (car x) (car y))))) (setq mailboxes (cons namespace mailboxes)) (mew-imap-mailbox-arrange mailboxes sep) (setq friends (sort friends 'string<)) (list mailboxes friends))) (defun mew-imap-mailbox-arrange (lst sep) (let ((sep-char (string-to-char sep)) prv fst nxt len1 len2) (setq prv lst) (setq fst (car (car lst))) (setq len1 (length fst)) (setq lst (cdr lst)) (while lst (setq nxt (car (car lst))) (setq len2 (length nxt)) (when (and (< len1 len2) (char-equal (aref nxt len1) sep-char) (string= fst (substring nxt 0 len1))) (setcar (car prv) (concat fst sep))) (setq fst nxt) (setq prv lst) (setq lst (cdr lst)) (setq len1 len2)))) (defun mew-imap-command-delete (pro pnm) (mew-net-status (mew-imap-get-status-buf pnm) "Deleting" nil (mew-imap-secure-p pnm)) (mew-imap-message pnm "Deleting this folder...") (let ((mailbox (mew-imap-get-mailbox pnm))) (mew-imap-process-send-string pro pnm "DELETE \"%s\"" mailbox))) (defun mew-imap-command-rename (pro pnm) (mew-net-status (mew-imap-get-status-buf pnm) "Renaming" nil (mew-imap-secure-p pnm)) (mew-imap-message pnm "Deleting this folder...") (mew-imap-message pnm "Renaming this folder...") (let ((old (mew-imap-get-mailbox pnm)) (new (mew-imap-get-new-mailbox pnm))) (mew-imap-process-send-string pro pnm "RENAME \"%s\" \"%s\"" old new))) (defun mew-imap-command-logout (pro pnm) (let ((directive (mew-imap-get-directive pnm))) (cond ((eq directive 'jobs) (mew-queue-backup (mew-imap-get-wrk pnm) mew-imapq-info-suffix) (if (mew-imap-get-jobs pnm) (progn (mew-imap-set-status pnm "next") (mew-imap-command-next pro pnm)) (mew-imap-set-done pnm t) (mew-imap-process-send-string pro pnm "LOGOUT"))) (t (mew-imap-set-done pnm t) (mew-imap-process-send-string pro pnm "LOGOUT"))))) (defun mew-imap-command-logout2 (pro pnm) (let ((wrk (mew-imap-get-wrk pnm))) (if wrk (mew-queue-enqueue2 wrk))) (mew-imap-process-send-string pro pnm "LOGOUT")) (defun mew-imap-command-logout3 (pro pnm) (mew-imap-process-send-string pro pnm "LOGOUT")) (defun mew-imap-command-noop (pro pnm) ()) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; AUTH ;;; (defvar mew-imap-auth-alist '(("CRAM-MD5" mew-imap-command-auth-cram-md5) ("LOGIN" mew-imap-command-auth-login))) (defun mew-imap-auth-get-func (auth) (nth 1 (mew-assoc-case-equal auth mew-imap-auth-alist 0))) (defun mew-imap-command-auth-cram-md5 (pro pnm) (mew-imap-process-send-string pro pnm "AUTHENTICATE CRAM-MD5") (mew-imap-set-status pnm "auth-cram-md5")) (defun mew-imap-command-pwd-cram-md5 (pro pnm) (let ((user (mew-imap-get-user pnm)) (prompt (format "IMAP CRAM-MD5 password (%s): " (mew-imap-get-account pnm))) challenge passwd cram-md5) (save-excursion (goto-char (point-min)) (if (re-search-forward " \\([a-zA-Z0-9+/]+=*\\)" nil t) (setq challenge (mew-match-string 1)))) (setq passwd (mew-imap-input-passwd prompt pnm)) (setq cram-md5 (mew-cram-md5 user passwd challenge)) (mew-imap-process-send-string2 pro cram-md5))) (defun mew-imap-command-auth-login (pro pnm) (mew-imap-process-send-string pro pnm "AUTHENTICATE LOGIN") (mew-imap-set-status pnm "auth-login")) (defun mew-imap-command-user-login (pro pnm) (let* ((user (mew-imap-get-user pnm)) (euser (mew-base64-encode-string user))) (mew-imap-process-send-string2 pro euser))) (defun mew-imap-command-pwd-login (pro pnm) (let* ((prompt (format "IMAP LOGIN password (%s): " (mew-imap-get-account pnm))) (passwd (mew-imap-input-passwd prompt pnm)) (epasswd (mew-base64-encode-string passwd))) (mew-imap-process-send-string2 pro epasswd))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sub functions ;;; (defconst mew-imap-info-prefix "mew-imap-info-") (defun mew-imap-info-name (case mailbox) (let ((server (mew-imap-server case)) (port (mew-*-to-string (mew-imap-port case))) (sshsrv (mew-imap-ssh-server case)) (name mew-imap-info-prefix)) (setq name (concat name server "/" mailbox)) (unless (mew-port-equal port mew-imap-port) (setq name (concat name ":" port))) (if sshsrv (concat name "%" sshsrv) name))) (defun mew-imap-buffer-name (pnm) (concat mew-buffer-prefix pnm)) (defun mew-imap-process-send-string (pro pnm &rest args) (let ((str (apply 'format args)) (tag (mew-imap-tag))) (mew-imap-debug "=SEND=" (concat tag " " str)) (mew-imap-set-tag pnm tag) (if (and (processp pro) (eq (process-status pro) 'open)) (process-send-string pro (concat tag " " str mew-cs-eol)) (message "IMAP time out")))) (defun mew-imap-process-send-string2 (pro &rest args) (let ((str (apply 'format args))) (if (and (processp pro) (eq (process-status pro) 'open)) (process-send-string pro (concat str mew-cs-eol)) (message "IMAP time out")))) (defun mew-imap-message (pnm &rest args) (or (mew-imap-get-no-msg pnm) (apply 'message args))) (defun mew-imap-tag () (format "%s%04d" (mew-random-string 4 nil) (% (mew-random) 10000))) (defun mew-imap-passtag (pnm) (let ((server (mew-imap-get-server pnm)) (port (mew-imap-get-port pnm)) (user (mew-imap-get-user pnm))) (concat user "@" server ":" port))) (defun mew-imap-passtag2 (case) (let ((server (mew-imap-server case)) (port (mew-imap-port case)) (user (mew-imap-user case))) (concat user "@" server ":" port))) (defun mew-imap-input-passwd (prompt pnm) (let ((directive (mew-imap-get-directive pnm)) (pro (mew-imap-get-process pnm)) (tag (mew-imap-passtag pnm)) pass) (if (eq directive 'biff) (or (mew-imap-get-passwd pnm) ;; mew-imap-biff (mew-input-passwd prompt tag)) ;; mew-imap-check (setq pass (mew-input-passwd prompt tag)) (unless (and (processp pro) (eq (process-status pro) 'open)) (mew-passwd-set-passwd tag nil)) pass))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Namespace ;;; (defvar mew-imap-namespace-length 5) (defun mew-imap-namespace-create (sep my-prefix user-prefix sharp) (mew-folder-func mew-imap-inbox-folder (list sep my-prefix user-prefix sharp))) (defun mew-imap-namespace (case) (let* ((alist (mew-imap-folder-alist case)) (namespace (assoc mew-imap-inbox-folder alist))) (if (= (length namespace) mew-imap-namespace-length) namespace (error (mew-substitute-for-summary "Type '\\[universal-argument]\\[mew-status-update]' to collect IMAP folders!"))))) (defun mew-imap-namespace-sep (namespace) (nth 1 namespace)) (defun mew-imap-namespace-change-sep (namespace sep) (setcar (nthcdr 1 namespace) sep)) (defun mew-imap-namespace-my-prefix (namespace) (nth 2 namespace)) (defun mew-imap-namespace-user-prefix (namespace) (nth 3 namespace)) (defun mew-imap-namespace-sharp (namespace) (nth 4 namespace)) (defun mew-imap-separator (case) (mew-imap-namespace-sep (mew-imap-namespace case))) (defun mew-imap-directory-file-name (dir case) ;; inbox.foo. => inbox.foo (let* ((sep (mew-imap-separator case)) (sep-char (string-to-char sep)) (len (1- (length dir)))) (if (char-equal sep-char (aref dir len)) (substring dir 0 len) dir))) (defun mew-imap-file-name-as-directory (dir case) ;; inbox.foo => inbox.foo. (let* ((sep (mew-imap-separator case)) (sep-char (string-to-char sep)) (len (1- (length dir)))) (if (char-equal sep-char (aref dir len)) dir (concat dir sep)))) ;;; (defun mew-imap-bnm-to-mailbox (bnm) " case:%inbox -> inbox case:%foo -> inbox.foo case:%~foo -> user.foo case:%#foo -> foo" (let ((case (mew-case:folder-case bnm)) (folder (mew-case:folder-folder bnm))) (mew-imap-expand-mailbox case folder))) (defun mew-imap-expand-mailbox (case folder) "%inbox -> inbox %foo -> inbox.foo %~foo -> user.foo %#foo -> foo" (when (stringp folder) (setq folder (mew-imap-directory-file-name folder case)) (let* ((str (mew-folder-string folder)) (c (aref str 0)) (substr (substring str 1)) (namespace (mew-imap-namespace case)) (my-prefix (mew-imap-namespace-my-prefix namespace)) (user-prefix (mew-imap-namespace-user-prefix namespace)) (sharp (mew-imap-namespace-sharp namespace))) (cond ((char-equal c ?~) (if user-prefix (concat user-prefix substr) substr)) ((char-equal c ?#) (if sharp str substr)) ((string= str mew-imap-inbox-string) mew-imap-inbox-string) (t (if my-prefix (concat my-prefix str) str)))))) (defun mew-imap-expand-folder (case str) " foo -> foo ~foo -> user.foo #foo -> #foo " (when (and (stringp str) (not (string= str ""))) (if (char-equal (aref str 0) ?~) (let* ((namespace (mew-imap-namespace case)) (user-prefix (mew-imap-namespace-user-prefix namespace))) (concat "#" user-prefix (substring str 1))) str))) ;; Mew cache IMAP ;; folder directory mailbox ;; ;; WU ;; %foo foo foo ;; %foo/bar foo/bar foo/bar ;; %~alice/foo #~alice/foo ~alice/foo "~" -> "~" ;; %#shared.foo #shared.foo #shared.foo ;; ;; Cyrus ;; %foo foo inbox.foo ;; %foo.bar foo.bar inbox.foo.bar ;; %~alice.foo #user.alice.foo user.alice.foo ;; %#shared.foo #shared.foo shared.foo ;; ;; Courier ;; %foo foo inbox.foo ;; %foo.bar foo.bar inbox.foo.bar ;; %~alice.foo N/A N/A ;; %#shared.foo #shared.foo shared.foo (defun mew-imap-local-to-imap (case str) (let* ((sep (mew-imap-separator case)) (fld (copy-sequence str))) (aset fld 0 ?%) (unless (string= sep mew-path-separator) (mew-replace-character fld ?/ (string-to-char sep))) fld)) (defun mew-imap-fcc-to-mailbox (case fld) (let* ((namespace (mew-imap-namespace case)) (my-prefix (mew-imap-namespace-my-prefix namespace)) (ret (substring fld (1+ (length mew-folder-imap-fcc-prefix))))) (if (string= ret mew-imap-inbox-string) mew-imap-inbox-string (if my-prefix (concat my-prefix ret) ret)))) (defun mew-imap-friend-regex (sep case) (format "^%s%s" (regexp-quote (mew-imap-friend-folder case)) (regexp-quote sep))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Opening IMAP ;;; (defun mew-imap-open (pnm server port no-msg) (let ((sprt (mew-*-to-port port)) pro tm) (condition-case emsg (progn (setq tm (run-at-time mew-imap-timeout-time nil 'mew-imap-timeout)) (or no-msg (message "Connecting to the IMAP server...")) (setq pro (open-network-stream pnm nil server sprt)) (mew-process-silent-exit pro) (mew-set-process-cs pro mew-cs-binary mew-cs-text-for-net) (or no-msg (message "Connecting to the IMAP server...done"))) (quit (or no-msg (message "Cannot connect to the IMAP server")) (setq pro nil)) (error (or no-msg (message "%s, %s" (nth 1 emsg) (nth 2 emsg))) (setq pro nil))) (if tm (cancel-timer tm)) pro)) (defun mew-imap-timeout () (signal 'quit nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Launcher ;;; (defun mew-imap-make-mark-hist (ents) (let (ret) (dolist (ent ents) (let ((mark (mew-mark-hist-get-mark ent)) (msg (mew-mark-hist-get-msg ent))) (cond ((memq mark mew-imap-marks-to-sync) (setq ret (cons ent ret))) ;; xxx the refile mark overrides the read mark. ;; If we refile a message, we cannot distinguish ;; read or unread... ((char-equal mark mew-mark-refile) (setq ret (cons (mew-make-mark-hist :msg msg :mark mew-mark-read) ret)))))) (nreverse ret))) (defun mew-imap-retrieve (case directive bnm &rest args) (let* ((server (mew-imap-server case)) (user (mew-imap-user case)) (port (mew-*-to-string (mew-imap-port case))) (sshsrv (mew-imap-ssh-server case)) (sslp (mew-imap-ssl case)) (sslport (mew-imap-ssl-port case)) (proxysrv (mew-imap-proxy-server case)) (proxyport (mew-imap-proxy-port case)) ;; dirty but necessary for migration (mailbox (unless (eq directive 'list) (mew-imap-utf-7-encode-string (mew-imap-bnm-to-mailbox bnm)))) (pnm (mew-imap-info-name case mailbox)) (buf (get-buffer-create (mew-imap-buffer-name pnm))) (no-msg (eq directive 'biff)) process sshname sshpro sslname sslpro lport info jobs tls virtual-info disp-info virtual) (if (mew-imap-get-process pnm) (message "Another IMAP process is running. Try later") (cond (sshsrv (setq sshpro (mew-open-ssh-stream case server port sshsrv)) (when sshpro (setq sshname (process-name sshpro)) (setq lport (mew-ssh-pnm-to-lport sshname)) (when lport (setq process (mew-imap-open pnm "localhost" lport no-msg))))) (sslp (if (mew-port-equal port sslport) (setq tls mew-tls-imap)) (setq sslpro (mew-open-ssl-stream case server sslport tls)) (when sslpro (setq sslname (process-name sslpro)) (setq lport (mew-ssl-pnm-to-lport sslname)) (when lport (setq process (mew-imap-open pnm mew-ssl-localhost lport no-msg))))) (proxysrv (setq process (mew-imap-open pnm proxysrv proxyport no-msg))) (t (setq process (mew-imap-open pnm server port no-msg)))) (if (null process) (when (eq directive 'exec) (mew-imap-exec-recover bnm)) (mew-summary-lock process "IMAPing" (or sshpro sslpro)) (mew-sinfo-set-summary-form (mew-get-summary-form bnm)) (mew-sinfo-set-summary-column (mew-get-summary-column bnm)) (mew-sinfo-set-unread-mark nil) (mew-sinfo-set-scan-id nil) (mew-sinfo-set-scan-md5 nil) (mew-info-clean-up pnm) (mew-imap-set-no-msg pnm no-msg) ;; must come here (mew-imap-message pnm "Communicating with the IMAP server...") (mew-imap-set-process pnm process) (mew-imap-set-ssh-process pnm sshpro) (mew-imap-set-ssl-process pnm sslpro) (mew-imap-set-server pnm server) (mew-imap-set-port pnm port) (mew-imap-set-user pnm user) (mew-imap-set-account pnm (format "%s@%s" user server)) (mew-imap-set-auth pnm (mew-imap-auth case)) (mew-imap-set-auth-list pnm (mew-imap-auth-list case)) (mew-imap-set-status pnm "greeting") (mew-imap-set-directive pnm directive) (mew-imap-set-bnm pnm bnm) (mew-imap-set-status-buf pnm bnm) (mew-imap-set-rcnt pnm 1) (mew-imap-set-rgcnt pnm 1) (mew-imap-set-dgcnt pnm 1) (mew-imap-set-jcnt pnm nil) (mew-imap-set-rttl pnm 0) (mew-imap-set-dttl pnm 0) (mew-imap-set-size pnm (mew-imap-size case)) (mew-imap-set-mailbox pnm mailbox) (mew-imap-set-case pnm case) (mew-imap-set-bytes pnm nil) (mew-imap-set-mark-hist pnm (mew-imap-make-mark-hist (mew-sinfo-get-mark-hist))) (cond ((eq directive 'biff) (mew-imap-set-passwd pnm (nth 0 args))) ;; password ((eq directive 'inc) (mew-sinfo-set-unread-mark (mew-get-unread-mark bnm)) (mew-imap-set-flush pnm (nth 0 args)) ;; no-flush (mew-imap-set-delete pnm (mew-imap-delete case))) ((eq directive 'get) (mew-sinfo-set-unread-mark (mew-get-unread-mark bnm)) (mew-imap-set-refs pnm (nth 0 args)) (setq virtual-info (nth 1 args)) (mew-imap-set-virtual-info pnm virtual-info) (setq disp-info (nth 2 args)) (mew-imap-set-disp-info pnm disp-info) (setq virtual (mew-net-virtual-info-get-virtual virtual-info)) (when virtual (mew-imap-set-status-buf pnm virtual) (with-current-buffer virtual (mew-summary-lock process "IMAPing" (or sshpro sslpro))))) ((eq directive 'scan) (mew-imap-set-range pnm (nth 0 args)) (mew-imap-set-get-body pnm (nth 1 args)) (mew-sinfo-set-unread-mark (mew-get-unread-mark bnm)) (if (mew-imap-get-range pnm) (progn ;; (mew-imap-set-mdb pnm (mew-summary-mark-collect4)) (mew-net-folder-clean)) ;; (mew-imap-set-mdb pnm (mew-summary-mark-collect5)) (mew-net-invalid-cache-invisible)) (when (and (string= mailbox mew-imap-inbox-string) (or (mew-imap-spam-pattern case) (and (mew-imap-spam-field case) (mew-imap-spam-word case)))) (mew-imap-set-spam pnm t) (mew-imap-set-spam-field pnm (mew-imap-spam-field case)) (mew-imap-set-spam-word pnm (mew-imap-spam-word case)) (mew-imap-set-spam-pattern pnm (mew-imap-spam-pattern case)))) ((eq directive 'sync) (mew-sinfo-set-unread-mark (mew-get-unread-mark bnm))) ((eq directive 'exec) (setq info (nth 0 args)) (mew-imap-set-rmvs pnm (mew-execinfo-get-remove info)) (mew-imap-set-kils pnm (mew-execinfo-get-kill info)) (mew-imap-set-refs pnm (mew-execinfo-get-refile info)) (mew-imap-set-movs pnm (mew-execinfo-get-move info)) (mew-imap-set-rttl pnm (mew-execinfo-get-rttl info)) (mew-imap-set-dttl pnm (mew-execinfo-get-dttl info))) ((eq directive 'jobs) (mew-imap-set-jcnt pnm 0) (setq jobs (nth 0 args)) (mew-imap-set-jobs pnm jobs) (mew-imap-set-jcnt pnm (length jobs))) ((eq directive 'delete) ) ((eq directive 'rename) (mew-imap-set-new-mailbox pnm (mew-imap-bnm-to-mailbox (nth 0 args))))) (mew-sinfo-set-start-point (point)) ;; after erase-buffer ;; (set-process-sentinel process 'mew-imap-sentinel) (set-process-filter process 'mew-imap-filter) (set-process-buffer process buf))))) (defun mew-imap-exec-recover (bnm) (mew-summary-visible-buffer bnm) (mew-sinfo-set-refile (nconc (mew-sinfo-get-refile) (mew-sinfo-get-refile-back))) (mew-sinfo-set-refile-back nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filter and sentinel ;;; (defun mew-imap-debug (label string) (when (mew-debug 'net) (with-current-buffer (get-buffer-create mew-buffer-debug) (goto-char (point-max)) (let ((start (point))) (insert (format "\n<%s>\n%s\n" label string)) (goto-char start) (mew-crlf-to-lf)) (goto-char (point-max))))) (defun mew-imap-filter (process string) (let* ((pnm (process-name process)) (status (mew-imap-get-status pnm)) (tag (mew-imap-get-tag pnm)) (eos (format "^%s \\(OK\\|NO \\[TRYCREATE\\]\\|NO\\|BAD\\)" tag)) (bytes (mew-imap-get-bytes pnm)) stay next func code) (mew-imap-debug (upcase status) string) (mew-filter ;; Process's buffer (goto-char (point-max)) (mew-set-buffer-multibyte nil) (insert string) (cond ((string= status "fetch") (mew-net-status2 (mew-imap-get-status-buf pnm) (mew-imap-get-rttl pnm) (mew-imap-get-rcnt pnm) (mew-refileinfo-get-size (car (mew-imap-get-rtrs pnm))) nil (mew-imap-secure-p pnm)) (goto-char (point-min)) (when (and (null bytes) (looking-at "^\\*[^{]*{\\([0-9]+\\)}")) (setq bytes (string-to-number (mew-match-string 1))) (mew-imap-set-bytes pnm bytes)) (when bytes (goto-char (point-min)) (while (and (looking-at "^\\*") (= (forward-line) 0)) (delete-region (point-min) (point)))) (if (or (null bytes) (< (point-max) bytes) (save-excursion (goto-char (point-max)) (not (bolp)))) (setq stay t) (goto-char (point-max)) (forward-line -1) (while (looking-at "^\\*") (forward-line -1)) (if (not (looking-at eos)) (setq stay t) (delete-region (1+ bytes) (point-max)) (setq next (mew-imap-fsm-next status "OK"))))) ((and (goto-char (point-max)) (= (forward-line -1) 0) (looking-at "^\\*")) ;; untagged message (if (string= status "greeting") (setq next (mew-imap-fsm-next "greeting" "OK")) (setq stay t))) ((and (goto-char (point-min)) (looking-at "\\+")) (setq next (mew-imap-fsm-next status "OK"))) ((and (goto-char (point-max)) (= (forward-line -1) 0) (looking-at eos)) (mew-imap-set-tag pnm nil) (setq code (mew-match-string 1)) (setq next (mew-imap-fsm-next status code))) (t ;; xxx what about in this case? ;; * untag ;; * untag ;; tag ;; * untag (setq stay t))) (unless stay (unless next (setq next "logout")) (mew-imap-set-status pnm next) (setq func (intern-soft (concat "mew-imap-command-" next))) (goto-char (point-min)) (if (fboundp func) (funcall func process pnm) (error "No function called %s" (symbol-name func))) (if (and process (equal (process-buffer process) (current-buffer))) (mew-erase-buffer)))))) (defun mew-imap-mark-clean (mark) (let* ((regex (mew-mark-list-regex mew-imap-marks-to-clean))) (save-excursion (goto-char (point-min)) (while (re-search-forward regex nil t) (mew-mark-put mark) (forward-line))))) ;; see also mew-summary-mark-recover (defun mew-imap-mark-recover (mdb) (let ((opos (point)) (case-fold-search nil) msg mrk omrk) (goto-char (point-min)) (dolist (ent mdb) (mew-set '(msg mrk) ent) (when (re-search-forward (mew-regex-sumsyn-msg msg) nil t) (setq omrk (mew-summary-get-mark)) (unless (and omrk (or (char-equal omrk mew-mark-refile) (char-equal omrk mew-mark-delete) (char-equal omrk mew-mark-unlink))) (mew-mark-put mrk)) ;; hist will be reset (forward-line))) (goto-char opos))) (defun mew-imap-sentinel (process event) (let* ((pnm (process-name process)) (directive (mew-imap-get-directive pnm)) (case (mew-imap-get-case pnm)) (mdb (mew-imap-get-mdb pnm)) (sshpro (mew-imap-get-ssh-process pnm)) (sslpro (mew-imap-get-ssl-process pnm)) (rttl (mew-imap-get-rttl pnm)) (dttl (mew-imap-get-dttl pnm)) (jcnt (mew-imap-get-jcnt pnm)) (bnm (or (mew-imap-get-bnm pnm) (current-buffer))) ;; C-c C-k (flush (mew-imap-get-flush pnm)) (kils (mew-imap-get-kils pnm)) (movs (mew-imap-get-movs pnm)) (hlds (mew-imap-get-hlds pnm)) (uidl (mew-imap-get-uidl pnm)) (msgid (mew-imap-get-msgid pnm)) (done (mew-imap-get-done pnm)) (error (mew-imap-get-error pnm)) (file (mew-expand-file bnm mew-imap-msgid-file)) (buf (process-buffer process)) (virtual-info (mew-imap-get-virtual-info pnm)) (disp-info (mew-imap-get-disp-info pnm))) (save-excursion (mew-imap-debug "IMAP SENTINEL" event) (set-process-buffer process nil) (set-buffer bnm) (when (eq directive 'sync) (if (mew-sinfo-get-unread-mark) (mew-imap-mark-clean mew-mark-unread) (mew-imap-mark-clean mew-mark-read))) (mew-imap-mark-recover mdb) (mew-sinfo-set-mark-hist nil) ;; xxx (mew-remove-buffer buf) (if (not done) (let* ((rtrs (mew-imap-get-rtrs pnm)) (lefts (length rtrs)) (msgid (mew-refileinfo-get-uid (car rtrs))) leftp) (if error (mew-imap-message pnm error) (mew-imap-message pnm "IMAP connection is lost")) (cond ((eq directive 'exec) (mew-imap-exec-recover bnm)) ((eq directive 'scan) (mew-summary-visible-buffer bnm)) ((or (eq directive 'delete) (eq directive 'rename)) (setq mew-summary-buffer-process-error t))) (when (mew-imap-get-dispatched pnm) (cond ((eq directive 'scan) (when msgid (setq msgid (number-to-string (1- (string-to-number msgid)))) (mew-lisp-save file msgid nil 'unlimit)) (setq leftp t)) ((eq directive 'inc) ;; uidl is reversed. (setq msgid (assoc msgid uidl)) (setq uidl (cdr (member msgid uidl))) (mew-net-uidl-db-set (mew-imap-passtag pnm) uidl) (setq leftp t))) (when leftp (mew-imap-message pnm "%d messages retrieved. %d messages are left due to an error" (- rttl lefts) lefts) (mew-summary-folder-cache-save)))) (if virtual-info (mew-summary-retrieve-message-for-virtual virtual-info)) (cond ((eq directive 'list) (mew-imap-message pnm "Collecting mailbox list...done")) ((eq directive 'delete) (mew-imap-message pnm "Deleting this folder...done")) ((eq directive 'rename) (mew-imap-message pnm "Renaming this folder...done")) ((eq directive 'biff) (and (functionp mew-biff-function) (funcall mew-biff-function rttl))) ((eq directive 'sync) (mew-imap-message pnm "Synchronizing messages...") (mew-net-folder-sync bnm hlds) (mew-imap-message pnm "Synchronizing messages...done") (mew-summary-folder-cache-save)) ((eq directive 'inc) (mew-biff-clear) (mew-net-uidl-db-set (mew-imap-passtag pnm) uidl) (cond ((= rttl 0) (mew-imap-message pnm "No new messages")) ((= rttl 1) (mew-imap-message pnm "1 message retrieved") (mew-summary-folder-cache-save)) (t (mew-imap-message pnm "%s messages retrieved" rttl) (mew-summary-folder-cache-save)))) ((eq directive 'get) (cond ((= rttl 0) (mew-imap-message pnm "The message does not exist")) ((= rttl 1) (mew-imap-message pnm "1 message retrieved") (mew-summary-folder-cache-save)) (t (mew-imap-message pnm "%s messages retrieved" rttl) (mew-summary-folder-cache-save)))) ((eq directive 'scan) (mew-biff-clear) (cond ((or (= rttl 0) (null msgid)) (mew-imap-message pnm "No new messages")) ((= rttl 1) (mew-imap-message pnm "1 message retrieved") (mew-lisp-save file msgid nil 'unlimit) (mew-net-invalid-cache-clean)) (t (mew-imap-message pnm "%s messages retrieved" rttl) (mew-lisp-save file msgid nil 'unlimit) (mew-net-invalid-cache-clean)))) ((eq directive 'exec) (if kils (mew-mark-exec-unlink bnm kils)) (when movs (let ((mew-inherit-exec-case case) (mew-inherit-offline t)) (mew-mark-exec-refile bnm movs))) (when (or kils movs) (mew-mark-kill-invisible) (mew-summary-folder-cache-save)) (cond ((= rttl 1) (mew-imap-message pnm "1 message refiled")) ((> rttl 1) (mew-imap-message pnm "%d messages refiled" rttl)) ((= dttl -1) (mew-imap-message pnm "All messages deleted")) ((= dttl 1) (mew-imap-message pnm "1 message deleted")) (t (mew-imap-message pnm "%d messages deleted" dttl)))) ((eq directive 'jobs) (if (= jcnt 1) (mew-imap-message pnm "1 job processed") (mew-imap-message pnm "%d jobs processed" jcnt))))) ;; (and mew-use-async-write (mew-unix-sync)) (mew-net-status-clear (mew-imap-get-status-buf pnm)) (mew-info-clean-up pnm) (set-buffer-modified-p nil) (mew-summary-unlock) (if (and (processp sshpro) (not mew-ssh-keep-connection)) (process-send-string sshpro "exit\n")) (if (and (processp sslpro) (not mew-ssl-keep-connection)) (delete-process sslpro)) (mew-net-disp-info-display disp-info) (unless (eq directive 'biff) (run-hooks 'mew-imap-sentinel-non-biff-hook)) (run-hooks 'mew-imap-sentinel-hook) (when (and mew-auto-flush-queue flush) (mew-smtp-flush-queue mew-case))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Biff ;;; (defun mew-imap-biff () (let* ((case mew-case) (inbox (mew-proto-inbox-folder nil case)) (case:inbox (mew-case-folder case inbox)) (tag (mew-imap-passtag2 case)) passwd) (when (get-buffer case:inbox) (with-current-buffer case:inbox (when (and (mew-summary-exclusive-p 'no-msg) (and (or mew-use-cached-passwd mew-use-master-passwd) (setq passwd (mew-passwd-get-passwd tag)))) (mew-imap-retrieve case 'biff case:inbox passwd)))))) (defun mew-imap-check () "See if messages are arrived by IMAP." (interactive) (let* ((case mew-case) (inbox (mew-proto-inbox-folder nil case)) (case:inbox (mew-case-folder case inbox))) (when (get-buffer case:inbox) (with-current-buffer case:inbox (when (mew-summary-exclusive-p) (mew-imap-retrieve case 'biff case:inbox)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Mailbox alist ;;; (defun mew-imap-folder-clean-up () (setq mew-imap-folder-alist nil) (setq mew-imap-friend-folder-list nil)) (defun mew-imap-folder-alist (&optional case no-load) (unless case (setq case mew-case-default)) (let* ((ent (assoc case mew-imap-folder-alist)) (t2 (nth 1 ent)) ;; may be nil (alist (nth 2 ent)) (fld (mew-imap-folder case)) (file (mew-expand-file fld mew-imap-folder-alist-file)) (t1 (mew-file-get-time file))) (if (or no-load (and t1 (not (mew-compare-times t1 t2)))) alist (mew-imap-folder-load case) (setq ent (assoc case mew-imap-folder-alist)) (setcar (nthcdr 1 ent) t1) (setq alist (nth 2 ent)) (if alist alist (delete nil (list (mew-folder-func mew-imap-inbox-folder) (mew-folder-func (mew-imap-trash-folder case)) (mew-folder-func (mew-imap-queue-folder case)))))))) (defun mew-imap-friend-folder-list (&optional case no-load) (unless case (setq case mew-case-default)) (unless no-load (mew-imap-folder-alist case)) ;; do update (cdr (assoc case mew-imap-friend-folder-list))) (defun mew-imap-folder-load (case) (let* ((fld (mew-imap-folder case)) (file (mew-expand-file fld mew-imap-folder-alist-file)) (mailboxes (mew-lisp-load file)) (file2 (mew-expand-file fld mew-imap-friend-folder-list-file)) (friends (mew-lisp-load file2))) (mew-imap-folder-set case mailboxes friends 'no-save))) (defun mew-imap-folder-save (case) (let* ((fld (mew-imap-folder case)) (dir (mew-expand-folder fld)) (file (expand-file-name mew-imap-folder-alist-file dir)) (file2 (expand-file-name mew-imap-friend-folder-list-file dir)) (mailboxes (mew-imap-folder-alist case 'no-load)) (friends (mew-imap-friend-folder-list case 'no-load))) (mew-check-directory dir) (mew-lisp-save file mailboxes 'nobackup 'unlimit) (mew-lisp-save file2 friends 'nobackup 'unlimit) (mew-file-get-time file))) (defun mew-imap-folder-set (case mailboxes friends &optional no-save) (unless case (setq case mew-case-default)) (setq mew-imap-folder-alist (cons (list case nil mailboxes) (delete (assoc case mew-imap-folder-alist) mew-imap-folder-alist))) (setq mew-imap-friend-folder-list (cons (cons case friends) (delete (assoc case mew-imap-friend-folder-list) mew-imap-friend-folder-list))) (unless no-save (let ((t1 (mew-imap-folder-save case)) (ent (assoc case mew-imap-folder-alist))) (setcar (nthcdr 1 ent) t1)))) (defun mew-imap-update (case) (let ((bnm (mew-summary-folder-name 'ext))) (mew-imap-retrieve case 'list bnm))) (defun mew-imap-folder-insert (case folder) (let* ((sep (mew-imap-separator case)) (regex (format "\\([^%s%s\n\r]+\\)$" sep mew-folder-imap)) (mailboxes (mew-imap-folder-alist case)) (friends (mew-imap-friend-folder-list case)) (friendp (mew-imap-friend-regex sep case)) sub) (when (string-match regex folder) (cond ((string-match friendp folder) (mew-folder-insert folder mailboxes nil) (setq friends (cons folder friends))) (t (setq sub (match-string 1 folder)) (mew-folder-insert folder mailboxes sub))) (mew-imap-folder-set case mailboxes friends) t))) (defun mew-imap-folder-delete (case folder) (let ((mailboxes (mew-imap-folder-alist case)) (friends (mew-imap-friend-folder-list case))) (mew-folder-delete folder mailboxes) (setq friends (delete folder friends)) (mew-imap-folder-set case mailboxes friends))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Flush the job queue ;;; (defun mew-imap-flush-queue () (let* ((case (mew-sinfo-get-case)) (qfld (mew-summary-folder-name 'ext)) (jobs (mew-folder-messages qfld))) (if (null jobs) (message "No IMAP jobs") (mew-summary-folder-cache-clean qfld) (mew-imap-retrieve case 'jobs qfld jobs)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; UTF-7 IMAP ;;; (defun mew-imap-utf-7-decode-string (str) (if (or (null mew-cs-utf-16be) (not (string-match "&" str))) str ;; fast path (let ((regex "&[A-Za-z0-9+,]+-") padn) (with-temp-buffer (mew-set-buffer-multibyte t) (insert str) (goto-char (point-min)) (while (re-search-forward regex nil t) (narrow-to-region (match-beginning 0) (match-end 0)) (goto-char (point-min)) (delete-char 1) (while (search-forward "," nil t) (replace-match "/" nil t)) (goto-char (point-max)) (delete-char -1) (setq padn (- 4 (% (- (point-max) (point-min)) 4))) (unless (= padn 4) (insert (make-string padn ?=))) (base64-decode-region (point-min) (point-max)) (decode-coding-region (point-min) (point-max) mew-cs-utf-16be) (goto-char (point-max)) (widen)) (buffer-substring-no-properties (point-min) (point-max)))))) (defun mew-imap-utf-7-encode-string (str) (if (or (null mew-cs-utf-16be) (string-match "^[ -%'-~]+$" str)) str ;; fast path (let ((regex "[^ -%'-~]+")) (with-temp-buffer (mew-set-buffer-multibyte t) (insert str) (goto-char (point-min)) (while (re-search-forward regex nil t) (narrow-to-region (match-beginning 0) (match-end 0)) (encode-coding-region (point-min) (point-max) mew-cs-utf-16be) (base64-encode-region (point-min) (point-max)) (goto-char (point-min)) (insert "&") (when (re-search-forward "=+" nil t) (delete-region (match-beginning 0) (match-end 0))) (goto-char (point-min)) (while (search-forward "/" nil t) (replace-match "," nil t)) (goto-char (point-max)) (insert "-") (widen)) (buffer-substring-no-properties (point-min) (point-max)))))) (provide 'mew-imap) ;;; Copyright Notice: ;; Copyright (C) 2002-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-imap.el ends here kazu-yamamoto-Mew-ff9c41b/mew-imap2.el000066400000000000000000000555301256455547000177030ustar00rootroot00000000000000;;; mew-imap2.el for appending ;; Author: Kazu Yamamoto ;; Created: May 22, 2003 ;;; Code: (require 'mew) (defvar mew-imap2-literal+ t) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; IMAP2 info ;;; (defvar mew-imap2-info-list '("case" "directive" "mailbox" ;; "src" "messages" "src-list" "src-list-orig" "server" "port" "ssh-server" "user" "auth" "auth-list" "account" "status" "process" "ssh-process" "ssl-process" "cnt" "ttl" "literal+" ;; parameters used internally and should be initialized "tag" "string" "error" "auth-selected" "authl" "aux" "done")) (defvar mew-imap2-info-list-clean-length 20) (mew-info-defun "mew-imap2-" mew-imap2-info-list) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; FSM ;;; (defvar mew-imap2-fsm '(("greeting" ("OK" . "capability")) ("capability" ("OK" . "post-capability")) ("auth-cram-md5" ("OK" . "pwd-cram-md5") ("NO" . "wpwd")) ("pwd-cram-md5" ("OK" . "next") ("NO" . "wpwd")) ("auth-login" ("OK" . "user-login") ("NO" . "wpwd")) ("user-login" ("OK" . "pwd-login") ("NO" . "wpwd")) ("pwd-login" ("OK" . "next") ("NO" . "wpwd")) ("login" ("OK" . "next") ("NO" . "wpwd")) ("append" ("OK" . "post-append") ("\\[TRYCREATE\\]" . "create")) ("create" ("OK" . "append") ("NO" . "wmbx")) ("post-append" ("OK" . "done") ("\\[TRYCREATE\\]" . "create")) ("logout" ("OK" . "noop")))) (defun mew-imap2-fsm-by-status (status) (assoc status mew-imap2-fsm)) (defun mew-imap2-fsm-next (status code) (cdr (mew-assoc-match2 code (nthcdr 1 (mew-imap2-fsm-by-status status)) 0))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filters 2 ;;; (defun mew-imap2-command-capability (pro pnm) (mew-imap2-process-send-string pro pnm "CAPABILITY")) (defun mew-imap2-command-post-capability (pro pnm) (let ((case-fold-search t) (aux (mew-imap2-get-aux pnm)) (start 0) authl literal+) (while (string-match "AUTH=\\([^ \r\n]+\\)" aux start) (setq authl (cons (mew-match-string 1 aux) authl)) (setq start (match-end 0))) (if (and mew-imap2-literal+ (string-match "\\bliteral\\+\\b" aux)) (setq literal+ t)) (mew-imap2-set-authl pnm authl) (mew-imap2-set-literal+ pnm literal+) (mew-imap2-set-status pnm "authentication") (mew-imap2-command-authentication pro pnm))) (defun mew-imap2-command-authentication (pro pnm) (cond ((eq (mew-imap2-get-auth pnm) t) ;; t means SASL (let ((auth-list (mew-imap2-get-auth-list pnm)) (authl (mew-imap2-get-authl pnm)) auth func) (if (and authl (setq auth (mew-auth-select2 authl auth-list)) (setq func (mew-imap2-auth-get-func auth)) (fboundp func)) (progn (mew-imap2-set-auth-selected pnm auth) (funcall func pro pnm)) (mew-imap2-debug "" "No preferred IMAP AUTH.\n") (mew-imap2-set-status pnm "login") (mew-imap2-command-login pro pnm)))) (t (mew-imap2-set-status pnm "login") (mew-imap2-command-login pro pnm)))) (defun mew-imap2-command-login (pro pnm) (let* ((user (mew-imap2-get-user pnm)) (prompt (format "IMAP password (%s): " (mew-imap2-get-account pnm))) (pass (mew-input-passwd prompt (mew-imap2-passtag pnm)))) (setq user (mew-quote-string user ?\\ '(?\\ ?\"))) (setq pass (mew-quote-string pass ?\\ '(?\\ ?\"))) (mew-imap2-process-send-string pro pnm "LOGIN \"%s\" \"%s\"" user pass))) (defun mew-imap2-command-wpwd (pro pnm) (let ((auth (mew-imap2-get-auth-selected pnm))) (mew-passwd-set-passwd (mew-imap2-passtag pnm) nil) (mew-imap2-set-error pnm (format "IMAP %s password is wrong!" auth)) (mew-imap2-command-logout2 pro pnm))) (defun mew-imap2-command-next (pro pnm) (let ((directive (mew-imap2-get-directive pnm)) (case (mew-imap2-get-case pnm)) (src-list (mew-imap2-get-src-list pnm)) (msgs (mew-imap2-get-messages pnm)) src dst mailbox msg src-file) (if msgs (setq src (mew-imap2-get-src pnm)) (if (or (eq directive 'copy) (eq directive 'move)) (progn (setq msgs src-list) (mew-imap2-set-src-list pnm nil) (mew-imap2-set-ttl pnm (length msgs)) (mew-imap2-set-cnt pnm 0) (setq dst (mew-imap2-get-mailbox pnm)) (setq mailbox (mew-imap-expand-mailbox case dst)) (setq mailbox (mew-imap-utf-7-encode-string mailbox)) (mew-imap2-set-mailbox pnm mailbox)) (catch 'break (while src-list ;; cannot use dolist (setq src (car src-list)) (setq src-list (cdr src-list)) (mew-imap2-set-src pnm src) (mew-imap2-set-src-list pnm src-list) (setq msgs (mew-folder-messages (mew-case-folder case src))) (when msgs (mew-imap2-set-ttl pnm (length msgs)) (mew-imap2-set-cnt pnm 0) (cond ((eq directive 'cp-r) (setq dst (mew-imap-local-to-imap case src)) (unless (assoc dst (mew-imap-folder-alist case)) (mew-imap-folder-insert case dst)) (setq mailbox (mew-imap-expand-mailbox case dst))) ((eq directive 'fcc) (setq mailbox (mew-imap-fcc-to-mailbox case src)))) (setq mailbox (mew-imap-utf-7-encode-string mailbox)) (mew-imap2-set-mailbox pnm mailbox) (throw 'break nil)))))) (if msgs (progn (setq msg (car msgs)) (setq msgs (cdr msgs)) (cond ((or (eq directive 'copy) (eq directive 'move)) (setq src-file msg)) (t (setq src-file (mew-expand-msg (mew-case-folder case src) msg)))) (mew-frwlet mew-cs-text-for-read mew-cs-dummy (set-buffer (mew-find-file-noselect src-file))) (mew-set-buffer-multibyte nil) (mew-info-clean-up pnm mew-imap2-info-list-clean-length) (mew-imap2-set-messages pnm msgs) (set-process-buffer pro (current-buffer)) (mew-imap2-set-status pnm "append") (mew-imap2-command-append pro pnm)) (mew-imap2-set-status pnm "logout") (mew-imap2-command-logout pro pnm)))) (defun mew-imap2-command-append (pro pnm) (let ((mailbox (mew-imap2-get-mailbox pnm)) (cnt (mew-imap2-get-cnt pnm)) (ttl (mew-imap2-get-ttl pnm)) (mbx (mew-imap2-get-mailbox pnm)) (literal+ (mew-imap2-get-literal+ pnm)) bytes) (setq cnt (1+ cnt)) (mew-imap2-set-cnt pnm cnt) (message "Copying to %s %d/%d (%02d%%)" mbx cnt ttl (/ (* cnt 100) ttl)) (goto-char (point-max)) (unless (bolp) (insert "\n")) (if (mew-eol-fix-for-write) (setq bytes (- (point-max) (point-min))) (setq bytes (- (point-max) (point-min))) (setq bytes (+ bytes (count-lines (point-min) (point-max))))) (set-buffer-modified-p nil) (if (not literal+) (mew-imap2-process-send-string pro pnm "APPEND \"%s\" {%d}" mailbox bytes) (mew-imap2-process-send-string pro pnm "APPEND \"%s\" {%d+}" mailbox bytes) (mew-imap2-set-status pnm "post-append") (mew-imap2-command-post-append pro pnm)))) (defun mew-imap2-command-post-append (pro pnm) (process-send-region pro (point-min) (point-max)) (process-send-string pro mew-cs-eol)) ;; APPEND command ends (defun mew-imap2-command-create (pro pnm) (let ((mailbox (mew-imap2-get-mailbox pnm)) (cnt (mew-imap2-get-cnt pnm))) (setq cnt (1- cnt)) (mew-imap2-set-cnt pnm cnt) (mew-imap2-process-send-string pro pnm "CREATE \"%s\"" mailbox))) (defun mew-imap2-command-wmbx (pro pnm) (mew-imap2-set-error pnm "mailbox is wrong!") (mew-imap2-set-status pnm "logout") (mew-imap2-command-logout pro pnm)) (defun mew-imap2-command-done (pro pnm) (let ((buf (process-buffer pro))) (set-process-buffer pro nil) (mew-remove-buffer buf) (mew-imap2-set-status pro "next") (mew-imap2-command-next pro pnm))) (defun mew-imap2-command-logout (pro pnm) (mew-imap2-set-done pnm t) (mew-imap2-process-send-string pro pnm "LOGOUT")) (defun mew-imap2-command-logout2 (pro pnm) ;; error is set (mew-imap2-set-done pnm t) (when (and (processp pro) (eq (process-status pro) 'open)) (mew-imap2-set-status pnm "logout") (mew-imap2-process-send-string pro pnm "LOGOUT"))) (defun mew-imap2-command-noop (pro pnm) ()) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; AUTH ;;; (defvar mew-imap2-auth-alist '(("CRAM-MD5" mew-imap2-command-auth-cram-md5) ("LOGIN" mew-imap2-command-auth-login))) (defun mew-imap2-auth-get-func (auth) (nth 1 (mew-assoc-case-equal auth mew-imap2-auth-alist 0))) (defun mew-imap2-command-auth-cram-md5 (pro pnm) (mew-imap2-process-send-string pro pnm "AUTHENTICATE CRAM-MD5") (mew-imap2-set-status pnm "auth-cram-md5")) (defun mew-imap2-command-pwd-cram-md5 (pro pnm) (let ((user (mew-imap2-get-user pnm)) (prompt (format "IMAP CRAM-MD5 password (%s): " (mew-imap2-get-account pnm))) (aux (mew-imap2-get-aux pnm)) challenge passwd cram-md5) (if (string-match " \\([a-zA-Z0-9+/]+=*\\)" aux) (setq challenge (mew-match-string 1 aux))) (setq passwd (mew-imap2-input-passwd prompt pnm)) (setq cram-md5 (mew-cram-md5 user passwd challenge)) (mew-imap2-process-send-string2 pro cram-md5))) (defun mew-imap2-command-auth-login (pro pnm) (mew-imap2-process-send-string pro pnm "AUTHENTICATE LOGIN") (mew-imap2-set-status pnm "auth-login")) (defun mew-imap2-command-user-login (pro pnm) (let* ((user (mew-imap2-get-user pnm)) (euser (mew-base64-encode-string user))) (mew-imap2-process-send-string2 pro euser))) (defun mew-imap2-command-pwd-login (pro pnm) (let* ((prompt (format "IMAP LOGIN password (%s): " (mew-imap2-get-account pnm))) (passwd (mew-imap2-input-passwd prompt pnm)) (epasswd (mew-base64-encode-string passwd))) (mew-imap2-process-send-string2 pro epasswd))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sub functions ;;; (defconst mew-imap2-info-prefix "mew-imap2-info-") (defun mew-imap2-info-name (case) (let ((server (mew-imap-server case)) (port (mew-*-to-string (mew-imap-port case))) (sshsrv (mew-imap-ssh-server case)) (name mew-imap2-info-prefix)) (setq name (concat name server)) (unless (mew-port-equal port mew-imap-port) (setq name (concat name ":" port))) (if sshsrv (concat name "%" sshsrv) name))) (defun mew-imap2-buffer-name (pnm) (concat mew-buffer-prefix pnm)) (defun mew-imap2-process-send-string (pro pnm &rest args) (let ((str (apply 'format args)) (tag (mew-imap2-tag))) (mew-imap2-debug "=SEND=" (concat tag " " str)) (mew-imap2-set-tag pnm tag) (if (and (processp pro) (eq (process-status pro) 'open)) (process-send-string pro (concat tag " " str mew-cs-eol)) (message "IMAP time out")))) (defun mew-imap2-process-send-string2 (pro &rest args) (let ((str (apply 'format args))) (if (and (processp pro) (eq (process-status pro) 'open)) (process-send-string pro (concat str mew-cs-eol)) (message "IMAP time out")))) (defun mew-imap2-tag () (format "%s%04d" (mew-random-string 4 nil) (% (mew-random) 10000))) (defun mew-imap2-passtag (pnm) (let ((server (mew-imap2-get-server pnm)) (port (mew-imap2-get-port pnm)) (user (mew-imap2-get-user pnm))) (concat user "@" server ":" port))) (defun mew-imap2-passtag2 (case) (let ((server (mew-imap-server case)) (port (mew-imap-port case)) (user (mew-imap-user case))) (concat user "@" server ":" port))) (defun mew-imap2-input-passwd (prompt pnm) (let* ((tag (mew-imap2-passtag pnm)) (pro (mew-imap2-get-process pnm)) (pass (mew-input-passwd prompt tag))) (unless (and (processp pro) (eq (process-status pro) 'open)) (mew-passwd-set-passwd tag nil)) pass)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Namespace ;;; (defvar mew-folder-imap-fcc-prefix "%.fcc") (defun mew-folder-imap-to-fcc (case folder) (concat (file-name-as-directory (mew-case-folder case mew-folder-imap-fcc-prefix)) (mew-folder-string folder))) (defun mew-folder-imap-fcc-dir (case) (mew-expand-folder (mew-case-folder case mew-folder-imap-fcc-prefix))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Opening IMAP ;;; (defun mew-imap2-open (pnm server port) (let ((sprt (mew-*-to-port port)) pro tm) (condition-case emsg (progn (setq tm (run-at-time mew-imap-timeout-time nil 'mew-imap2-timeout)) (message "Connecting to the IMAP server...") (setq pro (open-network-stream pnm nil server sprt)) (mew-process-silent-exit pro) (mew-set-process-cs pro mew-cs-text-for-net mew-cs-text-for-net) (message "Connecting to the IMAP server...done")) (quit (setq pro nil) (message "Cannot connect to the IMAP server")) (error (setq pro nil) (message "%s, %s" (nth 1 emsg) (nth 2 emsg)))) (if tm (cancel-timer tm)) pro)) (defun mew-imap2-timeout () (signal 'quit nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Launcher ;;; (defun mew-imap2-copy-message (case directive src-list &optional dst) (let* ((server (mew-imap-server case)) (user (mew-imap-user case)) (port (mew-*-to-string (mew-imap-port case))) (pnm (mew-imap2-info-name case)) (sshsrv (mew-imap-ssh-server case)) (sslp (mew-imap-ssl case)) (sslport (mew-imap-ssl-port case)) (proxysrv (mew-imap-proxy-server case)) (proxyport (mew-imap-proxy-port case)) process sshname sshpro sslname sslpro lport tls) (cond (sshsrv (setq sshpro (mew-open-ssh-stream case server port sshsrv)) (when sshpro (setq sshname (process-name sshpro)) (setq lport (mew-ssh-pnm-to-lport sshname)) (when lport (setq process (mew-imap2-open pnm "localhost" lport))))) (sslp (if (mew-port-equal port sslport) (setq tls mew-tls-imap)) (setq sslpro (mew-open-ssl-stream case server sslport tls)) (when sslpro (setq sslname (process-name sslpro)) (setq lport (mew-ssl-pnm-to-lport sslname)) (when lport (setq process (mew-imap2-open pnm mew-ssl-localhost lport))))) (proxysrv (setq process (mew-imap2-open pnm proxysrv proxyport))) (t (setq process (mew-imap2-open pnm server port)))) (if (null process) (cond ((and sshsrv (null sshpro)) (message "Cannot create to the SSH connection")) ((and sslp (null sslpro)) (message "Cannot create to the SSL/TLS connection")) (t (message "Cannot connect to the IMAP server"))) (mew-info-clean-up pnm) (mew-imap2-set-case pnm case) (mew-imap2-set-directive pnm directive) (mew-imap2-set-server pnm server) (mew-imap2-set-port pnm port) (mew-imap2-set-process pnm process) (mew-imap2-set-ssh-server pnm sshsrv) (mew-imap2-set-ssh-process pnm sshpro) (mew-imap2-set-ssl-process pnm sslpro) (mew-imap2-set-user pnm user) (mew-imap2-set-account pnm (format "%s@%s" user server)) (mew-imap2-set-auth pnm (mew-imap-auth case)) (mew-imap2-set-auth-list pnm (mew-imap-auth-list case)) (mew-imap2-set-status pnm "greeting") (mew-imap2-set-src-list pnm src-list) (mew-imap2-set-src-list-orig pnm src-list) (mew-imap2-set-mailbox pnm dst) ;; (set-process-buffer process nil) (set-process-sentinel process 'mew-imap2-sentinel) (set-process-filter process 'mew-imap2-filter) (message "Copying in background...")))) (defun mew-summary-from-local-to-imap () "Copy messages in local folders under specified folder prefix to a IMAP server decided by specified case. This may take very long time (even several days) if there are many local messages." (interactive) (let* ((prefix (mew-input-local-folder mew-folder-local)) (case (mew-input-case mew-case-default "IMAP")) (alist (mew-local-folder-alist)) regex src-list fld) (unless prefix (setq prefix mew-folder-local)) (setq regex (concat "^" (regexp-quote prefix))) (dolist (ent alist) (setq fld (car ent)) (if (string-match regex fld) (setq src-list (cons fld src-list)))) (setq src-list (nreverse src-list)) (mew-imap2-copy-message case 'cp-r src-list))) (defun mew-imap2-fcc (case) (let* ((prefix mew-folder-imap-fcc-prefix) (fcc-dir (mew-folder-imap-fcc-dir case)) (fcc-dirs (mew-dir-list fcc-dir)) (src-list (mew-local-folder-make-alist fcc-dirs prefix 'make-list))) ;; src-list (mew-imap2-copy-message case 'fcc src-list))) (defun mew-summary-imap-copy () "Copy a message to the server side of IMAP." (interactive) (mew-summary-not-in-draft (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number)) (fld/msg (mew-expand-msg fld msg)) (src-list (list fld/msg)) (case:dst (mew-input-folder mew-case mew-imap-inbox-folder)) (case (mew-case:folder-case case:dst)) (dst (mew-case:folder-folder case:dst))) (when (mew-folder-imapp dst) (mew-imap2-copy-message case 'copy src-list dst))))) (defun mew-summary-mark-imap-copy (&optional arg) "Copy messages marked with '*' to the server side of IMAP. If called with '\\[universal-argument]', only messages marked with '*' in the region are handled." (interactive "P") (mew-summary-not-in-draft (let* ((fld (mew-summary-folder-name)) (case:dst (mew-input-folder mew-case mew-imap-inbox-folder)) (case (mew-case:folder-case case:dst)) (dst (mew-case:folder-folder case:dst)) msgs beg end region src-list) (if (mew-mark-active-p) (setq arg t)) (cond (arg (setq region (mew-summary-get-region)) (setq beg (car region)) (setq end (cdr region))) (t (setq beg (point-min)) (setq end (point-max)))) (setq msgs (mew-summary-mark-collect mew-mark-review beg end)) (if (null msgs) (message "No mark") (when (mew-folder-imapp dst) (setq src-list (mapcar (lambda (x) (mew-expand-msg fld x)) msgs)) (mew-imap2-copy-message case 'copy src-list dst)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filter and sentinel ;;; (defun mew-imap2-debug (label string) (when (mew-debug 'net) (with-current-buffer (get-buffer-create mew-buffer-debug) (goto-char (point-max)) (insert (format "\n<%s>\n%s\n" label string))))) (defun mew-imap2-filter (process string) (let* ((pnm (process-name process)) (status (mew-imap2-get-status pnm)) (tag (mew-imap2-get-tag pnm)) (eos (format "^%s \\(OK\\|NO\\|BAD\\)\\(.*\\)" tag)) (str (concat (mew-imap2-get-string pnm) string)) (buf (process-buffer process)) aux stay next func code resp) (save-excursion (mew-imap2-debug (upcase status) string) (if (and buf (get-buffer buf)) (set-buffer buf)) (while (string-match "^\\*[^\n]*\n" str) (setq aux (substring str 0 (match-end 0))) (setq str (substring str (match-end 0))) (cond ((string= status "greeting") (setq next (mew-imap2-fsm-next "greeting" "OK"))) ((string= status "capability") (mew-imap2-set-aux pnm (concat (mew-imap2-get-aux pnm) aux))))) (mew-imap2-set-string pnm str) (cond (next nil) ((string-match "^\\+" str) (mew-imap2-set-aux pnm str) (setq next (mew-imap2-fsm-next status "OK"))) ((string-match eos str) (mew-imap2-set-tag pnm nil) (setq code (mew-match-string 1 str)) (setq resp (mew-match-string 2 str)) (setq next (mew-imap2-fsm-next status code)) (unless next (setq next (mew-imap2-fsm-next status resp)))) (t (setq stay t))) (unless stay (unless next (setq next "logout")) (mew-imap2-set-status pnm next) (setq func (intern-soft (concat "mew-imap2-command-" next))) (if (fboundp func) (funcall func process pnm) (error "No function called %s" (symbol-name func))) (mew-imap2-set-string pnm nil))))) (defun mew-imap2-sentinel (process event) (let* ((pnm (process-name process)) (directive (mew-imap2-get-directive pnm)) (case (mew-imap2-get-case pnm)) (done (mew-imap2-get-done pnm)) (error (mew-imap2-get-error pnm)) (sshpro (mew-imap2-get-ssh-process pnm)) (sslpro (mew-imap2-get-ssl-process pnm)) (srcflds (mew-imap2-get-src-list-orig pnm))) (save-excursion (mew-imap2-debug "IMAP SENTINEL" event) (cond (error (message "%s" error)) (done (cond ((eq directive 'fcc) (dolist (srcfld srcflds) (mew-imap2-copy-fcc-cache case srcfld)) (mew-delete-directory-recursively (mew-folder-imap-fcc-dir case))) ((eq directive 'move) (let ((file (car (mew-imap2-get-src-list-orig pnm)))) (if (file-exists-p file) (delete-file file))))) (message "Copying in background...done")) (t (message "IMAP connection is lost"))) (mew-info-clean-up pnm) (if (and (processp sshpro) (not mew-ssh-keep-connection)) (process-send-string sshpro "exit\n")) (if (and (processp sslpro) (not mew-ssl-keep-connection)) (delete-process sslpro)) (run-hooks 'mew-imap2-sentinel-hook)))) (defun mew-imap2-copy-fcc-cache (case srcfld) (let* ((case:srcfld (mew-case-folder case srcfld)) (srcs (mew-folder-messages case:srcfld)) (prefix (file-name-as-directory mew-folder-imap-fcc-prefix)) (regex (concat "^" (regexp-quote prefix))) dst dstfld case:dstfld i) (string-match regex srcfld) (setq dstfld (concat mew-folder-imap (substring srcfld (match-end 0)))) (setq case:dstfld (mew-case-folder case dstfld)) (mew-local-folder-check case:dstfld) (setq i (string-to-number (mew-folder-new-message case:dstfld 'num 'cache))) ;; to make code simple, we just copy the file. (dolist (src srcs) (setq dst (mew-i2s i 'cache)) (copy-file (mew-expand-msg case:srcfld src) (mew-expand-new-msg case:dstfld dst)) (setq i (1+ i))) (mew-touch-folder case:dstfld))) (provide 'mew-imap2) ;;; Copyright Notice: ;; Copyright (C) 2003-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-imap2.el ends here kazu-yamamoto-Mew-ff9c41b/mew-key.el000066400000000000000000001013251256455547000174550ustar00rootroot00000000000000;;; mew-key.el ;; Author: Kazu Yamamoto ;; Created: Feb 1, 1999 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Mode map ;;; (defvar mew-summary-mode-map nil) (defvar mew-message-mode-map nil) (defvar mew-draft-mode-map nil) (defvar mew-draft-header-map nil) (defvar mew-draft-body-map nil) (defvar mew-draft-attach-map nil) (defvar mew-header-mode-map nil) (defvar mew-addrbook-mode-map nil) (defvar mew-input-map nil) (defvar mew-input-folder-map nil) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Summary mode ;;; (unless mew-summary-mode-map (setq mew-summary-mode-map (make-sparse-keymap)) (define-key mew-summary-mode-map "0" 'digit-argument) (define-key mew-summary-mode-map "1" 'digit-argument) (define-key mew-summary-mode-map "2" 'digit-argument) (define-key mew-summary-mode-map "3" 'digit-argument) (define-key mew-summary-mode-map "4" 'digit-argument) (define-key mew-summary-mode-map "5" 'digit-argument) (define-key mew-summary-mode-map "6" 'digit-argument) (define-key mew-summary-mode-map "7" 'digit-argument) (define-key mew-summary-mode-map "8" 'digit-argument) (define-key mew-summary-mode-map "9" 'digit-argument) (define-key mew-summary-mode-map " " 'mew-summary-display) (define-key mew-summary-mode-map "." 'mew-summary-analyze-again) (define-key mew-summary-mode-map ":" 'mew-summary-analyze-again-alternative) (define-key mew-summary-mode-map "," 'mew-summary-display-asis) (define-key mew-summary-mode-map ";" 'mew-summary-trace-path) ;; (define-key mew-summary-mode-map "\e<" 'mew-summary-jump-top) ;; (define-key mew-summary-mode-map "\e>" 'mew-summary-jump-bottom) (define-key mew-summary-mode-map "<" 'mew-summary-scroll-right) (define-key mew-summary-mode-map ">" 'mew-summary-scroll-left) (define-key mew-summary-mode-map "\d" 'mew-summary-prev-page) (define-key mew-summary-mode-map "\r" 'mew-summary-scroll-up) (define-key mew-summary-mode-map "-" 'mew-summary-scroll-down) (define-key mew-summary-mode-map "\e\r" 'mew-summary-scroll-down) (define-key mew-summary-mode-map "g" 'mew-summary-goto-folder) (define-key mew-summary-mode-map "j" 'mew-summary-goto-line) (define-key mew-summary-mode-map "i" 'mew-summary-retrieve) (define-key mew-summary-mode-map "I" 'mew-summary-retrieve-message) (define-key mew-summary-mode-map "a" 'mew-summary-reply) (define-key mew-summary-mode-map "A" 'mew-summary-reply-with-citation) (define-key mew-summary-mode-map "D" 'mew-summary-clean-trash) (define-key mew-summary-mode-map "E" 'mew-summary-reedit) (define-key mew-summary-mode-map "\ei" 'mew-summary-edit-again) (define-key mew-summary-mode-map "\ee" 'mew-summary-edit) (define-key mew-summary-mode-map "f" 'mew-summary-forward) (define-key mew-summary-mode-map "F" 'mew-summary-multi-forward) (define-key mew-summary-mode-map "r" 'mew-summary-resend) (define-key mew-summary-mode-map "$" 'mew-summary-escape) (define-key mew-summary-mode-map "*" 'mew-summary-review) (define-key mew-summary-mode-map "\eu" 'mew-summary-unread) (define-key mew-summary-mode-map "y" 'mew-summary-save) (define-key mew-summary-mode-map "b" 'mew-summary-store) (define-key mew-summary-mode-map "Y" 'mew-summary-cite) (define-key mew-summary-mode-map "u" 'mew-summary-undo) (define-key mew-summary-mode-map "U" 'mew-summary-undo-all) (define-key mew-summary-mode-map "n" 'mew-summary-display-down) (define-key mew-summary-mode-map "p" 'mew-summary-display-up) (define-key mew-summary-mode-map "\C-n" 'mew-summary-next-line) (define-key mew-summary-mode-map "\C-p" 'mew-summary-previous-line) (define-key mew-summary-mode-map "e" 'mew-summary-exchange-marks) (define-key mew-summary-mode-map "M" (make-sparse-keymap)) (define-key mew-summary-mode-map "Md" 'mew-summary-mark-duplicated) (define-key mew-summary-mode-map "M*" 'mew-summary-redo) (define-key mew-summary-mode-map "N" 'mew-summary-display-review-down) (define-key mew-summary-mode-map "P" 'mew-summary-display-review-up) (define-key mew-summary-mode-map "\en" 'mew-summary-find-keyword-down) (define-key mew-summary-mode-map "\ep" 'mew-summary-find-keyword-up) (define-key mew-summary-mode-map "w" 'mew-summary-write) (define-key mew-summary-mode-map "W" 'mew-summary-send-to-others) (define-key mew-summary-mode-map "B" 'mew-summary-burst) (define-key mew-summary-mode-map "K" 'mew-summary-old-burst) (define-key mew-summary-mode-map "J" 'mew-summary-join) (define-key mew-summary-mode-map "Z" 'mew-status-update) (define-key mew-summary-mode-map "#" 'mew-summary-print) (define-key mew-summary-mode-map "|" 'mew-summary-pipe-message) (define-key mew-summary-mode-map "\\" 'mew-summary-cmd-msg) (define-key mew-summary-mode-map "q" 'mew-summary-suspend) (define-key mew-summary-mode-map "Q" 'mew-summary-quit) (define-key mew-summary-mode-map "C" 'mew-summary-set-case) (define-key mew-summary-mode-map "h" 'mew-summary-goto-msg-mode) (define-key mew-summary-mode-map "\C-c\C-a" 'mew-summary-addrbook-add) (define-key mew-summary-mode-map "\C-c\C-c" 'mew-summary-send-message) (define-key mew-summary-mode-map "\C-c\C-e" 'mew-summary-execute-external) (define-key mew-summary-mode-map "\C-c\t" 'mew-summary-find-file) (define-key mew-summary-mode-map "\C-c\C-f" 'mew-pgp-fetch-key) (define-key mew-summary-mode-map "\C-c\C-v" 'mew-pgp-select) (define-key mew-summary-mode-map "\C-c\C-m" 'mew-passwd-change) (define-key mew-summary-mode-map "\C-c\C-s" 'mew-summary-isearch-forward) (define-key mew-summary-mode-map "\C-c\C-r" 'mew-summary-isearch-backward) (define-key mew-summary-mode-map "\C-c\C-o" 'mew-summary-jump-to-draft-buffer) (define-key mew-summary-mode-map "\ea" 'mew-summary-alias-edit) (define-key mew-summary-mode-map "\el" 'mew-summary-recenter) (define-key mew-summary-mode-map "\et" 'mew-summary-uudecode) (define-key mew-summary-mode-map "\es" 'mew-summary-sort) (define-key mew-summary-mode-map "\eb" 'mew-summary-burst-multi) (define-key mew-summary-mode-map "\e\\" 'mew-summary-cmd-msgs) (define-key mew-summary-mode-map "v" 'mew-summary-toggle-disp-msg) (define-key mew-summary-mode-map "V" 'mew-summary-selection-by-msgid) (define-key mew-summary-mode-map "\C-c\C-l" 'mew-summary-convert-local-cs) (define-key mew-summary-mode-map "\C-c\C-z" 'mew-summary-decode-old-pgp) (define-key mew-summary-mode-map "\C-c\C-q" 'mew-summary-kill) (define-key mew-summary-mode-map "\C-c\C-x" 'mew-summary-x-face) (define-key mew-summary-mode-map "\C-c\C-k" 'mew-summary-kill-subprocess) (define-key mew-summary-mode-map "^" 'mew-summary-parent) (define-key mew-summary-mode-map "&" 'mew-summary-child) (define-key mew-summary-mode-map "(" 'mew-summary-thread-sibling-up) (define-key mew-summary-mode-map ")" 'mew-summary-thread-sibling-down) (define-key mew-summary-mode-map "m" (make-sparse-keymap)) (define-key mew-summary-mode-map "md" 'mew-summary-mark-delete) (define-key mew-summary-mode-map "m\ed" 'mew-summary-mark-unlink) (define-key mew-summary-mode-map "m$" 'mew-summary-mark-escape) (define-key mew-summary-mode-map "m*" 'mew-summary-mark-review) (define-key mew-summary-mode-map "m\eu" 'mew-summary-mark-unread) (define-key mew-summary-mode-map "ms" 'mew-summary-mark-swap) (define-key mew-summary-mode-map "mo" 'mew-summary-mark-refile) (define-key mew-summary-mode-map "mc" 'mew-summary-mark-copy) (define-key mew-summary-mode-map "mr" 'mew-summary-mark-regexp) (define-key mew-summary-mode-map "ma" 'mew-summary-mark-all) (define-key mew-summary-mode-map "mu" 'mew-summary-mark-undo-all) (define-key mew-summary-mode-map "mI" 'mew-summary-mark-retrieve-message) (define-key mew-summary-mode-map "ml" (make-sparse-keymap)) (define-key mew-summary-mode-map "mlc" 'mew-summary-mark-local-copy) (define-key mew-summary-mode-map "mli" 'mew-summary-mark-imap-copy) (define-key mew-summary-mode-map "/" 'mew-summary-selection-by-pick) (define-key mew-summary-mode-map "?" 'mew-summary-pick) (define-key mew-summary-mode-map "'" 'mew-summary-grep-old) (define-key mew-summary-mode-map "m/" 'mew-summary-selection-by-mark) (define-key mew-summary-mode-map "mt" 'mew-summary-mark-thread) (define-key mew-summary-mode-map "t" (make-sparse-keymap)) (define-key mew-summary-mode-map "tt" 'mew-summary-make-thread) (define-key mew-summary-mode-map "tn" 'mew-thread-down) (define-key mew-summary-mode-map "tp" 'mew-thread-up) (define-key mew-summary-mode-map "t " 'mew-thread-toggle) (define-key mew-summary-mode-map "ta" 'mew-thread-toggle-all) (define-key mew-summary-mode-map "t(" 'mew-thread-all-graft) (define-key mew-summary-mode-map "t)" 'mew-thread-all-prune) (define-key mew-summary-mode-map "t*" 'mew-thread-mark-review) (define-key mew-summary-mode-map "t$" 'mew-thread-mark-escape) (define-key mew-summary-mode-map "td" 'mew-thread-mark-delete) (define-key mew-summary-mode-map "to" 'mew-thread-mark-refile) (define-key mew-summary-mode-map "tc" 'mew-thread-mark-copy) (define-key mew-summary-mode-map "t\ed" 'mew-thread-mark-unlink) (define-key mew-summary-mode-map "tu" 'mew-thread-unmark) (define-key mew-summary-mode-map "tg" 'mew-thread-glue) (define-key mew-summary-mode-map "tr" 'mew-summary-regexp-make-thread) (define-key mew-summary-mode-map "z" (make-sparse-keymap)) (define-key mew-summary-mode-map "z8" 'mew-summary-toggle-8bit) (define-key mew-summary-mode-map "zc" 'mew-summary-cache-clean-up) (define-key mew-summary-mode-map "zd" 'mew-summary-toggle-debug) (define-key mew-summary-mode-map "zp" 'mew-summary-toggle-policy) (define-key mew-summary-mode-map "zo" 'mew-summary-toggle-pgp) (define-key mew-summary-mode-map "zv" 'mew-summary-toggle-header-veil) (define-key mew-summary-mode-map "zw" 'mew-summary-toggle-warning) (define-key mew-summary-mode-map "zi" 'mew-summary-toggle-invisible) (define-key mew-summary-mode-map "z " 'mew-summary-toggle-mark-regex) (define-key mew-summary-mode-map "zz" 'mew-summary-unzip) (define-key mew-summary-mode-map "l" (make-sparse-keymap)) (define-key mew-summary-mode-map "lc" 'mew-summary-local-copy) (define-key mew-summary-mode-map "li" 'mew-summary-imap-copy) (define-key mew-summary-mode-map "lh" 'mew-summary-learn-ham) (define-key mew-summary-mode-map "ls" 'mew-summary-learn-spam) (define-key mew-summary-mode-map "=" 'mew-summary-info) (define-key mew-summary-mode-map "_" 'mew-summary-line) (define-key mew-summary-mode-map "k" (make-sparse-keymap)) (define-key mew-summary-mode-map "kc" 'mew-summary-search-change-method) (define-key mew-summary-mode-map "k?" 'mew-summary-search) (define-key mew-summary-mode-map "k/" 'mew-summary-selection-by-search) (define-key mew-summary-mode-map "km" 'mew-summary-make-index-folder) (define-key mew-summary-mode-map "kM" 'mew-summary-make-index-all) (define-key mew-summary-mode-map "ki" 'mew-summary-make-id-index-folder) (define-key mew-summary-mode-map "kI" 'mew-summary-make-id-index-all) (define-key mew-summary-mode-map "kj" 'mew-summary-goto-original-message) ;; ;; not provided in Virtual mode ;; (define-key mew-summary-mode-map "!" 'mew-summary-refile-again) (define-key mew-summary-mode-map "o" 'mew-summary-refile) (define-key mew-summary-mode-map "c" 'mew-summary-copy) (define-key mew-summary-mode-map "d" 'mew-summary-delete) (define-key mew-summary-mode-map "\ed" 'mew-summary-unlink) (define-key mew-summary-mode-map "x" 'mew-summary-exec) (define-key mew-summary-mode-map "X" 'mew-summary-exec-one) (define-key mew-summary-mode-map "lx" 'mew-summary-exec-offline) (define-key mew-summary-mode-map "lX" 'mew-summary-exec-offline-one) (define-key mew-summary-mode-map "mxd" 'mew-summary-exec-delete) (define-key mew-summary-mode-map "mx\ed" 'mew-summary-exec-unlink) (define-key mew-summary-mode-map "mxo" 'mew-summary-exec-refile) (define-key mew-summary-mode-map "s" 'mew-summary-ls) (define-key mew-summary-mode-map "O" 'mew-summary-pack) (define-key mew-summary-mode-map "S" 'mew-summary-selection-by-sort) (define-key mew-summary-mode-map "\C-c\C-b" 'mew-summary-exchange-point) (define-key mew-summary-mode-map "\eo" 'mew-summary-auto-refile) (define-key mew-summary-mode-map "R" (make-sparse-keymap)) (define-key mew-summary-mode-map "Rd" 'mew-summary-delete-folder) (define-key mew-summary-mode-map "Rr" 'mew-summary-rename-folder) ;; (define-key mew-summary-mode-map [mouse-2] 'mew-summary-mouse-show)) (defvar mew-summary-mode-menu-spec '("Mew" ["Show" mew-summary-display t] ["Next" mew-summary-display-down t] ["Previous" mew-summary-display-up t] ["Top" mew-summary-jump-top t] ["Bottom" mew-summary-jump-bottom t] "----" ["Delete" mew-summary-delete (mew-summary-p)] ["Refile" mew-summary-refile (mew-summary-case1)] ["Refile again" mew-summary-refile-again (mew-summary-case1)] ["Mark review" mew-summary-mark-review t] ["Mark escape" mew-summary-mark-escape t] ["Undo" mew-summary-undo t] ["Undo all" mew-summary-undo-all t] ["Execute" mew-summary-exec (mew-summary-p)] ["Suspend" mew-summary-suspend t] ["Quit" mew-summary-quit t] "----" ("Manipulate folder" ["Retrieve" mew-summary-retrieve t] ["List" mew-summary-ls (mew-summary-p)] ["Sort" mew-summary-sort (mew-summary-case2)] ["Burst" mew-summary-burst t] ["Go to folder" mew-summary-goto-folder t] ) ("Manipulate file" ["Save" mew-summary-save t] ["Convert body's character set" mew-summary-convert-local-cs t] ["Display X-Face" mew-summary-x-face t] ) ("Write/Reply/Forward" ["Write" mew-summary-send t] ["Reedit" mew-summary-reedit t] ["Reply" mew-summary-reply (mew-summary-case1)] ["Reply with citation" mew-summary-reply-with-citation (mew-summary-case1)] ["Forward" mew-summary-forward (mew-summary-case1)] ["Multi forward" mew-summary-multi-forward (mew-summary-case1)] ) ("Select" ["Pick then mark" mew-summary-pick (mew-pickable-p)] ["Selection" mew-summary-selection-by-pick (mew-pickable-p)] ) ("Misc" ["Clean +trash" mew-summary-clean-trash t] ["Recenter" mew-summary-recenter t] ["Uudecode" mew-summary-uudecode t] ["Unshar" mew-summary-unshar t] ["Multi burst" mew-summary-burst-multi t] ["Print" mew-summary-print t] ["Pipe message" mew-summary-pipe-message t] ["Isearch forward" mew-summary-isearch-forward t] ["Isearch backward" mew-summary-isearch-backward t] ["Toggle disp msg" mew-summary-toggle-disp-msg t] ["Set cases" mew-summary-set-case t] ["PGP public key fetch" mew-pgp-fetch-key t] ["Kill Sub-Process" mew-summary-kill-subprocess (mew-summary-case3)] ))) (defvar mew-summary-mode-toolbar-menu '("Mew Part Commands" ["Save" mew-summary-save t] ["Reply" mew-summary-reply t])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Message mode ;;; (unless mew-message-mode-map (setq mew-message-mode-map (make-sparse-keymap)) (define-key mew-message-mode-map " " 'mew-message-next-page) (define-key mew-message-mode-map "\d" 'mew-message-prev-page) (define-key mew-message-mode-map "n" 'mew-message-next-msg) (define-key mew-message-mode-map "p" 'mew-message-prev-msg) (define-key mew-message-mode-map "h" 'mew-message-goto-summary) (define-key mew-message-mode-map "a" 'mew-message-reply) (define-key mew-message-mode-map "A" 'mew-message-reply-with-citation) (define-key mew-message-mode-map "f" 'mew-message-forward) (define-key mew-message-mode-map "r" 'mew-message-resend) (define-key mew-message-mode-map "<" 'mew-message-scroll-right) (define-key mew-message-mode-map ">" 'mew-message-scroll-left) (define-key mew-message-mode-map "_" 'mew-message-line) (define-key mew-message-mode-map "g" 'mew-browse-url-at-point) (define-key mew-message-mode-map "\C-i" 'mew-message-goto-next-url)) (defvar mew-message-mode-menu-spec '("Mew" ["Next part" mew-message-next-msg t] ["Prev part" mew-message-prev-msg t] ["Next page" mew-message-next-page t] ["Prev page" mew-message-prev-page t] ["Goto summary" mew-message-goto-summary t])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Draft mode ;;; (defun mew-draft-share-keymap (symmap) (if (featurep 'meadow) (define-key (symbol-value symmap) [drag-n-drop] 'mew-draft-dnd-for-meadow)) (define-key (symbol-value symmap) "\C-x\C-s" 'mew-draft-save-buffer) (define-key (symbol-value symmap) "\C-c\C-m" 'mew-draft-make-message) (define-key (symbol-value symmap) "\C-c\C-c" 'mew-draft-send-message) (define-key (symbol-value symmap) "\C-c\C-o" 'mew-draft-set-case) (define-key (symbol-value symmap) "\C-c\C-a" 'mew-draft-prepare-attachments) (define-key (symbol-value symmap) "\C-c\C-l" 'mew-draft-rehighlight) (define-key (symbol-value symmap) "\C-c\C-q" 'mew-draft-kill) (define-key (symbol-value symmap) "\C-c\C-s" 'mew-draft-sign-message) (define-key (symbol-value symmap) "\C-c\C-e" 'mew-draft-encrypt-message) (define-key (symbol-value symmap) "\C-c\C-b" 'mew-draft-sign-encrypt-message) (define-key (symbol-value symmap) "\C-c\C-r" 'mew-draft-encrypt-sign-message) (define-key (symbol-value symmap) "\C-c\C-p\C-m" 'mew-draft-set-privacy-method) (define-key (symbol-value symmap) "\C-c\C-p\C-a" 'mew-draft-toggle-privacy-always) (define-key (symbol-value symmap) "\C-c\C-p\C-e" 'mew-draft-toggle-privacy-encrypted) (define-key (symbol-value symmap) "\C-c\C-p\C-d" 'mew-draft-set-privacy-type) (define-key (symbol-value symmap) "\C-c\C-p\C-f" 'mew-draft-use-format-flowed)) (unless mew-draft-header-map (setq mew-draft-header-map (make-sparse-keymap)) (define-key mew-draft-header-map "\t" 'mew-draft-header-comp) (define-key mew-draft-header-map "\C-c\t" 'mew-draft-circular-comp) (define-key mew-draft-header-map "\e\t" 'mew-draft-expand) (define-key mew-draft-header-map "\e\C-e" 'mew-draft-addrbook-expand) (mew-draft-share-keymap 'mew-draft-header-map)) (unless mew-draft-body-map (setq mew-draft-body-map (make-sparse-keymap)) (set-keymap-parent mew-draft-body-map text-mode-map) (define-key mew-draft-body-map "\C-c\t" 'mew-draft-insert-signature) (define-key mew-draft-body-map "\C-c\C-y" 'mew-draft-cite) (define-key mew-draft-body-map "\C-c\C-t" 'mew-draft-yank) (define-key mew-draft-body-map "\C-c\C-f" 'mew-draft-encode-flowed) (define-key mew-draft-body-map "\C-c\C-n\C-f" 'mew-fib-fill-default) (define-key mew-draft-body-map "\C-c\C-n\C-k" 'mew-fib-delete-frame) (define-key mew-draft-body-map "\C-c\C-n\C-n" 'mew-fib-next-item) (define-key mew-draft-body-map "\C-c\C-n\C-p" 'mew-fib-previous-item) (define-key mew-draft-body-map "\C-c\C-n\C-z" 'mew-fib-flush-input) (mew-draft-share-keymap 'mew-draft-body-map)) (unless mew-draft-mode-map (setq mew-draft-mode-map (make-sparse-keymap)) (set-keymap-parent mew-draft-mode-map mew-draft-body-map)) (defvar mew-draft-mode-toolbar-menu '("Attachment Commands" ["Insert a File by Linking" mew-attach-link (mew-attach-not-line012-1)] ["Insert a File by Copying" mew-attach-copy (mew-attach-not-line012-1)] ["Insert Audio" mew-attach-audio (mew-attach-not-line012-1)] ["Insert an External Reference" mew-attach-external-body (mew-attach-not-line012-1)] ["Insert a Sub-Multipart" mew-attach-multipart (mew-attach-not-line012-1)] ["Read a New File into a Buffer" mew-attach-find-new-file (mew-attach-not-line012-1)] ["Insert PGP public keys" mew-attach-pgp-public-key (mew-attach-not-line012-1)] "----" ["Delete This Part" mew-attach-delete (mew-attach-not-line012-1-dot)] "----" ["Describe This Part" mew-attach-description (mew-attach-not-line0-1-dot)] ["Specify A File Name" mew-attach-disposition (mew-attach-not-line012-1-dot)] ["Change the Type" mew-attach-type (mew-attach-not-line0-1-dot)] ["Encode with Gzip64" mew-attach-gzip64 (mew-attach-not-line0-1-dot)] ["Encode with Base64" mew-attach-base64 (mew-attach-not-line0-1-dot)] ["Encode with Quoted-Printable" mew-attach-quoted-printable (mew-attach-not-line0-1-dot)] ["Sign with PGP" mew-attach-pgp-sign (mew-attach-not-line0-1-dot)] ["Encrypt with PGP" mew-attach-pgp-enc (mew-attach-not-line0-1-dot)] "----" ["Read This File into a Buffer" mew-attach-find-file (mew-attach-not-line012-1-dot)])) (defvar mew-draft-mode-menu-spec (list ;; need to eval mew-draft-mode-toolbar-menu "Mew" ["Cite" mew-draft-cite t] ["Cite without Label" mew-draft-yank t] ["Flowed" mew-draft-use-format-flowed :style toggle :selected mew-use-format-flowed] mew-draft-mode-toolbar-menu ["Queue Message" mew-draft-make-message t] ["Send Message" mew-draft-send-message t] ["Prepare Attachments" mew-draft-prepare-attachments (not (mew-attach-p))] ["Set cases" mew-draft-set-case t] ["Insert Signature" mew-draft-insert-signature t] ["Kill Draft" mew-draft-kill t] "----" '("PGP" ["PGP Sign" mew-pgp-sign-message t] ["PGP Encrypt" mew-pgp-encrypt-message t] ["PGP Sign then Encrypt" mew-pgp-sign-encrypt-message t] ["PGP Encrypt then Sign" mew-pgp-encrypt-sign-message t]) '("Privacy" ["All messages" mew-draft-toggle-privacy-always t] ["Msgs replying to encrypted" mew-draft-toggle-privacy-encrypted t] ["This message" mew-draft-set-privacy-type t]) '("FIB" ["FIB next item" mew-fib-next-item (not (mew-attach-p))] ["FIB previous item" mew-fib-previous-item (not (mew-attach-p))] ["FIB flush input" mew-fib-flush-input (not (mew-attach-p))] ["FIB fill default" mew-fib-fill-default (not (mew-attach-p))] ["FIB delete frame" mew-fib-delete-frame (not (mew-attach-p))]))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Header mode ;;; (unless mew-header-mode-map (setq mew-header-mode-map (make-sparse-keymap)) (define-key mew-header-mode-map "\C-x\C-s" 'mew-draft-save-buffer) (define-key mew-header-mode-map "\t" 'mew-draft-header-comp) (define-key mew-header-mode-map "\C-c\t" 'mew-draft-circular-comp) (define-key mew-header-mode-map "\e\t" 'mew-draft-expand) (define-key mew-header-mode-map "\C-c\C-m" 'mew-header-make-message) (define-key mew-header-mode-map "\C-c\C-c" 'mew-header-send-message) (define-key mew-header-mode-map "\C-c\C-q" 'mew-draft-kill) (define-key mew-header-mode-map "\C-c\C-o" 'mew-draft-set-case)) (defvar mew-header-mode-menu-spec '("Mew" ["Queue Message" mew-header-make-message t] ["Send Message" mew-header-send-message t] ["Set cases" mew-draft-set-case t] ["Kill Draft" mew-draft-kill t])) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Attach mode ;;; (unless mew-draft-attach-map (setq mew-draft-attach-map (make-keymap)) (define-key mew-draft-attach-map "\C-m" 'mew-attach-newline) (define-key mew-draft-attach-map "\C-f" 'mew-attach-forward) (define-key mew-draft-attach-map "\C-b" 'mew-attach-backforward) (define-key mew-draft-attach-map "\C-n" 'mew-attach-next) (define-key mew-draft-attach-map "\C-p" 'mew-attach-previous) (define-key mew-draft-attach-map "a" 'mew-attach-audio) (define-key mew-draft-attach-map "c" 'mew-attach-copy) (define-key mew-draft-attach-map "C" 'mew-attach-charset) (define-key mew-draft-attach-map "I" 'mew-attach-icharset) (define-key mew-draft-attach-map "d" 'mew-attach-delete) (define-key mew-draft-attach-map "y" 'mew-attach-link-message) (define-key mew-draft-attach-map "D" 'mew-attach-description) (define-key mew-draft-attach-map "P" 'mew-attach-disposition) (define-key mew-draft-attach-map "e" 'mew-attach-external-body) (define-key mew-draft-attach-map "f" 'mew-attach-find-file) (define-key mew-draft-attach-map "F" 'mew-attach-find-new-file) (define-key mew-draft-attach-map "l" 'mew-attach-link) (define-key mew-draft-attach-map "m" 'mew-attach-multipart) (define-key mew-draft-attach-map "T" 'mew-attach-type) (define-key mew-draft-attach-map "t" 'mew-attach-toggle) (define-key mew-draft-attach-map "G" 'mew-attach-gzip64) (define-key mew-draft-attach-map "B" 'mew-attach-base64) (define-key mew-draft-attach-map "Q" 'mew-attach-quoted-printable) (define-key mew-draft-attach-map "Z" 'mew-attach-zip) (define-key mew-draft-attach-map "S" 'mew-attach-pgp-sign) (define-key mew-draft-attach-map "E" 'mew-attach-pgp-enc) (define-key mew-draft-attach-map "\es" 'mew-attach-smime-sign) (define-key mew-draft-attach-map "\ee" 'mew-attach-smime-enc) (define-key mew-draft-attach-map "p" 'mew-attach-pgp-public-key) (define-key mew-draft-attach-map "U" 'mew-attach-undo) (define-key mew-draft-attach-map "\C-c\t" 'mew-draft-insert-signature) (mew-draft-share-keymap 'mew-draft-attach-map)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Addrbook mode ;;; (unless mew-addrbook-mode-map (setq mew-addrbook-mode-map (make-sparse-keymap)) (set-keymap-parent mew-addrbook-mode-map text-mode-map) (define-key mew-addrbook-mode-map "\C-c\C-c" 'mew-addrbook-register) (define-key mew-addrbook-mode-map "\C-c\C-q" 'mew-addrbook-kill)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Minibuffer ;;; (unless mew-input-map (setq mew-input-map (if (boundp 'minibuffer-local-map) (copy-keymap minibuffer-local-map) (make-sparse-keymap))) (define-key mew-input-map "\r" 'mew-input-exit-minibuffer) (define-key mew-input-map "\n" 'mew-input-exit-minibuffer) (define-key mew-input-map "," 'mew-input-comma) (define-key mew-input-map " " 'mew-input-complete) (define-key mew-input-map "\t" 'mew-input-complete) (define-key mew-input-map "?" 'mew-input-complete) (define-key mew-input-map "\C-c\t" 'mew-circular-complete-switch) (define-key mew-input-map [menu-bar minibuf] (cons "Mew" (make-sparse-keymap "Mew"))) (define-key mew-input-map [menu-bar minibuf quit] (list 'menu-item "Quit" 'keyboard-escape-quit :help "Abort input and exit minibuffer")) (define-key mew-input-map [menu-bar minibuf return] (list 'menu-item "Enter" 'exit-minibuffer :help "Terminate input and exit minibuffer"))) (unless mew-input-folder-map (setq mew-input-folder-map (copy-keymap mew-input-map)) (let ((c 33)) ;; excluding SPC (while (<= c 128) ;; including delete (define-key mew-input-folder-map (char-to-string c) 'mew-input-folder-self-insert) (setq c (1+ c)))) (define-key mew-input-folder-map "\d" 'mew-input-folder-self-insert) (define-key mew-input-folder-map "\C-g" 'mew-input-folder-abort-minibuffer) (define-key mew-input-folder-map "\r" 'mew-input-folder-exit-minibuffer) (define-key mew-input-folder-map "\n" 'mew-input-folder-exit-minibuffer) (define-key mew-input-folder-map "+" 'mew-input-folder-prefix) (define-key mew-input-folder-map "%" 'mew-input-folder-prefix) (define-key mew-input-folder-map "$" 'mew-input-folder-prefix) (define-key mew-input-folder-map "-" 'mew-input-folder-prefix) (define-key mew-input-folder-map "*" 'mew-input-folder-prefix) (define-key mew-input-folder-map "," 'mew-input-folder-comma) (define-key mew-input-folder-map "\C-s" 'mew-input-folder-search-forward) (define-key mew-input-folder-map "\C-r" 'mew-input-folder-search-backward) (define-key mew-input-folder-map "\C-n" 'mew-input-folder-search-forward) (define-key mew-input-folder-map "\C-p" 'mew-input-folder-search-backward)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Toolbar ;;; (defvar mew-summary-toolbar-spec '((mew-summary-display . "mew-show") (mew-summary-display-down . "mew-next") (mew-summary-display-up . "mew-prev") (mew-summary-retrieve . "mew-inc") (mew-summary-send . "mew-write") (mew-summary-reply . "mew-reply") (mew-summary-forward . "mew-forward") (mew-summary-refile . "mew-refile"))) (defvar mew-message-toolbar-spec '((mew-message-next-msg . "mew-next") (mew-message-prev-msg . "mew-prev") (mew-massage-reply . "mew-reply") (mew-message-forward . "mew-forward"))) (defvar mew-draft-toolbar-spec '((mew-draft-make-message . "mew-queue") (mew-draft-send-message . "mew-send") (mew-draft-cite . "mew-cite") (mew-draft-yank . "mew-yank") (mew-draft-prepare-attachments . "mew-attach") (mew-pgp-sign-message . "mew-pgp-sign") (mew-pgp-encrypt-message . "mew-pgp-enc") (mew-pgp-sign-encrypt-message . "mew-pgp-sigenc"))) (defvar mew-header-toolbar-spec '((mew-header-make-message . "mew-queue") (mew-header-send-message . "mew-send"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Icons ;;; (defun mew-which-mew-etc () (let ((file "mew.el")) (catch 'loop (dolist (path load-path) (if (file-exists-p (expand-file-name file path)) (throw 'loop (expand-file-name "etc" path))))))) (defvar mew-icon-directory (mew-which-mew-etc)) (defvar mew-icon-separate nil) (defvar mew-icon-blank nil) (defvar mew-icon-audio nil) (defvar mew-icon-image nil) (defvar mew-icon-video nil) (defvar mew-icon-application/postscript nil) (defvar mew-icon-application/octet-stream nil) (defvar mew-icon-message/rfc822 nil) (defvar mew-icon-message/external-body nil) (defvar mew-icon-text nil) (defvar mew-icon-multipart nil) (defvar mew-icon-unknown nil) (defvar mew-icon-spec '((separate . "mew-sep") (text . "mew-Text") (multipart . "mew-Folder") (blank . "mew-Blank") (audio . "mew-Audio") (image . "mew-Image") (video . "mew-Video") (application/postscript . "mew-Postscript") (application/octet-stream . "mew-Octet-Stream") (message/rfc822 . "mew-Rfc822") (message/external-body . "mew-External") (unknown . "mew-Unknown"))) (provide 'mew-key) ;;; Copyright Notice: ;; Copyright (C) 2000-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-key.el ends here kazu-yamamoto-Mew-ff9c41b/mew-lang-jp.el000066400000000000000000000146001256455547000202140ustar00rootroot00000000000000;;-*-coding:iso-2022-7bit;-*- ;;; mew-lang-jp.el --- Japanese specific stuff for Mew ;; Author: Mito ;; Kazu Yamamoto ;; Created: Sep 08, 1997 ;;; Code: ;; from jisx0201.el (defvar mew-katakana-alist '(( 161 . "(I'(B" ) ( 162 . "(I1(B" ) ( 163 . "(I((B" ) ( 164 . "(I2(B" ) ( 165 . "(I)(B" ) ( 166 . "(I3(B" ) ( 167 . "(I*(B" ) ( 168 . "(I4(B" ) ( 169 . "(I+(B" ) ( 170 . "(I5(B" ) ( 171 . "(I6(B" ) ( 172 . "(I6^(B" ) ( 173 . "(I7(B" ) ( 174 . "(I7^(B" ) ( 175 . "(I8(B" ) ( 176 . "(I8^(B" ) ( 177 . "(I9(B" ) ( 178 . "(I9^(B" ) ( 179 . "(I:(B" ) ( 180 . "(I:^(B" ) ( 181 . "(I;(B" ) ( 182 . "(I;^(B" ) ( 183 . "(I<(B" ) ( 184 . "(I<^(B" ) ( 185 . "(I=(B" ) ( 186 . "(I=^(B" ) ( 187 . "(I>(B" ) ( 188 . "(I>^(B" ) ( 189 . "(I?(B" ) ( 190 . "(I?^(B" ) ( 191 . "(I@(B" ) ( 192 . "(I@^(B" ) ( 193 . "(IA(B" ) ( 194 . "(IA^(B" ) ( 195 . "(I/(B" ) ( 196 . "(IB(B" ) ( 197 . "(IB^(B" ) ( 198 . "(IC(B" ) ( 199 . "(IC^(B" ) ( 200 . "(ID(B" ) ( 201 . "(ID^(B" ) ( 202 . "(IE(B" ) ( 203 . "(IF(B" ) ( 204 . "(IG(B" ) ( 205 . "(IH(B" ) ( 206 . "(II(B" ) ( 207 . "(IJ(B" ) ( 208 . "(IJ^(B" ) ( 209 . "(IJ_(B" ) ( 210 . "(IK(B" ) ( 211 . "(IK^(B" ) ( 212 . "(IK_(B" ) ( 213 . "(IL(B" ) ( 214 . "(IL^(B" ) ( 215 . "(IL_(B" ) ( 216 . "(IM(B" ) ( 217 . "(IM^(B" ) ( 218 . "(IM_(B" ) ( 219 . "(IN(B" ) ( 220 . "(IN^(B" ) ( 221 . "(IN_(B" ) ( 222 . "(IO(B" ) ( 223 . "(IP(B" ) ( 224 . "(IQ(B" ) ( 225 . "(IR(B" ) ( 226 . "(IS(B" ) ( 227 . "(I,(B" ) ( 228 . "(IT(B" ) ( 229 . "(I-(B" ) ( 230 . "(IU(B" ) ( 231 . "(I.(B" ) ( 232 . "(IV(B" ) ( 233 . "(IW(B" ) ( 234 . "(IX(B" ) ( 235 . "(IY(B" ) ( 236 . "(IZ(B" ) ( 237 . "(I[(B" ) ( 239 . "(I\(B" ) ; (I\(B -> $B%o(B $B$KJQ49$9$k$h$&$K(B ( 238 . "(I\(B" ) ; $B%o$H%n$N=gHV$,8r49$7$F$"$k!#(B ( 240 . "(I((B" ) ( 241 . "(I*(B" ) ( 242 . "(I&(B" ) ( 243 . "(I](B" ) ( 244 . "(I3^(B" ) ( 245 . "(I6(B" ) ( 246 . "(I9(B" ))) (defvar mew-katakana-kigou-alist '(( 162 . "(I$(B" ) ( 163 . "(I!(B" ) ( 166 . "(I%(B" ) ( 171 . "(I^(B" ) ( 172 . "(I_(B" ) ( 188 . "(I0(B" ) ( 214 . "(I"(B" ) ( 215 . "(I#(B" ))) (defvar mew-dakuon-list '( ?$B%+(B ?$B%-(B ?$B%/(B ?$B%1(B ?$B%3(B ?$B%5(B ?$B%7(B ?$B%9(B ?$B%;(B ?$B%=(B ?$B%?(B ?$B%A(B ?$B%D(B ?$B%F(B ?$B%H(B ?$B%O(B ?$B%R(B ?$B%U(B ?$B%X(B ?$B%[(B)) (defvar mew-handakuon-list (memq ?$B%O(B mew-dakuon-list)) (defun mew-hankaku-code (ch) (let* ((str (char-to-string ch)) (ent (rassoc str mew-katakana-alist))) (if ent (car ent)))) (defun mew-hankaku-kigou-code (ch) (let* ((str (char-to-string ch)) (ent (rassoc str mew-katakana-kigou-alist))) (if ent (car ent)))) (defun mew-zenkaku-katakana-region (beg end) (let (ch wk) (save-restriction (narrow-to-region beg end) (save-excursion (goto-char (point-min)) (while (re-search-forward "\\ck" nil t) (setq ch (preceding-char)) (setq wk nil) (cond ((= ch ?(I^(B) (save-excursion (backward-char 1) (setq wk (preceding-char))) (cond ((= wk ?$B%&(B) (delete-char -2) (insert "$B%t(B")) ((setq wk (memq wk mew-dakuon-list)) (delete-char -2) (insert (1+ (car wk)))) (t (delete-char -1) (insert "$B!+(B")))) ((= ch ?(I_(B) (save-excursion (backward-char 1) (setq wk (preceding-char))) (if (setq wk (memq wk mew-handakuon-list)) (progn (delete-char -2) (insert (+ 2 (car wk)))) (delete-char -1) (insert "$B!,(B"))) ((setq wk (mew-hankaku-code ch)) (delete-char -1) (insert (make-char mew-lc-jp ?\245 wk))) ((setq wk (mew-hankaku-kigou-code ch)) (delete-char -1) (insert (make-char mew-lc-jp ?\241 wk))))))))) ;; (defvar mew-thread-indent-strings ["$B(2(B" "$B(1(B" "$B(-(B" "$B!!(B"]) (defvar mew-highlight-body-regex-cite "^\\(\\([ \t]\\{,7\\}\\([>:|$B!S!d!U"d!'!C(B]\\|\\w+\\([._-]+\\w+\\)*>+\\)\\)+\\).*") ;; mew-regex-url is defined in mew-vars.el. This duplication is intentional. ;; This definition includes full-width space characters. (defvar mew-regex-url (concat "\\b\\(" "\\(\\(file\\|news\\|mailto\\):\\)" "\\|" "\\(\\(s?https?\\|ftp\\|gopher\\|telnet\\|wais\\)://\\)" "\\)" "[^ $B!!(B\t\n>)\"]*" "[^] $B!!(B\t\n>.,:)\"]+")) (provide 'mew-lang-jp) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-lang-jp.el ends here kazu-yamamoto-Mew-ff9c41b/mew-lang-kr.el000066400000000000000000000034631256455547000202240ustar00rootroot00000000000000;;-*-coding:euc-kr;-*- ;;; mew-lang-kr.el --- Korean specific stuff for Mew ;; Author: CHOI Junho ;; Created: Mar 31, 2003 ;;; Code: (defvar mew-thread-indent-strings ["¦§" "¦¦" "¦¢" "¡¡"]) (provide 'mew-lang-kr) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-lang-kr.el ends here kazu-yamamoto-Mew-ff9c41b/mew-lang-latin.el000066400000000000000000000061751256455547000207220ustar00rootroot00000000000000;;; mew-lang-latin.el --- Latin specific stuff for Mew ;; Author: Kazu Yamamoto ;; Created: Dec 11, 2002 ;;; Code: (require 'mew) (defvar mew-latin01-list '(36 38 40 52 56 60 61 62)) (defvar mew-charset-latin-alist '(("iso-8859-1" latin-iso8859-1 latin-iso8859-15) ("iso-8859-15" latin-iso8859-15 latin-iso8859-1))) (defun mew-latin-make-regex (lc lst) (mapconcat (lambda (x) (char-to-string (make-char lc x))) lst "\\|")) (defvar mew-latin0-regex (mew-latin-make-regex 'latin-iso8859-15 mew-latin01-list)) (defvar mew-latin1-regex (mew-latin-make-regex 'latin-iso8859-1 mew-latin01-list)) (defun mew-latin0-region (beg end) (let* (charset ent to from ch lc conflict0 conflict1) (save-restriction (narrow-to-region beg end) (setq conflict0 (save-excursion (goto-char (point-min)) (re-search-forward mew-latin0-regex nil t))) (setq conflict1 (save-excursion (goto-char (point-min)) (re-search-forward mew-latin1-regex nil t))) (unless (and conflict0 conflict1) ;; mew-charset-m17n (cond (conflict0 (setq charset "iso-8859-15")) (conflict1 (setq charset "iso-8859-1")) (t (setq charset mew-charset-latin))) (setq ent (assoc charset mew-charset-latin-alist)) (mew-set '(nil to from) ent) (save-excursion (goto-char (point-min)) (while (re-search-forward "\\cl" nil t) (setq ch (split-char (preceding-char))) (setq lc (car ch)) (when (eq lc from) (delete-char -1) (insert (make-char to (nth 1 ch)))))))))) (provide 'mew-lang-latin) ;;; Copyright Notice: ;; Copyright (C) 2002-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-lang-latin.el ends here kazu-yamamoto-Mew-ff9c41b/mew-local.el000066400000000000000000000361441256455547000177650ustar00rootroot00000000000000;;; mew-local.el ;; Author: Kazu Yamamoto ;; Created: Dec 12, 2001 (defvar mew-local-folder-alist-file ".mew-folder-alist") (defvar mew-local-folder-alist nil) (defvar mew-local-folder-alist-time nil) (defvar mew-local-friend-folder-list-file ".mew-friend-folder-list") (defvar mew-local-friend-folder-list nil) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Listing directories ;;; (defun mew-dir-list (dir) (if (file-directory-p (expand-file-name dir)) (funcall mew-dir-list-function dir) ())) (defun mew-dir-list-with-link-count (dir) "Collecting a directory list under DIR. Subdirectories are expressed by a list. This function uses two techniques for speed up. One is to gather candidates of directory by matching 'mew-regex-folder-candidate'. The default is \"^[^.0-9]\\|^[0-9].*[^0-9]\". So, typical messages whose name is numeric are not gathered. This makes it faster to check whether or not each candidate is a directory in 'while' loop. The other is to see if the link count of a directory is 2. If so, the directory does not have subdirectories. So, it is not necessary to trace down. This technique can be used on UNIX variants." (let* ((default-directory (expand-file-name dir default-directory)) (dirent (directory-files "." nil mew-regex-folder-candidate)) ;; MUST sort dirs ent subdirs) (dolist (file dirent) (setq ent (mew-file-chase-links file)) (when (file-directory-p ent) (setq dirs (cons file dirs)) (when (and (mew-file-get-links ent) ;; necessary (/= (mew-file-get-links ent) 2)) (setq subdirs (mew-dir-list-with-link-count file)) (if subdirs (setq dirs (cons subdirs dirs)))))) (nreverse dirs))) (defun mew-dir-list-without-link-count (dir) "Collecting a directory list under DIR. Subdirectories are expressed by a list. This function uses one technique for speed up. It is to gather candidates of directory by matching 'mew-regex-folder-candidate'. The default is \"^[^.0-9]\\|^[0-9].*[^0-9]\". So, typical messages whose name is numeric are not gathered. This makes it faster to check whether or not each candidate is a directory in 'while' loop." (let* ((default-directory (expand-file-name dir default-directory)) (dirent (directory-files "." nil mew-regex-folder-candidate)) ;; MUST sort dirs ent subdirs) (dolist (file dirent) (setq ent (mew-file-chase-links file)) (when (file-directory-p ent) (setq dirs (cons file dirs)) (setq subdirs (mew-dir-list-without-link-count file)) (if subdirs (setq dirs (cons subdirs dirs))))) (nreverse dirs))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folder list ;;; (defun mew-local-folder-entry (ent1 ent2 make-list) (if make-list ent1 (mew-folder-func ent1 ent2))) (defun mew-local-folder-make-alist (dirs prefix &optional make-list) (let (fldpfx dir ret ent) (if (= (length prefix) 1) (setq fldpfx prefix) (setq fldpfx (file-name-as-directory prefix))) (while dirs (setq dir (car dirs)) (setq dirs (cdr dirs)) (setq ent (concat fldpfx dir)) (cond ((consp (car dirs)) ;; not listp because nil is a list. (cond ((or (equal mew-attach-folder ent) (equal mew-draft-folder ent)) (setq ret (cons (mew-local-folder-entry ent nil make-list) ret)) (setq dirs (cdr dirs))) ;; skip subfolder (t (setq ret (cons (mew-local-folder-entry (file-name-as-directory ent) dir make-list) ret)) (setq ret (nconc (mew-local-folder-make-alist (car dirs) ent make-list) ret)) (setq dirs (cdr dirs))))) (t (if (string-match mew-regex-ignore-folders ent) (setq ret (cons (mew-local-folder-entry ent nil make-list) ret)) (setq ret (cons (mew-local-folder-entry ent dir make-list) ret)))))) ret)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folders ;;; (defun mew-local-folder-clean-up () (setq mew-local-folder-alist nil) (setq mew-local-friend-folder-list nil)) (defun mew-local-folder-alist () (let* ((file (expand-file-name mew-local-folder-alist-file mew-conf-path)) (t1 (mew-file-get-time file)) (t2 mew-local-folder-alist-time)) (if (mew-compare-times t1 t2) (mew-local-folder-load)) mew-local-folder-alist)) (defun mew-local-friend-folder-list () mew-local-friend-folder-list) (defun mew-local-folder-load () (let ((file (expand-file-name mew-local-folder-alist-file mew-conf-path))) (setq mew-local-folder-alist (mew-lisp-load mew-local-folder-alist-file)) (setq mew-local-folder-alist-time (mew-file-get-time file)) (setq mew-local-friend-folder-list (mew-lisp-load mew-local-friend-folder-list-file)))) (defun mew-local-folder-save () (let ((file (expand-file-name mew-local-folder-alist-file mew-conf-path))) (mew-lisp-save mew-local-folder-alist-file mew-local-folder-alist) (setq mew-local-folder-alist-time (mew-file-get-time file)) (mew-lisp-save mew-local-friend-folder-list-file mew-local-friend-folder-list))) (defun mew-local-folder-set (folders friends) (setq mew-local-folder-alist folders) (setq mew-local-friend-folder-list friends) (mew-local-folder-save)) (defun mew-local-update (&optional interactivep) "Update the list of local folders." (interactive) (unless interactivep (add-hook 'kill-emacs-hook 'mew-folder-clean-up) (mew-local-folder-load)) ;; (when (or interactivep (null mew-local-folder-alist)) (message "Collecting local folders...") (let* ((mail-dirs (mew-dir-list mew-mail-path)) (from-dirs (mew-dir-list (mew-expand-folder mew-friend-folder))) (folders (mew-local-folder-make-alist mail-dirs mew-folder-local)) (friends (mew-local-folder-make-alist from-dirs mew-friend-folder t))) (setq folders (nreverse folders)) (setq friends (nreverse friends)) (mew-local-folder-set folders friends)) (message "Collecting local folders...done"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folder sub function ;;; (defun mew-local-folder-insert (folder) "Insert FOLDER to 'mew-local-folder-alist'. Binary search is used for speed reasons." (let (dir subdir) (unless (string-match mew-regex-ignore-folders folder) (setq dir (directory-file-name (mew-folder-string folder))) ;; foo/bar -> foo/bar ;; foo/bar/ -> foo/bar (setq subdir (file-name-nondirectory dir)) ;; foo/bar -> bar ;; foo -> foo ) (mew-folder-insert folder mew-local-folder-alist subdir) (if (and (string-match (concat "^" (regexp-quote mew-friend-folder)) folder) (not (member folder mew-local-friend-folder-list))) (setq mew-local-friend-folder-list (cons folder mew-local-friend-folder-list))) (mew-local-folder-save))) (defun mew-local-folder-delete (folder) (mew-folder-delete folder mew-local-folder-alist) (setq mew-local-friend-folder-list (delete folder mew-local-friend-folder-list)) (mew-local-folder-save)) (defun mew-local-folder-check (folder &optional ask) (let ((absdir (mew-expand-folder folder))) (if (file-directory-p absdir) t (if (or (not ask) (y-or-n-p (format "%s does not exist. Create it? " folder))) (progn (mew-make-directory absdir) ;; may be called by IMAP... (if (mew-folder-localp folder) (mew-local-folder-insert folder)) folder) nil)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Process name ;;; (defvar mew-local-info-list '("directive" "buf" "bnm" "mdb" "flush" "rcnt" "rttl" "first" "case")) (mew-info-defun "mew-local-" mew-local-info-list) (defconst mew-local-info-prefix "mew-local-info-") (defun mew-local-info-name (bnm) (format "%s<%s>" mew-local-info-prefix bnm)) (defun mew-local-buffer-name (folder) (concat mew-buffer-prefix folder)) (defun mew-local-debug (label string) (when (mew-debug 'ls) (with-current-buffer (get-buffer-create mew-buffer-debug) (goto-char (point-max)) (insert (format "\n<%s>\n%s\n" label string))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Scan ;;; (defun mew-scan-mewl-folder (folder) (mew-replace-character folder mew-sp ?\007)) (defun mew-scan-mewl-src (folder &optional range) (setq folder (mew-scan-mewl-folder (mew-expand-folder2 folder))) (if range (list "-s" (format "%s %s" folder range)) (list "-s" folder))) (defun mew-local-retrieve (directive &rest args) ;; 'inc folder opts ;; 'scan folder range ;; 'vir opts func lra erase (mew-summary-with-mewl (let* ((process-connection-type mew-connection-type1) (bnm (mew-summary-folder-name 'ext)) (pnm (mew-local-info-name bnm)) (buf (get-buffer-create (mew-local-buffer-name bnm))) range pro opts) (message "Scanning %s..." bnm) (mew-sinfo-set-summary-form (mew-get-summary-form bnm)) (mew-sinfo-set-summary-column (mew-get-summary-column bnm)) (mew-sinfo-set-unread-mark nil) (mew-sinfo-set-scan-id nil) (mew-sinfo-set-scan-md5 nil) (mew-info-clean-up pnm) (mew-local-set-directive pnm directive) (mew-local-set-bnm pnm bnm) (mew-local-set-buf pnm buf) (mew-local-set-case pnm mew-case) ;; xxx specfy to mew-local-retrieve? (cond ((eq directive 'inc) (mew-sinfo-set-unread-mark (mew-get-unread-mark bnm)) (mew-local-set-flush pnm (nth 1 args)) (setq opts (append (nth 2 args) (mew-scan-mewl-src (nth 0 args))))) ((eq directive 'scan) (setq range (nth 1 args)) (if (nth 2 args) (progn (mew-local-set-mdb pnm (mew-summary-mark-collect4)) (mew-erase-buffer) (setq mew-summary-buffer-raw nil) (mew-summary-folder-cache-save)) (mew-sinfo-set-unread-mark (mew-get-unread-mark bnm))) (setq opts (mew-scan-mewl-src (nth 0 args) range))) ((eq directive 'vir) (mew-sinfo-set-unread-mark (mew-get-unread-mark bnm)) (setq opts (nth 0 args)) (mew-vinfo-set-func (nth 1 args)) (mew-vinfo-set-lra (nth 2 args)) (unless (nth 3 args) (mew-erase-buffer)) (mew-local-set-rttl pnm (nth 4 args)))) (mew-sinfo-set-start-point (point)) ;; after erase-buffer (mew-local-set-rcnt pnm 1) (with-current-buffer buf (mew-erase-buffer)) (setq opts (append (list "-b" mew-mail-path "-l" (number-to-string mew-scan-max-field-length) "-c" (number-to-string mew-scan-max-body-length) "-w" "-x" mew-suffix "-f" (mapconcat 'identity (nthcdr 2 mew-scan-fields) ",")) opts)) (setq pro (apply 'start-process pnm buf mew-prog-mewl opts)) (mew-summary-lock pro "Scanning") (mew-set-process-cs pro mew-cs-text-for-net mew-cs-text-for-write) ;; text may be broken, so undecided is very dangerous! (set-process-filter pro 'mew-local-filter) (set-process-sentinel pro 'mew-local-sentinel) (mew-process-silent-exit pro)))) (defun mew-local-filter (process string) (let* ((width (1- (mew-scan-width))) (pnm (process-name process)) (bnm (mew-local-get-bnm pnm)) (first (mew-local-get-first pnm)) (draftp (mew-folder-draftp bnm)) (directive (mew-local-get-directive pnm)) (case (mew-local-get-case pnm)) vec rttl mark) (mew-local-debug "FILTER" string) (mew-filter (mew-set-buffer-multibyte nil) (goto-char (point-max)) (mew-elet (insert string)) (goto-char (point-max)) (forward-line -1) (when (looking-at "^\\.$") (mew-dot-delete) (goto-char (point-min)) (unless first (when (looking-at "NumOfMsg: \\([0-9]+\\)") (setq rttl (string-to-number (match-string 1))) (mew-local-set-rttl pnm rttl) (forward-line) (delete-region (point-min) (point))) (mew-local-set-first pnm t)) (mew-net-status3 bnm (mew-local-get-rttl pnm) (mew-local-get-rcnt pnm)) (mew-local-set-rcnt pnm (1+ (mew-local-get-rcnt pnm))) (mew-set-buffer-multibyte t) (setq vec (mew-scan-header draftp)) (if (eq directive 'inc) (setq mark (mew-scan-inbox-action vec case))) (mew-scan-body vec draftp) (mew-scan-insert-line bnm vec width nil mark) (delete-region (point-min) (point-max)) (process-send-string process "\n"))))) (defun mew-local-sentinel (process event) (let* ((pnm (process-name process)) (bnm (mew-local-get-bnm pnm)) (buf (mew-local-get-buf pnm)) (virtualp (mew-folder-virtualp bnm)) (mdb (mew-local-get-mdb pnm)) (flush (mew-local-get-flush pnm))) (save-excursion (mew-local-debug "SENTINEL" event) (mew-filter (mew-set-buffer-multibyte t) (set-buffer bnm) (mew-summary-mark-recover mdb) (if (and virtualp (mew-vinfo-get-func)) (funcall (mew-vinfo-get-func))) (mew-vinfo-set-func nil) (mew-info-clean-up pnm) (if virtualp (progn (mew-summary-set-count-line) (mew-virtual-set-cache-time)) (mew-summary-folder-cache-save)) (set-buffer-modified-p nil) (mew-summary-unlock) (if (and (mew-folder-imapp bnm) (not (mew-folder-imap-queuep))) (if (mew-local-get-rttl pnm) (message "Type '\\[mew-summary-ls]' to override invalid messages") ;; This folder has been just created. ;; Ideally scan should not be called. But there is no way ;; to avoid the call. (message "")) (message "Scanning %s...done" bnm)) (run-hooks 'mew-scan-sentinel-hook) (when (and mew-auto-flush-queue flush) (mew-smtp-flush-queue mew-case)) (mew-remove-buffer buf))))) (defun mew-virtual-set-cache-time () (let* ((ctime (current-time)) (cache-time (list (nth 0 ctime) (nth 1 ctime)))) (mew-sinfo-set-cache-time cache-time))) ;;; Code: (require 'mew) (provide 'mew-local) ;;; Copyright Notice: ;; Copyright (C) 2001-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-local.el ends here kazu-yamamoto-Mew-ff9c41b/mew-mark.el000066400000000000000000000712721256455547000176260ustar00rootroot00000000000000;;; mew-mark.el --- Marking for Mew Summary and Virtual mode ;; Author: Kazu Yamamoto ;; Created: Mar 2, 1997 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; undo-func ;;; (defun mew-mark-unrefile (fld msg) "Delete refile state and delete the mark." (mew-summary-refile-remove-body) (unless (mew-virtual-p) (mew-refile-reset msg) (mew-summary-refile-unlog fld))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Undo ;;; (defun mew-mark-unmark () (save-excursion (mew-summary-goto-mark) (when (looking-at mew-regex-mark) (mew-mark-remove)))) (defun mew-summary-undo (&optional count) "Cancel the mark in COUNT times." (interactive "P") (mew-mark-put-mark-loop 'mew-summary-undo-one count 'stayp)) (defun mew-summary-undo-one (&optional no-msg) "Cancel the mark on this message." (if (eobp) (or no-msg (message "No message")) (let (mark func fld msg) (save-excursion (mew-summary-goto-message) (setq mark (mew-summary-get-mark)) (if (null mark) (or no-msg (message "No mark")) (setq func (mew-markdb-func-undo mark)) (or (fboundp func) (setq func nil)) (setq fld (mew-summary-folder-name)) (setq msg (mew-summary-message-number)) (mew-mark-unmark) (if func (funcall func fld msg)) (if (mew-virtual-for-one-summary) (mew-summary-unmark-in-physical fld msg func))))))) ;; (defun mew-summary-undo-all () "Cancel all marks according to what you input." (interactive) (let ((char (mew-input-mark))) (if char (mew-mark-undo-mark char)))) (defun mew-mark-undo-mark (mark &optional no-msg virtual-only) "Undo MARK on the entire buffer. If optional argument NO-MSG is non-nil, no message is displayed." (or no-msg (message "Unmarking...")) (mew-decode-syntax-delete) (let* ((regex (mew-mark-regex mark)) (func (mew-markdb-func-undo mark)) (case-fold-search nil) (reviewp (char-equal mark mew-mark-review)) (one-summary (and (not virtual-only) (mew-virtual-for-one-summary))) alist fld msg reviews) (or (fboundp func) (setq func nil)) (save-excursion (goto-char (point-min)) (while (re-search-forward regex nil t) (setq fld (mew-summary-folder-name)) (setq msg (mew-summary-message-number)) (mew-mark-remove) (if one-summary (mew-mark-alist-set alist fld msg)) (when reviewp (setq reviews (cons msg reviews))) (if func (funcall func fld msg)) (forward-line)) (set-buffer-modified-p nil) (mew-sinfo-set-mark-review (nreverse reviews)) (if one-summary (mew-summary-unmark-in-physical-alist alist func)))) (or no-msg (message "Unmarking...done"))) ;; (defun mew-summary-mark-undo-all () "Unmark all message marked with 'o' or 'D' or 'X'." (interactive) (message "Unmarking...") (dolist (mark mew-summary-mark-undo-marks) (mew-mark-undo-mark mark 'no-msg)) (message "Unmarking...done")) ;; (defun mew-summary-redo () "\\Recover the `*' marks which are canceled by the last `\\[mew-summary-undo-all]*'." (interactive) (let ((mark mew-mark-review) (reviews (mew-sinfo-get-mark-review))) (save-excursion (mew-mark-undo-mark mark 'no-msg) (goto-char (point-min)) (dolist (msg reviews) (when (re-search-forward (mew-regex-sumsyn-msg msg) nil t) (mew-mark-put mark) (forward-line)))) (set-buffer-modified-p nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Basic functions and macros for mark ;;; (defun mew-summary-get-mark () "Get a mark on the current message." (save-excursion (mew-summary-goto-mark) (when (looking-at mew-regex-mark) (mew-sumsyn-mark)))) ;; return char (defun mew-summary-markable () (let ((mark (mew-summary-get-mark)) (case-fold-search nil)) (or (null mark) (char-equal mark mew-mark-unread)))) (defun mew-summary-mark-as (mark) "Mark this message with MARK if possible." (when (mew-summary-markable) (mew-mark-put mark))) (defun mew-mark-put (mark) (save-excursion (mew-summary-goto-mark) (let* ((beg (point)) (end (1+ beg))) (mew-elet ;; This code is awkward but for invisible. (forward-char 1) (insert-and-inherit (char-to-string mark)) ;; inherit highlight (forward-char -2) (delete-char 1) (mew-front-nonsticky beg end) (mew-highlight-mark-line mark)) (mew-mark-hist-set (mew-summary-message-number) mark)))) (defun mew-mark-remove () (save-excursion (mew-summary-goto-mark) (let* ((mark mew-mark-read) (beg (point)) (end (1+ beg))) (mew-elet ;; This code is awkward but for invisible. (forward-char 1) (insert-and-inherit (char-to-string mark)) ;; inherit highlight (forward-char -2) (delete-char 1) (mew-front-nonsticky beg end) (mew-highlight-unmark-line)) (mew-mark-hist-set (mew-summary-message-number) mark)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Entire buffer ;;; (defun mew-summary-mark-exist-p (mark-list) "See if this Summary mode has one or more marked messages." (let ((regex (mew-mark-list-regex mark-list))) (save-excursion (goto-char (point-min)) (re-search-forward regex nil t)))) (defun mew-summary-mark-collect (mark &optional begin end) "This function returns a list of message number." (save-excursion (let ((regex (mew-mark-regex mark)) (msglist nil) (case-fold-search nil)) (goto-char (if begin begin (point-min))) (while (re-search-forward regex end t) (setq msglist (cons (mew-summary-message-number) msglist))) (nreverse msglist)))) (defun mew-summary-mark-collect2 (mark) "For Virtual mode, this function returns a list of cons pairs of folder name and message number." (save-excursion (let ((regex (mew-mark-regex mark)) (msglist nil) (case-fold-search nil)) (goto-char (point-min)) (while (re-search-forward regex nil t) (setq msglist (cons (cons (mew-summary-folder-name) (mew-summary-message-number)) msglist))) (nreverse msglist)))) (defun mew-summary-mark-collect4 () (save-excursion (let (ret mrk msg) (goto-char (point-min)) (while (re-search-forward mew-regex-mark nil t) (setq mrk (mew-sumsyn-mark)) (setq msg (mew-summary-message-number)) (setq ret (cons (list msg mrk) ret)) (forward-line)) (nreverse ret)))) (defun mew-summary-mark-collect5 () (save-excursion (let ((beg (mew-net-invalid-cache-start)) ret mrk msg) (when beg (goto-char beg) (while (re-search-forward mew-regex-mark nil t) (setq mrk (mew-sumsyn-mark)) (setq msg (mew-summary-message-number)) (setq msg (number-to-string (string-to-number msg))) (setq ret (cons (list msg mrk) ret)) (forward-line)) (nreverse ret))))) (defun mew-summary-mark-recover (mdb &optional refdb refs) (let ((opos (point)) (case-fold-search nil) msg mrk new-ref ref-ent) (goto-char (point-min)) (dolist (ent mdb) (mew-set '(msg mrk) ent) (when (re-search-forward (mew-regex-sumsyn-msg msg) nil t) (if (or (not (char-equal mrk mew-mark-refile)) (null refdb)) (mew-mark-put mrk) (when (setq ref-ent (assoc msg refdb)) (mew-mark-put mrk) (setq new-ref (cons ref-ent new-ref)))) (forward-line))) (dolist (ref refs) (when (setq ref-ent (assoc ref refdb)) (setq new-ref (cons ref-ent new-ref)))) (goto-char opos) (nreverse new-ref))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Base function ;;; (defun mew-mark-afterstep (mark case) "Move the cursor after marking according to MARK's CASE. See also mew-mark-afterstep-spec." (let ((action (mew-markas-nth mark case))) (cond ((eq action 0) ()) ;; stay ((eq action 1) (mew-summary-goto-message) (mew-decode-syntax-delete) (cond ((eq mew-summary-mark-direction 'up) (forward-line -1)) ((eq mew-summary-mark-direction 'down) (forward-line)) ((eq mew-summary-mark-direction 'next) (if (eq (mew-sinfo-get-direction) 'up) (forward-line -1) (forward-line))))) ((eq action 2) (mew-summary-goto-message) (mew-decode-syntax-delete) (beginning-of-line) (mew-push-mark) (let ((mew-inherit-after-marking t)) (mew-summary-display-after mew-summary-mark-direction)))))) (mew-defstruct mark-hist msg mark) (defun mew-mark-hist-set (msg mark) (let* ((hist (mew-sinfo-get-mark-hist)) (ent (assoc msg hist)) (num (string-to-number msg)) curr prev) (cond (ent (if mark (setcar (nthcdr 1 ent) mark))) (t (setq ent (mew-make-mark-hist :msg msg :mark mark)) (setq curr hist) (catch 'loop (while curr (if (> (string-to-number (nth 0 (car curr))) num) (progn (if (null prev) (setq hist (cons ent hist)) (setcdr prev (cons ent (cdr prev)))) (throw 'loop nil))) (setq prev curr) (setq curr (cdr curr))) (setq hist (nconc hist (list ent)))) (mew-sinfo-set-mark-hist hist))))) (defun mew-mark-put-mark (newmark &optional no-msg valid-only) "Put the NEWMARK on the current line if possible. If NO-MSG is non-nil, no message is displayed. NO-MSG also means that this function is being called in loop." (mew-summary-msg-or-part (let (oldmark oldlevel oldname newlevel newname case msg fld marked validp) (save-excursion (mew-summary-goto-message) (when (mew-sumsyn-match mew-regex-sumsyn-short) (setq msg (mew-sumsyn-message-number)) (setq fld (mew-sumsyn-folder-name)) (setq validp (or (not valid-only) (mew-msg-validp msg)))) (if (not validp) (unless no-msg (message "Cannot mark this invalid message with '%c'" newmark)) (setq oldmark (mew-summary-get-mark)) (setq oldlevel (mew-markdb-level oldmark)) (setq oldname (mew-markdb-name oldmark)) (setq newlevel (mew-markdb-level newmark)) (setq newname (mew-markdb-name newmark)) (cond ((null oldmark);; no mark (setq case 1) (mew-mark-put newmark) (setq marked t)) ((eq oldmark newmark) (setq case 2) (or no-msg (mew-markdb-statefullp oldmark) (message "Already marked as '%s'" oldname))) ((< oldlevel newlevel) (setq case 3) (mew-summary-undo-one no-msg) (mew-mark-put newmark) (setq marked t)) ((= oldlevel newlevel) (cond ((mew-markdb-statefullp oldmark) (if (or no-msg (y-or-n-p (format "Already marked as '%s'. %s it? " oldname (mew-capitalize newname)))) (progn (setq case 4) (mew-summary-undo-one no-msg) (mew-mark-put newmark) (setq marked t)) (setq case 5))) (t (setq case 6) (mew-summary-undo-one no-msg) (mew-mark-put newmark) (setq marked t)))) (t ;; > oldlevel newlevel (setq case 7) (message "Cannot mark here because '%s' is stronger than '%s'" oldname newname))))) (when validp (if (and marked (mew-virtual-for-one-summary)) (mew-summary-mark-in-physical fld msg newmark)) (or no-msg (mew-mark-afterstep newmark case)) (set-buffer-modified-p nil))))) (defun mew-mark-put-mark-loop (func count stayp) "Unless COUNT is numeric, just call FUNC once. The cursor moves forward. STAYP has no effect. If COUNT is positive, call FUNC in COUNT times moving the cursor forward. If COUNT is negative, call FUNC in COUNT times moving the cursor backward. If COUNT is numeric and STAYP is non-nil, the cursor stays in the original position." (if (and (not (integerp count)) (mew-mark-active-p)) (let ((begend (mew-summary-get-region))) (goto-char (car begend)) (setq stayp nil) (setq count (count-lines (point) (cdr begend))) (mew-mark-put-mark-loop1 func count stayp)) (mew-mark-put-mark-loop1 func count stayp))) (defun mew-mark-put-mark-loop1 (func count stayp) (when (and func (fboundp func)) (mew-summary-msg-or-part (if (integerp count) (let ((start (point))) (mew-decode-syntax-delete) ;; positive loop (while (and (> count 0) (not (eobp))) (setq count (1- count)) (funcall func 'no-msg) (forward-line)) ;; negative loop (while (< count 0) (if (bobp) ;; need to call the func (setq count 0) (setq count (1+ count))) (funcall func 'no-msg) (forward-line -1)) (and stayp (goto-char start))) ;; just one (funcall func)) (set-buffer-modified-p nil)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Physical ;;; (defun mew-summary-mark-in-physical (fld msg new-mark) (save-excursion (when (get-buffer fld) (set-buffer fld) (save-excursion (when (mew-summary-search-msg msg) (mew-mark-put new-mark) (set-buffer-modified-p nil)))))) (defun mew-summary-unmark-in-physical (fld msg &optional func) (save-excursion (when (get-buffer fld) (set-buffer fld) (save-excursion (when (mew-summary-search-msg msg) (mew-mark-remove) (if func (funcall func fld msg)) (set-buffer-modified-p nil)))))) (defmacro mew-mark-alist-set (alist fld msg) `(let ((imsg (string-to-number ,msg)) (fld-msgs (assoc ,fld ,alist))) (if fld-msgs (nconc fld-msgs (list imsg)) (setq ,alist (cons (list ,fld imsg) ,alist))))) (defun mew-summary-mark-in-physical-alist (alist mark &optional func) (save-excursion (let (fld msg msgs) (dolist (ent alist) (setq fld (car ent)) (setq msgs (sort (copy-sequence (cdr ent)) '<)) ;; sort has side effect (when (get-buffer fld) (set-buffer fld) (save-excursion (goto-char (point-min)) (dolist (m msgs) (setq msg (number-to-string m)) (when (re-search-forward (mew-regex-sumsyn-msg msg) nil t) (if func (funcall func)) (mew-mark-put mark) (forward-line))) (set-buffer-modified-p nil))))))) (defun mew-summary-unmark-in-physical-alist (alist func) (save-excursion (let (fld msg msgs) (dolist (ent alist) (setq fld (car ent)) (setq msgs (sort (copy-sequence (cdr ent)) '<)) ;; sort has side effect (when (get-buffer fld) (set-buffer fld) (save-excursion (goto-char (point-min)) (dolist (m msgs) (setq msg (number-to-string m)) (when (re-search-forward (mew-regex-sumsyn-msg msg) nil t) (mew-mark-remove) (if func (funcall func fld msg)) (forward-line))) (set-buffer-modified-p nil))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Review: "*" in Summary mode ;;; (defun mew-summary-review (&optional count) "\\ Put the review mark (default is '*') in COUNT times. Use '\\[mew-summary-display-review-down]' or '\\[mew-summary-display-review-up]' to jump to a message marked with '*'. See also '\\[mew-summary-mark-refile]', '\\[mew-summary-mark-delete]', '\\[mew-summary-mark-regexp]', and '\\[mew-summary-mark-all]'." (interactive "P") (mew-mark-put-mark-loop 'mew-summary-review-one count nil)) (defun mew-summary-review-one (&optional no-msg) "Put the review mark (default is '*') on this message." (mew-mark-put-mark mew-mark-review no-msg)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Escape: "$" in Summary mode ;;; (defun mew-summary-escape (&optional count) "\\ Put the escape mark (default is '$') in COUNT times." (interactive "P") (mew-mark-put-mark-loop 'mew-summary-escape-one count nil)) (defun mew-summary-escape-one (&optional no-msg) "Put the escape mark (default is '$') on this message." (mew-mark-put-mark mew-mark-escape no-msg)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Delete: "D" in Summary mode ;;; (defun mew-summary-delete (&optional count) "Put the delete mark (default is 'D') in COUNT times." (interactive "P") (mew-summary-not-in-nntp (mew-mark-put-mark-loop 'mew-summary-delete-one count nil))) (defun mew-summary-delete-one (&optional no-msg) "Put the delete mark (default is 'D') on this message." (mew-mark-put-mark mew-mark-delete no-msg 'valid-only)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Unlink: "X" in Summary mode ;;; (defun mew-summary-unlink (&optional count) "Put the unlink mark (default is 'X') in COUNT times." (interactive "P") (mew-summary-not-in-nntp (mew-mark-put-mark-loop 'mew-summary-unlink-one count nil))) (defun mew-summary-unlink-one (&optional no-msg) "Put the unlink mark (default is 'X') on this message." (mew-mark-put-mark mew-mark-unlink no-msg 'valid-only)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Unread: "U" in Summary mode ;;; (defun mew-summary-unread (&optional count) "\\ Put the unread mark (default is 'U') in COUNT times." (interactive "P") (mew-mark-put-mark-loop 'mew-summary-unread-one count nil)) (defun mew-summary-unread-one (&optional no-msg) "Put the unread mark (default is 'U') on this message." (mew-mark-put-mark mew-mark-unread no-msg)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; All messages ;;; (defun mew-summary-mark-all (&optional arg) "Put the '*' mark onto all messages which are not marked." (interactive "P") (mew-decode-syntax-delete) (if (mew-mark-active-p) (setq arg t)) (if arg (let ((begend (mew-summary-get-region))) (mew-summary-mark-all-region (car begend) (cdr begend))) (mew-summary-mark-all-region (point-min) (point-max)))) (defun mew-summary-mark-all-region (beg end) "Put the '*' mark onto all messages which are not marked between BEG and END." (interactive "r") (let ((regex (mew-mark-regex mew-sp)) ;; not marked (mark mew-mark-review) ;; someday ... (one-summary (mew-virtual-for-one-summary)) fld msg alist) (save-excursion (goto-char beg) (while (re-search-forward regex end t) (mew-summary-mark-as mark) (when one-summary (setq fld (mew-summary-folder-name)) (setq msg (mew-summary-message-number)) (mew-mark-alist-set alist fld msg)) (forward-line)) (set-buffer-modified-p nil)) (if one-summary (mew-summary-mark-in-physical-alist alist mark)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Regex ;;; (defun mew-summary-search-regexp-visible (regex) (catch 'loop (while (re-search-forward regex nil t) (beginning-of-line) (unless (search-forward "\r" (match-end 0) t) (throw 'loop t)) (forward-line)))) (defun mew-summary-mark-regexp (&optional args) "Put the '*' mark onto all messages matched to a regular expression." (interactive "P") (mew-decode-syntax-delete) (let ((regex (read-string "Regexp: ")) (mark mew-mark-review) ;; someday ... (one-summary (mew-virtual-for-one-summary)) (n 0) fld msg alist) (while (string= regex "") (setq regex (read-string "Regexp: "))) (save-excursion (goto-char (point-min)) (while (if args (re-search-forward regex nil t) (mew-summary-search-regexp-visible regex)) (when (and (mew-summary-markable) (mew-sumsyn-match mew-regex-sumsyn-short)) (when one-summary (setq fld (mew-sumsyn-folder-name)) (setq msg (mew-sumsyn-message-number)) (mew-mark-alist-set alist fld msg)) (mew-mark-put mark) (setq n (1+ n))) (forward-line)) (set-buffer-modified-p nil)) (if one-summary (mew-summary-mark-in-physical-alist alist mark)) (cond ((= n 1) (message "1 message marked")) ((> n 1) (message "%d messages marked" n)) (t (message "No message to be marked"))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Exchange ;;; (defun mew-summary-exchange-mark (oldmark newmark &optional valid-only) (let ((regex (mew-mark-regex oldmark)) (case-fold-search nil) (one-summary (mew-virtual-for-one-summary)) (i 0) fld msg alist) (save-excursion (goto-char (point-min)) (while (re-search-forward regex nil t) (when (mew-sumsyn-match mew-regex-sumsyn-short) (setq fld (mew-sumsyn-folder-name)) (setq msg (mew-sumsyn-message-number)) (when (or (not valid-only) (mew-msg-validp msg)) (mew-mark-put newmark) (if one-summary (mew-mark-alist-set alist fld msg)))) (forward-line) (setq i (1+ i)))) (if (= i 0) (message "No marked messages") (set-buffer-modified-p nil) (if one-summary (mew-summary-mark-in-physical-alist alist newmark))))) (defun mew-summary-mark-delete () ;; * -> D "Put the delete mark onto all messages marked with '*'." (interactive) (mew-summary-not-in-nntp (mew-summary-exchange-mark mew-mark-review mew-mark-delete 'valid-only))) (defun mew-summary-mark-unlink () ;; * -> X "Put the delete mark onto all messages marked with '*'." (interactive) (mew-summary-exchange-mark mew-mark-review mew-mark-unlink 'valid-only)) (defun mew-summary-mark-escape () ;; * -> $ "Change the '*' mark into the '$' mark." (interactive) (mew-summary-exchange-mark mew-mark-review mew-mark-escape)) (defun mew-summary-mark-review () ;; $ -> * "Change the '$' mark into the '*' mark." (interactive) (mew-summary-exchange-mark mew-mark-escape mew-mark-review)) (defun mew-summary-mark-unread () ;; * -> U "Change the '*' mark into the 'U' mark." (interactive) (mew-summary-exchange-mark mew-mark-review mew-mark-unread)) (defun mew-summary-mark-swap () ;; $ <-> * "Swap the '$' mark and the '*' mark." (interactive) (mew-summary-exchange-mark mew-mark-escape mew-mark-tmp) (mew-summary-exchange-mark mew-mark-review mew-mark-escape) (mew-summary-exchange-mark mew-mark-tmp mew-mark-review)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Marking duplicated messages ;;; (defun mew-summary-mark-duplicated (&optional arg) "Put the mark specified by 'mew-mark-duplicated' on duplicated messages. If called with '\\[universal-argument]', process in the region." (interactive "P") (mew-summary-not-in-queue (mew-summary-not-in-draft (if (and (or (eq mew-mark-duplicated mew-mark-delete) (eq mew-mark-duplicated mew-mark-unlink)) (eq mew-summary-mark-duplicated-skip nil)) (message "Cannot mark because messages may lost by this setting") (let ((reversep (eq mew-summary-mark-duplicated-skip 'last)) (count 0) my-id dup-id size ids beg end region) (if (mew-mark-active-p) (setq arg t)) (cond (arg (setq region (mew-summary-get-region)) (setq beg (car region)) (setq end (cdr region))) (t (setq beg (point-min)) (setq end (point-max)))) (message "Marking duplications...") (save-excursion ;; from mew-summary-thread-region in mew-threaed.el (setq size (count-lines beg end)) (cond ((<= size 211) (setq size 211)) ((<= size 1511) (setq size 1511)) ((<= size 7211) (setq size 7211)) (t (setq size 18211))) (setq ids (make-vector size 0)) ;; hash (save-restriction (narrow-to-region beg end) (goto-char (if reversep (point-max) (point-min))) (catch 'loop (while t (when (and (mew-summary-message-number) (mew-summary-markable)) (setq my-id (mew-summary-my-id)) (when (> (length my-id) 0) (setq dup-id (intern-soft my-id ids)) (if (null dup-id) ;; first time (no duplication) (set (intern my-id ids) t) (when (symbol-value dup-id) ;; second time (first duplication) (unless mew-summary-mark-duplicated-skip (save-excursion (when (re-search-backward (mew-regex-sumsyn-my-id my-id) nil t) (mew-mark-put-mark mew-mark-duplicated 'no-msg) (setq count (1+ count)))) (set (intern my-id ids) nil))) (mew-mark-put-mark mew-mark-duplicated 'no-msg) (setq count (1+ count))))) (cond (reversep (beginning-of-line) (if (bobp) (throw 'loop t) (forward-line -1))) (t (forward-line 1) (if (eobp) (throw 'loop t)))))))) (cond ((= count 0) (message "Marking duplications...done (no duplication)")) ((= count 1) (message "Marking duplications...done (1 msg is marked)")) (t (message "Marking duplications...done (%d msgs are marked)" count)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Reviewing ;;; (defun mew-summary-set-walk-mark () (let* ((msg (format "Input mark(%c): " mew-mark-default-walk)) (mew-mark-spec (cons (list 13) mew-mark-spec)) ;; adding \r (char (mew-input-mark msg))) (cond ((null char) ;; mew-input-mark displays a message. ) ((char-equal char ?\r) (setq mew-mark-walk mew-mark-default-walk) (message "Target mark was set to '%c'" mew-mark-walk)) (char (setq mew-mark-walk char) (message "Target mark was set to '%c'" mew-mark-walk))))) (defun mew-summary-down-mark (mark) (let ((case-fold-search nil)) (forward-line) (cond ((re-search-forward (mew-mark-regex mark) nil t) (beginning-of-line) t) (t (forward-line -1) (message "No more marked messages") nil)))) (defun mew-summary-display-review-down (&optional arg) "Jump to the message marked with '*' below. If called with '\\[universal-argument]', you can change the target mark. After that, this command jumps to the message marked with the specified mark." (interactive "P") (if arg (mew-summary-set-walk-mark) (if (mew-summary-down-mark mew-mark-walk) (mew-summary-display)))) (defun mew-summary-up-mark (mark) (let ((case-fold-search nil)) (cond ((re-search-backward (mew-mark-regex mark) nil t) t) (t (message "No more marked messages") nil)))) (defun mew-summary-display-review-up (&optional arg) "Jump to the message marked with '*' above. If called with '\\[universal-argument]', you can change the target mark. After that, this command jumps to the message marked with the specified mark." (interactive "P") (if arg (mew-summary-set-walk-mark) (if (mew-summary-up-mark mew-mark-walk) (mew-summary-display)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Mark exchange ;;; (defun mew-summary-input-exchangeable-mark (msg) (let (mark) (catch 'loop (while t (setq mark (mew-input-mark msg)) (cond ((null mark) (message "That is not a mark") (mew-let-user-read)) ((mew-markdb-statefullp mark) (message "'%c' cannot be exchanged" mark) (mew-let-user-read)) (t (throw 'loop mark))))))) (defun mew-summary-exchange-marks () "Exchange the first input mark to the second one. The 'o' mark is not exchangeable." (interactive) (let* ((from (mew-summary-input-exchangeable-mark "Input mark from: ")) (to (mew-summary-input-exchangeable-mark "Input mark to: ")) (regex (mew-mark-regex from)) (case-fold-search nil)) (unless (char-equal from to) (save-excursion (goto-char (point-min)) (while (re-search-forward regex nil t) (mew-summary-undo-one 'nomsg) (mew-mark-put-mark to 'nomsg)) (forward-line))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Clean up marks! ;;; (defun mew-mark-init () (add-hook 'kill-emacs-hook 'mew-sinfo-clean-up)) (defun mew-sinfo-clean-up () "Saving marks. Typically called by kill-emacs-hook." (remove-hook 'kill-emacs-hook 'mew-sinfo-clean-up) (mew-decode-syntax-delete) (save-excursion (dolist (buf mew-buffers) (when (bufferp (get-buffer buf)) (set-buffer buf) (when (mew-summary-p) (mew-sinfo-save)))))) (provide 'mew-mark) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-mark.el ends here kazu-yamamoto-Mew-ff9c41b/mew-message.el000066400000000000000000000246601256455547000203170ustar00rootroot00000000000000;;; mew-message.el --- Message mode for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Message info ;;; (defvar mew-minfo-list '("summary" "eom" "veil-to" "veil-cc" "reob")) (mew-blinfo-defun 'mew-minfo mew-minfo-list) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Message mode ;;; (defun mew-message-mode () "A major mode for display a message. \\{mew-message-mode-map}" (interactive) (setq major-mode 'mew-message-mode) (setq mode-name mew-mode-name-message) (setq mode-line-buffer-identification (mew-mode-line-id)) (use-local-map mew-message-mode-map) (setq buffer-read-only t) (make-local-variable 'page-delimiter) (setq page-delimiter mew-page-delimiter) (mew-message-setup-decoration) (mew-message-toolbar-update) (mew-run-mode-hooks 'mew-message-mode-hook)) (defun mew-message-mode-line (fld message) (let* ((msg (or message (mew-current-get-msg (mew-frame-id)))) (status (mew-message-line-status)) (flag (nth status '("N" "W" "L")))) (when msg (setq mode-line-process (format " %s %s/%s" flag fld msg))))) (defun mew-message-next-page (&optional lines) "Scroll up this message. Return 'nil' if more pages. Otherwise, return 't'." (interactive) (if (save-excursion (goto-char (window-end)) (and (pos-visible-in-window-p) (eobp))) ;; Nothing in this page. (if (or (null mew-break-pages) (save-excursion (goto-char (window-end)) (save-restriction (widen) (forward-line) (eobp)))) ;; Real end of buffer? (if mew-summary-show-pause (prog1 (mew-minfo-get-reob) (unless (mew-minfo-get-reob) (message "End of buffer") (mew-minfo-set-reob t))) t) ;; Go to the next page. (mew-message-narrow-to-page 1) nil) ;; More in this page. (condition-case nil (scroll-up lines) (end-of-buffer (goto-char (point-max)) (message "End of buffer"))) nil)) (defun mew-message-prev-page (&optional lines) "Back-scroll this message. Return 'nil' if more pages. Otherwise, return 't'." (interactive) (move-to-window-line 0) (if (save-excursion (beginning-of-line) (and (pos-visible-in-window-p) (bobp))) ;; Nothing in this page. (if (or (null mew-break-pages) (save-restriction (widen) (bobp))) ;; Real beginning of buffer? t ;; Go to the previous page. (mew-message-narrow-to-page -1) nil) ;; More in this page. (condition-case nil (scroll-down lines) (beginning-of-buffer (goto-char (point-min)) (message "Beginning of buffer"))) nil)) (defun mew-message-narrow-to-page (&optional arg) (setq arg (if arg (prefix-numeric-value arg) 0)) (save-excursion (condition-case nil (forward-page -1) ;; Beginning of the current page. (beginning-of-buffer ())) (widen) (cond ((> arg 0) (forward-page arg)) ((< arg 0) (forward-page (1- arg)))) (forward-page) (let* ((end (point))) (forward-page -1) (if (and (eolp) (not (bobp))) (forward-line)) (narrow-to-region (point) end)))) (defun mew-message-goto-summary () "Get back to Summary mode." (interactive) (let* ((fld (mew-minfo-get-summary)) (fid (mew-frame-id)) (msg (mew-current-get-msg fid)) (part (mew-current-get-part fid))) (if (not (get-buffer fld)) (message "No Summary mode for %s" fld) (if (get-buffer-window fld) (select-window (get-buffer-window fld)) (mew-summary-switch-to-folder fld)) (cond ((and msg part (mew-decode-syntax-p)) (setq part (concat "^.. +" (regexp-quote (mapconcat 'number-to-string part ".")) " ")) (goto-char (mew-decode-syntax-begin)) (re-search-forward part (mew-decode-syntax-end) t) (beginning-of-line) (mew-summary-display)) (msg (mew-summary-move-and-display msg)))))) (defun mew-message-reply () "Answer to this message. A new draft is prepared in Draft mode. Mew automatically decides To: and Cc:." (interactive) (mew-message-goto-summary) (call-interactively 'mew-summary-reply)) (defun mew-message-reply-with-citation () "Answer to this message. A new draft is prepared in Draft mode. Mew automatically decides To: and Cc: and cites the body." (interactive) (mew-message-goto-summary) (call-interactively 'mew-summary-reply-with-citation)) (defun mew-message-forward () "Forward this message to a third person. A new draft is prepared in Draft mode and this message is automatically attached." (interactive) (mew-message-goto-summary) (call-interactively 'mew-summary-forward)) (defun mew-message-resend () "\\ Resend this message with Resent-To:. It is strongly discouraged to use this command since beginners are always confused. Please use '\\[mew-message-forward]' instead." (interactive) (mew-message-goto-summary) (call-interactively 'mew-summary-resend)) (defun mew-message-next-msg (&optional arg) "Display a message or a part below." (interactive "p") (let* ((swin (previous-window)) (mbuf (current-buffer))) (select-window swin) ;; for the next forward-line (when (mew-summary-or-virtual-p) (forward-line arg) ;; minus arg results in prev (mew-summary-display)) ;; for window config (select-window (get-buffer-window mbuf)))) (defun mew-message-prev-msg (&optional arg) "Display a message or a part above." (interactive "p") (mew-message-next-msg (- arg))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; URLs ;;; (defun mew-message-goto-next-url (&optional arg) (interactive "P") (let ((next (if arg 'previous-single-property-change 'next-single-property-change)) pos) (setq pos (funcall next (point) 'mew-url)) (if pos (if (not (get-text-property pos 'mew-url)) (setq pos (funcall next pos 'mew-url)))) (when pos (goto-char pos)))) (defun mew-browse-url-at-mouse (event) (interactive "e") (let ((buf (current-buffer)) url) (mouse-set-point event) (setq url (or (get-text-property (point) 'mew-url) (get-text-property (point) 'w3m-href-anchor) (get-text-property (point) 'shr-url))) (if (and url (string-match mew-regex-nonascii url)) (setq url (mew-puny-encode-url url))) (if url (browse-url url)) (pop-to-buffer buf))) (defun mew-browse-url-at-point () (interactive) (let (url) (setq url (or (get-text-property (point) 'mew-url) (get-text-property (point) 'w3m-href-anchor) (get-text-property (point) 'shr-url))) (if (and url (string-match mew-regex-nonascii url)) (setq url (mew-puny-encode-url url))) (if url (browse-url url)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; lines ;;; (defun mew-message-line-status () (cond ((not (eq buffer-undo-list t)) 1) ;; wrapped (truncate-lines 2) ;; long (t 0))) ;; normal (defun mew-message-line () "Toggle normal lines, wrapped lines and long lines." (interactive) (let* ((N 3) (status (% (1+ (mew-message-line-status)) N))) (mew-elet (cond ((= status 0) (setq truncate-lines nil) (message "Normal lines")) ((= status 1) (setq buffer-undo-list nil) (mew-wrap-lines (if (mew-header-end) (1+ (mew-header-end)) (point-min)) (point-max)) (message "Wrapped lines")) ((= status 2) (save-excursion (primitive-undo (length buffer-undo-list) buffer-undo-list)) (buffer-disable-undo) (setq truncate-lines t) (message "Long lines"))) (set-window-hscroll (selected-window) 0) (set-buffer-modified-p nil)))) (defun mew-normal-line () (setq truncate-lines nil)) (defcustom mew-wrap-lines-column fill-column "*Number of fill column to wrap line." :group 'mew-message :type 'integer) (defun mew-wrap-lines (beg end) (save-restriction (narrow-to-region beg end) (save-excursion (goto-char (point-min)) (let ((adaptive-fill-mode nil) (winwidth (- (window-width) 2)) (fill-column mew-wrap-lines-column) width start fill-prefix) (while (not (eobp)) (setq start (point)) (setq fill-prefix (mew-fill-match-adaptive-prefix)) (end-of-line) (setq width (current-column)) (forward-line) (if fill-prefix (setq fill-column (+ mew-wrap-lines-column (string-width fill-prefix))) (setq fill-column mew-wrap-lines-column)) (setq fill-column (min fill-column winwidth)) (when (> width fill-column) (fill-region-as-paragraph start (1- (point))))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Horizontal Scrolling ;;; (defun mew-message-scroll-left () "Scroll the Message window to the right." (interactive) (call-interactively 'scroll-left)) (defun mew-message-scroll-right () "Scroll the Message window to the left." (interactive) (call-interactively 'scroll-right)) (provide 'mew-message) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-message.el ends here kazu-yamamoto-Mew-ff9c41b/mew-mime.el000066400000000000000000001037001256455547000176130ustar00rootroot00000000000000;;; mew-mime.el --- MIME launcher for Mew ;; Author: Kazu Yamamoto ;; Created: Mar 23, 1997 ;;; Code: (require 'mew) (eval-when-compile (cond ((memq system-type '(windows-nt cygwin)) (require 'mew-win32)) ((eq system-type 'darwin) (require 'mew-darwin)) (t (require 'mew-unix))) (mew-no-warning-defun w3m-region) (mew-no-warning-defun w3m-expand-file-name-as-url)) (defvar mew-process-file-alist nil) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Configuration subroutines ;;; (defun mew-progspec-get-prog (def) (cond ((stringp def) def) ((and (listp def) (stringp (car def))) (car def)))) (defun mew-progspec-get-args (def) (if (listp def) (nth 1 def))) (defun mew-progspec-get-async (def) (cond ((stringp def) t) ((listp def) (nth 2 def)))) (defun mew-progsec-args-convert (args arg) (let (converted ret) (setq ret (mapcar (lambda (x) (if (not (string-match "%s" x)) x (setq converted t) (format x arg))) args)) (unless converted (setq ret (append ret (list arg)))) ret)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Start and call process ;;; (defun mew-mime-start-process (program options file) (let ((process-connection-type mew-connection-type1) pro) (message "Starting %s..." program) (setq pro (apply 'mew-start-process-disp (format "*mew %s*" program) nil program (append options (list file)))) (set-process-sentinel pro 'mew-mime-start-process-sentinel) (message "Starting %s...done" program) (setq mew-process-file-alist (cons (cons pro file) mew-process-file-alist)) t)) ;; to next part (defun mew-mime-start-process-sentinel (process event) (let* ((al (assoc process mew-process-file-alist)) (file (cdr al))) (save-excursion ;; A launcher program may be executed. ;; The launcher program executes an application according to ;; file's suffix or something. ;; The time when the launcher is finished is not the time when ;; the application is finished. So, we can't delete the temporary ;; file here. Hoping that the file will be deleted when Mew is ;; finished. (if mew-delete-temp-file (mew-delete-file file)) (setq mew-process-file-alist (delq al mew-process-file-alist))))) (defun mew-mime-call-process (program options file) (message "Calling %s..." program) (apply 'call-process program file nil nil options) (mew-delete-file file) (message "Calling %s...done" program) t) ;; to next part ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Part handler ;;; ;; see also mew-summary-execute-external(). (defun mew-mime-part (cache fullpart nums) ;; called in Message buffer ;; if nums is nil, it means singlepart. (let* ((syntax (mew-syntax-get-entry fullpart nums)) (begin (mew-syntax-get-begin syntax)) (end (mew-syntax-get-end syntax)) (ctl (mew-syntax-get-ct syntax)) (cte (mew-syntax-get-cte syntax)) (ct (mew-syntax-get-value ctl 'cap)) (cdpl (mew-syntax-get-cdp syntax)) (fname (mew-syntax-get-filename cdpl ctl)) (cd (mew-syntax-get-cd syntax)) (params (mew-syntax-get-params ctl)) (program (mew-ctdb-prog (mew-ctdb-by-ct ct))) func2) (when (listp program) (setq func2 (nth 1 program)) (setq program (nth 0 program))) (cond ((null program) (mew-mime-function func2 cache begin end ct cte cd fname)) ((symbolp program) (when (fboundp program) (cond ((eq program 'mew-mime-message/rfc822) (funcall program cache syntax)) ;; for recursive MIME ((eq program 'mew-mime-application/octet-stream) (funcall program cache begin end params ct cte cd fname)) ((mew-ct-imagep ct) (funcall program cache begin end params fname ct cte)) (t (funcall program cache begin end params))))) (t ;; string (insert " ###### ###### ####### ##### ###### # # #\n" " # # # # # # # # # # # # ## ##\n" " # # # # # # # # # # # # # # #\n" " ###### ###### # # # #### ###### # # # # #\n" " # # # # # # # # # ####### # #\n" " # # # # # # # # # # # # #\n" " # # # ####### ##### # # # # # #\n" "\n\n") (mew-insert "Content-Type:\t%s\n" ct) (mew-insert "Encoding:\t%s\n" cte) (mew-insert "Size:\t\t%d bytes\n" (mew-region-bytes begin end cache)) (mew-insert "Filename:\t%s\n" fname) (mew-insert "Description:\t%s\n" cd) (mew-insert "Program:\t%s\n" program) (insert "\n") (mew-mime-part-messages t))))) (defun mew-mime-function (func cache begin end &optional ct cte cd fname) (insert " ####### # # # # ##### ####### ### ####### # #\n" " # # # ## # # # # # # # ## #\n" " # # # # # # # # # # # # # #\n" " ##### # # # # # # # # # # # # #\n" " # # # # # # # # # # # # # #\n" " # # # # ## # # # # # # # ##\n" " # ##### # # ##### # ### ####### # #\n" "\n\n") (mew-insert "Content-Type:\t%s\n" ct) (mew-insert "Encoding:\t%s\n" cte) (mew-insert "Size:\t\t%d bytes\n" (mew-region-bytes begin end cache)) (mew-insert "Filename:\t%s\n" fname) (mew-insert "Description:\t%s\n" cd) (mew-insert "Function:\t%s\n" func) (insert "\n") (mew-mime-part-messages func)) (defun mew-mime-part-messages (prog) (cond ((and prog (fboundp prog)) (mew-insert-manual "To execute an external function, type " "'\\\\[mew-summary-execute-external]'.\n" "\n")) (prog (mew-insert-manual "To execute an external command, type " "'\\\\[mew-summary-execute-external]'.\n" "\n"))) (mew-insert-manual "To save this part, type " "'\\\\[mew-summary-save]'.\n" "To insert this part in Message mode, type " "'\\\\[mew-summary-display-asis]'.\n")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Text/Plain ;;; (defvar mew-flowed-auto-wrap t) (defun mew-mime-text/plain (cache begin end &optional params) ;; called in Message buffer (when (> end begin) (save-excursion ;; We need to keep properties (e.g. citation color) ;; in a message cache. ;; This must be "insert-buffer-substring". (insert-buffer-substring cache begin end) (when mew-insert-final-newline (save-excursion (goto-char (point-max)) (if (not (bolp)) (insert "\n")))) (if (and mew-flowed-auto-wrap (mew-syntax-get-param params "format") (string= (downcase (mew-syntax-get-param params "format")) "flowed")) (mew-message-line)) ;; Page breaks (when mew-break-pages (goto-char (point-min)) (mew-message-narrow-to-page))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Text/Enriched ;;; (defun mew-mime-text/enriched (cache begin end &optional params) ;; called in Message buffer (when (> end begin) (save-excursion (let ((start (point))) ;; We need to keep composite properties of charset. ;; This must be "insert-buffer-substring". (insert-buffer-substring cache begin end) ;; Highlight (when mew-use-text/enriched (condition-case nil ;; format.el is buggy. (format-decode-region start (point-max) 'text/enriched) (args-out-of-range (message nil))) ;; just clear (enriched-mode 0))) ;; Page breaks (when mew-break-pages (goto-char (point-min)) (mew-message-narrow-to-page))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Text/Html ;;; (defun mew-mime-text/html (cache begin end &optional params) ;; called in Message buffer (if (and (symbolp mew-prog-text/html) (fboundp mew-prog-text/html)) (save-excursion (let ((start (point)) folder) ;; We need to keep composite properties of charset. ;; This must be "insert-buffer-substring". (insert-buffer-substring cache begin end) (with-current-buffer cache (setq folder (mew-cinfo-get-fld))) (if (or mew-use-text/html (and mew-use-text/html-list (mew-folder-spec folder mew-use-text/html-list mew-use-text/html-string-type mew-use-text/html-list-type))) (progn (funcall mew-prog-text/html start (point-max)) (delete-trailing-whitespace start (point-max)) (mew-highlight-body-region start (point-max))) (mew-message-for-summary "To parse HTML, type '\\[mew-summary-analyze-again]'")))) (insert " # # ####### # # #\n" " # # # ## ## #\n" " # # # # # # # #\n" " ####### # # # # #\n" " # # # # # #\n" " # # # # # #\n" " # # # # # #######\n" "\n\n") (mew-insert "Size:\t\t%d bytes\n" (mew-region-bytes begin end cache)) (mew-insert "Browser:\t%s\n" (or (mew-progspec-get-prog mew-prog-text/html-ext) "none")) (insert "\n") (mew-mime-part-messages t))) (defun mew-text/html-detect-cs (begin end) (let ((case-fold-search t)) (save-excursion (goto-char begin) (when (or (re-search-forward (concat "") (min end (+ begin 1024)) t) (re-search-forward (concat "") (min end (+ begin 1024)) t) (re-search-forward "<\\?xml.*encoding=['\"]\\([^'\"]+\\)['\"] *\\?>" (min end (+ begin 1024)) t)) (mew-charset-to-cs (mew-match-string 1)))))) (defun mew-mime-text/html-ext (cache begin end &optional params) (mew-mime-markup-language-ext mew-prog-text/html-ext cache begin end params "HTML" mew-format-html)) (defun mew-mime-markup-language-ext (program cache begin end params tag form) ;; called in Message buffer (when (> end begin) (let* ((file (format form (mew-make-temp-name))) (prog (mew-progspec-get-prog program)) (args (mew-progsec-args-convert (mew-progspec-get-args program) file)) wcs) (with-current-buffer cache (message "Displaying %s..." tag) ;; charset check (setq wcs (mew-text/html-detect-cs begin end)) ;; note that application/xml may have the charset parameter (unless (mew-coding-system-p wcs) (setq wcs (mew-charset-to-cs (mew-syntax-get-param params "charset")))) (unless (mew-coding-system-p wcs) (setq wcs mew-cs-text-for-write)) (mew-frwlet mew-cs-dummy wcs (write-region begin end file nil 'no-msg) (apply 'mew-start-process-disp prog nil prog args)) (message "Displaying %s...done" tag))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Text/XML ;;; (defun mew-mime-text/xml (cache begin end &optional params) ;; called in Message buffer (if (and (symbolp mew-prog-text/xml) (fboundp mew-prog-text/xml)) (save-excursion (let ((start (point))) ;; We need to keep composite properties of charset. ;; This must be "insert-buffer-substring". (insert-buffer-substring cache begin end) (if mew-use-text/xml (funcall mew-prog-text/xml start (point-max)) (mew-message-for-summary "To parse XML, type '\\[mew-summary-analyze-again]'")))) (insert " # # # # #\n" " # # ## ## #\n" " # # # # # # #\n" " # # # # #\n" " # # # # #\n" " # # # # #\n" " # # # # #######\n" "\n\n") (mew-insert "Size:\t\t%d bytes\n" (mew-region-bytes begin end cache)) (mew-insert "Browser:\t%s\n" (or (mew-progspec-get-prog mew-prog-text/xml-ext) "none")) (insert "\n") (mew-mime-part-messages t))) (defun mew-mime-text/xml-ext (cache begin end &optional params) (mew-mime-markup-language-ext mew-prog-text/xml-ext cache begin end params "XML" mew-format-xml)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Application/Xml ;;; (defun mew-mime-application/xml (cache begin end &optional params) ;; called in Message buffer (if (and (symbolp mew-prog-application/xml) (fboundp mew-prog-application/xml)) (save-excursion (let ((start (point))) ;; We need to keep composite properties of charset. ;; This must be "insert-buffer-substring". (insert-buffer-substring cache begin end) (funcall mew-prog-application/xml start (point-max)))) (insert " # # # # #\n" " # # ## ## #\n" " # # # # # # #\n" " # # # # #\n" " # # # # #\n" " # # # # #\n" " # # # # #######\n" "\n\n") (mew-insert "Size:\t\t%d bytes\n" (mew-region-bytes begin end cache)) (mew-insert "Browser:\t%s\n" (or (mew-progspec-get-prog mew-prog-application/xml-ext) "none")) (insert "\n") (mew-mime-part-messages t))) (defun mew-mime-application/xml-ext (cache begin end &optional params) (mew-mime-markup-language-ext mew-prog-application/xml-ext cache begin end params "XML" mew-format-xml)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Text/X-Patch ;;; (defun mew-mime-text/patch-ext (cache begin end &optional params) (when (> end begin) (save-excursion (switch-to-buffer-other-frame "*Mew Patch*") (delete-other-windows) (erase-buffer) (insert-buffer-substring cache begin end) (diff-mode)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Image/* ;;; (defun mew-mime-image/* (cache begin end &optional params fname ct cte) (let* ((format (mew-mime-image-format-name ct))) (if (mew-image-inline-p format) (mew-mime-image cache begin end format) (insert " ##### # # # ##### #######\n" " # ## ## # # # # # \n" " # # # # # # # # # \n" " # # # # # # # #### #######\n" " # # # ####### # # # \n" " # # # # # # # # \n" " ##### # # # # ##### #######\n" "\n\n") (mew-insert "Content-Type:\t%s\n" ct) (mew-insert "Encoding:\t%s\n" cte) (mew-insert "Size:\t\t%d bytes\n" (mew-region-bytes begin end cache)) (mew-insert "Filename:\t%s\n" fname) (mew-insert "Program:\t%s\n" mew-prog-image/*-ext) (insert "\n") (mew-mime-part-messages t)))) (defun mew-mime-image/*-ext (cache begin end &optional params fname ct cte) (let ((file (mew-make-temp-name fname))) (with-current-buffer cache (mew-flet (write-region begin end file nil 'no-msg))) (mew-mime-image-ext file))) (defun mew-mime-image-ext (file) (let* ((spec mew-prog-image/*-ext) (prog (mew-progspec-get-prog spec)) (args (mew-progspec-get-args spec))) (mew-mime-start-process prog args file))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Message/Rfc822 ;;; (defun mew-mime-text/rfc822-headers (cache begin end &optional params) ;; called in Message buffer (when (> end begin) (save-excursion ;; We need to keep properties of a header. ;; This must be "insert-buffer-substring". (insert-buffer-substring cache begin end) (mew-header-arrange (point-min) (point-max))))) (defun mew-mime-message/rfc822 (cache part) ;; called in Message buffer (let* ((hbeg (mew-syntax-get-begin part)) (hend (mew-syntax-get-end part)) (body (mew-syntax-get-part part))) ;; We need to keep properties of a header. ;; This must be "insert-buffer-substring". (insert-buffer-substring cache hbeg hend) (mew-header-arrange (point-min) (point-max)) (cond ;; Displaying the text/plain body or the first part of ;; top level multipart if it is text/plain. ;; see also mew-syntax-singlepart ((mew-syntax-singlepart-p body) (mew-mime-part cache body nil)) ;; nil is single ((mew-syntax-multipart-p body) (let* ((first (mew-syntax-get-part body)) (ct (mew-syntax-get-value (mew-syntax-get-ct first) 'cap))) (when (and (mew-xinfo-get-text-body) (mew-ct-textp ct)) (mew-mime-part cache first nil))))))) ;; nil is single ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Application/Octet-Stream ;;; (defun mew-mime-application/octet-stream (cache begin end &optional params ct cte cd fl) (insert " ###### ### # # # ###### # #\n" " # # # ## # # # # # # #\n" " # # # # # # # # # # # #\n" " ###### # # # # # # ###### #\n" " # # # # # # ####### # # #\n" " # # # # ## # # # # #\n" " ###### ### # # # # # # #\n" "\n\n") (mew-insert "Content-Type:\t%s\n" ct) (mew-insert "Encoding:\t%s\n" cte) (when params (mew-insert "Parameters:\t%s\n" (mapconcat (lambda (x) (concat (nth 0 x) "=" (nth 1 x))) params ", "))) (mew-insert "Size:\t\t%d bytes\n" (mew-region-bytes begin end cache)) (mew-insert "Filename:\t%s\n" fl) (mew-insert "Description:\t%s\n" cd) (mew-insert-manual "\nTo specify appropriate Content-Type: \n" "and execute an internal/external function/command, " "type \\\\[mew-summary-execute-external]'.\n") (insert "\n") (mew-mime-part-messages nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Application/Msoffice ;;; (defun mew-mime-application/msword (cache begin end &optional parameter) (mew-mime-application/msoffice mew-prog-application/msword cache begin end parameter)) (defun mew-mime-application/msexcel (cache begin end &optional parameter) (mew-mime-application/msoffice mew-prog-application/msexcel cache begin end parameter)) (defun mew-mime-application/mspowerpoint (cache begin end &optional parameter) (mew-mime-application/msoffice mew-prog-application/mspowerpoint cache begin end parameter)) (defun mew-mime-application/rtf (cache begin end &optional parameter) (mew-mime-application/msoffice mew-prog-application/rtf cache begin end parameter)) (defun mew-mime-application/rtf-ext (cache begin end &optional parameter) (save-excursion (mew-mime-application/rtf cache begin end parameter))) (defun mew-mime-application/msoffice (prog cache begin end &optional parameter) (let ((doit t) file1 file2) (unless mew-internal-utf-8p (condition-case nil (require 'un-define) (file-error (setq doit nil) (insert "To display this, install Mule-UCS for UTF-8.\n")))) (unless (mew-which-exec prog) (setq doit nil) (insert "To display this, install \"" prog "\".\n")) (condition-case nil (require 'mew-w3m) (file-error (setq doit nil) (insert "To display this, install \"w3m.el\".\n"))) (if (not doit) (progn (insert "\n") (mew-mime-part-messages nil)) (message "Displaying an MS document...") (mew-erase-buffer) (setq file1 (mew-make-temp-name)) (with-current-buffer cache (mew-flet (write-region begin end file1 nil 'no-msg))) (setq file2 (mew-make-temp-name)) (if (eq prog mew-prog-application/msword) (mew-frwlet 'utf-8 mew-cs-dummy (if mew-use-old-wvhtml (call-process prog nil nil nil file1 file2) (call-process prog nil nil nil "--charset=utf-8" (concat "--targetdir=" (file-name-directory file2)) file1 (file-name-nondirectory file2))) (let ((buffer-file-coding-system)) ;; to prevent the side effect (mew-insert-file-contents file2))) (if (eq prog mew-prog-application/rtf) (mew-frwlet 'shift_jis mew-cs-dummy (call-process prog nil (current-buffer) nil file1)) (mew-frwlet 'utf-8 mew-cs-dummy (call-process prog nil (current-buffer) nil file1)))) (mew-delete-file file1) (mew-delete-file file2) (save-excursion (w3m-region (point-min) (point-max) (w3m-expand-file-name-as-url (file-name-directory file2)))) (message "Displaying an MS document...done")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; PDF ;;; (defun mew-mime-application/pdf (cache begin end &optional parameter) (message "Displaying a PDF document...") (mew-erase-buffer) (let ((doit t) (prog mew-prog-application/pdf) file1 file2) (unless (mew-which-exec prog) (setq doit nil) (mew-elet (insert "To display this, install \"" prog "\".\n"))) (if (not doit) (progn (mew-elet (insert "\n")) (mew-mime-part-messages t) (message "Displaying a PDF document...failed")) (setq file1 (mew-make-temp-name)) (with-current-buffer cache (mew-flet (write-region begin end file1 nil 'no-msg))) (setq file2 (mew-make-temp-name)) (call-process prog nil nil nil "-layout" "-enc" "UTF-8" file1 file2) (when (file-exists-p file2) (mew-frwlet 'utf-8 mew-cs-dummy (insert-file-contents file2))) (if (file-exists-p file1) (delete-file file1)) (if (file-exists-p file2) (delete-file file2)) (message "Displaying a PDF document...done")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Application/Ms-Tnef ;;; (defun mew-mime-application-ms-tnef (cache begin end &optional parameter) (insert " ####### # # ####### ########\n" " # ## # # #\n" " # # # # # #\n" " # # # # ####### ######\n" " # # # # # #\n" " # # ## # #\n" " # # # ####### #\n" "\n\n") (mew-insert-manual "To extract files, type " "'\\\\[mew-summary-execute-external]'.\n")) (defvar mew-prog-tnef "tnef") (defun mew-mime-application-ms-tnef-ext (cache begin end &optional parameter) ;; called in Message buffer (let ((file (mew-make-temp-name)) (dir (mew-input-directory-name mew-home))) (if (not (mew-which-exec mew-prog-tnef)) (message "'%s' not found" mew-prog-tnef) (with-current-buffer cache (mew-plet (write-region begin end file nil 'no-msg))) (mew-erase-buffer) (insert "Extracted: \n\n") (call-process mew-prog-tnef file t nil "--verbose" "-C" dir) (mew-delete-file file)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Executing external commands ;;; (defun mew-summary-ask-ct (ct fname) (let (pt fl) (cond (fname (setq ct (or (mew-ctdb-ct (mew-ctdb-by-file fname)) (mew-content-type (mew-sinfo-get-case)))) (setq pt "Type for %s (%s): ") (setq fl fname)) (t (setq pt "Type %s(%s): ") (setq fl ""))) (mew-input-type pt fl ct mew-mime-content-type-list))) (defun mew-summary-execute-external (&optional ask-command) "Execute an external command according to Content-Type:. If this command is executed on the entire message, the first part is chosen as a target. If Content-Type of the target part is Application/Octet-Stream, Content-Type is automatically asked. And if it has both internal and external visualization mechanisms, you are asked which you want to use. If executed with '\\[universal-argument]', you can specify a command to be executed. See 'mew-mime-content-type' to know how actions can be defined." (interactive "P") (mew-summary-msg-or-part (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) (nums (mew-syntax-nums)) (cache (mew-cache-hit fld msg 'must-hit)) (syntax (mew-cache-decode-syntax cache)) (stx (mew-syntax-get-entry syntax nums)) (ctl (mew-syntax-get-ct stx)) (ct (mew-syntax-get-value ctl 'cap)) (win (selected-window)) begin end params cdpl fname program options async was-apo erase-p pro-opt ent1 ent2) (when (and (string= ct mew-ct-msg) (or (not ask-command) (not (y-or-n-p "Save the entire message (y) or the first part (n)? ")))) (setq stx (mew-syntax-get-part stx)) (if (mew-syntax-multipart-p stx) (setq stx (mew-syntax-get-part stx))) (setq ctl (mew-syntax-get-ct stx)) (setq ct (mew-syntax-get-value ctl 'cap))) (setq begin (mew-syntax-get-begin stx)) (setq end (mew-syntax-get-end stx)) (setq params (mew-syntax-get-params ctl)) (setq cdpl (mew-syntax-get-cdp stx)) (setq fname (mew-syntax-get-filename cdpl ctl)) (when (or (string= ct mew-ct-apo) (eq (mew-ctdb-prog (mew-ctdb-by-ct ct)) 'mew-mime-application/octet-stream)) (setq ct (mew-summary-ask-ct ct fname)) (setq was-apo t)) (if (not ask-command) (setq program (mew-ctdb-prog (mew-ctdb-by-ct ct))) (setq pro-opt (mew-input-command mew-default-external-program)) (setq program (car pro-opt)) (setq options (cdr pro-opt))) ;; prog ;; func => called for both ;; (prog ...) ;; (nil prog) == prog ;; (nil (prog...)) == (prog...) ;; (nil func) != func ;; (func func) => need to select ;; (func prog) => need to select ;; (func (prog ...)) => need to select (cond ((stringp program) (setq async t)) ((symbolp program) (setq erase-p t)) ((listp program) (setq ent1 (nth 0 program)) (setq ent2 (nth 1 program)) (cond ((stringp ent1) (mew-set '(program options async) program)) ((null ent1) (cond ((stringp ent2) (setq program ent2) (setq async t)) ((listp ent2) (mew-set '(program options async) ent2)) (t ;; symbol (setq program ent2)))) (t ;; symbol (if (and was-apo (y-or-n-p "Internal (y) or External (n)? ")) (progn (setq erase-p t) (setq program ent1)) (setq program ent2)) (cond ((stringp program) (setq async t)) ((listp program) (mew-set '(program options async) program))))))) (mew-summary-toggle-disp-msg 'on) (mew-window-configure 'message) (if erase-p (mew-erase-buffer)) ;; message buffer (unwind-protect (mew-elet (cond ((stringp program) (mew-summary-execute-program program ct ctl cache begin end params fname options async)) ((symbolp program) (mew-summary-execute-symbol program ct ctl cache begin end params fname was-apo))) (mew-summary-display-postscript 'no-hook)) (select-window win))))) (defun mew-summary-execute-symbol (program ct ctl cache begin end params fname was-apo) (cond ((not (fboundp program)) (message "%s is not implemented" (symbol-name program))) ((eq program mew-prog-rfc822) (message "%s cannot be executed" mew-prog-rfc822)) ((or (mew-ct-imagep ct) (mew-ct-modelp ct)) (funcall program cache begin end params fname ct)) (t (let ((mew-use-text/html t) (mbuf (current-buffer)) tbuf) (if (and was-apo (mew-ct-textp ct)) ;; decode-broken? (with-temp-buffer (insert-buffer-substring cache begin end) (mew-cs-decode-region (point-min) (point-max) mew-cs-autoconv) (setq tbuf (current-buffer)) (setq begin (point-min)) (setq end (point-max)) (set-buffer mbuf) (funcall program tbuf begin end params)) (funcall program cache begin end params)))))) ;;; external (defun mew-summary-execute-program (program ct ctl cache begin end params fname options async) (if (not (mew-which-exec program)) (message "%s does not exist" program) (let ((file (mew-make-temp-name fname)) wcs) (with-current-buffer cache ;; NEVER use call-process-region for privacy reasons (cond ((not (mew-ct-linebasep ct)) (setq wcs mew-cs-binary)) ((not (mew-ct-textp ct)) (setq wcs mew-cs-text-for-write)) (t (cond ((or (string= mew-ct-htm ct) (string= mew-ct-xml ct)) (setq wcs (mew-text/html-detect-cs begin end)) (unless (mew-coding-system-p wcs) (setq wcs (mew-charset-to-cs (mew-syntax-get-param ctl "charset"))))) (t (setq wcs (mew-charset-to-cs (mew-syntax-get-param ctl "charset"))))) (unless (mew-coding-system-p wcs) (setq wcs (if mew-decode-broken (mew-charset-to-cs (mew-charset-guess-region begin end)) mew-cs-text-for-write))))) (mew-frwlet mew-cs-dummy wcs (write-region begin end file nil 'no-msg)) (if async (mew-mime-start-process program options file) (mew-mime-call-process program options file)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; unzip ;;; (defvar mew-ct-zip-list '("Application/Zip" "Application/X-Zip-Compressed" "Application/Octet-Stream")) (defun mew-ct-zip-p (ct) (member ct mew-ct-zip-list)) (defun mew-summary-unzip () (interactive) (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) (nums (mew-syntax-nums)) (cache (mew-cache-hit fld msg 'must-hit)) (syntax (mew-cache-decode-syntax cache)) (stx (mew-syntax-get-entry syntax nums)) (ct (mew-syntax-get-value (mew-syntax-get-ct stx) 'cap)) (file0 (mew-syntax-get-param (mew-syntax-get-cdp stx) "filename")) (beg (mew-syntax-get-begin stx)) (end (mew-syntax-get-end stx)) (size (- end beg)) (dir mew-temp-dir) file size1 end1) (if (not (mew-ct-zip-p ct)) (message "Cannot unzip")) (setq file (mew-unzip-file cache beg end dir file0)) (if (not file) (message "unzip failed") (let ((ct (mew-ctdb-ct (mew-ctdb-by-file file))) cs) (unless ct (let ((txtp (mew-ct-textp (mew-content-type "default"))) (file- (file-name-nondirectory file))) (setq ct (if txtp (if (y-or-n-p (format "\"%s\" as text? " file-)) mew-ct-txt mew-ct-apo) (if (y-or-n-p (format "\"%s\" as binary? " file-)) mew-ct-apo mew-ct-txt))))) (setq cs (if (mew-ct-textp ct) mew-cs-autoconv mew-cs-binary)) (with-current-buffer cache (delete-region beg end) (goto-char beg) (save-restriction (narrow-to-region beg beg) (mew-frwlet cs mew-cs-dummy (insert-file-contents (expand-file-name file dir))) (mew-syntax-set-ct stx (list ct)) (setq end1 (point-max)) (mew-syntax-set-end stx end1) (setq size1 (- end1 beg)) (mew-syntax-set-cdp stx (mew-syntax-cdp-format ct file))) (mew-decode-syntax-adjust-message mew-decode-syntax beg (- size1 size)) (mew-xinfo-set-multi-form nil) (mew-decode-syntax-set)) (let ((current (point)) (start (mew-decode-syntax-begin))) (mew-decode-syntax-delete) (mew-decode-syntax-copy cache) (goto-char start) (forward-line -1) (mew-decode-syntax-print (current-buffer) mew-decode-syntax (mew-xinfo-get-multi-form) (mew-xinfo-get-icon-spec)) (goto-char current) (mew-summary-display 'redisplay)))))) (defun mew-decode-syntax-adjust (val threshold inc) (if (> val threshold) (+ val inc) val)) (defun mew-decode-syntax-adjust-single (syntax threshold inc) (unless (= (mew-syntax-get-begin syntax) threshold) (mew-syntax-set-begin syntax (mew-decode-syntax-adjust (mew-syntax-get-begin syntax) threshold inc)) (mew-syntax-set-end syntax (mew-decode-syntax-adjust (mew-syntax-get-end syntax) threshold inc)))) (defun mew-decode-syntax-adjust-message (syntax threshold inc) (mew-decode-syntax-adjust-single syntax threshold inc) (let ((body (mew-syntax-get-part syntax))) (if (mew-syntax-multipart-p body) (mew-decode-syntax-adjust-multi body threshold inc) (mew-decode-syntax-adjust-single body threshold inc)))) (defun mew-decode-syntax-adjust-multi (syntax threshold inc) (mew-decode-syntax-adjust-single syntax threshold inc) (let ((i mew-syntax-magic) (len (length syntax)) part) (while (< i len) (setq part (aref syntax i)) (cond ((mew-syntax-singlepart-p part) (mew-decode-syntax-adjust-single part threshold inc)) ((mew-syntax-multipart-p part) (mew-decode-syntax-adjust-multi part threshold inc)) ((mew-syntax-message-p part) (mew-decode-syntax-adjust-message part threshold inc))) (setq i (1+ i))))) (defun mew-unzip-file (buf beg end dir file) (let* ((zipfile (expand-file-name file dir)) (encrypted (mew-zip-encrypted-p buf beg)) (password (if encrypted (read-passwd "Zip password: "))) (args0 (list "-o" "-d" dir zipfile)) (args (if password (cons "-P" (cons password args0)) args0))) (with-current-buffer buf (mew-frwlet mew-cs-dummy mew-cs-binary (write-region beg end zipfile nil 'no-msg))) (with-temp-buffer (apply 'call-process "unzip" nil t nil args) (goto-char (point-max)) (forward-line -1) (beginning-of-line) (when (looking-at "^ *[a-z]+: \\([^ ]+\\)") (mew-match-string 1))))) (defun mew-zip-encrypted-p (buf beg) (with-current-buffer buf (goto-char beg) (forward-char 6) (= (% (char-after) 2) 1))) (provide 'mew-mime) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-mime.el ends here kazu-yamamoto-Mew-ff9c41b/mew-minibuf.el000066400000000000000000001056021256455547000203200ustar00rootroot00000000000000;;; mew-minibuf.el --- Minibuffer input methods for Mew ;; Author: Kazu Yamamoto ;; Created: Mar 23, 1997 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Completion switch ;;; (defvar mew-input-complete-function nil "A function to be called when TAB is typed in minibuffer. This is used in 'mew-input-complete'.") (defun mew-input-complete () "Do completion according to the global variable \"mew-input-complete-function\"." (interactive) (if (and mew-input-complete-function (fboundp mew-input-complete-function)) (funcall mew-input-complete-function))) (defvar mew-input-exit-minibuffer-function nil "A function to be called when RET is typed in minibuffer. This function are used to check validity of 'case' and sort key.") (defun mew-input-exit-minibuffer () "Ensure the input meets a condition." (interactive) (if (or (not (and mew-input-exit-minibuffer-function (fboundp mew-input-exit-minibuffer-function))) (funcall mew-input-exit-minibuffer-function)) (exit-minibuffer))) (defvar mew-input-comma-function nil "A function to be called when ',' is typed in minibuffer. This function can be used to check validity of 'case'.") (defun mew-input-comma () "Ensure the input meets a condition." (interactive) (when (or (not (and mew-input-comma-function (fboundp mew-input-comma-function))) (funcall mew-input-comma-function)) (insert ","))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Clean up side effects ;;; (defun mew-input-clear () "A function to clean up side effects of window configuration at completions." (with-current-buffer (window-buffer (minibuffer-window)) ;; (mew-ainfo-get-win-cfg) is shared by many functions ;; because minibuffer is just one! (mew-ainfo-set-win-cfg nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folder ;;; (defvar mew-input-folder-search-buf " *Mew* folder search") (defvar mew-input-folder-hist nil) (defvar mew-input-folder-refile nil) (defvar mew-input-folder-search-direction nil) (defvar mew-input-folder-search-key nil) (defvar mew-input-folder-search-match nil) (defvar mew-input-folder-search-original nil) (defvar mew-input-folder-search-point nil) (defvar mew-input-folder-search-multi nil) (defun mew-input-folder-clean-up () (setq mew-input-folder-search-direction nil) (setq mew-input-folder-search-key nil) (setq mew-input-folder-search-match nil) (setq mew-input-folder-search-original nil) (setq mew-input-folder-search-point nil)) (defun mew-highlight-folder-comp-search-window () (let* ((win (get-buffer-window mew-buffer-completions)) (match mew-input-folder-search-match) face) (when (and win mew-input-folder-search-key mew-input-folder-search-match) (with-current-buffer mew-buffer-completions (mew-elet (goto-char (point-min)) (when (looking-at "^Key: ") (delete-region (point-min) (progn (forward-line) (point)))) (insert "Key: " mew-input-folder-search-key ", " "Match: " mew-input-folder-search-match "\n") (put-text-property (point-min) (point-max) 'face nil) (when (re-search-forward (format "\\(%s\\)\\([ \t]\\|$\\)" (regexp-quote match)) nil t) (goto-char (match-beginning 1)) (setq face (if (not window-system) 'mew-face-header-from (if (facep 'isearch) 'isearch 'region))) (put-text-property (point) (match-end 1) 'face face) (unless (pos-visible-in-window-p (point) win) (set-window-start win (progn (forward-line -2) (point)))))))))) (defun mew-input-folder-display (&optional msg) (mew-highlight-folder-comp-search-window) (mew-elet (delete-region (mew-minibuf-point-min) (point-max)) (insert "(" (or mew-input-folder-search-match "") ") ") (insert (or mew-input-folder-search-key "")) (if msg (save-excursion (insert " [" msg "]"))) (put-text-property (mew-minibuf-point-min) (point-max) 'read-only t))) (defun mew-input-folder-search-setup (&optional min) (if mew-input-folder-refile (mew-input-folder-search-setup2 min) (mew-input-folder-search-setup1 min))) (defun mew-input-folder-search-setup-buffer (alist min) (with-current-buffer (get-buffer-create mew-input-folder-search-buf) (setq buffer-read-only t) (mew-elet (mew-erase-buffer) (mapc (lambda (x) (if (stringp (car x)) (insert (car x) "\n"))) alist)) (if min (goto-char (point-min))))) (defun mew-input-folder-search-setup1 (&optional min) (let (case:folder case folder alist) (save-excursion (goto-char (point-max)) (if (search-backward "," nil t) (setq mew-input-folder-search-point (- (match-end 0) (mew-minibuf-point-min))))) (setq mew-input-folder-search-original (mew-buffer-substring (mew-minibuf-point-min) (point-max))) (setq case:folder mew-input-folder-search-original) (if mew-input-folder-search-point (setq case:folder (substring case:folder mew-input-folder-search-point))) (setq case (mew-case:folder-case case:folder)) (setq folder (mew-case:folder-folder case:folder)) (when case (setq mew-input-folder-search-point (+ (or mew-input-folder-search-point 0) (length case) 1))) ;; ":" (mew-input-folder-display) (if (or (null folder) (string= folder "")) (setq folder (mew-proto case))) (cond ((mew-folder-popp folder) (setq alist (mew-pop-folder-alist))) ((mew-folder-nntpp folder) (setq alist (mew-nntp-folder-alist case))) ((mew-folder-imapp folder) (setq alist (mew-imap-folder-alist case))) (t (setq alist (mew-local-folder-alist)))) (mew-input-folder-search-setup-buffer alist min))) (defun mew-input-folder-search-setup2 (&optional min) (let (do-search alist) (save-excursion (goto-char (point-max)) (if (search-backward "," (minibuffer-prompt-end) t) (progn (goto-char (match-end 0)) (unless (looking-at mew-regex-case2) (setq do-search t) (setq mew-input-folder-search-point (- (point) (mew-minibuf-point-min))))) (goto-char (mew-minibuf-point-min)) (unless (looking-at mew-regex-case2) (setq do-search t)))) (if (not do-search) (progn (mew-temp-minibuffer-message "Remove case!") (mew-input-folder-clean-up)) (setq mew-input-folder-search-original (mew-buffer-substring (mew-minibuf-point-min) (point-max))) (mew-input-folder-display) (cond ((eq mew-input-complete-function 'mew-complete-local-folder) (setq alist (mew-local-folder-alist))) ((eq mew-input-complete-function 'mew-complete-imap-folder) (setq alist (mew-imap-folder-alist mew-inherit-case)))) (mew-input-folder-search-setup-buffer alist min)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folder search forward ;;; (defun mew-input-folder-search-forward-1 (&optional again) (let (no-match pos) (with-current-buffer mew-input-folder-search-buf (setq pos (point)) (if again (forward-line) (beginning-of-line)) (if (search-forward mew-input-folder-search-key nil t) (progn (goto-char (match-beginning 0)) (setq mew-input-folder-search-match (mew-buffer-substring (save-excursion (beginning-of-line) (point)) (save-excursion (end-of-line) (point))))) (setq no-match t) (goto-char pos))) (if no-match (mew-input-folder-display "no match") (mew-input-folder-display)))) (defun mew-input-folder-search-forward () "Search a folder forward." (interactive) (cond ((and mew-input-folder-search-direction (null mew-input-folder-search-key)) (mew-input-folder-display "no match")) ((eq mew-input-folder-search-direction 'forward) (mew-input-folder-search-forward-1 'again)) ((eq mew-input-folder-search-direction 'backward) (setq mew-input-folder-search-direction 'forward) (mew-input-folder-search-forward-1 'again)) (t (setq mew-input-folder-search-direction 'forward) (mew-input-folder-search-setup 'min)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folder search backward ;;; (defun mew-input-folder-search-backward-1 (&optional again) (let (no-match pos) (with-current-buffer mew-input-folder-search-buf (setq pos (point)) (if again (progn (forward-line -1) (end-of-line)) (end-of-line)) (if (search-backward mew-input-folder-search-key nil t) (progn (goto-char (match-end 0)) (setq mew-input-folder-search-match (mew-buffer-substring (save-excursion (beginning-of-line) (point)) (save-excursion (end-of-line) (point))))) (setq no-match t) (goto-char pos))) (if no-match (mew-input-folder-display "no match") (mew-input-folder-display)))) (defun mew-input-folder-search-backward () "Search a folder backward." (interactive) (cond ((and mew-input-folder-search-direction (null mew-input-folder-search-key)) (mew-input-folder-display "no match")) ((eq mew-input-folder-search-direction 'forward) (setq mew-input-folder-search-direction 'backward) (mew-input-folder-search-backward-1 'again)) ((eq mew-input-folder-search-direction 'backward) (mew-input-folder-search-backward-1 'again)) (t (setq mew-input-folder-search-direction 'backward) (mew-input-folder-search-setup)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folder commands ;;; (defun mew-input-folder-exit-minibuffer () "If called in folder search, this gets back to minibuffer to input folders. If called in minibuffer to input folders, this gets out of minibuffer." (interactive) (if mew-input-folder-search-direction (mew-elet (delete-region (mew-minibuf-point-min) (point-max)) (cond (mew-input-folder-search-match (when mew-input-folder-search-point (insert (substring mew-input-folder-search-original 0 mew-input-folder-search-point))) (insert mew-input-folder-search-match)) (mew-input-folder-search-original (insert mew-input-folder-search-original))) (mew-input-folder-clean-up) (mew-complete-window-delete)) (exit-minibuffer))) (defun mew-input-folder-abort-minibuffer () "This function exits folder search mode if in folder search mode. Otherwise, it exits minibuffer." (interactive) (if mew-input-folder-search-direction (mew-elet (delete-region (mew-minibuf-point-min) (point-max)) (when mew-input-folder-search-original (insert mew-input-folder-search-original)) (mew-input-folder-clean-up) (mew-complete-window-delete)) (abort-recursive-edit))) (defun mew-input-folder-comma () "This function inserts ',' on multiple folder input and does not insert anything on single folder input." (interactive) (unless mew-input-folder-search-direction (insert ","))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Self insert ;;; (defun mew-input-folder-self-insert () "This function normally inserts its bound key to minibuffer. When in folder search mode, this function searches a candidate folder and displays it in addition to its bound key." (interactive) (let ((key (this-command-keys)) last-str gfunc) (cond ((stringp key) (setq last-str key) (setq gfunc (lookup-key (current-global-map) key))) ((vectorp key) (setq gfunc (lookup-key (current-global-map) key)) (unless gfunc (setq key (lookup-key function-key-map key)) (cond ((vectorp key) ;; normal Emacs (setq gfunc (lookup-key (current-global-map) key))) ((stringp key) ;; Meadow (setq last-str key) (setq gfunc (lookup-key (current-global-map) key))))))) (if mew-input-folder-search-direction (cond ((or (equal key "\177") (equal key [127]) (equal key 'delete) (equal key 'backspace)) (if (null mew-input-folder-search-key) (mew-input-folder-display "not allowed") (setq mew-input-folder-search-key (substring mew-input-folder-search-key 0 -1)) (when (string= mew-input-folder-search-key "") (setq mew-input-folder-search-key nil) (setq mew-input-folder-search-match nil) (with-current-buffer mew-input-folder-search-buf (cond ((eq mew-input-folder-search-direction 'forward) (goto-char (point-min))) ((eq mew-input-folder-search-direction 'backward) (goto-char (point-max)))))) (mew-input-folder-display))) ((and (symbolp gfunc) (not (string-match "self-insert-command" (symbol-name gfunc)))) (mew-input-folder-display "not allowed")) ((eq mew-input-folder-search-direction 'forward) (setq mew-input-folder-search-key (concat mew-input-folder-search-key last-str)) (mew-input-folder-search-forward-1)) ((eq mew-input-folder-search-direction 'backward) (setq mew-input-folder-search-key (concat mew-input-folder-search-key last-str)) (mew-input-folder-search-backward-1))) (cond ((or (null gfunc) (and (symbolp gfunc) (not (fboundp gfunc)))) ()) ((and (symbolp gfunc) (string-match "self-insert-command" (symbol-name gfunc))) (insert last-command-event)) ((commandp gfunc) (call-interactively gfunc)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Prefix hack ;;; (defun mew-input-folder-complete-case (prefix-char) (when (and mew-use-case-completion (eq mew-input-complete-function 'mew-complete-folder) (mew-folder-remotep (char-to-string prefix-char)) (and mew-case (not (string= mew-case mew-case-default)))) (insert mew-case ":"))) (defun mew-input-folder-prefix () "A function to insert a folder prefix in minibuffer. If the previous character is another folder prefix, it is deleted automatically." (interactive) (cond (mew-input-folder-search-direction (mew-input-folder-self-insert)) ;; ((or (eq mew-input-complete-function 'mew-complete-local-folder) (eq mew-input-complete-function 'mew-complete-imap-folder)) ;; no case, not allow other prefixes. (let* ((pos (- (point) (mew-minibuf-point-min))) (prefix (if (eq mew-input-complete-function 'mew-complete-local-folder) mew-folder-local mew-folder-imap)) (insert-ok (string= (char-to-string last-command-event) prefix))) (cond ((or (= pos 0) (save-excursion (forward-char -1) (looking-at ","))) (if insert-ok (insert prefix))) ((or (and (= pos 1) (save-excursion (forward-char -1) (looking-at "[-+%$]"))) ;; excluding * (save-excursion (forward-char -2) (looking-at ",[-+%$]"))) ;; A wrong prefix might accidentally be here. ;; So, replace it just in case (when insert-ok (forward-char -1) (delete-char 1) (insert prefix))) (t (insert last-command-event))))) (t (let ((pos (- (point) (mew-minibuf-point-min)))) (cond ((or (= pos 0) (save-excursion (forward-char -1) (looking-at ","))) (mew-input-folder-complete-case last-command-event) (insert last-command-event)) ;; ((or (and (= pos 1) (save-excursion (forward-char -1) (looking-at "[-+%$]"))) ;; excluding * (save-excursion (forward-char -2) (looking-at ",[-+%$]"))) (forward-char -1) (delete-char 1) (mew-input-folder-complete-case last-command-event) (insert last-command-event)) ;; ((save-excursion (forward-char -2) (looking-at ":[-+%$*]")) (forward-char -1) (delete-char 1) (when (memq last-command-event '(?+ ?*)) ;; delete case: (delete-region (save-excursion (or (and (search-backward "," nil t) (match-end 0)) (mew-minibuf-point-min))) (point))) (insert last-command-event)) ;; (t (insert last-command-event))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folder ;;; (defun mew-input-folder-check (folders) (let (folder ret) (dolist (case:folder folders) (catch 'continue (if (string-match mew-regex-case case:folder) (progn (setq folder (mew-match-string 2 case:folder)) (if (= (length folder) 0) (throw 'continue nil))) ;; "case:" only (setq folder case:folder)) (if (and (= (length folder) 1) (member folder mew-folder-prefixes)) ;; "prefix" only (throw 'continue nil)) (if (and (mew-folder-popp folder) ;; not $inbox (not (string= mew-pop-inbox-folder folder))) (throw 'continue nil)) (setq case:folder (mew-canonicalize-case-folder case:folder)) (setq ret (cons case:folder ret)))) (setq ret (delete nil ret)) (nreverse ret))) (defun mew-input-local-folder (folder) "Input a local folder from the minibuffer." (mew-input-clear) (mew-input-folder-clean-up) (let* ((default folder) (init (mew-folder-prefix folder)) (mew-input-complete-function 'mew-complete-local-folder) (mew-circular-complete-function 'mew-circular-complete-case:) (ret (read-from-minibuffer (format "Folder name (%s): " default) init mew-input-folder-map nil 'mew-input-folder-hist))) (when (or (string= ret "") (string= ret init)) (setq ret default)) (car (mew-input-folder-check (list ret))))) (defun mew-input-folder (case folder) "Input a folder from the minibuffer." (mew-input-clear) (mew-input-folder-clean-up) (let* ((default (mew-case-folder case folder)) (init (mew-case-folder case (mew-folder-prefix folder))) (mew-input-complete-function 'mew-complete-folder) (mew-circular-complete-function 'mew-circular-complete-case:) ;; mew-inherit-case must be nil (ret (read-from-minibuffer (format "Folder name (%s): " default) init mew-input-folder-map nil 'mew-input-folder-hist)) (new-folder)) (when (or (string= ret "") (string= ret init)) (setq ret default)) ;; mew-input-folder-check requires an IMAP separator, ;; which requires C-uZ. C-uZ needs "g". So, chicken and egg. ;; Skip the check for inbox to avoid the problem. (setq new-folder (mew-case:folder-folder ret)) (if (member new-folder (list mew-inbox-folder mew-pop-inbox-folder mew-imap-inbox-folder mew-nntp-newsgroup)) ret (car (mew-input-folder-check (list ret)))))) (defun mew-input-folders (case:folder) "Input a folder from the minibuffer." (mew-input-clear) (mew-input-folder-clean-up) (let* ((init (mew-canonicalize-case-folder case:folder)) (mew-input-complete-function 'mew-complete-folder) (mew-circular-complete-function 'mew-circular-complete-case:) (mew-input-folder-search-multi t) ;; mew-inherit-case must be nil (ret (read-from-minibuffer "Folder name: " init mew-input-folder-map nil 'mew-input-folder-hist))) (when (string= ret "") (setq ret init)) (setq ret (mapcar 'mew-chop (mew-split ret ?,))) (mew-input-folder-check ret))) (defun mew-input-refile-folder-check (folders proto) (let (folder ret) (dolist (case:folder folders) (catch 'continue ;; If case is specified, just remove it at this moment... (if (string-match mew-regex-case case:folder) (progn (setq folder (mew-match-string 2 case:folder)) (if (= (length folder) 0) (throw 'continue nil))) ;; "case:" only (setq folder case:folder)) (cond ((eq proto 'imap) (unless (mew-folder-imapp folder) (throw 'continue nil))) ((eq proto 'local) (unless (mew-folder-localp folder) (throw 'continue nil)))) (if (and (= (length folder) 1) (member folder mew-folder-prefixes)) ;; "prefix" only (throw 'continue nil)) (setq folder (mew-canonicalize-case-folder folder)) (setq ret (cons folder ret)))) (nreverse ret))) (defun mew-input-refile-folders (folder-list singlep case proto) "Input refile folders from the minibuffer." (mew-input-clear) (mew-input-folder-clean-up) (let ((mew-input-complete-function (if (mew-folder-imapp proto) 'mew-complete-imap-folder 'mew-complete-local-folder)) (mew-inherit-case case) (mew-input-folder-search-multi t) (mew-input-folder-refile t) ;; Emacs 21.1, 21.2 and 21.3 has a bug of inhibit-quit. ;; Set inhibit-quit to nil so that C-g can be used (inhibit-quit nil) default prompt init ret) (cond (singlep (setq default (car folder-list)) (setq init (mew-folder-prefix default)) (if case (setq prompt (format "Folder name <%s:> (%s): " case default)) (setq prompt (format "Folder name (%s): " default)))) (t (if case (setq prompt (format "Folder name <%s:>: " case)) (setq prompt "Folder name: ")) (setq init (mew-join "," folder-list)))) (setq ret (read-from-minibuffer prompt init mew-input-folder-map nil 'mew-input-folder-hist)) (when (and singlep (string= ret init)) (setq ret default)) (setq ret (mapcar 'mew-chop (mew-split ret ?,))) (mew-input-refile-folder-check ret (if (mew-folder-imapp proto) 'imap 'local)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Address ;;; (defvar mew-input-address-hist nil) (defun mew-input-address (prompt &optional default) (mew-input-clear) (let ((mew-input-complete-function 'mew-complete-address) val vals addrs ret) (setq val (read-from-minibuffer (if default (format prompt default) prompt) "" mew-input-map nil 'mew-input-address-hist)) (if (and default (string= val "")) (setq val default)) (setq vals (mapcar 'mew-chop (mew-split-quoted val ?,))) (dolist (val vals) (setq addrs (mew-alias-expand val mew-addrbook-alist 0)) (setq addrs (mapcar 'mew-addrstr-append-domain addrs)) (setq ret (nconc ret addrs))) ret)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Pick pattern ;;; (defvar mew-input-pick-pattern-hist nil) (defun mew-input-pick-pattern (prompt) (mew-input-clear) (let ((mew-input-complete-function 'mew-complete-pick-pattern) (mew-circular-complete-function 'mew-circular-complete-pick-pattern) (keymap (copy-keymap mew-input-map))) (define-key keymap " " nil) (mew-pick-macro-expand-string (read-from-minibuffer (concat prompt " pattern: ") (car mew-pick-pattern-list) keymap nil 'mew-input-pick-pattern-hist)))) (defvar mew-input-pick-command-hist nil) (defun mew-input-pick-command (prog opts) (mew-input-clear) (let ((init (mapconcat 'identity (cons prog opts) " ")) (prompt "Cmd opts pattern: ") input lst cmd opts len pat) (unless (string-match " $" init) (setq init (concat init " "))) (setq input (read-string prompt init 'mew-input-pick-command-hist)) (setq mew-input-pick-command-hist (mew-uniq-list mew-input-pick-command-hist)) (setq lst (mew-split-quoted input mew-sp)) (setq cmd (car lst)) (setq opts (cdr lst)) (setq len (length opts)) (cond ((= len 0) ) ((= len 1) (setq pat (car opts)) (setq opts nil)) (t (setq pat (nth (1- len) opts)) (setcdr (nthcdr (- len 2) opts) nil))) (list cmd opts pat))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sort key ;;; ;;; mew-sort-default-key-alist (defvar mew-input-sort-key-hist nil) (defun mew-input-sort-key-check () (let* ((field:mode (mew-buffer-substring (mew-minibuf-point-min) (point-max))) (mode (car (cdr (mew-split field:mode ?:)))) err) (if mode (unless (member mode mew-sort-modes) (setq err mode))) (if err (progn (mew-temp-minibuffer-message (format " [No match: %s]" err)) nil) t))) (defun mew-input-sort-key (key) (mew-input-clear) (let* ((mew-input-complete-function 'mew-complete-sort-key) (mew-input-exit-minibuffer-function 'mew-input-sort-key-check) (field:mode (read-from-minibuffer (format "Sort by (%s)?: " key) "" mew-input-map nil 'mew-input-sort-key-hist)) field mode) (if (or (null field:mode) (string= field:mode "")) (setq field:mode key)) (setq field (car (mew-split field:mode ?:))) (setq mode (or (car (cdr (mew-split field:mode ?:))) (mew-alist-get-value (assoc field mew-sort-key-alist)) "text")) (list field mode))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Remote file ;;; (defvar mew-input-rfile-hist nil) (defun mew-input-rfile (prompt) ;; prompt="To:" (mew-input-clear) (let ((mew-input-complete-function 'mew-complete-rfile)) (read-from-minibuffer (concat prompt " ") "" mew-input-map nil 'mew-input-rfile-hist))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Range ;;; (defun mew-range-update (folder) (when (get-buffer folder) (with-current-buffer folder (goto-char (point-max)) (if (bobp) mew-range-all ;; buffer is empty. (forward-line -1) (mew-summary-goto-message) (concat (number-to-string (1+ (string-to-number (mew-summary-message-number)))) "-"))))) (defun mew-input-range (folder askp) (let* ((default (or (car (mew-folder-spec folder mew-range-list mew-range-list-string-type mew-range-list-list-type)) mew-range-str-update)) (range default) comp ret) (when askp (setq comp (mapcar 'list mew-input-range-list)) (setq range (completing-read (format "Range (%s): " default) comp nil nil nil nil default))) (cond ((string= range mew-range-str-all) (setq ret (list mew-range-all 'erase))) ((string= range mew-range-str-update) (setq ret (list (mew-range-update folder) nil))) ((string-match "^last:" range) (setq ret (list range 'erase))) ((or (string-match "^[0-9]+$" range) (string-match "^[0-9]+-$" range) (string-match "^-[0-9]+$" range) (string-match "^[0-9]+-[0-9]+$" range)) (setq ret (list range 'erase))) (t (setq ret nil))) ;; a wrong range ret)) (defun mew-input-range-remote (folder) ;; t all ;; nil update ;; n last: ;; 'sync (let* ((default (or (car (mew-folder-spec folder mew-range-list mew-range-list-string-type mew-range-list-list-type)))) (comp (mapcar 'list mew-input-range-remote-list)) (range (completing-read (format "Range (%s): " default) comp nil nil nil nil default))) (cond ((string= range mew-range-str-sync) 'sync) ((string= range mew-range-str-all) t) ((string= range mew-range-str-update) nil) ((string-match "^last:\\([0-9]+\\)$" range) (string-to-number (match-string 1 range))) (t nil)))) ;; update just in case ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Buffer ;;; (defun mew-input-draft-buffer (default) (let* ((regex (mew-folder-regex (file-name-as-directory mew-draft-folder))) (comp (mew-buffer-list regex t))) (if (and (= (length comp) 1) (string= default (car (car comp)))) default (completing-read (format "Buffer (%s): " default) comp nil nil nil nil default)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; File ;;; (defun mew-input-file-name (&optional prompt default) (let ((msg (or prompt "File: ")) (use-dialog-box nil) file) (cond ((null default) (setq file mew-save-dir)) ((mew-folder-absolutep default) (setq file default)) (t (setq file (concat mew-save-dir default)))) (expand-file-name (read-file-name msg file file)))) (defun mew-input-directory-name (&optional default) (let ((dir (expand-file-name (read-file-name "Directory: " default default t)))) (if (file-directory-p dir) dir (mew-warn "%s is not directory" dir) (mew-input-directory-name default)))) (defun mew-convert-to-home-dir (dir) (let* ((chome (file-name-as-directory mew-home)) (ehome (concat "^" (regexp-quote (expand-file-name chome))))) (if (string-match ehome dir) (concat chome (substring dir (match-end 0))) dir))) (defvar mew-summary-previous-directory nil) (defvar mew-draft-previous-directory nil) (defmacro mew-mode-input-file-name (prompt file preservep previous modedir) `(let (dir ret def) (if (and ,file (file-name-absolute-p ,file)) (setq def (mew-convert-to-home-dir ,file)) (if ,preservep (setq dir (or ,previous ,modedir)) (setq dir , modedir)) (setq dir (and dir (file-name-as-directory dir))) (setq def (concat dir ,file))) (setq ret (mew-input-file-name ,prompt def)) (if ,preservep (setq ,previous (file-name-directory (mew-convert-to-home-dir (if (file-directory-p ret) (file-name-as-directory ret) ret))))) (if (and ,file (file-directory-p ret)) (setq ret (expand-file-name (file-name-nondirectory ,file) ret))) ret)) (defun mew-summary-input-file-name (&optional prompt file) (mew-mode-input-file-name prompt file mew-summary-preserve-dir mew-summary-previous-directory mew-save-dir)) (defun mew-draft-input-file-name (&optional prompt file) (mew-mode-input-file-name prompt file mew-draft-preserve-dir mew-draft-previous-directory mew-copy-dir)) (defmacro mew-mode-input-directory-name (preservep previous modedir) `(if ,preservep (let (dir ret) (setq dir (file-name-as-directory (or ,previous ,modedir))) (setq ret (mew-input-directory-name dir)) (setq ,previous (mew-convert-to-home-dir ret)) ret) (mew-input-directory-name default-directory))) (defun mew-summary-input-directory-name () (mew-mode-input-directory-name mew-summary-preserve-dir mew-summary-previous-directory mew-save-dir)) (defun mew-draft-input-directory-name () (mew-mode-input-directory-name mew-draft-preserve-dir mew-draft-previous-directory mew-copy-dir)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; String ;;; (defun mew-input-string (prompt subdir default) (let ((input (read-string (format prompt subdir default) ""))) (if (string= input "") default input))) (defun mew-input-general (prompt alist &optional require-match initial) (let* ((completion-ignore-case t) (question (if initial (format "%s (%s): " prompt initial) (format "(%s): " prompt)))) (completing-read question alist nil require-match nil nil initial))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Type ;;; (defun mew-input-type (prompt filename default type-list) (let ((completion-ignore-case t)) (completing-read (format prompt filename default) (mapcar 'list type-list) nil t "" nil default))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Case ;;; (defun mew-input-case-check () (let ((case (mew-buffer-substring (mew-minibuf-point-min) (point-max))) err) (catch 'nomatch (dolist (cs (mew-split case ?,)) (unless (member cs mew-config-cases) (throw 'nomatch (setq err cs))))) (if err (progn (mew-temp-minibuffer-message (format " [No match: %s]" err)) nil) t))) (defvar mew-input-case-hist nil) (defun mew-input-case (default &optional edit) (mew-input-clear) (unless default (setq default mew-case-default)) (let ((mew-input-complete-function 'mew-complete-case) (mew-circular-complete-function 'mew-circular-complete-case) (mew-input-exit-minibuffer-function 'mew-input-case-check) (mew-input-comma-function 'mew-input-case-check) case ret) (if edit (setq case (read-from-minibuffer "Case value: " default mew-input-map nil 'mew-input-case-hist)) (setq case (read-from-minibuffer (format "Case value (%s): " default) "" mew-input-map nil 'mew-input-case-hist))) (if (string= case "") default (dolist (cs (mew-split case ?,)) (if (member cs mew-config-cases) (setq ret (cons cs ret)))) (mapconcat 'identity (nreverse ret) ",")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Mark ;;; (defun mew-input-mark (&optional msg) (let ((ociea cursor-in-echo-area) char) (unwind-protect (progn (message (or msg "Input mark: ")) (setq cursor-in-echo-area t) (setq char (read-char)) (unless (char-equal char ?\r) (message "%s%c" (or msg "Input mark: ") char))) (setq cursor-in-echo-area ociea)) (cond ((mew-markdb-by-mark char) char) (t (message "Mark %c is not supported" char) nil)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Encoding ;;; (defun mew-input-encoding () (let* ((encoding-list (list mew-b64 mew-qp)) (encoding-alist (mapcar (lambda (x) (list x)) encoding-list)) (prompt (format "Lines are too long. Input encoding (%s): " mew-default-encoding)) (cte (completing-read prompt encoding-alist nil nil nil nil mew-default-encoding))) (setq cte (downcase cte)) (while (not (member cte encoding-list)) (setq prompt (format "'%s' is unknown. Input encoding (%s): " cte mew-default-encoding)) (setq cte (completing-read prompt encoding-alist nil nil nil nil mew-default-encoding)) (setq cte (downcase cte))) cte)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Command ;;; (defun mew-input-command (&optional default) (let ((program (read-string "Command args: " default))) (setq program (mew-split-quoted program mew-sp)) (setq program (delete "" program)) (while (not (mew-which-exec (car program))) (setq program (read-string "Command args: " default)) (setq program (mew-split-quoted program mew-sp)) (setq program (delete "" program))) program)) (provide 'mew-minibuf) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-minibuf.el ends here kazu-yamamoto-Mew-ff9c41b/mew-mule.el000066400000000000000000000122171256455547000176300ustar00rootroot00000000000000;;; mew-mule.el --- Environment of Mule common for Mew ;; Author: Kazu Yamamoto ;; Created: Jul 15, 1998 ;;; Code: ;; ;; Charset ;; (defun mew-charset-m17n () (if (string= mew-charset-m17n mew-utf-8) (if mew-internal-utf-8p mew-utf-8 (if (condition-case nil (require 'un-define) (file-error nil)) mew-utf-8 mew-iso-2022-jp-2)) mew-iso-2022-jp-2)) (defun mew-charset-guess-string (str) (let ((ecsdb (mew-ecsdb-guess-string str))) (if ecsdb (mew-cs-to-charset (mew-ecsdb-get-cs ecsdb)) ;; not hcs, take care (mew-charset-m17n)))) (defun mew-ecsdb-guess-string (str) (with-temp-buffer (insert str) (mew-ecsdb-guess-region (point-min) (point-max)))) (defun mew-charset-guess-region (beg end) "Guess charset for the region." (interactive "r") (let ((ecsdb (mew-ecsdb-guess-region beg end)) ret) (if (null ecsdb) (setq ret (mew-charset-m17n)) (setq ret (mew-cs-to-charset (mew-ecsdb-get-cs ecsdb)))) ;; not hcs (if (mew-called-interactively-p) (message "%s" ret)) ;; for debug ret)) (defun mew-ecsdb-guess-region (beg end) (let* ((tcsl (mew-find-cs-region beg end)) (N (length tcsl)) (alst mew-cs-database-for-encoding) acsl csl ret) (dolist (ecsdb alst) (setq acsl (mew-ecsdb-get-lcs ecsdb)) (catch 'loop (dotimes (i N) (unless (member (nth i tcsl) acsl) (setq ecsdb nil) (setq acsl nil) (throw 'loop nil)))) (if (null ret) (setq ret ecsdb) (if (and acsl (< (length acsl) (length csl))) (setq ret ecsdb csl acsl)))) ret)) (autoload 'mew-zenkaku-katakana-region "mew-lang-jp" nil) (autoload 'mew-latin0-region "mew-lang-latin" nil) (defun mew-charset-sanity-check (beg end) "Eliminate invalid characters" (interactive "r") (let ((lcs (mew-find-cs-region beg end))) (cond ((member mew-lc-kana lcs) (mew-zenkaku-katakana-region beg end)) ((and (not (fboundp 'set-charset-priority)) (memq 'latin-iso8859-1 lcs) (memq 'latin-iso8859-15 lcs)) ;; xxx (mew-latin0-region beg end))))) ;;; ;;; ;;; (defun mew-file-guess-coding-system (file) (with-temp-buffer (kill-local-variable 'find-file-literally) (set-buffer-multibyte t) (insert-file-contents file nil 0 1024) buffer-file-coding-system)) (defun mew-cs-strip-lineinfo (cs) (let ((str (symbol-name cs))) (if (string-match "-\\(unix\\|mac\\|dos\\)$" str) (intern (substring str 0 (match-beginning 0))) cs))) ;;; ;;; ;;; (defun mew-coding-system-equal (cs1 cs2) ;; Emacs 22 causes an error if cs is not defined. (condition-case nil (coding-system-equal cs1 cs2) (error nil))) (defun mew-cs-to-charset (cs) (let ((dcsdb (mew-assoc-equal cs mew-cs-database-for-decoding 1 'mew-coding-system-equal))) (if (null dcsdb) (mew-charset-m17n) (mew-dcsdb-get-charset dcsdb)))) (defun mew-charset-to-cs (charset) (when charset (let ((dcsdb (assoc (downcase charset) mew-cs-database-for-decoding))) (if (null dcsdb) mew-cs-unknown (mew-dcsdb-get-cs dcsdb))))) (defun mew-charset-to-ecsdb (charset) (mew-assoc-equal (mew-charset-to-cs charset) mew-cs-database-for-encoding 1)) (defun mew-charset-to-cte (charset) (mew-ecsdb-get-cte (mew-charset-to-ecsdb charset))) (defun mew-charset-to-delsp (charset) (mew-ecsdb-get-delsp (mew-charset-to-ecsdb charset))) ;; (defvar mew-charset-list (mapcar 'mew-dcsdb-get-charset mew-cs-database-for-decoding)) ;; (defun mew-cs-encode-arg (arg) (let ((cs (mew-ecsdb-cs-for-arg (mew-ecsdb-guess-string arg)))) (if (mew-coding-system-p cs) (mew-cs-encode-string arg cs) arg))) (provide 'mew-mule) ;;; Copyright Notice: ;; Copyright (C) 1998-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-mule.el ends here kazu-yamamoto-Mew-ff9c41b/mew-mule3.el000066400000000000000000000331441256455547000177150ustar00rootroot00000000000000;;; mew-mule3.el --- Environment of Mule version 3 for Mew ;; Author: Kazu Yamamoto ;; Created: Mar 20, 1997 ;;; Code: (eval-when-compile (mew-no-warning-defun charset-priority-list)) ;; must be here (if (fboundp 'find-coding-system) (defun mew-coding-system-p (cs) (if (null cs) t (find-coding-system cs))) (defun mew-coding-system-p (cs) (if (null cs) t (coding-system-p cs)))) ;; In the context of Mew, 'charset' means MIME charset. ;; 'cs' means the internal representation of Emacs (was known as Mule). ;; ;; User CS definitions ;; ;; iso-2022-7bit-ss2 is iso-2022-jp-2 (define-coding-system-alias 'mew-cs-text 'raw-text) (define-coding-system-alias 'mew-cs-text-lf 'raw-text-unix) (define-coding-system-alias 'mew-cs-text-crlf 'raw-text-dos) (define-coding-system-alias 'mew-cs-text-cr 'raw-text-mac) (define-coding-system-alias 'mew-cs-text-net 'raw-text-dos) (defun mew-cs-raw-p (cs) (memq cs '(raw-text raw-text-unix raw-text-dos raw-text-mac))) (defvar mew-cs-dummy 'binary) (defvar mew-cs-binary 'binary) (defvar mew-cs-text-for-read 'mew-cs-text) (defvar mew-cs-text-for-write 'mew-cs-text-lf) (defvar mew-cs-text-for-net 'mew-cs-text-net) (defvar mew-cs-autoconv 'undecided) ;; xxx should be utf-8-unix someday. (defvar mew-cs-m17n (if (mew-coding-system-p 'ctext-unix) 'ctext-unix 'ctext)) (defvar mew-cs-utf-16be (cond ((mew-coding-system-p 'utf-16-be-no-signature) 'utf-16-be-no-signature) ((mew-coding-system-p 'utf-16be) 'utf-16be) (t nil))) (defvar mew-cs-eol "\n") (defun mew-eol-fix-for-read () ()) (defun mew-eol-fix-for-write () ()) ;; Latin 0 -- Nickname of Latin 9 ;; Latin 1 -- ISO-8859-1 West European ;; Latin 2 -- ISO-8859-2 East European ;; Latin 3 -- ISO-8859-3 South European ;; Latin 4 -- ISO-8859-4 North European ;; Latin 5 -- ISO-8859-9 Turkish ;; Latin 6 -- ISO-8859-10 Nordic ;; Latin 7 -- ISO-8859-13 Baltic Rim ;; Latin 8 -- ISO-8859-14 Celtic ;; Latin 9 -- ISO-5589-15 New West European ;; ISO-8859-1 -- Latin 1 West European ;; ISO-8859-2 -- Latin 2 East European ;; ISO-8859-3 -- Latin 3 South European ;; ISO-8859-4 -- Latin 4 North European ;; ISO-8859-5 -- Cyrillic ;; ISO-8859-6 -- Arabic ;; ISO-8859-7 -- Greek ;; ISO-8859-8 -- Hebrew ;; ISO-8859-9 -- Latin 5 Turkish ;; ISO-8859-10 -- Latin 6 Nordic ;; ISO-8859-11 -- Thai ;; ISO-8859-12 -- ;; ISO-8859-13 -- Latin 7 Baltic Rim ;; ISO-8859-14 -- Latin 8 Celtic ;; ISO-8859-15 -- Latin 9 New West European (or Latin 0) (defvar mew-charset-utf-8-encoding "base64") (defvar mew-charset-utf-8-header-encoding "B") (mew-defstruct ecsdb lcs cs cte b-or-q delsp) (defun mew-ecsdb-hcs (ecsdb) (mew-ecsdb-get-cs ecsdb)) (defvar mew-cs-database-for-encoding `(((ascii) nil "7bit" "7bit" nil) ;; West European (Latin 1) ((ascii latin-iso8859-1) iso-8859-1 "quoted-printable" "Q" nil) ;; East European (Latin 2) ((ascii latin-iso8859-2) iso-8859-2 "quoted-printable" "Q" nil) ;; South European (Latin 3) ((ascii latin-iso8859-3) iso-8859-3 "quoted-printable" "Q" nil) ;; North European (Latin 4) ((ascii latin-iso8859-4) iso-8859-4 "quoted-printable" "Q" nil) ;; Cyrillic ((ascii cyrillic-iso8859-5) koi8-r "quoted-printable" "Q" nil) ;; Arabic ((ascii arabic-iso8859-6) iso-8859-6 "base64" "B" t) ;; Greek ((ascii greek-iso8859-7) iso-8859-7 "base64" "B" t) ;; Hebrew ((ascii hebrew-iso8859-8) iso-8859-8 "base64" "B" t) ;; Turkish (Latin 5) ((ascii latin-iso8859-9) iso-8859-9 "quoted-printable" "Q" nil) ;; Celtic (Latin 8) ((ascii latin-iso8859-14) iso-8859-14 "quoted-printable" "Q" nil) ;; xxx ;; New West European (Latin 9 or Latin 0) ((ascii latin-iso8859-15) iso-8859-15 "quoted-printable" "Q" nil) ((ascii thai-tis620) tis-620 "base64" "B" t) ((ascii latin-jisx0201 japanese-jisx0208 japanese-jisx0208-1978) iso-2022-jp "7bit" "B" t) ((ascii korean-ksc5601) euc-kr "8bit" "B" t) ((ascii chinese-gbk) gbk "base64" "B" t) ((ascii chinese-gb2312) cn-gb-2312 "base64" "B" t) ((ascii chinese-big5-1 chinese-big5-2) chinese-big5 "base64" "B" t) ;; ((ascii japanese-jisx0208 japanese-jisx0213-1 japanese-jisx0213-2) ;; iso-2022-jp-3 "7bit" "B" t) (nil utf-7 "7bit" "Q" t) ;; xxx (nil utf-8 ,mew-charset-utf-8-encoding ,mew-charset-utf-8-header-encoding t) (nil iso-2022-jp-2 "7bit" "B" t))) (defvar mew-cs-database-for-arg '((iso-2022-jp . euc-jp) (iso-2022-kr . euc-kr))) (defun mew-ecsdb-cs-for-arg (ecsdb) (let* ((cs (mew-ecsdb-get-cs ecsdb)) (acs (cdr (assoc cs mew-cs-database-for-arg)))) (or acs cs))) (if (and (not (mew-coding-system-p 'chinese-big5)) (mew-coding-system-p 'big5)) (define-coding-system-alias 'chinese-big5 'big5)) (mew-defstruct dcsdb charset cs) (defvar mew-cs-database-for-decoding `(("us-ascii" nil) ("iso-8859-1" iso-8859-1) ("iso-8859-2" iso-8859-2) ("iso-8859-3" iso-8859-3) ("iso-8859-4" iso-8859-4) ("iso-8859-5" iso-8859-5) ("iso-8859-6" iso-8859-6) ("iso-8859-7" iso-8859-7) ("iso-8859-8" iso-8859-8) ("iso-8859-8-i" iso-8859-8) ;; temporary solution ("iso-8859-9" iso-8859-9) ("iso-8859-15" iso-8859-15) ("iso-2022-cn" iso-2022-cn) ("iso-2022-cn-ext" iso-2022-cn-ext) ("gbk" gbk) ("gb2312" cn-gb-2312) ;; should be before cn-gb ("cn-gb" cn-gb-2312) ("hz-gb-2312" hz-gb-2312) ("big5" chinese-big5) ("cn-big5" chinese-big5) ("iso-2022-kr" iso-2022-kr) ("euc-kr" euc-kr) ("ks_c_5601-1987" euc-kr) ("iso-2022-jp" iso-2022-jp) ("iso-2022-jp-2" iso-2022-jp-2) ("iso-2022-jp-3" iso-2022-jp-3) ("euc-jp" euc-japan) ("shift_jis" shift_jis) ("windows-31j" cp932) ("tis-620" tis-620) ("koi8-r" koi8-r) ("iso-2022-int-1" iso-2022-int-1) ("utf-7" utf-7) ("unicode-1-1-utf-7" utf-7) ;; the old UTF-7 name, RFC 1642 ("utf-8" utf-8) ,@(if (mew-coding-system-p 'windows-1251) '(("windows-1250" windows-1250) ("windows-1251" windows-1251) ("windows-1252" windows-1252) ("windows-1253" windows-1253) ("windows-1254" windows-1254) ("windows-1255" windows-1255) ("windows-1256" windows-1256) ("windows-1257" windows-1257) ("windows-1258" windows-1258)) '(("windows-1250" cp1250) ("windows-1251" cp1251) ("windows-1252" cp1252) ("windows-1253" cp1253) ("windows-1254" cp1254) ("windows-1255" cp1255) ("windows-1256" cp1256) ("windows-1257" cp1257) ("windows-1258" cp1258))))) ;; ;; CS ;; (defvar mew-charset-priority-list '(japanese-jisx0208 korean-ksc5601 latin-iso8859-2 latin-iso8859-3 latin-iso8859-4 hebrew-iso8859-8 latin-iso8859-9 ;; for accent characters cyrillic-iso8859-5 greek-iso8859-7 latin-iso8859-14 thai-tis620 latin-jisx0201 japanese-jisx0208-1978 japanese-jisx0213-1 japanese-jisx0213-2 katakana-jisx0201 unicode)) (if (fboundp 'set-charset-priority) (defun mew-find-cs-region (beg end) (let ((charset-list (charset-priority-list)) ret) (catch 'find (set-charset-priority 'latin-iso8859-1) (setq ret (find-charset-region beg end)) (if (equal ret '(ascii latin-iso8859-1)) (throw 'find nil)) ;; (set-charset-priority 'latin-iso8859-15) (setq ret (find-charset-region beg end)) (if (equal ret '(ascii latin-iso8859-15)) (throw 'find nil)) ;; (set-charset-priority 'cyrillic-iso8859-5) (setq ret (find-charset-region beg end)) (if (equal ret '(ascii cyrillic-iso8859-5)) (throw 'find nil)) ;; (set-charset-priority 'greek-iso8859-7) (setq ret (find-charset-region beg end)) (if (equal ret '(ascii greek-iso8859-7)) (throw 'find nil)) ;; (apply 'set-charset-priority mew-charset-priority-list) (setq ret (find-charset-region beg end))) (apply 'set-charset-priority charset-list) ret)) (defalias 'mew-find-cs-region 'find-charset-region)) ;; to internal (defun mew-cs-decode-region (beg end cs) (if cs (decode-coding-region beg end cs))) ;; to external (defun mew-cs-encode-region (beg end cs) (if cs (encode-coding-region beg end cs))) ;; to internal (defun mew-cs-decode-string (str cs) (if cs (decode-coding-string str cs) str)) ;; to external (defun mew-cs-encode-string (str cs) (if cs (encode-coding-string str cs) str)) ;; ;; Process environment ;; (defun mew-set-process-cs (process read write) (set-process-coding-system process read write)) (defun mew-set-buffer-cs (write) (setq buffer-file-coding-system write)) (defmacro mew-plet (&rest body) `(let ((coding-system-for-read 'binary) (coding-system-for-write 'binary)) ,@body)) (defmacro mew-piolet (read write &rest body) ;; (declare (indent 2)) `(let ((coding-system-for-read ,read) (coding-system-for-write ,write)) ,@body)) (put 'mew-piolet 'lisp-indent-function 2) (defmacro mew-flet (&rest body) `(let ((coding-system-for-read 'binary) (coding-system-for-write 'binary) (format-alist nil) (auto-image-file-mode nil) (jka-compr-inhibit t)) ,@body)) (defmacro mew-frwlet (read write &rest body) ;; (declare (indent 2)) `(let ((coding-system-for-read ,read) (coding-system-for-write ,write) (format-alist nil) (auto-image-file-mode nil) (jka-compr-inhibit t)) ,@body)) (put 'mew-frwlet 'lisp-indent-function 2) (defmacro mew-alet (&rest body) `(let ((default-file-name-coding-system nil) (file-name-coding-system nil)) ,@body)) ;; ;; ;; (defun mew-substring (str width &optional cnt nopad) (let ((sw (if (null str) 0 (string-width str))) (i 0) (w 0) cw wid) (condition-case nil (cond ((= sw width) str) ((< sw width) (if nopad str (concat str (make-string (- width sw) mew-sp)))) (t (if cnt (setq width (- width 2))) (catch 'loop (while t (setq cw (char-width (aref str i))) (if (get-text-property i 'composition str) ;; for Emacs 21 (setq i (1+ i))) (if (> (+ w cw) width) (throw 'loop t)) (setq w (+ w cw)) (setq i (+ i 1)))) (cond ((= w width) (if cnt (concat (substring str 0 i) "..") (substring str 0 i))) (t (setq wid (- width w)) (if cnt (concat (substring str 0 i) (make-string wid mew-sp) "..") (concat (substring str 0 i) (make-string wid mew-sp))))))) (error (if (> (length mew-error-broken-string) width) (substring mew-error-broken-string 0 width) mew-error-broken-string))))) ;; ;; Language specific ;; (defvar mew-lc-kana 'katakana-jisx0201) (defvar mew-lc-jp 'japanese-jisx0208) ;; ;; Stolen from mule-cmd.el ;; (defun mew-coding-category-list () coding-category-list) (defun mew-coding-category-system (cat) (eval cat)) (defun mew-reset-coding-systems (priority categories) (let ((rest-ctgs categories)) (dolist (pri priority) (set (car rest-ctgs) pri) (setq rest-ctgs (cdr rest-ctgs))) (if (fboundp 'update-coding-systems-internal) (update-coding-systems-internal)) (mew-set-coding-priority categories))) (defun mew-set-language-environment-coding-systems (language-name) (let ((priority (get-language-info language-name 'coding-priority))) (when priority (let* ((categories (mapcar 'coding-system-category priority)) (orig-ctg (mew-coding-category-list)) (orig-pri (mapcar 'mew-coding-category-system orig-ctg))) (mew-reset-coding-systems priority categories) (cons orig-pri orig-ctg))))) ;; ;; ;; (require 'mew-mule) (provide 'mew-mule3) ;;; Copyright Notice: ;; Copyright (C) 1997-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-mule3.el ends here kazu-yamamoto-Mew-ff9c41b/mew-net.el000066400000000000000000000732631256455547000174640ustar00rootroot00000000000000;;; mew-net.el ;; Author: Kazu Yamamoto ;; Created: Feb 27, 2002 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Port DB ;;; (defvar mew-port-db '(("smtp" 25) ;; This is officially assigned to another service (urd) by IANA. ;; IESG will never assign a port number to SMTP over SSL... ("smtps" 465) ("pop3" 110) ("pop3s" 995) ("nntp" 119) ("nntps" 563) ("imap" 143) ("imaps" 993) ("submission" 587))) (defun mew-serv-to-port (serv) (cond ((integerp serv) serv) ((string-match "^[0-9]+$" serv) (string-to-number serv)) (t (or (mew-alist-get-value (assoc serv mew-port-db)) 0)))) (defun mew-*-to-port (port) (cond ((integerp port) port) ((string-match "^[0-9]+$" port) (string-to-number port)) (t port))) (defun mew-*-to-string (any) (cond ((integerp any) (number-to-string any)) (t any))) (defun mew-port-equal (port1 port2) (string= (mew-*-to-string port1) (mew-*-to-string port2))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Net folders ;;; (defvar mew-pop-folder "+#pop/%s@%s#%s") (defvar mew-imap-folder "+#imap/%s@%s#%s") (defvar mew-nntp-folder "+#nntp/%s@%s#%s") (defun mew-pop-folder (&optional case) (format mew-pop-folder (mew-pop-user case) (mew-pop-server case) (mew-pop-port case))) (defun mew-imap-folder (&optional case) (format mew-imap-folder (mew-imap-user case) (mew-imap-server case) (mew-imap-port case))) (defun mew-nntp-folder (&optional case) (format mew-nntp-folder (or (mew-nntp-user case) "") ;; a user may be nil (mew-nntp-server case) (mew-nntp-port case))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Net status ;;; (defun mew-summary-lock (key status &optional secure) (setq mew-summary-buffer-process key) (setq mew-summary-buffer-process-status (format " %s" status)) (setq mew-summary-buffer-secure-process secure)) (defun mew-summary-unlock () (setq mew-summary-buffer-process nil) (setq mew-summary-buffer-process-status nil) (setq mew-summary-buffer-secure-process nil) (force-mode-line-update)) (defun mew-net-status-clear (buf) (when (and mew-use-net-status buf (get-buffer buf)) (with-current-buffer buf (setq mew-summary-buffer-process-status nil) (setq mew-summary-buffer-secure-process nil)))) (defun mew-net-status (buf status &optional substatus secure) (when mew-use-net-status (with-current-buffer buf (if substatus (setq mew-summary-buffer-process-status (format " %s:%s" status substatus)) (setq mew-summary-buffer-process-status (format " %s" status))) (setq mew-summary-buffer-secure-process secure)))) (defun mew-net-status1 (buf msg ttl cnt &optional secure) (when mew-use-net-status (when (<= cnt ttl) (let ((substatus (format "%02d%%" (/ (* cnt 100) ttl)))) (mew-net-status buf msg substatus secure))))) (defvar mew-net-status-percent-size 51200) (defun mew-net-status2 (buf rttl rcnt siz &optional zero secure) (when mew-use-net-status (when (<= rcnt rttl) (let ((msiz (string-to-number siz)) (bsiz (if zero 0 (buffer-size))) percent substatus) (if (and (integerp mew-net-status-percent-size) (< msiz mew-net-status-percent-size)) (progn (setq substatus (format "%d/%d" rcnt rttl)) (mew-net-status buf "Retrieving" substatus secure)) (if (= msiz 0) (setq msiz 1)) (if (< 10000 msiz) (setq percent (/ bsiz (/ msiz 100))) (setq percent (/ (* bsiz 100) msiz))) (setq substatus (format "%d/%d:%02d%%" rcnt rttl percent)) (mew-net-status buf "Retrieving" substatus secure)))))) (defvar mew-local-status-unit 10) (defvar mew-local-status-threshold 100) (defun mew-net-status3 (buf rttl rcnt) (when mew-use-net-status (if rttl (if (or (not (integerp mew-local-status-unit)) (not (integerp mew-local-status-threshold)) (< (- rttl rcnt) mew-local-status-threshold) (= 0 (% rcnt mew-local-status-unit))) (mew-net-status buf "Scanning" (format "%d/%d" rcnt rttl))) (mew-net-status buf "Scanning" (format "%d" rcnt))))) (defun mew-summary-visible-buffer (buf) (with-current-buffer buf (mew-elet (put-text-property (point-min) (point-max) 'invisible nil)) (setq mew-summary-buffer-raw t) (if (eq (get-buffer-window buf) (selected-window)) (mew-summary-cook-window)) (set-buffer-modified-p nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Biff ;;; (defvar mew-biff-string nil) (defvar mew-biff-timer-id nil) (defun mew-biff-bark (n) (if (= n 0) (setq mew-biff-string nil) (if (and mew-use-biff-bell (eq mew-biff-string nil)) (beep)) (setq mew-biff-string (format "Mail(%d)" n)))) (defun mew-biff-clear () (setq mew-biff-string nil)) (defun mew-biff-setup () (let ((inbox (mew-proto-inbox-folder nil mew-case)) func) (if (not mew-use-biff) (mew-biff-clean-up) (if mew-biff-timer-id (cancel-timer mew-biff-timer-id)) (cond ((mew-folder-localp inbox) (setq func 'mew-pop-biff)) ((mew-folder-popp inbox) (setq func 'mew-pop-biff)) ((mew-folder-imapp inbox) (setq func 'mew-imap-biff))) (if func (setq mew-biff-timer-id (mew-timer (* 60 mew-biff-interval) func))))) (let ((ent '(mew-biff-string mew-biff-string))) (unless (member ent global-mode-string) (if global-mode-string (setq global-mode-string (append global-mode-string (list "" ent))) (setq global-mode-string (list ent)))))) (defun mew-biff-clean-up () (if mew-biff-timer-id (cancel-timer mew-biff-timer-id)) (setq mew-biff-timer-id nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Keep time ;;; (defun mew-time-diff (t1 t2) (/ (+ (* (- (nth 0 t2) (nth 0 t1)) 65536) (- (nth 1 t2) (nth 1 t1))) 86400.0)) ;; one day (* 60 60 24) (defun mew-expired-p (time keep) (cond ((and (consp keep) (stringp (nth 0 keep)) (file-exists-p (nth 0 keep)) (integerp (nth 1 keep))) (if (>= (mew-time-diff time (mew-file-get-time (nth 0 keep))) (nth 1 keep)) t)) ((integerp keep) (if (>= (mew-time-diff time (current-time)) keep) t)) ;; ((eq keep t) t) ;; This case MUST not be included because messages marked with 'T' ;; will be deleted. (t nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; UIDL ;;; (defvar mew-net-uidl-file ".mew-uidl") (defvar mew-net-uidl-db nil) (defun mew-net-uidl-db-get (tag) (cdr (assoc tag mew-net-uidl-db))) (defun mew-net-uidl-db-set (tag uidl) (let* ((ent (assoc tag mew-net-uidl-db))) (if ent (setcdr ent uidl) (setq mew-net-uidl-db (cons (cons tag uidl) mew-net-uidl-db))) (mew-lisp-save mew-net-uidl-file mew-net-uidl-db nil 'unlimit))) (defun mew-net-setup () (setq mew-net-uidl-db (mew-lisp-load mew-net-uidl-file)) (add-hook 'kill-emacs-hook 'mew-net-clean-up)) (defun mew-net-clean-up () (remove-hook 'kill-emacs-hook 'mew-net-clean-up) (mew-lisp-save mew-net-uidl-file mew-net-uidl-db nil 'unlimit)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; New message ;;; (defun mew-net-get-new-message (pnm bnm msg get set) (if msg (cons msg (mew-expand-msg bnm msg)) ;; 'get (let ((msg (funcall get pnm)) file nxt) (cond (msg (setq nxt (number-to-string (1+ (string-to-number msg)))) (funcall set pnm nxt) (setq file (mew-expand-new-msg bnm msg))) (t (setq file (mew-folder-new-message bnm)) ;; 1.eml => 1 (setq msg (file-name-sans-extension (file-name-nondirectory file))) (setq nxt (number-to-string (1+ (string-to-number msg)))) (funcall set pnm nxt))) (cons msg file)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Queue ;;; (defun mew-queue-check-new-message (file) (if (not (file-exists-p (concat file mew-queue-work-suffix))) file (let* ((dir (file-name-directory file)) ;; 1.eml => 1 (num (file-name-sans-extension (file-name-nondirectory file))) (n (1+ (string-to-number num)))) (while (or (file-exists-p (format "%s%d" dir n)) (file-exists-p (format "%s%d%s" dir n mew-queue-work-suffix))) (setq n (1+ n))) (format "%s%d" dir n)))) (defun mew-queue-enqueue (work qfld) ;; 1.wrk or draft/1 (let (orig info iwrk) (if (not (string-match (concat mew-queue-work-suffix "$") work)) ;; draft/1 (setq orig (mew-queue-check-new-message (mew-folder-new-message qfld))) ;; 1.wrk (setq orig (file-name-sans-extension work)) ;; 1 (setq iwrk (concat orig mew-queue-info-suffix mew-queue-work-suffix)) (mew-delete-file iwrk) ;; 1.mqi.wrk (if (file-exists-p orig) (setq orig (mew-queue-check-new-message (mew-folder-new-message qfld))))) (rename-file work orig) ;; An error is signaled if orig exists. (unless mew-use-nfs-hack ;; This cause an error when using NFS. (mew-set-file-modes orig)) (setq info (concat orig mew-queue-info-suffix)) (list orig info))) (defun mew-queue-enqueue2 (work) ;; 1.wrk (let* ((dir (file-name-directory work)) (orig (file-name-sans-extension work)) ;; 1 (info (concat orig mew-imapq-info-suffix)) ;; 1.iqi (iwrk (concat info mew-queue-work-suffix))) ;; 1.iqi.wrk (when (file-exists-p orig) (setq orig (mew-queue-check-new-message (mew-folder-new-message dir))) (setq info (concat orig mew-imapq-info-suffix))) (rename-file work orig) ;; An error is signaled if orig exists. (rename-file iwrk info 'override))) (defun mew-queue-insert-file (pnm n qfld msg) ;; 1 (let* ((file (mew-expand-new-msg qfld msg)) (work (concat file mew-queue-work-suffix)) ;; 1.wrk (info (concat file mew-queue-info-suffix)) ;; 1.mqi (iwrk (concat info mew-queue-work-suffix)) ;; 1.mqi.wrk buf data) (when (and (file-readable-p file) (file-readable-p info)) (rename-file file work 'override) ;; If an old buffer exists by accident, we MUST remove the buffer. (if (setq buf (get-file-buffer work)) (mew-remove-buffer buf)) (mew-frwlet mew-cs-text-for-read mew-cs-dummy (set-buffer (mew-find-file-noselect work))) (setq data (mew-lisp-load info)) (dotimes (i n) (aset (mew-info pnm) i (aref data i))) (rename-file info iwrk 'override) t))) (defun mew-queue-get-next (pnm qfld msgs n func) (let (flushp) (catch 'loop (dolist (msg msgs) (if (mew-queue-insert-file pnm n qfld msg) (throw 'loop (setq flushp t))))) (if (fboundp func) (funcall func pnm msgs)) ;; set-messages flushp)) (defun mew-queue-backup (work info-suffix) ;; 1.wrk (let* ((orig (file-name-sans-extension work)) ;; 1 (back (mew-prepend-prefix orig mew-backup-prefix)) ;; #1 (info (concat orig info-suffix)) ;; 1.sfx (iwrk (concat info mew-queue-work-suffix)) ;; 1.sfx.wrk (ibck (mew-prepend-prefix info mew-backup-prefix))) ;; #1.sfx (if (file-exists-p work) (rename-file work back 'override)) (if (file-exists-p iwrk) (rename-file iwrk ibck 'override)) back)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Fcc: ;;; (defun mew-net-fcc-message (case fcc file) (let (flds fcc-file link fld imapp) (dolist (fc fcc) (if (mew-folder-imapp fc) (progn (setq flds (cons (mew-folder-imap-to-fcc case fc) flds)) (setq imapp t)) (setq flds (cons fc flds)))) (catch 'loop (while flds ;; cannot use dolist (setq fld (car flds)) (mew-local-folder-check fld) (setq flds (cdr flds)) (setq fcc-file (mew-folder-new-message fld)) (when fcc-file (copy-file file fcc-file) (mew-set-file-modes fcc-file) (mew-touch-folder fld) (throw 'loop nil)))) (dolist (fld flds) (mew-local-folder-check fld) (setq link (mew-folder-new-message fld)) (when link (mew-link fcc-file link) (mew-touch-folder fld))) imapp)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Syncing ;;; (defun mew-net-folder-sync (bnm hlds) (let (uid msg ulks new-hlds) (save-excursion (goto-char (point-min)) (while (not (eobp)) (setq uid (mew-summary-message-uid)) (if (setq new-hlds (member uid hlds)) (progn (setq hlds (cdr new-hlds)) (forward-line)) (setq msg (mew-summary-message-number)) (setq ulks (cons msg ulks)) (mew-mark-kill-line)))) (when ulks (setq ulks (nreverse ulks)) (let ((mew-trash-folder nil)) (mew-mark-exec-delete bnm ulks)) (mew-summary-folder-cache-save)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Cleaning ;;; ;; See also mew-summary-folder-cache-clean. (defun mew-net-folder-clean () (let* ((bnm (mew-summary-folder-name 'ext)) (dir (mew-expand-folder bnm)) (msgs (mew-dir-messages dir mew-regex-message-files3))) (mew-summary-unlink-msgs bnm msgs) (mew-erase-buffer) (setq mew-summary-buffer-raw nil) (mew-summary-folder-cache-save))) (defun mew-net-invalid-cache-start () (save-excursion (goto-char (point-min)) (when (re-search-forward mew-regex-sumsyn-invalid nil t) (beginning-of-line) (point)))) (defun mew-net-invalid-cache-invisible () (let ((beg (mew-net-invalid-cache-start))) (when beg (mew-elet (put-text-property beg (point-max) 'invisible t))))) (defun mew-net-invalid-cache-clean () (let* ((bnm (mew-summary-folder-name 'ext)) (dir (mew-expand-folder bnm)) (msgs (mew-dir-messages dir mew-regex-message-files4))) (mew-summary-unlink-msgs bnm msgs) (mew-mark-kill-invisible) (mew-summary-folder-cache-save))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Retrieving messages ;;; (defun mew-summary-retrieve-gap (folder) (when (mew-summary-folder-dir-newp) (goto-char (point-max)) (let ((range (mew-range-update folder))) (mew-local-retrieve 'scan folder range) (mew-rendezvous mew-summary-buffer-process)))) (defun mew-summary-case-proto () (let (case:folder case proto) (cond ((mew-virtual-for-one-summary) (setq case:folder (mew-summary-physical-folder)) (setq case (or (mew-case:folder-case case:folder) mew-case)) (setq proto (mew-folder-prefix (mew-case:folder-folder case:folder)))) ((mew-virtual-p) (setq case (or mew-case mew-case-default)) (setq proto (mew-proto case))) (t ;; Summary (setq case (or (mew-sinfo-get-case) ;; remote mew-case)) ;; local (setq proto (mew-folder-prefix (mew-sinfo-get-folder))))) (list case proto))) (defun mew-summary-retrieve (&optional no-flush) "In local folders, retrieve messages to +inbox asynchronously according to 'mew-mailbox-type' and 'mew-case'. If 'mew-auto-flush-queue' is non-nil, +queue is flushed. If called with '\\[universal-argument]', +queue is not flushed. In remote folders, visit an inbox folder and scan with 'update." (interactive "P") (let (case proto inbox case:inbox mailbox) (mew-set '(case proto) (mew-summary-case-proto)) (setq inbox (mew-proto-inbox-folder proto case)) (cond ((mew-folder-remotep proto) (setq case:inbox (mew-case-folder case inbox))) (t ;; local (setq case:inbox inbox))) ;; for mew-summary-exchange-point. (mew-sinfo-set-ret-pos (point)) (mew-summary-visit-folder case:inbox) ;; in the inbox (when (mew-summary-exclusive-p) (cond ((mew-folder-remotep inbox) (mew-summary-ls nil 'goend 'update)) (t ;; local ;; (mew-summary-reset) (mew-summary-retrieve-gap inbox) ;; (goto-char (point-max)) (mew-sinfo-set-start-point (point)) (mew-sinfo-set-direction 'down) (setq mailbox (mew-mailbox-type case)) (cond ((eq mailbox 'pop) (mew-pop-retrieve case 'inc inbox (not no-flush))) ((eq mailbox 'imap) (mew-imap-retrieve case 'inc inbox (not no-flush))) ((eq mailbox 'mbox) (mew-mbox-retrieve case 'inc inbox (not no-flush))))))))) (defun mew-summary-scan-boot (proto case) ;; called by mew() (let* ((inbox (mew-proto-inbox-folder proto case)) (case:inbox (mew-case-folder case inbox)) (dir (mew-expand-folder case:inbox)) mailbox) (unless (file-directory-p dir) (mew-make-directory dir)) (mew-summary-switch-to-folder case:inbox) ;; in the inbox ;; for mew-summary-exchange-point. (mew-sinfo-set-ret-pos (point)) (when (mew-summary-exclusive-p) (mew-summary-reset) ;; (if (mew-folder-localp inbox) (mew-summary-retrieve-gap case:inbox)) ;; (goto-char (point-max)) (mew-sinfo-set-start-point (point)) (mew-sinfo-set-direction 'down) (cond ((mew-folder-localp inbox) (setq mailbox (mew-mailbox-type case)) (cond ((eq mailbox 'pop) (mew-pop-retrieve case 'inc inbox)) ((eq mailbox 'imap) (mew-imap-retrieve case 'inc inbox)) ((eq mailbox 'mbox) (mew-mbox-retrieve case 'inc inbox)))) ((mew-folder-popp inbox) (let ((get-body (if (mew-pop-header-only case) nil t))) (mew-pop-retrieve case 'scan case:inbox nil get-body))) ((mew-folder-imapp inbox) (let ((get-body (if (mew-imap-header-only case) nil t))) (mew-imap-retrieve case 'scan case:inbox nil get-body))) ((mew-folder-nntpp inbox) (let ((get-body (if (mew-nntp-header-only case) nil t))) (mew-nntp-retrieve case 'scan case:inbox nil get-body))))))) (defun mew-mbox-retrieve (case directive inbox &optional flush) ;; directive is 'inc (let* ((mbox-command (mew-mbox-command case)) (mbox-command-arg (mew-mbox-command-arg case)) dir mode opts) (if (not (mew-which-exec mbox-command)) (message "'%s' not found!" mbox-command) (if mbox-command-arg (if (not (string= mbox-command "incm")) (setq opts (list "-e" mbox-command "-m" mbox-command-arg)) (setq dir (mew-expand-folder inbox)) (setq mode (mew-get-file-modes dir)) (if mew-use-suffix (setq opts (list "-e" mbox-command "-m" (format "%s -o -p %d" mbox-command-arg mode))) (setq opts (list "-e" mbox-command "-m" (format "%s -p %d" mbox-command-arg mode))))) (setq opts (list "-e" mbox-command))) (mew-local-retrieve 'inc inbox flush opts)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Retrieving truncated messages ;;; (defun mew-summary-get-inherit-case (fld msg) (let ((buf (mew-cache-hit fld msg)) uid) (if buf (with-current-buffer buf (setq uid (mew-header-get-value mew-x-mew-uidl:))) (with-temp-buffer (mew-insert-message fld msg mew-cs-text-for-read mew-header-reasonable-size) (setq uid (mew-header-get-value mew-x-mew-uidl:)))) (mew-scan-uid-case uid))) (mew-defstruct net-virtual-info virtual summary msgs threadp) (defun mew-net-virtual-info (msgs) (mew-make-net-virtual-info :virtual (mew-summary-folder-name 'ext) :summary (mew-summary-folder-name) :msgs msgs :threadp (mew-thread-p))) (mew-defstruct net-disp-info list fid buf fld msg) (defun mew-net-disp-info () (let* ((fid (mew-frame-id)) (buf (current-buffer)) (fld (mew-current-get-fld fid)) (msg (mew-current-get-msg fid)) (disp (mew-sinfo-get-disp-msg))) (if disp (mew-make-net-disp-info :fid fid :buf buf :fld fld :msg msg)))) (defun mew-net-disp-info-display (disp-info) (when disp-info (let ((fid (mew-net-disp-info-get-fid disp-info)) (buf (mew-net-disp-info-get-buf disp-info)) (fld (mew-net-disp-info-get-fld disp-info)) (msg (mew-net-disp-info-get-msg disp-info)) (nfid (mew-frame-id)) m) (when (and (equal fid nfid) (equal fld (mew-current-get-fld nfid))) (with-current-buffer buf (setq m (point-marker)) (set-marker-insertion-type m t) (when (and (mew-sinfo-get-disp-msg) (equal msg (mew-current-get-msg nfid)) (mew-summary-search-msg msg)) ;; The message was truncated probaby because it's too large. (mew-summary-analyze-again)) (goto-char m)))))) (defun mew-summary-retrieve-message (&optional rev-del) "Retrieve the rest of a truncated('T') message. In a LOCAL folder: a method to retrieve the message is determined by 'mew-case' and 'mew-mailbox-type'. If 'mew-pop-delete'/'mew-imap-delete' is non-nil, delete the message from the mailbox. When executed with '\\[universal-argument]', 'mew-pop-delete'/'mew-imap-delete' is considered reversed. In a REMOTE folder: case and protocol are determined by the folder. The message in the server side is always retained." (interactive "P") (mew-pickable (mew-summary-msg (when (mew-sumsyn-match mew-regex-sumsyn-long) (let* ((msg (mew-sumsyn-message-number)) (uid (mew-sumsyn-message-uid)) (siz (mew-sumsyn-message-size)) (bnm (mew-summary-folder-name)) (disp-info (mew-net-disp-info)) (virtual-info (if (mew-virtual-for-one-summary) (mew-net-virtual-info (list msg)))) folder case del rtr rtrs mailbox) (with-current-buffer bnm (when (mew-summary-exclusive-p) (setq folder (mew-sinfo-get-folder)) (setq case (mew-sinfo-get-case)) (when (mew-folder-localp folder) (setq case (or (mew-summary-get-inherit-case folder msg) mew-case)) (setq mailbox (mew-mailbox-type case)) (cond ((eq mailbox 'pop) (setq del (eq (mew-pop-delete case) t))) ;; delete may be number ((eq mailbox 'imap) (setq del (eq (mew-imap-delete case) t)))) ;; delete may be number (if rev-del (setq del (not del)))) (when (and uid (not (string= uid ""))) (setq rtr (mew-make-refileinfo :uid uid :size siz :delete del :folders (list bnm msg))) (setq rtrs (list rtr))) (cond ((not rtrs) (message "No message to be retrieved")) ((not (mew-msg-validp msg)) (message "No valid message to be retrieved")) ((mew-folder-localp folder) (cond ((eq mailbox 'pop) (mew-pop-retrieve case 'get bnm rtrs virtual-info disp-info)) ((eq mailbox 'imap) (mew-imap-retrieve case 'get bnm rtrs virtual-info disp-info)))) ((mew-folder-popp folder) (mew-pop-retrieve case 'get bnm rtrs virtual-info disp-info)) ((mew-folder-imapp folder) (mew-imap-retrieve case 'get bnm rtrs virtual-info disp-info)) ((mew-folder-nntpp folder) (mew-nntp-retrieve case 'get bnm rtrs virtual-info disp-info)))))))))) (defun mew-summary-retrieve-message-for-virtual-summary (msg) (save-excursion (when (mew-summary-search-msg msg) (let ((start (point))) (forward-line) (buffer-substring start (point)))))) (defun mew-summary-retrieve-message-for-virtual-selection (msg str) (save-excursion (when (mew-summary-search-msg msg) (let ((start (point))) (forward-line) (mew-elet (delete-region start (point)) (insert str)))))) (defun mew-summary-retrieve-message-for-virtual-thread (msg str) (save-excursion (when (mew-summary-search-msg msg) (let* ((start (point)) (beg (mew-thread-next-property start)) (level (mew-thread-get-property beg)) (length (* mew-thread-indent-length level)) (end (+ beg length)) (idt-str (buffer-substring beg end))) (forward-line) (mew-elet (delete-region start (point)) (insert str) (goto-char beg) (if (= level 0) (setq end (1+ end))) (insert idt-str) (mew-thread-put-property beg end level)))))) (defun mew-summary-retrieve-message-for-virtual (virtual-info) (let ((virtual (mew-net-virtual-info-get-virtual virtual-info)) (summary (mew-net-virtual-info-get-summary virtual-info)) (msgs (mew-net-virtual-info-get-msgs virtual-info)) (func (if (mew-net-virtual-info-get-threadp virtual-info) 'mew-summary-retrieve-message-for-virtual-thread 'mew-summary-retrieve-message-for-virtual-selection)) str) (save-excursion (dolist (msg msgs) (set-buffer summary) ;; Summary (setq str (mew-summary-retrieve-message-for-virtual-summary msg)) (set-buffer virtual) ;; Virtual (funcall func msg str)) (mew-summary-unlock)))) (defun mew-summary-mark-retrieve-message (&optional rev-del) "Retrieve the rest of truncated('T') messages marked with '*'. In a LOCAL folder: a method to retrieve the messages is determined by 'mew-case' and 'mew-mailbox-type'. If 'mew-pop-delete'/'mew-imap-delete' is non-nil, delete the messages from the mailbox. When executed with '\\[universal-argument]', 'mew-pop-delete'/'mew-imap-delete' is considered reversed. In a REMOTE folder: case and protocol are determined by the folder. The messages in the server side is always retained." (interactive "P") (mew-summary-only (let* ((bnm (mew-summary-folder-name 'ext)) (folder (mew-sinfo-get-folder)) (case (mew-sinfo-get-case)) msg uid siz del rtr rtrs case-rtrs mailbox) (save-excursion (goto-char (point-min)) (if (mew-folder-localp folder) (let (tmp) (while (re-search-forward mew-regex-msg-review nil t) (when (mew-sumsyn-match mew-regex-sumsyn-long) (setq uid (mew-sumsyn-message-uid)) (setq msg (mew-sumsyn-message-number)) (setq siz (mew-sumsyn-message-size)) (setq case (or (mew-summary-get-inherit-case folder msg) mew-case)) (setq mailbox (mew-mailbox-type case)) (when (and (mew-msg-validp msg) (mew-msg-truncatedp siz)) (cond ((eq mailbox 'pop) (setq del (eq (mew-pop-delete case) t))) ;; delete may be number ((eq mailbox 'imap) (setq del (eq (mew-imap-delete case) t)))) ;; delete may be number (if rev-del (setq del (not del))) (setq rtr (mew-make-refileinfo :uid uid :size siz :delete del :folders (list bnm msg))) (if (setq tmp (nth 2 (assoc case case-rtrs))) (nconc tmp (list rtr)) (setq case-rtrs (cons (list case mailbox (list rtr)) case-rtrs)))) (forward-line))) (setq case-rtrs (nreverse case-rtrs))) (while (re-search-forward mew-regex-msg-review nil t) (when (mew-sumsyn-match mew-regex-sumsyn-long) (setq uid (mew-sumsyn-message-uid)) (setq msg (mew-sumsyn-message-number)) (setq siz (mew-sumsyn-message-size)) (when (and (mew-msg-validp msg) (mew-msg-truncatedp siz)) (setq rtr (mew-make-refileinfo :uid uid :size siz :delete del :folders (list bnm msg))) (setq rtrs (cons rtr rtrs)))) (forward-line)) (setq rtrs (nreverse rtrs)))) (if (and (not rtrs) (not case-rtrs)) (message "No message to be retrieved") (cond ((mew-folder-localp folder) (while case-rtrs ;; cannot use dolist (setq case (nth 0 (car case-rtrs))) (setq mailbox (nth 1 (car case-rtrs))) (setq rtrs (nth 2 (car case-rtrs))) (setq case-rtrs (cdr case-rtrs)) (cond ((eq mailbox 'pop) (mew-pop-retrieve case 'get bnm rtrs)) ((eq mailbox 'imap) (mew-imap-retrieve case 'get bnm rtrs))) (when case-rtrs (mew-rendezvous mew-summary-buffer-process)))) ((mew-folder-popp folder) (mew-pop-retrieve case 'get bnm rtrs)) ((mew-folder-imapp folder) (mew-imap-retrieve case 'get bnm rtrs)) ((mew-folder-nntpp folder) (mew-nntp-retrieve case 'get bnm rtrs))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folder clean up ;;; (defun mew-folder-clean-up () (remove-hook 'kill-emacs-hook 'mew-folder-clean-up) (mew-local-folder-clean-up) (mew-imap-folder-clean-up) (mew-nntp-folder-clean-up)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Message packing ;;; (defun mew-net-msg-pack (msgs) ;; (mew-net-msg-pack '("1" "3" "4" "5" "7" "8" "10")) ;; => ("1" "3:5" "7:8" "10") (let (pack a b s) (when (setq a (car msgs)) (setq a (string-to-number a)) (setq msgs (cdr msgs)) (while (setq b (car msgs)) (setq b (string-to-number b)) (setq msgs (cdr msgs)) (if (= (1+ a) b) (if (null s) (setq s a)) (if (null s) (setq pack (cons (format "%d" a) pack)) (setq pack (cons (format "%d:%d" s a) pack)) (setq s nil))) (setq a b)) (if s (setq pack (cons (format "%d:%d" s a) pack)) (setq pack (cons (format "%d" a) pack))) (nreverse pack)))) (defvar mew-imap-message-cat-size 10) (defun mew-net-msg-cat (lst) (let ((N (1- mew-imap-message-cat-size)) (crn lst) prv nxt ret) (while (setq prv (nthcdr N crn)) (setq nxt (cdr prv)) (setcdr prv nil) (setq ret (cons (mew-join "," crn) ret)) (setq crn nxt)) (if crn (setq ret (cons (mew-join "," crn) ret))) (nreverse ret))) (defun mew-net-msg-group (lst) (if (= (length lst) 1) lst ;; "1:*" (mew-net-msg-cat (mew-net-msg-pack lst)))) (provide 'mew-net) ;;; Copyright Notice: ;; Copyright (C) 2002-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-net.el ends here kazu-yamamoto-Mew-ff9c41b/mew-nntp.el000066400000000000000000000624631256455547000176550ustar00rootroot00000000000000;;; mew-nntp.el for reading ;; Author: Kazu Yamamoto ;; Created: Feb 1, 1999 ;;; Code: (require 'mew) (defvar mew-nntp-msgid-file ".mew-msgid") (defvar mew-nntp-folder-alist-file ".mew-folder-alist") (defvar mew-nntp-folder-alist nil) ;; without mew-folder-nntp (defvar mew-nntp-folder-alist2-file ".mew-folder-alist2") (defvar mew-nntp-folder-alist2 nil) (defvar mew-nntp-skip-uidl t) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; NNTP info ;;; (defvar mew-nntp-info-list '("server" "port" "process" "ssh-process" "ssl-process" "status" "directive" "bnm" "mdb" "rtrs" "refs" "range" "rttl" "rcnt" "hlds" "user" "account" "size" "get-body" "no-msg" "case" "msgdb" "done" "dispatched" "error" "max" "newsgroup" "msgid" "truncated" "virtual-info" "disp-info" "status-buf")) (mew-info-defun "mew-nntp-" mew-nntp-info-list) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; FSM ;;; (defvar mew-nntp-fsm '(("greeting" nil ("20[01]" . "mode-reader")) ("mode-reader" nil (t . "authinfo")) ("authinfo" nil ("381" . "authpass")) ("authpass" nil ("281" . "group") (t . "wpwd")) ("group" nil ("211" . "xover")) ("xover" t ("224" . "pre-article")) ("article" t ("22[01]" . "post-article") (t . "next-article")) ("list" t ("215" . "post-list")) ("pre-quit" nil (t . "quit2")) ("quit" nil ("205" . "noop")))) (defun mew-nntp-fsm-by-status (status) (assoc status mew-nntp-fsm)) (defun mew-nntp-fsm-next (status code) (cdr (mew-assoc-match2 code (nthcdr 2 (mew-nntp-fsm-by-status status)) 0))) (defun mew-nntp-fsm-reply (status) (nth 1 (mew-nntp-fsm-by-status status))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filters ;;; (defun mew-nntp-secure-p (pnm) (or (mew-nntp-get-ssh-process pnm) (mew-nntp-get-ssl-process pnm))) (defun mew-nntp-command-mode-reader (pro pnm) (mew-net-status (mew-nntp-get-status-buf pnm) "Connecting" nil (mew-nntp-secure-p pnm)) (mew-nntp-process-send-string pro "MODE READER")) (defun mew-nntp-command-authinfo (pro pnm) (let ((user (mew-nntp-get-user pnm))) (if user (mew-nntp-process-send-string pro "AUTHINFO USER %s" user) (mew-nntp-set-status pnm "group") (mew-nntp-command-group pro pnm)))) (defun mew-nntp-command-authpass (pro pnm) (let* ((prompt (format "NNTP password (%s): " (mew-nntp-get-account pnm))) (pass (mew-nntp-input-passwd prompt pnm))) (mew-nntp-process-send-string pro "AUTHINFO PASS %s" pass))) (defun mew-nntp-command-wpwd (pro pnm) (mew-nntp-message pnm "NNTP password is wrong!") (mew-passwd-set-passwd (mew-nntp-passtag pnm) nil) (mew-nntp-set-status pnm "pre-quit")) (defun mew-nntp-command-group (pro pnm) (let ((directive (mew-nntp-get-directive pnm)) (newsgroup (mew-nntp-get-newsgroup pnm))) (cond ((eq directive 'list) (mew-nntp-set-status pnm "list") (mew-nntp-command-list pro pnm)) (t (mew-nntp-process-send-string pro "GROUP %s" newsgroup))))) (defun mew-nntp-command-xover (pro pnm) (let ((directive (mew-nntp-get-directive pnm)) (refs (mew-nntp-get-refs pnm)) ;; (uid siz del (+fld msg)) (bnm (mew-nntp-get-bnm pnm)) (range (mew-nntp-get-range pnm)) max first last) (if (and mew-nntp-skip-uidl (eq directive 'get)) (mew-nntp-command-dispatch pro pnm directive refs nil) (mew-net-status (mew-nntp-get-status-buf pnm) "Checking" nil (mew-nntp-secure-p pnm)) (cond ((eq directive 'scan) (if (eq range nil) ;; update (setq max (mew-lisp-load (mew-expand-file bnm mew-nntp-msgid-file)))))) ;; 221 total first last newsgroup (xxx) (if (re-search-forward "^[0-9]+ +[0-9]+ +\\([0-9]+\\) +\\([0-9]+\\) +[-.a-zA-Z0-9]+" nil t) (progn (setq first (string-to-number (mew-match-string 1))) (setq last (string-to-number (mew-match-string 2))) (cond ((stringp max) (setq max (string-to-number max))) (max ;; backward compatibility ;; reversed (setq max (car max)) (setq max (string-to-number max))) ((and (eq directive 'scan) (integerp range)) (setq max (- last range)) (if (< max first) (setq max (1- first)))) (t (setq max (1- first)))) (mew-nntp-set-max pnm max) (mew-nntp-process-send-string pro "XOVER %d-" (1+ max))) (mew-nntp-set-status pnm "quit") (mew-nntp-command-quit pro pnm))))) (defun mew-nntp-command-pre-article (pro pnm) (let* ((directive (mew-nntp-get-directive pnm)) (max (mew-nntp-get-max pnm)) (refs (mew-nntp-get-refs pnm)) ;; (uid siz del (+fld msg)) (range (mew-nntp-get-range pnm)) uid siz rtr rtrs hlds) (goto-char (point-min)) ;; num subj from date msg-id ref siz lines (while (re-search-forward "^\\([0-9]+\\)\t[^\t\n]*\t[^\t\n]*\t[^\t\n]*\t<[^>\t\n]+>\t[^\t\n]*\t\\([0-9]*\\)" nil t) (setq uid (mew-match-string 1)) (setq siz (mew-match-string 2)) (if (string= uid "") (setq uid nil)) (cond ((eq directive 'get) (setq rtr (assoc uid refs)) (if rtr (setq rtrs (cons rtr rtrs)))) ((eq directive 'scan) (if (and uid (or range ;; all, last:n (> (string-to-number uid) max))) ;; update (setq rtrs (cons (mew-make-refileinfo :uid uid :size siz) rtrs)))) ((eq directive 'sync) (if uid (setq hlds (cons uid hlds)))))) (mew-nntp-set-msgid pnm (mew-refileinfo-get-uid (car rtrs))) ;; 'scan ;; last:n xxx ;; (when (and (eq directive 'scan) (integerp range)) ;; (mew-ntake range rtrs)) (setq rtrs (nreverse rtrs)) (setq hlds (nreverse hlds)) (mew-nntp-command-dispatch pro pnm directive rtrs hlds))) (defun mew-nntp-command-dispatch (pro pnm directive rtrs hlds) (let ((rttl (length rtrs))) (mew-nntp-set-rtrs pnm rtrs) (mew-nntp-set-rttl pnm rttl) (mew-nntp-set-hlds pnm hlds) (mew-nntp-set-dispatched pnm t) (cond ((eq directive 'sync) (mew-nntp-set-status pnm "quit") (mew-nntp-command-quit pro pnm)) ((= rttl 0) (mew-nntp-message pnm "No new messages") (mew-nntp-set-status pnm "quit") (mew-nntp-command-quit pro pnm)) ((= rttl 1) (mew-nntp-message pnm "Retrieving 1 message in background...") (mew-nntp-set-status pnm "article") (mew-nntp-command-article pro pnm)) (t (mew-nntp-message pnm "Retrieving %d messages in background..." rttl) (mew-nntp-set-status pnm "article") (mew-nntp-command-article pro pnm))))) (defun mew-nntp-command-article (pro pnm) (mew-net-status2 (mew-nntp-get-status-buf pnm) (mew-nntp-get-rttl pnm) (mew-nntp-get-rcnt pnm) (mew-refileinfo-get-size (car (mew-nntp-get-rtrs pnm))) 'zero (mew-nntp-secure-p pnm)) (let* ((directive (mew-nntp-get-directive pnm)) (rtrs (mew-nntp-get-rtrs pnm)) (rtr (car rtrs)) (uid (mew-refileinfo-get-uid rtr)) (siz (mew-refileinfo-get-size rtr)) (lim (mew-nntp-get-size pnm)) (get-body (mew-nntp-get-get-body pnm))) (cond ((or (null rtr) (eq directive 'biff)) (mew-nntp-set-truncated pnm nil) (mew-nntp-set-status pnm "quit") (mew-nntp-command-quit pro pnm)) ((eq directive 'get) (mew-nntp-set-truncated pnm nil) (mew-nntp-process-send-string pro "ARTICLE %s" uid)) ((and (eq directive 'scan) (not get-body)) (mew-nntp-set-truncated pnm t) (mew-nntp-process-send-string pro "HEAD %s" uid)) ((or (= lim 0) (<= (string-to-number siz) lim)) (mew-nntp-set-truncated pnm nil) (mew-nntp-process-send-string pro "ARTICLE %s" uid)) (t (mew-nntp-set-truncated pnm t) (mew-nntp-process-send-string pro "HEAD %s" uid))))) (defun mew-nntp-command-post-article (pro pnm) (let* ((directive (mew-nntp-get-directive pnm)) (width (1- (mew-scan-width))) (rtrs (mew-nntp-get-rtrs pnm)) (rtr (car rtrs)) (uid (mew-refileinfo-get-uid rtr)) (siz (mew-refileinfo-get-size rtr)) (fld-msg (mew-refileinfo-get-folders rtr)) (truncated (mew-nntp-get-truncated pnm)) fld msg vec file msg-file lmsg) (cond ((null fld-msg) (setq fld (mew-nntp-get-bnm pnm))) ((stringp fld-msg) (setq fld fld-msg)) ((listp fld-msg) (mew-set '(fld msg) fld-msg) (setq lmsg msg))) (goto-char (point-min)) (forward-line) (delete-region (point-min) (point)) ;; line delimiters (mew-eol-fix-for-read) (mew-dot-delete) (cond ((eq directive 'scan) (setq msg uid) (setq file (mew-expand-new-msg fld msg))) (t (setq msg-file (mew-net-get-new-message pnm fld msg 'mew-nntp-get-msgdb 'mew-nntp-set-msgdb)) (setq msg (car msg-file) file (cdr msg-file)))) (goto-char (point-min)) (if truncated (mew-header-insert-xmu uid siz t) (mew-header-insert-xmu uid siz nil)) (catch 'write-error (condition-case nil (let ((write-region-inhibit-fsync mew-use-async-write)) (mew-frwlet mew-cs-dummy mew-cs-text-for-write (write-region (point-min) (point-max) file nil 'no-msg))) (error (mew-nntp-set-status pnm "quit") (mew-nntp-command-quit pro pnm) (throw 'write-error nil))) (when (file-exists-p file) (mew-set-file-modes file) (mew-set-file-type file) (mew-set-buffer-multibyte t) (setq vec (mew-scan-header)) (mew-scan-set-folder vec fld) (mew-scan-set-message vec msg) (mew-scan-body vec) (mew-set-buffer-multibyte nil) (mew-scan-insert-line fld vec width lmsg)) (mew-nntp-command-next-article pro pnm)))) (defun mew-nntp-command-next-article (pro pnm) (let* ((rtrs (mew-nntp-get-rtrs pnm))) (mew-nntp-set-rcnt pnm (1+ (mew-nntp-get-rcnt pnm))) (mew-nntp-set-rtrs pnm (cdr rtrs)) (mew-nntp-set-status pnm "article") (mew-nntp-command-article pro pnm))) (defun mew-nntp-command-list (pro pnm) (mew-net-status (mew-nntp-get-status-buf pnm) "Listing" nil (mew-nntp-secure-p pnm)) (mew-nntp-message pnm "Collecting newsgroup list...") (mew-nntp-process-send-string pro "LIST")) (defun mew-nntp-command-post-list (pro pnm) (let ((case (mew-nntp-get-case pnm)) group group2 groups groups2) (goto-char (point-min)) (forward-line) (delete-region (point-min) (point)) ;; line delimiters (mew-eol-fix-for-read) (mew-dot-delete) (while (not (eobp)) (when (looking-at "\\([a-z][^ \t\n]+\\)") (setq group2 (mew-match-string 1)) (setq group (concat mew-folder-nntp group2)) (setq groups (cons (mew-folder-func group) groups)) (setq groups2 (cons (mew-folder-func group2) groups2))) (forward-line)) (if (null case) (setq case mew-case-default)) (setq groups (nreverse groups)) (mew-nntp-folder-save case groups groups2) (mew-nntp-folder-alist-set case groups) (mew-nntp-folder-alist2-set case groups2) (mew-nntp-set-status pnm "quit") (mew-nntp-command-quit pro pnm))) (defun mew-nntp-command-quit (pro pnm) (mew-nntp-set-done pnm t) (mew-nntp-process-send-string pro "QUIT")) (defun mew-nntp-command-quit2 (pro pnm) (mew-nntp-set-done pnm t) (mew-nntp-set-error pnm t) (mew-nntp-set-status pnm "quit") (mew-nntp-process-send-string pro "QUIT")) (defun mew-nntp-command-noop (pro pnm) ()) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sub functions ;;; (defconst mew-nntp-info-prefix "mew-nntp-info-") (defun mew-nntp-info-name (case newsgroup) (let ((server (mew-nntp-server case)) (port (mew-*-to-string (mew-nntp-port case))) (sshsrv (mew-nntp-ssh-server case)) (name mew-nntp-info-prefix)) (setq name (concat name server "/" newsgroup)) (unless (mew-port-equal port mew-nntp-port) (setq name (concat name ":" port))) (if sshsrv (concat name "%" sshsrv) name))) (defun mew-nntp-buffer-name (pnm) (concat mew-buffer-prefix pnm)) (defun mew-nntp-process-send-string (pro &rest args) (let ((str (apply 'format args))) (mew-nntp-debug "=SEND=" str) (if (and (processp pro) (eq (process-status pro) 'open)) (process-send-string pro (concat str mew-cs-eol)) (message "NNTP time out")))) (defun mew-nntp-passtag (pnm) (let ((server (mew-nntp-get-server pnm)) (port (mew-nntp-get-port pnm)) (user (mew-nntp-get-user pnm))) (concat user "@" server ":" port))) (defun mew-nntp-message (pnm &rest args) (or (mew-nntp-get-no-msg pnm) (apply 'message args))) (defun mew-bnm-to-newsgroup (bnm) (mew-folder-string (mew-case:folder-folder bnm))) (defun mew-nntp-input-passwd (prompt pnm) (let* ((tag (mew-nntp-passtag pnm)) (pro (mew-nntp-get-process pnm)) (pass (mew-input-passwd prompt tag))) (unless (and (processp pro) (eq (process-status pro) 'open)) (mew-passwd-set-passwd tag nil)) pass)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Opening NNTP ;;; (defun mew-nntp-open (pnm server port no-msg) (let ((sprt (mew-*-to-port port)) pro tm) (condition-case emsg (progn (setq tm (run-at-time mew-nntp-timeout-time nil 'mew-nntp-timeout)) (or no-msg (message "Connecting to the NNTP server...")) (setq pro (open-network-stream pnm nil server sprt)) (mew-process-silent-exit pro) (mew-set-process-cs pro mew-cs-text-for-net mew-cs-text-for-net) (or no-msg (message "Connecting to the NNTP server...done"))) (quit (or no-msg (message "Cannot connect to the NNTP server")) (setq pro nil)) (error (or no-msg (message "%s, %s" (nth 1 emsg) (nth 2 emsg))) (setq pro nil))) (if tm (cancel-timer tm)) pro)) (defun mew-nntp-timeout () (signal 'quit nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Launcher ;;; (defun mew-nntp-retrieve (case directive bnm &rest args) (let* ((server (mew-nntp-server case)) (user (mew-nntp-user case)) (port (mew-*-to-string (mew-nntp-port case))) (sshsrv (mew-nntp-ssh-server case)) (sslp (mew-nntp-ssl case)) (sslport (mew-nntp-ssl-port case)) (newsgroup (mew-bnm-to-newsgroup bnm)) (pnm (mew-nntp-info-name case newsgroup)) (buf (get-buffer-create (mew-nntp-buffer-name pnm))) (no-msg (eq directive 'biff)) process sshname sshpro sslname sslpro lport tls virtual-info disp-info virtual) (if (mew-nntp-get-process pnm) (message "Another NNTP process is running. Try later") (cond (sshsrv (setq sshpro (mew-open-ssh-stream case server port sshsrv)) (when sshpro (setq sshname (process-name sshpro)) (setq lport (mew-ssh-pnm-to-lport sshname)) (when lport (setq process (mew-nntp-open pnm "localhost" lport no-msg))))) (sslp (if (mew-port-equal port sslport) (setq tls mew-tls-nntp)) (setq sslpro (mew-open-ssl-stream case server sslport tls)) (when sslpro (setq sslname (process-name sslpro)) (setq lport (mew-ssl-pnm-to-lport sslname)) (when lport (setq process (mew-nntp-open pnm mew-ssl-localhost lport no-msg))))) (t (setq process (mew-nntp-open pnm server port no-msg)))) (when process (mew-summary-lock process "NNTPing" (or sshpro sslpro)) (mew-sinfo-set-summary-form (mew-get-summary-form bnm)) (mew-sinfo-set-summary-column (mew-get-summary-column bnm)) (mew-sinfo-set-unread-mark nil) (mew-sinfo-set-scan-id nil) (mew-sinfo-set-scan-md5 nil) (mew-info-clean-up pnm) (mew-nntp-set-no-msg pnm no-msg) ;; must come here (mew-nntp-message pnm "Communicating with the NNTP server...") (mew-nntp-set-process pnm process) (mew-nntp-set-ssh-process pnm sshpro) (mew-nntp-set-ssl-process pnm sslpro) (mew-nntp-set-server pnm server) (mew-nntp-set-port pnm port) (mew-nntp-set-user pnm user) (mew-nntp-set-account pnm (format "%s@%s" user server)) (mew-nntp-set-status pnm "greeting") (mew-nntp-set-directive pnm directive) (mew-nntp-set-bnm pnm bnm) (mew-nntp-set-status-buf pnm bnm) (mew-nntp-set-rcnt pnm 1) (mew-nntp-set-rttl pnm 0) (mew-nntp-set-size pnm (mew-nntp-size case)) (mew-nntp-set-newsgroup pnm newsgroup) (mew-nntp-set-case pnm case) ;; (cond ((eq directive 'get) (mew-sinfo-set-unread-mark (mew-get-unread-mark bnm)) (mew-nntp-set-refs pnm (nth 0 args)) (setq virtual-info (nth 1 args)) (mew-nntp-set-virtual-info pnm virtual-info) (setq disp-info (nth 1 args)) (mew-nntp-set-disp-info pnm disp-info) (setq virtual (mew-net-virtual-info-get-virtual virtual-info)) (when virtual (mew-nntp-set-status-buf pnm virtual) (with-current-buffer virtual (mew-summary-lock process "NNTPing" (or sshpro sslpro))))) ((eq directive 'scan) (mew-nntp-set-range pnm (nth 0 args)) (mew-nntp-set-get-body pnm (nth 1 args)) (if (mew-nntp-get-range pnm) (progn (mew-nntp-set-mdb pnm (mew-summary-mark-collect4)) (mew-net-folder-clean)) (mew-sinfo-set-unread-mark (mew-get-unread-mark bnm)))) ((eq directive 'sync) )) (mew-sinfo-set-start-point (point)) ;; after erase-buffer (set-process-sentinel process 'mew-nntp-sentinel) (set-process-filter process 'mew-nntp-filter) (set-process-buffer process buf))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filter and sentinel ;;; (defun mew-nntp-debug (label string) (when (mew-debug 'net) (with-current-buffer (get-buffer-create mew-buffer-debug) (goto-char (point-max)) (insert (format "\n<%s>\n%s\n" label string))))) (defun mew-nntp-filter (process string) (let* ((pnm (process-name process)) (status (mew-nntp-get-status pnm)) (mulrep (mew-nntp-fsm-reply status)) stay next func code) (mew-nntp-debug (upcase status) string) (mew-filter ;; Process's buffer (goto-char (point-max)) (mew-set-buffer-multibyte nil) (insert string) (when (string= status "article") (mew-net-status2 (mew-nntp-get-status-buf pnm) (mew-nntp-get-rttl pnm) (mew-nntp-get-rcnt pnm) (mew-refileinfo-get-size (car (mew-nntp-get-rtrs pnm))) nil (mew-nntp-secure-p pnm))) (cond ((and (and (goto-char (1- (point-max))) (looking-at "\n$")) (and (goto-char (point-min)) (looking-at "^\\([45][0-9][0-9]\\)"))) ;; this is an error code. this cannot be a multiple-line reply. (setq code (mew-match-string 1)) (setq next (mew-nntp-fsm-next status code))) ((and (or (and mulrep (goto-char (point-max)) (= (forward-line -1) 0) (looking-at "^\\.\r?$")) (and (not mulrep) (goto-char (1- (point-max))) (looking-at "\n$"))) (and (goto-char (point-min)) (looking-at "^\\([0-9][0-9][0-9]\\)"))) (setq code (mew-match-string 1)) (setq next (mew-nntp-fsm-next status code))) (t (setq stay t))) (unless stay (unless next (setq next "quit")) (mew-nntp-set-status pnm next) (setq func (intern-soft (concat "mew-nntp-command-" next))) (goto-char (point-min)) (if (fboundp func) (funcall func process pnm) (error "No function called %s" (symbol-name func))) (if (and process (equal (process-buffer process) (current-buffer))) (mew-erase-buffer)))))) (defun mew-nntp-sentinel (process event) (let* ((pnm (process-name process)) (directive (mew-nntp-get-directive pnm)) (mdb (mew-nntp-get-mdb pnm)) (sshpro (mew-nntp-get-ssh-process pnm)) (sslpro (mew-nntp-get-ssl-process pnm)) (rttl (mew-nntp-get-rttl pnm)) (bnm (or (mew-nntp-get-bnm pnm) (current-buffer))) (hlds (mew-nntp-get-hlds pnm)) (msgid (mew-nntp-get-msgid pnm)) (done (mew-nntp-get-done pnm)) (error (mew-nntp-get-error pnm)) (file (mew-expand-file bnm mew-nntp-msgid-file)) (buf (process-buffer process)) (virtual-info (mew-nntp-get-virtual-info pnm)) (disp-info (mew-nntp-get-disp-info pnm))) (save-excursion (mew-nntp-debug "NNTP SENTINEL" event) (set-process-buffer process nil) (set-buffer bnm) (mew-summary-mark-recover mdb) (mew-remove-buffer buf) (if (not done) (let* ((rtrs (mew-nntp-get-rtrs pnm)) (lefts (length rtrs)) (msgid (mew-refileinfo-get-uid (car rtrs))) recovered) (mew-nntp-message pnm "NNTP connection is lost") (when (mew-nntp-get-dispatched pnm) (cond ((eq directive 'scan) (setq msgid (number-to-string (1- (string-to-number msgid)))) (mew-lisp-save file msgid nil 'unlimit) (setq recovered t))) (when recovered (mew-nntp-message pnm "%d message retrieved. %d messages are left due to an error" (- rttl lefts) lefts) (mew-summary-folder-cache-save)))) (if virtual-info (mew-summary-retrieve-message-for-virtual virtual-info)) (cond (error ;; retain the error message ) ((eq directive 'list) (mew-nntp-message pnm "Collecting newsgroup list...done")) ((eq directive 'sync) (mew-nntp-message pnm "Synchronizing messages...") (mew-net-folder-sync bnm hlds) (mew-nntp-message pnm "Synchronizing messages...done") (mew-summary-folder-cache-save)) ((eq directive 'get) (cond ((= rttl 0) (mew-nntp-message pnm "No new messages")) ((= rttl 1) (mew-nntp-message pnm "1 message retrieved") (mew-summary-folder-cache-save)) (t (mew-nntp-message pnm "%d messages retrieved" rttl) (mew-summary-folder-cache-save)))) ((eq directive 'scan) (cond ((or (= rttl 0) (null msgid)) (mew-nntp-message pnm "No messages scanned")) ((= rttl 1) (mew-nntp-message pnm "1 message scanned") (mew-lisp-save file msgid nil 'unlimit) (mew-summary-folder-cache-save)) (t (mew-nntp-message pnm "%d messages scanned" rttl) (mew-lisp-save file msgid nil 'unlimit) (mew-summary-folder-cache-save)))))) ;; (and mew-use-async-write (mew-unix-sync)) (mew-net-status-clear (mew-nntp-get-status-buf pnm)) (mew-info-clean-up pnm) (set-buffer-modified-p nil) (mew-summary-unlock) (if (and (processp sshpro) (not mew-ssh-keep-connection)) (process-send-string sshpro "exit\n")) (if (and (processp sslpro) (not mew-ssl-keep-connection)) (delete-process sslpro)) (mew-net-disp-info-display disp-info) (run-hooks 'mew-nntp-sentinel-hook)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Newsgroup alist ;;; (defun mew-nntp-folder-clean-up () (setq mew-nntp-folder-alist nil) (setq mew-nntp-folder-alist2 nil)) (defun mew-nntp-folder-alist (&optional case) (let ((ent (assoc (or case mew-case-default) mew-nntp-folder-alist)) alist) (if (and ent (cdr ent)) (cdr ent) (setq alist (mew-nntp-folder-load case)) (if alist alist (list (mew-folder-func (mew-nntp-newsgroup case))))))) (defun mew-nntp-folder-alist2 (&optional case) (let ((ent (assoc (or case mew-case-default) mew-nntp-folder-alist2))) (if ent (cdr ent) (mew-nntp-folder-load case 'two)))) (defun mew-nntp-folder-load (case &optional two) (let* ((fld (mew-nntp-folder case)) (file (mew-expand-file fld mew-nntp-folder-alist-file)) (groups (mew-lisp-load file)) (file2 (mew-expand-file fld mew-nntp-folder-alist2-file)) (groups2 (mew-lisp-load file2))) (mew-nntp-folder-alist-set case groups) (mew-nntp-folder-alist2-set case groups2) (if two groups2 groups))) (defun mew-nntp-folder-save (case groups groups2) (let* ((fld (mew-nntp-folder case)) (dir (mew-expand-folder fld)) (file (expand-file-name mew-nntp-folder-alist-file dir)) (file2 (expand-file-name mew-nntp-folder-alist2-file dir))) (mew-check-directory dir) (mew-lisp-save file groups 'nobackup 'unlimit) (mew-lisp-save file2 groups2 'nobackup 'unlimit))) (defun mew-nntp-folder-alist-set (case groups) (setq mew-nntp-folder-alist (cons (cons (or case mew-case-default) groups) (delete (assoc (or case mew-case-default) mew-nntp-folder-alist) mew-nntp-folder-alist)))) (defun mew-nntp-folder-alist2-set (case groups) (setq mew-nntp-folder-alist2 (cons (cons (or case mew-case-default) groups) (delete (assoc (or case mew-case-default) mew-nntp-folder-alist2) mew-nntp-folder-alist2)))) (defun mew-nntp-update (case) (let ((bnm (mew-summary-folder-name 'ext))) (mew-nntp-retrieve case 'list bnm))) (provide 'mew-nntp) ;;; Copyright Notice: ;; Copyright (C) 1999-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-nntp.el ends here kazu-yamamoto-Mew-ff9c41b/mew-nntp2.el000066400000000000000000000353661256455547000177410ustar00rootroot00000000000000;;; mew-nntp2.el for posting ;; Author: Kazu Yamamoto ;; Created: Nov 19, 1999 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; NNTP2 info ;;; (defvar mew-nntp2-info-list '(;; parameters to be saved "raw-header" "newsgroups" "fcc" "msgid" "logtime" "case" ;; save for re-edit, not for sending ;; parameters used internally "server" "port" "ssh-server" "user" "account" "status" "process" "ssh-process" "ssl-process" "qfld" "messages" ;; parameters used internally and should be initialized "string" "error" "done" "imapp")) (mew-info-defun "mew-nntp2-" mew-nntp2-info-list) (defvar mew-nntp2-info-list-save-length 6) (defvar mew-nntp2-info-list-clean-length 16) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; FSM ;;; (defvar mew-nntp2-fsm '(("greeting" ("20[01]" . "mode-reader")) ;; a broken server returns 200 even if post is allowed ("mode-reader" (t . "authinfo")) ("authinfo" ("381" . "authpass")) ("authpass" ("281" . "next") (t . "wpwd")) ("post" ("340" . "post-post")) ("post-post" ("240" . "done")) ("quit" (t . "noop")))) (defun mew-nntp2-fsm-by-status (status) (assoc status mew-nntp2-fsm)) (defun mew-nntp2-fsm-next (status code) (cdr (mew-assoc-match2 code (nthcdr 1 (mew-nntp2-fsm-by-status status)) 0))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filters 2 ;;; (defun mew-nntp2-command-mode-reader (pro pnm) (mew-nntp2-process-send-string pro "MODE READER")) (defun mew-nntp2-command-authinfo (pro pnm) (let ((user (mew-nntp2-get-user pnm))) (if user (mew-nntp2-process-send-string pro "AUTHINFO USER %s" user) (mew-nntp2-set-status pnm "next") (mew-nntp2-command-next pro pnm)))) (defun mew-nntp2-command-authpass (pro pnm) (let* ((prompt (format "NNTP password (%s): " (mew-nntp2-get-account pnm))) (pass (mew-nntp2-input-passwd prompt pnm))) (mew-nntp2-process-send-string pro "AUTHINFO PASS %s" pass))) (defun mew-nntp2-command-wpwd (pro pnm) (mew-passwd-set-passwd (mew-nntp2-passtag pnm) nil) (mew-nntp2-set-error pnm "NNTP password is wrong!") (mew-nntp2-command-quit2 pro pnm)) (defun mew-nntp2-command-next (pro pnm) (let ((msgs (mew-nntp2-get-messages pnm)) (qfld (mew-nntp2-get-qfld pnm)) (case (mew-nntp2-get-case pnm)) msg) (if msgs (progn (setq msg (car msgs)) (setq msgs (cdr msgs)) (mew-queue-insert-file pnm mew-nntp2-info-list-save-length qfld msg) (mew-set-buffer-multibyte nil) (mew-info-clean-up pnm mew-nntp2-info-list-clean-length) (mew-nntp2-set-case pnm case) ;; override (mew-nntp2-set-messages pnm msgs) (set-process-buffer pro (current-buffer)) (mew-nntp2-set-status pnm "post") (mew-nntp2-command-post pro pnm)) (mew-nntp2-set-status pnm "quit") (mew-nntp2-command-quit pro pnm)))) (defun mew-nntp2-command-post (pro pnm) (mew-nntp2-process-send-string pro "POST")) (defun mew-nntp2-command-post-post (pro pnm) (goto-char (point-max)) (unless (bolp) (insert "\n")) (mew-dot-insert) (mew-eol-fix-for-write) (set-buffer-modified-p nil) (process-send-region pro (point-min) (point-max)) (mew-nntp2-process-send-string pro ".")) (defun mew-nntp2-command-done (pro pnm) (let ((fcc (mew-nntp2-get-fcc pnm)) (case (mew-nntp2-get-case pnm)) (back (mew-queue-backup (buffer-file-name) mew-queue-info-suffix)) imapp) ;; mew-folder-new-message may be slow if the folder contains ;; a lot of messages. So, let's Fcc in background. (setq imapp (mew-net-fcc-message case fcc back)) (mew-nntp2-set-imapp pnm imapp) (mew-nntp2-log pnm) (mew-nntp2-set-status pro "next") (mew-nntp2-command-next pro pnm))) (defun mew-nntp2-command-quit (pro pnm) (mew-nntp2-set-done pnm t) (mew-nntp2-process-send-string pro "QUIT")) (defun mew-nntp2-command-quit2 (pro pnm) ;; error is set (mew-nntp2-set-done pnm t) (when (and (processp pro) (eq (process-status pro) 'open)) (mew-nntp2-set-status pnm "quit") (mew-nntp2-process-send-string pro "QUIT"))) (defun mew-nntp2-command-noop (pro pnm) ()) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sub functions ;;; (defconst mew-nntp2-info-prefix "mew-nntp2-info-") (defun mew-nntp2-info-name (case) (let ((server (mew-nntp-server case)) (port (mew-*-to-string (mew-nntp-port case))) (sshsrv (mew-nntp-ssh-server case)) (name mew-nntp2-info-prefix)) (setq name (concat name server)) (unless (mew-port-equal port mew-nntp-port) (setq name (concat name ":" port))) (if sshsrv (concat name "%" sshsrv) name))) (defun mew-nntp2-process-send-string (pro &rest args) (let ((str (apply 'format args))) (mew-nntp2-debug "=SEND=" str) (if (and (processp pro) (eq (process-status pro) 'open)) (process-send-string pro (concat str mew-cs-eol)) (message "NNTP time out")))) (defun mew-nntp2-passtag (pnm) (let ((server (mew-nntp2-get-server pnm)) (port (mew-nntp2-get-port pnm)) (user (mew-nntp2-get-user pnm))) (concat user "@" server ":" port))) (defun mew-nntp2-input-passwd (prompt pnm) (let* ((tag (mew-nntp2-passtag pnm)) (pro (mew-nntp2-get-process pnm)) (pass (mew-input-passwd prompt tag))) (unless (and (processp pro) (eq (process-status pro) 'open)) (mew-passwd-set-passwd tag nil)) pass)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Opening NNTP ;;; (defun mew-nntp2-open (pnm server port) (let ((sprt (mew-*-to-port port)) pro tm) (condition-case emsg (progn (setq tm (run-at-time mew-nntp-timeout-time nil 'mew-nntp2-timeout)) (message "Connecting to the NNTP server...") (setq pro (open-network-stream pnm nil server sprt)) (mew-process-silent-exit pro) (mew-set-process-cs pro mew-cs-text-for-net mew-cs-text-for-net) (message "Connecting to the NNTP server...done")) (quit (setq pro nil) (message "Cannot connect to the NNTP server")) (error (setq pro nil) (message "%s, %s" (nth 1 emsg) (nth 2 emsg)))) (if tm (cancel-timer tm)) pro)) (defun mew-nntp2-timeout () (signal 'quit nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Launcher ;;; (defun mew-nntp2-send-message (case qfld msgs) (let ((server (mew-nntp-server case)) (user (mew-nntp-user case)) (port (mew-*-to-string (mew-nntp-port case))) (pnm (mew-nntp2-info-name case)) (sshsrv (mew-nntp-ssh-server case)) (sslp (mew-nntp-ssl case)) (sslport (mew-nntp-ssl-port case)) process sshname sshpro sslname sslpro lport tls) (cond (sshsrv (setq sshpro (mew-open-ssh-stream case server port sshsrv)) (when sshpro (setq sshname (process-name sshpro)) (setq lport (mew-ssh-pnm-to-lport sshname)) (when lport (setq process (mew-nntp2-open pnm "localhost" lport))))) (sslp (if (mew-port-equal port sslport) (setq tls mew-tls-nntp)) (setq sslpro (mew-open-ssl-stream case server sslport tls)) (when sslpro (setq sslname (process-name sslpro)) (setq lport (mew-ssl-pnm-to-lport sslname)) (when lport (setq process (mew-nntp2-open pnm mew-ssl-localhost lport))))) (t (setq process (mew-nntp2-open pnm server port)))) (if (null process) (cond ((and sshsrv (null sshpro)) (message "Cannot create to the SSH connection")) ((and sslp (null sslpro)) (message "Cannot create to the SSL/TLS connection")) (t (message "Cannot connect to the NNTP server"))) (mew-info-clean-up pnm mew-nntp2-info-list-clean-length) (mew-nntp2-set-case pnm case) (mew-nntp2-set-qfld pnm qfld) (mew-nntp2-set-messages pnm msgs) (mew-nntp2-set-server pnm server) (mew-nntp2-set-port pnm port) (mew-nntp2-set-ssh-server pnm sshsrv) (mew-nntp2-set-ssh-process pnm sshpro) (mew-nntp2-set-ssl-process pnm sslpro) (mew-nntp2-set-user pnm user) (mew-nntp2-set-account pnm (format "%s@%s" user server)) (mew-nntp2-set-status pnm "greeting") ;; (set-process-buffer process nil) (set-process-sentinel process 'mew-nntp2-sentinel) (set-process-filter process 'mew-nntp2-filter) (message "Posting in background...")))) (defun mew-nntp2-flush-queue (case &optional qfld) (let (msgs) (unless qfld (setq qfld (mew-postq-folder case))) (if (mew-nntp2-get-server (mew-nntp2-info-name case)) ;; lock (message "%s is locked" qfld) (setq msgs (mew-folder-messages qfld)) (when msgs (mew-summary-folder-cache-clean qfld) (run-hooks 'mew-nntp2-flush-hook) (message "Flushing %s..." qfld) (mew-nntp2-send-message case qfld msgs))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filter and sentinel 2 ;;; (defun mew-nntp2-debug (label string) (when (mew-debug 'net) (with-current-buffer (get-buffer-create mew-buffer-debug) (goto-char (point-max)) (insert (format "\n<%s>\n%s\n" label string))))) (defun mew-nntp2-filter (process string) (let* ((pnm (process-name process)) (status (mew-nntp2-get-status pnm)) (str (concat (mew-nntp2-get-string pnm) string)) (buf (process-buffer process)) next func code) (save-excursion (mew-nntp2-debug (upcase status) string) (if (and buf (get-buffer buf)) (set-buffer buf)) ;; NNTP server's strings should be short enough. (mew-nntp2-set-string pnm str) (cond ((and (string-match "\n$" str) (string-match "^\\([0-9][0-9][0-9]\\) " str)) (setq code (match-string 1 str)) (setq next (mew-nntp2-fsm-next status code)) (cond (next (mew-nntp2-set-status pnm next) (setq func (intern-soft (concat "mew-nntp2-command-" next))) (and func (funcall func process pnm)) (mew-nntp2-set-string pnm nil)) (t (if (string-match "^pwd-" status) (mew-nntp2-set-error pnm "NNTP password is wrong!") (if (string-match "\n$" str) (setq str (substring str 0 -1))) (unless (string-match "[.!]$" str) (setq str (concat str ".")))) (mew-nntp2-set-error pnm str) (mew-nntp2-command-quit2 process pnm)))) (t ()))))) ;; stay (defun mew-nntp2-sentinel (process event) (let* ((pnm (process-name process)) (buf (process-buffer process)) (qfld (mew-nntp2-get-qfld pnm)) (case (mew-nntp2-get-case pnm)) (done (mew-nntp2-get-done pnm)) (imapp (mew-nntp2-get-imapp pnm)) (error (mew-nntp2-get-error pnm)) (sshpro (mew-nntp2-get-ssh-process pnm)) (sslpro (mew-nntp2-get-ssl-process pnm))) (save-excursion (mew-nntp2-debug "NNTP SENTINEL" event) (cond (error (when buf ;; A message file is not inserted at the beginning of the NNTP ;; session. (set-buffer buf) (mew-nntp2-queue case error)) (mew-nntp2-log pnm error) (message-box (format "%s This mail has been queued to %s" error qfld))) (done (message "Posting in background...done")) (t (if (null buf) (message "NNTP connection is lost") (set-buffer buf) (mew-nntp2-queue case "NNTP connection is lost")))) (mew-info-clean-up pnm) (if (and (processp sshpro) (not mew-ssh-keep-connection)) (process-send-string sshpro "exit\n")) (if (and (processp sslpro) (not mew-ssl-keep-connection)) (delete-process sslpro)) (run-hooks 'mew-nntp2-sentinel-hook) (if imapp (mew-imap2-fcc case)) (when buf (mew-remove-buffer buf))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Queuing ;;; (defun mew-nntp2-queue (case err) ;; Must be in a buffer where a message is contained. (let* ((pnm (mew-nntp2-info-name case)) (qfld (mew-postq-folder case)) (oname (buffer-name)) (work (buffer-file-name)) file-info file info nname) (mew-local-folder-check qfld) (setq file-info (mew-queue-enqueue work qfld)) (mew-set '(file info) file-info) (setq file (file-name-nondirectory file)) (setq nname (mew-concat-folder qfld file)) (if (mew-draft-p) (mew-nntp2-set-case pnm (mew-tinfo-get-case))) ;; (let* ((n mew-nntp2-info-list-save-length) (data (make-vector n nil))) (dotimes (i n) (aset data i (aref (mew-info pnm) i))) (mew-lisp-save info data)) ;; (mew-remove-buffer (current-buffer)) (message "%s has been queued to %s (%s)" oname nname err) (mew-touch-folder qfld) (file-name-sans-extension file))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Logging ;;; (defun mew-nntp2-log (pnm &optional err) (let ((logtime (mew-nntp2-get-logtime pnm)) (msgid (mew-nntp2-get-msgid pnm)) (newsgroups (mew-nntp2-get-newsgroups pnm)) (server (mew-nntp2-get-server pnm)) (sshsrv (mew-nntp2-get-ssh-server pnm)) (sslp (mew-nntp2-get-ssl-process pnm))) (with-temp-buffer (and logtime (insert logtime)) (and msgid (insert " id=" msgid)) (and server (insert " server=" server)) (and sshsrv (insert " sshsrv=" sshsrv)) (and sslp (insert " SSL/TLS")) (and newsgroups (insert " newsgroups=" newsgroups)) (if err (insert " status=" "(" (substring err 0 (string-match "\n+$" err)) ")") (insert " status=sent")) (insert "\n") (write-region (point-min) (point-max) (expand-file-name mew-nntp-log-file mew-conf-path) 'append 'no-msg)))) (provide 'mew-nntp2) ;;; Copyright Notice: ;; Copyright (C) 1999-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-nntp2.el ends here kazu-yamamoto-Mew-ff9c41b/mew-passwd.el000066400000000000000000000262251256455547000201730ustar00rootroot00000000000000;;; mew-passwd.el ;; Author: Kazu Yamamoto ;; Created: May 23, 2006 ;;; Code: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Variables ;;; (defvar mew-prog-passwd "gpg") (defvar mew-passwd-file ".mew-passwd.gpg") (defvar mew-passwd-cipher "AES") (defvar mew-passwd-repeat 3) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Internal variables ;;; (defvar mew-passwd-encryption-name "GPG Encryption") (defvar mew-passwd-decryption-name "GPG Decryption") (defvar mew-passwd-master nil) (defvar mew-passwd-alist nil) (defvar mew-passwd-timer-id nil) (defvar mew-passwd-rendezvous nil) (defvar mew-passwd-agent-hack nil) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; External functions ;;; (defun mew-passwd-get-passwd (key) (nth 1 (assoc key mew-passwd-alist))) (defun mew-passwd-set-passwd (key val) (if (assoc key mew-passwd-alist) (setcar (nthcdr 1 (assoc key mew-passwd-alist)) val) (setq mew-passwd-alist (cons (list key val 0) mew-passwd-alist)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Functions ;;; (defun mew-passwd-get-counter (key) (nth 2 (assoc key mew-passwd-alist))) (defun mew-passwd-set-counter (key val) (if (assoc key mew-passwd-alist) (setcar (nthcdr 2 (assoc key mew-passwd-alist)) val))) (defun mew-passwd-get-keys () (mapcar 'car mew-passwd-alist)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; GPG version ;;; (defun mew-passwd-gpg-version () (when (mew-which mew-prog-passwd exec-path) (with-temp-buffer (call-process mew-prog-passwd nil t nil "--version") (goto-char (point-min)) (re-search-forward "(GnuPG) " nil t) (if (looking-at "\\([0-9]+\\)\\.\\([0-9]+\\)") (list (string-to-number (match-string 1)) (string-to-number (match-string 2))))))) (defun mew-passwd-check-agent-hack () (let ((ver (mew-passwd-gpg-version))) (when ver (let ((major (nth 0 ver)) (minor (nth 1 ver))) (cond ((= major 1) nil) ((= major 2) (>= minor 1)) (t t)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Setup and cleanup ;;; (defun mew-passwd-setup () (when (and mew-use-cached-passwd (not mew-use-master-passwd)) (if mew-passwd-timer-id (cancel-timer mew-passwd-timer-id)) (setq mew-passwd-timer-id (mew-timer (* mew-passwd-timer-unit 60) 'mew-passwd-timer)))) (defun mew-passwd-setup-master () (when (and (not mew-passwd-master) mew-use-master-passwd) (setq mew-passwd-agent-hack (mew-passwd-check-agent-hack)) (let ((file (expand-file-name mew-passwd-file mew-conf-path))) (if (file-exists-p file) (setq mew-passwd-alist (mew-passwd-load)) ;; save nil and ask master twice (mew-passwd-save))) (add-hook 'kill-emacs-hook 'mew-passwd-clean-up))) (defun mew-passwd-clean-up () (remove-hook 'kill-emacs-hook 'mew-passwd-clean-up) (when mew-passwd-master (mew-passwd-save)) (setq mew-passwd-master nil) (when (and mew-use-cached-passwd (not mew-use-master-passwd)) (setq mew-passwd-alist nil) (if mew-passwd-timer-id (cancel-timer mew-passwd-timer-id)) (setq mew-passwd-timer-id nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Timer ;;; (defun mew-passwd-timer () (let ((keys (mew-passwd-get-keys))) (dolist (key keys) (if (< (mew-passwd-get-counter key) mew-passwd-lifetime) (mew-passwd-set-counter key (1+ (mew-passwd-get-counter key))) ;; time out (mew-passwd-set-passwd key nil) (mew-passwd-set-counter key 0))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Input ;;; (defun mew-input-passwd (prompt key) (if (and key (or mew-use-cached-passwd mew-use-master-passwd)) (progn (mew-passwd-setup-master) (if (mew-passwd-get-passwd key) (progn (mew-timing) (if mew-passwd-reset-timer (mew-passwd-set-counter key 0)) (mew-passwd-get-passwd key)) (let ((pass (mew-read-passwd prompt))) (mew-passwd-set-passwd key pass) (mew-passwd-set-counter key 0) pass))) (mew-read-passwd prompt))) (defun mew-read-passwd (prompt) (let ((inhibit-input-event-recording t) ;; A process filter sets inhibit-quit to t to prevent quitting. ;; Set inhibit-quit to nil so that C-g can be used (inhibit-quit nil)) (condition-case nil (read-passwd prompt) ;; If read-passwd causes an error, let's return "" so that ;; the password process will safely fail. (quit "") (error "")))) (defun mew-passwd-read-passwd (prompt &optional encrypt-p) (if mew-passwd-master (progn (mew-timing) mew-passwd-master) (let ((pass (mew-read-passwd prompt))) (unless encrypt-p (setq mew-passwd-master pass)) pass))) (defun mew-passwd-change () "Change the master password." (interactive) (setq mew-passwd-master nil) (mew-passwd-save)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Load and save ;;; (defmacro mew-passwd-rendezvous (pro) `(condition-case nil (let ((inhibit-quit nil)) (setq mew-passwd-rendezvous t) (while mew-passwd-rendezvous (accept-process-output ,pro 0.1 nil t))) (quit (setq mew-passwd-rendezvous nil)))) (defun mew-passwd-load () (let* ((process-connection-type mew-connection-type2) (file (expand-file-name mew-passwd-file mew-conf-path)) (tfile (mew-make-temp-name "gpg-load")) (args (mew-passwd-adjust-args (list "-d" "--yes" "--output" tfile file))) (N mew-passwd-repeat) pwds pro) (unwind-protect (with-temp-buffer (catch 'loop (dotimes (i N) (when mew-passwd-agent-hack (mew-passwd-clear-passphrase file)) (setq pro (apply 'mew-start-process-lang mew-passwd-decryption-name (current-buffer) mew-prog-passwd args)) (set-process-filter pro 'mew-passwd-filter) (set-process-sentinel pro 'mew-passwd-sentinel) (mew-passwd-rendezvous pro) (unless (file-exists-p tfile) (setq mew-passwd-master nil)) (when mew-passwd-master (let ((coding-system-for-read 'undecided)) (insert-file-contents tfile)) (condition-case nil (setq pwds (read (current-buffer))) (error ())) (throw 'loop nil))) (message "Master password is wrong!") (mew-let-user-read))) (mew-passwd-delete-file tfile)) pwds)) (defun mew-passwd-save () (let* ((process-connection-type mew-connection-type2) (file (expand-file-name mew-passwd-file mew-conf-path)) (tfile (mew-make-temp-name "gpg-save")) (args (mew-passwd-adjust-args (list "-c" "--cipher-algo" mew-passwd-cipher "--yes" "--output" file tfile))) (N mew-passwd-repeat) pro) (if (file-exists-p file) (rename-file file (concat file mew-backup-suffix) 'override)) (unwind-protect (with-temp-buffer (pp mew-passwd-alist (current-buffer)) (write-region (point-min) (point-max) tfile nil 'no-msg) (catch 'loop (dotimes (i N) (setq pro (apply 'mew-start-process-lang mew-passwd-encryption-name (current-buffer) mew-prog-passwd args)) (set-process-filter pro 'mew-passwd-filter) (set-process-sentinel pro 'mew-passwd-sentinel) (mew-passwd-rendezvous pro) (if (file-exists-p file) (throw 'loop nil))) (message "Master password is wrong! Passwords not saved") (mew-let-user-read))) (unless (file-exists-p file) (rename-file (concat file mew-backup-suffix) file)) (mew-passwd-delete-file tfile)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filter and sentinel ;;; (defun mew-passwd-filter (process string) (let* ((name (process-name process)) (regex (concat "^" (regexp-quote mew-passwd-encryption-name))) (encrypt-p (string-match regex name))) (with-current-buffer (process-buffer process) (cond ((string-match "invalid passphrase" string) (mew-warn "Master password mismatch!") (setq mew-passwd-master nil)) ((string-match "[bB]ad \\(?:session \\)?key" string) (mew-warn "Master password is wrong!") (setq mew-passwd-master nil)) ((string-match "Enter passphrase:" string) (process-send-string process (mew-passwd-read-passwd (if encrypt-p "New master password: " "Master password: ") encrypt-p)) (process-send-string process "\n")) ((string-match "Repeat passphrase:" string) (process-send-string process (mew-passwd-read-passwd "New master password again: ")) (process-send-string process "\n")) ((string-match "exiting" string) (setq mew-passwd-rendezvous nil)))))) (defun mew-passwd-sentinel (process event) (setq mew-passwd-rendezvous nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sub functions ;;; (defun mew-passwd-delete-file (file) (when (file-exists-p file) (with-temp-buffer (let ((coding-system-for-write 'binary) (size (mew-file-get-size file))) (dotimes (i size) (insert 0)) (write-region (point-min) (point-max) file nil 'no-msg))) (delete-file file))) (defun mew-passwd-get-cache-id (file) (with-temp-buffer (call-process mew-prog-passwd nil t nil "--list-packets" file) (goto-char (point-min)) (when (re-search-forward "salt \\([^ ,]+\\)," nil t) (concat "S" (match-string 1))))) (defun mew-passwd-clear-passphrase (file) (when (file-exists-p file) (let ((cache-id (mew-passwd-get-cache-id file))) (with-temp-buffer (insert "CLEAR_PASSPHRASE " cache-id "\n") (call-process-region (point-min) (point-max) "gpg-connect-agent"))))) (defun mew-passwd-adjust-args (args) (if mew-passwd-agent-hack (cons "--pinentry-mode" (cons "loopback" args)) args)) (provide 'mew-passwd) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-passwd.el ends here kazu-yamamoto-Mew-ff9c41b/mew-pgp.el000066400000000000000000001274001256455547000174550ustar00rootroot00000000000000;;; mew-pgp.el --- PGP/MIME for Mew ;; Author: Kazu Yamamoto ;; Created: Aug 17, 1994 ;;; Code: (require 'mew) ;;; ;;; PGP 2.6.x is supported. ;;; PGP 5.x is supported. But very ad-hoc. ;;; GNUPG 1.0.2 or later is supported. ;;; PGP 6.x is supported. But very ad-hoc. ;;; (defvar mew-pgp-ver nil "Automatically set 0 if PGP version is 2. Set 1 if 5. Set 2 if 6. Set 3 if GNUPG.") (defconst mew-pgp-ver2 0) (defconst mew-pgp-ver5 1) (defconst mew-pgp-ver6 2) (defconst mew-pgp-verg 3) (defconst mew-pgp-list '("PGPv2" "PGPv5" "PGPv6" "GNUPG")) (defconst mew-pgp-keys '(pgpv2 pgpv5 pgpv6 gnupg)) ;; use symbols, cases are string ;; mew-prog-pgp is used only for version check (defvar mew-prog-pgp2 "pgp") ;; "pgp263i", PGP selection (defvar mew-prog-pgp5 "pgp") ;; PGP selection (defvar mew-prog-pgp5e "pgpe") (defvar mew-prog-pgp5s "pgps") (defvar mew-prog-pgp5v "pgpv") (defvar mew-prog-pgp5k "pgpk") (defvar mew-prog-pgp6 "pgp") ;; "pgp651i", PGP selection (defvar mew-prog-gpg "gpg") ;; PGP selection (defvar mew-prog-pgpe `(,mew-prog-pgp2 ,mew-prog-pgp5e ,mew-prog-pgp6 ,mew-prog-gpg)) (defvar mew-prog-pgps `(,mew-prog-pgp2 ,mew-prog-pgp5s ,mew-prog-pgp6 ,mew-prog-gpg)) (defvar mew-prog-pgpv `(,mew-prog-pgp2 ,mew-prog-pgp5v ,mew-prog-pgp6 ,mew-prog-gpg)) (defvar mew-prog-pgpd `(,mew-prog-pgp2 ,mew-prog-pgp5v ,mew-prog-pgp6 ,mew-prog-gpg)) (defvar mew-prog-pgpk `(,mew-prog-pgp2 ,mew-prog-pgp5k ,mew-prog-pgp6 ,mew-prog-gpg)) (defconst mew-prog-pgpe-arg '(("-ea" "+language=en" "+batchmode=on" "+armorlines=0") ("-a" "+language=en" "+batchmode=on" "+armorlines=0") ("-ea" "+language=en" "+batchmode=on" "+armorlines=0") ("--encrypt" "--armor" "--batch"))) (defconst mew-prog-pgpd-arg '(("+language=en" "+batchmode=off") ("+language=en" "+batchmode=off") ("+language=en" "+batchmode=off") ("--decrypt"))) (defvar mew-prog-pgps-arg ;; local binding '(("-sba" "+language=en" "+batchmode=off") ("-ba" "+language=en" "+batchmode=off") ("-sba" "+language=en" "+batchmode=off") ("--detach-sign" "--armor" "--status-fd" "1"))) (defconst mew-prog-pgpv-arg '(("+batchmode=on" "+language=en") ("+batchmode=on" "+language=en" "+force=on") ("+batchmode=on" "+language=en") ("--verify" "--batch"))) (defconst mew-prog-old-pgpv-arg '(("+batchmode=on" "+language=en") ("+batchmode=on" "+language=en" "+force=on") ("+batchmode=on" "+language=en") ("--decrypt" "--batch"))) ;; --verify does not extract original data (defconst mew-prog-pgp-arg-output '("-o" "-o" "-o" "--output")) (defconst mew-prog-pgp-arg-input '(nil "-o" nil nil)) (defconst mew-prog-pgp-arg-luserid '("-u" "-u" "-u" "--local-user")) (defconst mew-prog-pgp-arg-ruserid '(nil "-r" nil "--remote-user")) (defconst mew-prog-pgpk-add-arg '(("-ka" "+batchmode=on") ("-a" "+batchmode=on") ("-ka" "+batchmode=on") ("--import" "--batch"))) (defconst mew-prog-pgpk-ext-arg '(("-kxfa") ("-xa") ("+force" "-kxfa") ("--export" "--armor" "--batch"))) (defconst mew-pgp-msg-signature '("\n\\(.*\\) signature from user \\(.*\\)\\." "\n\\(.*\\) signature made" "\\([a-zA-Z0-9]*\\) signature from user \\(.*\\)\\." " \\(.*\\) signature from \"\\(.*\\)\"")) (defconst mew-pgp-msg-key-id '("Key ID \\([a-zA-Z0-9]+\\) not found" ": 0x\\([a-zA-Z0-9]+\\)" ": 0x\\([a-zA-Z0-9]+\\)" "key ID \\([a-zA-Z0-9]+\\)")) (defconst mew-pgp-msg-bad-pass '("No passphrase" "Cannot unlock private key\\|It can only be decrypted" "Bad pass phrase" "bad passphrase")) (defconst mew-pgp-msg-enter '("Enter" "Enter" "Enter" "xxx")) (defconst mew-pgp-msg-overwrite '("Overwrite (y/N)\\? " "Overwrite (y/N)\\? " "Overwrite (y/N)\\? " "Overwrite (y/N)\\? ")) (defconst mew-pgp-msg-enter-pass '("Enter pass phrase: " "Enter pass phrase: " "Enter pass phrase: " "Enter passphrase: ")) (defconst mew-pgp-msg-reenter-pass '("Enter pass phrase: " "Enter pass phrase: " "Enter pass phrase: " "Enter passphrase: ")) (defconst mew-pgp-msg-no-enckey '("Key matching" "No encryption keys" "public key matching" "public key not found")) (defconst mew-pgp-msg-no-validkey '("DUMMY" "^WARNING:[ -9;-~\n]+belongs? to:" "^WARNING:[ -9;-~\n]+belongs? to:" "There is no indication that this key really belongs to the owner")) (defconst mew-pgp-msg-pubkey-expired '("xxx" "xxx" "xxx" "encryption failed: unusable public key")) (defconst mew-pgp-msg-no-vrfkey '("Key matching" "unknown keyid" "key does not meet" "public key not found")) (defconst mew-pgp-msg-no-keyring '("Keyring file" "Keyring file" "NO MESSAGE" "public key not found")) (defconst mew-pgp-msg-no-seckey-or-secring '("You do not have the secret key" "Cannot find a private key" "Signature error\\|You do not have the secret key" "failed: secret key not available")) (defconst mew-pgp-msg-unsupported '("Unsupported packet format" ;; including algorithms and packets "Unsupported packet format\\|None of the signatures were understood" "Unsupported packet format" ;; including algorithms and packets "xxx")) (defconst mew-pgp-msg-nocross '("xxx" "xxx" "xxx" "is not cross-certified")) (defconst mew-pgp-verify-addr '(".* \\(signature from user\\) " "\\( \\)" ".* \\(signature from user\\) " "gpg: .* \\(from\\|aka\\) ")) ;; 2: ASCII armor corrupted ;; 3: ;; 5: ;; 2: ERROR: or Error: (defconst mew-pgp-msg-no-export-key '("Key not found" "No keys" "Key not found" "nothing exported")) (defvar mew-pgp-micalg '("pgp-md5" "pgp-sha1" "pgp-sha1" "pgp-sha1")) (defvar mew-pgp-hash-alist '(("1" . "pgp-md5") ("2" . "pgp-sha1") ("3" . "pgp-ripemd160") ("5" . "pgp-md2") ("6" . "pgp-tiger192") ("7" . "pgp-haval-5-160") ("8" . "pgp-sha256") ("9" . "pgp-sha384") ("10" . "pgp-sha512"))) ;; ;; (defvar mew-pgp-string nil) (defvar mew-pgp-running nil) (defvar mew-pgp-failure nil) (defvar mew-pgp-decrypt-msg nil) (defvar mew-pgp-sign-msg nil) (defconst mew-pgp-encryption-begin "-----BEGIN PGP MESSAGE-----") (defconst mew-pgp-signature-begin "-----BEGIN PGP SIGNED MESSAGE-----") (defconst mew-pgp-key-begin "-----BEGIN PGP PUBLIC KEY BLOCK-----") (defconst mew-pgp-key-end "-----END PGP PUBLIC KEY BLOCK-----") (defconst mew-pgp-err-pass 'mew-err-pass) (defconst mew-pgp-err-pubring 'mew-err-pubring) (defconst mew-pgp-err-secring 'mew-err-secring) (defconst mew-pgp-err-pubkey 'mew-err-pubkey) (defconst mew-pgp-err-seckey 'mew-err-seckey) (defconst mew-pgp-err-seckey-or-secring 'mew-err-seckey-or-secring) (defconst mew-pgp-err-other 'mew-err-other) (defvar mew-pgp-result-pass "Pass phrase is wrong") (defvar mew-pgp-result-pubring "No public keyring") (defvar mew-pgp-result-secring "No secret keyring") (defvar mew-pgp-result-pubkey "No his/her public key") (defvar mew-pgp-result-expired "His/her public key is expired or not signed by yourself") (defvar mew-pgp-result-invalid "His/her public key is invalid. Sign the key by yourself, first") (defvar mew-pgp-result-seckey "No your secret key") (defvar mew-pgp-result-seckey-or-secring "No secret keyring or no your secret key") (defvar mew-pgp-result-other "PGP failed for some reasons") (defvar mew-pgp-result-sec-succ "PGP decrypted") (defvar mew-pgp-result-dec-fail "PGP NOT decrypted for some reasons") (defvar mew-pgp-result-unsup "PGP unsupported signature") (defvar mew-pgp-result-nocross "His/her Public key is not cross-certified") (defvar mew-pgp-prompt-enter-pass "Enter pass phrase (%s): ") (defvar mew-pgp-prompt-reenter-pass "Re-enter pass phrase (%s): ") (defun mew-pgp-get (list-or-vec) (elt list-or-vec mew-pgp-ver)) (defun mew-pgp-set (vec val) (aset vec mew-pgp-ver val)) (defun mew-pgp-debug (label string) (when (mew-debug 'pgp) (with-current-buffer (get-buffer-create mew-buffer-debug) (goto-char (point-max)) (insert (format "\n<%s>\n%s\n" label string))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; PGP version check ;;; (defun mew-pgp-setup () (cond ((mew-which-exec mew-prog-pgp) (with-temp-buffer (mew-call-process-lang mew-prog-pgp nil t nil) (goto-char (point-min)) (if (search-forward "PGP is now invoked" nil t) (setq mew-pgp-ver mew-pgp-ver5) (goto-char (point-min)) (if (search-forward "Pretty Good Privacy(tm) 2" nil t) (setq mew-pgp-ver mew-pgp-ver2) (goto-char (point-min)) (if (search-forward "gpg" nil t) (setq mew-pgp-ver mew-pgp-verg) (goto-char (point-min)) (if (search-forward "Pretty Good Privacy(tm) Version 6" nil t) (setq mew-pgp-ver mew-pgp-ver6) (setq mew-pgp-ver nil))))))) (t (setq mew-pgp-ver nil)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; PGP selection ;;; (defun mew-pgp-select () "Select PGP version and set up environment for selected PGP." (interactive) (setq mew-prog-pgp (completing-read "PGP name: " (mapcar 'list (list mew-prog-pgp2 mew-prog-pgp5 mew-prog-gpg)) nil t)) (mew-pgp-setup)) ;; xxx how about multiple users on local machine? (defun mew-pgp-passtag () (mew-pgp-get mew-pgp-list)) (defun mew-pgp-passphrase (&optional again) (let ((prompt (if again mew-pgp-prompt-reenter-pass mew-pgp-prompt-enter-pass)) (msg (mew-pgp-passtag))) (setq prompt (format prompt msg)) (mew-input-passwd prompt msg))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; PGP verifying ;;; (defun mew-pgp-verify-check () (let (ret keyid) (goto-char (point-min)) (if (not (re-search-forward (mew-pgp-get mew-pgp-msg-signature) nil t)) ;; this is verification, so the error is about public key (progn (goto-char (point-min)) (if (search-forward (mew-pgp-get mew-pgp-msg-no-vrfkey) nil t) (progn (goto-char (point-min)) (if (not (re-search-forward (mew-pgp-get mew-pgp-msg-key-id) nil t)) (setq keyid "not found") (setq keyid (format "0x%s"(mew-match-string 1)))) (setq ret (concat mew-pgp-result-pubkey ": ID = " keyid))) (if (search-forward (mew-pgp-get mew-pgp-msg-no-keyring) nil t) (setq ret mew-pgp-result-pubring) (if (re-search-forward (mew-pgp-get mew-pgp-msg-unsupported) nil t) (setq ret mew-pgp-result-unsup) (if (re-search-forward (mew-pgp-get mew-pgp-msg-nocross) nil t) (setq ret mew-pgp-result-nocross) ;; this line must be nil since this function is used ;; by the decryption function, too, for signed-then-encrypted ;; messages. We cannot tell whether or not signatures exist ;; from the outside of the cipher. ))))) ;; Signature result is found. (setq ret (concat (mew-match-string 1) " PGP sign ")) (goto-char (point-max)) (if (and mew-inherit-decode-signer (re-search-backward (concat (mew-pgp-get mew-pgp-verify-addr) ".*" mew-inherit-decode-signer) nil t)) (progn (beginning-of-line) (looking-at (concat (mew-pgp-get mew-pgp-verify-addr) "\\(.*\\)")) (setq ret (concat ret (mew-match-string 2)))) (goto-char (point-max)) (re-search-backward (concat (mew-pgp-get mew-pgp-verify-addr) "\\(.*\\)") nil t) (setq ret (concat ret (mew-match-string 2)))) ;; xxx (goto-char (point-min)) (if (re-search-forward "not certified with \\(enough\\|sufficiently\\)" nil t) (setq ret (concat ret " MARGINAL")) (goto-char (point-min)) (if (search-forward "not trusted" nil t) (setq ret (concat ret " UNTRUSTED")) (goto-char (point-min)) (if (search-forward "not certified with a" nil t) ;; PGP uses "unknown" for validity internally, but ;; prints "undefined" instead of "unknown". (setq ret (concat ret " UNDEFINED")) (goto-char (point-min)) (if (search-forward "expired" nil t) (setq ret (concat ret " EXPIRED")) (setq ret (concat ret " COMPLETE"))))))) ret)) (defun mew-pgp-verify (file1 file2) (message "PGP verifying...") (let ((ioption (mew-pgp-get mew-prog-pgp-arg-input)) ;; detached signature (voptions (mew-pgp-get mew-prog-pgpv-arg)) (pgpv (mew-pgp-get mew-prog-pgpv)) files ret) (with-temp-buffer (if ioption (setq files (list ioption file1 file2)) (setq files (list file2 file1))) (apply 'mew-call-process-lang pgpv nil t nil (append voptions files)) (setq ret (mew-pgp-verify-check))) (message "PGP verifying...done") ret)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; PGP encrypting ;;; (defun mew-pgp-encrypt-check () (let (ret) ;; this should be nil (goto-char (point-min)) (if (re-search-forward (mew-pgp-get mew-pgp-msg-no-validkey) nil t) (setq ret mew-pgp-result-invalid) (goto-char (point-min)) (if (search-forward (mew-pgp-get mew-pgp-msg-no-enckey) nil t) (setq ret mew-pgp-result-pubkey) (goto-char (point-min)) (if (search-forward (mew-pgp-get mew-pgp-msg-no-keyring) nil t) (setq ret mew-pgp-result-pubring) (goto-char (point-min)) (if (search-forward (mew-pgp-get mew-pgp-msg-pubkey-expired) nil t) (setq ret mew-pgp-result-expired))))) ret)) (defun mew-pgp-encrypt (file1 decrypters) (message "PGP encrypting...") (let ((roption (mew-pgp-get mew-prog-pgp-arg-ruserid)) (ooption (mew-pgp-get mew-prog-pgp-arg-output)) (eoptions (mew-pgp-get mew-prog-pgpe-arg)) (pgpe (mew-pgp-get mew-prog-pgpe)) (file2 (mew-make-temp-name)) check file3 decs args) ;; not unique if file3 is made here (with-temp-buffer (insert "Version: 1\n") (write-region (point-min) (point-max) file2 nil 'no-msg)) (setq file3 (concat (mew-make-temp-name) mew-pgp-ascii-suffix)) (if (and mew-encrypt-to-myself (not (member mew-inherit-encode-pgp-signer decrypters))) (setq decrypters (cons mew-inherit-encode-pgp-signer decrypters))) (setq decrypters (mapcar (lambda (x) (if (string-match "^[^<].*@" x) (concat "<" x ">") x)) decrypters)) (if (not roption) (setq args (append (list ooption file3 file1) eoptions decrypters)) (mapc (lambda (x) (setq decs (cons roption (cons x decs)))) decrypters) (setq args (append eoptions decs (list ooption file3 file1)))) (with-temp-buffer (apply 'mew-call-process-lang pgpe nil t nil args) (setq check (mew-pgp-encrypt-check))) (message "PGP encrypting...done") (list file2 mew-7bit file3 mew-7bit check))) ;; both ctes are 7bit ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; PGP decrypting ;;; (defun mew-pgp-decrypt (file1 file2) ;; file1 is a key file. just ignore. ;; file2 is an encrypted file with PGP. (message "PGP decrypting...") (setq mew-pgp-running 'decrypting) (setq mew-pgp-string nil) (setq mew-pgp-decrypt-msg nil) (setq mew-pgp-failure nil) (let ((process-connection-type mew-connection-type2) (ooption (mew-pgp-get mew-prog-pgp-arg-output)) (doptions (mew-pgp-get mew-prog-pgpd-arg)) (pgpd (mew-pgp-get mew-prog-pgpd)) file3 process verify) (setq file3 (mew-make-temp-name)) (setq process (apply 'mew-start-process-lang "PGP decrypt" (current-buffer) pgpd (append doptions (list ooption file3 file2)))) (mew-set-process-cs process mew-cs-autoconv mew-cs-dummy) (set-process-filter process 'mew-pgp-process-filter1) (set-process-sentinel process 'mew-pgp-process-sentinel) (mew-rendezvous mew-pgp-running) (message "PGP decrypting...done") (if (file-exists-p file3) (progn (with-temp-buffer (insert mew-pgp-string) (setq verify (mew-pgp-verify-check))) (when verify (setq mew-pgp-decrypt-msg (concat mew-pgp-decrypt-msg "\n\t" verify)))) ;; unpredictable error (mew-passwd-set-passwd (mew-pgp-passtag) nil) (if (string= mew-pgp-decrypt-msg mew-pgp-result-sec-succ) (setq mew-pgp-decrypt-msg mew-pgp-result-dec-fail))) (list file3 mew-pgp-decrypt-msg))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; PGP signing ;;; (defun mew-pgp-canonicalize () (save-excursion (goto-char (point-min)) (while (re-search-forward "[ \t]+$" nil t) (replace-match "" nil t) (forward-line)))) (defun mew-pgp-get-micalg () (let ((micalg (mew-pgp-get mew-pgp-micalg)) alg) (if (/= mew-pgp-ver mew-pgp-verg) micalg (with-temp-buffer (insert mew-pgp-string) (goto-char (point-min)) (if (re-search-forward "SIG_CREATED [A-Z] [0-9]+ \\([0-9]+\\)" nil t) (setq alg (cdr (assoc (mew-match-string 1) mew-pgp-hash-alist))))) (or alg micalg)))) (defun mew-pgp-sign (file1) (message "PGP signing...") (setq mew-pgp-running 'signing) (setq mew-pgp-string nil) (setq mew-pgp-sign-msg nil) (setq mew-pgp-failure nil) (let ((process-connection-type mew-connection-type2) (loption (mew-pgp-get mew-prog-pgp-arg-luserid)) (ooption (mew-pgp-get mew-prog-pgp-arg-output)) (soptions (mew-pgp-get mew-prog-pgps-arg)) (pgps (mew-pgp-get mew-prog-pgps)) file2 process) (setq file2 (concat (mew-make-temp-name) mew-pgp-ascii-suffix)) ;; not perfectly unique but OK (setq process (apply 'mew-start-process-lang "PGP sign" (current-buffer) ;; xxx nil? pgps (append soptions (list loption mew-inherit-encode-pgp-signer ooption file2 file1)))) (mew-set-process-cs process mew-cs-autoconv mew-cs-dummy) (set-process-filter process 'mew-pgp-process-filter1) (set-process-sentinel process 'mew-pgp-process-sentinel) (mew-rendezvous mew-pgp-running) (message "PGP signing...done") (unless (file-exists-p file2) ;; for unpredictable error (mew-passwd-set-passwd (mew-pgp-passtag) nil)) (list file2 nil (mew-pgp-get-micalg) mew-pgp-sign-msg))) ;; return ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; PGP process functions ;;; (defun mew-pgp-process-sentinel (process event) (save-excursion (let ((decrypted mew-pgp-result-sec-succ) (msg "")) (if (not mew-pgp-failure) (cond ((eq mew-pgp-running 'decrypting) (setq mew-pgp-decrypt-msg decrypted)) ((eq mew-pgp-running 'signing) (setq mew-pgp-sign-msg nil))) (cond ;; sign or decrypt ((eq mew-pgp-failure mew-pgp-err-pass) (setq msg mew-pgp-result-pass)) ;; decrypt-then-verify ((eq mew-pgp-failure mew-pgp-err-pubring) (setq msg decrypted)) ;; decrypt-then-verify ((eq mew-pgp-failure mew-pgp-err-pubkey) (setq msg decrypted)) ;; sign ((eq mew-pgp-failure mew-pgp-err-secring) (setq msg mew-pgp-result-secring)) ;; sign ((eq mew-pgp-failure mew-pgp-err-seckey) (setq msg mew-pgp-result-seckey)) ;; decrypt ((eq mew-pgp-failure mew-pgp-err-seckey-or-secring) (setq msg mew-pgp-result-seckey-or-secring)) ;; other (t ;; mew-pgp-err-other or nil (setq msg mew-pgp-result-other))) (cond ((eq mew-pgp-running 'decrypting) (setq mew-pgp-decrypt-msg msg)) ((eq mew-pgp-running 'signing) (setq mew-pgp-sign-msg msg)))) (setq mew-pgp-running nil)))) (defun mew-pgp-process-filter1 (process string) (save-excursion ;; sign or decrypt, not verify (mew-pgp-debug "PGP filter1" string) (setq mew-pgp-string (concat mew-pgp-string string)) (cond ;; no secret key or no secring for decrypt ((string-match (mew-pgp-get mew-pgp-msg-no-seckey-or-secring) string) (setq mew-pgp-failure mew-pgp-err-seckey-or-secring) (set-process-filter process 'mew-pgp-process-filter3)) ;; no secring for sign ((string-match (mew-pgp-get mew-pgp-msg-no-keyring) string) (setq mew-pgp-failure mew-pgp-err-secring) ;; Enter secret key filename: (process-send-string process "\n") (set-process-filter process 'mew-pgp-process-filter3)) ;; no secret key for sign ((string-match (mew-pgp-get mew-pgp-msg-no-enckey) string) (setq mew-pgp-failure mew-pgp-err-seckey) ;; Enter secret key filename: (process-send-string process "\n") (set-process-filter process 'mew-pgp-process-filter3)) ;; pass phrase for sign or decrypt ((string-match (mew-pgp-get mew-pgp-msg-enter-pass) string) (process-send-string process (format "%s\n" (mew-pgp-passphrase))) (set-process-filter process 'mew-pgp-process-filter2)) ;; overwrite a previous data with a new data. (multiple data is unsupported) ((string-match (mew-pgp-get mew-pgp-msg-overwrite) string) (process-send-string process "y\n") (set-process-filter process 'mew-pgp-process-filter1)) ;; just in case ((string-match (mew-pgp-get mew-pgp-msg-enter) string) (setq mew-pgp-failure mew-pgp-err-other) ;; Enter PSWD: (process-send-string process "\n") (set-process-filter process 'mew-pgp-process-filter3))))) (defun mew-pgp-process-filter2 (process string) (save-excursion (mew-pgp-debug "PGP filter2" string) (setq mew-pgp-string (concat mew-pgp-string string)) (cond ;; re-enter pass phrase ((string-match (mew-pgp-get mew-pgp-msg-reenter-pass) string) (setq mew-pgp-string nil) (mew-passwd-set-passwd (mew-pgp-passtag) nil) ;; cancel anyway (process-send-string process (format "%s\n" (mew-pgp-passphrase 'again))) (set-process-filter process 'mew-pgp-process-filter2)) ;; pass phrases were wrong three times ((string-match (mew-pgp-get mew-pgp-msg-bad-pass) string) (setq mew-pgp-failure mew-pgp-err-pass) (mew-passwd-set-passwd (mew-pgp-passtag) nil) ;; cancel anyway (set-process-filter process 'mew-pgp-process-filter3)) ;; no pubring for verify ((string-match (mew-pgp-get mew-pgp-msg-no-keyring) string) (setq mew-pgp-failure mew-pgp-err-pubring) ;; Enter public key filename: (process-send-string process "\n") (set-process-filter process 'mew-pgp-process-filter3)) ;; no public key for verify ((string-match (mew-pgp-get mew-pgp-msg-no-vrfkey) string) (setq mew-pgp-failure mew-pgp-err-pubkey) ;; Enter public key filename: (process-send-string process "\n") (set-process-filter process 'mew-pgp-process-filter3)) ;; after decrypted secret key, symmetric key is not unknown... ;; gpg: unknown cipher algorithm ;; no secret key or no secring for decrypt ((string-match (mew-pgp-get mew-pgp-msg-no-seckey-or-secring) string) (setq mew-pgp-failure mew-pgp-err-seckey-or-secring) (set-process-filter process 'mew-pgp-process-filter3)) ;; overwrite a previous data with a new data. (multiple data is unsupported) ((string-match (mew-pgp-get mew-pgp-msg-overwrite) string) (process-send-string process "y\n") (set-process-filter process 'mew-pgp-process-filter2)) ;; just in case ((string-match (mew-pgp-get mew-pgp-msg-enter) string) (setq mew-pgp-failure mew-pgp-err-other) ;; Enter PSWD: (process-send-string process "\n") (set-process-filter process 'mew-pgp-process-filter3))))) (defun mew-pgp-process-filter3 (process string) (save-excursion (mew-pgp-debug "PGP filter3" string) ;; ending or error (setq mew-pgp-string (concat mew-pgp-string string)) ;; string may contain old "Enter" (cond ;; just in case ((string-match (mew-pgp-get mew-pgp-msg-enter) string) ;; (setq mew-pgp-failure mew-pgp-err-other) ;; this is wrong ;; Enter PSWD: (process-send-string process "\n") (set-process-filter process 'mew-pgp-process-filter3))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; shortcut methods ;;; (defun mew-pgp-sign-message (&optional arg) "Sign the entire draft with PGP. Input your passphrase." (interactive "P") (mew-pgp-encode-message 'pgp-signature arg)) (defun mew-pgp-encrypt-message () "Encrypt the entire draft with PGP." (interactive) (mew-pgp-encode-message 'pgp-encryption)) (defun mew-pgp-sign-encrypt-message (&optional arg) "Sign then encrypt the entire draft with PGP. Input your passphrase." (interactive "P") (mew-pgp-encode-message 'pgp-signature-encryption)) (defun mew-pgp-encrypt-sign-message (&optional arg) "Encrypt then sign the entire draft with PGP. Input your passphrase." (interactive "P") (mew-pgp-encode-message 'pgp-encryption-signature)) (defun mew-pgp-encode-message (type &optional ask-signer) (if (null mew-pgp-ver) (message "%s does not exist" mew-prog-pgp) (let ((func 'mew-draft-make-message)) (if (mew-use-old-pgp (mew-tinfo-get-case)) (setq func 'mew-old-pgp-encode)) (if (and ask-signer (string-match "signature" (symbol-name type))) (funcall func type (car (mew-input-address "Who's key?: "))) (funcall func type))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; old PGP encoding ;;; (defconst mew-prog-old-pgps-arg '(("-sat" "+clearsig=on" "+language=en" "+batchmode=off") ("-at" "+clearsig=on" "+language=en" "+batchmode=off") ("-sat" "+clearsig=on" "+language=en" "+batchmode=off") ("--clearsign" "--armor" "--textmode"))) (defconst mew-prog-old-pgpse-arg '(("-seat" "+language=en" "+batchmode=off") ("-eat" "+language=en" "+batchmode=off") ("-seat" "+language=en" "+batchmode=off") ("--sign" "--encrypt" "--armor" "--textmode"))) (defconst mew-prog-old-pgpe-arg '(("-eat" "+language=en" "+batchmode=on" "+armorlines=0") ("-at" "+language=en" "+batchmode=on" "+armorlines=0") ("-eat" "+language=en" "+batchmode=on" "+armorlines=0") ("--encrypt" "--armor" "--textmode" "--batch"))) (defun mew-old-pgp-encode (type &optional signer) (let (mew-inherit-encode-pgp-signer doit syntax ctl ct charset cs) (if (mew-attach-p) (if (mew-encode-syntax-have-one-part) (progn (setq syntax (mew-syntax-get-part mew-encode-syntax)) (setq ctl (mew-syntax-get-ct syntax)) (setq ct (mew-syntax-get-value ctl 'cap)) (if (string= ct mew-ct-txt) (progn (setq charset (mew-syntax-get-param ctl "charset")) (setq cs (mew-charset-to-cs charset)) (setq doit t) (mew-attach-clear)) (message "Old PGP cannot be used for non-text"))) (message "Old PGP cannot be used if multipart exists")) (setq doit t)) (when doit (setq mew-inherit-encode-pgp-signer (or signer (mew-pgp-signer (mew-tinfo-get-case)) (mew-get-my-address))) (cond ((eq type 'pgp-signature) (mew-old-pgp-sign cs syntax)) ((eq type 'pgp-encryption) (mew-old-pgp-encrypt cs)) ((eq type 'pgp-signature-encryption) (mew-pgp-old-sign-encrypt cs)) (t (message "Not supported")))))) (defun mew-old-pgp-sign (cs &optional syntax) (let ((file1 (mew-make-temp-name)) (mew-prog-pgps-arg mew-prog-old-pgps-arg) file2 fmc errmsg charset) (goto-char (mew-header-end)) (forward-line) (unless cs (setq charset (mew-charset-guess-region (point) (point-max))) (setq cs (mew-charset-to-cs charset))) (mew-frwlet mew-cs-dummy cs (write-region (point) (point-max) file1 nil 'no-msg)) (condition-case nil (setq fmc (mew-pgp-sign file1)) (error (mew-delete-file file1) (mew-encode-error (format "unknown error for %s. Check %s, anyway" mew-ct-mls mew-temp-dir)))) (mew-set '(file2 nil nil errmsg) fmc) (if errmsg (progn (mew-delete-file file1) (mew-delete-file file2) (error errmsg)) (delete-region (point) (point-max)) (mew-frwlet cs mew-cs-dummy (insert-file-contents file2)) (mew-delete-file file1) (mew-delete-file file2) (setq mew-encode-syntax syntax) (mew-draft-make-message)))) (defun mew-old-pgp-encrypt (cs) (let ((file1 (mew-make-temp-name)) (mew-prog-pgps-arg mew-prog-old-pgps-arg) (decrypters (mew-header-parse-address-list mew-destination:-list)) file2 file3 fc errmsg charset) (goto-char (mew-header-end)) (forward-line) (unless cs (setq charset (mew-charset-guess-region (point) (point-max))) (setq cs (mew-charset-to-cs charset))) (mew-frwlet mew-cs-dummy cs (write-region (point) (point-max) file1 nil 'no-msg)) (condition-case nil (setq fc (mew-pgp-encrypt file1 decrypters)) (error (mew-delete-file file1) (mew-encode-error (format "unknown error for %s. Check %s, anyway" mew-ct-mle mew-temp-dir)))) (mew-set '(file2 nil file3 nil errmsg) fc) (if errmsg (progn (mew-delete-file file1) (mew-delete-file file2) (mew-delete-file file3) (error errmsg)) ;; Create multipart content-header (delete-region (point) (point-max)) (mew-frwlet cs mew-cs-dummy (insert-file-contents file3)) (mew-delete-file file1) (mew-delete-file file2) (mew-delete-file file3) (setq mew-encode-syntax nil) (mew-draft-make-message)))) (defun mew-pgp-old-sign-encrypt (cs) (message "PGP signing then encrypting...") (let ((decrypters (mew-header-parse-address-list mew-destination:-list)) (roption (mew-pgp-get mew-prog-pgp-arg-ruserid)) (loption (mew-pgp-get mew-prog-pgp-arg-luserid)) (ooption (mew-pgp-get mew-prog-pgp-arg-output)) (eoptions (mew-pgp-get mew-prog-old-pgpse-arg)) ;; xxx (pgpe (mew-pgp-get mew-prog-pgpe)) ;; xxx (file1 (mew-make-temp-name)) file2 check decs args process charset) (goto-char (mew-header-end)) (forward-line) (unless cs (setq charset (mew-charset-guess-region (point) (point-max))) (setq cs (mew-charset-to-cs charset))) (mew-frwlet mew-cs-dummy cs (write-region (point) (point-max) file1 nil 'no-msg)) (if (and mew-encrypt-to-myself (not (member mew-inherit-encode-pgp-signer decrypters))) (setq decrypters (cons mew-inherit-encode-pgp-signer decrypters))) (setq decrypters (mapcar (lambda (x) (if (string-match "^[^<].*@" x) (concat "<" x ">") x)) decrypters)) (setq file2 (mew-make-temp-name)) (setq args (list loption mew-inherit-encode-pgp-signer ooption file2 file1)) (if (not roption) (setq args (append args eoptions decrypters)) (dolist (decrypter decrypters) ;; nreverse later, take care. (setq decs (cons decrypter (cons roption decs)))) (setq decrypters (nreverse decs)) (setq args (append eoptions decrypters args))) (setq mew-pgp-running 'signing) (setq mew-pgp-string nil) (setq mew-pgp-sign-msg nil) (setq mew-pgp-failure nil) (with-temp-buffer (setq process (apply 'mew-start-process-lang "PGP sign" (current-buffer) pgpe args)) (mew-set-process-cs process mew-cs-autoconv mew-cs-dummy) (set-process-filter process 'mew-pgp-process-filter1) (set-process-sentinel process 'mew-pgp-process-sentinel) (mew-rendezvous mew-pgp-running) (message "PGP signing then encrypting...done") (setq check (mew-pgp-encrypt-check))) (unless (file-exists-p file2) ;; for unpredictable error (mew-passwd-set-passwd (mew-pgp-passtag) nil)) (if (or mew-pgp-sign-msg check) (progn (mew-delete-file file1) (mew-delete-file file2) (error (or mew-pgp-sign-msg check))) (delete-region (point) (point-max)) (mew-frwlet cs mew-cs-dummy (insert-file-contents file2)) (mew-delete-file file1) (mew-delete-file file2) (setq mew-encode-syntax nil) (mew-draft-make-message)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; old PGP decoding ;;; (defun mew-old-pgp-check () (goto-char (point-min)) (if (re-search-forward (concat "^" mew-pgp-encryption-begin) nil t) ;; this may be 'pgp-signature, but we hope clearsig is used... 'pgp-encryption (goto-char (point-min)) (if (re-search-forward (concat "^" mew-pgp-signature-begin) nil t) 'pgp-signature nil))) (defun mew-old-pgp-verify (file) (message "PGP verifying...") (let ((voptions (mew-pgp-get mew-prog-old-pgpv-arg)) (ooption (mew-pgp-get mew-prog-pgp-arg-output)) (pgpv (mew-pgp-get mew-prog-pgpv)) (file1 (mew-make-temp-name)) verify) (with-temp-buffer (apply 'mew-call-process-lang pgpv nil t nil (append voptions (list ooption file1 file))) (setq verify (mew-pgp-verify-check))) (message "PGP verifying...done") (list file1 verify))) (defun mew-summary-decode-old-pgp () "Decrypting/verifying old-fashioned PGP messages." (interactive) (if (null mew-pgp-ver) (message "%s does not exist" mew-prog-pgp) (mew-summary-msg (let ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) type) (with-current-buffer (mew-buffer-message) ;; We need MIME-decoded buffer to check PGP boundaries. (setq type (mew-old-pgp-check)) (if type (mew-old-pgp-decode fld msg type) (message "No PGP data found"))))))) (defun mew-old-pgp-decode (fld msg type) ;; in Message buffer (let* ((cache (mew-cache-hit fld msg 'must-hit)) (syntax (mew-cache-decode-syntax cache)) (file (mew-expand-msg fld msg)) mew-inherit-decode-signer file1 file2 result xmew win start cte) (with-temp-buffer (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write (mew-insert-file-contents file) (re-search-forward mew-eoh nil t) (forward-line) (delete-region (point-min) (point)) (when (eq type 'pgp-signature) (setq cte (mew-syntax-get-cte (mew-syntax-get-part syntax))) (mew-decode-mime-body nil mew-ct-txt cte)) (setq file1 (mew-make-temp-name)) (write-region (point-min) (point-max) file1 nil 'no-msg))) (mew-elet (widen) (setq win (get-buffer-window (current-buffer))) (setq start (window-start win)) (setq mew-inherit-decode-signer (mew-addrstr-parse-address (mew-header-get-value mew-from:))) (goto-char (mew-header-end)) (forward-line) (delete-region (point) (point-max)) (cond ((eq type 'pgp-encryption) (setq result (mew-pgp-decrypt 'dummy file1))) ((eq type 'pgp-signature) (setq result (mew-old-pgp-verify file1)))) (mew-set '(file2 xmew) result) (unless xmew (setq xmew "CRC error")) ;; xxx (mew-xinfo-set-pri-result (concat mew-x-mew: " " xmew "\n")) (save-excursion (mew-header-delete-lines (list mew-x-mew:)) (goto-char (mew-header-end)) (mew-decode-syntax-insert-privacy)) (when (and file1 (file-exists-p file1)) (mew-delete-file file1)) (when (and file2 (file-exists-p file2)) (mew-frwlet mew-cs-text-for-read mew-cs-dummy (mew-insert-file-contents file2)) (mew-delete-file file2)) (mew-cs-decode-region (point) (point-max) ;; This is valid for PGP signature only. ;; Since cipher text is encoded with Radix 64, charset should ;; be "US-ASCII". I don't know this code is valid for ;; cipher text in the case that a wrong charset is specified. (or (mew-charset-to-cs (mew-syntax-get-param (mew-syntax-get-ct (mew-syntax-get-part syntax)) "charset")) mew-cs-autoconv)) (mew-highlight-body-region (point) (point-max)) (mew-message-set-end-of) (set-window-start win start) (set-buffer-modified-p nil)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Key distribution ;;; (defun mew-attach-pgp-public-key () "Extract the PGP key for the specified user on '.'. in attachments" (interactive) (if (not (mew-attach-not-line012-1)) (message "Cannot link here") (let* ((error nil) (nums (mew-syntax-nums)) (subdir (mew-attach-expand-path mew-encode-syntax nums)) (attachdir (mew-attachdir)) user file filepath begin end) ;; attachdir / {subdir/} dir (unless (string= subdir "") (setq attachdir (expand-file-name subdir attachdir))) ;; attachdir / file (setq filepath (mew-random-filename attachdir 1 nil mew-pgp-key-suffix)) (if (null filepath) (message "Cannot make a file for pgp key, sorry") (setq file (file-name-nondirectory filepath)) (setq user (car (mew-input-address "Who's key? (%s): " (mew-get-my-address)))) (with-temp-buffer (apply 'mew-call-process-lang (mew-pgp-get mew-prog-pgpk) nil t nil (append (mew-pgp-get mew-prog-pgpk-ext-arg) (list user))) (goto-char (point-min)) (if (search-forward (mew-pgp-get mew-pgp-msg-no-export-key) nil t) (setq error t) (goto-char (point-min)) (if (not (search-forward mew-pgp-key-begin nil t)) (setq error t) (beginning-of-line) (setq begin (point)) (if (not (search-forward mew-pgp-key-end nil t)) (setq error t) (beginning-of-line) (forward-line) (setq end (point))) (write-region begin end filepath nil 'no-msg)))) (if error (message "Cannot extract pgp key for %s" user) (setq mew-encode-syntax (mew-syntax-insert-entry mew-encode-syntax nums (mew-encode-syntax-single file mew-type-apk nil user))) (mew-encode-syntax-print mew-encode-syntax)))))) (defvar mew-pgp-tmp-file nil) (defun mew-mime-pgp-keys (cache begin end &optional params) "A function to add PGP keys in Application/PGP-Keys to your public keyring." (mew-elet (insert " ###### ##### ###### # # ####### # #\n" " # # # # # # # # # # #\n" " # # # # # # # # # #\n" " ###### # #### ###### #### ####### #\n" " # # # # # # # #\n" " # # # # # # # #\n" " # ##### # # # ####### #\n" "\n\n") (mew-insert-manual "To add this key to your pubring, type " "'\\\\[mew-summary-execute-external]'.\n"))) (defun mew-mime-pgp-keys-ext (cache begin end &optional params) "A function to add PGP keys to your public keyring." (if (not mew-pgp-ver) (message "PGP not found") (when (y-or-n-p "Add this PGP key onto your public keyring? ") (setq mew-pgp-tmp-file (mew-make-temp-name)) (with-current-buffer cache (mew-frwlet mew-cs-dummy mew-cs-autoconv (write-region begin end mew-pgp-tmp-file nil 'no-msg)) (set-buffer (mew-buffer-message)) (mew-elet (message "Adding PGP keys...") (apply 'mew-call-process-lang (mew-pgp-get mew-prog-pgpk) nil t nil (append (mew-pgp-get mew-prog-pgpk-add-arg) (list mew-pgp-tmp-file))) (message "Adding PGP keys...done") (insert "\n\n" "**************** IMPORTANT NOTE ****************\n" "When Mew adds PGP keys onto your public keyring,\n" "it is careless about both TRUST and VALIDITY.\n" "It is YOU who set these values. Please use\n") (cond ((eq mew-pgp-ver mew-pgp-ver2) (insert "\"pgp -ke\" and \"pgp -ks\" to change them.\n")) ((eq mew-pgp-ver mew-pgp-ver5) (insert "\"pgpk -e\" and \"pgpk -s\" to change them.\n")) ((eq mew-pgp-ver mew-pgp-ver6) (insert "\"pgp -ke\" and \"pgp -ks\" to change them.\n")) ((eq mew-pgp-ver mew-pgp-verg) (insert "\"gpg --edit-key\" to change them.\n"))) (insert "If you do not know what TRUST and VALIDITY is,\n" "you should learn the web of trust system BEFORE\n" "using PGP to protect your privacy.\n" "**************** IMPORTANT NOTE ****************\n"))) (mew-delete-file mew-pgp-tmp-file)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; key fetch ;;; (defun mew-pgp-fetch-key-by-xuri () (let (val uri) (with-current-buffer (mew-buffer-message) (catch 'loop (dolist (key mew-x-pgp-key-list) (setq val (mew-header-get-value key)) (when (and val (string-match "http:[^ \t\n]*" val)) (setq val (mew-match-string 0 val)) (if (y-or-n-p (format "Fetch a PGP public key from %s? " val)) (throw 'loop (setq uri val))))))) (if uri (mew-pgp-fetch uri) (message "A PGP key is not fetched")))) (defun mew-pgp-fetch-key (arg) "Fetch a PGP public key. A PGP public key is fetch from one of the PGP PKS servers with a key ID which is extracted from the X-Mew: field. The list of the PGP PKS servers is specified by 'mew-pgp-pks-servers'. If called with \\[universal-argument], a PGP public key is fetched according to a URL in a field specified by 'mew-x-pgp-key-list'." (interactive "P") (if arg (mew-pgp-fetch-key-by-xuri) (let (keyid userid xmew) (with-current-buffer (mew-buffer-message) (setq userid (mew-header-parse-address mew-from:)) (setq xmew (mew-header-get-value mew-x-mew:))) (cond ((and xmew (string-match " ID = \\(0x[0-9a-fA-F]+\\)" xmew nil) (setq keyid (mew-match-string 1 xmew))) (if (y-or-n-p (format "Fetch the PGP public key for %s? " keyid)) (mew-pgp-fetch-key-from-pks keyid))) (userid (if (y-or-n-p (format "Fetch the PGP public key for %s? " userid)) (mew-pgp-fetch-key-from-pks userid))) (t (message "A PGP key is not fetched")))))) (defun mew-pgp-fetch-key-from-pks (&optional id) (let* ((alist mew-pgp-pks-servers) (server (car (car alist))) uri) (unless id (setq id (read-string "PGP key id or e-mail address: "))) (setq server (mew-input-general "PGP key server" alist nil server)) (unless (mew-pgp-pks-http-port-p server alist) (setq server (concat server ":" (mew-*-to-string mew-pgp-pks-port)))) (setq uri (concat "http://" server mew-pgp-pks-lang id)) (mew-pgp-fetch uri))) (defun mew-pgp-fetch (uri) (message "PGP key fetching...") (let (pro) (mew-piolet mew-cs-autoconv mew-cs-autoconv (setq pro (apply 'start-process "Mew PGP fetch" (generate-new-buffer mew-buffer-prefix) mew-prog-pgpkey (append mew-prog-pgpkey-args (list uri))))) (set-process-sentinel pro 'mew-pgp-fetch-process-sentinel))) (defun mew-pgp-fetch-process-sentinel (process event) (message "PGP key fetching...done") (let ((buf (process-buffer process))) (with-current-buffer buf (goto-char (point-min)) (if (and (search-forward mew-pgp-key-begin nil t) (search-forward mew-pgp-key-end nil t)) (mew-mime-pgp-keys-ext (current-buffer) (point-min) (point-max)) (message "PGP key fetch failed"))) (mew-remove-buffer buf))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; or ;; ;; no seckey no secring:: <1> ;; You do not have the secret key needed to decrypt this file. ;; ;; <2> ;; Keyring file 'pubring.pgp' does not exist. ;; Enter public key filename: ;; ;; Key matching expected Key ID 1B8BF431 not found in file 'pubring.pgp'. ;; Enter public key filename: ;; ;; <1> ;; ;; A secret key is required to make a signature. ;; Keyring file 'secring.pgp' does not exist. ;; Enter secret key filename: ;; ;; A secret key is required to make a signature. ;; Key matching userid 'foo' not found in file 'secring.pgp'. ;; Enter secret key filename: ;; ;; ;; ;; Keyring file 'pubring.pgp' does not exist. ;; ;; Key matching userid 'foo' not found in file 'pubring.pgp'. ;; ;; ;; Keyring file 'pubring.pgp' does not exist. ;; ;; Key matching expected Key ID 1B8BF431 not found in file 'pubring.pgp'. (provide 'mew-pgp) ;;; Copyright Notice: ;; Copyright (C) 1994-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-pgp.el ends here kazu-yamamoto-Mew-ff9c41b/mew-pick.el000066400000000000000000000665071256455547000176270ustar00rootroot00000000000000;;; mew-pick.el --- Picking up messages for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Pick commands ;;; (defun mew-summary-pick-msgs (folder regionp) (let* ((dir (mew-expand-folder folder)) (default-directory dir) ;; buffer local beg end region msg msgs) (if (mew-mark-active-p) (setq regionp t)) (cond (regionp (setq region (mew-summary-get-region)) (setq beg (car region)) (setq end (cdr region)) (save-excursion (goto-char beg) (while (re-search-forward mew-regex-msg-or-part end t) ;; for thread (setq msg (mew-summary-message-number)) (setq msg (mew-msg-get-filename msg)) (setq msgs (cons msg msgs)) (forward-line))) (setq msgs (delq nil msgs)) (setq msgs (nreverse msgs))) (t (setq msgs (mew-dir-messages ".")) ;; all messages (setq msgs (delq nil msgs)))))) (defun mew-summary-pick (&optional regionp) "Pick messages according to a specified pick pattern. Then put the '*' mark onto them. 'mewl' or 'grep' is called as a picking command. If called with '\\[universal-argument]', the target is the region." (interactive "P") (mew-pickable (mew-summary-with-mewl (let* ((folder (mew-summary-physical-folder)) (msgs (mew-summary-pick-msgs folder regionp)) (prompt (format "%s/%s pick" mew-prog-mewl mew-prog-grep)) (prog mew-prog-grep) (opts mew-prog-grep-opts) mew-inherit-pick-mewlp grepp pattern prog-opts-pat) (if (not msgs) (message "No message") (setq pattern (mew-input-pick-pattern prompt)) (cond ((string= pattern "") (setq prog-opts-pat (mew-input-pick-command prog opts)) (mew-set '(prog opts pattern) prog-opts-pat) (setq grepp t)) (t (setq pattern (mew-pick-canonicalize-pattern pattern)) (unless mew-inherit-pick-mewlp (setq grepp t)))) (if (and grepp (not (mew-which-exec prog))) (message "'%s' not found" prog) (cond (grepp (mew-sinfo-set-find-key pattern) (message "Picking messages in %s..." folder) (setq msgs (mew-summary-pick-with-grep prog opts pattern folder msgs)) (message "Picking messages in %s...done" folder)) (t (mew-sinfo-set-find-key nil) ;; force to ask a user (message "Picking messages in %s..." folder) (setq msgs (mew-summary-pick-with-mewl pattern folder msgs)) (message "Picking messages in %s...done" folder))) (mew-summary-pick-ls folder msgs))))))) (defmacro mew-dolist-eob (spec &rest body) ;; (declare (indent 1)) `(let ((--mew-temp-- ,(nth 1 spec)) ,(nth 0 spec)) (while (and --mew-temp-- (not (eobp))) (setq ,(nth 0 spec) (car --mew-temp--)) (setq --mew-temp-- (cdr --mew-temp--)) ,@body))) (put 'mew-dolist-eob 'lisp-indent-function 1) (defun mew-summary-pick-ls-thread (msgs) (let* ((preline 0) (threadmsgs (mew-summary-thread-get-msglst (mew-vinfo-get-top) 'separator)) (total (length threadmsgs)) (msgs2 msgs) linenum) (goto-char (point-min)) (mew-dolist-eob (msg msgs) (setq linenum (member msg threadmsgs)) (if (null linenum) (setq msgs2 (delete (car msgs) msgs2)) (setq linenum (- total (length linenum))) (forward-line (- linenum preline)) (setq preline linenum) (mew-summary-mark-as mew-mark-review))) (set-buffer-modified-p nil) msgs2)) (defun mew-summary-pick-ls-selection (msgs) ;; messages are not displayed in order (goto-char (point-min)) (let (msgs2) (mew-dolist-eob (msg msgs) (when (mew-summary-search-msg msg) (setq msgs2 (cons (car msgs) msgs2)) (mew-summary-mark-as mew-mark-review)) (forward-line)) (set-buffer-modified-p nil) (nreverse msgs2))) (defun mew-summary-pick-ls-summary (folder msgs) (when (get-buffer folder) (set-buffer folder) (save-excursion (goto-char (point-min)) (mew-dolist-eob (msg msgs) (when (re-search-forward (mew-regex-sumsyn-msg msg) nil t) (mew-summary-mark-as mew-mark-review) (forward-line)))) (set-buffer-modified-p nil))) (defun mew-summary-pick-ls (folder msgs) (if (null msgs) (message "No message to be marked") (let ((n (length msgs)) msgs2) (if (= n 1) (message "Marking 1 message...") (message "Marking %d messages..." n)) (save-excursion (cond ((mew-thread-p) (setq msgs2 (mew-summary-pick-ls-thread msgs))) ((mew-selection-p) (setq msgs2 (mew-summary-pick-ls-selection msgs))) (t ;; Summary mode (setq msgs2 msgs))) (mew-summary-pick-ls-summary folder msgs2)) (if (= n 1) (message "Marking 1 message...done") (message "Marking %d messages...done" n))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Pick internal ;;; (defun mew-summary-pick-range (src-msgs) (when src-msgs (let* ((min (string-to-number (car src-msgs))) (max min) i) (setq src-msgs (cdr src-msgs)) (dolist (src-msg src-msgs) (setq i (string-to-number src-msg)) (if (< i min) (setq min i)) (if (> i max) (setq max i))) (format "%d-%d" min max)))) (defun mew-summary-pick-with-mewl (pattern folder src-msgs) "A function to pick messages matching PATTERN with 'mewl'" (let ((pfolder (mew-scan-mewl-folder (mew-expand-folder2 folder))) (range (mew-summary-pick-range src-msgs)) (opts (list "-b" mew-mail-path "-l" (number-to-string mew-scan-max-field-length) "-x" mew-suffix "-p" pattern)) msgs) (if range (setq opts (nconc opts (list pfolder range))) (setq opts (nconc opts (list pfolder)))) (with-temp-buffer (mew-set-buffer-multibyte t) (mew-piolet mew-cs-text-for-read mew-cs-text-for-write (apply 'call-process mew-prog-mewl nil t nil opts)) (goto-char (point-min)) (while (re-search-forward mew-regex-message-files2 nil t) (setq msgs (cons (mew-match-string 1) msgs)) (forward-line))) (nreverse msgs))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Grep ;;; (defun mew-summary-pick-with-grep (prog opts pattern folder src-msgs) "A function to pick messages matching PATTERN." (let* ((dir (mew-expand-folder folder)) (default-directory dir) ;; buffer local msgs nxt) ;; no sort here (if (= (length src-msgs) 1) (setq src-msgs (cons null-device src-msgs))) (if pattern (setq pattern (mew-cs-encode-arg pattern))) (with-temp-buffer (mew-set-buffer-multibyte t) (cd dir) (mew-piolet mew-cs-text-for-read mew-cs-text-for-write (while src-msgs (goto-char (point-max)) (setq nxt (nthcdr mew-prog-grep-max-msgs src-msgs)) (if nxt (mew-ntake mew-prog-grep-max-msgs src-msgs)) (apply 'call-process prog nil t nil (append opts (and pattern (list pattern)) src-msgs)) (setq src-msgs nxt))) (goto-char (point-min)) (while (re-search-forward mew-regex-message-files2 nil t) (setq msgs (cons (mew-match-string 1) msgs)) (forward-line))) (setq msgs (mew-uniq-list msgs)) (setq msgs (mapcar 'string-to-number msgs)) (setq msgs (sort msgs '<)) (mapcar 'number-to-string msgs))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Displaying keyword ;;; (defun mew-summary-find-keyword-down (&optional arg) "Display a message in the forward direction, find a keyword and highlight it. In Summary mode, the target is messages marked with '*'. In Virtual mode, the target is all messages in a Virtual folder. The keyword is stored in a buffer local variable in Summary mode. If no keyword is set to the variable, this command first asks you for a keyword. If you want to change the stored keyword, execute this command with '\\[universal-argument]'." (interactive "P") (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number)) (fid (mew-frame-id)) (ofld (mew-current-get-fld fid)) (omsg (mew-current-get-msg fid)) (cwin (get-buffer-window (current-buffer))) (mbuf (mew-buffer-message)) (mwin (get-buffer-window mbuf)) (key (mew-sinfo-get-find-key)) (mark (mew-summary-get-mark)) (virtualp (mew-virtual-p)) (search t) end top) (when (or arg (not (stringp key))) (setq key (read-string "Keyword: " (or (car mew-input-pick-pattern-hist) key))) (mew-sinfo-set-find-key key)) (cond ((and (or virtualp (equal mew-mark-review mark)) ;; MUST be equal (or (not (string= fld ofld)) (not (string= msg omsg)))) (mew-summary-display-asis) (setq top t)) ((or (null mwin) (not (or virtualp (equal mew-mark-review mark))) ;; MUST be equal (or (not (string= fld ofld)) (not (string= msg omsg))) (with-current-buffer mbuf (eobp))) (cond (virtualp (forward-line) (mew-summary-display-asis) (setq top t)) ((mew-summary-down-mark mew-mark-review) (mew-summary-display-asis) (setq top t)) (t (setq search nil))))) (setq mwin (get-buffer-window mbuf)) (if (not search) (message "No more marked messages") (select-window mwin) (unwind-protect (progn (if top (goto-char (point-min))) (if (setq end (re-search-forward key nil t)) (progn (isearch-highlight (- end (length key)) end) (recenter (/ (window-height) 2))) (goto-char (point-max)) (message "Keyword '%s' is not found" key) (recenter -1))) (select-window cwin))))) (defun mew-summary-find-keyword-up (&optional arg) "Display a message in the backward direction, find a keyword and highlight it. In Summary mode, the target is messages marked with '*'. In Virtual mode, the target is all messages in a Virtual folder. The keyword is stored in a buffer local variable in Summary mode. If no keyword is set to the variable, this command first asks you for a keyword. If you want to change the stored keyword, execute this command with '\\[universal-argument]'." (interactive "P") (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number)) (fid (mew-frame-id)) (ofld (mew-current-get-fld fid)) (omsg (mew-current-get-msg fid)) (cwin (get-buffer-window (current-buffer))) (mbuf (mew-buffer-message)) (mwin (get-buffer-window mbuf)) (key (mew-sinfo-get-find-key)) (mark (mew-summary-get-mark)) (virtualp (mew-virtual-p)) (search t) beg bottom) (when (or arg (not (stringp key))) (setq key (read-string "Keyword: " (or (car mew-input-pick-pattern-hist) key))) (mew-sinfo-set-find-key key)) (cond ((and (or virtualp (equal mew-mark-review mark)) ;; MUST be equal (or (not (string= fld ofld)) (not (string= msg omsg)))) (mew-summary-display-asis) (setq bottom t)) ((or (null mwin) (not (or virtualp (equal mew-mark-review mark))) ;; MUST be equal (or (not (string= fld ofld)) (not (string= msg omsg))) (with-current-buffer mbuf (bobp))) (cond (virtualp (forward-line -1) (mew-summary-display-asis) (setq bottom t)) ((mew-summary-up-mark mew-mark-review) (mew-summary-display-asis) (setq bottom t)) (t (setq search nil))))) (setq mwin (get-buffer-window mbuf)) (if (not search) (message "No more marked messages") (select-window mwin) (unwind-protect (progn (if bottom (goto-char (point-max))) (if (setq beg (re-search-backward key nil t)) (progn (isearch-highlight beg (+ beg (length key))) (recenter (/ (window-height) 2))) (goto-char (point-min)) (message "Keyword '%s' is not found" key) (recenter 0))) (select-window cwin))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Pick macro ;;; (defvar mew-pick-macro-alist nil) (defun mew-pick-define-macro (str1 str2) "Define pick macro." (interactive (list (read-string "Pick pattern: ") (read-string "Macro body: "))) ;; macro-pattern is a string including no #, or ;; a string in a form FIELD=#1 #2 #3...#n. ;; #1 can be replaced by #. (let (args body asc value) (while (string-match "\\(#[0-9]*\\)[, ]*" str1) (setq args (cons (intern (match-string 1 str1)) args)) (setq str1 (replace-match "" nil t str1))) (while (string-match "#[0-9]*" str2) (setq body (cons (substring str2 0 (match-beginning 0)) body)) (setq body (cons (intern (match-string 0 str2)) body)) (setq str2 (substring str2 (match-end 0)))) (setq body (cons str2 body)) (setq asc (assoc str1 mew-pick-macro-alist)) (setq value (cons (nreverse args) (nreverse body))) (if asc (setcdr asc value) (setq mew-pick-macro-alist (cons (cons str1 value) mew-pick-macro-alist))))) (defun mew-pick-macro-expand (name args) (let ((asc (assoc name mew-pick-macro-alist)) alist args2 body body-copy assq) (if (not asc) name (setq args2 (nth 1 asc)) (setq body (nthcdr 2 asc)) (while (and args args2) (setq alist (cons (cons (car args2) (car args)) alist)) (setq args (cdr args)) (setq args2 (cdr args2))) (dolist (bd body) (if (stringp bd) (setq body-copy (cons bd body-copy)) (setq assq (assq bd alist)) (if assq (setq body-copy (cons (cdr assq) body-copy))))) (concat "(" (mew-pick-macro-expand-string (apply 'concat (nreverse body-copy))) ")")))) (defun mew-pick-macro-expand-string (str) (if (string= str "") "" (let ((first (string-to-char str)) asc key rest eq-flag val args) (if (memq first (list ?\( ?\! ?\& ?\| ?= mew-sp ?\))) (concat (char-to-string first) (mew-pick-macro-expand-string (substring str 1))) (if (string-match "=\\| \\|)\\|&\\||" str) (if (string= (match-string 0 str) "=") (progn (setq eq-flag t) (setq key (substring str 0 (match-end 0))) (setq rest (substring str (match-end 0)))) (setq key (substring str 0 (match-beginning 0))) (setq rest (substring str (match-beginning 0)))) (setq key str) (setq rest "")) (setq asc (assoc key mew-pick-macro-alist)) (cond (asc (setq args (nth 1 asc)) (while args (if (string-match ",\\| \\|)\\|&\\||" rest) (progn (setq val (cons (substring rest 0 (match-beginning 0)) val)) (setq rest (substring rest (match-beginning 0)))) (setq val (cons rest val)) (setq rest "")) (setq args (cdr args))) (concat (mew-pick-macro-expand key (nreverse val)) (mew-pick-macro-expand-string rest))) (eq-flag (if (string-match " \\|)\\|&\\||" rest) (progn (setq val (substring rest 0 (match-beginning 0))) (setq rest (substring rest (match-beginning 0)))) (setq val rest) (setq rest "")) (concat key val (mew-pick-macro-expand-string rest))) (t (concat key (mew-pick-macro-expand-string rest)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Lex and Parser ;;; (defmacro mew-pick-lex-cut () `(when (and start (< start i)) (let ((word (substring pattern start i)) key op val) ;; Allowing "to,cc" (if (string-match "^\\([-a-z0-9,]+\\)\\(!?==?\\)\\(.+\\)$" word) (progn (setq key (mew-match-string 1 word)) (setq op (mew-match-string 2 word)) (setq val (mew-match-string 3 word)) (setq val (mew-remove-single-quote val)) (setq ret (cons (list op key val) ret))) (setq word (mew-remove-single-quote word)) (setq ret (cons word ret))) (setq start nil)))) (defun mew-pick-lex (pattern) (let ((len (length pattern)) (i 0) ret start c dq) (while (< i len) ;; cannot use dotimes (setq c (aref pattern i)) (cond (dq (if (or (char-equal c ?\") (char-equal c ?')) (setq dq nil))) ((or (char-equal c ?\") (char-equal c ?')) (unless start (setq start i)) (setq dq t)) ((char-equal c ?\() (mew-pick-lex-cut) (setq ret (cons 'open ret))) ((char-equal c ?\)) (mew-pick-lex-cut) (setq ret (cons 'close ret))) ((char-equal c ?&) (mew-pick-lex-cut) (setq ret (cons 'and ret))) ((char-equal c ?|) (mew-pick-lex-cut) (setq ret (cons 'or ret))) ((and (char-equal c ?!) (not (char-equal (aref pattern (1+ i)) ?=))) (mew-pick-lex-cut) (setq ret (cons 'not ret))) ((char-equal c mew-sp) (mew-pick-lex-cut)) (t (unless start (setq start i)))) (setq i (1+ i))) (mew-pick-lex-cut) (nreverse ret))) (defun mew-pick-parse (mew-inherit-pick-tokens) (let (mew-inherit-pick-ret) (mew-pick-parse1) (nreverse mew-inherit-pick-ret))) (defun mew-pick-parse1 () (when mew-inherit-pick-tokens (mew-pick-parse-elements) (while mew-inherit-pick-tokens (mew-pick-parse-and/or)))) (defun mew-pick-parse-elements () (let ((cur (car mew-inherit-pick-tokens))) (setq mew-inherit-pick-tokens (cdr mew-inherit-pick-tokens)) (setq mew-inherit-pick-mewlp t) (cond ((stringp cur) (setq mew-inherit-pick-mewlp nil) (setq mew-inherit-pick-ret (cons cur mew-inherit-pick-ret))) ((listp cur) (setq mew-inherit-pick-ret (cons cur mew-inherit-pick-ret))) ((eq cur 'open) (mew-pick-parse-open/close)) ((eq cur 'close) (error "')' alone")) ((eq cur 'not) (mew-pick-parse-not)) ((eq cur 'and) (error "'&' alone")) ((eq cur 'or) (error "'|' alone"))))) (defun mew-pick-parse-and/or () (setq mew-inherit-pick-mewlp t) (let ((cur (car mew-inherit-pick-tokens))) (cond ((or (stringp cur) (listp cur)) (unless mew-inherit-pick-omit-and (setq mew-inherit-pick-ret (cons 'and mew-inherit-pick-ret))) (mew-pick-parse-elements)) ((eq cur 'open) (unless mew-inherit-pick-omit-and (setq mew-inherit-pick-ret (cons 'and mew-inherit-pick-ret))) (setq mew-inherit-pick-tokens (cdr mew-inherit-pick-tokens)) (mew-pick-parse-open/close)) ((eq cur 'close) (error "')' alone")) ((eq cur 'not) (unless (or mew-inherit-pick-omit-and2 mew-inherit-pick-omit-and) (setq mew-inherit-pick-ret (cons 'and mew-inherit-pick-ret))) (setq mew-inherit-pick-tokens (cdr mew-inherit-pick-tokens)) (mew-pick-parse-not)) ((eq cur 'and) (unless mew-inherit-pick-omit-and (setq mew-inherit-pick-ret (cons 'and mew-inherit-pick-ret))) (setq mew-inherit-pick-tokens (cdr mew-inherit-pick-tokens)) (mew-pick-parse-elements)) ((eq cur 'or) (setq mew-inherit-pick-ret (cons 'or mew-inherit-pick-ret)) (setq mew-inherit-pick-tokens (cdr mew-inherit-pick-tokens)) (mew-pick-parse-elements))))) (defun mew-pick-parse-not () (if (eq (car mew-inherit-pick-ret) 'not) (setq mew-inherit-pick-ret (cdr mew-inherit-pick-ret)) (setq mew-inherit-pick-ret (cons 'not mew-inherit-pick-ret))) (mew-pick-parse-elements)) (defun mew-pick-parse-open/close () (let ((sub mew-inherit-pick-tokens) (level 0) cur prv pprv found) (catch 'loop (while mew-inherit-pick-tokens (setq pprv prv) (setq prv mew-inherit-pick-tokens) (setq cur (car mew-inherit-pick-tokens)) (setq mew-inherit-pick-tokens (cdr mew-inherit-pick-tokens)) (cond ((eq cur 'open) (setq level (1+ level))) ((eq cur 'close) (if (/= level 0) (setq level (1- level)) (if (not pprv) (error "'( )' is empty")) (setcdr pprv nil) (let ((mew-inherit-pick-tokens sub)) (setq mew-inherit-pick-ret (cons 'open mew-inherit-pick-ret)) (mew-pick-parse1) (setq mew-inherit-pick-ret (cons 'close mew-inherit-pick-ret))) (throw 'loop (setq found t))))))) (unless found (error "')' alone")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Canonicalizer ;;; (defun mew-pick-native-text (prefix token) (let (suffix func) (cond ((eq token 'and) (setq suffix "and")) ((eq token 'or) (setq suffix "or")) ((eq token 'open) (setq suffix "open")) ((eq token 'close) (setq suffix "close")) ((eq token 'not) (setq suffix "not")) ((stringp token) (setq suffix "key")) ((listp token) (setq suffix "kyvl"))) (when suffix (setq func (intern (concat prefix suffix))) (if (fboundp func) (funcall func token))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; mewl/grep ;;; (defun mew-pick-canonicalize-pattern (pattern) (mapconcat 'mew-pick-native-text-mewl (mew-pick-parse (mew-pick-lex pattern)) " ")) (defun mew-pick-native-text-mewl (token) (mew-pick-native-text "mew-pick-pattern-mewl-" token)) (defun mew-pick-pattern-mewl-and (sym) "&") (defun mew-pick-pattern-mewl-or (sym) "|") (defun mew-pick-pattern-mewl-open (sym) "(") (defun mew-pick-pattern-mewl-close (sym) ")") (defun mew-pick-pattern-mewl-not (sym) "!") (defun mew-pick-pattern-mewl-key (key) key) (defun mew-pick-pattern-mewl-kyvl (kyvl) (format "%s%s%s" (nth 1 kyvl) (nth 0 kyvl) (nth 2 kyvl))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Hyper Estraier ;;; (defun mew-pick-canonicalize-pattern-est (pattern) (let ((mew-inherit-pick-omit-and2 t)) (mapconcat 'mew-pick-native-text-est (mew-pick-parse (mew-pick-lex pattern)) " "))) (defun mew-pick-native-text-est (token) (mew-pick-native-text "mew-pick-pattern-est-" token)) (defun mew-pick-pattern-est-and (sym) "AND") (defun mew-pick-pattern-est-or (sym) "OR") (defun mew-pick-pattern-est-open (sym) (error "'(' is not supported")) (defun mew-pick-pattern-est-close (sym) (error "')' is not supported")) (defun mew-pick-pattern-est-not (sym) "ANDNOT") (defun mew-pick-pattern-est-key (key) key) (defun mew-pick-pattern-est-kyvl (kyvl) (error "'%s' is not supported" kyvl)) (defvar mew-pick-filter-est-head-fields "date,subject,from,to,cc,resent-from,resent-to,resent-cc,reply-to,mail-followup-to,x-mail-count,x-ml-count,x-ml-name,x-seqno,x-sequence,mailinglist-id,message-id,in-reply-to,references,newsgroups,followup-to") (defun mew-pick-filter-est-kyvl (kyvl) (unless (and (listp kyvl) (= (length kyvl) 3)) (error "Filter %s is invalid" kyvl)) (let ((op (nth 0 kyvl)) (ky (nth 1 kyvl)) (vl (nth 2 kyvl))) (if (string= ky "head") (setq ky mew-pick-filter-est-head-fields)) (cond ((string= op "=") (setq op "ISTRINC")) ((string= op "==") (setq op "STRINC")) ((string= op "!=") (setq op "!ISTRINC")) ((string= op "!==") (setq op "!STRINC")) (t (error "'%s' is not supported" op))) (format "%s %s %s" ky op vl))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Google ;;; (defun mew-pick-canonicalize-pattern-google (pattern) (let ((mew-inherit-pick-omit-and t) (tokens (mew-pick-parse (mew-pick-lex pattern))) ret) (dolist (token tokens) (if (eq token 'not) (if (stringp (car tokens)) (progn (setq ret (cons (concat "-" (car tokens)) ret)) (setq tokens (cdr tokens))) nil) ;; xxx (setq ret (cons token ret)))) (mapconcat 'mew-pick-native-text-google (nreverse ret) " "))) (defun mew-pick-native-text-google (token) (mew-pick-native-text "mew-pick-pattern-google-" token)) (defun mew-pick-pattern-google-and (sym) "and") (defun mew-pick-pattern-google-or (sym) "or") (defun mew-pick-pattern-google-open (sym) (error "'(' is not supported")) (defun mew-pick-pattern-google-close (sym) (error "')' is not supported")) (defun mew-pick-pattern-google-not (sym) "-") (defun mew-pick-pattern-google-key (key) key) (defun mew-pick-pattern-google-kyvl (kyvl) (let ((op (nth 0 kyvl))) (error "'%s' is not supported" op))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; WDS ;;; (defun mew-pick-canonicalize-pattern-wds (pattern) (let ((mew-inherit-pick-omit-and t) (tokens (mew-pick-parse (mew-pick-lex pattern))) ret) (dolist (token tokens) (if (eq token 'not) (if (stringp (car tokens)) (progn (setq ret (cons (concat "-" (car tokens)) ret)) (setq tokens (cdr tokens))) nil) ;; xxx (setq ret (cons token ret)))) (mapconcat 'mew-pick-native-text-wds (nreverse ret) " "))) (defun mew-pick-native-text-wds (token) (mew-pick-native-text "mew-pick-pattern-wds-" token)) (defun mew-pick-pattern-wds-and (sym) "") (defun mew-pick-pattern-wds-or (sym) "OR") (defun mew-pick-pattern-wds-open (sym) "(") (defun mew-pick-pattern-wds-close (sym) ")") (defun mew-pick-pattern-wds-not (sym) "-") (defun mew-pick-pattern-wds-key (key) key) (defun mew-pick-pattern-wds-kyvl (kyvl) (let ((op (nth 0 kyvl))) (error "'%s' is not supported" op))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Spotlight ;;; (defun mew-pick-canonicalize-pattern-spotlight (pattern) (let* ((tokens (mew-pick-parse (mew-pick-lex pattern))) (str (mapconcat 'mew-pick-native-text-spotlight tokens " "))) (concat "kMDItemContentType == \"mew\"w && " str))) (defun mew-pick-native-text-spotlight (token) (mew-pick-native-text "mew-pick-pattern-spotlight-" token)) (defun mew-pick-pattern-spotlight-and (sym) "&&") (defun mew-pick-pattern-spotlight-or (sym) "||") (defun mew-pick-pattern-spotlight-open (sym) "(") (defun mew-pick-pattern-spotlight-close (sym) ")") (defun mew-pick-pattern-spotlight-not (sym) (error "'!' is not supported")) (defun mew-pick-pattern-spotlight-key (key) (format "kMDItemTextContent == \"%s\"wc" key)) (defun mew-pick-pattern-spotlight-kyvl (kyvl) (let ((op (nth 0 kyvl)) (ky (nth 1 kyvl)) (vl (nth 2 kyvl)) kmd) (cond ((string= ky "subject") (setq kmd "kMDItemTitle")) ((string= ky "from") (setq kmd "kMDItemAuthors")) ((string= ky "body") (setq kmd "kMDItemTextContent")) (t (error "'%s' is not supported" ky))) (cond ((string= op "=") (format "%s == \"%s\"wc" kmd vl)) ((string= op "==") (format "%s == \"%s\"w" kmd vl)) ;; ((string= op "!=") ;; (format "%s != \"%s\"wc" kmd vl)) ;; ((string= op "!==") ;; (format "%s != \"%s\"c" kmd vl)) (t (error "'%s' is not supported" op))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Old ;;; (defun mew-summary-grep-old () "Obsoleted command." (interactive) (mew-message-for-summary "This command was obsoleted. Use '\\[mew-summary-pick]'")) (provide 'mew-pick) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-pick.el ends here kazu-yamamoto-Mew-ff9c41b/mew-pop.el000066400000000000000000001022101256455547000174550ustar00rootroot00000000000000;;; mew-pop.el ;; Author: Kazu Yamamoto ;; Created: Jun 28, 2000 ;;; Code: (require 'mew) (defvar mew-pop-msgid-file ".mew-msgid") (defvar mew-pop-folder-alist (list (mew-folder-func mew-pop-inbox-folder))) (defun mew-pop-folder-alist () mew-pop-folder-alist) ;; It is impossible to implement mew-pop-skip-uidl since ;; messages cannot be gained access by UID. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; POP info ;;; (defvar mew-pop-info-list '("server" "port" "process" "ssh-process" "ssl-process" "status" "directive" "bnm" "mdb" "rtrs" "dels" "refs" "rmvs" "kils" "left" "uidl" "range" "rttl" "rcnt" "dttl" "dcnt" "hlds" "user" "auth" "auth-list" "key" "passwd" "account" "size" "truncated" "get-body" "flush" "no-msg" "msgdb" "done" "dispatched" "error" "body-lines" "delete" "case" "virtual-info" "disp-info" "status-buf")) (mew-info-defun "mew-pop-" mew-pop-info-list) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; FSM ;;; (defvar mew-pop-fsm '(("greeting" nil ("\\+OK" . "capa")) ("capa" t ("\\+OK" . "auth") ("-ERR" . "pswd")) ("auth-cram-md5" nil ("\\+OK" . "pwd-cram-md5") ("-ERR" . "wpwd")) ("pwd-cram-md5" nil ("\\+OK" . "list") ("-ERR" . "wpwd")) ("auth-plain" nil ("\\+OK" . "pwd-plain") ("-ERR" . "wpwd")) ("pwd-plain" nil ("\\+OK" . "list") ("-ERR" . "wpwd")) ("apop" nil ("\\+OK" . "list") ("-ERR" . "wpwd")) ("user" nil ("\\+OK" . "pass") ("-ERR" . "wpwd2")) ("pass" nil ("\\+OK" . "list") ("-ERR" . "wpwd")) ("list" t ("\\+OK" . "uidl")) ("uidl" t ("\\+OK" . "umsg") ("-ERR" . "nouidl")) ("dels" nil ("\\+OK" . "dels")) ("retr" t ("\\+OK" . "dele")) ("dele" nil ("\\+OK" . "retr")) ("quit" nil ("\\+OK" . "noop")))) (defun mew-pop-fsm-by-status (status) (assoc status mew-pop-fsm)) (defun mew-pop-fsm-next (status code) (cdr (mew-assoc-match code (nthcdr 2 (mew-pop-fsm-by-status status)) 0))) (defun mew-pop-fsm-reply (status) (nth 1 (mew-pop-fsm-by-status status))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Structure ;;; (mew-defstruct popinfo num uid size delete fldmsg) (defun mew-pop-refileinfo-to-popinfo (refileinfo num) (cons num refileinfo)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filters ;;; (defun mew-pop-secure-p (pnm) (or (mew-pop-get-ssh-process pnm) (mew-pop-get-ssl-process pnm))) (defun mew-pop-command-capa (pro pnm) (mew-net-status (mew-pop-get-status-buf pnm) "Auth'ing" nil (mew-pop-secure-p pnm)) (if (re-search-forward "<[=!-;?-~]+@[=!-;?-~]+>" nil t) (mew-pop-set-key pnm (mew-match-string 0))) (mew-pop-process-send-string pro "CAPA")) (defun mew-pop-command-auth (pro pnm) (cond ((eq (mew-pop-get-auth pnm) t) ;; t means SASL (let ((auth-list (mew-pop-get-auth-list pnm)) auth func) (save-excursion (goto-char (point-min)) (if (re-search-forward "SASL \\([^\r\n]+\\)" nil t) (setq auth (mew-auth-select (mew-match-string 1) auth-list)))) (if (and auth (setq func (mew-pop-auth-get-func auth)) (fboundp func)) (progn (mew-pop-set-auth pnm auth) (funcall func pro pnm)) (mew-pop-debug "" "No preferred POP AUTH.\n") (mew-pop-command-wpwd2 pro pnm)))) (t (mew-pop-command-pswd pro pnm)))) (defun mew-pop-command-pswd (pro pnm) (let ((auth (mew-pop-get-auth pnm))) (cond ((or (eq auth 'pass) (eq auth 'user)) (mew-pop-set-status pnm "user") (mew-pop-command-user pro pnm)) (t (mew-pop-set-status pnm "apop") (mew-pop-command-apop pro pnm))))) (defun mew-pop-command-user (pro pnm) (let ((user (mew-pop-get-user pnm))) (mew-pop-process-send-string pro "USER %s" user))) (defun mew-pop-command-pass (pro pnm) (let* ((prompt (format "POP password (%s): " (mew-pop-get-account pnm))) (passwd (mew-pop-input-passwd prompt pnm))) (mew-pop-message pnm "Sending your POP password to the POP server...") (mew-pop-process-send-string pro "PASS %s" passwd))) (defun mew-pop-command-apop (pro pnm) (let ((user (mew-pop-get-user pnm)) (prompt (format "APOP password (%s): " (mew-pop-get-account pnm))) (key (mew-pop-get-key pnm)) passwd kmd5) (cond (key (setq passwd (mew-pop-input-passwd prompt pnm)) (setq kmd5 (mew-keyed-md5 key passwd)) (mew-pop-message pnm "Sending your APOP password to the POP server...") (mew-pop-process-send-string pro "APOP %s %s" user kmd5)) (t (mew-passwd-set-passwd (mew-pop-passtag pnm) nil) (mew-pop-message pnm "APOP password is not supported by this server") (mew-pop-command-quit2 pro pnm))))) (defun mew-pop-command-wpwd (pro pnm) (let ((directive (mew-pop-get-directive pnm)) (bnm (mew-pop-get-bnm pnm)) (auth (mew-pop-get-auth pnm)) (clear-pass t)) (goto-char (point-min)) (cond ((or (looking-at "-ERR \\[IN-USE\\]") ;; RFC2449 (re-search-forward " lock" nil t)) ;; for old servers: very ad hoc (mew-pop-message pnm "The mailbox is locked!") (setq clear-pass nil)) ((or (eq auth 'pass) (eq auth 'user)) (mew-pop-message pnm "POP password is wrong!")) ((eq auth 'apop) (mew-pop-message pnm "APOP password is wrong!")) ((stringp auth) (mew-pop-message pnm "%s password is wrong!" (upcase auth))) (t ;; pnm may be cleared already (mew-pop-message pnm "POP password is wrong!"))) (if clear-pass (mew-passwd-set-passwd (mew-pop-passtag pnm) nil)) (if (eq directive 'exec) (mew-summary-visible-buffer bnm)) (mew-pop-command-quit2 pro pnm))) (defun mew-pop-command-wpwd2 (pro pnm) (let ((directive (mew-pop-get-directive pnm)) (status (mew-pop-get-status pnm)) (bnm (mew-pop-get-bnm pnm))) (if (string= status "auth") (mew-pop-message pnm "No POP AUTH available!") (mew-pop-message pnm "Stronger password scheme should be used!")) (mew-passwd-set-passwd (mew-pop-passtag pnm) nil) (if (eq directive 'exec) (mew-summary-visible-buffer bnm)) (mew-pop-command-quit2 pro pnm))) (defun mew-pop-command-list (pro pnm) (mew-net-status (mew-pop-get-status-buf pnm) "Checking" nil (mew-pop-secure-p pnm)) (let ((directive (mew-pop-get-directive pnm))) (cond ((or (eq directive 'get) (eq directive 'exec) (eq directive 'sync)) (mew-pop-set-status pnm "uidl") (mew-pop-process-send-string pro "UIDL")) (t (mew-pop-process-send-string pro "LIST"))))) (defun mew-pop-command-uidl (pro pnm) (let (msgs num siz) (while (re-search-forward "^\\([0-9]+\\) +\\([0-9]+\\)" nil t) (setq num (mew-match-string 1)) (setq siz (mew-match-string 2)) (setq msgs (cons (mew-make-popinfo :num num :size siz) msgs))) (if msgs (progn (setq msgs (nreverse msgs)) (mew-pop-set-rtrs pnm msgs) (mew-pop-set-left pnm (length msgs)) (mew-pop-process-send-string pro "UIDL")) (mew-pop-set-status pnm "quit") (mew-pop-command-quit pro pnm)))) ;; The POP server does not support UIDL. (defun mew-pop-command-nouidl (pro pnm) (let ((directive (mew-pop-get-directive pnm))) (if (or (eq directive 'scan) (eq directive 'exec) (eq directive 'sync)) (progn (mew-pop-message pnm "POP server does not support this command") (mew-pop-command-quit2 pro pnm)) (mew-pop-set-size pnm 0) ;; To get the entire message (mew-pop-set-rttl pnm (mew-pop-get-left pnm)) (when (mew-pop-get-delete pnm) (dolist (rtr (mew-pop-get-rtrs pnm)) (mew-popinfo-set-delete rtr t))) (mew-pop-command-pre-retr pro pnm)))) (defun mew-pop-command-umsg (pro pnm) (let* ((directive (mew-pop-get-directive pnm)) (popinfos (mew-pop-get-rtrs pnm)) ;; popinfo (refs (mew-pop-get-refs pnm)) ;; refileinfo (rmvs (mew-pop-get-rmvs pnm)) (del-time (mew-pop-get-delete pnm)) (bnm (mew-pop-get-bnm pnm)) (range (mew-pop-get-range pnm)) (ctime (current-time)) (left 0) rtr rtrs dels num uid uidl old-uidl uid-time hlds) (cond ((eq directive 'inc) (setq old-uidl (mew-net-uidl-db-get (mew-pop-passtag pnm)))) ((eq directive 'biff) (setq old-uidl (mew-net-uidl-db-get (mew-pop-passtag pnm)))) ((eq directive 'scan) (if (eq range nil) ;; update (setq old-uidl (mew-lisp-load (mew-expand-file bnm mew-pop-msgid-file)))))) (while (re-search-forward "^\\([0-9]+\\) +\\([!-~]*\\)" nil t) (setq left (1+ left)) (setq num (mew-match-string 1)) (setq uid (mew-match-string 2)) (setq uid-time nil) ;; A broken POP server may return a null UID. (if (string= uid "") (setq uid nil)) (cond ((eq directive 'get) (cond ((setq rtr (assoc uid refs)) (setq rtr (mew-pop-refileinfo-to-popinfo rtr num)) (setq rtrs (cons rtr rtrs))) ((member uid rmvs) (setq dels (cons num dels))))) ((eq directive 'exec) (if (member uid rmvs) (setq dels (cons num dels)))) ((eq directive 'biff) (when (and uid (not (assoc uid old-uidl))) (setq rtr (mew-make-popinfo :num num)) (setq rtrs (cons rtr rtrs)))) ((eq directive 'scan) (when uid (setq uidl (cons uid uidl)) (when (or range ;; all, last:n (not (member uid old-uidl))) ;; update (setq rtr (assoc num popinfos)) (mew-popinfo-set-uid rtr uid) (setq rtrs (cons rtr rtrs))))) ((eq directive 'sync) (when uid (setq hlds (cons uid hlds)))) ((eq directive 'inc) (if uid (setq uid-time (cdr (assoc uid old-uidl)))) (cond (uid-time (setq uidl (cons (cons uid uid-time) uidl)) (if (mew-expired-p uid-time del-time) (setq dels (cons num dels)))) (t (setq uidl (cons (cons uid ctime) uidl)) (setq rtr (assoc num popinfos)) (mew-popinfo-set-uid rtr uid) (if (eq del-time t) (mew-popinfo-set-delete rtr t)) (setq rtrs (cons rtr rtrs))))))) (mew-pop-set-uidl pnm uidl) ;; last:n (when (and (eq directive 'scan) (integerp range)) (mew-ntake range rtrs)) (setq rtrs (nreverse rtrs)) (setq dels (nreverse dels)) (setq hlds (nreverse hlds)) (mew-pop-set-rtrs pnm rtrs) (mew-pop-set-dels pnm dels) (mew-pop-set-hlds pnm hlds) (mew-pop-set-rttl pnm (length rtrs)) (mew-pop-set-dttl pnm (length dels)) (mew-pop-set-left pnm left) (mew-pop-set-dispatched pnm t) (cond ((or (eq directive 'sync) (eq directive 'biff)) (mew-pop-set-status pnm "quit") (mew-pop-command-quit pro pnm)) (dels (mew-pop-command-pre-dels pro pnm)) ((eq directive 'exec) ;; no dels (mew-pop-set-status pnm "quit") (mew-pop-command-quit pro pnm)) (t (mew-pop-command-pre-retr pro pnm))))) (defun mew-pop-command-pre-dels (pro pnm) (let* ((directive (mew-pop-get-directive pnm)) (dttl (mew-pop-get-dttl pnm))) (cond ((= dttl 0) ;; should not occur (mew-pop-command-pre-retr pro pnm)) ((= dttl 1) (if (eq directive 'exec) (mew-pop-message pnm "Deleting 1 message in background...")) (mew-pop-set-status pnm "dels") (mew-pop-command-dels pro pnm)) (t (if (eq directive 'exec) (mew-pop-message pnm "Deleting %d messages in background..." dttl)) (mew-pop-set-status pnm "dels") (mew-pop-command-dels pro pnm))))) (defun mew-pop-command-dels (pro pnm) (mew-net-status1 (mew-pop-get-status-buf pnm) "Deleting" (mew-pop-get-dttl pnm) (mew-pop-get-dcnt pnm) (mew-pop-secure-p pnm)) (let ((directive (mew-pop-get-directive pnm)) (dels (mew-pop-get-dels pnm)) (left (mew-pop-get-left pnm)) num) (if (null dels) (if (eq directive 'exec) (progn (mew-pop-set-status pnm "quit") (mew-pop-command-quit pro pnm)) (mew-pop-command-pre-retr pro pnm)) (mew-pop-set-dcnt pnm (1+ (mew-pop-get-dcnt pnm))) (setq num (car dels)) (mew-pop-set-dels pnm (cdr dels)) (mew-pop-set-left pnm (1- left)) (mew-pop-process-send-string pro "DELE %s" num)))) (defun mew-pop-command-pre-retr (pro pnm) (let* ((rttl (mew-pop-get-rttl pnm))) (cond ((= rttl 0) (mew-pop-message pnm "No new messages") (mew-pop-set-status pnm "quit") (mew-pop-command-quit pro pnm)) ((= rttl 1) (mew-pop-message pnm "Retrieving 1 message in background...") (mew-pop-set-status pnm "retr") (mew-pop-command-retr pro pnm)) (t (mew-pop-message pnm "Retrieving %d messages in background..." rttl) (mew-pop-set-status pnm "retr") (mew-pop-command-retr pro pnm))))) (defun mew-pop-command-retr (pro pnm) (mew-net-status2 (mew-pop-get-status-buf pnm) (mew-pop-get-rttl pnm) (mew-pop-get-rcnt pnm) (mew-popinfo-get-size (car (mew-pop-get-rtrs pnm))) 'zero (mew-pop-secure-p pnm)) (let* ((directive (mew-pop-get-directive pnm)) (rtrs (mew-pop-get-rtrs pnm)) (rtr (car rtrs)) (num (mew-popinfo-get-num rtr)) (siz (mew-popinfo-get-size rtr)) (lim (mew-pop-get-size pnm)) (lines (mew-pop-get-body-lines pnm)) (get-body (mew-pop-get-get-body pnm))) (cond ((or (null rtr) (eq directive 'biff)) (mew-pop-set-truncated pnm nil) (mew-pop-set-status pnm "quit") (mew-pop-command-quit pro pnm)) ((eq directive 'get) (mew-pop-set-truncated pnm nil) (mew-pop-process-send-string pro "RETR %s" num)) ((and (eq directive 'scan) (not get-body)) (mew-pop-set-truncated pnm t) (mew-pop-process-send-string pro "TOP %s 0" num)) ((or (= lim 0) (< (string-to-number siz) lim)) (mew-pop-set-truncated pnm nil) (mew-pop-process-send-string pro "RETR %s" num)) (t (mew-pop-set-truncated pnm t) (mew-pop-process-send-string pro "TOP %s %d" num lines))))) (defun mew-pop-command-dele (pro pnm) (let* ((directive (mew-pop-get-directive pnm)) (width (1- (mew-scan-width))) (left (mew-pop-get-left pnm)) (rtrs (mew-pop-get-rtrs pnm)) (rtr (car rtrs)) (num (mew-popinfo-get-num rtr)) (uid (mew-popinfo-get-uid rtr)) (siz (mew-popinfo-get-size rtr)) (del (mew-popinfo-get-delete rtr)) (fld-msg (mew-popinfo-get-fldmsg rtr)) (truncated (mew-pop-get-truncated pnm)) (case (mew-pop-get-case pnm)) fld msg vec file msg-file lmsg mark folder) (cond ((null fld-msg) (setq fld (mew-pop-get-bnm pnm))) ((stringp fld-msg) (setq fld fld-msg)) ((listp fld-msg) (mew-set '(fld msg) fld-msg) (setq lmsg msg))) (setq folder (mew-case:folder-folder fld)) ;; deleting +OK (goto-char (point-min)) (forward-line) (delete-region (point-min) (point)) ;; line delimiters (mew-eol-fix-for-read) (mew-dot-delete) (setq msg-file (mew-net-get-new-message pnm fld msg 'mew-pop-get-msgdb 'mew-pop-set-msgdb)) (setq msg (car msg-file) file (cdr msg-file)) (goto-char (point-min)) (cond (truncated (mew-header-insert-xmu uid siz t (and (eq directive 'inc) (or (mew-pop-get-case pnm) mew-case-default)))) ((eq directive 'scan) (mew-header-insert-xmu uid siz nil)) ((and (eq directive 'get) (mew-folder-popp folder)) (mew-header-insert-xmu uid siz nil))) (catch 'write-error (condition-case nil (let ((write-region-inhibit-fsync mew-use-async-write)) (mew-frwlet mew-cs-dummy mew-cs-text-for-write (write-region (point-min) (point-max) file nil 'no-msg))) (error (mew-pop-set-status pnm "quit") (mew-pop-command-quit pro pnm) (throw 'write-error nil))) (mew-pop-set-rcnt pnm (1+ (mew-pop-get-rcnt pnm))) (when (file-exists-p file) (mew-set-file-modes file) (mew-set-file-type file) ;; (mew-set-buffer-multibyte t) (setq vec (mew-scan-header)) (mew-scan-set-folder vec fld) (mew-scan-set-message vec msg) (if (or (eq directive 'inc) (eq directive 'scan)) (setq mark (mew-scan-inbox-action vec case))) (if (and mark (eq directive 'scan) (stringp mark)) ;; in the case of refiling (setq mark nil)) (mew-scan-body vec) (mew-set-buffer-multibyte nil) (mew-scan-insert-line fld vec width lmsg mark)) (mew-pop-set-rtrs pnm (cdr rtrs)) (if (and del (not truncated)) (progn (mew-pop-set-left pnm (1- left)) (mew-pop-process-send-string pro "DELE %s" num)) (mew-pop-set-status pnm "retr") (mew-pop-command-retr pro pnm))))) (defun mew-pop-command-quit (pro pnm) (mew-pop-set-done pnm t) (mew-pop-process-send-string pro "QUIT")) (defun mew-pop-command-quit2 (pro pnm) (mew-pop-set-done pnm t) (mew-pop-set-error pnm t) (mew-pop-set-status pnm "quit") (mew-pop-process-send-string pro "QUIT")) (defun mew-pop-command-noop (pro pnm) ()) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; AUTH ;;; (defvar mew-pop-auth-alist '(("CRAM-MD5" mew-pop-command-auth-cram-md5) ("PLAIN" mew-pop-command-auth-plain))) (defun mew-pop-auth-get-func (auth) (nth 1 (mew-assoc-case-equal auth mew-pop-auth-alist 0))) (defun mew-pop-command-auth-cram-md5 (pro pnm) (mew-pop-process-send-string pro "AUTH CRAM-MD5") (mew-pop-set-status pnm "auth-cram-md5")) (defun mew-pop-command-pwd-cram-md5 (pro pnm) (let ((user (mew-pop-get-user pnm)) challenge passwd cram-md5) (save-excursion (goto-char (point-min)) (if (re-search-forward" \\([a-zA-Z0-9+/]+=*\\)" nil t) (setq challenge (mew-match-string 1)))) (setq passwd (mew-pop-input-passwd "POP CRAM-MD5: " pnm)) (setq cram-md5 (mew-cram-md5 user passwd challenge)) (mew-pop-process-send-string pro cram-md5))) (defun mew-pop-command-auth-plain (pro pnm) (mew-pop-process-send-string pro "AUTH PLAIN") (mew-pop-set-status pnm "auth-plain")) (defun mew-pop-command-pwd-plain (pro pnm) (let* ((prompt (format "POP PLAIN password (%s): " (mew-pop-get-account pnm))) (passwd (mew-pop-input-passwd prompt pnm)) (user (mew-pop-get-user pnm)) (plain (mew-base64-encode-string (format "\0%s\0%s" user passwd)))) (mew-pop-process-send-string pro "%s" plain))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sub functions ;;; (defconst mew-pop-info-prefix "mew-pop-info-") (defun mew-pop-info-name (case) (let ((server (mew-pop-server case)) (port (mew-*-to-string (mew-pop-port case))) (user (mew-pop-user case)) (sshsrv (mew-pop-ssh-server case)) (name mew-pop-info-prefix)) (setq name (concat name user "@" server)) (unless (mew-port-equal port mew-pop-port) (setq name (concat name ":" port))) (if sshsrv (concat name "%" sshsrv) name))) (defun mew-pop-buffer-name (pnm) (concat mew-buffer-prefix pnm)) (defun mew-pop-process-send-string (pro &rest args) (let ((str (apply 'format args))) (mew-pop-debug "=SEND=" str) (if (and (processp pro) (eq (process-status pro) 'open)) (process-send-string pro (concat str mew-cs-eol)) (message "POP time out")))) ;; not mew-pop-message (defun mew-pop-message (pnm &rest args) (or (mew-pop-get-no-msg pnm) (apply 'message args))) (defun mew-pop-message2 (pnm msg left) (let (msg2) (cond ((or (null left) (= left 0)) ) ((= left 1) (setq msg2 " (1 message left)")) (t (setq msg2 (format " (%d messages left)" left)))) (if msg2 (setq msg (concat msg msg2))) (mew-pop-message pnm msg))) (defun mew-pop-passtag (pnm) (let ((server (mew-pop-get-server pnm)) (port (mew-pop-get-port pnm)) (user (mew-pop-get-user pnm))) (concat user "@" server ":" port))) (defun mew-pop-passtag2 (case) (let ((server (mew-pop-server case)) (port (mew-pop-port case)) (user (mew-pop-user case))) (concat user "@" server ":" port))) (defun mew-pop-input-passwd (prompt pnm) (let ((directive (mew-pop-get-directive pnm)) (pro (mew-pop-get-process pnm)) (tag (mew-pop-passtag pnm)) pass) (if (eq directive 'biff) (or (mew-pop-get-passwd pnm) ;; mew-pop-biff (mew-input-passwd prompt tag)) ;; mew-pop-check (setq pass (mew-input-passwd prompt tag)) (unless (and (processp pro) (eq (process-status pro) 'open)) (mew-passwd-set-passwd tag nil)) pass))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Opening POP ;;; (defun mew-pop-open (pnm server port no-msg) (let ((sprt (mew-*-to-port port)) pro tm) (condition-case emsg (progn (setq tm (run-at-time mew-pop-timeout-time nil 'mew-pop-timeout)) (or no-msg (message "Connecting to the POP server...")) (setq pro (open-network-stream pnm nil server sprt)) (mew-process-silent-exit pro) (mew-set-process-cs pro mew-cs-text-for-net mew-cs-text-for-net) (or no-msg (message "Connecting to the POP server...done"))) (quit (or no-msg (message "Cannot connect to the POP server")) (setq pro nil)) (error (or no-msg (message "%s, %s" (nth 1 emsg) (nth 2 emsg))) (setq pro nil))) (if tm (cancel-timer tm)) pro)) (defun mew-pop-timeout () (signal 'quit nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Launcher ;;; (defun mew-pop-retrieve (case directive bnm &rest args) ;; in +inbox (let* ((server (mew-pop-server case)) (user (mew-pop-user case)) (port (mew-*-to-string (mew-pop-port case))) (sshsrv (mew-pop-ssh-server case)) (sslp (mew-pop-ssl case)) (sslport (mew-pop-ssl-port case)) (proxysrv (mew-pop-proxy-server case)) (proxyport (mew-pop-proxy-port case)) (pnm (mew-pop-info-name case)) (buf (get-buffer-create (mew-pop-buffer-name pnm))) (no-msg (eq directive 'biff)) process sshname sshpro sslname sslpro lport tls virtual-info disp-info virtual) (if (mew-pop-get-process pnm) (message "Another POP process is running. Try later") (cond (sshsrv (setq sshpro (mew-open-ssh-stream case server port sshsrv)) (when sshpro (setq sshname (process-name sshpro)) (setq lport (mew-ssh-pnm-to-lport sshname)) (when lport (setq process (mew-pop-open pnm "localhost" lport no-msg))))) (sslp (if (mew-port-equal port sslport) (setq tls mew-tls-pop)) (setq sslpro (mew-open-ssl-stream case server sslport tls)) (when sslpro (setq sslname (process-name sslpro)) (setq lport (mew-ssl-pnm-to-lport sslname)) (when lport (setq process (mew-pop-open pnm mew-ssl-localhost lport no-msg))))) (proxysrv (setq process (mew-pop-open pnm proxysrv proxyport no-msg))) (t (setq process (mew-pop-open pnm server port no-msg)))) (if (null process) (if (eq directive 'exec) (mew-summary-visible-buffer bnm)) (mew-summary-lock process "POPing" (or sshpro sslpro)) (mew-sinfo-set-summary-form (mew-get-summary-form bnm)) (mew-sinfo-set-summary-column (mew-get-summary-column bnm)) (mew-sinfo-set-unread-mark nil) (mew-sinfo-set-scan-id nil) (mew-sinfo-set-scan-md5 nil) (mew-info-clean-up pnm) (mew-pop-set-no-msg pnm no-msg) ;; must come here (mew-pop-message pnm "Communicating with the POP server...") (mew-pop-set-process pnm process) (mew-pop-set-ssh-process pnm sshpro) (mew-pop-set-ssl-process pnm sslpro) (mew-pop-set-server pnm server) (mew-pop-set-port pnm port) (mew-pop-set-user pnm user) (mew-pop-set-account pnm (format "%s@%s" user server)) (mew-pop-set-auth pnm (mew-pop-auth case)) (mew-pop-set-auth-list pnm (mew-pop-auth-list case)) (mew-pop-set-status pnm "greeting") (mew-pop-set-directive pnm directive) (mew-pop-set-bnm pnm bnm) (mew-pop-set-status-buf pnm bnm) (mew-pop-set-rcnt pnm 1) (mew-pop-set-dcnt pnm 1) (mew-pop-set-rttl pnm 0) (mew-pop-set-dttl pnm 0) (mew-pop-set-size pnm (mew-pop-size case)) (mew-pop-set-case pnm case) (mew-pop-set-body-lines pnm (mew-pop-body-lines case)) (cond ((eq directive 'biff) (mew-pop-set-passwd pnm (nth 0 args))) ;; password ((eq directive 'inc) (mew-sinfo-set-unread-mark (mew-get-unread-mark bnm)) (mew-pop-set-flush pnm (nth 0 args)) ;; no-flush (mew-pop-set-delete pnm (mew-pop-delete case))) ((eq directive 'get) (mew-sinfo-set-unread-mark (mew-get-unread-mark bnm)) (mew-pop-set-refs pnm (nth 0 args)) (setq virtual-info (nth 1 args)) (mew-pop-set-virtual-info pnm virtual-info) (setq disp-info (nth 2 args)) (mew-pop-set-disp-info pnm disp-info) (setq virtual (mew-net-virtual-info-get-virtual virtual-info)) (when virtual (mew-pop-set-status-buf pnm virtual) (with-current-buffer virtual (mew-summary-lock process "POPing" (or sshpro sslpro))))) ((eq directive 'scan) (mew-pop-set-range pnm (nth 0 args)) (mew-pop-set-get-body pnm (nth 1 args)) (if (mew-pop-get-range pnm) (progn (mew-pop-set-mdb pnm (mew-summary-mark-collect4)) (mew-net-folder-clean)) (mew-sinfo-set-unread-mark (mew-get-unread-mark bnm)))) ((eq directive 'sync) ) ((eq directive 'exec) (mew-pop-set-rmvs pnm (nth 0 (nth 0 args))) (mew-pop-set-kils pnm (nth 1 (nth 0 args))))) (mew-sinfo-set-start-point (point)) ;; after erase-buffer ;; (set-process-sentinel process 'mew-pop-sentinel) (set-process-filter process 'mew-pop-filter) (set-process-buffer process buf))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filter and sentinel ;;; (defun mew-pop-debug (label string) (when (mew-debug 'net) (with-current-buffer (get-buffer-create mew-buffer-debug) (goto-char (point-max)) (insert (format "\n<%s>\n%s\n" label string))))) (defun mew-pop-filter (process string) (let* ((pnm (process-name process)) (status (mew-pop-get-status pnm)) (mulrep (mew-pop-fsm-reply status)) stay next func) (mew-pop-debug (upcase status) string) (mew-filter ;; Process's buffer (goto-char (point-max)) (mew-set-buffer-multibyte nil) (insert string) (when (string= status "retr") (mew-net-status2 (mew-pop-get-status-buf pnm) (mew-pop-get-rttl pnm) (mew-pop-get-rcnt pnm) (mew-popinfo-get-size (car (mew-pop-get-rtrs pnm))) nil (mew-pop-secure-p pnm))) (cond ((and (and (goto-char (point-min)) (looking-at "-ERR")) (and (goto-char (1- (point-max))) (looking-at "\n$"))) (setq next (mew-pop-fsm-next status "-ERR"))) ((and (and (goto-char (point-min)) (looking-at "\\+")) ;; +OK (or (and mulrep (goto-char (point-max)) (= (forward-line -1) 0) (looking-at "^\\.\r?$")) (and (not mulrep) (goto-char (1- (point-max))) (looking-at "\n$")))) (setq next (mew-pop-fsm-next status "+OK"))) (t (setq stay t))) (unless stay (unless next (setq next "quit")) (mew-pop-set-status pnm next) (setq func (intern-soft (concat "mew-pop-command-" next))) (goto-char (point-min)) (if (fboundp func) (funcall func process pnm) (error "No function called %s" (symbol-name func))) (if (and process (equal (process-buffer process) (current-buffer))) (mew-erase-buffer)))))) (defun mew-pop-sentinel (process event) (let* ((pnm (process-name process)) (directive (mew-pop-get-directive pnm)) (mdb (mew-pop-get-mdb pnm)) (sshpro (mew-pop-get-ssh-process pnm)) (sslpro (mew-pop-get-ssl-process pnm)) (rttl (mew-pop-get-rttl pnm)) (dttl (mew-pop-get-dttl pnm)) (left (mew-pop-get-left pnm)) (bnm (or (mew-pop-get-bnm pnm) (current-buffer))) (flush (mew-pop-get-flush pnm)) (kils (mew-pop-get-kils pnm)) (hlds (mew-pop-get-hlds pnm)) (uidl (mew-pop-get-uidl pnm)) (done (mew-pop-get-done pnm)) (error (mew-pop-get-error pnm)) (file (mew-expand-file bnm mew-pop-msgid-file)) (buf (process-buffer process)) (virtual-info (mew-pop-get-virtual-info pnm)) (disp-info (mew-pop-get-disp-info pnm))) (save-excursion (mew-pop-debug "POP SENTINEL" event) (set-process-buffer process nil) (set-buffer bnm) (mew-summary-mark-recover mdb) (mew-remove-buffer buf) (if (not done) (let* ((rtrs (mew-pop-get-rtrs pnm)) (lefts (length rtrs)) (uid (mew-popinfo-get-uid (car rtrs))) recovered) (mew-pop-message pnm "POP connection is lost") (when (mew-pop-get-dispatched pnm) (cond ((eq directive 'scan) ;; uidl is reversed. (setq uidl (cdr (member uid uidl))) (mew-lisp-save file uidl nil 'unlimit) (setq recovered t)) ((eq directive 'inc) ;; uidl is reversed. (setq uid (assoc uid uidl)) (setq uidl (cdr (member uid uidl))) (mew-net-uidl-db-set (mew-pop-passtag pnm) uidl) (setq recovered t))) (when recovered (mew-pop-message pnm "%d message retrieved. %d messages are left due to an error" (- rttl lefts) lefts) (mew-summary-folder-cache-save)))) (if virtual-info (mew-summary-retrieve-message-for-virtual virtual-info)) (cond (error ;; retain the error message ) ((eq directive 'biff) (and (functionp mew-biff-function) (funcall mew-biff-function rttl))) ((eq directive 'sync) (mew-pop-message pnm "Synchronizing messages...") (mew-net-folder-sync bnm hlds) (mew-pop-message pnm "Synchronizing messages...done")) ((eq directive 'inc) (mew-biff-clear) (mew-net-uidl-db-set (mew-pop-passtag pnm) uidl) (cond ((= rttl 0) (mew-pop-message2 pnm "No new messages" left)) ((= rttl 1) (mew-pop-message2 pnm "1 message retrieved" left) (mew-summary-folder-cache-save)) (t (mew-pop-message2 pnm (format "%d messages retrieved" rttl) left) (mew-summary-folder-cache-save)))) ((eq directive 'get) (cond ((= rttl 0) (mew-pop-message2 pnm "No new messages" left)) ((= rttl 1) (mew-pop-message2 pnm "1 message retrieved" left) (mew-summary-folder-cache-save)) (t (mew-pop-message2 pnm (format "%d messages retrieved" rttl) left) (mew-summary-folder-cache-save)))) ((eq directive 'scan) (mew-biff-clear) (cond ((or (= rttl 0) (null uidl)) (mew-pop-message pnm "No messages scanned")) ((= rttl 1) (mew-pop-message pnm "1 message scanned") (mew-lisp-save file uidl nil 'unlimit) (mew-summary-folder-cache-save)) (t (mew-pop-message pnm "%d messages scanned" rttl) (mew-lisp-save file uidl nil 'unlimit) (mew-summary-folder-cache-save)))) ((eq directive 'exec) (when kils (mew-mark-exec-unlink bnm kils) (mew-mark-kill-invisible) (mew-summary-folder-cache-save)) (cond ((= dttl 0) (mew-pop-message pnm "No messages deleted")) ((= dttl 1) (mew-pop-message pnm "1 message deleted")) (t (mew-pop-message pnm "%d messages deleted" dttl)))))) ;; (and mew-use-async-write (mew-unix-sync)) (mew-net-status-clear (mew-pop-get-status-buf pnm)) (mew-info-clean-up pnm) (set-buffer-modified-p nil) (mew-summary-unlock) (if (and (processp sshpro) (not mew-ssh-keep-connection)) (process-send-string sshpro "exit\n")) (if (and (processp sslpro) (not mew-ssl-keep-connection)) (delete-process sslpro)) (mew-net-disp-info-display disp-info) (unless (eq directive 'biff) (run-hooks 'mew-pop-sentinel-non-biff-hook)) (run-hooks 'mew-pop-sentinel-hook) (when (and mew-auto-flush-queue flush) (mew-smtp-flush-queue mew-case))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Biff ;;; (defun mew-pop-biff () (let* ((case mew-case) (inbox (mew-proto-inbox-folder nil case)) (case:inbox (mew-case-folder case inbox)) (tag (mew-pop-passtag2 case)) passwd) (when (get-buffer case:inbox) (with-current-buffer case:inbox (when (and (mew-summary-exclusive-p 'no-msg) (and (or mew-use-cached-passwd mew-use-master-passwd) (setq passwd (mew-passwd-get-passwd tag)))) (mew-pop-retrieve case 'biff case:inbox passwd)))))) (defun mew-pop-check () "See if messages are arrived by POP." (interactive) (let* ((case mew-case) (inbox (mew-proto-inbox-folder nil case)) (case:inbox (mew-case-folder case inbox))) (when (get-buffer case:inbox) (with-current-buffer case:inbox (when (mew-summary-exclusive-p) (mew-pop-retrieve case 'biff case:inbox)))))) (provide 'mew-pop) ;;; Copyright Notice: ;; Copyright (C) 1999-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-pop.el ends here kazu-yamamoto-Mew-ff9c41b/mew-refile.el000066400000000000000000000774441256455547000201510ustar00rootroot00000000000000;;; mew-refile.el --- Refile for Mew ;; Author: Yoshinari NOMURA ;; Kazu Yamamoto ;; Created: Jun 11, 1994 ;;; Code: (require 'mew) (defmacro mew-summary-refilable (&rest body) `(mew-pickable (mew-summary-not-in-draft (mew-summary-local-or-imap ,@body)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Variables ;;; (defvar mew-refile-msgid-alist nil "Alist of message-id and folder pair") (defvar mew-refile-from-alist nil "Alist of From: address and folder pair") (defvar mew-refile-last-folder nil "Folder name previously you refiled") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Initialize function ;;; (defun mew-refile-setup () ;; load message id alist (or mew-refile-msgid-alist (setq mew-refile-msgid-alist (mew-lisp-load mew-refile-msgid-file))) ;; load from alist (or mew-refile-from-alist (setq mew-refile-from-alist (mew-lisp-load mew-refile-from-file))) (mew-assoc-folder-setup) (add-hook 'kill-emacs-hook 'mew-refile-clean-up)) (defun mew-refile-clean-up () (remove-hook 'kill-emacs-hook 'mew-refile-clean-up) (if (and mew-refile-from-alist (member 'mew-refile-guess-by-from mew-refile-guess-control)) (mew-lisp-save mew-refile-from-file mew-refile-from-alist)) (if (and mew-refile-msgid-alist (member 'mew-refile-guess-by-thread mew-refile-guess-control)) (mew-lisp-save mew-refile-msgid-file mew-refile-msgid-alist)) (setq mew-refile-from-alist nil) (setq mew-refile-msgid-alist nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Guess functions ;;; ;; We have two types of functions in mew-refile-guess-control, ;; guess function and ctrl function. ;; guess function must return a folder list or folder string or nil. ;; guess function must not have a string "ctrl" in its symbol name. ;; ctrl function must have a string "ctrl" in its symbol name. ;; dispatcher returns: ((guess1 guess2 ..) info1 info2 ...) multi guess mode ;; ((guess1) info1 info2 ...) single guess mode ;; info1: ('guess-func-name guess1 guess2 ...) ;; ;; that is, 'car' is a list of judged folders. ;; 'cdr' is a alist of opinions by guess functions. ;; (defun mew-refile-guess (&optional auto show-all) (let ((case-fold-search t) (funcs mew-refile-guess-control) ret guess info stop) (catch 'last (dolist (func funcs) (if (string-match "ctrl" (symbol-name func)) ;; func is control function (when (setq ret (funcall func guess auto)) (setq stop t) (or show-all (throw 'last t))) ;; func is guess function (setq ret (funcall func))) (unless (listp ret) (setq ret (list ret))) (setq info (nconc info (list (cons func ret)))) (unless stop (dolist (re ret) (mew-addq guess re))))) (setq guess (nreverse guess)) (if (not mew-refile-ctrl-multi) (setq guess (list (car guess)))) (cons guess info))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Guess control functions ;;; (defun mew-refile-ctrl-auto-boundary (guess auto) (if auto "stop")) (defun mew-refile-ctrl-throw (guess auto) (if guess "stop")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Dispatcher ;;; (defun mew-refile-guess-from-dispatch (func &optional addr) "Dispatcher to make mew-refile-guess-by-from-* consider mew-refile-guess-from-me-is-special." (let ((from (downcase (or addr (mew-header-parse-address mew-from:) "")))) ;; if From: is my address, addr is the list extracted from To:, Cc: (if (and mew-refile-guess-from-me-is-special (mew-is-my-address mew-regex-my-address-list from)) (let ((addrs (mew-header-parse-address-list mew-refile-guess-key-list)) ret adr) (dolist (addr addrs) (setq adr (funcall func addr)) (mew-addq ret adr)) (nreverse ret)) (funcall func from)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Guess by folder ;;; (defvar mew-assoc-folder nil) (defun mew-folder-func (full &optional name) (if full (cons full name))) (defun mew-assoc-folder-setup () (if mew-use-fast-refile (setq mew-assoc-folder 'mew-assoc-folder-fast) (setq mew-assoc-folder 'mew-assoc-folder-slow))) (defun mew-assoc-folder-slow (key alist sep) ;; Case-sensitive so you can use capital letters for your folders. ;; But this is slow. (let ((skey (downcase key)) (node-regex (concat (regexp-quote sep) "$")) name ret first) (catch 'loop (dolist (al alist) (setq ret al) (setq name (cdr ret)) (when (and (stringp name) (string= (downcase name) skey)) (unless first (setq first ret)) (unless (string-match node-regex (car ret)) (throw 'loop nil))) (setq ret nil))) (if mew-use-node-folder (or ret first) ret))) (defun mew-assoc-folder-fast (key alist sep) ;; Case-insensitive so you cannot use capital letters for your folders. ;; But this is fast. ;; ;; ("+foo/" . "foo") ;; ("+foo/foo" . "foo") (let* ((skey (downcase key)) (node-regex (concat (regexp-quote sep) "$")) ret first) (catch 'loop (while (setq ret (rassoc skey alist)) (unless first (setq first ret)) (unless (string-match node-regex (car ret)) (throw 'loop nil)) (setq alist (cdr (member ret alist))) (setq ret nil))) (if mew-use-node-folder (or ret first) ret))) (defun mew-refile-guess-by-folder () ;; Guess folders by the To:/Cc: field with folder alist. ;; Mainly used for mailing-list. (let* ((to-cc (mew-header-parse-address-list mew-refile-guess-key-list)) (proto mew-inherit-refile-proto) (case mew-inherit-refile-case) (alist (mew-proto-folder-alist proto case)) sep ent ret ml-addr ml-name) (cond ((mew-folder-imapp proto) (setq sep (mew-imap-separator case))) (t (setq sep mew-path-separator))) (dolist (tc to-cc) (setq ml-addr (mew-addrstr-parse-address (or tc ""))) (when ml-addr (setq ml-name (mew-addrstr-extract-user ml-addr)) (setq ent (or (funcall mew-assoc-folder ml-addr alist sep) (funcall mew-assoc-folder ml-name alist sep))) (mew-addq ret (nth 0 ent)))) (nreverse ret))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Guess by alist ;;; (defun mew-refile-guess-by-alist () (let ((alist (mew-refile-guess-alist mew-inherit-refile-case)) (proto mew-inherit-refile-proto)) ;; Guess folders by user-configured alist. (mew-refile-guess-by-alist1 alist proto))) (defun mew-refile-guess-by-alist1 (rule &optional proto) "Return a guessed folder according to the RULE. The syntax of RULE is as follows: rule ::= ' ::= (( ) ( ) ... []) ::= ( |) ( |) ... ::= (t ) | (nil ) There are two special s: nil and t. nil is used to specify to be returned when nothing is guessed. t can specify to be returned in addition to guessed values." (let (key alist val f-or-r header ent ret fin) (dolist (rl rule) (setq key (car rl)) (setq alist (cdr rl)) ;; must not use mew-alist-get-value (cond ((eq key t) (mew-addq ret (if (consp alist) (car alist) alist))) ((eq key nil) (or ret (mew-addq ret (if (consp alist) (car alist) alist)))) ((setq header (mew-header-get-value key)) (dolist (al alist) (setq val (mew-alist-get-key al)) (setq f-or-r (mew-alist-get-value al)) (setq ent nil) (when (and (stringp val) (string-match val header)) (cond ((stringp f-or-r) (setq ent (mew-refile-guess-by-alist2 val header f-or-r))) ((listp f-or-r) (setq ent (mew-refile-guess-by-alist1 f-or-r proto))))) (when ent (if (listp ent) (dolist (et ent) (mew-addq ret et)) (mew-addq ret ent))))))) (if proto (dolist (ent ret fin) (if (string= proto (substring ent 0 1)) (setq fin (cons ent fin)))) (nreverse ret)))) (defun mew-refile-guess-by-alist2 (regex string template) ;; regex: "\\([^@]+\\)@\\([^.]+\\)\\.ad\\.jp" ;; string: "admin@example.org" ;; template: "+net/\\2/\\1" ;; -> "+net/iij/admin" (let (str strs match repl) (string-match regex string) (setq match (cdr (cdr (match-data)))) (while match (setq str nil) (if (car match) (setq str (substring string (car match) (car (cdr match))))) (setq strs (cons str strs)) (setq match (cdr (cdr match)))) (setq strs (cons nil (nreverse strs))) ;; cons nil for 0th (while (string-match "\\\\\\([1-9]\\)" template) (setq repl (nth (string-to-number (match-string 1 template)) strs)) (setq template (replace-match (or repl "") nil nil template))) template)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Guess by thread ;;; (defun mew-refile-guess-by-thread () ;; Guess folders by thread with alist created by ;; mew-refile-guess-by-thread-learn. (let ((msgid (or (mew-idstr-get-last-id (mew-header-get-value mew-references:)) (mew-idstr-get-first-id (mew-header-get-value mew-in-reply-to:)))) (proto mew-inherit-refile-proto)) (when msgid (let ((ret (nth 1 (assoc msgid mew-refile-msgid-alist)))) (if (and ret (string= proto (substring ret 0 1))) ret))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Guess by from folder ;;; (defun mew-refile-guess-by-from-folder (&optional addr) ;; Guess folders by the From: field with folders under +from. (mew-refile-guess-from-dispatch 'mew-refile-guess-by-from-folder-body addr)) (defun mew-refile-guess-by-from-folder-body (&optional addr) (let* ((proto mew-inherit-refile-proto) (case mew-inherit-refile-case) (list (mew-proto-friend-folder-list proto case)) (sep (if (mew-folder-imapp proto) (mew-imap-separator case) mew-path-separator)) (qsep (regexp-quote sep)) (from (downcase (or addr (mew-header-parse-address mew-from:) ""))) (user (mew-addrstr-extract-user from)) (from-regex (concat qsep (regexp-quote from) "$")) (user-regex (concat qsep (regexp-quote user) "$"))) (or (mew-member-match2 from-regex list) (mew-member-match2 user-regex list)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Guess by from ;;; (defun mew-refile-guess-by-from (&optional addr) ;; Guess folders by the From: field with alist created by ;; mew-refile-guess-by-from-learn. (mew-refile-guess-from-dispatch 'mew-refile-guess-by-from-body addr)) (defun mew-refile-guess-by-from-body (&optional addr) (let ((from (downcase (or addr (mew-header-parse-address mew-from:) ""))) (proto mew-inherit-refile-proto)) (when from (let ((ret (cdr (assoc from mew-refile-from-alist)))) (if (and ret (string= proto (substring ret 0 1))) ret))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Guess by newsgroup ;;; (defun mew-refile-guess-by-newsgroups () ;; Guess folders by the Newsgroups field with folder alist. (let* ((newsgroups (mew-addrstr-parse-value-list2 (mew-header-get-value mew-newsgroups:))) (proto mew-inherit-refile-proto) (case mew-inherit-refile-case) (alist (mew-proto-folder-alist proto case)) ;; local folders ent ret) (dolist (newsgroup newsgroups) (setq ent (funcall mew-assoc-folder newsgroup alist mew-path-separator)) (mew-addq ret (nth 0 ent))) (nreverse ret))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Guess by default ;;; (defun mew-refile-guess-by-default (&optional addr) ;; Concat +from and user. (mew-refile-guess-from-dispatch 'mew-refile-guess-by-default-body addr)) (defun mew-refile-guess-by-default-body (&optional addr) (let* ((proto mew-inherit-refile-proto) (case mew-inherit-refile-case) (fld (mew-proto-friend-folder proto case)) (from (downcase (or addr (mew-header-parse-address mew-from:) "")))) (if mew-refile-guess-strip-domainpart (setq from (mew-addrstr-extract-user from))) (mew-concat-folder2 fld from case))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Learning functions ;;; ;; mew-refile-guess-learn (buf result) ;; ;; buf is message buffer. ;; ;; result is ((chosen1 chosen2 ...) ;; (guess-func-name1 guess1 guess2...) ;; (guess-func-name2 guess1 guess2...)) ;; ;; that is, 'car' is a list of user chosen folders. ;; 'cdr' is a list of opinions by guess functions. ;; (defun mew-refile-guess-learn (buf result) (let ((chosen (car result)) ;; (folder1 folder2 ...) (info (cdr result))) ;; (guess-func-name guess1 guess2...) (with-current-buffer buf (if (member 'mew-refile-guess-by-from mew-refile-guess-control) (mew-refile-guess-by-from-learn chosen info)) (if (member 'mew-refile-guess-by-thread mew-refile-guess-control) (mew-refile-guess-by-thread-learn chosen info))))) (defun mew-refile-guess-by-thread-learn (chosen info) ;; Create mew-refile-msgid-alist for mew-refile-guess-by-thread. (let* ((msgid (mew-idstr-get-first-id (mew-header-get-value mew-message-id:))) (folder (car chosen)) ;; other people's honest opinion and my honest opinion. (oho info) (mho (cdr (assoc 'mew-refile-guess-by-thread info)))) (when (and msgid chosen) ;; if my opinion was right, I learn it. ;; or a folder was not in other people's opinion, ;; I accept it. (catch 'match (dolist (csn chosen) (if (or (member csn mho) (not (catch 'find (while oho (and (member csn (car oho)) (throw 'find t)) (setq oho (cdr oho)))))) (throw 'match (setq folder csn))))) (setq mew-refile-msgid-alist (cons (list msgid folder "??") (delq (assoc msgid mew-refile-msgid-alist) ;; delq is right mew-refile-msgid-alist)))))) (defun mew-refile-guess-by-from-learn (chosen info) ;; Create mew-refile-from-alist for mew-refile-guess-by-from. (let* ((from (downcase (or (mew-header-parse-address mew-from:) ""))) ;; 'my honest opinion' guessed by mew-refile-guess-by-from. (mho (nth 1 (assoc 'mew-refile-guess-by-from info))) folder to-cc) ;; default leaning key X is the address derived from From: header, ;; but only when ;; mew-refile-guess-from-me-is-special is t ;; X is my address. ;; All addresses derived from To: Cc: values ;; point to the only one address Y. ;; the learning key is set to Y instead of X. (if (and mew-refile-guess-from-me-is-special (mew-is-my-address mew-regex-my-address-list from) (setq to-cc (mew-header-parse-address-list mew-refile-guess-key-list)) (= (length to-cc) 1)) (setq from (car to-cc))) (unless (or (or (null from) (null chosen)) (and mho (member mho chosen))) ;; I decide which folder is most important among the user chosen ;; folders. (catch 'match (dolist (csn chosen) ;; searching a folder anyone couldn't predict. (unless (mew-member* csn info) (throw 'match (setq folder csn))))) (run-hooks 'mew-refile-guess-by-from-learn-hook) ;; If candidate was found, I memorize it. (when folder (setq mew-refile-from-alist (cons (cons from folder) (delq (assoc from mew-refile-from-alist) ;; delq is right mew-refile-from-alist))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Summary mode ;;; (defun mew-refile-get (msg) (assoc msg (mew-sinfo-get-refile))) (defun mew-refile-set (msg folders) (mew-sinfo-set-refile (cons (cons msg folders) (mew-sinfo-get-refile)))) (defun mew-refile-reset (msg) (mew-sinfo-set-refile (delq (mew-refile-get msg) (mew-sinfo-get-refile)))) (defun mew-refile-change (src dst) (let ((ref (mew-refile-get src))) (when ref (setcar ref dst)))) (defun mew-refile-folder-check (folder &optional force-to-create) "A function to see if FOLDER exists. Return t if exists or created. Otherwise, return nil." (when (stringp folder) (cond ((mew-folder-popp folder) nil) ((mew-folder-nntpp folder) nil) ((mew-folder-virtualp folder) nil) ((mew-folder-imapp folder) (let* ((case mew-inherit-refile-case) (mailboxes (mew-imap-folder-alist case))) (cond ((or (assoc folder mailboxes) (assoc (mew-imap-file-name-as-directory folder case) mailboxes)) t) ;; This is very ad-hoc but no right way... ((and (string= (mew-imap-separator case) ".") (string-match mew-path-separator folder)) (message "%s should not contain \"%s\"" folder mew-path-separator) nil) ((and (y-or-n-p (format "%s does not exist. Create it? " folder)) (mew-imap-folder-insert case folder)) (message "%s will be created" folder) t)))) (t ;; local (let ((absdir (mew-expand-folder folder)) ;; /home/Mail/foo (create-it force-to-create)) (when absdir (if (file-exists-p absdir) (if (file-directory-p absdir) t ;; exists (message "%s is a file" folder) nil) ;; xxx exists but a file (unless create-it (if (y-or-n-p (format "%s does not exist. Create it? " folder)) (setq create-it t))) (if (not create-it) nil ;; not created (mew-make-directory absdir) (mew-local-folder-insert folder) (message "%s has been created" folder) t)))))))) ;; created (defun mew-refile-decide-folders (buf msg cur-folders &optional auto exfld) ;; This functions returns ;; ((folder1 folder2...) ;; (func1 guess11 guess12...) ;; for learning ;; (func2 guess12 guess22...)) (let ((proto mew-inherit-refile-proto) (case mew-inherit-refile-case) learn-info folders ret cands singlep lst-lst) (with-current-buffer buf (setq learn-info (mew-refile-guess auto))) (if auto ;; if auto is set, simply use the guess. (setq folders (car learn-info)) (cond (cur-folders ;; add new folder (setq cands cur-folders)) ((nth 1 (car learn-info)) ;; multi guess (setq cands (car learn-info))) (t ;; single guess (setq singlep t) (setq cands (list (nth 0 (car learn-info)))))) (setq cands (delete nil cands)) (when exfld ;; copying, two folders are necessary (setq singlep nil) (if (or (null cands) (equal (list exfld) cands)) (setq cands (list exfld proto)) (setq cands (cons exfld cands)))) (setq cands (mew-uniq-list cands)) ;; unavoidable (unless cands (setq cands (list proto))) (setq folders (mew-input-refile-folders cands singlep case proto))) ;; check folder existence. (setq lst-lst (mapcar (lambda (x) (mew-split x ?,)) folders)) (dolist (lst lst-lst) (dolist (fld lst) (if (and fld (not (member fld ret)) (mew-refile-folder-check fld)) (setq ret (cons fld ret))))) (cons (nreverse ret) (cdr learn-info)))) ;; return value ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Copy ;;; (defun mew-summary-copy () "Put the refile mark(default is 'o') on this message with the current folder as a candidate in addition to guessed folders." (interactive) (mew-summary-msg-or-part (mew-summary-refilable (mew-summary-refile-body nil nil nil nil (mew-summary-folder-name))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Refile (aka move) ;;; (defun mew-refile-log-buffer (fld) (concat mew-buffer-prefix "refile " fld)) (defun mew-summary-refile (&optional report) "Put the refile mark(default is 'o') on this message. If already marked with 'o', it prints where this message will be refiled. This can overlay other marks. When it overlays, the cursor stays on the message. If it marks newly, displays the next message. If executed with '\\[universal-argument]', it displays how the refile rules work in Message mode." (interactive "P") (mew-summary-msg-or-part (mew-summary-refilable (if report (mew-summary-refile-report) (mew-summary-refile-body))))) (defvar mew-override-body-open "<") (defvar mew-override-body-close "> ") (defconst mew-regex-override-body (concat (regexp-quote mew-override-body-open) "[^>\r\n]*" (regexp-quote mew-override-body-close))) (defun mew-summary-refile-override-body (folders-str &optional force) (let* ((open mew-override-body-open) (close mew-override-body-close) (len (+ (length folders-str) (length open) (length close)))) (save-excursion (when (mew-summary-goto-body 'after) (when (and (not force) (looking-at mew-regex-override-body)) (mew-elet (delete-region (point) (match-end 0)))) (mew-elet (insert-and-inherit open folders-str close)))) len)) (defun mew-summary-refile-remove-body () (save-excursion (when (and (mew-summary-goto-body 'after) (looking-at mew-regex-override-body)) (mew-elet (delete-region (point) (match-end 0)))))) (defun mew-summary-refile-log (fld folders-str) (save-excursion (beginning-of-line) (let ((beg (point)) (cbuf (current-buffer)) (msg-id (mew-summary-my-id)) end) (forward-line) (when (search-backward "\r" nil t) (setq end (point)) (set-buffer (get-buffer-create (mew-refile-log-buffer fld))) (goto-char (point-max)) (mew-insert-buffer-substring cbuf beg end) (insert "== src=" fld " dst=" folders-str " id=" msg-id) (insert " date=" (mew-time-ctz-to-logtime (current-time)) "\n"))))) (defun mew-summary-refile-unlog (fld) (save-excursion (let ((msg-id (mew-summary-my-id)) start) (set-buffer (get-buffer-create (mew-refile-log-buffer fld))) (goto-char (point-min)) (when (search-forward (concat " id=" msg-id) nil t) (beginning-of-line) (setq start (point)) (forward-line) (delete-region start (point)))))) (defun mew-refile-decode-subject () (save-excursion (goto-char (point-min)) (if (and (re-search-forward (concat "^$\\|^" mew-subj:) nil t) (not (looking-at "^$"))) (let ((med (point))) (forward-line) (mew-header-goto-next) (mew-header-decode-region mew-subj: med (point)))))) (defun mew-summary-refile-body (&optional exp-flds auto no-msg no-mark exfld) (let ((pos (point)) fld msg folders cur-folders mark buf learn-info tmp delbuf invalidp folders-str mew-inherit-refile-proto mew-inherit-refile-case) (mew-summary-goto-message) (when (mew-sumsyn-match mew-regex-sumsyn-short) (setq fld (mew-sumsyn-folder-name)) (setq msg (mew-sumsyn-message-number)) ;; msg is never nil (setq invalidp (not (mew-msg-validp msg)))) (setq mew-inherit-refile-case (or (mew-case:folder-case fld) mew-case)) (setq mew-inherit-refile-proto (substring (mew-case:folder-folder fld) 0 1)) (setq mark (mew-summary-get-mark)) ;; any mark (cond ((and mark (> (mew-markdb-level mark) (mew-markdb-level mew-mark-refile))) (or no-msg (message "Cannot mark here because '%s' is stronger than '%s'" (mew-markdb-name mark) (mew-markdb-name mew-mark-refile))) nil) (invalidp (or no-msg (message "Cannot refile this invalid message")) nil) (t (if exp-flds (setq folders exp-flds) (unless (or auto (mew-sinfo-get-disp-msg)) ;; need to make a cache or a message buffer. (mew-summary-display)) (setq buf (mew-cache-hit fld msg)) (unless buf (save-excursion (setq buf (generate-new-buffer mew-buffer-prefix)) (setq delbuf t) (set-buffer buf) (mew-erase-buffer) (mew-insert-message fld msg mew-cs-text-for-read mew-header-reasonable-size) (mew-refile-decode-subject))) (when (and (eq mew-mark-refile mark) (get-buffer fld)) (with-current-buffer fld (setq cur-folders (cdr (mew-refile-get msg))))) (condition-case nil (setq learn-info (mew-refile-decide-folders buf msg cur-folders auto exfld)) (quit (goto-char pos))) (setq folders (car learn-info))) ;; we must prevent refiling a message to +queue (dolist (folder folders) (unless (mew-folder-queuep folder) (setq tmp (cons folder tmp)))) (setq folders (nreverse tmp)) (setq folders (delete mew-draft-folder folders)) ;; mark refile (unless no-mark (when folders (or exp-flds auto (mew-refile-guess-learn buf learn-info)) (setq folders-str (mew-join "," folders)) (cond ((mew-virtual-p) (with-current-buffer fld (save-excursion (when (mew-summary-search-msg msg) (mew-refile-reset msg) (mew-refile-set msg folders) (if cur-folders (mew-summary-refile-unlog fld)) (mew-summary-refile-log fld folders-str) (mew-summary-refile-override-body folders-str) ;; marked in mew-mark-put-mark (set-buffer-modified-p nil))))) (t (mew-refile-reset msg) (mew-refile-set msg folders) (if cur-folders (mew-summary-refile-unlog fld)) (mew-summary-refile-log fld folders-str))) (mew-summary-refile-override-body folders-str) (mew-mark-put-mark mew-mark-refile no-msg) (setq pos (point)))) (if delbuf (mew-remove-buffer buf)) ;; memorize last-folder (setq mew-refile-last-folder folders) (set-buffer-modified-p nil))) (goto-char pos) folders)) ;; return value (defun mew-summary-refile-report () (let ((win (selected-window)) (customize-var '(mew-refile-ctrl-multi mew-refile-guess-key-list mew-refile-guess-strip-domainpart mew-refile-guess-from-me-is-special mew-header-reasonable-size)) mew-inherit-refile-case mew-inherit-refile-proto fld msg guess boundary) (save-excursion (mew-summary-goto-message) (when (mew-sumsyn-match mew-regex-sumsyn-short) (setq fld (mew-sumsyn-folder-name)) (setq msg (mew-sumsyn-message-number)))) (setq mew-inherit-refile-case (or (mew-case:folder-case fld) mew-case)) (setq mew-inherit-refile-proto (substring (mew-case:folder-folder fld) 0 1)) (with-temp-buffer (mew-insert-message fld msg mew-cs-text-for-read mew-header-reasonable-size) (save-excursion (goto-char (point-min)) (setq boundary (search-forward "\n\n" nil t))) (mew-refile-decode-subject) (setq guess (mew-refile-guess nil t))) (mew-window-configure 'message) ;; message buffer (mew-summary-display-preamble) (mew-elet (save-excursion ;; report result of guess. (insert (format "** Guess result: %s\n" (car guess))) ;; report status of customize variables. (insert "\n** Current Configurations:\n\n") (dolist (cvar customize-var) (insert (format "%-40s: " cvar)) (insert (format "%s\n" (eval cvar)))) (unless boundary (insert "Warning: Not analyzing whole header. You may need to increase mew-header-reasonable-size\n")) (insert "\n** Each function's opinion:\n\n") ;; report how each functions guessed. (setq guess (cdr guess)) (dolist (gs guess) (insert (format "%-32s " (car gs))) (insert (format "return: %s\n" (mapconcat 'identity (cdr gs) ",")))))) (mew-summary-display-postscript 'no-hook) (select-window win))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Refile again ;;; (defun mew-summary-refile-again () "Put a refile mark on this message according to the previous refile folder." (interactive) (mew-summary-refilable (save-excursion (mew-summary-goto-message) (let ((msg (mew-summary-message-number))) (when (mew-msg-validp msg) (message "%s to %s" msg (mew-join ", " mew-refile-last-folder))))) (mew-summary-refile-body mew-refile-last-folder))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Auto refile ;;; (defun mew-summary-auto-refile (&optional mew-mark-review-only) "Refile each message in the folder automatically. If 'mew-refile-auto-refile-skip-any-mark' is non-nil, any previously marked message will be skipped. If '\\[universal-argument]' is specified, only messages marked with 'mew-mark-review' will be concerned." (interactive "P") (mew-summary-refilable (mew-decode-syntax-delete) (let ((mew-use-highlight-x-face nil) (lines (mew-sinfo-get-ttl-line)) (case-fold-search nil) (line 1) (mark nil) msg) (cond (mew-mark-review-only (setq msg (format "Refile all messages marked with '%c'? " mew-mark-review))) (mew-refile-auto-refile-skip-any-mark (setq msg "Refile all non-marked messages? ")) (t (setq msg "Refile messages including marked with weak marks?"))) (if (and mew-refile-auto-refile-confirm (not (y-or-n-p msg))) (message "Not refiled") (message "Auto refiling...") (save-window-excursion (goto-char (point-min)) (while (re-search-forward mew-regex-sumsyn-valid nil t) (setq mark (mew-summary-get-mark)) (if mew-mark-review-only (and mark (char-equal mark mew-mark-review) (mew-summary-refile-body nil t 'no-msg)) (or (and mark (or mew-refile-auto-refile-skip-any-mark (>= (mew-markdb-level mark) (mew-markdb-level mew-mark-refile)))) (mew-summary-refile-body nil t 'no-msg))) (if (= (% (/ (* 100 line) lines) 10) 0) (message "Auto refiling...%s%%" (/ (* 100 line) lines))) (setq line (1+ line)) (forward-line))) (message "Auto refiling...done"))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; "mx" extension ;;; (defun mew-summary-mark-copy () "\\ Put the refile mark onto all messages marked with '*', with the current folder as a candidate in addition to guessed folders. This is very convenient to refile all messages picked by '\\[mew-summary-pick]'." (interactive) (mew-summary-refilable (let ((mew-use-highlight-x-face nil) last) (message "Mark copying...") (save-excursion (save-window-excursion (goto-char (point-min)) (catch 'loop (while (re-search-forward mew-regex-msg-review nil t) (setq last (mew-summary-refile-body last nil 'no-msg nil (mew-summary-folder-name 'ext))) (unless last (throw 'loop t)) (forward-line))) (message "Mark copying...done")))))) (defun mew-summary-mark-refile () "\\ Put the refile mark onto all messages marked with '*'. This is very convenient to refile all messages picked by '\\[mew-summary-pick]'." (interactive) (mew-summary-refilable (let ((mew-use-highlight-x-face nil) last) (message "Mark refiling...") (save-excursion (save-window-excursion (catch 'loop (while (or (re-search-forward mew-regex-msg-review nil t) (re-search-backward mew-regex-msg-review nil t)) (setq last (mew-summary-refile-body last nil 'no-msg)) (unless last (throw 'loop t)) (forward-line))) (message "Mark refiling...done")))))) (provide 'mew-refile) ;;; Copyright Notice: ;; Copyright (C) 1994-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-refile.el ends here kazu-yamamoto-Mew-ff9c41b/mew-scan.el000066400000000000000000000753251256455547000176230ustar00rootroot00000000000000;;; mew-scan.el --- Scanning messages for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Scan info ;;; (defvar mew-scan-info-list '("folder" "message")) ;; See mew-scan-fields. 0th is fld, 1st is msg (ie num). (mew-info-defun "mew-scan-" mew-scan-info-list) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Variables ;;; (defvar mew-summary-form-size-unit '("" "k" "M" "G" "T")) (defvar mew-vec [0 1 2 3 4 5 6 8 9 10 11 12 13 14 15 16 17 18 19 20] "Just for test of (MEW-FOO).") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Setup ;;; (defun mew-scan-setup () "Define functions (MEW-FOO) according 'mew-scan-fields-alias'." (dotimes (i (length mew-scan-fields-alias)) (fset (intern (concat "MEW-" (nth i mew-scan-fields-alias))) `(lambda () (aref mew-vec ,i))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Pre-defined functions for mew-summary-form ;;; (defun mew-summary-form-mark () "A function to return a mark. 'mew-summary-form-mark-delete' and 'mew-summary-form-mark-review' effect to this function." (let ((mark-delete mew-mark-delete) (mark-review mew-mark-review) (mark-spam mew-mark-delete) (unread (and mew-use-unread-mark (mew-sinfo-get-unread-mark))) duplicated spam review id body md5) (when mew-summary-form-mark-delete (if (mew-characterp mew-summary-form-mark-delete) (setq mark-delete mew-summary-form-mark-delete)) (when (setq id (mew-idstr-get-first-id (MEW-ID))) (if (member id (mew-sinfo-get-scan-id)) (unless (mew-scan-message-invalidp) (setq duplicated t)) (mew-sinfo-set-scan-id (cons id (mew-sinfo-get-scan-id)))))) (when (and mew-summary-form-mark-spam (mew-sinfo-get-inboxp)) (if (mew-characterp mew-summary-form-mark-spam) (setq mark-spam mew-summary-form-mark-spam)) (setq body (MEW-BODY)) (unless (string= body "") (setq md5 (mew-md5 body)) (if (member md5 (mew-sinfo-get-scan-md5)) (unless (mew-scan-message-invalidp) (setq spam t)) (mew-sinfo-set-scan-md5 (cons md5 (mew-sinfo-get-scan-md5)))))) (when mew-summary-form-mark-review (if (mew-characterp mew-summary-form-mark-review) (setq mark-review mew-summary-form-mark-review)) (let* ((mew-header-max-depth nil) (to (mew-addrstr-parse-address-list (MEW-TO))) (cc (mew-addrstr-parse-address-list (MEW-CC)))) (setq to (nconc to cc)) (catch 'loop (dolist (cto to) (if (mew-is-my-address mew-regex-my-address-list cto) (throw 'loop (setq review t))))))) (cond (duplicated (char-to-string mark-delete)) (spam (char-to-string mark-spam)) (review (char-to-string mark-review)) (unread (char-to-string mew-mark-unread)) (t (char-to-string mew-mark-read))))) (defvar mew-type-mark-invalid "#") (defvar mew-type-mark-truncated "T") (defvar mew-type-mark-signed "S") (defvar mew-type-mark-encrypted "E") (defvar mew-type-mark-multipart "M") (defvar mew-type-mark-alternative "-") (defvar mew-type-mark-partial "P") (defvar mew-type-mark-nothing " ") (defun mew-summary-form-type () "A function to return a mark of content type." (let ((ct (MEW-CT)) (case-fold-search t)) (cond ((mew-scan-message-invalidp) mew-type-mark-invalid) ((mew-scan-message-truncatedp) mew-type-mark-truncated) ((string-match mew-ct-mls ct) mew-type-mark-signed) ((string-match mew-ct-mle ct) mew-type-mark-encrypted) ((string-match mew-ct-sms ct) mew-type-mark-encrypted) ((string-match mew-ct-xsms ct) mew-type-mark-encrypted) ((or (string-match mew-ct-smm ct) (string-match mew-ct-xsmm ct)) ;; checking smime-type (cond ((string-match mew-ct-smm-sig ct) mew-type-mark-signed) ((string-match mew-ct-smm-enc ct) mew-type-mark-encrypted) ;; smime-type is optional, sigh (t mew-type-mark-encrypted))) ((mew-ct-alternativep ct) mew-type-mark-alternative) ((mew-ct-multipartp ct) mew-type-mark-multipart) ((mew-ct-partialp ct) mew-type-mark-partial) (t mew-type-mark-nothing)))) (defun mew-summary-form-time () "A function to return a message time, HH:MM" (let ((s (MEW-DATE))) (if (or (string= s "") (not (string-match mew-time-rfc-regex s))) (setq s (mew-time-ctz-to-rfc (mew-file-get-time (mew-expand-msg (MEW-FLD) (MEW-NUM)))))) (if (string-match mew-time-rfc-regex s) (format "%02d:%02d" (or (mew-time-rfc-hour) 0) (or (mew-time-rfc-min) 0)) "00:00"))) (defun mew-summary-form-date () "A function to return a date, MM/DD." (let ((s (MEW-DATE))) (when (or (string= s "") (not (string-match mew-time-rfc-regex s))) (setq s (mew-time-ctz-to-rfc (mew-file-get-time (mew-expand-msg (MEW-FLD) (MEW-NUM)))))) (if (string-match mew-time-rfc-regex s) (format "%02d/%02d" (mew-time-mon-str-to-int (mew-time-rfc-mon)) (mew-time-rfc-day)) ""))) (defun mew-summary-form-year () "A function to return a message year, YYYY" (let ((s (MEW-DATE)) year) (when (or (string= s "") (not (string-match mew-time-rfc-regex s))) (setq s (mew-time-ctz-to-rfc (mew-file-get-time (mew-expand-msg (MEW-FLD) (MEW-NUM)))))) (if (not (string-match mew-time-rfc-regex s)) "0000" (setq year (mew-time-rfc-year)) (cond ((< year 50) (setq year (+ year 2000))) ((< year 100) (setq year (+ year 1900)))) (number-to-string year)))) (defun mew-summary-form-size () "A function to return the size of the message. Should be used with -4. See also 'mew-summary-form-size-0k' and 'mew-summary-form-size-huge'." (let ((len-1 (1- (length mew-summary-form-size-unit))) (SIZE (mew-scan-uid-size (MEW-UID))) (i 0) size unit) (if (and SIZE (string-match "^[0-9]+$" SIZE)) (setq size (string-to-number SIZE)) (setq size (mew-file-get-size (mew-expand-msg (MEW-FLD) (MEW-NUM))))) (while (and (< i len-1) (>= size 1000)) (setq size (/ size 1000)) (setq i (1+ i))) (if (and mew-summary-form-size-huge (>= size 1000)) "HUGE" (setq unit (nth i mew-summary-form-size-unit)) (if (and mew-summary-form-size-0k (string= unit "")) "0k" (concat (if (integerp size) (number-to-string size) (format "%.0f" size)) unit))))) (defun mew-summary-form-extract-addr (addr) "Extract addr according to 'mew-summary-form-extract-rule'." (condition-case nil (let* ((func (if mew-addrbook-for-summary (mew-addrbook-func mew-addrbook-for-summary))) (raw (or (mew-addrstr-parse-address addr) "")) (rules mew-summary-form-extract-rule) ret nickname) (catch 'matched (dolist (rule rules) (cond ((and (eq rule 'name) (or (string-match "^\"\\([^\"]+\\)\"[ \t]*<[^>]+>" addr) (string-match "^\\([^<]+\\)<[^>]+>" addr))) (throw 'matched (setq ret (mew-chop (match-string 1 addr))))) ((and (eq rule 'comment) (string-match "^[^(]+(\\(.+\\))" addr)) (throw 'matched (setq ret (mew-chop (match-string 1 addr))))) ((eq rule 'address) (throw 'matched (setq ret raw))) ((and (eq rule 'nickname) ;; set nickname here for efficiency (or nickname (setq nickname (if func (funcall func raw))))) (throw 'matched (setq ret nickname))) ((and (stringp rule) (string-match rule addr)) (throw 'matched (setq ret (mew-chop (match-string 1 addr)))))))) (or ret addr)) ;; a version of downcase causes error if argument is non-ascii. (error mew-error-broken-address))) (defun mew-summary-form-from () "A function to return an address. If the message is destined to me AND 'mew-summary-form-from-me-prefix' is a string, an address on To:, is returned. In this case, 'mew-summary-form-from-me-prefix' is prepended to the address. Otherwise, an address on From: is returned. Address is converted by 'mew-summary-form-extract-addr'. See also 'mew-summary-form-extract-rule'." (let* ((FROM (MEW-FROM)) (TO (MEW-TO)) (from (or (mew-addrstr-parse-address FROM) ""))) (cond ((string= FROM "") "") ((and (stringp mew-summary-form-from-me-prefix) (not (string= TO "")) (mew-is-my-address mew-regex-my-address-list from)) (mew-replace-white-space (concat mew-summary-form-from-me-prefix (mew-summary-form-extract-addr TO)))) (t (mew-replace-white-space (mew-summary-form-extract-addr FROM)))))) (defun mew-summary-form-subj () "A function to return Subject:. Unnecessary white spaces are removed." ;; The beginning white spaces have been removed in mew-scan-header ;; (mew-keyval). (let ((subj (MEW-SUBJ))) (if (string= subj "") (setq subj mew-error-no-subject)) (if mew-decode-broken subj ;; already well-formatted (mew-replace-white-space subj)))) (defun mew-summary-form-body () (mew-header-sanity-check-string (MEW-BODY))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Scan from ;;; (defun mew-decide-summary-form (folder) (mew-folder-spec folder mew-summary-form-list mew-summary-form-list-string-type mew-summary-form-list-list-type)) (defun mew-get-summary-form (folder) "Get summary-form from 'mew-summary-form-list', 'mew-summary-form-list-string-type, and 'mew-summary-form-list-list-type'. 'mew-summary-form-header' is prepended. " (let* ((form-col (mew-decide-summary-form folder)) (form (or (nth 0 form-col) mew-summary-form))) (append mew-summary-form-header form))) (defun mew-get-summary-column (folder) (let ((form-col (mew-decide-summary-form folder))) (or (nth 1 form-col) (mew-thread-column (mew-get-summary-form folder)) mew-thread-column))) (defun mew-thread-column (form) (let ((col 0)) (catch 'loop (dolist (ent form) (cond ((consp ent) (setq col (+ col (abs (car ent))))) ((stringp ent) (setq col (+ col (string-width ent)))) ((eq ent t) (throw 'loop col)) (t (setq col (1+ col)))))))) (defun mew-get-unread-mark (folder) (car (mew-folder-spec folder mew-unread-mark-list mew-unread-mark-list-string-type mew-unread-mark-list-list-type))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; The engine function to call mew-summary-form-* ;;; (defvar mew-inherit-total nil) (defvar mew-inherit-width nil) (defun mew-scan-get-piece (spec) (let (func width str rightp nopad) (if (stringp spec) (progn (setq mew-inherit-total (+ mew-inherit-total (string-width spec))) spec) (if (symbolp spec) (setq width 1 func spec) (mew-set '(width func) spec)) (when (and (integerp width) (symbolp func)) (when (= width 0) (setq width (- mew-inherit-width mew-inherit-total 1)) (unless mew-use-spc-padding (setq nopad t))) (if (< width 0) (setq width (abs width) rightp t)) (setq mew-inherit-total (+ mew-inherit-total width)) (setq func (intern-soft (concat mew-summary-form-func-prefix (symbol-name func)))) (when (fboundp func) (setq str (funcall func)) (if rightp (if (<= (string-width str) width) (format (format "%%%ds" width) str) (setq mew-inherit-total (+ (- mew-inherit-total width) (string-width str))) str) ;; width may exceed. (mew-substring str width nil nopad))))))) (defun mew-sumsym-encode-folder (fld) (mew-replace-character fld ? ?\t)) (defun mew-sumsym-decode-folder (fld) (mew-replace-character fld ?\t ? )) (defun mew-scan-get-line (mew-vec mew-inherit-width) (let* ((mew-inherit-total 0) (fld "") (line (mapconcat 'mew-scan-get-piece (mew-sinfo-get-summary-form) "")) par-id my-id msg ld uid siz irt-list) (setq my-id (or (mew-idstr-get-first-id (MEW-ID)) "")) ;; RFC 2822 says: the "In-Reply-To:" field may be used to identify ;; the message (or messages) to which the new message is a reply, ;; while the "References:" field may be used to identify a ;; "thread" of conversation. ;; ;; However, even if the References field exists, it may not contain ;; a parent's ID. So, if the In-Reply-To field contain one ID, ;; we use it for thread. ;; ;; (1) The In-Reply-To contains one ID, use it. ;; (2) The References contains one or more IDs, use the last one. ;; (3) The In-Reply-To contains two or more IDs, use the first one. (setq par-id (or (mew-idstr-get-first-id (MEW-XREF)) "")) (when (string= par-id "") (setq irt-list (mew-idstr-to-id-list (MEW-IRT))) (if (= (length irt-list) 1) (setq par-id (car irt-list)) (setq par-id (or (mew-idstr-get-last-id (MEW-REF)) (car irt-list) "")))) (when (mew-virtual-p) (setq fld (mew-sumsym-encode-folder (or (cdr (assoc (mew-scan-get-folder mew-vec) (mew-vinfo-get-lra))) ;; Spotlight (MEW-FLD))))) ;; xxx (setq msg (mew-scan-get-message mew-vec)) (setq uid (or (mew-scan-uid-uid (MEW-UID)) "")) (setq siz (or (mew-scan-uid-size (MEW-UID)) "")) (setq ld (format "\r %s %s %s %s %s %s\n" fld msg my-id par-id uid siz)) (cons line ld))) ;; See also mew-summary-cook-region (defun mew-scan-insert-line (folder vec width lmsg &optional mark-or-dst) (when (get-buffer folder) (with-current-buffer folder (let* ((line (mew-scan-get-line vec width)) (opos (point)) (omax (point-max)) beg med face olen nlen mark msg) (mew-elet (if (null lmsg) (goto-char (point-max)) ;; a message marked with 'T'. (when (mew-summary-search-msg lmsg) (setq mark (mew-summary-get-mark)) (setq beg (point)) (forward-line) ;; To avoid inserting a line AFTER the cursor underline, ;; keep this line and make it invisible. (put-text-property beg (point) 'invisible t) (forward-line -1))) (setq beg (point)) ;; To "insert" just after mew-marker-decode-syntax-end. (insert (car line)) (setq med (point)) (insert (cdr line)) (goto-char beg) (cond ((stringp mark-or-dst) ;; xxx (setq msg (mew-scan-get-message vec)) (mew-refile-reset msg) (mew-refile-set msg (mew-split mark-or-dst ?,)) (mew-summary-refile-log folder mark-or-dst) (setq med (+ med (mew-summary-refile-override-body mark-or-dst 'force))) (mew-mark-put mew-mark-refile)) ((mew-characterp mark-or-dst) ;; mew-inbox-action-alist (mew-mark-put mark-or-dst)) (mark (mew-summary-mark-as mark)) ((and mew-use-highlight-mark ;; mew-summary-form-mark (setq mark (mew-summary-get-mark)) ;; duplicated, etc (setq face (mew-highlight-mark-get-face mark))) (put-text-property beg med 'face face))) (if mew-use-highlight-mouse-line (put-text-property beg med 'mouse-face mew-highlight-mouse-line-face)) (forward-line) (put-text-property med (1- (point)) 'invisible t) ;; Removing the invisible line. (when lmsg ;; UID information will be removed. So, we need to adjust ;; the position. (setq nlen (- (point) beg)) (setq beg (point)) (forward-line) (when (> opos beg) (setq olen (- (point) beg)) (setq opos (- opos (- olen nlen)))) (delete-region beg (point)))) (if (or (eq opos (mew-sinfo-get-start-point)) (/= opos omax)) ;; move the cursor to the original position. (goto-char opos)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sub-functions for Scan ;;; (defun mew-scan-header (&optional draftp) (let ((vec (make-vector (length mew-scan-fields) "")) (lim (1- mew-scan-max-field-length)) i key med str n) (goto-char (point-min)) (unless (re-search-forward mew-eoh nil t) (goto-char (point-max))) (save-restriction (narrow-to-region (point-min) (point)) (goto-char (point-min)) (while (not (eobp)) (if (not (looking-at mew-keyval)) (forward-line) (setq key (mew-capitalize (mew-match-string 1))) (setq med (match-end 0)) ;; Three lines should be enough for Summary mode. (forward-line) (setq i 0) (while (and (< i lim) (looking-at mew-lwsp)) (forward-line) (setq i (1+ i))) (when (and (setq n (mew-member-case-equal key mew-scan-fields)) (string= (aref vec n) "")) ;; avoid multiple times (when (member key mew-scan-decode-fields) (mew-header-decode-region key med (point) draftp)) ;; We need to keep composite properties of charset. ;; This must be "buffer-substring". (setq str (buffer-substring med (1- (point)))) (aset vec n str)) (mew-header-goto-next)))) vec)) (defun mew-scan-field-to-func (key) (let ((n (mew-member-case-equal key mew-scan-fields)) (len (length mew-scan-fields-alias)) ali) (if (and n (< n len)) (setq ali (nth n mew-scan-fields-alias))) (if (stringp ali) (symbol-function (intern-soft (concat "MEW-" ali)))))) (defun mew-scan-inbox-action (mew-vec case) (let ((alist (mew-inbox-action-alist case)) key val val-func ret mark-or-dst regex-list) (catch 'loop (dolist (ent alist) (setq key (car ent)) (setq val-func (mew-scan-field-to-func key)) (if (and val-func (functionp val-func)) (setq val (funcall val-func)) (setq val nil)) (when val (setq ent (cdr ent)) (dolist (act ent) (if (symbolp act) (when (fboundp act) (setq ret (funcall act val)) (if ret (throw 'loop nil))) (when (listp act) (setq mark-or-dst (car act)) (setq regex-list (cdr act)) (dolist (rl regex-list) (if (string-match rl val) (throw 'loop (setq ret mark-or-dst)))))))))) ret)) (defvar mew-regex-ignore-scan-body-list '("^[ \t]*$" "^[ \t]*[-a-zA-Z0-9]+: " "^[ \t]*[[>:|#;/_}]" "^[ \t]*\\w+\\(['._-]+\\w+\\)*>" "^[ \t]*[[ mew-summary-scan-width 40)) ;; xxx mew-summary-scan-width (max mew-window-magic (window-width)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; X-Mew-Uidl: ;;; (defun mew-scan-uid-uid (uid) (nth 0 (mew-split uid mew-sp))) (defun mew-scan-uid-size (uid) (nth 1 (mew-split uid mew-sp))) (defun mew-scan-uid-case (uid) (nth 2 (mew-split uid mew-sp))) (defun mew-header-insert-xmu (uid siz truncated &optional case) (when (and (stringp uid) (stringp siz)) (setq siz (number-to-string (string-to-number siz))) ;; removing 0 (let (fields) (if (not truncated) (setq fields (concat uid " " siz)) (setq fields (concat uid " 0" siz)) ;; e.g. 0500 == truncated (if case (setq fields (concat fields " " case)))) (save-excursion (mew-header-delete-lines (list mew-x-mew-uidl:))) (mew-header-insert mew-x-mew-uidl: fields 'no-fold)))) (defun mew-scan-message-truncatedp () (mew-msg-truncatedp (mew-scan-uid-size (MEW-UID)))) (defun mew-scan-message-invalidp () (mew-msg-invalidp (MEW-NUM))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Scanning a folder ;;; (defun mew-summary-ls (&optional header-only goend update) "List this folder asynchronously. In a LOCAL folder: messages in the local folder are scanned according to the range which you specify. In a REMOTE folder: messages in the server's folder are cached according to the range which you specify. If 'mew-pop-header-only'/'mew-imap-header-only'/'mew-nntp-header-only' is non-nil, only headers of messages are cached. If executed with '\\[universal-argument]', these variables are considered reversed." (interactive "P") (mew-summary-only (when (mew-summary-exclusive-p) (let* ((bnm (mew-summary-folder-name 'ext)) (case (mew-sinfo-get-case)) (fld (mew-sinfo-get-folder)) (askp mew-ask-range) (directive 'scan) (get-body (not header-only)) scanp range dir-newp) (mew-summary-folder-cache-load) (cond (update (setq askp nil) (setq range nil) ;; update (setq scanp t)) ((mew-called-interactively-p) ;; "s" (setq askp t) (setq scanp t)) ((mew-summary-folder-dir-newp) ;; "g" (setq askp nil) (setq scanp t))) ;; for mew-summary-exchange-point. (mew-sinfo-set-ret-pos (point)) (if (mew-summary-folder-dir-newp) (setq dir-newp t)) (if (or (mew-called-interactively-p) goend) (goto-char (point-max))) (set-buffer-modified-p nil) (if (not scanp) (progn (run-hooks 'mew-summary-ls-no-scan-hook) t) ;; return value (not scanned) (mew-summary-reset) ;; (mew-sinfo-set-direction 'down) (cond ((and (mew-folder-remotep fld) (not (mew-folder-imap-queuep))) (if (and dir-newp (mew-folder-imapp fld)) (mew-local-retrieve 'scan bnm (mew-range-update bnm)) (if askp (setq range (mew-input-range-remote bnm))) (when (eq range 'sync) (setq range nil) (setq directive 'sync)) (cond ((mew-folder-popp fld) (if (mew-pop-header-only case) (setq get-body (not get-body))) (mew-pop-retrieve case directive bnm range get-body)) ((mew-folder-imapp fld) (if (mew-imap-header-only case) (setq get-body (not get-body))) (mew-imap-retrieve case directive bnm range get-body)) ((mew-folder-nntpp fld) (if (mew-nntp-header-only case) (setq get-body (not get-body))) (mew-nntp-retrieve case directive bnm range get-body))))) (t ;; local (setq range (mew-input-range bnm askp)) (if range (mew-local-retrieve 'scan bnm (nth 0 range) (nth 1 range)) (message "range is wrong")))) nil))))) ;; return value (scanned) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Summary file cache ;;; (defun mew-compare-times (t1 t2) ;; Is t1 newer than t2? (cond ((null t1) nil) ((null t2) t) ;; do update ((> (nth 0 t1) (nth 0 t2)) t) ((= (nth 0 t1) (nth 0 t2)) (if (> (nth 1 t1) (nth 1 t2)) t nil)) ;; nil if equal (t nil))) (defun mew-summary-folder-dir-newp () (let* ((folder (mew-summary-folder-name 'ext)) (dir (file-chase-links (mew-expand-folder folder))) (mfile (expand-file-name mew-summary-touch-file dir)) (t1 (mew-file-get-time mfile)) (cache (expand-file-name mew-summary-cache-file dir)) (t2 (mew-file-get-time cache))) (if (and (null t1) (file-directory-p dir) (mew-dir-messages dir)) t (mew-compare-times t1 t2)))) (defun mew-summary-folder-cache-newp () (let* ((folder (mew-summary-folder-name 'ext)) (cache (mew-expand-file folder mew-summary-cache-file)) (t1 (mew-file-get-time cache)) (t2 (mew-sinfo-get-cache-time))) (mew-compare-times t1 t2))) (defun mew-summary-set-count-line () (let* ((ttl-line (mew-count-lines (point-min) (point-max))) (mid-point (/ (buffer-size) 2)) (mid-marker (mew-sinfo-get-mid-marker)) mid-line) (save-excursion (goto-char mid-point) (beginning-of-line) (if (and (mew-thread-p) mew-use-thread-separator (looking-at mew-regex-thread-separator)) (forward-line)) (setq mid-point (point)) (setq mid-line (mew-count-lines (point-min) (point)))) (mew-sinfo-set-ttl-line ttl-line) (mew-sinfo-set-mid-line mid-line) (unless (markerp mid-marker) (setq mid-marker (make-marker)) (mew-sinfo-set-mid-marker mid-marker)) (set-marker mid-marker mid-point))) (defun mew-summary-folder-cache-load () (let* ((folder (mew-summary-folder-name 'ext)) (cache (mew-expand-file folder mew-summary-cache-file)) refile refs) (when (and (file-readable-p cache) (mew-summary-folder-cache-newp)) (mew-elet (mew-erase-buffer) (mew-frwlet mew-cs-m17n mew-cs-dummy (mew-insert-file-contents cache)) (mew-sinfo-set-cache-time (mew-file-get-time cache)) (if (= (point-max) 1) (setq mew-summary-buffer-raw nil) (setq mew-summary-buffer-raw t)) (mew-sinfo-load) (setq refs (mew-summary-mark-collect mew-mark-refile)) (setq refile (mew-summary-mark-recover (mew-sinfo-get-mark-hist) (mew-sinfo-get-refile) refs)) (mew-sinfo-set-refile refile) (mew-summary-set-count-line) (set-buffer-modified-p nil))))) (defun mew-summary-folder-cache-save () (let* ((folder (mew-summary-folder-name 'ext)) (cache (mew-expand-file folder mew-summary-cache-file))) (when (file-writable-p cache) (mew-touch-folder folder) (save-restriction (widen) (if (mew-decode-syntax-p) (let ((cbuf (current-buffer)) (min (point-min)) (max (point-max)) (beg (mew-decode-syntax-begin)) (end (mew-decode-syntax-end))) (with-temp-buffer (mew-insert-buffer-substring cbuf min beg) (mew-insert-buffer-substring cbuf end max) (mew-frwlet mew-cs-dummy mew-cs-m17n (write-region (point-min) (point-max) cache nil 'no-msg)))) ;; (write-region 1 1 ...) does not update the file timestamp ;; but does the directory timestamp. So, we need to delete ;; the file to update the file timestamp. (if (= (point-min) (point-max)) (mew-delete-file cache)) (mew-frwlet mew-cs-dummy mew-cs-m17n (write-region (point-min) (point-max) cache nil 'no-msg)) (mew-set-file-modes cache)) (mew-summary-set-count-line) (mew-sinfo-set-cache-time (mew-file-get-time cache)) (mew-sinfo-save) (mew-sinfo-set-mark-hist nil))))) ;; See also mew-net-folder-clean. (defun mew-summary-folder-cache-clean (folder) "Erase Summary mode then remove and touch the cache file." (if (get-buffer folder) (with-current-buffer folder (mew-erase-buffer) (set-buffer-modified-p nil))) (let ((cfile (mew-expand-file folder mew-summary-cache-file))) (if (file-exists-p cfile) (write-region "" nil cfile nil 'no-msg)))) (provide 'mew-scan) (defvar mew-compiling nil) (eval-when-compile (when mew-compiling (require 'mew-varsx) (mew-scan-setup))) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-scan.el ends here kazu-yamamoto-Mew-ff9c41b/mew-search.el000066400000000000000000000722161256455547000201400ustar00rootroot00000000000000;;; mew-search.el --- Index Search ;; Author: Kazu Yamamoto ;; Created: Aug 24, 2005 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Variables ;;; (defvar mew-prog-spotlight "mdfind") (defvar mew-prog-wds "wdsgrep.exe") (defvar mew-prog-google "gdgrep.rb") (defvar mew-prog-est "estcmd") (mew-defstruct search key name prog func-search func-virtual func-index-folder func-index-all func-canonicalize-pattern func-register func-unregister func-filter) (defvar mew-search-switch `((spotlight "Spotlight" ,mew-prog-spotlight mew-search-with-spotlight mew-search-virtual-with-spotlight mew-spotlight-index-folder mew-spotlight-index-all mew-pick-canonicalize-pattern-spotlight nil nil) (wds "WDS" ,mew-prog-wds mew-search-with-wds mew-search-virtual-with-wds mew-wds-index-folder mew-wds-index-all mew-pick-canonicalize-pattern-wds mew-wds-register mew-wds-unregister) (google "Google" ,mew-prog-google mew-search-with-google mew-search-virtual-with-google mew-google-index-folder mew-google-index-all mew-pick-canonicalize-pattern-google mew-google-register mew-google-unregister) (est "Hyper Estraier" ,mew-prog-est mew-search-with-est mew-search-virtual-with-est mew-est-index-folder mew-est-index-all mew-pick-canonicalize-pattern-est nil nil mew-est-input-filter))) (defun mew-search-get-list (func) (let ((sw mew-search-switch) ent ret) (while sw (setq ent (car sw)) (setq sw (cdr sw)) (if (mew-which-exec (mew-search-get-prog ent)) (setq ret (cons (funcall func ent) ret)))) (nreverse ret))) (defun mew-search-get-ent (method) (assoc method mew-search-switch)) (defvar mew-search-method (car (mew-search-get-list 'mew-search-get-key))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Launcher ;;; (defun mew-summary-search-change-method () "Change a search method." (interactive) (let* ((names (mew-search-get-list 'mew-search-get-name)) (ent (mew-search-get-ent mew-search-method)) (default (mew-search-get-name ent)) name) (if (not names) (message "No search method") (setq names (mapcar (lambda (x) (list x)) names)) (setq name (completing-read (format "Search method (%s): " default) names nil t nil nil default)) (setq mew-search-method (nth 0 (mew-assoc-equal name mew-search-switch 1)))))) (defun mew-summary-search () "Pick messages according to a specified pick pattern with a search method. Then put the '*' mark onto them. " (interactive) (mew-pickable (if (not mew-search-method) (message "No search method") (let* ((ent (mew-search-get-ent mew-search-method)) (func (mew-search-get-func-search ent)) (name (mew-search-get-name ent)) (canon-func (mew-search-get-func-canonicalize-pattern ent)) (flt-func (mew-search-get-func-filter ent)) (folder (mew-summary-physical-folder)) pattern msgs filter) (if (not (fboundp func)) (message "This command cannot be used") (setq pattern (if flt-func (read-string (concat name " pick pattern: ")) (mew-input-pick-pattern (concat name " pick")))) (if (and (string= pattern "") (not (fboundp flt-func))) (message (mew-substitute-for-summary "Keyword must be specified. You may use '\\[mew-summary-pick]' instead")) (when (and canon-func (fboundp canon-func)) (setq pattern (funcall canon-func pattern))) (if (fboundp flt-func) (setq filter (funcall flt-func))) (setq msgs (funcall func pattern folder filter)) (mew-summary-pick-ls folder msgs))))))) (defun mew-summary-selection-by-search (&optional ask-folder) "Making selection according to a specified pick pattern with a search method." (interactive "P") (if (not mew-search-method) (message "No search method") (let* ((ofolder (mew-summary-folder-name 'ext)) (ent (mew-search-get-ent mew-search-method)) (func (mew-search-get-func-virtual ent)) (name (mew-search-get-name ent)) (canon-func (mew-search-get-func-canonicalize-pattern ent)) (flt-func (mew-search-get-func-filter ent)) vfolder opattern pattern dfunc file opts rttl file-rttl flds filter) (if (not (fboundp func)) (message "This command cannot be used") (if ask-folder (setq flds (mew-input-folders (or (mew-summary-folder-name) (mew-case-folder mew-case (mew-proto-inbox-folder (mew-proto mew-case))))))) (setq opattern (if flt-func (read-string (concat name " virtual pattern: ")) (mew-input-pick-pattern (concat name " virtual")))) (if (and (string= opattern "") (not (fboundp flt-func))) (message (mew-substitute-for-summary "Keyword must be specified")) (if (string= opattern "") (setq opattern " ")) (if (and canon-func (fboundp canon-func)) (setq pattern (funcall canon-func opattern)) (setq pattern opattern)) (when (fboundp flt-func) (setq filter (funcall flt-func)) (if (string= opattern " ") (setq opattern "")) (setq opattern (concat opattern filter))) (setq vfolder (mew-folder-to-selection opattern)) (mew-summary-switch-to-folder vfolder) (mew-vinfo-set-mode 'selection) (mew-vinfo-set-physical-folder nil) (mew-vinfo-set-original-folder ofolder) (mew-sinfo-set-find-key opattern) (make-local-variable 'mew-summary-form-mark-delete) (setq mew-summary-form-mark-delete nil) (make-local-variable 'mew-summary-form-mark-spam) (setq mew-summary-form-mark-spam nil) (when (mew-summary-exclusive-p) (with-temp-buffer (mew-set-buffer-multibyte t) (mew-piolet mew-cs-text-for-read mew-cs-text-for-write (setq file-rttl (funcall func pattern flds filter))))) (mew-set '(file rttl) file-rttl) (setq dfunc `(lambda () (mew-delete-file ,file))) (setq opts (list "-i" file)) (mew-local-retrieve 'vir opts dfunc nil nil rttl)))))) (defun mew-summary-make-index-folder () "Make index for this folder." (interactive) (mew-summary-only (if (not mew-search-method) (message "No search method") (let* ((ent (mew-search-get-ent mew-search-method)) (func (mew-search-get-func-index-folder ent)) (folder (mew-summary-folder-name 'ext))) (if (not (fboundp func)) (message "This command cannot be used") (funcall func folder)))))) (defun mew-summary-make-index-all () "Make index for all folders." (interactive) (if (not mew-search-method) (message "No search method") (let* ((ent (mew-search-get-ent mew-search-method)) (func (mew-search-get-func-index-all ent))) (if (fboundp func) (funcall func) (message "This command cannot be used"))))) (defun mew-summary-search-register () (interactive) (if (not mew-search-method) (message "No search method") (let* ((ent (mew-search-get-ent mew-search-method)) (func (mew-search-get-func-register ent))) (if (not (fboundp func)) (message "This command cannot be used") (funcall func))))) (defun mew-summary-search-unregister () (interactive) (if (not mew-search-method) (message "No search method") (let* ((ent (mew-search-get-ent mew-search-method)) (func (mew-search-get-func-unregister ent))) (if (not (fboundp func)) (message "This command cannot be used") (funcall func))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Spotlight ;;; (defun mew-assoc-match-list (key alist nth) (let ((case-fold-search t) a n ret) (while alist (setq a (car alist)) (setq n (nth nth a)) (if (or (and (stringp n) (string-match key n)) (equal n key) (eq n t)) (setq ret (cons a ret))) (setq alist (cdr alist))) ret)) ;; not reversed (defun mew-expand-wildcard-folder (wlist) (let (case fld ent ret flds regex alist) (while wlist (setq ent (car wlist)) (setq wlist (cdr wlist)) (setq case (mew-case:folder-case ent)) (setq fld (mew-case:folder-folder ent)) (if (not (string-match "\\*$" fld)) (setq ret (cons ent ret)) (setq regex (substring fld 0 -1)) (setq regex (concat "^" (regexp-quote regex))) (cond ((mew-folder-popp fld) (setq alist (mew-pop-folder-alist))) ((mew-folder-nntpp fld) (setq alist (mew-nntp-folder-alist case))) ((mew-folder-imapp fld) (setq alist (mew-imap-folder-alist case))) (t (setq alist (mew-local-folder-alist)))) (setq flds (mew-assoc-match-list regex alist 0)) (setq flds (mapcar (lambda (x) (mew-case-folder case (nth 0 x))) flds)) (setq ret (nconc flds ret)))) (nreverse ret))) (defun mew-search-spotlight (pattern path) (setq pattern (mew-cs-encode-string pattern 'utf-8)) (let* ((ent (mew-search-get-ent mew-search-method)) (prog (mew-search-get-prog ent))) (mew-plet (mew-alet (call-process prog nil t nil "-onlyin" path pattern))))) (defun mew-search-with-spotlight (pattern folder &optional dummy) (let ((path (mew-expand-folder folder)) msgs) (with-temp-buffer (mew-set-buffer-multibyte t) (mew-search-spotlight pattern path) (goto-char (point-min)) (while (re-search-forward mew-regex-message-files5 nil t) (setq msgs (cons (mew-match-string 1) msgs)) (forward-line)) (setq msgs (nreverse msgs)) (setq msgs (sort (mapcar 'string-to-number msgs) '<)) (mapcar 'number-to-string msgs)))) (defun mew-search-virtual-with-spotlight (pattern flds &optional dummy) (let* ((mpath (mew-expand-folder mew-folder-local)) (mail-regex (regexp-quote (file-name-as-directory mpath))) (regex (format "^%s%s\\([0-9]+\\)\\(%s\\)?$" mail-regex (file-name-as-directory "\\(.*\\)") mew-suffix)) (file (mew-make-temp-name)) (prev "") (rttl 0) (n 1) crnt path) (unless flds (setq flds (list mew-folder-local))) (setq flds (mew-expand-wildcard-folder flds)) (while flds (setq path (mew-expand-folder (car flds))) (setq flds (cdr flds)) (mew-search-spotlight pattern path) (goto-char (point-min)) (while (not (eobp)) (when (looking-at regex) (setq rttl (1+ rttl)) (setq crnt (match-string 1)) (delete-region (match-beginning 0) (match-beginning 2)) (when (not (string= crnt prev)) (beginning-of-line) (insert "CD:" mew-folder-local crnt "\n")) (setq prev crnt) (forward-line))) (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write (write-region (point-min) (point-max) file (> n 1) 'no-msg)) (mew-erase-buffer) (setq n (1+ n))) (list file rttl))) (defun mew-spotlight-index (dir) (let* ((default-directory dir) (msgs (mew-dir-messages dir mew-regex-message-files3 'full)) dirent subdir) (while msgs (mew-set-file-type (car msgs)) (setq msgs (cdr msgs))) (when (/= (mew-file-get-links dir) 2) (setq dirent (directory-files "." nil mew-regex-folder-candidate)) (while dirent (setq subdir (car dirent)) (setq dirent (cdr dirent)) (when (and (file-directory-p subdir) (not (file-symlink-p subdir))) (mew-spotlight-index (expand-file-name subdir dir))))))) (defun mew-spotlight-index-folder (folder) "Making spotlight index for this folder." (let* ((dir (mew-expand-folder folder)) (msgs (mew-dir-messages dir mew-regex-message-files3 'full))) (message "Spotlight indexing for %s..." folder) (while msgs (mew-set-file-type (car msgs)) (setq msgs (cdr msgs))) (message "Spotlight indexing for %s...done" folder))) (defun mew-spotlight-index-all () "Making spotlight index for all messages." (interactive) (when (y-or-n-p "Make Spotlight index for all folders? ") (message "Spotlight indexing for all folders...") (let ((flds '("+" "+#imap" "+#pop" "+#nntp")) dir) (while flds (setq dir (mew-expand-folder (car flds))) (setq flds (cdr flds)) (if (file-directory-p dir) (mew-spotlight-index dir)))) (message "Spotlight indexing for all folders...done"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Google Desktop ;;; (defun mew-search-google (pattern path) (setq pattern (mew-cs-encode-string pattern 'shift_jis)) (let* ((ent (mew-search-get-ent mew-search-method)) (prog (mew-search-get-prog ent))) (mew-plet (mew-alet (call-process prog nil t nil "-m" "-p" path "-s" "-q" pattern))))) (defun mew-search-with-google (pattern folder &optional dummy) (let* ((path (mew-expand-folder folder)) msgs) (with-temp-buffer (mew-set-buffer-multibyte t) (mew-search-google pattern path) (goto-char (point-min)) (while (re-search-forward mew-regex-message-files5 nil t) (setq msgs (cons (mew-match-string 1) msgs)) (forward-line)) (setq msgs (nreverse msgs)) (setq msgs (sort (mapcar 'string-to-number msgs) '<)) (mapcar 'number-to-string msgs)))) ;; xxx flds are not used at this moment (defun mew-search-virtual-with-google (pattern flds &optional dummy) (let* ((path (mew-expand-folder mew-folder-local)) (mail-regex (regexp-quote (file-name-as-directory path))) (regex (concat "^" mail-regex "\\(.*\\)/" "\\([0-9]+\\)")) (file (mew-make-temp-name)) (prev "") (rttl 0) crnt) (mew-search-google pattern path) (goto-char (point-min)) (while (not (eobp)) (when (looking-at regex) (setq rttl (1+ rttl)) (setq crnt (match-string 1)) (delete-region (match-beginning 0) (match-beginning 2)) (when (not (string= crnt prev)) (beginning-of-line) (insert "CD:" mew-folder-local crnt "\n")) (setq prev crnt) (forward-line))) (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write (write-region (point-min) (point-max) file nil 'no-msg)) (list file rttl))) (defun mew-google-index-folder (folder) "Make Google index for this folder." (let* ((ent (mew-search-get-ent mew-search-method)) (prog (mew-search-get-prog ent))) (start-process prog nil prog "-m" "-i" (mew-expand-folder folder)) (message "Google indexing for %s in background..." folder))) (defun mew-google-index-all () "Make Google index for all folders." (interactive) (let* ((ent (mew-search-get-ent mew-search-method)) (prog (mew-search-get-prog ent))) (start-process prog nil prog "-m" "-r" "-i" (mew-expand-folder "+")) (message "Google indexing for all folders in background..."))) (defun mew-google-register () "Register Google component" (interactive) (message "Registering Google component...") (call-process mew-prog-google nil nil nil "-R") (message "Registering Google component...done")) (defun mew-google-unregister () "Unregister Google component" (interactive) (message "Unregistering Google component...") (call-process mew-prog-google nil nil nil "-U") (message "Unregistering Google component...done")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; WDS Desktop ;;; (defun mew-search-wds (pattern path) (setq pattern (mew-cs-encode-string pattern default-file-name-coding-system)) (let* ((ent (mew-search-get-ent mew-search-method)) (prog (mew-search-get-prog ent))) (mew-plet (mew-alet (call-process prog nil t nil "-e" mew-suffix "-p" path "-s" pattern))))) (defun mew-search-with-wds (pattern folder &optional dummy) (let* ((path (mew-expand-folder folder)) msgs) (with-temp-buffer (mew-set-buffer-multibyte t) (mew-search-wds pattern path) (goto-char (point-min)) (while (re-search-forward mew-regex-message-files5 nil t) (setq msgs (cons (mew-match-string 1) msgs)) (forward-line)) (setq msgs (nreverse msgs)) (setq msgs (sort (mapcar 'string-to-number msgs) '<)) (mapcar 'number-to-string msgs)))) ;; xxx flds are not used at this moment (defun mew-search-virtual-with-wds (pattern flds &optional dummy) (let* ((path (mew-expand-folder mew-folder-local)) (mail-regex (regexp-quote (file-name-as-directory path))) (regex (concat "^" mail-regex "\\(.*\\)/" "\\([0-9]+\\)")) (file (mew-make-temp-name)) (prev "") (rttl 0) crnt) (mew-search-wds pattern path) (goto-char (point-min)) (while (not (eobp)) (when (looking-at regex) (setq rttl (1+ rttl)) (setq crnt (match-string 1)) (delete-region (match-beginning 0) (match-beginning 2)) (when (not (string= crnt prev)) (beginning-of-line) (insert "CD:" mew-folder-local crnt "\n")) (setq prev crnt)) (forward-line)) (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write (write-region (point-min) (point-max) file nil 'no-msg)) (list file rttl))) (defun mew-wds-index-folder (folder) "Make WDS index for all folders." (mew-wds-index-all)) (defun mew-wds-index-all () "Make WDS index for all folders." (interactive) (let* ((ent (mew-search-get-ent mew-search-method)) (prog (mew-search-get-prog ent))) (start-process prog nil prog "-R" (format "%s=%s" mew-suffix ".eml")) (message "WDS indexing for all folders in background..."))) (defun mew-wds-register () "Register '.mew' to WDS" (interactive) (message "Registering suffix '%s' to WDS..." mew-suffix) (call-process mew-prog-wds nil nil nil "-R" (format "%s=%s" mew-suffix ".eml")) (message "Registering suffix '%s' to WDS...done" mew-suffix)) (defun mew-wds-unregister () "Unregister '.mew' from WDS" (interactive) (message "This command cannot be used")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Hyper Estraier ;;; (defun mew-est-input-filter () (mew-input-pick-pattern "Hyper Estraier filter")) (defvar mew-search-est-db "casket") (defvar mew-prog-est-update "mewest") (defun mew-search-est (pattern path filter) (setq pattern (mew-cs-encode-string pattern mew-cs-est)) (if (string= filter "") (setq filter nil) (setq filter (mew-cs-encode-string filter mew-cs-est)) (setq filter (let ((mew-inherit-pick-omit-and t)) (mew-pick-parse (mew-pick-lex filter)))) (setq filter (mapcar 'mew-pick-filter-est-kyvl filter))) (let* ((ent (mew-search-get-ent mew-search-method)) (prog (mew-search-get-prog ent)) (casket (expand-file-name mew-search-est-db mew-conf-path)) ;; mew-home is not good for Zaurus (pregex (concat "^" (regexp-quote (file-name-directory (directory-file-name (file-truename (expand-file-name mew-mail-path))))))) attr args) (setq path (file-truename (file-name-as-directory path))) (when (string-match pregex path) (setq path (substring path (match-end 0))) (mew-plet (mew-alet (setq attr (format "@uri STRINC %s" (mew-q-encode-string path ?%))) (cond ((string-match "^ *ANDNOT " pattern) (setq pattern (concat "[UVSET] " pattern))) ((string-match "^ *$" pattern) (setq pattern "[UVSET]"))) (setq args (list "-vu" "-max" "-1" "-ord" "@cdate NUMA" casket pattern)) (unless (eq mew-cs-est 'utf-8) (setq args (cons (mew-cs-to-charset mew-cs-est) args)) (setq args (cons "-ic" args))) (setq filter (nreverse filter)) (while filter (setq args (cons "-attr" (cons (car filter) args))) (setq filter (cdr filter))) (setq args (cons "-attr" (cons attr args))) (apply 'call-process prog nil t nil "search" args)))))) (defun mew-search-with-est (pattern folder filter) (let* ((path (mew-expand-folder folder)) (regex (format "file://.*/%s/.*/\\([0-9]+\\)\\(%s\\)?$" (file-name-nondirectory mew-mail-path) (regexp-quote mew-suffix))) msgs) (with-temp-buffer (mew-set-buffer-multibyte t) (mew-search-est pattern path filter) (goto-char (point-min)) (while (re-search-forward regex nil t) (setq msgs (cons (mew-match-string 1) msgs)) (forward-line)) (setq msgs (nreverse msgs)) (setq msgs (sort (mapcar 'string-to-number msgs) '<)) (mapcar 'number-to-string msgs)))) (defun mew-search-virtual-with-est (pattern flds filter) (let* ((regex (format "file://.*/%s/\\(.*\\)/\\([0-9]+\\)\\(%s\\)?$" (file-name-nondirectory mew-mail-path) (regexp-quote mew-suffix))) (file (mew-make-temp-name)) (prev "") (rttl 0) (n 1) path crnt start) (unless flds (setq flds (list mew-folder-local))) (setq flds (mew-expand-wildcard-folder flds)) (while flds (setq path (mew-expand-folder (car flds))) (setq flds (cdr flds)) (mew-search-est pattern path filter) (goto-char (point-min)) (setq start (point)) (while (re-search-forward regex nil t) (setq rttl (1+ rttl)) (setq crnt (match-string 1)) (delete-region start (match-beginning 2)) (when (not (string= crnt prev)) (beginning-of-line) (insert "CD:" mew-folder-local (mew-q-decode-string crnt ?%) "\n")) (setq prev crnt) (forward-line) (setq start (point))) (delete-region start (point-max)) (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write (write-region (point-min) (point-max) file (> n 1) 'no-msg)) (mew-erase-buffer) (setq n (1+ n))) (list file rttl))) (defun mew-est-index-folder (folder) "Make Hyper Estraier index for this folder." (interactive) (if (not (mew-which-exec mew-prog-est-update)) (message "\"%s\" does not exist" mew-prog-est-update) (message "Hyper Estraier indexing for %s..." folder) (let* ((path (file-truename (mew-expand-folder folder))) (pro (start-process "*Mew EST*" nil mew-prog-est-update "-s" mew-suffix "-b" (mew-expand-folder mew-mail-path) path))) (set-process-filter pro 'mew-est-index-filter) (set-process-sentinel pro 'mew-est-index-sentinel)))) (defun mew-est-index-all () "Make Hyper Estraier index for all folders." (interactive) (if (not (mew-which-exec mew-prog-est-update)) (message "'%s' does not exist" mew-prog-est-update) (message "Hyper Estraier indexing...") (let ((pro (start-process "*Mew EST*" nil mew-prog-est-update "-s" mew-suffix "-b" (mew-expand-folder mew-mail-path)))) (set-process-filter pro 'mew-est-index-filter) (set-process-sentinel pro 'mew-est-index-sentinel)))) (defun mew-est-index-filter (process string) (save-excursion (cond ((string-match "exists" string) (message "Another Hyper Estraier indexer is running")) ((string-match "\.\.\.failed" string) (message "Hyper Estraier indexing ...failed")) ((string-match "old messages\.\.\.done" string) (message "Hyper Estraier purging ...done")) ((string-match "new messages\.\.\.done" string) (message "Hyper Estraier indexing ...done"))))) (defun mew-est-index-sentinel (process event) (save-excursion )) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; View ;;; (defvar mew-prog-smew "smew") (defvar mew-prog-cmew "cmew") (defvar mew-id-db-file "id.db") (defvar mew-id-db-ignore-regex "^\\./casket$|^\\./casket/|/\\.") (defmacro mew-msgid-check (&rest body) `(let ((db (mew-expand-file "+" mew-id-db-file))) (cond ((not (file-exists-p db)) (message "%s not found" mew-id-db-file)) ((not (mew-which-exec mew-prog-smew)) (message "%s not found" mew-prog-smew)) (t ,@body)))) (defun mew-summary-selection-by-msgid () "Creating Virtual mode with messages relating to the current message" (interactive) (mew-msgid-check (mew-summary-msg (let* ((ofolder (mew-summary-folder-name 'ext)) (subj (or (mew-summary-get-subject) mew-error-no-subject)) (str (mew-subject-simplify2 subj)) (vfolder (mew-folder-to-selection (if (string= str "") mew-error-no-subject subj))) (regex (format "\\(.*\\)/\\([0-9]+\\)\\(%s\\)?$" (regexp-quote mew-suffix))) (rttl 0) (file (mew-make-temp-name)) (db (mew-expand-file "+" mew-id-db-file)) (mydir (substring (mew-path-to-folder (mew-expand-folder (mew-summary-folder-name))) 1)) crnt start prev opts dfunc myid) (mew-sumsyn-match mew-regex-sumsyn-long) (setq myid (mew-sumsyn-my-id)) ;; (mew-summary-switch-to-folder vfolder) (mew-vinfo-set-mode 'selection) (mew-vinfo-set-physical-folder nil) (mew-vinfo-set-original-folder ofolder) (mew-erase-buffer) ;; (make-local-variable 'mew-summary-form-mark-delete) (setq mew-summary-form-mark-delete nil) (make-local-variable 'mew-summary-form-mark-spam) (setq mew-summary-form-mark-spam nil) (when (mew-summary-exclusive-p) (message "Creating selection by message-id...") (mew-redraw) (with-temp-buffer (mew-set-buffer-multibyte t) (mew-piolet mew-cs-text-for-read mew-cs-text-for-write (call-process mew-prog-smew nil t nil myid db mydir) (goto-char (point-min)) (setq start (point)) (while (re-search-forward regex nil t) (setq rttl (1+ rttl)) (setq crnt (match-string 1)) (delete-region start (match-beginning 2)) (when (not (string= crnt prev)) (beginning-of-line) (insert "CD:" mew-folder-local crnt "\n")) (setq prev crnt) (forward-line) (setq start (point))) (delete-region start (point-max)) (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write (write-region (point-min) (point-max) file nil 'no-msg)))) (setq dfunc `(lambda () (mew-delete-file ,file))) (setq opts (list "-i" file)) (mew-local-retrieve 'vir opts dfunc nil nil rttl)))))) (defun mew-summary-get-subject () (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number)) (cache (mew-cache-hit fld msg)) subj) (if (and cache (get-buffer cache)) (with-current-buffer cache (setq subj (mew-header-get-value mew-subj:))) (with-temp-buffer (mew-insert-message fld msg mew-cs-text-for-read mew-header-reasonable-size) (mew-refile-decode-subject) (setq subj (mew-header-get-value mew-subj:)))) subj)) (defun mew-summary-make-id-index-folder () "Make ID database for this folder." (interactive) (mew-summary-only (cond ((not (file-exists-p (expand-file-name mew-id-db-file mew-mail-path))) (message (mew-substitute-for-summary "Type '\\[mew-summary-make-id-index-all]' to create ID database"))) ((not (mew-which-exec mew-prog-cmew)) (message "%s not found" mew-prog-cmew)) (t (let* ((dbfile (expand-file-name mew-id-db-file mew-mail-path)) (path (expand-file-name mew-mail-path)) (regex mew-id-db-ignore-regex) (target (mew-folder-string (mew-path-to-folder (mew-expand-folder (mew-summary-folder-name 'ext))))) (options (list dbfile path regex target)) (buf (generate-new-buffer (concat mew-buffer-prefix "cmew"))) pro) (message "Updating ID database...") (setq pro (apply 'start-process "cmew" buf mew-prog-cmew options)) (set-process-filter pro 'mew-summary-make-id-index-filter) (set-process-sentinel pro 'mew-summary-make-id-index-sentinel)))))) (defun mew-summary-make-id-index-all (&optional full-update) "Make ID database for all folders. If called with '\\[universal-argument]', the database is created from scratch." (interactive "P") (if (not (mew-which-exec mew-prog-cmew)) (message "%s not found" mew-prog-cmew) (let* ((dbfile (expand-file-name mew-id-db-file mew-mail-path)) (path (expand-file-name mew-mail-path)) (options (list dbfile path mew-id-db-ignore-regex)) (buf (generate-new-buffer (concat mew-buffer-prefix "cmew"))) pro) (if full-update (setq options (cons "-f" options))) (message "Updating ID database...") (setq pro (apply 'start-process "cmew" buf mew-prog-cmew options)) (set-process-filter pro 'mew-summary-make-id-index-filter) (set-process-sentinel pro 'mew-summary-make-id-index-sentinel)))) (defun mew-summary-make-id-index-filter (process string) (save-excursion (mew-filter (goto-char (point-max)) (insert string)))) (defun mew-summary-make-id-index-sentinel (process event) (let ((buf (process-buffer process))) (with-current-buffer buf (goto-char (point-max)) (forward-line -1) (let ((str (mew-buffer-substring (line-beginning-position) (line-end-position)))) (message "Updating ID database...done (%s)" str))) (mew-remove-buffer buf))) (provide 'mew-search) ;;; Copyright Notice: ;; Copyright (C) 2005-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-search.el ends here kazu-yamamoto-Mew-ff9c41b/mew-smime.el000066400000000000000000000404071256455547000200020ustar00rootroot00000000000000;;; mew-smime.el --- S/MIME for Mew ;; Author: Kazu Yamamoto ;; Created: Nov 12, 2004 ;;; Code: ;; for gpgsm only ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; S/MIME program ;;; (defvar mew-prog-smime "gpgsm") (defvar mew-smime-ver nil) (defvar mew-prog-smime-options '("--include-certs" "3" "--status-fd" "1")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; S/MIME check ;;; (defun mew-smime-setup () (if (mew-which-exec mew-prog-smime) (setq mew-smime-ver t))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; S/MIME signing ;;; (defvar mew-smime-type "smime-type") (defvar mew-smime-file-name "smime") (defvar mew-smime-signature-suffix ".p7s") ;; application/pkcs7-signature (defvar mew-smime-mime-suffix ".p7m") ;; application/pkcs7-mime ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Password ;;; (defun mew-smime-passtag () "GPGSM") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Micalg ;;; (defvar mew-smime-hash-alist '(("1" . "md5") ("2" . "sha1") ("3" . "ripemd160") ("5" . "md2") ("6" . "tiger192") ("7" . "haval-5-160") ("8" . "sha256") ("9" . "sha384") ("10" . "sha512"))) (defun mew-smime-get-micalg () (with-temp-buffer (insert mew-smime-string) (goto-char (point-min)) (if (re-search-forward "SIG_CREATED [A-Z] [0-9]+ \\([0-9]+\\)" nil t) (cdr (assoc (mew-match-string 1) mew-smime-hash-alist)) "sha1"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Internal variables ;;; (defvar mew-smime-running nil) (defvar mew-smime-string nil) (defvar mew-smime-failure nil) (defvar mew-smime-decrypt-msg nil) (defvar mew-smime-sign-msg nil) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filter and sentinel ;;; (defvar mew-smime-prompt-enter-pass "Enter S/MIME pass phrase: ") (defun mew-smime-passphrase () (let ((prompt mew-smime-prompt-enter-pass) (tag (mew-smime-passtag))) (mew-input-passwd prompt tag))) (defvar mew-smime-msg-enter-pass "Enter passphrase:") (defvar mew-smime-msg-bad-pass ": Bad") (defvar mew-smime-result-sec-succ "S/MIME decrypted") (defvar mew-smime-result-pass "Pass phrase is wrong") (defun mew-smime-debug (label string) (when (mew-debug 'smime) (with-current-buffer (get-buffer-create mew-buffer-debug) (goto-char (point-max)) (insert (format "\n<%s>\n%s\n" label string))))) (defun mew-smime-process-filter (process string) (save-excursion ;; sign or decrypt (mew-smime-debug "S/MIME filter" string) (setq mew-smime-string (concat mew-smime-string string)) (cond ;; pass phrase for sign or decrypt ((string-match mew-smime-msg-enter-pass string) (process-send-string process (format "%s\n" (mew-smime-passphrase)))) ;; pass phrases were wrong three times ((string-match mew-smime-msg-bad-pass string) (setq mew-smime-failure t) ;; password failure (mew-passwd-set-passwd (mew-smime-passtag) nil)) ;; cancel anyway ((string-match "INV_RECP \\([0-9]*\\) \\([^ \n]*\\)" string) (setq mew-smime-failure (cdr (assoc (mew-match-string 1 string) mew-smime-inv-recp-alist))) (setq mew-smime-failure (concat mew-smime-failure " for " (mew-match-string 2 string))))))) (defun mew-smime-process-sentinel (process event) (save-excursion (let ((decrypted mew-smime-result-sec-succ) (msg "")) (if (not mew-smime-failure) (cond ((eq mew-smime-running 'decrypting) (setq mew-smime-decrypt-msg decrypted)) ((eq mew-smime-running 'signing) (setq mew-smime-sign-msg nil))) (cond ;; sign or decrypt ((eq mew-smime-failure t) (setq msg mew-smime-result-pass)) ((stringp mew-smime-failure) (setq msg mew-smime-failure))) (cond ((eq mew-smime-running 'decrypting) (setq mew-smime-decrypt-msg msg)) ((eq mew-smime-running 'signing) (setq mew-smime-sign-msg msg)))) (setq mew-smime-running nil)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Checking ;;; (defun mew-smime-verify-check () (let (addr warning result trust ret) (goto-char (point-min)) (if (re-search-forward "EMail=\\(.*\\)" nil t) (setq addr (mew-match-string 1))) (goto-char (point-min)) (cond ((search-forward "GOODSIG" nil t) (setq result "Good S/MIME sign")) ((search-forward "EXPSIG" nil t) (setq result "Good S/MIME sign") (setq warning "signature has expired")) ((search-forward "EXPKEYSIG" nil t) (setq result "Good S/MIME sign") (setq warning "certificate has expired")) ((search-forward "REVKEYSIG" nil t) (setq result "Good S/MIME sign") (setq warning "certificate has been revoked")) ((search-forward "BADSIG" nil t) (setq result "BAD S/MIME sign")) ((search-forward "ERRORSIG" nil t) (setq result "BAD S/MIME sign")) ;; xxx (t (setq result "BAD S/MIME sign"))) (goto-char (point-min)) ;; xxx error code check for TRUST_UNDEFINED/NEVER? (if (re-search-forward "TRUST_\\([A-Z]*\\)" nil t) (setq trust (mew-match-string 1))) (setq ret result) (if addr (setq ret (concat ret " <" addr ">"))) (if trust (setq ret (concat ret " " trust))) (if warning (setq ret (concat ret " -" warning))) ret)) (defvar mew-smime-inv-recp-alist '(( "0" . "No specific reason given") ( "1" . "Not Found") ( "2" . "Ambigious specification") ( "3" . "Wrong key usage") ( "4" . "Key revoked") ( "5" . "Key expired") ( "6" . "No CRL known") ( "7" . "CRL too old") ( "8" . "Policy mismatch") ( "9" . "Not a secret key") ("10" . "Key not trusted") ("11" . "Missing certifciate"))) (defun mew-smime-encrypt-check () (let (ret) ;; this should be nil (goto-char (point-min)) (when (re-search-forward "INV_RECP \\([0-9]*\\) \\([^ \n]*\\)" nil t) (setq ret (cdr (assoc (mew-match-string 1) mew-smime-inv-recp-alist))) (setq ret (concat ret " for " (mew-match-string 2)))) ret)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; S/MIME short cut ;;; (defun mew-smime-sign-message (&optional arg) "Sign the entire draft with S/MIME. Input your passphrase." (interactive "P") (mew-smime-encode-message 'smime-signature arg)) (defun mew-smime-encrypt-message () "Encrypt the entire draft with S/MIME." (interactive) (mew-smime-encode-message 'smime-encryption)) (defun mew-smime-sign-encrypt-message (&optional arg) "Sign then encrypt the entire draft with S/MIME. Input your passphrase." (interactive "P") (mew-smime-encode-message 'smime-signature-encryption)) (defun mew-smime-encrypt-sign-message (&optional arg) "Encrypt then sign the entire draft with S/MIME. Input your passphrase." (interactive "P") (mew-smime-encode-message 'smime-encryption-signature)) (defun mew-smime-encode-message (type &optional ask-signer) (if (null mew-smime-ver) (message "%s does not exist" mew-prog-smime) (if (and ask-signer (string-match "signature" (symbol-name type))) (mew-draft-make-message type (car (mew-input-address "Who's key?: "))) (mew-draft-make-message type)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Encoding ;;; (defun mew-encode-smime (type cte decrypters) (let ((file1 (mew-save-transfer-form (point-min) (point-max) nil cte)) file2 errmsg file2-errmsg) (cond ((string= type mew-ct-smm-sig) (setq file2-errmsg (mew-smime-sign file1))) ((string= type mew-ct-smm-enc) (setq file2-errmsg (mew-smime-encrypt file1 decrypters)))) (mew-set '(file2 errmsg) file2-errmsg) (if errmsg (progn (mew-delete-file file1) (mew-delete-file file2) (mew-tinfo-set-privacy-err t) (mew-tinfo-set-privacy-type nil) (mew-draft-mode-name) (mew-encode-error errmsg)) (mew-encode-singlepart (mew-encode-syntax-single file2 (list mew-ct-smm (list mew-smime-type type) (list "name" (concat mew-smime-file-name mew-smime-mime-suffix))) mew-b64))) (mew-delete-file file1) (mew-delete-file file2))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Signature ;;; (defun mew-smime-sign (file1) (setq mew-smime-running 'signing) (setq mew-smime-string nil) (setq mew-smime-sign-msg nil) (setq mew-smime-failure nil) (let* ((process-connection-type mew-connection-type2) (file2 (mew-make-temp-name)) (prog mew-prog-smime) (opts `("--sign" ,@mew-prog-smime-options "--local-user" ,mew-inherit-encode-smime-signer "--output" ,file2 ,file1)) process) (message "S/MIME signing...") (setq process (apply 'mew-start-process-lang "GPGSM sign" nil prog opts)) (mew-set-process-cs process mew-cs-autoconv mew-cs-dummy) (set-process-filter process 'mew-smime-process-filter) (set-process-sentinel process 'mew-smime-process-sentinel) (mew-rendezvous mew-smime-running) (unless (file-exists-p file2) ;; for unpredictable error (mew-passwd-set-passwd (mew-smime-passtag) nil)) (message "S/MIME signing...done") (list file2 mew-smime-sign-msg))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Encryption ;;; (defvar mew-smime-cipher "AES") (defun mew-smime-encrypt (file1 decrypters) (let* ((process-connection-type mew-connection-type2) (file2 (mew-make-temp-name)) (decs (mew-gpg-roption decrypters "--recipient")) (prog mew-prog-smime) (opts `("--encrypt" ,@mew-prog-smime-options ,@decs "--cipher-algo" ,mew-smime-cipher "--output" ,file2 ,file1)) check) (message "S/MIME encrypting...") (with-temp-buffer (apply 'mew-call-process-lang prog nil t nil opts) (setq check (mew-smime-encrypt-check))) (message "S/MIME encrypting...done") (list file2 check))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Decoding ;;; (defun mew-decode-smime (syntax cnt) (let* ((ctl (mew-syntax-get-ct syntax)) (type (mew-syntax-get-param ctl mew-smime-type)) file1 file2 syntax2 result privacy) ;; xxx smime-type is optional, sigh (if (null type) (setq type mew-ct-smm-enc)) (mew-syntax-set-ct syntax mew-type-apo) (setq file1 (mew-save-decode-form syntax)) (setq file2 (mew-make-temp-name)) (delete-region (point-min) (point-max)) (cond ((mew-case-equal type mew-ct-smm-sig) (setq result (mew-smime-verify file1 file2))) ((mew-case-equal type mew-ct-smm-enc) (setq result (mew-smime-decrypt file1 file2))) (t (setq syntax2 syntax) (mew-syntax-set-ct syntax mew-type-apo))) (if (and (file-exists-p file2) (> (mew-file-get-size file2) 0)) ;; shell creates file2 anyway (mew-flet (mew-insert-file-contents file2) (put-text-property (point-min) (point-max) 'mew-noncontents nil) (mew-decode-crlf-magic)) (insert "\n") ;; CT: text/plain; charset=us-ascii (insert (format "%s could not be decrypted.\n" mew-ct-smm)) (mew-xinfo-set-not-decrypted t)) ;; Throw away garbage (mew-delete-file file1) (mew-delete-file file2) (goto-char (point-min)) (setq syntax2 (mew-decode-singlepart cnt nil nil)) (setq privacy (mew-syntax-get-privacy syntax2)) (if privacy (setq result (concat result "\n\t"))) (mew-syntax-set-privacy syntax2 (cons (mew-make-privacy-dinfo :ct mew-ct-smm :proto type :result result) privacy)) syntax2)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Verification ;;; (defun mew-smime-verify (file1 file2) (let ((prog mew-prog-smime) (opts `("--verify" ,@mew-prog-smime-options "--output" ,file2 ,file1)) result) (message "S/MIME verifying...") (with-temp-buffer (apply 'mew-call-process-lang prog nil t nil opts) (setq result (mew-smime-verify-check))) (message "S/MIME verifying...done") result)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Decription ;;; (defun mew-smime-decrypt (file1 file2) (setq mew-smime-running 'decrypting) (setq mew-smime-string nil) (setq mew-smime-decrypt-msg nil) (setq mew-smime-failure nil) (let ((process-connection-type mew-connection-type2) (prog mew-prog-smime) (opts `("--decrypt" "--output" ,file2 ,file1)) process) (message "S/MIME decrypting...") (setq process (apply 'mew-start-process-lang "GPGSM decrypt" nil prog opts)) (mew-set-process-cs process mew-cs-autoconv mew-cs-dummy) (set-process-filter process 'mew-smime-process-filter) (set-process-sentinel process 'mew-smime-process-sentinel) (mew-rendezvous mew-smime-running) (unless (file-exists-p file2) ;; for unpredictable error (mew-passwd-set-passwd (mew-smime-passtag) nil)) (message "S/MIME decrypting...done") mew-smime-decrypt-msg)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Multipart/Signed ;;; (defun mew-smime-detach-verify (file1 file2) (let ((prog mew-prog-smime) (opts `("--verify" ,@mew-prog-smime-options ,file2 ,file1)) ret) (message "S/MIME verifying...") (with-temp-buffer (apply 'mew-call-process-lang prog nil t nil opts) (setq ret (mew-smime-verify-check))) (message "S/MIME verifying...done") ret)) (defun mew-smime-detach-sign (file1) (setq mew-smime-running 'signing) (setq mew-smime-string nil) (setq mew-smime-sign-msg nil) (setq mew-smime-failure nil) (let* ((process-connection-type mew-connection-type2) (file2 (concat (mew-make-temp-name mew-smime-file-name) mew-smime-signature-suffix)) (prog mew-prog-smime) (opts `("--detach-sign" ,@mew-prog-smime-options "--local-user" ,mew-inherit-encode-smime-signer "--output" ,file2 ,file1)) process) (message "S/MIME signing...") (setq process (apply 'mew-start-process-lang "GPGSM sign" nil prog opts)) (mew-set-process-cs process mew-cs-autoconv mew-cs-dummy) (set-process-filter process 'mew-smime-process-filter) (set-process-sentinel process 'mew-smime-process-sentinel) (mew-rendezvous mew-smime-running) (unless (file-exists-p file2) ;; for unpredictable error (mew-passwd-set-passwd (mew-smime-passtag) nil)) (message "S/MIME signing...done") (list file2 mew-b64 (mew-smime-get-micalg) mew-smime-sign-msg))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; GPG ;;; (defun mew-gpg-roption (decrypters roption) (if (and mew-encrypt-to-myself (not (member mew-inherit-encode-smime-signer decrypters))) (setq decrypters (cons mew-inherit-encode-smime-signer decrypters))) (setq decrypters (mapcar (lambda (x) (if (string-match "^[^<].*@" x) (concat "<" x ">") x)) decrypters)) (let (decs) (dolist (decrypter decrypters) (setq decs (cons decrypter (cons roption decs)))) (nreverse decs))) (provide 'mew-smime) ;;; Copyright Notice: ;; Copyright (C) 2004-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-smime.el ends here kazu-yamamoto-Mew-ff9c41b/mew-smtp.el000066400000000000000000000653371256455547000176640ustar00rootroot00000000000000;;; mew-smtp.el ;; Author: Kazu Yamamoto ;; Created: Dec 3, 1999 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; SMTP info ;;; (defvar mew-smtp-info-list '(;; parameters to be saved "raw-header" "recipients" "orig-recipients" "bcc" "fcc" "msgid" "logtime" "case" ;; save for re-edit ;; parameters used internally "server" "port" "ssh-server" "user" "auth-user" "auth-list" "helo-domain" "status" "process" "ssh-process" "ssl-process" "qfld" "messages" ;; parameters used internally and should be initialized "string" "error" "auth-selected" "timer" "cont" "from" "sender" "done" "imapp" "capa" "fallback")) (mew-info-defun "mew-smtp-" mew-smtp-info-list) (defvar mew-smtp-info-list-save-length 8) (defvar mew-smtp-info-list-clean-length 21) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; FSM ;;; (defvar mew-smtp-fsm '(("greeting" ("220" . "ehlo")) ("ehlo" ("250" . "post-ehlo") (t . "helo")) ;; ("auth" ("250" . "next")) ("auth-cram-md5" ("334" . "pwd-cram-md5") (t . "wpwd")) ("pwd-cram-md5" ("235" . "next") (t . "wpwd")) ("auth-login" ("334" . "user-login") (t . "wpwd")) ("user-login" ("334" . "pwd-login") (t . "wpwd")) ("pwd-login" ("235" . "next") (t . "wpwd")) ("auth-plain" ("235" . "next") (t . "wpwd")) ;; See blow ;; ("auth-plain" ("334" . "pwd-plain") (t . "wpwd")) ;; ("pwd-plain" ("235" . "next") (t . "wpwd")) ;; ("helo" ("250" . "next")) ("mail-from" ("250" . "rcpt-to")) ("rcpt-to" ("250" . "data")) ("data" ("354" . "content")) ("content" ("250" . "done")) ("quit" (t . "noop")))) (defun mew-smtp-fsm-by-status (status) (assoc status mew-smtp-fsm)) (defun mew-smtp-fsm-next (status code) (cdr (mew-assoc-match2 code (cdr (mew-smtp-fsm-by-status status)) 0))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filters ;;; (defun mew-smtp-command-helo (pro pnm) (let ((helo-domain (mew-smtp-get-helo-domain pnm))) (mew-smtp-process-send-string pro "HELO %s" helo-domain))) (defun mew-smtp-command-ehlo (pro pnm) (let ((helo-domain (mew-smtp-get-helo-domain pnm))) (mew-smtp-process-send-string pro "EHLO %s" helo-domain))) (defun mew-smtp-command-post-ehlo (pro pnm) (let ((str (mew-smtp-get-string pnm)) (start 0) capa) (catch 'loop (while (string-match "^250\\([- ]?\\)\\(.*\\)$" str start) (setq capa (cons (mew-split (match-string 2 str) 32) capa)) (if (string= (match-string 1 str) " ") (throw 'loop nil)) (setq start (match-end 0)))) (mew-smtp-set-capa pnm (nreverse capa)) (mew-smtp-set-status pnm "auth") (mew-smtp-command-auth pro pnm))) (defun mew-smtp-command-auth (pro pnm) (let* ((case (mew-smtp-get-case pnm)) (use-smtp-auth (mew-use-smtp-auth case)) (capa (mew-smtp-get-capa pnm)) (auths (assoc "AUTH" capa)) (auth-list (mew-smtp-get-auth-list pnm)) auth func) (cond ((and use-smtp-auth auths) (if (and (setq auth (mew-auth-select2 auths auth-list)) (setq func (mew-smtp-auth-get-func auth)) (fboundp func)) (progn (mew-smtp-set-auth-selected pnm auth) (funcall func pro pnm)) (mew-smtp-debug "" "No preferred SMTP AUTH.\n") (mew-smtp-command-wpwd pro pnm))) (t (mew-smtp-set-status pnm "next") (mew-smtp-command-next pro pnm))))) (defun mew-smtp-command-wpwd (pro pnm) (let ((auth (mew-smtp-get-auth-selected pnm))) (mew-passwd-set-passwd (mew-smtp-passtag pnm) nil) (if auth (mew-smtp-set-error pnm (format "SMTP %s password is wrong!" auth)) (mew-smtp-set-error pnm "No SMTP AUTH available!")) (mew-smtp-command-quit2 pro pnm))) (defun mew-smtp-command-next (pro pnm) (let ((msgs (mew-smtp-get-messages pnm)) (qfld (mew-smtp-get-qfld pnm)) (case (mew-smtp-get-case pnm)) msg) (if msgs (progn (setq msg (car msgs)) (setq msgs (cdr msgs)) (mew-queue-insert-file pnm mew-smtp-info-list-save-length qfld msg) (mew-set-buffer-multibyte nil) (mew-info-clean-up pnm mew-smtp-info-list-clean-length) (mew-smtp-set-case pnm case) ;; override (mew-smtp-set-messages pnm msgs) (set-process-buffer pro (current-buffer)) (mew-smtp-set-status pnm "mail-from") (mew-smtp-command-mail-from pro pnm)) (mew-smtp-set-status pnm "quit") (mew-smtp-command-quit pro pnm)))) (defun mew-smtp-command-mail-from (pro pnm) (widen) (clear-visited-file-modtime) ;; (let* ((case (mew-smtp-get-case pnm)) (resentp (mew-header-existp mew-resent-from:)) (sender: (if resentp mew-resent-sender: mew-sender:)) (from: (if resentp mew-resent-from: mew-from:)) (from (mew-header-get-value from:)) (froms (mew-addrstr-parse-address-list from)) (nfrom (length froms)) (mail-from (mew-smtp-mail-from case))) (mew-smtp-set-from pnm from) ;; for Bcc: (unless mail-from ;; Which address is suitable for MAIL FROM if multiple? (setq mail-from (car froms))) (unless (mew-header-existp sender:) (if (= nfrom 1) (if (and mew-use-sender (not (string= mail-from (car froms)))) (mew-smtp-set-sender pnm (cons sender: mail-from))) (mew-smtp-set-sender pnm (cons sender: mail-from)))) ;; (mew-smtp-process-send-string pro "MAIL FROM:<%s>" mail-from))) (defun mew-smtp-command-rcpt-to (pro pnm) (let* ((recipients (mew-smtp-get-recipients pnm)) (recipient (car recipients))) (setq recipients (cdr recipients)) (mew-smtp-set-recipients pnm recipients) (if recipients (mew-smtp-set-status pnm "mail-from")) (mew-smtp-process-send-string pro "RCPT TO:<%s>" recipient))) (defun mew-smtp-command-data (pro pnm) (goto-char (point-max)) (unless (bolp) (insert "\n")) (mew-dot-insert) (mew-eol-fix-for-write) (set-buffer-modified-p nil) (mew-smtp-set-cont pnm (point-min)) (mew-smtp-set-timer pnm nil) (mew-smtp-process-send-string pro "DATA")) (defun mew-smtp-command-content (pro pnm) (save-excursion (let ((cont (mew-smtp-get-cont pnm)) (sender (mew-smtp-get-sender pnm)) (inc 1000) (i 0) (N 10)) (set-buffer (process-buffer pro)) ;; Sender: (when sender (mew-smtp-process-send-string pro "%s %s" (car sender) (cdr sender)) (mew-smtp-set-sender pnm nil)) ;; (while (and (< cont (point-max)) (not (input-pending-p)) (< i N)) (let ((next (min (point-max) (+ cont inc)))) (if (and (processp pro) (eq (process-status pro) 'open)) (process-send-region pro cont next)) (setq cont next) (setq i (1+ i)))) (mew-smtp-set-cont pnm cont) (if (< cont (point-max)) (let ((timer (if (input-pending-p) (run-with-idle-timer 0.01 nil 'mew-smtp-command-content pro pnm) (run-at-time 0.05 nil 'mew-smtp-command-content pro pnm)))) (mew-smtp-set-timer pnm timer)) (mew-smtp-set-cont pnm nil) (mew-smtp-set-timer pnm nil) (mew-smtp-process-send-string pro "."))))) (defun mew-smtp-command-done (pro pnm) (let ((fcc (mew-smtp-get-fcc pnm)) (case (mew-smtp-get-case pnm)) (back (mew-queue-backup (buffer-file-name) mew-queue-info-suffix)) imapp) ;; mew-folder-new-message may be slow if the folder contains ;; a lot of messages. So, let's Fcc in background. (setq imapp (mew-net-fcc-message case fcc back)) (mew-smtp-set-imapp pnm imapp) (mew-smtp-log pnm) (if (mew-smtp-get-bcc pnm) (mew-smtp-bcc pro pnm back) (mew-smtp-set-status pro "next") (mew-smtp-command-next pro pnm)))) (defun mew-smtp-command-quit (pro pnm) (mew-smtp-set-done pnm t) (mew-smtp-process-send-string pro "QUIT")) (defun mew-smtp-command-quit2 (pro pnm) ;; error is set (mew-smtp-set-done pnm t) (when (and (processp pro) (eq (process-status pro) 'open)) (mew-smtp-set-status pnm "quit") (mew-smtp-process-send-string pro "QUIT"))) (defun mew-smtp-command-noop (pro pnm) ()) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; SMTP AUTH (RFC 2554) ;;; (defvar mew-smtp-auth-alist '(("CRAM-MD5" mew-smtp-command-auth-cram-md5) ;; RFC 2195 ("PLAIN" mew-smtp-command-auth-plain) ;; RFC 2595 ("LOGIN" mew-smtp-command-auth-login))) ;; No spec (defun mew-smtp-auth-get-func (auth) (nth 1 (mew-assoc-case-equal auth mew-smtp-auth-alist 0))) ;; CRAM MD5 (defun mew-smtp-command-auth-cram-md5 (pro pnm) (mew-smtp-process-send-string pro "AUTH CRAM-MD5") (mew-smtp-set-status pnm "auth-cram-md5")) (defun mew-smtp-command-pwd-cram-md5 (pro pnm) (let* ((str (mew-smtp-get-string pnm)) (user (mew-smtp-get-auth-user pnm)) (prompt (format "SMTP CRAM-MD5 password (%s): " user)) challenge passwd cram-md5) (if (string-match " \\([a-zA-Z0-9+/]+=*\\)" str) ;; xxx (setq challenge (match-string 1 str))) (setq passwd (mew-smtp-input-passwd prompt pnm)) (setq cram-md5 (mew-cram-md5 user passwd challenge)) (mew-smtp-process-send-string pro cram-md5))) ;; LOGIN (defun mew-smtp-command-auth-login (pro pnm) (mew-smtp-process-send-string pro "AUTH LOGIN") (mew-smtp-set-status pnm "auth-login")) (defun mew-smtp-command-user-login (pro pnm) (let* ((user (mew-smtp-get-auth-user pnm)) (euser (mew-base64-encode-string user))) (mew-smtp-process-send-string pro "%s" euser))) (defun mew-smtp-command-pwd-login (pro pnm) (let* ((user (mew-smtp-get-auth-user pnm)) (prompt (format "SMTP LOGIN password (%s): " user)) (passwd (mew-smtp-input-passwd prompt pnm)) (epasswd (mew-base64-encode-string passwd))) (mew-smtp-process-send-string pro epasswd))) ;; There are two variations for SMTP AUTH PLAIN. ;; 1) AUTH PLAIN then id+password ;; 2) AUTH PLAIN id+password ;; ;; 1) is popular however a server of an ISP supports 2) only, sigh. (defun mew-smtp-command-auth-plain (pro pnm) (let* ((case (mew-smtp-get-case pnm)) (user (mew-smtp-get-auth-user pnm)) (authorize-id (mew-smtp-auth-plain-authorize-id case)) (prompt (format "SMTP PLAIN password (%s): " user)) (passwd (mew-smtp-input-passwd prompt pnm)) (plain (mew-base64-encode-string (if authorize-id (format "%s\0%s\0%s" user user passwd) (format "\0%s\0%s" user passwd))))) (mew-smtp-process-send-string pro "AUTH PLAIN %s" plain) (mew-smtp-set-status pnm "auth-plain"))) ;; (defun mew-smtp-command-auth-plain (pro pnm) ;; (mew-smtp-process-send-string pro "AUTH PLAIN") ;; (mew-smtp-set-status pnm "auth-plain")) ;; (defun mew-smtp-command-pwd-plain (pro pnm) ;; (let* ((case (mew-smtp-get-case pnm)) ;; (user (mew-smtp-get-auth-user pnm)) ;; (authorize-id (mew-smtp-auth-plain-authorize-id case)) ;; (prompt (format "SMTP PLAIN password (%s): " user)) ;; (passwd (mew-smtp-input-passwd prompt pnm)) ;; (plain (mew-base64-encode-string ;; (if authorize-id ;; (format "%s\0%s\0%s" user user passwd) ;; (format "\0%s\0%s" user passwd))))) ;; (mew-smtp-process-send-string pro "%s" plain))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sub functions ;;; (defconst mew-smtp-info-prefix "mew-smtp-info-") (defun mew-smtp-info-name (case &optional fallbacked) (let ((server (mew-smtp-server case)) (port (mew-*-to-string (mew-smtp-port case))) (user (mew-smtp-user case)) (sshsrv (mew-smtp-ssh-server case)) (name mew-smtp-info-prefix)) (if user (setq name (concat name user "@" server)) (setq name (concat name server))) (when (and (not fallbacked) mew-use-submission ;; xxx to be deleted (fboundp 'make-network-process) (string= port "smtp")) (setq port "submission")) (unless (mew-port-equal port mew-smtp-port) (setq name (concat name ":" port))) (if sshsrv (concat name "%" sshsrv) name))) (defun mew-smtp-process-send-string (pro &rest args) (let ((str (apply 'format args))) (mew-smtp-debug "=SEND=" str) (if (and (processp pro) (eq (process-status pro) 'open)) (process-send-string pro (concat str mew-cs-eol)) (message "SMTP time out")))) (defun mew-smtp-passtag (pnm) (concat (mew-smtp-get-auth-user pnm) "@" (mew-smtp-get-server pnm) ":" (mew-smtp-get-port pnm))) (defun mew-smtp-input-passwd (prompt pnm) (let ((tag (mew-smtp-passtag pnm)) (pro (mew-smtp-get-process pnm)) pass) (setq pass (mew-input-passwd prompt tag)) (unless (and (processp pro) (eq (process-status pro) 'open)) (mew-passwd-set-passwd tag nil)) pass)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Opening SMTP ;;; (defvar mew-use-submission nil) (defvar mew-smtp-submission-timeout 10) (defun mew-smtp-submission-timeout (pro) (when (and (processp pro) (eq (process-status pro) 'connect)) (mew-smtp-sentinel pro "time out - failed\n"))) (defvar mew-smtp-submission-family 'ipv4) (if (fboundp 'make-network-process) (defun mew-open-network-stream (name buf server port) (let (family nowait pro) (when mew-inherit-submission (setq family mew-smtp-submission-family) (setq nowait t)) (setq pro (make-network-process :name name :buffer buf :host server :service port :family family :nowait nowait)) (if nowait (run-at-time mew-smtp-submission-timeout nil 'mew-smtp-submission-timeout pro)) pro)) (defalias 'mew-open-network-stream 'open-network-stream)) (defun mew-smtp-open (pnm server port) (let ((sprt (mew-*-to-port port)) pro tm) ;; xxx some OSes do not define "submission", sigh. (when (and (stringp sprt) (string= sprt "submission")) (setq sprt (mew-serv-to-port sprt))) (condition-case emsg (progn (setq tm (run-at-time mew-smtp-timeout-time nil 'mew-smtp-timeout)) (message "Connecting to the SMTP server...") (setq pro (mew-open-network-stream pnm nil server sprt)) (mew-process-silent-exit pro) (mew-set-process-cs pro mew-cs-text-for-net mew-cs-text-for-net) (message "Connecting to the SMTP server...done")) (quit (setq pro nil) (message "Cannot connect to the SMTP server")) (error (setq pro nil) (message "%s, %s" (nth 1 emsg) (nth 2 emsg)))) (if tm (cancel-timer tm)) pro)) (defun mew-smtp-timeout () (signal 'quit nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Launcher ;;; (defun mew-smtp-send-message (case qfld msgs &optional fallbacked) (let ((server (mew-smtp-server case)) (user (mew-smtp-user-only case)) (port (mew-*-to-string (mew-smtp-port case))) (pnm (mew-smtp-info-name case fallbacked)) (sshsrv (mew-smtp-ssh-server case)) (sslp (mew-smtp-ssl case)) (sslport (mew-smtp-ssl-port case)) mew-inherit-submission process sshname sshpro sslname sslpro lport tlsp tls fallback) (when (and sslp (mew-port-equal port sslport)) (setq tlsp t) ;; let stunnel know that a wrapper protocol is SMTP (setq tls mew-tls-smtp)) ;; a fallback: "submission" -> "smtp" ;; mew-smtp-port is "smtp" and mew-use-submission is t on Emacs 22 (when (and (or (not sslp) tlsp) (not fallbacked) mew-use-submission (fboundp 'make-network-process) ;; Emacs 22 or later (mew-port-equal port "smtp")) (setq port "submission") (setq fallback t) (unless tlsp ;; TLS uses stunnel. So, we should not use non-blocking connect. ;; Timeout should be carried out by stunnel. (setq mew-inherit-submission t)) (if (mew-port-equal sslport "smtp") (setq sslport "submission"))) (cond (sshsrv (setq sshpro (mew-open-ssh-stream case server port sshsrv)) (when sshpro (setq sshname (process-name sshpro)) (setq lport (mew-ssh-pnm-to-lport sshname)) (when lport (setq process (mew-smtp-open pnm "localhost" lport))))) (sslp (setq sslpro (mew-open-ssl-stream case server sslport tls)) (when sslpro (setq sslname (process-name sslpro)) (setq lport (mew-ssl-pnm-to-lport sslname)) (when lport (setq process (mew-smtp-open pnm mew-ssl-localhost lport))))) (t (setq process (mew-smtp-open pnm server port)))) (if (null process) (cond ((and sshsrv (null sshpro)) (message "Cannot create to the SSH connection")) ((and sslp (null sslpro)) (message "Cannot create to the SSL/TLS connection")) (t (if (and (or (not sslp) tlsp) (not fallbacked) mew-use-submission (fboundp 'make-network-process) (mew-port-equal port "submission")) (progn ;; make-network-process with :nowait t sometime ;; returns nil, why? (mew-smtp-send-message case qfld msgs t) (mew-info-clean-up pnm)) (message "Cannot connect to the SMTP server")))) (mew-info-clean-up pnm mew-smtp-info-list-clean-length) (mew-smtp-set-case pnm case) (mew-smtp-set-qfld pnm qfld) (mew-smtp-set-messages pnm msgs) (mew-smtp-set-server pnm server) (mew-smtp-set-port pnm port) (mew-smtp-set-process pnm process) (mew-smtp-set-ssh-server pnm sshsrv) (mew-smtp-set-ssh-process pnm sshpro) (mew-smtp-set-ssl-process pnm sslpro) (mew-smtp-set-helo-domain pnm (mew-smtp-helo-domain case)) (mew-smtp-set-user pnm user) (mew-smtp-set-auth-user pnm (mew-smtp-user case)) (mew-smtp-set-auth-list pnm (mew-smtp-auth-list case)) (mew-smtp-set-status pnm "greeting") (mew-smtp-set-fallback pnm fallback) ;; (set-process-buffer process nil) (set-process-sentinel process 'mew-smtp-sentinel) (set-process-filter process 'mew-smtp-filter) (message "Sending in background...")))) (defun mew-smtp-flush-queue (case &optional qfld) (let (msgs) (unless qfld (setq qfld (mew-queue-folder case))) (if (mew-smtp-get-server (mew-smtp-info-name case)) ;; lock (message "%s is locked" qfld) (setq msgs (mew-folder-messages qfld)) (when msgs (mew-summary-folder-cache-clean qfld) (run-hooks 'mew-smtp-flush-hook) (message "Flushing %s..." qfld) (mew-smtp-send-message case qfld msgs))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filter and sentinel ;;; (defun mew-smtp-debug (label string) (when (mew-debug 'net) (with-current-buffer (get-buffer-create mew-buffer-debug) (goto-char (point-max)) (insert (format "\n<%s>\n%s\n" label string))))) (defun mew-smtp-filter (process string) (let* ((pnm (process-name process)) (status (mew-smtp-get-status pnm)) (str (concat (mew-smtp-get-string pnm) string)) (buf (process-buffer process)) next func code) (save-excursion (mew-smtp-debug (upcase status) string) (if (and buf (get-buffer buf)) (set-buffer buf)) ;; SMTP server's strings should be short enough. (mew-smtp-set-string pnm str) (cond ((and (string-match "\n$" str) (string-match "^\\([1-5][0-7][0-9]\\) " str)) (setq code (match-string 1 str)) (setq next (mew-smtp-fsm-next status code)) (cond (next (mew-smtp-set-status pnm next) (setq func (intern-soft (concat "mew-smtp-command-" next))) (and func (funcall func process pnm)) (mew-smtp-set-string pnm nil)) (t (if (string-match "^pwd-" status) (mew-smtp-set-error pnm "SMTP password is wrong!") (if (string-match "\n$" str) (setq str (substring str 0 -1))) (unless (string-match "[.!]$" str) (setq str (concat str ".")))) (mew-smtp-set-error pnm str) (mew-smtp-command-quit2 process pnm)))) (t ()))))) ;; stay (defun mew-smtp-sentinel (process event) (let* ((pnm (process-name process)) (pro (mew-smtp-get-process pnm)) (case (mew-smtp-get-case pnm)) (qfld (mew-smtp-get-qfld pnm)) (msgs (mew-smtp-get-messages pnm)) (fallback (mew-smtp-get-fallback pnm)) (status (mew-smtp-get-status pnm))) (save-excursion (mew-smtp-debug "SMTP SENTINEL" event) (cond ((or (string-match "failed" event) (and (string= status "greeting") (string-match "connection broken by remote peer" event))) (if fallback (progn (mew-smtp-send-message case qfld msgs fallback) ;; A failed process stays (when (memq (process-status pro) '(failed connect)) (delete-process pro) (mew-info-clean-up pnm))) (mew-smtp-set-error pnm (substring event 0 -1)) (mew-smtp-sentinel2 process event))) ((string-match "open" event) ;; OK connected ) (t (mew-smtp-sentinel2 process event)))))) (defun mew-smtp-sentinel2 (process event) (let* ((pnm (process-name process)) (buf (process-buffer process)) (qfld (mew-smtp-get-qfld pnm)) (case (mew-smtp-get-case pnm)) (done (mew-smtp-get-done pnm)) (imapp (mew-smtp-get-imapp pnm)) (error (mew-smtp-get-error pnm)) (sshpro (mew-smtp-get-ssh-process pnm)) (sslpro (mew-smtp-get-ssl-process pnm))) (save-excursion (cond (error (when buf ;; A message file is not inserted at the beginning of the SMTP ;; session. (set-buffer buf) (mew-smtp-queue case error pnm)) (mew-smtp-log pnm error) (message-box (format "%s This mail has been queued to %s" error qfld))) (done (message "Sending in background...done")) (t (if (null buf) (message "SMTP connection is lost") (set-buffer buf) (mew-smtp-queue case "SMTP connection is lost" pnm)))) (mew-info-clean-up pnm) (if (and (processp sshpro) (not mew-ssh-keep-connection)) (process-send-string sshpro "exit\n")) (if (and (processp sslpro) (not mew-ssl-keep-connection)) (delete-process sslpro)) (run-hooks 'mew-smtp-sentinel-hook) (if (and done imapp) (mew-imap2-fcc case)) (when buf (mew-remove-buffer buf))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Queuing ;;; (defun mew-smtp-queue (case err &optional apnm) ;; Must be in a buffer where a message is contained. (let* ((pnm (or apnm (mew-smtp-info-name case))) (qfld (mew-queue-folder case)) (oname (buffer-name)) (work (buffer-file-name)) file-info file info nname) (mew-local-folder-check qfld) (setq file-info (mew-queue-enqueue work qfld)) (mew-set '(file info) file-info) (setq file (file-name-nondirectory file)) (setq nname (mew-concat-folder qfld file)) (if (mew-draft-p) (mew-smtp-set-case pnm (mew-tinfo-get-case))) ;; (mew-smtp-set-recipients pnm (mew-smtp-get-orig-recipients pnm)) (let* ((n mew-smtp-info-list-save-length) (data (make-vector n nil))) (dotimes (i n) (aset data i (aref (mew-info pnm) i))) (mew-lisp-save info data)) ;; (message "%s has been queued to %s (%s)" oname nname err) (mew-touch-folder qfld) (file-name-sans-extension file))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Bcc: ;;; (defun mew-smtp-bcc (pro pnm back) (let* ((dir (file-name-directory back)) (msg (file-name-nondirectory back)) (case (mew-smtp-get-case pnm)) msgid logtime) (mew-elet (mew-erase-buffer) (mew-set-buffer-multibyte t) (mew-smtp-set-recipients pnm (mew-smtp-get-bcc pnm)) (mew-smtp-set-orig-recipients pnm (mew-smtp-get-bcc pnm)) (mew-smtp-set-bcc pnm nil) ;; (mew-set '(msgid logtime) (mew-encode-id-date pnm (mew-smtp-message-id case))) ;; save-excursion (mew-smtp-set-msgid pnm msgid) (mew-smtp-set-logtime pnm logtime) (goto-char (point-max)) (mew-draft-header-insert mew-to: "Bcc-Receiver:;") (mew-draft-header-insert mew-subj: mew-bcc-subject) (mew-draft-header-insert mew-from: (mew-smtp-get-from pnm)) (mew-draft-header-insert mew-organization: (mew-organization case)) (mew-draft-header-insert-alist (mew-header-alist case)) ;; X-Mailer: must be the last (if (mew-use-x-mailer case) (mew-draft-header-insert mew-x-mailer: mew-x-mailer)) (mew-header-set "\n") (insert mew-bcc-body) (goto-char (mew-header-end)) (forward-line) (setq mew-encode-syntax (mew-encode-syntax-initial dir)) (setq mew-encode-syntax (mew-syntax-insert-entry mew-encode-syntax '(2) (mew-encode-syntax-single msg mew-type-msg nil nil nil))) (mew-encode-multipart mew-encode-syntax dir 0 'buffered) (mew-encode-make-header) (mew-encode-save-draft) (mew-overlay-delete-buffer) (mew-set-buffer-multibyte nil) (mew-info-clean-up pnm mew-smtp-info-list-clean-length) (set-process-buffer pro (current-buffer)) (mew-smtp-set-status pnm "mail-from") (mew-smtp-command-mail-from pro pnm)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Logging ;;; (defun mew-smtp-log (pnm &optional err) (let ((logtime (mew-smtp-get-logtime pnm)) (msgid (mew-smtp-get-msgid pnm)) (recipients (mew-smtp-get-orig-recipients pnm)) (server (mew-smtp-get-server pnm)) (port (mew-smtp-get-port pnm)) (sshsrv (mew-smtp-get-ssh-server pnm)) (sslp (mew-smtp-get-ssl-process pnm))) (with-temp-buffer (and logtime (insert logtime)) (and msgid (insert " id=" msgid)) (and server (insert " server=" server ":" port)) (and sshsrv (insert " sshsrv=" sshsrv)) (and sslp (insert " SSL/TLS")) (and recipients (setq recipients (mapconcat 'identity recipients ","))) (and recipients (insert " recipients=" recipients)) (if err (insert " status=" "(" (substring err 0 (string-match "\n+$" err)) ")") (insert " status=sent")) (insert "\n") (write-region (point-min) (point-max) (expand-file-name mew-smtp-log-file mew-conf-path) 'append 'no-msg)))) (provide 'mew-smtp) ;;; Copyright Notice: ;; Copyright (C) 1999-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-smtp.el ends here kazu-yamamoto-Mew-ff9c41b/mew-sort.el000066400000000000000000000403301256455547000176520ustar00rootroot00000000000000;;; mew-sort.el --- Sorting messages for Mew ;; Author: Takashi P.KATOH ;; Kazu Yamamoto ;; Created: Feb 6, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sort variety ;;; (defvar mew-sort-switch '(("text" mew-sort-key-text mew-sort-string) ("ml" mew-sort-key-ml mew-sort-string) ("mlnum" mew-sort-key-mlnum mew-sort-string) ("date" mew-sort-key-date mew-sort-string) ("num" mew-sort-key-num mew-sort-number) ("postnum" mew-sort-key-postnum mew-sort-number))) (defun mew-sort-key-text (key folder msg) (mew-subject-simplify key nil 'no-replace)) (defun mew-sort-key-ml (key folder msg) (mew-subject-simplify2 key)) (defun mew-sort-key-mlnum (key folder msg) (let (mlname mlnum) (cond ((string-match "^\\([[(][^])]+\\)[: ]+\\([0-9]+\\)[])]" key) (setq mlname (match-string 1 key)) (setq mlnum (match-string 2 key))) ((string-match "^[0-9]+$" key) (setq mlname "") (setq mlnum (match-string 0 key))) (t (setq mlname "") (setq mlnum "0"))) (concat mlname (format "\000%010d" (string-to-number mlnum))))) (defun mew-sort-key-date (key folder msg) (if (string= key "") (let ((time (mew-file-get-time (mew-expand-msg folder msg)))) (mew-time-ctz-to-sortkey time)) (mew-time-rfc-to-sortkey key))) (defun mew-sort-key-num (key folder msg) (string-to-number key)) (defun mew-sort-key-postnum (key folder msg) (if (string-match "[0-9]+$" key) (string-to-number (match-string 0 key)) (string-to-number key))) (defun mew-sort-key (x) (cdr x)) (defun mew-sort-string (x y) (or (string= (mew-sort-key x) (mew-sort-key y)) (string< (mew-sort-key x) (mew-sort-key y)))) (defun mew-sort-number (x y) (<= (mew-sort-key x) (mew-sort-key y))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; ;;; (defvar mew-sort-line nil) (defun mew-sort-index (x) (car x)) (defun mew-sort-insert (line msg) (insert line) (when msg (save-excursion (forward-line -1) (mew-syntax-change-message-number msg)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Moving messages ;;; (defun mew-summary-sort-move-rename (src dst pos &optional lastp) (rename-file (mew-msg-get-filename src) (mew-msg-new-filename dst)) (mew-refile-change src dst) (mew-summary-sort-move src dst pos lastp)) (defun mew-summary-sort-move-for-selection (src dst pos &optional lastp) (mew-summary-sort-move src nil pos lastp)) ;; If not found, returns nil. (defun mew-summary-sort-move (src dst pos &optional lastp) (mew-elet (let (beg end line) (cond (lastp (when pos (goto-char pos) (mew-sort-insert mew-sort-line dst) nil)) ((null pos) ;; first (when (mew-summary-search-msg src) (setq beg (point)) (forward-line) (setq end (point)) ;; We need to keep properties in Summary mode. ;; This must be "buffer-substring". (setq mew-sort-line (buffer-substring beg end)) (delete-region beg end) beg)) (t (when (mew-summary-search-msg src) (setq beg (point)) (forward-line) (setq end (point)) (cond ((< pos beg) ;; We need to keep properties in Summary mode. ;; This must be "buffer-substring". (setq line (buffer-substring beg end)) (goto-char end) (delete-region beg end) (save-excursion (goto-char pos) (mew-sort-insert line dst)) (point)) ((= pos beg) ;; We need to keep properties in Summary mode. ;; This must be "buffer-substring". (setq line (buffer-substring beg end)) (delete-region beg end) (goto-char pos) (mew-sort-insert line dst) (point)) (t ;; We need to keep properties in Summary mode. ;; This must be "buffer-substring". (setq line (buffer-substring beg end)) (goto-char pos) (mew-sort-insert line dst) (delete-region beg end) beg)))))))) (defun mew-summary-sort-move-for-debug (src dst pos &optional lastp) (mew-elet (insert (format "move %s to %s\n" src dst)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; ;;; (defun mew-sort-get-range (arg) (let (region beg end range rbeg rend) (if arg (progn (setq region (mew-summary-get-region)) (setq beg (car region)) (setq end (cdr region)) (if (= beg end) (error "No region"))) (setq beg (point-min)) (setq end (point-max))) (save-excursion (goto-char beg) (setq rbeg (mew-summary-message-number)) (goto-char end) (forward-line -1) (setq rend (mew-summary-message-number)) (forward-line) (if (and rbeg rend) (setq range (concat rbeg "-" rend)) (error "No region"))) (list range beg end))) (defun mew-sort-ask-key (folder) (let* ((sort-key (or (mew-alist-get-value (assoc folder mew-sort-default-key-alist)) mew-sort-default-key)) key type funcs newkey) (mew-set '(key type) (mew-input-sort-key sort-key)) (setq funcs (assoc type mew-sort-switch)) (setq newkey (concat (capitalize key) ":")) (cons newkey (cdr funcs)))) (defun mew-sort-get-file-index (folder range key func1 func2) (let* ((i 0) (fld (mew-expand-folder2 folder)) num med value ent files idx) (with-temp-buffer (apply 'call-process mew-prog-mewl nil t nil (append (list "-b" mew-mail-path "-l" "0" "-x" mew-suffix "-d" key) (mew-scan-mewl-src fld range))) (goto-char (point-min)) (while (not (eobp)) (if (not (looking-at "^\\([0-9]+\\)[ \t]*:[ \t]*")) (forward-line) (setq num (mew-match-string 1)) (setq med (match-end 0)) (forward-line) (mew-header-goto-next) (mew-header-decode-region key med (point)) (setq value (mew-buffer-substring med (1- (point)))) (setq files (cons num files)) (setq ent (cons (cons i (funcall func1 value folder num)) ent)) (setq i (1+ i))))) (setq files (vconcat (nreverse files))) (setq ent (sort ent func2)) (setq idx (vconcat (mapcar 'mew-sort-index ent))) (list files idx))) (defun mew-sort-files (folder files idx func) ;; ;; sorted sorted ;; files idx -> files ;; 0 10 1 (was 20) ;; 1 20 2 (was 30) ;; 2 30 0 (was 10) ;; 31(new) ;; ;; ;; src dst ;; 10 0 (*a) 31 (*b) ;; 20 1 idx[0] 10 0 ;; 30 2 idx[1] 20 1 ;; 31 0 idx[2] 30 2 ;; (*c) ;; *a: initial src is 0 ;; *b: initial files[dst] is 31 (new tmp file) ;; *c: break condition, src is looped! ;; files[src] is 31 (new tmp file) ;; (let* ((dir (mew-expand-folder folder)) (default-directory dir) (len (length idx)) ;; not (length files) (tmp (mew-folder-new-message folder 'num-only)) src dst pos) (dotimes (i len) (setq mew-sort-line nil) (unless (= i (aref idx i)) (setq dst len) (setq src i) (setq pos (funcall func (aref files src) tmp nil)) (catch 'loop (while t (setq dst src) (setq src (aref idx dst)) (if (= src i) (throw 'loop nil)) (setq pos (funcall func (aref files src) (aref files dst) pos)) (aset idx dst dst))) (funcall func tmp (aref files dst) pos 'last) (aset idx dst dst))))) (defun mew-sort-push-mark () (unless (eobp) (beginning-of-line) (mew-elet (put-text-property (point) (1+ (point)) 'mew-sort-orig t)))) (defun mew-sort-pop-mark () (let ((orig (next-single-property-change (point-min) 'mew-sort-orig))) ;; 'mew-sort-orig may start with bob. (if (null orig) (mew-push-mark) (save-excursion (goto-char orig) (beginning-of-line) (setq orig (point))) (mew-elet ;; 'mew-sort-orig is copied onto the entire message ;; number. (window-width) is long enough to remove ;; it. (remove-text-properties orig (+ orig (window-width)) '(mew-sort-orig nil))) (mew-push-mark)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sort bodies ;;; (defun mew-summary-sort-body (folder arg) (let (key idx files range beg end func1 func2 diag) ;; Summary cache updates (mew-summary-reset) (mew-summary-retrieve-gap folder) ;; (mew-set '(range beg end) (mew-sort-get-range arg)) (mew-set '(key func1 func2) (mew-sort-ask-key folder)) (setq diag (if arg folder (format "%s: %s" folder range))) ;; (message "Sorting %s..." diag) (mew-summary-lock t "Sorting") (unwind-protect (progn (mew-set '(files idx) (mew-sort-get-file-index folder range key func1 func2)) ;; (mew-sort-push-mark) (if arg (narrow-to-region beg end)) ;; (mew-sort-files folder files idx 'mew-summary-sort-move-rename) ;; (goto-char (point-min)) (if arg (widen)) (mew-sort-pop-mark) ;; (run-hooks 'mew-sort-hook) (message "Sorting %s...done. Type '%s' to update ID database" diag (mew-substitute-for-summary "\\[mew-summary-make-id-index-folder]"))) (mew-summary-folder-cache-save) (set-buffer-modified-p nil) (mew-summary-unlock)))) (defun mew-summary-sort-body-for-debug (folder arg) (let ((win (selected-window)) key idx files range func1 func2 diag) (mew-set '(range beg end) (mew-sort-get-range arg)) (mew-set '(key func1 func2) (mew-sort-ask-key folder)) (setq diag (if arg folder (format "%s: %s" folder range))) ;; (message "Sorting %s..." diag) (mew-summary-lock t "Sorting") (unwind-protect (mew-set '(files idx) (mew-sort-get-file-index folder range key func1 func2)) (mew-summary-unlock)) (when (and files idx) (mew-window-configure 'message) ;; message buffer (mew-elet (mew-erase-buffer) (insert "Sort as follows:\n")) ;; (unwind-protect (progn (mew-sort-files folder files idx 'mew-summary-sort-move-for-debug) (message "Sorting %s...done" diag)) (mew-message-clear-end-of) (set-buffer-modified-p nil) (goto-char (point-min)) (select-window win))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sort command ;;; (defun mew-summary-sort (&optional arg) "Sort messages and list them up again. If called with '\\[universal-argument]', sort the region. After sorting, the cursor moves onto the beginning of the buffer or the region. " (interactive "P") (mew-summary-only (mew-summary-local-only (mew-summary-not-in-queue (mew-summary-not-in-draft (mew-summary-with-mewl (when (mew-summary-exclusive-p) (let ((folder (mew-summary-folder-name))) (if (null folder) (message "No message") (if (mew-mark-active-p) (setq arg t)) (if (mew-debug 'sort) (mew-summary-sort-body-for-debug folder arg) (mew-summary-sort-body folder arg))))))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sort for selection ;;; (defun mew-summary-selection-by-sort-body (arg) (let* ((buf (current-buffer)) (ofolder (mew-summary-folder-name 'ext)) (vfolder (mew-folder-to-selection ofolder)) (pfolder (mew-summary-physical-folder)) key idx files range beg end func1 func2 diag) (mew-set '(range beg end) (mew-sort-get-range arg)) (mew-set '(key func1 func2) (mew-sort-ask-key ofolder)) (setq diag (if arg ofolder (format "%s: %s" ofolder range))) ;; (message "Sorting %s..." diag) (mew-summary-lock t "Sorting") (unwind-protect (mew-set '(files idx) (mew-sort-get-file-index ofolder range key func1 func2)) (mew-summary-unlock)) (when (and files idx) (mew-summary-switch-to-folder vfolder) (mew-vinfo-set-mode 'selection) (mew-vinfo-set-physical-folder pfolder) (mew-vinfo-set-original-folder ofolder) (unwind-protect (progn (mew-erase-buffer) (mew-elet (insert (with-current-buffer buf (buffer-substring beg end))) (mew-sort-files ofolder files idx 'mew-summary-sort-move-for-selection) (mew-summary-set-count-line) (goto-char (point-min)) (message "Sorting %s...done" diag))) (set-buffer-modified-p nil))))) (defun mew-summary-selection-by-sort (&optional arg) (interactive "P") (mew-summary-only (mew-summary-not-in-queue (mew-summary-not-in-draft (mew-summary-with-mewl (when (mew-summary-exclusive-p) (if (mew-mark-active-p) (setq arg t)) (mew-summary-selection-by-sort-body arg))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Packing ;;; (defun mew-summary-pack-rename (src dst) (mew-elet (rename-file (mew-msg-get-filename src) (mew-msg-new-filename dst)) (mew-refile-change src dst) (when (re-search-forward (mew-regex-sumsyn-msg src) nil t) (mew-syntax-change-message-number2 dst) (forward-line)))) (defun mew-summary-pack (&optional force) "Pack messages and list them up again. After packing, the cursor stays in the current message. If this command is used in a remote folder, local cache messages are packed." (interactive "P") (if (not force) (message (mew-substitute-for-summary "Pack breaks search index, so pack was obsoleted. Type '\\[universal-argument]\\[mew-summary-pack]' to force pack.")) (mew-summary-only (mew-summary-local-only (mew-summary-not-in-queue (mew-summary-not-in-draft (when (mew-summary-exclusive-p) (let ((folder (mew-summary-folder-name))) (cond ((null folder) (message "No message")) ((or (not mew-ask-pack) (y-or-n-p (format "Pack %s? " folder))) (mew-summary-pack-body folder))))))))))) (defun mew-summary-pack-body (folder) (let* ((dir (mew-expand-folder folder)) (default-directory dir) (n 1) msgs src dst) ;; (mew-summary-reset) (mew-summary-retrieve-gap folder) ;; (message "Packing %s..." folder) (mew-summary-lock t "Packing") (condition-case nil (progn (setq msgs (mew-dir-messages ".")) (setq msgs (mapcar 'string-to-number msgs)) (setq msgs (sort msgs '<)) ;; sort is inevitable ;; the cursor stays the current position. (save-excursion (goto-char (point-min)) (dolist (msg msgs) (setq src (number-to-string msg)) (cond ((= msg n);; including src is a directory (setq n (1+ n))) ((file-directory-p src) ) (t (setq dst (number-to-string n)) (while (file-exists-p dst) (setq n (1+ n)) (setq dst (number-to-string n))) (mew-summary-pack-rename src dst) (setq n (1+ n)))))) (mew-summary-folder-cache-save) (set-buffer-modified-p nil) (mew-summary-unlock) (run-hooks 'mew-pack-hook) (message "Packing %s...done (the last is %d). Type '%s' to update ID database" folder (1- n) (mew-substitute-for-summary "\\[mew-summary-make-id-index-folder]"))) (quit (set-buffer-modified-p nil) (mew-summary-unlock))))) (provide 'mew-sort) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-sort.el ends here kazu-yamamoto-Mew-ff9c41b/mew-ssh.el000066400000000000000000000213351256455547000174640ustar00rootroot00000000000000;;; mew-ssh.el ;; Author: Kazu Yamamoto ;; Created: Dec 14, 1999 ;;; Code: (require 'mew) (defvar mew-ssh-prog-ver nil) ;; 0-SSH1, 1-SSH2, 2-OpenSSH, 3-PuTTY (defun mew-ssh-get (case list-or-vec) (elt list-or-vec (mew-ssh-prog-ver case))) (defconst mew-ssh-msg-passwd '("password:\\|Enter passphrase" "password:\\|Passphrase for\\|Enter passphrase" "password:\\|Enter passphrase" "Password:\\|Passphrase for key")) (defconst mew-ssh-msg-connected '("Entering interactive session" "Authentication successful\\|client_authenticated" "Entering interactive session" "Access granted")) (defconst mew-ssh-msg-denied '("Permission denied\\." "Permission denied\\." "Permission denied\\." "Permission denied\\.")) ;XXX (defconst mew-ssh-msg-refused '("Secure connection .* refused\\." "FATAL: Connecting .* failed:" "Secure connection .* refused\\." "Secure connection .* refused\\.")) ;XXX (defconst mew-ssh-process-exec-cnt 3) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; SSH info ;;; (defvar mew-ssh-info-list '("case" "status" "try" "account")) (mew-info-defun "mew-ssh-" mew-ssh-info-list) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Process name ;;; (defconst mew-ssh-info-prefix "mew-ssh-info-") (defun mew-ssh-info-name (sshserver server remoteport localport) (format "%s:%s:%s:%d:%d" mew-ssh-info-prefix sshserver server remoteport localport)) (defun mew-ssh-info-name-regex (sshserver server remoteport) (format "^%s:%s:%s:%d" mew-ssh-info-prefix sshserver server remoteport)) (defun mew-ssh-pnm-to-lport (pnm) (if (string-match ":\\([0-9]+\\)$" pnm) (match-string 1 pnm))) ;; user@host:port should be used here. ;; However, SSH does not symbolic port name "ssh" for the "-p" option ;; while OpenSSH does. Sigh... (defun mew-ssh-passtag (name) (if (string-match (format "^%s:[^:]+:" mew-ssh-info-prefix) name) (match-string 0 name))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Executing SSH ;;; (defun mew-open-ssh-stream (case server serv sshserver) "Open SSH stream for SERVER's SERV via SSHSERVER. This function returns a process when an SSH connection is created successfully. A local port number can be obtained the process name after ':'." (let* ((ssh (mew-ssh-prog case)) (args (mew-ssh-prog-args case)) (remoteport (mew-serv-to-port serv)) (localport (+ 8000 (% (mew-random) 4000))) (process-connection-type mew-connection-type2) (N mew-ssh-process-exec-cnt) (pros (process-list)) (regex (mew-ssh-info-name-regex sshserver server remoteport)) name pnm pro status) (cond ((not (mew-which-exec ssh)) (message "'%s' is not found" ssh)) (t (catch 'find (dolist (pr pros) (when (string-match regex (process-name pr)) (if (memq (process-status pr) '(run)) (setq pro pr) (delete-process pr)) (throw 'find nil)))) (if pro pro (message "Connecting to the SSH server...") (setq pro nil) (catch 'loop (dotimes (i N) (setq name (mew-ssh-info-name sshserver server remoteport localport)) (setq pro (apply 'start-process name nil ssh "-x" "-v" "-L" (format "%d:%s:%d" localport server remoteport) (append args (list sshserver)))) ;; An error would occur. So, let's exit in the case. (mew-timing) (cond ((not (processp pro)) (message "Connecting to the SSH server...FAILED") (throw 'loop nil)) ((not (memq (process-status pro) '(run))) (delete-process pro) (message "Connecting to the SSH server...FAILED") (throw 'loop nil))) ;; ssh is now running. (mew-process-silent-exit pro) (setq pnm (process-name pro)) (mew-info-clean-up pnm) (mew-ssh-set-try pnm 0) (mew-ssh-set-case pnm case) (mew-ssh-set-account pnm (format "%s" sshserver)) (mew-set-process-cs pro mew-cs-text-for-read mew-cs-text-for-write) (set-process-filter pro 'mew-ssh-filter) (set-process-sentinel pro 'mew-ssh-sentinel) (mew-rendezvous (null (mew-ssh-get-status pnm))) (setq status (mew-ssh-get-status pnm)) (cond ((eq status t) (throw 'loop pro)) ;; return value ((not (eq status 'bound)) (message "Connecting to the SSH server...FAILED") (throw 'loop nil))) ;; return value ;; 'bound (setq localport (1+ localport)) (message "Connecting to the SSH server...FAILED") nil))))))) ;; return value ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filter and sentinel ;;; (defun mew-ssh-debug (label string) (when (mew-debug 'net) (with-current-buffer (get-buffer-create mew-buffer-debug) (goto-char (point-max)) (insert (format "\n<%s>\n%s\n" label string))))) (defun mew-ssh-filter (process string) (save-excursion (mew-ssh-debug "SSH: " string) (let* ((pnm (process-name process)) (case (mew-ssh-get-case pnm)) pass) (cond ((string-match (mew-ssh-get case mew-ssh-msg-passwd) string) (if (= (mew-ssh-get-try pnm) 0) (setq pass (mew-input-passwd (format "SSH password (%s): " (mew-ssh-get-account pnm)) (mew-ssh-passtag pnm))) (mew-passwd-set-passwd (mew-ssh-passtag pnm) nil) (setq pass (mew-input-passwd (format "SSH password again (%s): " (mew-ssh-get-account pnm)) (mew-ssh-passtag pnm)))) (mew-ssh-set-try pnm (1+ (mew-ssh-get-try pnm))) (if (and (processp process) (memq (process-status process) '(run))) (progn (message "Sending password to the SSH server...") (process-send-string process (concat pass "\n"))) (mew-passwd-set-passwd (mew-ssh-passtag pnm) nil) (message "Cannot find SSH process"))) ((or (string-match (mew-ssh-get case mew-ssh-msg-denied) string) (string-match (mew-ssh-get case mew-ssh-msg-refused) string)) (message "Cannot connect to the SSH server") (mew-passwd-set-passwd (mew-ssh-passtag pnm) nil) (mew-ssh-set-status pnm 'denied)) ((string-match (mew-ssh-get case mew-ssh-msg-connected) string) (mew-ssh-set-status pnm t) (message "Connecting to the SSH server...done")) ((string-match "Local: bind: Address already in use" string) (mew-ssh-set-status pnm 'bound) (message "Connecting to the SSH server...done")))))) (defun mew-ssh-sentinel (process event) (let ((pnm (process-name process))) (save-excursion (unless (mew-ssh-get-status pnm) (mew-ssh-set-status pnm 'exit))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; SSH version check ;;; (defun mew-ssh-setup () (let ((ssh (mew-ssh-prog))) (if (not (mew-which-exec ssh)) (setq mew-ssh-prog-ver nil) (with-temp-buffer (call-process ssh nil t nil "-V") (goto-char (point-min)) (cond ((looking-at "SSH Version 1") (setq mew-ssh-prog-ver 0)) ((looking-at (concat ssh ": SSH Version 2")) (setq mew-ssh-prog-ver 1)) ((looking-at (concat ssh ": SSH Secure Shell [23]")) (setq mew-ssh-prog-ver 1)) ((looking-at "\\(SSH Version \\)?\\(OpenSSH\\|NetBSD\\|Sun_SSH\\)") (setq mew-ssh-prog-ver 2)) ((looking-at "plink:") (setq mew-ssh-prog-ver 3)) (t (setq mew-ssh-prog-ver nil))))))) (provide 'mew-ssh) ;;; Copyright Notice: ;; Copyright (C) 1999-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-ssh.el ends here kazu-yamamoto-Mew-ff9c41b/mew-ssl.el000066400000000000000000000256031256455547000174720ustar00rootroot00000000000000;;; mew-ssl.el ;; Author: Kazu Yamamoto ;; Created: Jul 25, 2002 ;;; Code: (require 'mew) (defvar mew-prog-ssl "stunnel") (defvar mew-ssl-cert-directory "~/.certs" "The directory where certificates of root servers are stored. A file name of a certificate should be 'cert-hash.0'. 'cert-hash' can be extracted by 'openssl x509 -hash -noout -in cert.pem'.") (defvar mew-ssl-verify-level 1 "Verification level of server's certificate. 0 - no verification. 1 - verify server's certificate if present. If verification failed, an SSL/TLS connection is not created. If not present, an SSL/TLS connection is created. 2 - verify server's certificate. If verification failed, an SSL/TLS connection is not created. If not present, an SSL/TLS connection is not created. 3 - verify server's certificate which locally installed (not one from the server).") (defvar mew-prog-ssl-arg nil "For stunnel v3, a list of command-line arguments, each one a string. For stunnel v4 or v5, a string of extra text to place in the configuration file, which should end with a newline (example: \"fips=no\\n\"); or nil to insert no extra text.") (defvar mew-ssl-ver nil) (defvar mew-ssl-minor-ver nil) (defvar mew-ssl-libwrap nil) (defconst mew-ssl-process-exec-cnt 3) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Magic words ;;; (defconst mew-tls-smtp "smtp") (defconst mew-tls-pop "pop3") (defconst mew-tls-nntp "nntp") (defconst mew-tls-imap "imap") ;; xxx stunnel does not support this. ;; stunnel does not support IPv6, sigh (defconst mew-ssl-localhost "127.0.0.1") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; SSL/TLS info ;;; (defvar mew-ssl-info-list '("status" "try" "file" "string")) (mew-info-defun "mew-ssl-" mew-ssl-info-list) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Process name ;;; (defconst mew-ssl-info-prefix "mew-ssl-info-") (defun mew-ssl-info-name (server remoteport localport) (format "%s:%s:%d:%d" mew-ssl-info-prefix server remoteport localport)) (defun mew-ssl-info-name-regex (server remoteport) (format "^%s:%s:%d" mew-ssl-info-prefix server remoteport)) (defun mew-ssl-pnm-to-lport (pnm) (if (string-match ":\\([0-9]+\\)$" pnm) (match-string 1 pnm))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Executing SSL/TLS ;;; (defun mew-ssl-server (server) (if (string= server "localhost") mew-ssl-localhost server)) (defun mew-ssl-options (case server remoteport localport tls) (setq server (mew-ssl-server server)) (if (= mew-ssl-ver 3) (let (args) (setq args `("-c" "-f" "-a" ,(expand-file-name (mew-ssl-cert-directory case)) "-d" ,(format "%s:%d" mew-ssl-localhost localport) "-v" ,(number-to-string (mew-ssl-verify-level case)) "-D" "debug" "-P" "" "-r" ,(format "%s:%d" server remoteport) ,@mew-prog-ssl-arg)) (if tls (setq args (cons "-n" (cons tls args)))) args) (let ((file (mew-make-temp-name))) (with-temp-buffer (insert "client=yes\n") (insert "pid=\n") (insert (format "verify=%d\n" (mew-ssl-verify-level case))) (insert "foreground=yes\n") (insert "debug=debug\n") (if (and mew-ssl-libwrap (or (>= mew-ssl-ver 5) (>= mew-ssl-minor-ver 45))) (insert "libwrap=no\n")) (if (or (>= mew-ssl-ver 5) (>= mew-ssl-minor-ver 22)) (insert "syslog=no\n")) (insert "CApath=" (expand-file-name (mew-ssl-cert-directory case)) "\n") (if mew-prog-ssl-arg (insert mew-prog-ssl-arg)) (insert (format "[%d]\n" localport)) (insert (format "accept=%s:%d\n" mew-ssl-localhost localport)) (insert (format "connect=%s:%d\n" server remoteport)) (if tls (insert (format "protocol=%s\nsslVersion=TLSv1\n" tls))) (mew-frwlet mew-cs-dummy mew-cs-text-for-write ;; NEVER use call-process-region for privacy reasons (write-region (point-min) (point-max) file nil 'no-msg)) (list file))))) (defun mew-open-ssl-stream (case server serv tls) "Open an SSL/TLS stream for SERVER's SERV. This function returns a process when an SSL/TLS connection is created successfully. If TLS is nil, an SSL connection is created. If TLS is a magic word for 'stunnel', a TLS connection is created. A local port number can be obtained the process name after ':'. " (cond ((or (null mew-ssl-ver) (not (mew-which-exec mew-prog-ssl))) (message "'%s' is not found" mew-prog-ssl) nil) (t (let* ((remoteport (mew-serv-to-port serv)) (localport (+ 8000 (% (mew-random) 4000))) (process-connection-type mew-connection-type2) (N mew-ssl-process-exec-cnt) (pros (process-list)) (regex (mew-ssl-info-name-regex server remoteport)) name pnm pro dummy bound opts) (catch 'find (dolist (pr pros) (when (string-match regex (process-name pr)) (if (memq (process-status pr) '(run)) (setq pro pr) (delete-process pr)) (throw 'find nil)))) (if pro pro (message "Creating an SSL/TLS connection...") (setq pro nil) (catch 'loop (dotimes (i N) (setq name (mew-ssl-info-name server remoteport localport)) (setq opts (mew-ssl-options case server remoteport localport tls)) (setq pro (apply 'start-process name nil mew-prog-ssl opts)) ;; An error would occur. So, let's exit in the case. (cond ((not (processp pro)) (message "Creating an SSL/TLS connection...FAILED") (throw 'loop nil)) ((not (memq (process-status pro) '(run))) (delete-process pro) (message "Creating an SSL/TLS connection...FAILED") (throw 'loop nil))) ;; stunnel is now running. (mew-process-silent-exit pro) (setq pnm (process-name pro)) (mew-info-clean-up pnm) (mew-ssl-set-try pnm 0) (if (>= mew-ssl-ver 4) (mew-ssl-set-file pnm (car opts))) (mew-set-process-cs pro mew-cs-text-for-read mew-cs-text-for-write) (set-process-filter pro 'mew-ssl-filter1) (set-process-sentinel pro 'mew-ssl-sentinel) (mew-rendezvous (null (mew-ssl-get-status pnm))) (if (eq (mew-ssl-get-status pnm) t) (throw 'loop (setq bound t))) ;; bind-failure (setq localport (1+ localport)))) (mew-ssl-set-status pnm nil) (if (not bound) (progn (message "Creating an SSL/TLS connection...FAILED") nil) ;; "stunnel" does not gain access to the remote port ;; until a tunneled connection is created. ;; So, we need to check the SSL/TLS tunnel with a dummy ;; tunneled connection here. (set-process-filter pro 'mew-ssl-filter2) (setq dummy (open-network-stream " *Mew dummy*" nil mew-ssl-localhost localport)) (mew-rendezvous (null (mew-ssl-get-status pnm))) (if (processp dummy) (delete-process dummy)) (if (eq (mew-ssl-get-status pnm) t) (progn (message "Creating an SSL/TLS connection...done") (set-process-filter pro 'mew-ssl-filter3) pro) ;; verify-failure (delete-process pro) (message "Creating an SSL/TLS connection...FAILED (cert verify failure)") nil))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Filter and sentinel ;;; (defun mew-ssl-debug (label string) (when (mew-debug 'net) (with-current-buffer (get-buffer-create mew-buffer-debug) (goto-char (point-max)) (insert (format "\n<%s>\n%s\n" label string))))) (defun mew-ssl-filter1 (process string) (let* ((pnm (process-name process)) (prev-str (mew-ssl-get-string pnm))) (save-excursion (mew-ssl-debug "SSL/TLS: " string) (mew-ssl-set-string pnm string) (setq string (concat prev-str string)) (cond ((string-match "bound \\(\\|FD=[0-9]+ \\)to" string) (mew-ssl-set-status pnm t)) ((string-match "gethostbyname: Valid name, no data record of requested type" string) (mew-ssl-set-status pnm 'gethostbyname-failure)) ((string-match "gethostbyname: Host not found" string) (mew-ssl-set-status pnm 'gethostbyname-failure)) ((string-match "Local: bind: Address already in use" string) (mew-ssl-set-status pnm 'bind-failure)))))) (defun mew-ssl-filter2 (process string) (let* ((pnm (process-name process)) (prev-str (mew-ssl-get-string pnm))) (save-excursion (mew-ssl-debug "SSL/TLS: " string) (mew-ssl-set-string pnm string) (setq string (concat prev-str string)) (cond ((string-match "Negotiated \\|opened with SSL" string) (mew-ssl-set-status pnm t)) ((string-match "Failed to initialize" string) (mew-ssl-set-status pnm t)) ;; xxx ((string-match "verify failed" string) (mew-ssl-set-status pnm 'verify-failure)))))) (defun mew-ssl-filter3 (process string) (save-excursion (mew-ssl-debug "SSL/TLS: " string))) (defun mew-ssl-sentinel (process event) (let* ((pnm (process-name process)) (file (mew-ssl-get-file pnm))) (save-excursion (mew-delete-file file)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; stunnel version check ;;; (defun mew-ssl-setup () (if (not (mew-which-exec mew-prog-ssl)) (setq mew-ssl-ver nil) (with-temp-buffer (call-process mew-prog-ssl nil t nil "-version") (goto-char (point-min)) (re-search-forward "^stunnel " nil t 1) (if (looking-at "\\([45]\\)\\.\\([0-9]+\\)") (progn (setq mew-ssl-ver (string-to-number (mew-match-string 1))) (setq mew-ssl-minor-ver (string-to-number (mew-match-string 2)))) (setq mew-ssl-ver 3)) (when (re-search-forward "LIBWRAP" nil t) (setq mew-ssl-libwrap t))))) (provide 'mew-ssl) ;;; Copyright Notice: ;; Copyright (C) 2002-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-ssl.el ends here kazu-yamamoto-Mew-ff9c41b/mew-summary.el000066400000000000000000000324251256455547000203660ustar00rootroot00000000000000;;; mew-summary.el --- Summary mode for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Summary info ;;; (defvar mew-sinfo-list '(;; parameters to be saved "refile" "mark-hist" ;; parameters used internally "scan-id" "scan-md5" "find-key" "cursor-line" "direction" "start-point" "cache-time" "summary-form" "summary-column" "unread-mark" "refile-back" "disp-msg" "case" "folder" "proto" "mid-marker" "mid-line" "ttl-line" "mark-review" "ret-pos" "inboxp" "column")) (mew-blinfo-defun 'mew-sinfo mew-sinfo-list) (defvar mew-sinfo-list-save-length 2) (defvar mew-sinfo-file ".mew-sinfo") (defun mew-sinfo-save () (when (mew-summary-p) (let* ((n mew-sinfo-list-save-length) (data (make-vector n nil)) (bnm (mew-summary-folder-name 'ext)) (file (mew-expand-file bnm mew-sinfo-file))) (dotimes (i n) (aset data i (aref mew-sinfo i))) (mew-lisp-save file data nil 'unlimit)))) (defun mew-sinfo-load () (when (mew-summary-p) (let* ((n mew-sinfo-list-save-length) (bnm (mew-summary-folder-name 'ext)) (file (mew-expand-file bnm mew-sinfo-file)) data) (setq data (mew-lisp-load file)) (when data (dotimes (i n) (aset mew-sinfo i (aref data i))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Macros ;;; (defmacro mew-summary-msg-or-part (&rest body) "See if the cursor is on a message or a part." `(cond ((eobp) (message "No message")) ((not (or (mew-summary-message-number) (mew-syntax-number))) (message "No message")) (t ,@body))) (defmacro mew-summary-msg (&rest body) "See if the cursor is on a message." `(cond ((eobp) (message "No message")) ((not (mew-summary-message-number)) (message "Please use this command on a message, not a part")) (t ,@body))) (defmacro mew-summary-part (&rest body) "See if the cursor is on a part." `(cond ((eobp) (message "No part")) ((not (mew-syntax-number)) (message "Please use this command on a part, not a message")) (t ,@body))) (defmacro mew-summary-multi-msgs (&rest body) "Collect messages marked with '*' and set their corresponding files to FILES." `(let* ((FLD-MSGS (mew-summary-mark-collect2 mew-mark-review)) (FLD-MSG-LIST FLD-MSGS) ;; may be used in body FILES) ;; may be used in body (cond ((null FLD-MSGS) (message "No %c marks" mew-mark-review)) (t ;; a little bit complicated because of Virtual mode (dolist (fld-msg FLD-MSGS) (setq FILES (cons (mew-expand-msg (car fld-msg) (cdr fld-msg)) FILES))) (setq FILES (nreverse FILES)) ,@body)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Subfunctions ;;; (defun mew-summary-local-p () (mew-folder-localp (mew-summary-folder-name 'ext))) (defun mew-summary-draft-p () (mew-folder-draftp (mew-summary-folder-name 'ext))) (defun mew-summary-queue-p () (or (mew-folder-queuep (mew-summary-folder-name 'ext)) (mew-folder-postqp (mew-summary-folder-name 'ext)))) (defun mew-summary-pop-p () (mew-folder-popp (mew-summary-folder-name 'ext))) (defun mew-summary-case1 () (and (mew-summary-or-virtual-p) (not (mew-summary-draft-p)))) (defun mew-summary-case2 () (and (mew-summary-p) (not (mew-summary-queue-p)))) (defun mew-summary-case3 () (and (mew-summary-p) mew-summary-buffer-process)) (defmacro mew-summary-only (&rest body) "See if the mode of this buffer is Summary mode. This macro is used to prohibit using a command in Virtual mode." `(cond ((not (mew-summary-p)) (message "This command can be used in Summary mode only")) (t ,@body))) (defmacro mew-virtual-only (&rest body) "See if the mode of this buffer is Virtual mode. This macro is used to prohibit using a command in Summary mode." `(cond ((not (mew-virtual-p)) (message "This command can be used in Virtual mode only")) (t ,@body))) (defmacro mew-thread-only (&rest body) "See if this buffer is Thread folder. This macro is used to prohibit using a command in Summary mode." `(cond ((not (mew-thread-p)) (message "This command can be used in Thread folder only")) (t ,@body))) (defmacro mew-pickable (&rest body) "See if pick can be used for this folder." `(cond ((not (mew-pickable-p)) (message "This command cannot be used in this folder")) (t ,@body))) (defmacro mew-summary-not-in-queue (&rest body) "See if this folder is not +queue." `(cond ((not (mew-summary-or-virtual-p)) (message "This command cannot be used in this mode")) ((mew-summary-queue-p) (message "This command cannot be used in %s" (mew-summary-folder-name))) (t ,@body))) (defmacro mew-summary-not-in-draft (&rest body) "See if this folder is not +draft." `(cond ((not (mew-summary-or-virtual-p)) (message "This command cannot be used in this mode")) ((mew-summary-draft-p) (message "This command cannot be used in %s" (mew-summary-folder-name))) (t ,@body))) (defmacro mew-summary-not-in-nntp (&rest body) "See if this folder is not NNTP." `(cond ((mew-folder-nntpp (mew-sinfo-get-folder)) (message "This command cannot be used in %s" (mew-summary-folder-name))) (t ,@body))) (defmacro mew-summary-local-or-imap (&rest body) "See if this folder is either local or IMAP." `(cond ((not (mew-summary-or-virtual-p)) (message "This command cannot be used in this mode")) ((or (mew-folder-nntpp (mew-sinfo-get-folder)) (mew-folder-popp (mew-sinfo-get-folder))) (message "This command cannot be used in %s" (mew-summary-folder-name))) (t ,@body))) ;; local or IMAP (defmacro mew-summary-local-only (&rest body) "See if this folder is local." `(cond ((not (mew-summary-or-virtual-p)) (message "This command cannot be used in this mode")) ((not (mew-summary-local-p)) (message "This command cannot be used in %s" (mew-summary-folder-name))) (t ,@body))) (defmacro mew-summary-with-mewl (&rest body) `(cond ((not (mew-which-exec mew-prog-mewl)) (message "'%s' not found!" mew-prog-mewl)) (t ,@body))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Region ;;; (defun mew-summary-get-region () "Get a region according to 'mew-summary-region-include-cursor-line' and return (beg . end)." (save-excursion (let ((beg (region-beginning)) (end (region-end))) (goto-char beg) (beginning-of-line) (setq beg (point)) (goto-char end) (cond ((eq mew-summary-region-include-cursor-line t) (forward-line)) ((eq mew-summary-region-include-cursor-line 'end) (if (eq (char-after) ?\n) (forward-line) (beginning-of-line))) (t (if (> (current-column) 0) (forward-line) (beginning-of-line)))) (cons beg (point))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Dialog ;;; (defun mew-substitute-for-summary (msg) (substitute-command-keys (concat "\\" msg))) (defun mew-message-for-summary (msg) (message "%s" (mew-substitute-for-summary msg))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Modeline ;;; (defvar mew-mode-line-target "%p") (defvar mew-mode-line-format `("" (mew-summary-buffer-left-msgs mew-summary-buffer-left-msgs "L%l") (mew-summary-buffer-raw "*") (mew-summary-buffer-secure-process ,mew-secure-format2))) (defvar mew-mode-line-process '((mew-summary-buffer-secure-process mew-secure-format) (mew-summary-buffer-process mew-summary-buffer-process-status))) (defun mew-summary-setup-mode-line () (let ((tgt mew-mode-line-target) target prev pos) (if (boundp 'mode-line-position) (progn (make-local-variable 'mode-line-position) ;; Emacs 21.3.50 (setq mode-line-position (copy-sequence (default-value 'mode-line-position))) (setq prev mode-line-position)) (setq mode-line-format (copy-sequence (default-value 'mode-line-format))) (setq prev mode-line-format)) (setq target (or (rassoc (list tgt) prev) ;; Emacs 21.3.50 (rassoc tgt prev) (car (member tgt prev)))) (when target (setq pos (- (length prev) (length (member target prev)))) (setcar (nthcdr pos prev) mew-mode-line-format)) (when (boundp 'line-number-mode) (make-local-variable 'line-number-mode) (setq line-number-mode nil)) (or (assq 'mew-summary-buffer-process mode-line-process) (setq mode-line-process (append mew-mode-line-process mode-line-process))))) (defun mew-summary-reset-mode-line () (setq mew-summary-buffer-left-msgs nil)) (defun mew-summary-mode-name (name) (let ((case (if (mew-case-default-p mew-case) "" mew-case))) (if (string= case "") (setq mode-name name) (setq mode-name (format "%s %s" name case))) (force-mode-line-update))) (defun mew-summary-mode-line () (unless mew-summary-buffer-process (let ((pos (point)) (mid-point (marker-position (mew-sinfo-get-mid-marker))) (mid-line (mew-sinfo-get-mid-line)) (ttl (mew-sinfo-get-ttl-line)) cur left) (if (< pos mid-point) (if (< pos (/ mid-point 2)) (setq cur (mew-count-lines (point-min) pos)) (setq cur (- mid-line (mew-count-lines pos mid-point)))) (if (< pos (+ mid-point (/ mid-point 2))) (setq cur (+ mid-line (mew-count-lines mid-point pos))) (setq cur (- ttl (mew-count-lines pos (point-max)))))) (unless (and (mew-decode-syntax-p) (equal (mew-decode-syntax-buffer) (current-buffer)) (>= pos (mew-decode-syntax-begin)) (<= pos (mew-decode-syntax-end))) (setq cur (1+ cur))) (setq left (- ttl cur)) (setq mew-summary-buffer-left-msgs (format "[%d/%d{%d}]" cur ttl left))) (force-mode-line-update))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Locking ;;; (defun mew-summary-exclusive-p (&optional no-msg) (cond ((eq mew-summary-buffer-process t) (or no-msg (message "Try again later")) nil) ;; not exclusive ((processp mew-summary-buffer-process) (or no-msg (mew-message-for-summary "Another process is running. Try later or type '\\[mew-summary-kill-subprocess]' to kill it")) nil) ;; not exclusive (t t))) ;; exclusive ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Summary mode ;;; (defun mew-summary-mode () "A major mode to show a list of messages in a folder. \\{mew-summary-mode-map}" (interactive) (setq major-mode 'mew-summary-mode) (setq mode-line-buffer-identification (mew-mode-line-id)) (use-local-map mew-summary-mode-map) (setq buffer-read-only t) (setq truncate-lines t) ;; (if (boundp 'bidi-paragraph-direction) (setq bidi-paragraph-direction 'left-to-right)) (make-local-variable 'tab-width) (make-local-variable 'search-invisible) (setq search-invisible nil) (make-local-variable 'line-move-ignore-invisible) (setq line-move-ignore-invisible t) (make-local-variable 'search-invisible) (jit-lock-register 'mew-summary-cook-region) (add-hook 'kill-buffer-hook 'mew-sinfo-save nil 'local) (mew-sinfo-set-disp-msg t) ;; (mew-summary-mode-name mew-mode-name-summary) (mew-summary-setup-mode-line) (mew-summary-setup-decoration) (mew-highlight-cursor-line) (mew-run-mode-hooks 'mew-summary-mode-hook)) (defun mew-summary-kill () "Kill this Summary mode." (interactive) (mew-kill-buffer) (when (and mew-use-other-frame-for-summary (> (length (frame-list)) 1)) (mew-remove-buffer (mew-buffer-message)) (delete-frame))) (defun mew-summary-reset () (mew-unhighlight-cursor-line) (mew-window-configure 'summary) (mew-remove-buffer (mew-buffer-message)) (mew-current-set nil nil nil) (mew-summary-reset-mode-line) (mew-decode-syntax-delete)) (provide 'mew-summary) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-summary.el ends here kazu-yamamoto-Mew-ff9c41b/mew-summary2.el000066400000000000000000000645571256455547000204630ustar00rootroot00000000000000;;; mew-summary2.el --- Summary mode for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; End of ;;; (defun mew-message-set-end-of () (save-restriction (widen) (save-excursion (mew-elet (goto-char (point-max)) (unless (bolp) (insert "\n")) (mew-message-clear-end-of) (when (or mew-end-of-message-string mew-end-of-part-string) (move-overlay (mew-minfo-get-eom) (point-max) (point-max)) (if (mew-decode-syntax-p) (if (mew-summary-end-of-message-p) (mew-message-set-end-of-message) (mew-message-set-end-of-part)) (mew-message-set-end-of-message))))))) (defun mew-message-clear-end-of () (unless (overlayp (mew-minfo-get-eom)) (mew-minfo-set-eom (mew-overlay-make (point-max) (point-max)))) (mew-message-set-end-of-nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Prefetch ;;; (defun mew-summary-cache-prefetch () (let ((mew-inherit-prefetching t) fld next) (save-excursion (mew-redraw) ;; need to display (mew-summary-goto-message) (cond ((eq (mew-sinfo-get-direction) 'up) (when (re-search-backward mew-regex-msg-show nil t) (setq fld (mew-summary-folder-name)) (setq next (mew-summary-message-number)))) ((eq (mew-sinfo-get-direction) 'down) (if (mew-decode-syntax-end) (goto-char (mew-decode-syntax-end)) (forward-line)) (when (re-search-forward mew-regex-msg-show nil t) (setq fld (mew-summary-folder-name)) (setq next (mew-summary-message-number)))))) ;; should get the cursor back for display (save-excursion (if (and fld next (not (mew-cache-hit fld next)) (not (string= fld mew-draft-folder)) (not (mew-summary-message-toobig fld next))) (mew-cache-message fld next nil 'no-err))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Caching ;;; (defun mew-summary-cache-message (fld msg sumbuf &optional unlimit nodisplay) "Create a cache for the message specified with FLD and MSG. If UNLIMIT is non-nil, decodes it without limitations. If nodisplay is non-nil, displays the cached message." ;; message buffer (mew-elet (mew-summary-display-preamble) (let ((cache (mew-cache-message fld msg unlimit))) (mew-decode-syntax-copy cache) (unless nodisplay (mew-mime-message/rfc822 cache mew-decode-syntax)) ;; Must print the syntax before mew-summary-display-postscript ;; to tell the end of message. (mew-decode-syntax-print sumbuf mew-decode-syntax (mew-xinfo-get-multi-form) (mew-xinfo-get-icon-spec)) (unless nodisplay (mew-summary-display-postscript)) cache))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; After step ;;; (defun mew-summary-display-after (direction) (cond ((eq direction 'down) (mew-summary-display-down)) ((eq direction 'up) (mew-summary-display-up)) ((eq direction 'next) (mew-summary-display-next)) (t ()))) ;; 'stop ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Preamble and postscript ;;; (defun mew-summary-recenter () "Make the current line to the center of Summary mode." (interactive) (if (or mew-summary-recenter-p (mew-called-interactively-p)) (recenter (/ (- (window-height) 2) 2)))) (defun mew-summary-display-preamble () ;; message buffer (mew-erase-buffer) (mew-message-clear-end-of) (mew-overlay-delete-buffer) ;; veil, xxx also delete extents? ;; kill mark for cite (and (mark-marker) (set-marker (mark-marker) nil)) (mew-normal-line)) (defvar mew-message-last-buffer nil) (defun mew-summary-display-postscript (&optional no-hook) ;; message buffer (unless no-hook (run-hooks 'mew-message-hook)) (mew-minfo-set-reob nil) (setq mew-message-last-buffer (current-buffer)) (mew-message-set-end-of) (set-buffer-modified-p nil)) (defun mew-summary-cursor-postscript () (mew-summary-mode-line) (mew-summary-recenter) (mew-thread-move-cursor) (mew-highlight-cursor-line) (when (and mew-use-unread-mark (mew-summary-message-number) ;; mark would be nil. MUST be equal (equal (mew-summary-get-mark) mew-mark-unread)) (unless (and mew-inherit-after-marking (not mew-delete-unread-mark-by-mark)) (mew-mark-put-mark mew-mark-read 'no-msg))) (set-buffer-modified-p nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Displaying ;;; (defun mew-summary-message-toobig (fld msg) (let ((file (mew-expand-msg fld msg))) (and (file-readable-p file) (> (mew-file-get-size file) mew-file-max-size)))) (defun mew-summary-display (&optional redisplay) " (1) If called interactively, this command lets you read through messages. That is, display a message, scroll it, and move-then-display another message or part. See 'mew-summary-show-direction' to set the direction that the cursor moves. You can select a value out of 'up, 'down, 'next(current direction) or 'stop. Default is 'down. 'mew-summary-show-direction' is valid in this case only because the cursor stays in the other cases. (2) If called interactively with '\\[universal-argument]' (i.e. REDISPLAY is non-nil), this command displays the current message or part again. This is a convenient way to get back to the beginning of the current message or part. (3) If called internally, this function displays the current message or part. If it is already displayed, nothing changes. (4) If called internally and REDISPLAY is 'non-nil', this function displays the current message or part. Even if it is already displayed, this function displays it again getting back to the beginning." (interactive "P") (when (or redisplay (mew-sinfo-get-disp-msg) (mew-called-interactively-p)) (mew-summary-msg-or-part (let* ((fld (mew-summary-folder-name)) (vfld (mew-summary-folder-name 'ext)) (msg (mew-summary-message-number)) (part (mew-syntax-nums)) (fid (mew-frame-id)) (ofld (mew-current-get-fld fid)) (omsg (mew-current-get-msg fid)) (opart (mew-current-get-part fid)) (cache (mew-cache-hit fld (or msg omsg))) (win (selected-window)) (read-through (mew-called-interactively-p)) (sumbuf (current-buffer)) next prefetch) (unwind-protect (progn (mew-summary-toggle-disp-msg 'on) (mew-window-configure 'message) ;; message buffer (mew-current-set fld (or msg omsg) part) (mew-minfo-set-summary vfld) (cond ((null cache) (mew-decode-syntax-delete) (cond ((string= fld mew-draft-folder) (if (and (string= fld ofld) (string= msg omsg) (not redisplay)) (if read-through (if (mew-message-next-page) (setq next t))) (mew-decode-syntax-clear) (mew-summary-display-draft fld msg) (setq prefetch t))) ((mew-summary-message-toobig fld msg) (if (and (string= fld ofld) (string= msg omsg) (not redisplay)) (if read-through (if (mew-message-next-page) (setq next t))) (mew-decode-syntax-clear) (mew-summary-display-raw fld msg mew-file-max-size) (setq prefetch t) (mew-message-for-summary "Too large, truncated. To see the entire message, type '\\[mew-summary-analyze-again]'"))) (t (mew-decode-syntax-clear) (mew-summary-cache-message fld msg sumbuf) (setq prefetch t)))) (msg (cond ((or (null ofld) (not (and (string= fld ofld) (string= msg omsg))) opart redisplay) (mew-decode-syntax-clear) (mew-decode-syntax-delete) (mew-summary-display-message cache sumbuf) (setq prefetch t)) (read-through (if (mew-message-next-page) (setq next t))))) (part (cond ((or (null opart) (not (equal opart part)) redisplay) (mew-summary-display-part cache part)) ;; If called internally, never match below (read-through (if (mew-message-next-page) (setq next t))))))) (if (mew-xinfo-get-decode-err) (message "MIME decoding error: %s" (mew-xinfo-get-decode-err))) (if (mew-xinfo-get-action) (message "%s" (mew-xinfo-get-action))) (mew-message-mode-line fld msg) (select-window win) ;; summary buffer (mew-summary-cursor-postscript) (if prefetch (mew-summary-cache-prefetch)) (if next (mew-summary-display-after mew-summary-show-direction))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Displaying message or part ;;; (defun mew-summary-display-message (cache sumbuf) "Display a message from the CACHE." ;; message buffer (mew-elet (mew-summary-display-preamble) (mew-decode-syntax-copy cache) (mew-mime-message/rfc822 cache mew-decode-syntax) ;; Must print the syntax before mew-summary-display-postscript ;; to tell the end of message. (mew-decode-syntax-print sumbuf mew-decode-syntax (mew-xinfo-get-multi-form) (mew-xinfo-get-icon-spec)) (mew-summary-display-postscript))) (defun mew-summary-display-part (cache nums) "Display a part from the CACHE." ;; message buffer (mew-elet (mew-summary-display-preamble) (mew-decode-syntax-copy cache) (mew-mime-part cache mew-decode-syntax nums) (mew-summary-display-postscript))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Displaying draft ;;; (defun mew-summary-display-draft (fld msg) "Display the message in +draft specified by FLD and MSG. The message is not in the MIME form. So, it cannot be decoded as MIME. Just display it as is. This function does not create a cache." ;; message buffer (mew-elet (mew-summary-display-preamble) (mew-insert-message fld msg mew-cs-m17n nil) (mew-header-goto-end) (mew-highlight-header-region (point-min) (point)) (mew-summary-display-postscript))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Displaying draft ;;; (defun mew-summary-display-raw (fld msg size) "Display the message specified by FLD and MSG as is. If SIZE is specified, truncates it with the size. This function does not create a cache." ;; message buffer (mew-elet (mew-summary-display-preamble) (mew-insert-message fld msg mew-cs-binary size) (goto-char (point-min)) (when (re-search-forward mew-eoh nil t) (let ((beg (point))) (goto-char (point-max)) (mew-cs-decode-region beg (point) mew-cs-autoconv))) (goto-char (point-min)) (condition-case nil (progn (mew-decode-rfc822-header) ;; xxx limit.. (mew-decode-syntax-arrange-warning) (mew-header-goto-end) (mew-header-arrange (point-min) (point)) (setq mew-decode-syntax (mew-decode-syntax-rfc822))) (error ())) (mew-summary-display-postscript 'no-hook))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Analyze again ;;; (defun mew-summary-analyze-again-alternative (&optional arg) "This command analyzes the message again with 'mew-use-alternative' and 'mew-use-text-body' reversed." (interactive "P") (mew-summary-goto-message) (let ((mew-use-alternative (not mew-use-alternative)) (mew-use-text-body (not mew-use-text-body))) (mew-summary-analyze-again arg))) (defun mew-summary-analyze-again (&optional arg) "1) If this command executed on a message, the cache of the message is removed and the message is analyzed then displayed. 1a) If the size of the current message exceeds 'mew-file-max-size', MIME analysis is skipped then the beginning of the raw message is displayed. In this situation, this command analyzes the current message without the limitation then displays it. 1b) If the length of a header exceeds 'mew-header-max-length', a broken message is displayed. In this situation, this command analyzes the current message without the limitation then displays it. 1c) If the current message is displayed by '\\\\[mew-summary-analyze-again-alternative]', this command gets it back to the normal display. 1d) If 'mew-use-text/html' is nil, its HTML body is displayed as is. In this situation, this command analyzes the HTML body and displays it. 1e) If called with '\\[universal-argument]', analyze the message with 'mew-decode-broken' reversed. 2) If this command is called on a part, the part is displayed again. 2a) If 'mew-use-text/html' is nil, its HTML part is displayed as is. In this situation, this command analyzes the HTML part and displays it." (interactive "P") (mew-summary-msg-or-part (if (mew-folder-draftp (mew-summary-folder-name)) (mew-summary-display 'redisplay) (let ((mew-decode-broken (if arg (not mew-decode-broken) mew-decode-broken)) (mew-use-text/html t) (mew-use-text/xml t) (fld (mew-summary-folder-name)) (vfld (mew-summary-folder-name 'ext)) (msg (mew-summary-message-number2)) (part (mew-syntax-nums)) (win (selected-window)) (sumbuf (current-buffer)) cache) (unwind-protect (progn (mew-summary-toggle-disp-msg 'on) (mew-window-configure 'message) ;; message buffer (if part (progn (setq cache (mew-cache-hit fld msg)) (mew-summary-display-part cache part)) (mew-cache-delete2 fld msg) (mew-summary-goto-message) (mew-current-set fld msg part) (mew-minfo-set-summary vfld) (mew-decode-syntax-clear) (mew-decode-syntax-delete) (mew-summary-cache-message fld msg sumbuf 'unlimit))) (if (mew-xinfo-get-decode-err) (message "MIME decoding error: %s" (mew-xinfo-get-decode-err))) (mew-message-mode-line fld msg) (select-window win) ;; summary buffer (mew-summary-cursor-postscript)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Display ASIS ;;; (defun mew-summary-display-asis () "Insert this message or part into Message mode in the raw format. This command treats PGP/MIME transparent. That is an encrypted/signed part is displayed as a decrypted/verified part. Also, if this command is used for a message whose entire body is encrypted/signed, a decrypted/verified body is displayed." (interactive) (mew-summary-msg-or-part (let* ((fld (mew-summary-folder-name)) (vfld (mew-summary-folder-name 'ext)) (msg (mew-summary-message-number2)) (nums (mew-syntax-nums)) (win (selected-window)) (buf (generate-new-buffer mew-buffer-prefix)) (cbuf (mew-cache-hit fld msg)) (alt (if cbuf (mew-cache-dinfo-get-use-alt cbuf) mew-use-alternative)) syntax ct begin end) (with-current-buffer buf (mew-erase-buffer) (mew-insert-message fld msg mew-cs-text-for-read nil) (mew-dinfo-set nil t nil alt) (mew-decode-for-edit) (setq syntax (mew-syntax-get-entry mew-decode-syntax nums))) (setq ct (mew-syntax-get-value (mew-syntax-get-ct syntax) 'cap)) (setq begin (mew-syntax-get-begin syntax)) (setq end (mew-syntax-get-end syntax)) (unwind-protect (progn (mew-summary-toggle-disp-msg 'on) (mew-window-configure 'message) ;; message buffer (mew-current-set fld msg nums) (mew-minfo-set-summary vfld) ;; The following codes are not necessary. ;; (mew-decode-syntax-clear) ;; (mew-decode-syntax-delete) (mew-elet (mew-summary-display-preamble) (mew-decode-syntax-copy buf) (cond ((string= ct mew-ct-msg) (if nums (setq end (mew-syntax-get-end (mew-syntax-get-part syntax))) (setq end nil)) ;; We need to keep properties of a header. ;; This must be "insert-buffer-substring". (insert-buffer-substring buf begin end) (goto-char (point-min)) (mew-header-goto-end) (mew-header-arrange (point-min) (point)) (setq mew-decode-syntax (mew-decode-syntax-rfc822))) (t ;; We need to keep composite properties of charset. ;; This must be "insert-buffer-substring". (insert-buffer-substring buf begin end) (goto-char (point-min))))) (mew-summary-display-postscript 'no-hook)) (mew-remove-buffer buf) (mew-message-mode-line fld msg) (select-window win) ;; summary buffer (mew-summary-cursor-postscript))))) (defun mew-summary-find-file (&optional arg) "Open this message and makes it read-only. If called with '\\[universal-argument]', it stays writable." (interactive "P") (mew-summary-msg-or-part (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) (file (mew-expand-msg fld msg))) (when (mew-sinfo-get-disp-msg) (mew-summary-toggle-disp-msg)) (mew-frwlet (if (mew-folder-draftp fld) mew-cs-m17n mew-cs-autoconv) mew-cs-dummy (if arg (switch-to-buffer (mew-find-file-noselect2 file)) (view-buffer (mew-find-file-noselect2 file) 'kill-buffer)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Trace Path ;;; (defun mew-summary-trace-path () "Parse the Received: fields and display them in Message mode." (interactive) (mew-summary-msg-or-part (let* ((win (selected-window)) (fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) lst svr-date (snd "?") (rcv "?") last svr date tmp) (mew-summary-set-message-buffer fld msg) ;; message buffer or cache buffer (setq lst (nreverse (mew-header-get-value mew-received: 'as-list))) (set-buffer (mew-buffer-message)) ;; message buffer (mew-summary-display-preamble) (save-excursion (dolist (ent lst) (while (string-match "\n" ent) (setq ent (replace-match "" nil t ent))) (setq svr-date (mew-split ent ?\;)) (mew-set '(svr date) svr-date) (unless date ;; for broken MTAs (if (string-match "Mon\\|Tue\\|Wed\\|Thu\\|Fri\\|Sat\\|Sun" ent) (setq date (substring ent (match-beginning 0))))) (if date (setq date (mew-time-rfc-to-sortkey date 'tzadj))) (unless date (setq date "19700101000000")) (setq tmp (cons (list date svr) tmp)) (cond ((string-match "(\\(qmail [0-9]+\\)" svr) (setq rcv (match-string 1 svr))) ((string-match "by[ \t]+\\([^() \t\n]+\\)" svr) (setq rcv (match-string 1 svr)) (if (string-match "from[ \t]+\\([^() \t\n]+\\).*\\([[][.0-9]+[]]\\)" svr) (setq snd (format "%s %s" (match-string 1 svr) (match-string 2 svr))) (if (string-match "from[ \t]+\\([^() \t\n]+\\)" svr) (setq snd (match-string 1 svr)))) (when (and (string= snd "unknown") (string-match "from unknown (HELO \\([^() \t\n]+\\))" svr)) (setq snd (concat (match-string 1 svr) "(unknown)")))) ((string-match "[ \t]*\\([^() \t\n]+\\)" svr) (setq rcv (match-string 1 svr)) (if (string-match "from[ \t]*\\([^() \t\n]+\\)" svr) (setq snd (match-string 1 svr))))) (mew-elet (insert date) (beginning-of-line) (forward-char 4) (insert "/") (forward-char 2) (insert "/") (forward-char 2) (insert " ") (forward-char 2) (insert ":") (forward-char 2) (insert ":") (forward-char 2) (insert " (" (mew-time-tmzn-int) ") ") (if (and snd (not (string= snd last))) (insert snd)) (insert " => ") (if rcv (insert rcv)) (insert "\n") (setq last rcv) (setq snd "?" rcv "?")))) (mew-summary-display-postscript 'no-hook) (select-window win)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Direction ;;; (defun mew-summary-next () (if (eq (mew-sinfo-get-direction) 'up) (mew-summary-up) (mew-summary-down))) (defvar mew-summary-down-function 'forward-line "This function is called by mew-summary-down(). This is a very ad-hoc solution for putting the review mark on a thread.") (defun mew-re-search-forward-visibile (regex) (catch 'loop (while (re-search-forward regex nil t) (unless (eq (get-text-property (point) 'invisible) t) (throw 'loop t))))) (defun mew-re-search-backward-visible (regex) (catch 'loop (while (re-search-backward regex nil t) (unless (eq (get-text-property (point) 'invisible) t) (throw 'loop t))))) (defun mew-summary-down () (funcall mew-summary-down-function) (cond ((mew-re-search-forward-visibile mew-regex-msg-or-part) (mew-thread-move-cursor) (mew-sinfo-set-direction 'down) t) (t (mew-decode-syntax-delete) (forward-line -1) ;; for invisible (unless (pos-visible-in-window-p) ;; This ensures that some messages are displayed in Summary. (recenter)) (mew-thread-move-cursor) (mew-summary-reset) (message "No more messages") nil))) (defun mew-summary-up () (beginning-of-line) (cond ((mew-re-search-backward-visible mew-regex-msg-or-part) (mew-thread-move-cursor) (mew-sinfo-set-direction 'up) t) (t (mew-thread-move-cursor) (mew-decode-syntax-delete) (mew-summary-reset) (message "No more messages") nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Direction 2 ;;; (defun mew-summary-display-next () (if (mew-summary-next) (mew-summary-display))) (defun mew-summary-display-up (&optional arg) "Move to above then display. Targets includes parts, messages marked with '*', and non-marked messages. When called with '\\[universal-argument]', parts are skipped." (interactive "P") (beginning-of-line) (when arg (mew-summary-goto-message) (mew-decode-syntax-delete)) (if (mew-summary-up) (mew-summary-display))) (defun mew-summary-display-down (&optional arg) "Move to below then display. Targets includes parts, messages marked with '*', and non-marked messages. When called with '\\[universal-argument]', parts are skipped." (interactive "P") (when arg (mew-summary-goto-message) (mew-decode-syntax-delete)) (if (mew-summary-down) (mew-summary-display))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Paging ;;; (defun mew-summary-prev-page () "\\Back-scroll this message. Unnecessary header fields are hidden over the window. Type '\\[mew-summary-prev-page]' to see them when a message is displayed." (interactive) (mew-summary-scroll-down 'fullpage)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Scrolling ;;; (defun mew-summary-scroll-up () "Make this message scroll up with one line." (interactive) (mew-summary-msg-or-part (let* ((win (selected-window)) (msg (mew-summary-message-number)) (part (mew-syntax-nums)) (fid (mew-frame-id)) (omsg (mew-current-get-msg fid)) (opart (mew-current-get-part fid))) ;; xxx how about folder check? (if (or (and msg (string= msg omsg) (null part) (null opart)) (and part (equal part opart))) ;; MUST be equal (unwind-protect (progn (mew-summary-toggle-disp-msg 'on) (mew-window-configure 'message) ;; message buffer (mew-message-next-page 1)) (select-window win)) (call-interactively 'mew-summary-display))))) (defun mew-summary-scroll-down (&optional fullpage) "Make this message scroll down with one line." (interactive) (mew-summary-msg-or-part (let* ((win (selected-window)) (msg (mew-summary-message-number)) (part (mew-syntax-nums)) (fid (mew-frame-id)) (omsg (mew-current-get-msg fid)) (opart (mew-current-get-part fid))) ;; xxx how about folder check? (if (or (and msg (string= msg omsg) (null part) (null opart)) (and part (equal part opart))) ;; MUST be equal (unwind-protect (progn (mew-summary-toggle-disp-msg 'on) (mew-window-configure 'message) ;; message buffer (mew-message-prev-page (if fullpage nil 1))) (select-window win)) (call-interactively 'mew-summary-display))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Cursor motion ;;; (defun mew-summary-next-line (&optional arg) "Go to the next line." (interactive "p") (or arg (setq arg 1)) (if (< arg 0) (mew-summary-previous-line (- arg)) (let (col) (if (eq last-command this-command) (setq col (mew-sinfo-get-column))) (unless col (setq col (current-column)) (mew-sinfo-set-column col)) (while (> arg 0) (forward-line) (while (or (looking-at mew-regex-thread-separator) (eq (get-text-property (point) 'invisible) t)) (forward-line)) (setq arg (1- arg))) (move-to-column col)))) (defun mew-summary-previous-line (&optional arg) "Go to the previous line." (interactive "p") (or arg (setq arg 1)) (if (< arg 0) (mew-summary-next-line (- arg)) (let (col) (if (eq last-command this-command) (setq col (mew-sinfo-get-column))) (unless col (setq col (current-column)) (mew-sinfo-set-column col)) (while (> arg 0) (forward-line -1) ;; for invisible (while (or (looking-at mew-regex-thread-separator) (eq (get-text-property (point) 'invisible) t)) (forward-line -1)) (setq arg (1- arg))) (move-to-column col)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Mouse ;;; (defun mew-summary-mouse-show (e) "Mouse version of 'mew-summary-display'." (interactive "e") (mouse-set-point e) (beginning-of-line) (call-interactively 'mew-summary-display)) (provide 'mew-summary2) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-summary2.el ends here kazu-yamamoto-Mew-ff9c41b/mew-summary3.el000066400000000000000000000416521256455547000204530ustar00rootroot00000000000000;;; mew-summary3.el --- Summary mode for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Subfunctions ;;; (defmacro mew-summary-prepare-draft (&rest body) "Common procedure to prepare a draft." `(progn (unwind-protect (let ((inhibit-quit t)) ,@body (mew-redraw) (if quit-flag (setq quit-flag nil))) (mew-draft-save-buffer)) ;; to make sure not to use this draft again (mew-set-file-modes (buffer-file-name)) (mew-touch-folder mew-draft-folder) (message "Draft is prepared"))) (defun mew-summary-prepare-three-windows () "Prepare three windows: Summary mode, Message mode, and Draft mode" (unless mew-use-other-frame-for-draft (if (get-buffer (mew-buffer-message)) (delete-windows-on (mew-buffer-message))) (cond ((< (window-height) 25) (delete-other-windows)) (mew-use-full-window (mew-delete-other-window))) (let ((split-window-keep-point t)) (split-window-vertically)))) (defun mew-draft-multi-copy (draft files) (let* ((attach (mew-draft-to-attach draft)) (attachdir (mew-expand-folder attach))) (mew-check-directory attachdir) (dolist (file files) (if mew-use-symbolic-link-for-forwarding (mew-symbolic-link file (mew-folder-new-message attach)) (copy-file file (mew-folder-new-message attach)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sending ;;; (defun mew-summary-set-message-buffer (fld msg) ;; need to make a cache or a message buffer. (mew-summary-toggle-disp-msg 'on) ;; Since we will switch to a draft buffer, ;; the window of the draft buffer must not be deleted. ;; So, binding mew-use-full-window to nil. (let ((mew-use-full-window nil)) (mew-summary-display)) (set-buffer (mew-buffer-message)) ;; header exists only in cache if multipart (unless (mew-msghdr-p) (set-buffer (mew-cache-hit fld msg)))) (defun mew-summary-write (&optional from) "Write a message. A new draft is prepared in Draft mode. If called with '\\[universal-argument]', the From: address of the current message is copied to To: in a draft." (interactive "P") (if (null from) (mew-summary-send) (mew-summary-msg-or-part (let ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) to) (if (not (and fld msg)) (message "No message") (save-excursion (mew-summary-set-message-buffer fld msg) (setq to (mew-addrstr-parse-address (mew-header-get-value mew-from:))) (if (mew-is-my-address mew-regex-my-address-list to) (setq to (mew-addrstr-parse-address (mew-header-get-value mew-to:))))) (mew-summary-send to) (goto-char (point-min)) (if (search-forward mew-subj: nil t) (end-of-line))))))) (defun mew-summary-send (&optional to cc subject newsgroups) "Write a message. A new draft is prepared in Draft mode." (interactive) (let ((draft (mew-folder-new-message mew-draft-folder)) asked) (if (and (mew-summary-physical-folder) (mew-folder-nntpp (mew-summary-physical-folder))) (if (null newsgroups) (setq newsgroups "")) (when (and mew-ask-to (null to)) (setq to (mew-input-address (concat mew-to: " "))) (setq asked t)) (when (and mew-ask-cc (null cc)) (setq cc (mew-input-address (concat mew-cc: " "))) (setq asked t))) (mew-current-set-window-config) (mew-window-configure 'draft) (mew-summary-prepare-draft (mew-draft-find-and-switch draft) (mew-delete-directory-recursively (mew-attachdir draft)) (mew-draft-header subject nil to cc newsgroups nil nil nil asked) (mew-draft-mode) (run-hooks 'mew-draft-mode-newdraft-hook)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Replying ;;; (defun mew-subject-simplify (str &optional act-lst no-replace) "A function to simplify a value of Subject: according to 'mew-subject-simplify-replace-alist'." (let ((case-fold-search t) (action-list (or act-lst mew-subject-simplify-replace-alist)) (ret str) regexp replace) (dolist (action action-list) (setq regexp (mew-alist-get-key action)) (setq replace (if no-replace nil (mew-alist-get-value action))) (if (string-match regexp ret) (setq ret (replace-match (if replace (eval replace) "") nil t ret)))) ret)) (defun mew-subject-simplify-ml (str) "Remove leading \"[...]\" and \"(...)\" from subject line." (if (string-match "^[[(][^])]+[])][ \t]*" str) (substring str (match-end 0)) str)) (defun mew-subject-simplify2 (str) (mew-subject-simplify (mew-subject-simplify-ml (mew-subject-simplify str nil 'no-replace)) nil 'no-replace)) (defun mew-to-cc-newsgroups (replysender) (let (alist key tcn flds to cc newsgroups fromme func) (cond (replysender (setq alist mew-reply-sender-alist) (setq func 'mew-header-parse-address-list2)) ((mew-is-my-address mew-regex-my-address-list (mew-header-parse-address mew-from:)) (setq fromme t) (setq alist mew-reply-fromme-alist) ;; If from me, let's leave the "anonymous:;" keyword. (setq func 'mew-header-parse-address-list)) (t ;; reply all (setq alist mew-reply-all-alist) (setq func 'mew-header-parse-address-list2))) (catch 'loop (dolist (ent alist) (setq key (car ent)) (setq ent (cdr ent)) (when (or (eq key t) (and (stringp key) (mew-header-get-value key)) (and (listp key) (string= (mew-header-get-value (nth 0 key)) (nth 1 key)))) (dolist (tcn-flds ent) (setq tcn (car tcn-flds)) (setq flds (cdr tcn-flds)) (cond ((mew-case-equal tcn mew-to:) (setq to (funcall func flds))) ((mew-case-equal tcn mew-cc:) (setq cc (funcall func flds))) ((mew-case-equal tcn mew-newsgroups:) (setq newsgroups (funcall func flds))))) (throw 'loop nil)))) (list to cc newsgroups fromme))) (defun mew-in-reply-to-references () (let ((old-message-id (mew-idstr-get-first-id (mew-header-get-value mew-message-id:))) (old-in-reply-to (mew-idstr-get-first-id (mew-header-get-value mew-in-reply-to:))) (old-references (mew-idstr-to-id-list (mew-header-get-value mew-references:) 'rev)) id-list in-reply-to references) ;; Assuming that In-Reply-To: contains one ID. (when old-message-id ;; when old-message-id is nil, ;; we do not care even if old-references exist. (setq in-reply-to old-message-id) (cond (old-references (setq id-list old-references) (mew-addq id-list old-in-reply-to) (mew-addq id-list old-message-id) (setq id-list (nreverse id-list))) (t (setq id-list (list old-message-id)) (mew-addq id-list old-in-reply-to))) (setq references (mew-id-list-to-idstr id-list))) (list in-reply-to references))) (defun mew-summary-reply (&optional replysender) "Reply to this message. A new draft is prepared in Draft mode. Values of To:, Cc:, and Newsgroups: are prepared according to three alists. \(1) If called with '\\[universal-argument]', replying to the sender/poster only. In this case, 'mew-reply-sender-alist' is used. \(2) If this message is sent by ME, you probably intend to reply with the original header. In this case, 'mew-reply-fromme-alist' is used. \(3) Otherwise, replying to all people listed. In this case, 'mew-reply-all-alist' is used. The default value of 'mew-reply-sender-alist' is as follows: '((\"Reply-To:\" (\"To:\" \"Reply-To:\" \"From:\")) (t (\"To:\" \"From:\"))) This is read as follows: (1.1) If Reply-To: exists, copy the values of Reply-To: and From: to new To:. (1.2) Otherwise, copy the value of From: to To:. If you would like to reply only to the address on Reply-To: (if any), set 'mew-reply-sender-alist' to: '((\"Reply-To:\" (\"To:\" \"Reply-To:\")) (t (\"To:\" \"From:\"))) The default value of 'mew-reply-fromme-alist' is as follows: '((t (\"To:\" \"To:\") (\"Cc:\" \"Cc:\") (\"Newsgroups:\" \"Newsgroups:\")))) This is read as follows: (2.1) Copying the value of To: to new To: and copying the value of Cc: to new Cc: and copying the value of Newsgroups: to new Newsgroups:. The default value of 'mew-reply-all-alist' is as follows: '(((\"Followup-To:\" \"poster\") (\"To:\" \"From:\")) (\"Followup-To:\" (\"Newsgroups:\" \"Followup-To:\" \"Newsgroups:\")) (\"Newsgroups:\" (\"Newsgroups:\" \"Newsgroups:\")) (\"Reply-To:\" (\"To:\" \"Reply-To:\" \"From:\") (\"Cc:\" \"To:\" \"Cc:\" \"Apparently-To:\")) (t (\"To:\" \"From:\") (\"Cc:\" \"To:\" \"Cc:\" \"Apparently-To:\"))) This is read as follows: (3.1) If the value of Followup-To: is \"poster\", copying the value of From: to new To:. (3.2) If Followup-To: exists, copying the values of Followup-To: and Newsgroups: to new Newsgroups:. (3.3) If Newsgroups: exists, copying the value of Newsgroups: to Newsgroups:. (3.4) If Reply-To: exists, copying the values of Reply-To: and From: to new To:. And copying the values of To:, Cc: and Apparently-To: to new Cc:. (3.5) Otherwise, copying the value of From: to new To:. And copying the values of To:, Cc: and Apparently-To: to new Cc:. You may want to set 'mew-reply-all-alist' to: '(((\"Followup-To:\" \"poster\") (\"To:\" \"From:\")) (\"Followup-To:\" (\"Newsgroups:\" \"Followup-To:\")) (\"Newsgroups:\" (\"Newsgroups:\" \"Newsgroups:\")) (\"Reply-To:\" (\"To:\" \"Reply-To:\")) (t (\"To:\" \"From:\") (\"Cc:\" \"To:\" \"Cc:\" \"Apparently-To:\"))) " (interactive "P") (mew-summary-msg-or-part (mew-summary-not-in-draft (mew-current-set-window-config) (let ((owin (selected-window)) (fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) (split-width-threshold nil) cwin cbuf draft case subject to cc newsgroups in-reply-to references encrypted fromme ret) (if (string= (mew-summary-folder-name) mew-draft-folder) (message "Cannot reply to draft message") (setq draft (mew-folder-new-message mew-draft-folder)) (mew-summary-prepare-draft (mew-summary-prepare-three-windows) (mew-draft-find-and-switch draft t) (mew-delete-directory-recursively (mew-attachdir draft)) (setq cwin (selected-window)) ;; draft (setq cbuf (window-buffer cwin)) (select-window owin) (mew-summary-set-message-buffer fld msg) (when mew-case-guess-when-replied (setq case (mew-draft-get-case-by-guess mew-case-guess-when-replied-alist))) (setq encrypted (mew-syntax-encrypted-p mew-decode-syntax)) (save-restriction ;; if body contains ^L, header is not accessible. ;; mew-header-* cannot widen essentially. So widen here. (widen) ;; now cache buffer ;; ;; Subject: (setq subject (mew-header-get-value mew-subj:)) (when subject (setq subject (concat mew-reply-string subject)) (setq subject (mew-subject-simplify subject))) ;; ;; To:, Cc:, Newsgroups: (setq ret (mew-to-cc-newsgroups replysender)) (mew-set '(to cc newsgroups fromme) ret) ;; ;; In-Reply-To:, References: (setq ret (mew-in-reply-to-references)) (mew-set '(in-reply-to references) ret)) ;; (if (window-live-p cwin) (select-window cwin) ;; draft (pop-to-buffer cbuf)) (when case (if mew-case-guess-addition (setq case (mew-draft-add-case (mew-tinfo-get-case) case))) (mew-tinfo-set-case case)) (mew-draft-header subject nil to cc newsgroups in-reply-to references nil fromme) (when (eq mew-summary-reply-position 'body) (goto-char (mew-header-end)) (forward-line)) (mew-draft-mode encrypted) (run-hooks 'mew-draft-mode-newdraft-hook))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Replaying with citation ;;; (defun mew-summary-reply-with-citation (&optional replysender) "Answer to this message. A new draft is prepared in Draft mode. And this message is automatically cited. See also 'mew-summary-reply'." (interactive "P") (mew-summary-msg-or-part (mew-summary-not-in-draft (let ((mew-summary-reply-position nil) (mew-message-citation-frame-id (mew-frame-id))) (mew-summary-reply replysender) ;; mew-draft-mode-hook may insert text. (save-excursion (goto-char (point-max)) (run-hooks 'mew-before-cite-hook) (mew-draft-cite))) ;; the cursor is after To: (cond ((eq mew-summary-reply-with-citation-position 'body) (goto-char (mew-header-end)) (forward-line)) ((eq mew-summary-reply-with-citation-position 'end) (goto-char (point-max))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Forwarding ;;; (defun mew-summary-forward () "Forward this message to a third person. A new draft is prepared in Draft mode and this message is automatically attached." (interactive) (mew-summary-msg-or-part (mew-summary-not-in-draft (mew-current-set-window-config) (let* ((owin (selected-window)) (fld (mew-summary-folder-name)) (msg (mew-summary-message-number2)) (file (mew-expand-msg fld msg)) (draft (mew-folder-new-message mew-draft-folder)) (draftdir (file-name-nondirectory draft)) (to (and mew-ask-to (mew-input-address (concat mew-to: " ")))) (cc (and mew-ask-cc (mew-input-address (concat mew-cc: " ")))) (asked (or mew-ask-to mew-ask-cc)) subject fwsubject cwin) (mew-summary-prepare-draft (mew-summary-prepare-three-windows) (mew-draft-find-and-switch draft t) (mew-delete-directory-recursively (mew-attachdir draft)) (setq cwin (selected-window)) ;; draft (select-window owin) (mew-summary-set-message-buffer fld msg) (setq subject (mew-header-get-value mew-subj:)) (if subject (setq fwsubject (mew-subject-simplify (concat mew-forward-string subject)))) (select-window cwin) ;; draft ;; (mew-draft-header fwsubject 'nl to cc nil nil nil nil asked) (mew-draft-mode) (run-hooks 'mew-draft-mode-newdraft-hook) (mew-draft-multi-copy draft (list file)) (setq mew-encode-syntax (mew-encode-syntax-initial-multi draftdir 1)) (save-excursion (mew-draft-prepare-attachments t))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Multi forwarding ;;; (defun mew-summary-multi-forward () "Forward messages marked with '*' to a third person. A new draft is prepared in Draft mode and this message is automatically attached." (interactive) (mew-summary-multi-msgs (mew-summary-not-in-draft (mew-current-set-window-config) (let* ((draft (mew-folder-new-message mew-draft-folder)) (draftdir (file-name-nondirectory draft)) (to (and mew-ask-to (mew-input-address (concat mew-to: " ")))) (cc (and mew-ask-cc (mew-input-address (concat mew-cc: " ")))) (asked (or mew-ask-to mew-ask-cc))) (mew-summary-prepare-draft (mew-summary-prepare-three-windows) (mew-draft-find-and-switch draft t) (mew-delete-directory-recursively (mew-attachdir draft)) (mew-draft-header nil 'nl to cc nil nil nil nil asked) (mew-draft-mode) (run-hooks 'mew-draft-mode-newdraft-hook) (mew-draft-multi-copy draft FILES) (setq mew-encode-syntax (mew-encode-syntax-initial-multi draftdir (length FILES))) (save-excursion (mew-draft-prepare-attachments t))))))) (provide 'mew-summary3) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-summary3.el ends here kazu-yamamoto-Mew-ff9c41b/mew-summary4.el000066400000000000000000001176541256455547000204620ustar00rootroot00000000000000;;; mew-summary4.el --- Summary mode for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Variables ;;; (defvar mew-last-shell-command "") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Switching to folder ;;; (defun mew-summary-switch-to-folder (case:folder &optional func) (let ((ofolder (mew-summary-folder-name 'ext))) (cond ((get-buffer case:folder) (switch-to-buffer case:folder) (mew-set-buffer-cs mew-cs-m17n) (unless (mew-folder-virtualp case:folder) (mew-summary-folder-cache-load)) (unless (string= ofolder case:folder) (mew-window-configure 'summary)) nil) ;; existing folder (t (funcall (or func 'switch-to-buffer) (get-buffer-create case:folder)) (kill-all-local-variables) (mew-set-buffer-cs mew-cs-m17n) (mew-buffers-setup case:folder) (let* ((case (mew-case:folder-case case:folder)) (folder (mew-case:folder-folder case:folder)) (inboxp (string= folder (mew-proto-inbox-folder folder (or case mew-case))))) (mew-sinfo-set-case case) (mew-sinfo-set-folder folder) (mew-sinfo-set-inboxp inboxp)) (if (mew-folder-virtualp case:folder) (mew-virtual-mode) (mew-summary-mode) (if mew-summary-trace-directory (cd (mew-expand-folder case:folder))) (mew-summary-folder-cache-load)) (mew-window-configure 'summary) t)))) ;; new-folder ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Moving to folder ;;; (defun mew-summary-goto-folder (&optional goend) "Go to the folder which you specify. If executed with '\\[universal-argument]', the cursor always goes to the bottom of Summary mode." (interactive "P") (let* ((proto (mew-proto-to-go (mew-summary-folder-name 'ext))) (case1 (car (mew-summary-case-proto))) (inbox (mew-proto-inbox-folder proto case1)) (case:folder (mew-input-folder case1 inbox)) case folder buf win frame folder-alist) (if (null case:folder) (message "The folder does not exist") (setq case (mew-case:folder-case case:folder)) (setq folder (mew-case:folder-folder case:folder)) (cond ((mew-folder-imapp folder) (setq folder-alist (mew-imap-folder-alist case)) ;; (unless (or (assoc folder folder-alist) (assoc (concat folder (mew-imap-separator case)) folder-alist)) (message "\"%s\" does not exist. %s" case:folder (mew-substitute-for-summary "Type '\\[universal-argument]\\[mew-status-update]' to collect IMAP folders")) (setq case:folder nil))) ((mew-folder-nntpp folder) (unless (assoc folder (mew-nntp-folder-alist case)) (message "\"%s\" does not exist. %s" case:folder (mew-substitute-for-summary "Type '\\[universal-argument]\\[mew-status-update]' to collect newsgroups")) (setq case:folder nil)))) (when case:folder (when mew-use-other-frame-for-summary (if (setq buf (get-buffer case:folder)) (if (setq win (get-buffer-window buf 0)) (progn (setq frame (window-frame win)) (raise-frame frame) (select-frame frame) ;; Ensure, if possible, that frame gets input focus. (mew-focus-frame frame)) (select-frame (make-frame))) (select-frame (make-frame)))) (mew-summary-visit-folder case:folder goend))))) (defun mew-summary-visit-folder (folder &optional goend no-ls) (let ((dir (mew-expand-folder folder)) new-folder scanp) (cond ((mew-folder-virtualp folder) (if (get-buffer folder) (if (mew-virtual-thread-p folder) (if (mew-thread-cache-valid-p folder) (mew-summary-switch-to-folder folder) (message "%s is old" folder)) (mew-summary-switch-to-folder folder)) (message "No such virtual folder: %s" folder))) (t ;; local/remote folders (if (null dir) (message "Folder is wrong") (cond ((mew-folder-remotep (mew-case:folder-folder folder)) (unless (file-directory-p dir) (mew-make-directory dir)) (setq scanp t)) (t ;; +, ~, /, drive letter (if (file-directory-p dir) (setq scanp t) (message "No such folder %s" folder)))) (when scanp (if no-ls (progn (mew-summary-switch-to-folder folder) (if goend (goto-char (point-max))) (if (pos-visible-in-window-p (point-min)) (mew-summary-cook-window))) (setq new-folder (mew-summary-switch-to-folder folder)) (if (and (mew-summary-ls nil (or goend new-folder)) (pos-visible-in-window-p (point-min))) (mew-summary-cook-window))))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Going to a line ;;; (defun mew-summary-goto-line (&optional arg) "Jump to a line according to the number which you input. If 'mew-summary-goto-line-then-display' is non-nil, the message is then displayed." (interactive "P") (if arg (let ((msg (read-string "Message No.: " ""))) (while (not (string-match mew-regex-message-files3 msg)) (setq msg (read-string "Message No.: " ""))) (when (mew-summary-search-msg msg) (if mew-summary-goto-line-then-display (mew-summary-display)))) (let ((line (string-to-number (read-string "Line No.: " "")))) (when (/= line 0) (goto-char (point-min)) (forward-line (1- line)) (if mew-summary-goto-line-then-display (mew-summary-display)))))) (defun mew-summary-goto-original-message () "Go to the original message in the original Summary mode" (interactive) (cond ((mew-summary-p) (message "This is the original")) ((mew-virtual-p) (let ((folder (mew-folder-path-to-folder (mew-summary-folder-name) 'has-proto)) (msg (mew-summary-message-number))) (when folder (mew-summary-visit-folder folder nil 'no-ls) (if (mew-summary-search-msg msg) (mew-summary-display) (message "No original message found"))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Moving to Message mode ;;; (defun mew-summary-goto-msg-mode () "Go to Header mode." (interactive) (let (msgp) (with-current-buffer (window-buffer (next-window)) (if (mew-message-p) (setq msgp t))) (if msgp (other-window 1) (message "No Message mode displayed")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Moving to +draft ;;; (defun mew-max-draft-buffer () (let* ((draft-dir (file-name-as-directory mew-draft-folder)) (regex (mew-folder-regex draft-dir)) (bufs (mew-buffer-list regex)) (msgregex (format "\\([0-9]+\\)\\(%s\\)?$" mew-suffix)) nums n) (setq nums (mapcar (lambda (x) (string-match msgregex x) (string-to-number (mew-match-string 1 x))) bufs)) (dolist (num nums) (if (or (null n) (< n num)) (setq n num))) (and n (format "%s%d%s" draft-dir n (if mew-use-suffix mew-suffix ""))))) (defun mew-summary-jump-to-draft-buffer () "Jump to one of drafts if exists." (interactive) (let* ((draft (mew-max-draft-buffer)) buf) (if (null draft) (message "No draft buffer exists!") (setq buf (mew-input-draft-buffer draft)) (if (get-buffer buf) (switch-to-buffer buf) (message "No such draft buffer!"))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Moving to top and bottom ;;; (defun mew-summary-jump-top () "Go to the beginning of this Summary mode. If 'mew-summary-jump-top-then-display' is non-nil, the top message is then displayed." (interactive) (if mew-use-push-mark (mew-push-mark)) (goto-char (point-min)) (if mew-summary-jump-top-then-display (mew-summary-display))) (defun mew-summary-jump-bottom () "Go to the end of this Summary mode. If 'mew-summary-jump-bottom-then-display' is non-nil, the top message is then displayed." (interactive) (if mew-use-push-mark (mew-push-mark)) (goto-char (point-max)) (if (and (mew-summary-exclusive-p 'no-msg) (not (bobp)) (mew-sinfo-get-disp-msg)) (forward-line -1)) (if mew-summary-jump-bottom-then-display (mew-summary-display))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Moving to the marker ;;; (defun mew-summary-exchange-point () "\\Get back to the position before typing '\\[mew-summary-retrieve]' or '\\[mew-summary-ls]'." (interactive) (mew-summary-only (let ((pos (mew-sinfo-get-ret-pos))) (if pos (goto-char pos))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Searching ;;; (defun mew-summary-isearch-forward (&optional arg) "Incremental search forward in Message mode." (interactive "P") (let ((cwin (get-buffer-window (current-buffer))) (mwin (get-buffer-window (mew-buffer-message)))) (if (not mwin) (message "No message is displayed") (select-window mwin) (unwind-protect (progn (widen) (isearch-forward arg) (mew-message-narrow-to-page)) (select-window cwin))))) (defun mew-summary-isearch-backward (&optional arg) "Incremental search backward in Message mode." (interactive) (let ((cwin (get-buffer-window (current-buffer))) (mwin (get-buffer-window (mew-buffer-message)))) (if (not mwin) (message "No message is displayed") (select-window mwin) (unwind-protect (progn (widen) (isearch-backward arg) (mew-message-narrow-to-page)) (select-window cwin))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Pipe ;;; (defun mew-summary-pipe-message (prefix command) "Send the content of Message buffer to a command via pipe. If called with '\\[universal-argument]', the body of the message \(excluding its header) is sent." (interactive (list current-prefix-arg (read-string "Shell command on message: " mew-last-shell-command))) (mew-summary-display 'redisplay) (when (or (not mew-ask-pipe) (y-or-n-p "Send this message to pipe? ")) (with-current-buffer (mew-buffer-message) (save-restriction (widen) (if (string= command "") (setq command mew-last-shell-command)) (goto-char (point-min)) ; perhaps this line won't be necessary (if prefix (search-forward "\n\n")) (let ((max-mini-window-height 1)) (shell-command-on-region (point) (point-max) command nil)) (setq mew-last-shell-command command))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Print ;;; (defun mew-summary-print (&optional arg) "Print the content of Message mode according to 'mew-print-function'. If called with '\\[universal-argument]', you can specify a printer name." (interactive "P") (mew-summary-display 'redisplay) (let ((printer-name (if arg (read-string "Printer name: ") printer-name)) have-header str) (with-current-buffer (mew-buffer-message) (save-restriction (widen) (setq have-header (mew-msghdr-p)) (setq str (buffer-substring (point-min) (point-max))))) (when (y-or-n-p "Print this message? ") (with-temp-buffer (insert str) (if have-header (mew-header-delete-other-lines mew-field-for-printing)) (funcall mew-print-function))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Saving a message to a file with header decoded ;;; (defun mew-summary-store (&optional askcs) "Saving a buffer of Message mode to a file. If executed with '\\[universal-argument]', coding-system is asked." (interactive "P") (mew-summary-display 'redisplay) (let* ((file (mew-summary-input-file-name)) (doit (if (file-exists-p file) (if (y-or-n-p (format "File exists. Override it? ")) t nil) t))) (if (not doit) (message "Not saved") (let ((writecs (if askcs (read-coding-system "Coding-system: ") (default-value 'buffer-file-coding-system)))) (with-current-buffer (mew-buffer-message) (mew-frwlet mew-cs-dummy writecs ;; do not specify 'no-msg (write-region (point-min) (point-max) file))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; X-Face: ;;; (defun mew-summary-x-face () "Display xface." (interactive) (mew-summary-msg (let ((file (mew-make-temp-name)) xface) (with-current-buffer (mew-buffer-message) (setq xface (mew-header-get-value mew-x-face:))) (when xface (with-temp-buffer (insert xface) (mew-x-face-compface-to-xbm) (mew-frwlet mew-cs-dummy mew-cs-text-for-write (write-region (point-min) (point-max) file nil 'no-msg))) (mew-mime-image-ext file))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Calling a command ;;; (defun mew-summary-cmd-msg () "Executing an external command specifying this message as an argument." (interactive) (mew-summary-msg-or-part (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number)) (file (mew-expand-msg fld msg)) (cmd-args (mew-input-command)) (cmd (car cmd-args)) (args (nconc (cdr cmd-args) (list file)))) (message "Executing %s for %s..." cmd msg) (apply 'call-process cmd nil nil nil args) (message "Executing %s for %s...done" cmd msg)))) (defun mew-summary-cmd-msgs () "Executing an external command specifying messages marked with '*' as arguments." (interactive) (mew-summary-multi-msgs (let* ((cmd-args (mew-input-command)) (cmd (car cmd-args)) (args (nconc (cdr cmd-args) FILES))) (message "Executing %s ..." cmd) (apply 'call-process cmd nil nil nil args) (message "Executing %s ...done" cmd)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Citation ;;; (defun mew-summary-cite (&optional arg) "Cite this message to one of drafts." (interactive "P") (let ((draft (mew-max-draft-buffer)) buf) (if (null draft) (message "No draft buffer exists!") (setq buf (mew-input-draft-buffer draft)) (if (get-buffer buf) (with-current-buffer buf (mew-draft-cite arg)) (message "No such draft buffer!"))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Flushing the queue ;;; (defun mew-summary-send-message (&optional arg) "If in +queue, send the messages in +queue. If in +postq, post the messages in +postq. If in %queue, process the jobs in %queue. Otherwise, flush the default queue. If executed with '\\[universal-argument]', you can set the sending case." (interactive "P") (if (mew-folder-imap-queuep) (progn (mew-window-configure 'summary) (mew-imap-flush-queue)) (let* ((fld (mew-summary-folder-name 'ext)) (proto (mew-proto-to-flush fld)) qfld case) (if (or arg mew-ask-flush-case) (setq case (mew-input-case mew-case "Queue")) (setq case mew-case)) (if (or (mew-folder-queuep fld) (mew-folder-postqp fld)) (progn (setq qfld fld) (mew-window-configure 'summary)) (setq qfld (mew-proto-queue-folder proto case))) (if (and mew-ask-flush-queue (not (y-or-n-p (concat "Flush " qfld "? ")))) (message "The queue is not flushed") (cond ((mew-folder-postqp qfld) (mew-nntp2-flush-queue case qfld)) (t (mew-smtp-flush-queue case qfld))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Unlocking ;;; (defun mew-subprocess-init () (add-hook 'kill-emacs-hook 'mew-subprocess-kill)) (defun mew-subprocess-clean-up () (mew-summary-kill-subprocess t) (remove-hook 'kill-emacs-hook 'mew-subprocess-kil)) (defun mew-subprocess-kill () (mew-summary-kill-subprocess t)) (defun mew-summary-kill-subprocess (&optional kill-ssx) "\\ Kill a process in Summary mode. Sometime a process accidentally remains in Summary mode. In this situation, you cannot execute '\\[mew-summary-retrieve]', '\\[mew-summary-ls]', nor '\\[mew-summary-exec]'. Use this command to solve this problem. If called with '\\[universal-argument]', all SSH processes, if any, are killed." (interactive "P") (let ((process mew-summary-buffer-process) (disp-msg (mew-called-interactively-p)) pros sentinel) (if kill-ssx (progn (setq pros (process-list)) (dolist (pro pros) (if (string-match "mew" (process-name pro)) (delete-process pro))) (if disp-msg (message "All SSH/SSL/TLS processes were killed"))) (cond ((not (processp process)) ;; If you type "x" over SSH and type "C-g" to quit, ;; refile information remains invisible. ;; This command turns it visible. (mew-summary-visible-buffer (current-buffer)) (if disp-msg (message "No process to kill. This buffer is unlocked anyway"))) ((eq process t) ;; Emacs is locking (if disp-msg (message "This buffer was unlocked"))) ((memq (process-status process) '(open closed)) ;; Network process (setq sentinel (process-sentinel process)) (if (fboundp sentinel) (funcall sentinel process "killed by the user")) (delete-process process) (if disp-msg (message "The process was killed"))) (t ;; Local process or SSH/SSL/TLS (delete-process process) (if disp-msg (message "The process was killed"))))) (mew-summary-unlock))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; De-composing with the old style ;;; (defun mew-summary-unshar () "Apply 'unshar' on messages marked with '*'." (interactive) (mew-summary-multi-msgs (if (y-or-n-p (format "Execute %s for these messages? " mew-prog-unshar)) (let* ((default-directory (mew-summary-input-directory-name))) (message "Executing %s..." mew-prog-unshar) (apply 'call-process mew-prog-unshar nil nil nil FILES) (message "Executing %s...done" mew-prog-unshar))))) (defun mew-summary-uudecode () "Apply 'uudecode' on messages marked with '*'." (interactive) (mew-summary-multi-msgs (cond ((not (mew-which-exec mew-prog-mime-decode)) ()) ((not (y-or-n-p "Uudecode these messages? ")) ()) (t (let ((dir (mew-summary-input-directory-name)) (fn nil) (tmp (mew-make-temp-name)) (case-fold-search nil) (files FILES) start) (with-temp-buffer (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write (dolist (file files) (mew-erase-buffer) (mew-insert-file-contents file) (goto-char (point-min)) (if (re-search-forward mew-eoh nil t) (forward-line)) (setq start (point)) (goto-char (point-max)) (unless (bolp) (insert "\n")) (write-region start (point-max) tmp 'append 'no-msg))) (mew-erase-buffer) (cd dir) ;; mew-folder-local is dummy to let mewencode use ;; the embedded filename (call-process mew-prog-mime-decode tmp t nil "-d" "-u" "-" mew-folder-local) (mew-delete-file tmp) (goto-char (point-min)) (if (not (looking-at "^filename: \\(.*\\)")) (message "Failed to execute %s" mew-prog-mime-decode) (setq fn (mew-match-string 1)) (setq fn (mew-summary-prog-exec mew-prog-compress "-df" "Z" fn)) (setq fn (mew-summary-prog-exec mew-prog-gzip "-df" "gz" fn)) (when (and (string-match "^\\(.*\\)\\.tar$" fn) (y-or-n-p (format "Execute %s for %s? " mew-prog-tar fn))) (message "Executing %s for %s..." mew-prog-tar fn) (call-process mew-prog-tar nil nil nil "-xf" fn) (message "Executing %s for %s...done" mew-prog-tar fn))))))))) (defun mew-summary-prog-exec (prog opts suffix tarfile) (if (string-match (format "^\\(.*\\)\\.%s$" suffix) tarfile) (let ((basename (match-string 1 tarfile))) (if (not (y-or-n-p (format "Execute %s for %s? " prog tarfile))) tarfile (message "Executing %s for %s..." prog tarfile) (call-process prog nil nil nil opts tarfile) (message "Executing %s for %s...done" prog tarfile) basename)) tarfile)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; De-composing with the new style ;;; (defun mew-summary-join () "Concat Message/Partial fragments marked with '*' to an original message." (interactive) (mew-summary-only (mew-summary-with-mewl (mew-summary-multi-msgs (let ((cfld (mew-summary-folder-name)) (folder (mew-input-burst-folder)) (tfile (mew-make-temp-name)) (targets FLD-MSG-LIST) num ct med dbl vec len idx ttl TTL fid FID i beg regex) (message "Joining...") (with-temp-buffer (mew-set-buffer-multibyte t) (insert "CD: " (mew-expand-folder2 cfld) "\n") (let ((default-directory (mew-expand-folder cfld))) (dolist (fld-msg targets) (insert (mew-msg-get-filename (cdr fld-msg)) "\n"))) (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write (write-region (point-min) (point-max) tfile nil 'no-msg)) (mew-erase-buffer) (call-process mew-prog-mewl nil t nil "-b" mew-mail-path "-l" "0" "-x" mew-suffix "-i" tfile "-d" "content-type") (mew-delete-file tfile) (goto-char (point-min)) (while (not (eobp)) (if (not (looking-at "^\\([0-9]+\\)[ \t]*:[ \t]*")) (forward-line) (setq num (mew-match-string 1)) (setq med (match-end 0)) (forward-line) (mew-header-goto-next) (setq ct (mew-param-decode (mew-buffer-substring med (1- (point))))) (setq dbl (cons (cons num ct) dbl)))) (setq len (length dbl)) (setq vec (make-vector len nil)) (dolist (ent dbl) (setq num (car ent)) (setq ttl (mew-syntax-get-param ent "total")) (setq fid (mew-syntax-get-param ent "id")) (setq idx (mew-syntax-get-param ent "number")) (if TTL (if (and ttl (not (string= TTL ttl))) (error "total mismatch")) (setq TTL ttl)) (if FID (if (or (null fid) (not (string= FID fid))) (error "fragment id mismatch")) (setq FID fid)) (unless idx (error "no number")) (setq idx (1- (string-to-number idx))) (if (and (>= idx 0) (< idx len)) (aset vec idx num) (error "invalid number"))) (unless TTL (error "no total")) (dotimes (i len) (unless (stringp (aref vec i)) (error "Not enough fragments"))) ;; now reassemble (mew-erase-buffer) (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write ;; the first fragment (goto-char (point-max)) (save-restriction (narrow-to-region (point) (point)) (mew-insert-file-contents (mew-expand-msg cfld (aref vec 0))) ;; Removing unnecessary fields from the encapsulating ;; (outer) header. (goto-char (point-min)) (mew-header-delete-lines mew-field-delete-for-joining) ;; Concatenating the two headers. (goto-char (point-min)) (re-search-forward mew-eoh nil t) (setq beg (point)) (while (looking-at mew-eoh) (forward-line) (if (eobp) (error "invalid message (number 1)"))) (delete-region beg (point)) ;; Removing unnecessary fields from the encapsulated ;; (inner) header. (setq beg (point)) (when (re-search-forward mew-eoh nil t) (setq regex (mew-make-field-regex mew-field-delete-for-joining)) (save-restriction (narrow-to-region beg (point)) (goto-char (point-min)) (let ((case-fold-search t)) (while (not (eobp)) (if (looking-at regex) (setq beg nil) ;; logic is reversed (setq beg (point))) (forward-line) (mew-header-goto-next) (if beg (delete-region beg (point)))))))) ;; the second and subsequent fragments. (setq i 1) (while (< i len) (goto-char (point-max)) (save-restriction (narrow-to-region (point) (point)) (mew-insert-file-contents (mew-expand-msg cfld (aref vec i))) (goto-char (point-min)) (re-search-forward mew-eoh nil t) (forward-line) (if (eobp) (error "invalid message (number %d)" (1+ i))) (delete-region (point-min) (point))) (setq i (1+ i))) (mew-header-delete-lines `(,mew-x-mew-uidl:)) (write-region (point-min) (point-max) (mew-folder-new-message folder) nil 'no-msg))) (mew-touch-folder folder) (message "Joining...done") (when mew-ask-folder-after-join (if (y-or-n-p (format "Go to %s? " folder)) (mew-summary-visit-folder folder 'goend)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Cleaning +trash ;;; (defun mew-summary-clean-trash () "Remove all messages in +trash." (interactive) (let* ((case (mew-sinfo-get-case)) (folder (mew-sinfo-get-folder)) case:trash trash trashdir msgs) (cond ((mew-folder-imapp folder) (setq trash (mew-imap-trash-folder case))) (t (setq trash mew-trash-folder))) (unless trash (setq trash folder)) (setq case:trash (mew-input-folder case trash)) (if (null case:trash) (message "Nothing was processed") (setq case (mew-case:folder-case case:trash)) (setq trash (mew-case:folder-folder case:trash)) (setq trashdir (mew-expand-folder case:trash)) (setq msgs (mew-dir-messages trashdir)) (if (and (mew-folder-localp trash) (null msgs)) (message "No messages to be removed in %s" trash) (if (not (y-or-n-p (format "Remove all messages in %s? " case:trash))) (message "No messages removed in %s" trash) (if (string= folder trash) (mew-summary-reset)) (message "Removing all messages in %s..." case:trash) (when (get-buffer case:trash) (with-current-buffer case:trash (mew-summary-kill-subprocess))) (mew-summary-unlink-msgs case:trash msgs) (mew-summary-folder-cache-clean case:trash) (message "Removing all messages in %s...done" case:trash) (when (mew-folder-imapp trash) (if (get-buffer case:trash) (set-buffer case:trash) (mew-summary-switch-to-folder case:trash 'set-buffer)) (mew-imap-retrieve case 'exec case:trash (mew-make-execinfo :remove '("1:*") :rttl 0 :dttl -1)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Copy local ;;; (defun mew-summary-local-copy () "Copy a message to a local folder." (interactive) (mew-summary-msg-or-part (let ((fld (mew-summary-folder-name)) (exclusivep t) msg dstmsg dstfld file dstfile) (save-excursion (mew-summary-goto-message) (setq msg (mew-summary-message-number))) (setq file (mew-expand-msg fld msg)) (setq dstfld (mew-input-local-folder mew-inbox-folder)) (when (and dstfld (mew-local-folder-check dstfld 'ask)) (setq dstmsg (mew-folder-new-message dstfld 'numonly)) (setq dstfile (mew-expand-msg dstfld dstmsg)) (when (get-buffer dstfld) (set-buffer dstfld) (setq exclusivep (mew-summary-exclusive-p))) (cond ((not exclusivep) (message "Try again later")) ((string= file dstfile) (message "You cannot copy this onto itself")) (t (mew-summary-local-copy-one file dstfile) (mew-touch-folder dstfld) (message "Copied to %s/%s" dstfld dstmsg))))))) (defun mew-summary-mark-local-copy (&optional arg) "Copy messages marked with '*' to a local folder. If called with '\\[universal-argument]', only messages marked with '*' in the region are handled." (interactive "P") (mew-summary-not-in-draft (let ((mew-use-highlight-x-face nil) (fld (mew-summary-folder-name)) (exclusivep t) msgs file dstmsg dstfld dstfile beg end region total i) (if (mew-mark-active-p) (setq arg t)) (cond (arg (setq region (mew-summary-get-region)) (setq beg (car region)) (setq end (cdr region))) (t (setq beg (point-min)) (setq end (point-max)))) (setq dstfld (mew-input-local-folder mew-inbox-folder)) (when (and dstfld (mew-local-folder-check dstfld 'ask)) (let ((mew-use-suffix nil)) (setq dstmsg (mew-folder-new-message dstfld 'numonly))) (setq msgs (mew-summary-mark-collect mew-mark-review beg end)) (when (get-buffer dstfld) (with-current-buffer dstfld (setq exclusivep (mew-summary-exclusive-p)))) (cond ((null msgs) (message "No mark")) ((not exclusivep) (message "Try again later")) (t (message "Copying...") (setq total (length msgs)) (setq i 1) (dolist (msg msgs) (setq file (mew-expand-msg fld msg)) (setq dstfile (mew-expand-new-msg dstfld dstmsg)) (message "Copying (%d/%d)..." i total) (mew-summary-local-copy-one file dstfile) (setq dstmsg (number-to-string (1+ (string-to-number dstmsg)))) (setq i (1+ i))) (mew-touch-folder dstfld) (message "Copying...done"))))))) (defun mew-summary-local-copy-one (srcfile dstfile) (with-temp-buffer (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write (mew-insert-file-contents srcfile) (goto-char (point-min)) (mew-header-delete-lines (list mew-x-mew-uidl:)) (write-region (point-min) (point-max) dstfile nil 'no-msg) (mew-set-file-modes dstfile)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Deleting and moving a folder ;;; (defun mew-summary-delete-folder () "Delete this folder." (interactive) (mew-summary-only (let* ((folder (or (mew-sinfo-get-folder) (mew-summary-folder-name 'ext))) (case (mew-sinfo-get-case)) (case:folder (mew-summary-folder-name 'ext)) (dir (mew-expand-folder case:folder)) (buf (current-buffer))) (cond ((mew-folder-localp folder) (if (mew-folder-node-p folder) (message "%s cannot be deleted" folder) (when (y-or-n-p "Delete this folder? ") (mew-delete-directory-recursively dir) (mew-local-folder-delete folder) (run-hook-with-args 'mew-summary-delete-folder-hook folder) (mew-summary-visit-folder mew-inbox-folder) (mew-kill-buffer buf)))) ((mew-folder-imapp folder) (if (mew-folder-node-p folder case) (message "%s cannot be deleted" folder) (when (y-or-n-p "Delete this folder? ") (setq mew-summary-buffer-process-error nil) (mew-imap-retrieve case 'delete case:folder) (mew-timing) (mew-rendezvous mew-summary-buffer-process) (if mew-summary-buffer-process-error (progn (message "%s cannot be deleted" folder) (setq mew-summary-buffer-process-error nil)) (mew-imap-folder-delete case folder) (mew-delete-directory-recursively dir) ;; cache (run-hook-with-args 'mew-summary-delete-folder-hook case:folder) (mew-summary-visit-folder mew-imap-inbox-folder) (mew-kill-buffer buf))))))))) (defun mew-summary-rename-folder () "Rename this folder." (interactive) (mew-summary-only (let* ((folder (or (mew-sinfo-get-folder) (mew-summary-folder-name 'ext))) (case (mew-sinfo-get-case)) (case:folder (mew-summary-folder-name 'ext)) (dir (mew-expand-folder case:folder)) (buf (current-buffer)) new-folder new-dir case:new-folder) (cond ((mew-folder-localp folder) (setq new-folder (mew-input-local-folder folder)) (setq new-dir (mew-expand-folder new-folder)) (cond ((string= folder new-folder) (message "%s was not moved" folder)) ((file-exists-p new-dir) (message "%s was not moved since %s exists" folder new-folder)) (t (mew-rename-directory dir new-dir) (mew-summary-switch-to-folder new-folder) (mew-kill-buffer buf) (if (mew-folder-node-p folder) ;; xxx remove all related buffer? (mew-local-update 'force) (mew-local-folder-delete folder) (mew-local-folder-insert new-folder)) (run-hook-with-args 'mew-summary-rename-folder-hook folder new-folder)))) ((mew-folder-imapp folder) (setq new-folder (car (mew-input-refile-folders (list folder) t case mew-folder-imap))) (setq case:new-folder (mew-case-folder case new-folder)) (setq new-dir (mew-expand-folder case:new-folder)) (cond ((string= folder new-folder) (message "%s was not moved" folder)) ((file-exists-p new-dir) (message "%s was not moved since %s exists" folder new-folder)) (t (mew-imap-retrieve case 'rename case:folder case:new-folder) (mew-timing) (mew-rendezvous mew-summary-buffer-process) (if mew-summary-buffer-process-error (progn (message "%s cannot be renamed" folder) (setq mew-summary-buffer-process-error nil)) (rename-file dir new-dir t) ;; cache (mew-summary-switch-to-folder case:new-folder) (mew-kill-buffer buf) (if (mew-folder-node-p folder case) (if (y-or-n-p "Collect folders now? ") (mew-imap-update case) (mew-message-for-summary "Type '\\[universal-argument]\\[mew-status-update]' to collect folders")) (mew-imap-folder-delete case folder) (mew-imap-folder-insert case new-folder)) (run-hook-with-args 'mew-summary-rename-folder-hook case:folder case:new-folder))))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Toggle ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Summary only vs Summary/Message ;;; (defun mew-summary-toggle-disp-msg (&optional arg) "Toggle 'Summary mode only' and 'Summary & Message mode'. If you choose 'Summary mode only', you can quickly put the delete marks since the next message is not displayed." (interactive) (cond ((eq arg 'on) (mew-sinfo-set-disp-msg t)) ((eq arg 'off) (mew-sinfo-set-disp-msg nil) (mew-summary-reset-mode-line)) (t (mew-sinfo-set-disp-msg (not (mew-sinfo-get-disp-msg))) (if (mew-sinfo-get-disp-msg) (mew-summary-display 'redisplay) (mew-summary-goto-message) (mew-summary-reset) (mew-summary-cook-window)))) (run-hooks 'mew-summary-toggle-disp-msg-hook)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; 8bit clean ;;; (defun mew-summary-toggle-8bit () "Toggle 8bit mode(i.e. 'mew-use-8bit')." (interactive) (setq mew-use-8bit (not mew-use-8bit)) (if mew-use-8bit (message "mew-use-8bit has been set to 't'") (message "mew-use-8bit has been set to 'nil'"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Mew cache clean up ;;; (defun mew-summary-cache-clean-up () "Clean-up caches of analyzed messages." (interactive) (mew-cache-clean-up) (message "Mew cache clean up...done")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Toggle warning ;;; (defun mew-summary-toggle-warning () "Toggle warning level. If 'mew-warning-field-level' is 2, set it to 1. If 'mew-warning-field-level' is 1, set it to 2." (interactive) (if (= mew-warning-field-level 2) (setq mew-warning-field-level 1) (setq mew-warning-field-level 2)) (mew-cache-clean-up) (mew-summary-analyze-again) (message "Mew warning level %d" mew-warning-field-level)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Toggle decode policy ;;; (defun mew-summary-toggle-policy (&optional arg) "Toggle decode policy(i.e. 'mew-decode-broken')." (interactive "P") (if arg (setq mew-decode-broken nil mew-use-name-parameter nil) (setq mew-decode-broken (not mew-decode-broken)) (setq mew-use-name-parameter (not mew-use-name-parameter))) (mew-cache-clean-up) (mew-summary-analyze-again) (message "Mew \"%s\" mode" (if mew-decode-broken "TOLERANT" "STRICT"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Toggle debug ;;; (defun mew-summary-toggle-debug () "Toggle 'mew-debug'." (interactive) (setq mew-debug (not mew-debug)) (if mew-debug (message "'mew-debug' is now 't'") (message "'mew-debug' is now 'nil'"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Toggle PGP/MIME and old PGP ;;; (defun mew-summary-toggle-pgp () "Toggle PGP/MIME and old PGP (i.e. 'mew-use-old-pgp')." (interactive) (setq mew-use-old-pgp (not mew-use-old-pgp)) (if mew-use-old-pgp (message "mew-use-old-pgp has been set to 't'") (message "mew-use-old-pgp has been set to 'nil'"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Learning spam and ham ;;; (defun mew-summary-learn-spam () "Learn that this message is a spam. See also 'mew-spam-prog' and 'mew-spam-prog-args." (interactive) (mew-summary-msg (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number)) (file (mew-expand-msg fld msg)) (case (mew-sinfo-get-case)) (prog (mew-spam-prog case)) (args (mew-spam-prog-args case)) beg end) (message "Learning as spam...") (when (mew-which-exec prog) (with-temp-buffer (apply 'call-process prog file (current-buffer) nil args) (setq beg (point-min)) (goto-char beg) (forward-line) (if (= (point) beg) (message "Learning as spam...done") (setq end (1- (point))) (message "%s" (concat "Learned as spam: " (mew-buffer-substring beg end))))))))) (defun mew-summary-learn-ham () "Learn that this message is a ham. See also 'mew-ham-prog' and 'mew-ham-prog-args." (interactive) (mew-summary-msg (let* ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number)) (file (mew-expand-msg fld msg)) (case (mew-sinfo-get-case)) (prog (mew-ham-prog case)) (args (mew-ham-prog-args case)) beg end) (message "Learning as ham...") (when (mew-which-exec prog) (with-temp-buffer (apply 'call-process prog file (current-buffer) nil args) (setq beg (point-min)) (goto-char beg) (forward-line) (if (= (point) beg) (message "Learning as ham...done") (setq end (1- (point))) (message "%s" (concat "Learned as ham: " (mew-buffer-substring beg end))))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Search invisible ;;; (defun mew-summary-toggle-invisible () "Toggle the value of search-invisible. Invisible information in Summary mode cannot be searched by default. Executing this command enables searching such information." (interactive) (if (eq search-invisible t) (setq search-invisible 'open) (setq search-invisible t)) (message "'search-invisible' is set to '%s'" search-invisible)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Lines ;;; (defun mew-summary-line () "Toggle normal lines, wrapped lines and long lines." (interactive) (let ((fld (mew-summary-folder-name)) (msg (mew-summary-message-number)) (cwin (get-buffer-window (current-buffer))) (mwin (get-buffer-window (mew-buffer-message)))) (if (not mwin) (message "No message is displayed") (select-window mwin) (unwind-protect (progn (mew-message-line) (mew-message-mode-line fld msg)) (select-window cwin))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Horizontal Scrolling ;;; (defun mew-summary-scroll-left () "Scroll the Message window to the right." (interactive) (let ((cwin (get-buffer-window (current-buffer))) (mwin (get-buffer-window (mew-buffer-message)))) (if (not mwin) (message "No message is displayed") (select-window mwin) (unwind-protect (mew-message-scroll-left) (select-window cwin))))) (defun mew-summary-scroll-right () "Scroll the Message window to the left." (interactive) (let ((cwin (get-buffer-window (current-buffer))) (mwin (get-buffer-window (mew-buffer-message)))) (if (not mwin) (message "No message is displayed") (select-window mwin) (unwind-protect (mew-message-scroll-right) (select-window cwin))))) (provide 'mew-summary4) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-summary4.el ends here kazu-yamamoto-Mew-ff9c41b/mew-syntax.el000066400000000000000000000771131256455547000202220ustar00rootroot00000000000000;;; mew-syntax.el --- Internal syntax for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; mew-encode-syntax ;; ;; = [ 'single file (dcr) () (CT:) CTE: CD: nil (CDP:) ] ;; = [ 'multi dir/ (dcr) () ("mul") CTE: CD: nil (CDP:) 1* ] ;; = | ;; = list of (mew-ct-mls mew-ct-pgs) ;; ;; mew-decode-syntax ;; ;; = [ 'message hbeg hend () ("msg") CTE: CD: CID: (CDP:) ] ;; = [ 'single beg end () (CT:) CTE: CD: CID: (CDP:) ] ;; = [ 'multi beg end () ("mul") CTE: CD: CID: (CDP:) 1* ] ;; = | Text/Plain ;; = | | ;; = list of (mew-ct-mls mew-ct-pgs RESULT) in reverse order ;; for cons ;; ;; ;; (defun mew-syntax-singlepart-p (syntax) (eq (aref syntax 0) 'single)) (defun mew-syntax-multipart-p (syntax) (eq (aref syntax 0) 'multi)) (defun mew-syntax-message-p (syntax) (eq (aref syntax 0) 'message)) ;; ;; ;; (defun mew-syntax-get-key (syntax) (aref syntax 0)) (defun mew-syntax-get-begin (syntax) (let ((beg (aref syntax 1))) (if (listp beg) (car beg) beg))) (defun mew-syntax-get-begin2 (syntax) (let ((beg (aref syntax 1))) (if (listp beg) (cdr beg) beg))) (defun mew-syntax-get-end (syntax) (aref syntax 2)) (defun mew-syntax-get-privacy (syntax) (aref syntax 3)) (defun mew-syntax-get-ct (syntax) (aref syntax 4)) (defun mew-syntax-get-cte (syntax) (aref syntax 5)) (defun mew-syntax-get-cd (syntax) (aref syntax 6)) (defun mew-syntax-get-cid (syntax) (aref syntax 7)) (defun mew-syntax-get-cdp (syntax) (aref syntax 8)) (defun mew-syntax-get-part (syntax) (aref syntax 9)) (defun mew-syntax-set-key (syntax key) (aset syntax 0 key)) (defun mew-syntax-set-begin (syntax begin) (aset syntax 1 begin)) (defun mew-syntax-set-end (syntax end) (aset syntax 2 end)) (defun mew-syntax-set-privacy (syntax privacy) (aset syntax 3 privacy)) (defun mew-syntax-set-ct (syntax ct) (aset syntax 4 ct)) (defun mew-syntax-set-cte (syntax cte) (aset syntax 5 cte)) (defun mew-syntax-set-cd (syntax cd) (aset syntax 6 cd)) (defun mew-syntax-set-cid (syntax cid) (aset syntax 7 cid)) (defun mew-syntax-set-cdp (syntax cdp) (aset syntax 8 cdp)) (defun mew-syntax-set-part (syntax part) (aset syntax 9 part)) ;; alias for encode syntax (defun mew-syntax-get-file (syntax) (aref syntax 1)) (defun mew-syntax-set-file (syntax file) (aset syntax 1 file)) (defun mew-syntax-get-decrypters (syntax) (aref syntax 2)) (defun mew-syntax-set-decrypters (syntax decrypters) (aset syntax 2 decrypters)) ;; for content parameters (defun mew-syntax-get-value (ctl &optional capitalizep) (if capitalizep (mew-capitalize (car ctl)) (car ctl))) (defun mew-syntax-get-params (ctl) (cdr ctl)) ;; ctl = (value (pname pvalue) (pname pvalue) ...) ;; ctl = ((pname pvalue) (pname pvalue) ...) (defun mew-syntax-get-param (ctl member) (nth 1 (assoc member ctl))) (defun mew-syntax-treat-filename-default-function (file) (if (stringp file) (mew-replace-white-space (mew-chop (file-name-nondirectory file))))) (defun mew-syntax-get-filename (cdpl &optional ctl) (let ((file (mew-syntax-get-param cdpl "filename"))) ;; for broken MUAs (if (and (null file) mew-use-name-parameter ctl) (setq file (mew-syntax-get-param ctl "name"))) (if mew-syntax-treat-filename-function (setq file (funcall mew-syntax-treat-filename-function file))) file)) ;; need to setq (defun mew-syntax-cat (syntax part) (vconcat syntax (vector part))) (defun mew-syntax-cdp-format (ct file &optional cdp force-file) ;; If cdp is a string, it is used as a file. (let* ((cdpdb (mew-cdpdb-by-ct ct)) (val (mew-cdpdb-val cdpdb)) (filep (mew-cdpdb-file cdpdb))) (if (stringp cdp) (setq file cdp)) (when val (if (and (or filep force-file) file) (list val (list "filename" (file-name-nondirectory (mew-header-sanity-check-string file)))) (list val))))) ;; Encryption (defun mew-syntax-encrypted-p (syntax) (catch 'loop (dolist (ent (mew-syntax-get-privacy (mew-syntax-get-part syntax))) (if (or (mew-case-equal (mew-privacy-dinfo-get-ct ent) mew-ct-mle) (mew-case-equal (mew-privacy-dinfo-get-proto ent) mew-ct-smm-enc)) (throw 'loop t))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Entry functions ;; (defun mew-syntax-get-entry (syntax nums) (cond ((null nums) syntax) ;; single & message match ((mew-syntax-message-p syntax) (let ((body (mew-syntax-get-part syntax))) (if (mew-syntax-multipart-p body) (mew-syntax-get-entry (mew-syntax-get-part syntax) nums) ;; nums should be "1" body))) ((mew-syntax-multipart-p syntax) (if (null nums) syntax (mew-syntax-get-entry (aref syntax (+ mew-syntax-magic (1- (car nums)))) (cdr nums)))))) (defun mew-syntax-insert-entry (syntax nums entry) (let* ((root syntax) (child entry) grand parent (nl (length nums)) (rev (reverse nums)) (n0 (nth 0 rev)) (n1 (nth 1 rev)) (ns (reverse (nthcdr 2 rev)))) (cond ((= nl 1) (setq parent root) (mew-syntax-add-entry parent n0 child)) (t (if (= nl 2) (setq grand root) (setq grand (mew-syntax-get-entry root ns))) (setq parent (mew-syntax-get-entry grand (list n1))) (setq parent (mew-syntax-add-entry parent n0 child)) (aset grand (+ mew-syntax-magic (1- n1)) parent) root)))) (defun mew-syntax-add-entry (syntax n entry) "Must not use in functions other than mew-syntax-insert-entry" (let* ((len (1+ (length syntax))) (vec (make-vector len nil)) (cnt 0) (thr (+ mew-syntax-magic (1- n)))) (while (< cnt thr) (aset vec cnt (aref syntax cnt)) (setq cnt (1+ cnt))) (aset vec cnt entry) (setq cnt (1+ cnt)) (while (< cnt len) (aset vec cnt (aref syntax (1- cnt))) (setq cnt (1+ cnt))) vec)) ;; return value (defun mew-syntax-remove-entry (syntax nums) (let* ((root syntax) grand parent (nl (length nums)) (rev (reverse nums)) (n0 (nth 0 rev)) (n1 (nth 1 rev)) (ns (reverse (nthcdr 2 rev)))) (cond ((= nl 1) (setq parent root) (mew-syntax-cut-entry parent n0)) (t (if (= nl 2) (setq grand root) (setq grand (mew-syntax-get-entry root ns))) (setq parent (mew-syntax-get-entry grand (list n1))) (setq parent (mew-syntax-cut-entry parent n0)) (aset grand (+ mew-syntax-magic (1- n1)) parent) root)))) (defun mew-syntax-cut-entry (syntax n) "Must not use in functions other than mew-syntax-remove-entry" (let* ((len (1- (length syntax))) (vec (make-vector len nil)) (cnt 0) (thr (+ mew-syntax-magic (1- n)))) (while (< cnt thr) (aset vec cnt (aref syntax cnt)) (setq cnt (1+ cnt))) (while (< cnt len) (aset vec cnt (aref syntax (1+ cnt))) (setq cnt (1+ cnt))) vec)) ;; return value (defun mew-syntax-get-entry-by-cid (syntax cid) (cond ((and (stringp (mew-syntax-get-cid syntax)) (string= (mew-syntax-get-cid syntax) cid)) syntax) ((mew-syntax-message-p syntax) (mew-syntax-get-entry-by-cid (mew-syntax-get-part syntax) cid)) ((mew-syntax-multipart-p syntax) (let ((i mew-syntax-magic) (len (length syntax)) entry) (catch 'multi (while (< i len) ;; xxx aref (see mew-summary-burst-body) (setq entry (mew-syntax-get-entry-by-cid (aref syntax i) cid)) (if entry (throw 'multi entry)) (setq i (1+ i)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; ;; (defun mew-summary-goto-part (msg part) (let (here) (save-excursion (goto-char (point-min)) (when (and (re-search-forward (mew-regex-sumsyn-msg msg) nil t) (re-search-forward (mew-regex-jmp-part part) nil t)) (beginning-of-line) (setq here (point)))) (and here (goto-char here)))) (defun mew-summary-goto-message () (if (eobp) (forward-line -1)) (when (mew-in-decode-syntax-p) (goto-char (mew-decode-syntax-begin)) (forward-line -1)) (beginning-of-line)) (defun mew-syntax-number () (if (or (mew-in-attach-p) (mew-in-decode-syntax-p)) (save-excursion (beginning-of-line) (if (looking-at mew-regex-part) (mew-sumsyn-part))))) (defun mew-syntax-number-to-nums (strnum) (if strnum (mapcar 'string-to-number (mew-split strnum ?.)) nil)) (defun mew-syntax-nums () (mew-syntax-number-to-nums (mew-syntax-number))) (defun mew-summary-goto-mark () (beginning-of-line)) (defun mew-summary-goto-body (&optional after) (when mew-summary-form-body-starter (beginning-of-line) (let ((beg (point))) (forward-line) (if (search-backward "\r" nil t) (if (search-backward mew-summary-form-body-starter beg t) (progn (if after (goto-char (match-end 0))) t) nil) (forward-line -1) ;; just in case nil)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Summary mode syntax ;;; (defvar mew-use-cut-file-name t) (defun mew-summary-info (arg) "Display the folder name of this message, its number, its size and its unique id. If this is a cache message, both the unique id and the size are also shown. If called with '\\[universal-argument]', its Message-ID: and its parent's Message-ID: are displayed instead. If 'mew-use-cut-file-name' is non-nil, the file path is pushed to the cut buffer of your window system." (interactive "P") (mew-summary-msg (when (mew-sumsyn-match mew-regex-sumsyn-long) (if arg (message "my-id=%s par-id=%s" (mew-sumsyn-my-id) (mew-sumsyn-parent-id)) (let* ((fld (mew-sumsyn-folder-name)) (msg (mew-sumsyn-message-number)) (size (mew-sumsyn-message-size)) (uid (mew-sumsyn-message-uid)) (file (concat (file-name-as-directory fld) msg)) (path (mew-expand-folder file)) (rpath (mew-msg-get-filename path))) (if (mew-virtual-p) (setq file (mew-folder-path-to-folder file 'has-proto))) (message "%s size=%s uid=%s" file size uid) (when mew-use-cut-file-name (kill-new rpath))))))) (defun mew-sumsyn-match (regex) (save-excursion (beginning-of-line) (let ((start (point))) (end-of-line) (when (search-backward "\r" start t) (looking-at regex))))) (defun mew-sumsyn-folder-name () (let ((fn (mew-match-string 1)) (bn (buffer-name))) (cond ((not (string= fn "")) (mew-sumsym-decode-folder fn)) ((mew-virtual-for-one-summary) (mew-vinfo-get-physical-folder)) (t bn)))) (defun mew-sumsyn-message-number () (mew-match-string 2)) (defun mew-sumsyn-my-id () (mew-match-string 3)) (defun mew-sumsyn-parent-id () (mew-match-string 4)) (defun mew-sumsyn-message-uid () (mew-match-string 5)) (defun mew-sumsyn-message-size () (mew-match-string 6)) (defun mew-sumsyn-part () (mew-match-string 1)) (defun mew-summary-folder-name (&optional ext) (cond ((or ext (mew-summary-p)) (buffer-name)) (t ;; Virtual mode (save-excursion (mew-summary-goto-message) (when (mew-sumsyn-match mew-regex-sumsyn-short) (mew-sumsyn-folder-name)))))) (defun mew-summary-message-number () (unless (mew-in-decode-syntax-p) (when (mew-sumsyn-match mew-regex-sumsyn-short) (mew-sumsyn-message-number)))) (defun mew-summary-message-number2 () (save-excursion (mew-summary-goto-message) (when (mew-sumsyn-match mew-regex-sumsyn-short) (mew-sumsyn-message-number)))) (defun mew-summary-my-id () (when (mew-sumsyn-match mew-regex-sumsyn-long) (mew-sumsyn-my-id))) (defun mew-summary-parent-id () (when (mew-sumsyn-match mew-regex-sumsyn-long) (mew-sumsyn-parent-id))) (defun mew-summary-message-uid () (when (mew-sumsyn-match mew-regex-sumsyn-long) (mew-sumsyn-message-uid))) (defun mew-summary-message-size () (when (mew-sumsyn-match mew-regex-sumsyn-long) (mew-sumsyn-message-size))) (defun mew-syntax-change-message-number (msg) (save-excursion (when (mew-sumsyn-match mew-regex-sumsyn-short) (mew-syntax-change-message-number2 msg)))) ;; see also mew-sumsyn-message-number (defun mew-syntax-change-message-number2 (msg) (delete-region (match-beginning 2) (match-end 2)) (goto-char (match-beginning 2)) (insert-and-inherit msg)) (defun mew-syntax-change-parent-id (id) (save-excursion (when (mew-sumsyn-match mew-regex-sumsyn-long) (delete-region (match-beginning 4) (match-end 4)) (goto-char (match-beginning 4)) (insert-and-inherit id)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; mew-encode-syntax ;; (defun mew-encode-syntax-single (file &optional ctl cte cd cid cdp privacy decrypters) ;; cid is just for beauty ;; if cdp is non-nil, set cdp from file. ;; if cdp is a string, set cdp from cdp as a file. (let* (ct ctdb) (cond (ctl (setq ct (car ctl)) (setq ctdb (mew-ctdb-by-ct ct))) (t (setq ctdb (mew-ctdb-by-file file)) (setq ct (mew-ctdb-ct ctdb)) (unless ct (setq ct (mew-content-type (mew-tinfo-get-case))) (setq ctdb (mew-ctdb-by-ct ct))) (setq ctl (list ct)))) (or cte (setq cte (mew-ctdb-cte ctdb))) (if cdp (setq cdp (mew-syntax-cdp-format ct file cdp))) (vconcat [single] (list file decrypters privacy ctl cte cd cid cdp)))) (defun mew-encode-syntax-multi (dir ct) (unless (string-match (concat mew-path-separator "$") dir) (setq dir (file-name-as-directory dir))) (vconcat [multi] (list dir) [nil nil] (list ct) [nil nil nil nil])) (defun mew-encode-syntax-text () (mew-encode-syntax-single mew-draft-coverpage (list mew-ct-txt))) (defun mew-encode-syntax-initial (dir) (vconcat (mew-encode-syntax-multi dir mew-type-mlm) ;; ensure to guess charset .... (list (mew-encode-syntax-text)))) (defun mew-encode-syntax-initial-multi (dir n) (let ((i 1) file ret) (while (<= i n) (setq file (mew-msg-new-filename (number-to-string i))) (setq ret (vconcat ret (list (mew-encode-syntax-single file nil nil nil nil 'cdp)))) (setq i (1+ i))) (vconcat (mew-encode-syntax-multi dir mew-type-mlm) (list (mew-encode-syntax-single mew-draft-coverpage (list mew-ct-txt))) ret))) (defconst mew-encode-syntax-dot [nil "." nil nil ("") nil nil nil nil]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; mew-decode-syntax ;; ;; MUST generate a new vector (defun mew-decode-syntax-rfc822 (&optional msg-head multi) ;; msg-head may include CD: (unless msg-head (setq msg-head (mew-decode-syntax-rfc822-head t))) (if (not multi) (vconcat msg-head (vector (mew-decode-syntax-text))) (let ((body (mew-decode-syntax-text)) (head (mew-decode-syntax-multi-head))) (mew-syntax-set-begin head (mew-syntax-get-begin body)) (mew-syntax-set-end head (mew-syntax-get-end body)) (vconcat msg-head (vector (mew-syntax-cat head body)))))) (defun mew-decode-syntax-rfc822-head (&optional reg-hend) (vector 'message (point-min) (and reg-hend (save-excursion (forward-line -1) (beginning-of-line) (point))) nil mew-type-msg nil nil nil nil)) (defun mew-decode-syntax-text () (vector 'single (point) (point-max) nil mew-type-txt nil nil nil nil)) (defun mew-decode-syntax-multi-head () (vector 'multi nil nil nil mew-type-mlm nil nil nil nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; syntax printer ;; (defconst mew-draft-attach-boundary-beg "------------------------------ attachments ------------------------------") (defconst mew-draft-attach-boundary-end "--------0-1-2-3-4-5-6-7-8-9----------------------------------------------") (defun mew-encode-syntax-delete (&optional all) (mew-elet (let (end) (goto-char (point-max)) (when (re-search-backward mew-regex-attach-end nil t) (setq end (point)) (when (re-search-backward mew-regex-attach-beg nil t) (cond (all (beginning-of-line) (backward-char) (delete-region (point) (point-max))) (t (forward-line) (delete-region (point) end)))))))) (defun mew-encode-syntax-print (syntax) (mew-elet (let ((nums (mew-syntax-nums))) (when (mew-attach-p) (mew-encode-syntax-delete) (mew-xinfo-set-multi-form nil) (mew-xinfo-set-icon-spec nil) (mew-syntax-multipart syntax nil nil 'mew-draft-button) (mapc 'insert-and-inherit (nreverse (mew-xinfo-get-multi-form))) (put-text-property (mew-attach-begin) (point-max) 'read-only t) (mew-front-nonsticky (mew-attach-begin) (1+ (mew-attach-begin))) (mew-rear-sticky (1- (point-max)) (point-max)) (mew-attach-goto-number 'here nums))))) ;; ;; ;; (defun mew-decode-syntax-insert (line) (let ((beg (point))) (insert line) (when (and mew-use-highlight-mouse-line window-system) (put-text-property beg (1- (point)) 'mouse-face mew-highlight-mouse-line-face)))) (defun mew-decode-syntax-print (sumbuf syntax form icon) (let* ((stx (mew-syntax-get-part syntax))) (with-current-buffer sumbuf (when (mew-syntax-multipart-p stx) (forward-line) (mew-elet (let ((pos (point))) (mew-decode-syntax-begin-set) (mapc 'mew-decode-syntax-insert form) (if (= pos (point)) ;; Nothing was printed. (mew-decode-syntax-remove) (mew-decode-syntax-end-set))) (forward-line -1) (mew-summary-goto-message) (set-buffer-modified-p nil)))))) ;; ;; ;; (defun mew-decode-syntax-clear () (mew-xinfo-clear)) (defun mew-decode-syntax-copy (cache) (setq mew-decode-syntax (mew-cache-decode-syntax cache)) (mew-xinfo-copy cache)) (defun mew-decode-syntax-set () ;; cache buffer (let ((part (mew-syntax-get-part mew-decode-syntax))) (mew-decode-syntax-arrange-warning) (if (mew-syntax-multipart-p part) (progn (mew-syntax-multipart part 'decoding nil 'mew-summary-button 'body) (mew-xinfo-set-multi-form (nreverse (mew-xinfo-get-multi-form))) (mew-xinfo-set-icon-spec (nreverse (mew-xinfo-get-icon-spec)))) (mew-decode-syntax-set-privacy part "body")))) (defun mew-syntax-multipart (syntax dec part func &optional body) (let* ((ct (mew-syntax-get-value (mew-syntax-get-ct syntax) 'cap)) (cnt mew-syntax-magic) (num 1) (len (length syntax)) (mew-inherit-alt (string= mew-ct-mla ct)) strpart subsyntax) ;; multipart itself is displayed only when encoding. (if dec (mew-decode-syntax-set-privacy syntax (concat (if part (concat part " ")) (if body "body ") "multi")) (mew-syntax-format syntax part dec)) (while (< cnt len) (if part (setq strpart (concat part "." (number-to-string num))) (setq strpart (number-to-string num))) (setq subsyntax (aref syntax cnt)) (cond ((mew-syntax-multipart-p subsyntax) (mew-syntax-multipart subsyntax dec strpart func nil)) ((mew-syntax-message-p subsyntax) (mew-syntax-message subsyntax dec strpart func)) ((mew-syntax-singlepart-p subsyntax) (mew-syntax-singlepart subsyntax dec strpart func (and body (= cnt mew-syntax-magic))))) (setq cnt (1+ cnt)) (setq num (1+ num))) (unless dec (if part (setq part (concat part "." (number-to-string num))) (setq part (number-to-string num))) (mew-syntax-format mew-encode-syntax-dot part dec)))) (defun mew-syntax-singlepart (syntax dec part func first) ;; part is valid only when called by mew-syntax-multipart. (let ((ct (mew-syntax-get-value (mew-syntax-get-ct syntax) 'cap))) ;; see also mew-mime-message/rfc822. (if (and dec ;; the first singlepart in multipart under message if t ;; the first singlepart under message if 'body first ;; CT: is text/plain but not attached file. mew-use-text-body (mew-ct-textp ct)) () ;; skip displaying. ;; reach here only when called by mew-syntax-multipart. (mew-syntax-format syntax part dec)) (if dec (mew-decode-syntax-set-privacy syntax (if (eq first 'body) (if part (concat part " body") "body") part))))) (defun mew-syntax-message (syntax dec part func) (let ((subsyntax (mew-syntax-get-part syntax))) (mew-syntax-format syntax part dec) (if dec (mew-decode-syntax-set-privacy syntax (format "%s message" part))) (cond ((mew-syntax-multipart-p subsyntax) (mew-syntax-multipart subsyntax dec part func 'body)) ((mew-syntax-message-p subsyntax) ) ;; never happens ((mew-syntax-singlepart-p subsyntax) ;; text/plain only (mew-syntax-singlepart subsyntax dec part func 'body))))) ;012345678901234567890123456789012345678901234567890123456789012345678901234567 ;<4>snss<27-2 >ss<24+2 >ss<16 > (defun mew-syntax-format (syntax number dec) (let* ((file (if (not dec) (mew-syntax-get-file syntax))) (ctl (mew-syntax-get-ct syntax)) (ct (mew-syntax-get-value ctl 'cap)) (char (mew-syntax-get-param ctl "charset")) (ichar (mew-syntax-get-param ctl "icharset")) (cte (mew-syntax-get-cte syntax)) ;; cte may be nil (cd (mew-syntax-get-cd syntax)) (cdpl (mew-syntax-get-cdp syntax)) (filename (mew-syntax-get-filename cdpl ctl)) (decrypters-list (mew-syntax-get-decrypters syntax)) (decrypters (and (not dec) decrypters-list (mew-join "," decrypters-list))) (cd-or-dec cd) (privacy (mew-syntax-get-privacy syntax)) (space " ") (LT (- (max mew-window-magic (window-width)) 2)) (ln (length number)) (lm 4) (lt 27) (ld (* (/ (- LT lm lt) 5) 3)) (lf (- LT lm ln lt ld 8)) (marks (make-string lm mew-sp)) (i 0) (N (length privacy)) ctm ctp) (run-hooks 'mew-syntax-format-hook) (if (mew-ct-textp ct) (if char (setq ct (concat ct "(" char ")")) (if dec (setq ct (concat ct "(" mew-us-ascii ")")) (if ichar (setq ct (concat ct "(*" ichar ")")) (setq ct (concat ct "(guess)")))))) (if (and dec mew-inherit-alt) (setq ct (concat ct "*"))) (setq ct (mew-substring ct lt 'cnt)) (if (null privacy) (when cte (setq cte (downcase cte)) (cond ((or (string= cte mew-7bit) (string= cte mew-8bit) (string= cte mew-bin)) ;; no mark ) ((string= cte mew-b64) (aset marks 0 ?B)) ((string= cte mew-qp) (aset marks 0 ?Q)) ((string= cte mew-xg) (aset marks 0 ?G)) (t (aset marks 0 ??)))) (if dec (setq privacy (reverse privacy))) (while (< i N) (mew-set '(ctm ctp) (nth i privacy)) (let ((case-fold-search t)) (cond ((string-match "pgp" ctp) (aset marks (* i 2) ?P)) ((string-match "pkcs" ctm) (aset marks (* i 2) ?S)) ((string-match "moss" ctp) (aset marks (* i 2) ?M))) (cond ((mew-case-equal mew-ct-mle ctm) (aset marks (1+ (* i 2)) ?E)) ((mew-case-equal mew-ct-mls ctm) (aset marks (1+ (* i 2)) ?S)) ((mew-case-equal "enveloped-data" ctp) (aset marks (1+ (* i 2)) ?E)) ((mew-case-equal "signed-data" ctp) (aset marks (1+ (* i 2)) ?S))) (setq i (1+ i))))) (if (and (not dec) decrypters) (setq cd-or-dec decrypters)) (setq cd-or-dec (mew-substring cd-or-dec ld 'cnt)) (cond (filename (setq file filename)) ((and file (not (string= file ".")) (not (string-match "/$" file))) (setq file (concat "*" file)))) (setq file (mew-substring file lf 'cnt)) (mew-xinfo-set-multi-form (cons (concat marks (if number (concat space number)) space space ct space space cd-or-dec space space file "\n") (mew-xinfo-get-multi-form))))) (defun mew-decode-syntax-buffer () (marker-buffer mew-marker-decode-syntax-begin)) (defun mew-decode-syntax-delete () (when (mew-decode-syntax-p) (with-current-buffer (mew-decode-syntax-buffer) (mew-xinfo-set-icon-spec nil) (mew-summary-toolbar-update) (save-excursion (mew-elet (delete-region (mew-decode-syntax-begin) (mew-decode-syntax-end)))) (mew-decode-syntax-remove) (mew-highlight-cursor-line) (set-buffer-modified-p nil)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; decode privacy ;; (defun mew-decode-syntax-set-privacy (syntax label) (let (results) (dolist (privacy (mew-syntax-get-privacy syntax)) (setq results (concat results (nth 2 privacy)))) (when results (mew-xinfo-set-pri-result (concat (mew-xinfo-get-pri-result) mew-x-mew: (format " <%s> " label) results "\n"))))) (defun mew-decode-syntax-insert-privacy () (when (mew-xinfo-get-pri-result) (let ((beg (point))) (insert (mew-xinfo-get-pri-result)) (mew-decode-header-property-region beg (point)) (save-excursion (save-restriction (narrow-to-region beg (point)) (goto-char (point-min)) (while (re-search-forward "BAD.*sign" nil t) (put-text-property (match-beginning 0) (match-end 0) 'face 'mew-face-header-xmew-bad))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; Broken messages ;; (defun mew-decode-syntax-arrange-warning () (when (mew-xinfo-get-warning) (mew-xinfo-set-warning (mew-uniq-list (sort (mew-xinfo-get-warning) 'string<))))) (defun mew-decode-syntax-insert-warning () (when (or (mew-xinfo-get-warning) (mew-xinfo-get-info)) (let ((beg (point)) (pref (make-string (1+ (length mew-x-mew:)) mew-sp))) (when (mew-xinfo-get-warning) (insert mew-x-mew: " " (mapconcat 'identity (mew-xinfo-get-warning) pref))) (when (mew-xinfo-get-info) (insert mew-x-mew: " " (mapconcat 'identity (mew-xinfo-get-info) pref))) (mew-decode-header-property-region beg (point))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; markers ;; (defvar mew-marker-decode-syntax-begin (make-marker)) (defvar mew-marker-decode-syntax-end (make-marker)) ;; location (defun mew-in-decode-syntax-p () (and (marker-position mew-marker-decode-syntax-begin) (marker-position mew-marker-decode-syntax-end) (eq (current-buffer) (marker-buffer mew-marker-decode-syntax-begin)) (>= (point) (marker-position mew-marker-decode-syntax-begin)) (< (point) (marker-position mew-marker-decode-syntax-end)))) (defun mew-in-header-p () (let ((end (mew-header-end))) (and end (<= (point) end)))) (defun mew-in-attach-p () (let ((beg (mew-attach-begin))) (and beg (> (point) beg)))) ;; excluding the preceding \n ;; existence (defun mew-decode-syntax-p () (and (marker-position mew-marker-decode-syntax-begin) (marker-position mew-marker-decode-syntax-end))) (defun mew-msghdr-p () (save-restriction (widen) (next-single-property-change (point-min) 'read-only))) (defun mew-attach-p () (if (/= (point-max) 1) (get-text-property (1- (point-max)) 'mew-attach-end))) (defun mew-encode-syntax-have-one-part () (= (length mew-encode-syntax) (1+ mew-syntax-magic))) ;; point (defun mew-decode-syntax-begin () (marker-position mew-marker-decode-syntax-begin)) (defun mew-decode-syntax-end () (marker-position mew-marker-decode-syntax-end)) (defun mew-header-end () (mew-msghdr-p)) (defun mew-attach-begin () (if (mew-attach-p) (let ((beg (previous-single-property-change (point-max) 'mew-attach-begin))) (if beg (1- beg) nil)))) ;; (defun mew-decode-syntax-begin-set () (set-marker mew-marker-decode-syntax-begin (point))) (defun mew-decode-syntax-end-set () (set-marker mew-marker-decode-syntax-end (point))) (defun mew-decode-syntax-remove () (set-marker mew-marker-decode-syntax-begin nil) (set-marker mew-marker-decode-syntax-end nil)) (defun mew-summary-end-of-message-p () (let (pos beg end) (with-current-buffer (mew-decode-syntax-buffer) (save-excursion (setq pos (point)) (setq end (mew-decode-syntax-end)) (goto-char end) (forward-line -1) (beginning-of-line) (setq beg (point)) (and (<= beg pos) (< pos end)))))) ;; (defun mew-header-set (sep) (mew-elet (let ((pos (point))) (if sep (progn (insert-before-markers sep) ;; for mew-summary-reply (unless (bolp) (forward-line))) (forward-line)) (put-text-property pos (point) 'read-only t) (mew-front-nonsticky pos (1+ pos)) (if (mew-header-p) (mew-rear-sticky (1- (point)) (point)) (mew-rear-nonsticky (1- (point)) (point))) pos))) (defun mew-header-clear (&optional keep-read-only) ;; the cursor moves to the end of the header (with some exceptions) (mew-elet (mew-header-goto-end) ;; do not use mew-header-end (let ((pos (point))) (forward-line) ;; If the body contains the read-only property, mew-in-header-p() ;; makes a mistake. So, remove the read-only property from ;; the entire buffer. (unless keep-read-only (put-text-property (point) (point-max) 'read-only nil)) (delete-region pos (point))))) ;; (defun mew-attach-set () (mew-elet (let (beg) (goto-char (point-max)) (unless (bolp) (insert "\n")) (setq beg (point)) (insert "\n") (insert mew-draft-attach-boundary-beg) (insert "\n") (insert mew-draft-attach-boundary-end) (insert "\n") (put-text-property beg (1+ beg) 'mew-attach-begin t) (put-text-property (1- (point)) (point) 'mew-attach-end t) (beginning-of-line) (mew-draft-attach-keymap)))) (defun mew-attach-clear () (when (mew-attach-p) (save-excursion (mew-elet (delete-region (mew-attach-begin) (point-max))) (mew-overlay-delete (mew-tinfo-get-attach-keymap)) (mew-tinfo-set-attach-keymap nil)))) (defun mew-header-prepared () (mew-header-set (concat mew-header-separator "\n")) (mew-highlight-header) (unless (mew-header-p) (mew-draft-header-keymap))) (defun mew-draft-header-keymap () (save-excursion (if (overlayp (mew-tinfo-get-header-keymap)) (move-overlay (mew-tinfo-get-header-keymap) (point-min) (1+ (mew-header-end))) (mew-tinfo-set-header-keymap (mew-overlay-make (point-min) (1+ (mew-header-end)))) (overlay-put (mew-tinfo-get-header-keymap) 'local-map mew-draft-header-map)))) (defun mew-draft-attach-keymap () (if (overlayp (mew-tinfo-get-attach-keymap)) (move-overlay (mew-tinfo-get-attach-keymap) (1+ (mew-attach-begin)) (point-max)) (mew-tinfo-set-attach-keymap (mew-overlay-make (1+ (mew-attach-begin)) (point-max))) (overlay-put (mew-tinfo-get-attach-keymap) 'local-map mew-draft-attach-map))) (provide 'mew-syntax) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-syntax.el ends here kazu-yamamoto-Mew-ff9c41b/mew-thread.el000066400000000000000000001106301256455547000201330ustar00rootroot00000000000000;;; mew-thread.el ;; Author: Kazu Yamamoto ;; Created: Feb 1, 1999 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Customizable variables ;;; (defvar mew-use-sorted-thread t) (defcustom mew-use-complete-thread t "If non-nil, threads are made using two passes. First pass - Repeat the following procedure in numerical order: (1.0) Pick one message from the message list. (1.1) Register the current message-id: to DB. (1.2) Find its parent message-id: in DB. (1.3) If found, register the current message as a child of the parent. (1.4) Otherwise, register the current message to the top node list. Here we have pretty good threads. However, if the messages are not sorted by Date:, it is possible that some top nodes can be connected to other threads. If 'mew-use-complete-thread' is non-nil, the second pass is carried out. Second pass - Repeat the following procedure for top nodes linearly: (2.0) Pick one message from the top node list. (2.1) Find its parent message-id: in DB. (2.2) If found, register the current message as a child of the parent. (2.3) Otherwise, register the current message to the new top node list. If you have bogus messages and the second pass is carried out, thread structure MAY loop. This results in an infinite loop of visualizing threads (not making threads). Mew does not provide any loop detection/avoidance mechanism. So, you should understand this risk." :group 'mew-summary :type 'boolean) (defcustom mew-thread-indent-strings [" +" " +" " |" " "] "*Vector of strings to be used for indentation of thread. This consists of four members; 1st member for prefixing to a child message that is not the last one, 2nd member is for prefixing to the last child, 3rd and 4th members are for prefixing to grand-child thread trees, 4th member is for the child tree of the last child message. Example1: [\" +\" \" +\" \" |\" \" \"] makes thread view below. Message 1 +Message 2 | +Message 3 +Message 4 +Message 5 Example2: [\" \" \" \" \" \" \" \"] makes thread view below. Message 1 Message 2 Message 3 Message 4 Message 5 All members must have the same length." :group 'mew-summary :type 'sexp) (defcustom mew-use-thread-cursor nil "*If non-nil, move cursor after the indentation of thread." :group 'mew-summary :type 'boolean) (defvar mew-use-thread-separator nil "*If non-nil, the specified string is inserted between threads.") (defvar mew-thread-separator "--") (defun mew-thread-insert-separator () (if (and mew-use-thread-separator (/= (save-excursion (beginning-of-line) (point)) 1)) (insert mew-thread-separator "\n"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Thread info macro ;;; (defun mew-thread-make-entry () (make-vector 5 nil)) (defun mew-thread-get-myid (entry) (aref entry 0)) (defun mew-thread-get-prntid (entry) (aref entry 1)) (defun mew-thread-get-child (entry) (aref entry 2)) (defun mew-thread-get-msg (entry) (aref entry 3)) (defun mew-thread-get-line (entry) (aref entry 4)) (defun mew-thread-set-myid (entry myid) (aset entry 0 myid)) (defun mew-thread-set-prntid (entry prntid) (aset entry 1 prntid)) (defun mew-thread-set-child (entry child) (aset entry 2 child)) (defun mew-thread-set-msg (entry msg) (aset entry 3 msg)) (defun mew-thread-set-line (entry line) (aset entry 4 line)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Thread setup ;;; (defvar mew-thread-indent-length nil) (defvar mew-thread-indent-width nil) (defun mew-thread-setup () (let ((idt1 (aref mew-thread-indent-strings 0)) (idt2 (aref mew-thread-indent-strings 1)) (idt3 (aref mew-thread-indent-strings 2)) (idt4 (aref mew-thread-indent-strings 3))) (unless (and (= (string-width idt1) (string-width idt2)) (= (string-width idt2) (string-width idt3)) (= (string-width idt3) (string-width idt4))) (error "All members of mew-thread-indent-strings must have the same length")) (setq mew-thread-indent-width (string-width idt1)) (setq mew-thread-indent-length (length idt1)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Commands ;;; (defun mew-summary-mark-thread () "Make threads for messages marked with '*'." (interactive) (mew-summary-thread-region (point-min) (point-max) 'mark)) (defun mew-thread-cache-valid-p (vfolder) (let ((cfolder (mew-summary-folder-name 'ext)) ofld) (when (get-buffer vfolder) (with-current-buffer vfolder (setq ofld (mew-vinfo-get-original-folder)) (and (equal ofld cfolder) (get-buffer ofld) (equal (mew-sinfo-get-cache-time) (progn (set-buffer ofld) (mew-sinfo-get-cache-time)))))))) (defun mew-summary-make-thread (&optional arg) "If called in Summary mode or Selection, make threads for all messages. If called with '\\[universal-argument]', make threads for messages in the region. If called in Thread, switch back to the corresponding Summary mode or Selection." (interactive "P") (if (mew-mark-active-p) (setq arg t)) (if arg (let ((begend (mew-summary-get-region))) (mew-summary-thread-region (car begend) (cdr begend))) (mew-summary-goto-message) (mew-decode-syntax-delete) (let* ((msg (mew-summary-message-number)) (disp (mew-sinfo-get-disp-msg)) (folder (mew-summary-folder-name 'ext)) ;; xxx fld vfolder) (cond ((mew-thread-p) (setq fld (mew-vinfo-get-original-folder)) (if (not (and fld (get-buffer fld))) (message "No original folder") (mew-summary-visit-folder fld nil 'no-ls) (mew-summary-toggle-disp-msg (if disp 'on 'off)) (if (not msg) (goto-char (point-max)) (mew-summary-move-and-display msg)))) ((and (setq vfolder (mew-folder-to-thread folder)) (mew-thread-cache-valid-p vfolder)) (mew-summary-visit-folder vfolder) (mew-summary-toggle-disp-msg (if disp 'on 'off)) (when msg (mew-summary-move-and-display msg) (mew-thread-move-cursor))) ((mew-selection-p) (mew-summary-thread-region (point-min) (point-max) nil msg)) (t (mew-summary-thread-region (point-min) (point-max) nil msg)))))) (defun mew-summary-regexp-make-thread (&optional args) "Make threads for messages matched to a specified regular expression." (interactive "P") (mew-decode-syntax-delete) (let ((regex "") iter) (while (string= regex "") (setq regex (read-string "Regexp: "))) (if args (setq iter (lambda () (re-search-forward regex nil t))) (setq iter (lambda () (mew-summary-search-regexp-visible regex)))) (mew-summary-thread-region (point-min) (point-max) nil nil iter))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Making thread ;;; (defun mew-thread-get-iter (mark iter) (cond (iter iter) (mark (lambda () (re-search-forward mew-regex-msg-review nil t))) (t (lambda () (not (eobp)))))) (defun mew-thread-create-db (size) (let ((dbsize (cond ((<= size 211) 211) ((<= size 1511) 1511) ((<= size 7211) 7211) (t 18211)))) (make-vector dbsize 0))) ;; hash (defun mew-thread-pass-1 (db func) (let (start msg my-id prnt-id prnt-cld me top line prnt) (save-excursion (goto-char (point-min)) (while (funcall func) (beginning-of-line) (setq start (point)) (if (not (mew-sumsyn-match mew-regex-sumsyn-long)) (forward-line) (setq msg (mew-sumsyn-message-number)) (setq my-id (mew-sumsyn-my-id)) (setq prnt-id (mew-sumsyn-parent-id)) (forward-line) ;; Throw away properties here and give properties later. ;; This is faster than inheriting properties. (setq line (mew-buffer-substring start (point))) (setq me (mew-thread-make-entry)) (mew-thread-set-msg me msg) (mew-thread-set-line me line) (if (string= my-id "") (setq top (cons me top)) ;; some broken messages refer themselves ;; don't register me here so that his parent ;; will not be found. (if (or (string= prnt-id "") (string= my-id prnt-id)) (setq top (cons me top)) (mew-thread-set-prntid me prnt-id) (setq prnt (symbol-value (intern-soft prnt-id db))) (if (null prnt) (setq top (cons me top)) (setq prnt-cld (mew-thread-get-child prnt)) (if prnt-cld (nconc prnt-cld (list me)) (mew-thread-set-child prnt (list me))))) (mew-thread-set-myid me my-id) (set (intern my-id db) me))))) top)) (defun mew-summary-setup-vfolder (db top column) (let* ((ofolder (mew-summary-folder-name 'ext)) (vfolder (mew-folder-to-thread ofolder)) (pfolder (mew-summary-physical-folder)) (disp (mew-sinfo-get-disp-msg)) (ctime (mew-sinfo-get-cache-time)) (case (mew-sinfo-get-case))) (mew-summary-switch-to-folder vfolder) (mew-vinfo-set-mode 'thread) (mew-vinfo-set-physical-folder pfolder) (mew-vinfo-set-original-folder ofolder) (mew-erase-buffer) (mew-hscroll) (mew-summary-toggle-disp-msg (if disp 'on 'off)) (mew-sinfo-set-cache-time ctime) (mew-sinfo-set-case case) (setq mew-summary-buffer-raw t) (mew-vinfo-set-db db) (mew-vinfo-set-top top) (mew-vinfo-set-column column))) (defun mew-thread-pass-2 (db top) (if (null mew-use-complete-thread) (nreverse top) ;; This may create looped thread. ;; See mew-use-complete-thread for more information. (let (prnt prnt-id prnt-cld ret) (dolist (me top) (if (not (and (mew-thread-get-myid me) (setq prnt-id (mew-thread-get-prntid me)))) (setq ret (cons me ret)) (setq prnt (symbol-value (intern-soft prnt-id db))) (if (null prnt) (setq ret (cons me ret)) (setq prnt-cld (mew-thread-get-child prnt)) (if prnt-cld (setq prnt-cld (nconc prnt-cld (list me))) (mew-thread-set-child prnt (list me)))))) ret))) (defun mew-thread-postscript (mark disp-msg) (when mark (mew-mark-undo-mark mew-mark-review)) (jit-lock-register 'mew-summary-cook-region) (mew-summary-set-count-line) (set-buffer-modified-p nil) (if disp-msg (mew-summary-move-and-display disp-msg) (goto-char (point-max))) (mew-thread-move-cursor)) (defun mew-thread-debug-info (tm1 tm2 tm3 tm4 tm5 tm6) (when (mew-debug 'thread) (let* ((t1 (mew-time-calc tm2 tm1)) (t2 (mew-time-calc tm4 tm3)) (t3 (mew-time-calc tm6 tm5))) (message "pass1 %f, pass2 %f, visual %f" t1 t2 t3)))) (defun mew-summary-thread-region (beg end &optional mark disp-msg iter) "Make threads for messages in a region. If you want to know how threads are created, see 'mew-use-complete-thread'." (interactive "r") (when (mew-summary-exclusive-p) (let* ((column (or (mew-sinfo-get-summary-column) ;; scanned ;; Summary only (mew-get-summary-column (mew-summary-folder-name 'ext)))) db top tm1 tm2 tm3 tm4 tm5 tm6) (save-restriction (narrow-to-region beg end) (setq db (mew-thread-create-db (count-lines beg end))) ;; (message "Making thread (first pass)...") (setq tm1 (current-time)) (setq top (mew-thread-pass-1 db (mew-thread-get-iter mark iter))) (setq tm2 (current-time))) ;; (if (null top) (message "No target messages") (message "Making thread (second pass)...") (setq tm3 (current-time)) (setq top (mew-thread-pass-2 db top)) (setq tm4 (current-time)) ;; (mew-summary-setup-vfolder db top column) ;; (message "Displaying thread...") (setq tm5 (current-time)) (mew-summary-thread-print-top (mew-vinfo-get-top) column) (setq tm6 (current-time)) ;; (mew-thread-postscript mark disp-msg) ;; (message "Displaying thread...done") (run-hooks 'mew-thread-display-hook) (mew-thread-debug-info tm1 tm2 tm3 tm4 tm5 tm6))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Subfunctions ;;; (defun mew-thread-put-property (beg end level) (put-text-property beg end 'mew-thread-indent level)) (defun mew-thread-get-property (beg) (get-text-property beg 'mew-thread-indent)) (defun mew-thread-previous-property (beg) (previous-single-property-change beg 'mew-thread-indent)) (defun mew-thread-next-property (beg) (next-single-property-change beg 'mew-thread-indent)) (defun mew-thread-next-property2 (beg end level) (text-property-any beg end 'mew-thread-indent level)) (defun mew-thread-adjust-body (level) (when (mew-summary-goto-body) (mew-elet (let ((end (point)) (width (* level mew-thread-indent-width)) (sum 0)) (while (< sum width) (setq sum (+ (char-width (char-before)) sum)) (forward-char -1)) (delete-region (point) end) (when (/= sum width) (insert (make-string (- sum width) mew-sp))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Visualizing thread ;;; (defun mew-summary-thread-print-top (top column) (let (cld) (dolist (me top) (setq cld (mew-thread-get-child me)) (mew-elet (mew-thread-insert-separator) (insert (mew-thread-get-line me)) (forward-line -1) (move-to-column column) (mew-thread-put-property (point) (1+ (point)) 0) (forward-line)) (if cld (mew-summary-thread-print-tree cld column))))) (defun mew-summary-thread-print-tree (tree column) (let ((tree-stack nil) (prefix "") (level 1) pos) (while tree (let* ((me (car tree)) (next (cdr tree)) (cld (mew-thread-get-child me))) (mew-elet (insert (mew-thread-get-line me)) (forward-line -1) (move-to-column column) (setq pos (point)) (if next (insert prefix (aref mew-thread-indent-strings 0)) (insert prefix (aref mew-thread-indent-strings 1))) (mew-thread-put-property pos (point) level) (mew-thread-adjust-body level) (forward-line)) ;; (setq tree next) (cond (cld (if next (setq prefix (concat prefix (aref mew-thread-indent-strings 2))) (setq prefix (concat prefix (aref mew-thread-indent-strings 3)))) (setq tree-stack (cons tree tree-stack)) (setq tree cld) (setq level (1+ level))) (t (while (and (null tree) tree-stack) (setq prefix (substring prefix 0 (- mew-thread-indent-length))) (setq tree (car tree-stack)) (setq tree-stack (cdr tree-stack)) (setq level (1- level))))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Marking thread ;;; (defun mew-thread-mark-review () "Put the '*' mark on all messages of the current sub-thread." (interactive) (mew-thread-mark mew-mark-review)) (defun mew-thread-mark-delete () "Put the 'D' mark on all messages of the current sub-thread." (interactive) (mew-summary-not-in-nntp (mew-thread-mark mew-mark-delete 'valid-only))) (defun mew-thread-mark-unlink () "Put the 'X' mark on all messages of the current sub-thread." (interactive) (mew-thread-mark mew-mark-unlink 'valid-only)) (defun mew-thread-mark-escape () "Put the '$' mark on all messages of the current sub-thread." (interactive) (mew-thread-mark mew-mark-escape)) (defun mew-thread-mark-refile () "Put the 'o' mark on all messages of the current sub-thread." (interactive) (mew-thread-only (let* ((fld (mew-folder-basename (mew-summary-folder-name 'ext))) (folders (mew-summary-refile-body nil nil nil 'no-mark)) (folders-str (mew-join "," folders)) (func (lambda () (mew-summary-refile-override-body folders-str) (unless (mew-virtual-p) (mew-summary-refile-log fld folders-str)))) alist) (when folders (setq alist (mew-thread-mark mew-mark-refile 'valid-only func)) (mew-refile-set-from-alist alist folders))))) (defun mew-thread-mark-copy () "Put the 'o' mark on all messages of the current sub-thread with the current folder as a candidate in addition to guessed folders." (interactive) (mew-thread-only (let* ((folders (mew-summary-refile-body nil nil nil 'no-mark (mew-summary-folder-name))) (folders-str (mew-join "," folders)) (func (lambda () (mew-summary-refile-override-body folders-str))) alist) (when folders (setq alist (mew-thread-mark mew-mark-refile 'valid-only func)) (mew-refile-set-from-alist alist folders))))) (defun mew-refile-set-from-alist (alist folders) (let (fld) (dolist (ent alist) (setq fld (car ent)) (dolist (msg (sort (copy-sequence (cdr ent)) '<)) ;; sort has side effect (setq msg (number-to-string msg)) (when (get-buffer fld) (with-current-buffer fld (mew-refile-reset msg) (mew-refile-set msg folders))))))) (defun mew-thread-mark (mark &optional valid-only func) (mew-thread-only (mew-summary-msg-or-part (let ((regex (if valid-only mew-regex-sumsyn-valid mew-regex-sumsyn-short)) (column (mew-vinfo-get-column)) indent cindent fld msg alist bottom pruned) (mew-summary-goto-message) (mew-decode-syntax-delete) (save-excursion (beginning-of-line) (when (looking-at (concat "^." (regexp-quote (char-to-string mew-mark-thread-root)))) (setq pruned (point)) (mew-thread-graft 'nomsg)) (move-to-column column) (setq indent (mew-thread-get-property (point))) (when (mew-sumsyn-match regex) (setq fld (mew-sumsyn-folder-name)) (setq msg (mew-sumsyn-message-number)) (if func (funcall func)) (mew-mark-put mark) (mew-mark-alist-set alist fld msg)) (forward-line) (catch 'loop (while (not (eobp)) (move-to-column column) (when (setq cindent (mew-thread-get-property (point))) (if (>= indent cindent) (throw 'loop nil) (when (mew-sumsyn-match regex) (setq fld (mew-sumsyn-folder-name)) (setq msg (mew-sumsyn-message-number)) (if func (funcall func)) (mew-mark-put mark) (mew-mark-alist-set alist fld msg)))) (forward-line))) (beginning-of-line) (setq bottom (point)) (mew-summary-mark-in-physical-alist alist mark func) (when pruned (goto-char pruned) (mew-thread-prune 'nomsg))) (mew-push-mark) (let ((mew-summary-down-function (lambda () (goto-char bottom)))) (mew-summary-display-after mew-summary-mark-direction)) alist)))) (defun mew-thread-undo (fld msg) (let* ((mark (mew-summary-get-mark)) (func (mew-markdb-func-undo mark))) (and func (fboundp func) (funcall func fld msg)))) (defun mew-thread-unmark () "Unmark messages under this sub-thread." (interactive) (mew-thread-only (mew-summary-msg-or-part (let ((column (mew-vinfo-get-column)) fld msg alist indent cindent pruned) (mew-summary-goto-message) (mew-thread-move-cursor) (mew-decode-syntax-delete) (save-excursion (beginning-of-line) (when (looking-at (concat "^." (regexp-quote (char-to-string mew-mark-thread-root)))) (setq pruned (point)) (mew-thread-graft 'nomsg)) (move-to-column column) (setq indent (mew-thread-get-property (point))) (setq fld (mew-summary-folder-name)) (setq msg (mew-summary-message-number)) (mew-mark-alist-set alist fld msg) (mew-thread-undo fld msg) (mew-mark-unmark) (forward-line) (catch 'loop (while (not (eobp)) (move-to-column column) (when (setq cindent (mew-thread-get-property (point))) (if (>= indent cindent) (throw 'loop nil) (setq fld (mew-summary-folder-name)) (setq msg (mew-summary-message-number)) (mew-mark-alist-set alist fld msg) (mew-thread-undo fld msg) (mew-mark-unmark))) (forward-line))) (when pruned (goto-char pruned) (mew-thread-prune 'nomsg)) (mew-thread-unmark-physical-from-alist alist)))))) (defun mew-thread-unmark-physical-from-alist (alist) (let (fld msgs) (dolist (ent alist) (setq fld (car ent)) (setq msgs (sort (copy-sequence (cdr ent)) '<)) ;; sort has side effect (when (get-buffer fld) (set-buffer fld) (save-excursion (goto-char (point-min)) (dolist (msg msgs) (setq msg (number-to-string msg)) (when (re-search-forward (mew-regex-sumsyn-msg msg) nil t) (mew-thread-undo fld msg) (mew-mark-unmark)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Thread utilities ;;; (defun mew-thread-up () "Move onto the top of the current thread. If the current message is a top node, move onto the top of the previous thread." (interactive) (mew-thread-only (let (here pos) (mew-summary-goto-message) (save-excursion (mew-decode-syntax-delete) (beginning-of-line) (setq pos (point)) (catch 'loop (while (and (not (bobp)) (setq pos (mew-thread-previous-property pos))) (when (and pos (eq (mew-thread-get-property pos) 0)) (throw 'loop (setq here pos)))))) (if (not here) (message "No more threads") (goto-char here) (mew-thread-move-cursor) (mew-summary-display))))) (defun mew-thread-down () "Move onto the top of the next thread." (interactive) (mew-thread-only (let (here) (mew-summary-goto-message) (save-excursion (mew-decode-syntax-delete) (forward-line) (setq here (mew-thread-next-property2 (point) (point-max) 0))) (if (not here) (message "No more threads") (goto-char here) (unless (mew-summary-message-number) (forward-line)) (mew-thread-move-cursor) (mew-summary-display))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Diag ;;; (defun mew-summary-parent-global (par-id) (mew-summary-diag-global par-id "-p" "Parent")) (defun mew-summary-child-global (my-id) (mew-summary-diag-global my-id "-c" "Child")) (defun mew-summary-diag-global (id opt who) (mew-msgid-check (let ((db (mew-expand-file "+" mew-id-db-file)) (regex (format "\\(.*\\)/\\([0-9]+\\)\\(%s\\)?$" (regexp-quote mew-suffix))) path msg folder) (with-temp-buffer (mew-piolet mew-cs-text-for-read mew-cs-text-for-write (call-process mew-prog-smew nil t nil opt id db "") (goto-char (point-min)) (when (looking-at regex) (setq path (mew-match-string 1)) (setq msg (mew-match-string 2))))) (if (not msg) nil (setq folder (mew-folder-path-to-folder path)) (when folder (mew-summary-visit-folder folder nil 'no-ls) (if (mew-summary-search-msg msg) (progn (mew-summary-display) t) (concat who " not found. Scan 'update would be necessary"))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Parent ;;; (defun mew-summary-parent () "Move onto the parent message of the current message." (interactive) (mew-summary-goto-message) (mew-decode-syntax-delete) (let ((par-id (mew-summary-parent-id)) result) (cond ((or (null par-id) (string= par-id "")) (message "No parent")) ((mew-summary-parent-local par-id) (message "Parent found")) ((and (y-or-n-p "No parent in this folder. Find in others? ") (setq result (mew-summary-parent-global par-id))) (if (eq result t) (message "Parent found") (message "%s" result))) (t (message "Parent not found"))))) (defun mew-summary-parent-local (par-id) (let ((pos (point)) (key (mew-regex-sumsyn-my-id par-id))) (if (or (re-search-backward key nil t) (re-search-forward key nil t)) (progn (mew-thread-move-cursor) (mew-summary-display) t) (goto-char pos) nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Child ;;; (defun mew-summary-child () "Move onto the first child message of the current message." (interactive) (mew-summary-goto-message) (mew-decode-syntax-delete) (let ((my-id (mew-summary-my-id)) result) (cond ((or (null my-id) (string= my-id "")) (message "No child")) ((mew-summary-child-local my-id) (message "Child found")) ((and (y-or-n-p "No child in this folder. Find in others? ") (setq result (mew-summary-child-global my-id))) (if (eq result t) (message "Child found") (message "%s" result))) (t (message "Child not found"))))) (defun mew-summary-child-local (my-id) (let ((pos (point)) (key (mew-regex-sumsyn-par-id my-id))) (if (or (re-search-forward key nil t) (re-search-backward key nil t)) (progn (mew-thread-move-cursor) (mew-summary-display) t) (goto-char pos) nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sibling ;;; (defun mew-summary-thread-sibling-up () "Search backward by one sibling message of the current message." (interactive) (let ((pos (point)) (par-id (mew-summary-parent-id)) key) (if (or (null par-id) (string= par-id "")) (message "No sibling") (setq key (mew-regex-sumsyn-par-id par-id)) (if (re-search-backward key nil t) (progn (mew-thread-move-cursor) (mew-summary-display) (message "Sibling found")) (goto-char pos) (message "Sibling not found"))))) (defun mew-summary-thread-sibling-down () "Search forward by one sibling message of the current message." (interactive) (let ((pos (point)) (par-id (mew-summary-parent-id)) key) (if (or (null par-id) (string= par-id "")) (message "No sibling") (setq key (mew-regex-sumsyn-par-id par-id)) (forward-line) (if (re-search-forward key nil t) (progn (mew-thread-move-cursor) (mew-summary-display) (message "Sibling found")) (goto-char pos) (message "Sibling not found"))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Thread sub-functions ;;; (defun mew-thread-move-cursor () "Move cursor after indentation of thread." (if (and mew-use-thread-cursor (mew-thread-p) (mew-summary-message-number)) (let (indent) (move-to-column (mew-vinfo-get-column)) (if (setq indent (mew-thread-get-property (point))) (unless (= indent 0) (goto-char (mew-thread-next-property (point)))) (beginning-of-line))) (beginning-of-line))) (defun mew-summary-thread-get-msglst (tree &optional add-separator) "Get a list of message in the thread order specified by TREE." (let ((tree-stack nil) (level 0) msgs me cld) (while tree (setq me (car tree)) (setq cld (mew-thread-get-child me)) (if (and mew-use-thread-separator add-separator (= level 0)) (setq msgs (cons "s" msgs))) ;; "s" thread-separator line (setq msgs (cons (mew-thread-get-msg me) msgs)) (setq tree (cdr tree)) (if (null cld) (while (and (null tree) tree-stack) (setq tree (car tree-stack)) (setq tree-stack (cdr tree-stack)) (setq level (1- level))) (setq tree-stack (cons tree tree-stack)) (setq tree cld) (setq level (1+ level)))) (if (and mew-use-thread-separator add-separator) ;; discard first "s" (cdr (nreverse msgs)) (nreverse msgs)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Hide/disclose children ;;; (defvar mew-mark-thread-root ?+) (defun mew-thread-toggle () "If children of a message are displayed, they will hide and \"+\" is displayed on the parent. If the children are hidden, they will appear." (interactive) (mew-thread-only (mew-summary-goto-message) (mew-decode-syntax-delete) (if (looking-at (concat "^." (regexp-quote (char-to-string mew-mark-thread-root)))) (mew-thread-graft) (mew-thread-prune)) (mew-thread-move-cursor) (set-buffer-modified-p nil))) (defun mew-thread-toggle-all () "Toggle appearance of children for all threads." (interactive) (mew-thread-only (let (here) (save-excursion (goto-char (point-min)) (mew-decode-syntax-delete) (while (setq here (mew-thread-next-property2 (point) (point-max) 0)) (goto-char here) (beginning-of-line) (if (looking-at (concat "^." (regexp-quote (char-to-string mew-mark-thread-root)))) (mew-thread-graft) (mew-thread-prune)) (forward-line)) (mew-thread-move-cursor) (set-buffer-modified-p nil))))) (defun mew-thread-all-prune () "Hide all children." (interactive) (mew-thread-only (mew-summary-goto-message) (mew-decode-syntax-delete) (save-excursion (goto-char (point-min)) (let (pos) (while (setq pos (mew-thread-next-property2 (point) (point-max) 0)) (goto-char pos) (mew-thread-prune 'nomsg) (forward-line)))) (when (eq (get-text-property (point) 'invisible) t) (mew-re-search-backward-visible mew-regex-msg-or-part)) (mew-thread-move-cursor) (set-buffer-modified-p nil))) (defun mew-thread-all-graft () "Display all children." (interactive) (mew-thread-only (mew-summary-goto-message) (mew-decode-syntax-delete) (save-excursion (goto-char (point-min)) (let ((regex (concat "^." (regexp-quote (char-to-string mew-mark-thread-root))))) (while (re-search-forward regex nil t) (mew-thread-graft 'nomsg) (forward-line)))) (mew-thread-move-cursor) (set-buffer-modified-p nil))) (defun mew-thread-prune (&optional nomsg) (beginning-of-line) (let ((pos (mew-thread-next-property (point)))) (unless (and pos (eq (mew-thread-get-property pos) 0)) ;; root (catch 'loop (while (setq pos (mew-thread-previous-property pos)) (when (and pos (eq (mew-thread-get-property pos) 0)) (throw 'loop (goto-char pos))))))) (beginning-of-line) (save-excursion (forward-line) (let ((beg (point)) (next (mew-thread-next-property2 (point) (point-max) 0))) (goto-char (or next (point-max))) (forward-line -1) (if (mew-summary-message-number) (forward-line)) (if (= beg (point)) (or nomsg (message "No children to be pruned")) (mew-elet (put-text-property beg (point) 'invisible t) (goto-char beg) (forward-line -1) (forward-char) (put-text-property (point) (1+ (point)) 'invisible t) (insert mew-mark-thread-root)))))) (defun mew-thread-graft (&optional nomsg) (save-excursion (forward-line) (let ((start (point)) (next (mew-thread-next-property2 (point) (point-max) 0)) beg end) (goto-char (or next (point-max))) (forward-line -1) (if (mew-summary-message-number) (forward-line)) (setq end (point)) (if (= start end) (or nomsg (message "No children to be leaned")) (mew-elet (goto-char start) (setq beg start) (while (search-forward "\r" end t) (put-text-property beg (1- (point)) 'invisible nil) (forward-line) (put-text-property (1- (point)) (point) 'invisible nil) (setq beg (point))) (goto-char start) (forward-line -1) (forward-char) (delete-char 1) (put-text-property (point) (1+ (point)) 'invisible nil)))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Thread editing ;;; (defun mew-thread-glue () "Glue a thread/message to the current message as its child(ren). The thread/message is specified with the mark(\\[set-mark-command])." (interactive) (mew-summary-msg (let* ((zmacs-regions nil) (pos (marker-position (mark-marker)))) (cond ((null pos) (message "No marker")) ((mew-thread-p) (mew-thread-glue-it)) (t ;; summary or virtual (mew-summary-glue-it)))))) (defun mew-summary-glue-it () (save-excursion (mew-summary-goto-message) (beginning-of-line) ;; parent (let ((id (mew-summary-my-id)) fld msg) (goto-char (mark-marker));; user's mark ;; children (when (mew-sumsyn-match mew-regex-sumsyn-long) (setq fld (mew-sumsyn-folder-name)) (setq msg (mew-sumsyn-message-number))) (when (and fld msg id) (mew-thread-change-parent-id id) (mew-thread-save-xref fld msg id) (if (mew-virtual-p) (mew-summary-change-parent-id fld msg id)) (message "Glued"))))) (defun mew-thread-glue-it () (let ((column (mew-vinfo-get-column)) (width 0) (wd 0) (adjust 0) (prefix "") fld msg id beg end tree indent idt pbeg pindent has-child m) (save-excursion ;; parent (mew-summary-goto-message) (beginning-of-line) (setq id (mew-summary-my-id)) (move-to-column column) (setq beg (point)) (setq pindent (mew-thread-get-property (point))) (goto-char (mew-thread-next-property (point))) (setq end (point)) (unless (= pindent 0) (while (< width mew-thread-indent-width) (forward-char -1) (setq width (+ width (char-width (char-after))))) (setq prefix (mew-buffer-substring beg (point))) (if (string= (mew-buffer-substring (point) end) (aref mew-thread-indent-strings 0)) (setq prefix (concat prefix (aref mew-thread-indent-strings 2))) (setq prefix (concat prefix (aref mew-thread-indent-strings 3))))) (when (mew-summary-goto-body) (while (> (point) beg) (setq wd (+ wd (char-width (char-before)))) (forward-char -1))) (setq wd (/ wd mew-thread-indent-width)) (if (> pindent wd) (setq adjust (- pindent wd))) (setq pindent (1+ pindent)) (forward-line) ;; the next line of parent (setq m (point-marker)) (unless (looking-at mew-regex-thread-separator) (move-to-column column) (if (and (mew-thread-get-property (point)) (= (mew-thread-get-property (point)) pindent)) (setq has-child t))) (move-to-column column) ;; children (goto-char (mark-marker));; user's mark (when (mew-sumsyn-match mew-regex-sumsyn-long) (setq fld (mew-sumsyn-folder-name)) (setq msg (mew-sumsyn-message-number))) (when (and fld msg id) (mew-elet (mew-syntax-change-parent-id id) (beginning-of-line) (setq beg (point)) (move-to-column column) (setq pbeg (point)) (setq indent (mew-thread-get-property (point))) (insert prefix) (if has-child (insert (aref mew-thread-indent-strings 0)) (insert (aref mew-thread-indent-strings 1))) (goto-char (mew-thread-next-property (point))) (mew-thread-put-property pbeg (point) (+ indent pindent)) (mew-thread-adjust-body (- pindent adjust)) (catch 'loop (while t (forward-line) (move-to-column column) (setq pbeg (point)) (setq idt (mew-thread-get-property (point))) (if (or (null idt) (<= idt indent)) (throw 'loop nil)) (insert prefix) (if has-child (insert (aref mew-thread-indent-strings 2)) (insert (aref mew-thread-indent-strings 3))) (goto-char (mew-thread-next-property (point))) (mew-thread-put-property pbeg (point) (+ idt pindent)) (mew-thread-adjust-body (- pindent adjust)))) (beginning-of-line) (setq end (point)) (when (looking-at mew-regex-thread-separator) (forward-line) (delete-region end (point))) ;; This must be "buffer-substring". (setq tree (buffer-substring beg end)) (delete-region beg end) ;; the next line of parent (goto-char m) (insert tree) (set-buffer-modified-p nil)) (mew-summary-change-parent-id fld msg id) (mew-thread-save-xref fld msg id))))) (defun mew-summary-change-parent-id (fld msg id) (set-buffer fld) (save-excursion (when (mew-summary-search-msg msg) (mew-thread-change-parent-id id)))) (defun mew-thread-change-parent-id (id) (mew-elet (mew-syntax-change-parent-id id)) (unless (mew-virtual-p) (mew-summary-folder-cache-save)) (set-buffer-modified-p nil)) (defun mew-thread-save-xref (fld msg id) (with-temp-buffer (let ((file (mew-expand-msg fld msg))) (mew-plet (mew-insert-file-contents2 file) (mew-header-delete-lines (list mew-x-mew-ref:)) (goto-char (point-min)) (mew-header-insert mew-x-mew-ref: id) (write-region (point-min) (point-max) file nil 'no-msg))))) (provide 'mew-thread) ;;; Copyright Notice: ;; Copyright (C) 2000-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-thread.el ends here kazu-yamamoto-Mew-ff9c41b/mew-unix.el000066400000000000000000000125221256455547000176500ustar00rootroot00000000000000;;; mew-unix.el -- MIME content type for UNIX ;; Author: Kazu Yamamoto ;; Created: Dec 4, 1997 ;;; Code: ;;; ;;; Text/Html, Application/Xml ;;; (defvar mew-format-html "%s.html") (defvar mew-format-xml "%s.xml") (defvar mew-unix-browser "firefox") (defvar mew-unix-browser-arg '("%s")) (defvar mew-unix-browser-form `(,mew-unix-browser ,mew-unix-browser-arg t)) (defvar mew-prog-text/html (if (and (fboundp 'shr-render-region) (fboundp 'libxml-parse-html-region)) 'shr-render-region 'mew-mime-text/html-w3m)) ;; See w3m.el (defvar mew-prog-text/html-ext mew-unix-browser-form) (defvar mew-prog-text/xml (if (and (fboundp 'shr-render-region) (fboundp 'libxml-parse-html-region)) 'shr-render-region 'mew-mime-text/html-w3m)) ;; See w3m.el (defvar mew-prog-text/xml-ext mew-unix-browser-form) (defvar mew-prog-application/xml nil) (defvar mew-prog-application/xml-ext mew-unix-browser-form) ;;; ;;; Image ;;; (defvar mew-prog-image/* 'mew-mime-image/*) (defvar mew-prog-image/*-ext '("display" ("-geometry" "+0+0"))) ;;; ;;; MIME setting ;;; (defvar mew-prog-plain 'mew-mime-text/plain) (defvar mew-prog-html '(mew-mime-text/html mew-mime-text/html-ext)) (defvar mew-prog-xml '(mew-mime-text/xml mew-mime-text/xml-ext)) (defvar mew-prog-patch '(mew-mime-text/plain mew-mime-text/patch-ext)) (defvar mew-prog-enriched 'mew-mime-text/enriched) (defvar mew-prog-text 'mew-mime-text/plain) (defvar mew-prog-audio `(,shell-file-name (,shell-command-switch "cat - > /dev/audio") nil)) (defvar mew-prog-audio2 `(,shell-file-name (,shell-command-switch "cat < /dev/audio") nil)) (defvar mew-prog-image '(mew-mime-image/* mew-mime-image/*-ext)) (defvar mew-prog-iges nil) (defvar mew-prog-vrml nil) (defvar mew-prog-mesh nil) (defvar mew-prog-video '("xine" ("--auto-play") t)) (defvar mew-prog-rfc822 'mew-mime-message/rfc822) (defvar mew-prog-rfc822-headers 'mew-mime-text/rfc822-headers) (defvar mew-prog-external-body '(mew-mime-external-body mew-mime-external-body-ext)) (defvar mew-prog-delivery-status 'mew-mime-text/plain) (defvar mew-prog-postscript '("gv" ("-geometry" "+0+0") t)) (defvar mew-prog-xml2 '(mew-mime-application/xml mew-mime-application/xml-ext)) (defvar mew-prog-pgp-keys '(mew-mime-pgp-keys mew-mime-pgp-keys-ext)) (defvar mew-prog-oasys nil) (defvar mew-prog-octet-stream 'mew-mime-application/octet-stream) (defvar mew-prog-visio 'mew-mime-application/octet-stream) (defvar mew-prog-mstnef '(mew-mime-application-ms-tnef mew-mime-application-ms-tnef-ext)) (defvar mew-prog-unzip 'mew-mime-application/octet-stream) ;;; ;;; ;;; (defvar mew-prog-application/pdf "pdftotext") (defvar mew-prog-pdf-ext '("xpdf" ("-geometry" "+0+0") t)) (defvar mew-prog-pdf `(mew-mime-application/pdf ,mew-prog-pdf-ext)) (defvar mew-prog-application/rtf "rtf2html") (defvar mew-prog-rtf '(mew-mime-application/rtf mew-mime-application/rtf-ext)) ;;; ;;; Office ;;; (defvar mew-prog-ooffice "ooffice") (defvar mew-prog-application/msword "wvHtml") (defvar mew-prog-msword-ext mew-prog-ooffice) (defvar mew-prog-msword `(mew-mime-application/msword ,mew-prog-msword-ext)) (defvar mew-prog-application/msexcel "xlhtml") (defvar mew-prog-msexcel-ext mew-prog-ooffice) (defvar mew-prog-msexcel `(mew-mime-application/msexcel ,mew-prog-msexcel-ext)) (defvar mew-prog-application/mspowerpoint "ppthtml") (defvar mew-prog-mspowerpoint-ext mew-prog-ooffice) (defvar mew-prog-mspowerpoint `(mew-mime-application/mspowerpoint ,mew-prog-mspowerpoint-ext)) ;;; ;;; Misc ;;; (defvar mew-default-external-program nil) (defvar mew-dir-list-function 'mew-dir-list-with-link-count) (provide 'mew-unix) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-unix.el ends here kazu-yamamoto-Mew-ff9c41b/mew-vars.el000066400000000000000000003032661256455547000176500ustar00rootroot00000000000000;;; mew-vars.el --- Variables and Constants for Mew ;; Author: Kazu Yamamoto ;; Created: Nov 22, 1997 ;;; Code: (require 'mew-env) ;;; ;;; User option variables which are easy to set. ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Defining groups ;;; (defgroup mew nil "Messaging in the Emacs World." :group 'mail) (defgroup mew-basic nil "Basic configuration." :group 'mew) (defgroup mew-env nil "Basic environment." :group 'mew) (defgroup mew-folder nil "Basic folder." :group 'mew) (defgroup mew-summary nil "Summary mode." :group 'mew) (defgroup mew-message nil "Message mode." :group 'mew) (defgroup mew-cache nil "Message Caching." :group 'mew) (defgroup mew-draft nil "Draft mode." :group 'mew) (defgroup mew-cite nil "Citation." :group 'mew) (defgroup mew-reply nil "Reply to message." :group 'mew) (defgroup mew-refile nil "Refiling." :group 'mew) (defgroup mew-complete nil "Completion." :group 'mew) (defgroup mew-highlight nil "Highlight." :group 'faces :group 'mew) (defgroup mew-privacy nil "Privacy setting." :group 'mew) (defgroup mew-addrbook nil "Address book." :group 'mew) (defgroup mew-net nil "Network." :group 'mew) (defgroup mew-pop nil "POP." :group 'mew) (defgroup mew-smtp nil "SMTP." :group 'mew) (defgroup mew-imap nil "IMAP." :group 'mew) (defgroup mew-nntp nil "NNTP." :group 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Environment variables ;;; (defcustom mew-rc-file "~/.mew" "*A file to be loaded after Mew's variables are initialized." :group 'mew-env :type 'file) (defcustom mew-mail-path "~/Mail" "*A directory where folders locate." :group 'mew-env :type 'directory) (defcustom mew-conf-path mew-mail-path "*A directory where Mew's configuration files locate." :group 'mew-env :type 'directory) (defcustom mew-pop-inbox-folder "$inbox" "*The default folder for POP." :group 'mew-folder :type 'string) (defcustom mew-imap-inbox-folder "%inbox" "*The default folder for IMAP." :group 'mew-folder :type 'string) (defcustom mew-imap-queue-folder "%queue" "*The queue folder for IMAP jobs." :group 'mew-folder :type 'string) (defcustom mew-imap-trash-folder "%trash" "*The trash folder for IMAP. If non-nil, deleted messages are moved to this folder. Deleting messages in this folder makes them really deleted." :group 'mew-folder :type '(choice string (const nil))) (defcustom mew-imap-trash-folder-list nil "*A list of IMAP folders whose messages marked with 'D' are really deleted." :group 'mew-summary :type '(choice (const nil) (repeat string))) (defcustom mew-inbox-folder "+inbox" "*The folder where new messages are incorporated." :group 'mew-folder :type 'string) (defcustom mew-draft-folder "+draft" "*The folder where draft are contained." :group 'mew-folder :type 'string) (defcustom mew-trash-folder "+trash" "*The trash folder." :group 'mew-folder :type '(choice string (const nil))) (defcustom mew-trash-folder-list nil "*A list of folders whose messages marked with 'D' are really deleted." :group 'mew-summary :type '(choice (const nil) (repeat string))) (defcustom mew-queue-folder "+queue" "*The queue folder to send messages." :group 'mew-folder :type 'string) (defcustom mew-postq-folder "+postq" "*The queue folder to post messages." :group 'mew-folder :type 'string) (defcustom mew-attach-folder "+attach" "*The folder where attachments are contained." :group 'mew-folder :type 'string) (defcustom mew-friend-folder "+from" "*The folder where personal messages are refiled." :group 'mew-folder :type 'string) (defcustom mew-imap-friend-folder "%from" "*The folder where personal messages are refiled for IMAP." :group 'mew-folder :type 'string) (defcustom mew-imap-spam-field nil "*The field name of anti spam information to be used for IMAP spam filter. If both 'mew-imap-spam-field' and 'mew-imap-spam-word' are defined, messages whose the field contains the word are automatically removed or refiled to 'mew-imap-spam-folder' or 'mew-imap-trash-folder' \(if defined) while scanning %inbox." :group 'mew-imap :type '(choice (const :tag "Not use" nil) (string :tag "Spam field"))) (defcustom mew-imap-spam-word nil "*The word of anti spam information to be used for IMAP spam filter. See 'mew-imap-spam-field'." :group 'mew-imap :type '(choice (const :tag "Not use" nil) (string :tag "Spam word"))) (defcustom mew-imap-spam-pattern nil "*IMAP SEARCH pattern to filter spams. If non-nil, 'mew-imap-spam-field' and 'mew-imap-spam-field' treated as 'nil'." :group 'mew-imap :type '(choice (const :tag "Not use" nil) (string :tag "Spam word"))) (defcustom mew-imap-spam-folder nil "*A folder to be used for IMAP spam filter. See 'mew-imap-spam-field'." :group 'mew-imap :type '(choice (const :tag "Not use" nil) (string :tag "Spam folder"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Hooks ;;; (defcustom mew-env-hook nil "*Hook called at initialize time before setting environment." :group 'mew-env :type 'hook) (defcustom mew-init-hook nil "*Hook called at initialize time." :group 'mew-env :type 'hook) (defcustom mew-summary-mode-hook nil "*Hook called in Summary mode." :group 'mew-summary :type 'hook) (defcustom mew-virtual-mode-hook nil "*Hook called in Virtual mode." :group 'mew-summary :type 'hook) (defcustom mew-thread-display-hook nil "*Hook called after new threads are displayed." :group 'mew-summary :type 'hook) (defcustom mew-header-mode-hook nil "*Hook called in Header mode." :group 'mew-draft :type 'hook) (defcustom mew-draft-mode-hook nil "*Hook called in Draft mode." :group 'mew-draft :type 'hook) (defcustom mew-draft-mode-newdraft-hook nil "*Hook called in Draft mode only when new draft is prepared." :group 'mew-draft :type 'hook) (defcustom mew-draft-mode-reedit-hook nil "*Hook called in Draft mode when a message not in +draft or +queue is re-edited." :group 'mew-draft :type 'hook) (defcustom mew-draft-mode-reedit-draft-hook nil "*Hook called in Draft mode when a message in +draft is re-edited." :group 'mew-draft :type 'hook) (defcustom mew-draft-mode-reedit-queue-hook nil "*Hook called in Draft mode when a message in +queue is re-edited." :group 'mew-draft :type 'hook) (defcustom mew-draft-mode-edit-hook nil "*Hook called in Edit mode" :group 'mew-draft :type 'hook) (defcustom mew-draft-mode-edit-again-hook nil "*Hook called in Draft mode when a message returned with the old style is edited again." :group 'mew-draft :type 'hook) (defcustom mew-message-mode-hook nil "*Hook called in Message mode." :group 'mew-message :type 'hook) (defcustom mew-message-hook nil "*Hook called whenever message displayed." :group 'mew-message :type 'hook) (defcustom mew-make-message-hook nil "*Hook called before making a message in Draft mode. A good example is as follows: (add-hook 'mew-make-message-hook 'ispell-message)" :group 'mew-draft :type 'hook) (defcustom mew-send-hook nil "*Hook called before sending/queuing an e-mail message in Draft mode. Note that this hook is called before composition of the message." :group 'mew-draft :type 'hook) (defcustom mew-post-hook nil "*Hook called before posting/queuing a NetNews message in Draft mode. Note that this hook is called before composition of the message." :group 'mew-draft :type 'hook) (defcustom mew-real-send-hook nil "*Hook called before sending/queuing an e-mail message in Draft mode. Note that this hook is called after composition of the message." :group 'mew-draft :type 'hook) (defcustom mew-real-post-hook nil "*Hook called before sending/queuing a NetNews message in Draft mode. Note that this hook is called after composition of the message." :group 'mew-draft :type 'hook) (defcustom mew-smtp-flush-hook nil "*Hook called before SMTP runs if messages exist in +queue." :group 'mew-draft :type 'hook) (defcustom mew-nntp2-flush-hook nil "*Hook called before NNTP runs if messages exist in +postq" :group 'mew-draft :type 'hook) (defcustom mew-smtp-sentinel-hook nil "*Hook called when a SMTP process finished." :group 'mew-draft :type 'hook) (defcustom mew-nntp-sentinel-hook nil "*Hook called when a NNTP process to receive messages finished." :group 'mew-summary :type 'hook) (defcustom mew-nntp2-sentinel-hook nil "*Hook called when a NNTP process to post messages finished." :group 'mew-draft :type 'hook) (defcustom mew-pop-sentinel-hook nil "*Hook called when a POP process finished." :group 'mew-summary :type 'hook) (defcustom mew-pop-sentinel-non-biff-hook nil "*Hook called when a non-Biff POP process finished." :group 'mew-summary :type 'hook) (defcustom mew-imap-sentinel-hook nil "*Hook called when an IMAP process finished." :group 'mew-summary :type 'hook) (defcustom mew-imap-sentinel-non-biff-hook nil "*Hook called when a non-Biff IMAP process finished." :group 'mew-summary :type 'hook) (defcustom mew-scan-sentinel-hook nil "*Hook called when scan finished." :group 'mew-summary :type 'hook) (defcustom mew-summary-ls-no-scan-hook nil "*Hook called when mew-summary-ls does not scan a folder." :group 'mew-summary :type 'hook) (defcustom mew-summary-exec-hook nil "*Hook called when mew-summary-exec finished." :group 'mew-summary :type 'hook) (defcustom mew-sort-hook nil "*Hook called when sort finished." :group 'mew-summary :type 'hook) (defcustom mew-summary-toggle-disp-msg-hook nil "*Hook called when mew-summary-toggle-disp-msg finished." :group 'mew-summary :type 'hook) (defcustom mew-summary-delete-folder-hook nil "*Hook called when a folder deleted. Eash function is called with a deleted folder as the argument." :group 'mew-summary :type 'hook) (defcustom mew-summary-rename-folder-hook nil "*Hook called when a folder renamed. Each function is called with a source folder and a destination folder as the argument." :group 'mew-summary :type 'hook) (defcustom mew-syntax-format-hook nil "*Hook called when mew-syntax-format is called." :group 'mew-message :type 'hook) (defcustom mew-addrbook-mode-hook nil "*Hook called in Addrbook mode." :group 'mew-addrbook :type 'hook) (defcustom mew-suspend-hook nil "*Hook called on suspend." :group 'mew-env :type 'hook) (defcustom mew-quit-hook nil "*Hook called on quit." :group 'mew-env :type 'hook) (defcustom mew-status-update-hook nil "*Hook called to update status." :group 'mew-env :type 'hook) (defcustom mew-refile-guess-by-from-learn-hook nil "*Hook called in mew-refile-guess-by-from-learn." :group 'mew-env :type 'hook) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Mail Addresses for Draft ;;; (defcustom mew-mail-address-list nil "*The addresses included in this list never appear on the Cc: field on a draft buffer. If nil, this value is automatically generated from 'mew-config-alist'." :group 'mew-draft :type '(choice (const nil) (repeat string))) (defcustom mew-mail-domain-list nil "*Your e-mail address domain list like \(\"example.org\" \"example.jp\"). They are used for mail-domain completion in Draft mode(C-cTAB). If nil, this value is automatically generated from 'mew-config-alist'." :group 'mew-draft :type '(choice (const nil) (repeat string))) (defcustom mew-from-list nil "*A list of From: for circular completion in Draft mode. If nil, this value is automatically generated from 'mew-config-alist'. See also 'mew-from'." :group 'mew-draft :type '(choice (const nil) (repeat string))) (defcustom mew-warn-addresses nil "A list of addresses to be warned." :group 'mew-draft :type '(choice (const nil) (repeat string))) (defcustom mew-safe-addresses nil "A list of addresses not to be warned." :group 'mew-draft :type '(choice (const nil) (repeat string))) (defcustom mew-warn-domains nil "A list of domains to be warned." :group 'mew-draft :type '(choice (const nil) (repeat string))) (defcustom mew-safe-domains nil "A list of domains not to be warned." :group 'mew-draft :type '(choice (const nil) (repeat string))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Mail Addresses ;;; (defcustom mew-name (user-full-name) "*Friendly name of e-mail address. i.e. \"Friendly name \"." :group 'mew-basic :type '(choice string (const nil))) (defcustom mew-user (user-login-name) "*User part of e-mail address." :group 'mew-basic :type 'string) (defcustom mew-mail-domain (or (car mew-mail-domain-list) mail-host-address (system-name)) "*Your e-mail address domain." :group 'mew-basic :type 'string) (defvar mew-reply-all-alist '((("Followup-To:" "poster") ("To:" "From:")) ("Followup-To:" ("Newsgroups:" "Followup-To:" "Newsgroups:")) ("Newsgroups:" ("Newsgroups:" "Newsgroups:")) ("Reply-To:" ("To:" "Reply-To:" "From:") ("Cc:" "To:" "Cc:" "Apparently-To:")) (t ("To:" "From:") ("Cc:" "To:" "Cc:" "Apparently-To:"))) "*Alist to be used to prepare To:/Cc:/Newsgroups: in a reply draft. For most cases, this alist is used. For more infomation, see the document of '\\\\[mew-summary-reply]'") (defvar mew-reply-sender-alist '(("Reply-To:" ("To:" "Reply-To:" "From:")) (t ("To:" "From:"))) "*Alist to be used to prepare To:/Cc:/Newsgroups: in a reply draft. When '\\[universal-argument]' is specified for '\\\\[mew-summary-reply]' and '\\[mew-summary-reply-with-citation]', this alist is used. For more infomation, see the document of '\\[mew-summary-reply]'") (defvar mew-reply-fromme-alist '((t ("To:" "To:") ("Cc:" "Cc:") ("Newsgroups:" "Newsgroups:"))) "*Alist to be used to prepare To:/Cc:/Newsgroups: in a reply draft. When the message to be replied is sent/posted by ME, this alist is used. For more infomation, see the document of '\\\\[mew-summary-reply]'") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; SSH/SSL/TLS ;;; (defcustom mew-ssh-keep-connection t "*If non-nil, an SSH process for each service (POP, IMAP, NNTP, SMTP) is kept for further connections. This must be 't' for IMAP and NNTP." :group 'mew-net :type 'boolean) (defcustom mew-ssl-keep-connection t "*If non-nil, an SSL/TLS process for each service (POP, IMAP, NNTP, SMTP) is kept for further connections. This must be 't' for IMAP and NNTP." :group 'mew-net :type 'boolean) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; SMTP ;;; (defcustom mew-smtp-server "localhost" "*The name of your SMTP server. If you want to use a remote SMTP server, set an appropriate value." :group 'mew-smtp :type 'string) (defcustom mew-smtp-port "smtp" "*The SMTP port. (e.g. \"smtp\" or 25)" :group 'mew-smtp :type 'string) (defcustom mew-smtp-ssh-server nil "*The name of SSH server which forwards the SMTP port." :group 'mew-smtp :type '(choice (const :tag "Not use" nil) (string :tag "Ssh server"))) (defcustom mew-smtp-ssl nil "*If non-nil, SMTP connections are made over SSL/TLS." :group 'mew-smtp :type 'boolean) (defcustom mew-smtp-ssl-port 465 ;; no universal consensus "*The port for SMTP over SSL/TLS. Set this to \"smtp\" if you want to use TLS." :group 'mew-smtp :type 'string) (defcustom mew-smtp-user nil "*The user name on your SMTP server. If not configured, your e-mail address is automatically set" :group 'mew-smtp :type '(choice string (const nil))) (defcustom mew-smtp-auth-list '("CRAM-MD5" "PLAIN" "LOGIN") "*A list of SMTP AUTH methods in the preferred order. Currently, \"CRAM-MD5\", \"PLAIN\", and \"LOGIN\" can be used." :group 'mew-smtp :type '(repeat (choice (const "CRAM-MD5") (const "PLAIN") (const "LOGIN")))) (defcustom mew-smtp-helo-domain "localhost" "*An e-mail domain to tell a SMTP server with HELO/EHLO." :group 'mew-smtp :type 'string) (defcustom mew-smtp-mail-from nil "*An e-mail address to tell a SMTP server with MAIL FROM:. If nil, an address specified by the From: field is used." :group 'mew-smtp :type '(choice string (const nil))) (defcustom mew-smtp-msgid-user nil "*A user part for creation of Message-Id: for SMTP. If nil, the value of 'mew-user' is used." :group 'mew-smtp :type '(choice string (const nil))) (defcustom mew-smtp-msgid-domain nil "*A domain name for creation of Message-Id: for SMTP. If nil, the value of 'mew-mail-domain' is used." :group 'mew-smtp :type '(choice string (const nil))) (defvar mew-smtp-timeout-time 4) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Retrieving messages ;;; (defcustom mew-mailbox-type 'pop "'pop, 'imap or 'mbox" :group 'mew-net :type '(choice (const pop) (const imap) (const mbox))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; mbox ;;; (defcustom mew-mbox-command "incm" "*A command to be execute if 'mew-mailbox-type' is 'mbox." :group 'mew-pop :type '(choice string (const nil))) (defcustom mew-mbox-command-arg "-u" "*Arguments for 'mew-mbox-command'. For maildir, set this to '-u -d /path/to/mbox'." :group 'mew-pop :type '(choice string (const nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Biff ;;; (defcustom mew-biff-interval 5 "*Minutes of biff interval. This should be smaller than 'mew-passwd-timer-unit' * 'mew-passwd-lifetime'." :group 'mew-net :type 'integer) (defcustom mew-biff-function 'mew-biff-bark "*A function to be called when messages arrive." :group 'mew-net :type '(choice function (const nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; POP ;;; (defcustom mew-pop-server "localhost" "*The name of your POP server. If you want to use a remote POP server, set an appropriate value." :group 'mew-pop :type 'string) (defcustom mew-pop-port "pop3" "*The POP3 port. (e.g. \"pop3\" or 110)" :group 'mew-pop :type 'string) (defcustom mew-pop-ssh-server nil "*The name of SSH server which forwards the POP3 port." :group 'mew-pop :type '(choice string (const nil))) (defcustom mew-pop-ssl nil "*If non-nil, POP connections are made over SSL/TLS." :group 'mew-pop :type 'boolean) (defcustom mew-pop-ssl-port "pop3s" "*The port for POP over SSL/TLS." :group 'mew-pop :type 'string) (defcustom mew-pop-user (user-login-name) "*The user name on your POP server." :group 'mew-pop :type 'string) (defcustom mew-pop-auth 'apop "*The authentication method for POP3. 'pass means the authentication with USER/PASS (i.e. plain password). 'apop means the authentication with APOP. t means SASL according to 'mew-pop-auth-list'." :group 'mew-pop :type '(choice (const apop) (const pass) (const t))) (defcustom mew-pop-auth-list '("CRAM-MD5" "PLAIN") "*A list of SASL methods in the preferred order. Currently, \"CRAM-MD5\" can be used." :group 'mew-pop :type '(repeat (choice (const "CRAM-MD5") (const "PLAIN")))) (defcustom mew-pop-delete t "*Whether or not delete messages on a POP server after retrieval by POP. If t, delete the messages. If nil, retain the messages. If number N, delete the messages N days after the first access. Otherwise they are not deleted." :group 'mew-pop :type '(choice (const :tag "Delete immediately" t) (const :tag "Retain the messages" nil) (integer :tag "Delete N days after"))) (defcustom mew-pop-size (* 54 1024) ;; 4K hdr + 50K bdy "*The limit size of messages to be retrieved by POP. The default is 55296 byte. 0 means unlimited, so you can get all messages from the POP server." :group 'mew-pop :type 'integer) (defcustom mew-pop-body-lines 40 "*The limit of body lines to get when the size of message exceeds 'mew-pop-size'." :group 'mew-pop :type 'integer) (defcustom mew-pop-header-only nil "*Whether or not the body of a message is retrieved by POP. If non-nil, only header is retrieved." :group 'mew-pop :type 'boolean) (defcustom mew-pop-proxy-server nil "*The name of POP proxy server." :group 'mew-pop :type '(choice (const :tag "Not use" nil) (string :tag "Pop proxy server"))) (defcustom mew-pop-proxy-port nil "*The port for POP proxy." :group 'mew-pop :type '(choice string (const nil))) (defvar mew-pop-timeout-time 4) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; IMAP ;;; (defcustom mew-imap-server "localhost" "*The name of your IMAP server. If you want to use a remote IMAP server, set an appropriate value." :group 'mew-imap :type 'string) (defcustom mew-imap-port "imap" "*The IMAP4 port. (e.g. \"imap\" or 143)" :group 'mew-imap :type 'string) (defcustom mew-imap-ssh-server nil "*The name of SSH server which forwards the IMAP4 port." :group 'mew-imap :type '(choice string (const nil))) (defcustom mew-imap-ssl nil "*If non-nil, IMAP connections are made over SSL/TLS." :group 'mew-imap :type 'boolean) (defcustom mew-imap-ssl-port "imaps" "*The port for IMAP over SSL/TLS." :group 'mew-imap :type 'string) (defcustom mew-imap-user (user-login-name) "*The user name on the IMAP server." :group 'mew-imap :type 'string) (defcustom mew-imap-auth t "*The authentication method for IMAP4. nil means the authentication with LOGIN (i.e. plain password). t means SASL according to 'mew-imap-auth-list'." :group 'mew-imap :type 'boolean) (defcustom mew-imap-auth-list '("CRAM-MD5" "LOGIN") "*A list of SASL methods in the preferred order. Currently, \"CRAM-MD5\" and \"LOGIN\" can be used." :group 'mew-imap :type '(repeat (choice (const "CRAM-MD5") (const "LOGIN")))) (defcustom mew-imap-delete t "*Whether or not delete messages on an IMAP server after retrieval by IMAP. If t, delete the messages. If nil, retain the messages. If number N, delete the messages N days after the first access. Otherwise they are not deleted." :group 'mew-imap :type 'boolean) (defcustom mew-imap-size (* 54 1024) ;; 4K hdr + 50K bdy "*The limit size of messages to be retrieved by IMAP. The default is 55296 byte. 0 means unlimited, so you can get all messages from the IMAP server." :group 'mew-imap :type 'integer) (defcustom mew-imap-header-only nil "*Whether or not the body of a message is retrieved by IMAP. If non-nil, only header is retrieved." :group 'mew-imap :type 'boolean) (defcustom mew-imap-prefix-list nil "A list to define which prefixes of user mailboxes should be used. For example, the WU IMAP server returns the following value for the NAMESPACE command. ((\"\" \"/\")(\"#mhinbox\" NIL)(\"#mh/\" \"/\")) ((\"/\" \"/\")) ((\"#shared/\" \"/\")(\"#ftp/\" \"/\")(\"#news.\" \".\")(\"#public/\" \"/\")) The first list is prefixes of user mailboxes. Each element consists of a prefix and a separator. If this valuable is nil, the prefix in the first element of the list is used as a prefix of user mailboxes. If this value is a list of strings, matched elements are used. If the separator is non-nil, the prefix is used. If the separator is nil, the prefix is added to mailbox alist as a mailbox. If you want to used your home directory with WU, configure as follows: (setq mew-imap-prefix-list '(\"\")) If you want to used the MH directory with WU, configure as follows: (setq mew-imap-prefix-list '(\"#mh/\" \"#mhinbox\")) Note that %inbox means /var/mail/ while %#mhinbox refers to Mail/inbox. " :group 'mew-imap :type '(choice (const nil) (repeat string))) (defcustom mew-imap-proxy-server nil "*The name of IMAP proxy server." :group 'mew-imap :type '(choice (const :tag "Not use" nil) (string :tag "Imap proxy server"))) (defcustom mew-imap-proxy-port nil "*The port for IMAP proxy." :group 'mew-imap :type '(choice string (const nil))) (defvar mew-imap-timeout-time 4) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; NNTP ;;; (defcustom mew-nntp-server "localhost" "*The name of your NNTP server. If you want to use a remote NNTP server, set an appropriate value." :group 'mew-nntp :type 'string) (defcustom mew-nntp-port "nntp" "*The NNTP port. (e.g. \"nntp\" or 119)" :group 'mew-nntp :type 'string) (defcustom mew-nntp-ssh-server nil "*The name of SSH server which forwards the NNTP port." :group 'mew-nntp :type '(choice string (const nil))) (defcustom mew-nntp-ssl nil "*If non-nil, NNTP connections are made over SSL/TLS." :group 'mew-nntp :type 'boolean) (defcustom mew-nntp-ssl-port "nntps" "*The port for NNTP over SSL/TLS." :group 'mew-nntp :type 'string) (defcustom mew-nntp-user nil "*The user name on the NNTP server. If non-nil, authentication is used." :group 'mew-nntp :type '(choice (const :tag "Not use" nil) (string :tag "Nntp user"))) (defcustom mew-nntp-newsgroup "-fj.mail.reader.mew" "*The name of default Newsgroup." :group 'mew-nntp :type 'string) (defcustom mew-nntp-size (* 54 1024) ;; 4K hdr + 50K bdy "*The limit size of messages to be retrieved by NNTP. The default is 55296 byte. 0 means unlimited, so you can get all messages from the NNTP server." :group 'mew-nntp :type 'integer) (defcustom mew-nntp-header-only nil "*Whether or not the body of a message is retrieved by NNTP. If non-nil, only header is retrieved." :group 'mew-nntp :type 'boolean) (defcustom mew-nntp-msgid-user nil "*A user part for creation of Message-Id: for NNTP. If nil, the value of 'mew-user' is used." :group 'mew-nntp :type '(choice string (const nil))) (defcustom mew-nntp-msgid-domain nil "*A domain name for creation of Message-Id: for NNTP. If nil, the value of 'mew-mail-domain' is used." :group 'mew-nntp :type '(choice string (const nil))) (defvar mew-nntp-timeout-time 4) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; range ;;; (defcustom mew-range-list nil "*A list of (KEY VALUE) to define RANGE for each folder. If KEY is t, all folders matches it. The corresponding RANGE is returned always. If KEY is a string, match-function is applied according to 'mew-range-list-string-type'. If matched, the corresponding RANGE is returned. If KEY is a list of strings, match-function is applied according to 'mew-range-list-list-type'. If a match found out of the strings, the corresponding RANGE is returned. Candidate values for 'mew-rage-list-string-type' and 'mew-range-list-list-type' are as follows: 'regex Regular expression. 'recursive Initial substring match. That is, not only a folder specified but all so all sub-folders are matched. 'string String comparison. An example is as follows: '(((\"+queue\" \"+postq\" \"+draft\") \"all\") ((\"$inbox\") \"sync\") (t \"update\")) If this value is nil, an appropriate value is set when Mew is booting. " :group 'mew-summary :type '(choice (const nil) (repeat (list (choice (string :tag "Folder") (repeat :tag "Folders" (string :tag "Folder")) (const :tag "Other" t)) string)))) (defcustom mew-range-list-string-type 'regex "*A value to specify an action if the key is a string in 'mew-range-list'. Candidates are 'regex, 'recursive, and 'string." :group 'mew-summary :type '(choice (const regex) (const recursive) (const string))) (defcustom mew-range-list-list-type 'recursive "*A value to specify an action if the key is a list of strings in 'mew-range-list'. Candidates are 'regex, 'recursive, and 'string." :group 'mew-summary :type '(choice (const regex) (const recursive) (const string))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; unread-mark ;;; (defcustom mew-unread-mark-list '((("+inbox" "$inbox" "%inbox" "-") t) (t nil)) "*A list of (KEY VALUE) to define the read/unread marks for each folder when scanning. If VALUE is non-nil, messages are marked as unread. Otherwise, message are not marked, that is, marked as read. If KEY is t, all folders matches it. The corresponding VALUE is returned always. If KEY is a string, match-function is applied according to 'mew-unread-mark-list-string-type'. If matched, the corresponding VALUE is returned. If KEY is a list of strings, match-function is applied according to 'mew-unread-mark-list-list-type'. If a match found out of the strings, the corresponding VALUE is returned. Candidate values for 'mew-rage-list-string-type' and 'mew-unread-mark-list-list-type' are as follows: 'regex Regular expression. 'recursive Initial substring match. That is, not only a folder specified but all so all sub-folders are matched. 'string String comparison. The default value is: '(((\"+inbox\" \"$inbox\" \"%inbox\" \"-\") t) (t nil)) An example for the case where messages are marked as unread in any folders: '((t t)) Note that this variable is effective only when 'mew-use-unread-mark' is non-nil. " :group 'mew-summary :type '(choice (const nil) (repeat (list (choice (string :tag "Folder") (repeat :tag "Folders" (string :tag "Folder")) (const :tag "Other" t)) string)))) (defcustom mew-unread-mark-list-string-type 'regex "*A value to specify an action if the key is a string in 'mew-unread-mark-list'. Candidates are 'regex, 'recursive, and 'string." :group 'mew-summary :type '(choice (const regex) (const recursive) (const string))) (defcustom mew-unread-mark-list-list-type 'recursive "*A value to specify an action if the key is a list of strings in 'mew-unread-mark-list'. Candidates are 'regex, 'recursive, and 'string." :group 'mew-summary :type '(choice (const regex) (const recursive) (const string))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Scan ;;; (defconst mew-summary-form-header '(mark) "*A list to be appended to summary-form if the first element of summary-form is not an integer. Since Mew assumes that each line of Summary mode begins with one mark, this variable MUST be '(mark).") (defconst mew-custom-type-of-summary-form '(choice (cons :tag "Setup message number column" (integer :tag "Message number column" ) (repeat (choice (string :tag "Insert string") (const :tag "Thread indent" t) (list :tag "Width and symbol" :value (0 type) (integer :tag "Display width") (choice :tag "Symbol" :value type (const type) (const time) (const date) (const year) (const size) (const from) (const subj) (symbol :tag "Other"))) (choice :tag "Symbol" :value type (const type) (const time) (const date) (const year) (const size) (const from) (const subj) (symbol :tag "Other"))))) (repeat :tag "Use default number column" (choice (integer :tag "Message number column") (string :tag "Insert string") (const :tag "Thread indent" t) (list :tag "Width and symbol" :value (0 type) (integer :tag "Display width") (choice :tag "Symbol" :value type (const type) (const time) (const date) (const year) (const size) (const from) (const subj) (symbol :tag "Other"))) (choice :tag "Symbol" :value type (const type) (const time) (const date) (const year) (const size) (const from) (const subj) (symbol :tag "Other")))))) (defvar mew-summary-form-body-starter "|") (defcustom mew-summary-form `(type (5 date) " " (14 from) " " t (30 subj) ,mew-summary-form-body-starter (0 body)) "*The format in Summary mode, called summary-form. summary-form is a list of list, symbol, and string. \(a) A string is printed as it is. \(b) A list consists of an integer and a symbol. The symbol specifies a function to be called. The name of the function is produced by concatenating 'mew-summary-form-func-prefix' and the symbol name. \(e.g. 'mew-summary-form-date' for the symbol 'date'). Pre-defined symbols are 'type, 'time, 'date, 'year, 'size, 'from, 'subj and 'body. For more details, see the explanation of the functions called 'mew-summary-form-'. The integer specifies the width of field which will be filled with a return string of the function. A positive value means padding SPCs on the right if necessary. A negative value means padding SPCs on the left if necessary. If a negative value is specified, the corresponding function must return an ASCII string. 0 means the remaining width and is treated as a positive value. \(c) A symbol except 't' is equivalent to (1 symbol). \(d) The value of mew-summary-form-header (mark) is appended to summary-form when used. See also 'mew-summary-form-header'. \(e) 't' means the position where thread indentation is inserted. An example is as follows: '(type (5 date) \" \" (-4 size) \" \" (14 from) \" \" t (30 subj) \"|\" (0 body)) You can also set this value in 'mew-summary-form-list'." :group 'mew-summary :type mew-custom-type-of-summary-form) (defcustom mew-summary-form-list nil "*A list of (KEY VALUE) to define 'mew-summary-form' for each folder. Each component is (key summary-form). If KEY is t, all folders matches it. The corresponding SUMMARY-FORM is returned always. If KEY is a string, match-function is applied according to 'mew-summary-form-list-string-type'. If matched, the corresponding SUMMARY-FORM is returned. If KEY is a list of strings, match-function is applied according to 'mew-summary-form-list-list-type'. If a match found out of the strings, the corresponding SUMMARY-FORM is returned. Candidate values for 'mew-summary-form-list-string-type' and 'mew-summary-form-list-list-type' are as follows: 'regex Regular expression. 'recursive Initial substring match. That is, not only a folder specified but all so all sub-folders are matched. 'string String comparison. SUMMARY-FORM is a list. See 'mew-summary-form' for more information. An example is as follows: '(((\"+inbox\") (type (5 date) \" \" (-4 size) \" \" (14 from) \" \" t (30 subj) \"|\" (0 body))) (t (type (5 date) \" \" (14 from) \" \" t (30 subj) \"|\" (0 body)))) " :group 'mew-summary :type `(choice (const nil) (repeat (list (choice (string :tag "Folder") (repeat :tag "Folders" (string :tag "Folder")) (const :tag "Other" t)) ,mew-custom-type-of-summary-form (choice (integer :tag "Thread indent column") (const nil)))))) (defcustom mew-summary-form-list-string-type 'regex "*A value to specify an action if the key is a string in 'mew-summary-form-list'. Candidates are 'regex, 'recursive, and 'string." :group 'mew-summary :type '(choice (const regex) (const recursive) (const string))) (defcustom mew-summary-form-list-list-type 'recursive "*A value to specify an action if the key is a list of strings in 'mew-summary-form-list'. Candidates are 'regex, 'recursive, and 'string." :group 'mew-summary :type '(choice (const regex) (const recursive) (const string))) (defcustom mew-summary-form-from-me-prefix "To:" "*The prefix to be prepend to an destination address if the message is originated by me." :group 'mew-summary :type 'string) (defcustom mew-summary-form-extract-rule '(nickname) "*A list to specify what part to extract from the From: field. Each element must be 'name, 'comment, 'address, 'nickname, or appropriate \"regex\". Consider the following examples: A: Kazu Yamamoto B: kazu@example.org (Kazu Yamamoto) C: Kazuhiko Yamamoto (Kazu) Each element returns the following value: 'name Name part, if any A: Kazu Yamamoto B: (No match) C: Kazuhiko Yamamoto (Kazu) 'comment Comment part, if any A: (No match) B: Kazu Yamamoto C: (Kazu) 'address Address part A: kazu@example.org B: kazu@example.org C: kazu@example.org 'nickname One element of personal information in Addrbook according to 'mew-addrbook-for-summary'. The default value of 'mew-addrbook-for-summary' is 'nickname. So, From: is converted a nickname by default. For more information, see 'mew-addrbook-switch'. (regex) The substring first matched If a element does not match, the next element is applied. If no element matches to the From: field, or this value is nil, the whole of the From: field is used." :group 'mew-summary :type '(repeat (choice regexp (const name) (const comment) (const address) (const nickname)))) (defcustom mew-summary-form-mark-delete nil "*If non-nil, the 'D' mark automatically is put onto duplicated messages. If a character, use it as a mark instead of the 'D' mark." :group 'mew-summary :type '(choice (const :tag "Use mew-mark-delete" t) (const :tag "Not use" nil) (character :tag "Use another character"))) (defcustom mew-summary-form-mark-spam nil "*If non-nil, the 'D' mark automatically is put onto SPAM messages. A message is considered a SPAM message if the MD5 checksum of its body is duplicated in a scan. If a character, use it as a mark instead of the 'D' mark." :group 'mew-summary :type '(choice (const :tag "Use mew-mark-delete" t) (const :tag "Not use" nil) (character :tag "Use another character"))) (defcustom mew-summary-form-mark-review nil "*If non-nil, the '*' mark automatically is put onto messages destined to me. If a character, use it as a mark instead of the '*' mark." :group 'mew-summary :type '(choice (const :tag "Use mew-mark-review" t) (const :tag "Not use" nil) (character :tag "Use another character"))) (defcustom mew-summary-form-size-0k nil "*If non-nil, the size of message is displayed as '0k' if the size is less than 1k byte." :group 'mew-summary :type 'boolean) (defcustom mew-summary-form-size-huge t "*If non-nil, the size of message is displayed as 'HUGE' when the size is greater than or equal to 1000 after maximum quantization by 'mew-summary-form-size-unit'." :group 'mew-summary :type 'boolean) (defcustom mew-spam: "X-Bogosity:" "*The field name which your spam filter inserts. E.g. \"X-Spam-Flag:\" for 'spamassassin' \"X-Bogosity:\" for 'bogofilter'" :group 'mew-summary :type 'string) (defcustom mew-scan-fields nil "*A list which specifies mewl's output. The first element MUST be \"Folder:\". The second element MUST be \"Filename:\". Both \"In-Reply-To:\" and \"References:\" MUST be included for thread. The last MUST be \"Body\"." :group 'mew-summary :type '(cons (const "Folder:") (cons (const "Filename:") (repeat string)))) (defvar mew-scan-fields-alias nil "*A list of aliases for 'mew-scan-fields'. Functions called MEW-FOO will be defined according to this variable.") (defvar mew-summary-form-func-prefix "mew-summary-form-" "The prefix for symbol used in 'mew-summary-form'.") (defvar mew-scan-decode-fields (list mew-subj: mew-from: mew-to:)) (defvar mew-scan-decode-bq-body t) (defvar mew-draft-address-warning-fields (list mew-to: mew-cc: mew-dcc: mew-bcc: mew-resent-to: mew-resent-cc: mew-resent-dcc: mew-resent-bcc:)) (defcustom mew-thread-column 28 "A position where thread indentation is inserted for indentation of thread. This valuable is for backward compatibility only. Use 't' in 'mew-summary-form instead." :group 'mew-summary :type 'integer) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Demo ;;; (defcustom mew-demo t "*Mew demo is displayed at boot time if *non-nil*." :group 'mew-env :type 'boolean) (defcustom mew-demo-picture t "*A picture of cats is displayed if *non-nil*." :group 'mew-env :type 'boolean) (defcustom mew-demo-sit-for 0 "*Time of demo picture staying." :group 'mew-env :type '(choice integer (const nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Limits ;;; (defcustom mew-file-max-size 100000 "*The max size of messages. If the size of a message is greater than mew-file-max-size, Mew skips MIME analysis." :group 'mew-message :type 'integer) (defcustom mew-header-reasonable-size 10000 "*The max size of header to be inserted to a temporary buffer to obtain any fields." :group 'mew-message :type 'integer) (defcustom mew-header-max-length 200 "*If the length of a header exceeds this value, it is not arranged nor MIME decoded. See also 'mew-header-max-depth'." :group 'mew-message :type 'integer) (defcustom mew-header-max-depth 50 "*A value to decide loop depth for header field syntax analysis. It was known as mew-loop-depth. See also 'mew-header-max-length'." :group 'mew-message :type 'integer) (defcustom mew-references-max-count 3 "*A value for the max number of message IDs in References: when reply. Non-integer means no limit." :group 'mew-reply :type '(choice (integer :tag "Max count") (const :tag "No limit" nil))) (defcustom mew-lisp-max-length 2000 "*Mew saves an internal lisp structure to a file truncating to this file." :group 'mew-env :type 'integer) (defcustom mew-expand-max-depth 5 "*A value to limit Addrbook expansion loop." :group 'mew-draft :type 'integer) (defcustom mew-log-max-size 512000 ;; 500KB "*A value for the max size of log files." :group 'mew-draft :type 'integer) (defcustom mew-highlight-body-max-size 10000 "A limit for highlighting a body. '0' means No-Limitation" :group 'mew-highlight :type 'integer) (defcustom mew-scan-max-field-length 5 "*Max field length which 'mewl' treats." :group 'mew-env :type 'integer) (defcustom mew-scan-max-body-length 20 "*Max body length which 'mewl' treats." :group 'mew-env :type 'integer) (defcustom mew-scan-body-length 10 "*Body length which Mew treats. Increase this value if 'mew-summary-form-mark-spam' put the 'D' mark onto different messages." :group 'mew-env :type 'integer) (defcustom mew-flowed-fold-threshold 78 "*A threshold length of lines in a draft body. if `mew-use-format-flowed' is `t' and any lines are over this threshold, the format=flowed encoding is used." :group 'mew-draft :type 'integer) (defcustom mew-flowed-fold-length 70 "*A length to which each line is folded when format=flowed is used." :group 'mew-draft :type 'integer) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Ask? ;;; (defcustom mew-ask-subject nil "*If *non-nil* and Subject: is empty, ask a user its value." :group 'mew-draft :type 'boolean) (defcustom mew-ask-to nil "*If *non-nil*, ask a user to whom he/she sends." :group 'mew-draft :type 'boolean) (defcustom mew-ask-cc nil "*If *non-nil*, ask a user to whom he/she sends Cc." :group 'mew-draft :type 'boolean) (defcustom mew-ask-fcc nil "*If *non-nil* and a folder on Fcc: does not exist, ask a user to create it. If nil, folders which are not present are created without any query." :group 'mew-draft :type 'boolean) (defcustom mew-ask-newsgroups nil "*If *non-nil* and Newsgroups: exists, ask a user to send this really." :group 'mew-draft :type 'boolean) (defcustom mew-ask-range nil "*If *non-nil*, Mew asks range if the cache in Summary mode seems invalid. Otherwise, 'update is used for range in the case." :group 'mew-summary :type 'boolean) (defcustom mew-ask-cite-prefix nil "*If *non-nil*, ask citation prefix when cite a message." :group 'mew-cite :type 'boolean) (defcustom mew-ask-pack t "*If *non-nil*, ask whether or not you really want to pack." :group 'mew-summary :type 'boolean) (defcustom mew-ask-send t "*If *non-nil*, ask whether or not you really want to send the message." :group 'mew-draft :type 'boolean) (defcustom mew-ask-post t "*If *non-nil*, ask whether or not you really want to post the message." :group 'mew-draft :type 'boolean) (defcustom mew-ask-flush-queue nil "*If *non-nil*, ask whether or not you really want to flush queue." :group 'mew-draft :type 'boolean) (defcustom mew-ask-flush-case nil "*If *non-nil*, ask case when flushing queue." :group 'mew-summary :type 'boolean) (defcustom mew-ask-charset nil "*Mew asks a user whether or not the charset chosen on composing is appropriate. nil: not ask A list of charset: ask if the charset is not a member of the list t: ask if 'mew-charset-m17n' is used." :group 'mew-draft :type '(choice (const nil) (const t) (repeat string))) (defcustom mew-ask-folder-after-join nil "*If *non-nil*, Mew asks to move to the folder where the join message is stored." :group 'mew-summary :type 'boolean) (defcustom mew-ask-folder-after-burst nil "*If *non-nil*, Mew asks to move to the folder where the burst messages are stored." :group 'mew-summary :type 'boolean) (defcustom mew-ask-pipe nil "*If *non-nil*, Mew confirms when '\\\\[mew-summary-pipe-message]' is used." :group 'mew-summary :type 'boolean) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Use ;;; (defcustom mew-use-full-window nil "*If non-nil, the entire frame is used for Mew. Otherwise, windows are configured dynamically." :group 'mew-env :type 'boolean) (defcustom mew-use-other-frame-for-draft nil "*If non-nil, a new frame is created when a draft is prepared." :group 'mew-env :type 'boolean) (defcustom mew-use-other-frame-for-summary nil "*If non-nil, a new frame is created when you visit a new folder." :group 'mew-env :type 'boolean) (defcustom mew-use-text/enriched t "*If non-nil, Mew parses enriched format text messages." :group 'mew-message :type 'boolean) (defcustom mew-use-text/html nil "*If non-nil, Mew parses text/html messages. If you want to use 'mew-use-text/html-list', this value should be 'nil'." :group 'mew-message :type 'boolean) (defcustom mew-use-text/html-list nil "*A list of (KEY VALUE) to define whether or not HTML should be parsed for each folder. If KEY is t, all folders matches it. The corresponding boolean is returned always. If KEY is a string, match-function is applied according to 'mew-use-text/html-string-type'. If matched, the corresponding boolean is returned. If KEY is a list of strings, match-function is applied according to 'mew-use-text/html-list-type'. If a match found out of the strings, the corresponding boolean is returned. Candidate values for 'mew-use-text/html-string-type' and 'mew-use-text/html-list-type' are as follows: 'regex Regular expression. 'recursive Initial substring match. That is, not only a folder specified but all so all sub-folders are matched. 'string String comparison. " :group 'mew-summary :type '(choice (const nil) (repeat (list (choice (string :tag "Folder") (repeat :tag "Folders" (string :tag "Folder")) (const :tag "Other" t)) boolean)))) (defcustom mew-use-text/html-string-type 'regex "*A value to specify an action if the key is a string in 'mew-use-text/html-list'. Candidates are 'regex, 'recursive, and 'string." :group 'mew-summary :type '(choice (const regex) (const recursive) (const string))) (defcustom mew-use-text/html-list-type 'recursive "*A value to specify an action if the key is a list of strings in 'mew-use-text/html-list'. Candidates are 'regex, 'recursive, and 'string." :group 'mew-summary :type '(choice (const regex) (const recursive) (const string))) (defcustom mew-use-text/xml nil "*If non-nil, Mew parses text/xml messages." :group 'mew-message :type 'boolean) (defcustom mew-use-symbolic-link-for-forwarding nil "*If nil, messages to be forwarded is copied to +draft when '\\\\[mew-summary-forward]' and '\\[mew-summary-multi-forward]' are used. Otherwise, symbolic links are created (if the feature is provided)." :group 'mew-draft :type 'boolean) (defcustom mew-use-cached-passwd nil "*if non-nil, passwords are cached." :group 'mew-privacy :type 'boolean) (defcustom mew-use-master-passwd nil "*if non-nil, a master password is used." :group 'mew-privacy :type 'boolean) (defcustom mew-use-8bit nil "*If non-nil, the 8bit-clean charset mechanism is used for 8bit charsets, such as ISO-8859-1, in Draft mode. If nil, an appropriate MIME encoding such as quoted-printable is applied. This also enables to attach 8bit messages as it is. If nil, 8bit messages are converted into the 7bit form." :group 'mew-draft :type 'boolean) (defcustom mew-use-charset-sanity-check t "*If non-nil, the sanity check of character set is used when composing." :group 'mew-draft :type 'boolean) (defcustom mew-use-autoconv-when-unknown t "*If non-nil, Mew uses 'mew-cs-autoconv' for an unknown coding system." :group 'mew-message :type 'boolean) (defcustom mew-use-burst-folder-history nil "*If non-nil, the folder specified at the previous burst job is used as a folder candidate instead of inbox." :group 'mew-summary :type 'boolean) (defcustom mew-use-biff nil "*If non-nil, Mew displays \"Mail(n)\" in the mode line if your message server receives messages. This is confirmed by POP or IMAP every 'mew-biff-interval' minutes. To use this feature, 'mew-use-cached-passwd' should be 't'. If you want to use the biff functionality against a local mailbox, use 'display-time-mode' instead." :group 'mew-env :type 'boolean) (defcustom mew-use-biff-bell nil "*If non-nil, Mew beeps when the number of messages in your POP server becomes non-zero. To use this feature, 'mew-use-biff' should be 't'." :group 'mew-env :type 'boolean) (defcustom mew-use-sender nil "*If From: contains multiple addresses, Mew adds Sender: anyway. If From: contains one address and SMTP MAIL FROM \('mew-smtp-mail-from') is different from it, this variable effects. If non-nil, Mew adds Sender: and specifies SMTP MAIL FROM to its value. Otherwise, Mew does not add Sender:." :group 'mew-draft :type 'boolean) (defcustom mew-use-x-mailer t "*If non-nil, X-Mailer: is prepared in Draft mode" :group 'mew-draft :type 'boolean) (defcustom mew-use-alternative t "*If non-nil, Multipart/Alternative is treated as a singlepart according to 'mew-mime-multipart-alternative-list'." :group 'mew-summary :type 'boolean) (defcustom mew-disable-alternative-regex-list nil "*A list of regular expression to match the value of X-Mailer:. If one of them matches, Multiprat/Alternative is treated as Multipart/Mixed. An example: (setq mew-disable-alternative-regex-list '(\"Apple Mail\"))" :group 'mew-summary :type '(list regexp)) (defcustom mew-use-text-body t "*If non-nil, a single Text/* body or the first Text/* part in a top level multipart is displayed with its header." :group 'mew-summary :type 'boolean) (defcustom mew-use-nfs-hack nil "*If non-nil, Mew takes some workarounds for NFS." :group 'mew-env :type 'boolean) (defcustom mew-use-old-wvhtml nil "*If non-nil, Mew calls wvHtml in the old argument style." :group 'mew-message :type 'boolean) (defcustom mew-use-net-status t "*If non-nil, Mew displays network status to the mode line." :group 'mew-net :type 'boolean) (defcustom mew-use-fast-refile nil "*If non-nil, 'rassoc' is used to look up the alist of folders. Since it is a built-in function, it makes marking for refile much faster especially when the alist is long. But the fast method is not case-sensitive. So, you should set this variable to 't' only when you does not use capital letters for your folders. If nil, the old slow method, which is case-sensitive, is used." :group 'mew-refile :type 'boolean) (defcustom mew-use-node-folder t "*If non-nil, candidate folders chosen by 'mew-refile-guess-by-folder' includes node folders as well as leaf folders. Otherwise, candidates are selected out of leaf folders only." :group 'mew-refile :type 'boolean) (defcustom mew-use-case-completion t "*If non-nil, 'mew-case' is automatically completed when you input a folder. For example, consider that you input a folder in a local folder after typing '\\\\[mew-summary-goto-folder]'. Typing '%' automatically inserts 'mew-case' before '%'." :group 'mew-summary :type 'boolean) (defcustom mew-use-spc-padding t "*If non-nil, SPCs are padded from the end of lines of Summary mode to the right side." :group 'mew-summary :type 'boolean) (defcustom mew-use-push-mark nil "*If non-nil, '\\\\[mew-summary-jump-top]' and '\\\\[mew-summary-jump-bottom]' push the mark." :group 'mew-summary :type 'boolean) (defcustom mew-use-old-pgp nil "*If non-nil, the old fashioned PGP message are used when signing/encrypting. Otherwise PGP/MIME is used." :group 'mew-privacy :type 'boolean) (defcustom mew-use-full-alias nil "*If non-nil, the entire addresses of learned address are used as a key of address completion. Otherwise, the user parts of the learned address are used." :group 'mew-summary :type 'boolean) (defcustom mew-use-unread-mark nil "*If non-nil, the unread mark is used in Summary mode." :group 'mew-summary :type 'boolean) (defcustom mew-delete-unread-mark-by-mark t "*If nil, the unread mark remains when the cursor is moved to the current message from the previous message by putting any mark on the previous one. If non-nil, the unread mark is deleted." :group 'mew-summary :type 'boolean) (defcustom mew-use-smtp-auth t "*If nil, SMTP AUTH is ignored even an SMTP server returns the AUTH capability." :group 'mew-smtp :type 'boolean) (defcustom mew-smtp-auth-plain-authorize-id nil "*If nil, SMTP AUTH PLAIN is created as follow: NUL authenticate-id NUL password If non-nil, it is created as follow: authorize-id NUL authenticate-id NUL password For more information, see RFC 2595." :group 'mew-smtp :type 'boolean) (defcustom mew-use-punycode t "*If non-nil, punycode strings are decoded into IDN strings" :group 'mew-message :type 'boolean) (defcustom mew-use-async-write nil "*If non-nil, message retrieval of POP/IMAP/NNTP on Unix uses asynchronous write for each message and fsync in their sentinel." :group 'mew-net :type 'boolean) (defcustom mew-use-format-flowed nil "*If non-nil, Text/Plain; format=flowed is used when composing. If you cite a message, the citation style of format=flowed is used. " :group 'mew-draft :type 'boolean) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Appearance ;;; (defcustom mew-window-configuration '((summary (1 0)) (message (8 31)) (draft (1 0))) "*Ratio of windows" :group 'mew-env :type '(list (list (const summary) (list integer integer)) (list (const message) (list integer integer)) (list (const draft) (list integer integer)))) (defcustom mew-mode-line-id "Mew: %12b" "*A default value of mode-line-buffer-identification for each Mew mode." :group 'mew-summary :type 'sexp) ;; Indirect call of propertized-buffer-identification due to XEmacs (defun mew-mode-line-id () (propertized-buffer-identification mew-mode-line-id)) (defcustom mew-multipart-icon-position 'right "*Position where multipart icons are displayed. If 'left, displayed at the left size of the default toolbar. If 'right, displayed at the right size of the default toolbar. Otherwise, not displayed." :group 'mew-summary :type 'symbol) (defcustom mew-window-home-buffer "*scratch*" "*Buffer name to return if window stack is empty." :group 'mew-summary :type 'string) (defcustom mew-window-magic 80 "*Minimum window width to scan messages in Summary mode." :group 'mew-summary :type 'integer) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Summary mode ;;; (defcustom mew-print-function 'lpr-buffer "*A function for printing" :group 'mew-summary :type 'symbol) (defcustom mew-summary-show-direction 'next "*Direction for SPC at end of message. 'up 'down 'next(current direction) 'stop. Other values are considered as 'stop. See also 'mew-summary-mark-direction'." :group 'mew-summary :type '(choice (const next) (const up) (const down) (const stop))) (defcustom mew-summary-mark-direction 'next "*Direction after marking a message 'up 'down 'next(current direction) 'stop. Other values are considered as 'stop. See also 'mew-summary-show-direction'." :group 'mew-summary :type '(choice (const next) (const up) (const down) (const stop))) (defcustom mew-summary-show-pause nil "*Pause on going to next message if *non-nil*. See also 'mew-summary-show-direction' and 'mew-summary-mark-direction'." :group 'mew-summary :type 'boolean) (defcustom mew-summary-mark-duplicated-skip 'first "*This value decides which duplicated message should not be marked with 'mew-mark-duplicated' when 'mew-summary-mark-duplicated' is executed. Possible value is 'first, 'last, or nil. nil means to mark all duplicated messages. Other values are considered as 'first." :group 'mew-summary :type '(choice (const first) (const last) (const nil))) (defcustom mew-summary-recenter-p t "*If *non-nil*, the current message is recentered in Summary mode when displayed." :group 'mew-summary :type 'boolean) (defcustom mew-summary-scan-width nil "*If *non-nil*, used as the width of Summary mode." :group 'mew-summary :type '(choice integer (const nil))) (defcustom mew-summary-goto-line-then-display t "*If non-nil 'mew-summary-goto-line' displays the message where the cursor jumped." :group 'mew-summary :type 'boolean) (defcustom mew-summary-jump-top-then-display t "*If non-nil 'mew-summary-jump-top' displays the top message where the cursor jumped to the top." :group 'mew-summary :type 'boolean) (defcustom mew-summary-jump-bottom-then-display t "*If non-nil 'mew-summary-jump-bottom' displays the bottom message where the cursor jumped to the bottom." :group 'mew-summary :type 'boolean) (defcustom mew-summary-region-include-cursor-line nil "*This value decides whether or not the cursor line is included to a region." :group 'mew-summary :type '(choice (const :tag "Include if the cursor is not on the beginning of the line" nil) (const :tag "Include if the cursor is on the end of the line" end) (const :tag "Include always" t))) (defvar mew-highlight-timer-interval 3) (defcustom mew-syntax-treat-filename-function 'mew-syntax-treat-filename-default-function "*A function to modify file names specified by Content-Disposition:" :group 'mew-summary :type 'symbol) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Message mode ;;; (defcustom mew-end-of-message-string "[End of message]" "*A value inserted on the end of message buffer if *non-nil*." :group 'mew-message :type '(choice string (const nil))) (defcustom mew-end-of-part-string "[Message is continued]" "*A value inserted on the end of message buffer if *non-nil*." :group 'mew-message :type '(choice string (const nil))) (defcustom mew-break-pages t "*If *non-nil*, a message is broken by mew-page-delimiter." :group 'mew-message :type 'boolean) (defcustom mew-insert-final-newline t "*If *non-nil*, and if text/plain does not have final newline, insert a newline at the end of buffer. " :group 'mew-message :type 'boolean) (defcustom mew-field-other-visible t "*If *non-nil*, fields which are not found in 'mew-field-spec' are displayed after visible fields. Otherwise they are hidden before visible fields (and after invisible fields)." :group 'mew-message :type 'boolean) (defcustom mew-use-header-veil t "*If *non-nil*, field lines of To: and Cc: over 'mew-header-veil-count' are covered with invisible veils." :group 'mew-message :type 'boolean) (defcustom mew-header-veil-string "..." "*A string to indicate some lines are covered with a veil." :group 'mew-message :type 'string) (defcustom mew-header-veil-count 4 "*The limit number for veil." :group 'mew-message :type 'integer) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Draft mode ;;; (defcustom mew-draft-mode-auto-save t "*If t, a draft is repeatedly saved to 'buffer-auto-save-file-name' by 'do-auto-save'. If automatic saving is enabled and Emacs is crashed, the '.save-' file remains. If this value is nil, automatic saving does not work resulting that no garbage file remains." :group 'mew-draft :type 'boolean) (defcustom mew-header-alist nil "*List of (key value) for header field to be inserted on draft. '((\"X-fingerprint:\" \"6B 63 38 88 67 5E 96 8E CE A4 62 73 3F 11 64 94\") (\"X-URL:\" \"http://www.example.org/\"))" :group 'mew-draft :type '(list (list string string))) (defcustom mew-require-final-newline t "*If non-nil, Mew adds a new line to the draft if ended without a new line." :group 'mew-draft :type 'boolean) (defcustom mew-comment-start ">" "*The value to be set to comment-start in Draft mode." :group 'mew-draft :type 'string) (defcustom mew-comment-start-skip "^> *" "*The value to be set to comment-start-skip in Draft mode." :group 'mew-draft :type 'string) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Draft mode ;;; (defcustom mew-reply-to nil "*A value inserted into Reply-To: field in Draft mode if *non-nil*. See also 'mew-config-alist'." :group 'mew-draft :type '(choice string (const nil))) (defcustom mew-fcc "+backup" "*A value inserted into Fcc: field in Draft mode if *non-nil*. See also 'mew-config-alist'." :group 'mew-draft :type '(choice string (const nil))) (defcustom mew-cc nil "*A value inserted into Cc: field in Draft mode if *non-nil*. See also 'mew-config-alist'." :group 'mew-draft :type '(choice string (const nil))) (defcustom mew-bcc nil "*A value inserted into Bcc: field in Draft mode if *non-nil*. See also 'mew-config-alist'." :group 'mew-draft :type '(choice string (const nil))) (defcustom mew-dcc nil "*A value inserted into Dcc: field in Draft mode if *non-nil*. If the value is 'me, your address is automatically inserted according to the case. See also 'mew-config-alist'." :group 'mew-draft :type '(choice string (const nil))) (defcustom mew-from nil "*A value inserted into From: field in Draft mode if *non-nil*. For backward-compatibility. See also 'mew-name', 'mew-user', and 'mew-mail-domain'." :group 'mew-draft :type '(choice string (const nil))) (defcustom mew-organization nil "*A value inserted into Organization: field in Draft mode if *non-nil*. See also 'mew-config-alist'." :group 'mew-draft :type '(choice string (const nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Citation ;;; (defcustom mew-cite-prefix nil "*Prefix of citation." :group 'mew-cite :type '(choice string (const nil))) (defcustom mew-cite-hook nil "*Hook for an external cite mechanism. If you want to use super-cite, (setq mew-cite-hook 'sc-cite-original)." :group 'mew-cite :type 'hook) (defcustom mew-cite-strings-function 'mew-cite-strings "*Function called from mew-cite-original which to create cite labels according to 'mew-cite-format' and 'mew-cite-fields'." :group 'mew-cite :type '(choice function (const nil))) (defcustom mew-before-cite-hook nil "Called in mew-summary-reply-with-citation before citation." :group 'mew-cite :type 'hook) (defcustom mew-cite-prefix-function nil "*Function called on citations. A good candidate is 'mew-cite-prefix-username" :group 'mew-cite :type '(choice function (const nil))) (defcustom mew-cite-prefix-confirmp nil "*If *non-nil*, citation prefix (such as 'kazu> ') is confirmed to be used." :group 'mew-cite :type 'boolean) (defcustom mew-cite-fields (list mew-from: mew-subj: mew-date:) "*The fields that you want to extract as citation label. If you change this valuable, you must change mew-cite-format. The value of the first field becomes the first argument for mew-cite-format. \(e.g. The default first argument is a value of From: field.) The value of the second field becomes the second argument for mew-cite-format. .... If this is nil, label is not generated." :group 'mew-cite :type '(repeat string)) (defcustom mew-cite-format "From: %s\nSubject: %s\nDate: %s\n\n" "*Format for the citation label." :group 'mew-cite :type 'string) (defcustom mew-draft-cite-fill-mode nil "*A method to format a citation header. If 'wrap, format with fill-region. If 'truncate, cut over fill-column and insert 'mew-draft-cite-ellipses'." :group 'mew-draft :type '(choice (symbol :tag "Wrap" wrap) (symbol :tag "Truncate" truncate) (symbol :tag "Asis" nil))) (defcustom mew-draft-cite-ellipses " .." "String that is inserted a truncated line when 'mew-draft-cite-fill-mode' is 'truncate." :group 'mew-cite :type 'string) (defcustom mew-draft-cite-label-fill-column nil "If *non-nil*, this value is used for 'mew-draft-cite-fill-mode' instead of 'fill-column'." :group 'mew-cite :type '(choice integer (const nil))) (defcustom mew-summary-reply-position 'body "If 'body, the cursor locates in the beginning of the body. Otherwise, the cursor is after To:." :group 'mew-cite :type 'symbol) (defcustom mew-summary-reply-with-citation-position 'end "If 'body, the cursor locates in the beginning of the body. If 'end, the cursor locates after the citation. Otherwise, the cursor is after To:." :group 'mew-cite :type 'symbol) (defcustom mew-cite-ignore-region nil "*If *non-nil*, the region of a draft is ignored when citing." :group 'mew-cite :type 'boolean) (defcustom mew-cite-ignore-mouse-region t "*If *non-nil*, a region specified by mouse is ignored when citing." :group 'mew-cite :type 'boolean) (defcustom mew-visit-queue-after-sending nil "*If *non-nil*, visit to +queue after '\\\\[mew-draft-make-message]' in Draft mode." :group 'mew-draft :type 'boolean) (defcustom mew-visit-inbox-after-setting-case nil "*If *non-nil*, visit to an appropriate inbox after setting a case with '\\\\[mew-summary-set-case]'." :group 'mew-summary :type 'boolean) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Charset ;;; (defcustom mew-charset-input-method-alist nil "*Alist of charset and input-method. When a message is cited into Draft mode the charset of the message is found in this variable, the corresponding input-method is automatically selected. An example configuration is as follows: \(setq mew-charset-input-method-alist '((\"iso-8859-1\" \"latin-1-postfix\") (\"iso-8859-2\" \"latin-2-postfix\"))) " :group 'mew-draft :type '(list (list string string))) (defun mew-charset-to-input-method (charset) (if (stringp charset) (mew-alist-get-value (mew-assoc-case-equal charset mew-charset-input-method-alist 0)))) (defcustom mew-charset-m17n "utf-8" "*A charset to be used if multiple character set are found and an appropriate charset cannot be chosen. Possible candidates are \"utf-8\" and \"iso-2022-jp-2\"." :group 'mew-draft :type '(choice (const "utf-8") (const "iso-2022-jp-2"))) (defcustom mew-charset-latin "iso-8859-15" "*This variable is used for selection of charset when composing. If characters of both Latin 1 and Lain 9 exist in a draft, Mew takes the following step to decide a charset. 1. If 'unify-8859-on-decoding-mode' is used: 1.1. Use \"iso-8859-1\" if no loss. 1.2. Otherwise, use \"utf-8\". 2. If 'unify-8859-on-decoding-mode' is not used: 2.1. If both ISO-8859-1 and ISO-8859-15 can be used with no loss, 'mew-charset-latin' is used. 2.2. Use \"iso-8859-1\" if no loss. 2.3. Use \"iso-8859-15\" if no loss. 2.3. Otherwise, use \"utf-8\". " :group 'mew-draft :type '(choice (const "iso-8859-1") (const "iso-8859-15"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Signature ;;; (defcustom mew-signature-file "~/.signature" "*A signature file to be inserted in Draft mode. To support multiple signature files, use 'c-sig.el'." :group 'mew-draft :type 'file) (defcustom mew-signature-insert-last nil "*If *non-nil*, the signature file is inserted in the last of body. Otherwise, it is inserted at the current point. If you created multipart and mew-signature-as-lastpart is *non-nil*, this variable is ignored." :group 'mew-draft :type 'boolean) (defcustom mew-signature-as-lastpart nil "*If *non-nil*, the signature file is appended as the final part when you create multipart." :group 'mew-draft :type 'boolean) (defcustom mew-signature-description "My signature" "*This variable is used as a description if the signature is appended as the final part." :group 'mew-draft :type 'string) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Samba ;;; (defcustom mew-use-samba-encoding nil "*Use SAMBA encoding for non-ASCII file name when saving." :group 'mew-summary :type 'boolean) (defcustom mew-use-samba-encoding-type 'cap "*A type of SAMBA encoding. Either 'cap or 'hex." :group 'mew-summary :type '(choice (const cap) (const hex))) (defcustom mew-cs-samba 'shift_jis "*A character set before SAMBA encoding." :group 'mew-summary :type 'coding-system) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Attachments ;;; (defcustom mew-attach-move-by-line nil "*If non-nil, 'mew-attach-{next,previous}' move the cursor line by line." :group 'mew-draft :type 'boolean) (defcustom mew-attach-move-next-after-copy nil "If non-nil, the cursor moves the next position after copying/linking in Attachments." :group 'mew-draft :type 'boolean) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Completion ;;; (defcustom mew-fields (list mew-from: mew-to: mew-cc: mew-dcc: mew-fcc: mew-bcc: mew-subj: mew-reply-to: mew-followup-to: mew-newsgroups: mew-distribution: mew-resent-from: mew-resent-to: mew-resent-cc: mew-resent-dcc: mew-resent-fcc: mew-resent-bcc:) "*Completion field list in Draft mode." :group 'mew-complete :type '(repeat string)) (defcustom mew-complete-case-ignore-case nil "*Non-nil means Mew does not consider case is significant in case completion." :group 'mew-complete :type 'boolean) (defcustom mew-complete-folder-ignore-case nil "*Non-nil means Mew does not consider case is significant in folder completion." :group 'mew-complete :type 'boolean) (defcustom mew-complete-address-ignore-case t "*Non-nil means Mew does not consider case is significant in address completion." :group 'mew-complete :type 'boolean) (defcustom mew-circular-complete-domain-ignore-case t "*Non-nil means Mew does not consider case is significant in circular domain completion." :group 'mew-complete :type 'boolean) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Field order ;;; (defcustom mew-field-order-for-editing (list mew-to: mew-newsgroups: mew-cc: mew-subj: mew-from:) "*A field order list for editing." :group 'mew-draft :type '(repeat string)) (defcustom mew-field-order-for-reediting (list mew-to: mew-newsgroups: mew-cc: mew-subj: mew-from:) "*A field order list for reediting." :group 'mew-draft :type '(repeat string)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Fields to be deleted ;;; (defcustom mew-field-delete-common '("From " ">From" "X-Mew") "*A field list to be deleted for reediting/resending/forwarding/saving." :group 'mew-draft :type '(choice (const nil) (repeat :tag "Field list" (string :tag "Field")))) (defvar mew-field-delete nil) ;; backward compatibility (defcustom mew-field-delete-for-editing (list mew-received: "Return-Path:" "Delivery-Date:" "Delivered-To:" mew-message-id: mew-mv: "Content-" "Precedence:" mew-organization: "X-" "Lines:" "Status:" "Posted:" "Forwarded:" "Replied:" "X-UIDL:" "DomainKey-Signature:" "DKIM-Signature:" "Authentication-Results:" "List-.*:" "Errors-To:") "*A field list to be deleted in Edit mode." :group 'mew-draft :type '(choice (const nil) (repeat :tag "Field list" (string :tag "Field")))) (defcustom mew-field-delete-for-reediting (or mew-field-delete (list mew-received: "Return-Path:" "Delivery-Date:" "Delivered-To:" mew-date: mew-message-id: mew-mv: "Content-" "Precedence:" mew-organization: "X-" "Lines:" "Status:" "Posted:" "Forwarded:" "Replied:" "X-UIDL:" "DomainKey-Signature:" "DKIM-Signature:" "Authentication-Results:" "List-.*:" "Errors-To:" "Sender:")) "*A field list to be deleted when edit again." :group 'mew-draft :type '(choice (const nil) (repeat :tag "Field list" (string :tag "Field")))) (defcustom mew-field-delete-for-others (list mew-received: "Return-Path:" "Delivery-Date:" "Delivered-To:" mew-to: mew-cc: mew-from: mew-organization: "Lines:" "Status:" "Posted:" "Forwarded:" "Replied:" "X-UIDL:" "DomainKey-Signature:" "DKIM-Signature:") "*A field list to be deleted when send with different To: and Cc:." :group 'mew-draft :type '(choice (const nil) (repeat :tag "Field list" (string :tag "Field")))) (defcustom mew-field-delete-for-resending (list mew-received: "Return-Path:" "Delivery-Date:" "Delivered-To:" "Resent-" "X-Resent-" "Lines:" "Status:" "Posted:" "Forwarded:" "Replied:" "X-UIDL:") "*A field list to be deleted when resending." :group 'mew-draft :type '(choice (const nil) (repeat :tag "Field list" (string :tag "Field")))) (defcustom mew-field-delete-for-forwarding '("Lines:" "Status:" "Posted:" "Forwarded:" "Replied:" "X-UIDL:") "*A field list to be deleted when forwarding." :group 'mew-draft :type '(choice (const nil) (repeat :tag "Field list" (string :tag "Field")))) (defcustom mew-field-delete-for-saving () "*A field list to be deleted when saving a message to a file." :group 'mew-summary :type '(choice (const nil) (repeat :tag "Field list" (string :tag "Field")))) (defcustom mew-field-delete-for-joining (list mew-mv: mew-subj: mew-message-id: "Encrypted" "Content-") "*A field list to be deleted when joining." :group 'mew-summary :type '(repeat :tag "Field list" (string :tag "Field"))) (defcustom mew-field-for-printing '("Subject:" "From:" "To:" "Cc:" "Date:") "*A field list to print" :group 'mew-summary :type '(repeat :tag "Field list" (string :tag "Field"))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Directory stuff ;;; (defcustom mew-summary-trace-directory t "*If non-nil, change to the folder directory when mew-summary-goto-folder." :group 'mew-summary :type 'boolean) (defcustom mew-save-dir mew-home "*The default directory to save messages or parts in Summary mode. See also 'mew-copy-dir'." :group 'mew-summary :type 'directory) (defcustom mew-summary-preserve-dir nil "*If non-nil, the previous directory is used as the default directory for save, etc. See also 'mew-draft-preserve-dir'." :group 'mew-summary :type 'boolean) (defcustom mew-copy-dir mew-home "*The default directory from which attachments are copied in Draft mode. See also 'mew-save-dir'." :group 'mew-draft :type 'directory) (defcustom mew-draft-preserve-dir nil "*If non-nil, the previous directory is used as the default directory for copy, etc. See also 'mew-summary-preserve-dir'." :group 'mew-draft :type 'boolean) (defcustom mew-file-append-p nil "*If *non-nil*, a message or a part is appended to the existing file on '\\\\[mew-summary-save]'. Otherwise overwrote." :group 'mew-summary :type 'boolean) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Folders ;;; (defcustom mew-regex-folder-candidate "^[^.#0-9]\\|^[0-9].*[^0-9]" "*Regular expression used in 'mew-dir-list-with-link-count' and 'mew-dir-list-without-link-count' to list up folder candidates. The default value \"^[^.#0-9]\\\\|^[0-9].*[^0-9]\" lists up folders whose name is alphabet only." :group 'mew-env :type 'regexp) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Refile ;;; (defconst mew-custom-type-of-guess-alist '(list (list string (list string string)))) (defcustom mew-refile-guess-alist nil "*If non-nil, mew guesses destination folder by using this hint. The format is like this: (setq mew-refile-guess-alist '((\"To:\" (\"wide@wide\" \"+wide/wide\") (\"adam\" \"+labo/adam\")) (\"Newsgroups:\" (\"^nifty\\\\.\\\\([^ ]+\\\\)\" \"+Nifty/\\\\1\")) (\"From:\" (\"uucp\" \"+adm/uucp\") (\".*\" \"+misc\")) )) " :group 'mew-refile :type mew-custom-type-of-guess-alist) (defcustom mew-refile-ctrl-multi t "*If *non-nil*, guess functions guess multi folders." :group 'mew-refile :type 'boolean) (defcustom mew-refile-guess-key-list (append mew-resent-dest:-list mew-destination:-list) "*A list of field key used by mew-refile-guess-by-folder." :group 'mew-refile :type '(repeat string)) (defvar mew-refile-guess-control '(mew-refile-guess-by-alist mew-refile-ctrl-throw mew-refile-guess-by-newsgroups mew-refile-guess-by-folder mew-refile-ctrl-throw mew-refile-ctrl-auto-boundary mew-refile-guess-by-thread mew-refile-ctrl-throw mew-refile-guess-by-from-folder mew-refile-ctrl-throw mew-refile-guess-by-from mew-refile-ctrl-throw mew-refile-guess-by-default)) (defcustom mew-refile-auto-refile-skip-any-mark nil "*If *non-nil*, 'mew-summary-auto-refile' does not touch any already marked message." :group 'mew-refile :type 'boolean) (defcustom mew-refile-auto-refile-confirm nil "*If *non-nil*, 'mew-summary-auto-refile' prompts the user for confirmation before refiling." :group 'mew-refile :type 'boolean) (defcustom mew-refile-guess-strip-domainpart t "*If *non-nil*, 'mew-refile-guess-by-default' strips domainpart of from" :group 'mew-refile :type 'boolean) (defcustom mew-refile-guess-from-me-is-special nil "*If *non-nil*, 'mew-refile-guess-by-from-*' think the messages from yourself as special. They use To: or Cc: instead of From:" :group 'mew-refile :type 'boolean) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Case guess ;;; (defcustom mew-case-guess-alist nil "*If *non-nil*, this value is used to guess cases when prepared or composed. The syntax is exactly the same as 'mew-refile-guess-alist'." :group 'mew-draft :type mew-custom-type-of-guess-alist) (defcustom mew-case-guess-when-replied-alist nil "*If *non-nil*, this value is used to guess cases when replied. The syntax is exactly the same as 'mew-refile-guess-alist'." :group 'mew-draft :type mew-custom-type-of-guess-alist) (defcustom mew-case-guess-when-prepared t "*If *non-nil*, case is guessed when a draft is prepared." :group 'mew-draft :type 'boolean) (defcustom mew-case-guess-when-composed nil "*If *non-nil*, case is guessed when a message is composed." :group 'mew-draft :type 'boolean) (defcustom mew-case-guess-when-replied t "*If *non-nil*, case is guessed when replying to a message." :group 'mew-draft :type 'boolean) (defcustom mew-case-guess-addition nil "*If *non-nil*, new guessed cases are added to old cases. Otherwise, the old cases are overridden." :group 'mew-draft :type 'boolean) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Temporary files ;;; (defcustom mew-temp-file-initial (expand-file-name (user-login-name) (if (fboundp 'temp-directory) (temp-directory) (if (boundp 'temporary-file-directory) temporary-file-directory "/tmp"))) "*Hint to make a secure directory on the local file system. On setup phase Mew make a secure directory from this variable and set mew-temp-file a file name prefix contained the directory name. The directory must be unreadable from others, otherwise it might become a big security hole. And this directory must not be gained access through network to prevent tire-tapping. Mew never uses 'call-process-region' rather does use 'call-process' creating a temporary file with mew-temp-file by itself. If 'call-process-region' is used, Emacs creates a temporary file (probably in /tmp). So bad guys can wiretap the temporary file." :group 'mew-privacy :type 'directory) (defcustom mew-delete-temp-file t "*If *non-nil*, delete temporary files when external commands terminate." :group 'mew-summary :type 'boolean) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Auto ;;; (defcustom mew-auto-get t "If *non-nil*, Mew gets messages from your mailbox automatically. '\\[universal-argument] \\[mew]' equals to '\\[mew]' with 'mew-auto-get' reversed." :group 'mew-summary :type 'boolean) (defcustom mew-auto-flush-queue t "If *non-nil* and if there are queued messages in +queue, they are flushed after getting message (i.e. '\\\\[mew-summary-retrieve]'). This idea saves money in dial up environment." :group 'mew-draft :type 'boolean) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Pick and Sort ;;; (defcustom mew-pick-pattern-list nil "*A list of pick pattern which can be circular completed with '\\\\[mew-circular-complete-switch]' The first member is displayed as a default value." :group 'mew-summary :type '(choice (const nil) (repeat string))) (defcustom mew-pick-field-list '("head=" "to=" "cc=" "subject=" "dcc=" "fcc=" "bcc=" "date=" "reply-to=" "followup-to=" "from=" "newsgroups=") "*A list of key for pick pattern." :group 'mew-summary :type '(choice (const nil) (repeat string))) (defcustom mew-sort-default-key "date" "*Default sort key when inputting a sort key. Its format is key:mode where more is found in 'mew-sort-mode'." :group 'mew-summary :type 'string) (defcustom mew-sort-default-key-alist nil "*List of (folder sort-key) to decide a default sort-key of a specific folder. An example is follows: \(setq mew-sort-default-key-alist '((\"+tmp/beginners\" \"x-sequence\") (\"+tmp/elips\" \"x-mail-count\")))" :group 'mew-summary :type '(list (list string string))) (defcustom mew-sort-key-alist '(("date" "date") ("subject") ("from") ("to") ("newsgroups") ("posted" "date") ("x-sequence" "postnum") ("x-mail-count" "num") ("x-ml-count" "num")) "*List of fields for 'mew-summary-sort'. Each element is (FIELD-NAME) or (FIELD-NAME . MODE). MODE is one of \"date\" (by chronological order) or \"num\" (by numerical order) or \"postnum\" (by numerical order of postfix numeric) or \"text\" (by alphabetical order) or \"ml\" (by alphabetical order with ml prefix removed) or \"mlnum\" (by numerical order of ml number). \(nil means \"text\")." :group 'mew-summary :type 'sexp) (defvar mew-sort-modes '("date" "num" "postnum" "text" "ml" "mlnum")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Range ;;; (defvar mew-range-all "0") (defvar mew-range-str-all "all") (defvar mew-range-str-update "update") (defvar mew-range-str-last "last:") (defvar mew-range-str-sync "sync") (defcustom mew-input-range-list (list mew-range-str-update mew-range-str-all mew-range-str-last) "*A list used by range completion." :group 'mew-complete :type '(repeat string)) (defcustom mew-input-range-remote-list (list mew-range-str-update mew-range-str-all mew-range-str-last mew-range-str-sync) "*A list used by range completion." :group 'mew-complete :type '(repeat string)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Highlight ;;; (defvar mew-summary-cook-function 'mew-summary-cook-region) (defcustom mew-use-highlight-mark t "*If non-nil, highlight marked lines in Summary/Virtual mode." :group 'mew-highlight :type 'boolean) (defcustom mew-use-highlight-header t "*If non-nil, highlight a header in Message/Draft mode." :group 'mew-highlight :type 'boolean) (defcustom mew-use-highlight-body t "*If non-nil, highlight a body in Message/Draft mode." :group 'mew-highlight :type 'boolean) (defcustom mew-use-highlight-url t "*If non-nil, highlight URLs in Message/Draft mode." :group 'mew-highlight :type 'boolean) (defcustom mew-use-cursor-mark nil "*If *non-nil*, show 'mew-cursor-mark' in the beginning of the cursor line. This is convenient if 'mew-use-highlight-cursor-line' is not available." :group 'mew-highlight :type 'boolean) (defcustom mew-use-highlight-cursor-line t "*Put the 'mew-highlight-cursor-line-face' face on the current line in Summary/Virtual mode." :group 'mew-highlight :type 'boolean) (defcustom mew-use-highlight-mouse-line nil "*Put the 'mew-highlight-mouse-line-face' face on the mouse location in Summary/Virtual mode." :group 'mew-highlight :type 'boolean) (defcustom mew-use-highlight-x-face mew-icon-p "*Iconify X-Face: in Message mode." :group 'mew-highlight :type 'boolean) (defcustom mew-use-highlight-x-face-inversion nil "*Invert an X-Face: image in Message mode." :group 'mew-highlight :type 'boolean) ;;; ;;; Styles and colors ;;; (defcustom mew-cursor-mark ">" "*The mark in the beginning of the cursor line if 'mew-use-cursor-mark' is *non-nil*." :group 'mew-highlight :type '(choice string (const nil))) (defcustom mew-highlight-cursor-line-face 'underline "*Face to highlight the cursor line in Summary/Virtual mode" :group 'mew-highlight :type 'face) (defcustom mew-highlight-mouse-line-face 'highlight "*Mouse face to highlight URL in Message/Draft mode" :group 'mew-highlight :type 'face) (defcustom mew-regex-url (concat "\\b\\(" "\\(\\(file\\|news\\|mailto\\):\\)" "\\|" "\\(\\(s?https?\\|ftp\\|gopher\\|telnet\\|wais\\)://\\)" "\\)" "[^ \t\n>)\"]*" "[^] \t\n>.,:)\"]") "*Regular expression to find URL." :group 'mew-highlight :type 'regexp) (defcustom mew-highlight-url-mouse-face 'highlight "*Mouse face to highlight URL in Message/Draft mode" :group 'mew-highlight :type 'face) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Addrbook ;;; (defcustom mew-use-auto-alias t "*If non-nil, addresses on the To: and Cc: field in Draft mode will be automatically leaned as alias." :group 'mew-addrbook :type 'boolean) (defcustom mew-addrbook-comment-regex "^;.*$\\|#.*$" "*Regular expression for Addrbook." :group 'mew-addrbook :type 'regexp) (defcustom mew-addrbook-append-domain-p t "If non-nil, addresses, which do not have domain part in a header, will be appended (mew-mail-domain) when composing." :group 'mew-addrbook :type 'boolean) (defcustom mew-addrbook-override-by-newone t "If non-nil, the 'user' entry in 'mew-alias-auto-alist' is override by a new entry of (user different-address). This means that addresses in To: and Cc: in Draft mode are always learned with an exception 'user' is defined in Addrbook. If nil, the old 'user' entry remains." :group 'mew-addrbook :type 'boolean) (defcustom mew-addrbook-for-cite-label nil "*How to replace the From: value in cite label with Addrbook. See 'mew-addrbook-switch'." :group 'mew-addrbook :type 'symbol) (defcustom mew-addrbook-for-cite-prefix 'username "*How to replace the From: value in cite prefix with Addrbook. See 'mew-addrbook-switch'." :group 'mew-addrbook :type 'symbol) (defcustom mew-addrbook-for-address-expansion 'name "*How to replace an address in address fields with Addrbook. See 'mew-addrbook-switch'." :group 'mew-addrbook :type 'symbol) (defcustom mew-addrbook-for-summary 'nickname "*How to replace a From: address in summary-form with Addrbook. See 'mew-addrbook-switch' and 'mew-summary-form-extract-rule'." :group 'mew-addrbook :type 'symbol) (defcustom mew-addrbook-strip-domainpart t "*If *non-nil*, a shortname is created by stripping its domain part when '\\\\[mew-summary-addrbook-add]' in Summary mode." :group 'mew-addrbook :type 'boolean) (defcustom mew-addrbook-alias-not-learn-list nil "*A list of a part of address. If an address matches to one out of the list. the address is not registered to Addrbook." :group 'mew-addrbook :type '(choice (const nil) (repeat string))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Cache ;;; (defcustom mew-cache-size 10 "*Number of buffer for message cache." :group 'mew-cache :type 'integer) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Privacy ;;; (defcustom mew-draft-privacy-method 'pgp "Privacy method to create messages in Draft mode. You should choose 'pgp or 'smime." :group 'mew-privacy :type '(choice (const pgp) (const smime))) (defcustom mew-protect-privacy-always nil "*If non-nil, a draft is to be protected according to 'mew-protect-privacy-always-type'." :group 'mew-privacy :type 'boolean) (defcustom mew-protect-privacy-always-type 'pgp-signature "*A type of privacy protection for all drafts. Currently, 'pgp-signature, 'pgp-encryption, 'pgp-signature-encryption, 'pgp-encryption-signature, and nil are available. Since signature does not require receiver's public key, signature service may be appropriate for this value." :group 'mew-privacy :type '(choice (const pgp-signature) (const pgp-encryption) (const pgp-signature-encryption) (const pgp-encryption-signature) (const smime-signature) (const smime-encryption) (const smime-signature-encryption) (const smime-encryption-signature) (other :tag "nil" nil))) (defcustom mew-protect-privacy-encrypted nil "*If non-nil, a draft replying a encrypted message is to be protected according to 'mew-protect-privacy-encrypted-type'." :group 'mew-privacy :type 'boolean) (defcustom mew-protect-privacy-encrypted-type 'pgp-encryption "*A type of privacy protection for drafts replying encrypted messages. Currently, 'pgp-signature, 'pgp-encryption, 'pgp-signature-encryption, 'pgp-encryption-signature, and nil are available." :group 'mew-privacy :type '(choice (const pgp-signature) (const pgp-encryption) (const pgp-signature-encryption) (const pgp-encryption-signature) (const smime-signature) (const smime-encryption) (const smime-signature-encryption) (const smime-encryption-signature) (other :tag "nil" nil))) (defcustom mew-protect-privacy-with-old-pgp-signature nil "*If non-nil and 'mew-use-old-pgp' is non-nil, the old fashioned PGP message are used when composing." :group 'mew-privacy :type 'boolean) (defcustom mew-passwd-timer-unit 10 "*Minutes of timer unit to cancel the cached passwords." :group 'mew-privacy :type 'integer) (defcustom mew-passwd-lifetime 2 "*Number of 'mew-passwd-timer-unit' to cancel the cached passwords." :group 'mew-privacy :type 'integer) (defcustom mew-passwd-reset-timer t "*If non-nil, put the lifetime of a cached password longer when the password is used." :group 'mew-privacy :type 'boolean) (defcustom mew-encrypt-to-myself t "*if non-nil, any message/part to be encrypted is encrypted with your public key as well as receivers' one." :group 'mew-privacy :type 'boolean) (defcustom mew-pgp-signer nil "*ID of a PGP key to use for sign" :group 'mew-privacy :type 'string) (defcustom mew-smime-signer nil "*ID of a S/MIME key to use for sign" :group 'mew-privacy :type 'string) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; PGP Public key fetch ;;; (defvar mew-x-pgp-key-list '("x-pgp-key:" "x-pgp-key-url:" "x-pgp-public-key:" "x-pgp-public-key-url:" "x-pgp5-key:" "x-pgp5-key-url:" "x-pgp5-public-key:" "x-pgp5-public-key-url:" "x-public-key:")) (defvar mew-pgp-pks-port 11371) (defvar mew-pgp-pks-lang "/pks/lookup?op=get&search=") ;; Tue Dec 16 16:28:11 JST 2003 ;; http://pgp.zdv.uni-mainz.de/keyserver/bigbrother/ (defvar mew-pgp-pks-servers '(("openpksd.org" t) ("blackhole.pca.dfn.de" nil) ("pgp.ael.be" nil) ("pgp.dtype.org" nil) ("pgp.mit.edu" nil) ("pgp.nic.ad.jp" nil) ("pgp.rediris.es" nil) ("pgp.uni-mainz.de" nil) ("pgp.uni-paderborn.de" nil) ("wwwkeys.1.us.pgp.net" nil) ("wwwkeys.2.us.pgp.net" nil) ("wwwkeys.3.us.pgp.net" nil) ("wwwkeys.ch.pgp.net" nil) ("wwwkeys.cz.pgp.net" nil) ("wwwkeys.es.pgp.net" nil) ("wwwkeys.uk.pgp.net" nil))) (defun mew-pgp-pks-http-port-p (server alist) (nth 1 (assoc server alist))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; SSH ;;; (defvar mew-ssh-number-of-password-prompts 3) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Sub-programs ;;; (defvar mew-prog-mewl "mewl") (defvar mew-prog-mime-encode "mewencode") (defvar mew-prog-mime-decode "mewencode") (defvar mew-prog-8bit "mewencode") (defvar mew-prog-unshar "unshar") (defvar mew-prog-tar "tar") (defvar mew-prog-compress "compress") (defvar mew-prog-gzip "gzip") (defvar mew-prog-zip "zip") (defcustom mew-prog-pgp "gpg" "*PGP name for version check." :group 'mew-privacy :type 'string) (defvar mew-prog-pgpkey "wget") (defvar mew-prog-pgpkey-args '("-q" "-O" "-")) (defvar mew-ssh-prog "ssh") (defvar mew-ssh-prog-args nil) (defvar mew-prog-uncompface "uncompface") (defvar mew-prog-icontopbm "icontopbm") (defvar mew-prog-pbmtoxbm "pbmtoxbm") (defvar mew-prog-pbminvert "pnminvert") (defvar mew-prog-grep "grep") (defvar mew-prog-grep-opts '("-l" "-e")) (defvar mew-prog-grep-max-msgs 10000) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; X face ;;; (defcustom mew-x-face-file "~/.xface" "*If *non-nil* and the file exists, X-Face: fields is inserted." :group 'mew-summary :type '(choice file (const nil))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; spam and ham ;;; (defcustom mew-spam-prog "bogofilter" "*A command which learns spams." :group 'mew-summary :type 'string) (defcustom mew-spam-prog-args '("-s" "-N" "-v") "*A list of command arguments which learns spams." :group 'mew-summary :type '(choice (const nil) (repeat string))) (defcustom mew-ham-prog "bogofilter" "*A command which learns hams." :group 'mew-summary :type 'string) (defcustom mew-ham-prog-args '("-n" "-S" "-v") "*A list of command arguments which learns hams." :group 'mew-summary :type '(choice (const nil) (repeat string))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Mode names ;;; (defvar mew-mode-name-header "Header") (defvar mew-mode-name-draft "Draft") (defvar mew-mode-name-message "Message") (defvar mew-mode-name-summary "Summary") (defvar mew-mode-name-virtual "Virtual") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Types ;;; (defvar mew-file-type "MewX") (defvar mew-file-creator "EMAx") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; For broken MUAs ;;; (defcustom mew-decode-broken t "If non-nil, Mew decode broken messages. \(1) Decode quoted encoded-words, which violates RFC 2047. Good example: From: Kazu Yamamoto (=?ISO-2022-JP?B?GyRCOzNLXE9CSScbKEI=?=) Bad example: From: Kazu Yamamoto (\"=?ISO-2022-JP?B?GyRCOzNLXE9CSScbKEI=?=\") \(2) Decode raw non-ASCII text, which violates RFC 822. This is typically found in Subject: field. Good example: Subject: =?iso-2022-jp?B?GyRCJEYkOSRIGyhC?= Bad example: Subject: Raw non-ASCII text. \(3) Decode invalid MIME parameters, which violates RFC 2231. \(i) Raw text. \(ii) Encorded-word defined in RFC 2047. Good example: Content-Disposition: attachment; filename*=iso-2022-jp''%1B%24B%24F%249%24H%1B%28B Bad example Content-Disposition: attachment; filename=\"=?iso-2022-jp?B?GyRCJEYkOSRIGyhC?=\" =(4) Decode invalid non-ASCII MIME body, whose charset is US-ASCII or not present. Good example: Content-Type: text/plain; charset=ISO-2022-jp ISO-2022-JP text Bad example: Content-Type: text/plain ISO-2022-JP text \(5) Decode invalid non-ASCII text, whose charset is UTF-8 or not present. Good example: Content-Type: text/plain; charset=ISO-8859-15 ISO-8859-15 text Bad example: Content-Type: text/plain; charset=UTF-8 ISO-8859-15 text " :group 'mew-message :type 'boolean) (defcustom mew-use-name-parameter t "*If non-nil, the invalid NAME parameter of Content-Type: is checked as a file name in addition to the legal FILENAME parameter of Content-Disposition:." :group 'mew-message :type 'boolean) (defcustom mew-broken-parameter-list '("name" "filename") "*A list of parameter names whose value contains non-ASCII strings produced by broken MUAs." :group 'mew-message :type '(repeat string)) (defvar mew-decode-ws-fields '("Subject:")) (defvar mew-no-warning-fields ()) ;; capitalized (defvar mew-no-warning-params ()) ;; downcased (defcustom mew-warning-field-level 1 "*If warning level of a field is greater than or equal to this value, the warning is displayed on X-Mew:. Level 1: syntax is correct, but not recommenced. Level 2: syntax error." :group 'mew-message :type 'integer) (defcustom mew-encode-singlepart-hook nil "*Hook called before making a single part." :group 'mew-draft :type 'hook) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Preventing warning messages when byte-compiling ;;; (defvar mew-regex-message-files nil) (defvar mew-regex-message-files2 nil) (defvar mew-regex-message-files3 nil) (defvar mew-regex-message-files4 nil) (defvar mew-regex-message-files5 nil) (defvar mew-basic-folders nil) (provide 'mew-vars) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-vars.el ends here kazu-yamamoto-Mew-ff9c41b/mew-vars2.el000066400000000000000000001006111256455547000177170ustar00rootroot00000000000000;;; mew-vars2.el ;; Author: Kazu Yamamoto ;; Created: Feb 1, 1999 ;;; Code: (require 'mew-vars) ;;; (1) Variables closer to constant. ;;; (2) Variables for soft-coding. ;;; (3) Difficult options with some macros. ;;; Use mew-add-first, mew-insert-after, mew-replace-with, ;;; and mew-remove-entry to modify the variables. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Marks ;;; (defvar mew-mark-review ?*) (defvar mew-mark-escape ?$) (defvar mew-mark-delete ?D) (defvar mew-mark-unlink ?X) (defvar mew-mark-refile ?o) (defvar mew-mark-read mew-sp) (defvar mew-mark-unread ?U) (defvar mew-mark-tmp ?\0) ;; temporary use only. (defvar mew-mark-default-walk mew-mark-review) (defvar mew-mark-walk mew-mark-default-walk) (defvar mew-mark-duplicated mew-mark-delete) (defvar mew-mark-show-list (list mew-mark-read mew-mark-unread mew-mark-review)) (defvar mew-mark-show-list2 (list mew-mark-unread mew-mark-review)) (defvar mew-summary-mark-undo-marks `(,mew-mark-delete ,mew-mark-unlink ,mew-mark-refile ,mew-mark-read) "*A list of marks to be canceled by '\\\\[mew-summary-mark-undo-all]'.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Field Magic ;;; (defvar mew-reply-string "Re: ") (defvar mew-reply-regex "Re\\(\\|[*^]?[0-9]+\\|\\[[0-9]+\\]\\|([0-9]+)\\)[:>] *" "Regexp of various Re: expression in Subject:") (defvar mew-forward-string "Fw: ") (defvar mew-forward-regex "\\(Fw\\|Fwd\\|Forward\\): *" "Regexp of various Fw: expression in Subject:") (defvar mew-was-regex " *[[(] *\\(was[^a-z]\\|Re:\\).*[])] *$" "Regexp of various (was ...) expression in Subject:") (defvar mew-subject-simplify-replace-alist `(;; (REGEXP . NEW) --- NEW may be nil for deletion (same to "") ;; replace multiple Re: and Fw: into single Re: (,(concat "^" ;; regexp mew-reply-regex "\\(" mew-reply-regex "\\|" mew-forward-regex "\\)*") mew-reply-string) ;; new text ;; replace multiple Fw: and Re: into single Fw: (,(concat "^" ;; regexp mew-forward-regex "\\(" mew-reply-regex "\\|" mew-forward-regex "\\)*") mew-forward-string) ;; new text ;; delete extra string (no new text means delete) (,mew-was-regex nil)) ;; regexp "*Replacement alist to simplify Subject: field body Each element is cons cell whose car is REGEXP to replace, cdr is new text.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Error ;;; (defvar mew-error-unknown-charset "**UNKNOWN CHARSET**") (defvar mew-error-broken-string "**BROKEN STRING**") (defvar mew-error-invalid-b-encoding " **B ENCODING ERROR** ") (defvar mew-error-invalid-q-encoding " **Q ENCODING ERROR** ") (defvar mew-error-no-subject "** no subject **") (defvar mew-error-broken-address "**BROKEN ADDRESS**") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Files ;;; ;; In each folder (defvar mew-summary-cache-file ".mew-summary" "Cache file for Summary mode contents.") (defvar mew-summary-touch-file ".mew-mtime" "Time-stamp file for message folders.") ;; Under mew-conf-path (defcustom mew-addrbook-file "Addrbook" "*A file which contains AddrBook information." :group 'mew-addrbook :type 'string) (defvar mew-alias-auto-file ".mew-alias") (defvar mew-refile-msgid-file ".mew-refile-msgid-alist") (defvar mew-refile-from-file ".mew-refile-from-alist") (defvar mew-smtp-log-file "Smtplog") (defvar mew-nntp-log-file "Nntplog") (defvar mew-refile-log-file "Refilelog") ;; xxx Home (defvar mew-fib-item-file "~/.mew-fib") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Modes ;;; (defvar mew-folder-mode 448 ;; decimal for octal 0700 "Secure file mode for folders. 448(0700 in octal) is STRONGLY recommended for privacy reasons.") (defvar mew-file-mode-mask 432 ;; decimal for octal 0660 "Secure file mode mask. 432(0660 in octal) is STRONGLY recommended for privacy reasons.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Separators ;;; (defvar mew-path-separator "/") (defvar mew-regex-drive-letter (file-name-as-directory "^[a-zA-Z]:")) (defvar mew-regex-file-absolute (format "^[~%s]" mew-path-separator)) (defvar mew-header-separator "----") (defvar mew-eoh nil) ;; set by mew-regex-setup (defvar mew-lwsp "^[ \t]") (defvar mew-lwsp+ "^[ \t]+") (defvar mew-address-separator ":, \t\n") (defvar mew-page-delimiter "^\^L") (defvar mew-keyval "^\\([^ \t:]+:?\\)[ \t]*") ;; "^\\([^ \t:]+:?\\)[ \t]*\\(.*\\)$" faces a stupid error. ;; "$" does not mean end-of-line if the second match is empty, sigh. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Explanation string in messages ;;; (defvar mew-bcc-subject "A blind carbon copy") (defvar mew-bcc-body "This is a blind carbon copy.\n") (defvar mew-field-comment "(modified by Mew)") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Addrbook ;;; (defvar mew-addrbook-switch '((shortname mew-addrbook-shortname-get) (address identity) (username mew-addrstr-extract-user) (nickname mew-addrbook-nickname-get) (name mew-addrbook-name-get)) "Function database to get each field of Addrbook. 'shortname, 'address, 'username, 'nickname, and 'name is defined.") (defun mew-addrbook-func (key) (mew-alist-get-value (assq key mew-addrbook-switch))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; MIME types ;;; (defun mew-ct-textp (ct) (string-match "^Text" (capitalize ct))) (defun mew-ct-imagep (ct) (string-match "^Image" (capitalize ct))) (defun mew-ct-modelp (ct) (string-match "^Model" (capitalize ct))) (defun mew-ct-multipartp (ct) (string-match "^Multipart" (capitalize ct))) (defun mew-ct-alternativep (ct) (string-match "^Multipart/Alternative" (capitalize ct))) (defun mew-ct-partialp (ct) (string-match "^Message/Partial" (capitalize ct))) (defun mew-ct-messagep (ct) (string-match "^Message" (capitalize ct))) (defun mew-ct-linebasep (ct) (or (mew-ct-textp ct) (mew-case-equal ct mew-ct-aps) (mew-case-equal ct mew-ct-msg))) ;; xxx mew-ct-messagep? (defvar mew-mime-content-type-multipart-list `(,mew-ct-mlm ,mew-ct-mla) "Candidate of 'Content-Type: Multipart/' when CT: is changed in draft buffer.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Completion ;;; (defconst mew-custom-type-of-field-completion '(list (list string function))) (defcustom mew-field-completion-switch '(("To:" mew-complete-address) ("Cc:" mew-complete-address) ("Dcc:" mew-complete-address) ("Bcc:" mew-complete-address) ("Reply-To:" mew-complete-address) ("Fcc:" mew-complete-fcc-folder) ("Resent-To:" mew-complete-address) ("Resent-Cc:" mew-complete-address) ("Resent-Dcc:" mew-complete-address) ("Resent-Bcc:" mew-complete-address) ("Resent-Fcc:" mew-complete-fcc-folder) ("Newsgroups:" mew-complete-newsgroups) ("Followup-To:" mew-complete-newsgroups)) "*Completion function alist concerned with the key." :group 'mew-complete :type mew-custom-type-of-field-completion) (defcustom mew-field-circular-completion-switch '(("To:" mew-circular-complete-domain) ("Cc:" mew-circular-complete-domain) ("Dcc:" mew-circular-complete-domain) ("Bcc:" mew-circular-complete-domain) ("Reply-To:" mew-circular-complete-domain) ("Resent-To:" mew-circular-complete-domain) ("Resent-Cc:" mew-circular-complete-domain) ("Resent-Dcc:" mew-circular-complete-domain) ("Resent-Bcc:" mew-circular-complete-domain) ("From:" mew-circular-complete-from) ("Resent-From:" mew-circular-complete-from)) "*Circular completion function alist concerned with the key." :group 'mew-complete :type mew-custom-type-of-field-completion) (defcustom mew-field-expansion-switch '(("To:" mew-expand-address) ("Cc:" mew-expand-address) ("Dcc:" mew-expand-address) ("Bcc:" mew-expand-address) ("Reply-To:" mew-expand-address) ("Resent-To:" mew-expand-address) ("Resent-Cc:" mew-expand-address) ("Resent-Dcc:" mew-expand-address) ("Resent-Bcc:" mew-expand-address)) "*Expansion function alist concerned with the key." :group 'mew-complete :type mew-custom-type-of-field-completion) (defun mew-field-get-func (key switch) (mew-alist-get-value (mew-assoc-match key switch 0))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; MIME control ;;; (defvar mew-content-type mew-ct-txt "*The default Content-Type: for a file whose suffix is unknown.") (defvar mew-mime-content-type nil "\\Database for MIME content type. This is a list of entries which consist of , , , , , . Here is an example: (\"image/png\" \"\\\\.png$\" mew-b64 mew-prog-image mew-icon-image png) This database is used both when visualizing and composing. For example, when visualizing, a visualizer is chosen according to its . When composing, content-type is selected according to the suffix of the file to be attached with . For , 'nil', 'mew-b64', or 'mew-qp' should be specified. 'mew-b64' and 'mew-qp' means Base64 and Quoted-Printable, respectively. This is used as an appropriate content-transfer-encoding when composing. Each symbol specified at should have a value whose format is one of followings: - \"prog\" \"prog\" is an external program. (1) The program name is displayed. (2) \"prog\" is executed asynchronously. - func is a function. (1) is called. (2) is called. - (\"prog\" args async) \"prog\" is an external program. is a list of arguments for the external program. If nil, the external program is called synchronously. If t, the external program is called asynchronously. (1) The program name is displayed. (2) \"prog\" is executed asynchronously with . - (nil \"prog\") Equivalent to \"prog\". - (nil (\"prog\" args async)) Equivalent to (\"prog\" args async). - (nil func2) (1) Displayed 'type \\[mew-summary-execute-external]'. (2) is called. - (func1 func2) (1) is called. (2) is called. If the original content-type is Application/Octet-Stream, you are asked to choose or . - (func1 \"prog\") (1) is called. (2) \"prog\" is executed asynchronously. If the original content-type is Application/Octet-Stream, you are asked to choose or \"prog\". - (func1 (\"prog\" args async)) (1) is called. (2) \"prog\" is executed asynchronously with . If the original content-type is Application/Octet-Stream, you are asked to choose or \"prog\". Note that (1) indicates the action for '\\[mew-summary-display]' and \(2) indicates the action for '\\[mew-summary-execute-external]'. If you want to add an entry for new content-type, please let the author know. Such an entry should be shared by all users and be included in the next version of Mew.") (defun mew-ctdb-by-ct (ct) (mew-assoc-match2 ct mew-mime-content-type 0)) (defun mew-ctdb-by-file (file) (mew-assoc-match2 file mew-mime-content-type 1)) (defun mew-ctdb-ct (attr) (and (nth 0 attr) (mew-capitalize (nth 0 attr)))) (defun mew-ctdb-regex (attr) (nth 1 attr)) (defun mew-ctdb-cte (attr) (symbol-value (nth 2 attr))) (defun mew-ctdb-prog (attr) (let ((val (symbol-value (nth 3 attr)))) (if (and (listp val) (eq 'if (car val))) (eval val) val))) (defun mew-ctdb-icon (attr) (symbol-value (nth 4 attr))) (defun mew-mime-image-format-name (ct) (nth 5 (mew-ctdb-by-ct ct))) (defvar mew-mime-content-type-for-ooffice nil "A list of (content-type suffix) for OpenOffice.org to be prepended 'mew-mime-content-type'") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; MIME Content-Disposition: ;;; (defvar mew-mime-content-disposition '(("text" "inline" t) ("image" "inline" t) ("message" "inline" nil) ("multipart" nil nil) (t "attachment" t)) "(content-type inline/attachment filename)") (defun mew-cdpdb-by-ct (ct) (mew-assoc-match2 ct mew-mime-content-disposition 0)) (defun mew-cdpdb-val (attr) (nth 1 attr)) (defun mew-cdpdb-file (attr) (nth 2 attr)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Privacy ;;; (defcustom mew-privacy-database `((pgp-signature ((,mew-ct-mls ,mew-ct-pgs)) "PS") (pgp-encryption ((,mew-ct-mle ,mew-ct-pge)) "PE") (pgp-signature-encryption ((,mew-ct-mls ,mew-ct-pgs) (,mew-ct-mle ,mew-ct-pge)) "PSPE") (pgp-encryption-signature ((,mew-ct-mle ,mew-ct-pge) (,mew-ct-mls ,mew-ct-pgs)) "PEPS") (smime-signature ((,mew-ct-smm ,mew-ct-smm-sig)) "SS") (smime-encryption ((,mew-ct-smm ,mew-ct-smm-enc)) "SE") (smime-signature-encryption ((,mew-ct-smm ,mew-ct-smm-sig) (,mew-ct-smm ,mew-ct-smm-enc)) "SSSE") (smime-encryption-signature ((,mew-ct-smm ,mew-ct-smm-enc) (,mew-ct-smm ,mew-ct-smm-sig)) "SESS")) "*Alist of key, a list of privacy Content-Type, and its mark." :group 'mew-privacy :type 'sexp) (defun mew-pcdb-services () (mapcar 'car mew-privacy-database)) (defun mew-pcdb-by-service (service) (assq service mew-privacy-database)) (defun mew-pcdb-ct (pcdb) (nth 1 pcdb)) (defun mew-pcdb-mark (pcdb) (nth 2 pcdb)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Multipart/Alternative ;;; (defvar mew-mime-multipart-alternative-list `(,mew-ct-txt ".*")) (defun mew-multipart-alternative-preference (part) (let ((ct (mew-syntax-get-value (mew-syntax-get-ct part) 'cap))) (mew-member-match ct mew-mime-multipart-alternative-list))) (defvar mew-mime-external-body-list '("anon-ftp" "url" "mail-server")) (defun mew-mime-external-body-preference (part) (let* ((ctl (mew-syntax-get-ct part)) (ct (mew-syntax-get-value ctl 'cap)) (access-type (mew-syntax-get-param ctl "access-type"))) (if (and (string= ct mew-ct-ext) (stringp access-type)) (mew-member-match access-type mew-mime-external-body-list)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Field database ;;; ;; strictly, content-* are necessary but they are not practical. (defvar mew-field-database `((,mew-to: mailbox struct) (,mew-cc: mailbox struct) (,mew-from: mailbox struct) (,mew-apparently-to: mailbox struct) (,mew-bcc: mailbox struct) (,mew-dcc: mailbox struct) (,mew-reply-to: mailbox struct) (,mew-resent-to: mailbox struct) (,mew-resent-cc: mailbox struct) (,mew-resent-from: mailbox struct) (,mew-mv: mime struct) (,mew-subj: text text) (,mew-keywords: comma-text text) (,mew-received: unstruct unstruct) (,mew-message-id: unstruct unstruct) (,mew-references: unstruct unstruct) (,mew-in-reply-to: unstruct unstruct) (,mew-x-face: unstruct unstruct) (,mew-face: unstruct unstruct) ("Authentication-Results:" unstruct struct2) ;; capitalized ("Domainkey-Signature:" unstruct unstruct) ;; capitalized ("Dkim-Signature:" unstruct unstruct)) ;; capitalized "(field enc dec)") (defun mew-field-type-for-encoding (key) (or (nth 1 (assoc (mew-capitalize key) mew-field-database)) 'unstruct)) (defun mew-field-type-for-decoding (key) (or (nth 2 (assoc (mew-capitalize key) mew-field-database)) 'text)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Theme ;;; (defvar mew-theme-file nil "The file name which contains theme.") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Highlight header ;;; (defcustom mew-field-spec '(("^Resent-\\(Sender\\|From\\|To\\|Cc\\|Date\\)" t mew-face-header-important mew-face-header-important) ("^Subject:$" t mew-face-header-important mew-face-header-subject) ("^From:$" t mew-face-header-important mew-face-header-from) ("^\\(To\\|Apparently-To\\):$" t mew-face-header-important mew-face-header-to) ("^\\(Cc\\|Dcc\\|Bcc\\):$" t mew-face-header-important mew-face-header-to) ("^Newsgroups:$" t mew-face-header-important mew-face-header-to) ("^Date:$" t mew-face-header-important mew-face-header-date) ("^Sender:$" t) ("^Reply-To:$" t) ("^\\(X-Mailer\\|User-Agent\\):$" t) ("^X-Mew:$" t mew-face-header-important mew-face-header-xmew) ("^\\(Received\\|Return-Path\\|Errors-To\\):$" nil) ("^\\(Path\\|Distribution\\|Xref\\):$" nil) ("^NNTP-Posting-" nil) ("^\\(Message-Id\\|Posted\\|In-Reply-To\\|References\\|Precedence\\):$" nil) ("^DomainKey-Signature:$" nil) ("^DKIM-Signature:$" nil) ("^Authentication-Results:$" mew-authentication-results mew-face-header-important mew-face-header-xmew ("hardfail" mew-face-header-xmew-bad "fail" mew-face-header-xmew-bad "softfail" mew-face-header-xmew-bad)) ("^Delivered-" nil) ("^List-" nil) ;; RFC 2369 ;; ("^Content-" t) ("^\\(Mime-Version\\|Lines\\):$" nil) ("^From$" nil) ("^Status:$" nil) ("^Face:$" nil mew-face-header-private mew-face-header-marginal) ("^\\(X\\|Original\\)-" nil mew-face-header-private mew-face-header-marginal)) "*An alist of field spec for Message mode. Each spec consists of field-regular-expression, visible-p, face-for-key, and face-for-value. Fields whose visible-p is t are displayed in Message mode in the defined order. Fields whose visible-p is nil are hidden in Message mode. Type DEL to see them. Fields not matched to field-regular-expressions are operated by the value of 'mew-field-other-visible'. If face-for-key is omitted, 'mew-face-header-key' is used. If face-for-value is not present, mew-face-header-marginal is used." :group 'mew-highlight :type '(alist :key-type regexp :value-type (choice (list boolean) (list boolean face face)))) ;; cons the position to the spec. (defun mew-nspec-by-key (key) (mew-assoc-match3 key mew-field-spec 0)) (defun mew-nspec-n (nspec) (nth 0 nspec)) (defun mew-nspec-visiblep (nspec) (nth 2 nspec)) (defun mew-nspec-keyface (nspec) (nth 3 nspec)) (defun mew-nspec-valface (nspec) (nth 4 nspec)) (defun mew-nspec-extraface (nspec) (nth 5 nspec)) (defun mew-authentication-results (val) (save-match-data (or (string-match "=hardfail" val) (string-match "=fail" val) (string-match "=softfail" val)))) (mew-defstruct header-color field key val) (defvar mew-header-color-alist nil) ;; See also mew-face-make-spec. (defun mew-header-color-base (field key-color val-color bold) (unless val-color (setq val-color key-color)) (let ((face-key (intern (concat "mew-face-color-" key-color (if bold "-bold")))) (face-val (intern (concat "mew-face-color-" val-color (if bold "-bold"))))) (unless (facep face-key) (make-empty-face face-key) (face-spec-set face-key (list (mew-face-spec-func t (mew-face-spec-primitive key-color bold))))) (unless (facep face-val) (make-empty-face face-val) (face-spec-set face-val (list (mew-face-spec-func t (mew-face-spec-primitive val-color bold))))) (setq mew-header-color-alist (cons (list (capitalize field) face-key face-val) mew-header-color-alist)))) (defun mew-header-color (field key-color &optional val-color) "Set the color of FIELD key to KEY-COLOR. And set the color of FIELD value to VAL-COLOR. If VAL-COLOR is omitted, set the color of FIELD value to KEY-COLOR." (mew-header-color-base field key-color val-color nil)) (defun mew-header-color-bold (field key-color &optional val-color) "Set the color of FIELD key to KEY-COLOR. And set the color of FIELD value to VAL-COLOR. If VAL-COLOR is omitted, set the color of FIELD value to KEY-COLOR. The style becomes bold." (mew-header-color-base field key-color val-color t)) (defun mew-key-face (key nspec) (or (mew-header-color-get-key (assoc key mew-header-color-alist)) (mew-nspec-keyface nspec) 'mew-face-header-key)) (defun mew-val-face (key nspec) (or (mew-header-color-get-val (assoc key mew-header-color-alist)) (mew-nspec-valface nspec) 'mew-face-header-marginal)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Highlight body ;;; (defvar mew-highlight-body-regex-comment "^#+.*") (defvar mew-highlight-body-regex-cite "^\\(\\([ \t]\\{,7\\}\\([>:|]\\|\\w+\\([._-]+\\w+\\)*>+\\)\\)+\\).*") (defcustom mew-highlight-body-prefix-width 20 "*Maximum string width assume prefix for fancy highlight a body." :group 'mew-highlight :type 'integer) (defvar mew-highlight-body-cite-faces '(mew-face-body-cite1 mew-face-body-cite2 mew-face-body-cite3 mew-face-body-cite4 mew-face-body-cite5)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Highlight mark ;;; (defvar mew-highlight-mark-keywords `((,mew-mark-review mew-face-mark-review) (,mew-mark-escape mew-face-mark-escape) (,mew-mark-delete mew-face-mark-delete) (,mew-mark-unlink mew-face-mark-unlink) (,mew-mark-refile mew-face-mark-refile) (,mew-mark-unread mew-face-mark-unread)) "A list of mark-face pair to used in Summary/Virtual mode.") (defun mew-highlight-mark-get-face (mark) (mew-alist-get-value (assoc mark mew-highlight-mark-keywords))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Mark spec ;;; (defvar mew-mark-afterstep-spec `((,mew-mark-review 0 0 0 0 0 0 0) (,mew-mark-escape 0 0 0 0 0 0 0) (,mew-mark-read 0 0 0 0 0 0 0) (,mew-mark-delete 2 0 2 0 0 0 0) (,mew-mark-unlink 2 0 2 0 0 0 0) (,mew-mark-refile 2 0 2 0 0 0 0)) "*A list of cursor action spec. The cursor action spec is a list of a mark and seven cursor actions after marking. 0th (the first element of a list) is a mark value. A mark value is ASCII code of the mark. For example, the value of the '*' mark \(mew-mark-review) is 42. Seven values following a mark value means as follows: 1st is the case of no mark. 2nd is the case where the new mark is equal to the old one. 3rd is the case where level of the new mark is greater than that of the old one. 4th, 5th, and 6th is the case where levels are equal. 4th and 5th is the case that the old mark has state. 4th means that the old mark is overrode. 5th means that the old mark remains. 6th is the case that the old mark does not have state. 7th is the case where level of the new mark is smaller than that of the old one. The value of cursor actions means as follows: 0 means staying. 1 means moving according to the direction, 2 means moving according to the direction then displaying the next message. For more detail, see mew-mark-put-mark and mew-mark-afterstep.") (defun mew-markas-nth (mark case) (nth case (assoc mark mew-mark-afterstep-spec))) (defvar mew-mark-spec `((,mew-mark-read "read" 0 nil nil nil nil nil) (,mew-mark-unread "unread" 0 nil nil nil nil nil) (,mew-mark-review "review" 1 nil nil nil nil nil) (,mew-mark-escape "escape" 1 nil nil nil nil nil) (,mew-mark-delete "delete" 2 nil t nil mew-mark-exec-delete nil) (,mew-mark-unlink "unlink" 2 nil t nil mew-mark-exec-unlink nil) (,mew-mark-refile "refile" 2 t mew-mark-kill-refile mew-mark-unrefile mew-mark-exec-refile mew-mark-sanity-refile)) "*A list of lists which consists of mark, name, level, statefullp, kill-line-p, undo-func, exec-func, and sanity-fucn.") ;; (defun mew-mark-get-all-marks () "Collecting all defined marks." (mapcar 'car mew-mark-spec)) (defun mew-markdb-by-mark (mark) (assoc mark mew-mark-spec)) (defun mew-markdb-name (mark) (nth 1 (mew-markdb-by-mark mark))) (defun mew-markdb-level (mark) (nth 2 (mew-markdb-by-mark mark))) (defun mew-markdb-statefullp (mark) (nth 3 (mew-markdb-by-mark mark))) (defun mew-markdb-killp (mark) (nth 4 (mew-markdb-by-mark mark))) (defun mew-markdb-func-undo (mark) (nth 5 (mew-markdb-by-mark mark))) (defun mew-markdb-func-exec (mark) (nth 6 (mew-markdb-by-mark mark))) (defun mew-markdb-func-sanity (mark) (nth 7 (mew-markdb-by-mark mark))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Inbox action ;;; (defvar mew-inbox-action-alist nil "*This variable controls actions when retrieving messages. Currently this works when '\\\\[mew-summary-retrieve]'. You can put any marks, typically 'o' and 'D' according to message headers. This value must be a list of entries. An entry is a list whose first element is a field defined in 'mew-scan-fields'. If the second element is a list, the first element of the list must be a mark (e.g. ?D) or a string which is a comma separated folders (e.g \"+foo,+bar\" for ?o). Other elements of the list are regular expressions to be matched to the value of the field. With the following configuration, Mew marks messages whose Subject: matches \"adult\" or \"money\" with 'D'. And Mew marks messages whose Subject is \"daily log\" with 'o' to be refiled \"+log\". Also Mew marks messages whose Content-Type: contains \"gb2312\" with 'D'. \(setq mew-inbox-action-alist '((\"Subject:\" (?D \"adult\" \"money\") (\"+log\" \"daily log\")) (\"Content-Type:\" (?D \"gb2312\")))) If the second element of the entry is a symbol, it will be called as a function which returns nil or a mark or a string. If you are using 'spamassassin' which adds the \"X-Spam-Flag:\" field to messages and puts them in your mailbox, configure as follows: \(setq mew-spam: \"X-Spam-Flag:\") \(defun mew-spam-assassin (val) (let ((case-fold-search t)) (if (string-match \"yes\" val) ?D))) \(setq mew-inbox-action-alist '((\"X-Spam-Flag:\" mew-spam-assassin))) With this configuration, messages with the \"X-Spam-Flag:\" whose value is \"Yes\" are automatically marked with 'D' since the 'mew-spam-assassin' function returns 'D' marks when the value is \"Yes\". If you are using 'bogofilter' which adds the \"X-Bogosity:\" field to messages and puts them to your mailbox, configure as follows: \(setq mew-spam: \"X-Bogosity:\") \(defun mew-spam-bogofilter (val) (let ((case-fold-search t)) (if (string-match \"yes\" val) ?D))) \(setq mew-inbox-action-alist '((\"X-Bogosity:\" mew-spam-bogofilter))) ") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Proto ;;; (defvar mew-proto mew-folder-local) (defvar mew-proto-spec ;; key go refile flush '(("+" "+" "+" "+") ("$" "+" nil "+") ("%" "%" "%" "+") ("*" nil nil nil) ("-" "-" nil "-"))) (defun mew-proto-to-body (fld n) (if (mew-folder-virtualp fld) (setq fld (mew-folder-basename fld))) (setq fld (mew-case:folder-folder fld)) (let ((proto (mew-folder-prefix fld))) (unless (member proto mew-folder-prefixes) (setq proto (mew-proto))) ;; default proto (nth n (assoc proto mew-proto-spec)))) (defun mew-proto-to-go (fld) (mew-proto-to-body fld 1)) (defun mew-proto-to-refile (fld) (mew-proto-to-body fld 2)) (defun mew-proto-to-flush (fld) (mew-proto-to-body fld 3)) (defun mew-proto-inbox-folder (proto &optional case) (or proto (setq proto (mew-proto case))) (cond ((mew-folder-popp proto) mew-pop-inbox-folder) ((mew-folder-imapp proto) (mew-imap-inbox-folder case)) ((mew-folder-nntpp proto) (mew-nntp-newsgroup case)) (t ;; local (mew-inbox-folder case)))) (defun mew-proto-queue-folder (proto &optional case) (or proto (setq proto (mew-proto case))) (cond ((mew-folder-nntpp proto) (mew-postq-folder case)) (t (mew-queue-folder case)))) (defun mew-proto-friend-folder (proto &optional case) (cond ((mew-folder-imapp proto) (mew-imap-friend-folder case)) (t ;; local mew-friend-folder))) (defun mew-proto-friend-folder-list (proto &optional case) (cond ((mew-folder-imapp proto) (mew-imap-friend-folder-list case)) (t ;; local (mew-local-friend-folder-list)))) (defun mew-proto-folder-alist (proto &optional case) (cond ((mew-folder-popp proto) (mew-pop-folder-alist)) ((mew-folder-imapp proto) (mew-imap-folder-alist case)) ((mew-folder-nntpp proto) (mew-nntp-folder-alist case)) (t ;; local (mew-local-folder-alist)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Config ;;; (defcustom mew-config-alist nil "*Alist of config. This is a list of ( ( ) ( ) ...). - is a string of case. - is a symbol of Mew value with the 'mew-' prefix removed. - is a string. Currently, the following keys are supported: name, user, mail-domain, cc, fcc, dcc, reply-to, organization, header-alist, proto, smtp-server, smtp-port, smtp-ssh-server, smtp-ssl, smtp-ssl-port, smtp-user, smtp-auth-list, smtp-msgid-user, smtp-msgid-domain, smtp-helo-domain, smtp-mail-from, pop-server, pop-port, pop-ssh-server, pop-ssl, pop-ssl-port, pop-user, pop-auth, pop-auth-list, pop-size, pop-header-only, pop-delete, pop-body-lines, pop-proxy-server, pop-proxy-port, imap-server, imap-port, imap-ssh-server, imap-ssl, imap-ssl-port, imap-user, imap-auth, imap-auth-list, imap-size, imap-header-only, imap-delete, imap-trash-folder, imap-queue-folder, imap-spam-field, imap-spam-word, imap-proxy-server, imap-proxy-port, nntp-server, nntp-port, nntp-ssh-server, nntp-ssl, nntp-ssl-port, nntp-user, nntp-size, nntp-header-only, nntp-msgid-user, nntp-msgid-domain, ssl-cert-directory, ssl-verify-level, inbox-folder, queue-folder, postq-folder, mailbox-type, mbox-command, mbox-command-arg, signature-file, content-type, refile-guess-alist, spam-prog, spam-prog-args, ham-prog, ham-prog-args, use-old-pgp, pgp-signer, smime-signer, privacy-method, protect-privacy-always, protect-privacy-always-type, protect-privacy-encrypted, protect-privacy-encrypted-type, protect-privacy-with-old-pgp-signature from = name message-id = *random*.smtp-msgid-user@smtp-msgid-domain message-id = *random*.nntp-msgid-user@nntp-msgid-domain An example is as follows: \(setq mew-config-alist '((mew (mail-domain \"example.org\") (inbox-folder \"+inbox-mew\")) (keio (cc \"kazu@example.jp\") (user \"pooh\") (mail-domain \"example.net\")) (default (name \"Kazu Yamamoto\") (mail-domain \"example.jp\")))) " ;; bcc can be used but not recommended :group 'mew-env :type '(alist :key-type string :value-type (repeat (cons string string)))) (defun mew-cfent-by-case (case) (if (null case) (or (assoc mew-case-default mew-config-alist) (assoc (intern mew-case-default) mew-config-alist)) (or (assoc case mew-config-alist) (assoc (intern case) mew-config-alist)))) (provide 'mew-vars2) ;;; Copyright Notice: ;; Copyright (C) 2000-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-vars2.el ends here kazu-yamamoto-Mew-ff9c41b/mew-vars3.el000066400000000000000000000156171256455547000177330ustar00rootroot00000000000000;;; mew-vars3.el ;; Author: Kazu Yamamoto ;; Created: May 10, 2006 ;;; Code: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Macro ;;; (defvar mew-face-spec-alist '((:tty (type tty)) (:light (background light)) (:dark (background dark)))) ;; See also mew-header-color-base (defun mew-face-make-spec (bold &rest spec) (let (ret key col) (if (and bold (not (member :tty spec))) (setq ret (cons (mew-face-spec-func '((class color) (type tty)) (mew-face-spec-primitive nil t)) ret))) (while spec (setq key (car spec)) (setq spec (cdr spec)) (setq col (car spec)) (setq spec (cdr spec)) (setq ret (cons (mew-face-spec-func (list '(class color) (mew-alist-get-value (assoc key mew-face-spec-alist))) (mew-face-spec-primitive col bold)) ret))) (setq ret (cons (mew-face-spec-func t (mew-face-spec-primitive nil bold)) ret)) (nreverse ret))) (defmacro mew-setface (sym &rest spec) ;; (declare (indent 1)) `(face-spec-set ',(intern (concat "mew-face-" (symbol-name sym))) ',(apply 'mew-face-make-spec nil spec))) (put 'mew-setface 'lisp-indent-function 1) (defmacro mew-setface-bold (sym &rest spec) ;; (declare (indent 1)) `(face-spec-set ',(intern (concat "mew-face-" (symbol-name sym))) ',(apply 'mew-face-make-spec 'bold spec))) (put 'mew-setface-bold 'lisp-indent-function 1) (defmacro mew-defface (sym doc &rest spec) ;; (declare (indent 1)) `(defface ,(intern (concat "mew-face-" (symbol-name sym))) ',(apply 'mew-face-make-spec nil spec) ,(concat "*" doc) :group 'mew-highlight)) (put 'mew-defface 'lisp-indent-function 1) (defmacro mew-defface-bold (sym doc &rest spec) ;; (declare (indent 1)) `(defface ,(intern (concat "mew-face-" (symbol-name sym))) ',(apply 'mew-face-make-spec 'bold spec) ,(concat "*" doc) :group 'mew-highlight)) (put 'mew-defface-bold 'lisp-indent-function 1) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Highlight header ;;; (mew-defface-bold header-subject "Face to highlight the value of Subject:" :tty "red" :light "Firebrick" :dark "OrangeRed") (mew-defface-bold header-from "Face to highlight the value of From:" :tty "yellow" :light "DarkOrange4" :dark "Gold") (mew-defface-bold header-date "Face to highlight the value of Date:" :tty "green" :light "ForestGreen" :dark "LimeGreen") (mew-defface-bold header-to "Face to highlight the value of To:" :tty "magenta" :light "DarkViolet" :dark "violet") (mew-defface-bold header-key "Face to highlight by default" :tty "green" :light "ForestGreen" :dark "LimeGreen") (mew-defface-bold header-private "Face to highlight private field-keys") (mew-defface-bold header-important "Face to highlight important field-keys" :tty "cyan" :light "MediumBlue" :dark "SkyBlue") (mew-defface-bold header-marginal "Face to highlight marginal field-values" :light "gray50" :dark "gray50") (mew-defface-bold header-warning "Face to highlight non-my-domain addresses on To:/Cc:/Bcc:" :tty "red" :light "red" :dark "red") (mew-defface-bold header-xmew "Face to highlight the value of X-Mew:" :tty "yellow" :light "chocolate" :dark"chocolate") (mew-defface-bold header-xmew-bad "Face to highlight the value of X-Mew: in bad cases" :tty "red" :light "red" :dark "red") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Highlight body ;;; (mew-defface body-url "Face to highlight URL in Message/Draft mode" :tty "red" :light "Firebrick" :dark "OrangeRed") (mew-defface body-comment "Face to highlight comments in a body" :tty "blue" :light "gray50" :dark "gray50") (mew-defface body-cite1 "Face to highlight the first citation" :tty "green" :light "ForestGreen" :dark "LimeGreen") (mew-defface body-cite2 "Face to highlight the second citation" :tty "cyan" :light "MediumBlue" :dark "SkyBlue") (mew-defface body-cite3 "Face to highlight the third citation" :tty "magenta" :light "DarkViolet" :dark "violet") (mew-defface body-cite4 "Face to highlight the forth citation" :tty "yellow" :light "DarkOrange4" :dark "Gold") (mew-defface body-cite5 "Face to highlight the fifth citation" :tty "red" :light "Firebrick" :dark "OrangeRed") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Highlight mark ;;; (mew-defface mark-review "Face to highlight the review mark" :tty "cyan" :light "MediumBlue" :dark "SkyBlue") (mew-defface mark-escape "Face to highlight the escape mark" :tty "magenta" :light "DarkViolet" :dark "violet") (mew-defface mark-delete "Face to highlight the delete mark" :tty "red" :light "Firebrick" :dark "OrangeRed") (mew-defface mark-unlink "Face to highlight the unlink mark" :tty "yellow" :light "DarkOrange4" :dark "Gold") (mew-defface mark-refile "Face to highlight the refile mark" :tty "green" :light "ForestGreen" :dark "LimeGreen") (mew-defface mark-unread "Face to highlight the unread mark") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Highlight eof ;;; (mew-defface-bold eof-message "Face to highlight the 'end of message' string" :tty "green" :light "ForestGreen" :dark "LimeGreen") (mew-defface-bold eof-part "Face to highlight the 'end of part' string" :tty "yellow" :light "DarkOrange4" :dark "Gold") (provide 'mew-vars3) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-vars.el ends here kazu-yamamoto-Mew-ff9c41b/mew-varsx.el000066400000000000000000000312701256455547000200310ustar00rootroot00000000000000;;; mew-varsx.el --- Variables depends on other variables ;; Author: Kazu Yamamoto ;; Created: May 10, 2006 ;;; Code: (defun mew-defvar (sym val) (unless (symbol-value sym) (set sym val))) ;; ;; Scan ;; (mew-defvar 'mew-basic-folders (list mew-inbox-folder mew-draft-folder mew-queue-folder mew-postq-folder)) (mew-defvar 'mew-scan-fields (list "Folder:" "Filename:" mew-subj: mew-date: mew-from: mew-to: mew-cc: mew-ct: mew-cte: mew-x-mew-uidl: mew-message-id: mew-in-reply-to: mew-references: mew-x-mew-ref: mew-spam: "Body")) (mew-defvar 'mew-scan-fields-alias '("FLD" "NUM" "SUBJ" "DATE" "FROM" "TO" "CC" "CT" "CTE" "UID" "ID" "IRT" "REF" "XREF" "SPAM" "BODY")) ;; ;; Office ;; ;; strict valid (mew-defvar 'mew-regex-message-files (format "^[1-9][0-9]*\\(%s\\)?$" (regexp-quote mew-suffix))) ;; strict invalid (mew-defvar 'mew-regex-message-files4 (format "^0[1-9][0-9]*\\(%s\\)?$" (regexp-quote mew-suffix))) ;; strict all (mew-defvar 'mew-regex-message-files3 (format "^\\([0-9]+\\)\\(%s\\)?$" (regexp-quote mew-suffix))) ;; mewl and grep (mew-defvar 'mew-regex-message-files2 (format "^\\([0-9]+\\)\\(%s\\)?" (regexp-quote mew-suffix))) ;; search (mew-defvar 'mew-regex-message-files5 (format "\\([0-9]+\\)\\(%s\\)?$" (regexp-quote mew-suffix))) ;; ;; MIME ;; (mew-defvar 'mew-mime-content-type `(("multipart" nil nil nil mew-icon-multipart) ;; ("audio/basic" "\\.au$" mew-b64 mew-prog-audio mew-icon-audio) ("audio/x-wav" "\\.wav$" mew-b64 mew-prog-audio mew-icon-audio) ("audio/x-aiff" "\\.aif?f$" mew-b64 mew-prog-audio mew-icon-audio) ("audio/x-midi" "\\.midi?$" mew-b64 mew-prog-audio mew-icon-audio) ("audio/x-mpeg" "\\.mpga$\\|\\.mp[23]$" mew-b64 mew-prog-audio mew-icon-audio) ;; ("image/gif" "\\.gif$" mew-b64 mew-prog-image mew-icon-image gif) ("image/tiff" "\\.tif?f$" mew-b64 mew-prog-image mew-icon-image tiff) ("image/jpeg" "\\.jpe?g$" mew-b64 mew-prog-image mew-icon-image jpeg) ("image/pjpeg" "\\.jfif$" mew-b64 mew-prog-image mew-icon-image jpeg) ;; MS ("image/jpg" "^$" mew-b64 mew-prog-image mew-icon-image jpeg) ;; unofficial ("image/png" "\\.png$" mew-b64 mew-prog-image mew-icon-image png) ("image/x-xwd" "\\.xwd$" mew-b64 mew-prog-image mew-icon-image xwd) ("image/x-xbm" "\\.xbm$" mew-b64 mew-prog-image mew-icon-image xbm) ("image/x-xpm" "\\.xpm$" mew-b64 mew-prog-image mew-icon-image xpm) ("image/x-bmp" "\\.bmp$" mew-b64 mew-prog-image mew-icon-image bmp) ("image/bmp" "^$" mew-b64 mew-prog-image mew-icon-image bmp) ;; unofficial ("image/x-pcx" "\\.pcx$" mew-b64 mew-prog-image mew-icon-image PCX) ("image/x-tga" "\\.tga$" mew-b64 mew-prog-image mew-icon-image TGA) ("image/vnd.ms-modi" "\\.mdi$" mew-b64 mew-prog-image mew-icon-image) ("image/vnd.microsoft.icon" "\\.ico$" mew-b64 mew-prog-image mew-icon-image ICO) ("image/x-portable-bitmap" "\\.pbm$" mew-b64 mew-prog-image mew-icon-image pbm) ("image/x-portable-graymap" "\\.pgm$" mew-b64 mew-prog-image mew-icon-image pbm) ("image/x-portable-pixmap" "\\.ppm$" mew-b64 mew-prog-image mew-icon-image pbm) ("image/x-portable-anymap" "\\.pnm$" mew-b64 mew-prog-image mew-icon-image pbm) ("image/x-portable-arbitrarymap" "\\.pam$" mew-b64 mew-prog-image mew-icon-image PAM) ("image" "^$" mew-b64 mew-prog-image mew-icon-image) ;; ("model/iges" "\\.ige?s$" mew-b64 mew-prog-iges mew-icon-image) ;; xxx ("model/vrml" "\\.wrl$" mew-b64 mew-prog-vrml mew-icon-image) ("model/mesh" "\\.me?sh$" mew-b64 mew-prog-mesh mew-icon-image) ("model" "^$" mew-b64 mew-prog-model mew-icon-image) ;; ("video/mpeg" "\\.mpe?g$" mew-b64 mew-prog-video mew-icon-video) ("video/quicktime" "\\.mov$" mew-b64 mew-prog-video mew-icon-video) ("video/x-msvideo" "\\.avi$" mew-b64 mew-prog-video mew-icon-video) ;; ("message/rfc822" ,(format "^[0-9]+\\(%s\\)?$" mew-suffix) nil mew-prog-rfc822 mew-icon-message/rfc822) ("message/external-body" "\\.ext$" nil mew-prog-external-body mew-icon-message/external-body) ("message/delivery-status" "^$" nil mew-prog-delivery-status mew-icon-text) ;; ("application/postscript" "\\.e?ps$" mew-qp mew-prog-postscript mew-icon-application/postscript) ("application/pdf" "\\.pdf$" mew-b64 mew-prog-pdf mew-icon-application/postscript) ;; Thunderbird/3.1.7 only, not registered in IANA ("text/pdf" "\\.pdf$" mew-b64 mew-prog-pdf mew-icon-application/postscript) ("application/octet-stream" "\\.pages$" mew-b64 mew-default-external-program mew-icon-application/octet-stream) ("application/octet-stream" "\\.key$" mew-b64 mew-default-external-program mew-icon-application/octet-stream) ("application/octet-stream" "\\.numbers$" mew-b64 mew-default-external-program mew-icon-application/octet-stream) ("application/msword" "\\.doc$" mew-b64 mew-prog-msword mew-icon-text) ("application/vnd.ms-excel" "\\.xl[st]$" mew-b64 mew-prog-msexcel mew-icon-text) ("application/vnd.ms-powerpoint" "\\.ppt$" mew-b64 mew-prog-mspowerpoint mew-icon-text) ("application/vnd.openxmlformats-officedocument.wordprocessingml.document" "\\.docx$" mew-b64 mew-prog-msword mew-icon-text) ("application/vnd.openxmlformats-officedocument.wordprocessingml.template" "\\.dotx$" mew-b64 mew-prog-msword mew-icon-text) ("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" "\\.xlsx$" mew-b64 mew-prog-msexcel mew-icon-text) ("application/vnd.openxmlformats-officedocument.spreadsheetml.template" "\\.xltx$" mew-b64 mew-prog-msexcel mew-icon-text) ("application/vnd.openxmlformats-officedocument.presentationml.presentation" "\\.pptx$" mew-b64 mew-prog-mspowerpoint mew-icon-text) ("application/vnd.openxmlformats-officedocument.presentationml.slideshow" "\\.ppsx$" mew-b64 mew-prog-mspowerpoint mew-icon-text) ("application/vnd.openxmlformats-officedocument.presentationml.template" "\\.potx$" mew-b64 mew-prog-mspowerpoint mew-icon-text) ("application/vnd.openxmlformats-officedocument.presentationml.slide" "\\.sldx$" mew-b64 mew-prog-mspowerpoint mew-icon-text) ("application/vnd.visio" "\\.vsd$" mew-b64 mew-prog-visio mew-icon-text) ("application/ms-tnef" "\\.dat$" mew-b64 mew-prog-mstnef mew-icon-unknown) ("application/rtf" "\\.rtf$" mew-b64 mew-prog-rtf mew-icon-text) ("application/pgp-keys" "\\.pka$" nil mew-prog-pgp-keys mew-icon-unknown) ("application/x-pkcs7-signature" "\\.p7s$" mew-b64 nil mew-icon-unknown) ("application/vnd.fujitsu.oasys" "\\.oas$" mew-b64 mew-prog-oasys mew-icon-text) ("application/vnd.fujitsu.oasys2" "\\.oa2$" mew-b64 mew-prog-oasys mew-icon-text) ("application/vnd.fujitsu.oasys3" "\\.oa3$" mew-b64 mew-prog-oasys mew-icon-text) ("application/zip" "\\.zip$" mew-b64 mew-prog-unzip mew-icon-application/octet-stream) ("application/x-zip-compressed" "\\.zip$" mew-b64 mew-prog-unzip mew-icon-application/octet-stream) ("application/octet-stream" "\\.tar$\\|\\.tar\\.\\|\\.jar$\\|\\.gz$\\|\\.Z$\\|\\.taz$\\|\\.tgz$\\|\\.xz$\\|\\.txz$\\|\\.lzma?$\\|\\.tlz$\\|\\.tbz$\\|\\.bz2?$\\|\\.lzh$\\|\\.bin$\\|\\.pgp$\\|\\.gpg$\\|\\.exe$\\|\\.dll$\\|\\.class$" mew-b64 mew-prog-octet-stream mew-icon-application/octet-stream) ;; ("text/html" "\\.html?$" nil mew-prog-html mew-icon-text) ("text/enriched" "\\.rtf$" nil mew-prog-enriched mew-icon-text) ("text/css" "\\.css$" nil mew-prog-text mew-icon-text) ("text/sgml" "\\.sgml$" nil mew-prog-text mew-icon-text) ("text/xml" "\\.xml$" nil mew-prog-xml mew-icon-text) ("text/calendar" "\\.ics$" nil mew-prog-text mew-icon-text) ("text/x-patch" "\\.diff$\\|\\.patch$" nil mew-prog-patch mew-icon-text) ("text/plain" "\\.txt$\\|\\.c$\\|\\.h$\\|\\.el$\\|\\.diff$\\|\\.patch$" nil mew-prog-plain mew-icon-text) ("text/rfc822-headers" "\\.hdr$" nil mew-prog-rfc822-headers mew-icon-message/rfc822) ("text/csv" "\\.csv$" nil mew-prog-text mew-icon-text) ("text" "^$" nil mew-prog-text mew-icon-text) ("application/xml" "\\.xml$" mew-b64 mew-prog-xml2 mew-icon-text) ;; Unknown CT: matches here. (t "^$" nil mew-prog-octet-stream mew-icon-unknown) ;; Unknown suffix matches here and return the entry specified ;; by mew-content-type. (nil ".*"))) (mew-defvar 'mew-mime-content-type-for-ooffice '(("application/vnd.oasis.opendocument.text" "\\.odt") ("application/vnd.oasis.opendocument.text-template" "\\.ott") ("application/vnd.oasis.opendocument.text-web" "\\.oth") ("application/vnd.oasis.opendocument.text-master" "\\.odm") ("application/vnd.oasis.opendocument.graphics" "\\.odg") ("application/vnd.oasis.opendocument.graphics-template" "\\.otg") ("application/vnd.oasis.opendocument.presentation" "\\.odp") ("application/vnd.oasis.opendocument.presentation-template" "\\.otp") ("application/vnd.oasis.opendocument.spreadsheet" "\\.ods") ("application/vnd.oasis.opendocument.spreadsheet-template" "\\.ots") ("application/vnd.oasis.opendocument.chart" "\\.odc") ("application/vnd.oasis.opendocument.chart-template" "\\.otc") ("application/vnd.oasis.opendocument.image" "\\.odi") ("application/vnd.oasis.opendocument.image-template" "\\.oti") ("application/vnd.oasis.opendocument.formula" "\\.odf") ("application/vnd.oasis.opendocument.formula-template" "\\.otf") ("application/vnd.oasis.opendocument.database" "\\.odb") ("application/vnd.sun.xml.writer" "\\.sxw$") ("application/vnd.sun.xml.writer.template" "\\.stw$") ("application/vnd.sun.xml.calc" "\\.sxc$") ("application/vnd.sun.xml.calc.template" "\\.stc$") ("application/vnd.sun.xml.draw" "\\.sxd$") ("application/vnd.sun.xml.draw.template" "\\.std$") ("application/vnd.sun.xml.impress" "\\.sxi$") ("application/vnd.sun.xml.impress.template" "\\.sti$") ("application/vnd.sun.xml.writer.global" "\\.sxg$") ("application/vnd.sun.xml.math" "\\.sxm$"))) (when mew-mime-content-type-for-ooffice (setq mew-mime-content-type (nconc (mapcar (lambda (x) (list (nth 0 x) (nth 1 x) 'mew-b64 'mew-prog-ooffice 'mew-icon-text)) mew-mime-content-type-for-ooffice) mew-mime-content-type))) (provide 'mew-varsx) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-varsx.el ends here kazu-yamamoto-Mew-ff9c41b/mew-virtual.el000066400000000000000000000211541256455547000203540ustar00rootroot00000000000000;;; mew-virtual.el --- Virtual mode for Mew ;; Author: Kazu Yamamoto ;; Created: Oct 2, 1996 ;;; Code: (require 'mew) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Virtual info ;;; (defvar mew-vinfo-list '("func" "lra" "top" "db" "column" "mode" ;; 'selection or 'thread "physical-folder" "original-folder")) ;; tt back from Thread (mew-blinfo-defun 'mew-vinfo mew-vinfo-list) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Virtual mode ;;; (defun mew-virtual-mode () "A major mode to visualize messages in a virtual folder. \\{mew-summary-mode-map}" (interactive) (setq major-mode 'mew-virtual-mode) (setq mode-line-buffer-identification (mew-mode-line-id)) (use-local-map mew-summary-mode-map) (setq buffer-read-only t) (setq truncate-lines t) ;; (if (boundp 'bidi-paragraph-direction) (setq bidi-paragraph-direction 'left-to-right)) (make-local-variable 'tab-width) (make-local-variable 'search-invisible) (setq search-invisible nil) (unless (mew-thread-p) (jit-lock-register 'mew-summary-cook-region)) (mew-sinfo-set-disp-msg t) ;; (mew-summary-mode-name mew-mode-name-virtual) (mew-summary-setup-mode-line) (mew-summary-setup-decoration) (mew-highlight-cursor-line) (mew-run-mode-hooks 'mew-virtual-mode-hook)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Making Virtual mode ;;; (defun mew-summary-selection-by-pick (&optional regionp) "Making selection according to a specified pick pattern. 'mewl' or 'grep' is called as a picking command. If called with '\\[universal-argument]', the target is the region." (interactive "P") (mew-pickable (mew-summary-with-mewl (let* ((ofolder (mew-summary-folder-name 'ext)) (vfolder (mew-folder-to-selection ofolder)) (pfolder (mew-summary-physical-folder)) (msgs (mew-summary-pick-msgs pfolder regionp)) (prompt (format "%s/%s virtual" mew-prog-mewl mew-prog-grep)) (prog mew-prog-grep) (opts mew-prog-grep-opts) mew-inherit-pick-mewlp grepp pattern prog-opts-pat rfolder lra) (if (not msgs) (message "No message") (setq pattern (mew-input-pick-pattern prompt)) (cond ((string= pattern "") (setq prog-opts-pat (mew-input-pick-command prog opts)) (mew-set '(prog opts pattern) prog-opts-pat) (setq grepp t)) (t (setq pattern (mew-pick-canonicalize-pattern pattern)) (unless mew-inherit-pick-mewlp (setq grepp t)))) (if (and grepp (not (mew-which-exec prog))) (message "'%s' not found" prog) (setq rfolder (mew-expand-folder2 pfolder)) (setq lra (list (cons rfolder pfolder))) (mew-summary-switch-to-folder vfolder) (when (mew-summary-exclusive-p) (mew-vinfo-set-mode 'selection) (mew-vinfo-set-physical-folder pfolder) (mew-vinfo-set-original-folder ofolder) (cond (grepp (mew-sinfo-set-find-key pattern) (message "Picking messages in %s..." pfolder) (mew-summary-selection-by-pick-with-grep prog opts pattern pfolder msgs rfolder lra)) (t (mew-sinfo-set-find-key nil) (message "Picking messages in %s..." pfolder) (mew-summary-selection-by-pick-with-mewl pattern pfolder msgs rfolder lra)))))))))) (defun mew-summary-selection-by-pick-with-mewl (pattern folder src-msgs rfolder lra) "Create selection with 'mewl'" (let ((opts (list "-a" "-p" pattern "-b" mew-mail-path)) (range (mew-summary-pick-range src-msgs))) (setq rfolder (mew-scan-mewl-folder rfolder)) (if range (setq opts (nconc opts (list rfolder range))) (setq opts (nconc opts (list rfolder)))) (mew-local-retrieve 'vir opts nil lra))) (defun mew-summary-selection-by-pick-with-grep (prog opts pattern folder msgs rfolder lra) "Create selection with 'grep'" (interactive) (let ((file-rttl (mew-summary-selection-by-pick-with-grep1 prog opts pattern rfolder msgs)) file rttl func args) (mew-set '(file rttl) file-rttl) (setq func `(lambda () (mew-delete-file ,file))) (setq args (list "-i" file)) (mew-local-retrieve 'vir args func lra nil rttl))) (defun mew-summary-selection-by-pick-with-grep1 (prog opts pattern folder msgs) (let ((dir (mew-expand-folder folder)) (file (mew-make-temp-name)) (rttl 0) nxt) (if (= (length msgs) 1) (setq msgs (cons null-device msgs))) (if pattern (setq pattern (mew-cs-encode-arg pattern))) (with-temp-buffer (mew-set-buffer-multibyte t) (cd dir) (mew-piolet mew-cs-text-for-read mew-cs-text-for-write (mew-alet ;; xxx (while msgs (goto-char (point-max)) (setq nxt (nthcdr mew-prog-grep-max-msgs msgs)) (if nxt (mew-ntake mew-prog-grep-max-msgs msgs)) (apply 'call-process prog nil t nil (append opts (and pattern (list pattern)) msgs)) (setq msgs nxt))) (setq msgs nil) (goto-char (point-min)) (while (re-search-forward mew-regex-message-files2 nil t) (setq msgs (cons (mew-match-string 1) msgs)) (forward-line)) (setq msgs (mew-uniq-list msgs)) (setq msgs (mapcar 'string-to-number msgs)) (setq msgs (sort msgs '<)) (setq msgs (mapcar 'number-to-string msgs))) (mew-erase-buffer) (setq rttl (length msgs)) (insert "CD: " folder "\n") (mapc (lambda (x) (insert (mew-msg-get-filename x) "\n")) msgs) (mew-frwlet mew-cs-text-for-read mew-cs-text-for-write (write-region (point-min) (point-max) file nil 'no-msg)) (list file rttl)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; mark virtual ;;; (defun mew-summary-selection-by-mark (&optional ask-mark) "Making selection for messages marked with '*'. If called with '\\[universal-argument]', you can specify a target mark." (interactive "P") (if (not (mew-pickable)) (message "This command cannot be used in this folder") (let* ((ofolder (mew-summary-folder-name 'ext)) (vfolder (mew-folder-to-selection ofolder)) (pfolder (mew-summary-physical-folder)) (mark mew-mark-review) (start (point)) (case-fold-search nil) beg line med regex) (if ask-mark (setq mark (mew-input-mark))) (setq regex (mew-mark-regex mark)) ;; (mew-summary-switch-to-folder vfolder) (mew-vinfo-set-mode 'selection) (mew-vinfo-set-physical-folder pfolder) (mew-vinfo-set-original-folder ofolder) (mew-erase-buffer) ;; (set-buffer pfolder) (goto-char (point-min)) (while (re-search-forward regex nil t) (beginning-of-line) (setq beg (point)) (forward-line) ;; This must be buffer-substring (setq line (buffer-substring beg (point))) (with-current-buffer vfolder (mew-elet (insert line) (save-excursion (when (and (search-backward "\r") (setq med (point)) (looking-at mew-regex-sumsyn-short)) (goto-char (match-beginning 1)) (insert pfolder) (put-text-property med (point) 'invisible t)))))) (goto-char start) (set-buffer vfolder) (mew-summary-set-count-line) ;; Unmarking in both Summary and Thread (if (char-equal mark mew-mark-review) (mew-mark-undo-mark mark 'no-msg 'virtual-only))))) (provide 'mew-virtual) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-virtual.el ends here kazu-yamamoto-Mew-ff9c41b/mew-win32.el000066400000000000000000000212431256455547000176270ustar00rootroot00000000000000;;; mew-win32.el --- Settings for Mew on Win32 ;; Author: Shuichi Kitaguchi ;; Created: Dec 05, 1997 ;;; Code: (eval-when-compile (mew-no-warning-defvar w32-start-process-show-window) (mew-no-warning-defun mw32script-init) (mew-no-warning-defun mw32script-make-pathext-regexp) (mew-no-warning-defun mw32script-openp) (mew-no-warning-defun mw32script-argument-editing-function) (mew-no-warning-defun dos-to-unix-filename)) ;;; for NTEmacs User ;; ;; put mw32script.el(in Meadow's archive) into load-path. ;; ;; ;; ~/.mew settings ;; ;;; for PRINTING ;; mew-w32-prog-print --- print command ;; mew-w32-prog-print-arg --- print command argument ;; mew-w32-cs-print --- coding-system for printing ;; define-process-argument-editing --- for argument-editing ;; ;;; example ;; (setq mew-w32-prog-print "notepad.exe") ;; (setq mew-w32-prog-print-arg "/p") ;; (setq mew-w32-cs-print 'shift_jis-dos) ;; Meadow ;; (define-process-argument-editing "/notepad\\.exe$" ;; (lambda (x) ;; (general-process-argument-editing-function x nil t))) ;; (setq mew-print-function 'mew-w32-print-buffer) ;; Win32 programs. (defvar mew-w32-exec "fiber.exe") (defvar mew-w32-prog-print "notepad.exe") (defvar mew-w32-prog-print-arg nil) (defvar mew-default-external-program mew-w32-exec) (defvar mew-w32-cs-print nil) (setq mew-which-exec-suffixes (if (and (boundp 'exec-suffixes) exec-suffixes) exec-suffixes '(".exe" ".com" ".bat" ".cmd" ""))) (setq mew-delete-temp-file nil) ;; Emacs version dependent variables. (cond ((featurep 'meadow) ;; Meadow (require 'mw32script) (mw32script-init)) ((condition-case nil (progn (require 'mw32script) (load "mw32misc")) (file-error nil)) ;; NTEmacs (mw32script-make-pathext-regexp) (defun mew-w32-argument-editing-function (program args) (let ((default-process-argument-editing-function 'identity) (process-argument-editing-alist nil) prog sargs) (setq prog (mw32script-openp program)) (if (and (null prog) (setq prog (mew-which-exec program)) (setq sargs (mw32script-argument-editing-function (list prog)))) (cons (car sargs) (cons prog args)) (cons program args)))) (defadvice call-process (before mew-w32-call-process (program &optional infile buffer display &rest args) activate) (let ((sargs (mew-w32-argument-editing-function program args))) (setq program (car sargs) args (cdr sargs)))) (defadvice call-process-region (before mew-w32-call-process-region (start end program &optional infile buffer display &rest args) activate) (let ((sargs (mew-w32-argument-editing-function program args))) (setq program (car sargs) args (cdr sargs)))) (defadvice start-process (before mew-w32-start-process (name buffer program &rest program-args) activate) (let ((sargs (mew-w32-argument-editing-function program program-args))) (setq program (car sargs) program-args (cdr sargs)))))) ;; printing (defun mew-w32-print-buffer () (let ((tempfile (mew-make-temp-name))) (mew-frwlet mew-cs-dummy mew-w32-cs-print (write-region (point-min) (point-max) tempfile nil nil)) (setq w32-start-process-show-window t) (cond ((eq mew-w32-prog-print-arg nil) (call-process mew-w32-prog-print nil nil nil tempfile)) (t (call-process mew-w32-prog-print nil nil nil mew-w32-prog-print-arg tempfile))) (setq w32-start-process-show-window nil) (mew-delete-file tempfile))) ;; MIME setting (defvar mew-prog-plain 'mew-mime-text/plain) (defvar mew-prog-html '(mew-mime-text/html mew-mime-text/html-ext)) (defvar mew-prog-xml '(mew-mime-text/xml mew-mime-text/xml-ext)) (defvar mew-prog-patch '(mew-mime-text/plain mew-mime-text/patch-ext)) (defvar mew-prog-enriched 'mew-mime-text/enriched) (defvar mew-prog-text 'mew-mime-text/plain) (defvar mew-prog-audio mew-w32-exec) (defvar mew-prog-audio2 mew-w32-exec) ;; dummy (defvar mew-prog-image '(mew-mime-image/* mew-mime-image/*-ext)) (defvar mew-prog-iges mew-w32-exec) (defvar mew-prog-vrml mew-w32-exec) (defvar mew-prog-mesh mew-w32-exec) (defvar mew-prog-video mew-w32-exec) (defvar mew-prog-rfc822 'mew-mime-message/rfc822) (defvar mew-prog-rfc822-headers 'mew-mime-text/rfc822-headers) (defvar mew-prog-external-body '(mew-mime-external-body mew-mime-external-body-ext)) (defvar mew-prog-delivery-status 'mew-mime-text/plain) (defvar mew-prog-postscript mew-w32-exec) (defvar mew-prog-pgp-keys '(mew-mime-pgp-keys mew-mime-pgp-keys-ext)) (defvar mew-prog-application/pdf "pdftotext") (defvar mew-prog-pdf-ext mew-w32-exec) (defvar mew-prog-pdf `(mew-mime-application/pdf ,mew-prog-pdf-ext)) (defvar mew-prog-xml2 '(mew-mime-application/xml mew-mime-application/xml-ext)) (defvar mew-prog-oasys mew-w32-exec) (defvar mew-prog-octet-stream mew-w32-exec) (defvar mew-prog-msword mew-w32-exec) (defvar mew-prog-msexcel mew-w32-exec) (defvar mew-prog-mspowerpoint mew-w32-exec) (defvar mew-prog-visio mew-w32-exec) (defvar mew-prog-ooffice mew-w32-exec) (defvar mew-prog-rtf mew-w32-exec) (defvar mew-prog-unzip mew-w32-exec) ;;; ;;; Text/Html, Application/Xml, Image ;;; (defvar mew-format-html "%s.htm") (defvar mew-format-xml "%s.xml") (defvar mew-prog-text/html (if (and (fboundp 'shr-render-region) (fboundp 'libxml-parse-html-region)) 'shr-render-region 'mew-mime-text/html-w3m)) ;; See w3m.el (defvar mew-prog-text/html-ext mew-w32-exec) (defvar mew-prog-text/xml (if (and (fboundp 'shr-render-region) (fboundp 'libxml-parse-html-region)) 'shr-render-region 'mew-mime-text/html-w3m)) ;; See w3m.el (defvar mew-prog-text/xml-ext mew-w32-exec) (defvar mew-prog-application/xml nil) (defvar mew-prog-application/xml-ext mew-w32-exec) (defvar mew-prog-image/* 'mew-mime-image/*) (defvar mew-prog-image/*-ext mew-w32-exec) (defvar mew-prog-application/msword nil) (defvar mew-prog-application/msexcel nil) (defvar mew-prog-application/mspowerpoint nil) (defvar mew-prog-application/rtf nil) (setq mew-cs-database-for-arg '((iso-2022-jp . shift_jis-unix) (iso-2022-kr . euc-kr-unix))) (setq mew-prog-grep-max-msgs 2000) ;; for external grep (pick & virtual) (defvar mew-dir-list-function 'mew-dir-list-without-link-count) (defun mew-draft-dnd-for-meadow (event) (interactive "e") (when (eq (posn-window (event-start event)) (selected-window)) (let ((files (car (cdr (cdr event)))) to) (if (stringp files) (setq files (list files))) (dolist (from files) (setq from (dos-to-unix-filename from)) (when (file-exists-p from) (setq to (file-name-nondirectory from)) (unless (mew-attach-p) (mew-draft-prepare-attachments)) (goto-char (point-max)) (forward-line -2) (mew-attach-next) (cond ((file-directory-p from) (message "Directory cannot be attached")) (t (mew-attach-copy from to)))))))) (provide 'mew-win32) ;;; Copyright Notice: ;; Copyright (C) 1996-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew-win32.el ends here kazu-yamamoto-Mew-ff9c41b/mew.el000066400000000000000000000565261256455547000167030ustar00rootroot00000000000000;;; mew.el --- Messaging in the Emacs World ;; Author: Kazu Yamamoto ;; Created: Mar 23, 1994 ;; Revised: Aug 4, 2015 ;;; Commentary: ;; The updated version is available from: ;; http://www.Mew.org/ ;; ;; See info for configuring a site file/.emacs/.mew.el. ;;; Code: ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Mew version ;;; (defconst mew-version-number "6.7" "Version number for this version of Mew.") (defconst mew-version (format "Mew version %s" mew-version-number) "Version string for this version of Mew.") (provide 'mew) (require 'mew-const) (require 'mew-blvs) (require 'mew-func) (require 'mew-vars) ;; mew-env && mew-key (require 'mew-vars2) (require 'mew-vars3) (defun mew-version-show () "Show mew-version in minibuffer." (interactive) (message "%s" mew-version)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; For developers ;;; (defvar mew-debug nil "'decode, 'encode, 'net, 'pgp, 'thread, 'sort, t for all.") (defun mew-debug (category) (or (eq mew-debug t) (eq mew-debug category))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Bootstrap ;;; (defvar mew-init-p nil) ;;;###autoload (defun mew (&optional arg) "Execute Mew first unless Mew is running. And retrieve arrived messages or just visit to the default folder. 'proto' is determined by 'mew-proto' and 'mew-case'. If 'proto' is '+' (ie a local folder), a mailbox is determined according to 'mew-mailbox-type'. Otherwise (ie a remote folder), an appropriate protocol to retrieve messages is chosen according to 'proto'. If 'mew-auto-get' is 't', arrived messages are asynchronously fetched and listed up in Summary mode. 'mew-auto-get' is 'nil', just visit to the folder determined by 'proto'. When executed with '\\[universal-argument]', 'mew-auto-get' is considered reversed." (interactive "P") (mew-window-push) (unless mew-init-p (mew-init)) (let* ((auto (if arg (not mew-auto-get) mew-auto-get)) (case mew-case) (proto (mew-proto case)) inbox case:inbox) (if auto (mew-summary-scan-boot proto case) ;; see also mew-summary-retrieve (setq inbox (mew-proto-inbox-folder proto case)) (setq case:inbox (mew-case-folder case inbox)) (mew-summary-visit-folder case:inbox 'goend)) (setq mew-inbox-window (current-window-configuration)))) ;;;###autoload (defun mew-send (&optional to cc subject) "Execute Mew then prepare a draft. This may be used as library function." (interactive) (mew-current-set-window-config) (unless mew-init-p (mew-init)) (mew-summary-send to cc subject)) ;;;###autoload (defun mew-user-agent-compose (&optional to subject other-headers continue switch-function yank-action send-actions &rest dummy) "Set up message composition draft with Mew. This is 'mail-user-agent' entry point to Mew. The optional arguments TO and SUBJECT specify recipients and the initial Subject field, respectively. OTHER-HEADERS is an alist specifying additional header fields. Elements look like (HEADER . VALUE) where both HEADER and VALUE are strings. A Draft buffer is prepared according to SWITCH-FUNCTION. CONTINUE, YANK-ACTION and SEND-ACTIONS are ignored." (unless mew-init-p (mew-init)) (let* ((draft (mew-folder-new-message mew-draft-folder)) (attachdir (mew-attachdir draft)) cc asked) (when (and mew-ask-to (null to)) (setq to (mew-input-address (concat mew-to: " "))) (setq asked t)) (when mew-ask-cc (setq cc (mew-input-address (concat mew-cc: " "))) (setq asked t)) (mew-current-set-window-config) (mew-window-configure 'draft) (mew-summary-prepare-draft (mew-draft-find-and-switch draft switch-function) (mew-delete-directory-recursively attachdir) (mew-draft-header subject nil to cc nil nil nil other-headers asked) (mew-draft-mode) (run-hooks 'mew-draft-mode-newdraft-hook)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Functions for boot time ;;; (defun mew-init () (let ((buf (get-buffer-create "*Mew hello*"))) (run-hooks 'mew-env-hook) (load mew-rc-file 'no-err 'no-msg) (cond ((memq system-type '(windows-nt cygwin)) (require 'mew-win32)) ((eq system-type 'darwin) (require 'mew-darwin)) (t (require 'mew-unix))) (require 'mew-varsx) (if mew-theme-file (load mew-theme-file 'no-err 'no-msg)) (switch-to-buffer buf) (mew-window-configure '(1 0)) ;; Using mew-mode-name-message (mew-hello) (message "Setting up Mew world...") (mew-set-environment) (run-hooks 'mew-init-hook) (mew-transit-folder) (mew-status-update t) (mew-passwd-setup) (mew-highlight-timer-setup) (setq mew-init-p t) (mew-kill-buffer buf) (message "Setting up Mew world...done"))) (defun mew-set-environment (&optional no-dir) (let (error-message) (condition-case nil (progn ;; sanity check (cond ((featurep 'xemacs) (setq error-message "Not support XEmacs\n") (error "")) ((string-match "^\\(18\\|19\\|20\\)" emacs-version) (setq error-message "Not support Emacs 18/19/20 nor Mule 1\n") (error ""))) ;; initializing (or no-dir (mew-buffers-init)) (or no-dir (mew-temp-dir-init)) (mew-mark-init) (mew-config-init) (mew-subprocess-init) (mew-rotate-log-files mew-smtp-log-file) (mew-rotate-log-files mew-nntp-log-file) (mew-rotate-log-files mew-refile-log-file)) (error (set-buffer (generate-new-buffer mew-buffer-debug)) (goto-char (point-max)) (insert "\n\nMew errors:\n\n") (and error-message (insert error-message)) (set-buffer-modified-p nil) (setq buffer-read-only t) ;; cause an error again (error "Mew found some errors above"))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Status update ;;; (defun mew-folder-init (folders) (let (dir) (dolist (folder folders) (setq folder (mew-canonicalize-folder folder)) (setq dir (mew-expand-folder folder)) (unless (file-exists-p dir) (mew-make-directory dir) (mew-local-folder-insert folder) (message "%s was created" dir)) (setq dir (file-chase-links dir)) (if (file-exists-p dir) (if (/= mew-folder-mode (file-modes dir)) (set-file-modes dir mew-folder-mode)))))) (defun mew-status-update (&optional arg) "Read Addrbook and update its information. If executed with '\\[universal-argument]', information about folders of the current world is also updated." (interactive "P") (cond ((and arg (integerp arg)) (mew-message-for-summary "This command was obsoleted. Type '\\[universal-argument]\\[mew-status-update]' to collect folders")) ((consp arg) (let (case proto) (mew-set '(case proto) (mew-summary-case-proto)) (cond ((mew-folder-localp proto) (mew-local-update (mew-called-interactively-p))) ((mew-folder-popp proto) (message "Nothing updated for POP")) ((mew-folder-imapp proto) (mew-imap-update case)) ((mew-folder-nntpp proto) (mew-nntp-update case))))) (t (if (mew-called-interactively-p) (mew-set-environment 'no-dir)) ;; These two must be before mew-local-update (message "Updating status...") (mew-config-setup) (mew-regex-setup) (if arg (mew-local-update (mew-called-interactively-p))) (mew-folder-init mew-basic-folders) (mew-folder-init mew-inbox-folders) (mew-folder-init mew-queue-folders) (mew-folder-init mew-postq-folders) (mew-refile-setup) (mew-addrbook-setup) (mew-scan-setup) (mew-pgp-setup) (mew-smime-setup) (mew-ssh-setup) (mew-ssl-setup) (mew-net-setup) (mew-thread-setup) (mew-decoration-setup) (mew-biff-setup) (mew-ct-setup) (run-hooks 'mew-status-update-hook) (message "Updating status...done")))) (defvar mew-mime-content-type-list nil "Candidate of Content-Type: when CT: is changed in draft buffer.") (defun mew-ct-setup () (dolist (ct (mapcar 'car mew-mime-content-type)) (if (and (stringp ct) (not (string-match "/$" ct))) (setq mew-mime-content-type-list (cons (capitalize ct) mew-mime-content-type-list))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Current status ;;; (defun mew-frame-id (&optional frame) (if window-system (let ((fram (or frame (selected-frame)))) (concat "mew-current-info-" (cdr (assq 'window-id (frame-parameters fram))))) "mew-current-info-no-window")) (defvar mew-current-info-list '("fld" "msg" "part" "window")) (mew-info-defun "mew-current-" mew-current-info-list) (defun mew-current-set (fld msg part) (let ((fid (mew-frame-id))) (mew-current-set-fld fid fld) (mew-current-set-msg fid msg) (mew-current-set-part fid part))) (defun mew-current-clean-up () (if window-system (dolist (frame (frame-list)) (mew-info-clean-up (concat "mew-current-info-" (mew-frame-id frame)))) (mew-info-clean-up "mew-current-info-no-window"))) (defun mew-current-set-window-config () (mew-current-set-window (mew-frame-id) (current-window-configuration))) (defun mew-current-get-window-config () (let ((win (mew-current-get-window (mew-frame-id)))) (unless (window-configuration-p win) (setq win mew-inbox-window)) (if win (set-window-configuration win)) (mew-current-set-window (mew-frame-id) nil) (mew-summary-toolbar-update) (mew-redraw))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Window configuration stack ;;; (defvar mew-inbox-window nil) (defvar mew-window-stack nil) (defun mew-window-clean-up () (setq mew-window-stack nil)) (defun mew-window-push () (let ((frame (selected-frame)) (config (current-window-configuration))) (setq mew-window-stack (cons (cons frame config) mew-window-stack)))) (defun mew-window-pop () (let* ((frame (selected-frame)) (assoc (assoc frame mew-window-stack))) (if (and assoc (window-configuration-p (cdr assoc))) (set-window-configuration (cdr assoc)) (switch-to-buffer (get-buffer-create mew-window-home-buffer))) (setq mew-window-stack (delq assoc mew-window-stack)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Window configuration ;;; (defun mew-delete-other-window () (unless (one-window-p) (let ((owin (selected-window)) wins ret) (walk-windows (lambda (win) (set-buffer (window-buffer win)) (unless (or (eq owin win) (string-match "^mew-" (symbol-name major-mode))) (setq wins (cons win wins)))) nil) (dolist (win wins) (unless (one-window-p) (setq ret t) (delete-window win))) (select-window owin) ret))) (defun mew-window-configure (action) "Configure windows according to ACTION. ACTION should be symbol or a list of two numbers. Predefined symbol is 'summary, 'message, and 'draft. They are used as a key of 'mew-window-configuration to get a list of two numbers. Two numbers means the ratio of the upper window and the lower window (i.e. the window of Message buffer). If Message buffer does not exist, it will be created. If the height of the lower window is not zero, switch to the buffer." (let* ((windows (if (listp action) action (car (cdr (assq action mew-window-configuration))))) (msgbuf (mew-buffer-message)) (obufwin (get-buffer-window (current-buffer))) (msgwin (get-buffer-window msgbuf)) (height nil) (winsum nil) (sum-height 0) (msg-height 0)) (setq height (+ (if obufwin (window-height obufwin) 0) (if msgwin (window-height msgwin) 0))) (cond ((<= height (* 2 window-min-height)) ;; Delete other windows and use full emacs window. (delete-other-windows) (setq height (window-height (selected-window)))) ((and mew-use-full-window (mew-delete-other-window)) ;; delete windows all but Mew's one. (setq height (+ (if obufwin (window-height obufwin) 0) (if msgwin (window-height msgwin) 0))))) ;; (if (get-buffer msgbuf) (delete-windows-on msgbuf) (with-current-buffer (get-buffer-create msgbuf) (kill-all-local-variables) ;; "truncate?" is asked in Message mode. ;; so set the same toolbar as Summary mode (mew-summary-toolbar-update) (mew-message-mode))) ;; (setq winsum (apply '+ windows)) (unless (zerop (nth 0 windows)) (setq sum-height (max window-min-height (/ (* height (nth 0 windows)) winsum)))) (if (and (eq action 'message) (= (% sum-height 2) 1)) (setq sum-height (1+ sum-height))) (unless (zerop (nth 1 windows)) (setq msg-height (max window-min-height (- height sum-height)))) (setq height (+ sum-height msg-height)) ;; (unless (zerop msg-height) (split-window nil sum-height) (other-window 1) (switch-to-buffer msgbuf 'norecord) (mew-set-buffer-cs mew-cs-m17n)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Message buffer ;;; (defun mew-window-number () (let ((x (car (window-edges (selected-window)))) (i 1)) (walk-windows (lambda (win) (when (with-current-buffer (window-buffer win) (mew-summary-or-virtual-p)) (if (< (car (window-edges win)) x) (setq i (1+ i))))) 'nominibuf) i)) (defun mew-buffer-message () (let* ((me (selected-frame)) (frames (frame-list)) (len (length frames)) (n (mew-window-number)) (i 0)) (catch 'loop (dolist (frame frames) (if (equal me frame) (throw 'loop i)) (setq i (1+ i)))) (setq i (- len i 1)) (if (= n 1) (format "%s%d" mew-buffer-message i) (format "%s%d<%d>" mew-buffer-message i n)))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Buffers ;;; (defvar mew-buffers nil) (defun mew-buffers-init () (setq mew-buffers nil)) (defun mew-buffers-setup (folder) (mew-addq mew-buffers folder)) (defun mew-buffers-bury () (dolist (buffer mew-buffers) (if (get-buffer buffer) (bury-buffer buffer)))) (defun mew-buffers-clean-up () (dolist (buffer mew-buffers) (mew-remove-buffer buffer)) (mew-buffers-init)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Temporary directory ;;; (defvar mew-temp-dir nil) ;; the default is "/tmp/user_name_uniq" (defvar mew-temp-file nil) ;; the default is "/tmp/user_name_uniq/mew" (defun mew-temp-dir-init () "Setting temporary directory for Mew. mew-temp-file must be local and readable for the user only for privacy/speed reasons." (setq mew-temp-dir (make-temp-name mew-temp-file-initial)) (mew-make-directory mew-temp-dir) (set-file-modes mew-temp-dir mew-folder-mode) (setq mew-temp-file (expand-file-name "mew" mew-temp-dir)) (add-hook 'kill-emacs-hook 'mew-temp-dir-clean-up)) (defun mew-temp-dir-clean-up () "A function to remove Mew's temporary directory recursively. It is typically called by kill-emacs-hook." (remove-hook 'kill-emacs-hook 'mew-temp-dir-clean-up) (if (and mew-temp-dir (file-exists-p mew-temp-dir)) (mew-delete-directory-recursively mew-temp-dir)) (setq mew-temp-dir nil) (setq mew-temp-file nil)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Regular expressions ;;; (defvar mew-regex-msg-show-list nil) (defvar mew-regex-msg-show nil) (defvar mew-regex-msg-or-part nil) (defvar mew-regex-msg-review nil) (defvar mew-regex-msg-delete nil) (defvar mew-regex-attach-beg nil) (defvar mew-regex-attach-end nil) (defvar mew-regex-my-address-list nil) (defvar mew-regex-ignore-folders nil) (defvar mew-regex-thread-separator nil) (defun mew-mark-regex (mark) (concat "^" (regexp-quote (char-to-string mark)))) (defun mew-mark-list-regex (mark-list) (concat "^" "[" (mapconcat 'char-to-string mark-list "") "]")) (defun mew-regex-setup-msg (lst) (setq mew-regex-msg-show-list lst) (setq mew-regex-msg-show (mew-mark-list-regex lst)) (setq mew-regex-msg-or-part (concat mew-regex-msg-show "\\|" mew-regex-part))) (defun mew-regex-setup () (setq mew-eoh (format "^\\(%s\\|\\)$" (regexp-quote mew-header-separator))) (mew-regex-setup-msg mew-mark-show-list) (setq mew-regex-msg-review (mew-mark-regex mew-mark-review)) (setq mew-regex-msg-delete (mew-mark-regex mew-mark-delete)) (setq mew-regex-thread-separator (concat "^" (regexp-quote mew-thread-separator))) (setq mew-regex-attach-beg (concat "^" mew-draft-attach-boundary-beg "$")) (setq mew-regex-attach-end (concat "^" mew-draft-attach-boundary-end "$")) (setq mew-regex-my-address-list (mew-get-my-address-regex-list)) (setq mew-regex-ignore-folders (mapconcat 'mew-folder-regex (mew-uniq-list (append mew-basic-folders mew-inbox-folders mew-queue-folders mew-postq-folders (list mew-friend-folder mew-attach-folder))) "\\|")) (unless mew-range-list (setq mew-range-list `((,mew-queue-folders ,mew-range-str-all) (, mew-postq-folders ,mew-range-str-all) ((,mew-draft-folder) ,mew-range-str-all) (t ,mew-range-str-update))))) (defun mew-summary-toggle-mark-regex () (interactive) (let (lst) (if (equal mew-regex-msg-show-list mew-mark-show-list) (setq lst mew-mark-show-list2) (setq lst mew-mark-show-list)) (mew-regex-setup-msg lst) (message "Target marks are: %s" (mapconcat (lambda (x) (message "'%c'" x)) lst ", ")))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Theme ;;; (defun mew-decoration-setup () (interactive) (put-text-property 0 (length mew-end-of-message-string) 'face 'mew-face-eof-message mew-end-of-message-string) (put-text-property 0 (length mew-end-of-part-string) 'face 'mew-face-eof-part mew-end-of-part-string)) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Tear down ;;; (defun mew-bury-buffer (&optional buf) (bury-buffer buf) (delete-windows-on buf t)) (defun mew-kill-buffer (&optional buf) "Erase the current buffer." (interactive) (let* ((buf (or buf (current-buffer))) (folder (if (bufferp buf) (buffer-name buf) buf)) obuf) (if (get-buffer buf) (with-current-buffer buf (when (mew-summary-or-virtual-p) (mew-summary-kill-subprocess) (setq obuf (mew-local-buffer-name folder)) ;; xxx should kill pop's buffer... (mew-remove-buffer obuf)) (mew-overlay-delete-buffer))) (mew-remove-buffer buf))) (defun mew-buffer-clean-up (regex &optional func) (unless func (setq func 'mew-kill-buffer)) (dolist (buf (mew-buffer-list regex)) (funcall func buf))) (defun mew-quit-toolbar-update () (mew-redraw) ;; due to mouse-face bug (if (fboundp 'redraw-frame) ;; for BOW (redraw-frame (selected-frame)))) ;; update toolbar (defun mew-summary-suspend () "Suspend Mew then switch to another buffer. All buffers of Mew remain, so you can resume with buffer operations." (interactive) (mew-buffer-clean-up (concat "^" (regexp-quote mew-buffer-message)) 'mew-bury-buffer) (mew-buffers-bury) (mew-window-pop) (mew-quit-toolbar-update) (run-hooks 'mew-suspend-hook)) (defun mew-summary-quit () "Quit Mew. All buffers of Mew are erased." (interactive) (when (y-or-n-p "Quit Mew? ") ;; killing buffers (mew-cache-clean-up) (mew-buffer-clean-up (concat "^" (regexp-quote mew-buffer-message))) (mew-buffer-clean-up (mew-folder-regex mew-draft-folder)) ;; +draft/* (mew-buffer-clean-up mew-buffer-regex) ;; other buffers ;; (mew-sinfo-clean-up) (mew-buffers-clean-up) ;; Summary mode and Virtual mode ;; (mew-passwd-clean-up) ;; should be before dir clean up (mew-temp-dir-clean-up) (mew-subprocess-clean-up) ;; (run-hooks 'mew-quit-hook) ;; ;; lastly, clean up variables ;; (mew-folder-clean-up) (mew-refile-clean-up) (mew-current-clean-up) (mew-addrbook-clean-up) (mew-highlight-timer-clean-up) (mew-net-clean-up) (mew-biff-clean-up) ;; (mew-window-pop) (mew-window-clean-up) (mew-quit-toolbar-update) ;; (setq mew-init-p nil) (message nil))) ;; just clear ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Transit (should be removed someday) ;;; ;; Spotlight does not handle Files/Directories starting with ".". (defvar mew-transit-folder-alist '(("+.pop" "+#pop") ("+.imap" "+#imap") ("+.nntp" "+#nntp"))) (defun mew-transit-folder () (let (old new dirs subnew) (with-temp-buffer (dolist (ent mew-transit-folder-alist) (setq old (mew-expand-folder (nth 0 ent))) (setq new (mew-expand-folder (nth 1 ent))) (when (and (file-directory-p old) (not (file-exists-p new))) (rename-file old new) (cd new) (setq dirs (directory-files ".")) (dolist (subold dirs) ;; % is a special character for URL. ;; And "open" does not convert % to %25, sigh. (when (string-match "@[^%]+\\(%\\)" subold) (setq subnew (copy-sequence subold)) (aset subnew (match-beginning 1) ?#) (rename-file subold subnew)))))))) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ;;; Load Mew libraries ;;; (require 'mew-local) (require 'mew-addrbook) (require 'mew-complete) (require 'mew-minibuf) (require 'mew-cache) (require 'mew-encode) (require 'mew-decode) (require 'mew-edit) (require 'mew-mime) (require 'mew-mark) (require 'mew-exec) (require 'mew-header) (require 'mew-pgp) (require 'mew-smime) (require 'mew-bq) (require 'mew-syntax) (require 'mew-scan) (require 'mew-passwd) (require 'mew-pick) (require 'mew-search) (require 'mew-summary) (require 'mew-summary2) (require 'mew-summary3) (require 'mew-summary4) (require 'mew-virtual) (require 'mew-thread) (require 'mew-message) (require 'mew-draft) (require 'mew-attach) (require 'mew-demo) (require 'mew-refile) (require 'mew-ext) (require 'mew-fib) (require 'mew-sort) (require 'mew-highlight) (require 'mew-net) (require 'mew-ssh) (require 'mew-ssl) (require 'mew-smtp) (require 'mew-pop) (require 'mew-nntp) (require 'mew-nntp2) (require 'mew-imap) (require 'mew-imap2) (require 'mew-config) (require 'mew-auth) (eval-when-compile (if (mew-which-el "timer") (require 'timer))) ;;; Copyright Notice: ;; Copyright (C) 1994-2015 Mew developing team. ;; All rights reserved. ;; Redistribution and use in source and binary forms, with or without ;; modification, are permitted provided that the following conditions ;; are met: ;; ;; 1. Redistributions of source code must retain the above copyright ;; notice, this list of conditions and the following disclaimer. ;; 2. Redistributions in binary form must reproduce the above copyright ;; notice, this list of conditions and the following disclaimer in the ;; documentation and/or other materials provided with the distribution. ;; 3. Neither the name of the team nor the names of its contributors ;; may be used to endorse or promote products derived from this software ;; without specific prior written permission. ;; ;; THIS SOFTWARE IS PROVIDED BY THE TEAM AND CONTRIBUTORS ``AS IS'' AND ;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ;; IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR ;; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE TEAM OR CONTRIBUTORS BE ;; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ;; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ;; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR ;; BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ;; WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE ;; OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN ;; IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ;;; mew.el ends here