aboutsummaryrefslogtreecommitdiff
path: root/emacs/init.el
diff options
context:
space:
mode:
Diffstat (limited to 'emacs/init.el')
-rw-r--r--emacs/init.el239
1 files changed, 239 insertions, 0 deletions
diff --git a/emacs/init.el b/emacs/init.el
index 3ad50d3..a050c55 100644
--- a/emacs/init.el
+++ b/emacs/init.el
@@ -519,6 +519,245 @@ then it takes a second \\[keyboard-quit] to abort the minibuffer."
(use-package which-key
:ensure t)
+;; TODO: dired evil
+
+;; mu4e
+
+;; TODO: sending emails is a bit screwed in my current setup...
+
+;; TODO: refile
+;;; http://comments.gmane.org/gmane.mail.mu.general/631
+;;; https://www.djcbsoftware.nl/code/mu/mu4e/Refiling-messages.html
+;;; https://www.djcbsoftware.nl/code/mu/mu4e/Smart-refiling.html
+;;; http://www.djcbsoftware.nl/code/mu/mu4e/Retrieval-and-indexing.html
+
+;; TODO: evil commands such as C-h, C-l
+;; TODO: remove whole thread ?
+;; TODO: signature below quote
+;; TODO: gmail flags
+;; TODO: msmtp
+
+; I'm using an RPM that I've built on OBS which installs mu4e globally. See:
+; https://build.opensuse.org/package/show/home:mssola/mu
+(add-to-list 'load-path "/usr/share/emacs/site-lisp/mu4e")
+(require 'mu4e)
+
+(when (featurep 'mu4e)
+ ; Define a proper shortcut.
+ (global-set-key (kbd "C-c m") 'mu4e)
+
+ ;; Diferent SMTP options that will be used for each context.
+
+ (setq message-send-mail-function 'smtpmail-send-it
+ mu4e-maildir (expand-file-name "~/.mail")
+ starttls-use-gnutls t)
+
+ (defun mssola-gmail-smtp ()
+ (require 'smtpmail)
+
+ (setq smtpmail-starttls-credentials
+ '(("smtp.gmail.com" 587 nil nil))
+ smtpmail-auth-credentials
+ (expand-file-name "~/.authinfo.gpg")
+ smtpmail-default-smtp-server "smtp.gmail.com"
+ smtpmail-smtp-server "smtp.gmail.com"
+ smtpmail-smtp-service 587))
+
+ (defun mssola-suse-smtp ()
+ (require 'smtpmail)
+
+ (setq smtpmail-starttls-credentials
+ '(("smtp.novell.com" 25 nil nil))
+ smtpmail-auth-credentials
+ (expand-file-name "~/.authinfo.gpg")
+ smtpmail-default-smtp-server "smtp.novell.com"
+ smtpmail-smtp-server "smtp.novell.com"
+ smtpmail-smtp-service 25))
+
+ ;; Define the different accounts that I'm using. This is only available since
+ ;; mu 0.9.16.
+
+ (setq mu4e-contexts
+ `(
+ ;; GMail
+ ,(make-mu4e-context
+ :name "gmail"
+ :enter-func (lambda ()
+ (mu4e-message "Switching to gmail.com")
+ (mssola-gmail-smtp))
+ :match-func (lambda (msg)
+ (when msg
+ (mu4e-message-contact-field-matches
+ msg :to "mikisabate@gmail.com")))
+ :vars '(
+ (user-mail-address . "mikisabate@gmail.com")
+ (user-full-name . "Miquel Sabaté Solà")
+ (mu4e-reply-to-address . "mikisabate@gmail.com")
+ (mu4e-drafts-folder . "/gmail/Drafts")
+ (mu4e-sent-folder . "/gmail/Sent")
+ (mu4e-trash-folder . "/gmail/Trash")))
+
+ ;; suse.com
+ ,(make-mu4e-context
+ :name "comsuse"
+ :enter-func (lambda ()
+ (mu4e-message "Switching to suse.com")
+ (mssola-suse-smtp))
+ :match-func (lambda (msg)
+ (when msg
+ (mu4e-message-contact-field-matches
+ msg :to "msabate@suse.com")))
+ :vars '(
+ (user-mail-address . "msabate@suse.com")
+ (user-full-name . "Miquel Sabaté Solà")
+ (mu4e-reply-to-address . "msabate@suse.com")
+ (mu4e-drafts-folder . "/susecom/Drafts")
+ (mu4e-sent-folder . "/susecom/Sent")
+ (mu4e-trash-folder . "/susecom/Trash")))
+
+ ;; suse.de
+ ,(make-mu4e-context
+ :name "desuse"
+ :enter-func (lambda ()
+ (mu4e-message "Switching to suse.de")
+ (mssola-suse-smtp))
+ :match-func (lambda (msg)
+ (when msg
+ (mu4e-message-contact-field-matches
+ msg :to "msabate@suse.de")))
+ :vars '(
+ (user-mail-address . "msabate@suse.de")
+ (user-full-name . "Miquel Sabaté Solà")
+ (mu4e-reply-to-address . "msabate@suse.de")
+ (mu4e-drafts-folder . "/susede/Drafts")
+ (mu4e-sent-folder . "/susede/Sent")
+ (mu4e-trash-folder . "/susede/Trash")))))
+
+ ; If mu4e cannot figure things out, ask me.
+ (setq mu4e-context-policy 'ask)
+ (setq mu4e-compose-context-policy 'ask)
+
+ ; Fill the `mu4e-user-mail-address-list' variable with the contexts.
+ (setq mu4e-user-mail-address-list
+ (delq nil
+ (mapcar (lambda (context)
+ (when (mu4e-context-vars context)
+ (cdr (assq 'user-mail-address
+ (mu4e-context-vars context)))))
+ mu4e-contexts)))
+
+ ; Signature.
+ (setq mu4e-compose-signature
+ (concat
+ "Miquel Sabaté Solà\n"
+ "PGP: 4096R / 1BA5 3C7A C93D CA2A CFDF DA97 96BE 8C6F D89D 6565\n"))
+
+ ; Sign outgoing emails
+ (add-hook 'message-send-hook 'mml-secure-message-sign-pgpmime)
+
+ ; Don't save message to Sent Messages, mbsync will take care of that.
+ (setq mu4e-sent-messages-behavior 'delete)
+
+ ;; To avoid UID clashes. See:
+ ;; http://pragmaticemacs.com/emacs/fixing-duplicate-uid-errors-when-using-mbsync-and-mu4e/
+ (setq mu4e-change-filenames-when-moving t)
+
+ ; Miscellaneous settings.
+ (setq mu4e-html2text-command "w3m -T text/html"
+ mu4e-attachment-dir "~/Downloads"
+ mu4e-headers-date-format "%Y-%m-%d %H:%M"
+ message-citation-line-format "%N @ %Y-%m-%d %H:%M %Z:\n"
+ message-citation-line-function 'message-insert-formatted-citation-line
+ message-kill-buffer-on-exit t
+ mu4e-get-mail-command "mbsync -aqV"
+ mu4e-update-interval 120
+ mu4e-compose-dont-reply-to-self t
+ mu4e-headers-skip-duplicates t
+ mu4e-headers-include-related t
+ mu4e-headers-auto-update t)
+
+ ;; Setting up shortcuts that can be composed with mu4e commands. For
+ ;; example, in this setup, pressin `ji` will jump to the inbox, and `ma`
+ ;; will move an email to the `All Mail` folder.
+ (setq mu4e-maildir-shortcuts
+ '( ("/INBOX" . ?i)
+ ("/Sent" . ?s)
+ ("/Trash" . ?t)
+ ("/Drafts" . ?d)))
+
+ ;; The headers to show in the headers list a pair of a field and its width,
+ ;; with `nil' meaning 'unlimited' (better only use that for the last field.
+ ;; These are the defaults:
+ (setq mu4e-headers-fields
+ '( (:date . 18)
+ (:mailing-list . 15)
+ (:from-or-to . 20)
+ (:subject . nil)))
+
+ ; Show images
+ (setq mu4e-view-show-images t
+ mu4e-view-image-max-width 800)
+
+ ; Use imagemagick, if available
+ (when (fboundp 'imagemagick-register-types)
+ (imagemagick-register-types))
+
+ ; Webkit support for viewing HTML emails. See the following discussion:
+ ; https://groups.google.com/forum/#!topic/mu-discuss/JqHEGycEyKI
+ (defun my-mu4e-action-view-with-xwidget (msg)
+ "View the body of the message inside xwidget-webkit."
+ (unless (fboundp 'xwidget-webkit-browse-url)
+ (mu4e-error "No xwidget support available"))
+ (let* ((html (mu4e-message-field msg :body-html))
+ (txt (mu4e-message-field msg :body-txt))
+ (tmpfile (format "%s%x.html" temporary-file-directory (random t))))
+ (unless (or html txt)
+ (mu4e-error "No body part for this message"))
+ (with-temp-buffer
+ ;; simplistic -- but note that it's only an example...
+ (insert (or html (concat "<pre>" txt "</pre>")))
+ (write-file tmpfile)
+ (xwidget-webkit-browse-url (concat "file://" tmpfile) t))))
+
+ (add-to-list 'mu4e-view-actions
+ '("xViewXWidget" . my-mu4e-action-view-with-xwidget) t)
+
+ ; Spell check
+ (add-hook 'mu4e-compose-mode-hook
+ (lambda ()
+ "My settings for message composition."
+ (set-fill-column 99999)
+ (flyspell-mode)))
+
+ ; Restore some of my evil config.
+ ; TODO: doesn't work
+ (dolist (imap '(mu4e-main-mode-map mu4e-headers-mode-map mu4e-view-mode-map))
+ (evil-define-key 'evil-mu4e-state imap
+ "\C-h" 'evil-window-left
+ "\C-l" 'evil-window-right
+ "\C-j" 'evil-window-down
+ "\C-k" 'evil-window-up
+ "\M-p" 'helm-projectile-switch-project))
+
+ ; Desktop notifications
+ (use-package mu4e-alert
+ :ensure t
+ :config
+
+ (mu4e-alert-set-default-style 'libnotify)
+ (add-hook 'after-init-hook #'mu4e-alert-enable-notifications)
+ (add-hook 'after-init-hook #'mu4e-alert-enable-mode-line-display)
+ (setq mu4e-alert-interesting-mail-query
+ "flag:unread AND NOT flag:trashed")
+ (setq mu4e-alert-email-notification-types '(count)))
+
+ ; Evil mode in mu4e
+ (use-package evil-mu4e
+ :ensure t
+ :config))
+
+(setq mu4e-update-interval 120)
+
;;; Programming languages.
(defun warnings-mode-hook ()