From f2facdb949b2494941d15d9fb32f0195c432fe03 Mon Sep 17 00:00:00 2001 From: William Carroll Date: Sat, 31 Dec 2016 18:13:14 -0500 Subject: [PATCH] Adds smart Evil mode bindings and external plugins --- configs/.emacs | 79 +++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 75 insertions(+), 4 deletions(-) diff --git a/configs/.emacs b/configs/.emacs index 755d5e212..858239067 100644 --- a/configs/.emacs +++ b/configs/.emacs @@ -3,11 +3,22 @@ (require 'package) (add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/")) (custom-set-variables + ;; custom-set-variables was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. '(mouse-wheel-mode nil) + '(neo-window-fixed-size nil) + '(neo-window-width 35) '(package-selected-packages (quote - (evil helm-swoop iedit vimrc-mode helm-ispell transpose-frame helm-projectile helm-ack nyan-mode alchemist helm magit dockerfile-mode elixir-mode elm-mode ack)))) -(custom-set-faces) + (neotree evil helm-swoop iedit vimrc-mode helm-ispell transpose-frame helm-projectile helm-ack nyan-mode alchemist helm magit dockerfile-mode elixir-mode elm-mode ack)))) +(custom-set-faces + ;; custom-set-faces was added by Custom. + ;; If you edit it by hand, you could mess it up, so be careful. + ;; Your init file should contain only one such instance. + ;; If there is more than one, they won't work right. + '(hl-line ((t (:background "gray7"))))) ;; Colorscheme (load-theme 'wombat) @@ -15,6 +26,9 @@ ;; Emacs backup files (setq-default make-backup-files nil) +;; Automatically follow symlinks +(setq vc-follow-symlinks t) + ;; NyanCat progress bar ;; (nyan-mode) @@ -65,6 +79,27 @@ (require 'evil) +;; NeoTree Settings +(require 'neotree) + +(defun neotree-project-dir () + "Open NeoTree using the git root." + (interactive) + (let ((project-dir (projectile-project-root)) + (file-name (buffer-file-name))) + (neotree-toggle) + (if project-dir + (if (neo-global--window-exists-p) + (progn + (neotree-dir project-dir) + (neotree-find file-name))) + (message "Could not find git project root.")))) + +(global-set-key (kbd "") 'neotree-project-dir) + +(add-hook 'neotree-mode-hook (lambda () (bootstrap-evil-mode) (hl-line-mode)) ) + + ;; Buffer scrolling functions (global-set-key (kbd "M-n") (lambda () (interactive) (scroll-up 1) (next-line 1))) (global-set-key (kbd "M-p") (lambda () (interactive) (scroll-down 1) (previous-line 1))) @@ -96,14 +131,50 @@ ;; Change font settings (add-to-list 'default-frame-alist '(font . "Hasklig")) + +;; Personalized Evil-mode settings (defun bootstrap-evil-mode() - "Custom evil-mode boostrapping" + "Custom evil-mode settings. This disables Emacs key-bindings found in +`global-map` when inside Vim's `normal` mode. It disables Vim key-bindings +when in Vim's `insert` mode, favoring native Emacs bindings instead." (interactive) (evil-local-mode) + + ;; Toggle off Emacs bindings when in Vim `normal` mode except: + ;; * `M-x` + ;; (setcdr global-map nil) + ;; (define-key global-map (kbd "M-x") 'helm-M-x) + + ;; unbind and in normal mode since they're hardly used + (define-key evil-motion-state-map (kbd "RET") nil) + (define-key evil-motion-state-map (kbd "SPC") nil) + + ;; use 'helm-swoop for interactive search + (define-key evil-motion-state-map (kbd "/") 'helm-swoop) + + (define-key evil-normal-state-map (kbd "C-h") 'evil-window-left) + (define-key evil-normal-state-map (kbd "C-l") 'evil-window-right) + (define-key evil-normal-state-map (kbd "C-k") 'evil-window-up) + (define-key evil-normal-state-map (kbd "C-j") 'evil-window-down) + + (define-key evil-normal-state-map (kbd "M-l") (lambda () (interactive) (evil-window-vsplit) (evil-window-right 1) )) + (define-key evil-normal-state-map (kbd "M-h") (lambda () (interactive) (evil-window-vsplit) )) + (define-key evil-normal-state-map (kbd "M-j") (lambda () (interactive) (evil-window-split) (evil-window-down 1) )) + (define-key evil-normal-state-map (kbd "M-k") (lambda () (interactive) (evil-window-split) )) + + ;; Toggle off Vim bindings when in Vim `insert` mode except: + ;; * `` + ;; * `j k` + ;; * `j j` "j" + (setcdr evil-insert-state-map nil) + (define-key evil-insert-state-map (kbd "") 'evil-force-normal-state) (define-key evil-insert-state-map (kbd "j k") 'evil-force-normal-state) - (define-key evil-normal-state-map (kbd "H") 'evil-beginning-of-line) + (define-key evil-insert-state-map (kbd "jj") (lambda () (interactive) (insert "j"))) + + (define-key evil-normal-state-map (kbd "H") 'evil-first-non-blank) (define-key evil-normal-state-map (kbd "L") 'evil-end-of-line)) + ;; Line Numbers in margin for source code mode (add-hook 'prog-mode-hook 'linum-mode) (add-hook 'prog-mode-hook 'bootstrap-evil-mode)