Optimiser vim et le terminal pour le développement

Pour développer, vous utilisez sûrement un IDE, qui peut aller de l’éditeur de texte survitaminé comme Sublime Text jusqu’à un environnement complet comme Eclipse, en passant par des outils spécifiques à certaines plateformes, comme Android Studio ou Xcode.

Suivant les projets, les entreprises et les équipes, j’ai été amené à beaucoup utiliser Sublime Text et les outils de JetBrains (PhpStorm et PyCharm).
Durant mes études et ma première année professionnelle, je développais exclusivement avec Emacs, dont j’appréciais la puissance et l’extensibilité. Par la suite, j’ai eu besoin de travailler à distance sur des serveurs via des connexions SSH, et vim s’est alors imposé. Cet outil, qui peut sembler fruste au premier abord, est particulièrement efficace lorsqu’on sait précisément ce qu’on veut faire et qu’on a pris le temps d’en apprendre les nombreux raccourcis clavier. Il a aussi l’avantage d’être présent sur toutes les machines Unix, donc c’est toujours utile de savoir l’utiliser.

Avec vim et un terminal capable de gérer des onglets, on peut se faire un environnement de développement minimaliste mais très productif.

Par exemple, pour travailler sur un projet développé en C typique, on voudra avoir plusieurs onglets, avec dans chaque onglet un vim séparé (« splitté ») en deux parties verticales, l’une avec un fichier .c, et l’autre avec le fichier .h correspondant. On voudra que le titre de l’onglet soit le nom des fichiers ouverts, pour s’y retrouver dans les différents onglets ouverts.

Regardez cette capture d’écran :

Vous pouvez y voir plusieurs onglets, avec des titres explicites : ytable, yjson, ystr, yvar et Compilation. L’onglet actif est celui nommé yjson, et il permet d’éditer les fichiers yjson.c et yjson.h. Le dernier onglet sert à compiler et à faire d’autres opérations en ligne de commande.

Vous pouvez voir aussi que l’édition de fichiers dans vim comporte des numéros de ligne, et que ceux-ci sont relatifs : on voit le numéro de la ligne courante (relatif à la position du curseur), et le nombre de lignes avant et après. Cela est très pratique lorsqu’on veut couper ou copier plusieurs lignes facilement en utilisant des commandes vim.

Pour terminer, l’édition dans vim se fait habituellement au clavier uniquement, que se soit pour se déplacer dans les fichiers que pour faire du copier-coller. Mais vim est capable de gérer la souris, autorisant le déplacement du curseur au clic, la copie en sélectionnant du texte à la souris, le collage en cliquant avec le bouton du milieu (ou clic à trois doigts sur un pad tactile), et le déplacement des séparateurs entre fichiers.

Pour ouvrir un nouvel onglet de terminal, sous Linux il suffit de faire la combinaison de touches Control + Majuscule + T. Pour ouvrir les fichiers toto.c et toto.h dans le même vim, séparés verticalement, avec l’onglet renommé « toto », j’ai juste besoin de taper la commande evi toto.

Pour arriver à ce résultat, il suffit de deux choses : un fichier de configuration pour vim, et une fonction appelée comme un programme dans la configuration du shell.

Configuration vim

Voici le contenu de mon fichier ~/.vimrc :

" couleur de fond
set background=light

" numéros de lignes
set number
set relativenumber

" gestion de la souris
set mouse=a
set t_BE=Langage du code : Vim Script (vim)
  • Je définis la couleur de fond pour ne pas dépendre de ma distribution Linux.
  • La directive set number ajoute les numéros au début des lignes.
    Avec set relativenumbers, les numéros sont relatifs à la ligne courante.
  • Les directives de gestion de la souris permettent le déplacement au clic, le copier-coller, ainsi que le scroll à la molette (ou le glissement à deux doigts sur un pad tactile).

Et sinon, au lancement de vim, le paramètre -O permet d’ouvrir plusieurs fichiers dans vim, avec séparation verticale. Le paramètre -c, quant à lui, permet de passer l’option set nowrap (comme en tapant :set nowrap quand vim est déjà ouvert) pour éviter que l’éditeur passe à la ligne pour les lignes longues ; avec windo set nowrap (oui, il manque le “w” à “window”), on active l’option pour tous les buffers ouverts.

Configuration shell

Première chose à savoir, il est possible de changer le titre d’un onglet en écrivant une suite de caractères d’échappements. Par exemple, pour qu’un onglet affiche « Bonjour », il suffit de taper la commande :

echo -en "\033]0;Bonjour\a"Langage du code : Bash (bash)

Dans mon fichier de configuration du shell ~/.bashrc, j’ai ajouté une fonction “evi” (pour « extended vi »). Cette fonction peut être utilisée en ligne de commande, comme si c’était un programme.

Son but est de pouvoir est appelée avec un, deux ou trois paramètres :

  • Trois paramètres : l’onglet prend pour titre le premier paramètre ; les deux autres paramètres correspondent à des noms de fichiers qui sont ouverts avec vim.
  • Deux paramètres :
    • S’ils correspondent à des noms de fichiers, ils sont ouverts avec vim. L’onglet prend pour titre le nom du premier fichier.
    • Si le premier paramètre ne correspond pas à un fichier existant, mais que le second oui, l’onglet prend pour titre le 1er paramètre, et le fichier est ouvert dans vim.
  • Un paramètre :
    • S’il correspond à un fichier existant, le fichier est ouvert dans vim, et l’onglet prend pour titre le nom du fichier.
    • S’il correspond à une racine de fichier, dont il existe les formes avec les suffixes “.c” et “.h”, l’onglet prend pour titre la racine, et les fichiers .c et .h sont ouverts dans vim.
    • Sinon, le paramètre est simplement utilisé pour définir le titre de l’onglet.

Après avoir modifié le titre de l’onglet, puis ouvert un (ou deux) fichier dans vim, le nom de l’onglet est remis à « Terminal », pour indiquer qu’il n’y a pas de fichiers ouverts à l’intérieur.

Voici le contenu de la fonction dans le fichier ~/.bashrc :

# fonction extended vim
function evi() {
    # zéro paramètre ou plus de 3 paramètres : erreur
    if [ $# -eq 0 ] || [ $# -gt 3 ]; then
        echo "Usage: evi \"Terminal title\" file1 file2"
        return
    fi
    # premier paramètre => titre de l'onglet
    echo -en "\033]0;$1\a"
    # ouverture des fichiers dans vim
    if [ $# -eq 3 ]; then
        vi -c "windo set nowrap" -O "$2" "$3"
    elif [ $# -eq 2 ] && [ -f "$1" ] && [ -f "$2" ]; then
        vi -c "windo set nowrap" -O "$1" "$2"
    elif [ $# -eq 1 ] && [ -f "$1" ]; then
        vi -c "set nowrap" "$1"
    elif [ $# -eq 1 ] && [ -f "$1.c" ] && [ -f "$1.h" ]; then
        vi -c "windo set nowrap" -O "$1.c" "$1.h"
    elif [ $# -eq 1 ]; then
        # modification du titre de l'onglet
        echo "$(tput dim)Titre de l'onglet modifié$(tput sgr0)"
        return
    else
        # erreur
        echo "Usage: evi \"Terminal title\" file1 file2"
    fi
    echo -en "\033]0;Terminal\a"
}Langage du code : Bash (bash)

Il est ensuite possible de taper :

  • evi toto.php pour ouvrir le fichier toto.php dans vim, avec l’onglet qui s’intitule « toto.php ».
  • evi toto.php titi.php pour ouvrir les deux fichiers dans vim, avec l’onglet qui s’intitule « toto.php ».
  • evi toto pour ouvrir les fichiers toto.c et toto.h dans vim, avec l’onglet qui s’intitule « toto ».
  • evi Compilation pour que le titre de l’onglet devienne « Compilation ».

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Notifiez-moi des commentaires à venir via email. Vous pouvez aussi vous abonner sans commenter.