Jump to content

Archived

This topic is now archived and is closed to further replies.

ouragan

Editeur de texte vi

Recommended Posts

Une succinte présentation de vi

vi est un éditeur de texte présent sur le système , en concurrence avec ee, sur les systèmes Linux comme BSD.

:keskidit: Pour une utilisation de débutants

Ce qui est nécessaire pour modifier des fichiers de configuration.

:transpi: Pour lire un fichier avec vi, il suffit d'écrire la commande vi suivie du nom du fichier.

#vi /usr/home/monrépertoire/monfichier

Vous remarquerez que le répertoire /home est sur FreeBSD un sous-répertoire de /usr.

Vous remarquerez aussi que monfichier n'a pas d'extension. Ce sont les premiers bits du contenu d'un fichier qui permettent de décrire quel type de fichier c'est.

Le contenu du fichier est alors affiché intégralement sur la page courante (console virtuelle ou Terminal de votre environnement graphique favori).

Comment se déplacer et modifier le contenu?

vi dispose de deux modes de fonctionnement:

le premier accessible à l'ouverture d'un fichier, et chaque fois que l'on appuie sur la touche <Echap> (ou <Esc> ) est le mode d'édition. Les commandes disponibles et utiles sur ce mode sont les suivantes:

:craint:.........Pour Déplacer le curseur

-Les flèches: pour se déplacer dans le corps du texte.

h      Déplace le curseur d'un caractère vers la gauche.
j       Déplace le curseur d'une ligne vers le bas.
k      Déplace le curseur d'une ligne vers le haut.
l       Déplace le curseur d'un caractère vers la droite.

:roule:..........Pour Effacer des caractères ou des chaînes de caractère

x                             Efface le caractère se trouvant sous le curseur
dd                           Efface la ligne complète se trouvant sous le curseur
dXd                         Efface X lignes
d$                           Efface les caractères de la ligne du curseur à la fin de la ligne
dG                           Efface tout le texte du curseur à la fin du fichier

:arrow:.........Pour Copier une ligne:

yy                            Copie la ligne sous le curseur
yXy                          Copie X lignes depuis le curseur
p                             Ajoute la ligne copiée à la suite de la ligne où se trouve le curseur
Xp                           Colle X fois la ligne copiée

:arrow:.........Pour mettre en page le texte

>>       permet de faire une indentation vers la droite
>X>     permet de faire une indentation vers la droite sur les X lignes suivantes
X>>     permet de faire X indentations vers la droite
X>Y>   permet de faire X indentations vers la droite sur les Y lignes suivantes

<<        permet de faire une indentation vers la gauche
<X<      permet de faire une indentation vers la gauche sur les X lignes suivantes
X<<      permet de faire X indentations vers la gauche
X<Y<    permet de faire X indentations vers la gauche sur les Y lignes suivantes

:arrow:.........Pour aller plus vite

.                      Permet de répéter la derniere action
X.                    Permlet de répeter X fois la derniere action
ZZ                   Permet de remplacer :wq!  (sauver et quitter en forçant)

r        Permet de substituer une lettre
R       Permet de passer en mode remplacement, equivalent de la touche insert sur le clavier. echap + i pour repasser en mode insertion.
cw     Permet de changer un mot
dw     Permet d'effacer un mot

:arrow:.........Pour le repérage

set nu permet d'"afficher la numération des lignes
set nonu permet de l'enlever

Acces direct à une ligne:

vi toto.c
911

ou 

vi +911 toto.c

Positionner le curseur sur une ligne:

<numbre> Positionne le curseur sur la ligne <nombre>

:arrow:.........Pour réparer les erreurs

u        Permet d'aller plus vite
:q!      Permet de quitter sans enregistrer (forcer à quitter)

:arrow:.........Pour Basculer en mode insertion de texte

i                               passe en mode insertion juste avant le curseur
a                              passe en mode insertion juste après le curseur
<shift+a>                 passe en mode insertion à la fin de la ligne
<shift+i>                  passe en mode insertion au début de la ligne
o                             Démarre une nouvelle ligne au-dessous de la ligne où se trouve le curseur et place celui-ci en début de ligne
O                           Démarre une nouvelle ligne au-dessus de la ligne où se trouve le curseur et place celui-ci en début de ligne

:arrow:.........Pour Basculer en mode Edition

<Echap>

:arrow:.........Pour Enregistrer:

:w
:w!

:arrow:.........Pour quitter:

:q
:q!

L'usage du ! point d'exclamation permet de forcer l'enregistrement ou de quitter (en particulier si vous avez modifié un texte et que vous ne vouliez pas).

Et n'oubliez pas: surligner le texte que vous voulez copier, basculer en mode insertion à l'endroit où vous souhaitez l'insérez et faites un clic-milieu: c'est la version BSD-Linux du copier-coller. ;)

Share this post


Link to post
Share on other sites

:keskidit:Commandes avancées:

:transpi: Pour avoir plusieurs vi dans une seule et meme fenetre

badd <nom_fichier> permet d'ajouter un buffer

bn buffer suivant

bp buffer précédent

:craint: split de l'ecran

hsplit split horizontalement l'écran pour afficher 2 fichiers ( buffer ) en meme temps, idéal pour les copier-coller.

vsplit split verticalement l'écran.

On peut les combiner, mais bon, écran 911 pouces requit à la fin....

:roule: Substitution ( ce que préfére -rem- sous vi )

%s/<expr>/<new_expr>/gc

remplace ( s ) sur toutes les lignes ( % ) <expr> par <new_expr> pour toutes les occurences ( g ) avec confirmation ( c ).

0,Xs/<expr>/<new_expr>/g

Remplace jusqu'a la ligne X <expr> par <new_expr> pour toutes les occurences ( g)

X,$s/<expr>/<new_expr>/g

Remplace de la ligne X a la fin du fichier <expr> par <new_expr> pour toutes les occurences

%s/original/remplacement/gc

Remplace de la ligne X a la fin du fichier <expr> par <new_expr> pour toutes les occurences avec confirmation ( c )

X,Ys/<expr>/<new_expr>/g

Remplace de la ligne X à la ligne Y toutes les occurences (g) de <expr> par <new_expr>

On peut ne rien mettre a la place de g, dans ce cas ca ne le fait que pour la premiere occurence de chaque ligne. On peut aussi mettre le nombre d'occurence que l'on veut a la place du g

:arrow: Recherche d'un expression

/<expr> recherche expr

n déplacement du curseur sur la prochaine occurence de <expr>

N déplacement du curseur sur la précédente occurence de <expr>

:arrow: lecture du source d'une page web:

vim http://nom_d_une_page_web.html

Share this post


Link to post
Share on other sites

Pour les remplacements, on peut noter aussi l'option c qui permet de demander confirmation.

:%s/original/remplacement/gc

Share this post


Link to post
Share on other sites

Une possibilité interessante sous vi est de définir des macros à l'aide de la commande q. Il suffit de presser q, suivi de la lettre d'un registre puis d'effectuer un certain nombre d'operation, et de terminer l'enregistrement en pressant à nouveau q. On peur alors facilement rappeler l'ensemble de ces opérations en tapant @ suivi du registre utilise. Ce n'est pas clair ? Voici un exemple commenté :

On part avec les lignes suivantes :

stdio.h
SDL/SDL.h
SDL/SDL_image.h
SDL/SDL_mixer.h

on veut rajouter les include et les <> autour des noms de fichier. On se place sur la première ligne puis on commence à enregistrer dans le registre "a" :

qa

On se place ensuite en début de ligne puis on tape "include <", on va en fin de ligne et on tape ">" puis on passe à la ligne suivante.

Iinclude <[Echap]A>[Echap]j

On termine alors l'enregistrement :

q

Puis on applique aux 3 lignes suivantes :

3@a

Et voila. Ca marche avec toutes les commandes, c'est donc pratique pour appliquer là même opération (on ouvre tous les fichiers dans des buffers différents, puis on tape

:bn

avant de terminer l'enregistrement, et le changement de buffer est donc inclu dans la macro.

Share this post


Link to post
Share on other sites

Encore un petit ajout, sur l'édition multi-fichiers cette fois.

D'abord, il y a deux façons d'éditer plusieurs fichiers sous vi :

- avoir une fenêtre splitée

- avoir plusieurs buffers

les deux manières pouvant être combinées.

Pour splitter, celà à déja été dit plus tôt, on utilise

 
:vsplit <fichier>
:split <fichier>

Un raccourci possible pour ouvrir une fenêtre vide est :

Ctrl+w+s
Ctrl+w+v

Mais il existe aussi l'option interessante du diffsplit permettant de voir les differences entre deux fichiers :

:diffsplit <fichier>
:vertical diffsplit <fichier>

Notez que la commande vertical peut s'appliquer à d'autres fonctions.

Maintenant, le déplacement d'un split au suivant :

Ctrl+w+w

Il est aussi possible d'utiliser les touches hjkl pour se déplacer comme dans le texte, en les faisant préceder de Ctrl+w :

Ctrl+w+h
Ctrl+w+j
Ctrl+w+k
Ctrl+w+l

On peut aussi les réarranger avec les commandes (échange avec la suivante, rotation)

Ctrl+w+r
Ctrl+w+x

Vous voulez agrandir/ retrecir le split dans lequel vous êtes ?

Ctrl+w++
Ctrl+w+-

Pour aller plus vite (par exemple agrandir / retrecir de 5 lignes d'un coup)

Ctrl+w+5++
Ctrl+w+5+-

On peut aussi utiliser

Ctrl+w+>
Ctrl+w+<

Les commandes longues existent aussi :

:resize N
:vertical resize N

Pour ce qui est de l'utilisation de buffers, on peut faire passer un split dans un buffer caché avec

:hide

On passe d'un buffer au suivant/précedent avec

:bn
:bp

On ouvre le buffer suivant/précedent dans un split avec

:sbn
:sbp

Ca commence à faire beaucoup de commandes, et je vais pas toutes les lister. Il y'en a d'autres interessantes, je vous conseil la doc pour en savoir plus (/usr/share/vim/vimXX/doc/windows.txt pour ce sujet).

Share this post


Link to post
Share on other sites

Allez encore une killer feature de vi (plutôt pour programmer il est vrai) : le pliage de code (en anglais folding).

C'est assez simple dans le principe : on réduit plusieurs lignes de code à une seule. Il existe cependant plein d'options permettant de rendre ca encore plus efficace. On commence simplement : pour plier du code, il faut créer un pliage, puis le fermer et l'ouvrir à volonté avec les commandes

zf
zc
zo
zC
zO

Les commandes zO et zC ont l'avantages d'ouvrir les plis recursivement. On peut aussi ouvrir/fermer tous les plis existants :

zR
zM

Par exemple

zf30j

plie 30 lignes de code.

On les réouvre facilement en se placant sur le pli et en tapant

zo

On le referme en se placant n'importe où dans le pli et en tapant

zc

Maintenant, on peut facilement automatiser le pliage en utilisant la commande

:set foldmethod=indent

qui plie automatiquement le code selon l'indentation. On ouvre alors chaque pli avec zo ou zc.

Les possibilités sont manual, indent, expr, marker, syntax, diff

On peut aussi décider d'ouvrir ou de fermer les plis automatiquement quand on y entre et quand on en sort

:set foldopen=all
:set foldclose=all

Pour revenir au mode normal :

:set foldopen=
:set foldclose=

Voila, avec tout ça, ca fait de quoi y voir plus clair dans son code. Apres, à chacun de trouver la methode qu'il préfère utiliser.

Share this post


Link to post
Share on other sites

une tout p'tite contrib mais ça dépanne toujours

<shift>+J pour ramener la ligne suivante en bout de ligne

Share this post


Link to post
Share on other sites

Comment faire pour le lancer sans tout les commetaires du fichier :/

Ca me soole certains fichiers avec trop de commentaires :/

Share this post


Link to post
Share on other sites

euh (la méthode sale)

cp fichier fichier.comments
grep -v "^#" fichier.comments > fichier
vi fichier

:craint:

Share this post


Link to post
Share on other sites
euh (la méthode sale)

cp fichier fichier.comments
grep -v "^#" fichier.comments > fichier
vi fichier

:craint:

Ca supprime les commentaires la j'imagine en plus :/

J'aimerais les avoir dans le fichier au cas ou, juste qu'ils appraissent pas quand j'ai pas envie de voir les commentaires :fou:

Mais merci quand meme :)

Share this post


Link to post
Share on other sites

Chez moi, avec la coloration syntaxique activée, les commentaires sont en bleu foncé. Sur un fond noir, ça dérange pas trop... :)

A propos, vous pouvez activer la colorations syntaxique avec

:syntax on

Et activer un certain type de coloration avec par exemple

:set syntax=html

les différents modes sont dans /usr/share/vim/vim62/syntax/ sur une Fedora.

Pour ce qui est des thèmes de couleurs de vi, essayez

:colorscheme <TAB>

Et chaque <TAB> vous proposera les différents thèmes de couleurs.

Qui a dit que VI était un éditeur minimaliste ?!?

Share this post


Link to post
Share on other sites

A noter aussi la commande "vimtutor" qui lance le tutoriel intégré de VI.

Et dans l'éditeur, ":help" vous affichera l'aide en ligne

Share this post


Link to post
Share on other sites

Le pliage de code peut justement aider à supprimer les commentaires (enfin à les réduire à une seule ligne quand il y en a plusieurs qui se suivent).

Pour cela, il faut utiliser le mode syntax. Par exemple pour les commentaires commencant par /* et finissant par */ :

:syn region myFold start="/*" end="*/" transparent fold
:syn sync fromstart
:set foldmethod=syntax

Si tu veux l'utiliser systématiquement, il faut simplement rajouter le mot fold à la fin des lignes définissant les items Comment dans les fichiers de syntax, et mettre la derniere ligne dant ton ~vimrc

Share this post


Link to post
Share on other sites

Bon, impeccable. Ca tombe bien que tu l'aies fait, car en ce moment, je n'ai plus trop le temps de venir aussi souvent qu'avant sur pci. Ca va revenir, mais je souffle un peu. Donc :-D ouragan, en plus, je suis sur que tu auras appris plein de trucs sur ton editeur préféré.

JE cherche d'autres volontaires pour faire la meme chose avec les autres grands éditeurs de texte, style emacs, kate etc...

Share this post


Link to post
Share on other sites

×
×
  • Create New...