In the #emacs IRC channel I was told that someone already solved a similar problem. Here's the modified version I use:
(require 'evil) ;; remove all keybindings from insert-state keymap (setcdr evil-insert-state-map nil) ;; but [escape] should switch back to normal state (define-key evil-insert-state-map [escape] 'evil-normal-state) (define-key evil-normal-state-map (kbd "C-u") 'evil-scroll-up) (define-key evil-normal-state-map (kbd "[ m") 'beginning-of-defun) (define-key evil-normal-state-map (kbd "] m") 'end-of-defun) (define-key evil-normal-state-map (kbd "k") 'evil-previous-visual-line) (define-key evil-normal-state-map (kbd "j") 'evil-next-visual-line) (evil-mode t) (setq evil-jumps-cross-buffers nil) ;; for C-o and C-i to not cross buffers (provide 'emvil)
The (provide 'emvil) is to allow require 'ing it in the configuration. I also found it useful to jump-to-definition in the next split screen unless the definition is in the buffer I'm currently in. Here's the code:
(defun evil-goto-definition-next-split () "If there's a free split, goto definition in this split, otherwise use current one (except when a definition in the current split)" (interactive) (let ((origin-spl (selected-window)) (origin-buf (current-buffer))) (evil-goto-definition) (when (and (eq origin-spl (selected-window)) ;; otherwise it's done (not (eq origin-buf (current-buffer)))) ;; otherwise either definition not found, or ;; it's in the same buffer (let ((defin-buf (current-buffer)) (defin-point (point))) (switch-to-buffer origin-buf) (other-window 1) (switch-to-buffer defin-buf) (goto-char defin-point) )) )) (define-key evil-normal-state-map (kbd "g d") 'evil-goto-definition-next-split)