Avec ce que nous venons juste de voir, nous sommes maintenant capables d’éditer un fichier source C. Toutefois, la plupart des projets ne sont pas constitués d’un seul fichier, aussi, nous allons nous pencher sur la gestion de plusieurs fichiers dans Emacs. Cette section n’est pas directement liée à la programmation en C, mais la question revient fréquemment chez les novices, et c’est pourquoi j’ai décidé de la traiter ici.
Hiérarchies de fichiers
Typiquement, le scénario est le suivant : vous possédez plusieurs fichiers sources regroupés dans un dossier. Quelque chose que beaucoup de gens aiment faire est pouvoir regarder la hiérarchie des fichiers et naviguer de fichier en fichier. Pour cela, Emacs offre deux mécanismes :
dired, un explorateur de fichiers, et la
speedbar, une barre latérale.
Selon vos goûts, vous préférerez sans doute l’un ou l’autre. Les différences sont multiples :
dired possède plus de facilités pour la gestion des hiérarchies de fichiers et de dossiers, avec toutes les fonctions classiques que l’on pourrait attendre d’un explorateur de fichiers, et se présente comme une application Emacs à part entière, utilisant ses propres
buffers. À l’opposé, la
speedbar s’affiche dans un cadre (
frame) à part, et son contenu est constamment recalculé de sorte que le dossier affiché dans la barre soit toujours celui du fichier actuel.
Si vous n’êtes pas habitué à la terminologie emacsienne, sachez qu’une fenêtre correspond à une division de l’affichage d’Emacs (ce que vous obtenez avec C-x 2 par exemple) tandis qu’un cadre est un ensemble de fenêtres indépendant, ce qui, en mode graphique, correspond, pour la plupart des gestionnaires de fenêtres, à ce qu’ils appellent une fenêtre. Sauf mention contraire, nous utiliserons ici le vocabulaire d’Emacs.
À l’usage, l’un ou l’autre est assez naturel. Pour lancer
dired, utilisez la commande
C-x d (
dired) ou
C-x C-f (
find-file) avec le chemin d’un dossier. Pour lancer la
speedbar, tapez
M-x
speedbar ; un cadre devrait apparaître à côté de votre cadre principal.
Une fois à l’intérieur de l’un ou l’autre, placez-vous sur un fichier et tapez
RET (
dired-advertised-find-file ou
speedbar-edit-line) pour le visiter. Sous
dired, vous avez l’option de visiter le fichier dans une autre fenêtre avec
o (
dired-find-file-other-window).
Si vous voulez parcourir des sous-dossiers, sachez que
dired prône une disposition plane tandis que la
speedbar affiche les dossiers et les fichiers sous forme arborescente. Lorsque votre curseur est sur une ligne correspondant à un sous-dossier, tapez
i sous
dired ou
+ dans la
speedbar (respectivement,
dired-maybe-insert-subdir et
speedbar-expand-line) pour insérer son listage dans le
buffer actuel. Pour supprimer l’affichage d’un sous-dossier, placez-vous sur son en-tête (son chemin, juste au-dessus du listage, pour
dired, ou son nom dans l’arborescence, pour la
speedbar) et exécutez la commande
M-x dired-kill-subdir ou
- (
speedbar-contract-line), pour
dired et la
speedbar respectivement. Au lieu de l’effacer complètement,
dired vous propose aussi d’utiliser la commande
$ (
dired-hide-subdir), qui, malgré son nom, permet de cacher
et de découvrir le contenu du dossier.
Si votre gestionnaire de fenêtres ne vous permet pas de déplacer facilement le focus au clavier, sachez qu’Emacs vous permet d’aller de cadre en cadre avec C-x 5 o (other-frame).
Et comme précédemment, un petit récapitulatif :
| |
dired |
speedbar |
| parcourir un dossier |
C-x d |
automatique |
| visiter un fichier |
RET |
RET |
| insérer un sous-dossier |
i |
+ |
| cacher un sous-dossier |
$ ou M-x dired-kill-subdir |
- |
Plusieurs fichiers dans Emacs
Maintenant que vous savez accéder facilement à plusieurs fichiers de votre projet, vous risquez fort d’être vite submergé par le grand nombre de
buffers ouverts. Emacs ne dispose pas de tabs (ce n’est pas comme si vous alliez vous servir de votre souris pour y accéder, de toute manière). En revanche, plusieurs modes sont disponibles pour gérer vos
buffers. Je ne vais pas tous les passer en revue ici, je ne donnerai qu’une seule solution.
La première commande à connaître pour bien gérer vos multiples
buffers est sans doute
C-x C-b (
list-buffers). Elle démarre le gestionnaire de
buffers. Ce dernier se présente comme une simple liste des
buffers ouverts. Vous pouvez y effectuer les opérations de navigation habituelles, dont la recherche (avec
C-s (
isearch-forward) pour les étourdis).
RET (
Buffer-menu-this-window) vous permet de visiter le
buffer à la ligne actuelle. Une autre utilisation très pratique est de supprimer plusieurs
buffers à la fois. Pour cela, marquez chaque
buffer à détruire avec la commande
d (
Buffer-menu-delete). La lettre
'D' apparaît alors à gauche du nom. La commande
x (
Buffer-menu-execute) effectue l’opération de nettoyage en elle-même. Ainsi, si vous vous êtes trompé dans votre marquage, vous pouvez revenir en arrière en utilisant la commande
u (
Buffer-menu-unmark) sur la même ligne.
Tout cela est bien utile pour faire le ménage mais ne vous aide guère pour votre besoin le plus simple : naviguer de
buffer en
buffer. Pour cela, il y a bien sûr la commande
C-x b (
switch-to-buffer) par défaut d’Emacs pour changer de
buffer. Mais elle n’est pas très pratique ; en effet, elle demande d’entrer le début du nom pour accéder au
buffer. Fort heureusement, il existe (au moins) un mode qui vous permet de changer de
buffer en tapant quelques lettres n’importe où dans le nom. Je vous présente là l’
iswitchb-mode. Pour l’essayer, il vous suffit d’effectuer la commande
M-x iswitchb-mode ; de même pour le désactiver. Pour l’adopter définitivement, ajoutez à votre
.emacs la ligne :
Code : Common Lisp
La combinaison
C-x b invoquera à présent
iswitchb-buffer. Si vous l’essayez, vous remarquerez que la liste des
buffers qui sont encore candidats à la sélection est maintenant affichée à côté de votre saisie. Dans ce mode, les commandes
C-r (
iswitchb-prev-match) et
C-s (
iswitchb-next-match) vous permettent de faire défiler les éléments de la liste de manière cyclique, et
RET sélectionne le premier
buffer de la liste. Ainsi, vous n’aurez plus à taper le début exact du nom que vous voulez, il vous suffira simplement d’entrer quelques lettres remarquables et, moyennant quelques rotations de la liste, vous arriverez rapidement à destination.
Vous pouvez aussi demander à utiliser des expressions régulières. La commande
C-t (
iswitchb-toggle-regexp), dans l’
iswitchb-mode, vous permet cela. Par exemple, pour obtenir une liste des fichiers C ouverts, vous pourriez utiliser le motif
\.c$. Veuillez cependant prendre note du fait que les expressions régulières d’Emacs diffèrent d’autres syntaxes, soyez donc averti et pensez à lire le manuel (avec
C-h i (
info), par exemple) si vous désirez en faire bon usage.
Avec l’habitude, ce système très flexible remplace avantageusement les tabs. Vous n’êtes plus lié à une liste prédéfinie ; vous avez la possibilité de fabriquer rapidement la vôtre, adaptée à votre requête. Du reste, il vous permettra de même d’aller de
buffer en
buffer. Et tout cela pour un encombrement nul dans vos autres actions !
Et pour les petits étourdis :
| C-x C-b |
gestionnaire de buffers |
| C-x b |
change de buffer |
| C-r et C-s |
défilement de la liste (dans iswitchb) |
| C-t |
activation des regexps (dans iswitchb) |
Édition simultanée de plusieurs fichiers
Bien sûr, vous n’êtes pas encore capable de vous dédoubler pour éditer plusieurs fichiers à la fois, mais parfois, vous pourriez vouloir afficher deux fichiers (voire plus) côte à côte.
Pour se faire, rien de plus simple. Il vous suffit de partager votre affichage en deux : verticalement avec
C-x 2 (
split-window-vertically) ou horizontalement avec
C-x 3 (
split-window-horizontally). Pour passer d’une fenêtre à l’autre, utilisez
C-x o (
other-window). Enfin,
C-x 0 (
delete-window) et
C-x 1 (
delete-other-windows) vous permettent respectivement de supprimer la fenêtre sur laquelle se trouve le focus et de ne laisser qu’elle.
Ainsi, vous pourrez plus facilement comparer ou transférer du code d’un fichier à un autre.
Sachez également qu’il existe des commandes qui marient une action donnée à un changement de fenêtre, telles que
C-x 4 f (
find-file-other-window) et
C-x 4 b (
switch-to-buffer-other-window). La première ouvre un fichier, à l’instar de
C-x C-f (
find-file) mais l’affiche dans une fenêtre séparée. La seconde agit comme
C-x b (
switch-to-buffer) mais, de même, place le contenu dans une autre fenêtre. Si le cadre n’est constitué que d’une fenêtre, celui-ci est automatiquement scindé en deux.
| C-x 2, C-x 3 |
création de fenêtres |
| C-x o |
déplacement de fenêtre à fenêtre |
| C-x 0, C-x 1 |
suppression de fenêtres |
| C-x 4 f |
visite un fichier dans une autre fenêtre |
| C-x 4 b |
affiche un buffer dans une autre fenêtre |