apprendre VIM en jouant: https://vim-adventures.com/
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...).
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.
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 :
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