*usr_40.txt* Pour Vim version 6.2. Dernière modification : 29 oct 2002 MANUEL de l'UTILISATEUR VIM - par Bram Moolenaar Créer de nouvelles commandes Vim est un éditeur extensible. Vous pouvez prendre une séquence de commandes que vous utilisez souvent et en faire une nouvelle commande. Ou redéfinir une commande existante. Les autocommandes vous permettent d'exécuter automatiquement des commandes. |40.1| Mapper des touches |40.2| Définir des commandes pour la ligne de commande |40.3| Autocommandes Chapitre suivant : |usr_41.txt| Écrire un script Vim Chapitre précédent : |usr_31.txt| Exploiter l'interface graphique Table des matières : |usr_toc.txt| ============================================================================== *40.1* Mapper des touches Un mappage simple a été expliqué dans la section |05.3|. Le principe est qu'une séquence de touches est traduite en une autre séquence de touches. C'est un mécanisme simple, mais puissant. La forme la plus simple est quand une touche est mappée à une séquence de touches. Puisque les touches de fonctions, à l'exception de , n'ont pas de signification prédéfinies dans Vim, elles sont des candidates de choix pour les mappages. Exemple : > :map GoDate : :read !datekJ Cet exemple montre comment les modes sont utilisés. Après s'être rendu sur la dernière ligne avec "G", la commande "o" ouvre une nouvelle ligne et passe en mode Insertion. Le texte "Date : " est inséré et quitte le mode Insertion. Remarquez la notation des touches spéciales entre <>. Cela s'appelle la notation entre chevrons [N.D.T. ou encore la notation <>]. Vous les tapez comme des caractères séparés, et non pas en pressant la touche elle-même. Cela rend les mappages bien plus lisibles, et vous pouvez copier et coller le texte sans aucun problème. Le caractère ":" passe Vim sur la ligne de commande. La commande ":read !date" lit la sortie de la commande `date` et l'ajoute sous la ligne courante. Le est requis pour exécuter la commande ":read". À ce moment de l'exécution, le texte ressemble à ceci : Date : ~ Fri Jun 15 12:54:34 CEST 2001 ~ À présent, "kJ" déplace le curseur vers le haut puis fusionne les deux lignes. Pour savoir quelle(s) touche(s) utiliser pour les mappages, voir |map-which-keys|. MAPPAGES ET MODES La commande ":map" définit le remappage de touches en mode Normal. Vous pouvez aussi définir des mappages pour les autres modes. Par exemple, ":imap" s'applique au mode Insertion. Vous pouvez l'utiliser pour insérer la date sous le curseur : > :imap Date : :read !datekJ Cet exemple ressemble beaucoup au mappage de en mode Normal, seul le début est différent. Le mappage de en mode Normal existe toujours. Ainsi, vous pouvez mapper la même touche différemment pour chaque mode. Notez que, bien que ce mappage commence en mode Insertion, il se termine en mode Normal. Si vous voulez qu'il poursuive le mode Insertion, ajoutez un "a" à la fin du mappage. Voici un résumé des commande de mappages, avec le mode dans lequel ils fonctionnent : :map Normal, Visuel et Opérateur-en-cours :vmap Visuel :nmap Normal :omap Opérateur-en-cours :map! Insertion et Ligne-de-commande :imap Insertion :cmap Ligne-de-commande Le mode Opérateur-en-cours est actif quand vous tapez un caractère opérateur, tel que "d" ou "y", et que Vim attend la saisie d'une commande de mouvement ou un objet textuel. Ainsi, quand vous tapez "dw", le "w" est saisi en mode Opérateur-en-cours. Supposons que vous voulez définir de façon que la commande d efface le bloc d'un programme en C (texte entouré d'accolades, {}). Similairement, y copierait le bloc dans le registre sans nom. En conséquence, ce dont vous avez besoin est de définir de sorte qu'il sélectionne le bloc de programme courant. Vous pouvez le faire avec la commande suivante : > :omap a{ Cela entraîne que réalise la sélection du bloc "a{" (objet textuel "un bloc {}") en mode Opérateur-en-cours, comme si vous l'aviez tapé. Ce mappage est pratique si la saisie d'un '{' est pénible sur votre clavier. LISTER LES MAPPAGES Pour visualiser les mappages actuellement définis, utilisez ":map" sans argument. Ou l'une de ses variantes qui inclut le mode dans lequel elle fonctionne. La sortie pourrait ressembler à ceci : _g :call MyGrep(1) ~ v :s/^/> /:noh`` ~ n :.,$s/^/> /:noh`` ~ ~ ~ La première colonne de la liste indique le mode dans lequel le mappage opère. "n" pour le mode Normal, "i" pour le mode Insertion, etc. Un espace blanc indique un mappage défini avec la commande ":map", donc un mappage effectif en mode Normal et en mode Visuel. L'un des objectifs pratiques de la liste des mappages est de vérifier si les touches spéciales en notation <> ont été reconnues (ce qui ne fonctionne que si la coloration est supportée). Par exemple, quand "" est affiché en couleur, il représente le caractère d'échappement. Quand il est de la même couleur que le reste du texte, ce sont simplement cinq caractères. REMAPPER Le résultat d'un mappage est inspecté pour y trouver d'autres mappages. Par exemple, le mappage de des exemples précédents pourrait s'écrire : > :map G :imap :map oDate : :read !datekJ En mode Normal, est mappé pour aller à la dernière ligne, puis faire comme si était pressé. En mode Insertion, quitte le mode Insertion avec puis utilise également . Alors est mappé pour faire réellement le travail. Supposons que vous n'utilisiez que rarement le mode Ex, et que vous vouliez utiliser la commande "Q" pour mettre du texte en forme (à l'image des anciennes versions de Vim). Voici la mappage qui le fera : > :map Q gq Mais dans certains cas, vous avez tout de même besoin du mode Ex. Mappons "gQ" à "Q", afin que vous puissiez toujours passer en mode Ex : > :map gQ Q Ce qui se produit maintenant, c'est que quand vous tapez "gQ", la séquence est mappée à "Q". Pas de problème jusque là. Mais "Q" est mappé à "gq", ainsi taper "gQ" aboutit à "gq", et vous ne passez pas du tout en mode Ex. Pour éviter que des touches soient mappées à nouveau, utilisez la commande ":noremap" : > :noremap gQ Q Maintenant, Vim sait que "Q" ne doit pas être inspecté pour y appliquer des mappages. Il existe une commande similaire pour chaque mode : :noremap Normal, Visuel and Opérateur-en-cours :vnoremap Visuel :nnoremap Normal :onoremap Opérateur-en-cours :noremap! Insertion et Ligne-de-commande :inoremap Insertion :cnoremap Ligne-de-commande MAPPAGES RÉCURSIFS Quand un mappage s'appelle lui-même, il boucle indéfiniment. Cela peut servir à répéter indéfiniment une action. Par exemple, vous avez une liste de fichiers contenant un numéro de version dans la première ligne. Vous ouvrez ces fichiers avec "vim *.txt". Vous éditez à présent le premier fichier. Définissez ce mappage : > :map ,, :s/5.1/5.2/:wnext,, Maintenant, tapez ",,". Cela déclenche le mappage. Il remplace "5.1" par "5.2" dans la première ligne. Puis il effectue un ":wnext" pour écrire le fichier et éditer le suivant. Le mappage se termine par ",,". Cela déclenche à nouveau le même mappage, et par conséquent réalise la substitution, etc. Cela continue jusqu'à ce qu'une erreur se produise. Dans ce cas, cela pourrait être un fichier dans le lequel la commande de substitution ne trouve pas de correspondance pour "5.1". Vous pouvez alors faire une modification pour insérer "5.1" et poursuivre, en tapant ",," à nouveau. Ou alors ":wnext" échoue, parce que vous avez atteint le dernier fichier de la liste. Quand un mappage rencontre une erreur en milieu de parcours, la fin du mappage est silencieusement ignoré. CTRL-C interrompt le mappage (CTRL-Attn sur MS-Windows). SUPPRIMER UN MAPPAGE Pour supprimer un mappage, utilisez la commande ":unmap". Encore une fois, le mode dans lequel la suppression s'applique dépend de la commande utilisée : :unmap Normal, Visuel et Opérateur-en-cours :vunmap Visuel :nunmap Normal :ounmap Opérateur-en-cours :unmap! Insertion et Ligne-de-commande :iunmap Insertion :cunmap Ligne-de-commande Il existe une astuce pour définir un mappage qui fonctionne en mode Normal et Opérateur-en-cours, mais pas en mode Visuel. Définissez-le d'abord pour les trois modes, puis supprimez-le pour le mode Visuel : > :map /---> :vunmap Notez que les cinq caractères "" représentent la combinaison simple CTRL-A. Pour supprimer tous les mappages, utilisez la commande |:mapclear|. Vous pouvez deviner les variations disponibles pour les différents modes. Soyez prudent avec cette commande, il est impossible de l'annuler. CARACTÈRES SPÉCIAUX La commande ":map" peut être suivie par une autre commande. Un caractère '|' sépare les deux commandes. Cela signifie aussi qu'un caractère '|' ne peut pas être utilisé à l'intérieur d'une commande de mappage. Pour l'utiliser tout de même, employez (cinq caractères). Exemple : > > :map :write !checkin % Le même problème existe avec la commande ":unmap", en plus de l'attention particulière que vous devez apporter aux espaces finaux. Ces deux commandes sont différentes : > :unmap a | unmap b :unmap a| unmap b La première commande tente de supprimer le mappage "a ", avec un espace final. Pour utiliser un espace dans un mappage, employez (sept caractères) : > :map W Cela a pour résultat que la barre espace avance le curseur au prochain mot suivant un espace blanc. Il n'est pas possible de mettre un commentaire après un mappage, car le caractère '"' est considéré comme une partie du mappage. MAPPAGES ET ABRÉVIATIONS Les abréviations sont assez semblables à des mappages en mode Insertion. Les arguments sont gérés de la même façon. La principale différence est la manière dont elles sont déclenchées. Une abréviation est déclenchée en tapant un caractère non-mot après le mot. Un mappage est déclenché quand le dernier caractère est tapé. Une autre différence est que les caractères que vous tapez pour une abréviation sont insérés dans le texte pendant que vous les tapez. Quand l'abréviation est déclenchée, ces caractères sont effacés et remplacés par le produit de l'abréviation. Quand vous tapez des caractères pour un mappage, rien n'est inséré jusqu'à ce que vous tapiez le dernier caractère qui le déclenche. Si l'option 'showmode' est activée, les caractères tapés sont affichés dans la dernière ligne de la fenêtre Vim. Une exception existe quand un mappage est ambigu. Supposons que vous avez deux mappages : > :imap aa foo :imap aaa bar À présent, si vous tapez "aa", Vim ne sait pas s'il doit appliquer le premier ou le second mappage. Il attend qu'un autre caractère soit tapé. Si c'est un 'a', le second mappage est appliqué et aboutit à "bar". Si c'est un espace, par exemple, le premier mappage est appliqué, aboutissant à "foo", puis l'espace est inséré. ET PLUS ENCORE... le mot-clé