(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
(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
(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
(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)
(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
'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
("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))
+
+
#+END_SRC
(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
(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
**** 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
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
(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/"))
(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
(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 ()
: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)
** Evil-Leader
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
(with-eval-after-load "evil-leader"
- ;; Buffer & File explore
- (evil-leader/set-key "b" 'counsel-projectile-find-file)
- (evil-leader/set-key "f" 'ivy-switch-buffer)
- (evil-leader/set-key "r" 'ivy-recentf)
- (evil-leader/set-key "w" 'save-buffer)
- ;; Window
- (evil-leader/set-key "s" 'evil-window-split)
- (evil-leader/set-key "v" 'evil-window-vsplit)
- (evil-leader/set-key "t" 'sd/hydra-window-layout/body)
- (evil-leader/set-key "q" 'evil-quit)
- ;; others
- (evil-leader/set-key "g" 'magit-status)
- ;; (evil-leader/set-key "d" (lambda () (interactive) (dired default-directory)))
- (evil-leader/set-key "d" 'dired)
- (evil-leader/set-key "e" 'sd/toggle-project-eshell)
- (evil-leader/set-key "h" 'help))
+ (cl-loop for (key . fun ) in '(("F" . counsel-projectile-switch-to-buffer)
+ ("f" . ivy-switch-buffer)
+ ("b" . counsel-projectile-find-file)
+ ("r" . ivy-recentf)
+ ("w" . save-buffer)
+ ("v" . evil-window-vsplit)
+ ("s" . evil-window-split)
+ ("t" . sd/hydra-gtags/body)
+ ("p" . sd/hydra-projectile/body)
+ ("q" . evil-quit)
+ ("g" . magit-status)
+ ("e" . sd/toggle-project-eshell)
+ ("d" . dired)
+ ("h" . help))
+ do (evil-leader/set-key key fun)))
#+END_SRC
** Basic state bindings
There are three kinds key bindings
;; (define-key evil-normal-state-map "s" nil)
;; (define-key evil-normal-state-map "sj" 'ivy-switch-buffer)
;; normal state
- (define-key evil-normal-state-map (kbd "C-SPC") 'mode-line-other-buffer)
+ ;; (define-key evil-normal-state-map (kbd "C-SPC") 'mode-line-other-buffer)
(define-key evil-normal-state-map (kbd "C-;") 'previous-multiframe-window)
;; insert state
(define-key evil-insert-state-map (kbd "C-p") 'previous-line)
(define-key map (kbd "F") 'avy-goto-char)
(define-key map (kbd "W") 'avy-goto-char-timer)))
#+END_SRC
+
+** ggtags
+#+BEGIN_SRC emacs-lisp :tangle yes :results silent
+
+#+END_SRC
* Others
#+BEGIN_SRC emacs-lisp :tangle yes :results silent
(dolist (mode '(c-mode-hook lua-mode-hook))
appWatcher:start()
-
----- Sample - Drawing on the screen - http://www.hammerspoon.org/go/#simplereload
---mouseCircle = nil
---mouseCircleTimer = nil
---function mouseHighlight()
--- -- Delete an existing highlight if it exists
--- if mouseCircle then
--- mouseCircle:delete()
--- if mouseCircleTimer then
--- mouseCircleTimer:stop()
--- end
--- end
--- -- Get the current co-ordinates of the mouse pointer
--- mousepoint = hs.mouse.getAbsolutePosition()
--- -- Prepare a big red circle around the mouse pointer
--- mouseCircle = hs.drawing.circle(hs.geometry.rect(mousepoint.x-40, mousepoint.y-40, 80, 80))
--- mouseCircle:setStrokeColor({["red"]=1,["blue"]=0,["green"]=0,["alpha"]=1})
--- mouseCircle:setFill(false)
--- mouseCircle:setStrokeWidth(5)
--- mouseCircle:show()
---
--- -- Set a timer to delete the circle after 3 seconds
--- mouseCircleTimer = hs.timer.doAfter(3, function() mouseCircle:delete() end)
---end
---hs.hotkey.bind({"cmd","alt","shift"}, "D", mouseHighlight)
---
---
----- window movement
---hs.hotkey.bind({"cmd", "alt", "ctrl"}, "H", function()
--- local win = hs.window.focusedWindow()
--- local f = win:frame()
---
--- f.x = f.x - 10
--- win:setFrame(f)
---end)
-
-- Window Movement
-- https://andrich.blog/2016/11/20/hammerspoon-an-awesome-tool-to-automate-your-mac/
-- CTRL + ALT + Left - Move current window to the left half of the screen.
{
config = {
show_in_menubar = false,
+ hist_size = 500,
},
hotkeys = {
toggle_clipboard = { { "cmd", "shift" }, "v"}