104 votes

Meilleure pratique du Mode Maléfique ?

J'utilise Vim comme éditeur principal depuis des années et j'ai essayé Emacs plusieurs fois pendant cette période. Puis j'ai découvert Le mal et j'ai décidé qu'il répondait suffisamment bien à mes besoins de rapidité pour que je puisse enfin passer à Emacs.

Alors, à vous tous, utilisateurs d'Evil, comment l'intégrez-vous aux fonctions normales d'Emacs ? Avez-vous rencontré des conflits entre ce mode et d'autres ? Quelles sont vos expériences/conseils à partager sur ce sujet ?

72voto

Matt Briggs Points 20291

J'ai utilisé un vim hautement personnalisé, et maintenant j'utilise un emacs encore plus personnalisé. Je pense que vous trouverez chaque instance de keymapping dans mon fichier de configuration keymapping https://github.com/mbriggs/.emacs.d-oldv2/blob/master/init/init-keymaps.el

Gardez à l'esprit que je rebondis sur des choses que les vrais utilisateurs d'emacs considéreraient comme une hérésie, donc YMMV si vous voulez un jour apprendre le "vrai" emacs (je ne le veux vraiment pas).

Une chose que je recommanderais à tout ancien vimmer est la suivante .

;;; esc quits
(defun minibuffer-keyboard-quit ()
  "Abort recursive edit.
In Delete Selection mode, if the mark is active, just deactivate it;
then it takes a second \\[keyboard-quit] to abort the minibuffer."
  (interactive)
  (if (and delete-selection-mode transient-mark-mode mark-active)
      (setq deactivate-mark  t)
    (when (get-buffer "*Completions*") (delete-windows-on "*Completions*"))
    (abort-recursive-edit)))
(define-key evil-normal-state-map [escape] 'keyboard-quit)
(define-key evil-visual-state-map [escape] 'keyboard-quit)
(define-key minibuffer-local-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-ns-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-completion-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-must-match-map [escape] 'minibuffer-keyboard-quit)
(define-key minibuffer-local-isearch-map [escape] 'minibuffer-keyboard-quit)

de façon à ce que esc quitte à peu près tout (comme les invites en attente dans le minibuffer)

34voto

singular Points 508

Comme quelqu'un qui venait d'emacs, a essayé vim, et a réalisé qu'il y avait un nombre énorme de choses à gagner, j'ai fait beaucoup d'expériences quand j'ai commencé à utiliser evil. Bien que les points suivants soient controversés, je voulais garder les touches emacs qui sont utilisées plus universellement dans terminal, firefox, cocoa, etc..., mais je ne voulais pas perdre les capacités d'édition de vim. J'ai fini par décider de relier les touches suivantes dans mon .emacs :

(define-key evil-normal-state-map "\C-e" 'evil-end-of-line)
(define-key evil-insert-state-map "\C-e" 'end-of-line)
(define-key evil-visual-state-map "\C-e" 'evil-end-of-line)
(define-key evil-motion-state-map "\C-e" 'evil-end-of-line)
(define-key evil-normal-state-map "\C-f" 'evil-forward-char)
(define-key evil-insert-state-map "\C-f" 'evil-forward-char)
(define-key evil-insert-state-map "\C-f" 'evil-forward-char)
(define-key evil-normal-state-map "\C-b" 'evil-backward-char)
(define-key evil-insert-state-map "\C-b" 'evil-backward-char)
(define-key evil-visual-state-map "\C-b" 'evil-backward-char)
(define-key evil-normal-state-map "\C-d" 'evil-delete-char)
(define-key evil-insert-state-map "\C-d" 'evil-delete-char)
(define-key evil-visual-state-map "\C-d" 'evil-delete-char)
(define-key evil-normal-state-map "\C-n" 'evil-next-line)
(define-key evil-insert-state-map "\C-n" 'evil-next-line)
(define-key evil-visual-state-map "\C-n" 'evil-next-line)
(define-key evil-normal-state-map "\C-p" 'evil-previous-line)
(define-key evil-insert-state-map "\C-p" 'evil-previous-line)
(define-key evil-visual-state-map "\C-p" 'evil-previous-line)
(define-key evil-normal-state-map "\C-w" 'evil-delete)
(define-key evil-insert-state-map "\C-w" 'evil-delete)
(define-key evil-visual-state-map "\C-w" 'evil-delete)
(define-key evil-normal-state-map "\C-y" 'yank)
(define-key evil-insert-state-map "\C-y" 'yank)
(define-key evil-visual-state-map "\C-y" 'yank)
(define-key evil-normal-state-map "\C-k" 'kill-line)
(define-key evil-insert-state-map "\C-k" 'kill-line)
(define-key evil-visual-state-map "\C-k" 'kill-line)
(define-key evil-normal-state-map "Q" 'call-last-kbd-macro)
(define-key evil-visual-state-map "Q" 'call-last-kbd-macro)
(define-key evil-normal-state-map (kbd "TAB") 'evil-undefine)

(defun evil-undefine ()
 (interactive)
 (let (evil-mode-map-alist)
   (call-interactively (key-binding (this-command-keys)))))

Malheureusement, ces opérations se chevauchent avec les opérations de vim "déplacer un écran vers le haut ou vers le bas". Cependant, je me suis habitué à utiliser ce qui suit à la place :

(define-key evil-normal-state-map (kbd "DEL") (lambda ()
                    (interactive)
                    (previous-line 10)
                    (evil-scroll-line-up 10)
                    ))

(define-key evil-normal-state-map (kbd "=") (lambda ()
                      (interactive)
                      (next-line 10)
                      (evil-scroll-line-down 10)
                      ))

De plus, si vous venez de vim et que vous voulez passer rapidement du mode insertion au mode normal en utilisant "jk" (ou toute autre combinaison de deux traits), la meilleure façon est de copier le texte à partir de http://www.emacswiki.org/emacs/download/key-chord.el et collez-le dans votre ~/.emacs.d/key-chord.el . Ajoutez ensuite ce qui suit à votre fichier .emacs :

;load a file named key-chord.el from some directory in the load-path (e.g. "~/.emacs.d")
(require 'key-chord)
(key-chord-mode 1)
(key-chord-define-global "jk" 'evil-normal-state)

De plus, si vous venez de vim et que vous pensez que la fonction copy-to-clipboard d'emacs n'est pas bonne, vous avez probablement raison. Cependant, vous pouvez trouver ce qui suit utile après avoir exécuté sudo apt-get install xsel :

(defun copy-to-clipboard ()
  (interactive)
  (if (display-graphic-p)
      (progn
        (message "Yanked region to x-clipboard!")
        (call-interactively 'clipboard-kill-ring-save)
        )
    (if (region-active-p)
        (progn
          (shell-command-on-region (region-beginning) (region-end) "xsel -i -b")
          (message "Yanked region to clipboard!")
          (deactivate-mark))
      (message "No region active; can't yank to clipboard!")))
  )

(evil-define-command paste-from-clipboard()
  (if (display-graphic-p)
      (progn
        (clipboard-yank)
        (message "graphics active")
        )
    (insert (shell-command-to-string "xsel -o -b"))
    )
  )

(global-set-key [f8] 'copy-to-clipboard)
(global-set-key [f9] 'paste-from-clipboard)

Évidemment, vous devrez décider par vous-même si ces changements controversés en valent la peine, mais peut-être que ces changements de base vous inspireront.

Pour d'autres implémentations de fonctions vraiment cool, telles que supprimer et coller, supprimer sans copier dans le presse-papiers, mouvement 4x / 16x efficace, utilisation de comptes pour la spécification du registre de collage, paramètres de tabulation qui fonctionnent réellement pour c/c++, et plus encore, vous pouvez consulter les versions complètes de .emacs, init.el, my-keymaps.el, et my-functions.el sur mon git à l'adresse suivante https://github.com/Russell91/emacs

30voto

Kenny Meyer Points 2464

J'ai également été un utilisateur de Viper/Vimpulse, avec une énorme de configuration. Puis j'ai trouvé Evil-mode.

Quelles sont vos expériences/conseils à partager sur ce sujet ?

C'est toute ma configuration en mode maléfique, et ça marche très bien pour moi :

(require 'evil)
(evil-mode 1)

;; Remap org-mode meta keys for convenience
(mapcar (lambda (state)
    (evil-declare-key state org-mode-map
      (kbd "M-l") 'org-metaright
      (kbd "M-h") 'org-metaleft
      (kbd "M-k") 'org-metaup
      (kbd "M-j") 'org-metadown
      (kbd "M-L") 'org-shiftmetaright
      (kbd "M-H") 'org-shiftmetaleft
      (kbd "M-K") 'org-shiftmetaup
      (kbd "M-J") 'org-shiftmetadown))
  '(normal insert))

Avez-vous rencontré des conflits entre ce mode et d'autres ?

Non, contrairement à Viper/Vimpulse qui causait des problèmes dans plusieurs modes.

17voto

dennis Points 206

J'ai commencé à utiliser Evil il y a un mois ; avant cela, j'ai essayé d'utiliser viper/vimpulse sans grand succès. Pour être honnête, vimpulse est assez sympa, mais l'utiliser avec différents modes était un peu gênant (par exemple le mode compilation où vimpulse devenait toujours fou) laissant emacs dans un mode entre vi-emacs-quelque chose.

Quand je suis passé à Evil, j'ai enfin commencé à explorer toute la puissance d'Emacs, et croyez-moi, je ne l'ai pas regretté. Evil fonctionne bien dans tous les modes que j'ai utilisés (principalement édition, compilation, scratch et eshell) et même la lecture d'info/man/help fonctionne sans aucun problème.

Sauf que je n'ai trouvé le changement de tampon étrange que parce que j'avais l'habitude de faire :b<0-9> au lieu de :b-TAB-then-complete-name ou :bn. Notez cependant que les développeurs d'Evil essaient (dans certains cas) de réduire les fonctionnalités dupliquées, donc au lieu de : ! (pour exécuter une commande shell), vous devriez utiliser le M- ! natif.

Si vous avez besoin d'ajouter ou de définir des commandes ex personnalisées, ouvrez simplement evil-maps.el et modifiez-le (essayez dans vim !).

Evil est un projet encore jeune mais prometteur et j'attends le jour où il remplacera viper dans la distribution officielle d'Emacs.

10voto

Ehvince Points 1672

J'aime sauvegarder le tampon lorsque je quitte l'application insert-mode : (édité : ne pas demander de sauvegarder quand il n'y a pas de fichier associé à ce tampon, comme dans un tampon scratch ou magit)

(defun my-save ()
  (if (buffer-file-name)
    (evil-save))
)

   (add-hook 'evil-insert-state-exit-hook 'my-save)

pour d'autres possibilités : voir http://wikemacs.org/index.php/Evil

Commentaires bienvenus pour des améliorations !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X