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