Emacs - Add compile for cpp mode
[dotfiles.git] / emacs.d / config.org
index 45182c7..2993e1a 100644 (file)
@@ -17,11 +17,6 @@ Set system PATH and emacs exec path
   (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)
@@ -33,14 +28,23 @@ Set the emacs load path
   (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)
@@ -135,17 +139,6 @@ Check out [[http://tapoueh.org/emacs/el-get.html][el-get]].
     :ensure t)
 #+END_SRC
 
-* Mac Specific
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  ;; (defconst *is-a-mac* (eq system-type 'darwin))
-  ;; (setq mouse-wheel-scroll-amount '(1
-  ;;                                   ((shift) . 5)
-  ;;                                   ((control))))
-
-
-  ;; (setq-default indicate-empty-lines t)
-#+END_SRC
-
 * Color and Fonts Settings
 ** highlight current line
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
@@ -154,18 +147,20 @@ Check out [[http://tapoueh.org/emacs/el-get.html][el-get]].
   (add-hook 'prog-mode-hook 'hl-line-mode)
   (add-hook 'text-mode-hook 'hl-line-mode)
   (add-hook 'dired-mode-hook '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
@@ -179,7 +174,7 @@ Check out [[http://tapoueh.org/emacs/el-get.html][el-get]].
   (if window-system
       (defvar sd/fixed-font-family
         (cond ((x-list-fonts "Hasklig")         "Hasklig")
-              ((x-list-fonts "Source Code Pro") "Source Code Pro:weight")
+              ((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."))
@@ -190,7 +185,7 @@ Setting the fonts alignment issue
   (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
 
@@ -248,14 +243,6 @@ Fix the font alignment issue when both Chinese and English hybird in org-mode ta
     (interactive) (emacs-step-font-size -1))
 #+END_SRC
 
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  ;; Setup font size based on emacs-font-size-pair
-  (set-font emacs-english-font emacs-cjk-font '(13 . 16))
-
-  ;; (global-set-key (kbd "s-=") 'increase-emacs-font-size)
-  ;; (global-set-key (kbd "s--") 'decrease-emacs-font-size)
-
-#+END_SRC
 
 ** Color Theme
 
@@ -263,6 +250,8 @@ Loading theme should be after all required loaded, refere [[https://github.com/j
 
 #+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
@@ -402,7 +391,8 @@ Enable rainbow mode in emacs lisp mode
 
 ** cusor color
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (set-cursor-color 'red)
+  (if (display-graphic-p)
+      (set-cursor-color 'red))
 #+END_SRC
 
 * Mode-line
@@ -519,7 +509,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)) 
@@ -578,13 +569,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
@@ -675,28 +670,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
@@ -722,47 +695,92 @@ Always indents header, and hide header leading starts so that no need type =#+ST
     (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)))
+    ;; (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)
 
-  (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)))
+  ;; 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))
+    (warn "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
 
-  ;; Lua support
-  (use-package ob-lua
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package plantuml-mode
     :ensure t)
+
+  (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
@@ -778,7 +796,14 @@ use [[https://github.com/sabof/org-bullets][org-bullets]] package to show utf-8
   (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
@@ -790,7 +815,9 @@ cause we cannot input =[= and =]=, so here I unset this mappings. And redifined
   (use-package worf
     :ensure t
     :commands worf-mode
-    :init (add-hook 'org-mode-hook 'worf-mode))
+    :init
+    (require 'ivy)
+    (add-hook 'org-mode-hook 'worf-mode))
 #+END_SRC
 
 ** Get Things Done
@@ -945,13 +972,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
@@ -961,6 +987,18 @@ 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 
@@ -1052,9 +1090,25 @@ Color higlight the source code block in exported html, [[http://stackoverflow.co
   (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
@@ -1069,8 +1123,94 @@ extend org-mode's easy templates, refer to [[http://coldnew.github.io/coldnew-em
                '("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]]
@@ -1081,7 +1221,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
@@ -1114,14 +1254,9 @@ 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 ()
+  (add-hook 'eshell-mode-hook (lambda ()
                                 (local-set-key (kbd "C-l") 'sd/eshell-clear-buffer)))
 #+END_SRC
 
@@ -1154,21 +1289,8 @@ Toggle an eshell in split window below, refer [[http://www.howardism.org/Technic
         (other-window 1)
         (if (projectile-project-p)
             (projectile-run-eshell)
-          (eshell))
-        ;; (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-`"))
+          (eshell)))))
+
   (global-set-key (kbd "s-e") 'sd/toggle-project-eshell)
 #+END_SRC
 
@@ -1264,29 +1386,21 @@ 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
@@ -1309,14 +1423,11 @@ I like [[https://github.com/coldnew/linum-relative][linum-relative]], just like
 #+END_SRC
 
 ** Save File Position
-
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
   (require '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
@@ -1439,11 +1550,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)
@@ -1455,13 +1562,8 @@ When see function by =C-h f=, and visit the source code, I would like the buffer
 
 ** 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
@@ -1477,26 +1579,26 @@ When see function by =C-h f=, and visit the source code, I would like the buffer
 
 ** 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))
+  ;(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
@@ -1516,6 +1618,23 @@ When see function by =C-h f=, and visit the source code, I would like the buffer
   (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
@@ -1574,6 +1693,28 @@ as a http download client tool
                                   (car (last (split-string url "/" t))))))))))
 #+END_SRC
 
+** Elscreen
+Fix one elscreen issue when startup emacs https://github.com/knu/elscreen/issues/6
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  ;; (use-package elscreen
+  ;;   :ensure t
+  ;;   :init
+  ;;   (setq elscreen-tab-display-control nil)
+  ;;   :config
+  ;;   ;; (elscreen-start)
+  ;;   (set-face-attribute 'elscreen-tab-current-screen-face nil :foreground "black" :background "yellow")
+  ;;   (set-face-attribute 'elscreen-tab-other-screen-face nil :foreground "black" :background "disabledControlTextColor" :underline nil)
+  ;;   ;; (global-unset-key (kbd)); M-TAB switch screen
+  ;;   ;; (global-set-key (kbd "s-`") '(lambda () (interactive) (elscreen-goto 0)))
+  ;;   ;; (dotimes (i 8)
+  ;;   ;;   (global-set-key (kbd (concat "s-" (number-to-string (+ i 1))))
+  ;;   ;;                   `(lambda () (interactive) (elscreen-goto ,(+ i 1)))))
+  ;;   ;; (global-set-key (kbd "s-t") 'elscreen-create)
+  ;;   ;; (global-set-key (kbd "s-n") 'elscreen-next)
+  ;;   ;; (global-set-key (kbd "s-p") 'elscreen-previous)
+  ;;   )
+#+END_SRC
+
 * Dired
 ** Dired bindings
 =C-o= is defined as a global key for window operation, here unset it in dired mode
@@ -1644,11 +1785,24 @@ as a http download client tool
 #+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)
@@ -1669,7 +1823,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))))
@@ -1677,14 +1832,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 'dired-goto-file)
+  (mk-disable-ido-no-completing 'dired-goto-file)
 #+END_SRC
 
 ** Dired open with
@@ -1781,18 +1951,26 @@ here on Mac, just use "open" commands to pen =.pdf=,  =.html= and image files
     :config
     (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
+    ;; 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)
     (global-company-mode)
-    (setq company-global-modes '(not org-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
@@ -1930,11 +2108,15 @@ bindings in =lispy-mode-map= after loaded. see [[http://stackoverflow.com/questi
   (use-package lispy
     :ensure t
     :init
-    (eval-after-load "lispy"
-      `(progn
-         (define-key lispy-mode-map (kbd "M-o") nil)))
+    (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))))
+
+
 #+END_SRC
 
 ** Perl
@@ -2154,6 +2336,26 @@ irony-company
     (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)
+           (a-dot-out-file))
+      (when buffer-file-name
+        (setq current-file-name (shell-quote-argument buffer-file-name))
+        (setq a-dot-out-file (concat (file-name-directory buffer-file-name) "a.out")))
+      (setq-local compilation-read-command t)
+      (set (make-local-variable 'compile-command)
+           (concat "g++ -Wall "
+                   current-file-name
+                   " && "
+                   a-dot-out-file))
+      (local-set-key (kbd "s-r") 'compile)))
+
+  (add-hook 'c-mode-hook 'my-cpp-hook)
+  (add-hook 'c++-mode-hook 'my-cpp-hook)
+#+END_SRC
+
 ** Lua
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package lua-mode
@@ -2341,16 +2543,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
@@ -2362,6 +2564,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
@@ -2406,37 +2615,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
@@ -2552,66 +2761,68 @@ 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
-  (require 'mu4e)
-  (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)))
+  (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))))
+    (warn "seudut:mu4e not installed, it won't work."))
 #+END_SRC
 
 ** Smtp - send mail
@@ -2635,6 +2846,15 @@ config from [[http://www.kirang.in/2014/11/13/emacs-as-email-client-with-offline
     (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
 ** 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
@@ -2715,19 +2935,6 @@ Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
     (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)))
-
-  ;; (defun sd/change-default-directory (buffer dir)
-  ;;   "change defafult directory of buffer to dir"
-  ;;   (with-current-buffer buffer
-  ;;     (cd dir)))
-
   ;; 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"
@@ -2737,9 +2944,7 @@ Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
                         (buffer-name buffer))
           (let ((root (projectile-project-root)))
             (with-current-buffer buffer
-              (cd root)))
-        ;; (sd/change-default-directory buffer (projectile-project-root))
-        )))
+              (cd root))))))
 #+END_SRC
 
 *** project config =super= keybindings
@@ -2755,71 +2960,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=
@@ -2828,22 +2978,9 @@ 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"
+    "C-o"
     ;; windows switch
     ("h" windmove-left nil :exit t)
     ("j" windmove-down nil :exit t)
@@ -2860,36 +2997,38 @@ Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to del
            (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)
+    ("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)
+     nil :exit t)
 
     ;; ace-window
     ;; ("'" other-window "other" :exit t)
     ;; ("a" ace-window "ace")
-    ("s" ace-swap-window "swap")
-    ("D" ace-delete-window "ace-one" :exit t)
+    ("s" ace-swap-window nil)
+    ("D" ace-delete-window nil :exit t)
     ;; ("i" ace-maximize-window "ace-one" :exit t)
     ;; Windows undo - redo
-    ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
-    ("r" (progn (winner-redo) (setq this-command 'winner-redo)) "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
     ;; ("C-i" other-window nil :exit t)
     ("C-b" ido-switch-buffer nil :exit t)
     ("C-f" projectile-find-file nil :exit t)
-    ("C-p" persp-switch :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)
@@ -2902,17 +3041,17 @@ Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to del
     ;; ("p" paradox-list-packages nil :exit t)
 
     ;; quit
-    ("q" nil "cancel")
-    ("<ESC>" nil)
+    ("q" nil nil)
+    ("<ESC>" nil nil)
     ("C-h" windmove-left nil :exit t)
     ("C-j" windmove-down nil :exit t)
-    ("C-k" windmove-up :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)
@@ -3347,24 +3486,51 @@ stolen from [[https://github.com/mariolong/emacs.d/blob/f6a061594ef1b5d1f4750e9d
 *** TODO make expand-region hydra work with lispy selected
 ** =C-w= delete backward word
 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
-  (defun sd/kill-region-or-backward-kill-word ()
-    (interactive)
-    (if (region-active-p)
-        (kill-region (point) (mark))
-      (backward-kill-word 1)))
 
+#+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
 
-* key
-- passion
-- vision
-- mission
-
-* TODO todolist
-** rucket
-** player video on iphone for 
-** SICP
-** music searcher
-search music on some music web site
+* Developing
+** perspeen
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package perspeen
+    :ensure t
+    :init
+    (setq perspeen-use-tab nil)
+    :config
+    (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
+
+* 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