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