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