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 ».

3 commentaires pour “Optimiser vim et le terminal pour le développement

  1. Les gens me prennent pour un ouf quand ils me voient coder avec vim et pas phpStorm, mais j’ai tellement les raccourcis dans les doigts que je suis incapable de bosser autrement. Quand je suis dans un éditeur standard, j’ai l’impression de coder avec des menottes et des moufles.

    Je vais réutiliser ton evi(), j’ai jamais eu l’idée de faire ça (alors que je suis un fan des alias en général, d’ailleurs c’est aussi pour ca que je peux pas me passer de vi+zsh, toutes mes commandes usuelles sont aliasées, j’ai du mal à bosser sans (grep: g, grep -v: gv, find -f: findf , docker-compose up -d: dcu, docker-compose down: dcd, etc…). Je me sers aussi des alias pour me déplacer: fc: cd $root/finecommon/; l: cd $projet_courant/lib, w: cd $project_courant/www etc…)

    J’ai pas mal essayé d’utiliser des plugins vi, sans trop de succès, trop compliqués en général, déjà que maitriser vi c’est chaud… meme NERDTree, j’ai abandoné.

    J’utilise à peu près la même conf vimrc que toi (à part le relative, ça te sert à quoi? )
    A une époque j’utilisais (avec des paramêtres légèrement différents pour ts entre autres) le vimrc de Gary Bernhardt, (https://github.com/garybernhardt/dotfiles/blob/main/.vimrc), un gars qui a fait un screencast sur son utilisation de vi qui est très impressionnante, il a un niveau de malade, mais au final je n’en exploitais pas le 10ème, et depuis que j’ai changé de PC (il y a presque un an), je ne me suis même pas rendu compte que j’avais oublié de réutiliser ce vimrc.
    Jettes y quand meme un oeil, il y a pas mal d’idées intéressantes à reprendre.
    Mais bon je suis assez partisan d’avoir une conf la plus proche possible du vanilla pour vim, c’est un peu le but, de pouvoir bosser n’importe ou avec la meme efficacité.

  2. @Loïc : Merci, je vais regarder ce .vimrc.
    Le relativenumber sert à faire en sorte que les numéros de lignes soient relatifs à la ligne où est placé le curseur. Comme ça, tu peux très rapidement savoir combien de lignes tu veux copier ou couper à partir de là où tu es dans le fichier, sans avoir besoin de les compter une à une.

  3. Ah ouais pas con, je vais ajouter ça tiens, c’est vrai que ça peut être pratique.

    Quand tu as le choix, que tu n’es pas contraint par le ssh, tu prends quoi comme éditeur? Est ce que d’utiliser vim t’as amené comme moi à le considérer comme une extension de tes doigts et de ne pas pouvoir t’en passer, ou est ce que c’est juste un outil pour le ssh?

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.