Dans Emacs, tout ressemble à un service
(yummymelon.com)- Emacs, plutôt qu’un système d’exploitation à part entière, orchestre des applications et des utilitaires au-dessus du noyau, et devient le client de divers services en s’appuyant sur le système de fichiers, le réseau et des programmes externes
- Les couches UI, communication et stockage local nécessaires à un client peuvent être construites avec des bibliothèques intégrées comme le minibuffer, les buffers, URL, TCP/UDP, JSON et SQLite
- Emacs Lisp (Elisp), un langage dynamique, permet de combiner à l’exécution des fonctions Elisp et des commandes shell afin d’orchestrer avec souplesse les capacités accessibles à Emacs
- L’exemple de commande
wttrreçoit un lieu en entrée, envoie une requête HTTP à wttr.in, extrait de JSON la région, la température et la météo, les affiche dans le minibuffer puis les enregistre aussi dans le kill ring - Le fichier complet
wttr.elfait 67 lignes seloncloc, et l’on peut créer un client Elisp encore plus court en confiant les requêtes réseau et le traitement JSON à des outils en ligne de commande comme Python, faisant ainsi de la commande shell elle-même un service
Emacs orchestre des services au-dessus du système d’exploitation
- Dire qu’Emacs est un système d’exploitation n’est pas exact, mais la comparaison vient de sa capacité à orchestrer des applications et des utilitaires au-dessus du noyau du système d’exploitation
- Il peut accéder avec ses fonctions intégrées à des services du système d’exploitation comme le système de fichiers et le réseau, et exécuter d’autres programmes, ce qui facilite la composition à la volée d’un comportement de client dans Emacs
- Comme de nombreuses tâches informatiques peuvent être prises en charge via différents modes clients, l’idée qu’un utilisateur « vit uniquement dans Emacs » tient aussi la route
Le modèle client-serveur vu à travers les requêtes et les réponses
- Le modèle client-serveur est un schéma d’interaction où un service qui fournit des ressources et un client qui les demande se partagent le travail
- Le client envoie une requête
- Le serveur traite la requête puis renvoie une réponse
- Une transaction faite de requête et de réponse peut passer par le réseau ou être exécutée localement au sein d’un même système
- Le modèle réseau a été largement développé dans le cadre de l’architecture logicielle de style REST
Les trois zones qui composent un client Emacs
- Un client classique prend en charge les trois zones suivantes
- UI : gère l’entrée et la sortie utilisateur selon les besoins
- Frontière client (Client Edge) : communique avec le service ; dans un client réseau, c’est le sous-système réseau qui joue ce rôle
- Base de données locale : représente les données échangées ou synchronisées avec le serveur, avec une gestion qui varie selon les exigences d’implémentation
-
Composition de l’interface utilisateur
- Emacs fournit plusieurs fonctions intégrées pour construire une UI client
- Minibuffers
- Buffers
- Completion
- Tabulated List Mode
- Variable Pitch Table(vtable)
- Transient
-
Communication avec le service et transformation des données
- Pour la frontière client connectée au service, on peut s’appuyer sur les fonctions suivantes
- La sérialisation et la désérialisation utilisent des parseurs intégrés
-
Gestion des données locales
- Pour la représentation locale des données serveur, on peut utiliser des collections Elisp
- Si un stockage local persistant est nécessaire, on peut utiliser SQLite
- La complexité d’un client réel dépend des besoins et, s’il existe déjà des utilitaires en ligne de commande pour les traitements lourds, ils peuvent être reconfigurés comme des services accessibles via le shell
Comment Elisp combine les fonctionnalités
- Toutes les bibliothèques ci-dessus sont accessibles depuis Emacs Lisp (Elisp)
- Elisp est un langage de programmation dynamique qui autorise une composition improvisée de haut niveau à l’exécution
- Des fonctions Elisp jusqu’aux commandes shell, il permet de combiner les comportements dont Emacs peut se servir pour orchestrer des flux complexes
Implémentation d’un client météo wttr.in
- wttr.in est un service web de prévisions météo orienté console, qui prend en charge la sortie JSON
- La commande
wttrpour Emacs fonctionne dans l’ordre suivant- demander un lieu à l’utilisateur
- générer l’URL de requête vers wttr.in
- envoyer la requête HTTP
- traiter la réponse JSON
- afficher le résultat dans le minibuffer et l’enregistrer dans le kill ring
- si une erreur survient pendant le traitement, afficher un message d’erreur dans le minibuffer
-
Construire l’URL de requête
wttr--request-urlutilisehttps://wttr.incomme URL de base- Il remplace les espaces du lieu saisi par
+et construit une requête sous la forme/<location>?0&format=j1 - L’URL finale est ensuite transmise à la fonction de récupération du JSON
-
Requête HTTP et parsing JSON
fetch-json-as-hash-tablerécupère l’URL de manière synchrone avecurl-retrieve-synchronously- Si aucune donnée n’est récupérée, il déclenche l’erreur
Failed to fetch data from <URL> - Dans le buffer de réponse, il se déplace après les en-têtes de métadonnées HTTP, puis convertit le contenu restant en
hash-tableElisp avecjson-parse-buffer - Une fois le traitement terminé, il supprime toujours le buffer réseau téléchargé afin d’éviter les fuites mémoire
-
Assemblage du message météo
wttr--report-messageextrait les valeurs suivantes des données JSON- le nom du lieu le plus proche
- la région
- le pays
- la température actuelle en Celsius
temp_C - la température actuelle en Fahrenheit
temp_F - la description météo
weatherDesc
- Il relie les éléments de localisation non vides par des virgules et produit un résultat au format
lieu : Celsius, Fahrenheit description météo - L’implémentation complète est disponible dans le code source de wttr.el
Utiliser aussi les outils en ligne de commande comme services
- L’API Emacs fournit un niveau d’abstraction élevé et
wttr.el, qui implémente directement la requête HTTP et le traitement JSON, ne fait que 67 lignes seloncloc - Une alternative plus simple consiste à confier la requête réseau réelle et le traitement JSON à un script Python nommé
weather- la commande Elisp
weatherdemande un lieu à l’utilisateur - elle compose une commande shell
weatheren y ajoutant le lieu comme argument - elle exécute la commande avec
shell-command-to-string - elle enregistre le résultat renvoyé dans le kill ring et l’affiche dans le minibuffer
- la commande Elisp
- Dans cette configuration, la commande shell devient le service qui reçoit la requête, et la fonction Elisp joue le rôle de client
- Grâce au caractère dynamique d’Elisp, il est possible de combiner selon les besoins bibliothèques Elisp et utilitaires en ligne de commande ; c’est cette capacité d’intégration qui permet de traiter, dans Emacs, tout comme un service
1 commentaires
Commentaires sur Hacker News
C’est seulement parce que la lignée des Lisp Machines n’est pas devenue dominante qu’Emacs donne l’impression d’être un système d’exploitation
« Symbolics Lisp Machine demo »
https://www.youtube.com/watch?v=o4-YnLpLgtk
« Emacs and Lisp »
https://funcall.blogspot.com/2025/04/emacs-and-lisp.html
Lucid a forké Emacs en XEmacs pour tenter de mettre en œuvre l’une des premières idées du LSP, et la plupart des fonctionnalités de l’époque ont depuis été réintégrées dans Emacs
https://dreamsongs.com/Cadillac.html
« Lucid Energize Demo »
https://www.youtube.com/watch?v=pQQTScuApWk
Si l’on définit
client,serveretrequestde manière suffisamment large, on peut faire entrer n’importe quoi dans une architecture client/serveur. C’est un peu comme quand on s’efforçait de soutenir qu’Emacs suivait la philosophie Unix simplement parce qu’une fonction LISP fait bien une seule choseLa plupart des gens peuvent admettre qu’Emacs reprend les idées des machines LISP et qu’on peut y implémenter à peu près tout ce qu’on veut. Il s’intègre très bien avec les outils CLI, mais il n’est pas clair ce qu’on gagne à appeler cela du client/serveur
Il a absorbé des fonctionnalités au fil de plusieurs modes sur des décennies, et il contient même en interne le moteur d’analyse sémantique CEDET, aujourd’hui presque plus utilisé. Puis le LSP est arrivé, et maintenant c’est l’ère des agents, mais Emacs fonctionne aussi plutôt bien comme frontend pour agents
J’utilise Emacs depuis plus de 25 ans, mais dans l’entreprise où j’ai changé l’an dernier, on ne me laisse pas l’utiliser, même pour des tâches auxquelles Emacs est particulièrement bien adapté. La raison invoquée est que toute l’équipe doit utiliser les mêmes outils, et je n’ai pas réussi à convertir les autres à Emacs
Je me retrouve donc à utiliser, de manière bien plus inefficace, des outils à usage unique séparés selon les tâches, tout en devant sans cesse apprendre de nouvelles UI et de nouveaux mappings de touches
Les responsables diront qu’il faut utiliser Visual Studio Code sur tous les nouveaux projets, mais le modèle de consommation utilisé n’est même pas pris en charge par VSCode. Tant qu’on respecte Git et les procédures de déploiement, chacun devrait pouvoir choisir l’éditeur avec lequel il travaille le mieux, mais j’imagine qu’on me répondrait que c’est risqué parce que c’est de l’open source non pris en charge par Microsoft et un logiciel non validé par l’entreprise
Emacs est mon outil central au quotidien, donc s’il était interdit, j’envisagerais de démissionner. Les responsables n’essaient ni de comprendre ni de raisonner logiquement ; ils se contentent de suivre les directives d’un autre service IT
Si l’entreprise a imposé un éditeur de texte généraliste, il vaut la peine de vérifier si lancer Notepad pose aussi problème, ou si elle a même imposé un outil personnel de gestion des tâches. Il suffit de trouver une catégorie d’usage qu’Emacs peut couvrir mais pour laquelle l’entreprise n’a pas encore imposé d’outil, et de l’installer pour cet usage
Emacs est une plateforme, et un système d’exploitation n’est lui aussi qu’une plateforme parmi d’autres. Une plateforme est une couche logicielle conçue pour permettre de construire de nouvelles choses au-dessus, donc la bonne question est de savoir si telle plateforme X convient à ce qu’on veut construire, Y
Pour moi, X est souvent Emacs, mais cela peut aussi être Racket ou Rust. Un outil qui est à la fois une application et une bonne plateforme mérite davantage d’investissement d’apprentissage qu’une simple application
Le moment où j’ai assez utilisé Emacs pour comprendre « Emacs est un système d’exploitation » comme une idée crédible, et non comme une blague, a marqué un tournant important dans ma carrière
J’ai commencé à utiliser Emacs il y a quelques années pour essayer org mode, et c’est sa flexibilité extrême qui m’a fait rester
init.elsérieusementEmacs ressemble davantage à un environnement de programmation avec un éditeur de texte intégré. Si on le compare à certaines images Smalltalk, cela en fait un outil assez fascinant
Emacs n’est pas un système d’exploitation mais se rapproche davantage d’un shell, même si la notion même de shell n’est pas largement comprise
viest en réalité plus proche d’un shell. Il doit déléguer beaucoup de fonctionnalités à d’autres programmes Unix standard via:.!Emacs, en revanche, inclut toutes sortes de fonctions dans une unique distribution géante, un peu comme un système d’exploitation
J’ai récemment trouvé une courte vidéo d’introduction qui me semble bien adaptée pour montrer Emacs à quelqu’un qui ne l’utilise pas
https://www.youtube.com/watch?v=mJZDmO5yOxE
init.eld’Anon Emoose m’intrigue vraimentEmacs lui-même peut être exécuté en client et serveur. On lance le serveur avec
emacs --daemon, puis on s’y connecte avecemacsclient; toutes les instances, terminal et GUI, utilisent alors le même serveur et partagent les fichiers ouverts ainsi que les buffersMalheureusement, cela ne fonctionnait qu’en local, et j’ai essayé sans succès de rediriger le socket du serveur Emacs via ssh pour me connecter depuis un client distant
emacsclientn’était pas très bon. Quelqu’un qui découvrirait Emacs pour la première fois en 2026 pourrait facilement s’attendre à ce que, comme un client REST, il synchronise l’état d’exécution du client et du serveur via le réseauIci, client et serveur désignent en fait une structure où le client envoie de simples commandes de contrôle via un domaine local Unix, c’est-à-dire un socket du système de fichiers. La prise en charge des sockets réseau est arrivée ensuite, mais ce que le client envoie reste malgré tout de simples commandes de contrôle
ssh -Xpermet d’afficher les frames d’un Emacs distant sur votre serveur X local. Attention toutefois : avec un build GTK non PGTK, fermer une nouvelle frame peut faire planter l’Emacs distant