Dans la jungle des fichiers

Vim est le plus beau des éditeurs.

Et non, ce n'est pas Emacs. Celui qui a dit Visual Studio : dix coups de baton!

N'empêche.

Quand vous utilisez le mode quickfix (déja abordé dans ce blog) et que vous en avez assez de naviguer dans les buffers pour retrouver vos fichiers, il est temps de faire appel à un gestionnaire de projet.

Devinez quoi, ça existe déja, et c'est très fort.

Voici Project de Aric Blumer.


Project_screenshot Franchement, que reste-t-il à Visual Studio ?


Project : download et préparation

  • Vous pouvez trouver le script sur le site Vim:
  • votre Vim doit être en mode nocompatible (je dis ça pour les masos adeptes des années 70, de la disco, et de Vim en mode legacy)
  • Installez le, ainsi que sa doc, puis générez la doc.
    • Syntaxe: helptags path de la doc
    • Ex: helptags e:\tools\vim\doc
    • help project : la doc doit apparaitre.
  • Chargez Project dans Vim (attention à la majuscule)
    • :Project
    • :Pro fonctionne également chez moi, abréviation à tester chez vous.
  • Quelle que soit la disposition de vos fenêtre, Project se situera toujours verticalement à la gauche de l'écran. Cela me parait être un bon compromis, je n'ai pas cherché à modifier ce comportement par défaut.


Un projet ex-nihilo

Nous allons créer un projet simple (mais de bon goût).

Par défaut, le projet est créé dans $HOME/.vimprojects.

Pour le créer à un autre endroit, invoquez :Project suivi du chemin et du nom de projet

Normalement, vous devez avoir la fenêtre Project ouverte dans Vim (sinon, chargez Project).

Cette fenêtre fonctionne en suivant le principe des folders. Si vous ne connaissez pas: :help fold

  • Se placer sur la fenêtre Project, puis \c
    • Il s'agit donc bien d'un backslash suivi de la touche c , en mode commande.
  • Une fenêtre apparait, et demande le nom de l'entrée. Disons toto, pour faire original.
  • Une autre fenêtre, avec le nom du répertoire.
    • Les gens sous Linux auront droit à une belle fenêtre de sélection, sous Windows il faut rentrer le path à la main.
    • Ne rentrez pas le slash (ou antislash) final.
    • Disons: e:\coding\toto
  • Encore une fenêtre, avec "enter the CD parameter"
    • permets de changer de répertoire quand on choisit un fichier.
    • CD=. signifie que l'on utilisera le répertoire courant pour les commandes à exécuter.
    • on n'est pas obligé de rentrer ce paramètre. Dans ce cas, le répertoire restera celui de base.
    • le paramètre s'exprime en tant que chemin relatif au chemin racine.
  • Dernière fenêtre: choisir le filtre de fichiers
    • Ex: *.c *.cpp *.h
  • Voila, votre projet est créé.
  • Seuls les éléments obligatoires ont été validées avec cet assistant
    • Pour les options, voir la doc
    • Par exemple, vous pouvez utiliser in et out pour exécuter des commandes quand vous entrez ou sortez d'un répertoire.
    • Vous pouvez également utiliser la combinaison \C (C majuscule) qui crée également un projet, en intégrant par défaut tous les sous-répertoires.


Manipulation des fichiers d'un projet

Maintenant que le projet est créé, nous allons faire quelques manipulations essentielles.

  • Reorganiser l'emplacement des noms de fichiers
    • placez-vous sur le nom de fichier à déplacer, puis CTRL + curseur haut/bas.
    • attention, flêches du curseur obligatoire, ça ne fonctionne pas avec les touche j et k.
  • Ouvrir un fichier
    • se placer sur le nom du fichier, puis valider.
  • Ouvrir tous les fichiers d'un folder (sans les sous-repertoires)
    • se placer dans le répertoire désiré du folder, puis \l.
  • Rafraichir l'affichage du folder
    • se placer sur le folder, puis
    • pour rafraichir tous les sous-folders : \R
  • Ouvrir un fichier dans une nouvelle fenêtre splittée horizontalement
    • SHIFT + Return
    • \s si le terminal ne supporte pas la combinaison précédente.
    • \S pour ouvrir tous les fichiers dans des fenêtres splittées (foutoir plus ou moins assuré selon le nombre de fichiers dans le projet).


Oups.

  • La fenêtre projet est fermée ?
    • :Project pour la faire revenir (pas la peine de spécifier un nom de fichier, Project reprend celui en cours d'utilisation).
  • On ne voit rien!
    • Se placer sur la fenêtre Project, et appuyer sur espace
    • Appuyer à nouveau sur espace pour revenir à la largeur par défaut
    • On peut choisir la valeur d'incrémentation avec la valeur de g:proj_window_increment (par défaut: 100)
  • Je veux tout recommencer.
    • :bwipe : Nettoie le projet (ainsi que tous les buffers)
  • L' onglet c'est bon, mangez-en.
    • J'ai ouvert un onglet (:tabnew) , puis-je avoir Project à nouveau ?
    • Bien sûr: tapez tout simplement :Project
  • Mais c'est du texte tout ça ?
    • Oui, la fenêtre peut être éditée librement (ajout, suppression).
    • Pour commencer un nouveau projet, utilisez :bwipe , la suppression du texte de la fenetre Project ne suffira pas.
    • Les folders peuvent s'imbriquer, et se manipulent simplement (double-clic pour ouvrir/fermer par exemple)
    • en cas de modification du texte d'un folder, n'oubliez pas ou \R (général) pour rafraichir l'affichage.


Le chemin est absolu (et la pente est rude)

Dans le cas d'un projet multiplateforme, on est gêné par l'obligation de rentrer un chemin absolu pour le folder père.

Les folders fils contiendront un chemin relatif au chemin de base, donné par le folder père.

Si , depuis MS-Windows, vous utilisez le shell MSYS (et vous utilisez MSYS!), vous avez accès à "~" comme alias de votre $HOME.

Voila donc le point commun avec Unix. Cela peut servir si vous avez besoin de modifier à la volée le chemin de base de vos sources (voir plus loin).

Voici un projet test qui vaudra mieux qu'un long discours (comme disait Napoléon).

  • Pour cet exemple, voici l'endroit où se trouve le projet:
    • r:\coding\sound\soundtest : chemin complet
    • r:\coding\ est le répertoire racine contenant tous mes projets.
    • sound est une spécialisation contenant ce qui a trait au son.
    • soundtest est le répertoire projet qui nous intéresse.
  • Se placer dans le répertoire racine de vos sources (r:\coding\sound\soundtest) et lancer Vim.
  • Depuis Vim
    • :Project : crée un nouveau projet dans $home/.vimprojects.
    • ou, si vous préférez avoir un fichier pour chaque nouveau projet: :Project nom_du_projet
    • dans ce dernier cas, il faudra charger Vim depuis le shell de la façon suivante: vim +"Project nom_du_projet" (n'oubliez pas les guillemets ou nom_du_projet sera chargé comme un fichier classique).
  • Dans la fenêtre de projet : création de la racine
    • \c (c minuscule) : invoque l'assistant projet, pour parler comme les Windoziens.
    • je me permets d'insister sur le c minuscule, autrement l'intégralité de votre arborescence de sources sera ramenée.
    • nom du projet : ROOT (ou ce que vous voulez, mais servira dans le script de démarrage)
    • Quel script de démarrage ? Celui que vous serez obligé d'écrire pour modifier la valeur de base, si il y des différences d'arborescence entre vos machines de dev.
    • chemin absolu : il est important de garder la notation Unix des répertoires, avec les slashes. L'astuce consiste à omettre la lettre de lecteur qui empêche cette notation de fonctionner. Par défaut, Vim utilisera la lettre du lecteur d'où il est lancé. Sous Unix, vous n'aurez pas tout ces problèmes, bien sûr. Ici, nous allons donc rentrer tout simplement: /coding pour MS-Windows (et probablement ~/coding pour Unix).
    • filtres : ce que vous voulez. On peut toujours en ajouter par la suite. Personnellement, je mets: *.c *.cxx *.cpp *.h
  • Dans la fenêtre de projet : création du projet fils.
    • se placer sur une des lignes du folder père.
    • \C : cette fois, c'est récursif pour le cas où votre projet aurait des sous-répertoires. C'est conseillé, sauf si vous faites un fizzbuzz.
    • nom du projet : je vous laisse juges.
    • chemin : il faut rentrer un chemin relatif par rapport à la racine de vos sources. Nous allons rentrer sound/soundtest . Ne mettez surtout pas de slash initial, il s'agit bien d'un chemin relatif.
    • Pas besoin de filtres supplémentaires dans mon cas.
  • Et voila, un projet de créé. Vous pouvez en créer d'autres en vous repositionnant sur le folder père, pour repartir de votre chemin racine.
  • N'oubliez pas qu'en cas de modifications, \R rafraichit de manière récursive votre projet fils (il faut l'avoir sélectionné, être sur le père ne suffit pas).
  • Il ne vous reste qu'à synchroniser votre fichier Project entre vos différentes machines (Unison est ton ami).
    • Sur mon Linux, je n'ai eu qu'à rajouter un ~ au début de ROOT dans .vimprojects : ROOT=~/coding
    • Ca s'automatiserait très facilement, mais autant garder les choses simples. C'est la seule chose à changer dans un fichier Projects, cela reste très supportable.
    • Par contre, si vous ne voulez pas du fichier global, je vous conseille de faire un script qui recherche cette variable et la modifie selon l'OS, avant de lancer Vim.


pixel.cpp , pixel.h

Plus d'excuse pour ne pas découper de façon rationnelle votre code dans un tas de jolis sous-répertoires.

Ne faites pas non plus une classe pixel, ça serait exagéré (le coup de la classe pixel vient d'un studio de dev, et est authentique).

Et n'oubliez pas de lire la doc, notamment pour la liste des variables modifiables.