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, la complétion 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.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" })
vim.api.nvim_set_hl(0, "TelescopeNormal", { link = "Pmenu" })
vim.api.nvim_set_hl(0, "TelescopeBorder", { link = "PmenuBorder" })
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
local npairs = require("nvim-autopairs")
npairs.setup({
map_cr = false,
})
-- 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
local capabilities = vim.lsp.protocol.make_client_capabilities()
-- Active la surveillance des fichiers par Ruby LSP sous Linux.
capabilities.workspace.didChangeWatchedFiles.dynamicRegistration = true
vim.lsp.config("ruby_lsp", {
cmd = { "ruby-lsp" },
filetypes = { "ruby" },
root_markers = { "Gemfile", ".git" },
capabilities = capabilities,
-- 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")
-- Complétion Ruby LSP
vim.opt.completeopt = { "menuone", "noselect" }
vim.opt.pumheight = 8
vim.opt.pumwidth = 36
vim.opt.pummaxwidth = 72
vim.opt.pumborder = "rounded"
vim.api.nvim_create_autocmd("LspAttach", {
callback = function(event)
local client = vim.lsp.get_client_by_id(event.data.client_id)
if client and client:supports_method("textDocument/completion") then
vim.lsp.completion.enable(true, client.id, event.buf)
end
end,
})
vim.api.nvim_create_autocmd("InsertCharPre", {
callback = function()
vim.lsp.completion.get()
end,
})
vim.keymap.set("i", "<Tab>", function()
if vim.fn.pumvisible() == 1 then
local selected = vim.fn.complete_info({ "selected" }).selected
if selected == -1 then
return "<C-n><C-y>"
end
return "<C-y>"
end
return "<Tab>"
end, { expr = true })
vim.keymap.set("i", "<CR>", function()
if vim.fn.pumvisible() == 1 then
local selected = vim.fn.complete_info({ "selected" }).selected
if selected ~= -1 then
return npairs.esc("<C-y>")
end
end
return npairs.autopairs_cr()
end, {
expr = true,
replace_keycodes = false,
})
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. La complétion Ruby, les signatures de méthodes et la navigation LSP utilisent directement les fonctions intégrées à Neovim, sans plugin de complétion supplémentaire.
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 nouvelles versions des plugins gérés par vim.pack :
:packupdate
Vérifiez les changements proposés, puis utilisez :write pour les accepter. 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) |
Tab |
Accepter la proposition sélectionnée, ou la première proposition si aucune ne l'est |
Entrée |
Accepter la proposition sélectionnée, sinon insérer une nouvelle ligne |
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.