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
* Basic Settings
-
** Setting loading Path
Set system PATH and emacs exec path
Set the emacs load path
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
- (add-to-list 'load-path "~/.emacs.d/elisp")
-
+ ;; (add-to-list 'load-path "~/.emacs.d/elisp")
#+END_SRC
** Package Initialization
#+END_SRC
** General Setting
-
-Disable scroll bar, tool-bar and menu-bar
-
+*** scroll bar, tool-bar and menu-bar
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
(scroll-bar-mode 0)
(tool-bar-mode 0)
(menu-bar-mode 1)
- (setq debug-on-error t)
+ ;; (setq debug-on-error t)
(setq inhibit-startup-message t)
(defalias 'yes-or-no-p 'y-or-n-p)
(setq make-backup-files nil)
#+END_SRC
-set custom file
-
+*** Custom file
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
(setq custom-file "~/.emacs.d/custom.el")
(if (file-exists-p custom-file)
(load custom-file))
+#+END_SRC
+*** Switch the focus to help window when it appears
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setq help-window-select t)
#+END_SRC
-Switch the focus to help window when it appears
+*** Set default window size
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setq initial-frame-alist
+ '((width . 120)
+ (height . 50)))
+
+ ;; (setq-default indicate-empty-lines t)
+#+END_SRC
+*** Stop auto save
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setq auto-save-default nil)
- (setq help-window-select t)
+ ;; restore last session
+ ;; (desktop-save-mode t)
+#+END_SRC
+
+*** temp folder
+Make a temp directory for all cache/history files
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defconst sd-temp-directory
+ (file-name-as-directory "~/.emacs.d/temp"))
+ (unless (file-exists-p sd-temp-directory)
+ (mkdir sd-temp-directory))
#+END_SRC
-Setting scroll right/left
+*** Save minibuffer history
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
- ; (global-set-key (kbd "C-,") 'scoll-left)
- ; (global-set-key (kbd "C-.") 'scoll-right)
+ (setq savehist-file (concat sd-temp-directory "history"))
+ (setq history-length 1000)
+ (setq savehist-additional-variables '(kill-ring search-ring regexp-search-ring))
+ (savehist-mode 1)
+
+ ;; set temp file path for recentf and auto-save
+ (setq recentf-save-file (concat sd-temp-directory "recentf"))
+ (setq auto-save-list-file-prefix (concat sd-temp-directory "auto-save-list/.saves-"))
#+END_SRC
* Package Management Tools
** Use-package
-
Using [[https://github.com/jwiegley/use-package][use-package]] to manage emacs packages
-
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
(unless (package-installed-p 'use-package)
(package-refresh-contents)
(package-install 'use-package))
(require 'use-package)
-
#+END_SRC
** El-get
-
[[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.
Check out [[http://tapoueh.org/emacs/el-get.html][el-get]].
-
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
(use-package el-get
:ensure t
:init
(add-to-list 'load-path "~/.emacs.d/el-get"))
+#+END_SRC
+** paradox
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package paradox
+ :ensure t)
#+END_SRC
* Color and Fonts Settings
(auto-revert-mode . "")
;; default is Ind
(org-indent-mode . "")
+ ;; default is Fly
+ (flyspell-mode . "")
+ (irony-mode . "I")
;; Major modes
(lisp-interaction-mode . "λ")
(hi-lock-mode . "")
#+END_SRC
Revised powerline-center-theme
-
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
(defun sd/powerline-simpler-vc (s)
(if s
(replace-regexp-in-string "Git[:-]" "" s)
s))
+ (defface sd/powerline-active1 '((t (:background "yellow" :foreground "black" :inherit mode-line)))
+ "My Powerline face 1 based on powerline-active1."
+ :group 'powerline)
+
+ (defface sd/buffer-modified-active1 '((t (:background "red" :foreground "black" :inherit mode-line)))
+ "My Powerline face 1 based on powerline-active1."
+ :group 'powerline)
+
+ (defface sd/buffer-view-active1 '((t (:background "green" :foreground "black" :inherit mode-line)))
+ "My Powerline face 1 based on powerline-active1."
+ :group 'powerline)
+
+ (defface sd/mode-line-buffer-id
+ '((t (:background "yellow" :foreground "black" :inherit mode-line-buffer-id)))
+ "My powerline mode-line face, based on mode-line-buffer-id"
+ :group 'powerline)
+
+ ;; Don't show buffer modified for scratch and eshell mode
+ (defun sd/buffer-is-eshel-or-scratch ()
+ "Dot not show modified indicator for buffers"
+ (interactive)
+ (unless (or (string-match "*scratch*" (buffer-name))
+ (equal major-mode 'eshell-mode))
+ t))
+
(defun sd/powerline-center-theme_revised ()
"Setup a mode-line with major and minor modes centered."
(interactive)
'("%e"
(:eval
(let* ((active (powerline-selected-window-active))
- (mode-line-buffer-id (if active 'mode-line-buffer-id 'mode-line-buffer-id-inactive))
+ (mode-line-buffer-id (if active 'sd/mode-line-buffer-id 'mode-line-buffer-id-inactive))
(mode-line (if active 'mode-line 'mode-line-inactive))
+ (my-face1 (if active 'sd/powerline-active1 'powerline-inactive1))
+ (my-face-buffer-modified (if (and (sd/buffer-is-eshel-or-scratch) (buffer-modified-p) (not buffer-read-only))
+ 'sd/buffer-modified-active1
+ (if buffer-read-only 'sd/buffer-view-active1
+ my-face1)))
(face1 (if active 'powerline-active1 'powerline-inactive1))
(face2 (if active 'powerline-active2 'powerline-inactive2))
(separator-left (intern (format "powerline-%s-%s"
(separator-right (intern (format "powerline-%s-%s"
(powerline-current-separator)
(cdr powerline-default-separator-dir))))
- (lhs (list (powerline-raw "%*" mode-line 'l)
+ (lhs (list (powerline-raw "%* " my-face-buffer-modified 'l)
;; (powerline-buffer-size mode-line 'l)
(powerline-buffer-id mode-line-buffer-id 'l)
- (powerline-raw " ")
- (funcall separator-left mode-line face1)
+ (powerline-raw " " my-face1)
+ (funcall separator-left my-face1 face1)
(powerline-narrow face1 'l)
;; (powerline-vc face1)
- (sd/powerline-simpler-vc (powerline-vc face1))
- ))
+ (sd/powerline-simpler-vc (powerline-vc face1))))
(rhs (list (powerline-raw global-mode-string face1 'r)
(powerline-raw "%4l" face1 'r)
- (powerline-raw ":" face1)
+ (powerline-raw ":" face1)
(powerline-raw "%3c" face1 'r)
- (funcall separator-right face1 mode-line)
- (powerline-raw " ")
- (powerline-raw "%6p" mode-line 'r)
- (powerline-hud face2 face1)))
+ (funcall separator-right face1 my-face1)
+ ;; (powerline-raw " " my-face1)
+ (powerline-raw (format-time-string " %I:%M %p ") my-face1 'r)
+ ;; (powerline-raw "%6p" my-face1 'r)
+ ;; (powerline-hud my-face1 face1 )
+ ))
(center (list (powerline-raw " " face1)
(funcall separator-left face1 face2)
(when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode)
#+END_SRC
Fix the issue in mode line when showing triangle
-
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
(setq ns-use-srgb-colorspace nil)
#+END_SRC
set height in mode line
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (set-variable 'powerline-height 14)
+ (set-variable 'powerline-text-scale-factor (/ (float 100) 140))
+ ;; (custom-set-variables
+ ;; '(powerline-height 14)
+ ;; '(powerline-text-scale-factor (/ (float 100) 140)))
+ ;; 100/140;0.8
+ (set-face-attribute 'mode-line nil :height 100)
+#+END_SRC
+* IDO & SMEX
+** IDO
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package ido
+ :ensure t
+ :init (setq ido-enable-flex-matching t
+ ido-ignore-extensions t
+ ido-use-virtual-buffers t
+ ido-everywhere t)
+ (setq ido-save-directory-list-file (concat sd-temp-directory "ido.last"))
+ :config
+ (ido-mode 1)
+ (ido-everywhere 1)
+ (add-to-list 'completion-ignored-extensions ".pyc"))
+
+ (icomplete-mode t)
+#+END_SRC
+
+** FLX
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package flx-ido
+ :ensure t
+ :init (setq ido-enable-flex-matching t
+ ido-use-faces nil)
+ :config (flx-ido-mode 1))
+#+END_SRC
+
+** IDO-vertically
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package ido-vertical-mode
+ :ensure t
+ :init
+ (setq ido-vertical-define-keys 'C-n-C-p-up-and-down)
+ :config
+ (ido-vertical-mode 1))
+#+END_SRC
+
+** SMEX
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package smex
+ :ensure t
+ :init
+ (setq smex-save-file (concat sd-temp-directory "smex-items"))
+ (smex-initialize)
+ :bind
+ ("M-x" . smex)
+ ("M-X" . smex-major-mode-commands))
+#+END_SRC
+
+** Ido-ubiquitous
+Use [[https://github.com/DarwinAwardWinner/ido-ubiquitous][ido-ubiquitous]] for ido everywhere. It makes =describe-function= can also use ido
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package ido-ubiquitous
+ :ensure t
+ :init
+ (setq magit-completing-read-function 'magit-ido-completing-read)
+ (setq gnus-completing-read-function 'gnus-ido-completing-read)
+ :config
+ (ido-ubiquitous-mode 1))
+#+END_SRC
+
+** Ido-exit-target
+[[https://github.com/waymondo/ido-exit-target][ido-exit-target]] let you open file/buffer on =other-windows= when call =ido-switch-buffer=
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package ido-exit-target
+ :ensure t
+ :init
+ (mapcar (lambda (map)
+ (define-key map (kbd "C-j") #'ido-exit-target-split-window-right)
+ (define-key map (kbd "C-k") #'ido-exit-target-split-window-below))
+ (list ido-buffer-completion-map
+ ;; ido-common-completion-map
+ ido-file-completion-map
+ ido-file-dir-completion-map)))
+#+END_SRC
+
+** Counsel
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package counsel
+ :ensure t
+ :defer t
+ :init
+ (global-set-key (kbd "M-x") 'counsel-M-x)
+ (global-set-key (kbd "C-h f") 'counsel-describe-function)
+ (global-set-key (kbd "C-h v") 'counsel-describe-variable)
+ ;; (set-face-attribute 'ivy-current-match nil :background "Orange" :foreground "black")
+ (define-key read-expression-map (kbd "C-r") 'counsel-expression-history)
+ (global-set-key (kbd "C-c C-r") 'ivy-resume))
+
- (custom-set-variables
- '(powerline-height 14)
- '(powerline-text-scale-factor 0.8))
- ;; 100/140
- (set-face-attribute 'mode-line nil :height 100)
+ ;; (global-set-key "\C-s" 'swiper)
+ ;; (global-set-key (kbd "<f6>") 'ivy-resume)
+ ;; ;; (global-set-key (kbd "C-x C-f") 'counsel-find-file)
+ ;; (global-set-key (kbd "<f1> l") 'counsel-load-library)
+ ;; (global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
+ ;; (global-set-key (kbd "<f2> u") 'counsel-unicode-char)
+ ;; (global-set-key (kbd "C-c g") 'counsel-git)
+ ;; (global-set-key (kbd "C-c j") 'counsel-git-grep)
+ ;; (global-set-key (kbd "C-c k") 'counsel-ag)
+ ;; (global-set-key (kbd "C-x l") 'counsel-locate)
+ ;; (global-set-key (kbd "C-S-o") 'counsel-rhythmbox)
+
+ ;; (set-face-attribute
+ ;; 'ivy-current-match nil
+ ;; :background "Orange"
+ ;; :foreground "black")
+
+ ;; ivy-resume
+ ;; (define-key swiper-map (kbd "M-%") 'swiper-aa-replace)
+#+END_SRC
+
+** helm
+let helm windows split inside current window
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (with-eval-after-load 'helm
+ (setq helm-split-window-in-side-p t))
#+END_SRC
* Org-mode Settings
Always indents header, and hide header leading starts so that no need type =#+STATUP: indent=
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
(use-package org
:ensure t
:init
(scheme . t)
(sh . t)
(sqlite . t)
- (js . t)))
+ (js . t)
+ (gnuplot . t)
+ (ditaa . t)))
;; use current window for org source buffer editting
(setq org-src-window-setup 'current-window )
+ (define-key org-mode-map (kbd "C-'") nil)
+ ;; C-M-i is mapped to imenu globally
+ (define-key org-mode-map (kbd "C-M-i") nil)
+
+ ;; set the ditta.jar path
+ (setq org-ditaa-jar-path "/usr/local/Cellar/ditaa/0.9/libexec/ditaa0_9.jar")
+ (unless
+ (file-exists-p org-ditaa-jar-path)
+ (error "seudut: ditaa.jar not found at %s " org-ditaa-jar-path))
#+END_SRC
** Org-bullets
(org-bullets-mode t))))
(setq org-bullets-bullet-list '("⦿" "✪" "◉" "○" "►" "◆"))
+
+ ;; increase font size when enter org-src-mode
+ (add-hook 'org-src-mode-hook (lambda () (text-scale-increase 2)))
#+END_SRC
** Worf Mode
#+END_SRC
** Export PDF
-
-Install MacTex-basic and some tex packages
-
-#+BEGIN_SRC bash
-
+Install MacTex-basic [[http://www.tug.org/mactex/morepackages.html][MacTex-basic]] and some tex packages
+#+BEGIN_SRC sh
sudo tlmgr update --self
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
-
#+END_SRC
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
#+END_SRC
* Magit
-
[[https://github.com/magit/magit][Magit]] is a very cool git interface on Emacs.
-
+and Defined keys, using vi keybindings, Refer abo-abo's setting [[https://github.com/abo-abo/oremacs/blob/c5cafdcebc88afe9e73cc8bd40c49b70675509c7/modes/ora-nextmagit.el][here]]
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
(use-package magit
:ensure t
- :commands magit-status magit-blame)
-
+ :init
+ ;; don't ask me to confirm the unsaved change
+ (setq magit-save-repository-buffers nil)
+ ;; default is 50
+ (setq git-commit-summary-max-length 80)
+ :commands magit-status magit-blame
+ :config
+ (dolist (map (list magit-status-mode-map
+ magit-log-mode-map
+ magit-diff-mode-map
+ magit-staged-section-map))
+ (define-key map "j" 'magit-section-forward)
+ (define-key map "k" 'magit-section-backward)
+ (define-key map "D" 'magit-discard)
+ (define-key map "O" 'magit-discard-file)
+ (define-key map "n" nil)
+ (define-key map "p" nil)
+ (define-key map "v" 'recenter-top-bottom)
+ (define-key map "i" 'magit-section-toggle)))
#+END_SRC
-Defined keys, using vi keybindings, Refer abo-abo's setting [[https://github.com/abo-abo/oremacs/blob/c5cafdcebc88afe9e73cc8bd40c49b70675509c7/modes/ora-nextmagit.el][here]]
+* Eshell
+** Eshell alias
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
- (dolist (map (list magit-status-mode-map
- magit-log-mode-map
- magit-diff-mode-map
- magit-staged-section-map))
- (define-key map "j" 'magit-section-forward)
- (define-key map "k" 'magit-section-backward)
- (define-key map "n" nil)
- (define-key map "p" nil)
- (define-key map "v" 'recenter-top-bottom)
- (define-key map "i" 'magit-section-toggle))
+ (defalias 'e 'find-file)
+ (defalias 'ff 'find-file)
+ (defalias 'ee 'find-files)
#+END_SRC
-* IDO & SMEX
-
-** IDO
-
+** eshell temp directory
+set default eshell history folder
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setq eshell-directory-name (concat sd-temp-directory "eshell"))
+#+END_SRC
- (use-package ido
- :ensure t
- :init (setq ido-enable-flex-matching t
- ido-ignore-extensions t
- ido-use-virtual-buffers t
- ido-everywhere t)
- :config
- (ido-mode 1)
- (ido-everywhere 1)
- (add-to-list 'completion-ignored-extensions ".pyc"))
-
- (icomplete-mode t)
+** Eshell erase buffer
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun sd/eshell-clear-buffer ()
+ "Clear eshell buffer"
+ (interactive)
+ (let ((inhibit-read-only t))
+ (erase-buffer)
+ (eshell-send-input)))
+ (add-hook 'eshell-mode-hook (lambda ()
+ (local-set-key (kbd "C-l") 'sd/eshell-clear-buffer)))
#+END_SRC
-** FLX
-
+** Toggle Eshell
+Toggle an eshell in split window below, refer [[http://www.howardism.org/Technical/Emacs/eshell-fun.html][eshell-here]]
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun sd/window-has-eshell ()
+ "Check if current windows list has a eshell buffer, and return the window"
+ (interactive)
+ (let ((ret nil))
+ (walk-windows (lambda (window)
+ (if (equal (with-current-buffer (window-buffer window) major-mode)
+ 'eshell-mode)
+ (setq ret window)))
+ nil nil)
+ ret))
+
+ (defun sd/toggle-eshell-here ()
+ "Toggle a eshell buffer vertically"
+ (interactive)
+ (if (sd/window-has-eshell)
+ (if (equal major-mode 'eshell-mode)
+ (progn
+ (if (equal (length (window-list)) 1)
+ (mode-line-other-buffer)
+ (delete-window)))
+ (select-window (sd/window-has-eshell)))
+ (progn
+ (let ((dir default-directory))
+
+ (split-window-vertically (- (/ (window-total-height) 3)))
+ (other-window 1)
+ (unless (and (boundp 'eshell-buffer-name) (get-buffer eshell-buffer-name))
+ (eshell))
+ (switch-to-buffer eshell-buffer-name)
+ (goto-char (point-max))
+ (eshell-kill-input)
+ (insert (format "cd %s" dir))
+ (eshell-send-input)))))
- (use-package flx-ido
- :ensure t
- :init (setq ido-enable-flex-matching t
- ido-use-faces nil)
- :config (flx-ido-mode 1))
-
+ ;; (global-unset-key (kbd "M-`"))
+ (global-set-key (kbd "s-e") 'sd/toggle-eshell-here)
#+END_SRC
-** IDO-vertically
-
+** exec-path-from-shell
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
- (use-package ido-vertical-mode
+ (use-package exec-path-from-shell
:ensure t
- :init
- (setq ido-vertical-define-keys 'C-n-C-p-up-and-down)
:config
- (ido-vertical-mode 1))
-
+ (exec-path-from-shell-initialize))
#+END_SRC
-** SMEX
+** TODO smart display
+* Misc Settings
+** [[https://github.com/abo-abo/hydra][Hydra]]
+*** hydra install
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
- (use-package smex
- :ensure t
- :init (smex-initialize)
- :bind
- ("M-x" . smex)
- ("M-X" . smex-major-mode-commands))
-
+ (use-package hydra
+ :ensure t)
+ ;; disable new line in minibuffer when hint hydra
+ (setq hydra-lv nil)
#+END_SRC
-** Ido-ubiquitous
+*** Windmove Splitter
-Use [[https://github.com/DarwinAwardWinner/ido-ubiquitous][ido-ubiquitous]] for ido everywhere. It makes =describe-function= can also use ido
+Refer [[https://github.com/abo-abo/hydra/blob/master/hydra-examples.el][hydra-example]], to enlarge or shrink the windows splitter
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
- (use-package ido-ubiquitous
- :ensure t
- :init
- (setq magit-completing-read-function 'magit-ido-completing-read)
- (setq gnus-completing-read-function 'gnus-ido-completing-read)
- :config
- (ido-ubiquitous-mode 1))
+ (defun hydra-move-splitter-left (arg)
+ "Move window splitter left."
+ (interactive "p")
+ (if (let ((windmove-wrap-around))
+ (windmove-find-other-window 'right))
+ (shrink-window-horizontally arg)
+ (enlarge-window-horizontally arg)))
-#+END_SRC
+ (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)))
-** Ido-exit-target
+ (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)))
-[[https://github.com/waymondo/ido-exit-target][ido-exit-target]] let you open file/buffer on =other-windows= when call =ido-switch-buffer=
+ (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"))
- (use-package ido-exit-target
- :ensure t
- :init
- (define-key ido-common-completion-map (kbd "C-j") #'ido-exit-target-split-window-right)
- (define-key ido-common-completion-map (kbd "C-l") #'ido-exit-target-split-window-below))
+ (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
-* Key bindings
+** Line Number
-** Remove prefix =ESC=, refer [[http://emacs.stackexchange.com/questions/14755/how-to-remove-bindings-to-the-esc-prefix-key][here]]
+Enable linum mode on programming modes
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
- ;; (define-key key-translation-map (kbd "ESC") (kbd "C-g"))
-
+ (add-hook 'prog-mode-hook 'linum-mode)
+ ;; (add-hook 'prog-mode-hook (lambda ()
+ ;; (setq-default indicate-empty-lines t)))
#+END_SRC
-** Esc on Minibuffer
-
-Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
+Fix the font size of line number
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
- (define-key minibuffer-local-map [escape] 'keyboard-escape-quit)
- (define-key minibuffer-local-map [escape] 'keyboard-escape-quit)
- (define-key minibuffer-local-ns-map [escape] 'keyboard-escape-quit)
- (define-key minibuffer-local-isearch-map [escape] 'keyboard-escape-quit)
- (define-key minibuffer-local-completion-map [escape] 'keyboard-escape-quit)
- (define-key minibuffer-local-must-match-map [escape] 'keyboard-escape-quit)
- (define-key minibuffer-local-must-match-filename-map [escape] 'keyboard-escape-quit)
- (define-key minibuffer-local-filename-completion-map [escape] 'keyboard-escape-quit)
- (define-key minibuffer-local-filename-must-match-map [escape] 'keyboard-escape-quit)
+ (defun fix-linum-size ()
+ (interactive)
+ (set-face-attribute 'linum nil :height 110))
- ;; Also map s-h same as C-g
- (define-key minibuffer-local-map (kbd "s-h") 'keyboard-escape-quit)
+ (add-hook 'linum-mode-hook 'fix-linum-size)
#+END_SRC
-** =Ctrl= key bindings
+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
- ;;
- ;; C-h help
- ;; C-j newline and indent
- ;; C-k kill line
- ;; C-l recenter-top-bottom
- ;; (global-set-key (kbd "C-;") 'ido-switch-buffer)
- ;; C-;
- ;; C-'
- ;; C-ret
+ (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)))
- ;; C-n next-line
- ;; C-m
- ;; C-,
- ;; C-.
- ;; C-/
+ :bind
+ ("A-k" . linum-new-mode))
- ;; C-y
- ;; C-u
- ;; C-i
- ;; C-o
- ;; C-p
- ;; C-[
- ;; C-]
- ;; C-\
+ ;; auto enable linum-new-mode in programming modes
+ (add-hook 'prog-mode-hook 'linum-relative-mode)
- ;; C-=
- ;; C--
- ;; C-0
- ;; C-9
- ;; C-8
- ;; C-7
+#+END_SRC
- ;; C-Space
+** 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
-** =Super= bindings for file, buffer and windows
+** ace-link
-Some global bindings on =Super=, on Mac, it is =Command=
+[[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
- (global-set-key (kbd "s-h") 'keyboard-quit)
- (global-set-key (kbd "s-j") 'ido-switch-buffer)
- (global-set-key (kbd "s-k") 'ido-find-file)
- ;; s-k --> kill-this-buffer
- (global-set-key (kbd "s-l") (lambda ()
- (interactive)
- (if (> (length (window-list)) 1)
- (delete-window)
- (message "Only one Windows now!"))))
- ;; s-l --> goto-line
- (global-set-key (kbd "s-;") 'swiper)
- ;; s-; -->
- ;; s-' --> 'next-multiframe-window
- (global-set-key (kbd "<s-return>") 'toggle-frame-fullscreen)
+ (use-package ace-link
+ :ensure t
+ :init
+ (ace-link-setup-default))
- ;; (global-set-key (kbd "s-y") 'projectile-find-file)
- (global-set-key (kbd "s-f") 'projectile-find-file)
- ;; (global-set-key (kbd "s-[") 'persp-next)
- ;; (global-set-key (kbd "s-]") 'persp-prev)
+#+END_SRC
- (global-set-key (kbd "s-`") 'mode-line-other-buffer)
+** Smart Parens
- (global-set-key (kbd "s-n") 'persp-next)
- (global-set-key (kbd "s-p") 'persp-prev)
+#+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
- ;; someothers default mapping on super (command) key
- ;; s-s save-buffer
- ;; s-k kill-this-buffer
+** Ace-Windows
+[[https://github.com/abo-abo/ace-window][ace-window]]
- ;; s-h --> ns-do-hide-emacs
- ;; s-j --> ido-switch-buffer +
- ;; s-k --> kill-this-buffer
- ;; s-l --> goto-line
- ;; s-; --> undefined
- ;; s-' --> next-multiframe-window
- ;; s-ret --> toggle-frame-fullscreen +
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
- ;; s-y --> ns-paste-secondary
- ;; s-u --> revert-buffer
- ;; s-i --> undefined - but used for iterm globally
- ;; s-o --> used for emacs globally
- ;; s-p --> projectile-persp-switch-project +
- ;; s-[ --> next-buffer +
- ;; s-] --> previous-buffer +
+ (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)))
- ;; s-0 --> undefined
- ;; s-9 --> undefined
- ;; s-8 --> undefined
- ;; s-7 --> undefined
- ;; s-6 --> undefined
- ;; s-- --> center-line
- ;; s-= --> undefined
+#+END_SRC
- ;; s-n --> make-frame
- ;; s-m --> iconify-frame
- ;; s-b --> undefined
- ;; s-, --> customize
- ;; s-. --> undefined
- ;; s-/ --> undefined
+** Which key
- ;; s-g --> isearch-repeat-forward
- ;; s-f --> projectile-find-file +
- ;; s-d --> isearch-repeat-background
- ;; s-s --> save-buffer
- ;; s-a --> make-whole-buffer
+[[https://github.com/justbur/emacs-which-key][which-key]] show the key bindings
- ;; s-b --> undefined
- ;; s-v --> yank
- ;; s-c --> ns-copy-including-secondary
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
- ;; s-t --> ns-popup-font-panel
- ;; s-r --> undefined
- ;; s-e --> isearch-yanqk-kill
- ;; s-w --> delete-frame
- ;; s-q --> same-buffers-kill-emacs
+ (use-package which-key
+ :ensure t
+ :config
+ (which-key-mode))
- ;; s-` --> other-frame
#+END_SRC
-** =M-s= bindings for searching
-
-I use the prefix =M-s= for searching in buffers
-
+** 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)))))))
- (defun pl-make-keymap (key bindings)
- (setq keymap (make-sparse-keymap))
- (dolist (binding bindings)
- (define-key keymap (car binding) (cdr binding)))
- (global-set-key key keymap))
-
- (define-key minibuffer-local-map "\M-s" nil)
-
- (global-set-key (kbd "M-s s") 'isearch-forward-regexp)
- (define-key isearch-mode-map "\M-s" 'isearch-repeat-forward)
- (global-set-key (kbd "M-s r") 'isearch-backward-regexp)
- (define-key isearch-mode-map "\M-r" 'isearch-repeat-backward)
+ ;; (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
- (global-set-key (kbd "s-/") 'isearch-forward-regexp)
- (define-key isearch-mode-map (kbd "s-/") 'isearch-repeat-forward)
- (define-key isearch-mode-map (kbd "C-n") 'isearch-repeat-forward)
+** 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
- (set-face-background 'ido-first-match "white")
+** TODO bookmark
- ;; M-s o --> occur
- ;; M-s s --> isearch-forward-regexp
- ;; M-s r --> isearch-backward-regexp
- ;; M-s w --> isearch-forward-word
- ;; M-s . --> isearch-forward-symbol-at-point
- ;; M-s _ --> isearch-forward-symbol
+** 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)
+ ))
- ;; highlight bindings
- ;; M-s h . --> highlight-symbol-at-point
- ;; M-s h r --> highlight-regexp
- ;; M-s h u --> unhighlight-regexp
- ;; M-s h l --> highlight-lines-match-regexp
- ;; M-s h p --> highlight-phrase
- ;; M-s h f --> hi-lock-find-patterns
+ ;; (global-set-key (kbd "C-h i") 'sd/info-mode)
- ;;
- ;; (global-set-key (kbd "M-s M-r") 'isearch-backward-regexp)
- ;;
+ ;; open Info buffer in other window instead of current window
+ (defadvice info (before my-info (&optional file buf) activate)
+ (sd/info-mode))
- ;; M-c
- ;; M-r
- ;; M-t
- ;; M-u,
+ (defadvice Info-exit (after my-info-exit activate)
+ (sd/delete-current-window))
#+END_SRC
-Occur search key bindings
+** TODO Man mode
+Color for Man-mode
+** TODO UTF8
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
- (define-key occur-mode-map (kbd "C-n")
- (lambda ()
- (interactive)
- (occur-next)
- (occur-mode-goto-occurrence-other-window)
- (recenter)
- (other-window 1)))
-
- (define-key occur-mode-map (kbd "C-p")
- (lambda ()
- (interactive)
- (occur-prev)
- (occur-mode-goto-occurrence-other-window)
- (recenter)
- (other-window 1)))
-
+ ;; (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)
-** =M-o= as prefix key for windows
-
-** =M-g= as prefix key for launcher
+ (use-package org-tree-slide
+ :ensure t)
-** others
+ ;; (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
-
- ;; C-' undefined
- ;; C-. undefined
+** pdf-tools
+#+BEGIN_SRC sh
+ brew install poppler
#+END_SRC
-* Eshell
+#+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))
-Eshell alias
+ (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] 'sd/dired-high-level-dir)
+ (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"))
- (defalias 'e 'ido-find-file)
- (defalias 'ff 'ido-find-file)
- (defalias 'ee 'ido-find-file-other-window)
-
+ (defun sd/dired-high-level-dir ()
+ "Go to higher level directory"
+ (interactive)
+ (find-alternate-file ".."))
#+END_SRC
-Quickly start eshll in split window below, refer [[http://www.howardism.org/Technical/Emacs/eshell-fun.html][eshell-here]]
-
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
- (defun eshell-x ()
- (insert "exit")
- (eshell-send-input)
- (delete-window))
+ (defun sd/dired-new-file ()
+ "Create a new file in dired mode"
+ (interactive)
+ (call-interactively 'find-file))
- (defun eshell-here ()
- "Opens up a new shell in the directory associated with the
- current buffer's file. The eshell is renamed to match that
- directory to make multiple eshell windows easier."
+ ;; copied from abo-abo's config
+ (defun sd/dired-get-size ()
(interactive)
- (let* ((parent (if (buffer-file-name)
- (file-name-directory (buffer-file-name))
- default-directory))
- (height (/ (window-total-height) 3))
- (name (car (last (split-string parent "/" t))))
- (eshell-name (concat "*eshell: " name "*")))
- (split-window-vertically (- height))
- (other-window 1)
- (if (get-buffer eshell-name)
- (progn
- (message "buffer exist")
- (switch-to-buffer eshell-name))
- (progn
- (eshell "new")
- (rename-buffer eshell-name)
-
- (insert (concat "ls"))
- (eshell-send-input)))))
+ (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))))
- (global-unset-key (kbd "M-`"))
- (global-set-key (kbd "M-`") #'eshell-here)
+ (defun mk-disable-ido (command)
+ "Disable IDO when command COMMAND is called."
+ (advice-add command :around #'mk-anti-ido-advice))
#+END_SRC
-* Misc Settings
-
-** [[https://github.com/abo-abo/hydra][Hydra]]
-*** hydra install
+Disalble =ido= when new a directory or file in =dired= mode
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
- (use-package hydra
- :ensure t)
- ;; disable new line in minibuffer when hint hydra
- (setq hydra-lv nil)
+ ;; call the function which you want to disable ido
+ (mk-disable-ido 'dired-create-directory)
+ (mk-disable-ido 'sd/dired-new-file)
#+END_SRC
-*** Font Zoom
+** 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")))
+#+END_SRC
+** dired-hacks
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
- (defhydra sd/font-zoom (global-map "<f2>")
+ (use-package dired-hacks-utils
+ :ensure t
+ :defer t)
+#+END_SRC
- "zoom"
- ("g" text-scale-increase "in")
- ("l" text-scale-decrease "out"))
+** 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
-*** Windmove Splitter
+* Ibuffer
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (global-set-key (kbd "s-b") 'ibuffer)
-Refer [[https://github.com/abo-abo/hydra/blob/master/hydra-examples.el][hydra-example]], to enlarge or shrink the windows splitter
+ (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))
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (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
- (defun hydra-move-splitter-left (arg)
- "Move window splitter left."
- (interactive "p")
- (if (let ((windmove-wrap-around))
- (windmove-find-other-window 'right))
- (shrink-window-horizontally arg)
- (enlarge-window-horizontally arg)))
+* 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))
- (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)))
+ (use-package company-statistics
+ :ensure t
+ :config
+ (company-statistics-mode))
+#+END_SRC
- (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)))
+* 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)
- (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)))
+ :diminish color-identifiers-mode)
+ (global-prettify-symbols-mode t)
#+END_SRC
-*** hydra-window
+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
- (winner-mode 1)
+ (defalias 'perl-mode 'cperl-mode)
- (defhydra sd/hydra-window (:color red :columns nil)
- "window"
- ("h" windmove-left nil :exit t)
- ("j" windmove-down nil :exit t)
- ("k" windmove-up nil :exit t)
- ("l" windmove-right nil :exit t)
- ("H" hydra-move-splitter-left nil)
- ("J" hydra-move-splitter-down nil)
- ("K" hydra-move-splitter-up nil)
- ("L" hydra-move-splitter-right nil)
- ("v" (lambda ()
- (interactive)
- (split-window-right)
- (windmove-right))
- "vert" :exit t)
- ("x" (lambda ()
- (interactive)
- (split-window-below)
- (windmove-down))
- "horz" :exit)
- ("o" delete-other-windows "one" :exit t)
- ("a" ace-window "ace")
- ("s" ace-swap-window "swap")
- ("d" ace-delete-window "ace-one" :exit t)
- ("i" ace-maximize-window "ace-one" :exit t)
- ("b" ido-switch-buffer "buf")
- ;; ("m" headlong-bookmark-jump "bmk")
- ("q" nil "cancel")
- ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
- ("r" (progn (winner-redo) (setq this-command 'winner-redo)) "redo")
- ("f" nil))
-
- (global-unset-key (kbd "C-o"))
- (global-set-key (kbd "C-o") 'sd/hydra-window/body)
+ ;; (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)
- (defun triggle-windows-max-size ()
- (interactive)
- (if (> (length (window-list)) 1)
- (delete-other-windows)
- (winner-undo)))
+ (add-hook 'cperl-mode-hook
+ '(lambda ()
+ (cperl-set-style "C++")))
+ (defalias 'perldoc 'cperl-perldoc)
#+END_SRC
-** Line Number
-
-Enable linum mode on programming modes
+*** 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
+ > _
+ )))
+#+END_SRC
+*** Perl Keywords
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (font-lock-add-keywords 'cperl-mode
+ '(("\\(say\\)" . cperl-nonoverridable-face)
+ ("\\([0-9.]\\)*" . font-lock-constant-face)
+ ("\".*\\(\\\n\\).*\"" . font-lock-constant-face)
+ ("\n" . font-lock-constant-face)
+ ("\\(^#!.*\\)$" . cperl-nonoverridable-face)))
- (add-hook 'prog-mode-hook 'linum-mode)
+ ;; (font-lock-add-keywords 'Man-mode
+ ;; '(("\\(NAME\\)" . font-lock-function-name-face)))
#+END_SRC
-Fix the font size of line number
-
+*** Run Perl
+Change the compile-command to set the default command run when call =compile=
+Mapping =s-r= (on Mac, it's =Command + R= to run the script. Here =current-prefix-arg= is set
+to call =compilation= interactively.
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun my-perl-hook ()
+ (progn
+ (setq-local compilation-read-command nil)
+ (set (make-local-variable 'compile-command)
+ (concat "/usr/bin/perl "
+ (if buffer-file-name
+ (shell-quote-argument buffer-file-name))))
+ (local-set-key (kbd "s-r")
+ (lambda ()
+ (interactive)
+ ; (setq current-prefix-arg '(4)) ; C-u
+ (call-interactively 'compile)))))
- (defun fix-linum-size ()
- (interactive)
- (set-face-attribute 'linum nil :height 110))
-
- (add-hook 'linum-mode-hook 'fix-linum-size)
-
+ (add-hook 'cperl-mode-hook 'my-perl-hook)
#+END_SRC
-I like [[https://github.com/coldnew/linum-relative][linum-relative]], just like the =set relativenumber= on =vim=
-
+** C & C++
+*** c/c++ style
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setq c-default-style "stroustrup"
+ c-basic-offset 4)
+#+END_SRC
- (use-package linum-relative
+*** flycheck
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package flycheck
+ :ensure t)
+#+END_SRC
+*** irony
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package irony
: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))
+ (add-hook 'c++-mode-hook 'irony-mode)
+ (add-hook 'c-mode-hook 'irony-mode)
+ (add-hook 'objc-mode-hook 'irony-mode))
+#+END_SRC
- ;; auto enable linum-new-mode in programming modes
- (add-hook 'prog-mode-hook 'linum-relative-mode)
+Install clang, on mac, it has =libclang.dylib=, but no develop headers. Install by =brew=
+#+BEGIN_SRC sh
+ brew install llvm --with-clang
+#+END_SRC
+then install irony searver, and =LIBCLANG_LIBRARY= and =LIBCLANG_INCLUDE_DIR= accordingly
+#+BEGIN_SRC emacs-lisp :tangle no :results silent
+ (irony-install-server)
#+END_SRC
-** Save File Position
+#+BEGIN_SRC sh
+ cmake -DLIBCLANG_LIBRARY\=/usr/local/Cellar/llvm/3.6.2/lib/libclang.dylib \
+ -DLIBCLANG_INCLUDE_DIR=/usr/local/Cellar/llvm/3.6.2/include \
+ -DCMAKE_INSTALL_PREFIX\=/Users/peli3/.emacs.d/irony/ \
+ /Users/peli3/.emacs.d/elpa/irony-20160713.1245/server && cmake --build . --use-stderr --config Release --target install
+#+END_SRC
+*** yasnippet
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package yasnippet
+ :ensure t)
+#+END_SRC
- (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]\\|\\(?:[^@/:]*@\\)?[^@/:]*[^@/:.]:\\)")
+* Compile
+Set the environments vairables in compilation mode
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package compile
+ :commands compile
+ :config
+ (setq compilation-environment (cons "LC_ALL=C" compilation-environment))
+ (setq compilation-auto-jump-to-first-error t)
+ (setq compilation-auto-jump-to-next t)
+ (setq compilation-scroll-output 'first-error))
+ ;; super-r to compile
+ (with-eval-after-load "compile"
+ (define-key compilation-mode-map (kbd "C-o") nil)
+ (define-key compilation-mode-map (kbd "n") 'compilation-next-error)
+ (define-key compilation-mode-map (kbd "p") 'compilation-previous-error)
+ (define-key compilation-mode-map (kbd "r") #'recompile))
#+END_SRC
-** Multi-term
+* Auto-Insert
+** Enable auto-insert mode
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (auto-insert-mode t)
+ (setq auto-insert-query nil)
+#+END_SRC
+** C++ Auto Insert
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (eval-after-load 'autoinsert
+ '(define-auto-insert '("\\.cpp\\'" . "C++ skeleton")
+ '(
+ "Short description:"
+ "/*"
+ "\n * " (file-name-nondirectory (buffer-file-name))
+ "\n */" > \n \n
+ "#include <iostream>" \n
+ "#include \""
+ (file-name-sans-extension
+ (file-name-nondirectory (buffer-file-name)))
+ ".hpp\"" \n \n
+ "using namespace std;" \n \n
+ "int main ()"
+ "\n{" \n
+ > _ \n
+ "return 1;"
+ "\n}" > \n
+ )))
- (use-package multi-term
- :ensure t)
+ (eval-after-load 'autoinsert
+ '(define-auto-insert '("\\.c\\'" . "C skeleton")
+ '(
+ "Short description:"
+ "/*\n"
+ " * " (file-name-nondirectory (buffer-file-name)) "\n"
+ " */" > \n \n
+ "#include <stdio.h>" \n
+ "#include \""
+ (file-name-sans-extension
+ (file-name-nondirectory (buffer-file-name)))
+ ".h\"" \n \n
+ "int main ()\n"
+ "{" \n
+ > _ \n
+ "return 1;\n"
+ "}" > \n
+ )))
+#+END_SRC
+** Python template
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (eval-after-load 'autoinsert
+ '(define-auto-insert '("\\.\\(py\\)\\'" . "Python skeleton")
+ '(
+ "Empty"
+ "#import os,sys" \n
+ \n \n
+ )))
#+END_SRC
-** ace-link
+** Elisp
+Emacs lisp auto-insert, based on the default module in =autoinsert.el=, but replace =completing-read= as
+=completing-read-ido-ubiquitous= to fix the edge case of that =ido= cannot handle.
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (eval-after-load 'autoinsert
+ '(define-auto-insert '("\\.el\\'" . "my Emacs Lisp header")
+ '(
+ "Short description: "
+ ";;; " (file-name-nondirectory (buffer-file-name)) " --- " str
+ (make-string (max 2 (- 80 (current-column) 27)) ?\s)
+ "-*- lexical-binding: t; -*-" '(setq lexical-binding t)
+ "\n
+ ;; Copyright (C) " (format-time-string "%Y") " "
+ (getenv "ORGANIZATION") | (progn user-full-name) "
+
+ ;; Author: " (user-full-name)
+ '(if (search-backward "&" (line-beginning-position) t)
+ (replace-match (capitalize (user-login-name)) t t))
+ '(end-of-line 1) " <" (progn user-mail-address) ">
+ ;; Keywords: "
+ '(require 'finder)
+ ;;'(setq v1 (apply 'vector (mapcar 'car finder-known-keywords)))
+ '(setq v1 (mapcar (lambda (x) (list (symbol-name (car x))))
+ finder-known-keywords)
+ v2 (mapconcat (lambda (x) (format "%12s: %s" (car x) (cdr x)))
+ finder-known-keywords
+ "\n"))
+ ((let ((minibuffer-help-form v2))
+ (completing-read-ido-ubiquitous "Keyword, C-h: " v1 nil t))
+ str ", ") & -2 "
+
+ \;; This program is free software; you can redistribute it and/or modify
+ \;; it under the terms of the GNU General Public License as published by
+ \;; the Free Software Foundation, either version 3 of the License, or
+ \;; (at your option) any later version.
+
+ \;; This program is distributed in the hope that it will be useful,
+ \;; but WITHOUT ANY WARRANTY; without even the implied warranty of
+ \;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ \;; GNU General Public License for more details.
+
+ \;; You should have received a copy of the GNU General Public License
+ \;; along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+ \;;; Commentary:
+
+ \;; " _ "
+
+ \;;; Code:
+
+
+ \(provide '"
+ (file-name-base)
+ ")
+ \;;; " (file-name-nondirectory (buffer-file-name)) " ends here\n")))
+#+END_SRC
+
+** Org file template
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (eval-after-load 'autoinsert
+ '(define-auto-insert '("\\.\\(org\\)\\'" . "Org-mode skeleton")
+ '(
+ "title: "
+ "#+TITLE: " str (make-string 30 ?\s) > \n
+ "#+AUTHOR: Peng Li\n"
+ "#+EMAIL: seudut@gmail.com\n"
+ "#+DATE: " (shell-command-to-string "echo -n $(date +%Y-%m-%d)") > \n
+ > \n
+ > _)))
+#+END_SRC
-[[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
+* Markdown mode
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package markdown-mode
+ :ensure t
+ :commands (markdown-mode gfm-mode)
+ :mode (("README\\.md\\'" . gfm-mode)
+ ("\\.md\\'" . markdown-mode)
+ ("\\.markdown\\'" . markdown-mode))
+ :init (setq markdown-command "multimarkdown"))
+#+END_SRC
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package markdown-preview-eww
+ :ensure t)
+#+END_SRC
- (use-package ace-link
- :ensure t
- :init
- (ace-link-setup-default))
+* Gnus
+** Gmail setting
+Refer [[https://www.emacswiki.org/emacs/GnusGmail][GnusGmail]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setq user-mail-address "seudut@gmail.com"
+ user-full-name "Peng Li")
+ (setq gnus-select-method
+ '(nnimap "gmail"
+ (nnimap-address "imap.gmail.com")
+ (nnimap-server-port "imaps")
+ (nnimap-stream ssl)))
+
+ (setq smtpmail-smtp-service 587
+ gnus-ignored-newsgroups "^to\\.\\|^[0-9. ]+\\( \\|$\\)\\|^[\"]\"[#'()]")
+
+ ;; Use gmail sending mail
+ (setq message-send-mail-function 'smtpmail-send-it
+ smtpmail-starttls-credentials '(("smtp.gmail.com" 587 nil nil))
+ smtpmail-auth-credentials '(("smtp.gmail.com" 587 "seudut@gmail.com" nil))
+ smtpmail-default-smtp-server "smtp.gmail.com"
+ smtpmail-smtp-server "smtp.gmail.com"
+ smtpmail-smtp-service 587
+ starttls-use-gnutls t)
#+END_SRC
-** Emux
+And put the following in =~/.authinfo= file, replacing =<USE>= with your email address
+and =<PASSWORD>= with the password
+#+BEGIN_EXAMPLE
+ machine imap.gmail.com login <USER> password <PASSWORD> port imaps
+ machine smtp.gmail.com login <USER> password <PASSWORD> port 587
+#+END_EXAMPLE
-[[https://github.com/re5et/emux][emux]] is
+Then Run =M-x gnus=
+** Group buffer
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package gnus
+ :init
+ (setq gnus-permanently-visible-groups "\.*")
+ :config
+ (cond (window-system
+ (setq custom-background-mode 'light)
+ (defface my-group-face-1
+ '((t (:foreground "Red" :bold t))) "First group face")
+ (defface my-group-face-2
+ '((t (:foreground "DarkSeaGreen4" :bold t)))
+ "Second group face")
+ (defface my-group-face-3
+ '((t (:foreground "Green4" :bold t))) "Third group face")
+ (defface my-group-face-4
+ '((t (:foreground "SteelBlue" :bold t))) "Fourth group face")
+ (defface my-group-face-5
+ '((t (:foreground "Blue" :bold t))) "Fifth group face")))
+ (setq gnus-group-highlight
+ '(((> unread 200) . my-group-face-1)
+ ((and (< level 3) (zerop unread)) . my-group-face-2)
+ ((< level 3) . my-group-face-3)
+ ((zerop unread) . my-group-face-4)
+ (t . my-group-face-5))))
- (el-get-bundle re5et/emux)
+ ;; key-
+ (add-hook 'gnus-group-mode-hook (lambda ()
+ (define-key gnus-group-mode-map "k" 'gnus-group-prev-group)
+ (define-key gnus-group-mode-map "j" 'gnus-group-next-group)
+ (define-key gnus-group-mode-map "g" 'gnus-group-jump-to-group)
+ (define-key gnus-group-mode-map "v" (lambda () (interactive) (gnus-group-select-group t)))))
#+END_SRC
-** Smart Parens
-
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setq gnus-fetch-old-headers 't)
- (use-package smartparens
- :ensure t
- :config
- (progn
- (require 'smartparens-config)
- (add-hook 'prog-mode-hook 'smartparens-mode)))
-#+END_SRC
-** Ace-Windows
+ (setq gnus-extract-address-components
+ 'mail-extract-address-components)
+ ;; summary buffer
+ (setq gnus-summary-line-format "%U%R%z%I%(%[%-20,20f%]%) %s%-80= %11&user-date;\n")
+ (setq gnus-user-date-format-alist '(((gnus-seconds-today) . "%H:%M")
+ ((+ 86400 (gnus-seconds-today)) . "%a %H:%M")
+ (604800 . "%a, %b %-d")
+ (15778476 . "%b %-d")
+ (t . "%Y-%m-%d")))
-[[https://github.com/abo-abo/ace-window][ace-window]]
+ (setq gnus-thread-sort-functions '((not gnus-thread-sort-by-number)))
+ (setq gnus-unread-mark ?\.)
+ (setq gnus-use-correct-string-widths t)
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ;; thread
+ (setq gnus-thread-hide-subtree t)
- (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)))
+ ;; (with-eval-after-load 'gnus-summary-mode
+ ;; (define-key gnus-summary-mode-map (kbd "C-o") 'sd/hydra-window/body))
-#+END_SRC
+ (add-hook 'gnus-summary-mode-hook (lambda ()
+ (define-key gnus-summary-mode-map (kbd "C-o") nil)))
-** Projectile
+#+END_SRC
+
+** Windows layout
+See [[https://www.emacswiki.org/emacs/GnusWindowLayout][GnusWindowLayout]]
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (gnus-add-configuration
+ '(summary
+ (horizontal 1.0
+ (vertical 35
+ (group 1.0))
+ (vertical 1.0
+ (summary 1.0 poine)))))
- (use-package projectile
- :ensure t
- :init
- (setq projectile-enable-caching t)
- :config
- (projectile-global-mode t))
+ (gnus-add-configuration
+ '(article
+ (horizontal 1.0
+ (vertical 35
+ (group 1.0))
+ (vertical 1.0
+ (summary 0.50 point)
+ (article 1.0)))))
- (use-package persp-projectile
- :ensure t
- :config
- (persp-mode)
- :bind
- (:map projectile-mode-map
- ("s-t" . projectile-persp-switch-project)))
+ (with-eval-after-load 'gnus-group-mode
+ (gnus-group-select-group "INBOX"))
+ ;; (add-hook 'gnus-group-mode-map (lambda ()
+ ;; (gnus-group-select-group "INBOX")))
+#+END_SRC
- ;; projectile-find-file
- ;; projectile-switch-buffer
- ;; projectile-find-file-other-window
+* Gnu Plot
+To fix some issue that =toolbar-make-button-list= is void, see the [[https://github.com/bruceravel/gnuplot-mode/issues/31][issue]], here I set some variable as =nil=
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package gnuplot
+ :ensure
+ :init
+ (setq gnuplot-help-xpm nil)
+ (setq gnuplot-line-xpm nil)
+ (setq gnuplot-region-xpm nil)
+ (setq gnuplot-buffer-xpm nil)
+ (setq gnuplot-doc-xpm nil))
#+END_SRC
-** Which key
+Use =gnuplot= on =Org-mode= file, see [[http://orgmode.org/worg/org-contrib/babel/languages/ob-doc-gnuplot.html][ob-doc-gnuplot]]
+#+BEGIN_SRC gnuplot :exports code :file ./temp/file.png
+ reset
-[[https://github.com/justbur/emacs-which-key][which-key]] show the key bindings
+ set title "Putting it All Together"
+
+ set xlabel "X"
+ set xrange [-8:8]
+ set xtics -8,2,8
+
+ set ylabel "Y"
+ set yrange [-20:70]
+ set ytics -20,10,70
+
+ f(x) = x**2
+ g(x) = x**3
+ h(x) = 10*sqrt(abs(x))
+
+ plot f(x) w lp lw 1, g(x) w p lw 2, h(x) w l lw 3
+#+END_SRC
+
+#+RESULTS:
+[[file:./temp/file.png]]
+* Ediff
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (with-eval-after-load 'ediff
+ (setq ediff-split-window-function 'split-window-horizontally)
+ (setq ediff-window-setup-function 'ediff-setup-windows-plain)
+ (add-hook 'ediff-startup-hook 'ediff-toggle-wide-display)
+ (add-hook 'ediff-cleanup-hook 'ediff-toggle-wide-display)
+ (add-hook 'ediff-suspend-hook 'ediff-toggle-wide-display))
+#+END_SRC
- (use-package which-key
+* Entertainment
+** GnoGo
+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
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package gnugo
:ensure t
+ :defer t
+ :init
+ (require 'gnugo-imgen)
+ (setq gnugo-xpms 'gnugo-imgen-create-xpms)
+ (add-hook 'gnugo-start-game-hook '(lambda ()
+ (gnugo-image-display-mode)
+ (gnugo-grid-mode)))
:config
- (which-key-mode))
-
+ (add-to-list 'gnugo-option-history (format "--boardsize 19 --color black --level 1")))
#+END_SRC
** Emms
-
We can use [[https://www.gnu.org/software/emms/quickstart.html][Emms]] for multimedia in Emacs
-
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
(use-package emms
:ensure t
:init
+ (setq emms-directory (concat sd-temp-directory "emms"))
(setq emms-source-file-default-directory "~/Music/")
:config
(emms-standard)
".m4a" ".flv" ".ogv" ".pls"))
"mplayer" "-slave" "-quiet" "-really-quiet" "-fullscreen")
(emms-history-load))
-
#+END_SRC
-** GnoGo
-
-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
-
+* Dictionary
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
- (use-package gnugo
+ (use-package bing-dict
:ensure t
- :defer t
:init
- (require 'gnugo-imgen)
- (setq gnugo-xpms 'gnugo-imgen-create-xpms)
- (add-hook 'gnugo-start-game-hook '(lambda ()
- (gnugo-image-display-mode)
- (gnugo-grid-mode)))
- :config
- (add-to-list 'gnugo-option-history (format "--boardsize 19 --color black --level 1")))
-
+ (global-set-key (kbd "s-d") 'bing-dict-brief)
+ :commands (bing-dict-brief))
#+END_SRC
-** undo-tree
+* Key Bindings
+Here are some global key bindings for basic editting
+** Esc in minibuffer
+Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (define-key minibuffer-local-map [escape] 'keyboard-escape-quit)
+ (define-key minibuffer-local-map [escape] 'keyboard-escape-quit)
+ (define-key minibuffer-local-ns-map [escape] 'keyboard-escape-quit)
+ (define-key minibuffer-local-isearch-map [escape] 'keyboard-escape-quit)
+ (define-key minibuffer-local-completion-map [escape] 'keyboard-escape-quit)
+ (define-key minibuffer-local-must-match-map [escape] 'keyboard-escape-quit)
+ (define-key minibuffer-local-must-match-filename-map [escape] 'keyboard-escape-quit)
+ (define-key minibuffer-local-filename-completion-map [escape] 'keyboard-escape-quit)
+ (define-key minibuffer-local-filename-must-match-map [escape] 'keyboard-escape-quit)
+ ;; Also map s-h same as C-g
+ (define-key minibuffer-local-map (kbd "s-h") 'keyboard-escape-quit)
+#+END_SRC
+
+** Project operations - =super=
+*** Projectile
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package projectile
+ :ensure t
+ :init
+ (setq projectile-enable-caching t)
+ (setq projectile-switch-project-action 'projectile-dired)
+ (setq projectile-cache-file (concat sd-temp-directory "projectile.cache"))
+ :config
+ (add-to-list 'projectile-globally-ignored-files "GTAGS")
+ (projectile-global-mode t))
- (use-package undo-tree
+ (use-package persp-projectile
:ensure t
:config
- (global-undo-tree-mode 1))
+ (persp-mode)
+ :bind
+ (:map projectile-mode-map
+ ("s-t" . projectile-persp-switch-project)))
+ ;; projectile-find-file
+ ;; projectile-switch-buffer
+ ;; projectile-find-file-other-window
#+END_SRC
-** swiper
-
+*** project config =super= keybindings
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ;; (global-set-key (kbd "s-h") 'keyboard-quit)
+ ;; (global-set-key (kbd "s-j") 'ido-switch-buffer)
+ ;; (global-set-key (kbd "s-k") 'ido-find-file)
+ ;; (global-set-key (kbd "s-l") 'sd/delete-current-window)
+ ;; s-l --> goto-line
+ ;; (global-set-key (kbd "s-/") 'swiper)
+ ;; s-; -->
+ ;; s-' --> 'next-multiframe-window
+ (global-set-key (kbd "<s-return>") 'toggle-frame-fullscreen)
- (use-package swiper
- :ensure t)
+ (global-set-key (kbd "s-f") 'projectile-find-file)
+ (global-set-key (kbd "s-`") 'mode-line-other-buffer)
+ (global-set-key (kbd "s-n") 'persp-next)
+ (global-set-key (kbd "s-p") 'persp-prev)
+ (global-set-key (kbd "s-;") 'persp-switch-last)
- (ivy-mode 1)
- (setq ivy-use-virtual-buffers t)
- ;; (global-set-key "\C-s" 'swiper)
- ;; (global-set-key (kbd "C-c C-r") 'ivy-resume)
- ;; (global-set-key (kbd "<f6>") 'ivy-resume)
- ;; ;; (global-set-key (kbd "M-x") 'counsel-M-x)
- ;; ;; (global-set-key (kbd "C-x C-f") 'counsel-find-file)
- ;; (global-set-key (kbd "<f1> f") 'counsel-describe-function)
- ;; (global-set-key (kbd "<f1> v") 'counsel-describe-variable)
- ;; (global-set-key (kbd "<f1> l") 'counsel-load-library)
- ;; (global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
- ;; (global-set-key (kbd "<f2> u") 'counsel-unicode-char)
- ;; (global-set-key (kbd "C-c g") 'counsel-git)
- ;; (global-set-key (kbd "C-c j") 'counsel-git-grep)
- ;; (global-set-key (kbd "C-c k") 'counsel-ag)
- ;; (global-set-key (kbd "C-x l") 'counsel-locate)
- ;; (global-set-key (kbd "C-S-o") 'counsel-rhythmbox)
- ;; ;; (define-key read-expression-map (kbd "C-r") 'counsel-expression-history)
+ (global-set-key (kbd "s-=") 'text-scale-increase)
+ (global-set-key (kbd "s--") 'text-scale-decrease)
-#+END_SRC
+ ;; (global-set-key (kbd "s-u") 'undo-tree-visualize)
-** Tabbar
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ;; someothers default mapping on super (command) key
+ ;; s-s save-buffer
+ ;; s-k kill-this-buffer
- ;; (use-package tabbar-ruler
- ;; :ensure t
- ;; :init
- ;; (setq tabbar-ruler-global-tabbar t)
- ;; (setq tabbar-ruler-global-ruler t)
- ;; (setq tabbar-ruler-popu-menu t)
- ;; (setq tabbar-ruler-popu-toolbar t)
- ;; (setq tabbar-use-images t)
- ;; :config
- ;; (tabbar-ruler-group-by-projectile-project)
- ;; (global-set-key (kbd "s-1") 'tabbar-forward-group)
- ;; (global-set-key (kbd "s-2") 'tabbar-ruler-forward))
-#+END_SRC
+ ;; s-h --> ns-do-hide-emacs
+ ;; s-j --> ido-switch-buffer +
+ ;; s-k --> kill-this-buffer
+ ;; s-l --> goto-line
+ ;; s-; --> undefined
+ ;; s-' --> next-multiframe-window
+ ;; s-ret --> toggle-frame-fullscreen +
+
+ ;; s-y --> ns-paste-secondary
+ ;; s-u --> revert-buffer
+ ;; s-i --> undefined - but used for iterm globally
+ ;; s-o --> used for emacs globally
+ ;; s-p --> projectile-persp-switch-project +
+ ;; s-[ --> next-buffer +
+ ;; s-] --> previous-buffer +
-* Programming
+ ;; s-0 --> undefined
+ ;; s-9 --> undefined
+ ;; s-8 --> undefined
+ ;; s-7 --> undefined
+ ;; s-6 --> undefined
+ ;; s-- --> center-line
+ ;; s-= --> undefined
-** Languages
+ ;; s-n --> make-frame
+ ;; s-m --> iconify-frame
+ ;; s-b --> undefined
+ ;; s-, --> customize
+ ;; s-. --> undefined
+ ;; s-/ --> undefined
-*** Emacs Lisp
+ ;; s-g --> isearch-repeat-forward
+ ;; s-f --> projectile-find-file +
+ ;; s-d --> isearch-repeat-background
+ ;; s-s --> save-buffer
+ ;; s-a --> make-whole-buffer
+
+ ;; s-b --> undefined
+ ;; s-v --> yank
+ ;; s-c --> ns-copy-including-secondary
+ ;; s-t --> ns-popup-font-panel
+ ;; s-r --> undefined
+ ;; s-e --> isearch-yanqk-kill
+ ;; s-w --> delete-frame
+ ;; s-q --> same-buffers-kill-emacs
+
+ ;; s-` --> other-frame
+#+END_SRC
+
+** Windown & Buffer - =C-o=
+Defind a =hydra= function for windows, buffer & bookmark operations. And map it to =C-o= globally.
+Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to delete other windows
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (winner-mode 1)
- (use-package color-identifiers-mode
- :ensure t
- :init
- (add-hook 'emacs-lisp-mode-hook 'color-identifiers-mode)
+ (defun sd/delete-current-window ()
+ (interactive)
+ (if (> (length (window-list)) 1)
+ (delete-window)
+ (message "Only one Windows now!")))
- :diminish color-identifiers-mode)
+ (defun sd/toggle-max-windows ()
+ "Set maximize current if there are multiple windows, if only
+ one window, window undo"
+ (interactive)
+ (if (equal (length (window-list)) 1)
+ (winner-undo)
+ (delete-other-windows)))
- (global-prettify-symbols-mode t)
+ (defhydra sd/hydra-window (:color red :columns nil)
+ "Window"
+ ;; windows split
+ ("h" windmove-left nil :exit t)
+ ("j" windmove-down nil :exit t)
+ ("k" windmove-up nil :exit t)
+ ("l" windmove-right nil :exit t)
+ ("H" hydra-move-splitter-left nil)
+ ("J" hydra-move-splitter-down nil)
+ ("K" hydra-move-splitter-up nil)
+ ("L" hydra-move-splitter-right nil)
+ ("v" (lambda ()
+ (interactive)
+ (split-window-right)
+ (windmove-right))
+ "vert" :exit t)
+ ("x" (lambda ()
+ (interactive)
+ (split-window-below)
+ (windmove-down))
+ "horz" :exit t)
+
+ ;; buffer / windows switch
+ ("o" sd/toggle-max-windows "one" :exit t)
+ ("C-k" sd/delete-current-window "del" :exit t)
+ ("D" (lambda ()
+ (interactive)
+ (kill-buffer)
+ (sd/delete-current-window))
+ "kill" :exit t)
+ ("'" other-window "other" :exit t)
+ ;; ("a" ace-window "ace")
+ ("s" ace-swap-window "swap")
+ ;; ("i" ace-maximize-window "ace-one" :exit t)
-#+END_SRC
+ ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
+ ("r" (progn (winner-redo) (setq this-command 'winner-redo)) "redo")
-**** Lispy Mode
+ ;; ibuffer, dired, eshell, bookmarks
+ ;; ("d" ace-delete-window "ace-one" :exit t)
+ ("C-o" ido-switch-buffer nil :exit t)
+ ("d" sd/project-or-dired-jump nil :exit t)
+ ("b" ibuffer nil :exit t)
+ ("e" eshell nil :exit t)
+ ("m" bookmark-jump-other-window nil :exit t)
+ ("M" bookmark-set nil :exit t)
+ ("g" magit-status nil :exit t)
+ ("p" paradox-list-packages nil :exit t)
+
+ ;; quit
+ ("q" nil "cancel")
+ ("<ESC>" nil)
+ ("C-h" nil nil :exit t)
+ ("C-j" nil nil :exit t)
+ ;; ("C-k" nil :exit t)
+ ("C-l" nil nil :exit t)
+ ("C-;" nil nil :exit t)
+ ("n" nil nil :exit t)
+ ("[" nil nil :exit t)
+ ("]" nil nil :exit t)
+ ("f" nil))
-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]]
+ (global-unset-key (kbd "C-o"))
+ (global-set-key (kbd "C-o") 'sd/hydra-window/body)
+
+ (defun sd/project-or-dired-jump ()
+ "If under project, jump to the root directory, otherwise
+ jump to dired of current file"
+ (interactive)
+ (if (projectile-project-p)
+ (projectile-dired)
+ (dired-jump)))
+#+END_SRC
+
+** Motion
+- =C-M-=
+[[https://www.masteringemacs.org/article/effective-editing-movement][effective-editing-movement]]
+*** Command Arguments, numeric argumens
+=C-u 4= same as =C-4=, =M-4=
+*** Basic movement
+moving by line / word /
+=C-f=, =C-b=, =C-p=, =C-n=, =M-f=, =M-b=
+=C-a=, =C-e=
+=M-m= (move first non-whitespace on this line)
+=M-}=, =M-{=, Move forward end of paragraph
+=M-a=, =M-e=, beginning / end of sentence
+=C-M-a=, =C-M-e=, move begining of defun
+=C-x ]=, =C-x [=, forward/backward one page
+=C-v=, =M-v=, =C-M-v=, =C-M-S-v= scroll down/up
+=M-<=, =M->=, beginning/end of buffer
+=M-r=, Repositiong point
+
+*** Moving by S-expression / List
+*** Marks
+=C-<SPC>= set marks toggle the region
+=C-u C-<SPC>= Jump to the mark, repeated calls go further back the mark ring
+=C-x C-x= Exchanges the point and mark.
+
+Stolen [[https://www.masteringemacs.org/article/fixing-mark-commands-transient-mark-mode][fixing-mark-commands-transient-mark-mode]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun push-mark-no-activate ()
+ "Pushes `point' to `mark-ring' and does not activate the region
+ Equivalent to \\[set-mark-command] when \\[transient-mark-mode] is disabled"
+ (interactive)
+ (push-mark (point) t nil)
+ (message "Pushed mark to ring"))
+
+ ;; (global-set-key (kbd "C-`") 'push-mark-no-activate)
+ (defun jump-to-mark ()
+ "Jumps to the local mark, respecting the `mark-ring' order.
+ This is the same as using \\[set-mark-command] with the prefix argument."
+ (interactive)
+ (set-mark-command 1))
+
+ ;; (global-set-key (kbd "M-`") 'jump-to-mark)
+
+ (defun exchange-point-and-mark-no-activate ()
+ "Identical to \\[exchange-point-and-mark] but will not activate the region."
+ (interactive)
+ (exchange-point-and-mark)
+ (deactivate-mark nil))
+
+ ;; (define-key global-map [remap exchange-point-and-mark] 'exchange-point-and-mark-no-activate)
+#+END_SRC
+
+Show the mark ring using =helm-mark-ring=, also mapping =M-`= to quit minibuffer. so that =M-`= can
+toggle the mark ring. the best way is add a new action and mapping to =helm-source-mark-ring=, but
+since there is no map such as =helm-mark-ring=map=, so I cannot binding a key to the quit action.
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setq mark-ring-max 50)
- (use-package lispy
+ (use-package helm
: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))))
+ (global-set-key (kbd "M-`") #'helm-mark-ring))
+ (define-key minibuffer-local-map (kbd "M-`") 'keyboard-escape-quit)
#+END_SRC
-*** Perl
+=M-h= marks the next paragraph
+=C-x h= marks the whole buffer
+=C-M-h= marks the next defun
+=C-x C-p= marks the next page
+*** Registers
+Registers can save text, position, rectangles, file and configuration and other things.
+Here for movement, we can use register to save/jump position
+=C-x r SPC= store point in register
+=C-x r j= jump to register
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package list-register
+ :ensure t)
+#+END_SRC
-[[https://www.emacswiki.org/emacs/CPerlMode][CPerl mode]] has more features than =PerlMode= for perl programming. Alias this to =CPerlMode=
+*** Bookmarks
+As I would like use bookmakr for different buffer/files. to help to swith
+different buffer/file quickly. this setting is in Windows/buffer node
+=C-x r m= set a bookmarks
+=C-x r l= list bookmarks
+=C-x r b= jump to bookmarks
+*** Search
+Search, replace and hightlight will in later paragraph
+*** =Avy= for easy motion
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package avy
+ :ensure t
+ :config
+ (avy-setup-default))
- (defalias 'perl-mode 'cperl-mode)
+ (global-set-key (kbd "C-M-j") 'avy-goto-line-below)
+ (global-set-key (kbd "C-M-n") 'avy-goto-line-below)
+ (global-set-key (kbd "C-M-k") 'avy-goto-line-above)
+ (global-set-key (kbd "C-M-p") 'avy-goto-line-above)
- ;(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)
+ (global-set-key (kbd "C-M-f") 'avy-goto-word-1-below)
+ (global-set-key (kbd "C-M-b") 'avy-goto-word-1-above)
- (add-hook 'cperl-mode-hook
- '(lambda ()
- (cperl-set-style "C++")))
+ ;; (global-set-key (kbd "M-g e") 'avy-goto-word-0)
+ (global-set-key (kbd "C-M-w") 'avy-goto-char-timer)
+ (global-set-key (kbd "C-M-l") 'avy-goto-char-in-line)
- ;(require 'template)
- ;(template-initialize)
- ;(require 'perlnow)
+ ;; ;; will delete above
+ ;; (global-set-key (kbd "M-g j") 'avy-goto-line-below)
+ ;; (global-set-key (kbd "M-g k") 'avy-goto-line-above)
+ ;; (global-set-key (kbd "M-g w") 'avy-goto-word-1-below)
+ ;; (global-set-key (kbd "M-g b") 'avy-goto-word-1-above)
+ ;; (global-set-key (kbd "M-g e") 'avy-goto-word-0)
+ ;; (global-set-key (kbd "M-g f") 'avy-goto-char-timer)
+ ;; (global-set-key (kbd "M-g c") 'avy-goto-char-in-line)
+#+END_SRC
+*** =Imenu= goto tag
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (global-set-key (kbd "M-i") #'counsel-imenu)
+ ;; (global-set-key (kbd "M-i") #'imenu)
#+END_SRC
-- auto insert
-- run script
+*** Go-to line
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (global-set-key (kbd "M-l") 'goto-line)
+#+END_SRC
-Change the compile-command to set the default command run when call =compile=
-Mapping =s-r= (on Mac, it's =Command + R= to run the script. Here =current-prefix-arg= is set
-to call =compilation= interactively.
+** Edit
+*** basic editting
+- cut, yank, =C-w=, =C-y=
+- save, revert
+- undo, redo - undo-tree
+- select, expand-region
+- spell check, flyspell
+*** Kill ring
+=helm-show-kill-ring=
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setq kill-ring-max 100) ; default is 60p
- (defun my-perl-hook ()
- (progn
- (setq-local compilation-read-command nil)
- (set (make-local-variable 'compile-command)
- (concat "/usr/bin/perl "
- (if buffer-file-name
- (shell-quote-argument buffer-file-name))))
- (local-set-key (kbd "s-r")
- (lambda ()
- (interactive)
- ; (setq current-prefix-arg '(4)) ; C-u
- (call-interactively 'compile)))))
+ (use-package helm
+ :ensure t
+ :init
+ (global-set-key (kbd "M-y") #'helm-show-kill-ring))
+#+END_SRC
- (add-hook 'cperl-mode-hook 'my-perl-hook)
+*** undo-tree
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package undo-tree
+ :ensure t
+ :config
+ (define-key undo-tree-visualizer-mode-map "j" 'undo-tree-visualize-redo)
+ (define-key undo-tree-visualizer-mode-map "k" 'undo-tree-visualize-undo)
+ (define-key undo-tree-visualizer-mode-map "h" 'undo-tree-visualize-switch-branch-left)
+ (define-key undo-tree-visualizer-mode-map "l" 'undo-tree-visualize-switch-branch-right)
+ (global-undo-tree-mode 1))
+ (global-set-key (kbd "s-u") 'undo-tree-visualize)
+#+END_SRC
+
+*** flyspell
+Stolen from [[https://github.com/redguardtoo/emacs.d/blob/master/lisp/init-spelling.el][here]], hunspell will search dictionary in =DICPATH=
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setenv "DICPATH" "/usr/local/share/hunspell")
+
+ (when (executable-find "hunspell")
+ (setq-default ispell-program-name "hunspell")
+ (setq ispell-really-hunspell t))
+
+ ;; (defun text-mode-hook-setup ()
+ ;; ;; Turn off RUN-TOGETHER option when spell check text-mode
+ ;; (setq-local ispell-extra-args (flyspell-detect-ispell-args)))
+ ;; (add-hook 'text-mode-hook 'text-mode-hook-setup)
+ ;; (add-hook 'text-mode-hook 'flyspell-mode)
+
+ ;; enable flyspell check on comments and strings in progmamming modes
+ ;; (add-hook 'prog-mode-hook 'flyspell-prog-mode)
+
+ ;; I don't use the default mappings
+ (with-eval-after-load 'flyspell
+ (define-key flyspell-mode-map (kbd "C-;") nil)
+ (define-key flyspell-mode-map (kbd "C-,") nil)
+ (define-key flyspell-mode-map (kbd "C-.") nil))
+#+END_SRC
+
+Make flyspell enabled for org-mode, see [[http://emacs.stackexchange.com/questions/9333/how-does-one-use-flyspell-in-org-buffers-without-flyspell-triggering-on-tangled][here]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ;; NO spell check for embedded snippets
+ (defadvice org-mode-flyspell-verify (after org-mode-flyspell-verify-hack activate)
+ (let ((rlt ad-return-value)
+ (begin-regexp "^[ \t]*#\\+begin_\\(src\\|html\\|latex\\)")
+ (end-regexp "^[ \t]*#\\+end_\\(src\\|html\\|latex\\)")
+ old-flag
+ b e)
+ (when ad-return-value
+ (save-excursion
+ (setq old-flag case-fold-search)
+ (setq case-fold-search t)
+ (setq b (re-search-backward begin-regexp nil t))
+ (if b (setq e (re-search-forward end-regexp nil t)))
+ (setq case-fold-search old-flag))
+ (if (and b e (< (point) e)) (setq rlt nil)))
+ (setq ad-return-value rlt)))
+#+END_SRC
+
+** Search & Replace / hightlight =M-s=
+*** isearch
+=C-s=, =C-r=,
+=C-w= add word at point to search string,
+=M-%= query replace
+=C-M-y= add character at point to search string
+=M-s C-e= add reset of line at point
+=C-y= yank from clipboard to search string
+=M-n=, =M-p=, history
+=C-M-i= complete search string
+set the isearch history size, the default is only =16=
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (setq history-length 5000)
+ (setq regexp-search-ring-max 1000)
+ (setq search-ring-max 1000)
+
+ ;; when search a word or a symbol , also add the word into regexp-search-ring
+ (defadvice isearch-update-ring (after sd/isearch-update-ring (string &optional regexp) activate)
+ "Add search-ring to regexp-search-ring"
+ (unless regexp
+ (add-to-history 'regexp-search-ring string regexp-search-ring-max)))
+#+END_SRC
+
+*** =M-s= prefix
+use the prefix =M-s= for searching in buffers
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun sd/make-keymap (key bindings)
+ (setq keymap (make-sparse-keymap))
+ (dolist (binding bindings)
+ (define-key keymap (car binding) (cdr binding)))
+ (global-set-key key keymap))
-#+END_SRC
+ ;; (sd/make-keymap "\M-s"
+ ;; '(("w" . save-buffer)
+ ;; ;; ("\M-w" . save-buffer)
+ ;; ("e" . revert-buffer)
+ ;; ("s" . isearch-forward-regexp)
+ ;; ("\M-s" . isearch-forward-regexp)
+ ;; ("r" . isearch-backward-regexp)
+ ;; ("." . isearch-forward-symbol-at-point)
+ ;; ("o" . occur)
+ ;; ;; ("h" . highlight-symbol-at-point)
+ ;; ("h" . highlight-symbol)
+ ;; ("m" . highlight-regexp)
+ ;; ("l" . highlight-lines-matching-regexp)
+ ;; ("M" . unhighlight-regexp)
+ ;; ("f" . keyboard-quit)
+ ;; ("q" . keyboard-quit)))
+#+END_SRC
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package highlight-symbol
+ :ensure t)
-*** C & C++
+ (defhydra sd/search-replace (:color red :columns nil)
+ "Search"
+ ("w" save-buffer "save" :exit t)
+ ("e" revert-buffer "revert" :exit t)
+ ("u" undo-tree-visualize "undo" :exit t)
+ ("s" isearch-forward-regexp "s-search" :exit t)
+ ("M-s" isearch-forward-regexp "s-search" :exit t)
+ ("r" isearch-backward-regexp "r-search" :exit t)
+ ("." isearch-forward-symbol-at-point "search point" :exit t)
+ ("/" swiper "swiper" :exit t)
+ ("o" occur "occur" :exit t)
+ ("h" highlight-symbol "higlight" :exit t)
+ ("l" highlight-lines-matching-regexp "higlight line" :exit t)
+ ("m" highlight-regexp "higlight" :exit t)
+ ("M" unhighlight-regexp "unhiglight" :exit t)
+ ("q" nil "quit")
+ ("f" nil))
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (global-unset-key (kbd "M-s"))
+ (global-set-key (kbd "M-s") 'sd/search-replace/body)
- (setq c-default-style "stroustrup"
- c-basic-offset 4)
+ ;; search and replace and highlight
+ (define-key isearch-mode-map (kbd "M-s") 'isearch-repeat-forward)
+ (define-key isearch-mode-map (kbd "M-r") 'isearch-repeat-backward)
+ (global-set-key (kbd "s-[") 'highlight-symbol-next)
+ (global-set-key (kbd "s-]") 'highlight-symbol-prev)
+ (global-set-key (kbd "s-\\") 'highlight-symbol-query-replace)
#+END_SRC
-** Compile
-
-Set the environments vairables in compilation mode
-
+*** Occur
+Occur search key bindings
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun sd/occur-keys ()
+ "My key bindings in occur-mode"
+ (interactive)
+ (switch-to-buffer-other-window "*Occur*")
+ (define-key occur-mode-map (kbd "C-o") nil)
+ (define-key occur-mode-map (kbd "C-n") (lambda ()
+ (interactive)
+ (occur-next)
+ (occur-mode-goto-occurrence-other-window)
+ (recenter)
+ (other-window 1)))
+ (define-key occur-mode-map (kbd "C-p") (lambda ()
+ (interactive)
+ (occur-prev)
+ (occur-mode-goto-occurrence-other-window)
+ (recenter)
+ (other-window 1))))
+
+ (add-hook 'occur-hook #'sd/occur-keys)
+
+ (use-package color-moccur
+ :ensure t
+ :commands (isearch-moccur isearch-all)
+ :init
+ (setq isearch-lazy-highlight t)
+ :config
+ (use-package moccur-edit))
+#+END_SRC
- (use-package compile
- :commands compile
+*** Swiper
+stolen from [[https://github.com/mariolong/emacs.d/blob/f6a061594ef1b5d1f4750e9dad9dc97d6e122840/emacs-init.org][here]]
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package swiper
+ :ensure t
+ :init
+ (setq ivy-use-virtual-buffers t)
+ (set-face-attribute 'ivy-current-match nil :background "Orange" :foreground "black")
:config
- (setq compilation-environment (cons "LC_ALL=C" compilation-environment)))
+ (ivy-mode)
+ (global-set-key (kbd "s-/") 'swiper)
+ (define-key swiper-map (kbd "M-r") 'swiper-query-replace)
+ (define-key swiper-map (kbd "C-.") (lambda ()
+ (interactive)
+ (insert (format "%s" (with-ivy-window (thing-at-point 'word))))))
+ (define-key swiper-map (kbd "M-.") (lambda ()
+ (interactive)
+ (insert (format "%s" (with-ivy-window (thing-at-point 'symbol)))))))
+#+END_SRC
+** Expand region map
+*** Install =expand-region=
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (use-package expand-region
+ :ensure t
+ :config
+ ;; (global-set-key (kbd "C-=") 'er/expand-region)
+ )
#+END_SRC
-** Auto-Insert
+*** Add a =hydra= map for =expand-region= operations
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (defun sd/mark-line ()
+ "Mark current line without whitespace beginning"
+ (interactive)
+ (back-to-indentation)
+ (set-mark (line-end-position)))
+
+ (defhydra sd/expand-selected (:color red :columns nil
+ :post (deactivate-mark)
+ )
+ "Selected"
+ ;; select
+ ;; ("e" er/expand-region "+")
+ ("SPC" er/expand-region "+")
+ ;; ("c" er/contract-region "-")
+ ("S-SPC" er/contract-region "-")
+ ("r" (lambda ()
+ (interactive)
+ (er/contract-region 0))
+ "reset")
-Enable auto-insert mode
+ ("i'" er/mark-inside-quotes "in")
+ ("i\"" er/mark-inside-quotes nil)
+ ("o'" er/mark-outside-quotes "out")
+ ("o\"" er/mark-outside-quotes nil)
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ("i{" er/mark-inside-pairs nil)
+ ("i(" er/mark-inside-pairs nil)
+ ("o{" er/mark-inside-pairs nil)
+ ("o(" er/mark-inside-pairs nil)
- (auto-insert-mode t)
- (setq auto-insert-query nil)
+ ("p" er/mark-paragraph "paragraph")
-#+END_SRC
+ ("l" sd/mark-line "line")
+ ("u" er/mark-url "url")
+ ("f" er/mark-defun "fun")
+ ("n" er/mark-next-accessor "next")
-*** C++ Auto Insert
+ ("x" exchange-point-and-mark "exchange")
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ;; Search
+ ;; higlight
- (eval-after-load 'autoinsert
- '(define-auto-insert '("\\.cpp\\'" . "C++ skeleton")
- '(
- "Short description:"
- "/*"
- "\n * " (file-name-nondirectory (buffer-file-name))
- "\n */" > \n \n
- "#include <iostream>" \n
- "#include \""
- (file-name-sans-extension
- (file-name-nondirectory (buffer-file-name)))
- ".hpp\"" \n \n
- "using namespace std;" \n \n
- "int main ()"
- "\n{" \n
- > _ \n
- "return 1;"
- "\n}" > \n
- )))
+ ;; exit
+ ("d" kill-region "delete" :exit t)
- (eval-after-load 'autoinsert
- '(define-auto-insert '("\\.c\\'" . "C skeleton")
- '(
- "Short description:"
- "/*\n"
- " * " (file-name-nondirectory (buffer-file-name)) "\n"
- " */" > \n \n
- "#include <stdio.h>" \n
- "#include \""
- (file-name-sans-extension
- (file-name-nondirectory (buffer-file-name)))
- ".h\"" \n \n
- "int main ()\n"
- "{" \n
- > _ \n
- "return 1;\n"
- "}" > \n
- )))
-
+ ("y" kill-ring-save "yank" :exit t)
+ ("M-SPC" nil "quit" :exit t)
+ ;; ("C-SPC" "quit" :exit t)
+ ("q" deactivate-mark "quit" :exit t))
+
+ (global-set-key (kbd "M-SPC") (lambda ()
+ (interactive)
+ (set-mark-command nil)
+ ;; (er/expand-region 1)
+ (er/mark-word)
+ (sd/expand-selected/body)))
#+END_SRC
-*** Perl Auto Insert
+*** TODO make expand-region hydra work with lispy selected
-Refer [[https://www.emacswiki.org/emacs/AutoInsertMode][AutoInsertMode]] Wiki
+* TODO Convert ASCII to key
+** map =function-key-map= [[http://academic.evergreen.edu/projects/biophysics/technotes/program/ascii_ctrl.htm][ascii_ctrl]]
+new file =C-x C-f C-f=
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-
- (eval-after-load 'autoinsert
- '(define-auto-insert '("\\.pl\\'" . "Perl skeleton")
- '(
- "Description: "
- "#!/usr/bin/perl -w" \n
- \n
- "use strict;" \n \n
- )))
+** write color syntax for =Man-mode=
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ (font-lock-add-keywords 'perl-mode '(("\\(|\\w+?\\(,\\w+?\\)?|\\)" 1 'py-builtins-face)))
#+END_SRC
-** Completion
+* TODO jump last change point
+* TODO emms mode-line
+
+* =C-u C-h a= search funtions
+=apropos-command=
-company mode
+* key
+- passion
+- vision
+- mission
+* M prefix
#+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))
+ ;; M-h - mark-paragraph
+ ;; M-j - new line indent
+ ;; M-k - kill-sentence
+ ;; M-l - downcase words ====== goto-line
+ ;; M-; - comments
+ ;; M-'- abbrev-prefix-mark =======
+ ;; M-RET none ======
-#+END_SRC
+ ;; M-y - yank
+ ;; M-u - upcase word
+ ;; M-i - ====== imenu
+ ;; M-o ====== prefix
+ ;; M-p
+ ;; M-[ =====
+ ;; M-] ========
+ ;; M-\ deleter horizontal space =====
-[[https://github.com/company-mode/company-statistics][company-statistics]]
+ ;; M-n
+ ;; M-m ---- indent
+ ;; M-, --- mark stack====== =
+ ;; M-. lisp-goto-symboo, find definitation
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+ ;; M-a
+ ;; M-s =====
+ ;; M-d
+ ;; M-f
+ ;; M-g - prefix
- (use-package company-statistics
- :ensure t
- :config
- (company-statistics-mode))
+ ;; M-q - lisp fill, fill paragraph
+ ;; M-w
+ ;; M-e
+ ;; M-r - rePositioning
+ ;; M-t transpose word
+ ;; M-z zap-to-char
+ ;; M-x
+ ;; M-c capitalize-word
+ ;; M-v
+ ;; M-b
#+END_SRC
-* Todo
-
-- change M-o to trigger to delete other windows and restore previous config
-