add perspeen
[dotfiles.git] / emacs.d / config.org
index 9b8946f..9c1ade4 100644 (file)
@@ -38,7 +38,7 @@ Set system PATH and emacs exec path
       (menu-bar-mode 1)
     (menu-bar-mode 0))
 
-  ;; (setq debug-on-error t)
+  (setq debug-on-error t)
   (setq inhibit-startup-message t)
 
   (defalias 'yes-or-no-p 'y-or-n-p)
@@ -133,17 +133,6 @@ Check out [[http://tapoueh.org/emacs/el-get.html][el-get]].
     :ensure t)
 #+END_SRC
 
-* Mac Specific
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  ;; (defconst *is-a-mac* (eq system-type 'darwin))
-  ;; (setq mouse-wheel-scroll-amount '(1
-  ;;                                   ((shift) . 5)
-  ;;                                   ((control))))
-
-
-  ;; (setq-default indicate-empty-lines t)
-#+END_SRC
-
 * Color and Fonts Settings
 ** highlight current line
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
@@ -267,6 +256,8 @@ Loading theme should be after all required loaded, refere [[https://github.com/j
 
 #+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
@@ -406,7 +397,8 @@ Enable rainbow mode in emacs lisp mode
 
 ** cusor color
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (set-cursor-color 'red)
+  (if (display-graphic-p)
+      (set-cursor-color 'red))
 #+END_SRC
 
 * Mode-line
@@ -523,7 +515,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)) 
@@ -582,15 +575,17 @@ Fix the issue in mode line when showing triangle
 
 set height in mode line
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (defconst sd/mode-line-font-heigh 100
+    "Defaulet the fontsize on mode line.")
+
   (with-eval-after-load "powerline"
-    (if window-system
-        (progn 
-          (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 100) base-font-size)))
-          (set-face-attribute 'mode-line nil :height 100)
-          (set-face-attribute 'mode-line-inactive nil :height 100))))
+    (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
@@ -681,28 +676,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 "<f6>") 'ivy-resume)
-  ;; ;; (global-set-key (kbd "C-x C-f") 'counsel-find-file)
-  ;; (global-set-key (kbd "<f1> l") 'counsel-load-library)
-  ;; (global-set-key (kbd "<f2> i") 'counsel-info-lookup-symbol)
-  ;; (global-set-key (kbd "<f2> u") 'counsel-unicode-char)
-  ;; (global-set-key (kbd "C-c g") 'counsel-git)
-  ;; (global-set-key (kbd "C-c j") 'counsel-git-grep)
-  ;; (global-set-key (kbd "C-c k") 'counsel-ag)
-  ;; (global-set-key (kbd "C-x l") 'counsel-locate)
-  ;; (global-set-key (kbd "C-S-o") 'counsel-rhythmbox)
-
-  ;; (set-face-attribute
-  ;;  'ivy-current-match nil
-  ;;  :background "Orange"
-  ;;  :foreground "black")
-
-  ;; ivy-resume
-  ;; (define-key swiper-map (kbd "M-%") 'swiper-aa-replace)
 #+END_SRC
 
 ** helm
@@ -734,11 +707,38 @@ Always indents header, and hide header leading starts so that no need type =#+ST
     (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))
+    (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 )
+  (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))
+
   (org-babel-do-load-languages 'org-babel-load-languages
                                '((python . t)
                                  (C . t)
@@ -747,7 +747,7 @@ Always indents header, and hide header leading starts so that no need type =#+ST
                                  (latex . t)
                                  (java . t)
                                  (ruby . t)
-                                 (lua . t)
+  ;                               (lua . t)
                                  (lisp . t)
                                  (scheme . t)
                                  (racket . t)
@@ -756,26 +756,21 @@ Always indents header, and hide header leading starts so that no need type =#+ST
                                  (js . t)
                                  (gnuplot . t)
                                  (ditaa . t)
-                                 ))
+                                 (plantuml . t)))
 
-  ;; use current window for org source buffer editting
-  (setq org-src-window-setup 'current-window )
 
-  (define-key org-mode-map (kbd "C-'") nil)
-  ;; C-M-i is mapped to imenu globally
-  (define-key org-mode-map (kbd "C-M-i") nil)
+  ;; toggle image preview 
+  (add-hook 'org-babel-after-execute-hook 'sd/display-inline-images 'append)
 
-  ;; 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))
+  (defun sd/display-inline-images ()
+    (condition-case nil
+        (org-display-inline-images)
+      (error nil)))
 
-  ;; Lua support
-  (use-package ob-lua
-    :ensure t)
+  ;; 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
@@ -808,6 +803,13 @@ use [[https://github.com/sabof/org-bullets][org-bullets]] package to show utf-8
 
   ;; increase font size when enter org-src-mode
   ;; (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
@@ -819,7 +821,9 @@ cause we cannot input =[= and =]=, so here I unset this mappings. And redifined
   (use-package worf
     :ensure t
     :commands worf-mode
-    :init (add-hook 'org-mode-hook 'worf-mode))
+    :init
+    (require 'ivy)
+    (add-hook 'org-mode-hook 'worf-mode))
 #+END_SRC
 
 ** Get Things Done
@@ -1085,6 +1089,21 @@ Color higlight the source code block in exported html, [[http://stackoverflow.co
 ** 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
@@ -1101,11 +1120,15 @@ extend org-mode's easy templates, refer to [[http://coldnew.github.io/coldnew-em
                '("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
@@ -1123,6 +1146,11 @@ extend org-mode's easy templates, refer to [[http://coldnew.github.io/coldnew-em
             (set-face-attribute face nil :inherit 'fixed-pitch))
           (list 'org-code 'org-block 'org-block-background))
     (set-face-attribute 'org-table 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
@@ -1600,6 +1628,23 @@ When see function by =C-h f=, and visit the source code, I would like the buffer
   (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
@@ -1659,20 +1704,25 @@ as a http download client tool
 #+END_SRC
 
 ** Elscreen
+Fix one elscreen issue when startup emacs https://github.com/knu/elscreen/issues/6
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package elscreen
     :ensure t
     :init
     (setq elscreen-tab-display-control nil)
     :config
-    (elscreen-start)
+    ;; (elscreen-start)
     (set-face-attribute 'elscreen-tab-current-screen-face nil :foreground "black" :background "yellow")
     (set-face-attribute 'elscreen-tab-other-screen-face nil :foreground "black" :background "disabledControlTextColor" :underline nil)
     ;; (global-unset-key (kbd)); M-TAB switch screen
-    (global-set-key (kbd "s-`") '(lambda () (interactive) (elscreen-goto 0)))
-    (dotimes (i 8)
-      (global-set-key (kbd (concat "s-" (number-to-string (+ i 1))))
-                      `(lambda () (interactive) (elscreen-goto ,(+ i 1))))))
+    ;; (global-set-key (kbd "s-`") '(lambda () (interactive) (elscreen-goto 0)))
+    ;; (dotimes (i 8)
+    ;;   (global-set-key (kbd (concat "s-" (number-to-string (+ i 1))))
+    ;;                   `(lambda () (interactive) (elscreen-goto ,(+ i 1)))))
+    ;; (global-set-key (kbd "s-t") 'elscreen-create)
+    ;; (global-set-key (kbd "s-n") 'elscreen-next)
+    ;; (global-set-key (kbd "s-p") 'elscreen-previous)
+    )
 #+END_SRC
 
 * Dired
@@ -1745,11 +1795,24 @@ as a http download client tool
 #+END_SRC
 
 #+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)
@@ -1770,7 +1833,8 @@ from [[https://emacs.stackexchange.com/questions/13713/how-to-disable-ido-in-dir
   (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))))
@@ -1778,14 +1842,29 @@ 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 'dired-goto-file)
+  (mk-disable-ido-no-completing 'dired-goto-file)
 #+END_SRC
 
 ** Dired open with
@@ -1882,6 +1961,7 @@ here on Mac, just use "open" commands to pen =.pdf=,  =.html= and image files
     :config
     (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
@@ -1889,12 +1969,18 @@ here on Mac, just use "open" commands to pen =.pdf=,  =.html= and image files
     (define-key company-active-map [tab] #'company-complete-selection)
     (global-company-mode)
     ;; magig-commit is text-modeh
-    (setq company-global-modes '(not org-mode magit-status-mode text-mode eshell-mode)))
+    (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
@@ -2032,11 +2118,15 @@ bindings in =lispy-mode-map= after loaded. see [[http://stackoverflow.com/questi
   (use-package lispy
     :ensure t
     :init
-    (eval-after-load "lispy"
-      `(progn
-         (define-key lispy-mode-map (kbd "M-o") nil)))
+    (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))))
+
+
 #+END_SRC
 
 ** Perl
@@ -2822,8 +2912,9 @@ Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
     :config
     (persp-mode)
     :bind
-    (:map projectile-mode-map
-          ("s-t" . projectile-persp-switch-project)))
+    ;; (:map projectile-mode-map
+    ;;       ("s-t" . projectile-persp-switch-project))
+    )
 
   ;; change default-directory of scratch buffer to projectile-project-root 
   (defun sd/project-switch-action ()
@@ -2850,71 +2941,16 @@ Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
   (global-set-key (kbd "<s-return>") '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-;") 'persp-switch-last)
+  ;; (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=
@@ -2938,7 +2974,7 @@ Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to del
       (delete-other-windows)))
 
   (defhydra sd/hydra-window (:color red :columns nil)
-    "Window"
+    "C-o"
     ;; windows switch
     ("h" windmove-left nil :exit t)
     ("j" windmove-down nil :exit t)
@@ -2955,36 +2991,38 @@ Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to del
            (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)
+    ("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)
+     nil :exit t)
 
     ;; ace-window
     ;; ("'" other-window "other" :exit t)
     ;; ("a" ace-window "ace")
-    ("s" ace-swap-window "swap")
-    ("D" ace-delete-window "ace-one" :exit t)
+    ("s" ace-swap-window nil)
+    ("D" ace-delete-window nil :exit t)
     ;; ("i" ace-maximize-window "ace-one" :exit t)
     ;; Windows undo - redo
-    ("u" (progn (winner-undo) (setq this-command 'winner-undo)) "undo")
-    ("r" (progn (winner-redo) (setq this-command 'winner-redo)) "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
     ;; ("C-i" other-window nil :exit t)
     ("C-b" ido-switch-buffer nil :exit t)
     ("C-f" projectile-find-file nil :exit t)
-    ("C-p" persp-switch :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)
@@ -2997,17 +3035,17 @@ Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to del
     ;; ("p" paradox-list-packages nil :exit t)
 
     ;; quit
-    ("q" nil "cancel")
-    ("<ESC>" nil)
+    ("q" nil nil)
+    ("<ESC>" nil nil)
     ("C-h" windmove-left nil :exit t)
     ("C-j" windmove-down nil :exit t)
-    ("C-k" windmove-up :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)
@@ -3452,7 +3490,25 @@ Refer [[https://github.com/fnwiya/dotfiles/blob/c9ca79f1b22c919d9f4c3a0f944ba828
 
   (global-set-key (kbd "C-w") 'sd/kill-region-or-backward-kill-word)
 #+END_SRC
+* Developing
+** perspeen
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (el-get-bundle seudut/perspeen
+    :features perspeen
+    (setq perspeen-use-tab t)
+    (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))))
+#+END_SRC
 * TODO todolist
 ** Rucket
 ** player video on iphone for 
@@ -3463,3 +3519,16 @@ search music on some music web site
 
 
 ** Need separate the Key-bindings and package-initialization
+* 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