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