emacs - chinese font setting
[dotfiles.git] / emacs.d / config.org
index cb3cf45..e4c37cf 100644 (file)
@@ -47,6 +47,9 @@ Set the emacs load path
   (show-paren-mode 1)
   ;; don't backupf
   (setq make-backup-files nil)
+
+  ;;supress the redefined warning at startup
+  (setq ad-redefinition-action 'accept)
 #+END_SRC
 
 *** Custom file 
@@ -100,6 +103,11 @@ 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
 
+*** 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
@@ -139,13 +147,13 @@ 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)
-
+  ;; (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)
 #+END_SRC
 
 ** Smart Comments
@@ -161,38 +169,91 @@ Check out [[http://tapoueh.org/emacs/el-get.html][el-get]].
 #+END_SRC
 
 ** Font Setting
-
 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
-
 #+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")
               ((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-font 'default sd/fixed-font-family)))
+#+END_SRC
+
+Fix the font alignment issue when both Chinese and English hybird in org-mode table
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (defvar emacs-english-font "Source Code Pro" "The font name of English.")
+
+  ;; (defvar emacs-cjk-font "Hiragino Sans GB W3" "The font name for CJK.")
+  (defvar emacs-cjk-font "STHeiti" "The font name for CJK.")
+  ;; (defvar emacs-cjk-font "chinese-gbk" "The font name for CJK.")
+
+  (defvar emacs-font-size-pair '(15 . 18) "Default font size pair for (english . chinese)")
+
+  (defvar emacs-font-size-pair-list
+    '(( 5 .  6) (10 . 12)
+      (11 . 13) (12 . 14)
+      (13 . 16) (14 . 15) (15 . 18) (16 . 19) (17 . 20)
+      (18 . 21) (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 '(kana han symbol cjk-misc bopomofo))
+          (set-fontset-font (frame-parameter nil 'font) charset
+                            (font-spec :family chinese :size (cdr size-pair))))))
+
+  ;; Setup font size based on emacs-font-size-pair
+  ;; (set-font emacs-english-font emacs-cjk-font emacs-font-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))
+
+  ;; (global-set-key (kbd "C-=") 'increase-emacs-font-size)
+  ;; (global-set-key (kbd "C--") 'decrease-emacs-font-size)
 
 #+END_SRC
 
@@ -201,7 +262,6 @@ Setting the fonts
 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 color-theme
@@ -211,7 +271,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))
@@ -338,13 +400,17 @@ Enable rainbow mode in emacs lisp mode
 
 #+END_SRC
 
+** cusor color
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (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]], 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,6 +431,7 @@ clean mode line, Refer to [[https://www.masteringemacs.org/article/hiding-replac
       (flyspell-mode . "")
       (irony-mode . "")
       (page-break-lines-mode . "")
+      (yas-minor-mode . "y")
       ;; Major modes
       (lisp-interaction-mode . "λ")
       (hi-lock-mode . "")
@@ -587,8 +654,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
@@ -652,7 +719,16 @@ 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))
+    (setq org-completion-use-ido t)
+    (setq org-startup-with-inline-images t)
+    ;; (setq org-emphasis-regexp-components
+    ;;       ;; markup 记号前后允许中文
+    ;;       (list (concat " \t('\"{" "[:nonascii:]")
+    ;;             (concat "- \t.,:!?;'\")}\\[" "[:nonascii:]")
+    ;;             " \t\r\n,\"'"
+    ;;             "."
+    ;;             1))
+    )
 
   (org-babel-do-load-languages
    'org-babel-load-languages
@@ -712,18 +788,10 @@ In =worf-mode=, it is mapping =[=, =]= as =worf-backward= and =worf-forward= in
 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 (add-hook 'org-mode-hook 'worf-mode))
 #+END_SRC
 
 ** Get Things Done
@@ -747,12 +815,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)")
@@ -985,14 +1050,16 @@ Install MacTex-basic [[http://www.tug.org/mactex/morepackages.html][MacTex-basic
 ** 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
-  (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"))
-  (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
+                 '("E" "#+BEGIN_SRC emacs-lisp :tangle yes :results silent\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"))
 #+END_SRC
 
 * Magit
@@ -1107,7 +1174,6 @@ Toggle an eshell in split window below, refer [[http://www.howardism.org/Technic
 #+END_SRC
 
 * Misc Settings
-
 ** [[https://github.com/abo-abo/hydra][Hydra]]
 *** hydra install
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
@@ -1213,9 +1279,10 @@ Fix the font size of line number
 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.
@@ -1230,7 +1297,6 @@ 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
@@ -1245,9 +1311,20 @@ I like [[https://github.com/coldnew/linum-relative][linum-relative]], just like
 #+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
@@ -1430,6 +1507,64 @@ 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
 
+** 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
+
+** 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)
+    (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 bindings
 =C-o= is defined as a global key for window operation, here unset it in dired mode
@@ -1469,7 +1604,8 @@ When see function by =C-h f=, and visit the source code, I would like the buffer
     (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
@@ -1490,7 +1626,7 @@ When see function by =C-h f=, and visit the source code, I would like the buffer
     (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"
@@ -1539,6 +1675,7 @@ Disalble =ido= when new a directory or file in =dired= mode
   ;; call the function which you want to disable ido
   (mk-disable-ido 'dired-create-directory)
   (mk-disable-ido 'sd/dired-new-file)
+  (mk-disable-ido 'dired-goto-file)
 #+END_SRC
 
 ** Dired open with
@@ -1625,14 +1762,23 @@ 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 "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)
+    (global-company-mode)
+    (setq company-global-modes '(not org-mode)))
 
   (use-package company-statistics
     :ensure t
@@ -1640,6 +1786,116 @@ company mode and company-statistics
     (company-statistics-mode))
 #+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
@@ -1746,28 +2002,29 @@ to call =compilation=  interactively.
 #+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)
-#+END_SRC
 
-*** flycheck
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (use-package flycheck
-    :ensure t)
-#+END_SRC
+  ;; "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))
 
-*** irony
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (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))
+  ;; objective c
+  (add-to-list 'auto-mode-alist '("\\.mm\\'" . objc-mode))
 #+END_SRC
 
+*** 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
@@ -1785,17 +2042,38 @@ then install irony searver, and =LIBCLANG_LIBRARY= and =LIBCLANG_INCLUDE_DIR= ac
         /Users/peli3/.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
+  (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
@@ -1803,20 +2081,46 @@ irony-company
   (use-package company-irony
     :ensure t)
 
-  (eval-after-load 'company
-    '(add-to-list 'company-backends 'company-irony))
-
   (use-package flycheck-irony
     :ensure t)
 
-  (eval-after-load 'flycheck
-    '(add-hook 'flycheck-mode-hook #'flycheck-irony-setup))
+  (use-package company-c-headers
+    :ensure t
+    :config
+    (add-to-list 'company-c-headers-path-system "/usr/include/c++/4.2.1/"))
+
+  ;; (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)
+    :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 ()
@@ -1830,32 +2134,57 @@ irony-company
   (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
 
-*** yasnippet
+** Lua
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (use-package yasnippet
+  (use-package lua-mode
     :ensure t)
 #+END_SRC
 
-*** semantic
+** 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
 
-*** google C style
+#+RESULTS:
+: 3
+
+** Racket
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (use-package google-c-style
+  (use-package racket-mode
     :ensure t
     :config
-    (add-hook 'c-mode-hook 'google-set-c-style))
-#+END_SRC
+    (define-key racket-mode-map (kbd "s-r") 'racket-run)
+    (add-to-list 'racket-mode-hook (lambda () (lispy-mode 1))))
 
-** Lua
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (use-package lua-mode
-    :ensure t)
+  ;; set racket path
+  (setenv "PATH" (concat (getenv "PATH")
+                         ":" "/Applications/Racket v6.6/bin"))
+  (setenv "MANPATH" (concat (getenv "MANPATH")
+                            ":" "/Applications/Racket v6.6/man"))
+  (setq exec-path (append exec-path '("/Applications/Racket v6.6/bin")))
+
+  (add-to-list 'auto-mode-alist '("\\.rkt\\'" . racket-mode))
 #+END_SRC
 
 * Compile
@@ -1875,6 +2204,8 @@ Set the environments vairables in compilation mode
     (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 "r") #'recompile))
+
+  (global-set-key (kbd "s-r") 'compile)
 #+END_SRC
 
 * Auto-Insert
@@ -1899,7 +2230,7 @@ Set the environments vairables in compilation mode
           (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 0;"
@@ -1918,7 +2249,7 @@ Set the environments vairables in compilation mode
          (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 0;\n"
@@ -2156,43 +2487,135 @@ 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))
-#+END_SRC
+* 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]]
 
-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
+** 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
 
-  set title "Putting it All Together"
+  cp /usr/local/etc/offlineimap.conf ~/.offlineimapr
 
-  set xlabel "X"
-  set xrange [-8:8]
-  set xtics -8,2,8
+  #For the =offlineimap= config on mac, using =sslcacertfile= instead of =cert_fingerpring=. On Mac
+  sslcacertfile = /usr/local/etc/openssl/cert.pem 
+#+END_SRC
 
+#+BEGIN_SRC conf 
+  [general]
+  ui=TTYUI
+  accounts = Gmail
+  autorefresh = 5
 
-  set ylabel "Y"
-  set yrange [-20:70]
-  set ytics -20,10,70
+  [Account Gmail]
+  localrepository = Gmail-Local
+  remoterepository = Gmail-Remote
 
-  f(x) = x**2
-  g(x) = x**3
-  h(x) = 10*sqrt(abs(x))
+  [Repository Gmail-Local]
+  type = Maildir
+  localfolders = ~/.Mail/seudut@gmail.com
 
-  plot f(x) w lp lw 1, g(x) w p lw 2, h(x) w l lw 3
+  [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
+
+Then, run =offlineimap= to sync the mail
+
+** Mu - fast search, view mails and extract attachments.
+#+BEGIN_SRC sh
+  EMACS=/usr/local/bin/emacs brew install mu --with-emacs
+#+END_SRC
+
+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)))
+#+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
@@ -2204,7 +2627,7 @@ Use =gnuplot= on =Org-mode= file, see [[http://orgmode.org/worg/org-contrib/babe
 #+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
@@ -2412,15 +2835,18 @@ Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to del
 
   (defhydra sd/hydra-window (:color red :columns nil)
     "Window"
-    ;; windows split
+    ;; 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)
@@ -2431,33 +2857,40 @@ Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to del
            (split-window-below)
            (windmove-down))
      "horz" :exit t)
-
     ;; buffer / windows switch
     ("o" sd/toggle-max-windows "one" :exit t)
     ("C-k" sd/delete-current-window "del" :exit t)
-    ("D" (lambda ()
+    ("C-d" (lambda ()
              (interactive)
              (kill-buffer)
              (sd/delete-current-window))
      "kill" :exit t)
-    ("'" other-window "other" :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)
     ;; ("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")
-
+    
     ;; 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-p" persp-switch :exit t)
+
+    ;; other special buffers
     ("d" sd/project-or-dired-jump nil :exit t)
     ("b" ibuffer 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")
@@ -2606,6 +3039,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
@@ -2898,13 +3336,23 @@ stolen from [[https://github.com/mariolong/emacs.d/blob/f6a061594ef1b5d1f4750e9d
 #+END_SRC
 
 *** 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)))
+
+  (global-set-key (kbd "C-w") 'sd/kill-region-or-backward-kill-word)
+#+END_SRC
+
 * key
 - passion
 - vision
 - mission
 
-* TODO jump last change point
-
 * TODO todolist
 ** rucket
 ** player video on iphone for