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