Journal Emacs NU-MODE et ses concurrents

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes :
19
8
oct.
2017

Sommaire

NU-MODE passe en 0.4!

Qu'est-ce que NU-MODE ?

https://github.com/pyluyten/emacs-nu

NuModeHydra

NU-MODE est un énième package Emacs proposant une refonte complète des raccourcis claviers. Les raccourcis associés à chaque lettre sont revus. De plus, un système de menus est intégré (comme des pop-ups mais ce sont des "prompts"). Ces menus sont (un peu) "responsive" : ils s'adaptent au contexte, du moins pour l'instant au mode majeur, & si l'on a du texte sélectionné ou pas.

En quoi est-ce utile?

EntorseMain

Emacs possède d'une part des raccourcis standards odieux, archaïques et fourbes, d'autre part des myriades de millions de fonctions utiles. Dont des dizaines sont utiles très souvent. Zut! Donc se pose la question de comment rendre accessibles les fonctions les plus fréquentes, mais aussi comment accéder aux fonctions un peu moins fréquentes. Et éventuellement comment découvrir de plus rares. Parce que Emacs c'est comme votre chef : suppose toujours que vous avez lu les 773 manuels de chacun 1113 pages, en moyenne - et tout retenu. Bref revenons au sujet.

Si vous n'étiez pas au courant pour les raccourcis Emacs par défaut (!) vous pouvez par exemple voir cela https://ensiwiki.ensimag.fr/index.php?title=Raccourcis_claviers_Emacs

ça fait peur non? (En fait j'utilise tout de même ces raccourcis dans le bash, & dans ce contexte ça passe, mais faut pas pousser. Voir l'excellente contrib récente pour le bash : https://linuxfr.org/users/postroutine/journaux/bash-et-les-raccourcis-claviers)

Bon comment faire de Emacs un truc utilisable?

Quelles seraient les solutions "natives" ?

  • s'habituer aux raccourcis claviers, puis y perdre sa main (ou juste sa patience)
  • lancer constamment "M-x" , qui permet d'appeler une fonction par son nom. On tape Alt+x et puis l'on tape directement le nom de la commande, comme "find-files", pour ouvrir un fichier. Ce qui ressemble un peu au ":" de VI. Super pratique. Bon Emacs bien sûr sait faire de la completion (enfin environ 112 systèmes de completion différents…) mais ce n'est pas toujours adéquat.
  • utiliser les flèches pour naviguer ou le menu pour les fonctions. Nan là je rigole.
  • définir à la mano, commande par commande, ses propres raccourcis. Je pense que pas mal de users "tweakent" pas mal.

Hormis les solutions ci-dessus, viennent des ajouts à Emacs. Ces ajouts sont le mal, puisqu'ils font concurrence à NU-MODE. Je compte donc sur Donald Trump. En attendant les présenter de manière biaisée pourrait m'aider.

Comment décrire NU-MODE par rapport à ses concurrents?

Ah!, ça devient plus intéressant. NU-MODE n'est pas le premier à chercher à résoudre ces problèmes fondamentaux! loin de là. Au menu : CUA mode, evil, spacemacs, hydra, magit (?! si), et enfin ErgoEmacs.

cua mode

https://www.gnu.org/software/emacs/manual/html_node/emacs/CUA-Bindings.html

CUA mode est un ancien et joli package Emacs, dispo directement dans Emacs, notamment réhabilitant quatre raccourcis standards. CUA permet en effet

  • de faire Ctrl+x pour couper, Ctrl+z pour annuler, Ctrl+c pour coller, Ctrl+v pour annuler. Waou. Truc de ouf quoi.

  • de continuer quand même à faire Ctrl+x pour son rôle habituel dans Emacs (par ex dans Emacs ouvrir un fichier c'est Ctrl-x Ctrl-f) Ah… un peu plus sympa.

  • de faire Ctrl+c pour les choses normales dans Emacs (Ctrl c + lettre = raccourcis dédiés user, Ctrl c + Ctrl xxx = raccourcis pour le mode majeur, Ctrl c + ponctuation = raccourcis pour mode mineur, à quelques exceptions près - ouch) cf https://www.gnu.org/software/emacs/manual/html_node/elisp/Key-Binding-Conventions.html

  • de gérer des rectangles. Sauf que Emacs inclut maintenant des fonctions natives pour gérer les rectangles. & pis de toutes façons c'est pas mon sujet, alors j'en parle pas!

  • de faire shift+mouvement pour sélectionner du texte (waaa!!! rétro futurisme quand tu nous tiens!!)

Bref très bien très bien tout ça, mais trop limité. En me fiant à ma boule de cristal magique, je dirai que CUA MODE bien que ne changeant pas tout, est assez populaire.

Evil

https://github.com/emacs-evil/evil

Plusieurs implémentations de VIM existent dans EMACS. Evil en fait partie. Evil est la plus récente et la plus complète. Techniquement cela fonctionne extrêmement bien, et charger ce package ne ralentit absolument pas le lancement de Emacs. Chapeau!

Au point où, pour un utilisateur VIM, Emacs pourrait tout à faire être la meilleure version de VIM! Puisque Emacs permettra les touches VIM, beaucoup plus de package, une bien plus grande souplesse pour écrire ses propres fonctions.

Mais evil transforme donc Emacs en VIM, en éditeur modal. Ça, pour plusieurs raisons, je n'en voulais pas. NU-MODE considère qu'un éditeur non modal peut offrir l'ergonomie. Un éditeur modal a le défaut de faire constamment passer d'un mode à l'autre.
À la rigueur, constamment collés au clavier, ça peut passer avec l'habitude. Mais je n'y crois pas, hélas!

(note : quand ma webcam détectera dans mes yeux si je tape h pour taper h ou h pour me déplacer à gauche, je repasserai peut-être à Evil.)

spacemacs

https://github.com/syl20bnr/spacemacs

Spacemacs a commencé comme une - belle - surcouche à Evil. on part donc de Evil : on dispose de toutes les fonctions Emacs, mais avec l'"interface" à la VIM.

Ensuite, Spacemacs ajoute la touche espace. On appuie sur espace & on se retrouve dans un mega menu avec des trucs comme "taper f pour voir toutes les fonctions relatives aux fichiers". "f" invoque donc un menu dans le menu. À l'inverse, certaines touches sont directes. Par exemple dans le menu, si on appuie sur espace, on se retrouve dans le lanceur de fonction
(le M-x de toute à l'heure). Pratique, car c'est très rapide et accessible.

Spacemacs inclut tout un tas d'autres trucs. Spacemacs englobe aussi Helm, qui est un système de completion sous Emacs. Parmi les systèmes de completion, Helm est très puissant, mais ne plait pas toujours car un peu lourd, un peu invasif. Par exemple pour lancer une fonction Emacs qui s'appelerait find-org-mode-files, tapez "f or es$" et Helm vous affichera toutes les fonctions qui pourraient correspondre à votre recherche.

Spacemacs apporte de superbes choses : par exemples des contributeurs peuvent apporter un menu pour les fichiers python, un menu pour tel ou tel autre chose. Du coup il y a des milliards de trucs à activer ou pas selon ce qu'on veut.

Mais même sans tout activer… Le chargement est très long, et je considère que spacemacs est extrêmement envahissant. Le thème est chouette les 10 premières secondes puis vite ingérable. Cela en devient presque un éditeur à part entière. Enfin d'ailleurs ils appellent cela une distribution de Emacs. Si VIM vous donne l'impression de jouer à Tetris Spacemacs c'est Mario Kart. Avec les peaux de bananes.

Bon si vous aimez VIM ou Evil, essayez Spacemacs un peu.

Hydra

(attention leur explication c'est genre imbitable.com https://github.com/abo-abo/hydra)

Hydra est utilisé par spacemacs (oui ce truc utilise tout, d'où la lenteur et le "bloated"… enfin je dis rien…)

Hydra c'est un système de pop-up qui vous dit sur quoi appuyer pour obtenir quelle fonction, & qui permet de laisser le menu actif tant qu'on le quitte pas. Hydra vous propose surtout de créer vos propres hydra.

Au niveau affichage, ça utilise un mini truc, lv-message, qui permet d'afficher une zone de notification dans Emacs (sous le minibuffer en gros).

Les hydra permettent par exemple de faire une pop-up qui vous dira "g pour aller à gauche, d à droite, h en haut et b en bas", et tant que vous n'appuierez sur rien d'autre que g/d/h/b, le pop-up demeurera.

Par exemple ça peut être pratique pour gérer les fenêtres, ou faire par edit.

NU-MODE utilise un peu hydra & un peu lv-message.

god mode

https://github.com/chrisdone/god-mode

God mode c'est plus un petit hack rigolo.

L'idée est qu'il y a beaucoup de raccourcis claviers dans Emacs qui incluent la touche "contrôle". Genre Ctrl-n / Ctrl-p pour naviguer sur la ligne suivante / précédente , ou Ctrl-f Ctrl-b caractère suivant/précédent.

God Mode propose donc une petite commande qui déclenche l'équivalent de maintenir la touche Contrôle appuyée. Une fois ce "god mode" activé, par exemple taper x f est l'équivalent de Ctrl+x Ctrl+f. On peut aussi gérer les raccourcis Alt en tapant "g" :
par exemple ge est l'équivalent de alt+e.

En gros vous passez dans l'équivalent du mode "normal" de VIM. Appuyer sur n n'insère plus n, mais déclenche la fonction next-line.

Bon c'est rigolo mais c'est du modal au rabais. En pratique je vois mal comment ce serait efficace.

un petit mot sur magit

https://github.com/magit/magit

Magit est une interface à git? Quel rapport? Aucun! Qui a tué le docteur moutarde? ah ben non là vraiment aucun rapport du coup.

Magit, au lancement, se présente comme git status, affiché dans votre éditeur de texte. Gniii? je fais quoi après? pff on voit que vous êtes pas un chaud de Emacs! Emacs c'est toujours du texte magique qui est une interface vers des mondes cachés.

Enfin revenons en au git status affiché dans l'éditeur de texte. Vous appuyez sur "h" comme "help", pardi!! Eh là bon sang de bon diable, Magit vous affiche une jolie popup qui propose une trentaine de touches, telle que "c" pour tout ce qui a rapport aux commits, P au "push", & ainsi de suite. Ensuite il n'y a plus qu'à appuyer & vous lancez la commande.

Un peu comme spacemacs, vous vous souvenez : des menus.

Ces popups magit gèrent les préfixes (par exemple on peut très facilement faire l'équivalent de git commit --amend). Et le mainteneur pense même améliorer ce système pour en faire tout comme une librairie disponible pour la joie & le bonheur d'autres besoins. Ah c'est beau le libre.

Donc quel rapport? Eh bien ce type de popup peut être très clair. Par contre c'est du écrit en dur forcément. On découvre les fonctions disponibles, ça donne appétit. On apprend facilement les raccourcis claviers.

Dired, ou Ibuffer, pour éditer respectivement des fichiers ou les buffers ouverts, auraient énormément gagné à intégrer quelque chose de ce genre. (à la place faire h lance un describe-mode à 2 balles).

Mais peut-être que si magit-popup évolue j'en viendrai à utiliser cette librairie pour NU-MODE. Bref.

ergoemacs

https://ergoemacs.github.io/

ErgoEmacs fut d'abord conçu par Xah Lee. Il a trouvé par la suite un autre mainteneur.

Ergoemacs est très proche de NU-MODE, puisque

  • il implémente certains raccourcis standards
  • il propose une navigation aisée au clavier qui a beaucoup de points communs.

Un peu comme si vous preniez CUA MODE & que vous redéfinissiez pour avoir un clavier un peu standard mais aussi facile.

NU-MODE utilise d'ailleurs, par défaut, le même "paddle" que ErgoEmacs : maintenir Alt et utiliser

  i
j k l

NU-MODE propose aussi le paddle de VIM

  k
h j l

Par contre la force de ErgoEmacs est de gérer des "composants" (on peut activer ou non certains compoants) ; et surtout des "thèmes" :

  • clavier us
  • clavier fr (azerty)
  • dvorak
  • bepo
  • et plein d'autres

voyez ici : https://ergoemacs.github.io/key-setup.html

Xah Lee explique un peu sur cette page le principe (attention ça a un peu évolué depuis! http://ergoemacs.org/emacs/ergonomic_emacs_keybinding.html)

Je trouve ErgoEmacs magnifique, un petit peu difficile à maitriser (là j'écris ce petit bout en l'utilisant, aie) un peu limité en ergonomie car même s'il y a volonté de n'utiliser que Alt et pas Control en pratique ce n'est pas si vrai.

NU-MODE veut aller plus loin, en faisant de Alt un roi et de Control un déchu, et en évitant d'avoir une touche qui fasse un truc avec Alt et rien à voir avec Control.

NU-MODE

  • applique plus largement les raccourcis standards que ErgoEmacs
  • utilise les prompts pour accéder à plein de fonctions, & permettre de découvrir. (donc NU-MODE est bcp plus rapide à maîtriser).
  • en utilisant des hooks pour s'appliquer aux modes (helm, ivy, isearch…)

ERGOEMACS gère plusieurs claviers, là où chez NU-MODE ce serait moyennement logique puisque la lettre à un sens (dans NU MODE s doit sauver, f doit chercher…)

En pratique je pense que l'ergonomie perdue par NU MODE en s'attachant plus fortement à des lettres standards est largement récupérée par ailleurs.

xah fly keys

https://melpa.org/#/xah-fly-keys

(ah enfin je peux désactiver ErgoEmacs!)

xah fly keys je découvre en écrivant ces lignes.

  • c'est un éditeur modal. Vous êtes dans le mode normal VI, et vous devez taper "f" pour passer en mode insertion. En mode insertion, vous pouvez taper du texte. Pour repasser en mode normal, c'est Alt+Space.
  • en mode normal, le paddle i j k l de ErogEmacs est repris. Mais donc sans le Alt.
  • d'autres raccourcis ErgoEmacs sont communs. En mode normal, "c" copy, "v" colle, etc. Vous pouvez aussi utiliser Ctrl+c / Ctrl+v etc.

À première vue ce mode, assez confortable en mode normal, ne se pose pas la question de VI de pouvoir passer en mode insertion de 36 façons différentes. Or VI s'en sort comme cela : si le modal peut passer, c'est justement parce l'on peut i I a A, etc.

Du coup ça ne me motive pas beaucoup pour tester plus.

Bon et NU-MODE alors

Donc, on navigue avec la touche Alt et (haut bas gauche droite) i j k l - sauf si l'on paddle sur le paddle à la VI : k h j l.

(nu-setup-vi-paddle)
On sauve avec s. Mais en général Control+s ne sert à rien. On utilise donc Alt+s pour garder la main sur alt.

On cherche avec f. Mais en général Control+f ne sert à rien. On utilise donc Alt+f pour garder la main sur alt.

Si l'on a besoin d'une fonction "avancée", et qu'il faut donc invoquer un menu, on peut encore garder la main sur alt, car alt+d (un touche très facile sur azerty ou qwerty).

Des aides visuelles apparaitront sur isearch ou ivy par exemple. NU-MODE sera le Emacs le plus facile, dans tous les sens du terme.

Par contre l'utilisation sur Dvorak/Bépo n'aurait aucun sens. Je ne pense pas travailler sur ce point, mais plutôt améliorer l'intégration de nouvelle fonctionnalités (intégrer tel ou tel mode dans nu-mode).

À voir!

  • # [HS] T'as rien compris au Markdown...

    Posté par  . Évalué à -1. Dernière modification le 08 octobre 2017 à 09:49.

    …mais c'est pas grave.

    En faisant toi-même la mise en page et en forçant des sauts de lignes au lieu de faire confiance au système wiki, ton méga-troll^W journal ressemble visuellement à de la poésie :-)

  • # which-key

    Posté par  . Évalué à 5.

    tant pis si ça n'a aucun sens sur bépo…

    Sinon je citerais bien which-key: https://github.com/justbur/emacs-which-key c'est LE package sous-jacent à Spacemacs, celui qui montre contextuellement après un léger délai quels sont les raccourcis et fonctions possibles après une première touche. Donc on peut avoir un petit goût de Spacemacs, et une grande aide, en installant et activant which-key-mode.

    • [^] # Re: which-key

      Posté par  (site web personnel) . Évalué à 2.

      ah pour le bépo cela peut venir du manque de clarté du journal. NU-MODE utilise les raccourcis standards tels que control+f pour chercher ou control+r pour remplacer, control+n nouveau etc. La version Alt de la touche déclenche immédiatement une fonction. Dans le cas replace, ce sera replace-regexp, dans le cas créé un nouveau buffer vierge. Or, par chance, les lettres I J K L qui sont parfaitement alignées pour servir de manette, ne sont pas partie des raccourcis les plus fréquents. On peut donc maintenir en parallèle les deux. Sur un bépo, les lettres i j k l ne sont plus bien placées. Il faudrait par exemple prendre L S R N. Mais alors on empiète sur la première définition, "la touche s doit sauver".

      sinon merci je ne connaissais pas le which-key-mode, seulement where-is / describe-keymap & consorts. Je pensais bêtement que Spacemacs codait sa présentation. Cela dit ça n'arrange en rien le problème d'ergonomie, c'est une option pour découvrir. Qui pourrait être intéressant pour le cas Ctrl-c.

  • # Un éditeur pour terminal NORMAL?

    Posté par  (site web personnel) . Évalué à 2.

    Le mode CUA a l'air intéressant, mais est-ce qu'il existe un éditeur de texte pour terminal normal ? Une sorte de gedit/mousepad/geany/… en mode console pour ne pas se tordre les mains avec Emacs ou passer 2h à chercher comment quitter comme avec VI?

    Le post ci-dessus est une grosse connerie, ne le lisez pas sérieusement.

  • # Quel développements futurs prévus ?

    Posté par  . Évalué à 1.

    Merci pour cet article, car je suis dans la même recherche que toi, mais tu as été beaucoup plus loin dans l'évaluation des différents modes possibles.

    Comme toi, j'aimerais aussi arriver à une gestion plus simple (et moins fatiguante en terme d'activation) des raccourcis claviers, et en minimisant aussi l'effort de mémorisation.

    Dans ta recherche, as tu aussi fait une comparaison des mode de gestion des menus/choix/complétion entre Lacarte/Icicles, ido, helm ou les keychord like ?

    Pour ma part, je suis actuellement en période d'essai sur spacEmacs (sur une machine), mais en étant dans le mode, pardon style, non modal de spacEmacs (ou dans le style dit hybride). Je suis plutôt content aussi de l'utilisation de which-key car pas besoin de tout re-documenter.

    Hydra, effectivement c'est une autre histoire pour l'aspect performance.

    Un des autres points fort de spacEmacs est la gestion des configurations, la même chose est en cours de réflexion pour Nu-Mode ?

    Gros utilisateur d'org-mode et de yasnipet, je suis justement content que spacEmacs est des trucs prévus par défaut, c'est prévu pour Nu-mode ?

    En fonction de tes réponses, je ferais certainement un essai de ce mode.

    • [^] # Re: Quel développements futurs prévus ?

      Posté par  (site web personnel) . Évalué à 3.

      Lacarte : de ce que je comprends ça reprend simplement, sous une autre forme, le menu "natif". Equivalent de la barre de menu en raccourcis clavier.
      Ce qui me dérange est que le menu n'est pas modal. C'est à dire qu'on a toujours les mêmes options, mais un menu correspondant au mode majeur s'ajoute simplement.

      Même si NU-MODE n'est pas encore super évolué sur ce point, je souhaite des menus plus réactifs qui s'adaptent bien au mode majeur & si possible aux modes mineurs, & s'il y a une sélection ou pas (mark set).
      On pourrait même aller plus loin sur org (est-ton sur un headline? un tableau?)
      A cet effet je vais isoler le code, par ex lié à org-mode, dans un fichier. Ceci me permettra de réperer les macros qui manqueraient pour intégrer nu-mode à org-mode. Les macros pourront ensuite être réutilisées ailleurs.
      En pratique les macros ce sera très simple : tout juste revoir le contenu des menus, peut être un petit advice ou hook que les macros pourraient faciliter.

      Helm j'ai pas mal utilisé mais j'en suis revenu. Trop lourd, pas assez intuitif. Mais NU-MODE intègre une possibilité pour helm. Donc le style de completion est indépendant de NU-MODE : le user peut utiliser helm, ido, ivy. Ivy est simplement par défaut.

      Yasnippet il y aurait deux voies. Aujourd'hui NU-MODE rebind Ctrl-Space sur le préfixe "C-c". On peut donc utiliser tous les raccourcis mode majeur / mode mineur / utilisateur. Yasnippet en fait partie. Donc cette voie là il n'y a rien à coder. je pense seulement améliorer cette partie en faisant de Ctrl-Space un menu qui listera tous les raccourcis C-c. Cf ci dessous pourquoi ce n'est pas déjà fait.

      Donc ça c'est pour la voie 1, "yasnippet est en fait déjà intégré dans NU-MODE et cette intégration va s'améliorer un peu".
      Ensuite il y aurait la voie 2. Dès lors que yasnippet est actif, il faut revoir le menu insert pour intégrer les fonctiosn yasnippet. Ou ce genre d'intégration.

      pourquoi lister les raccourcis C-c est un peu embêtant?
      => je ne trouve pas de fonction lisp native pour ça (mode-specific-map n'étant pas vraiment une keymap), il faut se reposer sur une fonction c qui génère un buffer contenant les raccourcis , puis le parser. Un peu moche!

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.