Configurer (Neo)Vim comme IDE en langage C/C++

On peut très bien apprendre à coder dans un terminal shell avec un simple éditeur de texte comme Vim et utiliser le compilateur. C-a-d Ouvrir un terminal sous Linux:

$ vim hello.cpp

// Premier programme en C++ 

#include <iostream>

int main() {
    std::cout << "Hello World!";
    return 0;
}

On compile en manuel, normalement gcc est intégré en natif dans le système Linux:

$ g++ hello.cpp -o hello

On lance le fichier binaire:

$ ./hello

Output:

Hello World!"

Voila, pour apprendre à utiliser Vim plus en détail, l'éditeur de texte pour les professionnels de l'informatique:

L’éditeur de texte VI

Ce chapitre est un incontournable de la maîtrise d’un système Linux. Dans 99,99 % des cas, l’éditeur VI est présent sur votre système. Pourquoi s’en passer ?

Egalement le livre numérique [PDF] gratuit "Vim pour les humains" est une très bonne ressource pour apprendre Vim.

Transformer Vim en IDE (environnement de développement intégré)

Vim est un peu lite, c'est du brute de décoffrage mais il est customisable et extensible. Pour avoir des fonctions supplémentaires et d'automatisation:

  • Recherche dans le code
  • Navigation dans les fichiers
  • Controle de version Git
  • Refactoring
  • Coloration syntaxique
  • Code complétion
  • Assistance avec une IA
  • ctags
  • Intégration de makefile / cmake
  • Intégration du debugger
  • multi-fenetrage / tabs
  • snippet
  • CI/CD
  • test unitaire

etc...

On va donc apprendre à configurer le fork de Vim: Neovim avec Coc. Qui a plus de fonctionnalité pour du code en C/C++.

Prérequis sur le système:

$ sudo pacman -S clang ctags neovim nodejs npm gdb

Vérifier l'installation

$ clangd --version

clangd version 15.0.7
Features: linux
Platform: x86_64-pc-linux-gnu

Introduction à Neovim

lancer le tutorial dans un terminal vimtutor

Vidéo explicative pour configurer Neovim:

Configuration de Neovim

Installation du gestionnaire de plugin "vim-plug" cf: https://github.com/junegunn/vim-plug

$ sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
       https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'

Création du fichier init.vim dans ~/.config/nvim/

" Neovim configuration file init.vim
" author: Anthony J.R Le Goff legoff.ant@gmail.com
" date: 16th april 2022

:set number
:set autoindent
:set tabstop=4
:set shiftwidth=4
:set smarttab
:set softtabstop=4
":set mouse=a

call plug#begin() 

Plug 'tpope/vim-fugitive'
Plug 'tpope/vim-surround'
Plug 'scrooloose/nerdtree'
Plug 'scrooloose/syntastic'
Plug 'vim-airline/vim-airline'
Plug 'tomasr/molokai'
Plug 'raimondi/delimitmate'
Plug 'nvim-telescope/telescope.nvim'
Plug 'ryanoasis/vim-devicons'
Plug 'majutsushi/tagbar'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'madox2/vim-ai'

set encoding=UTF-8

call plug#end()

:set statusline+=%#warningmsg#
:set statusline+=%{SyntasticStatuslineFlag()}
:set statusline+=%*

:let g:syntastic_always_populate_loc_list = 1
:let g:syntastic_auto_loc_list = 1
:let g:syntastic_check_on_open = 1
:let g:syntastic_check_on_wq = 0

nnoremap <C-f> :NERDTreeFocus<CR>
nnoremap <C-,> :NERDTree<CR>
nnoremap <C-;> :NERDTreeToggle<CR>

nmap <C-r> :TagbarToggle<CR>
nmap <C-q> :Telescope<CR>

:colorscheme molokai

let g:NERDTreeDirArrowExpandable="+"
let g:NERDTreeDirArrowCollapsible="~"

" air-line
let g:airline_powerline_fonts = 1

let g:vim_ai_chat = {
\  "options": {
\    "model": "gpt-4",
\    "temperature": 0.2,
\  },
\}

Sauvegarder le fichier, quitter et relancer nvim puis lancer la commande:

:PlugInstall

Après cela vous aller pouvoir installer via le serveur de langage le code completion pour C/C++ avec Coc:

:CocInstall coc-clangd

Intégration de C++23 dans clangd

Créer le fichier ~/.config/clangd/config.yaml

config.yaml

CompileFlags:  
  Add: [-Wall, -Wextra, -std=c++23]

Utiliser le debugger sur un programme

Télécharger et lancer le plugin:

:packadd termdebug
:Termdebug

Lancer un terminal dans Vim

Si vous avez besoin de lancer un terminal dans Vim

:term

Lancer une commande make dans Vim pour automatiser la compilation

Un simple exemple de makefile:

# Le compilateur gcc pour le programme C
CC = g++

# Flags de compilation
CFLAGS = -Wall -Wextra -std=C++23

# fichier binaire construit
TARGET = hello

all: $(TARGET)

$(TARGET): main.cpp
    $(CC) $(CFLAGS) -o $(TARGET) main.cpp

clean:
    rm -f $(TARGET)

Lancer la commande dans Vim:

:make

Autres: 100 useful Vim commands