+ ;(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
+
+** help-mode
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun sd/help-mode-hook ()
+ "Mapping for help mode"
+ (define-key help-mode-map "j" 'next-line)
+ (define-key help-mode-map "k" 'previous-line)
+ (define-key help-mode-map "h" 'forward-char)
+ (define-key help-mode-map "l" 'forward-char)
+ (define-key help-mode-map "H" 'describe-mode)
+ (define-key help-mode-map "v" 'recenter-top-bottom)
+ (define-key help-mode-map "i" 'forward-button)
+ (define-key help-mode-map "I" 'backward-button)
+ (define-key help-mode-map "o" 'ace-link-help))
+
+ (add-hook 'help-mode-hook 'sd/help-mode-hook)
+#+END_SRC
+
+Wiki [[http://stackoverflow.com/questions/3480173/show-keys-in-emacs-keymap-value][show-keys-in-emacs-keymap-value]], Helpplus mode can show keymap as human-readable, use ~describe-keymap~ or =C-h M-k=
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (el-get-bundle help-macro+
+ :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/help-macro+.el"
+ :features help-macro+)
+ (el-get-bundle help+
+ :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/help+.el"
+ :features help+)
+ (el-get-bundle help-fns+
+ :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/help-fns+.el"
+ :features help-fns+)
+ (el-get-bundle help-mode+
+ :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/help-mode+.el"
+ :features help-mode+)
+#+END_SRC
+
+** goto-last-change
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ;; (use-package goto-last-change
+ ;; :ensure t)
+#+END_SRC
+
+** Ag
+install =ag=, =the-silver-searcher= by homebrew on mac
+#+BEGIN_SRC sh
+brew install the-silver-searcher
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package ag
+ :ensure t)
+#+END_SRC
+
+** Local Variable hooks
+[[https://www.emacswiki.org/emacs/LocalVariables][LocalVariables]], use =hack-local-variables-hook=, run a hook to set local variable in mode hook
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ;; make Emacs run a new "local variables hook" for each major mode
+ (add-hook 'hack-local-variables-hook 'run-local-vars-mode-hook)
+
+ (defun run-local-vars-mode-hook ()
+ "Run a hook for the major-mode after the local variables have been processed."
+ (run-hooks (intern (concat (symbol-name major-mode) "-local-vars-hook"))))
+
+ ;; (add-hook 'c++-mode-local-vars-hook #'sd/c++-mode-local-vars)
+#+END_SRC
+
+** Table
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (add-hook 'text-mode-hook 'table-recognize)
+#+END_SRC
+
+** url-download
+To download file in =elisp=, best is =url-copy-file=, here refer [[http://stackoverflow.com/questions/4448055/download-a-file-with-emacs-lisp][download-a-file-with-emacs-lisp]] using =url-retrieve-synchronously= wrapping
+as a http download client tool
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun sd/download-file (&optional url download-dir download-name)
+ (interactive)
+ (let ((url (or url
+ (read-string "Enter download URL: ")))
+ (download-dir (read-directory-name "Save to (~/Downloads): " "~/Downloads" "~/Downloads" 'confirm' nil)))
+ (let ((download-buffer (url-retrieve-synchronously url)))
+ (save-excursion
+ (set-buffer download-buffer)
+ ;; we may have to trim the http response
+ (goto-char (point-min))
+ (re-search-forward "^$" nil 'move)
+ (forward-char)
+ (delete-region (point-min) (point))
+ (write-file (concat (or download-dir
+ "~/Downloads/")
+ (or download-name
+ (car (last (split-string url "/" t))))))))))
+#+END_SRC
+
+* Dired
+** Dired basic
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setq dired-dwim-target t)
+
+ (use-package dired-details
+ :ensure t
+ :config
+ (setq-default dired-details-hidden-string "--- ")
+ (dired-details-install))
+#+END_SRC
+
+** Dired functions
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun sd/dired-next-line (count)
+ "Move to next line, and always focus on the file name."
+ (interactive "p")
+ (dired-next-line count)
+ (dired-move-to-filename))
+
+ (defun sd/dired-previous-line (count)
+ "Move to previous line, and always focus on the file name."
+ (interactive "p")
+ (dired-previous-line count)
+ (dired-move-to-filename))
+
+ (defun sd/dired-up-directory ()
+ "Go to up directory"
+ (interactive)
+ (let ((old (current-buffer)))
+ (dired-up-directory)
+ (kill-buffer old)))
+#+END_SRC
+
+** 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)
+ (define-key dired-mode-map (kbd "o") 'other-window))
+
+ (use-package dired
+ :config