URL: https://linuxfr.org/users/sygne/journaux/exemple-d-interface-en-ligne-de-commande Title: Exemple d'interface en ligne de commande Authors: Sygne Date: 2012年08月27日T22:45:39+02:00 License: CC By-SA Tags: troff Score: 50 Bonjour à tous, Comme vous le savez peut-être, j'apprécie l'ergonomie de la ligne de commande, en particulier parce qu'elle me permet de travailler dans mon élément : le texte. Manipuler des textes, c'est ce que je fais à longueur de journée : lire, indexer, citer, écrire... Avec le temps, je me suis créé plusieurs outils pour me faciliter la tâche, et ce journal a pour but de vous présenter l'ergonomie de certains de ces outils, avant que ne vienne le jour de leur publication. Indexation de livres ==================== Indexation de livres papiers ---------------------------- La chose qu'on indexe, c'est le livre. Comme le livre est rarement numérique, son indexation se fait à la main – travail de lettré, comme au bon vieux temps. En outre, une entrée d'index ne correspond pas forcément à un mot du texte : le sous entendu est fréquent, des tournures complexes se résument parfois en un mot, etc. De fait, un travail d'indexation ne peut éviter la lecture et la prise de note. La méthode la moins efficace consiste à ajouter le numéro de page à une liste de mots : on passe plus de temps à chercher le mot qu'à noter la page. Mieux vaut indiquer, pour chaque page, la liste des mots qui la compose, par exemple ainsi : ``` 256: différance, ontologie, apparoir, donation 257: différance, Derrida, donation 258: donation, ontologie, manifestation ``` Cependant, comme ce n'est pas cette organisation qu'on attend d'un index, un petit script awk, nommé `idx`, permettra de transformer ces données pour obtenir un liste triée de mots : ``` apparoir: 256 différance: 256-257 donation: 256-258 manifestation: 258 ontologie: 256, 258 ``` Une fois formaté, l'index doit être vérifié, et corrigé. Du coup, il faut le reformater. Il nous faut aussi pouvoir exporter l'index dans un format imprimable, ou obtenir une liste de pages à partir d'une liste de mots. Ainsi, `idx` accepte plusieurs options : ```bash idx -w # liste de pages vers liste de mots idx -p # liste de mots vers liste de pages idx -r # reformate une liste de mots idx -t # liste de mots vers un format imprimable (troff) ``` Le format d'index est si simple qu'il se consulte avec grep. Dans le répertoire de l'auteur, on créé un index par ouvrage, et `grep différance *` permet de retrouver les pages où notre auteur discute de la non origine à l'origine de l'origine. Indexation de documents numérique --------------------------------- `idx` peut être utilisé pour indexer un document numérique. Avec troff, on utilisera par exemple la macro `ix`, qui indexe un mot, et la macro `index` qui imprime l'index en utilisant `idx` pour le formater – macros que l'on peut résumer ainsi : ```groff .\" macro ix: .de ix . \" enregistre, dans la macro record, . \" le premier argument et le numéro de page. . am record \\1ドル: \\n% \\.. .. . .\" macro index: .de index . \" écrit le contenu de record dans un fichier temporaire. . open myindex /tmp/myindex . writem record . close myindex . \" formatte ce fichier avec idx . \" et ajoute cela au flux du texte . pso idx -t /tmp/myindex .. . .\" contenu du document: lorem ipsum .ix lorem .index ``` Si notre troff est groff, on lui passera l'option `-U` (unsafe) pour activer les macros `open`, `writem` et `pso`. Si notre troff est heirloom troff, on lui passera l'option `-x3` pour activer les macros de plus de deux lettres. Collection de citations ======================= Une base de données ------------------- La gestion des citations ne consiste pas seulement à insérer des références bibliographiques dans un document. Il faut aussi manipuler les citations elles-mêmes. Imaginez que notre auteur discute à cent reprises, dans dix ouvrages différents, de la diffférance derridienne. Il faut avoir ces passages sous les yeux pour les lire, les relire, les méditer et les comparer, tout en construisant son raisonnement référencé. On pourra décider d'ouvrir et de fermer les livres à n'en plus finir. On pourra préférer remplacer une des lectures par la numérisation du document. Une petite base de donnée (sqlite) fait bien l'affaire pour stocker tout ça. Elle n'a que trois tables et une vue qui les coordonne : livres, textes et chapitres (`books`, `texts`, `heads`). La table des chapitres est indispensable, car la norme iso-690 (que nous _devons_ suivre lorsque nous insérons nos références bibliographiques) nous indique qu'il faut indiquer, outre la page, le chapitre d'où la citation est extraite. C'est du reste nécessaire pour retrouver une citation dans une autre édition que celle de l'auteur. Dans la table `texts` sont stockés les textes, leur numéro de page, un titre pour le texte, et un lien vers l'entrée de chapitre correspondante. Dans la table `heads` sont indiqués le titre du chapitre, la page où ce titre apparaît, et un lien vers le livre correspondant. Dans la table `books` sont indiquées les informations éditoriales. C'est simple et stupide mais ça convient à tous les cas que j'ai rencontrés. Ainsi, un article cité dans un livre prend une entrée de la table `books` à lui tout seul, même si le livre qui le contient est déjà référencé dans la même table – c'est redondant, mais ça évite bien des complications dans la gestion de la base de donnée. Les champs sont constitués de deux lettres : la première définit la table, la seconde le champ. Ainsi `ba` est le champ auteur dans la table `books`, `tp` le champ numéro de page dans la table `texts`, `hh` le champ chapitre dans la table `heads`. Exception aux deux lettres, l'id unique de chaque champ est noté en une lettre, qui correspond au nom de la table: `b`, `t`, `h` `v` (v dans la vue = t dans la table texts ) – simplement parce que `bi` est déjà pris (c'est le champ de l'éditeur (_issuer_)). Dans la table `texts`, l'id du chapitre correspondant est noté `th`, et dans la table `heads`, l'id du livre correspondant est noté `tb`. Gestion des citations --------------------- Un logiciel, nommé `sophia`, sert d'interface pour travailler sur la base de donnée. Son interface est assez simple : le premier argument est une commande, il est suivi d'une liste de champs, eux même suivis du contenu dudit champ. Les commandes de base sont : `search`, `print`, `insert`, `update` : ```bash sophia insert -ba Derrida -bt "De la grammatologie" sophia print -b 1 sophia search -ba Derrida sophia update -b 1 -ba "Derrida, Jacques" sophia insert -hb 1 -hh "Chapitre premier" -hp 25 sophia insert -hb 2 -hh "Chapitre second" -hp 75 ``` En outre, la commande `edit` indique à `sophia` d'ouvrir notre éditeur préféré pour insérer confortablement les données. Maintenant, pour insérer un texte, il faut connaître l'id du chapitre dans lequel il s'insère. C'est fastidieux de chercher cela dans le livre pour chaque texte enregistré. Mieux vaut entrer toute la table des matières d'un coup dans la base de donnée, et utiliser ensuite une commande appropriée, qui renvoie, pour un ouvrage et une page donnés, l'id du chapitre correspondant. ```bash sophia head -hb 1 -tp 76 -tt "Mon texte" # retourne une ligne de commande # contenant l'id du chapitre correspondant # pour compléter le champ th: sophia insert -th 2 -tp 76 -tt "Mon texte" ``` Si on fait confiance à `sophia`, on peut insérer directement les données au bon endroit : ```bash $(sophia head -hb 1 -tp 27 -tt "Mon texte") ``` On peut aussi utiliser un script pour d'abord vérifier que cette page n'a pas déjà été introduite dans la base : ```bash #!/bin/sh if [ ! $(sophia search $*) ]; then $(sophia head $*) fi ``` Enfin, pour lire confortablement les textes insérés, on peut formater les textes avant des les afficher. La commande `troff` permet d'afficher le contenu de la base dans un format compréhensible par troff. Avec un peu de plomberie, on arrive à un beau résultat : ```bash # on pioche dans la vue pour afficher toutes les données sophia troff -v 34 | nroff -ms | less sophia troff -v 12 | groff -ms | ps2pdf - texte.pdf ``` Pour un résultat optimal, le texte inséré dans la base de donnée doit être lui-aussi mis en forme. `sophia` n'impose aucun format, l'utilisateur pourra utiliser text2tags ou latex, pour peu que `sophia` ait un filtre adapté – chose qui n'est pas difficile à coder. Références bibliographiques =========================== La base de donnée de `sophia` peut être utilisée pour insérer les références bibliographiques dans le texte qu'on écrit. Il faut alors insérer des marques dans le texte : `@ id`, où id est l'id du texte qu'on cite. Un logiciel, nommé `philia`, remplace ces marques par les références correctement formatées pour troff. On imprime son papier ainsi : ```bash philia paper.tr | troff -ms | lpr philia paper.tr | nroff -mail | mailx someone@example.com philia paper.tr | nroff -mxml | xsltproc syle.xsl -> paper.html wput paper.html ftp://example.com ``` Sauvegarde des modifications ============================ Enfin, un texte est un fichier qui évolue beaucoup, et dont on souhaite généralement conserver les états précédents. Les logiciels de contrôle de révisions sont connus ici, mais ceux qui sont connus sont très orientés développement. Pour un usage local, on peut préférer des outils moins connus, tels rcs, dont il existe deux versions: gnu rcs (gpl), et openrcs (bsd). Il permet d'archiver les évolutions d'un fichier dans le répertoire même du fichier (ou dans le sous-répertoire RCS s'il existe). En voici les commandes les plus fréquentes: ```bash ci paper.tr rlog paper.tr rcsdiff paper.tr co paper.tr ``` C'est un outil précieux lorsqu'on manipule beaucoup de textes. Il justifie à lui-seul l'utilisation d'un format texte brut pour écrire du texte. Conclusion ========== La ligne de commande ne sert pas qu'à administrer son système d'exploitation. Elle est aussi utile pour créer et manipuler des textes. Parce qu'elle a le langage pour interface, son ergonomie est adaptée au travail du texte. En outre, parce qu'elle extensible, elle permet à l'utilisateur avancé, pour un effort raisonnable, de créer des outils à la mesure de ses besoins. Et vous, que pensez-vous de l'ergonomie des outils présentés ici ? Y voyez-vous des erreurs grossières ou des améliorations possibles ?

AltStyle によって変換されたページ (->オリジナル) /