tag:linuxfr.org,2005:/tags/ligne/publicLinuxFr.org : les contenus étiquetés avec « ligne »2023-12-29T13:52:48+01:00/favicon.pngtag:linuxfr.org,2005:News/417582023-11-17T11:31:16+01:002023-11-18T08:08:22+01:00Comparaison critique de systèmes d'invite de commandeLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Cet article a été écrit à l’occasion de <a href="https://github.com/liquidprompt/liquidprompt/releases/tag/v2.2.0-rc.1">l’imminence de la sortie de la version 2.2 de Liquid Prompt</a> et vous aurez l’occasion de pouvoir en discuter avec son auteur lors des journées <a href="https://capitoledulibre.org/">Toulouse Capitole du Libre</a>, qui proposera une conférence sur <a href="https://cfp.capitoledulibre.org/cdl-2023/talk/KYLR9C/">Liquid Prompt : repenser en profondeur le design du prompt shell</a>.</p>
<h2 id="toc-tldr-résumé">TL;DR: résumé</h2>
<p>Si vous utilisez la ligne de commande, vous gagneriez à utiliser un bon système d’invite de commande (« prompt ») au lieu de la configuration par défaut. Parmi les sept systèmes de prompt les plus connus, certains sont mieux conçus et d’autres prennent mieux en charge certaines fonctionnalités.</p>
<p>Mes principales conclusions sont les suivantes :</p>
<ul>
<li>Si vous recherchez le système qui offre la meilleure expérience globale à l’utilisateur, vous devriez probablement utiliser Liquid Prompt.</li>
<li>Si la faible latence est plus importante pour vous que les fonctionnalités, vous devriez miser sur PowerLevel10k.</li>
<li>Si vous êtes un développeur qui jongle en permanence avec plusieurs jeux d’outils, Starship semble être la meilleure option pour vous.</li>
</ul>
<p>Cet article est divisé en deux parties principales : la première introduit le sujet et présente les principales évaluations ; la deuxième partie entre dans les détails des designs et des fonctionnalités. Enfin, la conclusion donne des conseils sur le choix d’un prompt et propose quelques idées sur l’avenir des systèmes de prompts.</p>
</div><ul></ul><div><h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li>
<a href="#toc-introduction">Introduction</a><ul>
<li><a href="#toc-quest-ce-quun-prompt">Qu’est-ce qu’un prompt ?</a></li>
<li><a href="#toc-les-concurrents">Les concurrents</a></li>
<li><a href="#toc-ce-dont-vous-avez-besoin-cest-du-design-de-linformation">Ce dont vous avez besoin, c’est du design de l’information</a></li>
<li><a href="#toc-toutes-les-fonctionnalit%C3%A9s-ne-naissent-pas-%C3%A9gales">Toutes les fonctionnalités ne naissent pas égales</a></li>
</ul>
</li>
<li>
<a href="#toc-design">Design</a><ul>
<li><a href="#toc-si-vous-vous-sentez-sexy-vous-avez-lair-sexy">Si vous vous sentez sexy, vous avez l’air sexy</a></li>
<li><a href="#toc-un-segment-pour-les-gouverner-tous">Un segment pour les gouverner tous</a></li>
<li>
<a href="#toc-la-force-r%C3%A9side-dans-la-diversit%C3%A9-pas-dans-la-similitude">La force réside dans la diversité, pas dans la similitude</a><ul>
<li><a href="#toc-la-simplicit%C3%A9-ne-passe-pas-%C3%A0-l%C3%A9chelle">La simplicité ne passe pas à l’échelle</a></li>
<li><a href="#toc-d%C3%A9claration-contre-innovation">Déclaration contre Innovation</a></li>
</ul>
</li>
</ul>
</li>
<li>
<a href="#toc-fonctionnalit%C3%A9s">Fonctionnalités</a><ul>
<li><a href="#toc-les-fonctionnalit%C3%A9s-essentielles-sont-essentielles">Les fonctionnalités essentielles sont essentielles</a></li>
<li><a href="#toc-prendre-soin-de-lenvironnement">Prendre soin de l’environnement</a></li>
<li><a href="#toc-il-est-temps">Il est temps</a></li>
</ul>
</li>
<li>
<a href="#toc-conclusion">Conclusion</a><ul>
<li><a href="#toc-certains-sont-out">Certains sont <em>out</em></a></li>
<li><a href="#toc-certains-sont-in">Certains sont <em>in</em></a></li>
</ul>
</li>
<li><a href="#toc-vers-le-service-et-au-del%C3%A0">Vers le service et au-delà</a></li>
</ul>
<h2 id="toc-introduction">Introduction</h2>
<p>Avertissement : je suis l’auteur original de Liquid Prompt. Au début, j’ai fait cette étude approfondie pour savoir si je devais continuer à m’intéresser à Liquid Prompt ou passer à un autre système. Je vais essayer d’expliquer ici pourquoi je pense toujours que c’est l’un des meilleurs systèmes de prompt du marché.</p>
<p>Tous les systèmes de prompt comparés ici sont de bons logiciels libres, je me concentrerai donc ici sur l’utilité de leurs fonctionnalités, plutôt que de m’attarder sur la qualité du code ou la facilité d’installation.</p>
<h3 id="toc-quest-ce-quun-prompt">Qu’est-ce qu’un prompt ?</h3>
<p>Il existe deux types d’informaticien·ne·s : celleux qui utilisent la ligne de commande et celleux qui sont à la retraite. Même les développeurs qui adoptent des interfaces de développement très intégrées disposent d’une sorte de terminal dans certains panneaux de leur IDE. Qu’on le veuille ou non, l’interpréteur de commandes fait partie intégrante de la vie quotidienne de la plupart des personnes qui attendent de leur ordinateur qu’il travaille pour elles.</p>
<p>L’interpréteur de commandes (le « shell ») a accès à de nombreuses informations sur l’ordinateur. Et la plupart de ces informations concernent l’état actuel de l’environnement de travail, ce qui est du plus haut intérêt pour l’utilisateur. Cependant, par défaut, le shell n’affiche que très peu d’informations, à moins que vous ne les demandiez expressément. En outre, le seul endroit de l’écran disponible pour l’affichage permanent de quoi que ce soit est le prompt.</p>
<p>Le prompt est cette chaine de caractères affichée juste devant la ligne où vous tapez vos commandes. Dans la configuration par défaut la plus courante, elle n’affiche que trois informations : l’utilisateur, le nom d’hôte et le chemin d’accès <code>user@hostname:path $</code>.</p>
<p>Mais il peut en afficher davantage ! C’est l’objectif des systèmes de prompt. Ces prompts (pour faire court) ajoutent en fait beaucoup d’informations à cette partie de la ligne de commande. Par exemple, la fonctionnalité la plus courante est d’afficher l’état du dépôt Git dans lequel se trouve l’utilisateur.</p>
<h3 id="toc-les-concurrents">Les concurrents</h3>
<p>Comme c’est souvent le cas avec les logiciels destinés aux utilisateurs chevronnés, le marché est très fragmenté : il existe une tonne de prompts disponibles. Beaucoup de gens semblent aimer programmer leur prompt à partir de zéro et le déposer sur GitHub.</p>
<p>Dans le cadre de cet article, je n’ai pris en compte que sept prompts. Parmi les plus populaires, d’après le nombre d’articles de fans trouvés par Google et d’après les étoiles sur GitHub :</p>
<ul>
<li>
<a href="https://github.com/romkatv/powerlevel10k">PowerLevel10k</a>, le plus populaire,</li>
<li>
<a href="https://github.com/starship/starship">Starship</a>, celui programmé en Rust, et <a href="https://github.com/spaceship-prompt/spaceship-prompt">Spaceship</a>, son origine (dans ce qui suit, les deux sont considérés comme un seul système, étant donné leur similarité, mais vous voudrez probablement utiliser Starship de toute façon),</li>
<li>
<a href="https://github.com/powerline/powerline">Powerline</a>, qui fait des lignes de statut,</li>
<li>
<a href="https://github.com/sindresorhus/pure">Pure</a>, le système minimal au succès surprenant,</li>
<li>
<a href="https://ohmyposh.dev">Oh-My-Posh</a>, le système portable,</li>
<li>
<a href="https://github.com/nojhan/liquidprompt">Liquid Prompt</a>, le plus ancien (historiquement parlant).</li>
</ul>
<p>Il convient de noter que le nombre d’étoiles n’est pas nécessairement lié à l’âge du logiciel. Par exemple, Liquid Prompt a été lancé en 2010, tandis que Powerlevel* a été lancé en 2015 et Starship en 2019.</p>
<h3 id="toc-ce-dont-vous-avez-besoin-cest-du-design-de-linformation">Ce dont vous avez besoin, c’est du design de l’information</h3>
<p>La raison d’être d’un prompt c’est qu’il est utile d’avoir un accès immédiat à l’état actuel du système. Le fait de voir un changement d’état à l’endroit même où l’utilisateur regarde habituellement est un très bon retour d’information sur ses actions. Mais, bien entendu, ce retour d’information ne doit pas entraver le travail de l’utilisateur.</p>
<p>Les états doivent être choisis et affichés en fonction de leur importance pour le travail de l’utilisateur. Plus précisément, un bon prompt est un prompt qui est :</p>
<ul>
<li>
<strong>focus</strong> : il vise les états qui sont réellement utiles à l’utilisateur au cours d’une session de travail,</li>
<li>
<strong>transparent</strong> : il n’entraîne pas de friction avec le processus de travail de l’utilisateur,</li>
<li>
<strong>ciblé</strong> : il vise des états qui peuvent changer d’eux-mêmes ou être changés par l’utilisateur,</li>
<li>
<strong>mesuré</strong> : il tient compte du fait que certains états changent moins souvent que d’autres (et évite ainsi d’être une simple collection d’états qui ne changent que rarement),</li>
<li>
<strong>accentué</strong> : il rend plus visible le retour d’information concernant les changements d’état les plus importants, tout en ne polluant pas la visibilité des états stables/anecdotiques,</li>
<li>
<strong>configurable</strong> : il est facile d’adapter immédiatement l’affichage des informations, si nécessaire.</li>
</ul>
<p>En d’autres termes, un bon système d’alerte doit être bien conçu.</p>
<p>Mon évaluation de la conception générale des candidats est résumée dans le tableau suivant :</p>
<table>
<thead>
<tr>
<th>Prompt</th>
<th>Focus</th>
<th>Transparent</th>
<th>Ciblé</th>
<th>Mesuré</th>
<th>Accentué</th>
<th>Configurable</th>
</tr>
</thead>
<tbody>
<tr>
<td>Liquid Prompt</td>
<td>🌟🌟🌟</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>🌟🌟🌟</td>
<td>🌟🌟🌟</td>
<td>🌟🌟🌟</td>
</tr>
<tr>
<td>PowerLevel10k</td>
<td>⭐⭐</td>
<td>🌟🌟🌟</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
</tr>
<tr>
<td>Oh-My-Posh</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>⭐</td>
<td>⭐⭐</td>
</tr>
<tr>
<td>Pure</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>⭐</td>
<td>⭐⭐</td>
</tr>
<tr>
<td>*ship</td>
<td>⭐</td>
<td>⭐⭐</td>
<td>⭐</td>
<td>⭐</td>
<td>⭐</td>
<td>⭐⭐</td>
</tr>
<tr>
<td>Powerline</td>
<td>⭐</td>
<td>⭐⭐</td>
<td>⭐</td>
<td>⭐</td>
<td>⭐</td>
<td>⭐</td>
</tr>
</tbody>
</table>
<p>La section « design » de l’article (voir ci-dessous) explique plus en détail pourquoi.</p>
<h3 id="toc-toutes-les-fonctionnalités-ne-naissent-pas-égales">Toutes les fonctionnalités ne naissent pas égales</h3>
<p>Quels types de fonctionnalités nos six candidats proposent-ils ? On peut considérer six catégories (de la plus importante à la moins importante) :</p>
<ul>
<li>
<strong>l’essentiel du shell</strong> : les fonctionnalités que l’on trouve habituellement dans un prompt classique (chemin, utilisateur, codes de sortie…), qui sont utiles au quotidien (tâches, capteurs, intégration de multiplexeurs…), ou qui sont généralement considérées comme importantes (thèmes…).</li>
<li>la <strong>gestion de version</strong> : Git, Mercurial, etc.</li>
<li>
<strong>environnements</strong> : détection de configuration dynamique (virtual env, variables shell, conteneurs…).</li>
<li>
<strong>versions des outils</strong> : version actuelle d’outils spécifiques (langages de programmation, chaines de construction, outils…).</li>
<li>
<strong>fonctions diverses</strong> : fonctions liées au shell considérées comme moins importantes (réseau, titre du terminal, liens hypertextes…).</li>
<li>
<strong>services</strong> : services fonctionnant en permanence, en ligne ou sur la machine (musique, météo…).</li>
</ul>
<p>Ces catégories sont délimitées en fonction de l’utilisation principale du terminal :</p>
<ul>
<li>Les fonctionnalités de la catégorie « l’essentiel du shell » sont celles dont vous aurez le plus souvent besoin, quoi que vous fassiez dans votre terminal.</li>
<li>Si vous êtes programmeur, vous porterez une attention particulière aux catégories <em>gestion de version</em> et <em>environnements</em>.</li>
<li>Si vous êtes développeur, la catégorie <em>version des outils</em> vous intéressera également.</li>
<li>Si vous faites de l’administration système, la catégorie <em>divers</em> peut contenir des fonctionnalités marginalement intéressantes.</li>
<li>Si vous avez besoin de fonctionnalités dans la catégorie des services, vous avez probablement mal compris ce qu’est une interface de ligne de commande, ou vous recherchez une barre d’état (ce qu’un système de prompt peut être).</li>
</ul>
<p>Mon évaluation de la prise en charge globale de chaque ensemble de fonctionnalités est résumée dans le tableau suivant :</p>
<table>
<thead>
<tr>
<th>Prompt</th>
<th>Essentiels</th>
<th>Gestion de version</th>
<th>Environnements</th>
<th>Versions d’outils</th>
<th>Divers</th>
<th>Services</th>
</tr>
</thead>
<tbody>
<tr>
<td>Liquid Prompt</td>
<td>🌟🌟🌟</td>
<td>🌟🌟🌟</td>
<td>🌟🌟🌟</td>
<td>⭐</td>
<td>⭐⭐</td>
<td>_</td>
</tr>
<tr>
<td>*ship</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>🌟🌟🌟</td>
<td>🌟🌟🌟</td>
<td>⭐</td>
<td>_</td>
</tr>
<tr>
<td>PowerLevel10k</td>
<td>⭐⭐</td>
<td>⭐</td>
<td>🌟🌟🌟</td>
<td>⭐⭐</td>
<td>⭐⭐</td>
<td>⭐</td>
</tr>
<tr>
<td>Oh-My-Posh</td>
<td>⭐</td>
<td>⭐⭐</td>
<td>⭐</td>
<td>⭐⭐</td>
<td>⭐</td>
<td>⭐⭐</td>
</tr>
<tr>
<td>Powerline</td>
<td>⭐</td>
<td>⭐</td>
<td>⭐</td>
<td>_</td>
<td>⭐⭐</td>
<td>🌟🌟🌟</td>
</tr>
<tr>
<td>Pure</td>
<td>⭐</td>
<td>⭐</td>
<td>_</td>
<td>_</td>
<td>_</td>
<td>_</td>
</tr>
</tbody>
</table>
<p>La section « fonctionnalités » ci-dessous explique en détail comment certains prompts prennent en charge certaines de ces catégories.</p>
<h2 id="toc-design">Design</h2>
<p>Chaque système de prompt possède une culture sous-jacente, née de son histoire, qui transparait dans sa conception.</p>
<p>Par exemple, Powerline a eu un impact considérable sur l’adoption de caractères supplémentaires dans les polices « patchées ». Liquid Prompt a ciblé, dès le début, des caractéristiques proches du shell lui-même, tout en mettant l’accent sur le design. D’un autre côté, PowerLevel10k a été conçu pour être aussi rapide que possible. Étonnamment, Starship a également commencé avec la promesse d’être rapide, bien qu’il ne se rapproche même pas de PowerLevel10k (un bon exemple de la façon dont l’impact des langages est surestimé). Il rassemble cependant une grande communauté, qui à son tour fournit des tonnes d’outils de support. A titre de contre-exemple, Pure a démarré sur la promesse d’être ascétique en termes de fonctionnalités, et s’en est tenu à cette idée.</p>
<h3 id="toc-si-vous-vous-sentez-sexy-vous-avez-lair-sexy">Si vous vous sentez sexy, vous avez l’air sexy</h3>
<p>En ce qui concerne le design, les prompts candidats peuvent être répartis en trois catégories :</p>
<ul>
<li>ceux qui soutiennent que le plus simple est le mieux (Pure et *ship),</li>
<li>ceux qui aiment le look classique des « chevrons » (Powerline et Oh-My-Posh),</li>
<li>ceux qui accordent une attention particulière au design (Liquid Prompt et PowerLevel10k).</li>
</ul>
<p>L’équipe de Pure, par exemple, affirme très clairement qu’il est « joli et minimal ». Et par joli, elle entend « livré avec le parfait caractère de prompt » (sic, c’est « ❯ ») et utilise des couleurs pastel. Son aspect par défaut est assez clairement partagé avec Starship, même s’il permet de configurer certains thèmes en utilisant également le look chevrons. Dans la documentation de cette catégorie de design de prompts, il n’y a pas beaucoup d’explications sur la raison pour laquelle les choses sont affichées (ou non).</p>
<p>La deuxième catégorie suit plus ou moins la même philosophie, en pensant seulement que ce qui est joli, c’est d’avoir un arrière-plan coloré au lieu d’un avant-plan, d’utiliser une police de caractères patchée pour séparer joliment les segments, et d’utiliser des icônes partout.</p>
<p>Bien entendu, vous trouverez des systèmes permettant une certaine configuration des icônes ou des couleurs, afin de reproduire l’un ou l’autre style (Starship et Oh-My-Posh proposent des thèmes dans les deux styles, Liquid Prompt et PowerLevel10k ont des thèmes reproduisant les deux, fonctionnalités comprises).</p>
<p>La dernière catégorie, cependant, va plus loin dans les détails lorsqu’il s’agit d’expliquer pourquoi elle montre les choses de telle ou telle manière, et permet plus généralement un ensemble plus varié de thèmes.</p>
<p>PowerLevel10k va jusqu’à fournir un assistant de configuration pour construire le thème que vous préférez, en combinant plusieurs caractéristiques (nombre de lignes, caractère de séparation, etc.) Cependant, en dehors des capacités techniques impressionnantes, l’approche globale de la conception consiste à afficher ce qui doit être affiché sous forme de segments colorés flashy avec des icônes.</p>
<p>Liquid Prompt fournit des thèmes prêts à l’emploi et dispose de l’ensemble le plus diversifié. Certains de ses thèmes n’ont pas d’équivalent chez les autres systèmes, et changent beaucoup de la « série de segments » de tous les autres prompts.</p>
<h3 id="toc-un-segment-pour-les-gouverner-tous">Un segment pour les gouverner tous</h3>
<p>Un exemple intéressant de l’importance de l’approche de design est la façon dont Powerline et Liquid Prompt indiquent à l’utilisateur qu’il se trouve dans une session multiplexée (ce sont les deux seuls à disposer de cette fonctionnalité). Les multiplexeurs de terminaux sont des systèmes qui permettent d’avoir plusieurs sessions permanentes sur une machine, et de les détacher/attacher à volonté. Les plus connus sont screen et tmux.</p>
<p>Powerline affichera un segment coloré indiquant le nombre de clients tmux attachés à la session. Liquid Prompt a divisé son support en deux informations différentes : il affichera d’abord le nombre de sessions détachées, et colorera ensuite les crochets entourant le noyau de l’invite (nom d’utilisateur, hôte, chemin) s’il se trouve actuellement dans une session multiplexeur. L’indice visuel est subtil, mais si l’on y réfléchit, il est logique, car c’est « autour » de ce qui change avec la connexion. Il n’est pas nécessaire d’utiliser beaucoup d’espace pour rappeler à l’utilisateur cette information, qui sera constante au cours d’une session de travail.</p>
<p>Un autre exemple est la façon dont Starship et Liquid Prompt indiquent que sudo est actif. Starship affichera une icône (d’un assistant), tandis que Liquid Prompt changera la couleur de la marque d’invite, près de l’endroit où l’utilisateur tape des commandes, puisque les informations d’identification sudo peuvent avoir un impact considérable sur leur effet.</p>
<p>Le même type de différence se produit lors d’une connexion SSH : Starship affiche une autre icône, à côté du nom d’hôte. Liquid Prompt affiche le nom d’hôte avec sa propre couleur. Les deux peuvent être configurés pour n’afficher le nom d’hôte que lors d’une connexion via SSH. Oh-My-Posh affiche un segment avec une icône, et PowerLevel10k affiche à la fois le nom d’utilisateur et le nom d’hôte sous SSH, mais n’indique pas si l’utilisateur a été commuté localement, comme les autres.</p>
<p>La même approche s’applique à l’affichage des droits d’écriture ou du support X11 : Liquid Prompt change la couleur d’un caractère existant, tandis que les autres prompts ont tendance à ajouter un nouveau segment/une nouvelle icône.</p>
<p>Vous pouvez commencer à voir la tendance ici : la plupart des prompts ont été conçues avec l’idée qu’un état atomique doit être ajouté à la liste des états, ou non. En d’autres termes, ils ont tendance à ajouter un nouveau segment (et/ou une nouvelle icône) à la liste des segments. Liquid Prompt est peut-être le seul à avoir réfléchi à l’idée de maximiser la réutilisation des indices visuels et à les positionner avec précaution.</p>
<p>Essentiellement, la plupart des systèmes de prompts donnent la priorité à la question « saviez-vous que ? » (par exemple, « saviez-vous que vous avez la version 3.14 de Python ? ») tandis que Liquid Prompt donne la priorité à la question « vous devriez noter que » (par exemple, « vous devriez noter qu’il est temps de git pull »).</p>
<h3 id="toc-la-force-réside-dans-la-diversité-pas-dans-la-similitude">La force réside dans la diversité, pas dans la similitude</h3>
<p>Bien entendu, la plupart des systèmes de prompts ont en commun le fait que de nombreux éléments sont configurables. Un utilisateur peut réorganiser ce qui est affiché et changer complètement le <em>look and feel</em> de son message. C’est flagrant quand on regarde la diversité des thèmes compatibles.</p>
<p>Ici, Oh-My-Posh a fait beaucoup d’efforts pour promouvoir un très grand nombre de thèmes. En plus des prompts *ship, ils utilisent un langage de configuration déclaratif qui prétend être le moyen le plus simple d’assembler un nouveau thème.</p>
<p>Je vois deux problèmes à cette idée, qui semble être très répandue parmi les informaticiens, même loin de la configuration des invites (pensez aux systèmes de construction, par exemple) :</p>
<ol>
<li>la simplicité ne passe pas à l’échelle,</li>
<li>elle introduit trop de contraintes et limite l’innovation.</li>
</ol>
<h4 id="toc-la-simplicité-ne-passe-pas-à-léchelle">La simplicité ne passe pas à l’échelle</h4>
<p>Le premier problème est relativement évident si vous essayez d’interpréter une configuration de prompt complète, par exemple cette configuration aléatoire de <a href="https://github.com/JanDeDobbeleer/oh-my-posh/blob/main/themes/atomicBit.omp.json">Oh-My-Posh/atomicBit</a> :</p>
<pre><code><#ffffff>[</>{{ .HEAD }}{{ if .Staging.Changed }}<#00AA00> \u25cf {{ .Staging.String }}</>{{ end }}{{ if .Working.Changed }}<#D75F00> \u25cf {{ .Working.String }}</>{{ end }}<#ffffff>]-</>"
</code></pre>
<p>Je ne fais même pas de sélection ; j’ai choisi celui-ci parce qu’il est en fait plus simple que le modèle par défaut. Que fait-elle en réalité ? Je ne suis pas sûr de vouloir faire les efforts nécessaires pour le comprendre. Par contre, je peux très bien voir l’intérêt de faire la même chose en script shell, avec des instructions if/then communément comprises, au lieu d’une soupe de parenthèses en notation polonaise inversée.</p>
<p>Je pense que, dans Liquid Prompt, cela ressemblerait à (non testé, juste ici pour donner une idée) :</p>
<pre><code> LP_COLOR_CHANGES=$GREEN
LP_COLOR_COMMITS=$MAGENTA
lp_git=""
if _lp_vcs_head_status; then
lp_git+="$lp_vcs_head_status"
fi
if _lp_vcs_unstaged_lines; then
lp_git+="$LP_COLOR_CHANGES ○+$lp_vcs_unstaged_i_lines/-$lp_vcs_unstaged_d_lines"
fi
if _lp_vcs_commits_off_remote; then
lp_git+="$LP_COLOR_COMMITS ○+$lp_vcs_commit_ahead$NO_COL/$LP_COLOR_COMMITS_BEHIND-$lp_vcs_commit_behind$NO_COL"
fi
</code></pre>
<p>Notez que la logique d’affichage (ou non) est découplée du schéma de coloration. Cela ne vous semble peut-être pas plus simple, mais au moins vous pouvez le lire sans avoir mal à la tête, et il me semble que vous pouvez l’adapter plus facilement à un plus grand nombre de cas d’utilisation, et qu’il a une granularité plus fine sur l’information qu’il peut afficher.</p>
<p>Maintenant, tout comme il est très difficile de concevoir de bons systèmes de <em>build</em> (qui sont un mélange de programmes déclaratifs et impératifs), c’est un problème notoirement difficile que de concevoir un système de configuration (pour les mêmes raisons). Ne soyez donc pas trop durs avec les développeurs, il n’y a pas de solution miracle.</p>
<h4 id="toc-déclaration-contre-innovation">Déclaration contre Innovation</h4>
<p>Le deuxième problème se manifeste dans la diversité des thèmes que les gens peuvent produire dans la pratique. La <a href="https://ohmyposh.dev/docs/themes">liste des thèmes disponibles pour Oh-My-Posh</a> est impressionnante. Il ne fait aucun doute que l’approche déclarative incite les gens à créer des thèmes. Toutefois, lorsque l’on parcourt la longue liste, il est évident qu’ils se ressemblent tous. Il ne faut pas s’attendre à des designs très différents avec ce prompt, ce ne sont que des listes de segments colorés.</p>
<p>Ici, Liquid Prompt présente une différence intéressante. Vous pouvez reconfigurer les thèmes avec l’approche classique <code>clé=valeur</code>, mais plus généralement, les thèmes sont de purs scripts shell qui <em>arrangent</em> les informations disponibles. Cela permet toutes sortes de subtilités, et plus généralement d’afficher n’importe quelle information sous n’importe quelle forme, pour n’importe quelle combinaison d’états, ce qui est totalement impossible à faire de manière efficace avec une approche déclarative.</p>
<p>Par ailleurs, l’approche utilisée par Liquid Prompt permet de combiner facilement des configurations (appelées <em>presets</em>). Ainsi, vous pouvez utiliser un thème, puis utiliser un <em>preset</em> pour modifier certaines de ses couleurs (par exemple si vous êtes daltonien).</p>
<p>L’impact de cette approche est visible dans la <a href="https://github.com/liquidprompt/liquidprompt/wiki/Themes">diversité des thèmes proposés par Liquid Prompt</a>. Il ne s’agit pas seulement de changer les couleurs et les icônes, mais de modifier l’ensemble de l’expérience utilisateur. Par exemple, le thème <a href="https://github.com/nojhan/lp-gitcrux">GitCrux</a> reprend le thème par défaut, mais ajoute des indications visuelles sur les commandes Git qui peuvent être utiles compte tenu de l’état du référentiel actuel. Pour ce thème, Liquid Prompt est plutôt un fournisseur de données, un* moteur de thème* qu’il utilise à ses propres fins.</p>
<p>On peut également voir une certaine innovation dans le <a href="https://github.com/nojhan/lp-dotmatrix">thème DotMatrix</a>, où certaines informations sont affichées non pas avec des icônes/segments, mais simplement avec des espaces orientés. Par exemple, dans Dotmatrix, lorsque vous êtes connecté via SSH, un espace entouré de flèches vers la gauche est inséré entre le type de terminal (c’est-à-dire une session purement textuelle ou graphique) et l’utilisateur. Il en va de même pour indiquer une session multiplexée : un espace est inséré entre l’utilisateur et le nom d’hôte. Le thème utilise la même idée pour le contrôle de version, et pour indiquer que des commits attendent d’être poussés (flèches espacées vers la gauche — là où se trouve le serveur) ou retirés (flèches espacées vers la droite — là où <em>vous</em> vous trouvez).</p>
<p>Ce type de conception nécessiterait une refonte complète du moteur de thème dans d’autres systèmes de prompt, mais ne requiert qu’un développeur motivé connaissant un peu de shell avec Liquid Prompt.</p>
<h2 id="toc-fonctionnalités">Fonctionnalités</h2>
<p>Le design, c’est bien, mais en fin de compte, les logiciels doivent avoir les fonctionnalités qui comptent. Vous savez, genre avoir quelque chose à afficher.</p>
<p>Pour entrer dans les détails des fonctionnalités, j’ai dressé la liste de toutes les fonctionnalités de chaque système d’invite, puis j’ai vérifié lesquels les prenaient également en charge. J’ai ensuite évalué la qualité de cette prise en charge :</p>
<ol>
<li>aucune prise en charge,</li>
<li>prise en charge et conception de base,</li>
<li>bon ensemble de fonctionnalités, mais ergonomie médiocre,</li>
<li>bonnes fonctionnalités et ergonomie.</li>
</ol>
<p>Les résultats sont présentés dans le tableau suivant, et les réflexions sur ce que cela signifie dans les sections suivantes.</p>
<p>Dans ce tableau, les nombres dans les cellules indiquent le niveau de qualité de la fonctionnalité. La popularité est la somme des niveaux de la ligne. Les lignes « support » correspondent à la somme des niveaux de la colonne, pour chaque catégorie. Les catégories sont triées de haut en bas en fonction de leur popularité moyenne. Les projets sont triés de gauche à droite, en fonction de leur score de support dans la section des essentiels du shell.</p>
<p>Les sections suivantes abordent certains des ensembles de fonctionnalités présentés dans ce tableau et les comparaisons entre les systèmes d’invite.</p>
<p><a href="https://camo.githubusercontent.com/a39022857261f072e32a7954f28c7c12e3be340ff38742d747034aba682e405a/68747470733a2f2f6c697175696470726f6d70742e72656164746865646f63732e696f2f656e2f6c61746573742f5f696d616765732f70726f6d7074735f636f6d70617269736f6e2e737667">Tableau de support des principaux systèmes de prompts</a></p>
<h3 id="toc-les-fonctionnalités-essentielles-sont-essentielles">Les fonctionnalités essentielles sont essentielles</h3>
<p>Le shell est un logiciel assez ancien. Vieux dans le bon sens du terme : il a été testé et mis à jour pour atteindre un niveau de qualité qui permet de travailler efficacement. De plus, il est fort probable que vous y passiez la plupart de votre temps à travailler sur quelques types de tâches : développeur, sysadmin, devops, analyste de données, ou n’importe quelle variante de ces familles. Quel que soit votre travail, il vous serait probablement utile de connaitre (et d’utiliser) un ensemble de fonctionnalités pour utilisateurs « chevronnés ». Si vous avez lu cet article jusqu’ici, il y a de fortes chances que vous soyez à l’aise avec le shell et que vous soyez un utilisateur expérimenté, ou que vous aspiriez à l’être.</p>
<p>La tâche principale du shell est d’afficher une sorte d’état lié à la machine, au shell/à l’environnement ou au répertoire courant. Les états les plus importants sont soit ceux fournis par le shell lui-même, soit ceux qui peuvent gêner votre travail (probablement l’état de l’ordinateur lui-même). Ces fonctionnalités sont essentielles, et elles devraient avoir une place de premier ordre dans l’invite.</p>
<p>Dans le tableau ci-dessus, j’ai séparé les fonctionnalités liées à la machine et au shell en deux catégories : les fonctionnalités essentielles et les fonctionnalités diverses. La catégorie « divers » contient les fonctionnalités liées au réseau, car elles sont notoirement criblées de toutes sortes d’écueils. J’ai également placé la fonction « dir stack » (les commandes <code>pushd</code> et <code>popd</code>) dans cette catégorie, car elle n’est pas fréquemment utilisée par les utilisateurs. C’est dommage, car il s’agit d’une fonctionnalité puissante. J’y ai également placé <a href="https://direnv.net/">direnv</a>. Bien qu’il ne s’agisse pas d’une fonctionnalité principale de l’interpréteur de commandes (il s’agit après tout d’un logiciel externe), elle est très proche d’une fonctionnalité principale de l’interpréteur de commandes et j’ai pensé qu’elle méritait plus que la catégorie « contexte de développement ».</p>
<p>Dans notre tableau, les prompts sont classés en fonction de leur capacité à prendre en charge ces fonctionnalités essentielles. Il devrait être évident en voyant le tableau que Liquid Prompt a de loin le meilleur support. Les autres prompts sont bien moins équipés, Starship a un bon support, bien qu’avec des choix ergonomiques discutables (comme nous l’avons vu dans la section <em>Design</em>), suivi par Oh-My-Posh et Powerlevel10k, tous deux avec un support moyen et une ergonomie générale moyenne. Pure a un support médiocre de par sa conception même, ce qui ne peut lui être reproché, mais si vous êtes un utilisateur expérimenté plutôt qu’un ascète, vous pourriez avoir une opinion peu amène quant à ce choix.</p>
<h3 id="toc-prendre-soin-de-lenvironnement">Prendre soin de l’environnement</h3>
<p>Pour les tâches du développeur, il est essentiel de connaitre le contexte logiciel dans lequel vous travaillez. Bien entendu, il faut diviser ce contexte en fonction de la prise en charge de tel ou tel logiciel. Il existe deux catégories générales à cet égard : les logiciels qui manipulent la configuration actuelle de votre session (<em>environnements virtuels</em> proprement dits) et la version actuelle de tout outil lié à la tâche en cours (<em>toolset</em>). Si vous jouez avec des conteneurs toute la journée, vous allez adorer ces fonctionnalités (une fois que vous aurez trouvé un moyen d’y installer un prompt).</p>
<p>En ce qui concerne la catégorie « environnements », le support est assez faible parmi les principaux concurrents (Liquid Prompt, *ship, et PowerLevel10k), Starship ayant le meilleur support global et la meilleure ergonomie. Oh-My-Posh est un peu en retrait, et Powerline presque nulle part. Pure, comme d’habitude, a décidé de ne pas supporter ce genre de choses.</p>
<p>Mais le vrai clivage est dans la catégorie <em>toolset</em>, avec Pure et Powerline qui ont décidé de ne pas supporter ce genre de fonctionnalités, Liquid Prompt qui ne supporte que deux outils, et *ship, Oh-My-Posh et PowerLevel10k qui misent à fond dessus. Parmi eux, Starship est le vainqueur incontesté, avec une liste impressionnante d’outils pris en charge.</p>
<p>Cependant, cette catégorie a tendance à avoir une expérience utilisateur très limitée, chaque fonctionnalité étant réduite à « afficher simplement l’icône & la version ». Pour la plupart d’entre elles (comme les langages de programmation), cela peut être facilement compris, puisqu’il n’y a pas grand-chose à signaler de toute façon. Pour d’autres (comme les systèmes de <em>build</em>), je pense que les prompts peuvent mieux faire.</p>
<p>Dans l’ensemble, je ne suis pas complètement convaincu que cette catégorie de fonctionnalités soit suffisamment importante pour remplir le prompt avec des icônes et des chiffres, mais puisque Starship semble le juger crucial, il y a surement des cas d’usage pour cela.</p>
<p>En passant, on peut voir que Starship se dit « minimal » sur sa page d’accueil, ce qui ne correspond pas tout à fait au niveau de support qu’il a pour ces <em>toolsets</em>… mais je m’éloigne du sujet.</p>
<h3 id="toc-il-est-temps">Il est temps</h3>
<p>La rapidité du prompt — c’est-à-dire le temps nécessaire pour l’afficher après l’exécution d’une commande — est une caractéristique qui fait l’objet de discussions constantes de la part des utilisateurs. </p>
<p>Vous pourriez penser qu’il s’agit d’une fonctionnalité très importante et qu’aucun compromis ne doit être fait à ce sujet. Mon point de vue est légèrement différent.</p>
<p>L’interpréteur de commandes est une interface de commande. C’est-à-dire que vous tapez, entrez, regardez le résultat de la commande, puis réfléchissez à la suivante. Il y a de fortes chances que vous ne tapiez jamais frénétiquement <em>Entrée</em> après une commande qui a été très rapide à produire son résultat. Vous tapez, vous réfléchissez, vous tapez la commande suivante. Vous n’avez pas besoin de la latence d’un jeu de tir à la première personne.</p>
<p>Bien sûr, il existe un seuil au-delà duquel la latence de l’affichage commence à produire des frictions. L’auteur de PowerLevel10k a <a href="https://github.com/romkatv/zsh-bench#how-fast-is-fast">discuté en détail de ce qui est impossible à distinguer d’une absence de latence</a>, ce qui vous donne une idée de la <em>plus petite</em> latence que vous pouvez remarquer, mais pas tout à fait celle que vous tolèreriez dans une session typique.</p>
<p>De ce point de vue, il y a un vainqueur incontestable : PowerLevel10k est incroyablement rapide. Il est allé très loin pour réduire sa latence, et a réussi quelques tours de force techniques très impressionnants, comme l’affichage asynchrone d’éléments lents, grâce à une « évaluation paresseuse ». Cela explique aussi en grande partie pourquoi il ne supporte que Zsh.</p>
<p>Je comprends l’intérêt de réduire les frictions liées à l’attente de la frappe ; mais je pense que l’on surestime souvent l’intérêt d’une latence ultra-faible, quand le prix à payer est que l’information intéressante peut ne pas être affichée au moment où l’on a besoin d’y penser.</p>
<p>Un fait intéressant concernant la latence est la curieuse affirmation de Starship à ce sujet. Sur sa page d’accueil, il affirme que Starship est « incroyablement rapide », <em>parce qu’il est programmé en Rust</em>, qui « apporte la meilleure vitesse, toutes catégories ». Cette affirmation ne tient pas vraiment la route face à la vraie vie. Non seulement Starship est beaucoup plus lent que PowerLevel10k, mais il est également plus lent que Liquid Prompt — tous deux écrits en pur script shell — dans la plupart des cas d’utilisation simple ! Oh-My-Posh — écrit en Go — ne se risque pas à faire le même genre d’affirmation, par exemple.</p>
<p><a href="https://github.com/romkatv/zsh-bench#prompt">Romkatv explique pourquoi dans son étude</a> :</p>
<blockquote>
<p>« Starship est implémenté en tant que binaire externe, il doit donc payer le prix d’au moins un fork+exec supplémentaire pour chaque commande par rapport aux prompts natifs de zsh. Un seul fork+exec ne peut pas expliquer le décalage élevé dont Starship fait preuve, alors qu’est-ce qui se passe ? Dans les conditions de référence, Starship clone 158 fois ! C’est coûteux. »</p>
</blockquote>
<p>C’est peut-être contre-intuitif pour la plupart des informaticiens peu expérimentés, mais le langage est loin d’être l’aspect le plus important de la programmation.</p>
<h2 id="toc-conclusion">Conclusion</h2>
<p>Si vous entrez suffisamment dans les détails, vous pourrez probablement toujours argumenter que tel ou tel système de prompt est le meilleur pour tel ou tel utilisation très spécifique. Grâce aux informations fournies dans cet article, j’espère que vous pourrez décider par vous-même. Maintenant, si vous préférez une évaluation globale, je pense qu’il est clair qu’il y a quelques systèmes qui conviennent mieux à certaines utilisations majeures.</p>
<h3 id="toc-certains-sont-out">Certains sont <em>out</em>
</h3>
<p>Tout d’abord, je pense que l’on peut affirmer sans risque de se tromper qu’il y a très peu d’intérêt à choisir Pure, si ce n’est pour signaler que vous vous positionnez comme étant aligné avec ses valeurs (c’est-à-dire que vous croyez au « one size does fit all », ou « je n’utilise pas vraiment le shell de toute façon »). La plupart des autres candidats ont des thèmes qui reproduisent son (absence) de fonctionnalité, et proposent même d’avoir le même style, mais en supportant plus de cas d’utilisation (d’autres systèmes de version, plus d’alertes sur l’état de l’ordinateur, etc.).</p>
<p>De même, Powerline n’est probablement pas très utile en dehors de son marché principal, qui est de produire des lignes d’état. Et même les autres prompts peuvent généralement fournir beaucoup plus d’informations pour ce faire, à l’exception de certains services en ligne spécifiques.</p>
<p>En outre, Spaceship peut également être mis de côté en toute sécurité, étant donné qu’il a été en pratique remplacé par Starship, qui prend en charge davantage de fonctionnalités (à moins que vous n’ayez besoin d’une identification très spécifique de l’ensemble d’outils, voir le tableau ci-dessus).</p>
<p>Après avoir longuement hésité, j’ai décidé de mettre également de côté Oh-My-Posh. Cela n’a pas été facile, étant donné qu’il est assez bon sur presque tous les critères d’évaluation que j’ai développés dans cet article, ce qui est déjà une belle réussite. Mais c’est là que réside son défaut : il n’est que moyen partout.</p>
<h3 id="toc-certains-sont-in">Certains sont <em>in</em>
</h3>
<p>Il nous reste donc Liquid Prompt, Starship et PowerLevel10k.</p>
<p>PowerLevel10k est le plus populaire (selon la métrique des étoiles de Github) et est le choix évident si vous vous souciez plus de la latence que des fonctionnalités. Il a un support plutôt moyen de chaque catégorie de fonctionnalités, mais a travaillé très dur pour fournir une latence ultra-faible entre deux commandes. Je ne suis pas sûr que cela vaille la peine de réduire les fonctionnalités et la portabilité, étant donné que je suis très rarement ennuyé par de grandes latences lorsqu’elles se produisent dans d’autres systèmes de prompts, mais votre appréciation peut différer (chacun ses fixettes). Il a néanmoins quelques choix de design très modernes et innovants, que j’aime beaucoup, même si j’ai l’impression qu’ils sont plus des paillettes techniques impressionnantes qu’un design vraiment utile ancré dans l’expérience de l’utilisateur.</p>
<p>Starship n’est pas loin derrière en termes d’étoiles, et brille évidemment par son soutien à l’identification des versions d’outils. L’utilité de ce système pour vous dépend de la fréquence à laquelle vous jonglez avec des tâches de développement complexes. En tant qu’ingénieur de recherche, je jongle constamment avec un ensemble de tâches très diverses, et je suis donc plus attiré par des systèmes qui couvrent bien les fonctionnalités de base du shell que par l’énumération des versions, mais je suppose que cela peut être débattu. Quoi qu’il en soit, si vous avez besoin de la portabilité vers PowerShell, Starship est un choix sûr. Gardez également à l’esprit que ses revendications en matière de latence sont exagérées.</p>
<p>Bien qu’il soit le plus ancien de tous, Liquid Prompt est aussi le moins connu. Cependant, il offre le meilleur support des fonctionnalités essentielles. Je dirais aussi qu’il a prêté plus d’attention à son design, permettant des prompts très denses, par exemple. Il est également très configurable, ce qui a permis de créer des thèmes très originaux en termes d’expérience utilisateur. C’est probablement le prompt qui servira le plus grand nombre de cas d’utilisation et d’utilisateurs, en particulier les personnes souhaitant apprendre le shell en expérimentant toutes ses fonctionnalités.</p>
<h2 id="toc-vers-le-service-et-au-delà">Vers le service et au-delà</h2>
<p>Cet article vous a donné quelques opinions basées sur une analyse à un moment donné d’un marché qui continue d’évoluer. En tant que tel, il ne constitue qu’un point dans le temps et peut très bien être rendu obsolète par un changement soudain dans l’activité de l’un ou l’autre projet.</p>
<p>Au cours de l’histoire des systèmes de prompts, tous ont découplé la collecte des données et leur affichage. Et la collecte des données est l’opération la plus couteuse, qui retient toute l’attention lorsque le temps d’exécution doit être optimisé. PowerLevel10k, par exemple, a complètement découplé les deux opérations, qui s’exécutent désormais dans des coroutines parallèles. Son auteur a même mis en place un <a href="https://github.com/romkatv/gitstatus">service de status pour Git</a> totalement précurseur, qui permet d’accélérer considérablement les prompts.</p>
<p>Une autre tendance intéressante consiste à découpler la collecte des données en éléments logiciels atomiques, comme les plugins. Starship n’aurait probablement pas eu son impressionnant support d’outils s’il n’y avait pas eu sa base de code propre et modulaire.</p>
<p>En même temps, Liquid Prompt a fait de gros efforts pour permettre aux thèmes de décider de ce qu’il faut afficher et (plus important) comment et quand l’afficher, allant plus loin que de considérer les thèmes comme de simples configurations.</p>
<p>Je pense que ces trois tendances convergent vers l’idée d’un <em>service</em> d’invite, où le <em>serveur</em> est responsable de la collecte et de la mise en cache des données, tandis que le <em>client</em> est responsable de l’articulation de ces informations d’une manière qui soit utile à l’utilisateur (et pas seulement en les affichant).</p>
<p>L’idée a été explorée ici et là, à ma connaissance surtout par les développeurs de Liquid Prompt, avec des projets tels que <a href="https://github.com/dolmen/angel-PS1">AngelPS1</a> de Dolmen et <a href="https://github.com/Rycieos/most">MOST</a> de Rycieos. Si vous aimez ça, le mainteneur de Liquid Prompt a lancé <a href="https://github.com/liquidprompt/liquidprompt/discussions/786">une conversation sur les « moteurs de thèmes »</a>, n’hésitez pas à la rejoindre et à participer à l’élaboration de l’avenir des systèmes de prompts !</p>
</div><div><a href="https://linuxfr.org/news/comparaison-critique-de-systemes-d-invite-de-commande.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/133912/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/comparaison-critique-de-systemes-d-invite-de-commande#comments">ouvrir dans le navigateur</a>
</p>
nojhanYsabeau 🧶 🧦gUIhttps://linuxfr.org/nodes/133912/comments.atomtag:linuxfr.org,2005:Post/405522019-10-17T15:11:54+02:002019-10-17T15:11:54+02:00Opérations sur les lignes d'un fichier (soustraction de chiffres)<p>Bonjour, </p>
<p>Je souhaiterais soustraire la ligne i+1 à la ligne i d'un fichier pour i allant du début du fichier jusqu'à la fin en mettant 0 ou une ligne vide pour la première ligne.</p>
<p>Si on prend l'exemple d'un fichier test qui contient : <br>
ligne1 -> 0<br>
ligne2 -> 2<br>
ligne3 -> 3<br>
ligne4 -> 6<br>
ligne5 -> 5<br>
ligne6 -> 10</p>
<p>Je voudrais effectuer les soustractions pour obtenir :<br>
ligne1 -><br>
ligne2 -> 2<br>
ligne3 -> 1<br>
ligne4 -> 3<br>
ligne5 -> -1<br>
ligne6 -> 5</p>
<p>Je vous remercie d'avance pour votre aide. </p>
<p>Bonne journée, <br>
Martin</p>
<div><a href="https://linuxfr.org/forums/programmation-shell/posts/operations-sur-les-lignes-d-un-fichier-soustraction-de-chiffres.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/118370/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/programmation-shell/posts/operations-sur-les-lignes-d-un-fichier-soustraction-de-chiffres#comments">ouvrir dans le navigateur</a>
</p>
MartinD07https://linuxfr.org/nodes/118370/comments.atomtag:linuxfr.org,2005:Diary/376292017-12-07T10:24:06+01:002017-12-07T10:24:06+01:00Gufo: un langage de shell moderne!Licence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<h2 class="sommaire">Sommaire</h2>
<ul class="toc">
<li><a href="#pourquoi">Pourquoi</a></li>
<li>
<a href="#une-description-utilisateur">Une description utilisateur</a><ul>
<li><a href="#une-simple-commande">Une simple commande</a></li>
<li><a href="#une-commande-avec-redirection">Une commande avec redirection</a></li>
<li><a href="#stockage-dune-commande-dans-une-variable">Stockage d'une commande dans une variable</a></li>
<li><a href="#une-fonction-basique">Une fonction basique</a></li>
<li><a href="#une-fonction-avanc%C3%A9">Une fonction avancé</a></li>
<li><a href="#divers">Divers</a></li>
</ul>
</li>
<li><a href="#une-description-technique">Une description technique</a></li>
<li><a href="#l%C3%A9tat-du-projet">L'état du projet</a></li>
</ul><p>Gufo est un prototype de langage de script moderne qui peut embarquer des commandes unix et servir de shell.</p>
<h2 id="pourquoi">Pourquoi</h2>
<p>Bash est, pour les utilisateurs techniques, l'interface texte majeure sous les systèmes GNU-linux.</p>
<p>La raison principale est la facilité à appeler des programmes externes et la possibilité de combiner des flux d'entrées/sorties dans l'environnement orienté fichier de GNU-linux.</p>
<p>En gardant conscience de la qualité et de la quantité de travail qui a été mise dans Bash, un système d'exploitation moderne mérite un langage de shell utilisant les techniques de compilation et d'interprétation modernes. En dehors de la simple exécution d'une ligne de commande, il est nécessaire de disposer d'un langage de shell permettant d'exécuter des scripts pouvant manipuler facilement des lignes de commandes (par exemple "nb_files=<code>ls -l | wc -l</code>"). Bash le permet mais d'une manière tout à fait archaïque.</p>
<p>Modestement, mais avec une certaine envie de voir ce genre d'évolution, j'ai commencé à imaginer un nouveau langage pour le shell. J'ai travaillé à cette idée à temps partiel depuis septembre 2017 (l'idée, je l'avais depuis plus longtemps). Le projet est loin d'être déjà utilisable mais peut être considéré comme une "preuve de concept" (proof of concept) permettant d'annoncer les idées principales qui seront utilisées et d'obtenir des retours.</p>
<p>Je considère les fonctionnalités suivante comme étant importante dans un langage 'moderne':</p>
<ul>
<li>
<p>Un système de typage avancé:</p>
<ul>
<li>la possibilité d'utiliser des tuples, listes, map et set (ensemble) en plus des types de bases.</li>
<li>une des innovations de Gufo est de considérer une commande shell comme un type de base.</li>
<li>la possibilité de créer ses propres types "struct".</li>
<li>le typage est "statique implicite": le programmeur ne déclare pas les types, ceux-ci sont inférés par l'interpréteur.</li>
</ul>
</li>
<li>
<p>Un travail important de vérification pré-exécution:</p>
<ul>
<li>Gufo est un langage interprété (bien logiquement pour un langage de shell) mais il fait des vérification sur le code avant de lancer l'exécution effective: l'idée est que l'on veut éviter autant que possible les échecs durant les exécutions (parce que l'utilisateur risque de perdre du temps si l'exécution du script est longue, ou pire risque de mettre le système dans un état inconsistant). C'est pourquoi, Gufo vérifie en amont de l'exécution que chaque variable est bien défini (à l'intérieur d'un scope), que les appels de fonctions sont consistent et fait une vérification de typage (type-checking). </li>
</ul>
</li>
</ul><p>Dans l'état actuel de Gufo, beaucoup reste à faire, entre autre, il reste des questions sur l'utilisation des entrées/sorties (comment paramétrer leur affichage entre sortie standard et/ou stockage dans une variable), messages d'erreur correct mais sans aucune information de position dans le code, travail à faire pour rendre l'usage console agréable… L'objectif à terme est de fournir une version libre, mais je ne ferais cela que si le projet est suffisamment avancé au moins pour une utilisation basique ce qui n'est pas le cas aujourd hui. Cela dépend aussi des opportunités de financement du projet.</p>
<h2 id="une-description-utilisateur">Une description utilisateur</h2>
<p>Le meilleur moyen de gouter à Gufo, est de plonger dans quelques exemples compréhensibles aussi bien pour des débutants que pour des utilistateurs avancés.</p>
<h3 id="une-simple-commande">Une simple commande</h3>
<p><strong>code</strong></p>
<pre><code> ls
</code></pre>
<p><strong>explication</strong><br>
Une simple commande shell est un programme Gufo valide, c'est ce qui lui permettra d'être un language de shell. La commande ls permet de lister les fichiers du répertoire courant. Ce programme permettra donc l'affichage de cette liste.</p>
<h3 id="une-commande-avec-redirection">Une commande avec redirection</h3>
<p><strong>code</strong></p>
<pre><code>ls -l | wc -l > nb_files.txt
</code></pre>
<p><strong>explication</strong><br>
Gufo gère les opérateurs de redirections du bash. Pour information, "|" redirige la sortie de la première commande ("ls -l") vers la deuxième commande ("wc -l"). ">" redirige la sortie du résultat vers le fichiers nb_files.txt.<br>
La encore, le but est d'imiter bash, tout en reconnaissant qu'on ne le fait que pour les opérateurs simples, sans aller dans les fonctionnalités avancées (et souvent occultes).</p>
<p>Gufo permet aussi à l'utilisateur d'interagir avec l'entrée standard dans le cas de programme interactif.</p>
<h3 id="stockage-dune-commande-dans-une-variable">Stockage d'une commande dans une variable</h3>
<p><strong>code</strong></p>
<pre><code>let $a = ls -l | wc -l
</code></pre>
<p><strong>explication</strong><br>
Une variable en Gufo est toujours préfixé par un '\$' pour qu'il n'y ai pas ambigüité avec une commande. 'let' est le mot clé permettant de déclarer une variable ou une fonction.<br>
Le résultat de la commande (les système unix renvoit 0 pour une exécution réussi ou un entier non-nul indiquant l'erreur) est atteignable via "\$a.Cmd.res", le contenu du résultat via "\$a.Cmd.print_std".</p>
<h3 id="une-fonction-basique">Une fonction basique</h3>
<p><strong>code</strong></p>
<pre><code>let $factoriel $c =
if ($c != 1)
then $c * ($factoriel ($c - 1))
else 1
</code></pre>
<p><strong>explication</strong></p>
<p>Voici la fonction factoriel (qui ne dépend pas d'éventuelles lignes de commandes). Cette fonction prend un argument "\$c", si celui-ci est différent de 0, la fonction s'appelle récursivement (avec \$c décrémenté à chaque appel). La syntaxe, et de nombreux aspect du langage sont empruntés à Ocaml. Gufo est un langage fonctionnel (généralement pas d'effet de bord, une fonction prend des arguments et renvoi une valeur résultante).</p>
<h3 id="une-fonction-avancé">Une fonction avancé</h3>
<p><strong>code</strong></p>
<pre><code>let $run $fichier =
let $current_log = $fichier+".log" in(
let $past_log = $fichier+".log.old" in(
# put current log as past past log
let $as_log = cat $current_log > $past_log in (
if $as_log.Cmd.res == (some 0)
then (./gufo_run.native $fichier > $current_log; diff -q $current_log $past_log)
else (echo "create first log"; ./gufo_run.native $fichier > $current_log)
)))
</code></pre>
<p><strong>explication</strong></p>
<p>Voici d'abord une explication générale: le but de cette fonction est d'exécuter le programme externe "./gufo_run.native" prenant en paramètre une chaine de caractères (contenu dans '\$fichier') et de stocker son résultat dans le fichier référé par '\$current_log'. dans le cas ou la commande à déjà été exécuté on veut afficher le diff par rapport au log de l'exécution précédente.</p>
<p>Voila le détails par ligne: </p>
<ol>
<li> déclaration de la fonction '\$run' qui prend 1 argument '\$fichier'. Les lignes suivantes représente le corps de la fonction.</li>
<li> déclaration de la variable '\$current_log' qui correspond à la concaténation de '\$fichier' avec la chaine ".old". Le "in" indique la porté, délimiter par la paire de parenthèses, dans laquelle est utilisable la variable.</li>
<li> similaire à la ligne précédente, pour définir un "log.old".</li>
<li> un commentaire (commence toujours par # et se termine en fin de ligne).</li>
<li> exécution de la commande 'cat \$current_log > \$past_log', le résultat est mis dans la variable '\$as_log'.</li>
<li> un if et sa condition: la condition est vrai si le résultat de la commande vaut 0 (le "some" sera détaillé mais permet de différencier un cas ou l'exécution de la commande s'est effectivement produit, d'un cas ou celle-ci ne ce serait pas produit (on aurait un "none).</li>
<li> l'exécution dans le cas ou la condition est vérifié: exécute le programme "gufo_run.native avec comme argument '\$fichier' en mettant le résultat dans le fichier indiqué par '\$current_log' On exécute successivement la commande diff. </li>
<li> l'exécution dans le cas ou la condition n'est pas vérifiée: exécution d'une commande "echo" suivi de l'execution de la commande "./gufo_run.native".</li>
<li> fermeture des portés de variables ouvertes.</li>
</ol><h3 id="divers">Divers</h3>
<p>Il y aurait de nombreuses autres fonctionnalités à montrer, elles seront présentés dans un tutoriel plus complet (en particulier, concernant les tuples, listes, set et map…). Voila simplement un dernier exemple pour expliquer qu'il y a un système de type "personnalisé", semblable au struct du C:</p>
<p><strong>code</strong></p>
<pre><code>struct $mystruct= {
var1: string ,
var2: cmd,
var3: $myotherstruct,
var4: string -> int,
}
</code></pre>
<p><strong>explication</strong><br>
On a défini un type '\$mystruct' disposant de quatre champs nommés et respectivement typés. Le champs "var3" a pour type une autre structure, le champs "var4" à pour type une fonction prenant une chaine de caractère et retournant un entier.</p>
<h2 id="une-description-technique">Une description technique</h2>
<p>La description ici faîtes n'est que très partielle et est voué à être détaillé à l'avenir.</p>
<p>Gufo est codé en Ocaml et fait environs 5000 lignes. Il repose beaucoup sur les mécanismes d'ocaml (type (le int de Gufo est strictement le int d'ocaml, gestion de la mémoire…) mais ajoute le mécanisme de commande externe, de set et map sans passer par des foncteurs et rend plus facile (d'avantage "script") son utilisation. Il ne cherche pas atteindre ces mécanismes avancés.</p>
<p>Le code est parsé puis est transformé dans une représentation intermédiaire optimisée (tous les symboles sont remplacés par des entiers ce qui permet des gains importants de performances).</p>
<p>Gufo est un language fonctionnel et si il permettra quelques astuces impérative, le restera.</p>
<p><img src="//img.linuxfr.org/img/687474703a2f2f707669747465742e636f6d2f736368656d612e706e67/schema.png" alt="Image of the core" title="Source : http://pvittet.com/schema.png"></p>
<h2 id="létat-du-projet">L'état du projet</h2>
<p>Mon objectif était d'avancer au maximum le projet avant de le présenter pour pouvoir donner autant de précision et de garantie que possible sur les qualité du langage. Le projet tout de même apparaît bien ambitieux et je ne peux pas d'avantage le développer sans soutien financier.<br>
J'ai donc décidé de faire cette présentation, pour présenter honnêtement le projet, vous permettre de l'évaluer et de considérer si il vous paraissais utile de l'aider. Votre avis me sera utile pour savoir si le projet semble avoir du sens. </p>
<p>Votre aide, cela peut être des remarques, des conseils, et également des perspectives de financement si le projet vous semble pertinent. Selon les réactions, j'organiserais une campagne de financement.</p>
<p>Je tiens à préciser que quoi qu'il arrive, le logiciel est destiné, si il est publié à être publié sous licence libre. Pour autant, je considère que tout travail (utile) mérite salaire: la qualité de la publication dépendra de l'aide reçu.</p>
<p>Pour l'instant, je souhaite en être le seul développeur, jusqu'à cette première publication éventuelle. Ensuite, nous verrons la situation, mais comme indiqué, le projet sera libre.</p>
<p>Voici les nombreux points qui devraient être travaillés pour envisager une version "aboutie":</p>
<ul>
<li>Finalisation du type-checker (déjà relativement avancé)</li>
<li>Amélioration de la gestion des commandes (en particulier sur le type permettant de stocker l'exécution d'une commande: que veux t'on stocker?)</li>
<li>amélioration des levés d'erreurs, en particulier position de l'erreur dans le code (je considère cela tout à fait essentiel mais ai laissé cette fonctionnalité pour plus tard car elle n'était pas nécessaire pour estimer la faisabilité pure.)</li>
<li>Gestion et écriture des modules systèmes (List, Set, Map, Cmd….) fournissant un ensemble de fonctions standards.</li>
<li>Documentation complète</li>
<li>Mise en place d'outils de programmation impératives: séquence d'expressions, pointeurs sur des valeurs mutables…<br>
</li>
<li>Validations et écriture de programmes de test conséquents</li>
<li>possibilité qu'une structure étende une autre structure (pourrait ressembler à des mécanismes de programmation objet).</li>
<li>Pour les questions de gestions de la mémoire, je me repose sur Ocaml, langage dans lequel est codé Gufo.</li>
</ul><p>Si vous êtes curieux vous pouvez me contacter: <a href="http://pvittet.com/?page=contact">http://pvittet.com/?page=contact</a>.</p>
<p>Pour conclure, j'ai eu, en tant qu'ingénieur en informatique, plusieurs fois l'opportunité de travailler avec des chercheurs, Je n'aurais certainement pas eu l'imagination ni les moyens de me lancer dans un tel projet sans ces expériences. Aussi, je tiens à leur exprimer mes remerciements.</p><div><a href="https://linuxfr.org/users/piervit/journaux/gufo-un-langage-de-shell-moderne.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/113266/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/piervit/journaux/gufo-un-langage-de-shell-moderne#comments">ouvrir dans le navigateur</a>
</p>
Piervithttps://linuxfr.org/nodes/113266/comments.atomtag:linuxfr.org,2005:Diary/363352016-01-28T20:53:22+01:002016-01-28T20:53:22+01:00Pixmania en route vers la failliteLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Je vais innover vers un concept épuré : le journal-bookmark sans bookmark. Cela n'a pas été annoncé partout, le site <a href="http://www.pixmania.fr/">Pixmania</a> est en redressement judiciaire, et il semblerait qu'il se livre à la détestable pratique d'encaisser les commandes sans aucune garantie de livraison des produits correspondants. Cherchez Pixmania avec votre moteur de recherche préféré, vous verrez.</p>
<p>À bon entendeur salut. Pour éviter à des étourdis dans mon genre de se faire avoir.</p><div><a href="https://linuxfr.org/users/philip_marlowe/journaux/pixmania-en-route-vers-la-faillite.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/108022/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/philip_marlowe/journaux/pixmania-en-route-vers-la-faillite#comments">ouvrir dans le navigateur</a>
</p>
Philip Marlowehttps://linuxfr.org/nodes/108022/comments.atomtag:linuxfr.org,2005:News/365582015-07-01T13:16:12+02:002015-07-01T13:16:12+02:00Sortie de Makefly 0.4, alternative au moteur de blog statique NanobloggerLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Makefly est une alternative rapide et légère en ligne de commande au moteur de blog statique <a href="http://nanoblogger.sourceforge.net/">Nanoblogger</a> suite à l'arrêt de son développement en 2013. Un an après <a href="//linuxfr.org/news/makefly-une-alternative-au-moteur-de-blog-statique-nanoblogger">la sortie de la version 0.3 de Makefly</a>, c'est une nouvelle mouture qui voit le jour estampillée 0.4.</p>
<p>Dans les grandes lignes des nouveautés, nous avons : </p>
<ul>
<li>la partie BSD Makefile est abandonnée au profit d'un système en Lua permettant de lancer les différentes commandes de Makefly ;</li>
<li>la dépendance vers <em>lua-markdown</em> n'est plus nécessaire ;</li>
<li>le système de commentaire <a href="http://posativ.org/isso/">Isso</a> écrit en Python dont nous fournissons un service (en bêta) nommé <a href="http://rave.depotoi.re/">Rave</a> (pour ceux qui ne peuvent pas l'installer sur leur machine) ;</li>
<li>une nouvelle documentation sur la <a href="http://makefly.depotoi.re/themes.html">manière de créer un thème pour Makefly</a>.</li>
</ul><p>Nous espérons ainsi avoir quelques contributions de thèmes pour Makefly afin de compléter la collection déjà présente.</p></div><ul><li>lien nᵒ 1 : <a title="http://makefly.depotoi.re/" hreflang="fr" href="https://linuxfr.org/redirect/94522">Site officiel</a></li><li>lien nᵒ 2 : <a title="http://makefly.depotoi.re//documentation.html" hreflang="fr" href="https://linuxfr.org/redirect/94523">Documentation (générale)</a></li><li>lien nᵒ 3 : <a title="http://makefly.depotoi.re//themes.html" hreflang="fr" href="https://linuxfr.org/redirect/94524">Documentation (créer un thème)</a></li><li>lien nᵒ 4 : <a title="http://posativ.org/isso/" hreflang="fr" href="https://linuxfr.org/redirect/94525">Isso (système de commentaire)</a></li><li>lien nᵒ 5 : <a title="http://rave.depotoi.re/" hreflang="fr" href="https://linuxfr.org/redirect/94526">Rave (service de commentaire Isso)</a></li></ul><div><p>Makefly fournit de quoi créer un blog avec : </p>
<ul>
<li>des billets munis de tags, une catégorie ;</li>
<li>un système pour le référencement via le choix du nom des pages, de <em>keyword</em> pour chaque article et le formatage des adresses réticulaires (URL) ;</li>
<li>un flux RSS ;</li>
<li>des pages statiques ;</li>
<li>un système de sauvegarde, de publication, de création d'article, de migration depuis Nanoblogger ;</li>
<li>un système de commentaire, de template (personnalisation des thèmes) et de traduction ;</li>
<li>un badge GNU Social ;</li>
<li>etc.</li>
</ul><p>La documentation fournit de plus amples informations sur les fonctionnalités présentes.</p>
<p>Je tiens aussi et surtout à remercier les derniers utilisateurs qui m'ont contacté pour leurs critiques et avoir souligné les problèmes rencontrés. <strong>J'invite d'ailleurs tout utilisateur de Makefly à donner son avis sur l'outil</strong>. C'est appréciable et cela donne véritablement une valeur ajoutée sur ce logiciel que je pensais être le seul à utiliser.</p></div><div><a href="https://linuxfr.org/news/sortie-de-makefly-0-4-alternative-au-moteur-de-blog-statique-nanoblogger.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/106208/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/sortie-de-makefly-0-4-alternative-au-moteur-de-blog-statique-nanoblogger#comments">ouvrir dans le navigateur</a>
</p>
BlankoworldZeroHeureXavier Teyssierpalm123https://linuxfr.org/nodes/106208/comments.atomtag:linuxfr.org,2005:Diary/357232015-03-24T11:37:23+01:002015-03-24T11:37:23+01:00Faire de la magie avec son .inputrcLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<p>Bonjour nal et naleux,</p>
<p>Faites-vous partie de ces barbus définissant des dizaines et des dizaines d'alias dans leur .bashrc, afin d'<em>enlarge your productivity</em> au maximum ? Mais savez-vous qu'il existe un fichier encore pluss trop bien, permettant de faire virevolter votre productivité à un niveau inégalé : le .inputrc ?</p>
<p>Celui-ci permet de définir des raccourcis claviers qui seront disponibles dans tous les clients utilisant <a href="http://fr.wikipedia.org/wiki/GNU_Readline">readline</a> (donc bash, mais pas zsh… Raison principale pour laquelle je ne suis toujours pas passé à zsh !)</p>
<p>En premier lieu, les utilisateurs de vi seront heureux de savoir que readline contient un mode vi qui permet d'utiliser des commandes à la vi. Pour l'activer, ajouter ceci au fichier :</p>
<pre><code class="bash"><span class="nb">set </span>editing-mode vi
<span class="nb">set </span>keymap vi-command</code></pre>
<p>Pour la liste des raccourcis, cf. <a href="http://www.catonmat.net/blog/bash-vi-editing-mode-cheat-sheet/">ici</a></p>
<p>Vous pouvez aussi régler vos raccourcis clavier qui ne seraient pas reconnus par bash, notamment les flèches, qui peuvent avoir plusieurs variantes : « [1;5C », « [5C » ou encore « \e[C ». Pour savoir ce que les différentes combinaisons de touche renvoient, lancez par exemple un « sleep 10 » puis voyez quels représentations sont affichées. Pour les utiliser dans votre .inputrc, remplacez « ^[ » par « \e ». Ainsi, si par exemple les déplacement en CTRL-flèches posent problème, ajoutez ceci :</p>
<pre><code class="bash"> <span class="c"># mappings for Ctrl-left-arrow and Ctrl-right-arrow for word moving</span>
<span class="s2">"\e[1;5C"</span>: forward-word
<span class="s2">"\e[1;5D"</span>: backward-word
<span class="s2">"\e[5C"</span>: forward-word
<span class="s2">"\e[5D"</span>: backward-word
<span class="s2">"\e\e[C"</span>: forward-word
<span class="s2">"\e\e[D"</span>: backward-word</code></pre>
<p>Un autre truc pratique : pour chercher directement dans votre historique les commandes commençant par la commande en cours avec CTRL+flèche haut ou bas, ajoutez :</p>
<pre><code class="bash"><span class="s2">"\e[1;5A"</span>: <span class="nb">history</span>-search-backward
<span class="s2">"\e[1;5B"</span>: <span class="nb">history</span>-search-forward</code></pre>
<p>Bref, passons les astuces triviales que vous trouverez un peu partout sur Internet ou en lisant le <em>man bash</em>, et voyons voir ce qu'on peut définir d'un peu plus intéressant. En premier lieu, il est intéressant de noter qu'on peut définir à peu près n'importe quelle séquence de touche sur un raccourci clavier. Ainsi, si je définis ceci :</p>
<pre><code class="bash"><span class="s2">"\ej"</span>: <span class="s2">"jobs\n"</span></code></pre>
<p>taper M-j m'affichera automatiquement les processus en arrière-plan. Notez bien le retour chariot, qui m'évite d'appuyer sur entrée. On ne dirait pas comme ça, mais ce raccourci est indispensable : l'essayer, c'est l'adopter !<br>
On peut affiner encore un peu l'utilité du raccourci en le rendant fonctionnel également en cours d'écriture de commande :</p>
<pre><code class="bash"> <span class="s2">"\ej"</span>: <span class="s2">"\C-a\C-kjobs\n"</span></code></pre>
<p>Cela rajoute une séquence de touches (C-a C-k) qui coupe toute la ligne. Vous pouvez rajouter un C-y à la fin pour recoller la ligne, mais notez que ça collera de vieilles données si vous faites cela sur une ligne vide.</p>
<p>Attention, notez que définir un raccourci n'efface pas forcément le précédent, ce qui donne parfois des résultats bizarres (les deux commandes peuvent être exécutées). Vérifiez donc que le raccourci n'est pas déjà attribué, par exemple sur <a href="http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29#Keyboard_shortcuts">la page wikipédia anglais de bash</a> (oui, tout l'alphabet est déjà utilisé avec CTRL).</p>
<p>Avant d'aller encore plus loin, voilà en vrac d'autres raccourcis très utiles :</p>
<pre><code class="bash"> <span class="c"># Ajouter "| less" à la fin de la ligne</span>
<span class="s2">"\el"</span>: <span class="s2">"\C-e | less"</span>
<span class="c"># Remplacer le premier mot de la commande par less</span>
<span class="s2">"\eL"</span>: <span class="s2">"\C-a\eDless\C-e"</span>
<span class="c"># Remplacer le premier mot de la commande par ls</span>
<span class="s2">"\eK"</span>: <span class="s2">"\C-a\eDls\C-e"</span>
<span class="c"># Ajouter "sudo" au début de la ligne</span>
<span class="s2">"\es"</span>: <span class="s2">"\C-asudo \C-e"</span>
<span class="c"># Afficher un processus précis (place le curseur entre les quotes)</span>
<span class="c"># Attention : écrase M-p</span>
<span class="s2">"\ep"</span>: <span class="s1">'\C-a\C-kps aux | grep -i ""\C-b'</span>
<span class="c"># grep</span>
<span class="s2">"\eG"</span>: <span class="s1">'\C-a\C-kgrep -ri "" .\C-b\C-b\C-b'</span>
<span class="s2">"\eg"</span>: <span class="s1">'\C-a\C-kgrep -r "" .\C-b\C-b\C-b'</span>
<span class="c"># find (avec copie du résultat dans le clipboard, nécessite le paquet xclip)</span>
<span class="s2">"\eF"</span>: <span class="s1">'\C-a\C-kfind . -iname "**" | tee >(tr -d \'\\n\' | xclip)\C-a\ef\ef\C-f\C-f\C-f'</span>
<span class="c"># Ouvrir le man correspondant à la commande en cours</span>
<span class="c"># (remplace "commande args" par "man commande")</span>
<span class="s2">"\em"</span>: <span class="s1">'\C-aman \ef\C-k'</span>
<span class="c"># Copier une seconde fois le premier argument de la commande</span>
<span class="c"># (Ne fonctionne que pour des commandes simples)</span>
<span class="c"># Pratique lorsqu'on écrit "mv nom_de\ -\ fichier_\[\ complexe\] nom_de\ -\ fichier_\[\ complexe\].txt"</span>
<span class="s2">"\er"</span>: <span class="s1">'\C-a\ef\C-k\C-y\C-y'</span></code></pre>
<p>Bon, voilà, on a défini plein de commandes utiles. Mais peut-on aller plus loin ? Eh bien, réjouis-toi cher journal, car c'est ce que nous allons faire !<br>
Bash a une fonction assez exotique que, je parie, vous n'utilisez pas tous les jours : M-C-e. Celle-ci effectue une expansion de la ligne de commande en cours : alias, sous-commandes et historique. Par exemple, si ma commande est :</p>
<pre><code class="bash"><span class="nv">$ </span>ls <span class="k">$(</span>cat fichier_a_regarder<span class="k">)</span></code></pre>
<p>et que fichier_a_regarder contient « toto », alors la commande devient :</p>
<pre><code class="bash"><span class="nv">$ </span>ls toto</code></pre>
<p>Vous vous demandez à quoi cela va nous servir ? Et bien, à exécuter des commandes pour nous aider à écrire notre ligne de commande, pardi !<br>
Par exemple, si on fait :</p>
<pre><code class="bash"> <span class="s2">"\ea"</span>: <span class="s1">' \\\'$(ls | dmenu)\\\'\e\C-e'</span></code></pre>
<p>Cela va nous ouvrir un dmenu listant les fichiers du dossier en cours. On choisit l'un d'eux, et ça colle son nom dans la commande en cours. Pratique quand on a un dossier rempli de fichiers aux noms tordus et similaires !</p>
<p>Terminons par mon raccourci favori :</p>
<pre><code class="bash"> <span class="s2">"\e:"</span>: <span class="s1">'\\\'$(ls -t -1 -d * | head -n 1)\\\' \e\C-e'</span></code></pre>
<p>Qu'est-ce que ça fait ? Eh bien, ça va chercher le fichier ou dossier le plus récent du dossier en cours et nous le colle dans la ligne de commande en cours. <em>Très</em> pratique quand on passe son temps à enregistrer des fichiers et à oublier leur nom 10 secondes plus tard.</p>
<p>Notez tout de même que l'expansion remplace toutes les commandes de la ligne de commande : faites donc attention à ce que vous faites, pour ne pas exécuter de commande par erreur. Notez aussi que ça remplace les alias par leur valeur, ce qui peut être ennuyeux.</p>
<p>Allez, en bonus, si on se déplaçait dans l'arborescence à coup de flèches, à la ranger ?<br>
Pour ce faire, plaçons ces lignes dans le .inputrc :</p>
<pre><code class="bash"> <span class="s2">"\e[1;3D"</span>: <span class="s1">'\C-a\C-kcd_left\n'</span>
<span class="s2">"\e[1;3C"</span>: <span class="s1">'\C-a\C-kcd_right\n'</span>
<span class="s2">"\e[1;3A"</span>: <span class="s1">'\C-a\C-kcd_up\n'</span>
<span class="s2">"\e[1;3B"</span>: <span class="s1">'\C-a\C-kcd_down\n'</span></code></pre>
<p>Puis définissons les alias associés dans le .bashrc :</p>
<pre><code class="bash"> <span class="nb">alias </span><span class="nv">cd_left</span><span class="o">=</span><span class="s1">'cd .. && ls'</span>
<span class="nb">alias </span><span class="nv">cd_right</span><span class="o">=</span><span class="s1">'cd "$(first_folder)" 2>/dev/null && ls'</span>
<span class="nb">alias </span><span class="nv">cd_up</span><span class="o">=</span><span class="s1">'cd "$(prev_folder)" 2>/dev/null && ls'</span>
<span class="nb">alias </span><span class="nv">cd_down</span><span class="o">=</span><span class="s1">'cd "$(next_folder)" 2>/dev/null && ls'</span></code></pre>
<p>Et les fonctions associées (que je ne détaille pas, je laisse les trolls critiquer la piètre qualité de mon code) :</p>
<pre><code class="bash"> prev_folder<span class="o">()</span> <span class="o">{</span>
<span class="nv">prev_dirs</span><span class="o">=</span><span class="k">$(</span>ls -1 --group-directories-first ..<span class="k">)</span>
<span class="nv">IFS</span><span class="o">=</span><span class="s1">$'\n'</span> <span class="nb">dirs</span><span class="o">=(</span><span class="k">$(</span>ls -1 --group-directories-first ..<span class="k">)</span><span class="o">)</span>
<span class="nv">pos_dir</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">"$prev_dirs"</span> <span class="p">|</span> grep -n <span class="s2">"^$(basename "</span><span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span><span class="s2">")$"</span> <span class="p">|</span> perl -pe <span class="s1">'s/^(\d+).*/\1/'</span><span class="k">)</span>
<span class="nv">pos_prev_dir</span><span class="o">=</span><span class="k">$((</span> <span class="nv">$pos_dir</span> <span class="o">-</span> <span class="m">2</span> <span class="k">))</span>
<span class="nv">prev_dir</span><span class="o">=</span>../<span class="k">${</span><span class="nv">dirs</span><span class="p">[</span><span class="s2">"$pos_prev_dir"</span><span class="p">]</span><span class="k">}</span>
<span class="k">if</span> <span class="o">[</span> -d <span class="s2">"$prev_dir"</span> <span class="o">]</span>
<span class="k">then</span>
<span class="nb">echo</span> <span class="s2">"$prev_dir"</span>
<span class="k">else</span>
<span class="nb">echo</span> <span class="s2">"/dev/null"</span>
<span class="k">fi</span>
<span class="o">}</span>
next_folder<span class="o">()</span> <span class="o">{</span>
<span class="nv">prev_dirs</span><span class="o">=</span><span class="k">$(</span>ls -1 --group-directories-first ..<span class="k">)</span>
<span class="nv">IFS</span><span class="o">=</span><span class="s1">$'\n'</span> <span class="nb">dirs</span><span class="o">=(</span><span class="k">$(</span>ls -1 --group-directories-first ..<span class="k">)</span><span class="o">)</span>
<span class="nv">pos_dir</span><span class="o">=</span><span class="k">$(</span><span class="nb">echo</span> <span class="s2">"$prev_dirs"</span> <span class="p">|</span> grep -n <span class="s2">"^$(basename "</span><span class="k">$(</span><span class="nb">pwd</span><span class="k">)</span><span class="s2">")$"</span> <span class="p">|</span> perl -pe <span class="s1">'s/^(\d+).*/\1/'</span><span class="k">)</span>
<span class="c"># array start at 0, but grep starts numerotating at 1</span>
<span class="c"># Hence, there is no need to add 1</span>
<span class="nv">next_dir</span><span class="o">=</span>../<span class="k">${</span><span class="nv">dirs</span><span class="p">[</span><span class="s2">"$pos_dir"</span><span class="p">]</span><span class="k">}</span>
<span class="k">if</span> <span class="o">[</span> -d <span class="s2">"$next_dir"</span> -a <span class="s2">"$next_dir"</span> !<span class="o">=</span> <span class="s2">"../"</span> <span class="o">]</span>
<span class="k">then</span>
<span class="nb">echo</span> <span class="s2">"../${dirs["</span><span class="nv">$pos_dir</span><span class="s2">"]}"</span>
<span class="k">else</span>
<span class="nb">echo</span> <span class="s2">"/dev/null"</span>
<span class="k">fi</span>
<span class="o">}</span>
first_folder<span class="o">()</span> <span class="o">{</span>
<span class="nv">first_dir</span><span class="o">=</span><span class="k">$(</span>ls -1 --group-directories-first . <span class="p">|</span> grep -m <span class="m">1</span> <span class="s2">""</span><span class="k">)</span>
<span class="k">if</span> <span class="o">[</span> -d <span class="s2">"$first_dir"</span> <span class="o">]</span>
<span class="k">then</span>
<span class="c"># without ./, the folder will put printed because of CDPATH</span>
<span class="nb">echo</span> <span class="s2">"./$first_dir"</span>
<span class="k">else</span>
<span class="nb">echo</span> <span class="s2">"/dev/null"</span>
<span class="k">fi</span>
<span class="o">}</span></code></pre>
<p>Et finalement, empêchons ces commandes de polluer notre historique :</p>
<pre><code class="bash"> <span class="nb">export </span><span class="nv">HISTIGNORE</span><span class="o">=</span><span class="s2">"cd_*"</span></code></pre>
<p>Et voilà, ça marche !</p>
<p>J'espère que ce journal vous donnera plein d'idées géniales que vous posterez en commentaire et qui iront compléter mon .inputrc !</p><div><a href="https://linuxfr.org/users/perdu/journaux/faire-de-la-magie-avec-son-inputrc.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/105190/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/perdu/journaux/faire-de-la-magie-avec-son-inputrc#comments">ouvrir dans le navigateur</a>
</p>
Perduhttps://linuxfr.org/nodes/105190/comments.atomtag:linuxfr.org,2005:Post/346502014-11-16T15:47:08+01:002014-11-16T15:47:08+01:00Saut de ligne automatique avec Thunderbird ?<p>Bonjour à tous,</p>
<p>Je suis un peu désespéré. Ca fait plusieurs fois que je recherche sur internet comment<br>
configurer Thunderbird afin qu'il retourne à la ligne automatiquement lors de la<br>
rédaction d'un e-mail, à partir de, par exemple, 72 caractères.</p>
<p>J'ai joué par exemple avec ça :</p>
<pre><code>mailnews.display.prefer_plaintext
mailnews.wraplength
mail.compose.wrap_to_window_width
</code></pre>
<p>J'ai modifié le format d'envoi à HTML, plain text, etc. mais rien n'y fait.</p>
<p>Auriez-vous une idée ???</p>
<p>Merci,<br>
Bastien</p><div><a href="https://linuxfr.org/forums/linux-general/posts/saut-de-ligne-automatique-avec-thunderbird.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/103972/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/forums/linux-general/posts/saut-de-ligne-automatique-avec-thunderbird#comments">ouvrir dans le navigateur</a>
</p>
PolePositionhttps://linuxfr.org/nodes/103972/comments.atomtag:linuxfr.org,2005:News/356162014-08-27T14:27:34+02:002014-08-30T19:12:16+02:00Nouveautés chez Prof TuxLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Quelques nouveautés chez <a href="https://prof-tux.fr/">Prof Tux</a>, un site de conseils sur GNU/Linux et le Libre. Après avoir migré la boutique vers un hébergeur ayant ses serveurs en France, puis refait entièrement la boutique, toujours avec une solution libre, avoir enlevé Google Analytics (pour des raisons de respect de la vie privée), je publie maintenant de <a href="https://prof-tux.fr/16-logiciels">nouveaux tutoriels</a>. Ils sont plus orientés vers le monde associatif, afin de les aider à découvrir les solutions libres disponibles et les accompagner dans leur migration.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f70726f662d7475782e66722f696d672f70726f662d7475782d313430363139343232322e6a7067/prof-tux-1406194222.jpg" alt="Prof Tux" title="Source : https://prof-tux.fr/img/prof-tux-1406194222.jpg"></p>
<p>J’ai aussi rédigé un petit <a href="https://prof-tux.fr/divers/22-logiciels-libres-et-associations.html">guide des solutions libres</a> spécialement pour les associations. Alors, venez découvrir tout cela chez Prof Tux, il y a maintenant un système de points de fidélité.</p>
<p><em>N. D. M. : Voir aussi le <a href="http://guide.libreassociation.info/">Guide Libre Association</a> de l’April (et la <a href="http://guide.libreassociation.info/">campagne d’appel à dons</a> pour encore une journée).</em></p></div><ul><li>lien nᵒ 1 : <a title="https://prof-tux.fr/" hreflang="fr" href="https://linuxfr.org/redirect/91301">Prof Tux</a></li><li>lien nᵒ 2 : <a title="http://andre-ani.fr/" hreflang="fr" href="https://linuxfr.org/redirect/91302">Le blog d’ANDRE Ani</a></li></ul><div></div><div><a href="https://linuxfr.org/news/nouveautes-chez-prof-tux.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/103097/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/nouveautes-chez-prof-tux#comments">ouvrir dans le navigateur</a>
</p>
ANDRE AniDavy DefaudNÿcotuiu polBenoît Sibaudhttps://linuxfr.org/nodes/103097/comments.atomtag:linuxfr.org,2005:News/353522014-05-08T11:29:34+02:002014-05-08T11:29:34+02:00Makefly, une alternative au moteur de blog statique NanobloggerLicence CC By‑SA http://creativecommons.org/licenses/by-sa/4.0/deed.fr<div><p>Makefly se veut être une alternative rapide et légère au moteur de blog statique Nanoblogger, sachant que ce dernier a été <a href="http://nanoblogger.sourceforge.net/archives/2013/02/10/official_announcement_development_suspended_indefinitely/">abandonné l'année dernière</a>.</p>
<p>Ce fut donc l'occasion pour certains de passer à autre chose, pour d'autres de revoir la manière dont fonctionnait leur blog et de comment l'améliorer. C'est ainsi que Makefly vit le jour, utilisant Markdown comme format de billet.</p>
<p><img src="//img.linuxfr.org/img/68747470733a2f2f6f6c69766965722e646f73736d616e6e2e6e65742f626c6f672f6c6f676f2e676966/logo.gif" alt="Titre de l'image" title="Source : https://olivier.dossmann.net/blog/logo.gif"></p>
<p>L'outil en est à sa version 0.3 et continue sa petite vie (il aura 2 ans en juin). Il propose une modeste documentation et une possibilité de migrer ses billets depuis Nanoblogger.</p>
<p>Il utilise Lua et les BSD Makefile, et est fourni sous licence <a href="http://www.gnu.org/licenses/agpl.html">AGPL</a>.</p></div><ul><li>lien nᵒ 1 : <a title="http://makefly.depotoi.re" hreflang="fr" href="https://linuxfr.org/redirect/90408">Site officiel</a></li></ul><div><p>Makefly propose les fonctionnalités suivantes :</p>
<ul>
<li>ajout d'article (heureusement !)</li>
<li>liste d'articles</li>
<li>tags pour chaque article</li>
<li>mot-clé pour chaque article afin d'améliorer le référencement</li>
<li>type pour un article afin de les catégoriser</li>
<li>flux RSS</li>
<li>système de commentaire externe (jskomment installable chez soi)</li>
<li>barre latérale personnalisable</li>
<li>page statique possible</li>
<li>ajout de fichiers divers et variés (images, etc.)</li>
<li>page d'« à propos »</li>
<li>antidatage</li>
<li>traduction facile dans des fichiers textes</li>
<li>badge StatusNet/GNU Social possible</li>
<li>sauvegarde des éléments du blog</li>
<li>système de publication (SSH, rsync, etc.)</li>
<li>migration des articles depuis Nanoblogger</li>
</ul><p>Personnalisation :</p>
<ul>
<li>choix du thème</li>
<li>création facile d'un nouveau thème</li>
<li>ajout simple d'une entête ou d'une enqueue à son blog dans un simple fichier</li>
<li>personnalisation du nom des répertoires contenant les articles et celui contenant les tags</li>
<li>choix du nombre d'articles affichés en page d'accueil, ordre ascendant ou descendant</li>
<li>choix de la séparation de la liste d'articles en plusieurs pages et combien d'articles par page</li>
<li>ajout de variable modifiables facilement pour les templates des thèmes</li>
</ul></div><div><a href="https://linuxfr.org/news/makefly-une-alternative-au-moteur-de-blog-statique-nanoblogger.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/102114/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/news/makefly-une-alternative-au-moteur-de-blog-statique-nanoblogger#comments">ouvrir dans le navigateur</a>
</p>
Blankoworldbubar🦥Benoît SibaudOntologiaclaudexhttps://linuxfr.org/nodes/102114/comments.atomtag:linuxfr.org,2005:Diary/318712011-11-22T22:06:34+01:002011-11-22T22:06:34+01:00Weboob - Web out of Browsers - l'outil qui a changé ma vieLicence CC By‑SA http://creativecommons.org/licenses/by-sa/3.0/deed.fr<h2 id="sommaire">Sommaire</h2>
<ul><li><a href="#toc_0">Weboob, koitesse ?</a></li>
<li><ul><li><a href="#toc_1">Pour les décideurs pressés</a></li>
<li><a href="#toc_2">Pour les gens qui ont un cerveau</a></li>
</ul></li>
<li><a href="#toc_3">Exemples</a></li>
<li><ul><li><a href="#toc_4">La théorie</a></li>
<li><a href="#toc_5">La pratique</a></li>
<li><ul><li><a href="#toc_6">Installer weboob</a></li>
<li><a href="#toc_7">Configuration</a></li>
</ul></li>
</ul></li>
<li><a href="#toc_8">Teasing</a></li>
<li><a href="#toc_9">Contribuez</a></li>
</ul><p>Monjour, nal !</p>
<p>Aujourd'hui, si je prends ma plume numérique, c'est pour te parler d'un soft. Ce soft, nous ne le connaissons pas. Ni vous ni nous (oh le petit chat).</p>
<p>Il s'agit de <a href="http://weboob.org/">weboob</a>.</p>
<h2 id="toc_0">Weboob, koitesse ?</h2>
<p>Weboob, comme son petit nom l'indique, permet d'accéder au web en dehors des navigateurs Web. Ça c'est pour la description. Concrètement, comment ça se passe ?</p>
<h3 id="toc_1">Pour les décideurs pressés</h3>
<p>Weboob - Web Out Of Browsers - permet d'interagir avec plein de sites Web facilement, en ligne de commande ou bien via une GUI, au choix.</p>
<p>On peut par exemple récupérer ou regarder les vidéos sur les sites supportés (arte, canal+, dailymotion, France Télévisions, INA, Youjizz, Youporn et Youtube pour le moment).</p>
<p>On peut faire la même chose avec des fichiers audio (franceinter, LeMouv, Nova et OuiFM pour le moment).</p>
<p>On peut également gérer des comptes sur des sites Web, gérer des comptes bancaires, utiliser des wikis (lecture, édition, getsion des révisions), poster des messages, rechercher des torrents, recevoir le la météo etc.</p>
<p>Bref, des choses que l'on peut faire dans un navigateur, mais sans la nécessité de démarrer un navigateur (la RAM vous dit merci), automatisable simplement (cf le plugin munin plus bas), pluggable facilement (cf mutt plus bas), accessible (un handicapé moteur pourra se connecter au site de sa banque sans passer trois heures à viser ces putains de chiffres avec une souris qu'il lui est difficile de maitriser), sûr (si j'ai envie de consulter mes comptes depuis un endroit bondé de monde disposant de wifi, je n'ai pas spécialement envie que quelqu'un me voie taper mon code, dans boobank, la zone de saisie est masquée). Bref en un mot "mieux".</p>
<h3 id="toc_2">Pour les gens qui ont un cerveau</h3>
<p>Weboob permet d'interagir avec plein de sites. Mais comme chaque site est différent, il faut un backend pour chaque site. Mais globalement, plein de sites sont proches. Regarder un compte en banque sur le site la bnp se fait globalement de la même manière que sur celui du crédit agricole, de la banque postale ou de n'importe quel autre. Et regarder une vidéo sur les sites de canalplus, youtube ou arte nécessite globalement de faire les mêmes actions.</p>
<p>Pour simplifier tout ça, weboob est composé d'<a href="http://weboob.org/#Applications">applications</a> qui implémentent de <a href="http://weboob.org/Capabilities">capabilities</a> qui sont gérés par des <a href="http://weboob.org/#Backends">backends</a>.</p>
<p>Bon ok dit comme ça, ça ne parait pas très clair. Prenons des exemples.</p>
<h2 id="toc_3">Exemples</h2>
<h3 id="toc_4">La théorie</h3>
<p>Comme dit plus haut, gérer un compte en banque, ça se fait globalement pareil sur tous les sites des banques. Il existe donc une capability <a href="http://weboob.org/CapBank">CapBank</a>. Cette capability définit des ensemble d'actions communes à des backends (les sites des banques disposant d'un backend). C'est à dire que le backend bnp, tout comme le backend SG (mon préféré) devraient se comporter pareil. En pratique, ce n'est pas toujours le cas malheureusement. Certains backends n'implémentent pas certaines fonctionnalités. La faute aux sites plus abscons les uns que les autres, sans API, qu'il faut se parser à la main.</p>
<p>Et pour utiliser ces backends disposant de la capability CapBank, il faut utiliser une application implémentant cette capability. C'est le boulot de <a href="http://weboob.org/Boobank">boobank</a>. boobank list va lister tous mes comptes. Après on peut aussi faire des choses <a href="http://people.symlink.me/~rom1/blog/weboob/Opérations_bancaires.html">bien plus compliquées</a> : grapher ses comptes dans munin, prévoir des virement automatiques quand un compte qui ne rapporte pas se remplit (vers un compte qui rapporte donc), prévoir des alertes par sms quand ça s'approche trop de zéro (et pourquoi pas un transfert automatique).</p>
<p>Bon j'avoue, je tease un peu. Tout n'est pas encore possible.</p>
<p>Un autre exemple, plus simple.</p>
<p>Si je cherche une vidéo, je peux utiliser l'application videoob (cli) ou QVideoob (gui). Ces deux applications permettent d'utiliser les backends disposant de la capability <a href="http://weboob.org/CapVideo">CapVideo</a> (arte, canal+, dailymotion, France Télévisions, INA, Youjizz, Youporn et Youtube pour le moment). Si je veux récupérer le dernier bref¹, je peux lancer videoob, puis taper "search bref" et "download #id" (en fonction de la dernière liste retournée). Si j'utilise gnome, qui est un outil de nazis de l'interface, j'aurais probablement envie de récupérer le dernier documentaire sur Hitler super bien fait. Mais je ne sais plus si c'est sur canal+, arte ou FranceTV. Pas grave. Comme j'ai loadé tous les backends des chaines de télévision, videoob me proposera automatiquement ce qu'il trouve sans que je me pose des questions.</p>
<p>¹ D'ailleurs ce merveilleux outil pourrait même simplifier la vie de <a href="http://linuxfr.org/users/lebouquetin/journaux/bref-jai-fait-un-script-python">certaines personnes</a> (qui en plus ont des compétences en python, exactement ce qu'il faut pour contribuer à weboob).</p>
<p>Dernier exemple : </p>
<p>Supposons que j'utilise un site communautaire francophone (mais de classe américaine) dédié aux news sur les produits Apple pour troller^W débatre de sujets divers et variés tels que l'évolution des moulins, le comique de répétition, l'espérance de vie de l'évêque de Rome ou encore le déblocage des claviers.</p>
<p>On pourrait imaginer qu'il existe des capabilites pour interagir avec ce site. Par exemple <a href="http://weboob.org/CapContent">CapContent</a> qui permettrait de gérer des contenus avec révisions (pour les wikis donc), <a href="http://weboob.org/CapMessages">CapMessages</a> permettrait de recevoir des contenus et <a href="http://weboob.org/CapMessagesPost"></a><a href="http://weboob.org/CapMessagesPost">http://weboob.org/CapMessagesPost</a> permettrait d'y répondre.</p>
<p>On pourrait faire implémenter ces capabilities message à une application <a href="http://weboob.org/Boobmsg">BoobMsg</a> qui se présenterait comme le vénérable mail(1).</p>
<p>On pourrait aussi se dire que des outils plus récents de mail existent. Genre mutt (qui pue moins que les autres clients mail). Dans ce cas on utiliserait un démon qu'on pourrait appeler <a href="http://weboob.org/Monboob">Monboob</a>. Ce qui permettrait de lire les threads dans le puissant et ultra scriptable mutt. Ce qui est cool aussi, c'est que seuls les messages effectivement lus seraient marqués en tant que tels. Alors que le site en question marquerait comme lus tous les messages de la page (re)chargée. Et puis pour les grosses pages de débat enflammé, ça économiserait probablement beaucoup de ram.</p>
<p>Bon tout ça, c'est bien gentil, mais en pratique, comment qu'on fait pour l'utiliser ?</p>
<h3 id="toc_5">La pratique</h3>
<h4 id="toc_6">Installer weboob</h4>
<p>Tout est expliqué dans <a href="http://weboob.org/Installation">la documentation</a>. On rajoute les repos de sa distrib, on lance les commandes de mise à jour et ça tourne.</p>
<p>Il est également possible de récupérer des tarballs ou de cloner un repo git (branche stable ou développement).</p>
<h4 id="toc_7">Configuration</h4>
<p>Pareil, tout est décrit <a href="http://weboob.org/Backends_Configuration">dans la documentation</a>. Cependant, je n'utilise pas les méthodes décrites. Je n'utilise pas weboob-config pour configurer tous mes backends. Je le fais au cas par cas. Par exemple, j'utilise videoob, que je lance en mode interactif. Ensuite j’utilise les commandes "backend add/enable $backend". Avec l'autocomplétion sur les commandes, c'est le bonheur intégral.</p>
<p>Pour ce qui est de munin, je vous laisse vous référer à la page dédiée citée plus haut. De même pour utiliser votre site préféré dans mutt.</p>
<h2 id="toc_8">Teasing</h2>
<p>Ok, Nal, c'est le moment de se projeter dans l'avenir (pas trop fort hein). Prend une grande respiration et ferme les yeux.</p>
<p>Imagine que demain, les principaux sites que tu utilises soient weboobisés :</p>
<ul><li>Tous les sites sur lesquels tu as des comptes permettant de poster des messages sont dans mutt (dont applefr.org et slashdot).</li>
<li>Tes bugs reports (de trac à bugzilla en passant par mantis, ainsi que l'incontournable Debian BTS) sont rédigés sous vim et envoyés directement à l'appli via weboob.</li>
<li>Toutes tes vidéos (avec plein d'autres sites supportés, genre koreus, vimeo, metacafe, l'Assemblé nationale, LCPan, le parlement européen, les autres chaines de télévision (et de radio) etc.), sont dans un dossier "à voir", peut être un jour. Tu as l'esprit tranquille. Il n'est plus nécessaire d'avoir 20 onglets avec des vidéos (dont tu suspectes la moitié des vidéos d'être un truc à base de lolcat). Plus besoin de se taper ces messages stupides de sites à la con style « Ah ah bouffon, tu n'as pas le dernier flush de la daube, t'es trop con » (fonctionne aussi avec Civet de Blattes de petimou). Plus de "Ah ah, sale pauvre avec ton FireFox moisi, j'implémente peut être la balise vidéo, mais sans H.264, tu peux aller te faire enculer » ou la version « Ah ah, pauvre con de bourgeois avec ton Safari de riche, tu as peut etre payé une mine d'or ta bouse, mais moi c'est du WebM ma vidéo alors tu l'as dans le cul ». Nan, on s'en branle de tout ça. On downloade la vidéo, et on la regarde si on a le codec dans le système, comme ça aurait toujours du être. Pourquoi pas également payer ses impôts en ligne (de commandes !), chercher des lois, amendements, décrets, sur legifrance, sur le site du sénat et de l'AN et au Parlement Européen, etc.</li>
<li>Plus jamais besoin d'utiliser la souris pour consulter ses comptes. Tous les comptes sont automatiquement graphés dans munin, nagios, zabbix, icinga etc. Ils sont également importés dans grisbi, gnucash ou autre.</li>
</ul><p>Alors franchement, Nal, ça ne fait pas envie ?</p>
<p>Avoue !</p>
<h2 id="toc_9">Contribuez</h2>
<p>Bon tout ça, on en est encore loin, même si on peut déjà faire des choses magnifiques avec weboob.</p>
<p>Alors, mon cher Nal, si tu as des compétences en python et que tu utilises un site qui n'a pas encore de backend, n'hésite plus, tu as trouvé ta vocation. Tout est marqué ici : [<a href="http://weboob.org/How_to_contribute">http://weboob.org/How_to_contribute</a>].</p>
<p>Sinon il y a parfois des <a href="http://weboob.org/Boobathons">Boobathons</a>, c'est à dire des rencontres de geeks dont le but est de faire le plus de backends possible le plus rapidement possible. Il n'y en a pas encore de prévu, mais j'espère que ça ne va pas tarder.</p>
<p>Sinon, à défaut, tu peux toujours en parler autour de toi, rapporter des bugs, créer des paquet pour ta distrib préférée, ou pousser pour qu'elle le soit¹.</p>
<p>¹ Si ta distribution en question est Debian, et surtout si tu es impliqué dans le projet, peut etre pourras-tu aider à faire rentrer le paquet dans la distribution. Un <a href="http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=577667">ITP</a> a été fait. Un <a href="http://lists.debian.org/debian-mentors/2011/04/msg00105.html">message</a> a été envoyé sur la liste debian-mentors (ce qui me semble être la liste adéquate). Le message n'a eu que deux réponses, l'une pour dire qu'il y aurait peut être des modifications à apporter pour que le paquet soit accepté, l'autre pour dire que pas sûr en fait. L'auteur original a demandé plus de détails et la discussion s'est arrêté là (depuis plus de 6 mois). Bref, quiconque a une idée de la manière de faire avancer les choses est le bienvenu.</p>
<p>Jounal honteusement rédigé sous vim et posté sous Firefox. Mais promis, demain j'arrête^W je me mets à Monboob</p><div><a href="https://linuxfr.org/users/j_kerviel/journaux/weboob-web-out-of-browsers-loutil-qui-a-chang%C3%A9-ma-vie.epub">Télécharger ce contenu au format EPUB</a></div> <p>
<strong>Commentaires :</strong>
<a href="//linuxfr.org/nodes/88327/comments.atom">voir le flux Atom</a>
<a href="https://linuxfr.org/users/j_kerviel/journaux/weboob-web-out-of-browsers-loutil-qui-a-chang%C3%A9-ma-vie#comments">ouvrir dans le navigateur</a>
</p>
j_kervielhttps://linuxfr.org/nodes/88327/comments.atom