Hi-Angel
Hi-Angel

Reputation: 5619

Evil Emacs: is there a way to disable vim-like keys in «insert» mode?

I like VIM idea of text objects, so I installed EVIL (a Emacs plugin to emulate VIM features). But I'd like «insert» mode to leave Emacs keybindings unchanged (except perhaps Escape which is to switch into «normal» mode). Any way to achieve this?

By the way: ATM «insert» mode have a mixed set of hotkeys, which isn't very comfortable either way. E.g. the «M-b» works as in Emacs, but the «C-o» works as in VIM.

Upvotes: 3

Views: 2344

Answers (1)

Hi-Angel
Hi-Angel

Reputation: 5619

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)

Upvotes: 4

Related Questions