c292a744ae8822e25e032d311e815c33f44bde5b
[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       (nxhtml-mode . "nx"))
348     "Alist for `clean-mode-line'.
349
350   When you add a new element to the alist, keep in mind that you
351   must pass the correct minor/major mode symbol and a string you
352   want to use in the modeline *in lieu of* the original.")
353
354
355   (defun clean-mode-line ()
356     (interactive)
357     (loop for cleaner in mode-line-cleaner-alist
358           do (let* ((mode (car cleaner))
359                    (mode-str (cdr cleaner))
360                    (old-mode-str (cdr (assq mode minor-mode-alist))))
361                (when old-mode-str
362                    (setcar old-mode-str mode-str))
363                  ;; major mode
364                (when (eq mode major-mode)
365                  (setq mode-name mode-str)))))
366
367
368   (add-hook 'after-change-major-mode-hook 'clean-mode-line)
369 #+END_SRC
370
371 ** Powerline mode
372
373 Install powerline mode [[https://github.com/milkypostman/powerline][powerline]]
374
375 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
376   (use-package powerline
377     :ensure t
378     :config
379     ;; (powerline-center-theme)
380     )
381
382   ;; (use-package smart-mode-line
383   ;;   :ensure t)
384   ;; (use-package smart-mode-line-powerline-theme
385   ;;   :ensure t)
386 #+END_SRC
387
388 Revised powerline-center-theme
389
390 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
391   (defun sd/powerline-simpler-vc (s)
392     (if s
393         (replace-regexp-in-string "Git[:-]" "" s)
394       s))
395
396   (defun sd/powerline-center-theme_revised ()
397     "Setup a mode-line with major and minor modes centered."
398     (interactive)
399     (setq-default mode-line-format
400                   '("%e"
401                     (:eval
402                      (let* ((active (powerline-selected-window-active))
403                             (mode-line-buffer-id (if active 'mode-line-buffer-id 'mode-line-buffer-id-inactive))
404                             (mode-line (if active 'mode-line 'mode-line-inactive))
405                             (face1 (if active 'powerline-active1 'powerline-inactive1))
406                             (face2 (if active 'powerline-active2 'powerline-inactive2))
407                             (separator-left (intern (format "powerline-%s-%s"
408                                                             (powerline-current-separator)
409                                                             (car powerline-default-separator-dir))))
410                             (separator-right (intern (format "powerline-%s-%s"
411                                                              (powerline-current-separator)
412                                                              (cdr powerline-default-separator-dir))))
413                             (lhs (list (powerline-raw "%*" mode-line 'l)
414                                        ;; (powerline-buffer-size mode-line 'l)
415                                        (powerline-buffer-id mode-line-buffer-id 'l)
416                                        (powerline-raw " ")
417                                        (funcall separator-left mode-line face1)
418                                        (powerline-narrow face1 'l)
419                                        ;; (powerline-vc face1)
420                                        (sd/powerline-simpler-vc (powerline-vc face1))
421                                        ))
422                             (rhs (list (powerline-raw global-mode-string face1 'r)
423                                        (powerline-raw "%4l" face1 'r)
424                                        (powerline-raw ":" face1)
425                                        (powerline-raw "%3c" face1 'r)
426                                        (funcall separator-right face1 mode-line)
427                                        (powerline-raw " ")
428                                        (powerline-raw "%6p" mode-line 'r)
429                                        (powerline-hud face2 face1)))
430                             (center (list (powerline-raw " " face1)
431                                           (funcall separator-left face1 face2)
432                                           (when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
433                                             (powerline-raw erc-modified-channels-object face2 'l))
434                                           (powerline-major-mode face2 'l)
435                                           (powerline-process face2)
436                                           (powerline-raw " :" face2)
437                                           (powerline-minor-modes face2 'l)
438                                           (powerline-raw " " face2)
439                                           (funcall separator-right face2 face1))))
440                        (concat (powerline-render lhs)
441                                (powerline-fill-center face1 (/ (powerline-width center) 2.0))
442                                (powerline-render center)
443                                (powerline-fill face1 (powerline-width rhs))
444                                (powerline-render rhs)))))))
445
446   (sd/powerline-center-theme_revised)
447 #+END_SRC
448
449 Fix the issue in mode line when showing triangle 
450
451 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
452   (setq ns-use-srgb-colorspace nil)
453 #+END_SRC
454
455 set height in mode line
456
457 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
458
459   (custom-set-variables
460    '(powerline-height 14)
461    '(powerline-text-scale-factor 0.8))
462   ;; 100/140
463   (set-face-attribute 'mode-line nil :height 100)
464
465 #+END_SRC
466
467 * Org-mode Settings
468
469 ** Org-mode Basic setting
470
471 Always indents header, and hide header leading starts so that no need type =#+STATUP: indent= 
472
473 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
474
475   (use-package org
476     :ensure t
477     :init
478     (setq org-startup-indented t)
479     (setq org-hide-leading-starts t)
480     (setq org-src-fontify-natively t)
481     (setq org-src-tab-acts-natively t)
482     (setq org-confirm-babel-evaluate nil)
483     (setq org-use-speed-commands t)
484     (setq org-completion-use-ido t))
485
486   (org-babel-do-load-languages
487    'org-babel-load-languages
488    '((python . t)
489      (C . t)
490      (perl . t)
491      (calc . t)
492      (latex . t)
493      (java . t)
494      (ruby . t)
495      (lisp . t)
496      (scheme . t)
497      (sh . t)
498      (sqlite . t)
499      (js . t)))
500
501   ;; use current window for org source buffer editting
502   (setq org-src-window-setup 'current-window )
503
504 #+END_SRC
505
506 ** Org-bullets
507
508 use [[https://github.com/sabof/org-bullets][org-bullets]] package to show utf-8 charactes
509
510 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
511
512   (use-package org-bullets
513     :ensure t
514     :init
515     (add-hook 'org-mode-hook
516               (lambda ()
517                 (org-bullets-mode t))))
518
519 #+END_SRC
520
521 ** Worf Mode
522
523 [[https://github.com/abo-abo/worf][worf]] mode is an extension of vi-like binding for org-mode. 
524 In =worf-mode=, it is mapping =[=, =]= as =worf-backward= and =worf-forward= in global, wich
525 cause we cannot input =[= and =]=, so here I unset this mappings. And redifined this two to
526 =M-[= and =M-]=. see this [[https://github.com/abo-abo/worf/issues/19#issuecomment-223756599][issue]]
527
528 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
529
530   (use-package worf
531     :ensure t
532     :commands worf-mode
533     :init (add-hook 'org-mode-hook 'worf-mode)
534     ;; :config
535     ;; (define-key worf-mode-map "[" nil)
536     ;; (define-key worf-mode-map "]" nil)
537     ;; (define-key worf-mode-map (kbd "M-[") 'worf-backward)
538     ;; (define-key worf-mode-map (kbd "M-]") 'worf-forward)
539     )
540
541 #+END_SRC
542
543 ** Task Management
544
545 ** Capture
546
547 ** Export PDF
548
549 Install MacTex-basic and some tex packages
550
551 #+BEGIN_SRC bash 
552
553   sudo tlmgr update --self
554
555   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
556
557 #+END_SRC
558
559 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
560   ;; ;; allow for export=>beamer by placing
561
562   ;; http://emacs-fu.blogspot.com/2011/04/nice-looking-pdfs-with-org-mode-and.html
563   ;; #+LaTeX_CLASS: beamer in org files
564   (unless (boundp 'org-export-latex-classes)
565     (setq org-export-latex-classes nil))
566   (add-to-list 'org-export-latex-classes
567     ;; beamer class, for presentations
568     '("beamer"
569        "\\documentclass[11pt]{beamer}\n
570         \\mode<{{{beamermode}}}>\n
571         \\usetheme{{{{beamertheme}}}}\n
572         \\usecolortheme{{{{beamercolortheme}}}}\n
573         \\beamertemplateballitem\n
574         \\setbeameroption{show notes}
575         \\usepackage[utf8]{inputenc}\n
576         \\usepackage[T1]{fontenc}\n
577         \\usepackage{hyperref}\n
578         \\usepackage{color}
579         \\usepackage{listings}
580         \\lstset{numbers=none,language=[ISO]C++,tabsize=4,
581     frame=single,
582     basicstyle=\\small,
583     showspaces=false,showstringspaces=false,
584     showtabs=false,
585     keywordstyle=\\color{blue}\\bfseries,
586     commentstyle=\\color{red},
587     }\n
588         \\usepackage{verbatim}\n
589         \\institute{{{{beamerinstitute}}}}\n          
590          \\subject{{{{beamersubject}}}}\n"
591
592        ("\\section{%s}" . "\\section*{%s}")
593  
594        ("\\begin{frame}[fragile]\\frametitle{%s}"
595          "\\end{frame}"
596          "\\begin{frame}[fragile]\\frametitle{%s}"
597          "\\end{frame}")))
598
599     ;; letter class, for formal letters
600
601     (add-to-list 'org-export-latex-classes
602
603     '("letter"
604        "\\documentclass[11pt]{letter}\n
605         \\usepackage[utf8]{inputenc}\n
606         \\usepackage[T1]{fontenc}\n
607         \\usepackage{color}"
608  
609        ("\\section{%s}" . "\\section*{%s}")
610        ("\\subsection{%s}" . "\\subsection*{%s}")
611        ("\\subsubsection{%s}" . "\\subsubsection*{%s}")
612        ("\\paragraph{%s}" . "\\paragraph*{%s}")
613        ("\\subparagraph{%s}" . "\\subparagraph*{%s}")))
614
615
616   (require 'ox-md)
617   (require 'ox-beamer)
618
619   (setq org-latex-pdf-process
620         '("pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
621           "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"
622           "pdflatex -shell-escape -interaction nonstopmode -output-directory %o %f"))
623
624   (setq TeX-parse-self t)
625
626   (setq TeX-PDF-mode t)
627   (add-hook 'LaTeX-mode-hook
628             (lambda ()
629               (LaTeX-math-mode)
630               (setq TeX-master t)))
631
632 #+END_SRC
633
634 ** others
635
636 refer to [[http://coldnew.github.io/coldnew-emacs/#orgheadline94][fancy todo states]]
637
638 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
639
640   (setq org-todo-keywords '((sequence "☛ TODO(t)" "|" "✔ DONE(d)")
641                             (sequence "âš‘ WAITING(w)" "|")
642                             (sequence "|" "✘ CANCELED(c)")))
643
644 #+END_SRC
645
646 extend org-mode's easy templates, refer to [[http://coldnew.github.io/coldnew-emacs/#orgheadline94][Extend org-modes' esay templates]]
647
648 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
649
650   (add-to-list 'org-structure-template-alist
651                '("E" "#+BEGIN_SRC emacs-lisp\n?\n#+END_SRC"))
652   (add-to-list 'org-structure-template-alist
653                '("S" "#+BEGIN_SRC sh\n?\n#+END_SRC"))
654   (add-to-list 'org-structure-template-alist
655                '("p" "#+BEGIN_SRC plantuml :file uml.png \n?\n#+END_SRC"))
656
657 #+END_SRC
658
659 * Magit
660
661 [[https://github.com/magit/magit][Magit]] is a very cool git interface on Emacs.
662
663 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
664
665   (use-package magit
666     :ensure t
667     :commands magit-status magit-blame)
668
669
670 #+END_SRC
671
672 * IDO & SMEX
673
674 ** IDO
675
676 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
677
678   (use-package ido
679     :ensure t
680     :init (setq ido-enable-flex-matching t
681                 ido-ignore-extensions t
682                 ido-use-virtual-buffers t
683                 ido-everywhere t)
684     :config
685     (ido-mode 1)
686     (ido-everywhere 1)
687     (add-to-list 'completion-ignored-extensions ".pyc"))
688
689   (icomplete-mode t)
690
691 #+END_SRC
692
693 ** FLX
694
695 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
696
697   (use-package flx-ido
698     :ensure t
699     :init (setq ido-enable-flex-matching t
700                 ido-use-faces nil)
701     :config (flx-ido-mode 1))
702
703 #+END_SRC
704
705 ** IDO-vertically
706
707 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
708
709   (use-package ido-vertical-mode
710     :ensure t
711     :init
712     (setq ido-vertical-define-keys 'C-n-C-p-up-and-down)
713     :config
714     (ido-vertical-mode 1))
715
716 #+END_SRC
717
718 ** SMEX
719
720 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
721
722   (use-package smex
723     :ensure t
724     :init (smex-initialize)
725     :bind
726     ("M-x" . smex)
727     ("M-X" . smex-major-mode-commands))
728
729 #+END_SRC
730
731 ** Ido-ubiquitous
732
733 Use [[https://github.com/DarwinAwardWinner/ido-ubiquitous][ido-ubiquitous]] for ido everywhere. It makes =describe-function= can also use ido
734
735 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
736
737   (use-package ido-ubiquitous
738     :ensure t
739     :init
740     (setq magit-completing-read-function 'magit-ido-completing-read)
741     (setq gnus-completing-read-function 'gnus-ido-completing-read)
742     :config
743     (ido-ubiquitous-mode 1))
744
745 #+END_SRC
746
747 ** Ido-exit-target
748
749 [[https://github.com/waymondo/ido-exit-target][ido-exit-target]] let you open file/buffer on =other-windows= when call =ido-switch-buffer=
750
751 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
752
753   (use-package ido-exit-target
754     :ensure t
755     :init
756     (define-key ido-common-completion-map (kbd "C-j") #'ido-exit-target-split-window-right)
757     (define-key ido-common-completion-map (kbd "C-l") #'ido-exit-target-split-window-below))
758
759 #+END_SRC
760
761 * Key bindings
762
763 ** Remove prefix =ESC=, refer [[http://emacs.stackexchange.com/questions/14755/how-to-remove-bindings-to-the-esc-prefix-key][here]]
764
765 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
766
767   ;; (define-key key-translation-map (kbd "ESC") (kbd "C-g"))
768
769 #+END_SRC
770
771 ** Esc on Minibuffer
772
773 Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
774
775 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
776
777   (define-key minibuffer-local-map [escape] 'keyboard-escape-quit)
778   (define-key minibuffer-local-map [escape]  'keyboard-escape-quit)
779   (define-key minibuffer-local-ns-map [escape]  'keyboard-escape-quit)
780   (define-key minibuffer-local-isearch-map [escape]  'keyboard-escape-quit)
781   (define-key minibuffer-local-completion-map [escape]  'keyboard-escape-quit)
782   (define-key minibuffer-local-must-match-map [escape]  'keyboard-escape-quit)
783   (define-key minibuffer-local-must-match-filename-map [escape]  'keyboard-escape-quit)
784   (define-key minibuffer-local-filename-completion-map [escape]  'keyboard-escape-quit)
785   (define-key minibuffer-local-filename-must-match-map [escape]  'keyboard-escape-quit)
786
787   ;; Also map s-h same as C-g
788   (define-key minibuffer-local-map (kbd "s-h") 'keyboard-escape-quit)
789
790 #+END_SRC
791
792 ** =Ctrl= key bindings
793
794 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
795   ;;
796
797   ;; C-h    help    
798   ;; C-j    newline and indent
799   ;; C-k    kill line
800   ;; C-l    recenter-top-bottom
801   ;; (global-set-key (kbd "C-;") 'ido-switch-buffer)
802   ;; C-;
803   ;; C-'   
804   ;; C-ret  
805
806   ;; C-n    next-line
807   ;; C-m
808   ;; C-,
809   ;; C-.
810   ;; C-/
811
812   ;; C-y
813   ;; C-u
814   ;; C-i
815   ;; C-o
816   ;; C-p
817   ;; C-[
818   ;; C-]
819   ;; C-\
820
821   ;; C-=
822   ;; C--
823   ;; C-0
824   ;; C-9
825   ;; C-8
826   ;; C-7
827
828   ;; C-Space
829
830
831
832
833
834
835
836 #+END_SRC
837
838 ** =Super= bindings for file, buffer and windows
839
840 Some global bindings on =Super=, on Mac, it is =Command=
841
842 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
843
844   (global-set-key (kbd "s-h") 'keyboard-quit)
845   (global-set-key (kbd "s-j") 'ido-switch-buffer)
846   (global-set-key (kbd "s-k") 'ido-find-file)
847   ;; s-k  -->  kill-this-buffer
848   (global-set-key (kbd "s-l") (lambda ()
849                                 (interactive)
850                                 (if (> (length (window-list)) 1) 
851                                     (delete-window)
852                                   (message "Only one Windows now!"))))
853   ;; s-l  -->  goto-line
854   (global-set-key (kbd "s-;") 'swiper)
855   ;; s-;  -->
856   ;; s-'  -->  'next-multiframe-window
857   (global-set-key (kbd "<s-return>") 'toggle-frame-fullscreen)
858
859   ;; (global-set-key (kbd "s-y") 'projectile-find-file)
860   (global-set-key (kbd "s-f") 'projectile-find-file)
861   (global-set-key (kbd "s-[") 'persp-next)
862   (global-set-key (kbd "s-]") 'persp-prev)
863
864   (global-set-key (kbd "s-`") 'mode-line-other-buffer)
865
866   (global-set-key (kbd "s-n") 'persp-next)
867   (global-set-key (kbd "s-p") 'persp-prev)
868
869
870
871   ;; someothers default mapping on super (command) key
872   ;; s-s save-buffer
873   ;; s-k kill-this-buffer
874
875
876   ;; s-h  -->  ns-do-hide-emacs
877   ;; s-j  -->  ido-switch-buffer  +
878   ;; s-k  -->  kill-this-buffer
879   ;; s-l  -->  goto-line
880   ;; s-;  -->  undefined
881   ;; s-'  -->  next-multiframe-window
882   ;; s-ret --> toggle-frame-fullscreen +
883
884   ;; s-y  -->  ns-paste-secondary
885   ;; s-u  -->  revert-buffer
886   ;; s-i  -->  undefined - but used for iterm globally
887   ;; s-o  -->  used for emacs globally
888   ;; s-p  -->  projectile-persp-switch-project  +  
889   ;; s-[  -->  next-buffer  +    
890   ;; s-]  -->  previous-buffer +
891
892   ;; s-0  -->  undefined
893   ;; s-9  -->  undefined
894   ;; s-8  -->  undefined
895   ;; s-7  -->  undefined
896   ;; s-6  -->  undefined
897   ;; s--  -->  center-line
898   ;; s-=  -->  undefined
899
900   ;; s-n  -->  make-frame
901   ;; s-m  -->  iconify-frame
902   ;; s-b  -->  undefined
903   ;; s-,  -->  customize
904   ;; s-.  -->  undefined
905   ;; s-/  -->  undefined
906
907   ;; s-g  -->  isearch-repeat-forward
908   ;; s-f  -->  projectile-find-file   +
909   ;; s-d  -->  isearch-repeat-background
910   ;; s-s  -->  save-buffer
911   ;; s-a  -->  make-whole-buffer
912
913   ;; s-b  -->  undefined
914   ;; s-v  -->  yank
915   ;; s-c  -->  ns-copy-including-secondary
916
917   ;; s-t  -->  ns-popup-font-panel
918   ;; s-r  -->  undefined
919   ;; s-e  -->  isearch-yanqk-kill
920   ;; s-w  -->  delete-frame
921   ;; s-q  -->  same-buffers-kill-emacs
922
923   ;; s-`  -->  other-frame
924 #+END_SRC
925
926 ** =M-s= bindings for searching
927
928 I use the prefix =M-s= for searching in buffers
929
930 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
931
932   (defun pl-make-keymap (key bindings)
933     (setq keymap (make-sparse-keymap))
934     (dolist (binding bindings)
935       (define-key keymap (car binding) (cdr binding)))
936     (global-set-key key keymap))
937
938   (define-key minibuffer-local-map "\M-s" nil)
939
940   (global-set-key (kbd "M-s s") 'isearch-forward-regexp)
941   (define-key isearch-mode-map "\M-s" 'isearch-repeat-forward)
942   (global-set-key (kbd "M-s r") 'isearch-backward-regexp)
943   (define-key isearch-mode-map "\M-r" 'isearch-repeat-backward)
944
945   (global-set-key (kbd "s-/") 'isearch-forward-regexp)
946   (define-key isearch-mode-map (kbd  "s-/") 'isearch-repeat-forward)
947   (define-key isearch-mode-map (kbd  "C-n") 'isearch-repeat-forward)
948
949
950   (set-face-background 'ido-first-match "white")
951
952   ;; M-s o  -->  occur
953   ;; M-s s  -->  isearch-forward-regexp
954   ;; M-s r  -->  isearch-backward-regexp
955   ;; M-s w  -->  isearch-forward-word
956   ;; M-s .  -->  isearch-forward-symbol-at-point
957   ;; M-s _  -->  isearch-forward-symbol
958
959   ;; highlight bindings
960   ;; M-s h .  -->  highlight-symbol-at-point
961   ;; M-s h r  -->  highlight-regexp
962   ;; M-s h u  -->  unhighlight-regexp
963   ;; M-s h l  -->  highlight-lines-match-regexp
964   ;; M-s h p  -->  highlight-phrase
965   ;; M-s h f  -->  hi-lock-find-patterns
966
967   ;; 
968   ;; (global-set-key (kbd "M-s M-r") 'isearch-backward-regexp)
969   ;;
970
971   ;; M-c
972   ;; M-r
973   ;; M-t
974   ;; M-u, 
975 #+END_SRC
976
977 Occur search key bindings
978
979 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
980
981   (define-key occur-mode-map (kbd "C-n")
982     (lambda ()
983       (interactive)
984       (occur-next)
985       (occur-mode-goto-occurrence-other-window)
986       (recenter)
987       (other-window 1)))
988
989   (define-key occur-mode-map (kbd "C-p")
990     (lambda ()
991       (interactive)
992       (occur-prev)
993       (occur-mode-goto-occurrence-other-window)
994       (recenter)
995       (other-window 1)))
996
997 #+END_SRC
998
999
1000 ** =M-o= as prefix key for windows
1001
1002 ** =M-g= as prefix key for launcher
1003
1004 ** others
1005
1006 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1007
1008
1009   ;; C-'    undefined
1010   ;; C-.    undefined
1011 #+END_SRC
1012
1013 * Eshell
1014
1015 Eshell alias
1016
1017 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1018
1019   (defalias 'e 'ido-find-file)
1020   (defalias 'ff 'ido-find-file)
1021   (defalias 'ee 'ido-find-file-other-window)
1022
1023 #+END_SRC
1024
1025 Quickly start eshll in split window below, refer [[http://www.howardism.org/Technical/Emacs/eshell-fun.html][eshell-here]]
1026
1027 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1028
1029   (defun eshell-x ()
1030     (insert "exit")
1031     (eshell-send-input)
1032     (delete-window))
1033
1034   (defun eshell-here ()
1035     "Opens up a new shell in the directory associated with the
1036   current buffer's file. The eshell is renamed to match that
1037   directory to make multiple eshell windows easier."
1038     (interactive)
1039     (let* ((parent (if (buffer-file-name)
1040                        (file-name-directory (buffer-file-name))
1041                      default-directory))
1042            (height (/ (window-total-height) 3))
1043            (name   (car (last (split-string parent "/" t))))
1044            (eshell-name (concat "*eshell: " name "*")))
1045       (split-window-vertically (- height))
1046       (other-window 1)
1047       (if (get-buffer eshell-name)
1048           (progn
1049             (message "buffer exist")
1050             (switch-to-buffer eshell-name))
1051         (progn
1052           (eshell "new")
1053           (rename-buffer eshell-name)
1054
1055           (insert (concat "ls"))
1056           (eshell-send-input)))))
1057
1058   ;; (global-set-key (kbd "M-`") (lambda ()
1059   ;;                               (interactive)
1060   ;;                               (if (buffer-name))))
1061
1062 #+END_SRC
1063
1064 * Misc Settings
1065
1066 ** [[https://github.com/abo-abo/hydra][Hydra]]
1067
1068 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1069
1070   (use-package hydra
1071     :ensure t)
1072
1073 #+END_SRC
1074
1075 *** Font Zoom
1076
1077 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1078
1079   (defhydra sd/font-zoom (global-map "<f2>")
1080     "zoom"
1081     ("g" text-scale-increase "in")
1082     ("l" text-scale-decrease "out"))
1083
1084 #+END_SRC
1085
1086 *** Windmove Splitter
1087
1088 Refer [[https://github.com/abo-abo/hydra/blob/master/hydra-examples.el][hydra-example]], to enlarge or shrink the windows splitter
1089
1090 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1091
1092   (defun hydra-move-splitter-left (arg)
1093     "Move window splitter left."
1094     (interactive "p")
1095     (if (let ((windmove-wrap-around))
1096           (windmove-find-other-window 'right))
1097         (shrink-window-horizontally arg)
1098       (enlarge-window-horizontally arg)))
1099
1100   (defun hydra-move-splitter-right (arg)
1101     "Move window splitter right."
1102     (interactive "p")
1103     (if (let ((windmove-wrap-around))
1104           (windmove-find-other-window 'right))
1105         (enlarge-window-horizontally arg)
1106       (shrink-window-horizontally arg)))
1107
1108   (defun hydra-move-splitter-up (arg)
1109     "Move window splitter up."
1110     (interactive "p")
1111     (if (let ((windmove-wrap-around))
1112           (windmove-find-other-window 'up))
1113         (enlarge-window arg)
1114       (shrink-window arg)))
1115
1116   (defun hydra-move-splitter-down (arg)
1117     "Move window splitter down."
1118     (interactive "p")
1119     (if (let ((windmove-wrap-around))
1120           (windmove-find-other-window 'up))
1121         (shrink-window arg)
1122       (enlarge-window arg)))
1123
1124 #+END_SRC
1125
1126 *** hydra-window
1127
1128 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1129
1130   (winner-mode 1)
1131
1132   (defhydra sd/hydra-window (:color red :columns nil)
1133     "window"
1134     ("h" windmove-left nil)
1135     ("j" windmove-down nil)
1136     ("k" windmove-up nil)
1137     ("l" windmove-right nil)
1138     ("H" hydra-move-splitter-left nil)
1139     ("J" hydra-move-splitter-down nil)
1140     ("K" hydra-move-splitter-up nil)
1141     ("L" hydra-move-splitter-right nil)
1142     ("v" (lambda ()
1143            (interactive)
1144            (split-window-right)
1145            (windmove-right))
1146      "vert")
1147     ("x" (lambda ()
1148            (interactive)
1149            (split-window-below)
1150            (windmove-down))
1151      "horz")
1152     ("o" delete-other-windows "one" :exit t)
1153     ("a" ace-window "ace")
1154     ("s" ace-swap-window "swap")
1155     ("d" ace-delete-window "ace-one" :exit t)
1156     ("i" ace-maximize-window "ace-one" :exit t)
1157     ("b" ido-switch-buffer "buf")
1158     ("m" headlong-bookmark-jump "bmk")
1159     ("q" nil "cancel")
1160     ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
1161     ("r" (progn (winner-redo) (setq this-command 'winner-redo)) "redo")
1162     ("f" nil))
1163
1164   (global-unset-key (kbd "M-o"))
1165   (global-set-key (kbd "M-o") 'sd/hydra-window/body)
1166
1167   (defun triggle-windows-max-size ()
1168     (interactive)
1169     (if (> (length (window-list)) 1)
1170         (delete-other-windows)
1171       (winner-undo)))
1172
1173 #+END_SRC
1174
1175 ** Line Number
1176
1177 Enable linum mode on programming modes
1178
1179 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1180
1181   (add-hook 'prog-mode-hook 'linum-mode)
1182
1183 #+END_SRC
1184
1185 Fix the font size of line number
1186
1187 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1188
1189   (defun fix-linum-size ()
1190        (interactive)
1191        (set-face-attribute 'linum nil :height 110))
1192
1193   (add-hook 'linum-mode-hook 'fix-linum-size)
1194
1195 #+END_SRC
1196
1197 I like [[https://github.com/coldnew/linum-relative][linum-relative]], just like the =set relativenumber= on =vim=
1198
1199 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1200
1201   (use-package linum-relative
1202     :ensure t
1203     :config
1204     (defun linum-new-mode ()
1205       "If line numbers aren't displayed, then display them.
1206   Otherwise, toggle between absolute and relative numbers."
1207       (interactive)
1208       (if linum-mode
1209           (linum-relative-toggle)
1210         (linum-mode 1)))
1211
1212     :bind
1213     ("A-k" . linum-new-mode))
1214
1215   ;; auto enable linum-new-mode in programming modes
1216   (add-hook 'prog-mode-hook 'linum-relative-mode)
1217
1218 #+END_SRC
1219
1220 ** Save File Position
1221
1222 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1223
1224   (require 'saveplace)
1225   (setq-default save-place t)
1226   (setq save-place-forget-unreadable-files t)
1227   (setq save-place-skip-check-regexp "\\`/\\(?:cdrom\\|floppy\\|mnt\\|/[0-9]\\|\\(?:[^@/:]*@\\)?[^@/:]*[^@/:.]:\\)")
1228
1229 #+END_SRC
1230
1231 ** Multi-term
1232
1233 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1234
1235   (use-package multi-term
1236     :ensure t)
1237
1238 #+END_SRC
1239
1240 ** ace-link
1241
1242 [[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
1243 Type =o= to go to the link
1244
1245 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1246
1247   (use-package ace-link
1248     :ensure t
1249     :init
1250     (ace-link-setup-default))
1251
1252 #+END_SRC
1253
1254 ** Emux
1255
1256 [[https://github.com/re5et/emux][emux]] is 
1257
1258 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1259
1260   (el-get-bundle re5et/emux)
1261
1262 #+END_SRC
1263
1264 ** Smart Parens
1265
1266 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1267
1268   (use-package smartparens
1269     :ensure t
1270     :config
1271     (progn
1272       (require 'smartparens-config)
1273       (add-hook 'prog-mode-hook 'smartparens-mode)))
1274
1275 #+END_SRC
1276
1277 ** Ace-Windows
1278
1279 [[https://github.com/abo-abo/ace-window][ace-window]] 
1280
1281 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1282
1283   (use-package ace-window
1284     :ensure t
1285     :defer t
1286   ;  :init
1287   ;  (global-set-key (kbd "M-o") 'ace-window)
1288     :config
1289     (setq aw-keys '(?a ?s ?d ?f ?j ?k ?l)))
1290
1291 #+END_SRC
1292
1293 ** Projectile
1294
1295 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1296
1297   (use-package projectile
1298     :ensure t
1299     :init
1300     (setq projectile-enable-caching t)
1301     :config
1302     (projectile-global-mode t))
1303
1304   (use-package persp-projectile
1305     :ensure t
1306     :config
1307     (persp-mode)
1308     :bind
1309     (:map projectile-mode-map
1310           ("s-t" . projectile-persp-switch-project)))
1311
1312   ;; projectile-find-file
1313   ;; projectile-switch-buffer
1314   ;; projectile-find-file-other-window
1315 #+END_SRC
1316
1317 ** Which key
1318
1319 [[https://github.com/justbur/emacs-which-key][which-key]] show the key bindings 
1320
1321 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1322
1323   (use-package which-key
1324     :ensure t
1325     :config
1326     (which-key-mode))
1327
1328 #+END_SRC
1329
1330 ** Emms
1331
1332 We can use [[https://www.gnu.org/software/emms/quickstart.html][Emms]] for multimedia in Emacs
1333
1334 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1335
1336   (use-package emms
1337     :ensure t
1338     :init
1339     (setq emms-source-file-default-directory "~/Music/emms/")
1340     :config
1341     (emms-standard)
1342     (emms-default-players)
1343     (define-emms-simple-player mplayer '(file url)
1344       (regexp-opt '(".ogg" ".mp3" ".mgp" ".wav" ".wmv" ".wma" ".ape"
1345                     ".mov" ".avi" ".ogm" ".asf" ".mkv" ".divx" ".mpeg"
1346                     "http://" "mms://" ".rm" ".rmvb" ".mp4" ".flac" ".vob"
1347                     ".m4a" ".flv" ".ogv" ".pls"))
1348       "mplayer" "-slave" "-quiet" "-really-quiet" "-fullscreen")
1349     (emms-history-load))
1350
1351 #+END_SRC
1352
1353 ** GnoGo
1354
1355 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
1356
1357 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1358
1359   (use-package gnugo
1360     :ensure t
1361     :defer t
1362     :init
1363     (require 'gnugo-imgen)
1364     (setq gnugo-xpms 'gnugo-imgen-create-xpms)
1365     (add-hook 'gnugo-start-game-hook '(lambda ()
1366                                         (gnugo-image-display-mode)
1367                                         (gnugo-grid-mode)))
1368       :config
1369     (add-to-list 'gnugo-option-history (format "--boardsize 19 --color black --level 1")))
1370
1371 #+END_SRC
1372
1373 ** undo-tree
1374
1375 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1376
1377   (use-package undo-tree
1378     :ensure t
1379     :config
1380     (global-undo-tree-mode 1))
1381
1382 #+END_SRC
1383
1384 ** swiper
1385
1386 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1387
1388   (use-package swiper
1389     :ensure t)
1390
1391
1392   (ivy-mode 1)
1393   (setq ivy-use-virtual-buffers t)
1394   ;; (global-set-key "\C-s" 'swiper)
1395   ;; (global-set-key (kbd "C-c C-r") 'ivy-resume)
1396   ;; (global-set-key (kbd "<f6>") 'ivy-resume)
1397   ;; ;; (global-set-key (kbd "M-x") 'counsel-M-x)
1398   ;; ;; (global-set-key (kbd "C-x C-f") 'counsel-find-file)
1399   ;; (global-set-key (kbd "<f1> f") 'counsel-describe-function)
1400   ;; (global-set-key (kbd "<f1> v") 'counsel-describe-variable)
1401   ;; (global-set-key (kbd "<f1> l") 'counsel-load-library)
1402   ;; (global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
1403   ;; (global-set-key (kbd "<f2> u") 'counsel-unicode-char)
1404   ;; (global-set-key (kbd "C-c g") 'counsel-git)
1405   ;; (global-set-key (kbd "C-c j") 'counsel-git-grep)
1406   ;; (global-set-key (kbd "C-c k") 'counsel-ag)
1407   ;; (global-set-key (kbd "C-x l") 'counsel-locate)
1408   ;; (global-set-key (kbd "C-S-o") 'counsel-rhythmbox)
1409   ;; ;; (define-key read-expression-map (kbd "C-r") 'counsel-expression-history)
1410
1411 #+END_SRC
1412
1413 ** Tabbar
1414
1415 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1416
1417   ;; (use-package tabbar-ruler
1418   ;;   :ensure t
1419   ;;   :init
1420   ;;   (setq tabbar-ruler-global-tabbar t)
1421   ;;   (setq tabbar-ruler-global-ruler t)
1422   ;;   (setq tabbar-ruler-popu-menu t)
1423   ;;   (setq tabbar-ruler-popu-toolbar t)
1424   ;;   (setq tabbar-use-images t)
1425   ;;   :config
1426   ;;   (tabbar-ruler-group-by-projectile-project)
1427   ;;   (global-set-key (kbd "s-1") 'tabbar-forward-group)
1428   ;;   (global-set-key (kbd "s-2") 'tabbar-ruler-forward))
1429
1430 #+END_SRC
1431
1432 * Programming
1433
1434 ** Languages
1435
1436 *** Emacs Lisp
1437
1438 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1439
1440   (use-package color-identifiers-mode
1441     :ensure t
1442     :init
1443     (add-hook 'emacs-lisp-mode-hook 'color-identifiers-mode)
1444
1445     :diminish color-identifiers-mode)
1446
1447   (global-prettify-symbols-mode t)
1448
1449 #+END_SRC
1450
1451 **** Lispy Mode
1452
1453 In Lisp Mode, =M-o= is defined, but I use this for global hydra window. So here disable this key
1454 bindings in =lispy-mode-map= after loaded. see [[http://stackoverflow.com/questions/298048/how-to-handle-conflicting-keybindings][here]]
1455
1456 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1457
1458   (use-package lispy
1459     :ensure t
1460     :init
1461     (eval-after-load 'lispy
1462       '(progn
1463          (define-key lispy-mode-map (kbd "M-o") nil)))
1464     :config
1465     (add-hook 'emacs-lisp-mode-hook (lambda () (lispy-mode 1))))
1466
1467 #+END_SRC
1468
1469 *** Perl
1470
1471 [[https://www.emacswiki.org/emacs/CPerlMode][CPerl mode]] has more features than =PerlMode= for perl programming. Alias this to =CPerlMode=
1472
1473 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1474
1475   (defalias 'perl-mode 'cperl-mode)
1476
1477   ;(setq cperl-hairy t) ;; Turns on most of the CPerlMode options
1478   (setq cperl-auto-newline t)
1479   (setq cperl-highlight-variables-indiscriminately t)
1480   ;(setq cperl-indent-level 4)
1481   ;(setq cperl-continued-statement-offset 4)
1482   (setq cperl-close-paren-offset -4)
1483   (setq cperl-indent-parents-as-block t)
1484   (setq cperl-tab-always-indent t)
1485   ;(setq cperl-brace-offset  0)
1486
1487   (add-hook 'cperl-mode-hook
1488             '(lambda ()
1489                (cperl-set-style "C++")))
1490
1491   ;(require 'template)
1492   ;(template-initialize)
1493   ;(require 'perlnow)
1494
1495 #+END_SRC
1496
1497 - auto insert
1498 - run script 
1499
1500 Change the compile-command to set the default command run when call =compile=
1501 Mapping =s-r= (on Mac, it's =Command + R= to run the script. Here =current-prefix-arg= is set
1502 to call =compilation=  interactively.
1503
1504 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1505
1506   (defun my-perl-hook ()
1507     (progn
1508       (setq-local compilation-read-command nil)
1509       (set (make-local-variable 'compile-command)
1510            (concat "/usr/bin/perl "
1511                    (if buffer-file-name
1512                        (shell-quote-argument buffer-file-name))))
1513       (local-set-key (kbd "s-r")
1514                        (lambda ()
1515                          (interactive)
1516   ;                       (setq current-prefix-arg '(4)) ; C-u
1517                          (call-interactively 'compile)))))
1518
1519   (add-hook 'cperl-mode-hook 'my-perl-hook)
1520
1521
1522 #+END_SRC
1523
1524 *** C & C++
1525
1526 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1527
1528   (setq c-default-style "stroustrup"
1529         c-basic-offset 4)
1530
1531 #+END_SRC
1532
1533 ** Compile
1534
1535 Set the environments vairables in compilation mode
1536
1537 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1538
1539   (use-package compile
1540     :commands compile
1541     :config
1542     (setq compilation-environment (cons "LC_ALL=C" compilation-environment)))
1543
1544 #+END_SRC
1545
1546 ** Auto-Insert
1547
1548 Enable auto-insert mode
1549
1550 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1551
1552   (auto-insert-mode t)
1553   (setq auto-insert-query nil)
1554
1555 #+END_SRC
1556
1557 *** C++ Auto Insert
1558
1559 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1560
1561   (eval-after-load 'autoinsert
1562     '(define-auto-insert '("\\.cpp\\'" . "C++ skeleton")
1563        '(
1564          "Short description:"
1565          "/*"
1566          "\n * " (file-name-nondirectory (buffer-file-name))
1567          "\n */" > \n \n
1568          "#include <iostream>" \n
1569          "#include \""
1570          (file-name-sans-extension
1571           (file-name-nondirectory (buffer-file-name)))
1572          ".hpp\"" \n \n
1573          "using namespace std;" \n \n
1574          "int main ()"
1575          "\n{" \n 
1576          > _ \n
1577          "return 1;"
1578          "\n}" > \n
1579          )))
1580
1581   (eval-after-load 'autoinsert
1582     '(define-auto-insert '("\\.c\\'" . "C skeleton")
1583        '(
1584          "Short description:"
1585          "/*\n"
1586          " * " (file-name-nondirectory (buffer-file-name)) "\n"
1587          " */" > \n \n
1588          "#include <stdio.h>" \n
1589          "#include \""
1590          (file-name-sans-extension
1591           (file-name-nondirectory (buffer-file-name)))
1592          ".h\"" \n \n
1593          "int main ()\n"
1594          "{" \n
1595          > _ \n
1596          "return 1;\n"
1597          "}" > \n
1598          )))
1599        
1600 #+END_SRC
1601
1602 *** Perl Auto Insert
1603
1604 Refer [[https://www.emacswiki.org/emacs/AutoInsertMode][AutoInsertMode]] Wiki
1605
1606 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1607
1608   (eval-after-load 'autoinsert
1609     '(define-auto-insert '("\\.pl\\'" . "Perl skeleton")
1610        '(
1611          "Description: "
1612          "#!/usr/bin/perl -w" \n
1613          \n
1614          "use strict;" \n \n
1615          )))
1616
1617 #+END_SRC
1618
1619 ** Completion
1620
1621 company mode
1622
1623 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1624
1625   (use-package company
1626     :ensure t
1627     :diminish company-mode
1628     :init (setq company-idle-delay 0.1)
1629     :config
1630     (global-company-mode))
1631
1632 #+END_SRC
1633
1634 [[https://github.com/company-mode/company-statistics][company-statistics]]
1635
1636 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
1637
1638   (use-package company-statistics
1639     :ensure t
1640     :config
1641     (company-statistics-mode))
1642
1643 #+END_SRC
1644
1645 * Todo 
1646
1647 - change M-o to trigger to delete other windows and restore previous config
1648