b40e40e7b75c02db65dd8aff8534344ba1aa4b6b
[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 ** Export PDF
724
725 Install MacTex-basic and some tex packages
726
727 #+BEGIN_SRC bash 
728
729   sudo tlmgr update --self
730
731   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
732
733 #+END_SRC
734
735 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
736   ;; ;; allow for export=>beamer by placing
737
738   ;; http://emacs-fu.blogspot.com/2011/04/nice-looking-pdfs-with-org-mode-and.html
739   ;; #+LaTeX_CLASS: beamer in org files
740   (unless (boundp 'org-export-latex-classes)
741     (setq org-export-latex-classes nil))
742   (add-to-list 'org-export-latex-classes
743     ;; beamer class, for presentations
744     '("beamer"
745        "\\documentclass[11pt]{beamer}\n
746         \\mode<{{{beamermode}}}>\n
747         \\usetheme{{{{beamertheme}}}}\n
748         \\usecolortheme{{{{beamercolortheme}}}}\n
749         \\beamertemplateballitem\n
750         \\setbeameroption{show notes}
751         \\usepackage[utf8]{inputenc}\n
752         \\usepackage[T1]{fontenc}\n
753         \\usepackage{hyperref}\n
754         \\usepackage{color}
755         \\usepackage{listings}
756         \\lstset{numbers=none,language=[ISO]C++,tabsize=4,
757     frame=single,
758     basicstyle=\\small,
759     showspaces=false,showstringspaces=false,
760     showtabs=false,
761     keywordstyle=\\color{blue}\\bfseries,
762     commentstyle=\\color{red},
763     }\n
764         \\usepackage{verbatim}\n
765         \\institute{{{{beamerinstitute}}}}\n          
766          \\subject{{{{beamersubject}}}}\n"
767
768        ("\\section{%s}" . "\\section*{%s}")
769  
770        ("\\begin{frame}[fragile]\\frametitle{%s}"
771          "\\end{frame}"
772          "\\begin{frame}[fragile]\\frametitle{%s}"
773          "\\end{frame}")))
774
775     ;; letter class, for formal letters
776
777     (add-to-list 'org-export-latex-classes
778
779     '("letter"
780        "\\documentclass[11pt]{letter}\n
781         \\usepackage[utf8]{inputenc}\n
782         \\usepackage[T1]{fontenc}\n
783         \\usepackage{color}"
784  
785        ("\\section{%s}" . "\\section*{%s}")
786        ("\\subsection{%s}" . "\\subsection*{%s}")
787        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
788        ("\\paragraph{%s}" . "\\paragraph*{%s}")
789        ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
790
791
792   (require 'ox-md)
793   (require 'ox-beamer)
794
795   (setq org-latex-pdf-process
796         '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
797           "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
798           "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"))
799
800   (setq TeX-parse-self t)
801
802   (setq TeX-PDF-mode t)
803   (add-hook 'LaTeX-mode-hook
804             (lambda ()
805               (LaTeX-math-mode)
806               (setq TeX-master t)))
807
808 #+END_SRC
809
810 ** others
811
812 extend org-mode's easy templates, refer to [[http://coldnew.github.io/coldnew-emacs/#orgheadline94][Extend org-modes' esay templates]]
813
814 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
815
816   (add-to-list 'org-structure-template-alist
817                '("E" "#+BEGIN_SRC emacs-lisp :tangle yes :results silent\n?\n#+END_SRC"))
818   (add-to-list 'org-structure-template-alist
819                '("S" "#+BEGIN_SRC sh\n?\n#+END_SRC"))
820   (add-to-list 'org-structure-template-alist
821                '("p" "#+BEGIN_SRC plantuml :file uml.png \n?\n#+END_SRC"))
822
823 #+END_SRC
824
825 * Magit
826
827 [[https://github.com/magit/magit][Magit]] is a very cool git interface on Emacs.
828
829 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
830
831   (use-package magit
832     :ensure t
833     :commands magit-status magit-blame)
834
835 #+END_SRC
836
837 * IDO & SMEX
838
839 ** IDO
840
841 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
842
843   (use-package ido
844     :ensure t
845     :init (setq ido-enable-flex-matching t
846                 ido-ignore-extensions t
847                 ido-use-virtual-buffers t
848                 ido-everywhere t)
849     :config
850     (ido-mode 1)
851     (ido-everywhere 1)
852     (add-to-list 'completion-ignored-extensions ".pyc"))
853
854   (icomplete-mode t)
855
856 #+END_SRC
857
858 ** FLX
859
860 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
861
862   (use-package flx-ido
863     :ensure t
864     :init (setq ido-enable-flex-matching t
865                 ido-use-faces nil)
866     :config (flx-ido-mode 1))
867
868 #+END_SRC
869
870 ** IDO-vertically
871
872 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
873
874   (use-package ido-vertical-mode
875     :ensure t
876     :init
877     (setq ido-vertical-define-keys 'C-n-C-p-up-and-down)
878     :config
879     (ido-vertical-mode 1))
880
881 #+END_SRC
882
883 ** SMEX
884
885 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
886
887   (use-package smex
888     :ensure t
889     :init (smex-initialize)
890     :bind
891     ("M-x" . smex)
892     ("M-X" . smex-major-mode-commands))
893
894 #+END_SRC
895
896 ** Ido-ubiquitous
897
898 Use [[https://github.com/DarwinAwardWinner/ido-ubiquitous][ido-ubiquitous]] for ido everywhere. It makes =describe-function= can also use ido
899
900 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
901
902   (use-package ido-ubiquitous
903     :ensure t
904     :init
905     (setq magit-completing-read-function 'magit-ido-completing-read)
906     (setq gnus-completing-read-function 'gnus-ido-completing-read)
907     :config
908     (ido-ubiquitous-mode 1))
909
910 #+END_SRC
911
912 ** Ido-exit-target
913
914 [[https://github.com/waymondo/ido-exit-target][ido-exit-target]] let you open file/buffer on =other-windows= when call =ido-switch-buffer=
915
916 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
917
918   (use-package ido-exit-target
919     :ensure t
920     :init
921     (define-key ido-common-completion-map (kbd "C-j") #'ido-exit-target-split-window-right)
922     (define-key ido-common-completion-map (kbd "C-l") #'ido-exit-target-split-window-below))
923
924 #+END_SRC
925
926 * Key bindings
927
928 ** Remove prefix =ESC=, refer [[http://emacs.stackexchange.com/questions/14755/how-to-remove-bindings-to-the-esc-prefix-key][here]]
929
930 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
931
932   ;; (define-key key-translation-map (kbd "ESC") (kbd "C-g"))
933
934 #+END_SRC
935
936 ** Esc on Minibuffer
937
938 Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
939
940 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
941
942   (define-key minibuffer-local-map [escape] 'keyboard-escape-quit)
943   (define-key minibuffer-local-map [escape]  'keyboard-escape-quit)
944   (define-key minibuffer-local-ns-map [escape]  'keyboard-escape-quit)
945   (define-key minibuffer-local-isearch-map [escape]  'keyboard-escape-quit)
946   (define-key minibuffer-local-completion-map [escape]  'keyboard-escape-quit)
947   (define-key minibuffer-local-must-match-map [escape]  'keyboard-escape-quit)
948   (define-key minibuffer-local-must-match-filename-map [escape]  'keyboard-escape-quit)
949   (define-key minibuffer-local-filename-completion-map [escape]  'keyboard-escape-quit)
950   (define-key minibuffer-local-filename-must-match-map [escape]  'keyboard-escape-quit)
951
952   ;; Also map s-h same as C-g
953   (define-key minibuffer-local-map (kbd "s-h") 'keyboard-escape-quit)
954
955 #+END_SRC
956
957 ** =Ctrl= key bindings
958
959 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
960   ;;
961
962   ;; C-h    help    
963   ;; C-j    newline and indent
964   ;; C-k    kill line
965   ;; C-l    recenter-top-bottom
966   ;; (global-set-key (kbd "C-;") 'ido-switch-buffer)
967   ;; C-;
968   ;; C-'   
969   ;; C-ret  
970
971   ;; C-n    next-line
972   ;; C-m
973   ;; C-,
974   ;; C-.
975   ;; C-/
976
977   ;; C-y
978   ;; C-u
979   ;; C-i
980   ;; C-o
981   ;; C-p
982   ;; C-[
983   ;; C-]
984   ;; C-\
985
986   ;; C-=
987   ;; C--
988   ;; C-0
989   ;; C-9
990   ;; C-8
991   ;; C-7
992
993   ;; C-Space
994
995
996
997
998
999
1000
1001 #+END_SRC
1002
1003 ** =Super= bindings for file, buffer and windows
1004
1005 Some global bindings on =Super=, on Mac, it is =Command=
1006
1007 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1008
1009   (global-set-key (kbd "s-h") 'keyboard-quit)
1010   (global-set-key (kbd "s-j") 'ido-switch-buffer)
1011   (global-set-key (kbd "s-k") 'ido-find-file)
1012   ;; s-k  -->  kill-this-buffer
1013   (global-set-key (kbd "s-l") (lambda ()
1014                                 (interactive)
1015                                 (if (> (length (window-list)) 1) 
1016                                     (delete-window)
1017                                   (message "Only one Windows now!"))))
1018   ;; s-l  -->  goto-line
1019   (global-set-key (kbd "s-;") 'swiper)
1020   ;; s-;  -->
1021   ;; s-'  -->  'next-multiframe-window
1022   (global-set-key (kbd "<s-return>") 'toggle-frame-fullscreen)
1023
1024   ;; (global-set-key (kbd "s-y") 'projectile-find-file)
1025   (global-set-key (kbd "s-f") 'projectile-find-file)
1026   (global-set-key (kbd "s-[") 'persp-next)
1027   (global-set-key (kbd "s-]") 'persp-prev)
1028
1029   (global-set-key (kbd "s-`") 'mode-line-other-buffer)
1030
1031   (global-set-key (kbd "s-n") 'persp-next)
1032   (global-set-key (kbd "s-p") 'persp-prev)
1033
1034
1035
1036   ;; someothers default mapping on super (command) key
1037   ;; s-s save-buffer
1038   ;; s-k kill-this-buffer
1039
1040
1041   ;; s-h  -->  ns-do-hide-emacs
1042   ;; s-j  -->  ido-switch-buffer  +
1043   ;; s-k  -->  kill-this-buffer
1044   ;; s-l  -->  goto-line
1045   ;; s-;  -->  undefined
1046   ;; s-'  -->  next-multiframe-window
1047   ;; s-ret --> toggle-frame-fullscreen +
1048
1049   ;; s-y  -->  ns-paste-secondary
1050   ;; s-u  -->  revert-buffer
1051   ;; s-i  -->  undefined - but used for iterm globally
1052   ;; s-o  -->  used for emacs globally
1053   ;; s-p  -->  projectile-persp-switch-project  +  
1054   ;; s-[  -->  next-buffer  +    
1055   ;; s-]  -->  previous-buffer +
1056
1057   ;; s-0  -->  undefined
1058   ;; s-9  -->  undefined
1059   ;; s-8  -->  undefined
1060   ;; s-7  -->  undefined
1061   ;; s-6  -->  undefined
1062   ;; s--  -->  center-line
1063   ;; s-=  -->  undefined
1064
1065   ;; s-n  -->  make-frame
1066   ;; s-m  -->  iconify-frame
1067   ;; s-b  -->  undefined
1068   ;; s-,  -->  customize
1069   ;; s-.  -->  undefined
1070   ;; s-/  -->  undefined
1071
1072   ;; s-g  -->  isearch-repeat-forward
1073   ;; s-f  -->  projectile-find-file   +
1074   ;; s-d  -->  isearch-repeat-background
1075   ;; s-s  -->  save-buffer
1076   ;; s-a  -->  make-whole-buffer
1077
1078   ;; s-b  -->  undefined
1079   ;; s-v  -->  yank
1080   ;; s-c  -->  ns-copy-including-secondary
1081
1082   ;; s-t  -->  ns-popup-font-panel
1083   ;; s-r  -->  undefined
1084   ;; s-e  -->  isearch-yanqk-kill
1085   ;; s-w  -->  delete-frame
1086   ;; s-q  -->  same-buffers-kill-emacs
1087
1088   ;; s-`  -->  other-frame
1089 #+END_SRC
1090
1091 ** =M-s= bindings for searching
1092
1093 I use the prefix =M-s= for searching in buffers
1094
1095 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1096
1097   (defun pl-make-keymap (key bindings)
1098     (setq keymap (make-sparse-keymap))
1099     (dolist (binding bindings)
1100       (define-key keymap (car binding) (cdr binding)))
1101     (global-set-key key keymap))
1102
1103   (define-key minibuffer-local-map "\M-s" nil)
1104
1105   (global-set-key (kbd "M-s s") 'isearch-forward-regexp)
1106   (define-key isearch-mode-map "\M-s" 'isearch-repeat-forward)
1107   (global-set-key (kbd "M-s r") 'isearch-backward-regexp)
1108   (define-key isearch-mode-map "\M-r" 'isearch-repeat-backward)
1109
1110   (global-set-key (kbd "s-/") 'isearch-forward-regexp)
1111   (define-key isearch-mode-map (kbd  "s-/") 'isearch-repeat-forward)
1112   (define-key isearch-mode-map (kbd  "C-n") 'isearch-repeat-forward)
1113
1114
1115   (set-face-background 'ido-first-match "white")
1116
1117   ;; M-s o  -->  occur
1118   ;; M-s s  -->  isearch-forward-regexp
1119   ;; M-s r  -->  isearch-backward-regexp
1120   ;; M-s w  -->  isearch-forward-word
1121   ;; M-s .  -->  isearch-forward-symbol-at-point
1122   ;; M-s _  -->  isearch-forward-symbol
1123
1124   ;; highlight bindings
1125   ;; M-s h .  -->  highlight-symbol-at-point
1126   ;; M-s h r  -->  highlight-regexp
1127   ;; M-s h u  -->  unhighlight-regexp
1128   ;; M-s h l  -->  highlight-lines-match-regexp
1129   ;; M-s h p  -->  highlight-phrase
1130   ;; M-s h f  -->  hi-lock-find-patterns
1131
1132   ;; 
1133   ;; (global-set-key (kbd "M-s M-r") 'isearch-backward-regexp)
1134   ;;
1135
1136   ;; M-c
1137   ;; M-r
1138   ;; M-t
1139   ;; M-u, 
1140 #+END_SRC
1141
1142 Occur search key bindings
1143
1144 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1145
1146   (define-key occur-mode-map (kbd "C-n")
1147     (lambda ()
1148       (interactive)
1149       (occur-next)
1150       (occur-mode-goto-occurrence-other-window)
1151       (recenter)
1152       (other-window 1)))
1153
1154   (define-key occur-mode-map (kbd "C-p")
1155     (lambda ()
1156       (interactive)
1157       (occur-prev)
1158       (occur-mode-goto-occurrence-other-window)
1159       (recenter)
1160       (other-window 1)))
1161
1162 #+END_SRC
1163
1164
1165 ** =M-o= as prefix key for windows
1166
1167 ** =M-g= as prefix key for launcher
1168
1169 ** others
1170
1171 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1172
1173
1174   ;; C-'    undefined
1175   ;; C-.    undefined
1176 #+END_SRC
1177
1178 * Eshell
1179
1180 Eshell alias
1181
1182 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1183
1184   (defalias 'e 'ido-find-file)
1185   (defalias 'ff 'ido-find-file)
1186   (defalias 'ee 'ido-find-file-other-window)
1187
1188 #+END_SRC
1189
1190 Quickly start eshll in split window below, refer [[http://www.howardism.org/Technical/Emacs/eshell-fun.html][eshell-here]]
1191
1192 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1193   (defun eshell-x ()
1194     (insert "exit")
1195     (eshell-send-input)
1196     (delete-window))
1197
1198   (defun eshell-here ()
1199     "Opens up a new shell in the directory associated with the
1200   current buffer's file. The eshell is renamed to match that
1201   directory to make multiple eshell windows easier."
1202     (interactive)
1203     (let* ((parent (if (buffer-file-name)
1204                        (file-name-directory (buffer-file-name))
1205                      default-directory))
1206            (height (/ (window-total-height) 3))
1207            (name   (car (last (split-string parent "/" t))))
1208            (eshell-name (concat "*eshell: " name "*")))
1209       (split-window-vertically (- height))
1210       (other-window 1)
1211       (if (get-buffer eshell-name)
1212           (progn
1213             (message "buffer exist")
1214             (switch-to-buffer eshell-name))
1215         (progn
1216           (eshell "new")
1217           (rename-buffer eshell-name)
1218
1219           (insert (concat "ls"))
1220           (eshell-send-input)))))
1221
1222   ;; (global-set-key (kbd "M-`") (lambda ()
1223   ;;                               (interactive)
1224   ;;                               (if (buffer-name))))
1225 #+END_SRC
1226
1227 * Misc Settings
1228
1229 ** [[https://github.com/abo-abo/hydra][Hydra]]
1230
1231 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1232
1233   (use-package hydra
1234     :ensure t)
1235
1236 #+END_SRC
1237
1238 *** Font Zoom
1239
1240 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1241
1242   (defhydra sd/font-zoom (global-map "<f2>")
1243     "zoom"
1244     ("g" text-scale-increase "in")
1245     ("l" text-scale-decrease "out"))
1246
1247 #+END_SRC
1248
1249 *** Windmove Splitter
1250
1251 Refer [[https://github.com/abo-abo/hydra/blob/master/hydra-examples.el][hydra-example]], to enlarge or shrink the windows splitter
1252
1253 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1254
1255   (defun hydra-move-splitter-left (arg)
1256     "Move window splitter left."
1257     (interactive "p")
1258     (if (let ((windmove-wrap-around))
1259           (windmove-find-other-window 'right))
1260         (shrink-window-horizontally arg)
1261       (enlarge-window-horizontally arg)))
1262
1263   (defun hydra-move-splitter-right (arg)
1264     "Move window splitter right."
1265     (interactive "p")
1266     (if (let ((windmove-wrap-around))
1267           (windmove-find-other-window 'right))
1268         (enlarge-window-horizontally arg)
1269       (shrink-window-horizontally arg)))
1270
1271   (defun hydra-move-splitter-up (arg)
1272     "Move window splitter up."
1273     (interactive "p")
1274     (if (let ((windmove-wrap-around))
1275           (windmove-find-other-window 'up))
1276         (enlarge-window arg)
1277       (shrink-window arg)))
1278
1279   (defun hydra-move-splitter-down (arg)
1280     "Move window splitter down."
1281     (interactive "p")
1282     (if (let ((windmove-wrap-around))
1283           (windmove-find-other-window 'up))
1284         (shrink-window arg)
1285       (enlarge-window arg)))
1286
1287 #+END_SRC
1288
1289 *** hydra-window
1290
1291 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1292
1293   (winner-mode 1)
1294
1295   (defhydra sd/hydra-window (:color red :columns nil)
1296     "window"
1297     ("h" windmove-left nil)
1298     ("j" windmove-down nil)
1299     ("k" windmove-up nil)
1300     ("l" windmove-right nil)
1301     ("H" hydra-move-splitter-left nil)
1302     ("J" hydra-move-splitter-down nil)
1303     ("K" hydra-move-splitter-up nil)
1304     ("L" hydra-move-splitter-right nil)
1305     ("v" (lambda ()
1306            (interactive)
1307            (split-window-right)
1308            (windmove-right))
1309      "vert")
1310     ("x" (lambda ()
1311            (interactive)
1312            (split-window-below)
1313            (windmove-down))
1314      "horz")
1315     ("o" delete-other-windows "one" :exit t)
1316     ("a" ace-window "ace")
1317     ("s" ace-swap-window "swap")
1318     ("d" ace-delete-window "ace-one" :exit t)
1319     ("i" ace-maximize-window "ace-one" :exit t)
1320     ("b" ido-switch-buffer "buf")
1321     ("m" headlong-bookmark-jump "bmk")
1322     ("q" nil "cancel")
1323     ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
1324     ("r" (progn (winner-redo) (setq this-command 'winner-redo)) "redo")
1325     ("f" nil))
1326
1327   (global-unset-key (kbd "M-o"))
1328   (global-set-key (kbd "M-o") 'sd/hydra-window/body)
1329
1330   (defun triggle-windows-max-size ()
1331     (interactive)
1332     (if (> (length (window-list)) 1)
1333         (delete-other-windows)
1334       (winner-undo)))
1335
1336 #+END_SRC
1337
1338 ** Line Number
1339
1340 Enable linum mode on programming modes
1341
1342 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1343
1344   (add-hook 'prog-mode-hook 'linum-mode)
1345
1346 #+END_SRC
1347
1348 Fix the font size of line number
1349
1350 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1351
1352   (defun fix-linum-size ()
1353        (interactive)
1354        (set-face-attribute 'linum nil :height 110))
1355
1356   (add-hook 'linum-mode-hook 'fix-linum-size)
1357
1358 #+END_SRC
1359
1360 I like [[https://github.com/coldnew/linum-relative][linum-relative]], just like the =set relativenumber= on =vim=
1361
1362 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1363
1364   (use-package linum-relative
1365     :ensure t
1366     :config
1367     (defun linum-new-mode ()
1368       "If line numbers aren't displayed, then display them.
1369   Otherwise, toggle between absolute and relative numbers."
1370       (interactive)
1371       (if linum-mode
1372           (linum-relative-toggle)
1373         (linum-mode 1)))
1374
1375     :bind
1376     ("A-k" . linum-new-mode))
1377
1378   ;; auto enable linum-new-mode in programming modes
1379   (add-hook 'prog-mode-hook 'linum-relative-mode)
1380
1381 #+END_SRC
1382
1383 ** Save File Position
1384
1385 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1386
1387   (require 'saveplace)
1388   (setq-default save-place t)
1389   (setq save-place-forget-unreadable-files t)
1390   (setq save-place-skip-check-regexp "\\`/\\(?:cdrom\\|floppy\\|mnt\\|/[0-9]\\|\\(?:[^@/:]*@\\)?[^@/:]*[^@/:.]:\\)")
1391
1392 #+END_SRC
1393
1394 ** Multi-term
1395
1396 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1397
1398   (use-package multi-term
1399     :ensure t)
1400
1401 #+END_SRC
1402
1403 ** ace-link
1404
1405 [[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
1406 Type =o= to go to the link
1407
1408 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1409
1410   (use-package ace-link
1411     :ensure t
1412     :init
1413     (ace-link-setup-default))
1414
1415 #+END_SRC
1416
1417 ** Emux
1418
1419 [[https://github.com/re5et/emux][emux]] is 
1420
1421 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1422
1423   (el-get-bundle re5et/emux)
1424
1425 #+END_SRC
1426
1427 ** Smart Parens
1428
1429 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1430
1431   (use-package smartparens
1432     :ensure t
1433     :config
1434     (progn
1435       (require 'smartparens-config)
1436       (add-hook 'prog-mode-hook 'smartparens-mode)))
1437
1438 #+END_SRC
1439
1440 ** Ace-Windows
1441
1442 [[https://github.com/abo-abo/ace-window][ace-window]] 
1443
1444 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1445
1446   (use-package ace-window
1447     :ensure t
1448     :defer t
1449   ;  :init
1450   ;  (global-set-key (kbd "M-o") 'ace-window)
1451     :config
1452     (setq aw-keys '(?a ?s ?d ?f ?j ?k ?l)))
1453
1454 #+END_SRC
1455
1456 ** Projectile
1457
1458 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1459
1460   (use-package projectile
1461     :ensure t
1462     :init
1463     (setq projectile-enable-caching t)
1464     :config
1465     (projectile-global-mode t))
1466
1467   (use-package persp-projectile
1468     :ensure t
1469     :config
1470     (persp-mode)
1471     :bind
1472     (:map projectile-mode-map
1473           ("s-t" . projectile-persp-switch-project)))
1474
1475   ;; projectile-find-file
1476   ;; projectile-switch-buffer
1477   ;; projectile-find-file-other-window
1478 #+END_SRC
1479
1480 ** Which key
1481
1482 [[https://github.com/justbur/emacs-which-key][which-key]] show the key bindings 
1483
1484 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1485
1486   (use-package which-key
1487     :ensure t
1488     :config
1489     (which-key-mode))
1490
1491 #+END_SRC
1492
1493 ** Emms
1494
1495 We can use [[https://www.gnu.org/software/emms/quickstart.html][Emms]] for multimedia in Emacs
1496
1497 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1498
1499   (use-package emms
1500     :ensure t
1501     :init
1502     (setq emms-source-file-default-directory "~/Music/emms/")
1503     :config
1504     (emms-standard)
1505     (emms-default-players)
1506     (define-emms-simple-player mplayer '(file url)
1507       (regexp-opt '(".ogg" ".mp3" ".mgp" ".wav" ".wmv" ".wma" ".ape"
1508                     ".mov" ".avi" ".ogm" ".asf" ".mkv" ".divx" ".mpeg"
1509                     "http://" "mms://" ".rm" ".rmvb" ".mp4" ".flac" ".vob"
1510                     ".m4a" ".flv" ".ogv" ".pls"))
1511       "mplayer" "-slave" "-quiet" "-really-quiet" "-fullscreen")
1512     (emms-history-load))
1513
1514 #+END_SRC
1515
1516 ** GnoGo
1517
1518 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
1519
1520 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1521
1522   (use-package gnugo
1523     :ensure t
1524     :defer t
1525     :init
1526     (require 'gnugo-imgen)
1527     (setq gnugo-xpms 'gnugo-imgen-create-xpms)
1528     (add-hook 'gnugo-start-game-hook '(lambda ()
1529                                         (gnugo-image-display-mode)
1530                                         (gnugo-grid-mode)))
1531       :config
1532     (add-to-list 'gnugo-option-history (format "--boardsize 19 --color black --level 1")))
1533
1534 #+END_SRC
1535
1536 ** undo-tree
1537
1538 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1539
1540   (use-package undo-tree
1541     :ensure t
1542     :config
1543     (global-undo-tree-mode 1))
1544
1545 #+END_SRC
1546
1547 ** swiper
1548
1549 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1550
1551   (use-package swiper
1552     :ensure t)
1553
1554
1555   (ivy-mode 1)
1556   (setq ivy-use-virtual-buffers t)
1557   ;; (global-set-key "\C-s" 'swiper)
1558   ;; (global-set-key (kbd "C-c C-r") 'ivy-resume)
1559   ;; (global-set-key (kbd "<f6>") 'ivy-resume)
1560   ;; ;; (global-set-key (kbd "M-x") 'counsel-M-x)
1561   ;; ;; (global-set-key (kbd "C-x C-f") 'counsel-find-file)
1562   ;; (global-set-key (kbd "<f1> f") 'counsel-describe-function)
1563   ;; (global-set-key (kbd "<f1> v") 'counsel-describe-variable)
1564   ;; (global-set-key (kbd "<f1> l") 'counsel-load-library)
1565   ;; (global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
1566   ;; (global-set-key (kbd "<f2> u") 'counsel-unicode-char)
1567   ;; (global-set-key (kbd "C-c g") 'counsel-git)
1568   ;; (global-set-key (kbd "C-c j") 'counsel-git-grep)
1569   ;; (global-set-key (kbd "C-c k") 'counsel-ag)
1570   ;; (global-set-key (kbd "C-x l") 'counsel-locate)
1571   ;; (global-set-key (kbd "C-S-o") 'counsel-rhythmbox)
1572   ;; ;; (define-key read-expression-map (kbd "C-r") 'counsel-expression-history)
1573
1574 #+END_SRC
1575
1576 ** Tabbar
1577
1578 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1579
1580   ;; (use-package tabbar-ruler
1581   ;;   :ensure t
1582   ;;   :init
1583   ;;   (setq tabbar-ruler-global-tabbar t)
1584   ;;   (setq tabbar-ruler-global-ruler t)
1585   ;;   (setq tabbar-ruler-popu-menu t)
1586   ;;   (setq tabbar-ruler-popu-toolbar t)
1587   ;;   (setq tabbar-use-images t)
1588   ;;   :config
1589   ;;   (tabbar-ruler-group-by-projectile-project)
1590   ;;   (global-set-key (kbd "s-1") 'tabbar-forward-group)
1591   ;;   (global-set-key (kbd "s-2") 'tabbar-ruler-forward))
1592
1593 #+END_SRC
1594
1595 * Programming
1596
1597 ** Languages
1598
1599 *** Emacs Lisp
1600
1601 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1602
1603   (use-package color-identifiers-mode
1604     :ensure t
1605     :init
1606     (add-hook 'emacs-lisp-mode-hook 'color-identifiers-mode)
1607
1608     :diminish color-identifiers-mode)
1609
1610   (global-prettify-symbols-mode t)
1611
1612 #+END_SRC
1613
1614 **** Lispy Mode
1615
1616 In Lisp Mode, =M-o= is defined, but I use this for global hydra window. So here disable this key
1617 bindings in =lispy-mode-map= after loaded. see [[http://stackoverflow.com/questions/298048/how-to-handle-conflicting-keybindings][here]]
1618
1619 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1620
1621   (use-package lispy
1622     :ensure t
1623     :init
1624     (eval-after-load 'lispy
1625       '(progn
1626          (define-key lispy-mode-map (kbd "M-o") nil)))
1627     :config
1628     (add-hook 'emacs-lisp-mode-hook (lambda () (lispy-mode 1))))
1629
1630 #+END_SRC
1631
1632 *** Perl
1633
1634 [[https://www.emacswiki.org/emacs/CPerlMode][CPerl mode]] has more features than =PerlMode= for perl programming. Alias this to =CPerlMode=
1635
1636 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1637
1638   (defalias 'perl-mode 'cperl-mode)
1639
1640   ;(setq cperl-hairy t) ;; Turns on most of the CPerlMode options
1641   (setq cperl-auto-newline t)
1642   (setq cperl-highlight-variables-indiscriminately t)
1643   ;(setq cperl-indent-level 4)
1644   ;(setq cperl-continued-statement-offset 4)
1645   (setq cperl-close-paren-offset -4)
1646   (setq cperl-indent-parents-as-block t)
1647   (setq cperl-tab-always-indent t)
1648   ;(setq cperl-brace-offset  0)
1649
1650   (add-hook 'cperl-mode-hook
1651             '(lambda ()
1652                (cperl-set-style "C++")))
1653
1654   ;(require 'template)
1655   ;(template-initialize)
1656   ;(require 'perlnow)
1657
1658 #+END_SRC
1659
1660 - auto insert
1661 - run script 
1662
1663 Change the compile-command to set the default command run when call =compile=
1664 Mapping =s-r= (on Mac, it's =Command + R= to run the script. Here =current-prefix-arg= is set
1665 to call =compilation=  interactively.
1666
1667 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1668
1669   (defun my-perl-hook ()
1670     (progn
1671       (setq-local compilation-read-command nil)
1672       (set (make-local-variable 'compile-command)
1673            (concat "/usr/bin/perl "
1674                    (if buffer-file-name
1675                        (shell-quote-argument buffer-file-name))))
1676       (local-set-key (kbd "s-r")
1677                        (lambda ()
1678                          (interactive)
1679   ;                       (setq current-prefix-arg '(4)) ; C-u
1680                          (call-interactively 'compile)))))
1681
1682   (add-hook 'cperl-mode-hook 'my-perl-hook)
1683
1684
1685 #+END_SRC
1686
1687 *** C & C++
1688
1689 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1690
1691   (setq c-default-style "stroustrup"
1692         c-basic-offset 4)
1693
1694 #+END_SRC
1695
1696 ** Compile
1697
1698 Set the environments vairables in compilation mode
1699
1700 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1701
1702   (use-package compile
1703     :commands compile
1704     :config
1705     (setq compilation-environment (cons "LC_ALL=C" compilation-environment)))
1706
1707 #+END_SRC
1708
1709 ** Auto-Insert
1710
1711 Enable auto-insert mode
1712
1713 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1714
1715   (auto-insert-mode t)
1716   (setq auto-insert-query nil)
1717
1718 #+END_SRC
1719
1720 *** C++ Auto Insert
1721
1722 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1723
1724   (eval-after-load 'autoinsert
1725     '(define-auto-insert '("\\.cpp\\'" . "C++ skeleton")
1726        '(
1727          "Short description:"
1728          "/*"
1729          "\n * " (file-name-nondirectory (buffer-file-name))
1730          "\n */" > \n \n
1731          "#include <iostream>" \n
1732          "#include \""
1733          (file-name-sans-extension
1734           (file-name-nondirectory (buffer-file-name)))
1735          ".hpp\"" \n \n
1736          "using namespace std;" \n \n
1737          "int main ()"
1738          "\n{" \n 
1739          > _ \n
1740          "return 1;"
1741          "\n}" > \n
1742          )))
1743
1744   (eval-after-load 'autoinsert
1745     '(define-auto-insert '("\\.c\\'" . "C skeleton")
1746        '(
1747          "Short description:"
1748          "/*\n"
1749          " * " (file-name-nondirectory (buffer-file-name)) "\n"
1750          " */" > \n \n
1751          "#include <stdio.h>" \n
1752          "#include \""
1753          (file-name-sans-extension
1754           (file-name-nondirectory (buffer-file-name)))
1755          ".h\"" \n \n
1756          "int main ()\n"
1757          "{" \n
1758          > _ \n
1759          "return 1;\n"
1760          "}" > \n
1761          )))
1762        
1763 #+END_SRC
1764
1765 *** Perl Auto Insert
1766
1767 Refer [[https://www.emacswiki.org/emacs/AutoInsertMode][AutoInsertMode]] Wiki
1768
1769 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1770
1771   (eval-after-load 'autoinsert
1772     '(define-auto-insert '("\\.pl\\'" . "Perl skeleton")
1773        '(
1774          "Description: "
1775          "#!/usr/bin/perl -w" \n
1776          \n
1777          "use strict;" \n \n
1778          )))
1779
1780 #+END_SRC
1781
1782 ** Completion
1783
1784 company mode
1785
1786 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1787
1788   (use-package company
1789     :ensure t
1790     :diminish company-mode
1791     :init (setq company-idle-delay 0.1)
1792     :config
1793     (global-company-mode))
1794
1795 #+END_SRC
1796
1797 [[https://github.com/company-mode/company-statistics][company-statistics]]
1798
1799 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1800
1801   (use-package company-statistics
1802     :ensure t
1803     :config
1804     (company-statistics-mode))
1805
1806 #+END_SRC
1807
1808 * Todo 
1809
1810 - change M-o to trigger to delete other windows and restore previous config
1811