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