aboutsummaryrefslogtreecommitdiffstats
path: root/_emacs.d
diff options
context:
space:
mode:
authorAaron LI <aaronly.me@gmail.com>2016-02-21 15:21:50 +0800
committerAaron LI <aaronly.me@gmail.com>2016-02-21 15:21:50 +0800
commit3727e8794eaa96741474c7d03249e61ae2b22aa5 (patch)
tree2c5c456c8a102d5d0a9086467cabdaf468ea408c /_emacs.d
parenta89cf6f8a9e6d845cdebbf0c0d76efc0b99588df (diff)
downloaddotfiles-3727e8794eaa96741474c7d03249e61ae2b22aa5.tar.bz2
Emacs: customize 'prelude' configuration kit.
Prelude: https://github.com/bbatsov/prelude
Diffstat (limited to '_emacs.d')
-rw-r--r--_emacs.d/personal/mu4e.el272
-rw-r--r--_emacs.d/personal/orgmode.el41
-rw-r--r--_emacs.d/personal/personal.el17
-rw-r--r--_emacs.d/prelude-modules.el54
4 files changed, 384 insertions, 0 deletions
diff --git a/_emacs.d/personal/mu4e.el b/_emacs.d/personal/mu4e.el
new file mode 100644
index 0000000..0c63e48
--- /dev/null
+++ b/_emacs.d/personal/mu4e.el
@@ -0,0 +1,272 @@
+;;; -*- mode: emacs-lisp -*-
+;;; vim: set ts=8 sw=2 tw=0 fenc=utf-8 ft=lisp:
+;;;
+;;; mu4e (mu for emacs) configurations
+;;;
+;;; Aaron LI
+;;; 2016-02-21
+;;;
+
+;; mu4e package path
+(add-to-list 'load-path "~/local/emacs/site-lisp/mu4e")
+(require 'mu4e)
+
+;; turn on debug: log debug information to the *mu4e-log* buffer
+(setq mu4e-debug t)
+
+(setq mu4e-maildir "~/mail")
+
+;; multiple email accounts: contexts (require mu4e >= 0.9.16)
+(setq mu4e-contexts
+ `( ,(make-mu4e-context
+ :name "Outlook-aly"
+ :enter-func (lambda ()
+ (mu4e-message "Switched to context: outlook-aly"))
+ ;; `leave-func' not defined
+ ;; `match-func' is invoked just before `mu4e-compose-pre-hook'
+ :match-func (lambda (msg)
+ (when msg
+ (mu4e-message-contact-field-matches msg
+ :to "aaronly.me@outlook.com")))
+ :vars '((user-mail-address . "aaronly.me@outlook.com")
+ (user-full-name . "Aaron LI")
+ (mu4e-sent-folder . "/outlook-aly/sent")
+ (mu4e-drafts-folder . "/outlook-aly/drafts")
+ (mu4e-trash-folder . "/outlook-aly/trash")
+ (mu4e-refile-folder . "/outlook-aly/archive")
+ (mu4e-compose-signature . "Aly")
+ (mu4e-sent-messages-behavior . delete)))
+ ,(make-mu4e-context
+ :name "Gmail-aly"
+ :enter-func (lambda ()
+ (mu4e-message "Switched to context: gmail-aly"))
+ ;; `leave-func' not defined
+ :match-func (lambda (msg)
+ (when msg
+ (mu4e-message-contact-field-matches msg
+ :to "aaronly.me@gmail.com")))
+ :vars '((user-mail-address . "aaronly.me@gmail.com")
+ (user-full-name . "Aaron LI")
+ ;; special folders
+ (mu4e-sent-folder . "/sent")
+ (mu4e-drafts-folder . "/gmail-aly/drafts")
+ (mu4e-trash-folder . "/gmail-aly/trash")
+ (mu4e-refile-folder . "/gmail-aly/archive")
+ (mu4e-compose-signature . "Aly")
+ ;; do NOT save message to 'sent-folder'
+ (mu4e-sent-messages-behavior . delete)))
+ ,(make-mu4e-context
+ :name "outlook-li"
+ :enter-func (lambda ()
+ (mu4e-message "Switched to context: outlook-li"))
+ ;; `leave-func' not defined
+ :match-func (lambda (msg)
+ (when msg
+ (mu4e-message-contact-field-matches msg
+ :to '("liweitianux@live.com"
+ "liweitianux@outlook.com"))))
+ :vars '((user-mail-address . "liweitianux@live.com")
+ (user-full-name . "Weitian LI")
+ (mu4e-sent-folder . "/outlook-li/sent")
+ (mu4e-drafts-folder . "/outlook-li/drafts")
+ (mu4e-trash-folder . "/outlook-li/trash")
+ (mu4e-refile-folder . "/outlook-li/archive")
+ (mu4e-compose-signature . "Weitian LI")
+ (mu4e-sent-messages-behavior . delete)))
+ ,(make-mu4e-context
+ :name "gmail-li"
+ :enter-func (lambda ()
+ (mu4e-message "Switched to context: gmail-li"))
+ ;; `leave-func' not defined
+ :match-func (lambda (msg)
+ (when msg
+ (mu4e-message-contact-field-matches msg
+ :to "liweitianux@gmail.com")))
+ :vars '((user-mail-address . "liweitianux@gmail.com")
+ (user-full-name . "Weitian LI")
+ (mu4e-sent-folder . "/sent")
+ (mu4e-drafts-folder . "/gmail-li/drafts")
+ (mu4e-trash-folder . "/gmail-li/trash")
+ (mu4e-refile-folder . "/gmail-li/archive")
+ (mu4e-compose-signature . "Weitian LI")
+ (mu4e-sent-messages-behavior . delete)))
+ ,(make-mu4e-context
+ :name "sjtu"
+ :enter-func (lambda ()
+ (mu4e-message "Switched to context: sjtu"))
+ ;; `leave-func' not defined
+ :match-func (lambda (msg)
+ (when msg
+ (mu4e-message-contact-field-matches msg
+ :to "liweitianux@sjtu.edu.cn")))
+ :vars '((user-mail-address . "liweitianux@sjtu.edu.cn")
+ (user-full-name . "Weitian LI")
+ (mu4e-sent-folder . "/sjtu/sent")
+ (mu4e-drafts-folder . "/sjtu/drafts")
+ (mu4e-trash-folder . "/sjtu/trash")
+ (mu4e-refile-folder . "/sjtu/archive")
+ (mu4e-compose-signature .
+ (concat "Weitian LI\n"
+ "Department of Physics and Astronomy\n"
+ "Shanghai Jiao Tong University"))
+ ;; copy message to sent folder
+ (mu4e-sent-messages-behavior . sent)))
+ ,(make-mu4e-context
+ :name "autistici"
+ :enter-func (lambda ()
+ (mu4e-message "Switched to context: autistici"))
+ ;; `leave-func' not defined
+ :match-func (lambda (msg)
+ (when msg
+ (mu4e-message-contact-field-matches msg
+ :to "liweitianux@autistici.org")))
+ :vars '((user-mail-address . "liweitianux@autistici.org")
+ (user-full-name . "Weitian LI")
+ (mu4e-sent-folder . "/autistici/sent")
+ (mu4e-drafts-folder . "/autistici/drafts")
+ (mu4e-trash-folder . "/autistici/trash")
+ (mu4e-refile-folder . "/autistici/archive")
+ (mu4e-compose-signature . "Weitian LI")
+ ;; copy message to sent folder
+ (mu4e-sent-messages-behavior . sent)))
+ ,(make-mu4e-context
+ :name "foxmail"
+ :enter-func (lambda ()
+ (mu4e-message "Switched to context: foxmail"))
+ ;; `leave-func' not defined
+ :match-func (lambda (msg)
+ (when msg
+ (mu4e-message-contact-field-matches msg
+ :to '("liweitianux@foxmail.com"
+ "527922216@qq.com"))))
+ :vars '((user-mail-address . "liweitianux@foxmail.com")
+ (user-full-name . "Weitian LI")
+ (mu4e-sent-folder . "/foxmail/sent")
+ (mu4e-drafts-folder . "/foxmail/drafts")
+ (mu4e-trash-folder . "/foxmail/trash")
+ (mu4e-refile-folder . "/foxmail/archive")
+ (mu4e-compose-signature . "Weitian LI")
+ (mu4e-sent-messages-behavior . delete)))))
+
+;; start with the first (default) context
+;; default: `ask-if-none' (ask when there's no context yet, and none match)
+(setq mu4e-context-policy 'pick-first)
+;; compose with the current context if no context matches
+;; default: `ask'
+(setq mu4e-compose-context-policy nil)
+
+;; auto construct addresses list by extracting addresses from 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)))
+
+;; send mail using `msmtp'
+(setq message-send-mail-function 'message-send-mail-with-sendmail
+ message-sendmail-f-is-evil t
+ ;; choose the account according to the `From' header
+ message-sendmail-extra-arguments '("--read-envelope-from")
+ sendmail-program "msmtp")
+
+;; allow for fetch mail and update index using 'U' in the main view
+(setq mu4e-get-mail-command "offlineimap -o -1")
+;(setq mu4e-get-mail-command "true" nil nil
+; "Disable fetching mail as it is done by a daemon")
+
+;; frequent mail folders, with shortcuts
+;; do not use shortcut `o' as it is used for `[o]ther'
+(setq mu4e-maildir-shortcuts
+ '(("/important" . ?i)
+ ("/archive" . ?a)
+ ("/gmail-aly/archive" . ?G)
+ ("/gmail-li/archive" . ?g)
+ ("/outlook-aly/inbox" . ?l)
+ ("/outlook-li/inbox" . ?L)
+ ("/sjtu/inbox" . ?s)))
+
+;; do not keep message buffers around
+(setq message-kill-buffer-on-exit t)
+
+;; enable inline images
+(setq mu4e-view-show-images t)
+;; use imagemagick if available
+(when (fboundp 'imagemagick-register-types)
+ (imagemagick-register-types))
+
+;; display rich-text messages
+(require 'mu4e-contrib)
+;; use `shr' html renderer; reqiure emacs >= 24.4
+(setq mu4e-html2text-command 'mu4e-shr2text)
+(add-hook 'mu4e-view-mode-hook
+ (lambda ()
+ ;; try to emulate some of the `eww' key-bindings
+ (local-set-key (kbd "<tab>") 'shr-next-link)
+ (local-set-key (kbd "<backtab>") 'shr-previous-link)))
+;; change the luminosity form dark theme
+(setq shr-color-visible-luminance-min 70)
+
+;; customize bookmarks
+(defvar mu4e-bookmarks
+ '(("flag:unread AND NOT flag:trashed" "Unread messages" ?u)
+ ("date:today..now" "Today's messages" ?t)
+ ("date:7d..now" "Last 7 days" ?w)
+ ("flag:flagged" "Flagged messages" ?f)
+ ("tag:astro" "Astro" ?a)
+ ("tag:arxiv" "arXiv" ?x)
+ ("mime:image/*" "Messages with images" ?p)))
+
+;; headers list appearance
+(setq mu4e-headers-date-format "%Y-%m-%d %H:%M"
+ mu4e-headers-fields '((:date . 18) ;; also :human-date
+ (:flags . 5)
+ (:from-or-to . 22)
+ (:subject . nil))) ;; also :thread-subject
+
+;; use fancy non-ascii characters in various places
+;(setq mu4e-use-fancy-chars t)
+
+;; show full addresses instead of just names when view message
+(setq mu4e-view-show-addresses t)
+
+;; also include messages related to the searched messages
+(setq mu4e-headers-include-related t)
+;; exclude the duplicate messages with the same `Message-ID'
+(setq mu4e-headers-skip-duplicates t)
+
+;; confirm before sending
+(add-hook 'message-send-hook
+ (lambda ()
+ (unless (yes-or-no-p "Sure you want to send this?")
+ (signal 'quit nil))))
+
+;; apply "format=flowed" to outgoing messages, enabling receiving clients
+;; that supports this feature to reflow the paragraphs. (from mu4e FAQ)
+(add-hook 'mu4e-compose-mode-hook
+ (defun cpb-compose-setup ()
+ "Outgoing mails get `format=flowed'."
+ (use-hard-newlines t 'guess)))
+
+;; custom actions
+;; retag action
+(setq mu4e-action-tags-header "X-Keywords")
+(add-to-list 'mu4e-headers-actions
+ '("tRetag message" . mu4e-action-retag-message) t)
+(add-to-list 'mu4e-view-actions
+ '("tRetag message" . mu4e-action-retag-message) t)
+;; view in browser
+(add-to-list 'mu4e-view-actions
+ '("bView in browser" . mu4e-action-view-in-browser) t)
+;; search for messages by the sender of the opened message
+(defun search-for-sender (msg)
+ "Search for messages sent by the sender of the message at point."
+ (mu4e-headers-search
+ (concat "from:" (cdar (mu4e-message-field msg :from)))))
+(add-to-list 'mu4e-view-actions
+ '("xSearch for sender" . search-for-sender) t)
+
+;; set `mu4e' as emacs' default email program
+(setq mail-user-agent 'mu4e-user-agent)
+
diff --git a/_emacs.d/personal/orgmode.el b/_emacs.d/personal/orgmode.el
new file mode 100644
index 0000000..87cd7d1
--- /dev/null
+++ b/_emacs.d/personal/orgmode.el
@@ -0,0 +1,41 @@
+;;; -*- mode: emacs-lisp -*-
+;;; vim: set ts=8 sw=2 tw=0 fenc=utf-8 ft=lisp:
+;;;
+;;; Org-mode configurations
+;;;
+;;; Credit:
+;;; [1] http://www.john2x.com/emacs.html
+;;;
+;;; Aaron LI
+;;; 2016-02-21
+;;;
+
+(setq org-directory "~/org")
+(setq org-todo-keywords
+ '((sequence "TODO" "DOING" "WAITING" "LATER" "|" "DONE" "DELEGATED")))
+;; default notes file for `org-capture'
+(setq org-default-notes-file (concat org-directory "/notes.org"))
+;; set custom `org-capture' templates
+(setq org-capture-templates
+ '(("t" "Todo" entry (file+headline (concat org-directory "/todo.org") "Other")
+ "* TODO %?\n %i\n %a")
+ ("n" "Note" entry (file+datetree (concat org-directory "/notes.org"))
+ "* %?\nEntered on %U\n %i\n %a")))
+;; add custom `org-agenda' to show:
+;; * agenda for the week
+;; * things currently working on
+;; * list of remaining TODO items
+(setq org-agenda-custom-commands
+ '(("z" "Agenda and Tasks"
+ ((agenda "")
+ (todo "DOING")
+ (todo "TODO")))))
+;; enable font-locking for org source blocks
+(setq org-src-fontify-natively t)
+;; do not evaulate source blocks when exporting
+(setq org-export-babel-evaluate nil)
+;;
+(global-set-key "\C-ca" 'org-agenda)
+(global-set-key "\C-cb" 'org-iswitchb)
+(global-set-key "\C-cc" 'org-capture)
+(global-set-key "\C-cl" 'org-store-link)
diff --git a/_emacs.d/personal/personal.el b/_emacs.d/personal/personal.el
new file mode 100644
index 0000000..44fb6bf
--- /dev/null
+++ b/_emacs.d/personal/personal.el
@@ -0,0 +1,17 @@
+;;;
+;;; ~/.emacs.d/personal/personal.el
+;;;
+;;; Aaron LI
+;;; 2016-02-21
+;;;
+
+;; Disable `key-chord-mode' for `evil-mode'
+;; (or just do not enable the `prelude-key-chord' module)
+(key-chord-mode -1)
+
+;; Do NOT automatically clean whitespaces on save
+;(setq prelude-clean-whitespace-on-save nil)
+
+;; Disable `flyspell-mode': do not spellcheck on the fly
+;(setq prelude-flyspell nil)
+
diff --git a/_emacs.d/prelude-modules.el b/_emacs.d/prelude-modules.el
new file mode 100644
index 0000000..ea39fdf
--- /dev/null
+++ b/_emacs.d/prelude-modules.el
@@ -0,0 +1,54 @@
+;;;
+;;; ~/.emacs.d/prelude-modules.el
+;;; copyed from `sample/prelude-modules.el'
+;;;
+;;; Aaron LI
+;;; 2016-02-21
+;;;
+
+;;; Uncomment the modules you'd like to use and restart Prelude afterwards
+
+;; Emacs IRC client
+;;(require 'prelude-erc)
+;; Super charges Emacs completion for C-x C-f and more
+(require 'prelude-ido)
+;; Interface for narrowing and search
+(require 'prelude-helm)
+;; Enable Helm everywhere
+(require 'prelude-helm-everywhere)
+(require 'prelude-company)
+;; Binds useful features to key combinations (NOTE: conflict with `evil-mode')
+;;(require 'prelude-key-chord)
+;; (require 'prelude-mediawiki)
+;; Evil is an extensible vi layer for Emacs
+(require 'prelude-evil)
+
+;;; Programming languages support
+(require 'prelude-c)
+;;(require 'prelude-clojure)
+;;(require 'prelude-coffee)
+;;(require 'prelude-common-lisp)
+;;(require 'prelude-css)
+(require 'prelude-emacs-lisp)
+;;(require 'prelude-erlang)
+;;(require 'prelude-elixir)
+;;(require 'prelude-go)
+;;(require 'prelude-haskell)
+(require 'prelude-js)
+(require 'prelude-latex)
+(require 'prelude-lisp)
+;;(require 'prelude-ocaml)
+;; Org-mode helps you keep TODO lists, notes and more
+(require 'prelude-org)
+;;(require 'prelude-perl)
+(require 'prelude-python)
+;;(require 'prelude-ruby)
+;;(require 'prelude-scala)
+(require 'prelude-scheme)
+(require 'prelude-shell)
+;;(require 'prelude-scss)
+;; Emacs mode for web templates
+;;(require 'prelude-web)
+(require 'prelude-xml)
+;;(require 'prelude-yaml)
+