diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua index e7bff49..96e78cb 100644 --- a/.config/nvim/init.lua +++ b/.config/nvim/init.lua @@ -1,5 +1,2 @@ --- bootstrap lazy.nvim, LazyVim and your plugins +require("core") require("config.lazy") - -vim.g.autoformat = false -- globally -vim.b.autoformat = false -- buffer-local diff --git a/.config/nvim/lazy-lock.json b/.config/nvim/lazy-lock.json new file mode 100644 index 0000000..6ca7ec0 --- /dev/null +++ b/.config/nvim/lazy-lock.json @@ -0,0 +1,22 @@ +{ + "LuaSnip": { "branch": "master", "commit": "03c8e67eb7293c404845b3982db895d59c0d1538" }, + "bufferline.nvim": { "branch": "main", "commit": "2e3c8cc5a57ddd32f1edd2ffd2ccb10c09421f6c" }, + "cmp-buffer": { "branch": "main", "commit": "3022dbc9166796b644a841a02de8dd1cc1d311fa" }, + "cmp-cmdline": { "branch": "main", "commit": "d250c63aa13ead745e3a40f61fdd3470efde3923" }, + "cmp-emoji": { "branch": "main", "commit": "e8398e2adf512a03bb4e1728ca017ffeac670a9f" }, + "cmp-path": { "branch": "main", "commit": "91ff86cd9c29299a64f968ebb45846c485725f23" }, + "cmp_luasnip": { "branch": "master", "commit": "05a9ab28b53f71d1aece421ef32fee2cb857a843" }, + "friendly-snippets": { "branch": "main", "commit": "00ba9dd3df89509f95437b8d595553707c46d5ea" }, + "gitsigns.nvim": { "branch": "main", "commit": "863903631e676b33e8be2acb17512fdc1b80b4fb" }, + "lazy.nvim": { "branch": "main", "commit": "460e1cd8f24e364d54543a4b0e83f6f4ec1f65fb" }, + "lspkind.nvim": { "branch": "master", "commit": "59c3f419af48a2ffb2320cea85e44e5a95f71664" }, + "nord.nvim": { "branch": "master", "commit": "80c1e5321505aeb22b7a9f23eb82f1e193c12470" }, + "nvim-cmp": { "branch": "main", "commit": "ae644feb7b67bf1ce4260c231d1d4300b19c6f30" }, + "nvim-tree.lua": { "branch": "master", "commit": "e7cdecc6363acef8232f2f099fe21096ffdc071f" }, + "nvim-treesitter": { "branch": "master", "commit": "f027762845fa35ff27fe0487c86537a74a480a0c" }, + "nvim-web-devicons": { "branch": "master", "commit": "26220156aafb198b2de6a4cf80c1b120a3768da0" }, + "plenary.nvim": { "branch": "master", "commit": "2d9b06177a975543726ce5c73fca176cedbffe9d" }, + "telescope-fzf-native.nvim": { "branch": "main", "commit": "cf48d4dfce44e0b9a2e19a008d6ec6ea6f01a83b" }, + "telescope.nvim": { "branch": "0.1.x", "commit": "a0bbec21143c7bc5f8bb02e0005fa0b982edc026" }, + "which-key.nvim": { "branch": "main", "commit": "fb070344402cfc662299d9914f5546d840a22126" } +} diff --git a/.config/nvim/lua/config/lazy.lua b/.config/nvim/lua/config/lazy.lua new file mode 100644 index 0000000..c128865 --- /dev/null +++ b/.config/nvim/lua/config/lazy.lua @@ -0,0 +1,25 @@ +-- Mise en place et installation de lazy.nvim +local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" +if not (vim.uv or vim.loop).fs_stat(lazypath) then + local lazyrepo = "https://github.com/folke/lazy.nvim.git" + local out = vim.fn.system({ "git", "clone", "--filter=blob:none", "--branch=stable", lazyrepo, lazypath }) + if vim.v.shell_error ~= 0 then + vim.api.nvim_echo({ + { "Failed to clone lazy.nvim:\n", "ErrorMsg" }, + { out, "WarningMsg" }, + { "\nPress any key to exit..." }, + }, true, {}) + vim.fn.getchar() + os.exit(1) + end +end +vim.opt.rtp:prepend(lazypath) + +-- Configuration de lazy.nvim et importation du répertoire `plugins` +require("lazy").setup({ { import = "plugins" } }, { + -- désactive la pénible notification au démarrage + change_detection = { + notify = false, + }, +}) + diff --git a/.config/nvim/lua/core/init.lua b/.config/nvim/lua/core/init.lua new file mode 100644 index 0000000..ba031e5 --- /dev/null +++ b/.config/nvim/lua/core/init.lua @@ -0,0 +1,2 @@ +require("core.options") +require("core.keymaps") diff --git a/.config/nvim/lua/core/keymaps.lua b/.config/nvim/lua/core/keymaps.lua new file mode 100644 index 0000000..568a40b --- /dev/null +++ b/.config/nvim/lua/core/keymaps.lua @@ -0,0 +1,22 @@ +-- On définit notre touche leader sur espace +vim.g.mapleader = " " + +-- Raccourci pour la fonction set +local keymap = vim.keymap.set + +-- on utilise ;; pour sortir du monde insertion +keymap("i", "jj", "", { desc = "Sortir du mode insertion avec jj" }) +keymap("i", "kk", "", { desc = "Sortir du mode insertion avec kk" }) + +-- on efface le surlignage de la recherche +keymap("n", "nh", ":nohl", { desc = "Effacer le surlignage de la recherche" }) + +-- Changement de fenêtre avec Ctrl + déplacement uniquement au lieu de Ctrl-w + déplacement +keymap("n", "", "h", { desc = "Déplace le curseur dans la fenêtre de gauche" }) +keymap("n", "", "j", { desc = "Déplace le curseur dans la fenêtre du bas" }) +keymap("n", "", "k", { desc = "Déplace le curseur dans la fenêtre du haut" }) +keymap("n", "", "l", { desc = "Déplace le curseur dans la fenêtre droite" }) + +-- Navigation entre les buffers +keymap("n", "", ":bnext", opts) +keymap("n", "", ":bprevious", opts) diff --git a/.config/nvim/lua/core/options.lua b/.config/nvim/lua/core/options.lua new file mode 100644 index 0000000..6411cdb --- /dev/null +++ b/.config/nvim/lua/core/options.lua @@ -0,0 +1,50 @@ +-- https://vincent.jousse.org/blog/fr/tech/configurer-neovim-comme-ide-a-partir-de-zero-tutoriel-guide/#cerise-sur-le-g%C3%A2teau-ou-plugin-de-trop-noicenvim-une-interface-repens%C3%A9e +local opt = vim.opt -- raccourci pour un peu plus de concision + +-- numéros de ligne +opt.relativenumber = true -- affichage des numéros de ligne relatives à la position actuelle du curseur +opt.number = true -- affiche le numéro absolu de la ligne active lorsque que relativenumber est activé + +-- souris j'aime pas. +opt.mouse = "" -- désactive la souris + +-- tabs & indentation +opt.tabstop = 4 -- 4 espaces pour les tabulations +opt.shiftwidth = 4 -- 4 espaces pour la taille des indentations +opt.expandtab = true -- change les tabulations en espaces (don't feed the troll please ;) ) +opt.autoindent = true -- on garde l'indentation actuelle à la prochaine ligne + +-- recherche +opt.ignorecase = true -- ignore la casse quand on recherche +opt.smartcase = true -- sauf quand on fait une recherche avec des majuscules, on rebascule en sensible à la casse +opt.hlsearch = true -- surlignage de toutes les occurences de la recherche en cours + +-- ligne du curseur +opt.cursorline = true -- surlignage de la ligne active + +-- apparence + +-- termguicolors est nécessaire pour que les thèmes modernes fonctionnent +opt.termguicolors = true +opt.background = "dark" -- dark ou light en fonction de votre préférence +opt.signcolumn = "yes" -- affiche une colonne en plus à gauche pour afficher les signes (évite de décaler le texte) + +-- retour +opt.backspace = "indent,eol,start" -- on autorise l'utilisation de retour quand on indente, à la fin de ligne ou au début + +-- presse papier +opt.clipboard = "unnamedplus" -- on utilise le presse papier du système par défaut + +-- split des fenêtres +opt.splitright = true -- le split vertical d'une fenêtre s'affiche à droite +opt.splitbelow = true -- le split horizontal d'une fenêtre s'affiche en bas + +opt.swapfile = false -- on supprime le pénible fichier de swap + +opt.undofile = true -- on autorise l'undo à l'infini (même quand on revient sur un fichier qu'on avait fermé) + +opt.iskeyword:append("-") -- on traite les mots avec des - comme un seul mot + +-- affichage des caractères spéciaux +opt.list = true +opt.listchars:append({ nbsp = "␣", trail = "•", precedes = "«", extends = "»", tab = "> " }) diff --git a/.config/nvim/lua/plugins/bufferline.lua b/.config/nvim/lua/plugins/bufferline.lua new file mode 100644 index 0000000..f69be53 --- /dev/null +++ b/.config/nvim/lua/plugins/bufferline.lua @@ -0,0 +1,11 @@ +return { + "akinsho/bufferline.nvim", + dependencies = { "nvim-tree/nvim-web-devicons" }, + version = "*", + opts = { + options = { + separator_style = "slant", + offsets = { { filetype = "NvimTree", text = "", padding = 1 } }, + }, + }, +} diff --git a/.config/nvim/lua/plugins/gitsigns.lua b/.config/nvim/lua/plugins/gitsigns.lua new file mode 100644 index 0000000..3bc7a65 --- /dev/null +++ b/.config/nvim/lua/plugins/gitsigns.lua @@ -0,0 +1,53 @@ +return { + "lewis6991/gitsigns.nvim", + event = { "BufReadPre", "BufNewFile" }, + opts = { + + signs = { + add = { text = "▎" }, + change = { text = "▎" }, + changedelete = { text = "▎" }, + }, + on_attach = function(bufnr) + local gs = package.loaded.gitsigns + + local function map(mode, l, r, desc) + vim.keymap.set(mode, l, r, { buffer = bufnr, desc = desc }) + end + + -- Navigation + map("n", "]h", gs.next_hunk, "Next Hunk") + map("n", "[h", gs.prev_hunk, "Prev Hunk") + + -- Actions + map("n", "hs", gs.stage_hunk, "Stage hunk") + map("n", "hr", gs.reset_hunk, "Reset hunk") + map("v", "hs", function() + gs.stage_hunk({ vim.fn.line("."), vim.fn.line("v") }) + end, "Stage hunk") + map("v", "hr", function() + gs.reset_hunk({ vim.fn.line("."), vim.fn.line("v") }) + end, "Reset hunk") + + map("n", "hS", gs.stage_buffer, "Stage buffer") + map("n", "hR", gs.reset_buffer, "Reset buffer") + + map("n", "hu", gs.undo_stage_hunk, "Undo stage hunk") + + map("n", "hp", gs.preview_hunk, "Preview hunk") + + map("n", "hb", function() + gs.blame_line({ full = true }) + end, "Blame line") + map("n", "hB", gs.toggle_current_line_blame, "Toggle line blame") + + map("n", "hd", gs.diffthis, "Diff this") + map("n", "hD", function() + gs.diffthis("~") + end, "Diff this ~") + + -- Text object + map({ "o", "x" }, "ih", ":Gitsigns select_hunk", "Gitsigns select hunk") + end, + }, +} diff --git a/.config/nvim/lua/plugins/init.lua b/.config/nvim/lua/plugins/init.lua new file mode 100644 index 0000000..edda24f --- /dev/null +++ b/.config/nvim/lua/plugins/init.lua @@ -0,0 +1,3 @@ +return { + "nvim-lua/plenary.nvim", -- ensemble de fonctions lua utilisées par de nombreux plugins +} diff --git a/.config/nvim/lua/plugins/nord.lua b/.config/nvim/lua/plugins/nord.lua new file mode 100644 index 0000000..7be33f7 --- /dev/null +++ b/.config/nvim/lua/plugins/nord.lua @@ -0,0 +1,10 @@ +return { +"shaunsingh/nord.nvim", + lazy = false, + priority = 1000, + opts = {}, + config = function() + -- chargement du thème + vim.cmd([[colorscheme nord]]) + end, +} diff --git a/.config/nvim/lua/plugins/nvim-cmp.lua b/.config/nvim/lua/plugins/nvim-cmp.lua new file mode 100644 index 0000000..b81e9f8 --- /dev/null +++ b/.config/nvim/lua/plugins/nvim-cmp.lua @@ -0,0 +1,101 @@ +return { + "hrsh7th/nvim-cmp", + event = { "InsertEnter", "CmdlineEnter" }, + dependencies = { + "hrsh7th/cmp-buffer", -- source pour compléter le texte déjà présent dans le buffer + "hrsh7th/cmp-path", -- source pour compléter les chemins des fichiers + "hrsh7th/cmp-cmdline", -- source pour les completions de la cmdline de vim + { + "L3MON4D3/LuaSnip", + -- follow latest release. + version = "v2.*", -- Replace by the latest released major (first number of latest release) + -- install jsregexp (optional!). + build = "make install_jsregexp", + }, + "saadparwaiz1/cmp_luasnip", -- ajoute LuaSnip à l'autocompletion + "rafamadriz/friendly-snippets", -- collection de snippets pratiques + "hrsh7th/cmp-emoji", -- complétion d'émojis à la saisie de : + "onsails/lspkind.nvim", -- vs-code pictogrammes + }, + config = function() + local cmp = require("cmp") + + local luasnip = require("luasnip") + + local lspkind = require("lspkind") + + -- chargement des snippets (e.g. friendly-snippets) + require("luasnip.loaders.from_vscode").lazy_load() + + cmp.setup({ + completion = { + completeopt = "menu,menuone,preview,noselect", + }, + snippet = { -- on utilise luasnip comme moteur de snippets + expand = function(args) + luasnip.lsp_expand(args.body) + end, + }, + mapping = { + [""] = cmp.mapping.select_prev_item(), + [""] = cmp.mapping.select_next_item(), + [""] = cmp.mapping.scroll_docs(-1), + [""] = cmp.mapping.scroll_docs(1), + [""] = cmp.mapping.complete(), + [""] = cmp.mapping.abort(), + [""] = cmp.mapping.confirm({ select = true }), -- Accepte la sélection courante. Mettre à `false` pour ne confirmer que les items explicitement sélectionnés + }, + + -- sources pour l'autocompletion + sources = cmp.config.sources({ + { name = "nvim_lua" }, + { name = "luasnip" }, -- snippets + { name = "buffer" }, -- texte du buffer courant + { name = "path" }, -- chemins dy système de fichier + { name = "emoji" }, -- emojis + }), + + formatting = { + -- Comportement par défaut + expandable_indicator = true, + -- Champs affichés par défaut + fields = { "abbr", "kind", "menu" }, + format = lspkind.cmp_format({ + mode = "symbol_text", + -- On suffixe chaque entrée par son type + menu = { + buffer = "[Buffer]", + luasnip = "[LuaSnip]", + nvim_lua = "[Lua]", + path = "[Path]", + emoji = "[Emoji]", + }, + }), + }, + }) + + -- `/` complétion + cmp.setup.cmdline("/", { + mapping = cmp.mapping.preset.cmdline(), + sources = { + { name = "buffer" }, + }, + }) + + -- `:` complétion + cmp.setup.cmdline(":", { + mapping = cmp.mapping.preset.cmdline(), + sources = cmp.config.sources({ + { name = "path" }, + }, { + { + name = "cmdline", + option = { + ignore_cmds = { "Man", "!" }, + }, + }, + }), + }) + + end, +} diff --git a/.config/nvim/lua/plugins/nvim-tree.lua b/.config/nvim/lua/plugins/nvim-tree.lua new file mode 100644 index 0000000..ef4beff --- /dev/null +++ b/.config/nvim/lua/plugins/nvim-tree.lua @@ -0,0 +1,20 @@ +return { + "nvim-tree/nvim-tree.lua", + version = "*", + lazy = false, + dependencies = { + "nvim-tree/nvim-web-devicons", + }, + config = function() + require("nvim-tree").setup({}) + + -- On utilise e pour ouvrir/fermer l'explorateur + vim.keymap.set( + "n", + "e", + "NvimTreeFindFileToggle", + { desc = "Ouverture/fermeture de l'explorateur de fichiers" } + ) + end, +} + diff --git a/.config/nvim/lua/plugins/telescope.lua b/.config/nvim/lua/plugins/telescope.lua new file mode 100644 index 0000000..bd911f9 --- /dev/null +++ b/.config/nvim/lua/plugins/telescope.lua @@ -0,0 +1,42 @@ +return { + "nvim-telescope/telescope.nvim", + branch = "0.1.x", + dependencies = { + "nvim-lua/plenary.nvim", + -- fzf implémentation en C pour plus de rapidité + { "nvim-telescope/telescope-fzf-native.nvim", build = "make" }, + "nvim-tree/nvim-web-devicons", + }, + config = function() + local telescope = require("telescope") + local actions = require("telescope.actions") + + telescope.setup({ + defaults = { + + -- Parce que c'est joli + --prompt_prefix = " ", + --selection_caret = " ", + path_display = { "smart" }, + file_ignore_patterns = { ".git/", "node_modules" }, + + mappings = { + i = { + [""] = actions.move_selection_next, + [""] = actions.move_selection_previous, + }, + }, + }, + }) + + telescope.load_extension("fzf") + + -- set keymaps + local keymap = vim.keymap -- for conciseness + + keymap.set( "n", "ff", "Telescope find_files", { desc = "Recherche de chaînes de caractères dans les noms de fichiers" }) + keymap.set( "n", "fg", "Telescope live_grep", { desc = "Recherche de chaînes de caractères dans le contenu des fichiers" }) + keymap.set( "n", "fb", "Telescope buffers", { desc = "Recherche de chaînes de caractères dans les noms de buffers" }) + keymap.set( "n", "fx", "Telescope grep_string", { desc = "Recherche de la chaîne de caractères sous le curseur" }) + end, +} diff --git a/.config/nvim/lua/plugins/treesitter.lua b/.config/nvim/lua/plugins/treesitter.lua new file mode 100644 index 0000000..d83f93a --- /dev/null +++ b/.config/nvim/lua/plugins/treesitter.lua @@ -0,0 +1,47 @@ +return { + "nvim-treesitter/nvim-treesitter", + build = ":TSUpdate", + config = function() + local treesitter = require("nvim-treesitter.configs") + + -- configuration de treesitter + treesitter.setup({ + -- activation de la coloration syntaxique + highlight = { + enable = true, + }, + -- activation de l'indentation améliorée + indent = { enable = true }, + + -- langages installés et configurés + ensure_installed = { + "bash", + "dockerfile", + "gitignore", + "html", + "javascript", + "json", + "lua", + "markdown", + "markdown_inline", + "python", + "rst", + "rust", + "typescript", + "vim", + "yaml", + }, + -- lorse de l'appui sur sélectionne le bloc + -- courant spécifique au langage de programmation + incremental_selection = { + enable = true, + keymaps = { + init_selection = "", + node_incremental = "", + scope_incremental = false, + node_decremental = "", + }, + }, + }) + end, +} diff --git a/.config/nvim/lua/plugins/whichkey.lua b/.config/nvim/lua/plugins/whichkey.lua new file mode 100644 index 0000000..37fa652 --- /dev/null +++ b/.config/nvim/lua/plugins/whichkey.lua @@ -0,0 +1,14 @@ +return { + "folke/which-key.nvim", + event = "VeryLazy", + opts = {}, + keys = { + { + "?", + function() + require("which-key").show({ global = true }) + end, + desc = "Buffer Local Keymaps (which-key)", + }, + }, +}