# 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 : ```sh # sqg -p neovim ``` Puis lancez l'installation : ```sh # 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 : ```sh # sqg -p ripgrep # sbopkg -i ripgrep ``` Sous Wayland, installez `wl-clipboard` pour permettre à Neovim d'utiliser le presse-papiers système : ```sh # sbopkg -i wl-clipboard ``` Pour un affichage homogène des symboles, vous pouvez également installer JetBrains Mono Nerd Font : ```sh # 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 : ```sh $ nvim --version $ rg --version ``` ## Configuration Créez le dossier de configuration : ```sh $ mkdir -p ~/.config/nvim ``` Créez ou éditez `~/.config/nvim/init.lua` : ```sh $ nvi ~/.config/nvim/init.lua ``` Utilisez cette configuration : ```lua -- 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", "f", builtin.find_files, { desc = "Files", }) vim.keymap.set("n", "b", builtin.buffers, { desc = "Buffers", }) vim.keymap.set("n", "g", builtin.live_grep, { desc = "Grep", }) vim.keymap.set("n", "w", builtin.grep_string, { desc = "Word", }) vim.keymap.set("n", "l", builtin.resume, { desc = "Last search", }) vim.keymap.set("n", "d", builtin.diagnostics, { desc = "Diagnostics", }) -- Grug Far vim.keymap.set({ "n", "x" }, "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 : ```text :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` : ```text :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 : ```text :checkhealth vim.pack ``` ## Ruby ### Ruby LSP Installez `ruby-lsp` avec le Ruby utilisé par votre environnement : ```sh $ gem install ruby-lsp ``` Vérifiez ensuite le client LSP dans Neovim : ```text :checkhealth vim.lsp ``` ### RuboCop Installez RuboCop avec le Ruby utilisé par votre environnement : ```sh $ gem install rubocop ``` Vérifiez son installation : ```sh $ rubocop -V ``` Créez `~/.rubocop.yml` pour activer automatiquement les nouvelles règles ajoutées comme `pending` par RuboCop : ```sh $ nvi ~/.rubocop.yml ``` Ajoutez ensuite : ```yaml 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 : ```sh $ rubocop --only Layout -A ``` Pour afficher uniquement les remarques de style : ```sh $ rubocop --only Style --format simple ``` Pour rechercher les ambiguïtés et erreurs potentielles signalées par les règles `Lint` : ```sh $ rubocop --lint --format simple ``` ## Utilisation Placez-vous dans le dossier du projet et lancez Neovim : ```sh $ 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 : ```sh $ 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 à ``, défini dans la configuration avec `vim.g.maplocalleader = ","`. Pour vérifier l'installation ou diagnostiquer un problème : ```text :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/` : ```sh $ 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](../README.md)