diff --git a/config/neovim/init.lua b/config/neovim/init.lua index 6e541b5..dca8fd1 100644 --- a/config/neovim/init.lua +++ b/config/neovim/init.lua @@ -2,65 +2,54 @@ -- git clone --filter=blob:none https://github.com/folke/lazy.nvim.git --branch=stable \ -- ~/.local/share/nvim/lazy/lazy.nvim --- NOTE: if vscode-neovim is active, exit early for stock behavior. if vim.g.vscode then return end --- aliases -local o = vim.o -local c = vim.cmd -local map = vim.api.nvim_set_keymap - --- leader keys vim.g.mapleader = ' ' vim.g.maplocalleader = ' ' --- options -o.termguicolors = true -o.mouse = 'a' -o.smartindent = true -o.wrap = false -o.relativenumber = true -o.tabstop = 4 -o.shiftwidth = 4 -o.expandtab = true +local opt = vim.opt +opt.termguicolors = true +opt.mouse = 'a' +opt.smartindent = true +opt.wrap = false +opt.relativenumber = true +opt.tabstop = 4 +opt.shiftwidth = 4 +opt.expandtab = true --- Prefer LSP semantic tokens over treesitter captures when both exist. vim.hl.priorities.semantic_tokens = 140 vim.hl.priorities.treesitter = 100 --- ensure .svelte files are detected correctly -vim.filetype.add({ - extension = { - svelte = 'svelte', - }, -}) +vim.filetype.add({ extension = { svelte = 'svelte' } }) +vim.api.nvim_create_autocmd('FileType', { pattern = 'markdown', command = 'setlocal wrap' }) --- set wrap if markdown file -vim.cmd('autocmd FileType markdown setlocal wrap') +local function map(mode, lhs, rhs) + vim.keymap.set(mode, lhs, rhs, { silent = true }) +end --- keybinds -map('n', '', ':NvimTreeToggle', { silent = true }) +for _, m in ipairs({ + { 'n', '', 'NvimTreeToggle' }, + { 'n', '', 'ToggleTerm direction="float"' }, + { 't', '', 'ToggleTerm' }, + { 'n', 'gs', 'Telescope git_status' }, + { 'n', 'gc', 'Telescope git_commits' }, + { 'n', ':', 'Telescope commands' }, + { 'n', '', 'Telescope find_files' }, + { 'n', 'f', 'Telescope grep_string' }, + { 'n', 'b', 'Telescope buffers' }, + { 'n', 'B', 'Telescope buffers' }, + { 'n', 'e', vim.diagnostic.open_float }, + { 'n', '\\', vim.lsp.buf.hover }, + { 'n', '', 'GitGutterPrevHunk' }, + { 'n', '', 'GitGutterNextHunk' }, + { 'n', '', 'bp' }, + { 'n', '', 'bn' }, +}) do + map(m[1], m[2], m[3]) +end -map('n', '', ':ToggleTerm direction="float"', { silent = true }) -map('t', '', ':ToggleTerm', { silent = true }) - -map('n', 'gs', ':Telescope git_status', { silent = true }) -map('n', 'gc', ':Telescope git_commits', { silent = true }) -map('n', ':', ':Telescope commands', { silent = true }) -map('n', '', ':Telescope find_files', { silent = true }) -map('n', 'f', ':Telescope grep_string', { silent = true }) -map('n', 'e', 'lua vim.diagnostic.open_float()', { silent = true }) - -map('n', '', ':GitGutterPrevHunk', { silent = true }) -map('n', '', ':GitGutterNextHunk', { silent = true }) - --- buffer management -map('n', '', ':bp', { silent = true }) -map('n', '', ':bn', { silent = true }) - --- lazy.nvim bootstrap local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim' if not vim.loop.fs_stat(lazypath) then vim.fn.system({ @@ -80,64 +69,61 @@ require('lazy').setup({ name = 'vscode', priority = 1000, lazy = false, - config = function() - require('vscode').setup({ - transparent = true, - }) - end, + config = function() require('vscode').setup({ transparent = true }) end, }, { 'airblade/vim-gitgutter' }, { 'nvim-lualine/lualine.nvim', dependencies = { 'nvim-tree/nvim-web-devicons' }, - config = function() - require('lualine').setup({ - options = { - theme = 'vscode', - globalstatus = true, - }, - }) - end, + config = function() require('lualine').setup({ options = { theme = 'vscode', globalstatus = true } }) end, }, { 'nvim-treesitter/nvim-treesitter', build = ':TSUpdate', config = function() - local treesitter = require('nvim-treesitter') local wanted = { 'svelte', 'javascript', 'typescript', 'html', 'css' } - treesitter.setup({}) + local ts_runtime = vim.fn.stdpath('data') .. '/lazy/nvim-treesitter/runtime' + if vim.loop.fs_stat(ts_runtime) then + vim.opt.rtp:append(ts_runtime) + end + require('nvim-treesitter').setup({ install_dir = vim.fn.stdpath('data') .. '/site' }) vim.api.nvim_create_autocmd('FileType', { pattern = wanted, - callback = function() - pcall(vim.treesitter.start) - end, + callback = function() pcall(vim.treesitter.start) end, }) end, }, { 'neovim/nvim-lspconfig', config = function() - local capabilities = require('cmp_nvim_lsp').default_capabilities() + local capabilities = vim.tbl_deep_extend( + 'force', + vim.lsp.protocol.make_client_capabilities(), + require('cmp_nvim_lsp').default_capabilities() + ) - vim.lsp.config('pyright', { capabilities = capabilities }) - vim.lsp.config('ts_ls', { capabilities = capabilities }) - vim.lsp.config('svelte', { capabilities = capabilities }) - vim.lsp.config('rust_analyzer', { capabilities = capabilities }) + local function on_attach(client, bufnr) + if client.server_capabilities.semanticTokensProvider then + vim.lsp.semantic_tokens.start(bufnr, client.id) + end + end - vim.lsp.enable('pyright') - vim.lsp.enable('ts_ls') - vim.lsp.enable('svelte') - vim.lsp.enable('rust_analyzer') + local defaults = { + capabilities = capabilities, + on_attach = on_attach, + } + local servers = { + basedpyright = {}, + ts_ls = {}, + svelte = {}, + rust_analyzer = {}, + } - vim.api.nvim_create_autocmd('LspAttach', { - callback = function(args) - local client = vim.lsp.get_client_by_id(args.data.client_id) - if client and client.server_capabilities.semanticTokensProvider then - vim.lsp.semantic_tokens.start(args.buf, client.id) - end - end, - }) + for server, opts in pairs(servers) do + vim.lsp.config(server, vim.tbl_deep_extend('force', defaults, opts)) + vim.lsp.enable(server) + end end, }, { 'hrsh7th/cmp-nvim-lsp' }, @@ -147,35 +133,69 @@ require('lazy').setup({ config = function() local cmp = require('cmp') cmp.setup({ - sources = { - { name = 'nvim_lsp' }, + mapping = { + [''] = cmp.mapping(function() + if cmp.visible() then + cmp.select_next_item({ behavior = cmp.SelectBehavior.Select }) + else + cmp.complete() + end + end, { 'i', 's' }), + [''] = cmp.mapping(function() + if cmp.visible() then + cmp.select_prev_item({ behavior = cmp.SelectBehavior.Select }) + end + end, { 'i', 's' }), + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.confirm({ select = true }) + else + fallback() + end + end, { 'i', 's' }), }, + sources = { { name = 'nvim_lsp' } }, }) end, }, { 'nvim-tree/nvim-tree.lua', dependencies = { 'nvim-tree/nvim-web-devicons' }, - config = function() - require('nvim-tree').setup({ view = { width = 42 } }) - end, + config = function() require('nvim-tree').setup({ view = { width = 42 } }) end, }, { 'nvim-telescope/telescope.nvim', - dependencies = { 'nvim-lua/plenary.nvim' }, + dependencies = { 'nvim-lua/plenary.nvim', 'nvim-telescope/telescope-fzf-native.nvim' }, + config = function() + local actions = require('telescope.actions') + require('telescope').setup({ + defaults = { + mappings = { + i = { + [''] = actions.close, + }, + }, + }, + extensions = { + fzf = { + fuzzy = true, + override_generic_sorter = true, + override_file_sorter = true, + case_mode = 'smart_case', + }, + }, + }) + require('telescope').load_extension('fzf') + end, }, + { 'nvim-telescope/telescope-fzf-native.nvim', build = 'make' }, { 'akinsho/toggleterm.nvim', version = '*', - config = function() - require('toggleterm').setup() - end, + config = function() require('toggleterm').setup() end, }, }) --- NOTE: pcall prevents plugin system errors on first load -if not pcall(function() - c.colorscheme('vscode') -end) then +if not pcall(vim.cmd.colorscheme, 'vscode') then print('Failed to load colorscheme - probably has not been installed') end diff --git a/config/neovim/lazy-lock.json b/config/neovim/lazy-lock.json index 10caca1..a439147 100644 --- a/config/neovim/lazy-lock.json +++ b/config/neovim/lazy-lock.json @@ -8,6 +8,7 @@ "nvim-treesitter": { "branch": "main", "commit": "3edb01f912867603c2aef9079f208f0244c0885b" }, "nvim-web-devicons": { "branch": "master", "commit": "746ffbb17975ebd6c40142362eee1b0249969c5c" }, "plenary.nvim": { "branch": "master", "commit": "b9fd5226c2f76c951fc8ed5923d85e4de065e509" }, + "telescope-fzf-native.nvim": { "branch": "main", "commit": "6fea601bd2b694c6f2ae08a6c6fab14930c60e2c" }, "telescope.nvim": { "branch": "master", "commit": "5255aa27c422de944791318024167ad5d40aad20" }, "toggleterm.nvim": { "branch": "main", "commit": "50ea089fc548917cc3cc16b46a8211833b9e3c7c" }, "vim-gitgutter": { "branch": "main", "commit": "0acb772e76064cc406664ab595b58b3fac76488a" },