Last active
April 30, 2022 21:42
-
-
Save philmein23/cdc757b74fe3fc908a219b7f331b82c8 to your computer and use it in GitHub Desktop.
Nvim Configuration
This file contains 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
-- Install packer | |
local install_path = vim.fn.stdpath 'data' .. '/site/pack/packer/start/packer.nvim' | |
if vim.fn.empty(vim.fn.glob(install_path)) > 0 then | |
vim.fn.execute('!git clone https://github.com/wbthomason/packer.nvim ' .. install_path) | |
end | |
local packer_group = vim.api.nvim_create_augroup('Packer', { clear = true }) | |
vim.api.nvim_create_autocmd('BufWritePost', { command = 'source <afile> | PackerCompile', group = packer_group, pattern = 'init.lua' }) | |
require('packer').startup(function(use) | |
use 'wbthomason/packer.nvim' -- Package manager | |
use 'tpope/vim-fugitive' -- Git commands in nvim | |
use 'tpope/vim-rhubarb' -- Fugitive-companion to interact with github | |
use 'numToStr/Comment.nvim' -- "gc" to comment visual regions/lines | |
use 'ludovicchabant/vim-gutentags' -- Automatic tags management | |
use 'christoomey/vim-tmux-navigator' | |
-- UI to select things (files, grep results, open buffers...) | |
use { 'nvim-telescope/telescope.nvim', requires = { 'nvim-lua/plenary.nvim', 'nvim-telescope/telescope-live-grep-raw.nvim' } } | |
use { 'nvim-telescope/telescope-fzf-native.nvim', run = 'make' } | |
use 'mjlbach/onedark.nvim' -- Theme inspired by Atom | |
use 'nvim-lualine/lualine.nvim' -- Fancier statusline | |
use 'Julpikar/night-owl.nvim' | |
-- Add indentation guides even on blank lines | |
use 'lukas-reineke/indent-blankline.nvim' | |
-- Add git related info in the signs columns and popups | |
use { 'lewis6991/gitsigns.nvim', requires = { 'nvim-lua/plenary.nvim' } } | |
-- Highlight, edit, and navigate code using a fast incremental parsing library | |
use 'nvim-treesitter/nvim-treesitter' | |
-- Additional textobjects for treesitter | |
use 'nvim-treesitter/nvim-treesitter-textobjects' | |
use 'neovim/nvim-lspconfig' -- Collection of configurations for built-in LSP client | |
use 'hrsh7th/nvim-cmp' -- Autocompletion plugin | |
use 'hrsh7th/cmp-nvim-lsp' | |
use 'saadparwaiz1/cmp_luasnip' | |
use 'L3MON4D3/LuaSnip' -- Snippets plugin | |
-- Better clipboard support | |
use 'christoomey/vim-system-copy' | |
use 'tamago324/lir.nvim' | |
end) | |
--Set highlight on search | |
vim.o.hlsearch = false | |
-- Make relative number default | |
vim.wo.relativenumber = true | |
--Make line numbers default | |
vim.wo.number = true | |
--Enable mouse mode | |
vim.o.mouse = 'a' | |
--Enable break indent | |
vim.o.breakindent = true | |
--Save undo history | |
vim.opt.undofile = true | |
--Case insensitive searching UNLESS /C or capital in search | |
vim.o.ignorecase = true | |
vim.o.smartcase = true | |
--Decrease update time | |
vim.o.updatetime = 250 | |
vim.wo.signcolumn = 'yes' | |
--Set colorscheme | |
vim.o.termguicolors = true | |
vim.cmd [[colorscheme night-owl]] | |
-- Set completeopt to have a better completion experience | |
vim.o.completeopt = 'menuone,noselect' | |
--Set statusbar | |
require('lualine').setup { | |
options = { | |
icons_enabled = false, | |
theme = 'palenight', | |
component_separators = '|', | |
section_separators = '', | |
}, | |
} | |
--Enable Comment.nvim | |
require('Comment').setup() | |
--Remap space as leader key | |
vim.keymap.set({ 'n', 'v' }, '<Space>', '<Nop>', { silent = true }) | |
vim.g.mapleader = ' ' | |
vim.g.maplocalleader = ' ' | |
-- Save | |
vim.keymap.set('n', '<leader>w', ':wa <CR>') | |
--Remap for dealing with word wrap | |
vim.keymap.set('n', 'k', "v:count == 0 ? 'gk' : 'k'", { expr = true, silent = true }) | |
vim.keymap.set('n', 'j', "v:count == 0 ? 'gj' : 'j'", { expr = true, silent = true }) | |
-- Sync up plugins using Packer | |
vim.keymap.set('n', '<leader>u', ':PackerSync<CR>') | |
-- Highlight on yank | |
local highlight_group = vim.api.nvim_create_augroup('YankHighlight', { clear = true }) | |
vim.api.nvim_create_autocmd('TextYankPost', { | |
callback = function() | |
vim.highlight.on_yank() | |
end, | |
group = highlight_group, | |
pattern = '*', | |
}) | |
-- Indent blankline | |
require('indent_blankline').setup { | |
char = '┊', | |
show_trailing_blankline_indent = false, | |
} | |
-- Gitsigns | |
require('gitsigns').setup { | |
signs = { | |
add = { text = '+' }, | |
change = { text = '~' }, | |
delete = { text = '_' }, | |
topdelete = { text = '‾' }, | |
changedelete = { text = '~' }, | |
}, | |
} | |
local dropdown = function(title, previewer) | |
return { | |
prompt_title = title, | |
previewer = previewer or false, | |
theme = 'dropdown' | |
} | |
end | |
-- Telescope | |
require('telescope').setup { | |
defaults = { | |
mappings = { | |
i = { | |
['<C-u>'] = false, | |
['<C-d>'] = false, | |
}, | |
}, | |
}, | |
pickers = { | |
find_files = dropdown() | |
} | |
} | |
-- Enable telescope fzf native | |
require('telescope').load_extension('fzf') | |
require('telescope').load_extension('live_grep_raw') | |
--Add leader shortcuts | |
vim.keymap.set('n', '<leader><space>', require('telescope.builtin').buffers) | |
vim.keymap.set('n', '<leader>ff', function() | |
require('telescope.builtin').find_files { previewer = false } | |
end) | |
vim.keymap.set('n', '<leader>fb', require('telescope.builtin').current_buffer_fuzzy_find) | |
vim.keymap.set('n', '<leader>fh', require('telescope.builtin').help_tags) | |
vim.keymap.set('n', '<leader>ft', require('telescope.builtin').tags) | |
vim.keymap.set('n', '<leader>fw', require('telescope.builtin').grep_string) | |
vim.keymap.set('n', '<leader>fp', require('telescope.builtin').live_grep) | |
vim.keymap.set('n', '<leader>fo', function() | |
require('telescope.builtin').tags { only_current_buffer = true } | |
end) | |
vim.keymap.set('n', '<leader>?', require('telescope.builtin').oldfiles) | |
-- Treesitter configuration | |
-- Parsers must be installed manually via :TSInstall | |
require('nvim-treesitter.configs').setup { | |
highlight = { | |
enable = true, -- false will disable the whole extension | |
}, | |
incremental_selection = { | |
enable = true, | |
keymaps = { | |
init_selection = 'gnn', | |
node_incremental = 'grn', | |
scope_incremental = 'grc', | |
node_decremental = 'grm', | |
}, | |
}, | |
indent = { | |
enable = true, | |
}, | |
textobjects = { | |
select = { | |
enable = true, | |
lookahead = true, -- Automatically jump forward to textobj, similar to targets.vim | |
keymaps = { | |
-- You can use the capture groups defined in textobjects.scm | |
['af'] = '@function.outer', | |
['if'] = '@function.inner', | |
['ac'] = '@class.outer', | |
['ic'] = '@class.inner', | |
}, | |
}, | |
move = { | |
enable = true, | |
set_jumps = true, -- whether to set jumps in the jumplist | |
goto_next_start = { | |
[']m'] = '@function.outer', | |
[']]'] = '@class.outer', | |
}, | |
goto_next_end = { | |
[']M'] = '@function.outer', | |
[']['] = '@class.outer', | |
}, | |
goto_previous_start = { | |
['[m'] = '@function.outer', | |
['[['] = '@class.outer', | |
}, | |
goto_previous_end = { | |
['[M'] = '@function.outer', | |
['[]'] = '@class.outer', | |
}, | |
}, | |
}, | |
} | |
-- Diagnostic keymaps | |
vim.keymap.set('n', '<leader>e', vim.diagnostic.open_float) | |
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) | |
vim.keymap.set('n', ']d', vim.diagnostic.goto_next) | |
vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist) | |
-- LSP settings | |
local lspconfig = require 'lspconfig' | |
local on_attach = function(_, bufnr) | |
local opts = { buffer = bufnr } | |
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts) | |
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts) | |
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts) | |
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts) | |
vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, opts) | |
vim.keymap.set('n', '<leader>wa', vim.lsp.buf.add_workspace_folder, opts) | |
vim.keymap.set('n', '<leader>wr', vim.lsp.buf.remove_workspace_folder, opts) | |
vim.keymap.set('n', '<leader>wl', function() | |
vim.inspect(vim.lsp.buf.list_workspace_folders()) | |
end, opts) | |
vim.keymap.set('n', '<leader>D', vim.lsp.buf.type_definition, opts) | |
vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, opts) | |
vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts) | |
vim.keymap.set('n', '<leader>ca', vim.lsp.buf.code_action, opts) | |
vim.keymap.set('n', '<leader>so', require('telescope.builtin').lsp_document_symbols, opts) | |
vim.api.nvim_create_user_command("Format", vim.lsp.buf.formatting, {}) | |
end | |
-- nvim-cmp supports additional completion capabilities | |
local capabilities = vim.lsp.protocol.make_client_capabilities() | |
capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities) | |
-- Enable the following language servers | |
local servers = { 'clangd', 'rust_analyzer', 'pyright', 'tsserver' } | |
for _, lsp in ipairs(servers) do | |
lspconfig[lsp].setup { | |
on_attach = on_attach, | |
capabilities = capabilities, | |
} | |
end | |
-- Example custom server | |
-- Make runtime files discoverable to the server | |
local runtime_path = vim.split(package.path, ';') | |
table.insert(runtime_path, 'lua/?.lua') | |
table.insert(runtime_path, 'lua/?/init.lua') | |
lspconfig.sumneko_lua.setup { | |
on_attach = on_attach, | |
capabilities = capabilities, | |
settings = { | |
Lua = { | |
runtime = { | |
-- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim) | |
version = 'LuaJIT', | |
-- Setup your lua path | |
path = runtime_path, | |
}, | |
diagnostics = { | |
-- Get the language server to recognize the `vim` global | |
globals = { 'vim' }, | |
}, | |
workspace = { | |
-- Make the server aware of Neovim runtime files | |
library = vim.api.nvim_get_runtime_file('', true), | |
}, | |
-- Do not send telemetry data containing a randomized but unique identifier | |
telemetry = { | |
enable = false, | |
}, | |
}, | |
}, | |
} | |
-- luasnip setup | |
local luasnip = require 'luasnip' | |
-- nvim-cmp setup | |
local cmp = require 'cmp' | |
cmp.setup { | |
snippet = { | |
expand = function(args) | |
luasnip.lsp_expand(args.body) | |
end, | |
}, | |
mapping = cmp.mapping.preset.insert({ | |
['<C-d>'] = cmp.mapping.scroll_docs(-4), | |
['<C-f>'] = cmp.mapping.scroll_docs(4), | |
['<C-Space>'] = cmp.mapping.complete(), | |
['<CR>'] = cmp.mapping.confirm { | |
behavior = cmp.ConfirmBehavior.Replace, | |
select = true, | |
}, | |
['<Tab>'] = cmp.mapping(function(fallback) | |
if cmp.visible() then | |
cmp.select_next_item() | |
elseif luasnip.expand_or_jumpable() then | |
luasnip.expand_or_jump() | |
else | |
fallback() | |
end | |
end, { 'i', 's' }), | |
['<S-Tab>'] = cmp.mapping(function(fallback) | |
if cmp.visible() then | |
cmp.select_prev_item() | |
elseif luasnip.jumpable(-1) then | |
luasnip.jump(-1) | |
else | |
fallback() | |
end | |
end, { 'i', 's' }), | |
}), | |
sources = { | |
{ name = 'nvim_lsp' }, | |
{ name = 'luasnip' }, | |
}, | |
} | |
-- vim: ts=2 sts=2 sw=2 et | |
local actions = require('lir.actions') | |
local marks = require('lir.mark.actions') | |
local clipboard = require('lir.clipboard.actions') | |
local on_init = function() | |
local bind = vim.keymap.set | |
local noremap = {remap = false, silent = true, buffer = true} | |
local remap = {remap = true, silent = true, buffer = true} | |
local mark = ":<C-u>lua require('lir.mark.actions').toggle_mark('v')<CR>gv<C-c>" | |
bind('n', 'v', 'V', noremap) | |
bind('x', 'q', '<Esc>', noremap) | |
bind('x', '<Tab>', mark, noremap) | |
bind('x', 'cc', mark .. 'cc', remap) | |
bind('x', 'cx', mark .. 'cx', remap) | |
bind('n', '<S-Tab>', 'gv<Tab>', remap) | |
end | |
local lir = require('lir') | |
lir.setup({ | |
on_init = on_init, | |
mappings = { | |
['l'] = actions.edit, | |
['es'] = actions.split, | |
['ev'] = actions.vsplit, | |
['et'] = actions.tabedit, | |
['h'] = actions.up, | |
['q'] = actions.quit, | |
['.'] = actions.toggle_show_hidden, | |
['i'] = actions.newfile, | |
['o'] = actions.mkdir, | |
['r'] = actions.rename, | |
['d'] = actions.delete, | |
['Y'] = actions.yank_path, | |
['<Tab>'] = marks.toggle_mark, | |
['cc'] = clipboard.copy, | |
['cx'] = clipboard.cut, | |
['cv'] = clipboard.paste, | |
}, | |
float = { | |
winblend = 0, | |
win_opts = function() | |
return { | |
border = 'single' | |
} | |
end | |
} | |
}) | |
local file_explorer = function(cwd) | |
if vim.o.lines > 17 then | |
require('lir.float').toggle(cwd) | |
else | |
vim.cmd('edit ' .. (cwd or vim.fn.expand('%:p:h'))) | |
end | |
end | |
vim.keymap.set('n', '<leader>dd', file_explorer) | |
vim.keymap.set('n', '<leader>da', function() file_explorer(vim.fn.getcwd())end) | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment