La meilleure pratique du mode maléfique?

Cela fait des années que j’utilise Vim comme éditeur principal et j’ai essayé Emacs plusieurs fois au cours de cette période. Ensuite, j’ai découvert le mal et j’ai décidé que cela répondrait à ma demande de mouvement rapide et que je pourrais enfin passer à Emacs.

Donc, pour vous tous utilisateurs maléfiques, comment l’intégrez-vous avec les fonctions normales d’Emacs? Avez-vous rencontré des conflits entre ce mode et d’autres? Quelles sont vos expériences / conseils utiles sur ce sujet?

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

Gardez à l’esprit que je relie des choses que les vrais utilisateurs d’emacs considéreraient comme des hérésies, donc YMMV si vous voulez apprendre de “vrais” emacs (je ne le pense vraiment pas).

Une chose que je recommanderais à n’importe quel ex vimmer est ceci

;;; 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 sorte que esc quitte pratiquement n’importe quoi (comme les invites en attente dans le mini-tampon)

En tant que personne venant d’Emacs, ayant essayé Vim et réalisé qu’il y avait beaucoup de choses à gagner, j’ai beaucoup expérimenté quand j’ai commencé à utiliser le mal. Bien que les éléments suivants soient controversés, je voulais conserver les clés emacs utilisées de manière plus universelle dans les terminaux, firefox, cacao, etc., mais ne voulant pas perdre les fonctionnalités d’édition de vim. J’ai fini par décider de relier les clés suivantes dans mes fichiers .emacs:

 (define-key evil-normal-state-map "\Ce" 'evil-end-of-line) (define-key evil-insert-state-map "\Ce" 'end-of-line) (define-key evil-visual-state-map "\Ce" 'evil-end-of-line) (define-key evil-motion-state-map "\Ce" 'evil-end-of-line) (define-key evil-normal-state-map "\Cf" 'evil-forward-char) (define-key evil-insert-state-map "\Cf" 'evil-forward-char) (define-key evil-insert-state-map "\Cf" 'evil-forward-char) (define-key evil-normal-state-map "\Cb" 'evil-backward-char) (define-key evil-insert-state-map "\Cb" 'evil-backward-char) (define-key evil-visual-state-map "\Cb" 'evil-backward-char) (define-key evil-normal-state-map "\Cd" 'evil-delete-char) (define-key evil-insert-state-map "\Cd" 'evil-delete-char) (define-key evil-visual-state-map "\Cd" 'evil-delete-char) (define-key evil-normal-state-map "\Cn" 'evil-next-line) (define-key evil-insert-state-map "\Cn" 'evil-next-line) (define-key evil-visual-state-map "\Cn" 'evil-next-line) (define-key evil-normal-state-map "\Cp" 'evil-previous-line) (define-key evil-insert-state-map "\Cp" 'evil-previous-line) (define-key evil-visual-state-map "\Cp" 'evil-previous-line) (define-key evil-normal-state-map "\Cw" 'evil-delete) (define-key evil-insert-state-map "\Cw" 'evil-delete) (define-key evil-visual-state-map "\Cw" 'evil-delete) (define-key evil-normal-state-map "\Cy" 'yank) (define-key evil-insert-state-map "\Cy" 'yank) (define-key evil-visual-state-map "\Cy" 'yank) (define-key evil-normal-state-map "\Ck" 'kill-line) (define-key evil-insert-state-map "\Ck" 'kill-line) (define-key evil-visual-state-map "\Ck" '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 “déplacer d’un écran vers le haut ou vers le bas”. Cependant, je suis devenu à l’aise avec ce qui suit:

 (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 un chemin rapide de l’insertion au mode normal en utilisant “jk” (ou toute autre combinaison à deux temps), le meilleur moyen est de copier le texte depuis http://www.emacswiki.org/ emacs / download / key-chord.el et collez-le dans votre ~ / .emacs.d / key-chord.el. Ajoutez ensuite ce qui suit à vos .emacs:

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

En outre, si vous venez de vim et que vous pensez que la copie dans le presse-papier d’emacs ne vous convient pas, 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-ssortingng "xsel -o -b")) ) ) (global-set-key [f8] 'copy-to-clipboard) (global-set-key [f9] 'paste-from-clipboard) 

De toute évidence, vous devrez décider vous-même si l’un de ces changements controversés en vaut la peine, mais peut-être que ces changements fondamentaux vous inspireront.

Pour d’autres implémentations de fonctions vraiment sympas, telles que supprimer et coller, supprimer sans copier dans le presse papier, déplacement 4x / 16x efficace, utilisation des compteurs pour la spécification du registre de pâte, parameters de tabulation qui fonctionnent réellement pour c / c ++, etc. sur les versons complets de .emacs, init.el, my-keymaps.el et my-functions.el sur https://github.com/Russell91/emacs

J’avais l’habitude d’être un utilisateur Viper / Vimpulse, avec une énorme quantité de configuration. Ensuite, j’ai trouvé Evil-mode.

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

C’est 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 "Ml") 'org-metaright (kbd "Mh") 'org-metaleft (kbd "Mk") 'org-metaup (kbd "Mj") 'org-metadown (kbd "ML") 'org-shiftmetaright (kbd "MH") 'org-shiftmetaleft (kbd "MK") 'org-shiftmetaup (kbd "MJ") '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.

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 plutôt sympa, mais l’utiliser avec divers modes était un peu gênant (par exemple, le mode de compilation où vimpulse devenait toujours fou) laissant emacs dans un certain mode entre vi-emacs-quelquechose.

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

Sauf que, je n’ai trouvé que le changement de tampon bizarre comme je le faisais auparavant: b <0-9> à la place: b-TAB-then-complete-name ou: bn. Notez cependant que les développeurs maléfiques tentent (dans certains cas) de réduire les fonctionnalités en double, à la place:! (pour exécuter la commande shell), vous devez utiliser M-! natif.

Si vous trouvez urgent d’append ou de redéfinir des commandes personnalisées, ouvrez simplement evil-maps.el et éditez-le (essayez cela dans vim!).

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

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

 (defun my-save () (if (buffer-file-name) (evil-save)) ) (add-hook 'evil-insert-state-exit-hook 'my-save) 

pour plus de possibilités: voir http://wikemacs.org/index.php/Evil

Les commentaires sont les bienvenus pour des améliorations!

  1. J’utilise le leader du mal et j’utilise “, xm” pour remplacer “Mx”, donc j’appuie rarement sur la touche Alt. Il existe également general.el qui prend en charge plusieurs clés de leader.

  2. match-mal , appuyez sur “%” pour passer d’une paire à l’autre.

  3. mal-nerd-commenter , appuyez sur “9, ci” pour commenter / décommenter 9 lignes

  4. évitez d’utiliser la touche ESC, vous pouvez appuyer sur “kj” à la place.

  5. Ayez confiance dans le logiciel libre! Rien n’est impossible avec le Mal qui combine le pouvoir de Vim et d’Emacs. Par exemple, beaucoup de personnes supposent que les raccourcis clavier Evil sont en conflit avec les plug-ins Emacs existants sans reliure lourde. C’est faux en fait

Venant du côté des emacs, je préfère beaucoup M-. être aller à la définition, mais la fonction qui s’exécute sur M-. diffère selon les modes. Je pourrais la remplacer de manière régulière par (define-key evil-normal-state-map (kbd "M-.") 'foo)foo vérifie le mode majeur en cours et exécute la fonction appropriée, mais ça sonne comme ça’ d nécessite beaucoup de codage en dur. Une solution plus générale est la suivante:

 (defun evil-emacs-key-binding (key) (evil-execute-in-emacs-state) (key-binding key)) (defmacro evil-revert-key-binding (state-map key) `(define-key ,state-map ,key (lambda () (interactive) (call-interactively (evil-emacs-key-binding ,key))))) (eval-after-load "evil-autoloads" '(add-hook 'evil-after-load-hook (lambda () (evil-revert-key-binding evil-normal-state-map (kbd "M-.")) ;; and so on ))) 

A part ça, j’aime les plugins mal-surround (même si je trouve que smartparens est une solution plus complète) et un leader maléfique .

J’avais l’habitude d’utiliser des accords-clés pour mapper jk à ESC comme j’ai appris à le faire dans vim, mais il a insisté pour traiter kj comme jk, donc j’utilise ce qui suit:

 (defun evil-escape-if-next-char (sortinggger) "Watches the next letter. If `sortinggger', then switch to normal mode, otherwise keep the previously inserted key and forward unpressed key to `unread-command-events'." (self-insert-command 1) (let ((next-key (read-event))) (if (eq sortinggger next-key) (progn (delete-char -1) (evil-normal-state)) (setq unread-command-events (cons next-key unread-command-events))))) (defun evil-escape-if-next-char-is-k (arg) (interactive "p") (if (= arg 1) (evil-escape-if-next-char ?k) (self-insert-command arg))) (eval-after-load "evil-autoloads" '(add-hook 'evil-after-load-hook (lambda () ;; … other stuff … (define-key evil-insert-state-map (kbd "j") 'evil-escape-if-next-char-is-k)))) 

J’utilise (setq evil-move-cursor-back nil) ce qui n’est pas très vimmy (bien que apparemment vous pouvez aussi faire cela avec votre vimrc), je ne me suis jamais habitué au retour du curseur après avoir quitté insert.

Conseil pratique: utilisez le mode evil-local-mode-hook pour des choses comme le chargement paresseux, le mode surround-mal, cela ne vous aidera pas à le mettre en evil-mode-hook . Donc, si vous installez un mal et un surround maléfique avec package-install, vous pouvez le faire quand vous faites le Mx evil-mode en le faisant

 (eval-after-load "evil-surround-autoloads" '(add-hook 'evil-local-mode-hook #'evil-surround-mode)) 

(Bien sûr, si vous exécutez toujours un mauvais mode et que vous avez toujours du mal installé, il n’y a pas besoin de ce type de chargement automatique, mais je préfère que mes fichiers .emac soient assez généraux pour pouvoir les utiliser sur d’anciennes paquets elpa installés.)