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