12 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")
local sorters = require("telescope.sorters")
require("telescope").setup({
defaults = {
preview = false,
file_sorter = sorters.get_substr_matcher,
generic_sorter = sorters.get_substr_matcher,
},
})
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_optionscontient un contournement temporaire pour Ruby LSP 0.26.11 : dans certains petits projets Ruby plats, Ruby Indexer peut construire le motif{}/**/*.rbet 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 blocinit_optionspourra ê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é.
Ruby
Installez d'abord Ruby avec rbenv en suivant la fiche Ruby avec rbenv, puis utilisez le même Ruby pour les outils ci-dessous.
Ruby LSP
Installez ruby-lsp avec le Ruby utilisé par votre environnement :
$ gem install ruby-lsp
Ouvrez un fichier Ruby, puis vérifiez que le client LSP est bien détecté 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 |
K |
Afficher les informations LSP sur le symbole sous le curseur |
Ctrl-s |
Afficher la signature de la méthode en mode insertion (raccourci LSP natif) |
Ctrl-x Ctrl-o |
Afficher manuellement la complétion LSP en mode insertion |
u |
Annuler |
IRB
Pour explorer Ruby, découvrir des méthodes, consulter leur documentation ou tester rapidement du code, gardez de préférence IRB dans un split de Konsole dédié, en dessous de Neovim :
$ irb
IRB fournit sa propre complétion. Tab parcourt les propositions et Shift-Tab revient à la proposition précédente.
Quelques commandes utiles :
| Commande | Action |
|---|---|
show_doc Array#select |
Afficher la documentation avec RI |
ls objet |
Afficher les méthodes, constantes et variables accessibles |
show_source nom |
Afficher le code source lorsqu'il est disponible |
help |
Afficher les commandes IRB |
exit |
Quitter IRB |
IRB reste l'outil privilégié pour explorer Ruby. Dans Neovim, K, Ctrl-s et Ctrl-x Ctrl-o servent surtout à obtenir rapidement des informations contextuelles sans quitter le fichier en cours.
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
Telescope
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 |
Pour vérifier l'installation ou diagnostiquer un problème :
:checkhealth telescope
La ligne de commande de Neovim propose automatiquement les complétions pour les commandes : et les recherches / et ?.
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.
Maintenance
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