*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 "") 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 "", qui est étendu lorsque l'autocommande est définie. Exemple : > :au BufNewFile,BufRead *.html so :h/html.vim Ici, Vim étend 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 : > :autocmd! " Supprime TOUTES les autocmd pour le groupe courant. 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 : > :if !exists("autocommandes_incluses") : let autocommandes_incluses = 1 : au ... :endif 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 : > :set verbose=9 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 || 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. peut être utilisé pour donner le nom du fichier où cette option a été fixée, et pour la nouvelle valeur de 'filetype'. Voir |filetypes|. *Syntax* Syntax Quand l'option 'syntax' a été fixée. peut être utilisé pour donner le nom du fichier où cette option a été fixée, et 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é "". 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. et 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 : > :let &ro = &ro < {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é "". *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é "". *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é "". *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éé "". 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éé "". *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é "". *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é "". *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. 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. 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 : > :autocmd GUIEnter * winpos 100 50 < *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 "*" : > :autocmd VimLeavePre * call AvantDeSortir() < 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()| est fixé à l'{IDserveur} depuis lequel la réponse a été envoyée, et à 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 : > :autocmd BufRead *.txt set et < Active l'option 'et' pour tous les fichiers texte. > :autocmd BufRead /vim/src/*.c set cindent < Active l'option 'cindent' pour les fichiers C dans le répertoire "/vim/src". > :autocmd BufRead /tmp/*.c set ts=5 < 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 : > :autocmd BufRead */doc/*.txt set tw=78 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 commande > :e $ROOTDIR/main.$EXT l'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 peut ne pas correspondre à ce que vous espérez. Les variables d'environnement peuvent être utilisées dans un motif : > :autocmd BufRead $VIMRUNTIME/doc/*.txt set expandtab Et '~' peut être utilisé pour le répertoire personnel (si $HOME est défini) : > :autocmd BufWritePost ~/.vimrc so ~/.vimrc :autocmd BufRead ~archive/* set readonly 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 : > :au BufEnter *.blabla bdel :au BufEnter *.blabla set modified 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 : > :augroup decompactage : au! : au BufEnter *.gz %!gunzip :augroup END 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 : > :au Bufenter *.cpp so ~/.vimrc_cpp :au Bufenter *.cpp doau BufEnter x.c < 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 "" pour donner le nom du fichier qui doit être lu |:| (vous pouvez aussi utiliser "%" pour le nom du fichier courant). "" 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) : > :augroup gzip : autocmd! : autocmd BufReadPre,FileReadPre *.gz set bin : autocmd BufReadPost,FileReadPost *.gz '[,']!gunzip : autocmd BufReadPost,FileReadPost *.gz set nobin : autocmd BufReadPost,FileReadPost *.gz execute ":doautocmd BufReadPost " . expand("%:r") : autocmd BufWritePost,FileWritePost *.gz !mv :r : autocmd BufWritePost,FileWritePost *.gz !gzip :r : autocmd FileAppendPre *.gz !gunzip : autocmd FileAppendPre *.gz !mv :r : autocmd FileAppendPost *.gz !mv :r : autocmd FileAppendPost *.gz !gzip :r :augroup END 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. (":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 : > :autocmd FileChangedShell *.c nested e! 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 , 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 . 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 : > :autocmd FileWritePre *.gz set bin|'[,']!gzip :autocmd FileWritePost *.gz undo|set nobin < *autocommand-pattern* Vous pouvez spécifier des motifs multiples, séparés par des virgules. Voici quelques exemples : > :autocmd BufRead * set tw=79 nocin ic infercase fo=2croq :autocmd BufRead .lettre set tw=72 fo=2tcrq :autocmd BufEnter .lettre set dict=/usr/lib/dict/words :autocmd BufLeave .lettre set dict= :autocmd BufRead,BufNewFile *.c,*.h set tw=0 cin noic :autocmd BufEnter *.c,*.h abbr FOR for (i = 0; i < 3; ++i){}O :autocmd BufLeave *.c,*.h unabbr FOR Pour les fichiers de type Makefile ("makefile", "Makefile", "imakefile", "makefile.unix", etc.) : > :autocmd BufEnter ?akefile* set include=^s\=include :autocmd BufLeave ?akefile* set include& Pour toujours commencer l'édition des fichiers C à la première fonction : > :autocmd BufRead *.c,*.h 1;/^{ 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 : > :autocmd BufNewFile *.c 0r ~/vim/squelette.c :autocmd BufNewFile *.h 0r ~/vim/squelette.h :autocmd BufNewFile *.java 0r ~/vim/squelette.java Pour insérer la date et l'heure courante dans un fichier ".html" lors de son enregistrement : > :autocmd BufWritePre,FileWritePre *.html ks|call DerModif()|'s :fun DerModif() : if line("$") > 20 : let l = 20 : else : let l = line("$") : endif : exe "1," . l . "g/Dernière modification : /s/Dernière modification : .*/Dernière modification : " . : \ strftime("%d %b %Y %X %Z") :endfun Vous devrez avoir une ligne "Dernière modification : " dans les 20 première lignes du fichier pour que cela fonctionne. Vim remplace "" (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 , 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: