041cf0685238dcab414a022b9d8822ba0ded3a3b
[dotfiles.git] / emacs.d / config.org
1 #+TITLE: Emacs Configuration file
2 #+AUTHOR: Peng Li
3 #+EMAIL: seudut@gmail.com
4
5 * Introduction
6
7 Most config are just copied from [[https://github.com/howardabrams/dot-files][howardabrams]]'s and [[https://github.com/abo-abo/oremacs][abo-abo's]] dotfiles
8
9 * Basic Settings
10
11 ** Setting loading Path
12
13 Set system PATH and emacs exec path
14
15 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
16
17   (setenv "PATH" (concat (getenv "PATH")
18                          ":" "/usr/local/bin"
19                          ":" "/Library/TeX/texbin"))
20   (setq exec-path (append exec-path '("/usr/local/bin")))
21   (setq exec-path (append exec-path '("/Library/TeX/texbin/")))
22
23 #+END_SRC
24
25 Set the emacs load path
26
27 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
28
29   (add-to-list 'load-path "~/.emacs.d/elisp")
30
31 #+END_SRC
32
33 ** Package Initialization
34
35 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
36
37   (require 'package)
38
39   (setq package-archives '(("mepla" . "http://melpa.milkbox.net/packages/")
40                            ("gnu" . "http://elpa.gnu.org/packages/")
41                            ("org" . "http://orgmode.org/elpa/")))
42
43   (package-initialize)
44
45 #+END_SRC       
46
47 ** General Setting
48
49 Disable scroll bar, tool-bar and menu-bar
50
51 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
52   (scroll-bar-mode 0)
53   (tool-bar-mode 0)
54   (menu-bar-mode 1)
55
56   (setq debug-on-error t)
57   (setq inhibit-startup-message t)
58
59   (defalias 'yes-or-no-p 'y-or-n-p)
60   (show-paren-mode 1)
61   ;; don't backupf
62   (setq make-backup-files nil)
63 #+END_SRC
64
65 set custom file 
66
67 #+BEGIN_SRC emacs-lisp :tangle yes :results silent 
68
69   (setq custom-file "~/.emacs.d/custom.el")
70   (if (file-exists-p custom-file)
71       (load custom-file))
72
73 #+END_SRC
74
75 Switch the focus to help window when it appears
76
77 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
78
79   (setq help-window-select t)
80
81 #+END_SRC
82
83 Setting scroll right/left
84 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
85   ;  (global-set-key (kbd "C-,") 'scoll-left)
86   ;  (global-set-key (kbd "C-.") 'scoll-right)
87 #+END_SRC
88
89 * Package Management Tools
90
91 ** Use-package
92
93 Using [[https://github.com/jwiegley/use-package][use-package]] to manage emacs packages
94
95 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
96
97   (unless (package-installed-p 'use-package)
98     (package-refresh-contents)
99     (package-install 'use-package))
100
101   (require 'use-package)
102
103 #+END_SRC
104
105 ** El-get
106
107 [[https://github.com/dimitri/el-get][El-get]] is package management tool, whicl allows to install external elisp package from any git repository not in mepla. 
108 Check out [[http://tapoueh.org/emacs/el-get.html][el-get]].
109
110 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
111
112   (use-package el-get
113     :ensure t
114     :init
115     (add-to-list 'load-path "~/.emacs.d/el-get"))
116
117 #+END_SRC
118
119 * Color and Fonts Settings
120
121 ** highlight current line
122
123 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
124
125   (global-hl-line-mode)
126
127 #+END_SRC
128
129 ** Smart Comments
130
131 [[https://github.com/paldepind/smart-comment][smart-comments]]
132
133 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
134
135   (use-package smart-comment
136     :ensure t
137     :bind ("M-;" . smart-conmment))
138
139 #+END_SRC
140
141 ** Font Setting
142
143 syntax highlighting
144
145 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
146
147   (global-font-lock-mode 1)
148
149 #+END_SRC
150
151 [[https://github.com/i-tu/Hasklig][Hasklig]] and Source Code Pro, defined fonts family
152
153 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
154
155   (if window-system
156       (defvar sd/fixed-font-family
157         (cond ((x-list-fonts "Hasklig")         "Hasklig")
158               ((x-list-fonts "Source Code Pro") "Source Code Pro:weight:light")
159               ((x-list-fonts "Anonymous Pro")   "Anonymous Pro")
160               ((x-list-fonts "M+ 1mn")          "M+ 1mn"))
161         "The fixed width font based on what is installed, `nil' if not defined."))
162
163 #+END_SRC
164
165 Setting the fonts 
166
167 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
168
169   (if window-system
170       (when sd/fixed-font-family
171         (set-frame-font sd/fixed-font-family)
172         (set-face-attribute 'default nil :font sd/fixed-font-family :height 130)
173         (set-face-font 'default sd/fixed-font-family)))
174
175 #+END_SRC
176
177 ** Color Theme
178
179 Loading theme should be after all required loaded, refere [[https://github.com/jwiegley/use-package][:defer]] in =use-package=
180
181 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
182
183   (setq vc-follow-symlinks t)
184
185   (use-package color-theme
186     :ensure t
187     :init (require 'color-theme)
188     :config (use-package color-theme-sanityinc-tomorrow
189               :ensure t
190               :no-require t
191               :config
192               (load-theme 'sanityinc-tomorrow-bright t)))
193
194   ;(eval-after-load 'color-theme
195   ;  (load-theme 'sanityinc-tomorrow-bright t))
196
197 #+END_SRC
198
199 Change the Org-mode colors 
200
201 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
202
203   (defun org-src-color-blocks-light ()
204     "Colors the block headers and footers to make them stand out more for lighter themes"
205     (interactive)
206     (custom-set-faces
207      '(org-block-begin-line
208       ((t (:underline "#A7A6AA" :foreground "#008ED1" :background "#EAEAFF"))))
209      '(org-block-background
210        ((t (:background "#FFFFEA"))))
211      '(org-block
212        ((t (:background "#FFFFEA"))))
213      '(org-block-end-line
214        ((t (:overline "#A7A6AA" :foreground "#008ED1" :background "#EAEAFF"))))
215
216      '(mode-line-buffer-id ((t (:foreground "#005000" :bold t))))
217      '(which-func ((t (:foreground "#008000"))))))
218
219   (defun org-src-color-blocks-dark ()
220     "Colors the block headers and footers to make them stand out more for dark themes"
221     (interactive)
222     (custom-set-faces
223      '(org-block-begin-line
224        ((t (:foreground "#008ED1" :background "#002E41"))))
225      '(org-block-background
226        ((t (:background "#000000"))))
227      '(org-block
228        ((t (:background "#000000"))))
229      '(org-block-end-line
230        ((t (:foreground "#008ED1" :background "#002E41"))))
231
232      '(mode-line-buffer-id ((t (:foreground "black" :bold t))))
233      '(which-func ((t (:foreground "green"))))))
234
235   (org-src-color-blocks-dark)
236
237 #+END_SRC
238
239 improve color for org-mode
240 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
241   (deftheme ha/org-theme "Sub-theme to beautify org mode")
242
243   (if window-system
244       (defvar sd/variable-font-tuple
245         (cond ((x-list-fonts "Source Sans Pro") '(:font "Source Sans Pro"))
246               ((x-list-fonts "Lucida Grande")   '(:font "Lucida Grande"))
247               ((x-list-fonts "Verdana")         '(:font "Verdana"))
248               ((x-family-fonts "Sans Serif")    '(:family "Sans Serif"))
249               (nil (warn "Cannot find a Sans Serif Font.  Install Source Sans Pro.")))
250         "My variable width font available to org-mode files and whatnot."))
251
252   (defun sd/org-color ()
253     (let* ((sd/fixed-font-tuple (list :font sd/fixed-font-family))
254            (base-font-color     (face-foreground 'default nil 'default))
255            (background-color    (face-background 'default nil 'default))
256            (primary-color       (face-foreground 'mode-line nil))
257            (secondary-color     (face-background 'secondary-selection nil 'region))
258            (base-height         (face-attribute 'default :height))
259            (headline           `(:inherit default :weight bold :foreground ,base-font-color)))
260       (custom-theme-set-faces 'ha/org-theme
261                               `(org-agenda-structure ((t (:inherit default :height 2.0 :underline nil))))
262                               `(org-verbatim ((t (:inherit 'fixed-pitched :foreground "#aef"))))
263                               `(org-table ((t (:inherit 'fixed-pitched))))
264                               `(org-block ((t (:inherit 'fixed-pitched))))
265                               `(org-block-background ((t (:inherit 'fixed-pitched))))
266                               `(org-block-begin-line ((t (:inherit 'fixed-pitched))))
267                               `(org-block-end-line ((t (:inherit 'fixed-pitched))))
268                               `(org-level-8 ((t (,@headline ,@sd/variable-font-tuple))))
269                               `(org-level-7 ((t (,@headline ,@sd/variable-font-tuple))))
270                               `(org-level-6 ((t (,@headline ,@sd/variable-font-tuple))))
271                               `(org-level-5 ((t (,@headline ,@sd/variable-font-tuple))))
272                               `(org-level-4 ((t (,@headline ,@sd/variable-font-tuple
273                                                             :height ,(round (* 1.1 base-height))))))
274                               `(org-level-3 ((t (,@headline ,@sd/variable-font-tuple
275                                                             :height ,(round (* 1.25 base-height))))))
276                               `(org-level-2 ((t (,@headline ,@sd/variable-font-tuple
277                                                             :height ,(round (* 1.5 base-height))))))
278                               `(org-level-1 ((t (,@headline ,@sd/variable-font-tuple
279                                                             :height ,(round (* 1.75 base-height))))))
280                               `(org-document-title ((t (,@headline ,@sd/variable-font-tuple :height 1.5 :underline nil)))))))
281
282
283 #+END_SRC
284
285 ** Rainbow-delimiter
286
287 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
288
289   (use-package rainbow-delimiters
290     :ensure t
291     :init
292     (add-hook 'prog-mode-hook #'rainbow-delimiters-mode))
293
294 #+END_SRC
295
296 ** page-break-lines
297
298 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
299
300   (use-package page-break-lines
301     :ensure t
302     :config
303     (turn-on-page-break-lines-mode))
304
305 #+END_SRC
306
307 ** rainbow-mode
308
309 Enable rainbow mode in emacs lisp mode
310
311 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
312   (use-package rainbow-mode
313     :ensure t
314   ;  :init
315   ;  (add-hook emacs-lisp-mode-hook 'rainbow-mode)
316     )
317
318 #+END_SRC
319
320 * Mode-line
321
322 ** clean mode line
323
324 clean mode line, Refer to [[https://www.masteringemacs.org/article/hiding-replacing-modeline-strings][Marstering Emacs]]
325
326 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
327   (defvar mode-line-cleaner-alist
328     `((auto-complete-mode . " Î±")
329       (yas/minor-mode . " Ï…")
330       (paredit-mode . " Ï€")
331       (eldoc-mode . "")
332       (abbrev-mode . "")
333       (projectile-mode . "")
334       (ivy-mode . "")
335       (undo-tree-mode . "")
336       ;; default is WK
337       (which-key-mode . "")
338       ;; default is SP
339       (smartparens-mode . "")
340       ;; default is LR
341       (linum-relative-mode . "")
342       ;; default is ARev
343       (auto-revert-mode . "")
344       ;; default is Ind
345       (org-indent-mode . "")
346       ;; Major modes
347       (lisp-interaction-mode . "λ")
348       (hi-lock-mode . "")
349       (python-mode . "Py")
350       (emacs-lisp-mode . "EL")
351       (eshell-mode . "ε")
352       (nxhtml-mode . "nx"))
353     "Alist for `clean-mode-line'.
354
355   When you add a new element to the alist, keep in mind that you
356   must pass the correct minor/major mode symbol and a string you
357   want to use in the modeline *in lieu of* the original.")
358
359
360   (defun clean-mode-line ()
361     (interactive)
362     (loop for cleaner in mode-line-cleaner-alist
363           do (let* ((mode (car cleaner))
364                    (mode-str (cdr cleaner))
365                    (old-mode-str (cdr (assq mode minor-mode-alist))))
366                (when old-mode-str
367                    (setcar old-mode-str mode-str))
368                  ;; major mode
369                (when (eq mode major-mode)
370                  (setq mode-name mode-str)))))
371
372
373   (add-hook 'after-change-major-mode-hook 'clean-mode-line)
374 #+END_SRC
375
376 ** Powerline mode
377
378 Install powerline mode [[https://github.com/milkypostman/powerline][powerline]]
379
380 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
381   (use-package powerline
382     :ensure t
383     :config
384     ;; (powerline-center-theme)
385     )
386
387   ;; (use-package smart-mode-line
388   ;;   :ensure t)
389   ;; (use-package smart-mode-line-powerline-theme
390   ;;   :ensure t)
391 #+END_SRC
392
393 Revised powerline-center-theme
394
395 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
396   (defun sd/powerline-simpler-vc (s)
397     (if s
398         (replace-regexp-in-string "Git[:-]" "" s)
399       s))
400
401   (defun sd/powerline-center-theme_revised ()
402     "Setup a mode-line with major and minor modes centered."
403     (interactive)
404     (setq-default mode-line-format
405                   '("%e"
406                     (:eval
407                      (let* ((active (powerline-selected-window-active))
408                             (mode-line-buffer-id (if active 'mode-line-buffer-id 'mode-line-buffer-id-inactive))
409                             (mode-line (if active 'mode-line 'mode-line-inactive))
410                             (face1 (if active 'powerline-active1 'powerline-inactive1))
411                             (face2 (if active 'powerline-active2 'powerline-inactive2))
412                             (separator-left (intern (format "powerline-%s-%s"
413                                                             (powerline-current-separator)
414                                                             (car powerline-default-separator-dir))))
415                             (separator-right (intern (format "powerline-%s-%s"
416                                                              (powerline-current-separator)
417                                                              (cdr powerline-default-separator-dir))))
418                             (lhs (list (powerline-raw "%*" mode-line 'l)
419                                        ;; (powerline-buffer-size mode-line 'l)
420                                        (powerline-buffer-id mode-line-buffer-id 'l)
421                                        (powerline-raw " ")
422                                        (funcall separator-left mode-line face1)
423                                        (powerline-narrow face1 'l)
424                                        ;; (powerline-vc face1)
425                                        (sd/powerline-simpler-vc (powerline-vc face1))
426                                        ))
427                             (rhs (list (powerline-raw global-mode-string face1 'r)
428                                        (powerline-raw "%4l" face1 'r)
429                                        (powerline-raw ":" face1)
430                                        (powerline-raw "%3c" face1 'r)
431                                        (funcall separator-right face1 mode-line)
432                                        (powerline-raw " ")
433                                        (powerline-raw "%6p" mode-line 'r)
434                                        (powerline-hud face2 face1)))
435                             (center (list (powerline-raw " " face1)
436                                           (funcall separator-left face1 face2)
437                                           (when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
438                                             (powerline-raw erc-modified-channels-object face2 'l))
439                                           (powerline-major-mode face2 'l)
440                                           (powerline-process face2)
441                                           (powerline-raw " :" face2)
442                                           (powerline-minor-modes face2 'l)
443                                           (powerline-raw " " face2)
444                                           (funcall separator-right face2 face1))))
445                        (concat (powerline-render lhs)
446                                (powerline-fill-center face1 (/ (powerline-width center) 2.0))
447                                (powerline-render center)
448                                (powerline-fill face1 (powerline-width rhs))
449                                (powerline-render rhs)))))))
450
451   (sd/powerline-center-theme_revised)
452 #+END_SRC
453
454 Fix the issue in mode line when showing triangle 
455
456 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
457   (setq ns-use-srgb-colorspace nil)
458 #+END_SRC
459
460 set height in mode line
461
462 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
463
464   (custom-set-variables
465    '(powerline-height 14)
466    '(powerline-text-scale-factor 0.8))
467   ;; 100/140
468   (set-face-attribute 'mode-line nil :height 100)
469
470 #+END_SRC
471
472 * Org-mode Settings
473
474 ** Org-mode Basic setting
475
476 Always indents header, and hide header leading starts so that no need type =#+STATUP: indent= 
477
478 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
479
480   (use-package org
481     :ensure t
482     :init
483     (setq org-startup-indented t)
484     (setq org-hide-leading-starts t)
485     (setq org-src-fontify-natively t)
486     (setq org-src-tab-acts-natively t)
487     (setq org-confirm-babel-evaluate nil)
488     (setq org-use-speed-commands t)
489     (setq org-completion-use-ido t))
490
491   (org-babel-do-load-languages
492    'org-babel-load-languages
493    '((python . t)
494      (C . t)
495      (perl . t)
496      (calc . t)
497      (latex . t)
498      (java . t)
499      (ruby . t)
500      (lisp . t)
501      (scheme . t)
502      (sh . t)
503      (sqlite . t)
504      (js . t)))
505
506   ;; use current window for org source buffer editting
507   (setq org-src-window-setup 'current-window )
508
509 #+END_SRC
510
511 ** Org-bullets
512
513 use [[https://github.com/sabof/org-bullets][org-bullets]] package to show utf-8 charactes
514
515 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
516   (use-package org-bullets
517     :ensure t
518     :init
519     (add-hook 'org-mode-hook
520               (lambda ()
521                 (org-bullets-mode t))))
522
523   (setq org-bullets-bullet-list '("⦿" "✪" "âš«" "â—‰" "â—‹" "â–º" "â—†"))
524 #+END_SRC
525
526 ** Worf Mode
527
528 [[https://github.com/abo-abo/worf][worf]] mode is an extension of vi-like binding for org-mode. 
529 In =worf-mode=, it is mapping =[=, =]= as =worf-backward= and =worf-forward= in global, wich
530 cause we cannot input =[= and =]=, so here I unset this mappings. And redifined this two to
531 =M-[= and =M-]=. see this [[https://github.com/abo-abo/worf/issues/19#issuecomment-223756599][issue]]
532
533 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
534
535   (use-package worf
536     :ensure t
537     :commands worf-mode
538     :init (add-hook 'org-mode-hook 'worf-mode)
539     ;; :config
540     ;; (define-key worf-mode-map "[" nil)
541     ;; (define-key worf-mode-map "]" nil)
542     ;; (define-key worf-mode-map (kbd "M-[") 'worf-backward)
543     ;; (define-key worf-mode-map (kbd "M-]") 'worf-forward)
544     )
545
546 #+END_SRC
547
548 ** Get Things Done
549
550 Refer to [[http://doc.norang.ca/org-mode.html][Organize Your Life in Plain Text]]
551 *** basic setup
552
553 standard key binding
554
555 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
556   (global-set-key "\C-cl" 'org-store-link)
557   (global-set-key "\C-ca" 'org-agenda)
558   (global-set-key "\C-cb" 'org-iswitchb)
559 #+END_SRC
560
561 *** Plain List 
562
563 Replace the list bullet =-=, =+=,  with =•=, a litter change based [[https://github.com/howardabrams/dot-files/blob/master/emacs-org.org][here]]
564
565 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
566   ;; (use-package org-mode
567   ;;   :init
568   ;;   (font-lock-add-keywords 'org-mode
569   ;;    '(("^ *\\([-+]\\) "
570   ;;           (0 (prog1 () (compose-region (match-beginning 1) (match-end 1) "•")))))))
571 #+END_SRC
572  
573 *** Todo Keywords
574
575 refer to [[http://coldnew.github.io/coldnew-emacs/#orgheadline94][fancy todo states]], 
576
577 To track TODO state changes, the =!= is to insert a timetamp, =@= is to insert a note with
578 timestamp for the state change.
579
580 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
581     ;; (setq org-todo-keywords
582     ;;        '((sequence "☛ TODO(t)" "|" "✔ DONE(d)")
583     ;;          (sequence "âš‘ WAITING(w)" "|")
584     ;;          (sequence "|" "✘ CANCELLED(c)")))
585   ; (setq org-todo-keyword-faces
586   ;        (quote ("TODO" .  (:foreground "red" :weight bold))
587   ;               ("NEXT" .  (:foreground "blue" :weight bold))
588   ;               ("WAITING" . (:foreground "forest green" :weight bold))
589   ;               ("DONE" .  (:foreground "magenta" :weight bold))
590   ;               ("CANCELLED" . (:foreground "forest green" :weight bold))))
591
592
593   (setq org-todo-keywords
594         (quote ((sequence "TODO(t)" "NEXT(n)" "|" "DONE(d!)")
595                 ;; (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" "PHONE" "MEETING")
596                 (sequence "WAITING(w@/!)" "HOLD(h@/!)" "|" "CANCELLED(c@/!)" ))))
597
598   (setq org-todo-keyword-faces
599         (quote (("TODO" :foreground "red" :weight bold)
600                 ("NEXT" :foreground "blue" :weight bold)
601                 ("DONE" :foreground "forest green" :weight bold)
602                 ("WAITING" :foreground "orange" :weight bold)
603                 ("HOLD" :foreground "magenta" :weight bold)
604                 ("CANCELLED" :foreground "forest green" :weight bold)
605                 ;; ("MEETING" :foreground "forest green" :weight bold)
606                 ;; ("PHONE" :foreground "forest green" :weight bold)
607                 )))
608 #+END_SRC
609
610 Fast todo selections
611
612 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
613   (setq org-use-fast-todo-selection t)
614   (setq org-treat-S-cursor-todo-selection-as-state-change nil)
615 #+END_SRC
616
617 TODO state triggers and tags, [[http://doc.norang.ca/org-mode.html][Organize Your Life in Plain Text]]
618
619 - Moving a task to =CANCELLED=, adds a =CANCELLED= tag
620 - Moving a task to =WAITING=, adds a =WAITING= tag
621 - Moving a task to =HOLD=, add =HOLD= tags
622 - Moving a task to =DONE=, remove =WAITING=, =HOLD= tag
623 - Moving a task to =NEXT=, remove all waiting/hold/cancelled tags
624
625 This tags are used to filter tasks in agenda views
626 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
627   (setq org-todo-state-tags-triggers
628         (quote (("CANCELLED" ("CANCELLED" . t))
629                 ("WAITING" ("WAITING" . t))
630                 ("HOLD" ("WAITING") ("HOLD" . t))
631                 (done ("WAITING") ("HOLD"))
632                 ("TODO" ("WAITING") ("CANCELLED") ("HOLD"))
633                 ("NEXT" ("WAITING") ("CANCELLED") ("HOLD"))
634                 ("DONE" ("WAITING") ("CANCELLED") ("HOLD")))))
635 #+END_SRC
636
637 Logging Stuff 
638 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
639   ;; log time when task done
640   ;; (setq org-log-done (quote time))
641   ;; save clocking into to LOGBOOK
642   (setq org-clock-into-drawer t)
643   ;; save state change notes and time stamp into LOGBOOK drawer
644   (setq org-log-into-drawer t)
645 #+END_SRC
646
647 *** Tags
648 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
649   (setq org-tag-alist (quote ((:startgroup)
650                               ("@office" . ?e)
651                               ("@home" . ?h)
652                               (:endgroup)
653                               ("WAITING" . ?w)
654                               ("HOLD" . ?h)
655                               ("CANCELLED" . ?c))))
656
657   ;; Allow setting single tags without the menu
658   (setq org-fast-tag-selection-single-key (quote expert))
659 #+END_SRC
660
661 *** Capture - Refile - Archive
662
663 Capture lets you quickly store notes with little interruption of your work flow.
664
665 **** Capture Templates
666
667 When a new taks needs to be added, categorize it as 
668
669 All captured file which need next actions are stored in =refile.org=, 
670 - A new task / note (t) =refile.org=
671 - A work task in office =office.org=
672 - A jourenl =diary.org=
673 - A new habit (h) =refile.org=
674
675 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
676   (setq org-directory "~/org")
677   (setq org-default-notes-file "~/org/refile.org")
678   (setq sd/org-diary-file "~/org/diary.org")
679
680   (global-set-key (kbd "C-c c") 'org-capture)
681
682   (setq org-capture-templates
683         (quote (("t" "Todo" entry (file org-default-notes-file)
684                  "* TODO %?\n:LOGBOOK:\n- Added: %U\t\tAt: %a\n:END:")
685                 ("n" "Note" entry (file org-default-notes-file)
686                  "* %? :NOTE:\n:LOGBOOK:\n- Added: %U\t\tAt: %a\n:END:")
687                 ("j" "Journal" entry (file+datetree sd/org-diary-file)
688                  "* %?\n:LOGBOOK:\n:END:" :clock-in t :clock-resume t)
689                 ("h" "Habit" entry (file org-default-notes-file)
690                  "* NEXT %?\n:LOGBOOK:\n%a\nSCHEDULED: %(format-time-string \"%<<%Y-%m-%d %a .+1d/3d>>\")\n:END:\n:PROPERTIES:\n:STYLE: habit\n:REPEAT_TO_STATE: NEXT\n:END:\n "))))
691 #+END_SRC
692
693 **** Refiling Tasks
694
695 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
696   (setq org-refile-targets (quote (;; (nil :maxlevel . 9)
697                                    (org-agenda-files :maxlevel . 9))))
698
699   (setq org-refile-use-outline-path t)
700
701   (setq org-refile-allow-creating-parent-nodes (quote confirm))
702 #+END_SRC
703
704 *** Agenda Setup
705 Setting agenda files and the agenda view
706 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
707   (setq org-agenda-files (quote ("~/org/gtd.org"
708                                  "~/org/work.org")))
709
710   ;; only show today's tasks in agenda view
711   (setq org-agenda-span 'day)
712   ;; Use current windows for agenda view
713   (setq org-agenda-window-setup 'current-window)
714
715   ;; show all feature entries for repeating tasks,
716   ;; this is already setting by default
717   (setq org-agenda-repeating-timestamp-show-all t)
718
719   ;; Show all agenda dates - even if they are empty
720   (setq org-agenda-show-all-dates t)
721 #+END_SRC
722
723
724 ** Export PDF
725
726 Install MacTex-basic and some tex packages
727
728 #+BEGIN_SRC bash 
729
730   sudo tlmgr update --self
731
732   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
733
734 #+END_SRC
735
736 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
737   ;; ;; allow for export=>beamer by placing
738
739   ;; http://emacs-fu.blogspot.com/2011/04/nice-looking-pdfs-with-org-mode-and.html
740   ;; #+LaTeX_CLASS: beamer in org files
741   (unless (boundp 'org-export-latex-classes)
742     (setq org-export-latex-classes nil))
743   (add-to-list 'org-export-latex-classes
744     ;; beamer class, for presentations
745     '("beamer"
746        "\\documentclass[11pt]{beamer}\n
747         \\mode<{{{beamermode}}}>\n
748         \\usetheme{{{{beamertheme}}}}\n
749         \\usecolortheme{{{{beamercolortheme}}}}\n
750         \\beamertemplateballitem\n
751         \\setbeameroption{show notes}
752         \\usepackage[utf8]{inputenc}\n
753         \\usepackage[T1]{fontenc}\n
754         \\usepackage{hyperref}\n
755         \\usepackage{color}
756         \\usepackage{listings}
757         \\lstset{numbers=none,language=[ISO]C++,tabsize=4,
758     frame=single,
759     basicstyle=\\small,
760     showspaces=false,showstringspaces=false,
761     showtabs=false,
762     keywordstyle=\\color{blue}\\bfseries,
763     commentstyle=\\color{red},
764     }\n
765         \\usepackage{verbatim}\n
766         \\institute{{{{beamerinstitute}}}}\n          
767          \\subject{{{{beamersubject}}}}\n"
768
769        ("\\section{%s}" . "\\section*{%s}")
770  
771        ("\\begin{frame}[fragile]\\frametitle{%s}"
772          "\\end{frame}"
773          "\\begin{frame}[fragile]\\frametitle{%s}"
774          "\\end{frame}")))
775
776     ;; letter class, for formal letters
777
778     (add-to-list 'org-export-latex-classes
779
780     '("letter"
781        "\\documentclass[11pt]{letter}\n
782         \\usepackage[utf8]{inputenc}\n
783         \\usepackage[T1]{fontenc}\n
784         \\usepackage{color}"
785  
786        ("\\section{%s}" . "\\section*{%s}")
787        ("\\subsection{%s}" . "\\subsection*{%s}")
788        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
789        ("\\paragraph{%s}" . "\\paragraph*{%s}")
790        ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
791
792
793   (require 'ox-md)
794   (require 'ox-beamer)
795
796   (setq org-latex-pdf-process
797         '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
798           "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
799           "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"))
800
801   (setq TeX-parse-self t)
802
803   (setq TeX-PDF-mode t)
804   (add-hook 'LaTeX-mode-hook
805             (lambda ()
806               (LaTeX-math-mode)
807               (setq TeX-master t)))
808
809 #+END_SRC
810
811 ** others
812
813 extend org-mode's easy templates, refer to [[http://coldnew.github.io/coldnew-emacs/#orgheadline94][Extend org-modes' esay templates]]
814
815 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
816
817   (add-to-list 'org-structure-template-alist
818                '("E" "#+BEGIN_SRC emacs-lisp :tangle yes :results silent\n?\n#+END_SRC"))
819   (add-to-list 'org-structure-template-alist
820                '("S" "#+BEGIN_SRC sh\n?\n#+END_SRC"))
821   (add-to-list 'org-structure-template-alist
822                '("p" "#+BEGIN_SRC plantuml :file uml.png \n?\n#+END_SRC"))
823
824 #+END_SRC
825
826 * Magit
827
828 [[https://github.com/magit/magit][Magit]] is a very cool git interface on Emacs.
829
830 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
831
832   (use-package magit
833     :ensure t
834     :commands magit-status magit-blame)
835
836 #+END_SRC
837
838 * IDO & SMEX
839
840 ** IDO
841
842 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
843
844   (use-package ido
845     :ensure t
846     :init (setq ido-enable-flex-matching t
847                 ido-ignore-extensions t
848                 ido-use-virtual-buffers t
849                 ido-everywhere t)
850     :config
851     (ido-mode 1)
852     (ido-everywhere 1)
853     (add-to-list 'completion-ignored-extensions ".pyc"))
854
855   (icomplete-mode t)
856
857 #+END_SRC
858
859 ** FLX
860
861 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
862
863   (use-package flx-ido
864     :ensure t
865     :init (setq ido-enable-flex-matching t
866                 ido-use-faces nil)
867     :config (flx-ido-mode 1))
868
869 #+END_SRC
870
871 ** IDO-vertically
872
873 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
874
875   (use-package ido-vertical-mode
876     :ensure t
877     :init
878     (setq ido-vertical-define-keys 'C-n-C-p-up-and-down)
879     :config
880     (ido-vertical-mode 1))
881
882 #+END_SRC
883
884 ** SMEX
885
886 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
887
888   (use-package smex
889     :ensure t
890     :init (smex-initialize)
891     :bind
892     ("M-x" . smex)
893     ("M-X" . smex-major-mode-commands))
894
895 #+END_SRC
896
897 ** Ido-ubiquitous
898
899 Use [[https://github.com/DarwinAwardWinner/ido-ubiquitous][ido-ubiquitous]] for ido everywhere. It makes =describe-function= can also use ido
900
901 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
902
903   (use-package ido-ubiquitous
904     :ensure t
905     :init
906     (setq magit-completing-read-function 'magit-ido-completing-read)
907     (setq gnus-completing-read-function 'gnus-ido-completing-read)
908     :config
909     (ido-ubiquitous-mode 1))
910
911 #+END_SRC
912
913 ** Ido-exit-target
914
915 [[https://github.com/waymondo/ido-exit-target][ido-exit-target]] let you open file/buffer on =other-windows= when call =ido-switch-buffer=
916
917 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
918
919   (use-package ido-exit-target
920     :ensure t
921     :init
922     (define-key ido-common-completion-map (kbd "C-j") #'ido-exit-target-split-window-right)
923     (define-key ido-common-completion-map (kbd "C-l") #'ido-exit-target-split-window-below))
924
925 #+END_SRC
926
927 * Key bindings
928
929 ** Remove prefix =ESC=, refer [[http://emacs.stackexchange.com/questions/14755/how-to-remove-bindings-to-the-esc-prefix-key][here]]
930
931 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
932
933   ;; (define-key key-translation-map (kbd "ESC") (kbd "C-g"))
934
935 #+END_SRC
936
937 ** Esc on Minibuffer
938
939 Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
940
941 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
942
943   (define-key minibuffer-local-map [escape] 'keyboard-escape-quit)
944   (define-key minibuffer-local-map [escape]  'keyboard-escape-quit)
945   (define-key minibuffer-local-ns-map [escape]  'keyboard-escape-quit)
946   (define-key minibuffer-local-isearch-map [escape]  'keyboard-escape-quit)
947   (define-key minibuffer-local-completion-map [escape]  'keyboard-escape-quit)
948   (define-key minibuffer-local-must-match-map [escape]  'keyboard-escape-quit)
949   (define-key minibuffer-local-must-match-filename-map [escape]  'keyboard-escape-quit)
950   (define-key minibuffer-local-filename-completion-map [escape]  'keyboard-escape-quit)
951   (define-key minibuffer-local-filename-must-match-map [escape]  'keyboard-escape-quit)
952
953   ;; Also map s-h same as C-g
954   (define-key minibuffer-local-map (kbd "s-h") 'keyboard-escape-quit)
955
956 #+END_SRC
957
958 ** =Ctrl= key bindings
959
960 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
961   ;;
962
963   ;; C-h    help    
964   ;; C-j    newline and indent
965   ;; C-k    kill line
966   ;; C-l    recenter-top-bottom
967   ;; (global-set-key (kbd "C-;") 'ido-switch-buffer)
968   ;; C-;
969   ;; C-'   
970   ;; C-ret  
971
972   ;; C-n    next-line
973   ;; C-m
974   ;; C-,
975   ;; C-.
976   ;; C-/
977
978   ;; C-y
979   ;; C-u
980   ;; C-i
981   ;; C-o
982   ;; C-p
983   ;; C-[
984   ;; C-]
985   ;; C-\
986
987   ;; C-=
988   ;; C--
989   ;; C-0
990   ;; C-9
991   ;; C-8
992   ;; C-7
993
994   ;; C-Space
995
996
997
998
999
1000
1001
1002 #+END_SRC
1003
1004 ** =Super= bindings for file, buffer and windows
1005
1006 Some global bindings on =Super=, on Mac, it is =Command=
1007
1008 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1009
1010   (global-set-key (kbd "s-h") 'keyboard-quit)
1011   (global-set-key (kbd "s-j") 'ido-switch-buffer)
1012   (global-set-key (kbd "s-k") 'ido-find-file)
1013   ;; s-k  -->  kill-this-buffer
1014   (global-set-key (kbd "s-l") (lambda ()
1015                                 (interactive)
1016                                 (if (> (length (window-list)) 1) 
1017                                     (delete-window)
1018                                   (message "Only one Windows now!"))))
1019   ;; s-l  -->  goto-line
1020   (global-set-key (kbd "s-;") 'swiper)
1021   ;; s-;  -->
1022   ;; s-'  -->  'next-multiframe-window
1023   (global-set-key (kbd "<s-return>") 'toggle-frame-fullscreen)
1024
1025   ;; (global-set-key (kbd "s-y") 'projectile-find-file)
1026   (global-set-key (kbd "s-f") 'projectile-find-file)
1027   (global-set-key (kbd "s-[") 'persp-next)
1028   (global-set-key (kbd "s-]") 'persp-prev)
1029
1030   (global-set-key (kbd "s-`") 'mode-line-other-buffer)
1031
1032   (global-set-key (kbd "s-n") 'persp-next)
1033   (global-set-key (kbd "s-p") 'persp-prev)
1034
1035
1036
1037   ;; someothers default mapping on super (command) key
1038   ;; s-s save-buffer
1039   ;; s-k kill-this-buffer
1040
1041
1042   ;; s-h  -->  ns-do-hide-emacs
1043   ;; s-j  -->  ido-switch-buffer  +
1044   ;; s-k  -->  kill-this-buffer
1045   ;; s-l  -->  goto-line
1046   ;; s-;  -->  undefined
1047   ;; s-'  -->  next-multiframe-window
1048   ;; s-ret --> toggle-frame-fullscreen +
1049
1050   ;; s-y  -->  ns-paste-secondary
1051   ;; s-u  -->  revert-buffer
1052   ;; s-i  -->  undefined - but used for iterm globally
1053   ;; s-o  -->  used for emacs globally
1054   ;; s-p  -->  projectile-persp-switch-project  +  
1055   ;; s-[  -->  next-buffer  +    
1056   ;; s-]  -->  previous-buffer +
1057
1058   ;; s-0  -->  undefined
1059   ;; s-9  -->  undefined
1060   ;; s-8  -->  undefined
1061   ;; s-7  -->  undefined
1062   ;; s-6  -->  undefined
1063   ;; s--  -->  center-line
1064   ;; s-=  -->  undefined
1065
1066   ;; s-n  -->  make-frame
1067   ;; s-m  -->  iconify-frame
1068   ;; s-b  -->  undefined
1069   ;; s-,  -->  customize
1070   ;; s-.  -->  undefined
1071   ;; s-/  -->  undefined
1072
1073   ;; s-g  -->  isearch-repeat-forward
1074   ;; s-f  -->  projectile-find-file   +
1075   ;; s-d  -->  isearch-repeat-background
1076   ;; s-s  -->  save-buffer
1077   ;; s-a  -->  make-whole-buffer
1078
1079   ;; s-b  -->  undefined
1080   ;; s-v  -->  yank
1081   ;; s-c  -->  ns-copy-including-secondary
1082
1083   ;; s-t  -->  ns-popup-font-panel
1084   ;; s-r  -->  undefined
1085   ;; s-e  -->  isearch-yanqk-kill
1086   ;; s-w  -->  delete-frame
1087   ;; s-q  -->  same-buffers-kill-emacs
1088
1089   ;; s-`  -->  other-frame
1090 #+END_SRC
1091
1092 ** =M-s= bindings for searching
1093
1094 I use the prefix =M-s= for searching in buffers
1095
1096 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1097
1098   (defun pl-make-keymap (key bindings)
1099     (setq keymap (make-sparse-keymap))
1100     (dolist (binding bindings)
1101       (define-key keymap (car binding) (cdr binding)))
1102     (global-set-key key keymap))
1103
1104   (define-key minibuffer-local-map "\M-s" nil)
1105
1106   (global-set-key (kbd "M-s s") 'isearch-forward-regexp)
1107   (define-key isearch-mode-map "\M-s" 'isearch-repeat-forward)
1108   (global-set-key (kbd "M-s r") 'isearch-backward-regexp)
1109   (define-key isearch-mode-map "\M-r" 'isearch-repeat-backward)
1110
1111   (global-set-key (kbd "s-/") 'isearch-forward-regexp)
1112   (define-key isearch-mode-map (kbd  "s-/") 'isearch-repeat-forward)
1113   (define-key isearch-mode-map (kbd  "C-n") 'isearch-repeat-forward)
1114
1115
1116   (set-face-background 'ido-first-match "white")
1117
1118   ;; M-s o  -->  occur
1119   ;; M-s s  -->  isearch-forward-regexp
1120   ;; M-s r  -->  isearch-backward-regexp
1121   ;; M-s w  -->  isearch-forward-word
1122   ;; M-s .  -->  isearch-forward-symbol-at-point
1123   ;; M-s _  -->  isearch-forward-symbol
1124
1125   ;; highlight bindings
1126   ;; M-s h .  -->  highlight-symbol-at-point
1127   ;; M-s h r  -->  highlight-regexp
1128   ;; M-s h u  -->  unhighlight-regexp
1129   ;; M-s h l  -->  highlight-lines-match-regexp
1130   ;; M-s h p  -->  highlight-phrase
1131   ;; M-s h f  -->  hi-lock-find-patterns
1132
1133   ;; 
1134   ;; (global-set-key (kbd "M-s M-r") 'isearch-backward-regexp)
1135   ;;
1136
1137   ;; M-c
1138   ;; M-r
1139   ;; M-t
1140   ;; M-u, 
1141 #+END_SRC
1142
1143 Occur search key bindings
1144
1145 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1146
1147   (define-key occur-mode-map (kbd "C-n")
1148     (lambda ()
1149       (interactive)
1150       (occur-next)
1151       (occur-mode-goto-occurrence-other-window)
1152       (recenter)
1153       (other-window 1)))
1154
1155   (define-key occur-mode-map (kbd "C-p")
1156     (lambda ()
1157       (interactive)
1158       (occur-prev)
1159       (occur-mode-goto-occurrence-other-window)
1160       (recenter)
1161       (other-window 1)))
1162
1163 #+END_SRC
1164
1165
1166 ** =M-o= as prefix key for windows
1167
1168 ** =M-g= as prefix key for launcher
1169
1170 ** others
1171
1172 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1173
1174
1175   ;; C-'    undefined
1176   ;; C-.    undefined
1177 #+END_SRC
1178
1179 * Eshell
1180
1181 Eshell alias
1182
1183 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1184
1185   (defalias 'e 'ido-find-file)
1186   (defalias 'ff 'ido-find-file)
1187   (defalias 'ee 'ido-find-file-other-window)
1188
1189 #+END_SRC
1190
1191 Quickly start eshll in split window below, refer [[http://www.howardism.org/Technical/Emacs/eshell-fun.html][eshell-here]]
1192
1193 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1194
1195   (defun eshell-x ()
1196     (insert "exit")
1197     (eshell-send-input)
1198     (delete-window))
1199
1200   (defun eshell-here ()
1201     "Opens up a new shell in the directory associated with the
1202   current buffer's file. The eshell is renamed to match that
1203   directory to make multiple eshell windows easier."
1204     (interactive)
1205     (let* ((parent (if (buffer-file-name)
1206                        (file-name-directory (buffer-file-name))
1207                      default-directory))
1208            (height (/ (window-total-height) 3))
1209            (name   (car (last (split-string parent "/" t))))
1210            (eshell-name (concat "*eshell: " name "*")))
1211       (split-window-vertically (- height))
1212       (other-window 1)
1213       (if (get-buffer eshell-name)
1214           (progn
1215             (message "buffer exist")
1216             (switch-to-buffer eshell-name))
1217         (progn
1218           (eshell "new")
1219           (rename-buffer eshell-name)
1220
1221           (insert (concat "ls"))
1222           (eshell-send-input)))))
1223
1224   ;; (global-set-key (kbd "M-`") (lambda ()
1225   ;;                               (interactive)
1226   ;;                               (if (buffer-name))))
1227
1228 #+END_SRC
1229
1230 * Misc Settings
1231
1232 ** [[https://github.com/abo-abo/hydra][Hydra]]
1233
1234 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1235
1236   (use-package hydra
1237     :ensure t)
1238
1239 #+END_SRC
1240
1241 *** Font Zoom
1242
1243 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1244
1245   (defhydra sd/font-zoom (global-map "<f2>")
1246     "zoom"
1247     ("g" text-scale-increase "in")
1248     ("l" text-scale-decrease "out"))
1249
1250 #+END_SRC
1251
1252 *** Windmove Splitter
1253
1254 Refer [[https://github.com/abo-abo/hydra/blob/master/hydra-examples.el][hydra-example]], to enlarge or shrink the windows splitter
1255
1256 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1257
1258   (defun hydra-move-splitter-left (arg)
1259     "Move window splitter left."
1260     (interactive "p")
1261     (if (let ((windmove-wrap-around))
1262           (windmove-find-other-window 'right))
1263         (shrink-window-horizontally arg)
1264       (enlarge-window-horizontally arg)))
1265
1266   (defun hydra-move-splitter-right (arg)
1267     "Move window splitter right."
1268     (interactive "p")
1269     (if (let ((windmove-wrap-around))
1270           (windmove-find-other-window 'right))
1271         (enlarge-window-horizontally arg)
1272       (shrink-window-horizontally arg)))
1273
1274   (defun hydra-move-splitter-up (arg)
1275     "Move window splitter up."
1276     (interactive "p")
1277     (if (let ((windmove-wrap-around))
1278           (windmove-find-other-window 'up))
1279         (enlarge-window arg)
1280       (shrink-window arg)))
1281
1282   (defun hydra-move-splitter-down (arg)
1283     "Move window splitter down."
1284     (interactive "p")
1285     (if (let ((windmove-wrap-around))
1286           (windmove-find-other-window 'up))
1287         (shrink-window arg)
1288       (enlarge-window arg)))
1289
1290 #+END_SRC
1291
1292 *** hydra-window
1293
1294 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1295
1296   (winner-mode 1)
1297
1298   (defhydra sd/hydra-window (:color red :columns nil)
1299     "window"
1300     ("h" windmove-left nil)
1301     ("j" windmove-down nil)
1302     ("k" windmove-up nil)
1303     ("l" windmove-right nil)
1304     ("H" hydra-move-splitter-left nil)
1305     ("J" hydra-move-splitter-down nil)
1306     ("K" hydra-move-splitter-up nil)
1307     ("L" hydra-move-splitter-right nil)
1308     ("v" (lambda ()
1309            (interactive)
1310            (split-window-right)
1311            (windmove-right))
1312      "vert")
1313     ("x" (lambda ()
1314            (interactive)
1315            (split-window-below)
1316            (windmove-down))
1317      "horz")
1318     ("o" delete-other-windows "one" :exit t)
1319     ("a" ace-window "ace")
1320     ("s" ace-swap-window "swap")
1321     ("d" ace-delete-window "ace-one" :exit t)
1322     ("i" ace-maximize-window "ace-one" :exit t)
1323     ("b" ido-switch-buffer "buf")
1324     ("m" headlong-bookmark-jump "bmk")
1325     ("q" nil "cancel")
1326     ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
1327     ("r" (progn (winner-redo) (setq this-command 'winner-redo)) "redo")
1328     ("f" nil))
1329
1330   (global-unset-key (kbd "M-o"))
1331   (global-set-key (kbd "M-o") 'sd/hydra-window/body)
1332
1333   (defun triggle-windows-max-size ()
1334     (interactive)
1335     (if (> (length (window-list)) 1)
1336         (delete-other-windows)
1337       (winner-undo)))
1338
1339 #+END_SRC
1340
1341 ** Line Number
1342
1343 Enable linum mode on programming modes
1344
1345 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1346
1347   (add-hook 'prog-mode-hook 'linum-mode)
1348
1349 #+END_SRC
1350
1351 Fix the font size of line number
1352
1353 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1354
1355   (defun fix-linum-size ()
1356        (interactive)
1357        (set-face-attribute 'linum nil :height 110))
1358
1359   (add-hook 'linum-mode-hook 'fix-linum-size)
1360
1361 #+END_SRC
1362
1363 I like [[https://github.com/coldnew/linum-relative][linum-relative]], just like the =set relativenumber= on =vim=
1364
1365 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1366
1367   (use-package linum-relative
1368     :ensure t
1369     :config
1370     (defun linum-new-mode ()
1371       "If line numbers aren't displayed, then display them.
1372   Otherwise, toggle between absolute and relative numbers."
1373       (interactive)
1374       (if linum-mode
1375           (linum-relative-toggle)
1376         (linum-mode 1)))
1377
1378     :bind
1379     ("A-k" . linum-new-mode))
1380
1381   ;; auto enable linum-new-mode in programming modes
1382   (add-hook 'prog-mode-hook 'linum-relative-mode)
1383
1384 #+END_SRC
1385
1386 ** Save File Position
1387
1388 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1389
1390   (require 'saveplace)
1391   (setq-default save-place t)
1392   (setq save-place-forget-unreadable-files t)
1393   (setq save-place-skip-check-regexp "\\`/\\(?:cdrom\\|floppy\\|mnt\\|/[0-9]\\|\\(?:[^@/:]*@\\)?[^@/:]*[^@/:.]:\\)")
1394
1395 #+END_SRC
1396
1397 ** Multi-term
1398
1399 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1400
1401   (use-package multi-term
1402     :ensure t)
1403
1404 #+END_SRC
1405
1406 ** ace-link
1407
1408 [[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
1409 Type =o= to go to the link
1410
1411 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1412
1413   (use-package ace-link
1414     :ensure t
1415     :init
1416     (ace-link-setup-default))
1417
1418 #+END_SRC
1419
1420 ** Emux
1421
1422 [[https://github.com/re5et/emux][emux]] is 
1423
1424 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1425
1426   (el-get-bundle re5et/emux)
1427
1428 #+END_SRC
1429
1430 ** Smart Parens
1431
1432 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1433
1434   (use-package smartparens
1435     :ensure t
1436     :config
1437     (progn
1438       (require 'smartparens-config)
1439       (add-hook 'prog-mode-hook 'smartparens-mode)))
1440
1441 #+END_SRC
1442
1443 ** Ace-Windows
1444
1445 [[https://github.com/abo-abo/ace-window][ace-window]] 
1446
1447 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1448
1449   (use-package ace-window
1450     :ensure t
1451     :defer t
1452   ;  :init
1453   ;  (global-set-key (kbd "M-o") 'ace-window)
1454     :config
1455     (setq aw-keys '(?a ?s ?d ?f ?j ?k ?l)))
1456
1457 #+END_SRC
1458
1459 ** Projectile
1460
1461 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1462
1463   (use-package projectile
1464     :ensure t
1465     :init
1466     (setq projectile-enable-caching t)
1467     :config
1468     (projectile-global-mode t))
1469
1470   (use-package persp-projectile
1471     :ensure t
1472     :config
1473     (persp-mode)
1474     :bind
1475     (:map projectile-mode-map
1476           ("s-t" . projectile-persp-switch-project)))
1477
1478   ;; projectile-find-file
1479   ;; projectile-switch-buffer
1480   ;; projectile-find-file-other-window
1481 #+END_SRC
1482
1483 ** Which key
1484
1485 [[https://github.com/justbur/emacs-which-key][which-key]] show the key bindings 
1486
1487 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1488
1489   (use-package which-key
1490     :ensure t
1491     :config
1492     (which-key-mode))
1493
1494 #+END_SRC
1495
1496 ** Emms
1497
1498 We can use [[https://www.gnu.org/software/emms/quickstart.html][Emms]] for multimedia in Emacs
1499
1500 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1501
1502   (use-package emms
1503     :ensure t
1504     :init
1505     (setq emms-source-file-default-directory "~/Music/emms/")
1506     :config
1507     (emms-standard)
1508     (emms-default-players)
1509     (define-emms-simple-player mplayer '(file url)
1510       (regexp-opt '(".ogg" ".mp3" ".mgp" ".wav" ".wmv" ".wma" ".ape"
1511                     ".mov" ".avi" ".ogm" ".asf" ".mkv" ".divx" ".mpeg"
1512                     "http://" "mms://" ".rm" ".rmvb" ".mp4" ".flac" ".vob"
1513                     ".m4a" ".flv" ".ogv" ".pls"))
1514       "mplayer" "-slave" "-quiet" "-really-quiet" "-fullscreen")
1515     (emms-history-load))
1516
1517 #+END_SRC
1518
1519 ** GnoGo
1520
1521 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
1522
1523 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1524
1525   (use-package gnugo
1526     :ensure t
1527     :defer t
1528     :init
1529     (require 'gnugo-imgen)
1530     (setq gnugo-xpms 'gnugo-imgen-create-xpms)
1531     (add-hook 'gnugo-start-game-hook '(lambda ()
1532                                         (gnugo-image-display-mode)
1533                                         (gnugo-grid-mode)))
1534       :config
1535     (add-to-list 'gnugo-option-history (format "--boardsize 19 --color black --level 1")))
1536
1537 #+END_SRC
1538
1539 ** undo-tree
1540
1541 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1542
1543   (use-package undo-tree
1544     :ensure t
1545     :config
1546     (global-undo-tree-mode 1))
1547
1548 #+END_SRC
1549
1550 ** swiper
1551
1552 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1553
1554   (use-package swiper
1555     :ensure t)
1556
1557
1558   (ivy-mode 1)
1559   (setq ivy-use-virtual-buffers t)
1560   ;; (global-set-key "\C-s" 'swiper)
1561   ;; (global-set-key (kbd "C-c C-r") 'ivy-resume)
1562   ;; (global-set-key (kbd "<f6>") 'ivy-resume)
1563   ;; ;; (global-set-key (kbd "M-x") 'counsel-M-x)
1564   ;; ;; (global-set-key (kbd "C-x C-f") 'counsel-find-file)
1565   ;; (global-set-key (kbd "<f1> f") 'counsel-describe-function)
1566   ;; (global-set-key (kbd "<f1> v") 'counsel-describe-variable)
1567   ;; (global-set-key (kbd "<f1> l") 'counsel-load-library)
1568   ;; (global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
1569   ;; (global-set-key (kbd "<f2> u") 'counsel-unicode-char)
1570   ;; (global-set-key (kbd "C-c g") 'counsel-git)
1571   ;; (global-set-key (kbd "C-c j") 'counsel-git-grep)
1572   ;; (global-set-key (kbd "C-c k") 'counsel-ag)
1573   ;; (global-set-key (kbd "C-x l") 'counsel-locate)
1574   ;; (global-set-key (kbd "C-S-o") 'counsel-rhythmbox)
1575   ;; ;; (define-key read-expression-map (kbd "C-r") 'counsel-expression-history)
1576
1577 #+END_SRC
1578
1579 ** Tabbar
1580
1581 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1582
1583   ;; (use-package tabbar-ruler
1584   ;;   :ensure t
1585   ;;   :init
1586   ;;   (setq tabbar-ruler-global-tabbar t)
1587   ;;   (setq tabbar-ruler-global-ruler t)
1588   ;;   (setq tabbar-ruler-popu-menu t)
1589   ;;   (setq tabbar-ruler-popu-toolbar t)
1590   ;;   (setq tabbar-use-images t)
1591   ;;   :config
1592   ;;   (tabbar-ruler-group-by-projectile-project)
1593   ;;   (global-set-key (kbd "s-1") 'tabbar-forward-group)
1594   ;;   (global-set-key (kbd "s-2") 'tabbar-ruler-forward))
1595
1596 #+END_SRC
1597
1598 * Programming
1599
1600 ** Languages
1601
1602 *** Emacs Lisp
1603
1604 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1605
1606   (use-package color-identifiers-mode
1607     :ensure t
1608     :init
1609     (add-hook 'emacs-lisp-mode-hook 'color-identifiers-mode)
1610
1611     :diminish color-identifiers-mode)
1612
1613   (global-prettify-symbols-mode t)
1614
1615 #+END_SRC
1616
1617 **** Lispy Mode
1618
1619 In Lisp Mode, =M-o= is defined, but I use this for global hydra window. So here disable this key
1620 bindings in =lispy-mode-map= after loaded. see [[http://stackoverflow.com/questions/298048/how-to-handle-conflicting-keybindings][here]]
1621
1622 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1623
1624   (use-package lispy
1625     :ensure t
1626     :init
1627     (eval-after-load 'lispy
1628       '(progn
1629          (define-key lispy-mode-map (kbd "M-o") nil)))
1630     :config
1631     (add-hook 'emacs-lisp-mode-hook (lambda () (lispy-mode 1))))
1632
1633 #+END_SRC
1634
1635 *** Perl
1636
1637 [[https://www.emacswiki.org/emacs/CPerlMode][CPerl mode]] has more features than =PerlMode= for perl programming. Alias this to =CPerlMode=
1638
1639 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1640
1641   (defalias 'perl-mode 'cperl-mode)
1642
1643   ;(setq cperl-hairy t) ;; Turns on most of the CPerlMode options
1644   (setq cperl-auto-newline t)
1645   (setq cperl-highlight-variables-indiscriminately t)
1646   ;(setq cperl-indent-level 4)
1647   ;(setq cperl-continued-statement-offset 4)
1648   (setq cperl-close-paren-offset -4)
1649   (setq cperl-indent-parents-as-block t)
1650   (setq cperl-tab-always-indent t)
1651   ;(setq cperl-brace-offset  0)
1652
1653   (add-hook 'cperl-mode-hook
1654             '(lambda ()
1655                (cperl-set-style "C++")))
1656
1657   ;(require 'template)
1658   ;(template-initialize)
1659   ;(require 'perlnow)
1660
1661 #+END_SRC
1662
1663 - auto insert
1664 - run script 
1665
1666 Change the compile-command to set the default command run when call =compile=
1667 Mapping =s-r= (on Mac, it's =Command + R= to run the script. Here =current-prefix-arg= is set
1668 to call =compilation=  interactively.
1669
1670 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1671
1672   (defun my-perl-hook ()
1673     (progn
1674       (setq-local compilation-read-command nil)
1675       (set (make-local-variable 'compile-command)
1676            (concat "/usr/bin/perl "
1677                    (if buffer-file-name
1678                        (shell-quote-argument buffer-file-name))))
1679       (local-set-key (kbd "s-r")
1680                        (lambda ()
1681                          (interactive)
1682   ;                       (setq current-prefix-arg '(4)) ; C-u
1683                          (call-interactively 'compile)))))
1684
1685   (add-hook 'cperl-mode-hook 'my-perl-hook)
1686
1687
1688 #+END_SRC
1689
1690 *** C & C++
1691
1692 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1693
1694   (setq c-default-style "stroustrup"
1695         c-basic-offset 4)
1696
1697 #+END_SRC
1698
1699 ** Compile
1700
1701 Set the environments vairables in compilation mode
1702
1703 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1704
1705   (use-package compile
1706     :commands compile
1707     :config
1708     (setq compilation-environment (cons "LC_ALL=C" compilation-environment)))
1709
1710 #+END_SRC
1711
1712 ** Auto-Insert
1713
1714 Enable auto-insert mode
1715
1716 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1717
1718   (auto-insert-mode t)
1719   (setq auto-insert-query nil)
1720
1721 #+END_SRC
1722
1723 *** C++ Auto Insert
1724
1725 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1726
1727   (eval-after-load 'autoinsert
1728     '(define-auto-insert '("\\.cpp\\'" . "C++ skeleton")
1729        '(
1730          "Short description:"
1731          "/*"
1732          "\n * " (file-name-nondirectory (buffer-file-name))
1733          "\n */" > \n \n
1734          "#include <iostream>" \n
1735          "#include \""
1736          (file-name-sans-extension
1737           (file-name-nondirectory (buffer-file-name)))
1738          ".hpp\"" \n \n
1739          "using namespace std;" \n \n
1740          "int main ()"
1741          "\n{" \n 
1742          > _ \n
1743          "return 1;"
1744          "\n}" > \n
1745          )))
1746
1747   (eval-after-load 'autoinsert
1748     '(define-auto-insert '("\\.c\\'" . "C skeleton")
1749        '(
1750          "Short description:"
1751          "/*\n"
1752          " * " (file-name-nondirectory (buffer-file-name)) "\n"
1753          " */" > \n \n
1754          "#include <stdio.h>" \n
1755          "#include \""
1756          (file-name-sans-extension
1757           (file-name-nondirectory (buffer-file-name)))
1758          ".h\"" \n \n
1759          "int main ()\n"
1760          "{" \n
1761          > _ \n
1762          "return 1;\n"
1763          "}" > \n
1764          )))
1765        
1766 #+END_SRC
1767
1768 *** Perl Auto Insert
1769
1770 Refer [[https://www.emacswiki.org/emacs/AutoInsertMode][AutoInsertMode]] Wiki
1771
1772 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1773
1774   (eval-after-load 'autoinsert
1775     '(define-auto-insert '("\\.pl\\'" . "Perl skeleton")
1776        '(
1777          "Description: "
1778          "#!/usr/bin/perl -w" \n
1779          \n
1780          "use strict;" \n \n
1781          )))
1782
1783 #+END_SRC
1784
1785 ** Completion
1786
1787 company mode
1788
1789 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1790
1791   (use-package company
1792     :ensure t
1793     :diminish company-mode
1794     :init (setq company-idle-delay 0.1)
1795     :config
1796     (global-company-mode))
1797
1798 #+END_SRC
1799
1800 [[https://github.com/company-mode/company-statistics][company-statistics]]
1801
1802 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1803
1804   (use-package company-statistics
1805     :ensure t
1806     :config
1807     (company-statistics-mode))
1808
1809 #+END_SRC
1810
1811 * Todo 
1812
1813 - change M-o to trigger to delete other windows and restore previous config
1814