- 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.
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 ?
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 :args 5 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 :args 5 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 :args 5 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 :args 5 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 :
- Définir la liste d’arguments suivant les noms de fichiers spécifiés.
- Définir la position actuelle dans la liste d’arguments comme étant la première entrée de la liste d’arguments.
- Définir le chemin d’accès actuel au premier nom de fichier spécifié.
Dans le cas contraire :
- 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é.
- 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 :args 5 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…
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 :
- Le numéro du tampon, aligné à droite sur la troisième colonne.
- Les différents états sur cinq colonnes (de la quatrième à la huitième incluse.)
- Le nom du fichier, aligné à gauche, entre guillemets doubles droits (ce qui permet de distinguer ses espaces du reste.)
- 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
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 (...)