Skip to content

Instantly share code, notes, and snippets.

@GllmR
Last active April 18, 2024 15:01
Show Gist options
  • Save GllmR/80de5fb8824a758bafdb390e0a471480 to your computer and use it in GitHub Desktop.
Save GllmR/80de5fb8824a758bafdb390e0a471480 to your computer and use it in GitHub Desktop.
One file Neovim configuration
---@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.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.loader.enable()
vim.api.nvim_create_autocmd('TextYankPost', {
callback = function() vim.highlight.on_yank() 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
{'ellisonleao/gruvbox.nvim'},
{'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'},
{'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-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",
},
-- CodeSnap
{"mistricky/codesnap.nvim", build = "make"},
-- MarkdownPreview
{
'iamcco/markdown-preview.nvim',
ft = 'markdown',
build = function()
vim.fn['mkdp#util#install']()
end,
}
})
--------------------
-- 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'
}
})
---
-- 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',
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({
ensure_installed = {
'tsserver',
'eslint'
}
})
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
---
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 = 'float',
border = 'rounded'
}
})
---
-- THEME
---
vim.g.gruvbox_baby_use_original_palette = true
vim.cmd('colorscheme gruvbox')
-- 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>')
-- bufmap('n', '<F2>', '<cmd>lua vim.lsp.buf.rename()<cr>')
-- bufmap('n', '<F3>', '<cmd>lua vim.lsp.buf.format({async = true})<cr>')
-- bufmap('n', '<F4>', '<cmd>lua vim.lsp.buf.code_action()<cr>')
-- bufmap('x', '<F4>', '<cmd>lua vim.lsp.buf.range_code_action()<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 un faute d’orthographe z=
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment