diff options
author | Aaron LI <aaronly.me@gmail.com> | 2016-02-21 15:21:50 +0800 |
---|---|---|
committer | Aaron LI <aaronly.me@gmail.com> | 2016-02-21 15:21:50 +0800 |
commit | 3727e8794eaa96741474c7d03249e61ae2b22aa5 (patch) | |
tree | 2c5c456c8a102d5d0a9086467cabdaf468ea408c /_emacs.d | |
parent | a89cf6f8a9e6d845cdebbf0c0d76efc0b99588df (diff) | |
download | dotfiles-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.el | 272 | ||||
-rw-r--r-- | _emacs.d/personal/orgmode.el | 41 | ||||
-rw-r--r-- | _emacs.d/personal/personal.el | 17 | ||||
-rw-r--r-- | _emacs.d/prelude-modules.el | 54 |
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) + |