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