Greboca  

Suport technique et veille technologique

Aujourd’hui, les grandes entreprises et administrations publiques hésitent entre continuer à utiliser des logiciels propriétaires ou basculer vers les Logiciels Libres. Pourtant, la plupart des logiciels libres sont capables de bien traiter les données issues des logiciels propriétaire, et parfois avec une meilleur compatibilité.

C’est alors la barrière de la prise en main qui fait peur, et pourtant...

Les logiciels libres

L’aspect « Logiciel Libre » permet une évolution rapide et une plus grande participation des utilisateurs. Les aides et tutoriels foisonnent sur Internet ou sont directement inclus dans le logiciel lui-même.

Enfin, les concepteurs sont plus proches des utilisateurs, ce qui rend les logiciels libres plus agréable à utiliser et conviviaux.

Grâce à la disponibilité des logiciels libres, vous trouverez facilement des services de support techniques et la licence n’est plus un frein à l’utilisation de ces logiciels par votre personnel.

Notre support technique concerne essentiellement les logiciels libres, que ce soit sous forme de services ponctuels ou de tutoriels.

LinuxFr.org : les journaux  -  travailler sur de nombreux fichiers avec Vim et NeoVim, sur une seule vue

 -  Décembre 2023 - 

Sommaire

Ce premier journal, d’une série de trois, fait suite à ma réponse à une interrogation de martoni dans le forum.

L’objectif est de répondre, à travers des exemples pratiques, à la question de savoir comment on travaille avec plusieurs fichiers ; dans un premier temps dans une seule fenêtre…

Comme prérequis, il est demandé de :

  • avoir installé Vim ou Neovim ;
  • savoir utiliser une implémentation de vi pour un usage basique ;
  • savoir, optionnellement, utiliser un peu la ligne de commandes.
    (pas de panique, c’est surtout parce-que je n’ai pas testé en interface graphique.)

C’est parti ! 🏴‍☠️

la préparation

Avant d’entrer dans le vif du sujet, nous devons préparer le terrain.

Thé vert infusant dans un Zhong

alias

Afin d’éviter des commentaires de type « ça marche pas chez moi » ou « je n’obtiens pas la même chose » d’une part, et pour se focaliser sur le comportement par défaut d’autre part, on va lancer l’éditeur avec les options qui désactive toute personnalisation. Comme je privilégie une certain niveau de fainéantise et le fait de ne pas se répéter, on va se créer un alias au doux nom de dv pour « Default (Neo)Vim » tout simplement.

famille d’interpréteur de commandes pour Vim pour Neovim
Bourne shells (bash, ksh, zsh, etc.), Fish shell alias dv='vim --clean alias dv='nvim --clean
C shell (csh, tcsh, etc.) alias dv vim --clean alias dv nvim --clean
Microsoft PowerShell Function Default-Vim() { vim --clean } Set-Alias -Name dv -Value Default-Vim Function Default-Neo() { nvim --clean } Set-Alias -Name dv -Value Default-Neo
(PC/MS/Free/DR/etc.)-DOS ou (4/N)DOS, DR FlexOS, cmd.exe de Microsoft Windows (9x/ME/etc.), IBM OS/2, ReactOS doskey dv=vim --clean non disponible

Non vérifié, mais je pense que ça marche aussi si on lance l’implémentation GUI avec la même option --clean (sinon, pour Vim, il faut aussi ajouter l’option -U NONE.)

fichiers

On aura besoin de fichiers exemples. Créons un répertoire pour les accueillir (et pouvoir virer facilement l’ensemble quand on a fini.)

interpréteur de commandes commande de création de zt
shells Unix-like (sensibles à la casse) mkdir zt
Microsoft PowerShell New-Item -ItemType Directory -Path zt
*DOS, DR FlexOS, IBM OS/2, Microsoft Windows cmd.exe, ReactOS, etc. mkdir zt

On va se positionner dans ce répertoire (nommé ici zt comme « Zen Tests » par exemple, mais on peut choisir le nom de son choix) pour la suite.

interpréteur de commandes commande de position dans zt
shells Unix-like (sensibles à la casse) cd zt
Microsoft PowerShell Set-Location -Path zt
*DOS, DR FlexOS, IBM OS/2, Microsoft Windows cmd.exe, ReactOS, etc. chdir zt

Dans ce répertoire, créer un sous-répertoire d (comme « Directory » tout simplement) comme précédemment.
Ensuite, on va créer les fichiers suivants par les moyens de son choix :1

Sixth green yielding herb all form gathering him without given living a
cattle saying dry one rule female divide image seed darkness said in a
unto morning can't under saying.

fichier zt/bleu.txt

Great you'll winged cattle seas she'd, forth male saying under saying
stars abundantly days. Can't fowl under gathering moved spirit. Own
shall tree itself there appear. Creepeth meat life fly.

fichier zt/cyan.txt

You're darkness creepeth. A upon heaven. Bring he, years of male.
Moving female said morning us beast fruit two evening divide light
tree give evening it rule morning herb be.

fichier zt/jaune.txt

Whose whales bring moved female beginning fifth. Behold firmament rule
itself. Life. Wherein. Was. It thing upon bearing it abundantly tree
that. Them brought likeness multiply fifth us set. Fly.

fichier zt/magenta.txt

Made seasons is evening which. Their herb creeping have divided spirit
second is unto to set fifth light of after fruit made meat of fruitful
is whales lesser every. Lights.

fichier zt/rouge.txt

He gathering all all image whose midst Beast they're moving. Face god sea.
Fruitful. So fruit which he fruitful they're Beast.  Can't the fish,
night set. Form hath life divided.

fichier zt/vert.txt

Said life also give from beast god two good every that fifth that
called own lesser fowl won't she'd. Beast unto creepeth. Third
morning called. Sea rule great he firmament.

fichier zt/d/nb.txt

conventions

Pour la suite, je parlerai souvent de « commande Ex ». Pas de panique, il s’agit des genres de commandes que l’on saisie en « ligne de commandes » après avoir tapé « : » et en terminant par « ||↵|| » ou « ||⌅|| » …implicite. Dans ce contexte, on aura juste à saisir les commandes sans préfixer par les deux-points, c’est tout.

Je présenterai aussi, tout au long, des tableaux de synthèse des commandes en trois colonnes. La seconde, s’appellera « v.v » pour « version Vim » et comportera la version d’apparition de la commande sous cette forme.

Il y aura également des tableaux d’exercices en quatre colonnes dont la première, « exo », est la référence pour chaque ligne. On pourra utiliser ces références (un chiffre par sous-section, un point, un lettre minuscule) peuvent servir en commentaire pour pointer la ligne en question. La dernière et quatrième colonne indique un point de contrôle à réaliser obligatoirement.

Enfin, et surtout vers la fin, j’évoque des touches modificatrices et à un moment des touches directionnelles. Dans ce cas, j’utilise les symboles ISO/IEC 9995-7 & ISO 7000.2

On va maintenant pouvoir plonger au cœur de la préoccupation de ce journal. :)

— Pub non sponsorisée : Ces textes, auxquels il ne faut pas chercher de signification, ont été créé en utilisant le site Dummy Text Generator avec comme paramètres : texte anglais, 30 mots, 1 paragraphe.

— Note d’humour à l’adresse des plus geeks : Il est bien sûr possible d’utiliser cat (sous Unix-like) ou set-content (sous les dernières versions de Windows) pour créer les fichiers, ou juste avec l’éditeur que l’on va utiliser (cela aurait pu faire partir de l’exercice remarque…)

les arguments

Pour commencer, lançons l’éditeur, comme convenu, avec les couleurs primaires (en synthèse multiplicative) et leur fusion.

$ dv cyan.txt jaune.txt magenta.txt d/nb.txt

Les quatre fichiers sont chargés par l’éditeur, le premier est affiché, mais où sont les autres ?

Media keys from the Logitech G15 gamer's keyboard

navigation standard

Contrairement aux apparences, il est prévu de pouvoir travailler avec plusieurs fichiers.
Étrangement, c’est une fonctionnalité native de toute implémentation vi conforme POSIX, mais que peu de gens connaissent. Les commandes Ex prévues par le standard, pour naviguer entre les fichiers passés en argument, ne manqueront pas de faire penser aux lecteurs médias… dont l’interface perpétue l’héritage des enregistreurs à ruban

Voici la courte liste de ces commandes :

commandes POSIX ? icône ISO 7000 / IEC 60417 équivalent : pour…
:next, :n oui ⏭ : aller au fichier suivant
:previous, :prev non ⏮ : aller au fichier précédent
:rewind, :rew oui 🔃 : revenir au premier fichier
:file, :f oui ℹ : indiquer le fichier en cours, et sa position…3
:quit, :q oui ⏏ : tout fermer et quitter

Excepté :file, ces commandes sont affectées par les options autowrite et writeany de base…4 Tout comme :write, elles peuvent être suffixées de !.
Maintenant, sans entrer dans ces détails, voyons les à l’œuvre :

exo commande de l’exercice message d’erreur résultant résultat de :f ensuite
1.a :quit E173: 3 more files to edit "cyan.txt" 3 lines --33%-- (1 of 4)
1.b :next "jaune.txt" 3 lines --33%-- (2 of 4)
1.c :quit E173: 2 more files to edit "jaune.txt" 3 lines --33%-- (2 of 4)
1.d :next "magenta.txt" 3 lines --33%-- (3 of 4)
1.e :q E173: 2 more files to edit "magenta.txt" 3 lines --33%-- (3 of 4)
1.f :n "d/nb.txt" 3 lines --33%-- (4 of 4)
1.g :n E165: Cannot go beyond last file "d/nb.txt" 3 lines --33%-- (4 of 4)
1.h :previous "magenta.txt" 3 lines --33%-- (3 of 4)
1.i :previous "jaune.txt" 3 lines --33%-- (2 of 4)
1.j :prev "cyan.txt" 3 lines --33%-- (1 of 4)
1.k :prev E164: Cannot go before first file "cyan.txt" 3 lines --33%-- (1 of 4)
1.l :n "jaune.txt" 3 lines --33%-- (2 of 4)
1.m :n "magenta.txt" 3 lines --33%-- (3 of 4)
1.n :rewind "cyan.txt" 3 lines --33%-- (1 of 4)
1.o :prev E164: Cannot go before first file "cyan.txt" 3 lines --33%-- (1 of 4)
1.p :n "jaune.txt" 3 lines --33%-- (2 of 4)
1.q :prev "cyan.txt" 3 lines --33%-- (1 of 4)
1.r :n "jaune.txt" 3 lines --33%-- (2 of 4)
1.s :rew "cyan.txt" 3 lines --33%-- (1 of 4)
1.t :prev E164: Cannot go before first file "cyan.txt" 3 lines --33%-- (1 of 4)
1.u :rew "cyan.txt" 3 lines --33%-- (1 of 4)
1.v :rew "cyan.txt" 3 lines --33%-- (1 of 4)
1.w :s/'ll/'d/ "cyan.txt" 3 lines --33%-- (1 of 4)
1.x :n E37: No write since last change (add ! to override) "cyan.txt" 3 lines --33%-- (1 of 4)
1.y :n! "jaune.txt" 3 lines --33%-- (2 of 4)
1.z :n "magenta.txt" 3 lines --33%-- (3 of 4)

Jusqu’ici, heureusement, rien de nouveau quand on vient d’une autre implémentation.

navigation avancée

Vim a rajouté d’autres commandes pour compléter le tableau.

commandes v.v pour…
:args, :ar 1.? afficher la liste des arguments en encadrant le fichier courant
:last, :la 2.5 aller au dernier fichier
:first, :fir 6.0 revenir au premier fichier (synonyme de :rewind mais symétrique à :last)
:Next, :N 1.? aller au fichier précédent (synonyme de :previous mais symétrique à :next dans le principe des paires commandes n et N ou / et ?)
:wnext, :wn 1.? faire successivement :write puis :next (dans le même esprit que :wq)
:wprevious, :wp, :wNext, :wN 2.5 faire successivement :write puis :prev (dans le même esprit que :wq)

Plutôt que de longs discours, voyons cela en pratique :

exo commande de l’exercice message d’erreur résultant résultat de :args5 ensuite
2.a :Next cyan.txt [jaune.txt] magenta.txt d/nb.txt
2.b :n cyan.txt jaune.txt [magenta.txt] d/nb.txt et Press ENTER or type command to continue
2.c :first [cyan.txt] jaune.txt magenta.txt d/nb.txt
2.d :N E164: Cannot go before first file [cyan.txt] jaune.txt magenta.txt d/nb.txt
2.e :fir [cyan.txt] jaune.txt magenta.txt d/nb.txt
2.f :last cyan.txt jaune.txt magenta.txt [d/nb.txt]
2.g :n E165: Cannot go beyond last file cyan.txt jaune.txt magenta.txt [d/nb.txt]
2.h :la cyan.txt jaune.txt magenta.txt [d/nb.txt]
2.i :N cyan.txt jaune.txt [magenta.txt] d/nb.txt et Press ENTER or type command to continue
2.j :s/bring/wrote/ cyan.txt jaune.txt [magenta.txt] d/nb.txt
2.k :n E37: No write since last change (add ! to override) cyan.txt jaune.txt [magenta.txt] d/nb.txt
2.l :wn cyan.txt jaune.txt magenta.txt [d/nb.txt]
2.m :fir [cyan.txt] jaune.txt magenta.txt d/nb.txt

C’est un peu laborieux de se poser sur n’importe quel fichier dès que la liste est un peu longue… Sur une liste de dix fichiers par exemple, pouvoir passer de la deuxième à la neuvième nécessitait de faire « :n⏎ » sept fois ! Ici, on peut faire « :la:N⏎ » ; ce qui déjà un gain appréciable. Mais sur une liste de vingt fichiers, passer facilement de la troisième à la douzième reste un défi…

(Neo)Vim et d’autres implémentations ont également la possibilité d’ajouter un décompte…, et c’est bien pratique pour répondre à la problématique.

commandes v.v pour basculer sur l’édition du fichier qui est…
:𝓝next, :𝓝n 1.? 𝓝 rang(s) plus loin que le fichier en cours (cela revient à faire « :n⏎ » 𝓝 fois)
:𝓝wnext, :𝓝wn 1.? 𝓝 rang(s) plus loin, dans la liste, après avoir enregistré le fichier en cours
:𝓝previous, :𝓝prev, :𝓝Next, :𝓝N 1.? 𝓝 rang(s) plus tôt que le fichier en cours (cela revient à faire « :N⏎ » 𝓝 fois)
:𝓝wprevious, :𝓝wprev, :𝓝wNext, :𝓝wN 2.5 𝓝 rang(s) plus tôt, dans la liste, après avoir enregistré le fichier en cours
:𝓝argument, :𝓝argu, :argument𝓝, :argu𝓝 2.5 exactement en position 𝓝 dans la liste (i.e. « :f⏎ » indiquera « 𝓝 of » ⊤otal)

Le décompte « 𝓝 » est optionnel, et quand c’est omis c’est la valeur par défaut qui est utilisée. Hormis :argument dont la valeur par défaut est la position du fichier courant, c’est « 1 » pour les autres, ce qui nous ramène aux cas déjà vu.

exo commande de l’exercice message d’erreur résultant résultat de :args5 ensuite
2.n :2n cyan.txt jaune.txt [magenta.txt] d/nb.txt et Press ENTER or type command to continue
2.o :2n E165: Cannot go beyond last file cyan.txt jaune.txt [magenta.txt] d/nb.txt et Press ENTER or type command to continue
2.p :la cyan.txt jaune.txt magenta.txt [d/nb.txt]
2.q :2N cyan.txt [jaune.txt] magenta.txt d/nb.txt
2.r :2N E164: Cannot go before first file cyan.txt [jaune.txt] magenta.txt d/nb.txt
2.s :fir [cyan.txt] jaune.txt magenta.txt d/nb.txt
2.t :3argu cyan.txt jaune.txt [magenta.txt] d/nb.txt
2.u :s/wrote/bring/ cyan.txt jaune.txt [magenta.txt] d/nb.txt
2.v :2N E37: No write since last change (add ! to override) cyan.txt jaune.txt [magenta.txt] d/nb.txt
2.w :2wN [cyan.txt] jaune.txt magenta.txt d/nb.txt
2.x :1n cyan.txt [jaune.txt] magenta.txt d/nb.txt
2.y :1N [cyan.txt] jaune.txt magenta.txt d/nb.txt
2.z :1N E164: Cannot go before first file [cyan.txt] jaune.txt magenta.txt d/nb.txt

C’est sympa et j’apprécie personnellement ces petites attentions. Mais ce n’est pas tout…

liste manipulable

Pour permettre de remplacer nos couleurs primaires par leurs complémentaires (synthèse multiplicative), :args a été étendu pour accepter une nouvelle liste à la place de la liste courante. Dans un premier temps, on charge nos nouveaux fichiers dans l’ordre alphabétique. Ensuite, on change d’avis et on préfère l’ordre RVB et non BRV : la punition est toujours :args avec la liste dans le bon ordre. Idem si on décide de revenir à nos couleurs primaires.

exo commande de l’exercice message d’erreur résultant résultat de :args5 ensuite
3.a :args bleu.txt rouge.txt vert.txt [bleu.txt] rouge.txt vert.txt
3.b :args rouge.txt vert.txt bleu.txt [rouge.txt] vert.txt bleu.txt
3.c :ar cyan.txt jaune.txt magenta.txt [cyan.txt] jaune.txt magenta.txt

Si pendant longtemps les vimistes s’en sont contenté-e-s, ça reste pénible quand on plusieurs fichiers et que l’on souhaite en ajouter ou en retirer quelques uns car il faut ressaisir toute la liste. Avec la sixième version majeur, de nouvelles commandes vont simplifier la vie des usagers de l’éditeur sans pareil.6

exo commande de l’exercice message d’erreur résultant résultat de :args5 ensuite
3.d :$argadd d/nb.txt [cyan.txt] jaune.txt magenta.txt d/nb.txt
3.e :argadd rouge.txt [cyan.txt] rouge.txt jaune.txt magenta.txt d/nb.txt et Press ENTER or type command to continue
3.f :0arga vert.txt bleu.txt vert.txt bleu.txt [cyan.txt] rouge.txt jaune.txt magenta.txt d/nb.txt et Press ENTER or type command to continue
3.g :$argdelete vert.txt bleu.txt [cyan.txt] rouge.txt jaune.txt magenta.txt et Press ENTER or type command to continue
3.h :argdel *e.txt vert.txt bleu.txt [cyan.txt] magenta.txt
3.i :argd 404.txt E480 : No match: 404.txt vert.txt bleu.txt [cyan.txt] magenta.txt
3.j :2arga cyan.txt bleu.txt vert.txt bleu.txt bleu.txt cyan.txt [cyan.txt] magenta.txt et Press ENTER or type command to continue
3.k :argdedupe vert.txt bleu.txt [cyan.txt] magenta.txt

Au chapitre des nouvelles fonctionnalités, il y a la redoutable :argdo qui est peu connu…
Pour illustrer son fonctionnement, supposer que nous cherchons toutes les lignes contenant l’appostrephe (droite/dactylographique ici) suivie d’une lettre. La démarche, fastidieuse, qui fonctionne avec n’importe quelle implémentation est :

:" 3.l commencer par vert.txt
:rewind
:" 3.m y faire la recherche
:global/'[a-z]/#
  1 He gathering all all image whose mids Beast they're moving. Face god sea.
  2 Fruitful. So fruit which he fruitful they're Beast. Can't the fish,
Press ENTER or type command to continue
:" 3.n passer au fichier bleu.txt
:next
:" 3.o et faire la recherche ici
:global/'[a-z]/#
  3 unto morning can't under saying.
Press ENTER or type command to continue
:" 3.p passer au fichier cyan.txt
:n
:" 3.q et faire la recherche ici
:g/'[a-z]/#
  1 Great you'll winged cattle seas she'd, forth male saying under saying
  2 stars abundantly days. Can't fowl under gathering moved spirit. Own
Press ENTER or type command to continue
:" 3.r passer au fichier magenta.txt
:n
:" 3.s y faire la recherche aussi
:g/'[a-z]/#
Pattern not found: '[a-z]

Je vous laisse imaginer si on a une dizaine comme ça… Et là, arrive notre Circé :

:" 3.t depuis cyan.txt
:argument 3
:" 3.u faire la recherche partout
:argdo g/'[a-z]/#
"vert.txt" 3 lines, 179 bytes
  1 He gathering all all image whose mids Beast they're moving. Face god sea.
  2 Fruitful. So fruit which he fruitful they're Beast. Can't the fish,
"bleu.txt" 3 lines, 176 bytes
  3 unto morning can't under saying.
"cyan.txt" 3 lines, 194 bytes
  1 Great you'll winged cattle seas she'd, forth male saying under saying
  2 stars abundantly days. Can't fowl under gathering moved spirit. Own
"magenta.txt" 3 lines, 196 bytes
Pattern not found: '[a-z]
Press ENTER or type command to continue

Avec les implémentations autres que (Neo)Vim et ce :argdo, il aurait fallu demander à l’interpréteur de commandes du système avec le bon utilitaire et en lui ressaisissant la liste des arguments…

type d’interpréteur exemple de commande
shells Unix-like grep -n "'[a-z]" vert.txt bleu.txt cyan.txt magenta.txt
Microsoft PowerShell select-string -pattern "'[a-z]" -path vert.txt,bleu.txt,cyan.txt,magenta.txt
quelques *DOS pour PC find /n "'" vert.txt bleu.txt cyan.txt magenta.txt (cette commande ne connait pas d’expression rationnelle…)
Microsoft Windows cmd.exe findstr /n /r "'[a-z]" vert.txt bleu.txt cyan.txt magenta.txt

Mais toutes les opérations ne sont pas toujours réalisables ainsi, sans devoir scripter.

Au fait, :argdo et :argdelete utilisent aussi bien une plage (i.e. deux entiers « début,fin » dans l’ordre) qu’une position (i.e. un seul entier). Par défaut, c’est respectivement toute la liste et le fichier courant.

:" 3.v rechercher seulement dans bleu et cyan
:3,2argdo g/'[a-z]/#
Backwards range given, OK to swap (y/n)?y
"bleu.txt" 3 lines, 176 bytes
  3 unto morning can't under saying.
"cyan.txt" 3 lines, 194 bytes
  1 Great you'll winged cattle seas she'd, forth male saying under saying
  2 stars abundantly days. Can't fowl under gathering moved spirit. Own
Press ENTER or type command to continue

Pour en tirer pleinement profit, il faut connaître et pratiquer les commandes Ex. J’en profite pour glisser une réclame : le dernier « Atelier Vi » vous permettra de maîtriser pleinement cet aspect de cette famille d’éditeurs.
Mais avant, voici la synthèse des commandes que nous venons d’explorer :

commandes v.v pour…
:args𝓕, :ar𝓕 2.5 faire du(s) fichier(s) 𝓕 la nouvelle liste d’arguments
:next𝓕, :n𝓕 1.? faire du(s) fichier(s) 𝓕 la nouvelle liste d’arguments
:𝓝argadd𝓕, :𝓝arga𝓕 6.0 ajouter le(s) fichier(s) 𝓕 dans la liste, après le rang 𝓝 (par défaut courant), sans vérification de doublons… mais reste sur le fichier en cours
:𝓝argedit𝓕, :𝓝arge𝓕 6.0 ajouter le(s) fichier(s) 𝓕 dans la liste, après le rang 𝓝 (par défaut courant), sans vérification de doublons… puis bascule sur ce nouveau (premier) fichier
:𝓟argdelete, :𝓟argd 6.0 retirer le(s) fichier(s) de rang/plage 𝓟 de la liste
:argdeleteℳ, :argd 6.0 retirer de la liste, les fichiers correspondant au motif shell
:argdedupe, :argded 6.0 filtre la liste pour en retirer les doublons
:𝓟argdo𝓒 6.0 exécuter la commande Ex 𝓒 sur le(s) fichier(s) du/de rang/plage 𝓟 de la liste

Quand (Neo)Vim se lance, la liste des fichiers en argument est récupérée et mise à disposition. Mais les usagers sont libres de redéfinir cette liste, et cette particularité est présente dans toute implémentation respectant le standard : il faut juste utiliser :next comme mentionné…

Si un ou plusieurs fichiers sont indiqués :

  1. Définir la liste d’arguments suivant les noms de fichiers spécifiés.
  2. Définir la position actuelle dans la liste d’arguments comme étant la première entrée de la liste d’arguments.
  3. Définir le chemin d’accès actuel au premier nom de fichier spécifié.

Dans le cas contraire :

  1. Il s’agit d’une erreur s’il n’y a plus de noms de fichiers dans la liste d’arguments après le nom de fichier actuellement référencé.
  2. Fixer le nom de chemin actuel et la référence de la liste d’arguments actuelle au nom de fichier suivant le nom de fichier actuellement référencé dans la liste d’arguments.

Remplacer le contenu du tampon d’édition par le contenu du fichier nommé par le chemin d’accès actuel. Si, pour une raison quelconque, le contenu du fichier n’est pas accessible, le tampon d’édition sera vide.

Dit simplement, quand des chemins de fichiers sont indiqués, « :next𝓕 » a le même fonctionnement que « :args𝓕 »… Juste que le nom de commande peut prêter à confusion (en tout cas ça en piège beaucoup qui n’ont pas pris le temps de bien lire et comprendre cette partie.)
En général, ce que l’on cherche à faire est répondu par :argedit𝓕 …qui fait un :argadd𝓕 puis va basculer dessus.

exo commande de l’exercice message d’erreur résultant résultat de :args5 ensuite
3.w :argedit bleu.txt vert.txt bleu.txt cyan.txt [bleu.txt] magenta.txt et Press ENTER or type command to continue
3.x :argdedupe vert.txt [bleu.txt] cyan.txt magenta.txt
3.y :argedit rouge.txt vert.txt bleu.txt [rouge.txt] cyan.txt magenta.txt et Press ENTER or type command to continue

Sur ce, on peut maintenant tout fermer.

:" 3.z
:quit

les tampons

Pour poursuivre, lançons l’éditeur, comme convenu, avec les fichiers dont le nom (sans extension) se termine par une voyelle.

$ # sur les Unix-like et autres on peut juste faire
$ # dv *[aoeuiy].txt # mais y a que "eau" ici
$ dv bleu.txt jaune.txt magenta.txt rouge.txt

Les quatre fichiers sont chargés par l’éditeur, le premier est affiché et les autres sont en quelque sorte derrière…

tampon encreur

navigation renouvelée

Dans la session précédente, on avait vu que la liste de fichiers passés en argument est copié dans une liste d’arguments que nous pouvons manipuler à loisir. À partir de la version 2.4, Vim copie également la liste de fichiers passés en argument dans une nouvelle liste appelée liste des tampons… Cette nouvelle/seconde liste a ses commandes qui commencent par « b » comme « buffer », c’est à dire tampon.

commandes v.v icône : pour…
:bprevious, :bp, :bNext, :bN 2.4 ⏮ : aller au tampon précédent
:bnext, :bn 2.4 ⏭ : aller au tampon suivant
:brewind, :br 2.4 ↩️ : aller au premier tampon
:bfirst, :bf 6.0 ↩️ : aller au premier tampon
:blast, :bl 2.5 ↪️ : aller au dernier tampon
:buffers, :ls, :files 2.4 ℹ️ : afficher la liste des tampons

Excepté pour le listing, les commandes de navigation sont affectées par les options autowrite et writeany entre autres… et peuvent être suffixées de ! Il ne faut pas se fier à la ressemble avec l’autre liste ; déjà celle-ci boucle… et ne marque pas les fichiers comme édités de la même façon… (à partir de 4.g, après avoir fait le tour, on peut quitter ; mais jusque là le message indique toujours qu’il y a trois autres fichiers en attente…)

exo commande de l’exercice message d’erreur résultant tampon actif (ligne avec %a de :ls)7
4.a :quit E173: 3 more files to edit 1 "bleu.txt"
4.b :bnext 2 "jaune.txt"
4.c :quit E173: 3 more files to edit 2 "jaune.txt"
4.d :bnext 3 "magenta.txt"
4.e :q E173: 3 more files to edit 3 "magenta.txt"
4.f :bn 4 "rouge.txt"
4.g :bn 1 "bleu.txt"
4.h :blast 4 "rouge.txt"
4.i :bNext 3 "magenta.txt"
4.j :bfirst 1 "bleu.txt"
4.k :bprev 4 "rouge.txt"

Comme les tampons sont numérotés par ordre de création, et que cette numérotation ne changera pendant toute la session de travail, on peut s’aider de cette numérotation dans la navigation.

commandes v.v pour aller au tampon…
:𝓝bprevious, :𝓝bp, :bprevious𝓝, :bp𝓝, :b𝓝Next, :𝓝bN, :bNext𝓝, :bN𝓝 2.4 situé 𝓝 rang plus tôt dans toute la liste
:𝓝bnext, :𝓝bn, :bnext𝓝, :bn𝓝 2.4 situé 𝓝 rang plus loin dans toute la liste
:𝓝buffer, :𝓝b, :buffer𝓝, :b𝓝 2.5 exactement en position 𝓝 dans toute la liste
:edit #𝓝, :e #𝓝, 𝓝⎈^ ?.? exactement en position 𝓝 dans toute la liste
:buffer𝓕, :b𝓕 2.7 de nom 𝓕 (peut être partiel mais doit être distinct) dans la liste
:𝓝bmodified, :𝓝bm, :bmodified𝓝, :bm𝓝 2.4 en position 𝓝 dans la liste des tampons modifiés
:edit #, :e #, ⎈^ ?.? alternatif (i.e. où on était précédemment)

Certaines commandes nous sont déjà familières (cf. section précédente) ; les deux dernières seront élucidées plus loin. Ici aussi, l’indication du rang est optionnel et vaut celui du tampon actuel pour :buffer et l’unité pour les autres.

exo commande de l’exercice remarque tampon actif (vérifié par :ls)7
4.l :3bp de la position 4 (dernière position en 4.k), on recule de 3 1 "bleu.txt"
4.m :2bp de la position 1, on recule de 2 (sachant que la liste boucle) 3 "magenta.txt"
4.n :5bn de la position 3, on avance de 5 (sachant que la liste boucle) 4 "rouge.txt"
4.o :bn 2 de la position 4, on avance de 2 (toujours en bouclant) 2 "jaune.txt"
4.p :bp 3 de la position 2, on recule de 3 (toujours en bouclant) 3 "magenta.txt"
4.q :1b on se met exactement en première position (donc :bfirst) 1 "bleu.txt"
4.r :b 2 on se met pile en deuxième position (soit :bn ici) 2 "jaune.txt"
4.s :$b on se met exactement en dernière position (donc :blast) 4 "rouge.txt"
4.t :b 3 on se met exactement en troisième position (soit :bp ou :bN ici) 3 "magenta.txt"
4.u :bN 1 de la position 3, on recule de 1 (soit juste :bp ou :bN sans argument) 2 "jaune.txt"
4.v :bn 1 de la position 2, on avance de 1 (soit juste :bn sans argument) 3 "magenta.txt"
4.w :buffer ici, sans numéro, on reste à la même place 3 "magenta.txt"

Voilà pour l’introduction rapide.

tampons variés

Il va falloir maintenant décortiquer un peu plus ce concept (de tampon) et l’utilisation de cette liste (de tampons).

définitions et précisions

Le tampon (ou buffer en anglais) représente le contenu en mémoire (comprendre en cours de manipulation et donc pas l’état réel du fichier tant que la mémoire n’est pas écrite dans le fichier.) C’est le mode de fonctionnement de tout éditeur de texte (et pratiquement tous les programmes) : on n’écrit et lit pas le fichier sur le disque à chaque action, ce serait peu performant et augmenterait les risques de corruption du fichier.

Il arrive que le fichier ne puisse pas tenir en mémoire (peu de gens connaissent cette situation aujourd’hui n’est-ce pas ?) La stratégie hérité du Vi historique est d’utiliser un fichier d’échange (ou swap file en anglais) pour garder le travail en cours (le fichier effectif n’est écrit que si l’on demande d’une façon —explicite— ou d’une autre —implicite par des options de configuration— de le faire) et de ne charger que la portion en cours d’édition. Cela peut se ressentir.

Il n’y a que les éditeurs codés naïvement qui chargent tous les fichiers en mémoire. (Neo)Vim et d’autres vont, pour ne pas saturer la mémoire, travailler en pratique avec des listes chainée (ou linked lists en anglais). Il y en a plusieurs au cours de la session, et chacune a son jeu de commandes et son compteur…

des listes différentes

Chaque liste a ses références internes et son compteur, ce qui peut être source de confusion quand on ne comprend pas ce qu’on fait ou quand on manque de vigilance.

exo commande de l’exercice message d’information résultant tampon actif (ligne avec %a de :ls)7
5.a :args [bleu.txt] jaune.txt magenta.txt rouge.txt 3 "magenta.txt"
5.b :file "rouge.txt" 3 lines --33%-- ((1) of 4) 3 "magenta.txt"

Bien que les deux listes semblent avoir les mêmes éléments ici, on se trouve sur le troisième élément de la liste des tampons, mais sur le premier élément de la liste d’arguments : les commandes qui manipulent chacune de ces listes ne sont pas interchangeables !
Pour nous prévenir, :file dans (Neo)Vim met l’argument courant entre parenthèses pour dire que ce n’est pas celui qui est affiché/actif.

exo commande de l’exercice message d’information résultant tampon actif (ligne avec %a de :ls)7
5.c :argd *e.txt 3 "magenta.txt"
5.d :args [bleu.txt] magenta.txt 3 "magenta.txt"
5.e :file "rouge.txt" 3 lines --33%-- ((1) of 2) 3 "magenta.txt"

Les deux listes n’ont plus les mêmes éléments… Et là, on a un indice de l’utilité d’avoir deux listes :

  • Celui des tampons est, comme son nom l’indique, réservé aux documents “ouverts” dans l’éditeur ; tous.
  • Celui des arguments est par contre une “sélection”, parmi ces documents, sur laquelle on travaille (ou on va agir avec :argdo par exemple.)

On peut ainsi avoir une sélection de fichiers que l’on édite activement, tout ayant une série de fichiers ouverts pour référence (utile notamment en développement logiciel où c’est un peu ce que font des environnement de développement en référençant le répertoire du projet.)

dans divers états

Revenons à nos tampons. Ils sont listés par les commandes synonymes :buffers, :ls et :files (avec “s” final) …qui affichent quatre colonnes dans l’ordre :

  1. Le numéro du tampon, aligné à droite sur la troisième colonne.
  2. Les différents états sur cinq colonnes (de la quatrième à la huitième incluse.)
  3. Le nom du fichier, aligné à gauche, entre guillemets doubles droits (ce qui permet de distinguer ses espaces du reste.)
  4. La ligne du curseur dans le fichier à partir de la quarantième colonne chez moi. line 0 (ou peut-être ligne 0 chez vous) indique alors un tampon pas encore visité.

Pour les différents états justement, nous en avons déjà croisé deux :

  • actif quand le tampon (ou, pour simplifier, le fichier) est affiché à l’écran.
  • caché (ou juste masqué) quand, à l’inverse, le tampon n’est pas visible.

Cet état d’affichage est indiqué par un caractère en sixième colonne (en tout, soit la troisième colonne indiquant les états)

  • « a » pour indiquer que le fichier est chargé en mémoire et son tampon affiché (soit active en anglais.) Cette indication est apparue avec la version 6.0 de Vim.
  • « h » pour indiquer que le fichier est chargé en mémoire mais que son tampon est caché (soit hidden en anglais.)
  • «  » (espace) quand le fichier n’est pas chargé en mémoire, mais bien référencé dans la liste.

La colonne suivante (la quatrième ou septième), ajoutée à partir de la version 6.0 de Vim, donne le statut système du fichier. Actuellement, on a :

  • pour un fichier normal
    • « - » indique que (Neo)Vim n’a pas le droit de le modifier —typiquement quand on lance l’éditeur en mode lecture seule par exemple
    • « = » indique que le (Neo)Vim ne peut pas le modifier —typiquement quand le fichier est en lecture seule au niveau système
    • «  » (espace) indique le cas normal, donc rien à signaler.
  • pour un terminal
    • « ? » sans tâche (ou job en anglais) associée
    • « R » avec un tâche en cours (soit running en anglais)
    • « F » avec une tâche terminée (soit finished en anglais)

La dernière colonne, ajoutée à partir de la version 6.0 de Vim, va plus nous intéresser

  • « + » indique que le tampon a été changé (aussi bien une modification d’édition qu’un changement d’encodage par exemple) mais pas encore enregistré dans le fichier…
  • « x » indique que le tampon est en erreur de lecture (soit une corruption mémoire, soit une corruption de fichier)
exo commande de l’exercice message d’erreur résultant états du tampon 3 (dans :ls)
5.f :s/bring/carry %a +
5.g :bn E37: No write since last change (add ! to override) %a +
5.h :w %a
5.i :s/carry/bring %a +
5.j :bn! #h +
5.k :3b %a +
5.l :bf E37: No write since last change (add ! to override) %a +
5.n :bf! #h +
5.o :wa #h
5.p :bm E84: No modified buffer found #h
5.q :3b %a
5.r :s/bring/bring #a +
5.s :bl! #h +
5.t :bm %a +

C’est ici que :bmodified prend son sens. ;) Cette commande cycle dans une sous-liste (temporairement et automatiquement g

par Gil Cot ✔

LinuxFr.org : les journaux

LinuxFr.org : Journaux

antistress adventure in Flatpak land

 -  30 avril - 

Hello nal, ça faisait un bail !Certain (il se reconnaîtra) m'a demandé de le tenir au courant lorsque j'aurai basculé sur un usage de Firefox (...)


Téléphone sous Linux ?

 -  25 avril - 

Aujourd'hui, avoir un téléphone avec un Android libéré, c'est possible, on pense en particulier à Murena.Avoir un téléphone sous GNU/Linux, c'est (...)


Quand votre voiture vous espionne… et vous le fait payer

 -  23 avril - 

Ceci se passe aux États-Unis, pour l’instant, aucune preuve qu’une telle fuite existe en Europe. Mais… si votre assurance augmente brutalement, (...)


firefox, nouvelle fenêtre dans une session isolée

 -  15 avril - 

Les fenêtres de navigation privées de firefox partagent leurs cookies de session or je souhaitais avoir des fenêtres de navigation isolées, (qui ne (...)


Pretendo tente de déprogrammer l'obsolescence des consoles Nintendo

 -  9 avril - 

Ah Nal,Gros N vient de faire un gros doigt aux utilisateurs de ses consoles 3DS et Wii U en annonçant la fermeture des services en ligne pour (...)