Skip to content

Instantly share code, notes, and snippets.

@philmein23
Last active April 30, 2022 21:42
Show Gist options
  • Save philmein23/cdc757b74fe3fc908a219b7f331b82c8 to your computer and use it in GitHub Desktop.
Save philmein23/cdc757b74fe3fc908a219b7f331b82c8 to your computer and use it in GitHub Desktop.
Nvim Configuration
-- 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