Emacs - font lock
[dotfiles.git] / emacs.d / config.org
index 387b480..73dfe4b 100644 (file)
@@ -8,29 +8,17 @@ Most config are just copied from [[https://github.com/howardabrams/dot-files][ho
 
 * Basic Settings
 ** Setting loading Path
-
 Set system PATH and emacs exec path
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (setenv "PATH" (concat (getenv "PATH")
                          ":" "/usr/local/bin"
                          ":" "/Library/TeX/texbin"))
   (setq exec-path (append exec-path '("/usr/local/bin")))
   (setq exec-path (append exec-path '("/Library/TeX/texbin/")))
-
-#+END_SRC
-
-Set the emacs load path
-
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  ;; (add-to-list 'load-path "~/.emacs.d/elisp")
 #+END_SRC
 
 ** Package Initialization
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (require 'package)
 
   (setq package-archives '(("mepla" . "http://melpa.milkbox.net/packages/")
@@ -38,23 +26,40 @@ Set the emacs load path
                            ("org" . "http://orgmode.org/elpa/")))
 
   (package-initialize)
-
 #+END_SRC       
 
+** My constant
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (defconst my-name "Peng Li")
+  (defconst my-email "seudut@gmail.com")
+#+END_SRC
+
 ** General Setting
 *** scroll bar, tool-bar and menu-bar
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (scroll-bar-mode 0)
-  (tool-bar-mode 0)
-  (menu-bar-mode 1)
+  (if (display-graphic-p)
+      (progn
+        (scroll-bar-mode 0)
+        (tool-bar-mode 0)
+        (menu-bar-mode 1))
+    (menu-bar-mode 0))
 
-  ;; (setq debug-on-error t)
+  (setq debug-on-error t)
   (setq inhibit-startup-message t)
 
   (defalias 'yes-or-no-p 'y-or-n-p)
   (show-paren-mode 1)
   ;; don't backupf
   (setq make-backup-files nil)
+
+  ;;supress the redefined warning at startup
+  (setq ad-redefinition-action 'accept)
+
+  (setq scroll-step 1)
+  (setq scroll-margin 5)
+
+  (when (display-graphic-p)
+    (fringe-mode '(0 . 0)))
 #+END_SRC
 
 *** Custom file 
@@ -108,8 +113,12 @@ Make a temp directory for all cache/history files
   (setq auto-save-list-file-prefix (concat sd-temp-directory "auto-save-list/.saves-"))
 #+END_SRC
 
-* Package Management Tools
+*** Max file size
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (setq large-file-warning-threshold nil)
+#+END_SRC
 
+* Package Management Tools
 ** Use-package
 Using [[https://github.com/jwiegley/use-package][use-package]] to manage emacs packages
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
@@ -137,70 +146,118 @@ Check out [[http://tapoueh.org/emacs/el-get.html][el-get]].
 #+END_SRC
 
 * Color and Fonts Settings
-
 ** highlight current line
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  ;; (global-hl-line-mode)
+  ;; don't want high light current line in eshell/term mode
+  (add-hook 'prog-mode-hook 'hl-line-mode)
+  (add-hook 'text-mode-hook 'hl-line-mode)
+  (add-hook 'dired-mode-hook 'hl-line-mode)
 
-  (global-hl-line-mode)
+  ;; only highlight selected window
+  (setq hl-line-sticky-flag nil)
 
+  (setq-default fill-column 120)
+  (add-hook 'text-mode-hook 'turn-on-auto-fill)
 #+END_SRC
 
 ** Smart Comments
-
 [[https://github.com/paldepind/smart-comment][smart-comments]]
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (use-package smart-comment
     :ensure t
     :bind ("M-;" . smart-conmment))
-
 #+END_SRC
 
 ** Font Setting
-
-syntax highlighting
-
+*** syntax highlighting
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (global-font-lock-mode 1)
-
 #+END_SRC
 
-[[https://github.com/i-tu/Hasklig][Hasklig]] and Source Code Pro, defined fonts family
-
+*** [[https://github.com/i-tu/Hasklig][Hasklig]] and Source Code Pro, defined fonts family
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (if window-system
       (defvar sd/fixed-font-family
         (cond ((x-list-fonts "Hasklig")         "Hasklig")
-              ((x-list-fonts "Source Code Pro") "Source Code Pro:weight:light")
+              ((x-list-fonts "Source Code Pro") "Source Code Pro:weight") ;; weigth=light
               ((x-list-fonts "Anonymous Pro")   "Anonymous Pro")
               ((x-list-fonts "M+ 1mn")          "M+ 1mn"))
         "The fixed width font based on what is installed, `nil' if not defined."))
-
 #+END_SRC
 
-Setting the fonts 
-
+Setting the fonts alignment issue
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (if window-system
       (when sd/fixed-font-family
         (set-frame-font sd/fixed-font-family)
-        (set-face-attribute 'default nil :font sd/fixed-font-family :height 130)
+        (set-face-attribute 'default nil :font sd/fixed-font-family :height 140)
         (set-face-font 'default sd/fixed-font-family)))
+#+END_SRC
+
+*** Chinese fonts
+Fix the font alignment issue when both Chinese and English hybird in org-mode table. Refer [[http://coldnew.github.io/blog/2013/11-16_d2f3a/][解決 org-mode 表格內中英文對齊的問題]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (defvar emacs-english-font "Source Code Pro" "The font name of English.")
+
+  (defvar emacs-cjk-font "STHeiti" "The font name for CJK.")
 
+  (defvar emacs-font-size-pair '(13 . 16) "Default font size pair for (english . chinese)")
+
+  (defvar emacs-font-size-pair-list
+    '(( 5 .  6) (10 . 12)
+      (11 . 14) (12 . 14)
+      (13 . 16) (14 . 16) (15 . 18) (16 . 20) (17 . 20)
+      (18 . 22) (19 . 22) (20 . 24) (21 . 26)
+      (24 . 28) (26 . 32) (28 . 34)
+      (30 . 36) (34 . 40) (36 . 44))
+    "This list is used to store matching (englis . chinese) font-size.")
+
+  (defun font-exist-p (fontname)
+    "Test if this font is exist or not."
+    (if (or (not fontname) (string= fontname ""))
+        nil
+      (if (not (x-list-fonts fontname)) nil t)))
+
+  (defun set-font (english chinese size-pair)
+    "Setup emacs English and Chinese font on x window-system."
+    (if (font-exist-p english)
+        (set-frame-font (format "%s:pixelsize=%d" english (car size-pair)) t))
+    (if (font-exist-p chinese)
+        (dolist (charset '(han cjk-misc) ;; '(kana han symbol cjk-misc bopomofo)
+                 )
+          (set-fontset-font (frame-parameter nil 'font) charset
+                            (font-spec :family chinese :size (cdr size-pair))))))
+
+  (defun emacs-step-font-size (step)
+    "Increase/Decrease emacs's font size."
+    (let ((scale-steps emacs-font-size-pair-list))
+      (if (< step 0) (setq scale-steps (reverse scale-steps)))
+      (setq emacs-font-size-pair
+            (or (cadr (member emacs-font-size-pair scale-steps))
+                emacs-font-size-pair))
+      (when emacs-font-size-pair
+        (message "emacs font size set to %.1f" (car emacs-font-size-pair))
+        (set-font emacs-english-font emacs-cjk-font emacs-font-size-pair))))
+
+  (defun increase-emacs-font-size ()
+    "Decrease emacs's font-size acording emacs-font-size-pair-list."
+    (interactive) (emacs-step-font-size 1))
+
+  (defun decrease-emacs-font-size ()
+    "Increase emacs's font-size acording emacs-font-size-pair-list."
+    (interactive) (emacs-step-font-size -1))
 #+END_SRC
 
+
 ** Color Theme
 
 Loading theme should be after all required loaded, refere [[https://github.com/jwiegley/use-package][:defer]] in =use-package=
 
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (setq vc-follow-symlinks t)
+  (use-package molokai-theme
+    :ensure t)
 
   (use-package color-theme
     :ensure t
@@ -209,7 +266,9 @@ Loading theme should be after all required loaded, refere [[https://github.com/j
               :ensure t
               :no-require t
               :config
-              (load-theme 'sanityinc-tomorrow-bright t)))
+              ;; (load-theme 'sanityinc-tomorrow-bright t)
+              (load-theme 'molokai t)
+              ))
 
   ;(eval-after-load 'color-theme
   ;  (load-theme 'sanityinc-tomorrow-bright t))
@@ -302,6 +361,11 @@ improve color for org-mode
 
 #+END_SRC
 
+search text theme
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (set-face-attribute 'lazy-highlight nil :background "yellow" :foreground "black" :weight 'bold)
+#+END_SRC
+
 ** Rainbow-delimiter
 
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
@@ -314,14 +378,13 @@ improve color for org-mode
 #+END_SRC
 
 ** page-break-lines
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (use-package page-break-lines
     :ensure t
     :config
-    (turn-on-page-break-lines-mode))
-
+    (global-page-break-lines-mode)
+    ;; (turn-on-page-break-lines-mode)
+    )
 #+END_SRC
 
 ** rainbow-mode
@@ -337,16 +400,18 @@ Enable rainbow mode in emacs lisp mode
 
 #+END_SRC
 
-* Mode-line
+** cusor color
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (if (display-graphic-p)
+      (set-cursor-color 'red))
+#+END_SRC
 
+* Mode-line
 ** clean mode line
-
-clean mode line, Refer to [[https://www.masteringemacs.org/article/hiding-replacing-modeline-strings][Marstering Emacs]]
-
+clean mode line, Refer to [[https://www.masteringemacs.org/article/hiding-replacing-modeline-strings][Marstering Emacs]], some greek character see [[http://xahlee.info/math/math_unicode_greek.html][math_unicode_greek]]
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (defvar mode-line-cleaner-alist
     `((auto-complete-mode . " α")
-      (yas/minor-mode . " υ")
       (paredit-mode . " π")
       (eldoc-mode . "")
       (abbrev-mode . "")
@@ -365,12 +430,20 @@ clean mode line, Refer to [[https://www.masteringemacs.org/article/hiding-replac
       (org-indent-mode . "")
       ;; default is  Fly
       (flyspell-mode . "")
+      (irony-mode . "")
+      (page-break-lines-mode . "")
+      (yas-minor-mode . "y")
+      ;; default jj
+      (evil-escape-mode . "")
       ;; Major modes
       (lisp-interaction-mode . "λ")
       (hi-lock-mode . "")
       (python-mode . "Py")
       (emacs-lisp-mode . "EL")
-      (eshell-mode . "ε")
+      (eshell-mode . "𝞔")
+      (dired-mode . "𝞓")
+      (ibuffer-mode . "𝞑")
+      (org-mode . "𝞞")
       (nxhtml-mode . "nx"))
     "Alist for `clean-mode-line'.
 
@@ -396,9 +469,7 @@ clean mode line, Refer to [[https://www.masteringemacs.org/article/hiding-replac
 #+END_SRC
 
 ** Powerline mode
-
 Install powerline mode [[https://github.com/milkypostman/powerline][powerline]]
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package powerline
     :ensure t
@@ -451,7 +522,8 @@ Revised powerline-center-theme
                   '("%e"
                     (:eval
                      (let* ((active (powerline-selected-window-active))
-                            (mode-line-buffer-id (if active 'sd/mode-line-buffer-id 'mode-line-buffer-id-inactive))
+                            ;; (mode-line-buffer-id (if active 'sd/mode-line-buffer-id 'mode-line-buffer-id-inactive))
+                            (mode-line-buffer-id (if active 'sd/mode-line-buffer-id 'powerline-inactive1))
                             (mode-line (if active 'mode-line 'mode-line-inactive))
                             (my-face1 (if active 'sd/powerline-active1 'powerline-inactive1))
                             (my-face-buffer-modified (if (and (sd/buffer-is-eshel-or-scratch) (buffer-modified-p) (not buffer-read-only)) 
@@ -486,6 +558,7 @@ Revised powerline-center-theme
                                        ))
                             (center (list (powerline-raw " " face1)
                                           (funcall separator-left face1 face2)
+                                          (powerline-raw (when  (and (boundp 'evil-mode)  evil-mode) evil-mode-line-tag) face2)
                                           (when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
                                             (powerline-raw erc-modified-channels-object face2 'l))
                                           (powerline-major-mode face2 'l)
@@ -510,13 +583,17 @@ Fix the issue in mode line when showing triangle
 
 set height in mode line
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (set-variable 'powerline-height 14)
-  (set-variable 'powerline-text-scale-factor (/ (float 100) 140))
-  ;; (custom-set-variables
-  ;;  '(powerline-height 14)
-  ;;  '(powerline-text-scale-factor (/ (float 100) 140)))
-  ;; 100/140;0.8
-  (set-face-attribute 'mode-line nil :height 100)
+  (defconst sd/mode-line-font-heigh 100
+    "Defaulet the fontsize on mode line.")
+
+  (with-eval-after-load "powerline"
+    (when (display-graphic-p)
+      (set-face-attribute 'mode-line-inactive nil :height sd/mode-line-font-heigh)
+      (set-face-attribute 'mode-line nil :height sd/mode-line-font-heigh)
+      (let* ((base-font-size (face-attribute 'default :height)))
+        ;; 100/140;0.8
+        (set-variable 'powerline-height (/ base-font-size 10))
+        (set-variable 'powerline-text-scale-factor (/ (float sd/mode-line-font-heigh) base-font-size)))))
 #+END_SRC
 
 * IDO & SMEX
@@ -524,7 +601,7 @@ set height in mode line
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package ido
     :ensure t
-    :init (setq ido-enable-flex-matching t
+    :init (setq ido-enable-flex-matching nil
                 ido-ignore-extensions t
                 ido-use-virtual-buffers t
                 ido-everywhere t)
@@ -532,7 +609,23 @@ set height in mode line
     :config
     (ido-mode 1)
     (ido-everywhere 1)
-    (add-to-list 'completion-ignored-extensions ".pyc"))
+    (add-to-list 'completion-ignored-extensions ".pyc")
+
+
+    (define-key ido-buffer-completion-map (kbd "C-w") #'ido-delete-backward-word-updir)
+    (define-key ido-file-completion-map (kbd "C-w") #'ido-delete-backward-word-updir)
+    (define-key ido-file-dir-completion-map (kbd "C-w") #'ido-delete-backward-updir)
+    ;; (define-key ido-file-dir-completion-map (kbd "C-i") #'ido-copy-current-word)
+    
+    ;; (dolist (map (list
+    ;;               ido-buffer-completion-map
+    ;;               ido-file-completion-map
+    ;;               ido-file-dir-completion-map
+    ;;               ido-common-completion-map))
+    ;;   (define-key map (kbd "C-w") #'ido-delete-backward-word-updir)
+    ;;   ;; (define-key map (kbd "C-i") #'ido-copy-current-file-name)
+    ;;   )
+    )
 
   (icomplete-mode t)
 #+END_SRC
@@ -541,9 +634,9 @@ set height in mode line
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package flx-ido
     :ensure t
-    :init (setq ido-enable-flex-matching t
+    :init (setq ido-enable-flex-matching nil
                 ido-use-faces nil)
-    :config (flx-ido-mode 1))
+    :config (flx-ido-mode nil))
 #+END_SRC
 
 ** IDO-vertically
@@ -586,8 +679,8 @@ Use [[https://github.com/DarwinAwardWinner/ido-ubiquitous][ido-ubiquitous]] for
   (use-package ido-exit-target
     :ensure t
     :init
-    (mapcar (lambda (map)
-              (define-key map (kbd "C-j") #'ido-exit-target-split-window-right)
+    (mapcar #'(lambda (map)
+              (define-key map (kbd "C-j") #'ido-exit-target-other-window)
               (define-key map (kbd "C-k") #'ido-exit-target-split-window-below))
             (list ido-buffer-completion-map
                   ;; ido-common-completion-map
@@ -607,28 +700,6 @@ Use [[https://github.com/DarwinAwardWinner/ido-ubiquitous][ido-ubiquitous]] for
     ;; (set-face-attribute 'ivy-current-match nil :background "Orange" :foreground "black")
     (define-key read-expression-map (kbd "C-r") 'counsel-expression-history)
     (global-set-key (kbd "C-c C-r") 'ivy-resume))
-
-
-
-  ;; (global-set-key "\C-s" 'swiper)
-  ;; (global-set-key (kbd "<f6>") 'ivy-resume)
-  ;; ;; (global-set-key (kbd "C-x C-f") 'counsel-find-file)
-  ;; (global-set-key (kbd "<f1> l") 'counsel-load-library)
-  ;; (global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
-  ;; (global-set-key (kbd "<f2> u") 'counsel-unicode-char)
-  ;; (global-set-key (kbd "C-c g") 'counsel-git)
-  ;; (global-set-key (kbd "C-c j") 'counsel-git-grep)
-  ;; (global-set-key (kbd "C-c k") 'counsel-ag)
-  ;; (global-set-key (kbd "C-x l") 'counsel-locate)
-  ;; (global-set-key (kbd "C-S-o") 'counsel-rhythmbox)
-
-  ;; (set-face-attribute
-  ;;  'ivy-current-match nil
-  ;;  :background "Orange"
-  ;;  :foreground "black")
-
-  ;; ivy-resume
-  ;; (define-key swiper-map (kbd "M-%") 'swiper-aa-replace)
 #+END_SRC
 
 ** helm
@@ -639,11 +710,8 @@ let helm windows split inside current window
 #+END_SRC
 
 * Org-mode Settings
-
 ** Org-mode Basic setting
-
 Always indents header, and hide header leading starts so that no need type =#+STATUP: indent= 
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package org
     :ensure t
@@ -654,86 +722,136 @@ Always indents header, and hide header leading starts so that no need type =#+ST
     (setq org-src-tab-acts-natively t)
     (setq org-confirm-babel-evaluate nil)
     (setq org-use-speed-commands t)
-    (setq org-completion-use-ido t))
-
-  (org-babel-do-load-languages
-   'org-babel-load-languages
-   '((python . t)
-     (C . t)
-     (perl . t)
-     (calc . t)
-     (latex . t)
-     (java . t)
-     (ruby . t)
-     (lisp . t)
-     (scheme . t)
-     (sh . t)
-     (sqlite . t)
-     (js . t)
-     (gnuplot . t)
-     (ditaa . t)))
+    (setq org-completion-use-ido t)
+    (setq org-startup-with-inline-images t)
+    ;; latex preview
+    ;; (setq org-startup-with-latex-preview t)
+    ;; (setq org-format-latex-options (plist-put org-format-latex-options :scale 1.2))
+    (require 'org-habit)
+    (add-to-list 'org-modules 'org-habit)
+    (setq org-habit-graph-column 50)
+    (setq org-hide-emphasis-markers t)
+    (setq org-html-validation-link nil)
+    ;; open link when return clicked
+    (setq org-return-follows-link t)
+    ;; open the ppt file by external open instead of emacs
+    (add-to-list 'org-file-apps '("\\.pptx" . "open %s"))
+    (add-to-list 'org-file-apps '("\\.doc" . "open %s"))
+    (setq org-image-actual-width nil))
+#+END_SRC
+
+
+** Org babel
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (el-get-bundle hasu/emacs-ob-racket
+    :features ob-racket)
+
+  ;; Lua support
+  ;(use-package ob-lua
+  ;  :ensure t)
 
   ;; use current window for org source buffer editting
-  (setq org-src-window-setup 'current-window )
 
+  (setq org-src-window-setup 'current-window )
   (define-key org-mode-map (kbd "C-'") nil)
   ;; C-M-i is mapped to imenu globally
   (define-key org-mode-map (kbd "C-M-i") nil)
-
   ;; set the ditta.jar path
+
   (setq org-ditaa-jar-path "/usr/local/Cellar/ditaa/0.9/libexec/ditaa0_9.jar")
   (unless 
       (file-exists-p org-ditaa-jar-path)
-    (error "seudut: ditaa.jar not found at %s " org-ditaa-jar-path))
+    (message "seudut: ditaa.jar not found at %s " org-ditaa-jar-path))
+
+  (org-babel-do-load-languages 'org-babel-load-languages
+                               '((python . t)
+                                 (C . t)
+                                 (perl . t)
+                                 (calc . t)
+                                 (latex . t)
+                                 (java . t)
+                                 (ruby . t)
+  ;                               (lua . t)
+                                 (lisp . t)
+                                 (scheme . t)
+                                 (racket . t)
+                                 (sh . t)
+                                 (sqlite . t)
+                                 (js . t)
+                                 (gnuplot . t)
+                                 (ditaa . t)
+                                 (plantuml . t)))
+
+
+  ;; toggle image preview 
+  (add-hook 'org-babel-after-execute-hook 'sd/display-inline-images 'append)
+
+  (defun sd/display-inline-images ()
+    (condition-case nil
+        (org-display-inline-images)
+      (error nil)))
+
+  ;; ditaa artist mode
+  (with-eval-after-load "artist"
+    (define-key artist-mode-map [down-mouse-3] 'artist-mouse-choose-operation))
+#+END_SRC
+*** plantUML
+[[http://eschulte.github.io/babel-dev/DONE-integrate-plantuml-support.html][DONE-integrate-plantuml-support]]
+#+BEGIN_SRC sh
+  ## support plantuml
+  brew install plantuml
 #+END_SRC
 
-** Org-bullets
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package plantuml-mode
+    :ensure t)
 
-use [[https://github.com/sabof/org-bullets][org-bullets]] package to show utf-8 charactes
+  (setq org-plantuml-jar-path
+        (expand-file-name "/usr/local/Cellar/plantuml/8041/plantuml.8041.jar"))
+
+  (set-variable 'plantuml-jar-path
+                (expand-file-name "/usr/local/Cellar/plantuml/8041/plantuml.8041.jar"))
+#+END_SRC
 
+** Org-bullets
+use [[https://github.com/sabof/org-bullets][org-bullets]] package to show utf-8 charactes
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package org-bullets
     :ensure t
     :init
-    (add-hook 'org-mode-hook
-              (lambda ()
-                (org-bullets-mode t))))
+    (add-hook 'org-mode-hook (apply-partially #'org-bullets-mode t)))
 
   (setq org-bullets-bullet-list '("⦿" "✪" "◉" "○" "►" "◆"))
 
   ;; increase font size when enter org-src-mode
-  (add-hook 'org-src-mode-hook (lambda () (text-scale-increase 2)))
+  ;; (add-hook 'org-src-mode-hook (lambda () (text-scale-increase 2)))
+
+  ;; define a face for org-bullets
+  (defface org-bullet-face
+      '((t (:foreground "green yellow")))
+  "Face used for the org-bullets.")
+  (setq org-bullets-face-name (quote  org-bullet-face))
+  (set-face-attribute 'org-bullet-face t :foreground "burlywood" :weight 'normal :height 1.6)
 #+END_SRC
 
 ** Worf Mode
-
 [[https://github.com/abo-abo/worf][worf]] mode is an extension of vi-like binding for org-mode. 
 In =worf-mode=, it is mapping =[=, =]= as =worf-backward= and =worf-forward= in global, wich
 cause we cannot input =[= and =]=, so here I unset this mappings. And redifined this two to
 =M-[= and =M-]=. see this [[https://github.com/abo-abo/worf/issues/19#issuecomment-223756599][issue]]
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (use-package worf
     :ensure t
     :commands worf-mode
-    :init (add-hook 'org-mode-hook 'worf-mode)
-    ;; :config
-    ;; (define-key worf-mode-map "[" nil)
-    ;; (define-key worf-mode-map "]" nil)
-    ;; (define-key worf-mode-map (kbd "M-[") 'worf-backward)
-    ;; (define-key worf-mode-map (kbd "M-]") 'worf-forward)
-    )
-
+    :init
+    (require 'ivy)
+    (add-hook 'org-mode-hook 'worf-mode))
 #+END_SRC
 
 ** Get Things Done
-
 Refer to [[http://doc.norang.ca/org-mode.html][Organize Your Life in Plain Text]]
 *** basic setup
-
 standard key binding
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (global-set-key "\C-cl" 'org-store-link)
   (global-set-key "\C-ca" 'org-agenda)
@@ -741,9 +859,7 @@ standard key binding
 #+END_SRC
 
 *** Plain List 
-
 Replace the list bullet =-=, =+=,  with =•=, a litter change based [[https://github.com/howardabrams/dot-files/blob/master/emacs-org.org][here]]
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   ;; (use-package org-mode
   ;;   :init
@@ -753,12 +869,9 @@ Replace the list bullet =-=, =+=,  with =•=, a litter change based [[https://g
 #+END_SRC
  
 *** Todo Keywords
-
 refer to [[http://coldnew.github.io/coldnew-emacs/#orgheadline94][fancy todo states]], 
-
 To track TODO state changes, the =!= is to insert a timetamp, =@= is to insert a note with
 timestamp for the state change.
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
     ;; (setq org-todo-keywords
     ;;        '((sequence "☛ TODO(t)" "|" "✔ DONE(d)")
@@ -887,13 +1000,12 @@ All captured file which need next actions are stored in =refile.org=,
 *** Agenda Setup
 Setting agenda files and the agenda view
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (setq org-agenda-files (quote ("~/org/gtd.org"
-                                 "~/org/work.org")))
+  (setq org-agenda-files (quote ("~/org/gtd.org")))
 
   ;; only show today's tasks in agenda view
-  (setq org-agenda-span 'day)
+  ;; (setq org-agenda-span 'day)
   ;; Use current windows for agenda view
-  (setq org-agenda-window-setup 'current-window)
+  ;; (setq org-agenda-window-setup 'current-window)
 
   ;; show all feature entries for repeating tasks,
   ;; this is already setting by default
@@ -903,9 +1015,23 @@ Setting agenda files and the agenda view
   (setq org-agenda-show-all-dates t)
 #+END_SRC
 
+** Org mobile
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (with-eval-after-load "org"
+    (require 'org-mobile)
+    ;; Set to the location of your Org files on your local system
+    ;; (setq org-directory "~/org")
+    ;; Set to the name of the file where new notes will be stored
+    (setq org-mobile-inbox-for-pull "~/org/flagged.org")
+    ;; Set to <your Dropbox root directory>/MobileOrg.
+    (setq org-mobile-directory "~/Dropbox/Apps/MobileOrg"))
+#+END_SRC
+
 ** Export PDF
 Install MacTex-basic [[http://www.tug.org/mactex/morepackages.html][MacTex-basic]]  and some tex packages
 #+BEGIN_SRC sh 
+  wget http://tug.org/cgi-bin/mactex-download/BasicTeX.pkg
+
   sudo tlmgr update --self
 
   sudo tlmgr install titlesec framed threeparttable wrapfig multirow enumitem bbding titling tabu mdframed tcolorbox textpos import varwidth needspace tocloft ntheorem environ trimspaces collection-fontsrecommended capt-of
@@ -986,21 +1112,133 @@ Install MacTex-basic [[http://www.tug.org/mactex/morepackages.html][MacTex-basic
 
 #+END_SRC
 
-** others
+** Export Html
+Color higlight the source code block in exported html, [[http://stackoverflow.com/questions/24082430/org-mode-no-syntax-highlighting-in-exported-html-page][org-mode-no-syntax-highlighting-in-exported-html-page]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package htmlize
+    :ensure t)
+#+END_SRC
 
+** Org structure template
 extend org-mode's easy templates, refer to [[http://coldnew.github.io/coldnew-emacs/#orgheadline94][Extend org-modes' esay templates]]
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  ;; ‘s’     ‘#+BEGIN_SRC ... #+END_SRC’
+  ;; ‘e’     ‘#+BEGIN_EXAMPLE ... #+END_EXAMPLE’
+  ;; ‘q’     ‘#+BEGIN_QUOTE ... #+END_QUOTE’
+  ;; ‘v’     ‘#+BEGIN_VERSE ... #+END_VERSE’
+  ;; ‘c’     ‘#+BEGIN_CENTER ... #+END_CENTER’
+  ;; ‘l’     ‘#+BEGIN_LaTeX ... #+END_LaTeX’
+  ;; ‘L’     ‘#+LaTeX:’
+  ;; ‘h’     ‘#+BEGIN_HTML ... #+END_HTML’
+  ;; ‘H’     ‘#+HTML:’
+  ;; ‘a’     ‘#+BEGIN_ASCII ... #+END_ASCII’
+  ;; ‘A’     ‘#+ASCII:’
+  ;; ‘i’     ‘#+INDEX:’ line
+  ;; ‘I’     ‘#+INCLUDE:’ line
+
 
   (add-to-list 'org-structure-template-alist
                '("E" "#+BEGIN_SRC emacs-lisp :tangle yes :results silent\n?\n#+END_SRC"))
   (add-to-list 'org-structure-template-alist
-               '("S" "#+BEGIN_SRC sh\n?\n#+END_SRC"))
+               '("R" "#+BEGIN_SRC racket :tangle no :results output replace\n?\n#+END_SRC"))
+  (add-to-list 'org-structure-template-alist
+               '("S" "#+BEGIN_SRC sh :results output replace\n?\n#+END_SRC"))
   (add-to-list 'org-structure-template-alist
                '("p" "#+BEGIN_SRC plantuml :file uml.png \n?\n#+END_SRC"))
+  (add-to-list 'org-structure-template-alist
+               '("P" "#+BEGIN_SRC perl \n?\n#+END_SRC"))
+  (add-to-list 'org-structure-template-alist
+               '("f" "#+BEGIN_SRC fundamental :tangle ?\n\n#+END_SRC"))
+  (add-to-list 'org-structure-template-alist
+               '("C" "#+BEGIN_SRC c :tangle ?\n\n#+END_SRC"))
+  (add-to-list 'org-structure-template-alist
+               '("m" "\\begin{equation}\n?\n\\end{equation}"))
+  (add-to-list 'org-structure-template-alist
+               '("b" "#+STARTUP: showall
+  ,#+STARTUP: inlineimages
+  ,#+OPTIONS: toc:nil\n"))
+  (add-to-list 'org-structure-template-alist
+               '("d" "#+BEGIN_SRC ditaa :file ?  :cmdline -r -s 0.8 :cache yes \n\n#+END_SRC"))
+  (add-to-list 'org-structure-template-alist
+               '("u" "#+BEGIN_SRC plantuml :file ? \n\n#+END_SRC"))
+
+#+END_SRC
+
+** Org theme
+*** variable-pitch-mode and fixed-pitch-mode
+[[https://yoo2080.wordpress.com/2013/05/30/monospace-font-in-tables-and-source-code-blocks-in-org-mode-proportional-font-in-other-parts/][monospace font in tables and source code blocks in org-mode, proportional font in other parts]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (unless (find-font (font-spec :name "Ubuntu Mono"))
+    (warn "Font not found Ubuntu Mono"))
+  (unless (find-font (font-spec :name "Source Code Pro"))
+    (warn "Font not found Source Code Pro"))
+  (unless (find-font (font-spec :name "Source Sans Pro"))
+    (warn "Font not found Source Sans Pro"))
+
+  (set-face-attribute 'variable-pitch nil :font "Source Sans Pro" :height 160)
+  (set-face-attribute 'fixed-pitch nil :font "Source Code Pro" :height (face-attribute 'default :height))
+
+  ;; (add-hook 'text-mode-hook 'variable-pitch-mode)
+
+  ;; Install Ubuntu Mono fonts and apply it in org-table to align Chinese fonts
+  (with-eval-after-load "org"
+    (mapc (lambda (face)
+            (set-face-attribute face nil :inherit 'fixed-pitch))
+          (list 'org-code 'org-block 'org-block-background 'org-block-begin-line 'org-block-end-line))
+    (set-face-attribute 'org-table nil :family "Ubuntu Mono" :height 140)
+    (set-face-attribute 'org-formula nil :family "Ubuntu Mono" :height 140)
+    ;; org-special-keyword inherited from font-lock-keywork originally; as org is changed to variable-pitch, it cause
+    ;; the font in special-keywords are not monospace
+    (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-keyword-face fixed-pitch))
+    ;; same as above 
+    (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch))
+    
+    ;; fix indent broken by variable-pitch-mode
+    ;; http://emacs.stackexchange.com/questions/26864/variable-pitch-face-breaking-indentation-in-org-mode
+    (require 'org-indent)
+    (set-face-attribute 'org-indent nil :inherit '(org-hide fixed-pitch)))
+#+END_SRC
+
+Also correct the face of  =org-meta-line= in =org-table= 
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (with-eval-after-load "org"
+    (set-face-attribute 'org-meta-line nil :font "Source Code Pro" :height 120 :slant 'italic :inherit 'font-lock-comment-face))
+#+END_SRC
+
+*** Org-head face
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  ;; (with-eval-after-load "org"
+  ;;   (let* ((base-height (face-attribute 'variable-pitch :height))
+  ;;          (base-font-color (face-foreground 'default nil  'default)))
+  ;;     (set-face-attribute 'org-document-title nil :weight 'bold :height (+ 60 base-height))
+  ;;     (set-face-attribute 'org-level-1 nil :weight 'bold :height (+ 40 base-height))
+  ;;     (set-face-attribute 'org-level-2 nil :weight 'bold :height (+ 30 base-height))
+  ;;     (set-face-attribute 'org-level-3 nil :weight 'bold :height (+ 20 base-height))
+  ;;     (set-face-attribute 'org-level-4 nil :weight 'bold :height (+ 10 base-height))
+  ;;     (set-face-attribute 'org-level-5 nil :weight 'bold)
+  ;;     (set-face-attribute 'org-level-6 nil :weight 'bold)
+  ;;     (set-face-attribute 'org-level-7 nil :weight 'bold)
+  ;;     (set-face-attribute 'org-level-8 nil :weight 'bold)))
+#+END_SRC
 
+** Org Blog
+Fetch dependencies file, which is not in this repository.
+#+BEGIN_SRC perl :results silent :tangle yes
+  print `curl https://raw.githubusercontent.com/seudut/blog/master/my-publish.el -o ./elisp/my-publish.el`;
 #+END_SRC
 
+Load 
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (add-to-list 'load-path "~/.emacs.d/elisp")
+
+  (when (file-exists-p "~/.emacs.d/elisp/my-publish.el")
+    (require 'my-publish)
+    (blog-setup-project-alist "~/Private/blog/"))
+#+END_SRC
+
+
+Refer to [[http://orgmode.org/worg/org-tutorials/org-publish-html-tutorial.html][org-publish-html-tutorial]], and [[https://ogbe.net/blog/blogging_with_org.html][blogging_with_org]]
+
 * Magit
 [[https://github.com/magit/magit][Magit]] is a very cool git interface on Emacs.
 and Defined keys, using vi keybindings, Refer abo-abo's setting [[https://github.com/abo-abo/oremacs/blob/c5cafdcebc88afe9e73cc8bd40c49b70675509c7/modes/ora-nextmagit.el][here]]
@@ -1011,7 +1249,7 @@ and Defined keys, using vi keybindings, Refer abo-abo's setting [[https://github
     ;; don't ask me to confirm the unsaved change 
     (setq magit-save-repository-buffers nil)
     ;; default is 50
-    (setq git-commit-summary-max-length 80)
+    (setq git-commit-summary-max-length 100)
     :commands magit-status magit-blame
     :config
     (dolist (map (list magit-status-mode-map
@@ -1025,7 +1263,9 @@ and Defined keys, using vi keybindings, Refer abo-abo's setting [[https://github
       (define-key map "n" nil)
       (define-key map "p" nil)
       (define-key map "v" 'recenter-top-bottom)
-      (define-key map "i" 'magit-section-toggle)))
+      (define-key map "i" 'magit-section-toggle))
+    (define-key magit-mode-map "q" (lambda () (interactive)
+                                     (magit-mode-bury-buffer t))))
 #+END_SRC
 
 * Eshell
@@ -1044,15 +1284,13 @@ set default eshell history folder
 
 ** Eshell erase buffer
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (defun sd/eshell-clear-buffer ()
-    "Clear eshell buffer"
-    (interactive)
-    (let ((inhibit-read-only t))
-      (erase-buffer)
-      (eshell-send-input)))
+  (require 'utilities)
 
-   (add-hook 'eshell-mode-hook (lambda ()
-                                (local-set-key (kbd "C-l") 'sd/eshell-clear-buffer)))
+  ;; (add-hook 'eshell-mode-hook (lambda ()
+  ;;                               (local-set-key (kbd "C-l") 'sd/eshell-clear-buffer)))
+  (add-hook 'eshell-mode-hook (apply-partially #'local-set-key (kbd "C-l") 'sd/eshell-clear-buffer))
+  ;; (add-hook 'eshell-mode-map (lambda () (interactive)
+  ;;                              (define-key eshell-mode-map (kbd "<tab>") 'completion-at-point)))
 #+END_SRC
 
 ** Toggle Eshell
@@ -1069,7 +1307,7 @@ Toggle an eshell in split window below, refer [[http://www.howardism.org/Technic
                     nil nil)
       ret))
 
-  (defun sd/toggle-eshell-here ()
+  (defun sd/toggle-project-eshell ()
     "Toggle a eshell buffer vertically"
     (interactive)
     (if (sd/window-has-eshell)
@@ -1080,33 +1318,26 @@ Toggle an eshell in split window below, refer [[http://www.howardism.org/Technic
                 (delete-window)))
           (select-window (sd/window-has-eshell)))
       (progn
-        (let ((dir default-directory))
-        
-          (split-window-vertically (- (/ (window-total-height) 3)))
-          (other-window 1)
-          (unless (and (boundp 'eshell-buffer-name) (get-buffer eshell-buffer-name))
-            (eshell))
-          (switch-to-buffer eshell-buffer-name)
-          (goto-char (point-max))
-          (eshell-kill-input)
-          (insert (format "cd %s" dir))
-          (eshell-send-input)))))
-
-  ;; (global-unset-key (kbd "M-`"))
-  (global-set-key (kbd "s-e") 'sd/toggle-eshell-here)
+        (split-window-vertically (- (/ (window-total-height) 3)))
+        (other-window 1)
+        (if (projectile-project-p)
+            (projectile-run-eshell)
+          (eshell)))))
+
+  (global-set-key (kbd "s-e") 'sd/toggle-project-eshell)
 #+END_SRC
 
 ** exec-path-from-shell
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package exec-path-from-shell
     :ensure t
+    :init
+    (setq exec-path-from-shell-check-startup-files nil)
     :config
     (exec-path-from-shell-initialize))
 #+END_SRC
 
-** TODO smart display
 * Misc Settings
-
 ** [[https://github.com/abo-abo/hydra][Hydra]]
 *** hydra install
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
@@ -1188,33 +1419,26 @@ Refer [[https://github.com/abo-abo/hydra/blob/master/hydra-examples.el][hydra-ex
 #+END_SRC
 
 ** Line Number
-
 Enable linum mode on programming modes
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (add-hook 'prog-mode-hook 'linum-mode)
-  ;; (add-hook 'prog-mode-hook (lambda ()
-  ;;                             (setq-default indicate-empty-lines t)))
 #+END_SRC
 
 Fix the font size of line number
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (defun fix-linum-size ()
-       (interactive)
-       (set-face-attribute 'linum nil :height 110))
+    (interactive)
+    (set-face-attribute 'linum nil :height 110))
 
   (add-hook 'linum-mode-hook 'fix-linum-size)
-
 #+END_SRC
 
 I like [[https://github.com/coldnew/linum-relative][linum-relative]], just like the =set relativenumber= on =vim=
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (use-package linum-relative
     :ensure t
+    :init
+    (setq linum-relative-current-symbol "")
     :config
     (defun linum-new-mode ()
       "If line numbers aren't displayed, then display them.
@@ -1229,83 +1453,73 @@ I like [[https://github.com/coldnew/linum-relative][linum-relative]], just like
 
   ;; auto enable linum-new-mode in programming modes
   (add-hook 'prog-mode-hook 'linum-relative-mode)
-
 #+END_SRC
 
 ** Save File Position
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (require 'saveplace)
+  (setq save-place-file "~/.emacs.d/temp/saveplace")
   (setq-default save-place t)
   (setq save-place-forget-unreadable-files t)
   (setq save-place-skip-check-regexp "\\`/\\(?:cdrom\\|floppy\\|mnt\\|/[0-9]\\|\\(?:[^@/:]*@\\)?[^@/:]*[^@/:.]:\\)")
-
 #+END_SRC
 
 ** Multi-term
-
+define =multi-term= mapping to disable some mapping which is used globally.
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (use-package multi-term
     :ensure t)
 
+  (defun sd/term-mode-mapping ()
+    (mapcar #'(lambda (map)
+              (define-key map (kbd "C-o") nil)
+              (define-key map (kbd "C-g") nil))
+            (list term-mode-map
+                  term-raw-map)))
+
+  (with-eval-after-load 'multi-term
+    (sd/term-mode-mapping))
 #+END_SRC
 
 ** ace-link
-
 [[https://github.com/abo-abo/ace-link][ace-link]] is a package written by [[https://github.com/abo-abo][Oleh Krehel]]. It is convenient to jump to link in help mode, info-mode, etc
 Type =o= to go to the link
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (use-package ace-link
     :ensure t
     :init
     (ace-link-setup-default))
-
 #+END_SRC
 
 ** Smart Parens
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (use-package smartparens
     :ensure t
     :config
     (progn
       (require 'smartparens-config)
       (add-hook 'prog-mode-hook 'smartparens-mode)))
-
 #+END_SRC
 
 ** Ace-Windows
-
 [[https://github.com/abo-abo/ace-window][ace-window]] 
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (use-package ace-window
     :ensure t
     :defer t
-  ;  :init
-  ;  (global-set-key (kbd "M-o") 'ace-window)
+                                          ;  :init
+                                          ;  (global-set-key (kbd "M-o") 'ace-window)
     :config
     (setq aw-keys '(?a ?s ?d ?f ?j ?k ?l)))
-
 #+END_SRC
 
 ** Which key
-
 [[https://github.com/justbur/emacs-which-key][which-key]] show the key bindings 
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
-  (use-package which-key
-    :ensure t
-    :config
-    (which-key-mode))
-
+  ;; (use-package which-key
+  ;;   :ensure t
+  ;;   :config
+  ;;   (which-key-mode))
 #+END_SRC
 
 ** View only for some directory
@@ -1317,15 +1531,39 @@ When see function by =C-h f=, and visit the source code, I would like the buffer
              (show-trailing-whitespace . nil)
              (tab-width . 8)
              (eval . (whitespace-mode -1))
-             (eval . (when buffer-file-name
-                       (setq-local view-no-disable-on-exit t)
-                       (view-mode-enter)))))))
+             ;; (eval . (when buffer-file-name
+             ;;           (setq-local view-no-disable-on-exit t)
+             ;;           (view-mode-enter)))
+             ))))
 
   ;; (dir-locals-set-directory-class (expand-file-name "/usr/local/share/emacs") 'emacs)
   (dir-locals-set-directory-class "/usr/local/Cellar/emacs" 'emacs)
   ;; (dir-locals-set-directory-class "~/.emacs.d/elpa" 'emacs)
   (dir-locals-set-directory-class "~/dotfiles/emacs.d/elpa" 'emacs)
   (dir-locals-set-directory-class "~/dotfiles/emacs.d/el-get" 'emacs)
+
+  ;; temp-mode.el
+  ;; Temporary minor mode
+  ;; Main use is to enable it only in specific buffers to achieve the goal of
+  ;; buffer-specific keymaps
+
+  ;; (defvar sd/temp-mode-map (make-sparse-keymap)
+  ;;   "Keymap while temp-mode is active.")
+
+  ;; ;;;###autoload
+  ;; (define-minor-mode sd/temp-mode
+  ;;   "A temporary minor mode to be activated only specific to a buffer."
+  ;;   nil
+  ;;   :lighter " Temp"
+  ;;   sd/temp-mode-map)
+
+  ;; (defun sd/temp-hook ()
+  ;;   (if sd/temp-mode
+  ;;       (progn
+  ;;      (define-key sd/temp-mode-map (kbd "q") 'quit-window))))
+
+  ;; (add-hook 'lispy-mode-hook (lambda ()
+  ;;                           (sd/temp-hook)))
 #+END_SRC
 
 ** Info plus
@@ -1339,9 +1577,6 @@ When see function by =C-h f=, and visit the source code, I would like the buffer
     (require 'info+))
 #+END_SRC
 
-** TODO bookmark
-
-** TODO Calendar
 ** advice info
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (defun sd/info-mode ()
@@ -1349,11 +1584,7 @@ When see function by =C-h f=, and visit the source code, I would like the buffer
     (unless (equal major-mode 'Info-mode)
       (unless (> (length (window-list)) 1)
         (split-window-right))
-      (other-window 1)
-      ;; (info)
-      ))
-
-  ;; (global-set-key (kbd "C-h i") 'sd/info-mode)
+      (other-window 1)))
 
   ;; open Info buffer in other window instead of current window
   (defadvice info (before my-info (&optional file buf) activate)
@@ -1363,24 +1594,10 @@ When see function by =C-h f=, and visit the source code, I would like the buffer
     (sd/delete-current-window))
 #+END_SRC
 
-** TODO Man mode
-Color for Man-mode
-
-** TODO UTF8
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  ;; (set-language-environment "UTF-8")
-  ;; (set-default-coding-systems 'utf-8)
-#+END_SRC
-
 ** Demo It
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  ;; (el-get-bundle howardabrams/demo-it)
-
   (use-package org-tree-slide
     :ensure t)
-
-  ;; (use-package yasnippet
-  ;;   :ensure t)
 #+END_SRC
 
 ** Presentation
@@ -1396,29 +1613,153 @@ Color for Man-mode
 
 ** pdf-tools
 #+BEGIN_SRC sh
-  brew install poppler
+  #brew install poppler
 #+END_SRC
 
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (use-package pdf-tools
-    :ensure t
-    :init
-    ;; run to complete the installation
-    (pdf-tools-install)
-    :config
-    (add-to-list 'auto-mode-alist '("\.pdf$" . pdf-view-mode))
-    (add-hook 'pdf-outline-buffer-mode-hook #'sd/pdf-outline-map))
+  ;(use-package pdf-tools
+  ;  :ensure t
+  ;  :init
+  ;  ;; run to complete the installation
+  ;  (pdf-tools-install)
+  ;  :config
+  ;  (add-to-list 'auto-mode-alist '("\.pdf$" . pdf-view-mode))
+  ;  (add-hook 'pdf-outline-buffer-mode-hook #'sd/pdf-outline-map))
+
+  ;(defun sd/pdf-outline-map ()
+  ;  "My keybindings in pdf-outline-map"
+  ;  (interactive)
+  ;  (define-key pdf-outline-buffer-mode-map (kbd "C-o") nil)
+  ;  (define-key pdf-outline-buffer-mode-map (kbd "i") 'outline-toggle-children)
+  ;  (define-key pdf-outline-buffer-mode-map (kbd "j") 'next-line)
+   ; (define-key pdf-outline-buffer-mode-map (kbd "k") 'previous-line))
+#+END_SRC
+
+** help-mode
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (defun sd/help-mode-hook ()
+    "Mapping for help mode"
+    (define-key help-mode-map "j" 'next-line)
+    (define-key help-mode-map "k" 'previous-line)
+    (define-key help-mode-map "h" 'forward-char)
+    (define-key help-mode-map "l" 'forward-char)
+    (define-key help-mode-map "H" 'describe-mode)
+    (define-key help-mode-map "v" 'recenter-top-bottom)
+    (define-key help-mode-map "i" 'forward-button)
+    (define-key help-mode-map "I" 'backward-button)
+    (define-key help-mode-map "o" 'ace-link-help))
+
+  (add-hook 'help-mode-hook 'sd/help-mode-hook)
+#+END_SRC
+
+Wiki [[http://stackoverflow.com/questions/3480173/show-keys-in-emacs-keymap-value][show-keys-in-emacs-keymap-value]], Helpplus mode can show keymap as human-readable, use ~describe-keymap~ or =C-h M-k=
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (el-get-bundle help-macro+
+    :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/help-macro+.el"
+    :features help-macro+)
+  (el-get-bundle help+
+    :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/help+.el"
+    :features help+)
+  (el-get-bundle help-fns+
+    :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/help-fns+.el"
+    :features help-fns+)
+  (el-get-bundle help-mode+
+    :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/help-mode+.el"
+    :features help-mode+)
+#+END_SRC
+
+** goto-last-change
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package goto-last-change
+    :ensure t)
+#+END_SRC
+
+** Ag
+install =ag=, =the-silver-searcher= by homebrew on mac
+#+BEGIN_SRC sh
+brew install the-silver-searcher
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package ag
+    :ensure t)
+#+END_SRC
 
-  (defun sd/pdf-outline-map ()
-    "My keybindings in pdf-outline-map"
+** Local Variable hooks
+[[https://www.emacswiki.org/emacs/LocalVariables][LocalVariables]], use =hack-local-variables-hook=, run a hook to set local variable in mode hook
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  ;; make Emacs run a new "local variables hook" for each major mode
+  (add-hook 'hack-local-variables-hook 'run-local-vars-mode-hook)
+
+  (defun run-local-vars-mode-hook ()
+    "Run a hook for the major-mode after the local variables have been processed."
+    (run-hooks (intern (concat (symbol-name major-mode) "-local-vars-hook"))))
+
+  ;;   (add-hook 'c++-mode-local-vars-hook #'sd/c++-mode-local-vars)
+#+END_SRC
+
+** Table
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (add-hook 'text-mode-hook 'table-recognize)
+#+END_SRC
+
+** url-download
+To download file in =elisp=, best is =url-copy-file=, here refer [[http://stackoverflow.com/questions/4448055/download-a-file-with-emacs-lisp][download-a-file-with-emacs-lisp]] using =url-retrieve-synchronously= wrapping
+as a http download client tool
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (defun sd/download-file (&optional url download-dir download-name)
     (interactive)
-    (define-key pdf-outline-buffer-mode-map (kbd "C-o") nil)
-    (define-key pdf-outline-buffer-mode-map (kbd "i") 'outline-toggle-children)
-    (define-key pdf-outline-buffer-mode-map (kbd "j") 'next-line)
-    (define-key pdf-outline-buffer-mode-map (kbd "k") 'previous-line))
+    (let ((url (or url
+                   (read-string "Enter download URL: ")))
+          (download-dir (read-directory-name "Save to (~/Downloads): " "~/Downloads" "~/Downloads" 'confirm' nil)))
+      (let ((download-buffer (url-retrieve-synchronously url)))
+        (save-excursion
+          (set-buffer download-buffer)
+          ;; we may have to trim the http response
+          (goto-char (point-min))
+          (re-search-forward "^$" nil 'move)
+          (forward-char)
+          (delete-region (point-min) (point))
+          (write-file (concat (or download-dir
+                                  "~/Downloads/")
+                              (or download-name
+                                  (car (last (split-string url "/" t))))))))))
 #+END_SRC
 
 * Dired
+** Dired basic
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (setq dired-dwim-target t)
+
+  (use-package dired-details
+    :ensure t
+    :config
+    (setq-default dired-details-hidden-string "--- ")
+    (dired-details-install))
+#+END_SRC
+
+** Dired functions
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (defun sd/dired-next-line (count)
+    "Move to next line, and always focus on the file name."
+    (interactive "p")
+    (dired-next-line count)
+    (dired-move-to-filename))
+
+  (defun sd/dired-previous-line (count)
+    "Move to previous line, and always focus on the file name."
+    (interactive "p")
+    (dired-previous-line count)
+    (dired-move-to-filename))
+
+  (defun sd/dired-up-directory ()
+    "Go to up directory"
+    (interactive)
+    (let ((old (current-buffer)))
+      (dired-up-directory)
+      (kill-buffer old)))
+#+END_SRC
 ** Dired bindings
 =C-o= is defined as a global key for window operation, here unset it in dired mode
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
@@ -1448,7 +1789,7 @@ Color for Man-mode
     (define-key dired-mode-map (kbd "h") 'dired-summary)
     (define-key dired-mode-map (kbd "r") 'revert-buffer)
     (define-key dired-mode-map (kbd "l") 'dired-display-file)
-    (define-key dired-mode-map [C-backspace] 'sd/dired-high-level-dir)
+    (define-key dired-mode-map [C-backspace] 'dired-up-directory)
     (define-key dired-mode-map (kbd "?") 'describe-mode)
     (define-key dired-mode-map (kbd "z") #'sd/dired-get-size)
     (define-key dired-mode-map (kbd "C-d") 'dired-kill-subdir)
@@ -1457,7 +1798,8 @@ Color for Man-mode
     (define-key dired-mode-map (kbd "TAB") 'diredp-next-subdir)
     (define-key dired-mode-map (kbd "K") 'diredp-prev-subdir)
     (define-key dired-mode-map (kbd "O") 'dired-display-file)
-    (define-key dired-mode-map (kbd "I") 'other-window)) 
+    (define-key dired-mode-map (kbd "I") 'other-window)
+    (define-key dired-mode-map (kbd "o") 'other-window)) 
 
   (use-package dired
     :config
@@ -1478,7 +1820,7 @@ Color for Man-mode
     (interactive)
     (dired-why)
     (message
-     "Δ: d-delete, u-ndelete, x-punge, f-ind, o-ther window, R-ename, C-opy, c-create, +new dir, r-evert, /-filter, h-summary, ?-help"))
+     "Δ: d-delete, u-ndelete, x-punge, f-ind, o-ther window, R-ename, C-opy, c-create, +new dir, r-evert, /-filter, v-iew, l-ist, z-Size, h-summary, ?-help"))
 
   (defun sd/dired-high-level-dir ()
     "Go to higher level directory"
@@ -1487,11 +1829,24 @@ Color for Man-mode
 #+END_SRC
 
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (defun sd/dired-new-file ()
+  (defun sd/dired-new-file-and-open ()
     "Create a new file in dired mode"
     (interactive)
     (call-interactively 'find-file))
 
+  (defun sd/dired-new-file (file)
+    "Create a new file called FILE.
+  If FILE already exists, signal an error."
+    (interactive
+     (list (read-file-name "Create file: " (dired-current-directory))))
+    (let* ((expanded (expand-file-name file)))
+      (if (file-exists-p expanded)
+          (error "Cannot create file %s: file exists" expanded))
+      (write-region "" nil expanded t)
+      (when expanded
+        (dired-add-file expanded)
+        (dired-move-to-filename))))
+
   ;; copied from abo-abo's config
   (defun sd/dired-get-size ()
     (interactive)
@@ -1512,7 +1867,8 @@ from [[https://emacs.stackexchange.com/questions/13713/how-to-disable-ido-in-dir
   (defun mk-anti-ido-advice (func &rest args)
     "Temporarily disable IDO and call function FUNC with arguments ARGS."
     (interactive)
-    (let ((read-file-name-function #'read-file-name-default))
+    (let ((read-file-name-function #'read-file-name-default)
+          (completing-read-function #'completing-read-default))
       (if (called-interactively-p 'any)
           (call-interactively func)
         (apply func args))))
@@ -1520,13 +1876,29 @@ from [[https://emacs.stackexchange.com/questions/13713/how-to-disable-ido-in-dir
   (defun mk-disable-ido (command)
     "Disable IDO when command COMMAND is called."
     (advice-add command :around #'mk-anti-ido-advice))
+
+  (defun mk-anti-ido-no-completing-advice (func &rest args)
+    "Temporarily disable IDO and call function FUNC with arguments ARGS."
+    (interactive)
+    (let ((read-file-name-function #'read-file-name-default)
+          ;; (completing-read-function #'completing-read-default)
+          )
+      (if (called-interactively-p 'any)
+          (call-interactively func)
+        (apply func args))))
+
+  (defun mk-disable-ido-no-completing (command)
+    "Disable IDO when command COMMAND is called."
+    (advice-add command :around #'mk-anti-ido-no-completing-advice))
 #+END_SRC
 
 Disalble =ido= when new a directory or file in =dired= mode
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   ;; call the function which you want to disable ido
   (mk-disable-ido 'dired-create-directory)
+  (mk-disable-ido 'sd/dired-new-file-and-open)
   (mk-disable-ido 'sd/dired-new-file)
+  (mk-disable-ido-no-completing 'dired-goto-file)
 #+END_SRC
 
 ** Dired open with
@@ -1541,11 +1913,39 @@ here on Mac, just use "open" commands to pen =.pdf=,  =.html= and image files
           ("\\.\\(?:xcf\\)\\'" "gimp")
           ("\\.csv\\'" "libreoffice")
           ("\\.tex\\'" "pdflatex" "latex")
-          ("\\.\\(?:mp4\\|mkv\\|avi\\|flv\\|ogv\\)\\(?:\\.part\\)?\\'" "mplayer")
+          ("\\.\\(?:mp4\\|mkv\\|avi\\|rmvb\\|flv\\|ogv\\)\\(?:\\.part\\)?\\'" "mplayer")
           ("\\.\\(?:mp3\\|flac\\)\\'" "rhythmbox")
           ("\\.html?\\'" "open")
           ("\\.dmg\\'" "open")
           ("\\.cue?\\'" "audacious")))
+
+
+  (defun sd/dired-start-process (cmd &optional file-list)
+    (interactive
+     (let ((files (dired-get-marked-files
+                   t current-prefix-arg)))
+       (list
+        (unless (eq system-type 'windows-nt)
+          (dired-read-shell-command "& on %s: "
+                                    current-prefix-arg files))
+        files)))
+    
+    (if (eq system-type 'windows-nt)
+        (dolist (file file-list)
+          (w32-shell-execute "open" (expand-file-name file)))
+      (let (list-switch)
+        (start-process
+         cmd nil shell-file-name
+         shell-command-switch
+         (format
+          "nohup 1>/dev/null 2>/dev/null %s \"%s\""
+          cmd
+          ;; (if (and (> (length file-list) 1)
+          ;;          (setq list-switch
+          ;;                (cadr (assoc cmd ora-dired-filelist-cmd))))
+          ;;     (format "%s %s" cmd list-switch)
+          ;;   cmd)
+          (mapconcat #'expand-file-name file-list "\" \""))))))
 #+END_SRC
 
 ** dired-hacks
@@ -1585,45 +1985,203 @@ here on Mac, just use "open" commands to pen =.pdf=,  =.html= and image files
 #+END_SRC
 
 * Completion
-company mode and company-statistics
+** company mode and company-statistics
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package company
     :ensure t
     :diminish company-mode
     :init (setq company-idle-delay 0.1)
+    (setq company-selection-wrap-around t)
     :config
-    (global-company-mode))
+    (define-key company-active-map (kbd "M-n") nil)
+    (define-key company-active-map (kbd "M-p") nil)
+    (define-key company-active-map (kbd "SPC") #'sd/company-stop-input-space)
+    (define-key company-active-map (kbd "C-n") #'company-select-next)
+    (define-key company-active-map (kbd "C-p") #'company-select-previous)
+    ;; should map both (kbd "TAB") and [tab],https://github.com/company-mode/company-mode/issues/75
+    (define-key company-active-map (kbd "TAB") #'company-complete-selection)
+    (define-key company-active-map [tab] #'company-complete-selection)
+    (define-key company-active-map (kbd "C-w") nil)
+    (define-key company-active-map (kbd "C-h") nil)
+    (global-company-mode)
+    ;; magig-commit is text-modeh
+    (setq company-global-modes '(not org-mode magit-status-mode text-mode eshell-mode gfm-mode markdown-mode)))
 
   (use-package company-statistics
     :ensure t
     :config
     (company-statistics-mode))
+
+  (defun sd/company-stop-input-space ()
+    "Stop completing and input a space,a workaround of a semantic issue `https://github.com/company-mode/company-mode/issues/614'"
+    (interactive)
+    (company-abort)
+    (insert " "))
+#+END_SRC
+
+** YASnippet
+*** yasnippet
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package yasnippet
+    :ensure t
+    :defer t
+    :init
+    (add-hook 'prog-mode-hook #'yas-minor-mode)
+    :config
+    (yas-reload-all))
+#+END_SRC
+
+
+** company and yasnippet
+Add yasnippet as the company candidates
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  ;Add yasnippet support for all company backends
+  ;https://github.com/syl20bnr/spacemacs/pull/179
+  (defvar company-mode/enable-yas t
+    "Enable yasnippet for all backends.")
+
+  (defun company-mode/backend-with-yas (backend)
+    (if (or (not company-mode/enable-yas) (and (listp backend) (member 'company-yasnippet backend)))
+        backend
+      (append (if (consp backend) backend (list backend))
+              '(:with company-yasnippet))))
+
+  (setq company-backends (mapcar #'company-mode/backend-with-yas company-backends))
+#+END_SRC
+
+Refer, [[http://emacs.stackexchange.com/questions/7908/how-to-make-yasnippet-and-company-work-nicer][how-to-make-yasnippet-and-company-work-nicer]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (defun check-expansion ()
+    (save-excursion
+      (if (looking-at "\\_>") t
+        (backward-char 1)
+        (if (looking-at "\\.") t
+          (backward-char 1)
+          (if (looking-at "->") t nil)))))
+
+  (defun do-yas-expand ()
+    (let ((yas/fallback-behavior 'return-nil))
+      (yas/expand)))
+
+  (defun tab-indent-or-complete ()
+    (interactive)
+    (cond
+     ((minibufferp)
+      (minibuffer-complete))
+     (t
+      (indent-for-tab-command)
+      (if (or (not yas/minor-mode)
+              (null (do-yas-expand)))
+          (if (check-expansion)
+              (progn
+                (company-manual-begin)
+                (if (null company-candidates)
+                    (progn
+                      (company-abort)
+                      (indent-for-tab-command)))))))))
+
+  (defun tab-complete-or-next-field ()
+    (interactive)
+    (if (or (not yas/minor-mode)
+            (null (do-yas-expand)))
+        (if company-candidates
+            (company-complete-selection)
+          (if (check-expansion)
+              (progn
+                (company-manual-begin)
+                (if (null company-candidates)
+                    (progn
+                      (company-abort)
+                      (yas-next-field))))
+            (yas-next-field)))))
+
+  (defun expand-snippet-or-complete-selection ()
+    (interactive)
+    (if (or (not yas/minor-mode)
+            (null (do-yas-expand))
+            (company-abort))
+        (company-complete-selection)))
+
+  (defun abort-company-or-yas ()
+    (interactive)
+    (if (null company-candidates)
+        (yas-abort-snippet)
+      (company-abort)))
+
+  '
+  ;; (require 'company)
+  ;; (require 'yasnippet)
+
+
+  ;; (global-set-key [tab] 'tab-indent-or-complete)
+  ;; (global-set-key (kbd "TAB") 'tab-indent-or-complete)
+  ;; (global-set-key [(control return)] 'company-complete-common)
+
+  ;; (define-key company-active-map [tab] 'expand-snippet-or-complete-selection)
+  ;; (define-key company-active-map (kbd "TAB") 'expand-snippet-or-complete-selection)
+
+  ;; (define-key yas-minor-mode-map [tab] nil)
+  ;; (define-key yas-minor-mode-map (kbd "TAB") nil)
+
+  ;; (define-key yas-keymap [tab] 'tab-complete-or-next-field)
+  ;; (define-key yas-keymap (kbd "TAB") 'tab-complete-or-next-field)
+  ;; (define-key yas-keymap [(control tab)] 'yas-next-field)
+  ;; (define-key yas-keymap (kbd "C-g") 'abort-company-or-yas)
+#+END_SRC
+
+* Libs
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package s
+    :ensure t)
 #+END_SRC
 
 * Programming Language
-** Emacs Lisp
+** Color identiifiers mode
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package color-identifiers-mode
     :ensure t
     :init
-    (add-hook 'emacs-lisp-mode-hook 'color-identifiers-mode)
-
+    (dolist (mode '(emacs-lisp-mode-hook
+                    c-mode-hook
+                    c++-mode-hook))
+      (add-hook mode #'color-identifiers-mode))
     :diminish color-identifiers-mode)
 
   (global-prettify-symbols-mode t)
 #+END_SRC
+** Font lock face
 
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (set-face-attribute 'font-lock-keyword-face nil :foreground "#F92672"  :weight 'bold)
+  (set-face-attribute 'font-lock-builtin-face nil :weight 'bold)
+  (set-face-attribute 'font-lock-function-name-face nil :foreground "#A6E22E" :weight 'normal :slant 'normal)
+  (set-face-attribute 'font-lock-variable-name-face nil :foreground "#00FF00")
+
+  (font-lock-add-keywords 'c-mode
+                          ;; highlight %s \n
+                          '(("\\([%\\][a-zA-Z]\\)" (1  font-lock-keyword-face prepend))
+                            ("[^[:alpha:]]\\([[:digit:]]*\\)[^[:alpha:]]" (1 font-lock-constant-face append))
+                            ;; hex number
+                            ("[^[:alpha:]]\\(0[x\\|X][0-9a-fA-F]*\\)[^[:alpha:]]" (1 font-lock-constant-face append))
+                            ;; hightlight the function call
+                            ("\\s\"?\\(\\(\\sw\\|\\s_\\)+\\(<-\\)?\\)\\s\"?*\\s-*(" (1 font-lock-function-name-face))) t)
+#+END_SRC
+
+** Emacs Lisp
 In Lisp Mode, =M-o= is defined, but I use this for global hydra window. So here disable this key
 bindings in =lispy-mode-map= after loaded. see [[http://stackoverflow.com/questions/298048/how-to-handle-conflicting-keybindings][here]]
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package lispy
     :ensure t
     :init
-    (eval-after-load "lispy"
-      `(progn
-         (define-key lispy-mode-map (kbd "M-o") nil)))
+    (setq lispy-delete-backward-recenter 0)
+    (with-eval-after-load "lispy"
+      (define-key lispy-mode-map (kbd "M-o") nil)
+      (define-key lispy-mode-map (kbd "g") 'special-lispy-goto-local)
+      (define-key lispy-mode-map (kbd "G") 'special-lispy-goto)
+      (define-key lispy-mode-map (kbd "M-m") 'back-to-indentation))
     :config
-    (add-hook 'emacs-lisp-mode-hook (lambda () (lispy-mode 1))))
+    (add-hook 'emacs-lisp-mode-hook (apply-partially #'lispy-mode 1)))
 #+END_SRC
 
 ** Perl
@@ -1643,9 +2201,7 @@ bindings in =lispy-mode-map= after loaded. see [[http://stackoverflow.com/questi
   (setq cperl-tab-always-indent t)
   ;(setq cperl-brace-offset  0)
 
-  (add-hook 'cperl-mode-hook
-            '(lambda ()
-               (cperl-set-style "C++")))
+  (add-hook 'cperl-mode-hook (apply-partially #'cperl-set-style "C++"))
 
   (defalias 'perldoc 'cperl-perldoc)
 #+END_SRC
@@ -1669,40 +2225,222 @@ Refer [[https://www.emacswiki.org/emacs/AutoInsertMode][AutoInsertMode]] Wiki
   (font-lock-add-keywords 'cperl-mode
                           '(("\\(say\\)" . cperl-nonoverridable-face)
                             ("\\([0-9.]\\)*" . font-lock-constant-face)
-                            ("\".*\\(\\\n\\).*\"" . font-lock-constant-face)
-                            ("\n" . font-lock-constant-face)
+                            ("\".*\\(\\\n\\).*\"" 1 font-lock-constant-face prepend)
+                            ("\n" 0 font-lock-constant-face prepend)
+                            ;; ("[%\\][[:alpha:]]" . font-lock-constant-face)
                             ("\\(^#!.*\\)$" .  cperl-nonoverridable-face)))
+#+END_SRC
+
+** C & C++
+C/C++ ide tools
+1. completion (file name, function name, variable name)
+2. template yasnippet (keywords, if, function)
+3. tags jump
+*** c/c++ style
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (setq c-default-style "stroustrup"
+        c-basic-offset 4)
+
+  ;; "C-M-j" is my global binding for avy goto line below
+  ;; disable it in c mode
+  (mapcar #'(lambda (map)
+             (define-key map (kbd "C-M-j") nil))
+          (list c-mode-map
+                c++-mode-map
+                objc-mode-map))
+
+  ;; objective c
+  (add-to-list 'auto-mode-alist '("\\.mm\\'" . objc-mode))
+
+  (setq c-hungry-delete-key t)
+#+END_SRC
 
-    ;; (font-lock-add-keywords 'Man-mode
-    ;;                         '(("\\(NAME\\)" . font-lock-function-name-face)))
+*** irony
+**** install irony server
+Install clang, on mac, it has =libclang.dylib=, but no develop headers. Install by =brew=
+#+BEGIN_SRC sh
+  brew install llvm --with-clang
+#+END_SRC
 
+then install irony searver, and =LIBCLANG_LIBRARY= and =LIBCLANG_INCLUDE_DIR= accordingly
+#+BEGIN_SRC emacs-lisp :tangle no :results silent
+  (irony-install-server)
 #+END_SRC
 
-*** Run Perl
-Change the compile-command to set the default command run when call =compile=
-Mapping =s-r= (on Mac, it's =Command + R= to run the script. Here =current-prefix-arg= is set
-to call =compilation=  interactively.
+#+BEGIN_SRC sh
+  cmake -DLIBCLANG_LIBRARY\=/usr/local/Cellar/llvm/4.0.1/lib/libclang.dylib \
+        -DLIBCLANG_INCLUDE_DIR=/usr/local/Cellar/llvm/4.0.1/include \
+        -DCMAKE_INSTALL_PREFIX\=/Users/peng/.emacs.d/irony/ \
+        /Users/peng/.emacs.d/elpa/irony-20160713.1245/server && cmake --build . --use-stderr --config Release --target install 
+#+END_SRC
+
+**** irony config
+irony-mode-hook, copied from [[https://github.com/Sarcasm/irony-mode][irony-mode]] github
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (defun my-perl-hook ()
-    (progn
-      (setq-local compilation-read-command nil)
+  (use-package irony
+    :ensure t
+    :config
+    (add-hook 'c++-mode-hook 'irony-mode)
+    (add-hook 'c-mode-hook 'irony-mode)
+    (add-hook 'objc-mode-hook 'irony-mode))
+
+  ;; replace the `completion-at-point' and `complete-symbol' bindings in
+  ;; irony-mode's buffers by irony-mode's function
+
+  (defun my-irony-mode-hook ()
+    (define-key irony-mode-map [remap completion-at-point]
+      'irony-completion-at-point-async)
+    (define-key irony-mode-map [remap complete-symbol]
+      'irony-completion-at-point-async))
+
+  (add-hook 'irony-mode-hook 'my-irony-mode-hook)
+  (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
+
+  (add-hook 'c++-mode-local-vars-hook #'sd/c++-mode-local-vars)
+
+  ;; add C++ completions, because by default c++ file can not complete
+  ;; c++ std functions, another method is create .dir-local.el file, for p
+  ;; for project see irony
+  (defun sd/c++-mode-local-vars ()
+    (setq irony--compile-options
+        '("-std=c++11"
+          "-stdlib=libc++"
+          "-I/usr/include/c++/4.2.1")))
+#+END_SRC
+
+irony-company
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package company-irony
+    :ensure t)
+
+  (use-package flycheck-irony
+    :ensure t)
+
+  (use-package company-c-headers
+    :ensure t
+    :config
+    (add-to-list 'company-c-headers-path-system "/usr/include/c++/4.2.1/")
+    (add-to-list 'company-c-headers-path-system "/usr/local/include/"))
+
+  ;; (with-eval-after-load 'company
+  ;;   (add-to-list 'company-backends 'company-irony)
+  ;;   (add-to-list 'company-backends 'company-c-headers))
+
+  (with-eval-after-load 'company
+    (push  '(company-irony :with company-yasnippet) company-backends)
+    (push  '(company-c-headers :with company-yasnippet) company-backends))
+
+  (with-eval-after-load 'flycheck
+    (add-hook 'flycheck-mode-hook #'flycheck-irony-setup))
+#+END_SRC
+
+*** flycheck
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package flycheck
+    :ensure t)
+#+END_SRC
+
+*** gtags
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package ggtags
+    :ensure t
+    :config
+    (define-key ggtags-mode-map (kbd "M-g d") 'ggtags-find-definition)
+    (define-key ggtags-mode-map (kbd "M-g r") 'ggtags-find-reference)
+    (define-key ggtags-mode-map (kbd "M-g r") 'ggtags-find-reference)
+    (define-key ggtags-mode-map (kbd "C-c g s") 'ggtags-find-other-symbol)
+    (define-key ggtags-mode-map (kbd "C-c g h") 'ggtags-view-tag-history)
+    (define-key ggtags-mode-map (kbd "C-c g r") 'ggtags-find-reference)
+    (define-key ggtags-mode-map (kbd "C-c g f") 'ggtags-find-file)
+    (define-key ggtags-mode-map (kbd "C-c g c") 'ggtags-create-tags)
+    (define-key ggtags-mode-map (kbd "C-c g u") 'ggtags-update-tags))
+
+  (add-hook 'c-mode-common-hook
+            (lambda ()
+              (when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
+                (ggtags-mode 1))))
+
+  (require 'cc-mode)
+  (require 'semantic)
+
+  (global-semanticdb-minor-mode 1)
+  (global-semantic-idle-scheduler-mode 1)
+
+  (semantic-mode 1)
+#+END_SRC
+
+*** google C style
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  ;; (use-package google-c-style
+  ;;   :ensure t
+  ;;   :config
+  ;;   (add-hook 'c-mode-hook 'google-set-c-style)
+  ;;   (add-hook 'c++-mode-hook 'google-set-c-style))
+#+END_SRC
+
+*** Compile and Run the C file
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (defun my-cpp-hook ()
+    (let* ((current-file-name)
+           (out-file-name))
+      (when buffer-file-name
+        (setq current-file-name (shell-quote-argument buffer-file-name))
+        (setq out-file-name (shell-quote-argument (concat (file-name-sans-extension buffer-file-name) ".out"))))
+      (setq-local compilation-read-command t)
       (set (make-local-variable 'compile-command)
-           (concat "/usr/bin/perl "
-                   (if buffer-file-name
-                       (shell-quote-argument buffer-file-name))))
-      (local-set-key (kbd "s-r")
-                     (lambda ()
-                       (interactive)
-                                          ;                       (setq current-prefix-arg '(4)) ; C-u
-                       (call-interactively 'compile)))))
+           (concat "g++ -Wall "
+                   current-file-name
+                   " -o "
+                   out-file-name
+                   " && "
+                   out-file-name
+                   ))
+      (local-set-key (kbd "s-r") 'compile)))
 
-  (add-hook 'cperl-mode-hook 'my-perl-hook)
+  (add-hook 'c-mode-hook 'my-cpp-hook)
+  (add-hook 'c++-mode-hook 'my-cpp-hook)
 #+END_SRC
 
-** C & C++
+** Lua
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (setq c-default-style "stroustrup"
-        c-basic-offset 4)
+  (use-package lua-mode
+    :ensure t)
+#+END_SRC
+
+** Scheme
+Install =guile=, =guile= is an implementation of =Scheme= programming language.
+#+BEGIN_SRC sh
+  brew install guile
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (setq geiser-scheme-implementation 'guile)
+#+END_SRC
+
+#+BEGIN_SRC scheme
+  (define a "3")
+  a
+#+END_SRC
+
+#+RESULTS:
+: 3
+
+** Racket
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package racket-mode
+    :ensure t
+    :config
+    (define-key racket-mode-map (kbd "s-r") 'racket-run)
+    (add-to-list 'racket-mode-hook (lambda () (lispy-mode 1))))
+
+  ;; set racket path
+  (setenv "PATH" (concat (getenv "PATH")
+                         ":" "/Applications/Racket v6.10.1/bin"))
+  (setenv "MANPATH" (concat (getenv "MANPATH")
+                            ":" "/Applications/Racket v6.10.1/man"))
+  (setq exec-path (append exec-path '("/Applications/Racket v6.10.1/bin")))
+
+  (add-to-list 'auto-mode-alist '("\\.rkt\\'" . racket-mode))
 #+END_SRC
 
 * Compile
@@ -1714,14 +2452,36 @@ Set the environments vairables in compilation mode
     (setq compilation-environment (cons "LC_ALL=C" compilation-environment))
     (setq compilation-auto-jump-to-first-error t)
     (setq compilation-auto-jump-to-next t)
-    (setq compilation-scroll-output 'first-error))
+    (setq compilation-scroll-output 'first-error)
+    ;; this will save all the modified buffers before compile
+    (setq compilation-ask-about-save nil)
+    (setq compilation-window-height (/ (window-total-height) 3)))
 
   ;; super-r to compile
   (with-eval-after-load "compile"
     (define-key compilation-mode-map (kbd "C-o") nil)
     (define-key compilation-mode-map (kbd "n") 'compilation-next-error)
     (define-key compilation-mode-map (kbd "p") 'compilation-previous-error)
+    (define-key compilation-mode-map (kbd "q") (lambda () (interactive) (quit-window t)))
     (define-key compilation-mode-map (kbd "r") #'recompile))
+
+  ;; here note dynamic binding the value of vv, otherwise it will resport error when run the hook.
+  ;; https://emacs.stackexchange.com/questions/10394/scope-in-lambda
+  (dolist (vv '(
+                (cperl-mode-hook . "perl")
+                (lua-mode-hook . "lua")
+                (python-mode-hook . "python")
+                (shell-mode-hook . "sh")))
+    (add-hook (car vv) `(lambda ()
+                          (unless (or (file-exists-p "makefile")
+                                      (file-exists-p "Makefile"))
+                            (set (make-local-variable 'compile-command)
+                                 (concat (cdr ',vv)
+                                         " "
+                                         (if buffer-file-name
+                                             (shell-quote-argument buffer-file-name))))))))
+
+  (global-set-key (kbd "s-r") 'compile)
 #+END_SRC
 
 * Auto-Insert
@@ -1734,22 +2494,22 @@ Set the environments vairables in compilation mode
 ** C++ Auto Insert
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (eval-after-load 'autoinsert
-    '(define-auto-insert '("\\.cpp\\'" . "C++ skeleton")
+    '(define-auto-insert '("\\.cpp\\|.cc\\'" . "C++ skeleton")
        '(
          "Short description:"
          "/*"
          "\n * " (file-name-nondirectory (buffer-file-name))
          "\n */" > \n \n
          "#include <iostream>" \n
-         "#include \""
+         "//#include \""
          (file-name-sans-extension
           (file-name-nondirectory (buffer-file-name)))
          ".hpp\"" \n \n
          "using namespace std;" \n \n
-         "int main ()"
+         "int main (int argc, char *argv[])"
          "\n{" \n 
          > _ \n
-         "return 1;"
+         "return 0;"
          "\n}" > \n
          )))
 
@@ -1761,16 +2521,21 @@ Set the environments vairables in compilation mode
          " * " (file-name-nondirectory (buffer-file-name)) "\n"
          " */" > \n \n
          "#include <stdio.h>" \n
-         "#include \""
+         "//#include \""
          (file-name-sans-extension
           (file-name-nondirectory (buffer-file-name)))
          ".h\"" \n \n
-         "int main ()\n"
+         "int main (int argc, char *argv[])\n"
          "{" \n
          > _ \n
-         "return 1;\n"
+         "return 0;\n"
          "}" > \n
          )))
+
+  (eval-after-load 'autoinsert
+    '(define-auto-insert '("\\.h\\|.hpp\\'" . "c/c++ header")
+       '((s-upcase (s-snake-case (file-name-nondirectory buffer-file-name)))
+         "#ifndef " str n "#define " str "\n\n" _ "\n\n#endif  // " str)))
 #+END_SRC
 
 ** Python template
@@ -1843,16 +2608,16 @@ Emacs lisp auto-insert, based on the default module in =autoinsert.el=, but repl
 
 ** Org file template
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (eval-after-load 'autoinsert
-    '(define-auto-insert '("\\.\\(org\\)\\'" . "Org-mode skeleton")
-       '(
-         "title: "
-         "#+TITLE: " str (make-string 30 ?\s) > \n
-         "#+AUTHOR: Peng Li\n"
-         "#+EMAIL: seudut@gmail.com\n"
-         "#+DATE: " (shell-command-to-string "echo -n $(date +%Y-%m-%d)") > \n
-         > \n
-         > _)))
+  ;; (eval-after-load 'autoinsert
+  ;;   '(define-auto-insert '("\\.\\(org\\)\\'" . "Org-mode skeleton")
+  ;;      '(
+  ;;        "title: "
+  ;;        "#+TITLE: " str (make-string 30 ?\s) > \n
+  ;;        "#+AUTHOR: Peng Li\n"
+  ;;        "#+EMAIL: seudut@gmail.com\n"
+  ;;        "#+DATE: " (shell-command-to-string "echo -n $(date +%Y-%m-%d)") > \n
+  ;;        > \n
+  ;;        > _)))
 #+END_SRC
 
 * Markdown mode
@@ -1864,6 +2629,13 @@ Emacs lisp auto-insert, based on the default module in =autoinsert.el=, but repl
            ("\\.md\\'" . markdown-mode)
            ("\\.markdown\\'" . markdown-mode))
     :init (setq markdown-command "multimarkdown"))
+
+  (add-hook 'gfm-mode-hook (lambda ()
+                             (set-face-attribute 'markdown-inline-code-face nil :inherit 'fixed-pitch)
+                             (set-face-attribute 'markdown-pre-face nil :inherit 'fixed-pitch)))
+  (with-eval-after-load "gfm-mode"
+    (set-face-attribute 'markdown-inline-code-face nil :inherit 'fixed-pitch)
+    (set-face-attribute 'markdown-pre-face nil :inherit 'fixed-pitch))
 #+END_SRC
 
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
@@ -1908,37 +2680,37 @@ Then Run =M-x gnus=
 
 ** Group buffer
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (use-package gnus
-    :init
-    (setq gnus-permanently-visible-groups "\.*")
-    :config
-    (cond (window-system
-           (setq custom-background-mode 'light)
-           (defface my-group-face-1
-             '((t (:foreground "Red" :bold t))) "First group face")
-           (defface my-group-face-2
-             '((t (:foreground "DarkSeaGreen4" :bold t)))
-             "Second group face")
-           (defface my-group-face-3
-             '((t (:foreground "Green4" :bold t))) "Third group face")
-           (defface my-group-face-4
-             '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
-           (defface my-group-face-5
-             '((t (:foreground "Blue" :bold t))) "Fifth group face")))
-    (setq gnus-group-highlight
-          '(((> unread 200) . my-group-face-1)
-            ((and (< level 3) (zerop unread)) . my-group-face-2)
-            ((< level 3) . my-group-face-3)
-            ((zerop unread) . my-group-face-4)
-            (t . my-group-face-5))))
-
-
-  ;; key-
-  (add-hook 'gnus-group-mode-hook (lambda ()
-                                    (define-key gnus-group-mode-map "k" 'gnus-group-prev-group)
-                                    (define-key gnus-group-mode-map "j" 'gnus-group-next-group)
-                                    (define-key gnus-group-mode-map "g" 'gnus-group-jump-to-group)
-                                    (define-key gnus-group-mode-map "v" (lambda () (interactive) (gnus-group-select-group t)))))
+  ;; (use-package gnus
+  ;;   :init
+  ;;   (setq gnus-permanently-visible-groups "\.*")
+  ;;   :config
+  ;;   (cond (window-system
+  ;;          (setq custom-background-mode 'light)
+  ;;          (defface my-group-face-1
+  ;;            '((t (:foreground "Red" :bold t))) "First group face")
+  ;;          (defface my-group-face-2
+  ;;            '((t (:foreground "DarkSeaGreen4" :bold t)))
+  ;;            "Second group face")
+  ;;          (defface my-group-face-3
+  ;;            '((t (:foreground "Green4" :bold t))) "Third group face")
+  ;;          (defface my-group-face-4
+  ;;            '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
+  ;;          (defface my-group-face-5
+  ;;            '((t (:foreground "Blue" :bold t))) "Fifth group face")))
+  ;;   (setq gnus-group-highlight
+  ;;         '(((> unread 200) . my-group-face-1)
+  ;;           ((and (< level 3) (zerop unread)) . my-group-face-2)
+  ;;           ((< level 3) . my-group-face-3)
+  ;;           ((zerop unread) . my-group-face-4)
+  ;;           (t . my-group-face-5))))
+
+
+  ;; ;; key-
+  ;; (add-hook 'gnus-group-mode-hook (lambda ()
+  ;;                                   (define-key gnus-group-mode-map "k" 'gnus-group-prev-group)
+  ;;                                   (define-key gnus-group-mode-map "j" 'gnus-group-next-group)
+  ;;                                   (define-key gnus-group-mode-map "g" 'gnus-group-jump-to-group)
+  ;;                                   (define-key gnus-group-mode-map "v" (lambda () (interactive) (gnus-group-select-group t)))))
 #+END_SRC
 
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
@@ -1966,8 +2738,9 @@ Then Run =M-x gnus=
   ;; (with-eval-after-load 'gnus-summary-mode
   ;;   (define-key gnus-summary-mode-map (kbd "C-o") 'sd/hydra-window/body))
 
-  (add-hook 'gnus-summary-mode-hook (lambda ()
-                                      (define-key gnus-summary-mode-map (kbd "C-o") nil)))
+  ;; (add-hook 'gnus-summary-mode-hook (lambda ()
+  ;;                                     (define-key gnus-summary-mode-map (kbd "C-o") nil)))
+  ;(add-hook 'gnus-summary-mode-hook (apply-partially #'define-key gnus-summary-mode-map (kbd "C-o") nil))
 
 
 #+END_SRC
@@ -1998,43 +2771,137 @@ See [[https://www.emacswiki.org/emacs/GnusWindowLayout][GnusWindowLayout]]
   ;;                               (gnus-group-select-group "INBOX")))
 #+END_SRC
 
-* Gnu Plot
-To fix some issue that =toolbar-make-button-list= is void, see the [[https://github.com/bruceravel/gnuplot-mode/issues/31][issue]], here I set some variable as =nil=
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (use-package gnuplot
-    :ensure
-    :init
-    (setq gnuplot-help-xpm nil)
-    (setq gnuplot-line-xpm nil)
-    (setq gnuplot-region-xpm nil)
-    (setq gnuplot-buffer-xpm nil)
-    (setq gnuplot-doc-xpm nil))
+* Mu4e
+Refer [[http://www.kirang.in/2014/11/13/emacs-as-email-client-with-offlineimap-and-mu4e-on-osx][emacs-as-email-client-with-offlineimap-and-mu4e-on-osx]]
+
+** OfflineImap - download all mails from IMAP into local directory, and keep in sync
+#+BEGIN_SRC sh :results output replace
+  # offline-imap
+  brew install offline-imap
+
+  cp /usr/local/etc/offlineimap.conf ~/.offlineimapr
+
+  #For the =offlineimap= config on mac, using =sslcacertfile= instead of =cert_fingerpring=. On Mac
+  sslcacertfile = /usr/local/etc/openssl/cert.pem 
 #+END_SRC
 
-Use =gnuplot= on =Org-mode= file, see [[http://orgmode.org/worg/org-contrib/babel/languages/ob-doc-gnuplot.html][ob-doc-gnuplot]]
-#+BEGIN_SRC gnuplot :exports code :file ./temp/file.png
-  reset
+#+BEGIN_SRC conf 
+  [general]
+  ui=TTYUI
+  accounts = Gmail
+  autorefresh = 5
 
-  set title "Putting it All Together"
+  [Account Gmail]
+  localrepository = Gmail-Local
+  remoterepository = Gmail-Remote
 
-  set xlabel "X"
-  set xrange [-8:8]
-  set xtics -8,2,8
+  [Repository Gmail-Local]
+  type = Maildir
+  localfolders = ~/.Mail/seudut@gmail.com
 
+  [Repository Gmail-Remote]
+  type = Gmail
+  remotehost = imap.gmail.com
+  remoteuser = seudut@gmail.com
+  remotepass = xxxxxxxx
+  realdelete = no
+  ssl = yes
+  #cert_fingerprint = <insert gmail server fingerprint here>
+  sslcacertfile = /usr/local/etc/openssl/cert.pem
+  maxconnections = 1
+  folderfilter = lambda folder: folder not in ['[Gmail]/Trash',
+                                               '[Gmail]/Spam',
+                                               '[Gmail]/All Mail',
+                                               ]
+#+END_SRC
 
-  set ylabel "Y"
-  set yrange [-20:70]
-  set ytics -20,10,70
+Then, run =offlineimap= to sync the mail
 
-  f(x) = x**2
-  g(x) = x**3
-  h(x) = 10*sqrt(abs(x))
+** Mu - fast search, view mails and extract attachments.
+#+BEGIN_SRC sh
+  EMACS=/usr/local/bin/emacs brew install mu --with-emacs
+#+END_SRC
 
-  plot f(x) w lp lw 1, g(x) w p lw 2, h(x) w l lw 3
+Then, run =mu index --maildir=~/.Mail=
+
+** Mu4e - Emacs frontend of Mu
+config from [[http://www.kirang.in/2014/11/13/emacs-as-email-client-with-offlineimap-and-mu4e-on-osx/][emacs-as-email-client-with-offlineimap-and-mu4e-on-osx]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (if (require 'mu4e nil 'noerror)
+      (progn
+        (setq mu4e-maildir "~/.Mail")
+        (setq mu4e-drafts-folder "/[Gmail].Drafts")
+        (setq mu4e-sent-folder   "/[Gmail].Sent Mail")
+        ;; don't save message to Sent Messages, Gmail/IMAP takes care of this
+        (setq mu4e-sent-messages-behavior 'delete)
+        ;; allow for updating mail using 'U' in the main view:
+        (setq mu4e-get-mail-command "offlineimap")
+
+        ;; shortcuts
+        (setq mu4e-maildir-shortcuts
+              '( ("/INBOX"               . ?i)
+                 ("/[Gmail].Sent Mail"   . ?s)))
+
+        ;; something about ourselves
+        (setq
+         user-mail-address "seudut@gmail.com"
+         user-full-name  "Peng Li"
+         mu4e-compose-signature
+         (concat
+          "Thanks,\n"
+          "Peng\n"))
+
+        ;; show images
+        (setq mu4e-show-images t)
+
+        ;; use imagemagick, if available
+        (when (fboundp 'imagemagick-register-types)
+          (imagemagick-register-types))
+
+        ;; convert html emails properly
+        ;; Possible options:
+        ;;   - html2text -utf8 -width 72
+        ;;   - textutil -stdin -format html -convert txt -stdout
+        ;;   - html2markdown | grep -v '&nbsp_place_holder;' (Requires html2text pypi)
+        ;;   - w3m -dump -cols 80 -T text/html
+        ;;   - view in browser (provided below)
+        (setq mu4e-html2text-command "textutil -stdin -format html -convert txt -stdout")
+
+        ;; spell check
+        (add-hook 'mu4e-compose-mode-hook
+                  (defun my-do-compose-stuff ()
+                    "My settings for message composition."
+                    (set-fill-column 72)
+                    (flyspell-mode)))
+
+        ;; add option to view html message in a browser
+        ;; `aV` in view to activate
+        (add-to-list 'mu4e-view-actions
+                     '("ViewInBrowser" . mu4e-action-view-in-browser) t)
+
+        ;; fetch mail every 10 mins
+        (setq mu4e-update-interval 600)
+
+        ;; mu4e view
+        (setq-default mu4e-headers-fields '((:flags . 6)
+                                            (:from-or-to . 22)
+                                            (:mailing-list . 20)
+                                            (:thread-subject . 70)
+                                            (:human-date . 16))))
+    (message "seudut:mu4e not installed, it won't work."))
+#+END_SRC
+
+** Smtp - send mail
+- =gnutls=, depends on =gnutls=, first confirm this is installed, otherwise, =brew install gnutls=
+- =~/.authinfo=
+#+BEGIN_SRC fundamental 
+  machine smtp.gmail.com login <gmail username> password <gmail password>
+#+END_SRC
+- OPTIONAL, encrypt the =~/.authinfo= file
+#+BEGIN_SRC sh :results output replace
+  gpg --output ~/.authinfo.gpg --symmetric ~/.authinfo
 #+END_SRC
 
-#+RESULTS:
-[[file:./temp/file.png]]
 * Ediff
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (with-eval-after-load 'ediff
@@ -2045,8 +2912,17 @@ Use =gnuplot= on =Org-mode= file, see [[http://orgmode.org/worg/org-contrib/babe
     (add-hook 'ediff-suspend-hook 'ediff-toggle-wide-display))
 #+END_SRC
 
+* Modes
+** Yaml-mode
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package yaml-mode
+    :ensure t
+    :init
+    (add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode)))
+#+END_SRC
+
 * Entertainment
-** GnoGo
+** GnuGo
 Play Go in Emacs, gnugo xpm refert [[https://github.com/okanotor/dotemacs/blob/f95b774cb292d1169748bc0a62ba647bbd8c0652/etc/my-inits/my-inits-gnugo.el][to here]]. start at image display mode and grid mode
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package gnugo
@@ -2093,6 +2969,20 @@ We can use [[https://www.gnu.org/software/emms/quickstart.html][Emms]] for multi
 
 * Key Bindings
 Here are some global key bindings for basic editting
+** Global key bingding
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (global-set-key (kbd "C-h") 'delete-backward-char)
+  (global-set-key (kbd "s-m") 'man)
+#+END_SRC
+
+Refer [[https://github.com/fnwiya/dotfiles/blob/c9ca79f1b22c919d9f4c3a0f944ba8281255a594/setup/.emacs.d/loader-init/_90-kill-region-or-backward-kill-word.el][kill-region-or-backward-kill-word]]
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (require 'utilities)
+  (global-set-key (kbd "C-w") 'sd/kill-region-or-backward-kill-word)
+#+END_SRC
+
+
 ** Esc in minibuffer
 Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
@@ -2117,23 +3007,24 @@ Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
     :ensure t
     :init
     (setq projectile-enable-caching t)
-    (setq projectile-switch-project-action 'projectile-dired)
+    (setq projectile-switch-project-action (lambda ()
+                                             (projectile-dired)
+                                             (sd/project-switch-action)))
     (setq projectile-cache-file (concat sd-temp-directory "projectile.cache"))
     :config
     (add-to-list 'projectile-globally-ignored-files "GTAGS")
     (projectile-global-mode t))
 
-  (use-package persp-projectile
-    :ensure t
-    :config
-    (persp-mode)
-    :bind
-    (:map projectile-mode-map
-          ("s-t" . projectile-persp-switch-project)))
-
-  ;; projectile-find-file
-  ;; projectile-switch-buffer
-  ;; projectile-find-file-other-window
+  ;; change default-directory of scratch buffer to projectile-project-root 
+  (defun sd/project-switch-action ()
+    "Change default-directory of scratch buffer to current projectile-project-root directory"
+    (interactive)
+    (dolist (buffer (buffer-list))
+      (if (string-match (concat "scratch.*" (projectile-project-name))
+                        (buffer-name buffer))
+          (let ((root (projectile-project-root)))
+            (with-current-buffer buffer
+              (cd root))))))
 #+END_SRC
 
 *** project config =super= keybindings
@@ -2149,71 +3040,16 @@ Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
   (global-set-key (kbd "<s-return>") 'toggle-frame-fullscreen)
 
   (global-set-key (kbd "s-f") 'projectile-find-file)
-  (global-set-key (kbd "s-`") 'mode-line-other-buffer)
+  ;; (global-set-key (kbd "s-`") 'mode-line-other-buffer)
 
-  (global-set-key (kbd "s-n") 'persp-next)
-  (global-set-key (kbd "s-p") 'persp-prev)
-  (global-set-key (kbd "s-;") 'persp-switch-last)
+  ;; (global-set-key (kbd "s-n") 'persp-next)
+  ;; (global-set-key (kbd "s-p") 'persp-prev)
+  ;; (global-set-key (kbd "s-;") 'persp-switch-last)
 
   (global-set-key (kbd "s-=") 'text-scale-increase)
   (global-set-key (kbd "s--") 'text-scale-decrease)
 
   ;; (global-set-key (kbd "s-u") 'undo-tree-visualize)
-
-
-  ;; someothers default mapping on super (command) key
-  ;; s-s save-buffer
-  ;; s-k kill-this-buffer
-
-
-  ;; s-h  -->  ns-do-hide-emacs
-  ;; s-j  -->  ido-switch-buffer  +
-  ;; s-k  -->  kill-this-buffer
-  ;; s-l  -->  goto-line
-  ;; s-;  -->  undefined
-  ;; s-'  -->  next-multiframe-window
-  ;; s-ret --> toggle-frame-fullscreen +
-
-  ;; s-y  -->  ns-paste-secondary
-  ;; s-u  -->  revert-buffer
-  ;; s-i  -->  undefined - but used for iterm globally
-  ;; s-o  -->  used for emacs globally
-  ;; s-p  -->  projectile-persp-switch-project  +  
-  ;; s-[  -->  next-buffer  +    
-  ;; s-]  -->  previous-buffer +
-
-  ;; s-0  -->  undefined
-  ;; s-9  -->  undefined
-  ;; s-8  -->  undefined
-  ;; s-7  -->  undefined
-  ;; s-6  -->  undefined
-  ;; s--  -->  center-line
-  ;; s-=  -->  undefined
-
-  ;; s-n  -->  make-frame
-  ;; s-m  -->  iconify-frame
-  ;; s-b  -->  undefined
-  ;; s-,  -->  customize
-  ;; s-.  -->  undefined
-  ;; s-/  -->  undefined
-
-  ;; s-g  -->  isearch-repeat-forward
-  ;; s-f  -->  projectile-find-file   +
-  ;; s-d  -->  isearch-repeat-background
-  ;; s-s  -->  save-buffer
-  ;; s-a  -->  make-whole-buffer
-
-  ;; s-b  -->  undefined
-  ;; s-v  -->  yank
-  ;; s-c  -->  ns-copy-including-secondary
-
-  ;; s-t  -->  ns-popup-font-panel
-  ;; s-r  -->  undefined
-  ;; s-e  -->  isearch-yanqk-kill
-  ;; s-w  -->  delete-frame
-  ;; s-q  -->  same-buffers-kill-emacs
-
-  ;; s-`  -->  other-frame
 #+END_SRC
 
 ** Windown & Buffer - =C-o=
@@ -2222,81 +3058,80 @@ Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to del
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (winner-mode 1)
 
-  (defun sd/delete-current-window ()
-    (interactive)
-    (if (> (length (window-list)) 1)
-        (delete-window)
-      (message "Only one Windows now!")))
-
-  (defun sd/toggle-max-windows ()
-    "Set maximize current if there are multiple windows, if only
-  one window, window undo"
-    (interactive)
-    (if (equal  (length (window-list)) 1)
-        (winner-undo)
-      (delete-other-windows)))
-
+  (require 'utilities)
   (defhydra sd/hydra-window (:color red :columns nil)
-    "Window"
-    ;; windows split
+    "C-o"
+    ;; windows switch
     ("h" windmove-left nil :exit t)
     ("j" windmove-down nil :exit t)
     ("k" windmove-up nil :exit t)
     ("l" windmove-right nil :exit t)
+    ("C-o" other-window nil :exit t)
+    ;; window resize
     ("H" hydra-move-splitter-left nil)
     ("J" hydra-move-splitter-down nil)
     ("K" hydra-move-splitter-up nil)
     ("L" hydra-move-splitter-right nil)
+    ;; windows split
     ("v" (lambda ()
            (interactive)
            (split-window-right)
            (windmove-right))
-     "vert" :exit t)
+     nil :exit t)
     ("x" (lambda ()
            (interactive)
            (split-window-below)
            (windmove-down))
-     "horz" :exit t)
-
+     nil :exit t)
     ;; buffer / windows switch
-    ("o" sd/toggle-max-windows "one" :exit t)
-    ("C-k" sd/delete-current-window "del" :exit t)
-    ("D" (lambda ()
+    ("o" sd/toggle-max-windows nil :exit t)
+    ("C-k" sd/delete-current-window nil :exit t)
+    ("C-d" (lambda ()
              (interactive)
              (kill-buffer)
              (sd/delete-current-window))
-     "kill" :exit t)
-    ("'" other-window "other" :exit t)
+     nil :exit t)
+
+    ;; ace-window
+    ;; ("'" other-window "other" :exit t)
     ;; ("a" ace-window "ace")
-    ("s" ace-swap-window "swap")
+    ("s" ace-swap-window nil)
+    ("D" ace-delete-window nil :exit t)
     ;; ("i" ace-maximize-window "ace-one" :exit t)
-
-    ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
-    ("r" (progn (winner-redo) (setq this-command 'winner-redo)) "redo")
+    ;; Windows undo - redo
+    ("u" (progn (winner-undo) (setq this-command 'winner-undo)) nil)
+    ("r" (progn (winner-redo) (setq this-command 'winner-redo)) nil)
 
     ;; ibuffer, dired, eshell, bookmarks
-    ;; ("d" ace-delete-window "ace-one" :exit t)
-    ("C-o" ido-switch-buffer nil :exit t)
+    ;; ("C-i" other-window nil :exit t)
+    ("C-b" ido-switch-buffer nil :exit t)
+    ("C-f" projectile-find-file nil :exit t)
+    ("C-r" ivy-recentf nil :exit t)
+    ;; ("C-p" persp-switch nil :exit t)
+    ;; ("C-t" projectile-persp-switch-project nil :exit t)
+
+    ;; other special buffers
     ("d" sd/project-or-dired-jump nil :exit t)
     ("b" ibuffer nil :exit t)
-    ("e" eshell nil :exit t)
+    ("t" multi-term nil :exit t)
+    ("e" sd/toggle-project-eshell nil :exit t)
     ("m" bookmark-jump-other-window nil :exit t)
     ("M" bookmark-set nil :exit t)
     ("g" magit-status nil :exit t)
-    ("p" paradox-list-packages nil :exit t)
+    ;; ("p" paradox-list-packages nil :exit t)
 
     ;; quit
-    ("q" nil "cancel")
-    ("<ESC>" nil)
-    ("C-h" nil nil :exit t)
-    ("C-j" nil nil :exit t)
-    ;; ("C-k" nil :exit t)
-    ("C-l" nil nil :exit t)
+    ("q" nil nil)
+    ("<ESC>" nil nil)
+    ("C-h" windmove-left nil :exit t)
+    ("C-j" windmove-down nil :exit t)
+    ("C-k" windmove-up nil :exit t)
+    ("C-l" windmove-right nil :exit t)
     ("C-;" nil nil :exit t)
     ("n" nil nil :exit t)
     ("[" nil nil :exit t)
     ("]" nil nil :exit t)
-    ("f" nil))
+    ("f" nil nil))
 
   (global-unset-key (kbd "C-o"))
   (global-set-key (kbd "C-o") 'sd/hydra-window/body)
@@ -2310,6 +3145,38 @@ Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to del
       (dired-jump)))
 #+END_SRC
 
+Kill the help window and buffer when quit.
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (with-eval-after-load "help-mode"
+    (define-key help-mode-map (kbd "q") (lambda ()
+                                          (interactive)
+                                          (quit-window t))))
+
+  (with-eval-after-load 'man
+    (set-face-attribute 'Man-overstrike nil :inherit 'bold :foreground "orange red")
+    (set-face-attribute 'Man-underline nil :inherit 'underline :foreground "forest green")
+    (define-key Man-mode-map (kbd "q") (lambda ()
+                                         (interactive)
+                                         (Man-kill))))
+
+
+  ;; (advice-add 'man :after (lambda (man-args) (other-window 1)))
+  (advice-add 'man :after (apply-partially 'other-window 1))
+
+
+  (require 'shell-command-output-mode)
+
+  (defun my/shell-command-after (command &optional output-buffer error-buffer)
+    (let* ((buffer (get-buffer "*Shell Command Output*"))
+           (window (get-buffer-window buffer)))
+      (if buffer (with-current-buffer buffer
+                   (shell-command-output-mode)))
+      (if window
+          (select-window window))))
+
+  (advice-add 'shell-command :after 'my/shell-command-after)
+#+END_SRC
+
 ** Motion
 - =C-M-=
 [[https://www.masteringemacs.org/article/effective-editing-movement][effective-editing-movement]]
@@ -2432,6 +3299,11 @@ Search, replace and hightlight will in later paragraph
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (global-set-key (kbd "M-i") #'counsel-imenu)
   ;; (global-set-key (kbd "M-i") #'imenu)
+
+  ;; define M-[ as C-M-a
+  ;; http://ergoemacs.org/emacs/emacs_key-translation-map.html
+  (define-key key-translation-map (kbd "M-[") (kbd "C-M-a"))
+  (define-key key-translation-map (kbd "M-]") (kbd "C-M-e"))
 #+END_SRC
 
 *** Go-to line
@@ -2725,68 +3597,59 @@ stolen from [[https://github.com/mariolong/emacs.d/blob/f6a061594ef1b5d1f4750e9d
 
 *** TODO make expand-region hydra work with lispy selected
 
-* TODO Convert ASCII to key
-** map =function-key-map= [[http://academic.evergreen.edu/projects/biophysics/technotes/program/ascii_ctrl.htm][ascii_ctrl]]
-new file =C-x C-f C-f=
-
-** write color syntax for =Man-mode=
-
+* Developing
+** perspeen
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (font-lock-add-keywords 'perl-mode '(("\\(|\\w+?\\(,\\w+?\\)?|\\)" 1 'py-builtins-face)))
-#+END_SRC
-
-* TODO jump last change point
-* TODO emms mode-line
-
-* =C-u C-h a= search funtions 
-=apropos-command= 
-
-* key
-- passion
-- vision
-- mission
-
-* M prefix
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
-  ;; M-h - mark-paragraph
-  ;; M-j - new line indent
-  ;; M-k - kill-sentence
-  ;; M-l - downcase words     ====== goto-line
-  ;; M-; - comments
-  ;; M-'- abbrev-prefix-mark  =======
-  ;; M-RET none                ======
-
-  ;; M-y - yank
-  ;; M-u - upcase word
-  ;; M-i -                 ====== imenu
-  ;; M-o             ====== prefix
-  ;; M-p
-  ;; M-[                   =====
-  ;; M-]              ========
-  ;; M-\   deleter horizontal space =====
-
-  ;; M-n 
-  ;; M-m ---- indent
-  ;; M-, --- mark stack====== =
-  ;; M-. lisp-goto-symboo, find definitation
-
-  ;; M-a 
-  ;; M-s ===== 
-  ;; M-d
-  ;; M-f
-  ;; M-g - prefix
-
-  ;; M-q - lisp fill, fill paragraph
-  ;; M-w 
-  ;; M-e
-  ;; M-r  - rePositioning 
-  ;; M-t transpose word 
-
-  ;; M-z zap-to-char
-  ;; M-x
-  ;; M-c  capitalize-word
-  ;; M-v 
-  ;; M-b 
+  ;; (use-package perspeen
+  ;;   :ensure t
+  ;;   :init
+  ;;   (setq perspeen-use-tab nil)
+  ;;   :config
+  ;;   (perspeen-mode))
+
+  (el-get-bundle seudut/perspeen
+    :features perspeen
+    (setq perspeen-use-tab nil)
+    (perspeen-mode))
+
+  ;; super-i to switch to ith workspace
+
+  (defmacro sd/define-keys (map key func &rest args)
+    "A macro to define multi keys "
+    `(define-key ,map ,key (lambda () (interactive) (,func ,@args))))
+
+
+  (with-eval-after-load "perspeen"
+    (dotimes (ii 9)
+      (sd/define-keys perspeen-mode-map (kbd (concat "s-" (number-to-string (+ ii 1))))
+                      perspeen-goto-ws (+ ii 1)))
+    (define-key perspeen-mode-map (kbd "s-c") 'perspeen-create-ws)
+    (define-key perspeen-mode-map (kbd "s-n") 'perspeen-next-ws)
+    (define-key perspeen-mode-map (kbd "s-p") 'perspeen-previous-ws)
+    (define-key perspeen-mode-map (kbd "s-'") 'perspeen-last-ws)
+    (define-key perspeen-mode-map (kbd "s-t") 'perspeen-tab-create-tab)
+    (define-key perspeen-mode-map (kbd "s-t") 'perspeen-tab-create-tab))
+#+END_SRC
+* Evil Mode
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (org-babel-load-file "~/.emacs.d/emacs-evil.org")
+#+END_SRC
+* Note
+** Check if emacs is in terminal of graphic mode
+Use =display-graphic-p= instead of =window-system=
+[[info:elisp#Window%20Systems][Window Systems]]
+** =Interactive= 
+** List operation
+*** add a element to list
+- ~add-to-list~ functions, append
+- ~push~ macro
+- ~(setcdr (last aa) (list element))~
+blog with modify list
+
+draw one line top of the windows
+* test
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  ;; test local mode line
+  ;; (add-to-list 'load-path "~/.emacs.d/elisp")
+  ;; (require 'my-mode-line)
 #+END_SRC
-