Emacs - improve ivy & projectile
[dotfiles.git] / emacs.d / config.org
index 6b3476e..e8b7f32 100644 (file)
@@ -34,6 +34,8 @@ Set system PATH and emacs exec path
   (defconst my-email "seudut@gmail.com")
   (defconst MY-EMACS-DIR (concat (getenv "HOME") "/.emacs.d"))
   (defconst MY-EMACS-TMP (concat MY-EMACS-DIR "/temp"))
+  (unless (file-exists-p MY-EMACS-TMP)
+    (mkdir MY-EMACS-TMP))
 #+END_SRC
 
 ** General Setting
@@ -62,6 +64,8 @@ Set system PATH and emacs exec path
 
   (when (display-graphic-p)
     (fringe-mode '(0 . 0)))
+
+  (blink-cursor-mode 0)
   ;; (setq-default indicate-empty-lines t)
   ;; (setq-default indicate-abuffer-boundaries 'right)
 #+END_SRC
@@ -201,7 +205,7 @@ Setting the fonts alignment issue
   (if window-system
       (when sd/fixed-font-family
         (set-frame-font sd/fixed-font-family)
-        (set-face-attribute 'default nil :font sd/fixed-font-family :height 140)
+        (set-face-attribute 'default nil :font sd/fixed-font-family :height 120)
         (set-face-font 'default sd/fixed-font-family)))
 #+END_SRC
 
@@ -704,7 +708,8 @@ let helm windows split inside current window
     (use-package ivy :ensure t)
     (ivy-mode 1)
     (setq ivy-use-virtual-buffers nil
-          ivy-wrap t)
+          ivy-wrap t
+          ivy-count-format "%d/%d ")
     (set-face-attribute 'ivy-current-match nil :background "Orange" :foreground "black")
     (global-set-key (kbd "M-x") 'counsel-M-x)
     ;; (global-set-key (kbd "C-h f") 'counsel-describe-function)
@@ -713,9 +718,14 @@ let helm windows split inside current window
     (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)
+  ;; (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
@@ -725,6 +735,8 @@ let helm windows split inside current window
                            '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
@@ -732,9 +744,21 @@ let helm windows split inside current window
     (ivy-done)
     (ivy-shrink-after-dispatching))
 
+  (defun sd/exit-ivy-and-swith-to-buffer ()
+    "exit ivy complete, and call swith to buffer"
+    (interactive)
+    (ivy--exhibit)
+    (ivy-set-action (lambda (buf)
+                      (ivy-switch-buffer)))
+    (when (ivy-read-action)
+      (ivy-done))
+    (ivy-shrink-after-dispatching))
+
   (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") #'sd/swith-buffer-other-window)
+    ;; (define-key ivy-minibuffer-map (kbd "M-o") nil)
+    (define-key ivy-minibuffer-map (kbd "C-o") #'sd/exit-ivy-and-swith-to-buffer))
 #+END_SRC
 
 stolen from [[https://github.com/mariolong/emacs.d/blob/f6a061594ef1b5d1f4750e9dad9dc97d6e122840/emacs-init.org][here]]
@@ -1226,29 +1250,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))))
@@ -1519,9 +1543,18 @@ Refer [[https://github.com/abo-abo/hydra/blob/master/hydra-examples.el][hydra-ex
     ("u" winner-undo "window-Undo"  :exit t)
     ("r" winner-redo "window-Redo"  :exit t))
 
-  ;; (with-eval-after-load "evil"
-  ;;   (define-key evil-normal-state-map (kbd ";t") 'sd/hydra-window-layout/body))
+  (defhydra sd/hydra-gtags (:color red :colums nil)
+    "ggtags - global"
+    ("d" sd/ggtags-find-definition "Definition" :exit t)
+    ("r" ggtags-find-reference "Reference" :exit t)
+    ("s" sd/ggtags-find-symbol "Symbol" :exit t))
 
+  (defhydra sd/hydra-projectile (:color red :column nil)
+    "Projectile: "
+    ("s" projectile-switch-open-project "Switch" :exit t)
+    ("f" projectile-find-file "File" :exit t)
+    ("b" projectile-switch-to-buffer "Buffer" :exit t)
+    ("p" projectile-switch-project "Project" :exit t))
 #+END_SRC
 
 *** hydra launcher
@@ -2146,6 +2179,24 @@ here on Mac, just use "open" commands to pen =.pdf=,  =.html= and image files
     (yas-reload-all))
 #+END_SRC
 
+** YouCompleteMe
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+  (use-package ycmd
+    :ensure t
+    :init
+    (use-package company-ycmd
+      :ensure t
+      :init
+      (setq company-ycmd-enable-fuzzy-matching nil)
+      :config
+      (company-ycmd-setup))
+    (setq ycmd-force-semantic-completion t)
+    (add-hook 'c++-mode-hook 'ycmd-mode)
+    (add-hook 'c-mode-hook 'ycmd-mode)
+    (set-variable 'ycmd-server-command '("python" "/Users/peng/project/ycmd/ycmd"))
+    (set-variable 'ycmd-global-config "/Users/peng/project/ycmd/cpp/ycm/.ycm_extra_conf.py"))
+#+END_SRC
+
 
 ** company and yasnippet
 Add yasnippet as the company candidates
@@ -2272,14 +2323,21 @@ Refer, [[http://emacs.stackexchange.com/questions/7908/how-to-make-yasnippet-and
   (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)
+  (dolist (mode '(c-mode
+                  c++-mode))
+    (font-lock-add-keywords mode
+                            ;; highlight %s \n
+                            '(("\\([%\\][a-zA-Z]\\)" (1  font-lock-keyword-face prepend))
+                              ("[^[:alpha:]]\\([[:digit:]]*\\)[^[:alpha:]]" (1 font-lock-constant-face append))
+                              ;; hex number
+                              ("[^[:alpha:]]\\(0[x\\|X][0-9a-fA-F]*\\)[^[:alpha:]]" (1 font-lock-constant-face append))
+                              ;; hightlight the function call
+                              ("\\s\"?\\(\\(\\sw\\|\\s_\\)+\\(<-\\)?\\)\\s\"?*\\s-*(" (1 font-lock-function-name-face))) t))
+
+  (font-lock-add-keywords 'c++-mode
+                          '(
+                            ("[\s\\|::]\\(cin\\|cout\\|endl\\)[^[:alpha:][:digit:]]" (1 font-lock-constant-face append))
+                            ) t)
 #+END_SRC
 
 ** Emacs Lisp
@@ -2356,18 +2414,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.
@@ -2394,7 +2452,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=
@@ -2417,12 +2474,12 @@ then install irony searver, and =LIBCLANG_LIBRARY= and =LIBCLANG_INCLUDE_DIR= ac
 **** irony config
 irony-mode-hook, copied from [[https://github.com/Sarcasm/irony-mode][irony-mode]] github
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (use-package irony
-    :ensure t
-    :config
-    (add-hook 'c++-mode-hook 'irony-mode)
-    (add-hook 'c-mode-hook 'irony-mode)
-    (add-hook 'objc-mode-hook 'irony-mode))
+  ;; (use-package irony
+  ;;   :ensure t
+  ;;   :init
+  ;;   (add-hook 'c++-mode-hook 'irony-mode)
+  ;;   (add-hook 'c-mode-hook 'irony-mode)
+  ;;   (add-hook 'objc-mode-hook 'irony-mode))
 
   ;; replace the `completion-at-point' and `complete-symbol' bindings in
   ;; irony-mode's buffers by irony-mode's function
@@ -2433,10 +2490,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
@@ -2450,28 +2507,28 @@ irony-mode-hook, copied from [[https://github.com/Sarcasm/irony-mode][irony-mode
 
 irony-company
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
-  (use-package company-irony
-    :ensure t)
+  ;; (use-package company-irony
+  ;;   :ensure t)
 
-  (use-package flycheck-irony
-    :ensure t)
+  ;; (use-package flycheck-irony
+  ;;   :ensure t)
 
-  (use-package company-c-headers
-    :ensure t
-    :config
-    (add-to-list 'company-c-headers-path-system "/usr/include/c++/4.2.1/")
-    (add-to-list 'company-c-headers-path-system "/usr/local/include/"))
+  ;; (use-package company-c-headers
+  ;;   :ensure t
+  ;;   :config
+  ;;   (add-to-list 'company-c-headers-path-system "/usr/include/c++/4.2.1/")
+  ;;   (add-to-list 'company-c-headers-path-system "/usr/local/include/"))
 
   ;; (with-eval-after-load 'company
   ;;   (add-to-list 'company-backends 'company-irony)
   ;;   (add-to-list 'company-backends 'company-c-headers))
 
-  (with-eval-after-load 'company
-    (push  '(company-irony :with company-yasnippet) company-backends)
-    (push  '(company-c-headers :with company-yasnippet) company-backends))
+  ;; (with-eval-after-load 'company
+  ;;   (push  '(company-irony :with company-yasnippet) company-backends)
+  ;;   (push  '(company-c-headers :with company-yasnippet) company-backends))
 
-  (with-eval-after-load 'flycheck
-    (add-hook 'flycheck-mode-hook #'flycheck-irony-setup))
+  ;; (with-eval-after-load 'flycheck
+  ;;   (add-hook 'flycheck-mode-hook #'flycheck-irony-setup))
 #+END_SRC
 
 *** flycheck
@@ -2500,6 +2557,18 @@ irony-company
               (when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
                 (ggtags-mode 1))))
 
+  (defun sd/ggtags-find-definition ()
+    "Find the definition with current name completing."
+    (interactive)
+    (setq current-prefix-arg '(4))
+    (call-interactively 'ggtags-find-definition))
+
+  (defun sd/ggtags-find-symbol ()
+    "Find symbol"
+    (interactive)
+    (setq current-prefix-arg '(4))
+    (call-interactively 'ggtags-find-other-symbol))
+
   (require 'cc-mode)
   (require 'semantic)
   (setq semanticdb-default-save-directory (concat MY-EMACS-TMP "/semantic/"))
@@ -2531,7 +2600,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
@@ -2585,7 +2654,6 @@ Install =guile=, =guile= is an implementation of =Scheme= programming language.
 
   (add-to-list 'auto-mode-alist '("\\.rkt\\'" . racket-mode))
 #+END_SRC
-
 * Compile
 Set the environments vairables in compilation mode
 #+BEGIN_SRC emacs-lisp :tangle yes :results silent
@@ -2786,6 +2854,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]]
@@ -3116,6 +3191,10 @@ Here are some global key bindings for basic editting
 #+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)
+  (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]]
@@ -3156,7 +3235,8 @@ Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
     (setq projectile-cache-file (concat sd-temp-directory "projectile.cache"))
     :config
     (add-to-list 'projectile-globally-ignored-files "GTAGS")
-    (projectile-global-mode t))
+    (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 ()
@@ -3195,31 +3275,6 @@ Use =ESC= to exit minibuffer. Also I map =Super-h= the same as =C-g=
     (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
-
 ** Windown & Buffer - =C-o=
 Defind a =hydra= function for windows, buffer & bookmark operations. And map it to =C-o= globally.
 Most use =C-o C-o= to switch buffers; =C-o x, v= to split window; =C-o o= to delete other windows
@@ -3441,17 +3496,17 @@ Search, replace and hightlight will in later paragraph
     :config
     (avy-setup-default))
 
-  (global-set-key (kbd "C-M-j") 'avy-goto-line-below)
-  (global-set-key (kbd "C-M-n") 'avy-goto-line-below)
-  (global-set-key (kbd "C-M-k") 'avy-goto-line-above)
-  (global-set-key (kbd "C-M-p") 'avy-goto-line-above)
+  ;; (global-set-key (kbd "C-M-j") 'avy-goto-line-below)
+  ;; (global-set-key (kbd "C-M-n") 'avy-goto-line-below)
+  ;; (global-set-key (kbd "C-M-k") 'avy-goto-line-above)
+  ;; (global-set-key (kbd "C-M-p") 'avy-goto-line-above)
 
-  (global-set-key (kbd "C-M-f") 'avy-goto-word-1-below)
-  (global-set-key (kbd "C-M-b") 'avy-goto-word-1-above)
+  ;; (global-set-key (kbd "C-M-f") 'avy-goto-word-1-below)
+  ;; (global-set-key (kbd "C-M-b") 'avy-goto-word-1-above)
 
   ;; (global-set-key (kbd "M-g e") 'avy-goto-word-0)
-  (global-set-key (kbd "C-M-w") 'avy-goto-char-timer)
-  (global-set-key (kbd "C-M-l") 'avy-goto-char-in-line)
+  ;; (global-set-key (kbd "C-M-w") 'avy-goto-char-timer)
+  ;; (global-set-key (kbd "C-M-l") 'avy-goto-char-in-line)
 
   ;; ;; will delete above 
   ;; (global-set-key (kbd "M-g j") 'avy-goto-line-below)
@@ -3461,6 +3516,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
@@ -3759,7 +3817,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