Last active
October 11, 2024 16:38
-
-
Save GllmR/80de5fb8824a758bafdb390e0a471480 to your computer and use it in GitHub Desktop.
One file Neovim configuration
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
---@diagnostic disable: undefined-global | |
------------------- | |
-- EDITOR CONFIG -- | |
------------------- | |
vim.opt.compatible = false | |
vim.opt.tabstop = 2 -- Two spaces for tab | |
vim.opt.softtabstop = 2 | |
vim.opt.shiftwidth = 2 -- Two spaces for indentation | |
vim.opt.expandtab = true -- Spaces instead of tabs | |
vim.opt.autoindent = true -- Auto indent | |
vim.opt.list = true | |
vim.opt.listchars = 'space:⋅,trail:◊,tab:▷▷' | |
vim.opt.number = true -- Show line numbers | |
vim.opt.relativenumber = true -- Show relative line numbers | |
vim.opt.cursorline = true -- Highlight current line | |
vim.opt.scrolloff = 5 -- Start scrolling 5 lines before the end of the screen | |
vim.opt.termguicolors = true -- True color support | |
vim.opt.splitbelow = true -- Split below instead of above | |
vim.opt.splitright = true -- Split right instead of left | |
vim.opt.smartcase = true -- Case sensitive search if there is a capital letter | |
vim.opt.signcolumn = 'yes' | |
vim.opt.smartindent = true | |
vim.opt.completeopt = {'menuone','noinsert', 'noselect'} | |
vim.opt.swapfile = false | |
vim.opt.backup = false | |
vim.opt.undodir = os.getenv("HOME") .. "/.vim/undodir" | |
vim.opt.undofile = true | |
vim.opt.hidden = true | |
vim.opt.hlsearch = false | |
vim.opt.incsearch = true | |
vim.opt.ignorecase = true | |
vim.opt.background = 'dark' | |
vim.opt.mousescroll = 'ver:25,hor:6' | |
vim.opt.spell = true -- Spell check | |
vim.opt.spelllang = 'en_gb,fr' -- Languages for spell check | |
vim.opt.guicursor = "n-v-c:blinkon100" | |
vim.loader.enable() | |
vim.api.nvim_create_autocmd('TextYankPost', { | |
callback = function() vim.highlight.on_yank() end | |
}) | |
-- Sauvegarde les replis dans un fichier de views | |
vim.opt.viewoptions = "folds,cursor" | |
vim.cmd([[ | |
augroup remember_folds | |
autocmd! | |
autocmd BufWinLeave *.* mkview | |
autocmd BufWinEnter *.* silent! loadview | |
augroup END | |
]]) | |
---------- | |
-- LAZY -- | |
---------- | |
local lazy = {} | |
-- function lazy.install(path) | |
-- if not vim.loop.fs_stat(path) then | |
-- print('Installing lazy.nvim....') | |
-- vim.fn.system({ | |
-- 'git', | |
-- 'clone', | |
-- '--filter=blob:none', | |
-- 'https://github.com/folke/lazy.nvim.git', | |
-- '--branch=stable', -- latest stable release | |
-- path, | |
-- }) | |
-- end | |
-- end | |
-- | |
function lazy.setup(plugins) | |
-- You can "comment out" the line below after lazy.nvim is installed | |
-- lazy.install(lazy.path) | |
vim.opt.rtp:prepend(lazy.path) | |
require('lazy').setup(plugins, lazy.opts) | |
end | |
lazy.path = vim.fn.stdpath('data') .. '/lazy/lazy.nvim' | |
lazy.opts = {} | |
lazy.setup({ | |
-- UI / Theme | |
{'folke/zen-mode.nvim'}, | |
{'tummetott/reticle.nvim'}, | |
{'GllmR/drop.nvim'}, | |
{'asiryk/auto-hlsearch.nvim', lazy = true}, | |
{'NvChad/nvim-colorizer.lua', lazy = true}, | |
{'prichrd/netrw.nvim', lazy = true}, | |
-- Mini | |
{'echasnovski/mini.nvim', version = false}, | |
{'JoosepAlviste/nvim-ts-context-commentstring', lazy = true}, | |
{'nvim-tree/nvim-web-devicons'}, | |
--Session | |
{'folke/persistence.nvim'}, | |
-- File Explorer | |
{'luukvbaal/nnn.nvim', lazy = true}, | |
-- Git | |
{'lewis6991/gitsigns.nvim', lazy = true}, | |
{'tpope/vim-fugitive', lazy = true}, | |
-- Terminal | |
{'akinsho/toggleterm.nvim', version = "*", lazy = true}, | |
-- Telescope | |
{'nvim-telescope/telescope.nvim', branch = '0.1.x', lazy = true}, | |
-- {'nvim-telescope/telescope-fzf-native.nvim', build = 'make', lazy = true}, | |
{'nvim-telescope/telescope-file-browser.nvim', lazy = true}, | |
{'nvim-lua/plenary.nvim'}, | |
-- Treesitter | |
{'nvim-treesitter/nvim-treesitter'}, | |
{'nvim-treesitter/nvim-treesitter-context'}, | |
-- {'nvim-treesitter/nvim-treesitter-textobjects'}, | |
-- LSP | |
{'neovim/nvim-lspconfig', lazy = true}, | |
{'williamboman/mason.nvim', lazy = true}, | |
{'williamboman/mason-lspconfig.nvim', lazy = true}, | |
{ | |
'nvimtools/none-ls.nvim', | |
dependencies = { | |
'nvimtools/none-ls-extras.nvim', | |
}, | |
}, | |
-- IA Helpers | |
{'zbirenbaum/copilot.lua'}, | |
{ | |
'CopilotC-Nvim/CopilotChat.nvim', | |
branch = "canary", | |
lazy = true, | |
build = "make tiktoken" | |
}, | |
-- CodeSnap | |
{"mistricky/codesnap.nvim", build = "make", lazy = true}, | |
-- MarkdownPreview | |
{ | |
"OXY2DEV/markview.nvim", | |
lazy = false, | |
dependencies = { | |
"nvim-treesitter/nvim-treesitter", | |
"nvim-tree/nvim-web-devicons" | |
} | |
} | |
}) | |
-------------------- | |
-- PLUGINS CONFIG -- | |
-------------------- | |
--- | |
-- MINI | |
--- | |
require('mini.cursorword').setup() | |
require('mini.pairs').setup() | |
require('mini.indentscope').setup() | |
require('mini.animate').setup({ | |
open = { | |
enable = false | |
}, | |
close = { | |
enable = false | |
} | |
}) | |
require('mini.align').setup() | |
require('mini.tabline').setup() | |
require('mini.jump').setup() | |
require('mini.jump2d').setup() | |
require('mini.surround').setup() | |
require('mini.bufremove').setup() | |
require('mini.trailspace').setup() | |
require('mini.notify').setup() | |
require('mini.completion').setup({ | |
delay = {signature = 10^7} | |
}) | |
require('mini.statusline').setup({ | |
content = { | |
active = function() | |
local mode, mode_hl = MiniStatusline.section_mode({ trunc_width = 120 }) | |
local git = MiniStatusline.section_git({ trunc_width = 75 }) | |
local diagnostics = MiniStatusline.section_diagnostics({ trunc_width = 75 }) | |
local filename = MiniStatusline.section_filename({ trunc_width = 140 }) | |
local time = os.date("%H:%M", os.time()) | |
local fileinfo = MiniStatusline.section_fileinfo({ trunc_width = 120 }) | |
local location = MiniStatusline.section_location({ trunc_width = 75 }) | |
return MiniStatusline.combine_groups({ | |
{ hl = mode_hl, strings = { mode } }, | |
{ hl = 'MiniStatuslineDevinfo', strings = { git, diagnostics } }, | |
'%<', -- Mark general truncate point | |
{ hl = 'MiniStatuslineFilename', strings = { filename } }, | |
'%=', -- End left alignment | |
{ hl = 'MoreMsg', strings = { time } }, | |
{ hl = 'MiniStatuslineFileinfo', strings = { fileinfo } }, | |
{ hl = mode_hl, strings = { location } }, | |
}) | |
end, | |
} | |
}) | |
require('mini.comment').setup { | |
options = { | |
custom_commentstring = function() | |
return require('ts_context_commentstring.internal').calculate_commentstring() or vim.bo.commentstring | |
end, | |
} | |
} | |
local starter = require('mini.starter') | |
local my_items = { | |
starter.sections.builtin_actions(), | |
{ name = 'Recent Files', action = ':Telescope oldfiles', section = 'Telescope' }, | |
{ name = 'Find File', action = ':Telescope find_files', section = 'Telescope' }, | |
{ name = 'Restore Session', action = ':lua require("persistence").load()', section = 'Sessions' }, | |
{ name = 'Restore Previous Session', action = ':lua require("persistence").load({ last = true })', section = 'Sessions' } | |
} | |
starter.setup({ | |
autoopen = true, | |
evaluate_single = true, | |
items = my_items, | |
header = [[ | |
░█▀▀░█░░░█░░░█▄█░█▀▄ | |
░█░█░█░░░█░░░█░█░█▀▄ | |
░▀▀▀░▀▀▀░▀▀▀░▀░▀░▀░▀ | |
]], | |
content_hooks = { | |
starter.gen_hook.adding_bullet(), | |
starter.gen_hook.indexing('all', {'Builtin actions', 'Telescope'}), | |
starter.gen_hook.padding(5, 2), | |
starter.gen_hook.aligning('center', 'center'), | |
} | |
}) | |
-- Complete with tabs | |
vim.api.nvim_set_keymap('i', '<Tab>', [[pumvisible() ? "\<C-n>" : "\<Tab>"]], { noremap = true, expr = true }) | |
vim.api.nvim_set_keymap('i', '<S-Tab>', [[pumvisible() ? "\<C-p>" : "\<S-Tab>"]], { noremap = true, expr = true }) | |
--- | |
-- TOGGLETERM | |
--- | |
require('toggleterm').setup({ | |
shade_terminals = false, | |
start_in_insert = true, | |
persist_mode = false, | |
float_opts = { | |
border = 'curved' | |
} | |
}) | |
--- | |
-- TREESITTER | |
--- | |
require('nvim-treesitter.configs').setup({ | |
highlight = { | |
enable = true | |
}, | |
indent = { | |
enable = true | |
}, | |
ts_context_commentstring = { | |
enable = true, | |
enable_autocmd = false, | |
config = { | |
javascript = { | |
__default = '// %s', | |
jsx_element = '{/* %s */}', | |
jsx_fragment = '{/* %s */}', | |
jsx_attribute = '// %s', | |
comment = '// %s' | |
} | |
} | |
}, | |
ensure_installed = { | |
'javascript', | |
'lua', | |
'css', | |
'json' | |
} | |
}) | |
require('treesitter-context').setup() | |
--- | |
-- DROP | |
--- | |
require('drop').setup({ | |
theme = 'blood', | |
max = 50, | |
interval = 80, | |
screensaver = false | |
}) | |
--- | |
-- CODESNAP | |
--- | |
require('codesnap').setup({ | |
bg_color = '#535c68', | |
code_font_family = 'Hack Nerd Font', | |
has_breadcrumbs = true, | |
watermark = '' | |
}) | |
--- | |
-- NO CONFIG PLUGINS | |
--- | |
require('reticle').setup {} | |
require('nvim-web-devicons').setup{} | |
require('nnn').setup() | |
require('netrw').setup{} | |
require('persistence').setup {} | |
require('auto-hlsearch').setup() | |
require('colorizer').setup() | |
require('gitsigns').setup() | |
require('telescope').setup {} | |
require('telescope').load_extension 'file_browser' | |
--- | |
-- LSP | |
--- | |
require('mason').setup({ | |
ui = {border = 'rounded'} | |
}) | |
require('mason-lspconfig').setup({ | |
settings = { | |
typescript = { | |
preferences = { | |
quoteStyle = "single", | |
bracketSpacing = "false" | |
} | |
}, | |
javascript = { | |
preferences = { | |
quoteStyle = "single", | |
bracketSpacing = "false" | |
} | |
} | |
} | |
}) | |
local lspconfig = require('lspconfig') | |
require('mason-lspconfig').setup_handlers({ | |
function(server_name) | |
lspconfig[server_name].setup({ | |
on_attach = lsp_attach, | |
capabilities = lsp_capabilities, | |
}) | |
end, | |
}) | |
local signs = { | |
{ name = "DiagnosticSignError", text = "" }, | |
{ name = "DiagnosticSignWarn", text = "" }, | |
{ name = "DiagnosticSignHint", text = "" }, | |
{ name = "DiagnosticSignInfo", text = "" }, | |
} | |
for _, sign in ipairs(signs) do | |
vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = "" }) | |
end | |
vim.diagnostic.config({ | |
virtual_text = false, | |
-- enables lsp_lines but we want to start disabled | |
virtual_lines = false, | |
-- show signs | |
signs = { | |
active = signs, | |
}, | |
update_in_insert = true, | |
underline = true, | |
severity_sort = false, | |
float = { | |
focus = false, | |
focusable = false, | |
style = "minimal", | |
border = "rounded", | |
source = "always", | |
header = "", | |
prefix = "", | |
} | |
}) | |
--- | |
-- NULL LS - XO | |
--- | |
local null_ls = require('null-ls') | |
null_ls.setup({ | |
sources = { | |
require("none-ls.code_actions.eslint").with({ | |
name = "xo", | |
filetypes = { "javascript", "javascriptreact", "typescript", "typescriptreact" }, | |
command = "xo", | |
args = { "--reporter", "json", "--stdin", "--stdin-filename", "$FILENAME" }, | |
}), | |
require("none-ls.diagnostics.eslint").with({ | |
name = "xo", | |
filetypes = { "javascript", "javascriptreact", "typescript", "typescriptreact" }, | |
command = "xo", | |
args = { "--reporter", "json", "--stdin", "--stdin-filename", "$FILENAME" }, | |
}) | |
}, | |
}) | |
--- | |
-- COPILOT | |
--- | |
require('copilot').setup({ | |
suggestion = { | |
enabled = true, | |
auto_trigger = true, | |
keymap = { | |
accept = '<C-y>', | |
next = '<C-u>', | |
prev = '<C-i>', | |
} | |
} | |
}) | |
require('CopilotChat').setup({ | |
window = { | |
layout = 'horizontal', | |
border = 'rounded' | |
} | |
}) | |
--- | |
-- THEME | |
--- | |
vim.cmd('colorscheme retrobox') | |
-- Colors in tabs | |
vim.cmd('hi MiniTablineCurrent gui=underline guifg=#83a598') | |
vim.cmd('hi MiniTablineVisible guifg=#83a598') | |
vim.cmd('hi MiniTablineModifiedCurrent guifg=#af6f81 gui=underline') | |
vim.cmd('hi MiniTablineModifiedHidden guifg=#af6f81') | |
-------------- | |
-- KEYBINDS -- | |
-------------- | |
local opt = {silent = true} | |
vim.g.mapleader = ' ' | |
vim.keymap.set('n', '<leader>e', vim.cmd.Ex) | |
vim.keymap.set('n', '<leader>ne', ':NnnExplorer<CR>', opt) | |
vim.keymap.set('n', '<leader>nn', ':NnnPicker<CR>', opt) | |
vim.keymap.set('n', '<leader>cff', ':e ~/.config/nvim/init.lua<CR>', opt) | |
vim.keymap.set('n', '<leader>s', ':w<CR>', opt) | |
vim.keymap.set('n', '<leader>q', ':qa<CR>', opt) | |
-- Windows | |
vim.keymap.set('n', '<leader>nw', ':vsp<CR>', opt) | |
vim.keymap.set('n', '<leader>nhw', ':sp<CR>', opt) | |
vim.keymap.set('n', '<C-S>j', ':10winc +<CR>', opt) | |
vim.keymap.set('n', '<C-S>k', ':10winc -<CR>', opt) | |
vim.keymap.set('n', '<C-S>h', ':10winc ><CR>', opt) | |
vim.keymap.set('n', '<C-S>l', ':10winc <<CR>', opt) | |
-- Copy / Paste system | |
vim.keymap.set('v', '<leader>cs', '"*y', opt) | |
vim.keymap.set('n', '<leader>ps', '"*p', opt) | |
-- Buffers | |
vim.keymap.set('n', '<leader>cb', ':b#|bd#<CR>', opt) | |
vim.keymap.set('n', '<C-l>', ':bnext<CR>', opt) | |
vim.keymap.set('n', '<C-h>', ':bprevious<CR>', opt) | |
-- Terminal | |
vim.keymap.set('t', '<Esc>', '<C-\\><C-n>') | |
vim.keymap.set('n', '<leader>t', ':ToggleTerm direction=float<CR>', {desc ='Open terminal'}) | |
vim.keymap.set('n', '<leader>vt', ':ToggleTerm size=60 direction=vertical<CR>', opt) | |
vim.keymap.set('n', '<leader>ht', ':ToggleTerm<CR>', opt) | |
-- Telescope | |
vim.keymap.set('n', '<leader>dg', ':Telescope diagnostics<CR>', opt) | |
vim.keymap.set('n', '<leader>ff', ':Telescope find_files<CR>', opt) | |
vim.keymap.set('n', '<leader>fhf', ':Telescope find_files hidden=true no_ignore=true<CR>', opt) | |
vim.keymap.set('n', '<leader>fb', ':Telescope file_browser<CR>', opt) | |
vim.keymap.set('n', '<leader>fp', ':Telescope file_browser path=%:p:h select_buffer=true<CR>', opt) | |
vim.keymap.set('n', '<leader>fg', ':Telescope live_grep<CR>', opt) | |
vim.keymap.set('n', '<leader>gst', ':Telescope git_status<CR>', opt) | |
vim.keymap.set('n', '<leader>glg', ':Telescope git_commits<CR>', opt) | |
vim.keymap.set('n', '<leader>gd', ':Telescope lsp_definitions<CR>', opt) | |
vim.keymap.set('n', '<leader>rf', ':Telescope lsp_references<CR>', opt) | |
vim.keymap.set('n', '<leader>km', ':Telescope keymaps<CR>', opt) | |
vim.keymap.set('n', '<leader>fr', ':Telescope registers<CR>', opt) | |
vim.keymap.set('n', '<leader>fm', ':Telescope marks<CR>', opt) | |
vim.keymap.set('n', '<leader>bb', ':Telescope buffers<CR>', opt) | |
-- LSP | |
vim.keymap.set("n", "<leader>k", vim.lsp.buf.hover, opt) | |
vim.keymap.set("n", "<leader>vdg", vim.diagnostic.open_float, opt) | |
vim.keymap.set({'v', 'n'}, "<leader>vca", vim.lsp.buf.code_action, opt) | |
vim.keymap.set('n', '<leader>vra', vim.lsp.buf.rename, opt) | |
vim.keymap.set('n', '<leader>vh', vim.lsp.buf.signature_help, opt) | |
vim.keymap.set('n', '<leader>vf', '<cmd>lua vim.lsp.buf.format({async = true})<cr>') | |
vim.keymap.set('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<cr>') | |
vim.keymap.set('n', 'gD', '<cmd>lua vim.lsp.buf.declaration()<cr>') | |
vim.keymap.set('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<cr>') | |
vim.keymap.set('n', 'go', '<cmd>lua vim.lsp.buf.type_definition()<cr>') | |
vim.keymap.set('n', 'gr', '<cmd>lua vim.lsp.buf.references()<cr>') | |
vim.keymap.set('n', 'gs', '<cmd>lua vim.lsp.buf.signature_help()<cr>') | |
vim.keymap.set('x', 'gra', '<cmd>lua vim.lsp.buf.range_code_action()<cr>') | |
vim.keymap.set('n', 'gl', '<cmd>lua vim.diagnostic.open_float()<cr>') | |
-- CopilotChat | |
vim.keymap.set('n', '<leader>cc', ':CopilotChatToggle<CR>', opt) | |
-- Indent with Tab | |
vim.keymap.set('v', '<Tab>', '>gv', opt) | |
vim.keymap.set('v', '<S-Tab>', '<gv', opt) | |
vim.keymap.set('n', '<Tab>', '><Space>', opt) | |
vim.keymap.set('n', '<S-Tab>', '<<Space>', opt) | |
-- Move block | |
vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv") | |
vim.keymap.set("v", "K", ":m '<-2<CR>gv=gv") | |
-- Replace All | |
vim.keymap.set("n", "<leader>ra", [[:%s/\<<C-r><C-w>\>/<C-r><C-w>/gI<Left><Left><Left>]]) | |
--Zen mode | |
vim.keymap.set('n', '<leader>z', '<cmd>ZenMode<cr>') | |
-- MEMO COMMANDS | |
-- :%s/"/'/g to replace all " by ' | |
-- Corriger une faute d’orthographe z= |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment