X-Git-Url: http://47.100.26.94:8080/?a=blobdiff_plain;f=emacs.d%2Fconfig.org;h=247fd54ca9aeac19db1182cc74a9c53cd361bf41;hb=20549996811d8734ad35f5c0d473a070c3579db1;hp=d6ae9a5f07fbe06aadae8204ad2819aa30405c07;hpb=30ff0a4dc574ec95a5de5cbd96b2f290a484aff8;p=dotfiles.git diff --git a/emacs.d/config.org b/emacs.d/config.org index d6ae9a5..73dfe4b 100644 --- a/emacs.d/config.org +++ b/emacs.d/config.org @@ -8,29 +8,17 @@ Most config are just copied from [[https://github.com/howardabrams/dot-files][ho * Basic Settings ** Setting loading Path - Set system PATH and emacs exec path - #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (setenv "PATH" (concat (getenv "PATH") ":" "/usr/local/bin" ":" "/Library/TeX/texbin")) (setq exec-path (append exec-path '("/usr/local/bin"))) (setq exec-path (append exec-path '("/Library/TeX/texbin/"))) - -#+END_SRC - -Set the emacs load path - -#+BEGIN_SRC emacs-lisp :tangle yes :results silent - ;; (add-to-list 'load-path "~/.emacs.d/elisp") #+END_SRC ** Package Initialization - #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (require 'package) (setq package-archives '(("mepla" . "http://melpa.milkbox.net/packages/") @@ -38,23 +26,40 @@ Set the emacs load path ("org" . "http://orgmode.org/elpa/"))) (package-initialize) - #+END_SRC +** My constant +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (defconst my-name "Peng Li") + (defconst my-email "seudut@gmail.com") +#+END_SRC + ** General Setting *** 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) + (if (display-graphic-p) + (progn + (scroll-bar-mode 0) + (tool-bar-mode 0) + (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) (show-paren-mode 1) ;; don't backupf (setq make-backup-files nil) + + ;;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))) #+END_SRC *** Custom file @@ -108,8 +113,12 @@ Make a temp directory for all cache/history files (setq auto-save-list-file-prefix (concat sd-temp-directory "auto-save-list/.saves-")) #+END_SRC -* Package Management Tools +*** Max file size +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (setq large-file-warning-threshold nil) +#+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 @@ -137,70 +146,118 @@ Check out [[http://tapoueh.org/emacs/el-get.html][el-get]]. #+END_SRC * Color and Fonts Settings - ** highlight current line - #+BEGIN_SRC emacs-lisp :tangle yes :results silent + ;; (global-hl-line-mode) + ;; don't want high light current line in eshell/term mode + (add-hook 'prog-mode-hook 'hl-line-mode) + (add-hook 'text-mode-hook 'hl-line-mode) + (add-hook 'dired-mode-hook 'hl-line-mode) - (global-hl-line-mode) + ;; only highlight selected window + (setq hl-line-sticky-flag nil) + (setq-default fill-column 120) + (add-hook 'text-mode-hook 'turn-on-auto-fill) #+END_SRC ** Smart Comments - [[https://github.com/paldepind/smart-comment][smart-comments]] - #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package smart-comment :ensure t :bind ("M-;" . smart-conmment)) - #+END_SRC ** Font Setting - -syntax highlighting - +*** syntax highlighting #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (global-font-lock-mode 1) - #+END_SRC -[[https://github.com/i-tu/Hasklig][Hasklig]] and Source Code Pro, defined fonts family - +*** [[https://github.com/i-tu/Hasklig][Hasklig]] and Source Code Pro, defined fonts family #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (if window-system (defvar sd/fixed-font-family (cond ((x-list-fonts "Hasklig") "Hasklig") - ((x-list-fonts "Source Code Pro") "Source Code Pro:weight:light") + ((x-list-fonts "Source Code Pro") "Source Code Pro:weight") ;; 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.")) - #+END_SRC -Setting the fonts - +Setting the fonts alignment issue #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (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 130) + (set-face-attribute 'default nil :font sd/fixed-font-family :height 140) (set-face-font 'default sd/fixed-font-family))) +#+END_SRC + +*** Chinese fonts +Fix the font alignment issue when both Chinese and English hybird in org-mode table. Refer [[http://coldnew.github.io/blog/2013/11-16_d2f3a/][解決 org-mode 表格內中英文對齊的問題]] +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (defvar emacs-english-font "Source Code Pro" "The font name of English.") + + (defvar emacs-cjk-font "STHeiti" "The font name for CJK.") + + (defvar emacs-font-size-pair '(13 . 16) "Default font size pair for (english . chinese)") + + (defvar emacs-font-size-pair-list + '(( 5 . 6) (10 . 12) + (11 . 14) (12 . 14) + (13 . 16) (14 . 16) (15 . 18) (16 . 20) (17 . 20) + (18 . 22) (19 . 22) (20 . 24) (21 . 26) + (24 . 28) (26 . 32) (28 . 34) + (30 . 36) (34 . 40) (36 . 44)) + "This list is used to store matching (englis . chinese) font-size.") + + (defun font-exist-p (fontname) + "Test if this font is exist or not." + (if (or (not fontname) (string= fontname "")) + nil + (if (not (x-list-fonts fontname)) nil t))) + + (defun set-font (english chinese size-pair) + "Setup emacs English and Chinese font on x window-system." + (if (font-exist-p english) + (set-frame-font (format "%s:pixelsize=%d" english (car size-pair)) t)) + (if (font-exist-p chinese) + (dolist (charset '(han cjk-misc) ;; '(kana han symbol cjk-misc bopomofo) + ) + (set-fontset-font (frame-parameter nil 'font) charset + (font-spec :family chinese :size (cdr size-pair)))))) + + (defun emacs-step-font-size (step) + "Increase/Decrease emacs's font size." + (let ((scale-steps emacs-font-size-pair-list)) + (if (< step 0) (setq scale-steps (reverse scale-steps))) + (setq emacs-font-size-pair + (or (cadr (member emacs-font-size-pair scale-steps)) + emacs-font-size-pair)) + (when emacs-font-size-pair + (message "emacs font size set to %.1f" (car emacs-font-size-pair)) + (set-font emacs-english-font emacs-cjk-font emacs-font-size-pair)))) + + (defun increase-emacs-font-size () + "Decrease emacs's font-size acording emacs-font-size-pair-list." + (interactive) (emacs-step-font-size 1)) + (defun decrease-emacs-font-size () + "Increase emacs's font-size acording emacs-font-size-pair-list." + (interactive) (emacs-step-font-size -1)) #+END_SRC + ** Color Theme Loading theme should be after all required loaded, refere [[https://github.com/jwiegley/use-package][:defer]] in =use-package= #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (setq vc-follow-symlinks t) + (use-package molokai-theme + :ensure t) (use-package color-theme :ensure t @@ -209,7 +266,9 @@ Loading theme should be after all required loaded, refere [[https://github.com/j :ensure t :no-require t :config - (load-theme 'sanityinc-tomorrow-bright t))) + ;; (load-theme 'sanityinc-tomorrow-bright t) + (load-theme 'molokai t) + )) ;(eval-after-load 'color-theme ; (load-theme 'sanityinc-tomorrow-bright t)) @@ -302,6 +361,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 @@ -314,14 +378,13 @@ improve color for org-mode #+END_SRC ** page-break-lines - #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package page-break-lines :ensure t :config - (turn-on-page-break-lines-mode)) - + (global-page-break-lines-mode) + ;; (turn-on-page-break-lines-mode) + ) #+END_SRC ** rainbow-mode @@ -337,16 +400,18 @@ Enable rainbow mode in emacs lisp mode #+END_SRC -* Mode-line +** cusor color +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (if (display-graphic-p) + (set-cursor-color 'red)) +#+END_SRC +* Mode-line ** clean mode line - -clean mode line, Refer to [[https://www.masteringemacs.org/article/hiding-replacing-modeline-strings][Marstering Emacs]] - +clean mode line, Refer to [[https://www.masteringemacs.org/article/hiding-replacing-modeline-strings][Marstering Emacs]], some greek character see [[http://xahlee.info/math/math_unicode_greek.html][math_unicode_greek]] #+BEGIN_SRC emacs-lisp :tangle yes :results silent (defvar mode-line-cleaner-alist `((auto-complete-mode . " α") - (yas/minor-mode . " υ") (paredit-mode . " π") (eldoc-mode . "") (abbrev-mode . "") @@ -365,12 +430,20 @@ clean mode line, Refer to [[https://www.masteringemacs.org/article/hiding-replac (org-indent-mode . "") ;; default is Fly (flyspell-mode . "") + (irony-mode . "") + (page-break-lines-mode . "") + (yas-minor-mode . "y") + ;; default jj + (evil-escape-mode . "") ;; Major modes (lisp-interaction-mode . "λ") (hi-lock-mode . "") (python-mode . "Py") (emacs-lisp-mode . "EL") - (eshell-mode . "ε") + (eshell-mode . "𝞔") + (dired-mode . "𝞓") + (ibuffer-mode . "𝞑") + (org-mode . "𝞞") (nxhtml-mode . "nx")) "Alist for `clean-mode-line'. @@ -396,9 +469,7 @@ clean mode line, Refer to [[https://www.masteringemacs.org/article/hiding-replac #+END_SRC ** Powerline mode - Install powerline mode [[https://github.com/milkypostman/powerline][powerline]] - #+BEGIN_SRC emacs-lisp :tangle yes :results silent (use-package powerline :ensure t @@ -451,7 +522,8 @@ Revised powerline-center-theme '("%e" (:eval (let* ((active (powerline-selected-window-active)) - (mode-line-buffer-id (if active 'sd/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-buffer-id (if active 'sd/mode-line-buffer-id 'powerline-inactive1)) (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)) @@ -486,6 +558,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) @@ -510,13 +583,17 @@ Fix the issue in mode line when showing triangle 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) + (defconst sd/mode-line-font-heigh 100 + "Defaulet the fontsize on mode line.") + + (with-eval-after-load "powerline" + (when (display-graphic-p) + (set-face-attribute 'mode-line-inactive nil :height sd/mode-line-font-heigh) + (set-face-attribute 'mode-line nil :height sd/mode-line-font-heigh) + (let* ((base-font-size (face-attribute 'default :height))) + ;; 100/140;0.8 + (set-variable 'powerline-height (/ base-font-size 10)) + (set-variable 'powerline-text-scale-factor (/ (float sd/mode-line-font-heigh) base-font-size))))) #+END_SRC * IDO & SMEX @@ -524,7 +601,7 @@ set height in mode line #+BEGIN_SRC emacs-lisp :tangle yes :results silent (use-package ido :ensure t - :init (setq ido-enable-flex-matching t + :init (setq ido-enable-flex-matching nil ido-ignore-extensions t ido-use-virtual-buffers t ido-everywhere t) @@ -532,7 +609,23 @@ set height in mode line :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) + + ;; (dolist (map (list + ;; ido-buffer-completion-map + ;; ido-file-completion-map + ;; ido-file-dir-completion-map + ;; ido-common-completion-map)) + ;; (define-key map (kbd "C-w") #'ido-delete-backward-word-updir) + ;; ;; (define-key map (kbd "C-i") #'ido-copy-current-file-name) + ;; ) + ) (icomplete-mode t) #+END_SRC @@ -541,9 +634,9 @@ 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 t + :init (setq ido-enable-flex-matching nil ido-use-faces nil) - :config (flx-ido-mode 1)) + :config (flx-ido-mode nil)) #+END_SRC ** IDO-vertically @@ -586,8 +679,8 @@ Use [[https://github.com/DarwinAwardWinner/ido-ubiquitous][ido-ubiquitous]] for (use-package ido-exit-target :ensure t :init - (mapcar (lambda (map) - (define-key map (kbd "C-j") #'ido-exit-target-split-window-right) + (mapcar #'(lambda (map) + (define-key map (kbd "C-j") #'ido-exit-target-other-window) (define-key map (kbd "C-k") #'ido-exit-target-split-window-below)) (list ido-buffer-completion-map ;; ido-common-completion-map @@ -607,28 +700,6 @@ Use [[https://github.com/DarwinAwardWinner/ido-ubiquitous][ido-ubiquitous]] for ;; (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)) - - - - ;; (global-set-key "\C-s" 'swiper) - ;; (global-set-key (kbd "") 'ivy-resume) - ;; ;; (global-set-key (kbd "C-x C-f") 'counsel-find-file) - ;; (global-set-key (kbd " l") 'counsel-load-library) - ;; (global-set-key (kbd " i") 'counsel-info-lookup-symbol) - ;; (global-set-key (kbd " 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 @@ -639,11 +710,8 @@ let helm windows split inside current window #+END_SRC * Org-mode Settings - ** Org-mode Basic setting - 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 @@ -654,86 +722,136 @@ Always indents header, and hide header leading starts so that no need type =#+ST (setq org-src-tab-acts-natively t) (setq org-confirm-babel-evaluate nil) (setq org-use-speed-commands t) - (setq org-completion-use-ido t)) - - (org-babel-do-load-languages - 'org-babel-load-languages - '((python . t) - (C . t) - (perl . t) - (calc . t) - (latex . t) - (java . t) - (ruby . t) - (lisp . t) - (scheme . t) - (sh . t) - (sqlite . t) - (js . t) - (gnuplot . t) - (ditaa . t))) + (setq org-completion-use-ido t) + (setq org-startup-with-inline-images t) + ;; latex preview + ;; (setq org-startup-with-latex-preview t) + ;; (setq org-format-latex-options (plist-put org-format-latex-options :scale 1.2)) + (require 'org-habit) + (add-to-list 'org-modules 'org-habit) + (setq org-habit-graph-column 50) + (setq org-hide-emphasis-markers t) + (setq org-html-validation-link nil) + ;; open link when return clicked + (setq org-return-follows-link t) + ;; open the ppt file by external open instead of emacs + (add-to-list 'org-file-apps '("\\.pptx" . "open %s")) + (add-to-list 'org-file-apps '("\\.doc" . "open %s")) + (setq org-image-actual-width nil)) +#+END_SRC + + +** Org babel +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (el-get-bundle hasu/emacs-ob-racket + :features ob-racket) + + ;; Lua support + ;(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) - ;; 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)) + (message "seudut: ditaa.jar not found at %s " org-ditaa-jar-path)) + + (org-babel-do-load-languages 'org-babel-load-languages + '((python . t) + (C . t) + (perl . t) + (calc . t) + (latex . t) + (java . t) + (ruby . t) + ; (lua . t) + (lisp . t) + (scheme . t) + (racket . t) + (sh . t) + (sqlite . t) + (js . t) + (gnuplot . t) + (ditaa . t) + (plantuml . t))) + + + ;; toggle image preview + (add-hook 'org-babel-after-execute-hook 'sd/display-inline-images 'append) + + (defun sd/display-inline-images () + (condition-case nil + (org-display-inline-images) + (error nil))) + + ;; ditaa artist mode + (with-eval-after-load "artist" + (define-key artist-mode-map [down-mouse-3] 'artist-mouse-choose-operation)) +#+END_SRC +*** plantUML +[[http://eschulte.github.io/babel-dev/DONE-integrate-plantuml-support.html][DONE-integrate-plantuml-support]] +#+BEGIN_SRC sh + ## support plantuml + brew install plantuml #+END_SRC -** Org-bullets +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package plantuml-mode + :ensure t) -use [[https://github.com/sabof/org-bullets][org-bullets]] package to show utf-8 charactes + (setq org-plantuml-jar-path + (expand-file-name "/usr/local/Cellar/plantuml/8041/plantuml.8041.jar")) + + (set-variable 'plantuml-jar-path + (expand-file-name "/usr/local/Cellar/plantuml/8041/plantuml.8041.jar")) +#+END_SRC +** Org-bullets +use [[https://github.com/sabof/org-bullets][org-bullets]] package to show utf-8 charactes #+BEGIN_SRC emacs-lisp :tangle yes :results silent (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 '("⦿" "✪" "◉" "○" "►" "◆")) ;; increase font size when enter org-src-mode - (add-hook 'org-src-mode-hook (lambda () (text-scale-increase 2))) + ;; (add-hook 'org-src-mode-hook (lambda () (text-scale-increase 2))) + + ;; define a face for org-bullets + (defface org-bullet-face + '((t (:foreground "green yellow"))) + "Face used for the org-bullets.") + (setq org-bullets-face-name (quote org-bullet-face)) + (set-face-attribute 'org-bullet-face t :foreground "burlywood" :weight 'normal :height 1.6) #+END_SRC ** Worf Mode - [[https://github.com/abo-abo/worf][worf]] mode is an extension of vi-like binding for org-mode. In =worf-mode=, it is mapping =[=, =]= as =worf-backward= and =worf-forward= in global, wich cause we cannot input =[= and =]=, so here I unset this mappings. And redifined this two to =M-[= and =M-]=. see this [[https://github.com/abo-abo/worf/issues/19#issuecomment-223756599][issue]] - #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package worf :ensure t :commands worf-mode - :init (add-hook 'org-mode-hook 'worf-mode) - ;; :config - ;; (define-key worf-mode-map "[" nil) - ;; (define-key worf-mode-map "]" nil) - ;; (define-key worf-mode-map (kbd "M-[") 'worf-backward) - ;; (define-key worf-mode-map (kbd "M-]") 'worf-forward) - ) - + :init + (require 'ivy) + (add-hook 'org-mode-hook 'worf-mode)) #+END_SRC ** Get Things Done - Refer to [[http://doc.norang.ca/org-mode.html][Organize Your Life in Plain Text]] *** basic setup - standard key binding - #+BEGIN_SRC emacs-lisp :tangle yes :results silent (global-set-key "\C-cl" 'org-store-link) (global-set-key "\C-ca" 'org-agenda) @@ -741,9 +859,7 @@ standard key binding #+END_SRC *** Plain List - Replace the list bullet =-=, =+=, with =•=, a litter change based [[https://github.com/howardabrams/dot-files/blob/master/emacs-org.org][here]] - #+BEGIN_SRC emacs-lisp :tangle yes :results silent ;; (use-package org-mode ;; :init @@ -753,12 +869,9 @@ Replace the list bullet =-=, =+=, with =•=, a litter change based [[https://g #+END_SRC *** Todo Keywords - refer to [[http://coldnew.github.io/coldnew-emacs/#orgheadline94][fancy todo states]], - To track TODO state changes, the =!= is to insert a timetamp, =@= is to insert a note with timestamp for the state change. - #+BEGIN_SRC emacs-lisp :tangle yes :results silent ;; (setq org-todo-keywords ;; '((sequence "☛ TODO(t)" "|" "✔ DONE(d)") @@ -887,13 +1000,12 @@ All captured file which need next actions are stored in =refile.org=, *** Agenda Setup Setting agenda files and the agenda view #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (setq org-agenda-files (quote ("~/org/gtd.org" - "~/org/work.org"))) + (setq org-agenda-files (quote ("~/org/gtd.org"))) ;; only show today's tasks in agenda view - (setq org-agenda-span 'day) + ;; (setq org-agenda-span 'day) ;; Use current windows for agenda view - (setq org-agenda-window-setup 'current-window) + ;; (setq org-agenda-window-setup 'current-window) ;; show all feature entries for repeating tasks, ;; this is already setting by default @@ -903,9 +1015,23 @@ Setting agenda files and the agenda view (setq org-agenda-show-all-dates t) #+END_SRC +** Org mobile +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (with-eval-after-load "org" + (require 'org-mobile) + ;; Set to the location of your Org files on your local system + ;; (setq org-directory "~/org") + ;; Set to the name of the file where new notes will be stored + (setq org-mobile-inbox-for-pull "~/org/flagged.org") + ;; Set to /MobileOrg. + (setq org-mobile-directory "~/Dropbox/Apps/MobileOrg")) +#+END_SRC + ** Export PDF Install MacTex-basic [[http://www.tug.org/mactex/morepackages.html][MacTex-basic]] and some tex packages #+BEGIN_SRC sh + wget http://tug.org/cgi-bin/mactex-download/BasicTeX.pkg + 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 @@ -986,21 +1112,133 @@ Install MacTex-basic [[http://www.tug.org/mactex/morepackages.html][MacTex-basic #+END_SRC -** others +** Export Html +Color higlight the source code block in exported html, [[http://stackoverflow.com/questions/24082430/org-mode-no-syntax-highlighting-in-exported-html-page][org-mode-no-syntax-highlighting-in-exported-html-page]] +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package htmlize + :ensure t) +#+END_SRC +** Org structure template extend org-mode's easy templates, refer to [[http://coldnew.github.io/coldnew-emacs/#orgheadline94][Extend org-modes' esay templates]] - #+BEGIN_SRC emacs-lisp :tangle yes :results silent + ;; ‘s’ ‘#+BEGIN_SRC ... #+END_SRC’ + ;; ‘e’ ‘#+BEGIN_EXAMPLE ... #+END_EXAMPLE’ + ;; ‘q’ ‘#+BEGIN_QUOTE ... #+END_QUOTE’ + ;; ‘v’ ‘#+BEGIN_VERSE ... #+END_VERSE’ + ;; ‘c’ ‘#+BEGIN_CENTER ... #+END_CENTER’ + ;; ‘l’ ‘#+BEGIN_LaTeX ... #+END_LaTeX’ + ;; ‘L’ ‘#+LaTeX:’ + ;; ‘h’ ‘#+BEGIN_HTML ... #+END_HTML’ + ;; ‘H’ ‘#+HTML:’ + ;; ‘a’ ‘#+BEGIN_ASCII ... #+END_ASCII’ + ;; ‘A’ ‘#+ASCII:’ + ;; ‘i’ ‘#+INDEX:’ line + ;; ‘I’ ‘#+INCLUDE:’ line + (add-to-list 'org-structure-template-alist '("E" "#+BEGIN_SRC emacs-lisp :tangle yes :results silent\n?\n#+END_SRC")) (add-to-list 'org-structure-template-alist - '("S" "#+BEGIN_SRC sh\n?\n#+END_SRC")) + '("R" "#+BEGIN_SRC racket :tangle no :results output replace\n?\n#+END_SRC")) + (add-to-list 'org-structure-template-alist + '("S" "#+BEGIN_SRC sh :results output replace\n?\n#+END_SRC")) (add-to-list 'org-structure-template-alist '("p" "#+BEGIN_SRC plantuml :file uml.png \n?\n#+END_SRC")) + (add-to-list 'org-structure-template-alist + '("P" "#+BEGIN_SRC perl \n?\n#+END_SRC")) + (add-to-list 'org-structure-template-alist + '("f" "#+BEGIN_SRC fundamental :tangle ?\n\n#+END_SRC")) + (add-to-list 'org-structure-template-alist + '("C" "#+BEGIN_SRC c :tangle ?\n\n#+END_SRC")) + (add-to-list 'org-structure-template-alist + '("m" "\\begin{equation}\n?\n\\end{equation}")) + (add-to-list 'org-structure-template-alist + '("b" "#+STARTUP: showall + ,#+STARTUP: inlineimages + ,#+OPTIONS: toc:nil\n")) + (add-to-list 'org-structure-template-alist + '("d" "#+BEGIN_SRC ditaa :file ? :cmdline -r -s 0.8 :cache yes \n\n#+END_SRC")) + (add-to-list 'org-structure-template-alist + '("u" "#+BEGIN_SRC plantuml :file ? \n\n#+END_SRC")) #+END_SRC +** Org theme +*** 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")) + + (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) + ;; 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)) + + ;; 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))) +#+END_SRC + +Also correct the face of =org-meta-line= in =org-table= +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (with-eval-after-load "org" + (set-face-attribute 'org-meta-line nil :font "Source Code Pro" :height 120 :slant 'italic :inherit 'font-lock-comment-face)) +#+END_SRC + +*** 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))) +#+END_SRC + +** Org Blog +Fetch dependencies file, which is not in this repository. +#+BEGIN_SRC perl :results silent :tangle yes + print `curl https://raw.githubusercontent.com/seudut/blog/master/my-publish.el -o ./elisp/my-publish.el`; +#+END_SRC + +Load +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (add-to-list 'load-path "~/.emacs.d/elisp") + + (when (file-exists-p "~/.emacs.d/elisp/my-publish.el") + (require 'my-publish) + (blog-setup-project-alist "~/Private/blog/")) +#+END_SRC + + +Refer to [[http://orgmode.org/worg/org-tutorials/org-publish-html-tutorial.html][org-publish-html-tutorial]], and [[https://ogbe.net/blog/blogging_with_org.html][blogging_with_org]] + * 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]] @@ -1011,7 +1249,7 @@ and Defined keys, using vi keybindings, Refer abo-abo's setting [[https://github ;; 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) + (setq git-commit-summary-max-length 100) :commands magit-status magit-blame :config (dolist (map (list magit-status-mode-map @@ -1025,7 +1263,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 @@ -1044,15 +1284,13 @@ set default eshell history folder ** 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))) + (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-hook (apply-partially #'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))) #+END_SRC ** Toggle Eshell @@ -1069,7 +1307,7 @@ Toggle an eshell in split window below, refer [[http://www.howardism.org/Technic nil nil) ret)) - (defun sd/toggle-eshell-here () + (defun sd/toggle-project-eshell () "Toggle a eshell buffer vertically" (interactive) (if (sd/window-has-eshell) @@ -1080,25 +1318,26 @@ Toggle an eshell in split window below, refer [[http://www.howardism.org/Technic (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))))) - - ;; (global-unset-key (kbd "M-`")) - (global-set-key (kbd "s-e") 'sd/toggle-eshell-here) -#+END_SRC - -** TODO smart display -* Misc Settings + (split-window-vertically (- (/ (window-total-height) 3))) + (other-window 1) + (if (projectile-project-p) + (projectile-run-eshell) + (eshell))))) + + (global-set-key (kbd "s-e") 'sd/toggle-project-eshell) +#+END_SRC +** exec-path-from-shell +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package exec-path-from-shell + :ensure t + :init + (setq exec-path-from-shell-check-startup-files nil) + :config + (exec-path-from-shell-initialize)) +#+END_SRC + +* Misc Settings ** [[https://github.com/abo-abo/hydra][Hydra]] *** hydra install #+BEGIN_SRC emacs-lisp :tangle yes :results silent @@ -1180,33 +1419,26 @@ Refer [[https://github.com/abo-abo/hydra/blob/master/hydra-examples.el][hydra-ex #+END_SRC ** Line Number - Enable linum mode on programming modes - #+BEGIN_SRC emacs-lisp :tangle yes :results silent (add-hook 'prog-mode-hook 'linum-mode) - ;; (add-hook 'prog-mode-hook (lambda () - ;; (setq-default indicate-empty-lines t))) #+END_SRC Fix the font size of line number - #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (defun fix-linum-size () - (interactive) - (set-face-attribute 'linum nil :height 110)) + (interactive) + (set-face-attribute 'linum nil :height 110)) (add-hook 'linum-mode-hook 'fix-linum-size) - #+END_SRC I like [[https://github.com/coldnew/linum-relative][linum-relative]], just like the =set relativenumber= on =vim= - #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package linum-relative :ensure t + :init + (setq linum-relative-current-symbol "") :config (defun linum-new-mode () "If line numbers aren't displayed, then display them. @@ -1221,102 +1453,73 @@ I like [[https://github.com/coldnew/linum-relative][linum-relative]], just like ;; auto enable linum-new-mode in programming modes (add-hook 'prog-mode-hook 'linum-relative-mode) - #+END_SRC ** Save File Position - #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (require 'saveplace) + (setq 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]\\|\\(?:[^@/:]*@\\)?[^@/:]*[^@/:.]:\\)") - #+END_SRC ** Multi-term - +define =multi-term= mapping to disable some mapping which is used globally. #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package multi-term :ensure t) + (defun sd/term-mode-mapping () + (mapcar #'(lambda (map) + (define-key map (kbd "C-o") nil) + (define-key map (kbd "C-g") nil)) + (list term-mode-map + term-raw-map))) + + (with-eval-after-load 'multi-term + (sd/term-mode-mapping)) #+END_SRC ** ace-link - [[https://github.com/abo-abo/ace-link][ace-link]] is a package written by [[https://github.com/abo-abo][Oleh Krehel]]. It is convenient to jump to link in help mode, info-mode, etc Type =o= to go to the link - #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package ace-link :ensure t :init (ace-link-setup-default)) - #+END_SRC ** Smart Parens - #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package smartparens :ensure t :config (progn (require 'smartparens-config) (add-hook 'prog-mode-hook 'smartparens-mode))) - #+END_SRC ** Ace-Windows - [[https://github.com/abo-abo/ace-window][ace-window]] - #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package ace-window :ensure t :defer t - ; :init - ; (global-set-key (kbd "M-o") 'ace-window) + ; :init + ; (global-set-key (kbd "M-o") 'ace-window) :config (setq aw-keys '(?a ?s ?d ?f ?j ?k ?l))) - #+END_SRC ** Which key - [[https://github.com/justbur/emacs-which-key][which-key]] show the key bindings - -#+BEGIN_SRC emacs-lisp :tangle yes :results silent - - (use-package which-key - :ensure t - :config - (which-key-mode)) - -#+END_SRC - -** Tabbar - #+BEGIN_SRC emacs-lisp :tangle yes :results silent - - ;; (use-package tabbar-ruler + ;; (use-package which-key ;; :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)) - + ;; (which-key-mode)) #+END_SRC ** View only for some directory @@ -1328,15 +1531,39 @@ When see function by =C-h f=, and visit the source code, I would like the buffer (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))))))) + ;; (eval . (when buffer-file-name + ;; (setq-local view-no-disable-on-exit t) + ;; (view-mode-enter))) + )))) ;; (dir-locals-set-directory-class (expand-file-name "/usr/local/share/emacs") 'emacs) (dir-locals-set-directory-class "/usr/local/Cellar/emacs" 'emacs) ;; (dir-locals-set-directory-class "~/.emacs.d/elpa" 'emacs) (dir-locals-set-directory-class "~/dotfiles/emacs.d/elpa" 'emacs) (dir-locals-set-directory-class "~/dotfiles/emacs.d/el-get" 'emacs) + + ;; temp-mode.el + ;; Temporary minor mode + ;; Main use is to enable it only in specific buffers to achieve the goal of + ;; buffer-specific keymaps + + ;; (defvar sd/temp-mode-map (make-sparse-keymap) + ;; "Keymap while temp-mode is active.") + + ;; ;;;###autoload + ;; (define-minor-mode sd/temp-mode + ;; "A temporary minor mode to be activated only specific to a buffer." + ;; nil + ;; :lighter " Temp" + ;; sd/temp-mode-map) + + ;; (defun sd/temp-hook () + ;; (if sd/temp-mode + ;; (progn + ;; (define-key sd/temp-mode-map (kbd "q") 'quit-window)))) + + ;; (add-hook 'lispy-mode-hook (lambda () + ;; (sd/temp-hook))) #+END_SRC ** Info plus @@ -1350,9 +1577,6 @@ When see function by =C-h f=, and visit the source code, I would like the buffer (require 'info+)) #+END_SRC -** TODO bookmark - -** TODO Calendar ** advice info #+BEGIN_SRC emacs-lisp :tangle yes :results silent (defun sd/info-mode () @@ -1360,11 +1584,7 @@ When see function by =C-h f=, and visit the source code, I would like the buffer (unless (equal major-mode 'Info-mode) (unless (> (length (window-list)) 1) (split-window-right)) - (other-window 1) - ;; (info) - )) - - ;; (global-set-key (kbd "C-h i") 'sd/info-mode) + (other-window 1))) ;; open Info buffer in other window instead of current window (defadvice info (before my-info (&optional file buf) activate) @@ -1374,24 +1594,10 @@ When see function by =C-h f=, and visit the source code, I would like the buffer (sd/delete-current-window)) #+END_SRC -** TODO Man mode -Color for Man-mode - -** TODO UTF8 -#+BEGIN_SRC emacs-lisp :tangle yes :results silent - ;; (set-language-environment "UTF-8") - ;; (set-default-coding-systems 'utf-8) -#+END_SRC - ** Demo It #+BEGIN_SRC emacs-lisp :tangle yes :results silent - ;; (el-get-bundle howardabrams/demo-it) - (use-package org-tree-slide :ensure t) - - ;; (use-package yasnippet - ;; :ensure t) #+END_SRC ** Presentation @@ -1407,61 +1613,202 @@ Color for Man-mode ** pdf-tools #+BEGIN_SRC sh - brew install poppler + #brew install poppler #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (use-package pdf-tools - :ensure t - :init - ;; run to complete the installation - (pdf-tools-install) - :config - (add-to-list 'auto-mode-alist '("\.pdf$" . pdf-view-mode)) - (add-hook 'pdf-outline-buffer-mode-hook #'sd/pdf-outline-map)) + ;(use-package pdf-tools + ; :ensure t + ; :init + ; ;; run to complete the installation + ; (pdf-tools-install) + ; :config + ; (add-to-list 'auto-mode-alist '("\.pdf$" . pdf-view-mode)) + ; (add-hook 'pdf-outline-buffer-mode-hook #'sd/pdf-outline-map)) + + ;(defun sd/pdf-outline-map () + ; "My keybindings in pdf-outline-map" + ; (interactive) + ; (define-key pdf-outline-buffer-mode-map (kbd "C-o") nil) + ; (define-key pdf-outline-buffer-mode-map (kbd "i") 'outline-toggle-children) + ; (define-key pdf-outline-buffer-mode-map (kbd "j") 'next-line) + ; (define-key pdf-outline-buffer-mode-map (kbd "k") 'previous-line)) +#+END_SRC + +** help-mode +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (defun sd/help-mode-hook () + "Mapping for help mode" + (define-key help-mode-map "j" 'next-line) + (define-key help-mode-map "k" 'previous-line) + (define-key help-mode-map "h" 'forward-char) + (define-key help-mode-map "l" 'forward-char) + (define-key help-mode-map "H" 'describe-mode) + (define-key help-mode-map "v" 'recenter-top-bottom) + (define-key help-mode-map "i" 'forward-button) + (define-key help-mode-map "I" 'backward-button) + (define-key help-mode-map "o" 'ace-link-help)) + + (add-hook 'help-mode-hook 'sd/help-mode-hook) +#+END_SRC + +Wiki [[http://stackoverflow.com/questions/3480173/show-keys-in-emacs-keymap-value][show-keys-in-emacs-keymap-value]], Helpplus mode can show keymap as human-readable, use ~describe-keymap~ or =C-h M-k= + +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (el-get-bundle help-macro+ + :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/help-macro+.el" + :features help-macro+) + (el-get-bundle help+ + :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/help+.el" + :features help+) + (el-get-bundle help-fns+ + :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/help-fns+.el" + :features help-fns+) + (el-get-bundle help-mode+ + :url "https://raw.githubusercontent.com/emacsmirror/emacswiki.org/master/help-mode+.el" + :features help-mode+) +#+END_SRC + +** goto-last-change +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package goto-last-change + :ensure t) +#+END_SRC + +** Ag +install =ag=, =the-silver-searcher= by homebrew on mac +#+BEGIN_SRC sh +brew install the-silver-searcher +#+END_SRC + +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package ag + :ensure t) +#+END_SRC + +** Local Variable hooks +[[https://www.emacswiki.org/emacs/LocalVariables][LocalVariables]], use =hack-local-variables-hook=, run a hook to set local variable in mode hook +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + ;; make Emacs run a new "local variables hook" for each major mode + (add-hook 'hack-local-variables-hook 'run-local-vars-mode-hook) + + (defun run-local-vars-mode-hook () + "Run a hook for the major-mode after the local variables have been processed." + (run-hooks (intern (concat (symbol-name major-mode) "-local-vars-hook")))) + + ;; (add-hook 'c++-mode-local-vars-hook #'sd/c++-mode-local-vars) +#+END_SRC + +** Table +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (add-hook 'text-mode-hook 'table-recognize) +#+END_SRC - (defun sd/pdf-outline-map () - "My keybindings in pdf-outline-map" +** url-download +To download file in =elisp=, best is =url-copy-file=, here refer [[http://stackoverflow.com/questions/4448055/download-a-file-with-emacs-lisp][download-a-file-with-emacs-lisp]] using =url-retrieve-synchronously= wrapping +as a http download client tool +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (defun sd/download-file (&optional url download-dir download-name) (interactive) - (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)) + (let ((url (or url + (read-string "Enter download URL: "))) + (download-dir (read-directory-name "Save to (~/Downloads): " "~/Downloads" "~/Downloads" 'confirm' nil))) + (let ((download-buffer (url-retrieve-synchronously url))) + (save-excursion + (set-buffer download-buffer) + ;; we may have to trim the http response + (goto-char (point-min)) + (re-search-forward "^$" nil 'move) + (forward-char) + (delete-region (point-min) (point)) + (write-file (concat (or download-dir + "~/Downloads/") + (or download-name + (car (last (split-string url "/" t)))))))))) #+END_SRC * Dired -** Dired config +** Dired basic +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (setq dired-dwim-target t) + + (use-package dired-details + :ensure t + :config + (setq-default dired-details-hidden-string "--- ") + (dired-details-install)) +#+END_SRC + +** Dired functions +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (defun sd/dired-next-line (count) + "Move to next line, and always focus on the file name." + (interactive "p") + (dired-next-line count) + (dired-move-to-filename)) + + (defun sd/dired-previous-line (count) + "Move to previous line, and always focus on the file name." + (interactive "p") + (dired-previous-line count) + (dired-move-to-filename)) + + (defun sd/dired-up-directory () + "Go to up directory" + (interactive) + (let ((old (current-buffer))) + (dired-up-directory) + (kill-buffer old))) +#+END_SRC +** Dired bindings =C-o= is defined as a global key for window operation, here unset it in dired mode #+BEGIN_SRC emacs-lisp :tangle yes :results silent (defun sd/dired-key-map () "My keybindings for dired" (interactive) - (define-key dired-mode-map (kbd "SPC") 'scroll-up-command) - (define-key dired-mode-map (kbd "S-SPC") 'scroll-down-command) + ;; these two prefix are used globally (define-key dired-mode-map (kbd "C-o") nil) (define-key dired-mode-map (kbd "M-s") nil) - ;; (define-key dired-mode-map (kbd "l") 'dired-isearch-filenames) + ;; 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 "f") 'dired-isearch-filenames) - (define-key dired-mode-map (kbd "DEL") (lambda () (interactive) (find-alternate-file ".."))) + (define-key dired-mode-map (kbd "l") 'dired-display-file) + (define-key dired-mode-map [C-backspace] 'dired-up-directory) (define-key dired-mode-map (kbd "?") 'describe-mode) (define-key dired-mode-map (kbd "z") #'sd/dired-get-size) (define-key dired-mode-map (kbd "C-d") 'dired-kill-subdir) (define-key dired-mode-map (kbd "M-d") 'dired-kill-subdir) (define-key dired-mode-map (kbd "J") 'diredp-next-subdir) + (define-key dired-mode-map (kbd "TAB") 'diredp-next-subdir) (define-key dired-mode-map (kbd "K") 'diredp-prev-subdir) (define-key dired-mode-map (kbd "O") 'dired-display-file) - (define-key dired-mode-map (kbd "I") 'other-window)) + (define-key dired-mode-map (kbd "I") 'other-window) + (define-key dired-mode-map (kbd "o") '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 () @@ -1473,30 +1820,33 @@ Color for Man-mode (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, h-summary, ?-help,")) - - (setq dired-guess-shell-alist-user - '(("\\.pdf\\'" "evince" "okular") - ("\\.\\(?:djvu\\|eps\\)\\'" "evince") - ("\\.\\(?:jpg\\|jpeg\\|png\\|gif\\|xpm\\)\\'" "eog") - ("\\.\\(?:xcf\\)\\'" "gimp") - ("\\.csv\\'" "libreoffice") - ("\\.tex\\'" "pdflatex" "latex") - ("\\.\\(?:mp4\\|mkv\\|avi\\|flv\\|ogv\\)\\(?:\\.part\\)?\\'" - "vlc") - ("\\.\\(?:mp3\\|flac\\)\\'" "rhythmbox") - ("\\.html?\\'" "firefox") - ("\\.cue?\\'" "audacious"))) + "Δ: d-delete, u-ndelete, x-punge, f-ind, o-ther window, R-ename, C-opy, c-create, +new dir, r-evert, /-filter, v-iew, l-ist, z-Size, h-summary, ?-help")) + (defun sd/dired-high-level-dir () + "Go to higher level directory" + (interactive) + (find-alternate-file "..")) #+END_SRC -dired utils #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (defun sd/dired-new-file () + (defun sd/dired-new-file-and-open () "Create a new file in dired mode" (interactive) (call-interactively 'find-file)) + (defun sd/dired-new-file (file) + "Create a new file called FILE. + If FILE already exists, signal an error." + (interactive + (list (read-file-name "Create file: " (dired-current-directory)))) + (let* ((expanded (expand-file-name file))) + (if (file-exists-p expanded) + (error "Cannot create file %s: file exists" expanded)) + (write-region "" nil expanded t) + (when expanded + (dired-add-file expanded) + (dired-move-to-filename)))) + ;; copied from abo-abo's config (defun sd/dired-get-size () (interactive) @@ -1510,13 +1860,15 @@ dired utils (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)) + (let ((read-file-name-function #'read-file-name-default) + (completing-read-function #'completing-read-default)) (if (called-interactively-p 'any) (call-interactively func) (apply func args)))) @@ -1524,40 +1876,93 @@ from [[https://emacs.stackexchange.com/questions/13713/how-to-disable-ido-in-dir (defun mk-disable-ido (command) "Disable IDO when command COMMAND is called." (advice-add command :around #'mk-anti-ido-advice)) + + (defun mk-anti-ido-no-completing-advice (func &rest args) + "Temporarily disable IDO and call function FUNC with arguments ARGS." + (interactive) + (let ((read-file-name-function #'read-file-name-default) + ;; (completing-read-function #'completing-read-default) + ) + (if (called-interactively-p 'any) + (call-interactively func) + (apply func args)))) + + (defun mk-disable-ido-no-completing (command) + "Disable IDO when command COMMAND is called." + (advice-add command :around #'mk-anti-ido-no-completing-advice)) #+END_SRC Disalble =ido= when new a directory or file in =dired= mode #+BEGIN_SRC emacs-lisp :tangle yes :results silent ;; call the function which you want to disable ido (mk-disable-ido 'dired-create-directory) + (mk-disable-ido 'sd/dired-new-file-and-open) (mk-disable-ido 'sd/dired-new-file) + (mk-disable-ido-no-completing 'dired-goto-file) #+END_SRC -** Dired+ +** 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 - (use-package dired+ - :ensure t - :init - (setq diredp-hide-details-initially-flag nil) - :config - (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)) + (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\\|rmvb\\|flv\\|ogv\\)\\(?:\\.part\\)?\\'" "mplayer") + ("\\.\\(?:mp3\\|flac\\)\\'" "rhythmbox") + ("\\.html?\\'" "open") + ("\\.dmg\\'" "open") + ("\\.cue?\\'" "audacious"))) + + + (defun sd/dired-start-process (cmd &optional file-list) + (interactive + (let ((files (dired-get-marked-files + t current-prefix-arg))) + (list + (unless (eq system-type 'windows-nt) + (dired-read-shell-command "& on %s: " + current-prefix-arg files)) + files))) + + (if (eq system-type 'windows-nt) + (dolist (file file-list) + (w32-shell-execute "open" (expand-file-name file))) + (let (list-switch) + (start-process + cmd nil shell-file-name + shell-command-switch + (format + "nohup 1>/dev/null 2>/dev/null %s \"%s\"" + cmd + ;; (if (and (> (length file-list) 1) + ;; (setq list-switch + ;; (cadr (assoc cmd ora-dired-filelist-cmd)))) + ;; (format "%s %s" cmd list-switch) + ;; cmd) + (mapconcat #'expand-file-name file-list "\" \"")))))) #+END_SRC ** dired-hacks #+BEGIN_SRC emacs-lisp :tangle yes :results silent (use-package dired-hacks-utils - :ensure t) - - - (defconst my-dired-media-files-extensions '("mp3" "mp4" "MP3" "MP4" "avi" "mpg" "flv" "ogg" "wmv" "mkv" "mov" "wma") - "Media file extensions that should launch in VLC.") + :ensure t + :defer t) +#+END_SRC - (add-to-list 'dired-guess-shell-alist-user - (list (concat "\\." - (regexp-opt my-dired-media-files-extensions) - "\\'") "mplayer")) +** dired-narrow +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + ;;narrow dired to match filter + (use-package dired-narrow + :ensure t + :commands (dired-narrow) + :bind (:map dired-mode-map + ("/" . dired-narrow))) #+END_SRC * Ibuffer @@ -1569,49 +1974,214 @@ Disalble =ido= when new a directory or file in =dired= mode (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 "g") 'ibuffer-jump-to-buffer) + (define-key ibuffer-mode-map (kbd "h") 'sd/ibuffer-summary)) + + (defun sd/ibuffer-summary () + "Show summary of keybindings in ibuffer mode" + (interactive) + (message + "Β: m|u - (un)mark, /-filter, //-remove filter, t, RET, g, k, S, D, Q; q to quit; h for help")) #+END_SRC * Completion -company mode and company-statistics +** 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) + (setq company-selection-wrap-around t) :config - (global-company-mode)) + (define-key company-active-map (kbd "M-n") nil) + (define-key company-active-map (kbd "M-p") nil) + (define-key company-active-map (kbd "SPC") #'sd/company-stop-input-space) + (define-key company-active-map (kbd "C-n") #'company-select-next) + (define-key company-active-map (kbd "C-p") #'company-select-previous) + ;; 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 :config (company-statistics-mode)) + + (defun sd/company-stop-input-space () + "Stop completing and input a space,a workaround of a semantic issue `https://github.com/company-mode/company-mode/issues/614'" + (interactive) + (company-abort) + (insert " ")) +#+END_SRC + +** YASnippet +*** yasnippet +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package yasnippet + :ensure t + :defer t + :init + (add-hook 'prog-mode-hook #'yas-minor-mode) + :config + (yas-reload-all)) +#+END_SRC + + +** company and yasnippet +Add yasnippet as the company candidates +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + ;Add yasnippet support for all company backends + ;https://github.com/syl20bnr/spacemacs/pull/179 + (defvar company-mode/enable-yas t + "Enable yasnippet for all backends.") + + (defun company-mode/backend-with-yas (backend) + (if (or (not company-mode/enable-yas) (and (listp backend) (member 'company-yasnippet backend))) + backend + (append (if (consp backend) backend (list backend)) + '(:with company-yasnippet)))) + + (setq company-backends (mapcar #'company-mode/backend-with-yas company-backends)) +#+END_SRC + +Refer, [[http://emacs.stackexchange.com/questions/7908/how-to-make-yasnippet-and-company-work-nicer][how-to-make-yasnippet-and-company-work-nicer]] +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (defun check-expansion () + (save-excursion + (if (looking-at "\\_>") t + (backward-char 1) + (if (looking-at "\\.") t + (backward-char 1) + (if (looking-at "->") t nil))))) + + (defun do-yas-expand () + (let ((yas/fallback-behavior 'return-nil)) + (yas/expand))) + + (defun tab-indent-or-complete () + (interactive) + (cond + ((minibufferp) + (minibuffer-complete)) + (t + (indent-for-tab-command) + (if (or (not yas/minor-mode) + (null (do-yas-expand))) + (if (check-expansion) + (progn + (company-manual-begin) + (if (null company-candidates) + (progn + (company-abort) + (indent-for-tab-command))))))))) + + (defun tab-complete-or-next-field () + (interactive) + (if (or (not yas/minor-mode) + (null (do-yas-expand))) + (if company-candidates + (company-complete-selection) + (if (check-expansion) + (progn + (company-manual-begin) + (if (null company-candidates) + (progn + (company-abort) + (yas-next-field)))) + (yas-next-field))))) + + (defun expand-snippet-or-complete-selection () + (interactive) + (if (or (not yas/minor-mode) + (null (do-yas-expand)) + (company-abort)) + (company-complete-selection))) + + (defun abort-company-or-yas () + (interactive) + (if (null company-candidates) + (yas-abort-snippet) + (company-abort))) + + ' + ;; (require 'company) + ;; (require 'yasnippet) + + + ;; (global-set-key [tab] 'tab-indent-or-complete) + ;; (global-set-key (kbd "TAB") 'tab-indent-or-complete) + ;; (global-set-key [(control return)] 'company-complete-common) + + ;; (define-key company-active-map [tab] 'expand-snippet-or-complete-selection) + ;; (define-key company-active-map (kbd "TAB") 'expand-snippet-or-complete-selection) + + ;; (define-key yas-minor-mode-map [tab] nil) + ;; (define-key yas-minor-mode-map (kbd "TAB") nil) + + ;; (define-key yas-keymap [tab] 'tab-complete-or-next-field) + ;; (define-key yas-keymap (kbd "TAB") 'tab-complete-or-next-field) + ;; (define-key yas-keymap [(control tab)] 'yas-next-field) + ;; (define-key yas-keymap (kbd "C-g") 'abort-company-or-yas) +#+END_SRC + +* Libs +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package s + :ensure t) #+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") + + (font-lock-add-keywords 'c-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) +#+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 - (eval-after-load "lispy" - `(progn - (define-key lispy-mode-map (kbd "M-o") nil))) + (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 @@ -1631,9 +2201,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 @@ -1657,40 +2225,222 @@ 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))) +#+END_SRC + +** C & C++ +C/C++ ide tools +1. completion (file name, function name, variable name) +2. template yasnippet (keywords, if, function) +3. tags jump +*** c/c++ style +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (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)) + + ;; objective c + (add-to-list 'auto-mode-alist '("\\.mm\\'" . objc-mode)) + + (setq c-hungry-delete-key t) +#+END_SRC - ;; (font-lock-add-keywords 'Man-mode - ;; '(("\\(NAME\\)" . font-lock-function-name-face))) +*** irony +**** install irony server +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 +#+BEGIN_SRC sh + 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 -*** 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. +**** irony config +irony-mode-hook, copied from [[https://github.com/Sarcasm/irony-mode][irony-mode]] github #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (defun my-perl-hook () - (progn - (setq-local compilation-read-command nil) + (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)) + + ;; replace the `completion-at-point' and `complete-symbol' bindings in + ;; irony-mode's buffers by irony-mode's function + + (defun my-irony-mode-hook () + (define-key irony-mode-map [remap completion-at-point] + 'irony-completion-at-point-async) + (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 '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 + ;; for project see irony + (defun sd/c++-mode-local-vars () + (setq irony--compile-options + '("-std=c++11" + "-stdlib=libc++" + "-I/usr/include/c++/4.2.1"))) +#+END_SRC + +irony-company +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package company-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/") + (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 'flycheck + (add-hook 'flycheck-mode-hook #'flycheck-irony-setup)) +#+END_SRC + +*** flycheck +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package flycheck + :ensure t) +#+END_SRC + +*** gtags +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package ggtags + :ensure t + :config + (define-key ggtags-mode-map (kbd "M-g d") 'ggtags-find-definition) + (define-key ggtags-mode-map (kbd "M-g r") 'ggtags-find-reference) + (define-key ggtags-mode-map (kbd "M-g r") 'ggtags-find-reference) + (define-key ggtags-mode-map (kbd "C-c g s") 'ggtags-find-other-symbol) + (define-key ggtags-mode-map (kbd "C-c g h") 'ggtags-view-tag-history) + (define-key ggtags-mode-map (kbd "C-c g r") 'ggtags-find-reference) + (define-key ggtags-mode-map (kbd "C-c g f") 'ggtags-find-file) + (define-key ggtags-mode-map (kbd "C-c g c") 'ggtags-create-tags) + (define-key ggtags-mode-map (kbd "C-c g u") 'ggtags-update-tags)) + + (add-hook 'c-mode-common-hook + (lambda () + (when (derived-mode-p 'c-mode 'c++-mode 'java-mode) + (ggtags-mode 1)))) + + (require 'cc-mode) + (require 'semantic) + + (global-semanticdb-minor-mode 1) + (global-semantic-idle-scheduler-mode 1) + + (semantic-mode 1) +#+END_SRC + +*** 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)) +#+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 "/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))))) + (concat "g++ -Wall " + current-file-name + " -o " + out-file-name + " && " + out-file-name + )) + (local-set-key (kbd "s-r") 'compile))) - (add-hook 'cperl-mode-hook 'my-perl-hook) + (add-hook 'c-mode-hook 'my-cpp-hook) + (add-hook 'c++-mode-hook 'my-cpp-hook) #+END_SRC -** C & C++ +** Lua #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (setq c-default-style "stroustrup" - c-basic-offset 4) + (use-package lua-mode + :ensure t) +#+END_SRC + +** Scheme +Install =guile=, =guile= is an implementation of =Scheme= programming language. +#+BEGIN_SRC sh + brew install guile +#+END_SRC + +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (setq geiser-scheme-implementation 'guile) +#+END_SRC + +#+BEGIN_SRC scheme + (define a "3") + a +#+END_SRC + +#+RESULTS: +: 3 + +** Racket +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package racket-mode + :ensure t + :config + (define-key racket-mode-map (kbd "s-r") 'racket-run) + (add-to-list 'racket-mode-hook (lambda () (lispy-mode 1)))) + + ;; set racket path + (setenv "PATH" (concat (getenv "PATH") + ":" "/Applications/Racket v6.10.1/bin")) + (setenv "MANPATH" (concat (getenv "MANPATH") + ":" "/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 @@ -1702,14 +2452,36 @@ 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 * Auto-Insert @@ -1722,22 +2494,22 @@ Set the environments vairables in compilation mode ** C++ Auto Insert #+BEGIN_SRC emacs-lisp :tangle yes :results silent (eval-after-load 'autoinsert - '(define-auto-insert '("\\.cpp\\'" . "C++ skeleton") + '(define-auto-insert '("\\.cpp\\|.cc\\'" . "C++ skeleton") '( "Short description:" "/*" "\n * " (file-name-nondirectory (buffer-file-name)) "\n */" > \n \n "#include " \n - "#include \"" + "//#include \"" (file-name-sans-extension (file-name-nondirectory (buffer-file-name))) ".hpp\"" \n \n "using namespace std;" \n \n - "int main ()" + "int main (int argc, char *argv[])" "\n{" \n > _ \n - "return 1;" + "return 0;" "\n}" > \n ))) @@ -1749,16 +2521,21 @@ Set the environments vairables in compilation mode " * " (file-name-nondirectory (buffer-file-name)) "\n" " */" > \n \n "#include " \n - "#include \"" + "//#include \"" (file-name-sans-extension (file-name-nondirectory (buffer-file-name))) ".h\"" \n \n - "int main ()\n" + "int main (int argc, char *argv[])\n" "{" \n > _ \n - "return 1;\n" + "return 0;\n" "}" > \n ))) + + (eval-after-load 'autoinsert + '(define-auto-insert '("\\.h\\|.hpp\\'" . "c/c++ header") + '((s-upcase (s-snake-case (file-name-nondirectory buffer-file-name))) + "#ifndef " str n "#define " str "\n\n" _ "\n\n#endif // " str))) #+END_SRC ** Python template @@ -1831,16 +2608,16 @@ Emacs lisp auto-insert, based on the default module in =autoinsert.el=, but repl ** 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 - > _))) + ;; (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 * Markdown mode @@ -1852,6 +2629,13 @@ Emacs lisp auto-insert, based on the default module in =autoinsert.el=, but repl ("\\.md\\'" . markdown-mode) ("\\.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)) #+END_SRC #+BEGIN_SRC emacs-lisp :tangle yes :results silent @@ -1896,37 +2680,37 @@ 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)))) - - - ;; 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))))) + ;; (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)))) + + + ;; ;; 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 #+BEGIN_SRC emacs-lisp :tangle yes :results silent @@ -1954,8 +2738,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 @@ -1986,43 +2771,137 @@ See [[https://www.emacswiki.org/emacs/GnusWindowLayout][GnusWindowLayout]] ;; (gnus-group-select-group "INBOX"))) #+END_SRC -* 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)) +* Mu4e +Refer [[http://www.kirang.in/2014/11/13/emacs-as-email-client-with-offlineimap-and-mu4e-on-osx][emacs-as-email-client-with-offlineimap-and-mu4e-on-osx]] + +** OfflineImap - download all mails from IMAP into local directory, and keep in sync +#+BEGIN_SRC sh :results output replace + # offline-imap + brew install offline-imap + + cp /usr/local/etc/offlineimap.conf ~/.offlineimapr + + #For the =offlineimap= config on mac, using =sslcacertfile= instead of =cert_fingerpring=. On Mac + sslcacertfile = /usr/local/etc/openssl/cert.pem #+END_SRC -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 +#+BEGIN_SRC conf + [general] + ui=TTYUI + accounts = Gmail + autorefresh = 5 - set title "Putting it All Together" + [Account Gmail] + localrepository = Gmail-Local + remoterepository = Gmail-Remote - set xlabel "X" - set xrange [-8:8] - set xtics -8,2,8 + [Repository Gmail-Local] + type = Maildir + localfolders = ~/.Mail/seudut@gmail.com + [Repository Gmail-Remote] + type = Gmail + remotehost = imap.gmail.com + remoteuser = seudut@gmail.com + remotepass = xxxxxxxx + realdelete = no + ssl = yes + #cert_fingerprint = + sslcacertfile = /usr/local/etc/openssl/cert.pem + maxconnections = 1 + folderfilter = lambda folder: folder not in ['[Gmail]/Trash', + '[Gmail]/Spam', + '[Gmail]/All Mail', + ] +#+END_SRC - set ylabel "Y" - set yrange [-20:70] - set ytics -20,10,70 +Then, run =offlineimap= to sync the mail - f(x) = x**2 - g(x) = x**3 - h(x) = 10*sqrt(abs(x)) +** Mu - fast search, view mails and extract attachments. +#+BEGIN_SRC sh + EMACS=/usr/local/bin/emacs brew install mu --with-emacs +#+END_SRC + +Then, run =mu index --maildir=~/.Mail= - plot f(x) w lp lw 1, g(x) w p lw 2, h(x) w l lw 3 +** Mu4e - Emacs frontend of Mu +config from [[http://www.kirang.in/2014/11/13/emacs-as-email-client-with-offlineimap-and-mu4e-on-osx/][emacs-as-email-client-with-offlineimap-and-mu4e-on-osx]] +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (if (require 'mu4e nil 'noerror) + (progn + (setq mu4e-maildir "~/.Mail") + (setq mu4e-drafts-folder "/[Gmail].Drafts") + (setq mu4e-sent-folder "/[Gmail].Sent Mail") + ;; don't save message to Sent Messages, Gmail/IMAP takes care of this + (setq mu4e-sent-messages-behavior 'delete) + ;; allow for updating mail using 'U' in the main view: + (setq mu4e-get-mail-command "offlineimap") + + ;; shortcuts + (setq mu4e-maildir-shortcuts + '( ("/INBOX" . ?i) + ("/[Gmail].Sent Mail" . ?s))) + + ;; something about ourselves + (setq + user-mail-address "seudut@gmail.com" + user-full-name "Peng Li" + mu4e-compose-signature + (concat + "Thanks,\n" + "Peng\n")) + + ;; show images + (setq mu4e-show-images t) + + ;; use imagemagick, if available + (when (fboundp 'imagemagick-register-types) + (imagemagick-register-types)) + + ;; convert html emails properly + ;; Possible options: + ;; - html2text -utf8 -width 72 + ;; - textutil -stdin -format html -convert txt -stdout + ;; - html2markdown | grep -v ' _place_holder;' (Requires html2text pypi) + ;; - w3m -dump -cols 80 -T text/html + ;; - view in browser (provided below) + (setq mu4e-html2text-command "textutil -stdin -format html -convert txt -stdout") + + ;; spell check + (add-hook 'mu4e-compose-mode-hook + (defun my-do-compose-stuff () + "My settings for message composition." + (set-fill-column 72) + (flyspell-mode))) + + ;; add option to view html message in a browser + ;; `aV` in view to activate + (add-to-list 'mu4e-view-actions + '("ViewInBrowser" . mu4e-action-view-in-browser) t) + + ;; fetch mail every 10 mins + (setq mu4e-update-interval 600) + + ;; mu4e view + (setq-default mu4e-headers-fields '((:flags . 6) + (:from-or-to . 22) + (:mailing-list . 20) + (:thread-subject . 70) + (:human-date . 16)))) + (message "seudut:mu4e not installed, it won't work.")) +#+END_SRC + +** Smtp - send mail +- =gnutls=, depends on =gnutls=, first confirm this is installed, otherwise, =brew install gnutls= +- =~/.authinfo= +#+BEGIN_SRC fundamental + machine smtp.gmail.com login password +#+END_SRC +- OPTIONAL, encrypt the =~/.authinfo= file +#+BEGIN_SRC sh :results output replace + gpg --output ~/.authinfo.gpg --symmetric ~/.authinfo #+END_SRC -#+RESULTS: -[[file:./temp/file.png]] * Ediff #+BEGIN_SRC emacs-lisp :tangle yes :results silent (with-eval-after-load 'ediff @@ -2033,8 +2912,17 @@ Use =gnuplot= on =Org-mode= file, see [[http://orgmode.org/worg/org-contrib/babe (add-hook 'ediff-suspend-hook 'ediff-toggle-wide-display)) #+END_SRC +* Modes +** Yaml-mode +#+BEGIN_SRC emacs-lisp :tangle yes :results silent + (use-package yaml-mode + :ensure t + :init + (add-to-list 'auto-mode-alist '("\\.yml\\'" . yaml-mode))) +#+END_SRC + * Entertainment -** GnoGo +** GnuGo 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 @@ -2081,6 +2969,20 @@ We can use [[https://www.gnu.org/software/emms/quickstart.html][Emms]] for multi * 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) +#+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 + (require 'utilities) + (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 @@ -2105,23 +3007,24 @@ Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g= :ensure t :init (setq projectile-enable-caching t) - (setq projectile-switch-project-action 'projectile-dired) + (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)) - (use-package persp-projectile - :ensure t - :config - (persp-mode) - :bind - (:map projectile-mode-map - ("s-t" . projectile-persp-switch-project))) - - ;; projectile-find-file - ;; projectile-switch-buffer - ;; projectile-find-file-other-window + ;; 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 @@ -2137,70 +3040,16 @@ Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g= (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-`") '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-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) - - - ;; someothers default mapping on super (command) key - ;; s-s save-buffer - ;; s-k kill-this-buffer - - - ;; 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 + - - ;; s-0 --> undefined - ;; s-9 --> undefined - ;; s-8 --> undefined - ;; s-7 --> undefined - ;; s-6 --> undefined - ;; s-- --> center-line - ;; s-= --> undefined - - ;; s-n --> make-frame - ;; s-m --> iconify-frame - ;; s-b --> undefined - ;; s-, --> customize - ;; s-. --> undefined - ;; s-/ --> undefined - - ;; 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= @@ -2209,81 +3058,80 @@ Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to del #+BEGIN_SRC emacs-lisp :tangle yes :results silent (winner-mode 1) - (defun sd/delete-current-window () - (interactive) - (if (> (length (window-list)) 1) - (delete-window) - (message "Only one Windows now!"))) - - (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))) - + (require 'utilities) (defhydra sd/hydra-window (:color red :columns nil) - "Window" - ;; windows split + "C-o" + ;; windows switch ("h" windmove-left nil :exit t) ("j" windmove-down nil :exit t) ("k" windmove-up nil :exit t) ("l" windmove-right nil :exit t) + ("C-o" other-window nil :exit t) + ;; window resize ("H" hydra-move-splitter-left nil) ("J" hydra-move-splitter-down nil) ("K" hydra-move-splitter-up nil) ("L" hydra-move-splitter-right nil) + ;; windows split ("v" (lambda () (interactive) (split-window-right) (windmove-right)) - "vert" :exit t) + nil :exit t) ("x" (lambda () (interactive) (split-window-below) (windmove-down)) - "horz" :exit t) - + nil :exit t) ;; buffer / windows switch - ("o" sd/toggle-max-windows "one" :exit t) - ("C-k" sd/delete-current-window "del" :exit t) - ("D" (lambda () + ("o" sd/toggle-max-windows nil :exit t) + ("C-k" sd/delete-current-window nil :exit t) + ("C-d" (lambda () (interactive) (kill-buffer) (sd/delete-current-window)) - "kill" :exit t) - ("'" other-window "other" :exit t) + nil :exit t) + + ;; ace-window + ;; ("'" other-window "other" :exit t) ;; ("a" ace-window "ace") - ("s" ace-swap-window "swap") + ("s" ace-swap-window nil) + ("D" ace-delete-window nil :exit t) ;; ("i" ace-maximize-window "ace-one" :exit t) - - ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo") - ("r" (progn (winner-redo) (setq this-command 'winner-redo)) "redo") + ;; Windows undo - redo + ("u" (progn (winner-undo) (setq this-command 'winner-undo)) nil) + ("r" (progn (winner-redo) (setq this-command 'winner-redo)) nil) ;; ibuffer, dired, eshell, bookmarks - ;; ("d" ace-delete-window "ace-one" :exit t) - ("C-o" ido-switch-buffer nil :exit t) + ;; ("C-i" other-window nil :exit t) + ("C-b" ido-switch-buffer nil :exit t) + ("C-f" projectile-find-file nil :exit t) + ("C-r" ivy-recentf nil :exit t) + ;; ("C-p" persp-switch nil :exit t) + ;; ("C-t" projectile-persp-switch-project nil :exit t) + + ;; other special buffers ("d" sd/project-or-dired-jump nil :exit t) - ("b" ibuffer nil n:exit t) - ("e" eshell nil :exit t) + ("b" ibuffer nil :exit t) + ("t" multi-term nil :exit t) + ("e" sd/toggle-project-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) + ;; ("p" paradox-list-packages nil :exit t) ;; quit - ("q" nil "cancel") - ("" nil) - ("C-h" nil nil :exit t) - ("C-j" nil nil :exit t) - ;; ("C-k" nil :exit t) - ("C-l" nil nil :exit t) + ("q" nil nil) + ("" nil nil) + ("C-h" windmove-left nil :exit t) + ("C-j" windmove-down nil :exit t) + ("C-k" windmove-up nil :exit t) + ("C-l" windmove-right nil :exit t) ("C-;" nil nil :exit t) ("n" nil nil :exit t) ("[" nil nil :exit t) ("]" nil nil :exit t) - ("f" nil)) + ("f" nil nil)) (global-unset-key (kbd "C-o")) (global-set-key (kbd "C-o") 'sd/hydra-window/body) @@ -2297,6 +3145,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]] @@ -2419,6 +3299,11 @@ Search, replace and hightlight will in later paragraph #+BEGIN_SRC emacs-lisp :tangle yes :results silent (global-set-key (kbd "M-i") #'counsel-imenu) ;; (global-set-key (kbd "M-i") #'imenu) + + ;; define M-[ as C-M-a + ;; http://ergoemacs.org/emacs/emacs_key-translation-map.html + (define-key key-translation-map (kbd "M-[") (kbd "C-M-a")) + (define-key key-translation-map (kbd "M-]") (kbd "C-M-e")) #+END_SRC *** Go-to line @@ -2712,68 +3597,59 @@ stolen from [[https://github.com/mariolong/emacs.d/blob/f6a061594ef1b5d1f4750e9d *** TODO make expand-region hydra work with lispy selected -* 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= - -** write color syntax for =Man-mode= - +* Developing +** perspeen #+BEGIN_SRC emacs-lisp :tangle yes :results silent - (font-lock-add-keywords 'perl-mode '(("\\(|\\w+?\\(,\\w+?\\)?|\\)" 1 'py-builtins-face))) -#+END_SRC - -* TODO jump last change point -* TODO emms mode-line - -* =C-u C-h a= search funtions -=apropos-command= - -* key -- passion -- vision -- mission - -* M prefix -#+BEGIN_SRC emacs-lisp :tangle yes :results silent - - ;; 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 ====== - - ;; M-y - yank - ;; M-u - upcase word - ;; M-i - ====== imenu - ;; M-o ====== prefix - ;; M-p - ;; M-[ ===== - ;; M-] ======== - ;; M-\ deleter horizontal space ===== - - ;; M-n - ;; M-m ---- indent - ;; M-, --- mark stack====== = - ;; M-. lisp-goto-symboo, find definitation - - ;; M-a - ;; M-s ===== - ;; M-d - ;; M-f - ;; M-g - prefix - - ;; 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 + ;; (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) + (perspeen-mode)) + + ;; super-i to switch to ith workspace + + (defmacro sd/define-keys (map key func &rest args) + "A macro to define multi keys " + `(define-key ,map ,key (lambda () (interactive) (,func ,@args)))) + + + (with-eval-after-load "perspeen" + (dotimes (ii 9) + (sd/define-keys perspeen-mode-map (kbd (concat "s-" (number-to-string (+ ii 1)))) + perspeen-goto-ws (+ ii 1))) + (define-key perspeen-mode-map (kbd "s-c") 'perspeen-create-ws) + (define-key perspeen-mode-map (kbd "s-n") 'perspeen-next-ws) + (define-key perspeen-mode-map (kbd "s-p") 'perspeen-previous-ws) + (define-key perspeen-mode-map (kbd "s-'") 'perspeen-last-ws) + (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= +[[info:elisp#Window%20Systems][Window Systems]] +** =Interactive= +** List operation +*** add a element to list +- ~add-to-list~ functions, append +- ~push~ macro +- ~(setcdr (last aa) (list element))~ +blog with modify list + +draw one line top of the windows +* 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 -