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