*autocmd.txt* Pour Vim version 6.2.
MANUEL de RÉFÉRENCE VIM - par Bram Moolenaar
Commandes automatiques *autocommand*
Ce sujet est abordé dans la section |40.3| du Manuel de l'utilisateur.
1. Introduction |autocmd-intro|
2. Définir des autocommandes |autocmd-define|
3. Supprimer des autocommandes |autocmd-remove|
4. Lister des autocommandes |autocmd-list|
5. Événements |autocmd-events|
6. Motifs |autocmd-patterns|
7. Groupes |autocmd-groups|
8. Exécuter des autocommandes |autocmd-execute|
9. Utiliser des autocommandes |autocmd-use|
{absent de Vi}
==============================================================================
1. Introduction *autocmd-intro*
Vous pouvez spécifier des commandes qui s'exécuteront automatiquement lors de
la lecture ou de l'écriture d'un fichier, à l'entrée ou à la sortie d'un
tampon ou d'une fenêtre, et lorsque vous quitterez Vim. Par exemple, vous
pouvez créer une autocommande pour activer l'option 'cindent' pour tous les
fichiers correspondant à "*.c". Vous pouvez aussi utiliser les autocommandes
pour mettre en oeuvre des fonctionnalités avancées, comme l'édition de
fichiers compactés (voir |gzip-example|). Le meilleur endroit pour mettre vos
autocommandes est votre fichier vimrc ou exrc.
*E203* *E204* *E143*
ATTENTION ! L'utilisation des autocommandes se révèle particulièrement
puissante et peut engendrer des effets de bord indésirables. Veillez à ce
qu'elles n'endommagent pas votre texte.
- Il est plus prudent de faire quelques essais avec la copie d'un fichier en
premier lieu. Par exemple : si vous utilisez des autocommandes pour
décompacter un fichier quand vous commencez à l'éditer, assurez-vous que les
autocommandes chargées de le compacter quand vous l'enregistrez fonctionnent
correctement.
- Vous aurez peut-être à faire face à des erreurs survenant en cours
d'exécution (p. ex., disque plein). Vim devrait être capable d'annuler les
changements opérés sur le tampon dans la plupart des cas, mais vous devrez
nettoyer les autres fichiers à la main (p. ex., compacter un fichier qui a
été décompacté).
- Si les événements BufRead* vous autorisent à éditer un fichier compacté, il
devrait en être de même pour les événements FileRead* (cela peut autoriser
le recouvrement dans certains cas). Essayez d'utiliser les mêmes
autocommandes pour les événements File* et Buf* quand c'est possible.
La fonctionnalité |+autocmd| n'est incluse que si elle n'a pas été désactivée
lors de la compilation.
==============================================================================
2. Définir des autocommandes *autocmd-define*
NOTE : La commande ":autocmd" ne peut pas être suivie par une autre commande,
car le '|' est considéré comme une partie de la commande.
*:au* *:autocmd*
:au[tocmd] [groupe] {even} {motif} [nested] {cmd}
Ajoute {cmd} à la liste des commandes que Vim
exécutera automatiquement à l'{even}ement pour un
fichier correspondant à {motif}. Vim ajoute toujours
la commande {cmd} après les autocommandes existantes,
les autocommandes sont ainsi exécutées dans l'ordre où
elles sont données.
Voir |autocmd-nested| pour [nested].
NOTE : Les caractères spéciaux (p. ex., "%" ou "<cword>") dans les arguments
de ":autocmd" ne sont pas étendus lorsque l'autocommande est définie. Ils le
seront quand l'{even}ement sera reconnu, et la {cmd} exécutée. La seule
exception à cette règle est "<sfile>", qui est étendu lorsque l'autocommande
est définie. Exemple :Ici, Vim étend <sfile> au nom du fichier contenant cette ligne.
Si votre fichier vimrc est sourcé deux fois, les autocommandes qu'il contient
apparaîtront deux fois. Pour éviter ceci, placez cette commande dans votre
fichier vimrc, avant de définir les autocommandes :Si vous ne souhaitez pas supprimer toutes les autocommandes, vous pouvez à la
place utiliser une variable pour tester si Vim a déjà défini les autocommandes
ou pas :Si l'argument [groupe] n'est pas donné, Vim utilise le groupe courant (comme
défini avec ":augroup") ; sinon, Vim utilise le groupe donné par [groupe].
NOTE : [groupe] doit avoir été défini auparavant. Vous ne pouvez pas
définir un nouveau groupe avec ":au groupe ..." ; utilisez ":augroup" pour
cela.
Lors de tests d'autocommandes, l'option 'verbose' vous sera probablement
utile :Ceci indique à Vim d'afficher les autocommandes au fur et à mesure qu'il les
exécute.
Si vous définissez une autocommande dans un script, elle sera capable
d'appeler des fonctions locales au script et d'utiliser des mappages locaux au
script. Quand l'événement est déclenché et la commande exécutée, elle sera
lancée dans le contexte du script dans lequel elle a été définie. Cela pose
problème lorsque |<SID>| est utilisé dans une commande.
Lors de l'exécution des commandes, les messages émis par une commande
effaceront les messages précédents. Cela diffère de l'exécution manuelle des
commandes. La plupart du temps, l'écran ne sera pas décalé vers le haut, il
n'y aura donc pas d'invite Appuyez-sur-entrée. Néanmoins, cela peut se
produire si une commande renvoie deux messages.
==============================================================================
3. Supprimer des autocommandes *autocmd-remove*
:au[tocmd]! [groupe] {even} {motif} [nested] {cmd}
Supprime toutes les autocommandes associées à {even}
et {motif}, et ajoute la commande {cmd}. Voir
|autocmd-nested| pour [nested].
:au[tocmd]! [groupe] {even} {motif}
Supprime toutes les autocommandes associées à {even}
et {motif}.
:au[tocmd]! [groupe] * {motif}
Supprime toutes les autocommandes associées à {motif}
pour tous les événements.
:au[tocmd]! [groupe] {even}
Supprime TOUTES les autocommandes pour {even}.
:au[tocmd]! [groupe] Supprime TOUTES les autocommandes.
Si l'argument [groupe] n'est pas donné, Vim utilise le groupe courant (comme
défini avec ":augroup") ; sinon, Vim utilise le groupe donné par [groupe].
==============================================================================
4. Lister des autocommandes *autocmd-list*
:au[tocmd] [groupe] {even} {motif}
Affiche toutes les autocommandes associées à {even}
et {motif}.
:au[tocmd] [groupe] * {motif}
Affiche toutes les autocommandes associées à {motif}
pour tous les événements.
:au[tocmd] [groupe] {even}
Affiche toutes les autocommandes pour {even}.
:au[tocmd] [groupe] Affiche toutes les autocommandes.
Si l'argument [groupe] est donné, Vim ne listera que les autocommandes pour
[groupe] ; sinon, Vim listera les autocommandes pour TOUS les groupes.
NOTE : Le comportement de cet argument est différent quand vous définissez
ou supprimez des autocommandes.
==============================================================================
5. Événements *autocmd-events* *E215* *E216*
*autocommand-events* *{event}* *{even}*
Vim reconnaît les événements suivants. Vim ignore la casse du nom des
événements (p. ex., vous pouvez écrire « BUFread » ou « bufread » au lieu de
« BufRead »).
*BufNewFile*
BufNewFile Quand un fichier qui n'existe pas commence à être
édité. Peut servir à lire dans un squelette de
fichier.
*BufReadPre* *E200* *E201*
BufReadPre Quand un nouveau fichier commence à être édité, avant
la lecture du fichier dans le tampon. Non utilisé si
le fichier n'existe pas.
BufReadPost ou *BufRead* *BufReadPost*
BufRead Quand un nouveau fichier commence à être édité, après
la lecture du fichier dans le tampon, avant
l'exécution des lignes de mode. Voir |BufWinEnter| si
vous avez besoin d'effectuer quelque chose après
l'exécution des lignes de mode.
Ceci ne fonctionne PAS pour ":r fichier". Non utilisé
si le fichier n'existe pas. Également utilisé après le
recouvrement réussi d'un fichier.
*BufReadCmd*
BufReadCmd Avant de commencer l'édition d'un nouveau tampon.
Devrait lire le tampon dans le fichier. |Cmd-event|
*BufFilePre*
BufFilePre Avant de changer le nom du tampon courant avec les
commandes ":file" ou ":saveas".
*BufFilePost*
BufFilePost Après avoir changé le nom du tampon courant avec les
commandes ":file" ou ":saveas".
*FileReadPre*
FileReadPre Avant la lecture d'un fichier avec un ":read".
*FileReadPost*
FileReadPost Après la lecture d'un fichier avec une commande
":read".
NOTE : Vim fixe les marques '[ et '] aux premières et
dernières lignes de la lecture. Ceci peut être utilisé
pour opérer sur les lignes qui viennent juste d'être
lues.
*FileReadCmd*
FileReadCmd Avant la lecture d'un fichier avec une commande
":read". Devrait effectuer la lecture du fichier.
|Cmd-event|
*FilterReadPre* *E135*
FilterReadPre Avant la lecture d'un fichier depuis une commande de
filtre. Vim cherche une correspondance du motif de
fichier avec le nom du tampon courant, et non avec le
nom du fichier temporaire en sortie de la commande de
filtre.
*FilterReadPost*
FilterReadPost Après la lecture d'un fichier depuis une commande de
filtre. Vim cherche une correspondance du motif de
fichier avec le nom du tampon courant, comme avec
FilterReadPre.
*FileType*
FileType Quand l'option 'filetype' a été fixée.
<afile> peut être utilisé pour donner le nom du
fichier où cette option a été fixée, et <amatch> pour
la nouvelle valeur de 'filetype'. Voir |filetypes|.
*Syntax*
Syntax Quand l'option 'syntax' a été fixée.
<afile> peut être utilisé pour donner le nom du
fichier où cette option a été fixée, et <amatch> pour
la nouvelle valeur de 'syntax'. Voir |:syn-on|.
*StdinReadPre*
StdinReadPre Avant la lecture de stdin dans le tampon. Utilisé
uniquement si l'argument '-' a été donné à Vim au
démarrage |--|.
*StdinReadPost*
StdinReadPost Après la lecture de stdin dans le tampon, avant
l'exécution des lignes de mode. Utilisé uniquement si
l'argument '-' a été donné à Vim au démarrage |--|.
BufWritePre ou *BufWrite* *BufWritePre*
BufWrite Avant l'écriture du tampon entier dans un fichier.
*BufWritePost*
BufWritePost Après l'écriture du tampon entier dans un fichier
(devrait annuler les commandes pour BufWritePre).
*BufWriteCmd*
BufWriteCmd Avant l'écriture du tampon entier dans un fichier.
Devrait enregistrer le fichier et désactiver
'modified' si cela a réussi. Ne devrait pas modifier le
tampon. |Cmd-event|
*FileWritePre*
FileWritePre Avant l'écriture dans un fichier, si ce n'est pas le
tampon entier qui est écrit.
*FileWritePost*
FileWritePost Après l'écriture dans un fichier, si ce n'est pas le
tampon entier qui est écrit.
*FileWriteCmd*
FileWriteCmd Avant l'écriture dans un fichier, si ce n'est pas le
tampon entier qui est écrit. Devrait effectuer
l'écriture dans le fichier. Ne devrait pas modifier le
tampon. |Cmd-event|
*FileAppendPre*
FileAppendPre Avant l'ajout dans un fichier.
*FileAppendPost*
FileAppendPost Après l'ajout dans un fichier.
*FileAppendCmd*
FileAppendCmd Avant l'ajout dans un fichier. Devrait effectuer
l'ajout dans le fichier. |Cmd-event|
*FilterWritePre*
FilterWritePre Avant l'écriture dans un fichier par une commande de
filtre, ou une comparaison (mode diff).
Vim cherche une correspondance du motif de fichier
avec le nom du tampon courant, et non avec le nom du
fichier temporaire en sortie de la commande de filtre.
*FilterWritePost*
FilterWritePost Après l'écriture dans un fichier par une commande de
filtre, ou une comparaison (mode diff).
Vim cherche une correspondance du motif de fichier
avec le nom du tampon courant, comme avec
FilterWritePre.
*FileChangedShell*
FileChangedShell Quand Vim s'aperçoit que la date de modification d'un
fichier a changé depuis que son édition est commencée.
|timestamp|
Déclenché le plus souvent après l'exécution d'une
commande shell, mais également avec une commande
|:checktime| ou lorsque Vim regagne le focus de la
souris.
Cette autocommande est déclenchée pour chaque fichier
modifié. Elle n'est pas utilisée quand 'autoread' est
activé et que le tampon n'a pas été modifié. Si une
autocommande FileChangedShell est présente, le message
d'avertissement et l'invite correspondants ne sont pas
donnés. C'est utile pour recharger des fichiers
concernés qui sont affectés par une seule commande.
NOTE : Lorsque cette autocommande est exécutée, le
tampon courant "%" peut être différent du tampon qui a
été modifié "<afile>".
NOTE : *E246* : Les commandes ne doivent pas modifier
le tampon courant, basculer vers un autre tampon ou
supprimer un tampon.
NOTE : Cet événement ne peut pas être imbriqué, pour
éviter une boucle sans fin. Cela signifie que lors de
l'exécution de commandes pour l'événement
FileChangedShell, aucun autre événement
FileChangedShell ne sera déclenché.
*FileChangedRO*
FileChangedRO Avant d'effectuer un premier changement dans un
fichier en lecture seule. Peut être utilisé pour
automatiser un "checkout" sur un système de gestion de
versions. Non déclenché si le changement est provoqué
par une autocommande.
ATTENTION ! Cet événement est déclenché lorsque le
changement est effectué, juste avant qu'il ne soit
appliqué au texte. Si l'autocommande déplace le
curseur, l'effet du changement est indéfini.
*FocusGained*
FocusGained Quand Vim obtient le focus de la souris. Seule la
version IHM graphique et certaines versions console
peuvent détecter cet événement.
*FocusLost*
FocusLost Quand Vim perd le focus de la souris. Seule la version
IHM graphique et certaines versions console peuvent
détecter cet événement.
*FuncUndefined*
FuncUndefined Quand une fonction utilisateur est utilisée mais n'est
pas définie. Utile pour définir une fonction
uniquement si elle est utilisée. <amatch> et <afile>
sont tous deux fixés au nom de la fonction.
*CursorHold*
CursorHold Quand l'utilisateur n'a pressé aucune touche au bout
du temps déterminé par 'updatetime'. Non redéclenché
jusqu'à ce que l'utilisateur presse à nouveau une
touche (c.-à-d. que cet événement ne se déclenche pas
toutes les 'updatetime' ms si vous quittez Vim pour
vous faire du café :). Voir |CursorHold-example| pour
obtenir un aperçu des marqueurs.
Cet événement est déclenché uniquement en mode Normal.
NOTE : Les commandes interactives ne peuvent pas être
utilisées pour cet événement. Il n'aura pas d'invite
Appuyez-sur-entrée, l'écran sera mis à jour
directement (si nécessaire).
NOTE : Dans une version ultérieure, il y aura
probablement une autre option pour fixer le temps.
Conseil : Pour forcer la mise à jour des lignes
d'état, utilisez : {uniquement sur Amiga, Unix, Win32, MS-DOS et toutes
les versions IHM graphiques}
*BufEnter*
BufEnter Après l'entrée dans un tampon. Utile pour fixer des
options pour un type de fichier. Également exécuté
quand un tampon commence à être édité, après les
autocommande BufReadPost.
*BufLeave*
BufLeave Avant de quitter le tampon pour un autre. Également
quand la fenêtre courante est quittée ou fermée et que
la nouvelle fenêtre courante ne contient pas le même
tampon. Non utilisé pour ":qa" ou ":q" quand Vim est
quitté.
*BufWinEnter*
BufWinEnter Après l'affichage d'un tampon dans une fenêtre. Cela
peut être lors du chargement du tampon (après
traitement des lignes de mode), lorsqu'un tampon caché
est affiché dans une fenêtre (il n'est alors plus
caché) ou lorsqu'un tampon déjà visible est à nouveau
affiché dans une autre fenêtre.
*BufWinLeave*
BufWinLeave Avant qu'un tampon ne soit supprimé d'une fenêtre,
mais pas s'il est encore visible dans une autre
fenêtre. Également déclenché quand Vim est quitté.
Déclenché avant BufUnload ou BufHidden.
NOTE : Lorsque cette autocommande est exécutée, le
tampon courant "%" peut être différent du tampon qui a
été déchargé "<afile>".
*BufUnload*
BufUnload Avant le déchargement d'un tampon, c'est-à-dire quand
le texte dans le tampon va être libéré. Cela peut être
après un BufWritePost et avant un BufDelete. Également
utilisé pour tous les tampons qui sont chargés quand
Vim va être quitté.
NOTE : Lorsque cette autocommande est exécutée, le
tampon courant "%" peut être différent du tampon qui a
été déchargé "<afile>".
*BufHidden*
BufHidden Juste après qu'un tampon a été caché, c'est-à-dire
quand il n'y a plus de fenêtres qui affichent le
tampon, mais qu'il n'est pas déchargé ou supprimé. Non
utilisé pour ":qa" ou ":q" quand Vim est quitté.
NOTE : Lorsque cette autocommande est exécutée, le
tampon courant "%" peut être différent du tampon qui a
été déchargé "<afile>".
*BufNew*
BufNew Juste après la création d'un nouveau tampon. Également
utilisé juste après qu'un tampon a été renommé. Quand
le tampon est ajouté à la liste des tampons, BufAdd ne
sera pas déclenché.
NOTE : Lorsque cette autocommande est exécutée, le
tampon courant "%" peut être différent du tampon qui a
été créé "<afile>".
BufCreate ou *BufCreate* *BufAdd*
BufAdd Juste après la création d'un nouveau tampon qui sera
ajouté à la liste des tampons, ou après l'ajout d'un
tampon à cette liste.
Également utilisé juste après qu'un tampon de la
liste des tampons a été renommé.
L'événement BufCreate assure la compatibilité avec les
versions antérieures.
NOTE : Lorsque cette autocommande est exécutée, le
tampon courant "%" peut être différent du tampon qui a
été créé "<afile>".
*BufDelete*
BufDelete Avant la suppression d'un tampon de la liste des
tampons. BufUnload peut être appelé en premier (si le
tampon était chargé).
Également utilisé juste avant qu'un tampon de la liste
des tampons soit renommé.
NOTE : Lorsque cette autocommande est exécutée, le
tampon courant "%" peut être différent du tampon qui a
été supprimé "<afile>".
*BufWipeout*
BufWipeout Avant la suppression complète (la « liquidation »)
d'un tampon. Les événements BufUnload et BufDelete
peuvent être appelés en premier (si le tampon était
chargé et présent dans la liste des tampons).
Également utilisé juste avant qu'un tampon soit
renommé (même quand il n'est pas présent dans la liste
des tampons).
NOTE : Lorsque cette autocommande est exécutée, le
tampon courant "%" peut être différent du tampon qui a
été supprimé "<afile>".
*WinEnter*
WinEnter Après l'entrée dans une autre fenêtre. Non déclenché
pour la première fenêtre, quand Vim vient d'être
lancé. Utile pour fixer la hauteur de la fenêtre.
Si la fenêtre est pour un autre tampon, Vim exécute
les autocommandes BufEnter après les autocommandes
WinEnter.
NOTE : Quand ":split nomfich" est utilisé, l'événement
WinEnter est déclenché après le partage mais avant le
chargement du fichier "nomfich".
*WinLeave*
WinLeave Avant de quitter une fenêtre. Si la fenêtre où Vim
doit ensuite entrer contient un tampon différent, Vim
exécutera les autocommandes BufLeave avant les
autocommandes WinLeave (mais pas pour ":new"). Non
utilisé pour ":qa" ou ":q" quand Vim est quitté.
*CmdwinEnter*
CmdwinEnter Après l'entrée dans la fenêtre command-line. Utile
pour fixer des options spécifiques à ce type spécial
de fenêtre. Cet événement est déclenché À LA PLACE de
BufEnter et WinEnter.
<afile> est fixé à un caractère simple, indiquant le
type de la fenêtre command-line. |cmdwin-char|
*CmdwinLeave*
CmdwinLeave Avant de quitter la fenêtre command-line. Utile pour
effacer des paramètres globaux fixés avec CmdwinEnter.
Cet événement est déclenché À LA PLACE de BufLeave et
WinLeave.
<afile> est fixé à un caractère simple, indiquant le
type de la fenêtre command-line. |cmdwin-char|
*GUIEnter*
GUIEnter Après que l'IHM graphique a été lancée avec succès, et
après l'ouverture de la fenêtre. Déclenché avant
VimEnter quand gvim est utilisé. Peut être utilisé
pour placer la fenêtre dans un fichier gvimrc : *VimEnter*
VimEnter Après toutes les initialisations du démarrage, y
compris le chargement des fichiers vimrc, l'exécution
des arguments "-c cmd", la création de toutes les
fenêtres et le chargement des tampons dedans.
*VimLeavePre*
VimLeavePre Avant de quitter Vim, juste avant l'écriture du
fichier viminfo. N'est exécuté qu'une seule fois, s'il
existe une correspondance avec le nom de ce qui est le
tampon courant quand Vim est quitté.
Essentiellement utile avec un motif "*" : Pour détecter une sortie anormale, utilisez |v:dying|.
*VimLeave*
VimLeave Avant de quitter Vim, juste après l'écriture du
fichier viminfo. N'est exécuté qu'une fois, comme
VimLeavePre.
Pour détecter une sortie anormale, utilisez |v:dying|.
*EncodingChanged*
EncodingChanged Déclenché quand l'option 'encoding' est modifiée.
Utile pour changer de police, par exemple.
*FileEncoding*
FileEncoding Obsolète. Est toujours supporté et est équivalent à
|EncodingChanged|.
*RemoteReply*
RemoteReply Lors de la réception d'une réponse de la part d'un Vim
qui fonctionne en tant que serveur. |server2client()|
<amatch> est fixé à l'{IDserveur} depuis lequel la
réponse a été envoyée, et <afile> à la chaîne de la
réponse.
NOTE : Même si une autocommande est définie, la
réponse devrait être lue avec |remote_read()| pour
être consommée.
*TermChanged*
TermChanged Après le changement de la valeur de 'term'. Utile pour
recharger le fichier de syntaxe pour mettre à jour les
couleurs, polices et autres paramètres dépendant du
terminal. Exécuté pour tous les tampons chargés.
*TermResponse*
TermResponse Après que la réponse à |t_RV| a été reçue du terminal.
La valeur de |v:termresponse| peut être utilisée pour
effectuer certaines actions dépendamment de la version
du terminal.
*UserGettingBored*
UserGettingBored Quand l'utilisateur frappe CTRL-C. Non, c'est pour
rire ! :-)
*User*
User Jamais exécuté automatiquement. À utiliser pour les
autocommandes qui sont uniquement exécutées avec
":doautocmd".
Il existe trois couples d'événements possibles pour la LECTURE des fichiers.
Vim n'en utilise qu'un seul à la fois :
BufNewFile au commencement de l'édition d'un fichier non
existant
BufReadPre BufReadPost au commencement de l'édition d'un fichier
existant
FilterReadPre FilterReadPost à la lecture du fichier temporaire en sortie
du filtre
FileReadPre FileReadPost pour toute autre lecture
NOTE : Les autocommandes pour les événements *ReadPre et tous les événements
Filter ne sont pas autorisés à modifier le tampon courant (vous obtiendrez un
message d'erreur si cela se produit). Cela permet d'éviter que le fichier ne
soit lu dans le mauvais tampon.
NOTE : Le drapeau de modification est désactivé APRÈS l'exécution des
autocommandes BufReadPost et BufNewFile. Mais pas si l'option 'modified' a été
activée par les autocommandes.
Vous pouvez utiliser l'option 'eventignore' pour ignorer un certain nombre
d'événements, ou tous les événements.
==============================================================================
6. Motifs *autocmd-patterns*
Le motif de fichier {motif} est traité pour établir une correspondance avec le
nom de fichier d'une de ces deux façons :
1. Quand il n'y a pas de '/' dans le motif, Vim ne recherche de
correspondance qu'avec la « queue » du nom de fichier (sans le chemin
d'accès initial).
2. Quand il y a un '/' dans le motif, Vim recherche une correspondance avec le
nom de fichier court (tel que vous l'avez saisi) et le nom de fichier
entier (après l'avoir étendu en un chemin complet et avoir résolu les liens
symboliques).
Exemples : Active l'option 'et' pour tous les fichiers texte. Active l'option 'cindent' pour les fichiers C dans le
répertoire "/vim/src". Si "/tmp/test.c" est lié à "/home/babar/vim/src/test.c" et que
vous commencez à éditer le fichier "/tmp/test.c", cette
autocommande correspondra.
NOTE : Pour correspondre à une partie d'un chemin, mais pas depuis le
répertoire racine, utilisez un '*' comme premier caractère. Exemple :Cette autocommande sera par exemple exécutée pour "/tmp/doc/xx.txt" et
"/usr/home/bibi/doc/yy.txt". Le nombre de répertoires n'importe pas ici.
Le nom de fichier auquel le motif doit correspondre est celui obtenu après
l'expansion des jokers. Ainsi, si vous entrez cette commandel'argument est d'abord étendu en
/usr/root/main.py
avant de pouvoir correspondre avec le motif de l'autocommande. Faites
attention à cela quand vous utilisez des événements comme FileReadCmd, la
valeur de <amatch> peut ne pas correspondre à ce que vous espérez.
Les variables d'environnement peuvent être utilisées dans un motif :Et '~' peut être utilisé pour le répertoire personnel (si $HOME est défini) :La variable d'environnement est étendue quand l'autocommande est définie, pas
quand elle est exécutée. À l'inverse de la commande !
*file-pattern*
Le motif est interprété selon les règles généralement utilisées pour les noms
de fichiers :
* correspond à n'importe quelle séquence de caractères
? correspond à n'importe quel caractère simple
\? correspond à un '?'
. correspond à un '.'
~ correspond à un '~'
, sépare des motifs
\, correspond à un ','
{ } comme \( \) dans un motif |pattern|
, entre { } : comme \| dans un motif |pattern|
\ signification spéciale comme dans un motif |pattern|
[ch] correspond à 'c' ou 'h'
NOTE : Le caractère '/' est utilisé comme séparateur de chemin pour tous les
systèmes (même MS-DOS et OS/2). Cela a été décidé car la contre-oblique est
difficile à utiliser dans un motif, et pour rendre les autocommandes portables
entre les différents systèmes.
La correspondance avec le motif est effectuée quand un événement est
déclenché. La modification du nom du tampon dans une des autocommandes -- ou
même la suppression du tampon -- n'infléchira pas l'exécution des
autocommandes. Exemple :Ceci supprimera le tampon courant puis activera 'modified' dans celui qui est
devenu le tampon courant. Vim ne tient pas compte de ce que "*.blabla" ne
corresponde plus au nom de ce tampon. Il correspondait au moment où
l'événement avait été défini.
==============================================================================
7. Groupes *autocmd-groups*
Des autocommandes peuvent être réunies au sein d'un groupe. C'est pratique
pour exécuter ou supprimer un groupe d'autocommandes. Par exemple, toutes les
autocommandes relatives à la coloration syntaxique sont réunies dans le groupe
"highlight", ce qui permet d'exécuter ":doautoall highlight BufRead" quand
l'IHM graphique est lancée.
Si aucun groupe particulier n'est sélectionné, Vim utilise le groupe par
défaut. Le groupe par défaut n'a pas de nom. Vous ne pouvez pas exécuter les
autocommandes du groupe par défaut séparément ; vous ne pouvez le faire qu'en
exécutant les autocommandes pour tous les groupes.
Normalement, quand les autocommandes sont exécutées automatiquement, Vim les
utilise pour tous les groupes. La spécification d'un groupe n'est réalisable
qu'avec ":doautocmd" ou ":doautoall", ou lors de la définition ou de la
suppression d'autocommandes.
Un nom de groupe peut contenir n'importe quel caractère sauf l'espace blanc.
Le nom de groupe "end" est réservé (y compris en majuscules). Le nom de groupe
est sensible à la casse.
*:aug* *:augroup*
:aug[roup] {nom} Définit le nom du groupe d'autocommandes pour les
commandes ":autocmd" suivantes. Le nom "end" ou
"END" sélectionne le groupe par défaut.
*:augroup-delete* *E367*
:aug[roup]! {nom} Supprime le groupe d'autocommandes {nom}. N'utilisez
pas ceci s'il reste une autocommande qui utilise ce
groupe ! Cela n'est pas vérifié.
Pour entrer des autocommandes pour un groupe en particulier, utilisez cette
méthode :
1. Sélectionnez le groupe avec ":augroup {nom}".
2. Supprimez toutes les anciennes autocommandes avec ":au!".
3. Définissez les autocommandes.
4. Revenez au groupe par défaut avec "augroup END".
Exemple :Cela évite d'avoir des autocommandes définies deux fois (p. ex., après un
nouveau sourcement du fichier vimrc).
==============================================================================
8. Exécuter des autocommandes *autocmd-execute*
Vim peut aussi exécuter des autocommandes non automatiquement. C'est utile si
vous avez modifié les autocommandes, ou quand Vim a exécuté de mauvaises
autocommandes (p. ex., quand la correspondance avec le nom de fichier était
mauvaise).
NOTE : L'option 'eventignore' s'applique ici aussi. Les commandes reliées aux
événements listés dans cette option ne pourront pas s'exécuter.
*:do* *:doautocmd* *E217*
:do[autocmd] [groupe] {even} [nomfich]
Applique les autocommandes correspondant à [nomfich]
(défaut : nom du fichier courant) pour {even} au
tampon courant.
Vous pouvez utiliser ceci quand le nom de fichier
courant ne correspond pas au bon motif, après avoir
changé des paramètres, ou pour exécuter des
autocommandes pour un certain événement.
Il est également possible d'utiliser ceci à
l'intérieur d'une autocommande, vous pouvez alors
baser les autocommandes d'une extension sur une autre
extension. Exemple : Attention aux boucles sans fin ! Voir
|autocmd-nested|.
Quand l'argument [groupe] n'est pas donné, Vim exécute
les autocommandes pour tous les groupes. Quand il est
donné, Vim exécute uniquement les autocommandes
correspondant à [groupe]. NOTE : Si vous utilisez un
nom de groupe non défini, Vim émet un message
d'erreur.
*:doautoa* *:doautoall*
:doautoa[ll] [groupe] {even} [nomfich]
Comme ":doautocmd", mais applique les autocommandes à
chaque tampon chargé. Attention ! N'utilisez pas ceci
pour les autocommandes qui suppriment un tampon,
changent pour un autre tampon ou modifient le contenu
d'un tampon ; le résultat serait imprévisible. Cette
commande est destinée aux autocommandes qui fixent des
options, modifient la coloration, et des choses comme
ça.
==============================================================================
9. Utiliser des autocommandes *autocmd-use*
Il existe quatre ensembles d'événements possibles pour l'ÉCRITURE dans des
fichiers. Vim n'en utilise qu'un seul à la fois :
BufWriteCmd BufWritePre BufWritePost lors de l'écriture du
tampon entier
FilterWritePre FilterWritePost lors de l'écriture dans un
fichier temp de filtre
FileAppendCmd FileAppendPre FileAppendPost lors de l'ajout dans un
fichier
FileWriteCmd FileWritePre FileWritePost pour tout autre écriture
dans un fichier
Lorsqu'il existe une autocommande "*Cmd", Vim suppose qu'elle effectuera
l'enregistrement. Il n'y aura pas d'enregistrement ultérieur, et les autres
événements ne seront pas déclenchés. |Cmd-event|
NOTE : Les commandes *WritePost devraient annuler les changements apportés au
tampon par les commandes *WritePre ; sans cela, l'enregistrement du fichier
aura pour effet de bord de modifier le tampon.
Avant d'exécuter les autocommandes, le tampon duquel les lignes doivent être
écrites devient temporairement le tampon courant. À moins que les
autocommandes ne changent le tampon courant ou suppriment le tampon courant
précédent, ce dernier redeviendra à nouveau le tampon courant.
Les autocommandes *WritePre et *AppendPre ne doivent pas supprimer le tampon
duquel les lignes doivent être écrites.
Les marques '[ et '] ont une position spéciale :
- Avant l'événement *ReadPre, la marque '[ est fixée à la ligne juste
au-dessus d'où les nouvelles lignes seront insérées.
- Avant l'événement *ReadPost, la marque '[ est fixée à la première ligne qui
vient d'être lue, la marque '] à la dernière ligne.
- Avant l'exécution des autocommandes *WritePre et *AppendPre, la marque '[
est fixée à la première ligne qui devra être écrite, la marque '] à la
dernière ligne.
Attention ! '[ et '] changent quand des commandes qui modifient le tampon sont
utilisées.
Dans les commandes qui attendent un nom de fichier, vous pouvez utiliser
"<afile>" pour donner le nom du fichier qui doit être lu |:<afile>| (vous
pouvez aussi utiliser "%" pour le nom du fichier courant).
"<abuf>" peut être utilisé pour donner le numéro du tampon courant
effectif. Cela marche aussi pour les tampons qui n'ont pas de nom ; mais pas
pour les fichiers sans tampon (p. ex., avec ":r fichier").
*gzip-example*
Exemple (pour lire et enregistrer des fichiers compactés) :Le groupe "gzip" est utilisé pour permettre de supprimer toutes les
autocommandes existantes avec ":autocmd!", pour le cas où le fichier serait
sourcé deux fois.
("<afile>:r" est le nom du fichier sans son extension, voir |:_%:|.)
Les commandes exécutées pour les événements BufNewFile, BufRead/BufReadPost,
BufWritePost, FileAppendPost et VimLeave ne modifient pas le drapeau de
modification du fichier. Quand vous décompactez le tampon avec les
autocommandes BufReadPost, vous pouvez toujours quitter avec ":q". Quand vous
utilisez ":undo" dans BufWritePost pour annuler les changements effectués par
les commandes BufWritePre, vous pouvez toujours faire ":q" ("ZZ" fonctionnera
aussi). Si vous souhaitez que le tampon soit marqué comme modifié, activez
l'option 'modified'.
Pour exécuter des commandes du mode Normal à partir d'une autocommande,
utilisez la commande ":normal". Mais soyez prudent ! si la commande du mode
Normal n'est pas terminée, l'utilisateur devra taper des caractères
supplémentaires (p. ex., après ":normal m", vous devrez entrer le nom d'une
marque).
Si vous ne souhaitez pas que le tampon soit considéré comme modifié après
l'avoir changé, désactivez l'option 'modified'. Cela permet de quitter le
tampon avec ":q" au lieu de ":q!".
*autocmd-nested* *E218*
Par défaut, les autocommandes ne s'imbriquent pas. Si vous utilisez ":e" ou
":w" dans une autocommande, Vim n'exécutera pas les autocommandes BufRead et
BufWrite pour ces commandes. Pour autoriser l'imbrication, utilisez le drapeau
"nested" avec les commandes pour lesquelles vous la souhaitez. Par exemple :L'imbrication est limitée à 10 niveaux, pour sortir des boucles récursives.
Il est possible d'utiliser la commande ":au" dans une autocommande. Cela peut
donner une commande qui s'auto-modifie ! Cela peut être utile pour une
autocommande qui ne devrait s'exécuter qu'une seule fois.
Il n'existe actuellement aucun moyen pour désactiver les autocommandes. Si
vous souhaitez enregistrer un fichier sans exécuter les autocommandes
associées à son type, enregistrez-le sous un nom différent puis renommez-le
par l'intermédiaire d'une commande shell. Dans certains cas, vous pouvez
utiliser l'option 'eventignore'.
NOTE : Lors de la lecture d'un fichier (avec ":read fichier" ou une commande
de filtre), si la dernière ligne du fichier ne contient pas de <EOL>, Vim se
le rappellera. Lors du prochain enregistrement (avec ":write fichier" ou une
commande de filtre), si la même ligne est à nouveau écrite comme dernière
ligne dans un fichier ET que 'binary' est activé, Vim n'ajoutera pas de <EOL>.
Cela permet à une commande de filtre exécutée sur les lignes juste lues
d'écrire le fichier tel qu'il vient d'être lu, et à une commande d'écriture
sur les lignes juste filtrées d'écrire le fichier tel qu'il vient d'être lu
depuis le filtre. Par exemple, pour enregistrer un fichier compacté, on peut
aussi employer cette méthode :
*autocommand-pattern*
Vous pouvez spécifier des motifs multiples, séparés par des virgules. Voici
quelques exemples :Pour les fichiers de type Makefile ("makefile", "Makefile", "imakefile",
"makefile.unix", etc.) :Pour toujours commencer l'édition des fichiers C à la première fonction :Sans le "1;" ci-dessus, la recherche débuterait de l'endroit où le fichier a
été ouvert, plutôt que du début du fichier.
*skeleton* *template*
Pour lire un squelette (modèle) de fichier lors de l'ouverture d'un nouveau
fichier :Pour insérer la date et l'heure courante dans un fichier ".html" lors de son
enregistrement :Vous devrez avoir une ligne "Dernière modification : <date heure>" dans les
20 première lignes du fichier pour que cela fonctionne. Vim remplace "<date
heure>" (et tout ce qui suit dans la même ligne) par la date et l'heure
courante.
Dissection :
ks marque la position courante avec 's'
call DerModif() appelle la fonction DerModif() pour effectuer le
travail
's revient à l'ancienne position
La fonction DerModif() teste si le fichier fait moins de 20 lignes, puis
utilise la commande ":g" pour trouver les lignes qui contiennent "Dernière
modification : ". Pour ces lignes, la commande ":s" est exécutée pour
remplacer les date et heure existantes par les courantes. La commande
":execute" est utilisée pour pouvoir employer une expression avec les
commandes ":g" et ":s". La date et l'heure sont obtenues avec la fonction
strftime(). Vous pouvez en modifier les arguments pour obtenir une autre
chaîne d'horodatage.
Quand vous entrez ":autocmd" sur la ligne de commande, le complètement des
noms d'événements et de commandes peut être effectué (avec <Tab>, CTRL-D,
etc.) là où c'est approprié.
Vim exécute toutes les autocommandes correspondantes dans l'ordre où vous les
avez spécifiées. Il est recommandé de placer en premier les autocommandes
devant être exécutées pour tous les fichiers (celles qui utilisent le motif
"*" comme motif de fichier). Cela vous permet de définir les paramètres que
vous souhaitez par défaut pour tous vos fichiers ; s'il y a ensuite d'autres
autocommandes correspondantes, elles recouvriront ces valeurs. Ainsi, lorsque
vous ouvrez un fichier, il utilise au moins les paramètres par défaut, même si
le fichier précédent avait fixé ces paramètres différemment.
NOTE : "*" correspondra aussi aux fichiers débutant par '.', contrairement
aux shells Unix.
*autocmd-searchpat*
Les autocommandes ne modifient pas les motifs de recherche courants. Vim
enregistre les motifs de recherche courants avant d'exécuter les
autocommandes, puis les restaure après qu'elles ont fini. Cela signifie que
les autocommandes n'affectent pas les chaînes mises en surbrillance avec
l'option 'hlsearch'. À l'intérieur des autocommandes, vous pouvez toujours
utiliser les motifs de recherche normalement, p. ex., avec la commande "n".
Si vous souhaitez qu'une autocommande fixe le motif de recherche afin qu'il
reste utilisable après que l'autocommande a fini, utilisez la commande
":let @/ =".
La surbrillance de recherche ne peut pas être désactivée avec ":nohlsearch"
dans une autocommande. Utilisez le drapeau 'h' de l'option 'viminfo' pour
désactiver la surbrillance de recherche au démarrage de Vim.
*Cmd-event*
Quand un des événements "*Cmd" est utilisé, les autocommandes correspondantes
sont censées effectuer la lecture ou l'enregistrement du fichier. Ceci peut
être utilisé lorsque vous travaillez avec des fichiers d'un type particulier,
par exemple sur un système distant.
ATTENTION ! Si vous utilisez ces événements de mauvaise façon, cela peut
avoir comme effet de rendre impossible la lecture ou l'enregistrement des
fichiers correspondants. Assurez-vous d'abord de bien tester vos
autocommandes. Le mieux est d'utiliser un motif qui ne pourra jamais
correspondre à un nom de fichier normal, par exemple "ftp://*".
Quand vous définissez un événement BufReadCmd, il sera difficile pour Vim de
recouvrer une session d'édition plantée. Lors du recouvrement à partir du
fichier original, Vim lit uniquement les parties du fichier qu'il ne trouve
pas dans le fichier d'échange. Comme cela n'est pas possible avec BufReadCmd,
utilisez la commande |:preserve| pour vous assurer que le fichier original ne
sera plus nécessaire pour le recouvrement. Cela n'est utile qu'au cas où le
fichier a été modifié.
La variable |v:cmdarg| contient les arguments "++enc=" et "++ff=" effectifs.
Ils devraient être utilisés pour la commande qui lit/enregistre le fichier.
Voir $VIMRUNTIME/plugin/netrw.vim pour avoir des exemples.
vim:tw=78:ts=8:ft=help:norl: