page sur ubuntu-fr.org

tutoriel sur developpez.com

apprendre VIM en jouant: https://vim-adventures.com/

apprendre vim en 4 temps

un article (en anglais) sur un développeur qui est passé de PHP-Storm à Vim

J'ai commencé à utilisé vim car c'est l'éditeur en ligne de commande par défaut. Il est difficile d'apprentissage, il n'est pas intuitif... mais une fois que l'on sait s'en servir, il est puissant, notamment en y ajoutant l'utilisation des buffers, registres, des expressions régulières (REGEXP).

Pour débuter avec vim :

Je conseille vivement vimtutor, c'est progressif, on peut y revenir facilement. J'ai regretté de ne pas l'avoir fait plutôt !

J'ai longtemps utilisé les flèches et je les utilises encore, au lieu des touches hjkl. Commencer par les touches jk pour monter/descendre, j, on a l'index dessus, c'est facile et on en a souvent besoin !

J'y ai découvert :

ce qui permet de supprimer une fin de mot et de passer en mode insertion

Ctrl-g qui permet de connaître le fichier et la position du curseur... pour la position du curseur, le mieux et d'ajouter les n° de lignes, cf. les options ci-dessous.

% pour basculer entre les parenthèses, crochet, accolade ouvrantes/fermantes

:r nom_fichier pour insérer le contenu d'un fichier

:set ic (et son pendant noic) pour ignorer la casse lors des recherches.

:set hls is (et son pendant nohlsearch) pour affichier tout le mots recherchés

Les options d'éditions:

S'il n'y a que vous qui vous servez du PC, vous pouvez modifier directement le fichier

/etc/vim/vimrc

les options que je change (active, ajoute) par défaut sont :

autocmd FileType * set noexpandtab
autocmd FileType python set expandtab " transforme les tabulations en espaces… uniquement pour les fichiers python! … http://vim.wikia.com/wiki/Converting_tabs_to_spaces

set background=dark "adapte les couleurs du texte pour fond sombre
set number "ajoute les n° de ligne
set showcmd "visualise les commandes saisies
set tabstop=4 " tabulation à 4
set shiftwidth=4 "identation à 4 caractères
set mouse=a "active l'utilisation de la souris pour le scrol, poser le focus...
set hlsearch "pour affichier tout le mots recherchés

Ouvrir plusieurs fichiers, chacun dans son onglet avec vim :

vim -p fichier1 fichier2 fichier3

et une fois vim ouvert, il est très pratique d'ouvrir un autre fichier dans un autre onglet avec :

:tabnew fichier2

ou encore :tabe fichier

Quand je travaille en C/C++, j'apprécie d'avoir dans un même onglet le header (.h ou .hpp) et le code (.c ou .c++), après avoir ouvert le header avec les commandes ci-dessus, j'utilise alors

vnew fichier.c

Si vous installer le plugin taglist, vous pouvez avoir la liste des variables, classes, méthode ou fonctions… on se rapproche d'un IDE sans la lourdeur!

Pour aller plus loins avec les onglets :

http://vim.wikia.com/wiki/Buffers

Sauver sa session:

Si vous utilisez les possibilités offertes pas le onglets, les "splits" comme vu ci-dessus, il devient indispensable de sauver sa session pour la rappeler plus tard:

Pour l'enregistrer la première fois.

:mksession

cela crée un fichier Session.vim. Si vous préférez, vous pouver définir vous-même le fichier :

:mksession masession.vim

puis les suivantes (écrase le fichier Session.vim)

:mksession!

et pour ré-ouvrir la session, simplement

vim -S ou vim -S masession.vim

bufdo et tabdo :

extrait de la page http://stackoverflow.com/questions/2450887/vim-searching-through-all-existing-buffers

Pour appliquer une commande sur tous les buffers ou onglets

Use the bufdo ou :tabdo command.

:bufdo command

:bufdo command is roughly equivalent to iterating over each buffer and executing command. For example, let's say you want to do a find and replace throughout all buffers:

:bufdo! %s/FIND/REPLACE/g

Or let's say we want to delete all lines of text that match the regex "SQL" from all buffers:

:bufdo! g/SQL/del

Or maybe we want to set the file encoding to UTF-8 on all the buffers:

:bufdo! set fenc=utf-8

The above can be extrapolated for Windows (:windo), Tabs (:tabdo), and arguments (:argdo). See help on :bufdo for more information.

Rercherche/remplace avec RegExp :

il est parfois utile de pouvoir faire des modifications dans un fichier parfois gros (export de base de données) dont le contenu est variable (supprimer le champ texte ou le mot de passe...).

Cf. l'article sur les Regex

La syntaxe est :

:range s/pattern_regex/string/cgiI

range : % pour toutes les ligne ou x,y pour les ligne x à y

pattern_regex : un modèle d'expression régulière

string : la chaîne de caractère de remplacement qui peut inclure une partie de l'expression régulière.

cgiI : respectivement : confirm, globale (tout... idemn range %?), ignore casse, respecte la casse

mais comme d'habitude, il vaut mieux un exemple :

 1er cas : j'ai exporté une base SQL qui était sous windows pour la migrer sous linux... or windows ne faisant pas de différence entre minuscule et majuscule, il me faut renommer le nom des tables extraites :

tableimport
tablecontent
tablereport

 je tape

:%s:\(table\)\([a-z]\):\1\u\2:g

ce qui transforme mes noms de table en :

tableImport
tableContent
tableReport

Autre exemple, insérer des images dans une page html:

Dans l'exemple ci-dessous, il s'agissait d'un portfolio de dessins nommés comme suit: date_nom.JPG où date contient la date sous la forme AAAAMMJJ (année mois jour)

On réalise tout d'abord, dans le répertoire contenant les images, une commande linux:

ls *.JPG > liste_images

puis une fois vim lancé sur le fichier html, on insert notre liste:

:r liste_images

Puis on lance la substitution qui extrait le nom de fichier en le "découpant" en trois partie, date_, nom et extension:

:18,27s/\([0-9_]\{9\}\)\([a-zàé].\+\)\(\.JPG\)/<img src="/img\/\1\2\3" alt="\2" class="img-thumbail" title="dessin \2"\/>/g

18,27 : lignes sur lesquelles on applique la substitution s

([0-9_]\{9\}\) extrait la date et le souligné, qu'on rappelle dans la nouvelle chaîne avec \1 

\([a-zàé].\+\) extrait le nom du dessin… \2

\(\.JPG\)  extrait l'extension… \3

Ainsi, pour créer le chemin vers la source du fichier placé dans le répertoire img : on ajoute <img src="/img\/\1\2\3"  puis juste le nom pour le texte alténatif: alt="\2" et préfixé par dessin pour le title

On ajoute au passage la class="img-thumbail" de bootstrap.

Voir aussi plus bas l'édition ligne de commande

Rercherche/remplace avec les registres :

N'hésitez pas à commencer la lecture du paragraphe sur les registres

Le besoin: insérer 2 lignes avant une ligne de référence

Ligne_de_base

devient

Ligne_ajouté_1
Ligne_ajouté_2
Ligne_de_base

 Sélectionner la ligne de base et la copier dans le registre 'a' en se plaçant sur la ligne:

"ayy

Sélectionner les deux lignes à ajouter en plus de la ligne de référence et copier dans le registre 'b':

"b3yy

Lancer le recherche/remplace ( <ctrl-r a> n'est évidemment pas à taper mais signifie qu'il faut appuyer sur les touches Ctrl et r puis la touche a ou b pour insérer le contenu du registre correspondant) :

:%s/<ctrl-r a>/<ctrl-r b>/g

Nota: j'ai eu un soucis avec la fin de ligne, je l'ai supprimé pour la ligne recherchée et pour ne pas se retrouver avec une ligne vide après l'insertion, j'ai supprimé aussi celui de la dernière ligne insérée.

Je me suis inspiré de la page : http://vim.wikia.com/wiki/VimTip31

Édition ligne de commande

Nous avons vu dans le paragraphe ci-dessus le raccourci Ctrl - r pour coller un registre dans la ligne de commande, pour copier depuis la ligne de commande, il suffit de passe la ligne de commande en mode édition en utilisant le raccourci Ctrl - f. En plus… on a un peu de coloration (notamment sur les regex)

Les registres, presse(s)-papier(s) :

Si on ne se penche pas sur le fonctionne de VIM avec ses registres et le presse-papier de X (càd le presse papier commun à toutes les applications), on est assez vite bloqué!

Voici un lien qui explique cela assez bien :

https://www.blogduwebdesign.com/blog/developpement/vim-astuce-pour-copier-coller.html

Sous Jammy, faute de binaire de vim disposant de l'option -clipboard sans inclure l'interface gvim, je suis passé à neo-vim (quid de Vim 9?)

En vrac:

Insérer la date système: !!date

Pour les basculement minuscule/majuscule : http://vim.wikia.com/wiki/Switching_case_of_characters

Pour ouvrir deux fichiers côte à côte verticalement: vim -O fichier1 fichier2

Pour compter le nombre d'occurrences d'un mot : :%s/mot-ou-expression-à-chercher//gn

Incrémenter une colonne : sélectionner la colonne de 0 avec ctrl-v puis j ou flèche du bas, puis g puis ctrl-a

Recherche/remplace un caractère (tous) par un autre dans une ligne en particulier. Mon besoin : remplacer les séparateurs de mot qui sont des `_` (underscore) par un espace, uniquement dans la ligne commençant par le caractère `#` :

:g/^#/_/ /

Les plugins (fonctionne avec vim 8 sous Ubuntu Bionic):

Pour disposer, comme dans un IDE, de la liste de variables, classes, méthodes et autres fonctions, j'ai fait quelques recherches sur les plugins trié par leur notation.

https://www.vim.org/scripts/

Où j'avais trouvé taglist.vim

pour ma part, une fois le fichier taglist_46.zip décompressé, j'ai simplement copier le fichier taglist.vim dans /usr/share/vim/vim80/plugin et le fichier taglist.txt dans /usr/share/vim/vim74/doc

Ce plug-in requière le plug-in Exuberant ctags disponible sur :

http://ctags.sourceforge.net/

Une fois décompressé, on a un répertoire ctags-5.8 on va dedans et on lance 

./configure puis make puis sudo make install

Puis je relance vim sur un fichier C++ et si je tape la commande

:TlistOpen un explorateur s'affiche listant variable, class, function… et il suffit de double-cliquer sur un nom pour accéder à sa définition.

Le manuel est dispo : http://vim-taglist.sourceforge.net/manual.html

Le suivant est NERDTree qui permet de visualiser l'arborescence de travail et d'accéder ainsi rapidement à un autre fichier du projet. Installation similaire à taglist.vim mais avec beaucoup plus de fichiers/répertoires :

unzip NERD_tree.zip -d .
sudo mv plugin/NERD_tree.vim /usr/share/vim/vim80/plugin/
sudo mv doc/NERD_tree.txt /usr/share/vim/vim80/doc/
sudo cp lib/* /usr/share/vim/vim80/lib/
sudo mv lib/ /usr/share/vim/vim80/
sudo mv syntax/ /usr/share/vim/vim80/
sudo mv syntax/* /usr/share/vim/vim80/syntax/
sudo mv autoload/* /usr/share/vim/vim80/autoload/

 Une fois vim lancé, on tape:

:NERDTree

et la liste des fichiers apparait sur la gauche, un peu comme dans un explorateur de fichiers.

La première ligne affiche " Press ? for help

Et là on découvre que si on se place sur un fichier de la liste et qu'on appuie sur la touche t, on ouvre le fichier dans un nouvel onglet…

L’autocomplétion pour PHP : https://yarnaudov.com/the-best-neovim-vim-php-autocomplete-plugin-by-far.html

https://github.com/ncm2/ncm2

https://github.com/phpactor/phpactor