Files
easy-slack/docs/neovim.md
T

10 KiB

Neovim pour Ruby depuis SlackBuilds.org

Nécessite sbopkg.

Neovim est un éditeur de texte modal dérivé de Vim. La configuration ci-dessous reste volontairement simple : Telescope est utilisé pour naviguer entre les fichiers et les buffers, ripgrep pour rechercher dans le projet, Grug Far pour rechercher et remplacer dans plusieurs fichiers, nvim-autopairs pour fermer automatiquement les paires, et le client LSP intégré de Neovim pour Ruby, les diagnostics, la navigation et les signatures de méthodes.

Installation

Neovim est disponible sur SlackBuilds.org. Générez la queue des dépendances :

# sqg -p neovim

Puis lancez l'installation :

# sbopkg -i neovim

Si sbopkg trouve à la fois le paquet et une queue du même nom, choisissez Q pour utiliser la queue et installer les dépendances dans le bon ordre.

Installez également ripgrep, utilisé par Telescope pour rechercher dans le projet :

# sqg -p ripgrep
# sbopkg -i ripgrep

Sous Wayland, installez wl-clipboard pour permettre à Neovim d'utiliser le presse-papiers système :

# sbopkg -i wl-clipboard

Pour un affichage homogène des symboles, vous pouvez également installer JetBrains Mono Nerd Font :

# sbopkg -i ttf-nerd-fonts-jetbrains-mono

La variante JetBrainsMono Nerd Font Mono est adaptée à l'affichage dans un terminal.

Vérifiez ensuite les installations :

$ nvim --version
$ rg --version

Configuration

Créez le dossier de configuration :

$ mkdir -p ~/.config/nvim

Créez ou éditez ~/.config/nvim/init.lua :

$ nvi ~/.config/nvim/init.lua

Utilisez cette configuration :

-- Telescope remplace Netrw.
vim.g.loaded_netrw = 1
vim.g.loaded_netrwPlugin = 1

-- Leader
vim.g.mapleader = " "
vim.g.maplocalleader = ","

-- Affichage
vim.opt.number = true
vim.opt.signcolumn = "yes"
vim.opt.cursorline = true
vim.opt.splitkeep = "screen"
vim.opt.splitright = true
vim.opt.splitbelow = true
vim.opt.shortmess:append("I")
vim.opt.winborder = "rounded"
vim.opt.pumborder = "rounded"
vim.cmd.colorscheme("retrobox")

-- Apparence homogène des menus et fenêtres flottantes.
vim.api.nvim_set_hl(0, "NormalFloat", { link = "Pmenu" })
vim.api.nvim_set_hl(0, "FloatBorder", { link = "PmenuBorder" })

-- Telescope reprend l'apparence des fenêtres flottantes.
vim.api.nvim_set_hl(0, "TelescopeNormal", { link = "NormalFloat" })
vim.api.nvim_set_hl(0, "TelescopeBorder", { link = "FloatBorder" })
vim.api.nvim_set_hl(0, "TelescopeSelection", { link = "PmenuSel" })

-- Indentation
vim.opt.expandtab = true
vim.opt.shiftwidth = 2
vim.opt.tabstop = 2

-- Presse-papiers système
vim.opt.clipboard = "unnamedplus"

-- Autocomplétion de la ligne de commande
vim.opt.wildmode = "noselect:lastused,full"

vim.api.nvim_create_autocmd("CmdlineChanged", {
  pattern = { ":", "/", "?" },
  callback = function()
    vim.fn.wildtrigger()
  end,
})

-- Plugins
vim.pack.add({
  "https://github.com/nvim-lua/plenary.nvim",
  "https://github.com/MagicDuck/grug-far.nvim",
  "https://github.com/windwp/nvim-autopairs",
  {
    src = "https://github.com/nvim-telescope/telescope.nvim",
    version = "v0.2.1",
  },
})

-- Auto-fermeture des paires
require("nvim-autopairs").setup()

-- Telescope
local builtin = require("telescope.builtin")

require("telescope").setup({
  defaults = {
    preview = false,
  },
})

vim.keymap.set("n", "<Leader>f", builtin.find_files, {
  desc = "Files",
})

vim.keymap.set("n", "<Leader>b", builtin.buffers, {
  desc = "Buffers",
})

vim.keymap.set("n", "<Leader>g", builtin.live_grep, {
  desc = "Grep",
})

vim.keymap.set("n", "<Leader>w", builtin.grep_string, {
  desc = "Word",
})

vim.keymap.set("n", "<Leader>l", builtin.resume, {
  desc = "Last search",
})

vim.keymap.set("n", "<Leader>d", builtin.diagnostics, {
  desc = "Diagnostics",
})

-- Grug Far
vim.keymap.set({ "n", "x" }, "<Leader>r", function()
  require("grug-far").open()
end, {
  desc = "Replace",
})

-- Ouvre Telescope au démarrage sauf si un fichier est explicitement ouvert.
vim.api.nvim_create_autocmd("VimEnter", {
  once = true,
  callback = function()
    local argc = vim.fn.argc()

    if argc == 1 and vim.fn.isdirectory(vim.fn.argv(0)) == 1 then
      vim.api.nvim_set_current_dir(vim.fn.fnamemodify(vim.fn.argv(0), ":p"))
      vim.cmd.enew()
    elseif argc > 0 then
      return
    end

    builtin.find_files()
  end,
})

-- Ruby LSP
vim.lsp.config("ruby_lsp", {
  cmd = { "ruby-lsp" },
  filetypes = { "ruby" },
  root_markers = { "Gemfile", ".git" },
  -- Contournement temporaire pour Ruby LSP 0.26.11 : dans un projet Ruby
  -- plat, Ruby Indexer peut construire le motif {}/**/*.rb et indexer un
  -- même fichier sous deux chemins différents. Cette exclusion neutralise
  -- uniquement ce motif ; les fichiers Ruby restent indexés normalement.
  init_options = {
    indexing = {
      excludedPatterns = { "{}/**/*.rb" },
    },
  },
})

vim.lsp.enable("ruby_lsp")

Le bloc init_options contient un contournement temporaire pour Ruby LSP 0.26.11 : dans certains petits projets Ruby plats, Ruby Indexer peut construire le motif {}/**/*.rb et indexer un même fichier sous deux chemins différents. Cette exclusion neutralise uniquement ce motif ; les fichiers Ruby restent indexés normalement. Lorsque le problème sera corrigé dans Ruby LSP/Ruby Indexer, le bloc init_options pourra être retiré.

Neovim gère les plugins avec vim.pack. plenary.nvim est une dépendance de Telescope, nvim-autopairs ferme automatiquement les parenthèses, crochets, accolades et guillemets, et Grug Far utilise ripgrep pour la recherche et le remplacement. Les diagnostics, les signatures de méthodes et la navigation Ruby utilisent directement le client LSP intégré à Neovim. Aucune complétion LSP automatique n'est activée.

Le réglage vim.opt.clipboard = "unnamedplus" relie le registre par défaut de Neovim au presse-papiers système. Sous Wayland, Neovim utilise wl-copy et wl-paste fournis par wl-clipboard. Vous pouvez vérifier le fournisseur détecté avec :

:checkhealth vim.provider

La section Clipboard doit indiquer qu'un outil de presse-papiers a été trouvé.

Mise à jour des plugins

Pour rechercher les mises à jour disponibles pour les plugins gérés par vim.pack :

:lua vim.pack.update()

Vérifiez les changements proposés, puis utilisez :write pour les accepter. Redémarrez ensuite Neovim pour utiliser les plugins mis à jour. Pour contrôler l'état du gestionnaire de plugins :

:checkhealth vim.pack

Ruby

Ruby LSP

Installez ruby-lsp avec le Ruby utilisé par votre environnement :

$ gem install ruby-lsp

Vérifiez ensuite le client LSP dans Neovim :

:checkhealth vim.lsp

RuboCop

Installez RuboCop avec le Ruby utilisé par votre environnement :

$ gem install rubocop

Vérifiez son installation :

$ rubocop -V

Créez ~/.rubocop.yml pour activer automatiquement les nouvelles règles ajoutées comme pending par RuboCop :

$ nvi ~/.rubocop.yml

Ajoutez ensuite :

AllCops:
  NewCops: enable

RuboCop est utilisé manuellement pour mettre en forme le code et effectuer des vérifications ciblées.

Pour appliquer uniquement les règles de mise en forme à l'ensemble du projet :

$ rubocop --only Layout -A

Pour afficher uniquement les remarques de style :

$ rubocop --only Style --format simple

Pour rechercher les ambiguïtés et erreurs potentielles signalées par les règles Lint :

$ rubocop --lint --format simple

Utilisation

Placez-vous dans le dossier du projet et lancez Neovim :

$ cd ~/src/projet
$ nvim .

Sans fichier explicitement indiqué, Telescope s'ouvre directement. Si un fichier est passé sur la ligne de commande, Neovim l'ouvre normalement :

$ nvim lib/game.rb

Les commandes suivantes suffisent pour commencer :

Commande Action
i Passer en mode insertion
Esc Revenir en mode normal
v Commencer une sélection visuelle
y (mode visuel) Copier la sélection dans le presse-papiers système
yy Copier la ligne courante dans le presse-papiers système
p Coller depuis le presse-papiers système
:w Enregistrer
:q Quitter
Space f Rechercher et ouvrir un fichier du projet
Space b Afficher les buffers ouverts
Space g Rechercher du texte dans le projet avec ripgrep
Space w Rechercher dans le projet le mot sous le curseur
Space l Reprendre la dernière vue Telescope
Space d Afficher les diagnostics connus par Neovim avec Telescope
Space r Ouvrir Grug Far pour rechercher et remplacer
Ctrl-] Aller à la définition
Ctrl-t Revenir après un saut vers une définition
Ctrl-s Afficher la signature de la méthode en mode insertion (raccourci LSP natif)
u Annuler

Grug Far

Space r ouvre Grug Far dans un split vertical. En mode visuel, la sélection courante est utilisée pour préremplir le texte recherché.

Les raccourcis principaux dans Grug Far sont :

Commande Action
,r Appliquer le remplacement
,c Fermer Grug Far
Entrée Ouvrir l'emplacement du résultat sous le curseur

La virgule correspond ici à <localleader>, défini dans la configuration avec vim.g.maplocalleader = ",".

Pour vérifier l'installation ou diagnostiquer un problème :

:checkhealth grug-far

Dans Telescope :

Commande Action
Ctrl-n ou ↓ Résultat suivant
Ctrl-p ou ↑ Résultat précédent
Entrée Ouvrir le résultat
Ctrl-v Ouvrir dans un split vertical
Ctrl-x Ouvrir dans un split horizontal
Ctrl-t Ouvrir dans un nouvel onglet
Ctrl-c Fermer Telescope

La ligne de commande de Neovim propose automatiquement les complétions lorsque vous saisissez une commande après :.

Ignorer des fichiers du projet

Pour masquer certains fichiers ou dossiers dans les recherches de Telescope sans modifier .gitignore, créez un fichier .rgignore à la racine du projet. Cette règle reste propre aux recherches locales et ne change pas les fichiers suivis par Git.

Par exemple, pour ignorer le dossier doc/ :

$ printf 'doc/\n' > .rgignore

ripgrep prendra ce fichier en compte pour les recherches effectuées par Telescope lorsqu'il est utilisé comme moteur de recherche.

Retour au guide principal