Emacs - config
[dotfiles.git] / emacs.d / config.org
index 976bc82..d71d28b 100644 (file)
@@ -699,6 +699,42 @@ let helm windows split inside current window
     (setq helm-split-window-in-side-p t))
 #+END_SRC
 
+* Projectile
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package projectile
+    :ensure t
+    :init
+    (setq projectile-enable-caching t)
+    (setq projectile-switch-project-action 'projectile-dired)
+    (setq projectile-cache-file (concat sd-temp-directory "projectile.cache"))
+    (setq projectile-completion-system 'ivy)
+    :config
+    (add-to-list 'projectile-globally-ignored-files "GTAGS")
+    (projectile-global-mode t))
+
+  ;; https://emacs.stackexchange.com/questions/16497/how-to-exclude-files-from-projectile
+  (if (executable-find "rg")
+      (progn
+        (defconst modi/rg-arguments
+          `("--line-number"               ; line numbers
+            "--smart-case"
+            "--follow"                    ; follow symlinks
+            "--mmap")                     ; apply memory map optimization when possible
+          "Default rg arguments used in the functions in `projectile' package.")
+
+        (defun modi/advice-projectile-use-rg ()
+          "Always use `rg' for getting a list of all files in the project."
+          (mapconcat 'identity
+                     (append '("\\rg")    ; used unaliased version of `rg': \rg
+                             modi/rg-arguments
+                             '("--null"   ; output null separated results,
+                               "--files")) ; get file names matching the regex '' (all files)
+                     " "))
+
+        (advice-add 'projectile-get-ext-command :override #'modi/advice-projectile-use-rg))
+    (message "rg is not found"))
+#+END_SRC
+
 * Swiper & Ivy & Counsel
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
   (use-package counsel
@@ -717,36 +753,66 @@ let helm windows split inside current window
     (global-set-key (kbd "C-x C-f") 'counsel-find-file)
     (define-key read-expression-map (kbd "C-r") 'counsel-expression-history)
     (global-set-key (kbd "C-c C-r") 'ivy-resume))
-
-  ;; (use-package counsel-projectile
-  ;;   :ensure t
-  ;;   :defer t)
-
-  (add-to-list 'load-path "~/project/counsel-projectile/")
-  (require 'counsel-projectile)
-  (setq counsel-projectile-use-buffer-preselect t)
-  (setq projectile-completion-system 'ivy)
 #+END_SRC
 
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (defun sd/swith-buffer-other-window ()
+  (ivy-set-actions
+   t
+   '(("q" (lambda (x) (ivy-quit-and-run (message "=="))) "exit")))
+
+  (ivy-set-actions
+   'projectile-switch-to-buffer
+   '(("j" ivy--switch-buffer-other-window-action "other window" )))
+
+  (defun sd/projectile-find-file-other-window-action (file)
+    (message "=========")
+    (message (projectile-expand-root file))
+    (find-file-other-window (projectile-expand-root file)))
+
+  (ivy-set-actions
+   'projectile-find-file
+   '(("j" sd/projectile-find-file-other-window-action "other-window")))
+
+  (defun sd/swith-to-buffer ()
+    "switch to buffer"
+    (interactive)
+    (if (projectile-project-p)
+        (projectile-switch-to-buffer)
+      (ivy-switch-buffer)))
+
+  (ivy-set-actions
+   'sd/swith-to-buffer
+   '(("j" ivy--switch-buffer-other-window-action "other window")))
+
+  (defun sd/exit-ivy-and-swith-to-buffer ()
+    "exit ivy complete, and call swith to buffer"
     (interactive)
-    (ivy-set-action (cond ((eq (ivy-state-caller ivy-last) 'ivy-switch-buffer)
-                           'ivy--switch-buffer-other-window-action)
-                          ((eq (ivy-state-caller ivy-last) 'counsel-recentf)
-                           'find-file-other-window)
-                          ((eq (ivy-state-caller ivy-last) 'projectile-find-file)
-                           'projectile-find-file-other-window)
-                          ((eq (ivy-state-caller ivy-last) 'counsel-projectile-find-file)
-                           'counsel-projectile-find-file-action-other-window)
-                          (t
-                           nil)))
-    (ivy-done)
-    (ivy-shrink-after-dispatching))
+    (ivy-quit-and-run
+     (ivy-switch-buffer)))
+
+  (defun my/ivy-read-action (key)
+    (let ((actions (ivy-state-action ivy-last)))
+      (if (null (ivy--actionp actions))
+          t
+        (let* ((action-idx (cl-position-if
+                            (lambda (x) (equal (car x) key))
+                            (cdr actions))))
+          (cond ((member key '("\e" "\a"))
+                 nil)
+                ((null action-idx)
+                 (message "%s is not bound" key)
+                 nil)
+                (t
+                 (message "")
+                 (setcar actions (1+ action-idx))
+                 (ivy-set-action actions)))))))
 
   (with-eval-after-load "ivy"
     (define-key ivy-minibuffer-map (kbd "C-o") 'ivy-dispatching-done)
-    (define-key ivy-minibuffer-map (kbd "C-k") #'sd/swith-buffer-other-window))
+    (define-key ivy-minibuffer-map (kbd "C-k") (lambda () (interactive)
+                                                 (my/ivy-read-action "j")
+                                                 (ivy-done)))
+    (define-key ivy-minibuffer-map (kbd "M-o") #'sd/exit-ivy-and-swith-to-buffer))
 #+END_SRC
 
 stolen from [[https://github.com/mariolong/emacs.d/blob/f6a061594ef1b5d1f4750e9dad9dc97d6e122840/emacs-init.org][here]]
@@ -804,12 +870,12 @@ Always indents header, and hide header leading starts so that no need type =#+ST
     :features ob-racket)
 
   ;; Lua support
-  ;(use-package ob-lua
-  ;  :ensure t)
+;;  (use-package ob-lua
+;;    :ensure t)
 
   ;; use current window for org source buffer editting
 
-  (setq org-src-window-setup 'current-window )
+  ;; (setq org-src-window-setup 'current-window)
   (define-key org-mode-map (kbd "C-'") nil)
   ;; C-M-i is mapped to imenu globally
   (define-key org-mode-map (kbd "C-M-i") nil)
@@ -828,7 +894,7 @@ Always indents header, and hide header leading starts so that no need type =#+ST
                                  (latex . t)
                                  (java . t)
                                  (ruby . t)
-  ;                               (lua . t)
+;                                 (lua . t)
                                  (lisp . t)
                                  (scheme . t)
                                  (racket . t)
@@ -1238,29 +1304,29 @@ extend org-mode's easy templates, refer to [[http://coldnew.github.io/coldnew-em
 
 
   ;; 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))
-  ;;   (set-face-attribute 'org-block-begin-line nil :inherit 'shadow :slant 'italic :foreground nil)
-  ;;   (set-face-attribute 'org-block-end-line nil :inherit 'shadow :slant 'italic :foreground nil)
+  (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 100)
+    (set-face-attribute 'org-formula nil :family "Ubuntu Mono" :height 100)
+    ;; org-special-keyword inherited from font-lock-keywork originally; as org is changed to variable-pitch, it cause
+    ;; the font in special-keywords are not monospace
+    (set-face-attribute 'org-special-keyword nil :inherit '(font-lock-keyword-face fixed-pitch))
+    ;; same as above 
+    (set-face-attribute 'org-verbatim nil :inherit '(shadow fixed-pitch))
+    (set-face-attribute 'org-block-begin-line nil :inherit 'shadow :slant 'italic :foreground nil)
+    (set-face-attribute 'org-block-end-line nil :inherit 'shadow :slant 'italic :foreground nil)
     
-  ;;   ;; fix indent broken by variable-pitch-mode
-  ;;   ;; http://emacs.stackexchange.com/questions/26864/variable-pitch-face-breaking-indentation-in-org-mode
-  ;;   (require 'org-indent)
-  ;;   (set-face-attribute 'org-indent nil :inherit '(org-hide fixed-pitch)))
+    ;; fix indent broken by variable-pitch-mode
+    ;; http://emacs.stackexchange.com/questions/26864/variable-pitch-face-breaking-indentation-in-org-mode
+    (require 'org-indent)
+    (set-face-attribute 'org-indent nil :inherit '(org-hide fixed-pitch)))
 
   ;; (with-eval-after-load "org"
   ;;   (let ((default-font-size (- (face-attribute 'default :height) (if (display-graphic-p) 20 0))))
@@ -1529,7 +1595,13 @@ Refer [[https://github.com/abo-abo/hydra/blob/master/hydra-examples.el][hydra-ex
     ("d" ace-delete-window "Delete"  :exit t)
     ("x" sd/exchange-win-layout "eXchange"  :exit t)
     ("u" winner-undo "window-Undo"  :exit t)
-    ("r" winner-redo "window-Redo"  :exit t))
+    ("r" winner-redo "window-Redo"  :exit t)
+    ("C-h" (lambda () (interactive) (evil-window-increase-width 3)) "<<")
+    ("C-l" (lambda () (interactive) (evil-window-decrease-width 3)) ">>")
+    ("C-k" (lambda () (interactive) (evil-window-increase-height 3)) "^")
+    ("C-j" (lambda () (interactive) (evil-window-decrease-height 3)) "v")
+    ("=" balance-windows "=" :exit t)
+    ("q" nil "quit"))
 
   (defhydra sd/hydra-gtags (:color red :colums nil)
     "ggtags - global"
@@ -1541,10 +1613,8 @@ Refer [[https://github.com/abo-abo/hydra/blob/master/hydra-examples.el][hydra-ex
     "Projectile: "
     ("s" projectile-switch-open-project "Switch" :exit t)
     ("f" projectile-find-file "File" :exit t)
-    ("b" projectile-switch-to-buffer "Buffer" :exit t))
-
-
-
+    ("b" projectile-switch-to-buffer "Buffer" :exit t)
+    ("p" projectile-switch-project "Project" :exit t))
 #+END_SRC
 
 *** hydra launcher
@@ -2404,18 +2474,18 @@ C/C++ ide tools
   ;; (setq c-default-style "stroustrup"
   ;;       c-basic-offset 4)
 
-  ;; "C-M-j" is my global binding for avy goto line below
-  ;; disable it in c mode
-  (mapcar #'(lambda (map)
-             (define-key map (kbd "C-M-j") nil))
-          (list c-mode-map
-                c++-mode-map
-                objc-mode-map))
+  ;; ;; "C-M-j" is my global binding for avy goto line below
+  ;; ;; disable it in c mode
+  ;; (mapcar #'(lambda (map)
+  ;;            (define-key map (kbd "C-M-j") nil))
+  ;;         (list c-mode-map
+  ;;               c++-mode-map
+  ;;               objc-mode-map))
 
   ;; objective c
   (add-to-list 'auto-mode-alist '("\\.mm\\'" . objc-mode))
 
-  (setq c-hungry-delete-key t)
+  (setq-default c-hungry-delete-key t)
 
 
   ;; Looks `c-hanging-braces-alist' doesn't work as expected when  `electric-pair-mode' is enabled.
@@ -2442,7 +2512,6 @@ C/C++ ide tools
 
   ;; (advice-add 'c-electric-brace :after (lambda (arg) "Add new line after insert {}" (newline-and-indent)))
 #+END_SRC
-
 *** irony
 **** install irony server
 Install clang, on mac, it has =libclang.dylib=, but no develop headers. Install by =brew=
@@ -2481,10 +2550,10 @@ irony-mode-hook, copied from [[https://github.com/Sarcasm/irony-mode][irony-mode
     (define-key irony-mode-map [remap complete-symbol]
       'irony-completion-at-point-async))
 
-  (add-hook 'irony-mode-hook 'my-irony-mode-hook)
-  (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
+  ;; (add-hook 'irony-mode-hook 'my-irony-mode-hook)
+  ;; (add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)
 
-  (add-hook 'c++-mode-local-vars-hook #'sd/c++-mode-local-vars)
+  ;; (add-hook 'c++-mode-local-vars-hook #'sd/c++-mode-local-vars)
 
   ;; add C++ completions, because by default c++ file can not complete
   ;; c++ std functions, another method is create .dir-local.el file, for p
@@ -2591,7 +2660,7 @@ irony-company
         (setq out-file-name (shell-quote-argument (concat (file-name-sans-extension buffer-file-name) ".out"))))
       (setq-local compilation-read-command t)
       (set (make-local-variable 'compile-command)
-           (concat "g++ -Wall "
+           (concat "g++ -Wall -std=c++11 "
                    current-file-name
                    " -o "
                    out-file-name
@@ -2845,6 +2914,13 @@ Emacs lisp auto-insert, based on the default module in =autoinsert.el=, but repl
     :ensure t)
 #+END_SRC
 
+* Iedit
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package iedit
+    :ensure t
+    :init
+    (global-set-key (kbd "C-;") #'iedit-mode))
+#+END_SRC
 * Gnus
 ** Gmail setting 
 Refer [[https://www.emacswiki.org/emacs/GnusGmail][GnusGmail]]
@@ -3169,116 +3245,7 @@ We can use [[https://www.gnu.org/software/emms/quickstart.html][Emms]] for multi
     :commands (bing-dict-brief))
 #+END_SRC
 
-* Key Bindings
-Here are some global key bindings for basic editting
-** 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
-  (define-key minibuffer-local-map [escape] 'keyboard-escape-quit)
-  (define-key minibuffer-local-map [escape]  'keyboard-escape-quit)
-  (define-key minibuffer-local-ns-map [escape]  'keyboard-escape-quit)
-  (define-key minibuffer-local-isearch-map [escape]  'keyboard-escape-quit)
-  (define-key minibuffer-local-completion-map [escape]  'keyboard-escape-quit)
-  (define-key minibuffer-local-must-match-map [escape]  'keyboard-escape-quit)
-  (define-key minibuffer-local-must-match-filename-map [escape]  'keyboard-escape-quit)
-  (define-key minibuffer-local-filename-completion-map [escape]  'keyboard-escape-quit)
-  (define-key minibuffer-local-filename-must-match-map [escape]  'keyboard-escape-quit)
-
-  ;; Also map s-h same as C-g
-  (define-key minibuffer-local-map (kbd "s-h") 'keyboard-escape-quit)
-#+END_SRC
-
-** Project operations - =super=
-*** Projectile
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (use-package projectile
-    :ensure t
-    :init
-    (setq projectile-enable-caching t)
-    (setq projectile-switch-project-action (lambda ()
-                                             (projectile-dired)
-                                             (sd/project-switch-action)))
-    (setq projectile-cache-file (concat sd-temp-directory "projectile.cache"))
-    :config
-    (add-to-list 'projectile-globally-ignored-files "GTAGS")
-    (projectile-global-mode t)
-    (global-set-key (kbd "C-M-p") 'projectile-switch-project))
-
-  ;; 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))))))
-
-
-
-  ;; https://emacs.stackexchange.com/questions/16497/how-to-exclude-files-from-projectile
-  ;; (setq projectile-enable-caching t)
-  (if (executable-find "rg")
-      (progn
-        (defconst modi/rg-arguments
-          `("--line-number"               ; line numbers
-            "--smart-case"
-            "--follow"                    ; follow symlinks
-            "--mmap")                     ; apply memory map optimization when possible
-          "Default rg arguments used in the functions in `projectile' package.")
-
-        (defun modi/advice-projectile-use-rg ()
-          "Always use `rg' for getting a list of all files in the project."
-          (mapconcat 'identity
-                     (append '("\\rg")    ; used unaliased version of `rg': \rg
-                             modi/rg-arguments
-                             '("--null"   ; output null separated results,
-                               "--files")) ; get file names matching the regex '' (all files)
-                     " "))
-
-        (advice-add 'projectile-get-ext-command :override #'modi/advice-projectile-use-rg))
-    (message "rg is not found"))
-#+END_SRC
-
-*** project config =super= keybindings
-#+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  ;; (global-set-key (kbd "s-h") 'keyboard-quit)
-  ;; (global-set-key (kbd "s-j") 'ido-switch-buffer)
-  ;; (global-set-key (kbd "s-k") 'ido-find-file)
-  ;; (global-set-key (kbd "s-l") 'sd/delete-current-window)
-  ;; s-l  -->  goto-line
-  ;; (global-set-key (kbd "s-/") 'swiper)
-  ;; s-;  -->
-  ;; s-'  -->  'next-multiframe-window
-  (global-set-key (kbd "<s-return>") 'toggle-frame-fullscreen)
-
-  (global-set-key (kbd "s-f") 'projectile-find-file)
-  ;; (global-set-key (kbd "s-`") 'mode-line-other-buffer)
-
-  ;; (global-set-key (kbd "s-n") 'persp-next)
-  ;; (global-set-key (kbd "s-p") 'persp-prev)
-  ;; (global-set-key (kbd "s-;") 'persp-switch-last)
-
-  (global-set-key (kbd "s-=") 'text-scale-increase)
-  (global-set-key (kbd "s--") 'text-scale-decrease)
-
-  ;; (global-set-key (kbd "s-u") 'undo-tree-visualize)
-#+END_SRC
+* Project operations - =super=
 
 ** Windown & Buffer - =C-o=
 Defind a =hydra= function for windows, buffer & bookmark operations. And map it to =C-o= globally.
@@ -3521,6 +3488,9 @@ Search, replace and hightlight will in later paragraph
   ;; (global-set-key (kbd "M-g e") 'avy-goto-word-0)
   ;; (global-set-key (kbd "M-g f") 'avy-goto-char-timer)
   ;; (global-set-key (kbd "M-g c") 'avy-goto-char-in-line)
+  (global-set-key (kbd "M-g c") 'avy-goto-char)
+  (global-set-key (kbd "M-g b") 'avy-goto-word-0-above)
+  (global-set-key (kbd "M-g w") 'avy-goto-word-0-below)
 #+END_SRC
 
 *** =Imenu= goto tag
@@ -3806,6 +3776,45 @@ Occur search key bindings
 
 *** TODO make expand-region hydra work with lispy selected
 
+* Key Bindings
+Here are some global key bindings for basic editting
+** Global key bingding
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (global-set-key (kbd "C-h") 'delete-backward-char)
+  (global-set-key (kbd "s-m") 'man)
+  (global-set-key (kbd "<s-return>") 'toggle-frame-fullscreen)
+  ;; project operation
+  (global-set-key (kbd "s-p") 'projectile-switch-open-project)
+  (global-set-key (kbd "s-f") 'projectile-find-file)
+  (global-set-key (kbd "s-=") 'text-scale-increase)
+  (global-set-key (kbd "s--") 'text-scale-decrease)
+#+END_SRC
+
+Refer [[https://github.com/fnwiya/dotfiles/blob/c9ca79f1b22c919d9f4c3a0f944ba8281255a594/setup/.emacs.d/loader-init/_90-kill-region-or-backward-kill-word.el][kill-region-or-backward-kill-word]]
+
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (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
+  (define-key minibuffer-local-map [escape] 'keyboard-escape-quit)
+  (define-key minibuffer-local-map [escape]  'keyboard-escape-quit)
+  (define-key minibuffer-local-ns-map [escape]  'keyboard-escape-quit)
+  (define-key minibuffer-local-isearch-map [escape]  'keyboard-escape-quit)
+  (define-key minibuffer-local-completion-map [escape]  'keyboard-escape-quit)
+  (define-key minibuffer-local-must-match-map [escape]  'keyboard-escape-quit)
+  (define-key minibuffer-local-must-match-filename-map [escape]  'keyboard-escape-quit)
+  (define-key minibuffer-local-filename-completion-map [escape]  'keyboard-escape-quit)
+  (define-key minibuffer-local-filename-must-match-map [escape]  'keyboard-escape-quit)
+
+  ;; Also map s-h same as C-g
+  (define-key minibuffer-local-map (kbd "s-h") 'keyboard-escape-quit)
+#+END_SRC
+
 * Developing
 ** perspeen
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
@@ -3819,7 +3828,8 @@ Occur search key bindings
   (el-get-bundle seudut/perspeen
     :features perspeen
     (setq perspeen-use-tab nil)
-    (perspeen-mode))
+    ;; (perspeen-mode)
+    )
 
   ;; super-i to switch to ith workspace