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