Evil

De Disposition de clavier bépo

Evil (Extensible VI Layer for emacs) est le dernier-né des émulateurs Vim pour Emacs, apparamment plus abouti que ses prédecesseurs. Ses principaux développeurs sont Frank Fischer et Vegard Oye, et le projet avance assez vite grâce à une communauté active. Une grande partie des fonctions de vim est émulée à ce jour. À la différence des autres émulateurs, evil part des fonctions emacs existantes pour se rapprocher au plus près du fonctionnement de vim. Evil utilise ainsi l’un des atouts majeurs d’emacs, son caractère modulaire. Le langage elisp offre en effet la possibilité d’ajouter un grand nombre d’extension. Avec Evil, il est ainsi possible de combiner la puissance d’emacs et l’ergonomie de vim…

Evil transforme emacs en éditeur modal, en introduisant des états (l’équivalent des modes de vim, le terme n’étant pas repris pour éviter une confusion avec les modes d’emacs, dont evil est un exemple, comme auctex, mouse-wheel, linum, key-chord etc.). Les principaux états, matérialisés par un symbole sur la barre des tâches sont: normal (N), visuel (V), insertion (I), remplacement (R), operateurs (O), motion (M) et emacs (E) — ce dernier correspondant à la desactivation de vim (evil est activé ou desactivé en tapant Ctr-z).

Pour être activé, evil doit être installé et chargé dans le .emacs.

Il est possible de modifier la forme et la couleur du curseur en fonction des modes. Voici ce que cela donne chez moi:

;fait varier la couleur du curseur en fonction du mode
 (setq evil-normal-state-cursor '("red" box)
       evil-visual-state-cursor '("light salmon" box)
       evil-insert-state-cursor '("blue" box)
       evil-replace-state-cursor '("sienna" hbar)
       evil-emacs-state-cursor '("black" box))

Adaptation au bépo:

Voici ce qu’il faut inscrire dans son .emacs pour adapter evil au bépo. Je me contente des lignes permettant d’intervertir H,J,K,L et C,T,S,R; les autres fonctions sont en effet attribuées à des touches qui peuvent varier selon la disposition bépo adoptée et les conceptions ergonomiques de chacun (le wiki bépo recommande d’utiliser b et é pour aller au mot précédent/suivant, je préfère pour ma part attribuer la fonction début de ligne à b fin de ligne à é et mot précédent à è, mot suivant à w (j’utilise un bépoèw).

  (require 'evil)
  (evil-mode 1)

    ;adaptation des touches à mon bépo

;première étape: avant de réaffecter c,t,s,r en h,j,k,l, il faut retirer ces touches de l’agencement de clavier normal-state
(define-key evil-normal-state-map "c" nil)
(define-key evil-normal-state-map "C" nil)
(define-key evil-normal-state-map "s" nil)
(define-key evil-normal-state-map "S" nil)
(define-key evil-normal-state-map "r" nil)
(define-key evil-normal-state-map "R" nil)
(define-key evil-normal-state-map "j" nil)
(define-key evil-normal-state-map "J" nil)
;je redéfinis certaines fonctions pour l’état normal
(define-key evil-normal-state-map "h" 'evil-change)
(define-key evil-normal-state-map "H" 'evil-change-line)
(define-key evil-normal-state-map "T" 'evil-join)
(define-key evil-normal-state-map "l" 'evil-replace)
(define-key evil-normal-state-map "L" 'evil-replace-state)
(define-key evil-normal-state-map "k" 'evil-substitute)
(define-key evil-normal-state-map "K" 'evil-change-whole-line)
;même chose mais cette fois pour l’état motion
(define-key evil-motion-state-map "c" 'evil-backward-char)
(define-key evil-motion-state-map "C" 'evil-window-top)
(define-key evil-motion-state-map "t" 'evil-next-line)
(define-key evil-motion-state-map "s" 'evil-previous-line)
(define-key evil-motion-state-map "r" 'evil-forward-char)
(define-key evil-motion-state-map "R" 'evil-window-bottom)
(define-key evil-motion-state-map "j" 'evil-find-char-to)
(define-key evil-motion-state-map "J" 'evil-find-char-to-backward)

Astuces

  • Pour ne pas se fatiguer à aller chercher la touche escape qui permet de retourner à l’état normal, on peut (sans nécessairement toucher à escape) attribuer cette fonction à une touche plus accessible. J’ai pour ma part choisi la combinaison ,, très accessible en bépo
;; ,, permet de quitter les états visuel, remplacement et insertion et joue le rôle d’escape en état normal (il faut passer par key-chord pour ne pas perdre la fonction evil-repeat-find-char-reverse)
(key-chord-define evil-normal-state-map ",," 'evil-force-normal-state)
(key-chord-define evil-visual-state-map ",," 'evil-change-to-previous-state)
(key-chord-define evil-insert-state-map ",," 'evil-normal-state)
(key-chord-define evil-replace-state-map ",," 'evil-normal-state)

Attention, cette solution ne marche qu’en association avec key-chord

  • Pour utiliser delete et espace pour reculer ou avancer d’un écran en mode normal
;pour avoir espace et backspace agissant comme sur des pagers
(define-key evil-normal-state-map (kbd "DEL") 'evil-scroll-page-up)
(define-key evil-normal-state-map (kbd "SPC") 'evil-scroll-page-down)
  • Pour utiliser la touche à afin de naviguer entre les tampons
(define-key evil-motion-state-map "à" 'evil-window-map)




Pour en savoir plus:

Emacs wiki

Le site du projet sur gitorious

Présentation d’evil pour habitués d’emacs (anglais)