X-Git-Url: http://47.100.26.94:8080/?a=blobdiff_plain;f=emacs.d%2Fconfig.org;h=d71d28b866375c6a565f34463ba8474f2b3e9e08;hb=81367a877d96df83c8e68c920323988d04f930bf;hp=64b493f8a2d9dc15f75e2049a200f3cae30914fe;hpb=a0cb797bd0bbbc6a13a8bd0c58e32a4ce9ccd0d1;p=dotfiles.git diff --git a/emacs.d/config.org b/emacs.d/config.org index 64b493f..d71d28b 100644 --- a/emacs.d/config.org +++ b/emacs.d/config.org @@ -32,6 +32,10 @@ Set system PATH and emacs exec path #+BEGIN_SRC emacs-lisp :tangle yes :results silent (defconst my-name "Peng Li") (defconst my-email "seudut@gmail.com") + (defconst MY-EMACS-DIR (concat (getenv "HOME") "/.emacs.d")) + (defconst MY-EMACS-TMP (concat MY-EMACS-DIR "/temp")) + (unless (file-exists-p MY-EMACS-TMP) + (mkdir MY-EMACS-TMP)) #+END_SRC ** General Setting @@ -44,7 +48,7 @@ Set system PATH and emacs exec path (menu-bar-mode 1)) (menu-bar-mode 0)) - (setq debug-on-error t) + ;; (setq debug-on-error t) (setq inhibit-startup-message t) (defalias 'yes-or-no-p 'y-or-n-p) @@ -54,6 +58,16 @@ Set system PATH and emacs exec path ;;supress the redefined warning at startup (setq ad-redefinition-action 'accept) + + (setq scroll-step 1) + (setq scroll-margin 5) + + (when (display-graphic-p) + (fringe-mode '(0 . 0))) + + (blink-cursor-mode 0) + ;; (setq-default indicate-empty-lines t) + ;; (setq-default indicate-abuffer-boundaries 'right) #+END_SRC *** Custom file @@ -104,6 +118,7 @@ Make a temp directory for all cache/history files ;; set temp file path for recentf and auto-save (setq recentf-save-file (concat sd-temp-directory "recentf")) + (setq recentf-max-saved-items 1000) (setq auto-save-list-file-prefix (concat sd-temp-directory "auto-save-list/.saves-")) #+END_SRC @@ -112,6 +127,11 @@ Make a temp directory for all cache/history files (setq large-file-warning-threshold nil) #+END_SRC +*** Xterm mode +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (unless (display-graphic-p) + (xterm-mouse-mode)) +#+END_SRC * Package Management Tools ** Use-package Using [[https://github.com/jwiegley/use-package][use-package]] to manage emacs packages @@ -174,7 +194,7 @@ Check out [[http://tapoueh.org/emacs/el-get.html][el-get]]. (if window-system (defvar sd/fixed-font-family (cond ((x-list-fonts "Hasklig") "Hasklig") - ((x-list-fonts "Source Code Pro") "Source Code Pro:weight") ;; weigth=light + ((x-list-fonts "Source Code Pro") "Source Code Pro:weight=light") ;; weigth=light ((x-list-fonts "Anonymous Pro") "Anonymous Pro") ((x-list-fonts "M+ 1mn") "M+ 1mn")) "The fixed width font based on what is installed, `nil' if not defined.")) @@ -185,7 +205,7 @@ Setting the fonts alignment issue (if window-system (when sd/fixed-font-family (set-frame-font sd/fixed-font-family) - (set-face-attribute 'default nil :font sd/fixed-font-family :height 140) + (set-face-attribute 'default nil :font sd/fixed-font-family :height 120) (set-face-font 'default sd/fixed-font-family))) #+END_SRC @@ -355,6 +375,11 @@ improve color for org-mode #+END_SRC +search text theme +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (set-face-attribute 'lazy-highlight nil :background "yellow" :foreground "black" :weight 'bold) +#+END_SRC + ** Rainbow-delimiter #+BEGIN_SRC emacs-lisp :tangle yes :results silent @@ -422,6 +447,8 @@ clean mode line, Refer to [[https://www.masteringemacs.org/article/hiding-replac (irony-mode . "") (page-break-lines-mode . "") (yas-minor-mode . "y") + ;; default jj + (evil-escape-mode . "") ;; Major modes (lisp-interaction-mode . "λ") (hi-lock-mode . "") @@ -545,6 +572,7 @@ Revised powerline-center-theme )) (center (list (powerline-raw " " face1) (funcall separator-left face1 face2) + (powerline-raw (when (and (boundp 'evil-mode) evil-mode) evil-mode-line-tag) face2) (when (and (boundp 'erc-track-minor-mode) erc-track-minor-mode) (powerline-raw erc-modified-channels-object face2 'l)) (powerline-major-mode face2 'l) @@ -587,15 +615,23 @@ set height in mode line #+BEGIN_SRC emacs-lisp :tangle yes :results silent (use-package ido :ensure t - :init (setq ido-enable-flex-matching nil + :init (setq ido-enable-flex-matching t ido-ignore-extensions t ido-use-virtual-buffers t + ido-use-faces nil 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")) + (add-to-list 'completion-ignored-extensions ".pyc") + + + (define-key ido-buffer-completion-map (kbd "C-w") #'ido-delete-backward-word-updir) + (define-key ido-file-completion-map (kbd "C-w") #'ido-delete-backward-word-updir) + (define-key ido-file-dir-completion-map (kbd "C-w") #'ido-delete-backward-updir) + ;; (define-key ido-file-dir-completion-map (kbd "C-i") #'ido-copy-current-word) + ) (icomplete-mode t) #+END_SRC @@ -604,8 +640,6 @@ set height in mode line #+BEGIN_SRC emacs-lisp :tangle yes :results silent (use-package flx-ido :ensure t - :init (setq ido-enable-flex-matching nil - ido-use-faces nil) :config (flx-ido-mode nil)) #+END_SRC @@ -658,27 +692,146 @@ Use [[https://github.com/DarwinAwardWinner/ido-ubiquitous][ido-ubiquitous]] for ido-file-dir-completion-map))) #+END_SRC -** Counsel +** 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 + +* 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")) + (setq projectile-completion-system 'ivy) + :config + (add-to-list 'projectile-globally-ignored-files "GTAGS") + (projectile-global-mode t)) + + ;; https://emacs.stackexchange.com/questions/16497/how-to-exclude-files-from-projectile + (if (executable-find "rg") + (progn + (defconst modi/rg-arguments + `("--line-number" ; line numbers + "--smart-case" + "--follow" ; follow symlinks + "--mmap") ; apply memory map optimization when possible + "Default rg arguments used in the functions in `projectile' package.") + + (defun modi/advice-projectile-use-rg () + "Always use `rg' for getting a list of all files in the project." + (mapconcat 'identity + (append '("\\rg") ; used unaliased version of `rg': \rg + modi/rg-arguments + '("--null" ; output null separated results, + "--files")) ; get file names matching the regex '' (all files) + " ")) + + (advice-add 'projectile-get-ext-command :override #'modi/advice-projectile-use-rg)) + (message "rg is not found")) +#+END_SRC + +* Swiper & Ivy & Counsel #+BEGIN_SRC emacs-lisp :tangle yes :results silent (use-package counsel :ensure t :defer t :init + (use-package ivy :ensure t) + (ivy-mode 1) + (setq ivy-use-virtual-buffers nil + ivy-wrap t + ivy-count-format "%d/%d ") + (set-face-attribute 'ivy-current-match nil :background "Orange" :foreground "black") (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") + ;; (global-set-key (kbd "C-h f") 'counsel-describe-function) + ;; (global-set-key (kbd "C-h v") 'counsel-describe-variable) + (global-set-key (kbd "C-x C-f") 'counsel-find-file) (define-key read-expression-map (kbd "C-r") 'counsel-expression-history) (global-set-key (kbd "C-c C-r") 'ivy-resume)) #+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)) + (ivy-set-actions + t + '(("q" (lambda (x) (ivy-quit-and-run (message "=="))) "exit"))) + + (ivy-set-actions + 'projectile-switch-to-buffer + '(("j" ivy--switch-buffer-other-window-action "other window" ))) + + (defun sd/projectile-find-file-other-window-action (file) + (message "=========") + (message (projectile-expand-root file)) + (find-file-other-window (projectile-expand-root file))) + + (ivy-set-actions + 'projectile-find-file + '(("j" sd/projectile-find-file-other-window-action "other-window"))) + + (defun sd/swith-to-buffer () + "switch to buffer" + (interactive) + (if (projectile-project-p) + (projectile-switch-to-buffer) + (ivy-switch-buffer))) + + (ivy-set-actions + 'sd/swith-to-buffer + '(("j" ivy--switch-buffer-other-window-action "other window"))) + + (defun sd/exit-ivy-and-swith-to-buffer () + "exit ivy complete, and call swith to buffer" + (interactive) + (ivy-quit-and-run + (ivy-switch-buffer))) + + (defun my/ivy-read-action (key) + (let ((actions (ivy-state-action ivy-last))) + (if (null (ivy--actionp actions)) + t + (let* ((action-idx (cl-position-if + (lambda (x) (equal (car x) key)) + (cdr actions)))) + (cond ((member key '("" "")) + nil) + ((null action-idx) + (message "%s is not bound" key) + nil) + (t + (message "") + (setcar actions (1+ action-idx)) + (ivy-set-action actions))))))) + + (with-eval-after-load "ivy" + (define-key ivy-minibuffer-map (kbd "C-o") 'ivy-dispatching-done) + (define-key ivy-minibuffer-map (kbd "C-k") (lambda () (interactive) + (my/ivy-read-action "j") + (ivy-done))) + (define-key ivy-minibuffer-map (kbd "M-o") #'sd/exit-ivy-and-swith-to-buffer)) #+END_SRC +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 + :config + ;; (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 * Org-mode Settings ** Org-mode Basic setting Always indents header, and hide header leading starts so that no need type =#+STATUP: indent= @@ -717,12 +870,12 @@ Always indents header, and hide header leading starts so that no need type =#+ST :features ob-racket) ;; Lua support - ;(use-package ob-lua - ; :ensure t) +;; (use-package ob-lua +;; :ensure t) ;; use current window for org source buffer editting - (setq org-src-window-setup 'current-window ) + ;; (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) @@ -731,7 +884,7 @@ Always indents header, and hide header leading starts so that no need type =#+ST (setq org-ditaa-jar-path "/usr/local/Cellar/ditaa/0.9/libexec/ditaa0_9.jar") (unless (file-exists-p org-ditaa-jar-path) - (warn "seudut: ditaa.jar not found at %s " org-ditaa-jar-path)) + (message "seudut: ditaa.jar not found at %s " org-ditaa-jar-path)) (org-babel-do-load-languages 'org-babel-load-languages '((python . t) @@ -741,7 +894,7 @@ Always indents header, and hide header leading starts so that no need type =#+ST (latex . t) (java . t) (ruby . t) - ; (lua . t) +; (lua . t) (lisp . t) (scheme . t) (racket . t) @@ -789,9 +942,7 @@ use [[https://github.com/sabof/org-bullets][org-bullets]] package to show utf-8 (use-package org-bullets :ensure t :init - (add-hook 'org-mode-hook - (lambda () - (org-bullets-mode t)))) + (add-hook 'org-mode-hook (apply-partially #'org-bullets-mode t))) (setq org-bullets-bullet-list '("⦿" "✪" "◉" "○" "►" "◆")) @@ -1140,35 +1291,63 @@ extend org-mode's easy templates, refer to [[http://coldnew.github.io/coldnew-em *** variable-pitch-mode and fixed-pitch-mode [[https://yoo2080.wordpress.com/2013/05/30/monospace-font-in-tables-and-source-code-blocks-in-org-mode-proportional-font-in-other-parts/][monospace font in tables and source code blocks in org-mode, proportional font in other parts]] #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (unless (find-font (font-spec :name "Ubuntu Mono")) - (warn "Font not found Ubuntu Mono")) - (unless (find-font (font-spec :name "Source Code Pro")) - (warn "Font not found Source Code Pro")) - (unless (find-font (font-spec :name "Source Sans Pro")) - (warn "Font not found Source Sans Pro")) + (when (display-graphic-p) + (unless (find-font (font-spec :name "Ubuntu Mono")) + (warn "Font not found Ubuntu Mono")) + (unless (find-font (font-spec :name "Source Code Pro")) + (warn "Font not found Source Code Pro")) + (unless (find-font (font-spec :name "Source Sans Pro")) + (warn "Font not found Source Sans Pro"))) (set-face-attribute 'variable-pitch nil :font "Source Sans Pro" :height 160) (set-face-attribute 'fixed-pitch nil :font "Source Code Pro" :height (face-attribute 'default :height)) - (add-hook 'text-mode-hook 'variable-pitch-mode) ;; Install Ubuntu Mono fonts and apply it in org-table to align Chinese fonts (with-eval-after-load "org" (mapc (lambda (face) (set-face-attribute face nil :inherit 'fixed-pitch)) - (list 'org-code 'org-block 'org-block-background 'org-block-begin-line 'org-block-end-line)) - (set-face-attribute 'org-table nil :family "Ubuntu Mono" :height 140) - (set-face-attribute 'org-formula nil :family "Ubuntu Mono" :height 140) + (list + 'org-code + 'org-block + 'org-block-background + 'org-block-begin-line + 'org-block-end-line)) + (set-face-attribute 'org-table nil :family "Ubuntu Mono" :height 100) + (set-face-attribute 'org-formula nil :family "Ubuntu Mono" :height 100) ;; org-special-keyword inherited from font-lock-keywork originally; as org is changed to variable-pitch, it cause ;; the font in special-keywords are not monospace (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-keyword-face fixed-pitch)) ;; same as above (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch)) + (set-face-attribute 'org-block-begin-line nil :inherit 'shadow :slant 'italic :foreground nil) + (set-face-attribute 'org-block-end-line nil :inherit 'shadow :slant 'italic :foreground nil) ;; fix indent broken by variable-pitch-mode ;; http://emacs.stackexchange.com/questions/26864/variable-pitch-face-breaking-indentation-in-org-mode (require 'org-indent) (set-face-attribute 'org-indent nil :inherit '(org-hide fixed-pitch))) + + ;; (with-eval-after-load "org" + ;; (let ((default-font-size (- (face-attribute 'default :height) (if (display-graphic-p) 20 0)))) + ;; (set-face-attribute 'org-code nil :height default-font-size) + ;; (set-face-attribute 'org-block nil :height default-font-size) + ;; (set-face-attribute 'org-block-begin-line nil :background nil :foreground nil :inherit 'shadow :slant 'italic :height default-font-size) + ;; (set-face-attribute 'org-block-end-line nil :background nil :foreground nil :inherit 'shadow :slant 'italic :height default-font-size) + ;; (when (find-font (font-spec :name "Ubuntu Mono")) + ;; (set-face-attribute 'org-table nil :family "Ubutu Mono" :height default-font-size) + ;; (set-face-attribute 'org-formula nil :family "Ubutu Mono" :height default-font-size)))) + + (add-hook 'org-mode-hook + (lambda () + (let ((default-font-size (- (face-attribute 'default :height) (if (display-graphic-p) 20 0)))) + (set-face-attribute 'org-code nil :height default-font-size) + (set-face-attribute 'org-block nil :height default-font-size) + (set-face-attribute 'org-block-begin-line nil :background nil :foreground nil :inherit 'shadow :slant 'italic :height default-font-size) + (set-face-attribute 'org-block-end-line nil :background nil :foreground nil :inherit 'shadow :slant 'italic :height default-font-size) + (when (find-font (font-spec :name "Ubuntu Mono")) + (set-face-attribute 'org-table nil :family "Ubutu Mono" :height default-font-size) + (set-face-attribute 'org-formula nil :family "Ubutu Mono" :height default-font-size))))) #+END_SRC Also correct the face of =org-meta-line= in =org-table= @@ -1179,18 +1358,18 @@ Also correct the face of =org-meta-line= in =org-table= *** Org-head face #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (with-eval-after-load "org" - (let* ((base-height (face-attribute 'variable-pitch :height)) - (base-font-color (face-foreground 'default nil 'default))) - (set-face-attribute 'org-document-title nil :weight 'bold :height (+ 60 base-height)) - (set-face-attribute 'org-level-1 nil :weight 'bold :height (+ 40 base-height)) - (set-face-attribute 'org-level-2 nil :weight 'bold :height (+ 30 base-height)) - (set-face-attribute 'org-level-3 nil :weight 'bold :height (+ 20 base-height)) - (set-face-attribute 'org-level-4 nil :weight 'bold :height (+ 10 base-height)) - (set-face-attribute 'org-level-5 nil :weight 'bold) - (set-face-attribute 'org-level-6 nil :weight 'bold) - (set-face-attribute 'org-level-7 nil :weight 'bold) - (set-face-attribute 'org-level-8 nil :weight 'bold))) + ;; (with-eval-after-load "org" + ;; (let* ((base-height (face-attribute 'variable-pitch :height)) + ;; (base-font-color (face-foreground 'default nil 'default))) + ;; (set-face-attribute 'org-document-title nil :weight 'bold :height (+ 60 base-height)) + ;; (set-face-attribute 'org-level-1 nil :weight 'bold :height (+ 40 base-height)) + ;; (set-face-attribute 'org-level-2 nil :weight 'bold :height (+ 30 base-height)) + ;; (set-face-attribute 'org-level-3 nil :weight 'bold :height (+ 20 base-height)) + ;; (set-face-attribute 'org-level-4 nil :weight 'bold :height (+ 10 base-height)) + ;; (set-face-attribute 'org-level-5 nil :weight 'bold) + ;; (set-face-attribute 'org-level-6 nil :weight 'bold) + ;; (set-face-attribute 'org-level-7 nil :weight 'bold) + ;; (set-face-attribute 'org-level-8 nil :weight 'bold))) #+END_SRC ** Org Blog @@ -1235,7 +1414,9 @@ and Defined keys, using vi keybindings, Refer abo-abo's setting [[https://github (define-key map "n" nil) (define-key map "p" nil) (define-key map "v" 'recenter-top-bottom) - (define-key map "i" 'magit-section-toggle))) + (define-key map "i" 'magit-section-toggle)) + (define-key magit-mode-map "q" (lambda () (interactive) + (magit-mode-bury-buffer t)))) #+END_SRC * Eshell @@ -1256,8 +1437,20 @@ set default eshell history folder #+BEGIN_SRC emacs-lisp :tangle yes :results silent (require 'utilities) - (add-hook 'eshell-mode-hook (lambda () - (local-set-key (kbd "C-l") 'sd/eshell-clear-buffer))) + ;; (add-hook 'eshell-mode-hook (lambda () + ;; (local-set-key (kbd "C-l") 'sd/eshell-clear-buffer))) + ;; (add-hook 'eshell-mode-map (lambda () (interactive) + ;; (define-key eshell-mode-map (kbd "") 'completion-at-point))) + + (defun sd/eshell-hook () + (interactive) + (define-key eshell-mode-map (kbd "C-j") #'eshell-send-input) + (define-key eshell-mode-map (kbd "C-l") #'sd/eshell-clear-buffer)) + + (add-hook 'eshell-mode-hook #'sd/eshell-hook) + + + ;; (add-hook 'eshell-mode-hook (apply-partially #'local-set-key (kbd "C-l") 'sd/eshell-clear-buffer)) #+END_SRC ** Toggle Eshell @@ -1309,9 +1502,10 @@ Toggle an eshell in split window below, refer [[http://www.howardism.org/Technic *** hydra install #+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) + :ensure t + ;; disable new line in minibuffer when hint hydra + :init + (setq hydra-lv nil)) #+END_SRC *** Windmove Splitter @@ -1374,7 +1568,53 @@ Refer [[https://github.com/abo-abo/hydra/blob/master/hydra-examples.el][hydra-ex ("q" nil "quit") ("f" nil "quit")) - (global-set-key (kbd "C-'") 'sd/hydra-misc/body) + ;; (global-set-key (kbd "C-'") 'sd/hydra-misc/body) + + (defun sd/exchange-win-layout () + "Change the windos layout." + (interactive) + (when (equal (length (window-list)) 2) + (let ((current-layout (if (or (window-in-direction 'right) (window-in-direction 'left)) + 'v + 'h)) + (other-buf (window-buffer (or (window-in-direction 'right) + (window-in-direction 'left) + (window-in-direction 'below) + (window-in-direction 'above))))) + (delete-other-windows) + (if (eq current-layout 'v) + (split-window-below) + (split-window-right)) + (other-window 1) + (switch-to-buffer other-buf)))) + + (defhydra sd/hydra-window-layout (:color red :colums nil) + "Window Layout" + ("m" sd/toggle-max-windows "Max-win" :exit t) + ("s" ace-swap-window "Swap" :exit t) + ("d" ace-delete-window "Delete" :exit t) + ("x" sd/exchange-win-layout "eXchange" :exit t) + ("u" winner-undo "window-Undo" :exit t) + ("r" winner-redo "window-Redo" :exit t) + ("C-h" (lambda () (interactive) (evil-window-increase-width 3)) "<<") + ("C-l" (lambda () (interactive) (evil-window-decrease-width 3)) ">>") + ("C-k" (lambda () (interactive) (evil-window-increase-height 3)) "^") + ("C-j" (lambda () (interactive) (evil-window-decrease-height 3)) "v") + ("=" balance-windows "=" :exit t) + ("q" nil "quit")) + + (defhydra sd/hydra-gtags (:color red :colums nil) + "ggtags - global" + ("d" sd/ggtags-find-definition "Definition" :exit t) + ("r" ggtags-find-reference "Reference" :exit t) + ("s" sd/ggtags-find-symbol "Symbol" :exit t)) + + (defhydra sd/hydra-projectile (:color red :column nil) + "Projectile: " + ("s" projectile-switch-open-project "Switch" :exit t) + ("f" projectile-find-file "File" :exit t) + ("b" projectile-switch-to-buffer "Buffer" :exit t) + ("p" projectile-switch-project "Project" :exit t)) #+END_SRC *** hydra launcher @@ -1425,6 +1665,7 @@ I like [[https://github.com/coldnew/linum-relative][linum-relative]], just like ** Save File Position #+BEGIN_SRC emacs-lisp :tangle yes :results silent (require 'saveplace) + (setq save-place-file "~/.emacs.d/temp/saveplace") (setq-default save-place t) (setq save-place-forget-unreadable-files t) (setq save-place-skip-check-regexp "\\`/\\(?:cdrom\\|floppy\\|mnt\\|/[0-9]\\|\\(?:[^@/:]*@\\)?[^@/:]*[^@/:.]:\\)") @@ -1459,12 +1700,12 @@ Type =o= to go to the link ** Smart Parens #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package smartparens - :ensure t - :config - (progn - (require 'smartparens-config) - (add-hook 'prog-mode-hook 'smartparens-mode))) + ;; (use-package smartparens + ;; :ensure t + ;; :config + ;; (progn + ;; (require 'smartparens-config) + ;; (add-hook 'prog-mode-hook 'smartparens-mode))) #+END_SRC ** Ace-Windows @@ -1482,10 +1723,10 @@ Type =o= to go to the link ** Which key [[https://github.com/justbur/emacs-which-key][which-key]] show the key bindings #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package which-key - :ensure t - :config - (which-key-mode)) + ;; (use-package which-key + ;; :ensure t + ;; :config + ;; (which-key-mode)) #+END_SRC ** View only for some directory @@ -1500,6 +1741,7 @@ When see function by =C-h f=, and visit the source code, I would like the buffer ;; (eval . (when buffer-file-name ;; (setq-local view-no-disable-on-exit t) ;; (view-mode-enter))) + (projectile-enable-caching . nil) )))) ;; (dir-locals-set-directory-class (expand-file-name "/usr/local/share/emacs") 'emacs) @@ -1637,8 +1879,8 @@ Wiki [[http://stackoverflow.com/questions/3480173/show-keys-in-emacs-keymap-valu ** goto-last-change #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package goto-last-change - :ensure t) + ;; (use-package goto-last-change + ;; :ensure t) #+END_SRC ** Ag @@ -1693,29 +1935,40 @@ as a http download client tool (car (last (split-string url "/" t)))))))))) #+END_SRC -** Elscreen -Fix one elscreen issue when startup emacs https://github.com/knu/elscreen/issues/6 +* Dired +** Dired basic #+BEGIN_SRC emacs-lisp :tangle yes :results silent - ;; (use-package elscreen - ;; :ensure t - ;; :init - ;; (setq elscreen-tab-display-control nil) - ;; :config - ;; ;; (elscreen-start) - ;; (set-face-attribute 'elscreen-tab-current-screen-face nil :foreground "black" :background "yellow") - ;; (set-face-attribute 'elscreen-tab-other-screen-face nil :foreground "black" :background "disabledControlTextColor" :underline nil) - ;; ;; (global-unset-key (kbd)); M-TAB switch screen - ;; ;; (global-set-key (kbd "s-`") '(lambda () (interactive) (elscreen-goto 0))) - ;; ;; (dotimes (i 8) - ;; ;; (global-set-key (kbd (concat "s-" (number-to-string (+ i 1)))) - ;; ;; `(lambda () (interactive) (elscreen-goto ,(+ i 1))))) - ;; ;; (global-set-key (kbd "s-t") 'elscreen-create) - ;; ;; (global-set-key (kbd "s-n") 'elscreen-next) - ;; ;; (global-set-key (kbd "s-p") 'elscreen-previous) - ;; ) + (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 ** 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 @@ -1870,7 +2123,7 @@ here on Mac, just use "open" commands to pen =.pdf=, =.html= and image files ("\\.csv\\'" "libreoffice") ("\\.tex\\'" "pdflatex" "latex") ("\\.\\(?:mp4\\|mkv\\|avi\\|rmvb\\|flv\\|ogv\\)\\(?:\\.part\\)?\\'" "mplayer") - ("\\.\\(?:mp3\\|flac\\)\\'" "rhythmbox") + ("\\.\\(?:mp3\\|flac\\|wav\\)\\'" "mplayer") ("\\.html?\\'" "open") ("\\.dmg\\'" "open") ("\\.cue?\\'" "audacious"))) @@ -1878,30 +2131,27 @@ here on Mac, just use "open" commands to pen =.pdf=, =.html= and image files (defun sd/dired-start-process (cmd &optional file-list) (interactive - (let ((files (dired-get-marked-files - t current-prefix-arg))) + (let ((files (dired-get-marked-files t current-prefix-arg))) (list - (unless (eq system-type 'windows-nt) - (dired-read-shell-command "& on %s: " - current-prefix-arg files)) + (dired-read-shell-command "& on %s: " current-prefix-arg files) files))) - (if (eq system-type 'windows-nt) - (dolist (file file-list) - (w32-shell-execute "open" (expand-file-name file))) - (let (list-switch) - (start-process - cmd nil shell-file-name - shell-command-switch - (format - "nohup 1>/dev/null 2>/dev/null %s \"%s\"" - cmd - ;; (if (and (> (length file-list) 1) - ;; (setq list-switch - ;; (cadr (assoc cmd ora-dired-filelist-cmd)))) - ;; (format "%s %s" cmd list-switch) - ;; cmd) - (mapconcat #'expand-file-name file-list "\" \"")))))) + ;; (let (list-switch)) + (start-process + cmd nil shell-file-name + shell-command-switch + (format + "nohup 1>/dev/null 2>/dev/null %s \"%s\"" + cmd + ;; (if (and (> (length file-list) 1) + ;; (setq list-switch + ;; (cadr (assoc cmd ora-dired-filelist-cmd)))) + ;; (format "%s %s" cmd list-switch) + ;; cmd) + (mapconcat #'expand-file-name file-list "\" \"")))) + + + #+END_SRC ** dired-hacks @@ -1957,12 +2207,16 @@ here on Mac, just use "open" commands to pen =.pdf=, =.html= and image files ;; should map both (kbd "TAB") and [tab],https://github.com/company-mode/company-mode/issues/75 (define-key company-active-map (kbd "TAB") #'company-complete-selection) (define-key company-active-map [tab] #'company-complete-selection) + (define-key company-active-map (kbd "C-w") nil) + (define-key company-active-map (kbd "C-h") nil) (global-company-mode) ;; magig-commit is text-modeh (setq company-global-modes '(not org-mode magit-status-mode text-mode eshell-mode gfm-mode markdown-mode))) (use-package company-statistics :ensure t + :init + (setq company-statistics-file (concat MY-EMACS-TMP "/company-statistics-cache.el")) :config (company-statistics-mode)) @@ -1985,6 +2239,24 @@ here on Mac, just use "open" commands to pen =.pdf=, =.html= and image files (yas-reload-all)) #+END_SRC +** YouCompleteMe +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package ycmd + :ensure t + :init + (use-package company-ycmd + :ensure t + :init + (setq company-ycmd-enable-fuzzy-matching nil) + :config + (company-ycmd-setup)) + (setq ycmd-force-semantic-completion t) + (add-hook 'c++-mode-hook 'ycmd-mode) + (add-hook 'c-mode-hook 'ycmd-mode) + (set-variable 'ycmd-server-command '("python" "/Users/peng/project/ycmd/ycmd")) + (set-variable 'ycmd-global-config "/Users/peng/project/ycmd/cpp/ycm/.ycm_extra_conf.py")) +#+END_SRC + ** company and yasnippet Add yasnippet as the company candidates @@ -2090,33 +2362,59 @@ Refer, [[http://emacs.stackexchange.com/questions/7908/how-to-make-yasnippet-and #+END_SRC * Programming Language -** Emacs Lisp +** Color identiifiers mode #+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) - + (dolist (mode '(emacs-lisp-mode-hook + c-mode-hook + c++-mode-hook)) + (add-hook mode #'color-identifiers-mode)) :diminish color-identifiers-mode) (global-prettify-symbols-mode t) #+END_SRC +** Font lock face + +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (set-face-attribute 'font-lock-keyword-face nil :foreground "#F92672" :weight 'bold) + (set-face-attribute 'font-lock-builtin-face nil :weight 'bold) + (set-face-attribute 'font-lock-function-name-face nil :foreground "#A6E22E" :weight 'normal :slant 'normal) + (set-face-attribute 'font-lock-variable-name-face nil :foreground "#00FF00") + + (dolist (mode '(c-mode + c++-mode)) + (font-lock-add-keywords mode + ;; highlight %s \n + '(("\\([%\\][a-zA-Z]\\)" (1 font-lock-keyword-face prepend)) + ("[^[:alpha:]]\\([[:digit:]]*\\)[^[:alpha:]]" (1 font-lock-constant-face append)) + ;; hex number + ("[^[:alpha:]]\\(0[x\\|X][0-9a-fA-F]*\\)[^[:alpha:]]" (1 font-lock-constant-face append)) + ;; hightlight the function call + ("\\s\"?\\(\\(\\sw\\|\\s_\\)+\\(<-\\)?\\)\\s\"?*\\s-*(" (1 font-lock-function-name-face))) t)) + + (font-lock-add-keywords 'c++-mode + '( + ("[\s\\|::]\\(cin\\|cout\\|endl\\)[^[:alpha:][:digit:]]" (1 font-lock-constant-face append)) + ) t) +#+END_SRC +** Emacs Lisp 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 + (setq lispy-delete-backward-recenter 0) (with-eval-after-load "lispy" (define-key lispy-mode-map (kbd "M-o") nil) (define-key lispy-mode-map (kbd "g") 'special-lispy-goto-local) (define-key lispy-mode-map (kbd "G") 'special-lispy-goto) (define-key lispy-mode-map (kbd "M-m") 'back-to-indentation)) :config - (add-hook 'emacs-lisp-mode-hook (lambda () (lispy-mode 1)))) - - + (add-hook 'emacs-lisp-mode-hook (apply-partially #'lispy-mode 1))) #+END_SRC ** Perl @@ -2136,9 +2434,7 @@ bindings in =lispy-mode-map= after loaded. see [[http://stackoverflow.com/questi (setq cperl-tab-always-indent t) ;(setq cperl-brace-offset 0) - (add-hook 'cperl-mode-hook - '(lambda () - (cperl-set-style "C++"))) + (add-hook 'cperl-mode-hook (apply-partially #'cperl-set-style "C++")) (defalias 'perldoc 'cperl-perldoc) #+END_SRC @@ -2162,34 +2458,10 @@ Refer [[https://www.emacswiki.org/emacs/AutoInsertMode][AutoInsertMode]] Wiki (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) + ("\".*\\(\\\n\\).*\"" 1 font-lock-constant-face prepend) + ("\n" 0 font-lock-constant-face prepend) + ;; ("[%\\][[:alpha:]]" . font-lock-constant-face) ("\\(^#!.*\\)$" . cperl-nonoverridable-face))) - - ;; (font-lock-add-keywords 'Man-mode - ;; '(("\\(NAME\\)" . font-lock-function-name-face))) - -#+END_SRC - -*** 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))))) - - (add-hook 'cperl-mode-hook 'my-perl-hook) #+END_SRC ** C & C++ @@ -2199,21 +2471,47 @@ C/C++ ide tools 3. tags jump *** c/c++ style #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (setq c-default-style "stroustrup" - c-basic-offset 4) + ;; (setq c-default-style "stroustrup" + ;; c-basic-offset 4) - ;; "C-M-j" is my global binding for avy goto line below - ;; disable it in c mode - (mapcar #'(lambda (map) - (define-key map (kbd "C-M-j") nil)) - (list c-mode-map - c++-mode-map - objc-mode-map)) + ;; ;; "C-M-j" is my global binding for avy goto line below + ;; ;; disable it in c mode + ;; (mapcar #'(lambda (map) + ;; (define-key map (kbd "C-M-j") nil)) + ;; (list c-mode-map + ;; c++-mode-map + ;; objc-mode-map)) ;; objective c (add-to-list 'auto-mode-alist '("\\.mm\\'" . objc-mode)) -#+END_SRC + (setq-default c-hungry-delete-key t) + + + ;; Looks `c-hanging-braces-alist' doesn't work as expected when `electric-pair-mode' is enabled. + (electric-pair-mode 1) + + (defconst sd/c-style + '("stroustrup" + (c-tab-always-indent . t) + (c-basic-offset . 4) + (c-hanging-braces-alist . ((substatement-open before) + (statement-block-intro before))) + (c-hanging-colons-alist . ()) + (c-echo-syntactic-information-p . nil) + (c-hanging-semi&comma-criteria . ())) + "My C programming style") + + (c-add-style "sd-c-style" sd/c-style) + + (setq c-default-style "sd-c-style") + + (add-hook 'c-mode-hook '(lambda () + (c-toggle-auto-newline 1) + (c-set-style "sd-c-style"))) + + ;; (advice-add 'c-electric-brace :after (lambda (arg) "Add new line after insert {}" (newline-and-indent))) +#+END_SRC *** irony **** install irony server Install clang, on mac, it has =libclang.dylib=, but no develop headers. Install by =brew= @@ -2227,21 +2525,21 @@ then install irony searver, and =LIBCLANG_LIBRARY= and =LIBCLANG_INCLUDE_DIR= ac #+END_SRC #+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 + cmake -DLIBCLANG_LIBRARY\=/usr/local/Cellar/llvm/4.0.1/lib/libclang.dylib \ + -DLIBCLANG_INCLUDE_DIR=/usr/local/Cellar/llvm/4.0.1/include \ + -DCMAKE_INSTALL_PREFIX\=/Users/peng/.emacs.d/irony/ \ + /Users/peng/.emacs.d/elpa/irony-20160713.1245/server && cmake --build . --use-stderr --config Release --target install #+END_SRC **** irony config irony-mode-hook, copied from [[https://github.com/Sarcasm/irony-mode][irony-mode]] github #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package irony - :ensure t - :config - (add-hook 'c++-mode-hook 'irony-mode) - (add-hook 'c-mode-hook 'irony-mode) - (add-hook 'objc-mode-hook 'irony-mode)) + ;; (use-package irony + ;; :ensure t + ;; :init + ;; (add-hook 'c++-mode-hook 'irony-mode) + ;; (add-hook 'c-mode-hook 'irony-mode) + ;; (add-hook 'objc-mode-hook 'irony-mode)) ;; replace the `completion-at-point' and `complete-symbol' bindings in ;; irony-mode's buffers by irony-mode's function @@ -2252,10 +2550,10 @@ irony-mode-hook, copied from [[https://github.com/Sarcasm/irony-mode][irony-mode (define-key irony-mode-map [remap complete-symbol] 'irony-completion-at-point-async)) - (add-hook 'irony-mode-hook 'my-irony-mode-hook) - (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options) + ;; (add-hook 'irony-mode-hook 'my-irony-mode-hook) + ;; (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options) - (add-hook 'c++-mode-local-vars-hook #'sd/c++-mode-local-vars) + ;; (add-hook 'c++-mode-local-vars-hook #'sd/c++-mode-local-vars) ;; add C++ completions, because by default c++ file can not complete ;; c++ std functions, another method is create .dir-local.el file, for p @@ -2269,27 +2567,28 @@ irony-mode-hook, copied from [[https://github.com/Sarcasm/irony-mode][irony-mode irony-company #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package company-irony - :ensure t) + ;; (use-package company-irony + ;; :ensure t) - (use-package flycheck-irony - :ensure t) + ;; (use-package flycheck-irony + ;; :ensure t) - (use-package company-c-headers - :ensure t - :config - (add-to-list 'company-c-headers-path-system "/usr/include/c++/4.2.1/")) + ;; (use-package company-c-headers + ;; :ensure t + ;; :config + ;; (add-to-list 'company-c-headers-path-system "/usr/include/c++/4.2.1/") + ;; (add-to-list 'company-c-headers-path-system "/usr/local/include/")) ;; (with-eval-after-load 'company ;; (add-to-list 'company-backends 'company-irony) ;; (add-to-list 'company-backends 'company-c-headers)) - (with-eval-after-load 'company - (push '(company-irony :with company-yasnippet) company-backends) - (push '(company-c-headers :with company-yasnippet) company-backends)) + ;; (with-eval-after-load 'company + ;; (push '(company-irony :with company-yasnippet) company-backends) + ;; (push '(company-c-headers :with company-yasnippet) company-backends)) - (with-eval-after-load 'flycheck - (add-hook 'flycheck-mode-hook #'flycheck-irony-setup)) + ;; (with-eval-after-load 'flycheck + ;; (add-hook 'flycheck-mode-hook #'flycheck-irony-setup)) #+END_SRC *** flycheck @@ -2318,8 +2617,23 @@ irony-company (when (derived-mode-p 'c-mode 'c++-mode 'java-mode) (ggtags-mode 1)))) + (defun sd/ggtags-find-definition () + "Find the definition with current name completing." + (interactive) + (setq current-prefix-arg '(4)) + (call-interactively 'ggtags-find-definition)) + + (defun sd/ggtags-find-symbol () + "Find symbol" + (interactive) + (setq current-prefix-arg '(4)) + (call-interactively 'ggtags-find-other-symbol)) + (require 'cc-mode) (require 'semantic) + (setq semanticdb-default-save-directory (concat MY-EMACS-TMP "/semantic/")) + (unless (file-exists-p semanticdb-default-save-directory) + (make-directory semanticdb-default-save-directory)) (global-semanticdb-minor-mode 1) (global-semantic-idle-scheduler-mode 1) @@ -2329,11 +2643,34 @@ irony-company *** google C style #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package google-c-style - :ensure t - :config - (add-hook 'c-mode-hook 'google-set-c-style) - (add-hook 'c++-mode-hook 'google-set-c-style)) + ;; (use-package google-c-style + ;; :ensure t + ;; :config + ;; (add-hook 'c-mode-hook 'google-set-c-style) + ;; (add-hook 'c++-mode-hook 'google-set-c-style)) +#+END_SRC + +*** Compile and Run the C file +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (defun my-cpp-hook () + (let* ((current-file-name) + (out-file-name)) + (when buffer-file-name + (setq current-file-name (shell-quote-argument buffer-file-name)) + (setq out-file-name (shell-quote-argument (concat (file-name-sans-extension buffer-file-name) ".out")))) + (setq-local compilation-read-command t) + (set (make-local-variable 'compile-command) + (concat "g++ -Wall -std=c++11 " + current-file-name + " -o " + out-file-name + " && " + out-file-name + )) + (local-set-key (kbd "s-r") 'compile))) + + (add-hook 'c-mode-hook 'my-cpp-hook) + (add-hook 'c++-mode-hook 'my-cpp-hook) #+END_SRC ** Lua @@ -2370,14 +2707,13 @@ Install =guile=, =guile= is an implementation of =Scheme= programming language. ;; set racket path (setenv "PATH" (concat (getenv "PATH") - ":" "/Applications/Racket v6.6/bin")) + ":" "/Applications/Racket v6.10.1/bin")) (setenv "MANPATH" (concat (getenv "MANPATH") - ":" "/Applications/Racket v6.6/man")) - (setq exec-path (append exec-path '("/Applications/Racket v6.6/bin"))) + ":" "/Applications/Racket v6.10.1/man")) + (setq exec-path (append exec-path '("/Applications/Racket v6.10.1/bin"))) (add-to-list 'auto-mode-alist '("\\.rkt\\'" . racket-mode)) #+END_SRC - * Compile Set the environments vairables in compilation mode #+BEGIN_SRC emacs-lisp :tangle yes :results silent @@ -2387,15 +2723,35 @@ Set the environments vairables in compilation mode (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)) + (setq compilation-scroll-output 'first-error) + ;; this will save all the modified buffers before compile + (setq compilation-ask-about-save nil) + (setq compilation-window-height (/ (window-total-height) 3))) ;; 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 "q") (lambda () (interactive) (quit-window t))) (define-key compilation-mode-map (kbd "r") #'recompile)) + ;; here note dynamic binding the value of vv, otherwise it will resport error when run the hook. + ;; https://emacs.stackexchange.com/questions/10394/scope-in-lambda + (dolist (vv '( + (cperl-mode-hook . "perl") + (lua-mode-hook . "lua") + (python-mode-hook . "python") + (shell-mode-hook . "sh"))) + (add-hook (car vv) `(lambda () + (unless (or (file-exists-p "makefile") + (file-exists-p "Makefile")) + (set (make-local-variable 'compile-command) + (concat (cdr ',vv) + " " + (if buffer-file-name + (shell-quote-argument buffer-file-name)))))))) + (global-set-key (kbd "s-r") 'compile) #+END_SRC @@ -2545,12 +2901,12 @@ Emacs lisp auto-insert, based on the default module in =autoinsert.el=, but repl ("\\.markdown\\'" . markdown-mode)) :init (setq markdown-command "multimarkdown")) - (add-hook 'gfm-mode-hook (lambda () - (set-face-attribute 'markdown-inline-code-face nil :inherit 'fixed-pitch) - (set-face-attribute 'markdown-pre-face nil :inherit 'fixed-pitch))) - (with-eval-after-load "gfm-mode" - (set-face-attribute 'markdown-inline-code-face nil :inherit 'fixed-pitch) - (set-face-attribute 'markdown-pre-face nil :inherit 'fixed-pitch)) + ;; (add-hook 'gfm-mode-hook (lambda () + ;; (set-face-attribute 'markdown-inline-code-face nil :inherit 'fixed-pitch) + ;; (set-face-attribute 'markdown-pre-face nil :inherit 'fixed-pitch))) + ;; (with-eval-after-load "gfm-mode" + ;; (set-face-attribute 'markdown-inline-code-face nil :inherit 'fixed-pitch) + ;; (set-face-attribute 'markdown-pre-face nil :inherit 'fixed-pitch)) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes :results silent @@ -2558,6 +2914,13 @@ Emacs lisp auto-insert, based on the default module in =autoinsert.el=, but repl :ensure t) #+END_SRC +* Iedit +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package iedit + :ensure t + :init + (global-set-key (kbd "C-;") #'iedit-mode)) +#+END_SRC * Gnus ** Gmail setting Refer [[https://www.emacswiki.org/emacs/GnusGmail][GnusGmail]] @@ -2653,8 +3016,9 @@ Then Run =M-x gnus= ;; (with-eval-after-load 'gnus-summary-mode ;; (define-key gnus-summary-mode-map (kbd "C-o") 'sd/hydra-window/body)) - (add-hook 'gnus-summary-mode-hook (lambda () - (define-key gnus-summary-mode-map (kbd "C-o") nil))) + ;; (add-hook 'gnus-summary-mode-hook (lambda () + ;; (define-key gnus-summary-mode-map (kbd "C-o") nil))) + ;(add-hook 'gnus-summary-mode-hook (apply-partially #'define-key gnus-summary-mode-map (kbd "C-o") nil)) #+END_SRC @@ -2802,7 +3166,7 @@ config from [[http://www.kirang.in/2014/11/13/emacs-as-email-client-with-offline (:mailing-list . 20) (:thread-subject . 70) (:human-date . 16)))) - (warn "seudut:mu4e not installed, it won't work.")) + (message "seudut:mu4e not installed, it won't work.")) #+END_SRC ** Smtp - send mail @@ -2881,76 +3245,7 @@ We can use [[https://www.gnu.org/software/emms/quickstart.html][Emms]] for multi :commands (bing-dict-brief)) #+END_SRC -* 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 (lambda () - (projectile-dired) - (sd/project-switch-action))) - (setq projectile-cache-file (concat sd-temp-directory "projectile.cache")) - :config - (add-to-list 'projectile-globally-ignored-files "GTAGS") - (projectile-global-mode t)) - - ;; change default-directory of scratch buffer to projectile-project-root - (defun sd/project-switch-action () - "Change default-directory of scratch buffer to current projectile-project-root directory" - (interactive) - (dolist (buffer (buffer-list)) - (if (string-match (concat "scratch.*" (projectile-project-name)) - (buffer-name buffer)) - (let ((root (projectile-project-root))) - (with-current-buffer buffer - (cd root)))))) -#+END_SRC - -*** 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 "") 'toggle-frame-fullscreen) - - (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) - - (global-set-key (kbd "s-=") 'text-scale-increase) - (global-set-key (kbd "s--") 'text-scale-decrease) - - ;; (global-set-key (kbd "s-u") 'undo-tree-visualize) -#+END_SRC +* Project operations - =super= ** Windown & Buffer - =C-o= Defind a =hydra= function for windows, buffer & bookmark operations. And map it to =C-o= globally. @@ -3045,6 +3340,38 @@ Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to del (dired-jump))) #+END_SRC +Kill the help window and buffer when quit. +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (with-eval-after-load "help-mode" + (define-key help-mode-map (kbd "q") (lambda () + (interactive) + (quit-window t)))) + + (with-eval-after-load 'man + (set-face-attribute 'Man-overstrike nil :inherit 'bold :foreground "orange red") + (set-face-attribute 'Man-underline nil :inherit 'underline :foreground "forest green") + (define-key Man-mode-map (kbd "q") (lambda () + (interactive) + (Man-kill)))) + + + ;; (advice-add 'man :after (lambda (man-args) (other-window 1))) + (advice-add 'man :after (apply-partially 'other-window 1)) + + + (require 'shell-command-output-mode) + + (defun my/shell-command-after (command &optional output-buffer error-buffer) + (let* ((buffer (get-buffer "*Shell Command Output*")) + (window (get-buffer-window buffer))) + (if buffer (with-current-buffer buffer + (shell-command-output-mode))) + (if window + (select-window window)))) + + (advice-add 'shell-command :after 'my/shell-command-after) +#+END_SRC + ** Motion - =C-M-= [[https://www.masteringemacs.org/article/effective-editing-movement][effective-editing-movement]] @@ -3141,17 +3468,17 @@ Search, replace and hightlight will in later paragraph :config (avy-setup-default)) - (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) + ;; (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) - (global-set-key (kbd "C-M-f") 'avy-goto-word-1-below) - (global-set-key (kbd "C-M-b") 'avy-goto-word-1-above) + ;; (global-set-key (kbd "C-M-f") 'avy-goto-word-1-below) + ;; (global-set-key (kbd "C-M-b") 'avy-goto-word-1-above) ;; (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) + ;; (global-set-key (kbd "C-M-w") 'avy-goto-char-timer) + ;; (global-set-key (kbd "C-M-l") 'avy-goto-char-in-line) ;; ;; will delete above ;; (global-set-key (kbd "M-g j") 'avy-goto-line-below) @@ -3161,6 +3488,9 @@ Search, replace and hightlight will in later paragraph ;; (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) + (global-set-key (kbd "M-g c") 'avy-goto-char) + (global-set-key (kbd "M-g b") 'avy-goto-word-0-above) + (global-set-key (kbd "M-g w") 'avy-goto-word-0-below) #+END_SRC *** =Imenu= goto tag @@ -3373,25 +3703,6 @@ Occur search key bindings (use-package moccur-edit)) #+END_SRC -*** 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 - (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= @@ -3464,7 +3775,21 @@ stolen from [[https://github.com/mariolong/emacs.d/blob/f6a061594ef1b5d1f4750e9d #+END_SRC *** TODO make expand-region hydra work with lispy selected -** =C-w= delete backward word + +* Key Bindings +Here are some global key bindings for basic editting +** Global key bingding +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (global-set-key (kbd "C-h") 'delete-backward-char) + (global-set-key (kbd "s-m") 'man) + (global-set-key (kbd "") 'toggle-frame-fullscreen) + ;; project operation + (global-set-key (kbd "s-p") 'projectile-switch-open-project) + (global-set-key (kbd "s-f") 'projectile-find-file) + (global-set-key (kbd "s-=") 'text-scale-increase) + (global-set-key (kbd "s--") 'text-scale-decrease) +#+END_SRC + Refer [[https://github.com/fnwiya/dotfiles/blob/c9ca79f1b22c919d9f4c3a0f944ba8281255a594/setup/.emacs.d/loader-init/_90-kill-region-or-backward-kill-word.el][kill-region-or-backward-kill-word]] #+BEGIN_SRC emacs-lisp :tangle yes :results silent @@ -3472,15 +3797,39 @@ Refer [[https://github.com/fnwiya/dotfiles/blob/c9ca79f1b22c919d9f4c3a0f944ba828 (global-set-key (kbd "C-w") 'sd/kill-region-or-backward-kill-word) #+END_SRC + +** 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 + * Developing ** perspeen #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package perspeen - :ensure t - :init + ;; (use-package perspeen + ;; :ensure t + ;; :init + ;; (setq perspeen-use-tab nil) + ;; :config + ;; (perspeen-mode)) + + (el-get-bundle seudut/perspeen + :features perspeen (setq perspeen-use-tab nil) - :config - (perspeen-mode)) + ;; (perspeen-mode) + ) ;; super-i to switch to ith workspace @@ -3500,7 +3849,10 @@ Refer [[https://github.com/fnwiya/dotfiles/blob/c9ca79f1b22c919d9f4c3a0f944ba828 (define-key perspeen-mode-map (kbd "s-t") 'perspeen-tab-create-tab) (define-key perspeen-mode-map (kbd "s-t") 'perspeen-tab-create-tab)) #+END_SRC - +* Evil Mode +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (org-babel-load-file "~/.emacs.d/emacs-evil.org") +#+END_SRC * Note ** Check if emacs is in terminal of graphic mode Use =display-graphic-p= instead of =window-system= @@ -3514,3 +3866,10 @@ Use =display-graphic-p= instead of =window-system= blog with modify list draw one line top of the windows +* test +This is a test. +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + ;; test local mode line + ;; (add-to-list 'load-path "~/.emacs.d/elisp") + ;; (require 'my-mode-line) +#+END_SRC