PageRenderTime 24ms CodeModel.GetById 20ms RepoModel.GetById 0ms app.codeStats 0ms

/utilities/emacspeak/lisp/emacspeak-vm.el

https://github.com/jamesnvc/emacs.d
Lisp | 731 lines | 556 code | 81 blank | 94 comment | 5 complexity | cfa86ba2459c3251695c4c770927ba5f MD5 | raw file
Possible License(s): GPL-2.0, LGPL-2.1, LGPL-2.0, MIT, BSD-3-Clause, GPL-3.0
  1. ;;; emacspeak-vm.el --- Speech enable VM -- A powerful mail agent (and the one I use)
  2. ;;; $Id: emacspeak-vm.el 5798 2008-08-22 17:35:01Z tv.raman.tv $
  3. ;;; $Author: tv.raman.tv $
  4. ;;; Description: Emacspeak extension to speech enhance vm
  5. ;;; Keywords: Emacspeak, VM, Email, Spoken Output, Voice annotations
  6. ;;{{{ LCD Archive entry:
  7. ;;; LCD Archive Entry:
  8. ;;; emacspeak| T. V. Raman |raman@cs.cornell.edu
  9. ;;; A speech interface to Emacs |
  10. ;;; $Date: 2008-07-31 10:49:44 -0700 (Thu, 31 Jul 2008) $ |
  11. ;;; $Revision: 4557 $ |
  12. ;;; Location undetermined
  13. ;;;
  14. ;;}}}
  15. ;;{{{ Copyright:
  16. ;;;Copyright (C) 1995 -- 2007, T. V. Raman
  17. ;;; Copyright (c) 1994, 1995 by Digital Equipment Corporation.
  18. ;;; All Rights Reserved.
  19. ;;;
  20. ;;; This file is not part of GNU Emacs, but the same permissions apply.
  21. ;;;
  22. ;;; GNU Emacs is free software; you can redistribute it and/or modify
  23. ;;; it under the terms of the GNU General Public License as published by
  24. ;;; the Free Software Foundation; either version 2, or (at your option)
  25. ;;; any later version.
  26. ;;;
  27. ;;; GNU Emacs is distributed in the hope that it will be useful,
  28. ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
  29. ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  30. ;;; GNU General Public License for more details.
  31. ;;;
  32. ;;; You should have received a copy of the GNU General Public License
  33. ;;; along with GNU Emacs; see the file COPYING. If not, write to
  34. ;;; the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  35. ;;}}}
  36. ;;{{{ Introduction:
  37. ;;; This module extends the mail reader vm.
  38. ;;; Uses voice locking for message headers and cited messages
  39. ;;}}}
  40. ;;{{{ requires
  41. (require 'emacspeak-preamble)
  42. ;;}}}
  43. ;;{{{ voice locking:
  44. (defgroup emacspeak-vm nil
  45. "VM mail reader on the Emacspeak Desktop."
  46. :group 'emacspeak
  47. :group 'vm
  48. :prefix "emacspeak-vm-")
  49. (defcustom emacspeak-vm-voice-lock-messages nil
  50. "Set this to T if you want messages automatically voice locked.
  51. Note that some badly formed mime messages cause trouble."
  52. :type 'boolean
  53. :group 'emacspeak-vm)
  54. (add-hook 'vm-mode-hook
  55. 'emacspeak-vm-mode-setup)
  56. (defun emacspeak-vm-mode-setup ()
  57. "Setup function placed on vm-mode-hook by Emacspeak."
  58. (declare (special dtk-punctuation-mode emacspeak-vm-voice-lock-messages
  59. dtk-allcaps-beep))
  60. (setq dtk-punctuation-mode 'all)
  61. (when dtk-allcaps-beep
  62. (dtk-toggle-allcaps-beep))
  63. (emacspeak-dtk-sync)
  64. (when emacspeak-vm-voice-lock-messages
  65. (voice-lock-mode 1)))
  66. ;;}}}
  67. ;;{{{ inline helpers
  68. (defsubst emacspeak-vm-number-of (message) (aref (aref message 1) 0))
  69. ;;}}}
  70. ;;{{{ Advice completions
  71. (defadvice vm-minibuffer-complete-word (around emacspeak pre act)
  72. "Say what you completed."
  73. (let ((prior (point ))
  74. (dtk-stop-immediately t))
  75. (emacspeak-kill-buffer-carefully "*Completions*")
  76. ad-do-it
  77. (if (> (point) prior)
  78. (tts-with-punctuations
  79. 'all
  80. (if (> (length (emacspeak-get-minibuffer-contents)) 0)
  81. (dtk-speak (emacspeak-get-minibuffer-contents))
  82. (emacspeak-speak-line)))
  83. (emacspeak-speak-completions-if-available))
  84. ad-return-value))
  85. (defadvice vm-minibuffer-complete-word-and-exit (around emacspeak pre act)
  86. "Say what you completed."
  87. (let ((prior (point ))
  88. (dtk-stop-immediately t))
  89. (emacspeak-kill-buffer-carefully "*Completions*")
  90. ad-do-it
  91. (if (> (point) prior)
  92. (tts-with-punctuations
  93. 'all
  94. (if (> (length (emacspeak-get-minibuffer-contents)) 0)
  95. (dtk-speak (emacspeak-get-minibuffer-contents))
  96. (emacspeak-speak-line)))
  97. (emacspeak-speak-completions-if-available))
  98. ad-return-value))
  99. ;;}}}
  100. ;;{{{ Helper functions:
  101. (defvar emacspeak-vm-user-full-name (user-full-name)
  102. "Full name of user using this session")
  103. (defvar emacspeak-vm-user-login-name (user-login-name)
  104. "Login name of this user")
  105. (defun emacspeak-vm-yank-header ()
  106. "Yank specified header into kill ring."
  107. (interactive)
  108. (declare (special vm-message-pointer))
  109. (cond
  110. (vm-message-pointer
  111. (dtk-stop)
  112. (let* ((message (car vm-message-pointer ))
  113. (from (vm-from-of message ))
  114. (subject (vm-subject-of message ))
  115. (to (vm-to-of message ))
  116. (header nil))
  117. (while (not header)
  118. (setq header
  119. (case
  120. (read-char "f From s Subject t To")
  121. (?s subject)
  122. (?f from)
  123. (?t to))))
  124. (kill-new header)
  125. (message header)))
  126. (t (error "No current message." ))))
  127. (defcustom emacspeak-vm-headers-strip-octals t
  128. "Specify whether non-ascii chars should be stripped when
  129. speaking email headers."
  130. :type 'boolean
  131. :group 'emacspeak-vm)
  132. (defun emacspeak-vm-speak-message ()
  133. "Move point to the message body."
  134. (interactive)
  135. (goto-char (point-min))
  136. (search-forward (format "%c%c" 10 10) nil)
  137. (condition-case nil
  138. (emacspeak-hide-all-blocks-in-buffer)
  139. (error nil))
  140. (emacspeak-auditory-icon 'large-movement)
  141. (emacspeak-speak-rest-of-buffer))
  142. (defun emacspeak-vm-summarize-message ()
  143. "Summarize the current vm message. "
  144. (declare (special vm-message-pointer
  145. emacspeak-vm-headers-strip-octals
  146. emacspeak-vm-user-full-name emacspeak-vm-user-login-name))
  147. (when vm-message-pointer
  148. (dtk-stop)
  149. (let* ((dtk-stop-immediately t )
  150. (message (car vm-message-pointer ))
  151. (number (emacspeak-vm-number-of message))
  152. (from(or (vm-su-full-name message)
  153. (vm-su-from message )))
  154. (subject (vm-su-subject message ))
  155. (to(or (vm-su-to-names message)
  156. (vm-su-to message )))
  157. (self-p (or
  158. (string-match emacspeak-vm-user-full-name to)
  159. (string-match (user-login-name) to)))
  160. (lines (vm-su-line-count message))
  161. (summary nil))
  162. (dtk-speak
  163. (vm-decode-mime-encoded-words-in-string
  164. (format "%s %s %s %s %s "
  165. number
  166. (or from "")
  167. (if subject (format "on %s" subject) "")
  168. (if (and to (< (length to) 80))
  169. (format "to %s" to) "")
  170. (if lines (format "%s lines" lines) ""))))
  171. (cond
  172. ((and self-p
  173. (= 0 self-p) ) ;mail to me and others
  174. (emacspeak-auditory-icon 'item))
  175. (self-p ;mail to others including me
  176. (emacspeak-auditory-icon 'mark-object))
  177. (t ;got it because of a mailing list
  178. (emacspeak-auditory-icon 'select-object ))))))
  179. (defun emacspeak-vm-speak-labels ()
  180. "Speak a message's labels"
  181. (interactive)
  182. (declare (special vm-message-pointer))
  183. (when vm-message-pointer
  184. (message "Labels: %s"
  185. (vm-labels-of (car vm-message-pointer )))))
  186. (defun emacspeak-vm-mode-line ()
  187. "VM mode line information. "
  188. (interactive)
  189. (declare (special vm-ml-message-attributes-alist
  190. vm-ml-message-read vm-ml-message-unread
  191. vm-virtual-folder-definition
  192. vm-ml-message-new
  193. vm-ml-message-number vm-ml-highest-message-number ))
  194. (when (buffer-modified-p )
  195. (dtk-tone 700 70))
  196. (cond
  197. (vm-virtual-folder-definition
  198. (dtk-speak
  199. (format "Message %s of %s from virtual folder %s"
  200. vm-ml-message-number vm-ml-highest-message-number
  201. (car vm-virtual-folder-definition))))
  202. (t (dtk-speak
  203. (format "Message %s of %s, %s %s %s %s"
  204. vm-ml-message-number vm-ml-highest-message-number
  205. (if vm-ml-message-new "new" "")
  206. (if vm-ml-message-unread "unread" "")
  207. (if vm-ml-message-read "read" "")
  208. (mapconcat
  209. (function (lambda(item)
  210. (let ((var (car item))
  211. (value (cadr item )))
  212. (cond
  213. ((and (boundp var) (eval var ))
  214. (if (symbolp value)
  215. (eval value)
  216. value))
  217. (t "")))))
  218. (cdr vm-ml-message-attributes-alist) " "))))))
  219. ;;}}}
  220. ;;{{{ Moving between messages
  221. (add-hook 'vm-select-message-hook
  222. 'emacspeak-vm-summarize-message)
  223. ;;}}}
  224. ;;{{{ Scrolling messages:
  225. (defun emacspeak-vm-locate-subject-line()
  226. "Locates the subject line in a message being read.
  227. Useful when you're reading a message
  228. that has been forwarded multiple times."
  229. (interactive)
  230. (re-search-forward "^ *Subject:" nil t )
  231. (emacspeak-speak-line))
  232. (defadvice vm-scroll-forward (after emacspeak pre act)
  233. "Produce auditory feedback.
  234. Then speak the screenful. "
  235. (when (interactive-p)
  236. (emacspeak-auditory-icon 'scroll)
  237. (save-excursion
  238. (let ((start (point ))
  239. (window (get-buffer-window (current-buffer ))))
  240. (forward-line (window-height window))
  241. (emacspeak-speak-region start (point ))))))
  242. (defadvice vm-scroll-backward (after emacspeak pre act)
  243. "Produce auditory feedback.
  244. Then speak the screenful. "
  245. (when (interactive-p)
  246. (emacspeak-auditory-icon 'scroll)
  247. (save-excursion
  248. (let ((start (point ))
  249. (window (get-buffer-window (current-buffer ))))
  250. (forward-line(- (window-height window)))
  251. (emacspeak-speak-region start (point ))))))
  252. (defun emacspeak-vm-browse-message ()
  253. "Browse an email message --read it paragraph at a time. "
  254. (interactive)
  255. (emacspeak-execute-repeatedly 'forward-paragraph ))
  256. (declaim (special vm-mode-map))
  257. (eval-when (load)
  258. (load-library "vm-vars")
  259. )
  260. (declaim (special vm-mode-map))
  261. (define-key vm-mode-map "\M-\C-m" 'widget-button-press)
  262. (define-key vm-mode-map "y" 'emacspeak-vm-yank-header)
  263. (define-key vm-mode-map "\M-\t" 'emacspeak-vm-next-button)
  264. (define-key vm-mode-map "j" 'emacspeak-hide-or-expose-all-blocks)
  265. (define-key vm-mode-map "\M-g" 'vm-goto-message)
  266. (define-key vm-mode-map "J" 'vm-discard-cached-data)
  267. (define-key vm-mode-map "." 'emacspeak-vm-browse-message)
  268. (define-key vm-mode-map "'" 'emacspeak-speak-rest-of-buffer)
  269. ;;}}}
  270. ;;{{{ deleting and killing
  271. (defadvice vm-delete-message (after emacspeak pre act)
  272. "Provide auditory feedback."
  273. (when (interactive-p)
  274. (emacspeak-auditory-icon 'delete-object)
  275. (message "Message discarded.")))
  276. (defadvice vm-undelete-message (after emacspeak pre act)
  277. "Provide auditory feedback."
  278. (when (interactive-p)
  279. (message "Message recovered.")))
  280. (defadvice vm-kill-subject (after emacspeak pre act)
  281. "Provide auditory feedback. "
  282. (when (interactive-p)
  283. (emacspeak-auditory-icon 'delete-object)
  284. (call-interactively 'vm-next-message)))
  285. ;;}}}
  286. ;;{{{ Sending mail:
  287. (defadvice vm-forward-message (around emacspeak pre act)
  288. "Provide aural feedback."
  289. (if (interactive-p)
  290. (let ((dtk-stop-immediately nil))
  291. (message "Forwarding message")
  292. ad-do-it
  293. (emacspeak-speak-line ))
  294. ad-do-it)
  295. ad-return-value )
  296. (defadvice vm-reply (after emacspeak pre act)
  297. "Provide aural feedback."
  298. (when (interactive-p)
  299. (emacspeak-speak-mode-line)))
  300. (defadvice vm-followup (after emacspeak pre act)
  301. "Provide aural feedback."
  302. (when (interactive-p)
  303. (message "Folluwing up")
  304. (emacspeak-speak-mode-line)))
  305. (defadvice vm-reply-include-text (after emacspeak pre act)
  306. "Provide aural feedback."
  307. (when (interactive-p)
  308. (emacspeak-speak-mode-line )))
  309. (defadvice vm-followup-include-text (after emacspeak pre act)
  310. "Provide aural feedback."
  311. (when (interactive-p)
  312. (message "Following up")
  313. (emacspeak-speak-mode-line )))
  314. (defadvice vm-mail-send (after emacspeak pre act comp)
  315. "Provide auditory context"
  316. (when (interactive-p)
  317. (emacspeak-speak-mode-line)
  318. (emacspeak-auditory-icon 'close-object)))
  319. (defadvice vm-mail-send-and-exit (after emacspeak pre act comp)
  320. "Provide auditory context"
  321. (when (interactive-p)
  322. (emacspeak-auditory-icon 'close-object)))
  323. (defadvice vm-mail (after emacspeak pre act)
  324. "Provide aural feedback."
  325. (when (interactive-p)
  326. (let ((dtk-stop-immediately nil))
  327. (message "Composing a message")
  328. (emacspeak-speak-line ))))
  329. ;;}}}
  330. ;;{{{ quitting
  331. (defadvice vm-quit (after emacspeak pre act )
  332. "Provide an auditory icon if requested"
  333. (when (interactive-p)
  334. (emacspeak-auditory-icon 'close-object)
  335. (message "%s"
  336. (emacspeak-speak-mode-line))))
  337. ;;}}}
  338. ;;{{{ catching up on folders
  339. (defun emacspeak-vm-catch-up-all-messages ()
  340. "Mark all messages in folder to be deleted. Use with caution."
  341. (interactive)
  342. (declare (special vm-ml-highest-message-number))
  343. (vm-goto-message 1)
  344. (vm-delete-message
  345. (read vm-ml-highest-message-number))
  346. (message "All messages have been marked as deleted.")
  347. (emacspeak-auditory-icon 'delete-object))
  348. ;;}}}
  349. ;;{{{ Keybindings:
  350. (declaim (special vm-mode-map
  351. global-map
  352. emacspeak-prefix
  353. emacspeak-keymap))
  354. (define-key vm-mode-map "\M-c" 'emacspeak-vm-catch-up-all-messages)
  355. (define-key vm-mode-map "\M-j" 'emacspeak-vm-locate-subject-line)
  356. (define-key vm-mode-map "," 'emacspeak-vm-speak-message)
  357. (define-key vm-mode-map "\M-l" 'emacspeak-vm-speak-labels)
  358. (define-key vm-mode-map
  359. (concat emacspeak-prefix "m")
  360. 'emacspeak-vm-mode-line)
  361. ;;}}}
  362. ;;{{{ advise searching:
  363. (defadvice vm-isearch-forward (around emacspeak pre act comp)
  364. "Provide auditory feedback"
  365. (declare (special vm-message-pointer))
  366. (cond
  367. ((interactive-p)
  368. (let ((orig (point)))
  369. ad-do-it
  370. (cond
  371. ((not (= orig (point)))
  372. (emacspeak-auditory-icon 'search-hit)
  373. (emacspeak-speak-line))
  374. (t (emacspeak-auditory-icon 'search-miss)))))
  375. (t ad-do-it))
  376. ad-return-value)
  377. (defadvice vm-isearch-backward (around emacspeak pre act comp)
  378. "Provide auditory feedback"
  379. (declare (special vm-message-pointer))
  380. (cond
  381. ((interactive-p)
  382. (let ((orig (point)))
  383. ad-do-it
  384. (cond
  385. ((not (= orig (point)))
  386. (emacspeak-auditory-icon 'search-hit)
  387. (emacspeak-speak-line))
  388. (t (emacspeak-auditory-icon 'search-miss)))))
  389. (t ad-do-it))
  390. ad-return-value)
  391. ;;}}}
  392. ;;{{{ silence mime parsing in vm 6.0 and above
  393. (defadvice vm-mime-parse-entity (around emacspeak pre act comp)
  394. (let ((emacspeak-speak-messages nil))
  395. ad-do-it))
  396. (defadvice vm-decode-mime-message (around emacspeak pre act comp)
  397. (let ((emacspeak-speak-messages nil))
  398. ad-do-it))
  399. (defadvice vm-mime-run-display-function-at-point (around emacspeak pre act comp)
  400. "Provide auditory feedback.
  401. Leave point at front of decoded attachment."
  402. (cond
  403. ((interactive-p)
  404. (let ((orig (point )))
  405. ad-do-it
  406. (goto-char orig)
  407. (message "Decoded attachment")))
  408. (t ad-do-it))
  409. ad-return-value)
  410. ;;}}}
  411. ;;{{{ silence unnecessary chatter
  412. (defadvice vm-emit-eom-blurb (around emacspeak pre act comp)
  413. "Stop chattering"
  414. (let ((emacspeak-speak-messages nil))
  415. ad-do-it))
  416. ;;}}}
  417. ;;{{{ advice password prompt
  418. (defadvice vm-read-password(before emacspeak pre act comp)
  419. "Speak the prompt"
  420. (let ((prompt (ad-get-arg 0))
  421. (confirm (ad-get-arg 1)))
  422. (emacspeak-auditory-icon 'open-object)
  423. (dtk-speak
  424. (format "%s %s"
  425. prompt
  426. (if confirm "Confirm by retyping" "")))))
  427. ;;}}}
  428. ;;{{{ setup presentation buffer correctly
  429. (add-hook 'vm-presentation-mode-hook
  430. #'(lambda nil
  431. (emacspeak-pronounce-refresh-pronunciations)))
  432. (declaim (special emacspeak-pronounce-internet-smileys-pronunciations))
  433. (loop for hook in
  434. (list 'mail-mode-hook
  435. 'vm-presentation-mode-hook)
  436. do
  437. (add-hook hook 'emacspeak-pronounce-refresh-pronunciations
  438. 'append ))
  439. (loop for mode in
  440. '(vm-presentation-mode
  441. mail-mode)
  442. do
  443. (emacspeak-pronounce-augment-pronunciations mode
  444. emacspeak-pronounce-internet-smileys-pronunciations)
  445. (emacspeak-pronounce-add-dictionary-entry mode
  446. emacspeak-speak-embedded-url-pattern
  447. (cons 're-search-forward
  448. #'(lambda
  449. (url) "
  450. Link ")))
  451. (emacspeak-pronounce-add-dictionary-entry mode
  452. emacspeak-speak-rfc-3339-datetime-pattern
  453. (cons 're-search-forward
  454. 'emacspeak-speak-decode-rfc-3339-datetime))
  455. (emacspeak-pronounce-add-dictionary-entry mode
  456. emacspeak-speak-iso-datetime-pattern
  457. (cons 're-search-forward
  458. 'emacspeak-speak-decode-iso-datetime)))
  459. ;;}}}
  460. ;;{{{ advice button motion
  461. (defadvice vm-next-button (after emacspeak pre act comp)
  462. "Provide auditory feedback"
  463. (when (interactive-p)
  464. (emacspeak-auditory-icon 'large-movement)
  465. (emacspeak-speak-text-range 'w3-hyperlink-info)))
  466. ;;}}}
  467. ;;{{{ misc
  468. (defadvice vm-count-messages-in-file (around emacspeak-fix pre act comp)
  469. (ad-set-arg 1 'quiet)
  470. ad-do-it)
  471. ;;}}}
  472. ;;{{{ button motion in vm
  473. (defun emacspeak-vm-next-button (n)
  474. "Move point to N buttons forward.
  475. If N is negative, move backward instead."
  476. (interactive "p")
  477. (let ((function (if (< n 0) 'previous-single-property-change
  478. 'next-single-property-change))
  479. (inhibit-point-motion-hooks t)
  480. (backward (< n 0))
  481. (limit (if (< n 0) (point-min) (point-max))))
  482. (setq n (abs n))
  483. (while (and (not (= limit (point)))
  484. (> n 0))
  485. ;; Skip past the current button.
  486. (when (get-text-property (point) 'w3-hyperlink-info)
  487. (goto-char (funcall function (point) 'w3-hyperlink-info nil limit)))
  488. ;; Go to the next (or previous) button.
  489. (goto-char (funcall function (point) 'w3-hyperlink-info nil limit))
  490. ;; Put point at the start of the button.
  491. (when (and backward (not (get-text-property (point) 'w3-hyperlink-info)))
  492. (goto-char (funcall function (point) 'w3-hyperlink-info nil limit)))
  493. ;; Skip past intangible buttons.
  494. (when (get-text-property (point) 'intangible)
  495. (incf n))
  496. (decf n))
  497. (unless (zerop n)
  498. (message "No more buttons"))
  499. n))
  500. ;;}}}
  501. ;;{{{ saving mime attachment under point
  502. ;;}}}
  503. ;;{{{ configure and customize vm
  504. ;;; This is how I customize VM
  505. (defcustom emacspeak-vm-use-raman-settings t
  506. "Should VM use the customizations used by the author of Emacspeak."
  507. :type 'boolean
  508. :group 'emacspeak-vm)
  509. (defun emacspeak-vm-use-raman-settings ()
  510. "Customization settings for VM used by the author of
  511. Emacspeak."
  512. (declare (special
  513. vm-mime-charset-converter-alist
  514. vm-mime-default-face-charsets
  515. vm-frame-per-folder
  516. vm-frame-per-composition
  517. vm-frame-per-edit
  518. vm-frame-per-help
  519. vm-frame-per-summary
  520. vm-index-file-suffix
  521. vm-primary-inbox
  522. vm-folder-directory
  523. vm-forwarding-subject-format
  524. vm-startup-with-summary
  525. vm-inhibit-startup-message
  526. vm-visible-headers
  527. vm-delete-after-saving
  528. vm-url-browser
  529. vm-confirm-new-folders
  530. vm-move-after-deleting
  531. emacspeak-vm-voice-lock-messages))
  532. (setq vm-mime-charset-converter-alist
  533. '(
  534. ("utf-8" "iso-8859-1" "iconv -f utf-8 -t iso-8859-1")
  535. )
  536. )
  537. (setq vm-mime-default-face-charsets t)
  538. (setq vm-frame-per-folder nil
  539. vm-frame-per-composition nil
  540. vm-frame-per-edit nil
  541. vm-frame-per-help nil
  542. vm-frame-per-summary nil)
  543. (setq vm-index-file-suffix ".idx"
  544. vm-primary-inbox "~/mbox"
  545. vm-folder-directory "~/Mail/"
  546. vm-forwarding-subject-format "[%s]"
  547. vm-startup-with-summary nil
  548. vm-inhibit-startup-message t
  549. vm-visible-headers '("From:" "To:" "Subject:" "Date:" "Cc:")
  550. vm-delete-after-saving t
  551. vm-url-browser 'browse-url
  552. vm-confirm-new-folders t
  553. vm-move-after-deleting nil
  554. emacspeak-vm-voice-lock-messages t)
  555. t)
  556. (when emacspeak-vm-use-raman-settings
  557. (emacspeak-vm-use-raman-settings))
  558. (defcustom emacspeak-vm-customize-mime-settings t
  559. "Non-nil will cause Emacspeak to configure VM mime
  560. settings to match what the author of Emacspeak uses."
  561. :type 'boolean
  562. :group 'emacspeak-vm)
  563. (defcustom emacspeak-vm-pdf2text
  564. (expand-file-name "pdf2text" emacspeak-etc-directory)
  565. "Executable that converts PDF on standard input to plain
  566. text using pdftotext."
  567. :type 'string
  568. :group 'emacspeak-vm)
  569. (defcustom emacspeak-vm-doc2text
  570. (expand-file-name "doc2text" emacspeak-etc-directory)
  571. "Executable that converts MSWord documents on standard input to plain
  572. text using wvText."
  573. :type 'string
  574. :group 'emacspeak-vm)
  575. (defcustom emacspeak-vm-cal2text
  576. (expand-file-name "cal2text" emacspeak-etc-directory)
  577. "Executable that converts calendar invitations on
  578. standard input to plain text."
  579. :type 'string
  580. :group 'emacspeak-vm)
  581. (defcustom emacspeak-vm-xls2html
  582. (expand-file-name "xls2html" emacspeak-etc-directory)
  583. "Executable that converts MSXL documents on standard input to HTML
  584. using xlhtml."
  585. :type 'string
  586. :group 'emacspeak-vm)
  587. (defcustom emacspeak-vm-ppt2html
  588. (expand-file-name "ppt2html" emacspeak-etc-directory)
  589. "Executable that converts MSPPT documents on standard input to HTML
  590. using xlhtml."
  591. :type 'string
  592. :group 'emacspeak-vm)
  593. (defsubst emacspeak-vm-add-mime-convertor (convertor)
  594. "Helper to add a convertor specification."
  595. (declare (special vm-mime-type-converter-alist))
  596. (unless
  597. (find-if
  598. #'(lambda (i)
  599. (string-equal (car i) (car convertor)))
  600. vm-mime-type-converter-alist)
  601. (push convertor
  602. vm-mime-type-converter-alist)))
  603. (defun emacspeak-vm-customize-mime-settings ()
  604. "Customize VM mime settings."
  605. (declare (special vm-preview-lines
  606. vm-infer-mime-types
  607. vm-mime-decode-for-preview
  608. vm-auto-decode-mime-messages
  609. vm-auto-displayed-mime-content-type-exceptions
  610. vm-mime-attachment-save-directory
  611. vm-mime-base64-encoder-program
  612. vm-mime-base64-decoder-program
  613. vm-mime-attachment-auto-type-alist
  614. vm-mime-type-converter-alist
  615. emacspeak-vm-pdf2text
  616. emacspeak-vm-ppt2html
  617. emacspeak-vm-xls2html
  618. emacspeak-vm-doc2text
  619. emacspeak-vm-cal2text))
  620. (emacspeak-vm-add-mime-convertor
  621. (list "text/calendar" "text/plain" emacspeak-vm-cal2text))
  622. (emacspeak-vm-add-mime-convertor
  623. (list "application/pdf" "text/plain"
  624. emacspeak-vm-pdf2text))
  625. (emacspeak-vm-add-mime-convertor
  626. (list "application/vnd.ms-excel" "text/html"
  627. emacspeak-vm-xls2html))
  628. (emacspeak-vm-add-mime-convertor
  629. (list "application/vnd.ms-powerpoint" "text/html" emacspeak-vm-ppt2html))
  630. (emacspeak-vm-add-mime-convertor
  631. (list "application/msword" "text/plain" emacspeak-vm-doc2text))
  632. (setq vm-preview-lines nil
  633. vm-infer-mime-types t
  634. vm-mime-decode-for-preview nil
  635. vm-auto-decode-mime-messages t
  636. vm-auto-displayed-mime-content-type-exceptions '("text/html")
  637. vm-mime-attachment-save-directory (expand-file-name "~/Mail/attachments/")
  638. vm-mime-base64-encoder-program "base64-encode"
  639. vm-mime-base64-decoder-program "base64-decode")
  640. t)
  641. (when emacspeak-vm-customize-mime-settings
  642. (emacspeak-vm-customize-mime-settings))
  643. ;;}}}
  644. (provide 'emacspeak-vm)
  645. ;;{{{ local variables
  646. ;;; local variables:
  647. ;;; folded-file: t
  648. ;;; byte-compile-dynamic: t
  649. ;;; end:
  650. ;;}}}