+ (defun hydra-move-splitter-right (arg)
+ "Move window splitter right."
+ (interactive "p")
+ (if (let ((windmove-wrap-around))
+ (windmove-find-other-window 'right))
+ (enlarge-window-horizontally arg)
+ (shrink-window-horizontally arg)))
+
+ (defun hydra-move-splitter-up (arg)
+ "Move window splitter up."
+ (interactive "p")
+ (if (let ((windmove-wrap-around))
+ (windmove-find-other-window 'up))
+ (enlarge-window arg)
+ (shrink-window arg)))
+
+ (defun hydra-move-splitter-down (arg)
+ "Move window splitter down."
+ (interactive "p")
+ (if (let ((windmove-wrap-around))
+ (windmove-find-other-window 'up))
+ (shrink-window arg)
+ (enlarge-window arg)))
+
+#+END_SRC
+
+*** hydra misc
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defhydra sd/hydra-misc (:color red :columns nil)
+ "Misc"
+ ("e" eshell "eshell" :exit t)
+ ("p" (lambda ()
+ (interactive)
+ (if (not (eq nil (get-buffer "*Packages*")))
+ (switch-to-buffer "*Packages*")
+ (package-list-packages)))
+ "list-package" :exit t)
+ ("g" magit-status "git-status" :exit t)
+ ("'" mode-line-other-buffer "last buffer" :exit t)
+ ("C-'" mode-line-other-buffer "last buffer" :exit t)
+ ("m" man "man" :exit t)
+ ("d" dired-jump "dired" :exit t)
+ ("b" ibuffer "ibuffer" :exit t)
+ ("q" nil "quit")
+ ("f" nil "quit"))
+
+ (global-set-key (kbd "C-'") 'sd/hydra-misc/body)
+#+END_SRC
+
+*** hydra launcher
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defhydra sd/hydra-launcher (:color blue :columns 2)
+ "Launch"
+ ("e" emms "emms" :exit t)
+ ("q" nil "cancel"))
+#+END_SRC
+
+** Line Number
+
+Enable linum mode on programming modes
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (add-hook 'prog-mode-hook 'linum-mode)
+ ;; (add-hook 'prog-mode-hook (lambda ()
+ ;; (setq-default indicate-empty-lines t)))
+#+END_SRC
+
+Fix the font size of line number
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+
+ (defun fix-linum-size ()
+ (interactive)
+ (set-face-attribute 'linum nil :height 110))
+
+ (add-hook 'linum-mode-hook 'fix-linum-size)
+
+#+END_SRC
+
+I like [[https://github.com/coldnew/linum-relative][linum-relative]], just like the =set relativenumber= on =vim=
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+
+ (use-package linum-relative
+ :ensure t
+ :config
+ (defun linum-new-mode ()
+ "If line numbers aren't displayed, then display them.
+ Otherwise, toggle between absolute and relative numbers."
+ (interactive)
+ (if linum-mode
+ (linum-relative-toggle)
+ (linum-mode 1)))
+
+ :bind
+ ("A-k" . linum-new-mode))
+
+ ;; auto enable linum-new-mode in programming modes
+ (add-hook 'prog-mode-hook 'linum-relative-mode)
+
+#+END_SRC
+
+** Save File Position
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+
+ (require 'saveplace)
+ (setq-default save-place t)
+ (setq save-place-forget-unreadable-files t)
+ (setq save-place-skip-check-regexp "\\`/\\(?:cdrom\\|floppy\\|mnt\\|/[0-9]\\|\\(?:[^@/:]*@\\)?[^@/:]*[^@/:.]:\\)")
+
+#+END_SRC
+
+** Multi-term
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+
+ (use-package multi-term
+ :ensure t)
+
+#+END_SRC
+
+** ace-link
+
+[[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
+Type =o= to go to the link
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+
+ (use-package ace-link
+ :ensure t
+ :init
+ (ace-link-setup-default))
+
+#+END_SRC
+
+** Smart Parens
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+
+ (use-package smartparens
+ :ensure t
+ :config
+ (progn
+ (require 'smartparens-config)
+ (add-hook 'prog-mode-hook 'smartparens-mode)))
+
+#+END_SRC
+
+** Ace-Windows
+
+[[https://github.com/abo-abo/ace-window][ace-window]]
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+
+ (use-package ace-window
+ :ensure t
+ :defer t
+ ; :init
+ ; (global-set-key (kbd "M-o") 'ace-window)
+ :config
+ (setq aw-keys '(?a ?s ?d ?f ?j ?k ?l)))
+
+#+END_SRC
+
+** Which key
+
+[[https://github.com/justbur/emacs-which-key][which-key]] show the key bindings
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+
+ (use-package which-key
+ :ensure t
+ :config
+ (which-key-mode))
+
+#+END_SRC
+
+** View only for some directory
+When see function by =C-h f=, and visit the source code, I would like the buffer is read only. See [[http://emacs.stackexchange.com/questions/3676/how-to-enter-view-only-mode-when-browsing-emacs-source-code-from-help/3681#3681][here]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (dir-locals-set-class-variables
+ 'emacs
+ '((nil . ((buffer-read-only . t)
+ (show-trailing-whitespace . nil)
+ (tab-width . 8)
+ (eval . (whitespace-mode -1))
+ (eval . (when buffer-file-name
+ (setq-local view-no-disable-on-exit t)
+ (view-mode-enter)))))))
+
+ ;; (dir-locals-set-directory-class (expand-file-name "/usr/local/share/emacs") 'emacs)
+ (dir-locals-set-directory-class "/usr/local/Cellar/emacs" 'emacs)
+ ;; (dir-locals-set-directory-class "~/.emacs.d/elpa" 'emacs)
+ (dir-locals-set-directory-class "~/dotfiles/emacs.d/elpa" 'emacs)
+ (dir-locals-set-directory-class "~/dotfiles/emacs.d/el-get" 'emacs)
+#+END_SRC
+
+** Info plus
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (el-get-bundle info+
+ :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/info+.el"
+ ;; (require 'info+)
+ )
+
+ (with-eval-after-load 'info
+ (require 'info+))
+#+END_SRC
+
+** TODO bookmark
+
+** TODO Calendar
+** advice info
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun sd/info-mode ()
+ (interactive)
+ (unless (equal major-mode 'Info-mode)
+ (unless (> (length (window-list)) 1)
+ (split-window-right))
+ (other-window 1)
+ ;; (info)
+ ))
+
+ ;; (global-set-key (kbd "C-h i") 'sd/info-mode)
+
+ ;; open Info buffer in other window instead of current window
+ (defadvice info (before my-info (&optional file buf) activate)
+ (sd/info-mode))
+
+ (defadvice Info-exit (after my-info-exit activate)
+ (sd/delete-current-window))
+#+END_SRC
+
+** TODO Man mode
+Color for Man-mode
+
+** TODO UTF8
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ;; (set-language-environment "UTF-8")
+ ;; (set-default-coding-systems 'utf-8)
+#+END_SRC
+
+** Demo It
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ;; (el-get-bundle howardabrams/demo-it)
+
+ (use-package org-tree-slide
+ :ensure t)
+
+ ;; (use-package yasnippet
+ ;; :ensure t)
+#+END_SRC
+
+** Presentation
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package org-tree-slide
+ :ensure
+ :config
+ ;; (define-key org-mode-map "\C-ccp" 'org-tree-slide-mode)
+ (define-key org-tree-slide-mode-map (kbd "<ESC>") 'org-tree-slide-content)
+ (define-key org-tree-slide-mode-map (kbd "<SPACE>") 'org-tree-slide-move-next-tree)
+ (define-key org-tree-slide-mode-map [escape] 'org-tree-slide-move-previous-tree))
+#+END_SRC
+
+** pdf-tools
+#+BEGIN_SRC sh
+ brew install poppler
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package pdf-tools
+ :ensure t
+ :init
+ ;; run to complete the installation
+ (pdf-tools-install)
+ :config
+ (add-to-list 'auto-mode-alist '("\.pdf$" . pdf-view-mode))
+ (add-hook 'pdf-outline-buffer-mode-hook #'sd/pdf-outline-map))
+
+ (defun sd/pdf-outline-map ()
+ "My keybindings in pdf-outline-map"
+ (interactive)
+ (define-key pdf-outline-buffer-mode-map (kbd "C-o") nil)
+ (define-key pdf-outline-buffer-mode-map (kbd "i") 'outline-toggle-children)
+ (define-key pdf-outline-buffer-mode-map (kbd "j") 'next-line)
+ (define-key pdf-outline-buffer-mode-map (kbd "k") 'previous-line))
+#+END_SRC
+
+* Dired
+** Dired bindings
+=C-o= is defined as a global key for window operation, here unset it in dired mode
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun sd/dired-key-map ()
+ "My keybindings for dired"
+ (interactive)
+ ;; these two prefix are used globally
+ (define-key dired-mode-map (kbd "C-o") nil)
+ (define-key dired-mode-map (kbd "M-s") nil)
+ ;; toggle hidden files
+ (define-key dired-mode-map (kbd "H") 'dired-omit-mode)
+ ;; scroll
+ (define-key dired-mode-map (kbd "SPC") 'scroll-up-command)
+ (define-key dired-mode-map (kbd "DEL") 'scroll-down-command)
+ (define-key dired-mode-map (kbd "j") 'diredp-next-line)
+ (define-key dired-mode-map (kbd "k") 'diredp-previous-line)
+ (define-key dired-mode-map (kbd "g") 'dired-goto-file)
+ ;; (define-key dired-mode-map (kbd "S-SPC") 'scroll-down-command)
+ ;; jump to fil/dirs
+ (define-key dired-mode-map (kbd "f") 'dired-isearch-filenames)
+ ;; subdir
+ ;; i dired-maybe-insert-subdir
+ ;; o dired-find-file-other-window (switch to other window)
+ ;; O dired-display-file
+ (define-key dired-mode-map (kbd "G") 'ido-dired)
+ (define-key dired-mode-map (kbd "c") 'sd/dired-new-file)
+ (define-key dired-mode-map (kbd "h") 'dired-summary)
+ (define-key dired-mode-map (kbd "r") 'revert-buffer)
+ (define-key dired-mode-map (kbd "l") 'dired-display-file)
+ (define-key dired-mode-map [C-backspace] 'dired-up-directory)
+ (define-key dired-mode-map (kbd "?") 'describe-mode)
+ (define-key dired-mode-map (kbd "z") #'sd/dired-get-size)
+ (define-key dired-mode-map (kbd "C-d") 'dired-kill-subdir)
+ (define-key dired-mode-map (kbd "M-d") 'dired-kill-subdir)
+ (define-key dired-mode-map (kbd "J") 'diredp-next-subdir)
+ (define-key dired-mode-map (kbd "TAB") 'diredp-next-subdir)
+ (define-key dired-mode-map (kbd "K") 'diredp-prev-subdir)
+ (define-key dired-mode-map (kbd "O") 'dired-display-file)
+ (define-key dired-mode-map (kbd "I") 'other-window))
+
+ (use-package dired
+ :config
+ (require 'dired-x)
+ ;; also load dired+
+ (use-package dired+
+ :ensure t
+ :init (setq diredp-hide-details-initially-flag nil))
+
+ (setq dired-omit-mode t)
+ (setq dired-omit-files (concat dired-omit-files "\\|^\\..+$"))
+ (add-hook 'dired-mode-hook (lambda ()
+ (sd/dired-key-map)
+ (dired-omit-mode))))
+
+ (defadvice dired-summary (around sd/dired-summary activate)
+ "Revisied dired summary."
+ (interactive)
+ (dired-why)
+ (message
+ "Δ: d-delete, u-ndelete, x-punge, f-ind, o-ther window, R-ename, C-opy, c-create, +new dir, r-evert, /-filter, h-summary, ?-help"))
+
+ (defun sd/dired-high-level-dir ()
+ "Go to higher level directory"
+ (interactive)
+ (find-alternate-file ".."))
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun sd/dired-new-file ()
+ "Create a new file in dired mode"
+ (interactive)
+ (call-interactively 'find-file))
+
+ ;; copied from abo-abo's config
+ (defun sd/dired-get-size ()
+ (interactive)
+ (let ((files (dired-get-marked-files)))
+ (with-temp-buffer
+ (apply 'call-process "/usr/bin/du" nil t nil "-sch" files)
+ (message
+ "Size of all marked files: %s"
+ (progn
+ (re-search-backward "\\(^[ 0-9.,]+[A-Za-z]+\\).*total$")
+ (match-string 1))))))
+#+END_SRC
+
+** disable ido when dired new file
+When create a new directory, I want to disalbe =ido= completion. see [[http://stackoverflow.com/questions/7479565/emacs-ido-mode-and-creating-new-files-in-directories-it-keeps-changing-the-dire][here]]. Thhis code snippets copied
+from [[https://emacs.stackexchange.com/questions/13713/how-to-disable-ido-in-dired-create-directory/13795#13795?newreg%3Ddb17c20f7af3490fb11cf15f1d888e9e][How to disable IDO in ‘dired-create-directory’]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun mk-anti-ido-advice (func &rest args)
+ "Temporarily disable IDO and call function FUNC with arguments ARGS."
+ (interactive)
+ (let ((read-file-name-function #'read-file-name-default))
+ (if (called-interactively-p 'any)
+ (call-interactively func)
+ (apply func args))))
+
+ (defun mk-disable-ido (command)
+ "Disable IDO when command COMMAND is called."
+ (advice-add command :around #'mk-anti-ido-advice))
+#+END_SRC
+
+Disalble =ido= when new a directory or file in =dired= mode
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ;; call the function which you want to disable ido
+ (mk-disable-ido 'dired-create-directory)
+ (mk-disable-ido 'sd/dired-new-file)
+#+END_SRC
+
+** Dired open with
+=!= =dired-do-shell-command=
+=&= =dired-do-async-shell-command=
+here on Mac, just use "open" commands to pen =.pdf=, =.html= and image files
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setq dired-guess-shell-alist-user
+ '(("\\.pdf\\'" "open" "okular")
+ ("\\.\\(?:djvu\\|eps\\)\\'" "evince")
+ ("\\.\\(?:jpg\\|jpeg\\|png\\|gif\\|xpm\\)\\'" "open")
+ ("\\.\\(?:xcf\\)\\'" "gimp")
+ ("\\.csv\\'" "libreoffice")
+ ("\\.tex\\'" "pdflatex" "latex")
+ ("\\.\\(?:mp4\\|mkv\\|avi\\|flv\\|ogv\\)\\(?:\\.part\\)?\\'" "mplayer")
+ ("\\.\\(?:mp3\\|flac\\)\\'" "rhythmbox")
+ ("\\.html?\\'" "open")
+ ("\\.dmg\\'" "open")
+ ("\\.cue?\\'" "audacious")))
+
+
+ (defun sd/dired-start-process (cmd &optional file-list)
+ (interactive
+ (let ((files (dired-get-marked-files
+ t current-prefix-arg)))
+ (list
+ (unless (eq system-type 'windows-nt)
+ (dired-read-shell-command "& on %s: "
+ current-prefix-arg files))
+ files)))
+
+ (if (eq system-type 'windows-nt)
+ (dolist (file file-list)
+ (w32-shell-execute "open" (expand-file-name file)))
+ (let (list-switch)
+ (start-process
+ cmd nil shell-file-name
+ shell-command-switch
+ (format
+ "nohup 1>/dev/null 2>/dev/null %s \"%s\""
+ cmd
+ ;; (if (and (> (length file-list) 1)
+ ;; (setq list-switch
+ ;; (cadr (assoc cmd ora-dired-filelist-cmd))))
+ ;; (format "%s %s" cmd list-switch)
+ ;; cmd)
+ (mapconcat #'expand-file-name file-list "\" \""))))))
+#+END_SRC
+
+** dired-hacks
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package dired-hacks-utils
+ :ensure t
+ :defer t)
+#+END_SRC
+
+** dired-narrow
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ;;narrow dired to match filter
+ (use-package dired-narrow
+ :ensure t
+ :commands (dired-narrow)
+ :bind (:map dired-mode-map
+ ("/" . dired-narrow)))
+#+END_SRC
+
+* Ibuffer
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (global-set-key (kbd "s-b") 'ibuffer)
+
+ (with-eval-after-load 'ibuffer
+ (define-key ibuffer-mode-map (kbd "C-o") nil)
+ (define-key ibuffer-mode-map (kbd "j") 'ibuffer-forward-line)
+ (define-key ibuffer-mode-map (kbd "k") 'ibuffer-backward-line)
+ (define-key ibuffer-mode-map (kbd "r") 'ibuffer-update)
+ (define-key ibuffer-mode-map (kbd "g") 'ibuffer-jump-to-buffer)
+ (define-key ibuffer-mode-map (kbd "h") 'sd/ibuffer-summary))
+
+ (defun sd/ibuffer-summary ()
+ "Show summary of keybindings in ibuffer mode"
+ (interactive)
+ (message
+ "Β: m|u - (un)mark, /-filter, //-remove filter, t, RET, g, k, S, D, Q; q to quit; h for help"))
+#+END_SRC
+
+* Completion
+company mode and company-statistics
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package company
+ :ensure t
+ :diminish company-mode
+ :init (setq company-idle-delay 0.1)
+ :config
+ (global-company-mode))
+
+ (use-package company-statistics
+ :ensure t
+ :config
+ (company-statistics-mode))
+#+END_SRC
+
+* Programming Language
+** Emacs Lisp
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package color-identifiers-mode
+ :ensure t
+ :init
+ (add-hook 'emacs-lisp-mode-hook 'color-identifiers-mode)
+
+ :diminish color-identifiers-mode)
+
+ (global-prettify-symbols-mode t)
+#+END_SRC
+
+In Lisp Mode, =M-o= is defined, but I use this for global hydra window. So here disable this key
+bindings in =lispy-mode-map= after loaded. see [[http://stackoverflow.com/questions/298048/how-to-handle-conflicting-keybindings][here]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package lispy
+ :ensure t
+ :init
+ (eval-after-load "lispy"
+ `(progn
+ (define-key lispy-mode-map (kbd "M-o") nil)))
+ :config
+ (add-hook 'emacs-lisp-mode-hook (lambda () (lispy-mode 1))))
+#+END_SRC
+
+** Perl
+*** CPerl mode
+[[https://www.emacswiki.org/emacs/CPerlMode][CPerl mode]] has more features than =PerlMode= for perl programming. Alias this to =CPerlMode=
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defalias 'perl-mode 'cperl-mode)
+
+ ;; (setq cperl-hairy t)
+ ;; Turns on most of the CPerlMode options
+ (setq cperl-auto-newline t)
+ (setq cperl-highlight-variables-indiscriminately t)
+ ;(setq cperl-indent-level 4)
+ ;(setq cperl-continued-statement-offset 4)
+ (setq cperl-close-paren-offset -4)
+ (setq cperl-indent-parents-as-block t)
+ (setq cperl-tab-always-indent t)
+ ;(setq cperl-brace-offset 0)
+
+ (add-hook 'cperl-mode-hook
+ '(lambda ()
+ (cperl-set-style "C++")))
+
+ (defalias 'perldoc 'cperl-perldoc)
+#+END_SRC
+
+*** Perl template
+Refer [[https://www.emacswiki.org/emacs/AutoInsertMode][AutoInsertMode]] Wiki
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (eval-after-load 'autoinsert
+ '(define-auto-insert '("\\.pl\\'" . "Perl skeleton")
+ '(
+ "Empty"
+ "#!/usr/bin/perl -w" \n
+ \n
+ "use strict;" > \n \n
+ > _
+ )))