notes concernant vi

Creation: 3 janvier 2012
Mise à jour: 9 juillet 2013
Version: 1.4
Author: Jean-Louis Bicquelet-Salaün
Location: http://jlbicquelet.free.fr
Copyright: (c) 2012-2013 Jean-Louis BICQUELET

les modes de vi

vi a trois modes de fonctionnement différents:

  1. un mode de commande dans lequel tout ce qui est tapé est interprété. Dans ce mode, on peut sauver ou recharger des buffers, copier ou supprimer des lignes.... Pour entrer dans ce mode, il faut taper le caractère .
  2. un mode d'entrée de texte. Tout caractère tapé est inséré. On entre dans ce mode par un certain nombre de caractère i, a, o, O, etc..
  3. un mode de commande en ligne. On entre dans se mode en tapant le caractère :. Dans ce mode les commandes peuvent porter sur le fichier entier, une ligne, un groupe de lignes... Les commandes peuvent être complexes, et permettent de copier, supprimer ou déplacer un certain nombre de lignes, sauver les fichiers édités, gérer les buffers, éditer plusieurs fichiers, définir des abbréviations, appeler des commandes shell, et bien d'autres choses encore.

    

Dans la suite, on appelera ces commandes les commandes ex.

Mode ligne

Commandes fichiers

: passer en mode commande
Q passer en mode commande
:q quitter
:q! forcer à quitter
:w fichier sauver le fichier
:w!fichier sauver le fichier impérativement
:w sauver sous
:wq écr re le fichier et sortir
:m,nw fichier ecrire les lignes de m à n dans un fichier
:e! rééditer en oubliant les modifications
:e: editer un nouveau fichier (tout en conservant les buffers)
:e# editer le fichier précédent
:r fichier insère le fichier à l'emplacement courrant
:!commande execute la commande système commande
:r! commande execute la commande système commande et insère le résultat à l'emplacement courrant
:sh appel d'un sell. Sortie par exit

Remplacement

:s/DE/A/ remplace DE par A (1 fois) dans la ligne courrante
:s/DE/A/g remplace tous les DE par A
:s/\(DE\)/A \1/ remplace DE par A et contatene avec DE

mappage de touches

:map K ibegin map la touche K avec l'insertion du mot begin
:map K d$ map la touche K avec l'effacement jusqu'à la fin de la ligne
:unmap K retire le mapapge de la touche K
:map affiche les touches mappées

Pour le mappage de touches, les touches que l'on peut mapper sont

  • les touches de fonction
  • K V g q v * =

gestion des abbréviations

:ab ch chaine
ch ESC inseree chaine
:ab affiche les abbréviation
:una ch retire une abbréviation

Configuration

:set list montre les caractères invisibles
:set nolist cache les caractères invisibles
:set nu fixe les numéros de lignes
:set number montre les numéros de lignes
:set nonu retire les numéros de ligne
:set nonumber cache les numéros de lignes
:set ignorecase ignore la casse pour les recherches
:set ic
:set ignorecase n'ignore pas la casse pour les recherches
:set noic
:set all montrer les options
:set list afficher les caractères lisibles
:set wm=n garder n espaces de marge à droite
:set autoindent auto indentation on
:set noautoindent pas de auto indentation
:set all montre les paramêtres

Ces parametres peuvent être conservés dans .exrc du home directory

Attention sous AIX le nombre d'option est restreint. Certaines options n'existent pas.

Indentation

:set ai permet de faire automatiquement les indentations
:set autoindent
:set shiftwidth=n permet de régler à n le nombre d'espace d'une indentation
:set sw=n

Mode commande

Deplacement sur l'écran

0 va au début de la ligne
$ va à la fin de la ligne
h gauche
j haut
k bas
l droite
1G va en début de document
:100 va à la ligne 100
H va en haut de l'écran
L va en bas de l'écran

Deplacement dans le fichier

G va à la dernière ligne du fichier
nG va à la ligne n du fichier

F page down
B page up
w début du mot suivant
e fin du mot suivant
W début du mot précédent
nW en avant de n mot
E fin du mot précédent
B en arrirère de unmot
nB en arrière de n mot
( début de la phrase précédente
) début de la phrase suivante
{ début du paragraphe précédente
} début du paragraphe suivante
% va à la parenthèse ou l'accolade correspondante.

Recherche et remplacement

/exp cherche une chaine vers l'avant
?exp cherche une chaine vers l'arrière
n poursuit la recherche dans le même sens
N poursuit la recherche dans le sens contaire
s/chaine1/chaine2/ options remplace la chaine chaine1 par chaine2
:g/string1/s//string2/ options recherche et remplacement global de a chaine chaine1 par chaine2

les options possibles sont:
  • g - change toutes les occurences
  • c - confirmer chaque changement
  • p afficher chaque changement

Effacement de texte

x efface un caractère
nx efface n caractères
dw efface un mot
dd efface une ligne
ndd efface n lignes
D efface jusqu'à la fin de l ligne
d0 efface jusqu'au début de la ligne
dG efface jusqu'à la fin du fichier

Annulation de fonction d'édition

u défait la dernière modification
. refaire la dernière modification à nouveau

Copie et insertion de texte

Y sélectionne une ligne
n Sélectionne n lignes
p dépose la sélection après le curseur
P dépose la sélection avant le curseur

Traitement de texte

J union de la ligne suivante et de la ligne courrante
nJ Union de n lignes avec la courrante
xp transpose 2 caractères

Indentation

<< indentation de la ligne vers la gauche
>> indentation de la ligne vers la droite
n<< indente les n lignes suivantes
n>>
<% indente si on est placé sur le premier élément d'une paire de crochets, de parenthèses ou d'accolades
>%

Mode insertion

Ajout de texte

a ajout après le curseur
A ajout à la fin de la ligne
i insère avant lr curseur
ni insère n fois le texte
I insère en début de ligne

Ajout de nouvelles lignes

o ouvre une ligne après le curseur
O ouvre une ligne avant le curseur

Modification de texte

cw modifie un mot
ncw modifie n mot
C modifie une ligne
C$ modifie une ligne
r remplace un caratère
nr remplace n lettre par le caractère
R remplace/retape une ligne

gestion des buffers nommés

Il existe 26 buffers nommés avec des lettres (de a à z) et 9 avec des chiffres (de 1 à 9)

commande buffer explication
"ayy a copier une ligne dans le buffer a
"a5yy a mettre cinq lignes dans le buffer a
"Byy b ajouter une ligne dans le buffer b
"ap a paste à l'emplacement courrant du buffer a

On peut avoir jusqu'à 9 buffer de \1 à \9. Toutes les chaines cherchées doivent être encapsulées ente \( et \)

exemple:

comment déplacer un texte du fichier source à destination

vi source
“%blue (a)%red (10)yy  (copie 10 lignes dans le buffer a):w (ecrire le buffer a)
:e dest (afficher le fichier destination)
“ap (copie du texte après le curseur)
:30,60w

limitations AIX

L'editeur VI présente les limitations suivantes sous AIX, sachant que le compte se fait en caractères de 8 bits:

  • 256 caractères par commande liste globale
  • 2048 caractères dans une commande shell
  • 30 caractères dans un nom de tag
  • 128 macros mappées avec 2048 caractères au total
  • 1.048.560 lignes
  • les noms de macros et les textes des macros est limité à 100 caractères
  • VI supporte un maximum de 2Go de buffer d'édition

Je l'ai déjà évoqué plus haut, certaines options de configuration n'existent pas sous AIX.

Les principales sont:

Exemple sous AIX:

:set all
autoindent              mesg                            noshowmode
autoprint               nomodeline                      noslowopen
noautowrite             nonumber                        tabstop=8
nobeautify              nonovice                        taglength=0
closepunct='".,;)]}     nooptimize                      tags=tags /usr/lib/tags
directory=/var/tmp      paragraphs=IPLPPPQPP LIpplpipbp backtag
noedcompatible          partialcharacter=-              term=vt100
noerrorbells            prompt                          noterse
noexrc                  noreadonly                      timeout
flash                   redraw                          ttytype=vt100
hardtabs=8              remap                           warn
history=32              report=5                        window=23
noignorecase            scroll=11                       wrapscan
linelimit=1048560       sections=NHSHH HUuhsh+c         wrapmargin=0
nolisp                  shell=/usr/bin/ksh              nowriteany
nolist                  shiftwidth=8                    wraptype=word
magic                   noshowmatch