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