Last active
April 12, 2023 05:41
-
-
Save amitavaghosh1/a621b4bc63dd79ee12c40467a44c3887 to your computer and use it in GitHub Desktop.
init.lua for neovim 0.8+, with packer and treesitter and lsp (autocomplete)
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
let g:python3_host_prog = '/usr/bin/python3' | |
let g:python_host_prog = '/usr/bin/python3' | |
let g:node_host_prog = '/Users/amitava.ghosh/.nvm/versions/node/v17.1.0/bin/node' | |
" Required: | |
filetype plugin indent on | |
"***************************************************************************** | |
"" Basic Setup | |
"*****************************************************************************" | |
"" Encoding | |
set updatetime=200 | |
set encoding=utf-8 | |
set fileencoding=utf-8 | |
set fileencodings=utf-8 | |
set ttyfast | |
set nrformats+=alpha | |
"spell check | |
set nospell | |
let g:enable_spelunker_vim = 1 | |
let g:spelunker_target_min_char_len = 4 | |
let g:spelunker_check_type = 2 | |
"" Fix backspace indent | |
set backspace=indent,eol,start | |
set nobackup nowritebackup | |
"" Tabs. May be overridden by autocmd rules | |
set tabstop=4 | |
set softtabstop=0 | |
set shiftwidth=4 | |
set expandtab | |
"" Enable hidden buffers | |
set hidden | |
"" Searching | |
set hlsearch | |
set incsearch | |
set ignorecase | |
set smartcase | |
set fileformats=unix,dos,mac | |
if exists('$SHELL') | |
set shell=$SHELL | |
else | |
set shell=/bin/sh | |
endif | |
" session management | |
let g:session_directory = "~/./session" | |
let g:session_autoload = "no" | |
let g:session_autosave = "no" | |
let g:session_command_aliases = 1 | |
syntax on | |
set ruler | |
set relativenumber | |
set noswapfile | |
set foldmethod=syntax | |
set mouse=a | |
set foldmethod=indent | |
set foldlevel=5 | |
set nofoldenable | |
set guioptions=egmrti | |
" Search mappings: These will make it so that going to the next one in a | |
" search will center on the line it's found in. | |
nnoremap n nzzzv | |
nnoremap N Nzzzv | |
"***************************************************************************** | |
"" Abbreviations | |
"***************************************************************************** | |
"" no one is really happy until you have this shortcuts | |
cnoreabbrev W! w! | |
cnoreabbrev Q! q! | |
cnoreabbrev Qall! qall! | |
cnoreabbrev Wq wq | |
cnoreabbrev Wa wa | |
cnoreabbrev Qa qa | |
cnoreabbrev Wqa wqa | |
cnoreabbrev wQ wq | |
cnoreabbrev WQ wq | |
cnoreabbrev W w | |
cnoreabbrev Q q | |
cnoreabbrev Qall qall | |
" terminal emulation | |
nnoremap <silent> <leader>sh :terminal<CR> | |
"***************************************************************************** | |
"" Commands | |
"***************************************************************************** | |
" remove trailing whitespaces | |
command! FixWhitespace :%s/\s\+$//e | |
"***************************************************************************** | |
"" Functions | |
"***************************************************************************** | |
if !exists('*s:setupWrapping') | |
function s:setupWrapping() | |
set wrap | |
set wm=2 | |
set textwidth=79 | |
endfunction | |
endif | |
"***************************************************************************** | |
"" Autocmd Rules | |
"***************************************************************************** | |
"" The PC is fast enough, do syntax highlight syncing from start unless 200 lines | |
augroup vimrc-sync-fromstart | |
autocmd! | |
autocmd BufEnter * :syntax sync maxlines=200 | |
augroup END | |
"" Remember cursor position | |
augroup vimrc-remember-cursor-position | |
autocmd! | |
autocmd BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g`\"" | endif | |
augroup END | |
"" txt | |
augroup vimrc-wrapping | |
autocmd! | |
autocmd BufRead,BufNewFile *.txt call s:setupWrapping() | |
augroup END | |
"" make/cmake | |
augroup vimrc-make-cmake | |
autocmd! | |
autocmd FileType make setlocal noexpandtab | |
autocmd BufNewFile,BufRead CMakeLists.txt setlocal filetype=cmake | |
augroup END | |
set autoread | |
"***************************************************************************** | |
"" Mappings | |
"***************************************************************************** | |
"" Split | |
noremap <Leader>h :<C-u>split<CR> | |
noremap <Leader>v :<C-u>vsplit<CR> | |
"" Tabs | |
nnoremap <Tab> gt | |
nnoremap <S-Tab> gT | |
nnoremap <silent> <S-t> :tabnew<CR> | |
nnoremap <leader><leader> gt | |
"" Set working directory | |
nnoremap <leader>. :lcd %:p:h<CR> | |
"" Opens an edit command with the path of the currently edited file filled in | |
" noremap <Leader>e :e <C-R>=expand("%:p:h") . "/" <CR> | |
"" Opens a tab edit command with the path of the currently edited file filled | |
noremap <Leader>te :tabe <C-R>=expand("%:p:h") . "/" <CR> | |
"" fzf.vim | |
set wildmode=list:longest,list:full | |
set wildignore+=*.o,*.obj,.git,*.rbc,*.pyc,__pycache__ | |
"" Copy/Paste/Cut | |
if has('unnamedplus') | |
set clipboard=unnamed,unnamedplus | |
endif | |
noremap YY "+y<CR> | |
noremap <leader>p "+gP<CR> | |
noremap XX "+x<CR> | |
if has('macunix') | |
" pbcopy for OSX copy/paste | |
vmap <C-x> :!pbcopy<CR> | |
vmap <C-c> :w !pbcopy<CR><CR> | |
endif | |
"" Buffer nav | |
noremap <leader>z :bp<CR> | |
noremap <leader>q :bp<CR> | |
noremap <leader>x :bn<CR> | |
noremap <leader>w :bn<CR> | |
"" Close buffer | |
noremap <leader>c :bd<CR> | |
"" Clean search (highlight) | |
nnoremap <silent> <leader><space> :noh<cr> | |
"" Switching windows | |
noremap <C-j> <C-w>j | |
noremap <C-k> <C-w>k | |
noremap <C-l> <C-w>l | |
noremap <C-h> <C-w>h | |
"" Vmap for maintain Visual Mode after shifting > and < | |
vmap < <gv | |
vmap > >gv | |
"" Move visual block | |
vnoremap J :m '>+1<CR>gv=gv | |
vnoremap K :m '<-2<CR>gv=gv | |
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
-- Install packer | |
local install_path = vim.fn.stdpath 'data' .. '/site/pack/packer/start/packer.nvim' | |
local is_bootstrap = false | |
if vim.fn.empty(vim.fn.glob(install_path)) > 0 then | |
is_bootstrap = true | |
vim.fn.system { 'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path } | |
vim.cmd [[packadd packer.nvim]] | |
end | |
require('packer').startup(function(use) | |
-- Package manager | |
use 'wbthomason/packer.nvim' | |
use { -- LSP Configuration & Plugins | |
'neovim/nvim-lspconfig', | |
requires = { | |
-- Automatically install LSPs to stdpath for neovim | |
'williamboman/mason.nvim', | |
'williamboman/mason-lspconfig.nvim', | |
-- Useful status updates for LSP | |
'j-hui/fidget.nvim', | |
-- Additional lua configuration, makes nvim stuff amazing | |
'folke/neodev.nvim', | |
}, | |
} | |
use 'nvim-lua/lsp-status.nvim' | |
use { -- Autocompletion | |
'hrsh7th/nvim-cmp', | |
requires = { 'hrsh7th/cmp-nvim-lsp', 'L3MON4D3/LuaSnip', 'saadparwaiz1/cmp_luasnip' }, | |
} | |
use { -- Highlight, edit, and navigate code | |
'nvim-treesitter/nvim-treesitter', | |
run = function() | |
pcall(require('nvim-treesitter.install').update { with_sync = true }) | |
end, | |
} | |
use { -- Additional text objects via treesitter | |
'nvim-treesitter/nvim-treesitter-textobjects', | |
after = 'nvim-treesitter', | |
} | |
use { | |
'nvim-tree/nvim-tree.lua', | |
requires = { 'nvim-tree/nvim-web-devicons' } | |
} | |
-- Git related plugins | |
use 'tpope/vim-fugitive' | |
use 'tpope/vim-rhubarb' | |
use 'lewis6991/gitsigns.nvim' | |
use 'navarasu/onedark.nvim' -- Theme inspired by Atom | |
use 'nvim-lualine/lualine.nvim' -- Fancier statusline | |
use 'lukas-reineke/indent-blankline.nvim' -- Add indentation guides even on blank lines | |
use 'numToStr/Comment.nvim' -- "gc" to comment visual regions/lines | |
use 'tpope/vim-sleuth' -- Detect tabstop and shiftwidth automatically | |
use 'tpope/vim-surround' -- surround with stuff | |
use 'Raimondi/delimitMate' | |
-- auto pairs | |
use { | |
"windwp/nvim-autopairs", | |
config = function() | |
local npairs = require("nvim-autopairs") | |
npairs.setup({ | |
check_ts = true, | |
enable_check_bracket_line = false, | |
fast_wrap = {}, | |
}) | |
local cmp_autopairs = require('nvim-autopairs.completion.cmp') | |
local cmp = require('cmp') | |
cmp.event:on( | |
'confirm_done', | |
cmp_autopairs.on_confirm_done() | |
) | |
end | |
} | |
--- telescope search results pretify | |
use { | |
"folke/trouble.nvim", | |
requires = "kyazdani42/nvim-web-devicons", | |
config = function() | |
require("trouble").setup { | |
-- your configuration comes here | |
-- or leave it empty to use the default settings | |
-- refer to the configuration section below | |
} | |
end | |
} | |
use 'frazrepo/vim-rainbow' | |
use 'kamykn/spelunker.vim' | |
-- Fuzzy Finder (files, lsp, etc) | |
use { 'nvim-telescope/telescope.nvim', branch = '0.1.x', requires = { 'nvim-lua/plenary.nvim' } } | |
-- Fuzzy Finder Algorithm which requires local dependencies to be built. Only load if `make` is available | |
use { 'nvim-telescope/telescope-fzf-native.nvim', run = 'make', cond = vim.fn.executable 'make' == 1 } | |
use { | |
'yuttie/comfortable-motion.vim', | |
} | |
use { | |
'phaazon/hop.nvim', | |
branch = 'v2' -- optional but strongly recommended | |
} | |
use { "akinsho/toggleterm.nvim", tag = '*', config = function() | |
require("toggleterm").setup() | |
end } | |
use 'simrat39/rust-tools.nvim' | |
-- Debugging | |
use 'nvim-lua/plenary.nvim' | |
use 'mfussenegger/nvim-dap' | |
-- Add custom plugins to packer from ~/.config/nvim/lua/custom/plugins.lua | |
local has_plugins, plugins = pcall(require, 'custom.plugins') | |
if has_plugins then | |
plugins(use) | |
end | |
if is_bootstrap then | |
require('packer').sync() | |
end | |
end) | |
-- When we are bootstrapping a configuration, it doesn't | |
-- make sense to execute the rest of the init.lua. | |
-- | |
-- You'll need to restart nvim, and then it will work. | |
if is_bootstrap then | |
print '==================================' | |
print ' Plugins are being installed' | |
print ' Wait until Packer completes,' | |
print ' then restart nvim' | |
print '==================================' | |
return | |
end | |
-- Automatically source and re-compile packer whenever you save this init.lua | |
local packer_group = vim.api.nvim_create_augroup('Packer', { clear = true }) | |
vim.api.nvim_create_autocmd('BufWritePost', { | |
command = 'source <afile> | silent! LspStop | silent! LspStart | PackerCompile', | |
group = packer_group, | |
pattern = vim.fn.expand '$MYVIMRC', | |
}) | |
local function map(mode, lhs, rhs, opts) | |
local options = { noremap = true } | |
if opts then | |
options = vim.tbl_extend("force", options, opts) | |
end | |
vim.api.nvim_set_keymap(mode, lhs, rhs, options) | |
end | |
-- [[ Setting options ]] | |
-- See `:help vim.o` | |
vim.opt.guifont = { "Mona Sans Regular", "h15" } | |
-- Set highlight on search | |
vim.o.hlsearch = false | |
-- 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.o.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 onedark]] | |
-- Set completeopt to have a better completion experience | |
vim.o.completeopt = 'menuone,noselect' | |
-- [[ Basic Keymaps ]] | |
-- Set <space> as the leader key | |
-- See `:help mapleader` | |
-- NOTE: Must happen before plugins are required (otherwise wrong leader will be used) | |
vim.g.mapleader = ',' | |
vim.g.maplocalleader = ',' | |
-- Keymaps for better default experience | |
-- See `:help vim.keymap.set()` | |
vim.keymap.set({ 'n', 'v' }, '<Space>', '<Nop>', { silent = true }) | |
-- 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 }) | |
-- [[ Comfortable motion ]] | |
-- | |
vim.g.comfortable_motion_scroll_down_key = "j" | |
vim.g.comfortable_motion_scroll_up_key = "k" | |
vim.g.comfortable_motion_no_default_key_mappings = 1 | |
map('n', '<S-Up>', ':call comfortable_motion#flick(-50)<CR>', { silent = true }) | |
map('n', '<S-Down>', ':call comfortable_motion#flick(50)<CR>', { silent = true }) | |
-- [[ Highlight on yank ]] | |
-- See `:help vim.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 = '*', | |
}) | |
-- Set lualine as statusline | |
-- See `:help lualine.txt` | |
require('lualine').setup { | |
options = { | |
icons_enabled = false, | |
theme = 'onedark', | |
component_separators = '|', | |
section_separators = '', | |
}, | |
} | |
-- Enable Comment.nvim | |
require('Comment').setup() | |
-- Enable `lukas-reineke/indent-blankline.nvim` | |
-- See `:help indent_blankline.txt` | |
require('indent_blankline').setup { | |
char = '┊', | |
show_trailing_blankline_indent = false, | |
} | |
-- Gitsigns | |
-- See `:help gitsigns.txt` | |
require('gitsigns').setup { | |
signs = { | |
add = { text = '+' }, | |
change = { text = '~' }, | |
delete = { text = '_' }, | |
topdelete = { text = '‾' }, | |
changedelete = { text = '~' }, | |
}, | |
} | |
-- [[ Configure Telescope ]] | |
-- See `:help telescope` and `:help telescope.setup()` | |
require('telescope').setup { | |
defaults = { | |
mappings = { | |
i = { | |
['<C-u>'] = false, | |
['<C-d>'] = false, | |
['<C-k>'] = false, | |
}, | |
}, | |
}, | |
} | |
-- Enable hop for easy motion | |
local hop = require('hop'); | |
local directions = require('hop.hint').HintDirection | |
hop.setup() | |
vim.keymap.set('', 'f', function() | |
hop.hint_char1({ direction = directions.AFTER_CURSOR, current_line_only = true }) | |
end, { remap = true }) | |
vim.keymap.set('', 'F', function() | |
hop.hint_char1({ direction = directions.BEFORE_CURSOR, current_line_only = true }) | |
end, { remap = true }) | |
vim.keymap.set('n', '<leader>fv', hop.hint_vertical, { desc = "[H]op [V]ertical" }) | |
vim.keymap.set('n', '<leader>fl', hop.hint_lines_skip_whitespace, { desc = "[H]op [L]ines" }) | |
vim.keymap.set('n', '<leader>fw', hop.hint_words, { desc = "[H]op [L]ines" }) | |
-- Enable telescope fzf native, if installed | |
pcall(require('telescope').load_extension, 'fzf') | |
-- See `:help telescope.builtin` | |
vim.keymap.set('n', '<leader>?', require('telescope.builtin').oldfiles, { desc = '[?] Find recently opened files' }) | |
vim.keymap.set('n', '<leader><space>', require('telescope.builtin').buffers, { desc = '[ ] Find existing buffers' }) | |
vim.keymap.set('n', '<leader>/', function() | |
-- You can pass additional configuration to telescope to change theme, layout, etc. | |
require('telescope.builtin').current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { | |
winblend = 10, | |
previewer = false, | |
}) | |
end, { desc = '[/] Fuzzily search in current buffer]' }) | |
vim.keymap.set('n', '<leader>sf', require('telescope.builtin').find_files, { desc = '[S]earch [F]iles' }) | |
vim.keymap.set('n', '<leader>sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' }) | |
-- vim.keymap.set('n', '<leader>sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' }) | |
vim.keymap.set('n', '<leader>sg', require('telescope.builtin').live_grep, { desc = '[S]earch by [G]rep' }) | |
vim.keymap.set('n', '<leader>sr', require('telescope.builtin').resume, { desc = '[S]earch [R]esume' }) | |
vim.keymap.set('n', '<leader>sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' }) | |
vim.keymap.set('n', '<leader>sm', ':Telescope lsp_document_symbols ignore_symbols=variable<CR>', | |
{ desc = '[S]earch [M]ethods' }) | |
vim.keymap.set('n', '<leader>ss', ':Telescope lsp_document_symbols<CR>', { desc = '[S]earch [S]ymbols' }) | |
-- [[ Configure Treesitter ]] | |
-- See `:help nvim-treesitter` | |
require('nvim-treesitter.configs').setup { | |
-- Add languages to be installed here that you want installed for treesitter | |
ensure_installed = { 'c', 'cpp', 'go', 'lua', 'python', 'rust', 'typescript', 'help', 'vim' }, | |
autopairs = { | |
enable = true | |
}, | |
highlight = { enable = true }, | |
indent = { enable = true, disable = { 'python' } }, | |
incremental_selection = { | |
enable = true, | |
keymaps = { | |
init_selection = '<c-space>', | |
node_incremental = '<c-space>', | |
scope_incremental = '<c-s>', | |
node_decremental = '<c-backspace>', | |
}, | |
}, | |
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 | |
['aa'] = '@parameter.outer', | |
['ia'] = '@parameter.inner', | |
['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', | |
}, | |
}, | |
swap = { | |
enable = true, | |
swap_next = { | |
['<leader>a'] = '@parameter.inner', | |
}, | |
swap_previous = { | |
['<leader>A'] = '@parameter.inner', | |
}, | |
}, | |
}, | |
} | |
-- nvim-tree for file sidebar | |
require("nvim-tree").setup({ | |
sort_by = "case_sensitive", | |
view = { | |
adaptive_size = true, | |
mappings = { | |
list = { | |
{ key = "u", action = "dir_up" }, | |
}, | |
}, | |
}, | |
renderer = { | |
group_empty = true, | |
}, | |
filters = { | |
dotfiles = true, | |
}, | |
}) | |
vim.keymap.set('n', '<leader>nff', '<cmd>:NvimTreeFindFile<CR>', { desc = '[S]Nvimtree [F]ind [F]ile' }) | |
vim.keymap.set('n', '<leader>nt', require('nvim-tree').toggle, { desc = '[S]Nvimtree [T]Toggle' }) | |
-- Diagnostic keymaps | |
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev) | |
vim.keymap.set('n', ']d', vim.diagnostic.goto_next) | |
vim.keymap.set('n', '<leader>e', vim.diagnostic.open_float) | |
vim.keymap.set('n', '<leader>q', vim.diagnostic.setloclist) | |
-- LSP settings. | |
-- This function gets run when an LSP connects to a particular buffer. | |
local on_attach = function(_, bufnr) | |
-- NOTE: Remember that lua is a real programming language, and as such it is possible | |
-- to define small helper and utility functions so you don't have to repeat yourself | |
-- many times. | |
-- | |
-- In this case, we create a function that lets us more easily define mappings specific | |
-- for LSP related items. It sets the mode, buffer and description for us each time. | |
local nmap = function(keys, func, desc) | |
if desc then | |
desc = 'LSP: ' .. desc | |
end | |
vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) | |
end | |
nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame') | |
nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction') | |
nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') | |
nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') | |
nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation') | |
nmap("<leader>xl", "<cmd>TroubleToggle loclist<cr>") | |
nmap("<leader>xq", "<cmd>TroubleToggle quickfix<cr>") | |
nmap("<leader>xr", "<cmd>TroubleToggle lsp_references<cr>") | |
nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition') | |
nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') | |
nmap('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') | |
-- See `:help K` for why this keymap | |
nmap('K', vim.lsp.buf.hover, 'Hover Documentation') | |
nmap('<C-k>', vim.lsp.buf.signature_help, 'Signature Documentation') | |
-- nvim-tree config | |
-- Lesser used LSP functionality | |
nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') | |
nmap('<leader>wa', vim.lsp.buf.add_workspace_folder, '[W]orkspace [A]dd Folder') | |
nmap('<leader>wr', vim.lsp.buf.remove_workspace_folder, '[W]orkspace [R]emove Folder') | |
nmap('<leader>wl', function() | |
print(vim.inspect(vim.lsp.buf.list_workspace_folders())) | |
end, '[W]orkspace [L]ist Folders') | |
vim.api.nvim_command("au BufWritePost <buffer> lua vim.lsp.buf.format({async = true})") | |
-- Create a command `:Format` local to the LSP buffer | |
vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_) | |
vim.lsp.buf.format() | |
end, { desc = 'Format current buffer with LSP' }) | |
end | |
-- Enable the following language servers | |
-- Feel free to add/remove any LSPs that you want here. They will automatically be installed. | |
-- | |
-- Add any additional override configuration in the following tables. They will be passed to | |
-- the `settings` field of the server config. You must look up that documentation yourself. | |
util = require "lspconfig/util" | |
local servers = { | |
-- clangd = {}, | |
gopls = {}, | |
pyright = {}, | |
tsserver = {}, | |
vimls = {}, | |
-- sumneko_lua = { | |
-- Lua = { | |
-- workspace = { checkThirdParty = false }, | |
-- telemetry = { enable = false }, | |
-- }, | |
-- }, | |
} | |
-- Setup neovim lua configuration | |
require('neodev').setup() | |
-- | |
-- nvim-cmp supports additional completion capabilities, so broadcast that to servers | |
local capabilities = vim.lsp.protocol.make_client_capabilities() | |
capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) | |
-- Setup rust tools | |
require("rust-tools").setup({ | |
tools = { | |
autoSetHints = true, | |
inlay_hints = { | |
show_parameter_hints = true, | |
parameter_hints_prefix = "", | |
other_hints_prefix = "", | |
}, | |
}, | |
server = { | |
settings = { | |
["rust-analyzer"] = servers["rust_analyzer"], | |
} | |
} | |
}) | |
-- Setup mason so it can manage external tooling | |
require('mason').setup() | |
-- Ensure the servers above are installed | |
local mason_lspconfig = require 'mason-lspconfig' | |
mason_lspconfig.setup { | |
ensure_installed = vim.tbl_keys(servers), | |
} | |
mason_lspconfig.setup_handlers { | |
function(server_name) | |
require('lspconfig')[server_name].setup { | |
capabilities = capabilities, | |
on_attach = on_attach, | |
settings = servers[server_name], | |
} | |
end, | |
} | |
require('lspconfig').sumneko_lua.setup({ | |
capabilities = capabilities, | |
on_attach = on_attach, | |
settings = { | |
Lua = { | |
runtime = { | |
version = 'LuaJIT', | |
}, | |
diagnostics = { | |
-- Get the language server to recognize the `vim` global | |
globals = { 'vim' }, | |
}, | |
workspace = { | |
library = vim.api.nvim_get_runtime_file("", true), | |
checkThirdParty = false, | |
}, | |
-- Do not send telemetry data containing a randomized but unique identifier | |
telemetry = { | |
enable = false, | |
}, | |
}, | |
}, | |
}) | |
-- Turn on lsp status information | |
require('fidget').setup() | |
-- nvim-cmp setup | |
local cmp = require 'cmp' | |
local luasnip = require 'luasnip' | |
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' }, | |
}, | |
} | |
-- disable netrw at the very start of your init.lua (strongly advised) | |
vim.g.loaded_netrw = 1 | |
vim.g.loaded_netrwPlugin = 1 | |
-- set termguicolors to enable highlight groups | |
vim.opt.termguicolors = true | |
function go_org_imports(wait_ms) | |
local params = vim.lsp.util.make_range_params() | |
params.context = { only = { "source.organizeImports" } } | |
local result = vim.lsp.buf_request_sync(0, "textDocument/codeAction", params, wait_ms) | |
for cid, res in pairs(result or {}) do | |
for _, r in pairs(res.result or {}) do | |
if r.edit then | |
local enc = (vim.lsp.get_client_by_id(cid) or {}).offset_encoding or "utf-16" | |
vim.lsp.util.apply_workspace_edit(r.edit, enc) | |
end | |
end | |
end | |
end | |
vim.cmd('autocmd BufWritePre *.go :silent! lua go_org_imports(2000)') | |
-- The line beneath this is called `modeline`. See `:help modeline` | |
-- vim: ts=2 sts=2 sw=2 et | |
-- | |
vim.cmd('source ~/.config/nvim/base.mapping.vim') |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Update your neovim to 0.8+ . Open neovim and run :PackerInstall