diff --git a/init.lua b/init.lua index ff3cfba..1c27a43 100644 --- a/init.lua +++ b/init.lua @@ -39,6 +39,7 @@ o.title = true -- Set title of terminal window o.updatetime = 300 -- Write swap file every 300 ms (supposedly reduces delays) o.foldlevel = 99 -- Keep all folds open o.foldlevelstart = 99 +o.foldenable = true -- Don't disable folds o.conceallevel = 2 -- Hide concealed text, use replacement if defined opt.listchars = { -- Symbols for whitespace chars when 'list' is enabled tab = '🭰 ', @@ -48,6 +49,9 @@ opt.listchars = { -- Symbols for whitespace chars when 'list' is ena opt.fillchars = { -- Characters to fill certain types of empty space with diff = ' ', fold = ' ', + foldopen= '', + foldsep=' ', + foldclose='' } opt.diffopt:append({'indent-heuristic', 'algorithm:histogram'}) @@ -111,14 +115,24 @@ do -- which-key might not be available yet local ok, which_key = pcall(require, 'which-key') if ok then - which_key.register { ['!'] = {'copen', 'Quickfix window'} } - which_key.register { [''] = {'set number! relativenumber!', 'Toggle relative numbers'} } - which_key.register { [''] = {'set number!', 'Toggle line numbers'} } - - which_key.register { [''] = {'h', 'Go to the left window'} } - which_key.register { [''] = {'l', 'Go to the right window'} } - which_key.register { [''] = {'n', 'Go to the up window'} } - which_key.register { [''] = {'e', 'Go to the down window'} } + which_key.register { + ['!'] = {'copen', 'Quickfix window'}, + [''] = {'set number! relativenumber!', 'Toggle relative numbers'}, + [''] = {'set number!', 'Toggle line numbers'}, + [''] = {'h', 'Go to the left window'}, + [''] = {'l', 'Go to the right window'}, + [''] = {'j', 'Go to the up window'}, + [''] = {'k', 'Go to the down window'}, + ['+'] = {zoom_in, "Zoom in"}, + ['-'] = {zoom_out, "Zoom out"}, + ['q'] = { + name = 'Quickfix', + q = {'copen', 'Quickfix list'}, + c = {'cclose', 'Close quickfix'}, + n = {'cnext', 'Next quickfix'}, + p = {'cprev', 'Previous quickfix'}, + } + } which_key.register { [''] = {function () local ok, notify = pcall(require, 'notify') @@ -166,7 +180,8 @@ au('User', { vim.keymap.set('', 'n', 'gj', {silent = true, buffer = true}) vim.keymap.set('', 'e', 'gk', {silent = true, buffer = true}) end - end + end, + desc = 'Override Startify mappings', }) au('BufWritePost', { pattern = '*/.config/nvim/init.lua', @@ -251,6 +266,7 @@ require'packer'.startup(function(use) use 'mboughaba/i3config.vim' use 'plasticboy/vim-markdown' use 'mracos/mermaid.vim' + use 'lifepillar/pgsql.vim' use 'ajouellette/sway-vim-syntax' use 'cespare/vim-toml' use 'rust-lang/rust.vim' @@ -285,6 +301,13 @@ require'packer'.startup(function(use) use {'julian/vim-textobj-variable-segment', requires = {'kana/vim-textobj-user'}, branch = 'main'} use {'nvim-treesitter/nvim-treesitter', run = ':TSUpdate'} use 'windwp/nvim-ts-autotag' + use {'kevinhwang91/nvim-ufo', requires = 'kevinhwang91/promise-async', config = function() + local ok, ufo = pcall(require, 'ufo') + if not ok then return end + vim.keymap.set('n', 'zR', ufo.openAllFolds) + vim.keymap.set('n', 'zR', ufo.closeAllFolds) + ufo.setup {} + end} use 'hrsh7th/vim-vsnip' -- LSP -- @@ -300,7 +323,7 @@ require'packer'.startup(function(use) use 'mfussenegger/nvim-jdtls' use 'simrat39/rust-tools.nvim' use 'pmizio/typescript-tools.nvim' - use {'jose-elias-alvarez/null-ls.nvim', requires = {'nvim-lua/plenary.nvim'}, config = function () + use {'nvimtools/none-ls.nvim', requires = {'nvim-lua/plenary.nvim'}, config = function () local null_ls = require'null-ls' null_ls.setup { sources = { @@ -412,7 +435,9 @@ require'packer'.startup(function(use) } end} use {'theHamsta/nvim-dap-virtual-text', config = function() - require'nvim-dap-virtual-text'.setup{} + require'nvim-dap-virtual-text'.setup { + clear_on_continue = true, + } end} use {'mxsdev/nvim-dap-vscode-js', requires = {'mfussenegger/nvim-dap'}, config = function() require'dap-vscode-js'.setup { @@ -519,6 +544,10 @@ require'packer'.startup(function(use) integrations = { diffview = true, }, + signs = { + item = {"", ""}, + section = {"", ""}, + }, } end} use {'rcarriga/nvim-notify', after = 'telescope.nvim', config = function () @@ -533,7 +562,11 @@ require'packer'.startup(function(use) end} use 'mhinz/vim-startify' use {'nvim-telescope/telescope.nvim', after = 'which-key.nvim', config = function() - require'telescope'.setup { + local ok, telescope = pcall(require, 'telescope') + if not ok then return end + telescope.builtin = require'telescope.builtin' + telescope.themes = require'telescope.themes' + telescope.setup { defaults = { sorting_strategy = 'ascending', mappings = { @@ -559,8 +592,10 @@ require'packer'.startup(function(use) -- TODO; check if this is right full_path = true, }, - ['ui-select'] = { - require'telescope.themes'.get_cursor() + ['ui-select'] = telescope.themes.get_cursor { + layout_config = { + height = 15, + }, }, }, } @@ -570,9 +605,19 @@ require'packer'.startup(function(use) [""] = {'Telescope', 'List pickers'}, f = {'Telescope find_files', 'Files'}, F = {'Telescope file_browser', 'File browser'}, + [''] = {function () + vim.ui.input({ completion = 'dir' }, function (input) + telescope.builtin.find_files { search_dirs = {input} } + end) + end, 'Files in subdirectory'}, d = {'Telescope find_files find_command=fd,--type,d,-I', 'Directories'}, r = {'Telescope oldfiles', 'Recent files'}, g = {'Telescope live_grep', 'Grep'}, + G = {function () + vim.ui.input({ completion = 'dir' }, function(input) + telescope.builtin.live_grep { search_dirs = {input} } + end) + end, 'Grep in subdirectory'}, b = {'Telescope buffers', 'Buffers'}, e = {'Telescope diagnostics', 'Diagnostics'}, h = {'Telescope help_tags', 'Help page'}, @@ -698,8 +743,8 @@ vim.keymap.set('n', 'G', 'tab Git', {desc = 'Git status (new ta require'gitsigns'.setup { on_attach = function () local gitsigns = require'gitsigns' - vim.keymap.set('n', ']h', gitsigns.next_hunk, {desc = 'Next hunk'}) - vim.keymap.set('n', '[h', gitsigns.prev_hunk, {desc = 'Previous hunk'}) + vim.keymap.set('n', ']c', gitsigns.next_hunk, {desc = 'Next hunk'}) + vim.keymap.set('n', '[c', gitsigns.prev_hunk, {desc = 'Previous hunk'}) --- Prompt interactively for global comparison base local function change_base() @@ -725,7 +770,7 @@ require'gitsigns'.setup { d = {gitsigns.toggle_deleted, 'Toggle deleted lines'}, w = {gitsigns.toggle_word_diff, 'Toggle word diffs'}, l = {gitsigns.blame_line, 'Blame current line'}, - L = {gitsigns.toggle_line_blame, 'Toggle line blame'}, + L = {gitsigns.toggle_current_line_blame, 'Toggle line blame'}, b = {':Gitsigns change_base ', 'Change diff base'}, B = {gitsigns.reset_base, 'Reset diff base'}, } @@ -797,7 +842,7 @@ cmp.setup { {'i', 's'} ), -- Scroll documentation up - [''] = cmp.mapping(cmp.mapping.scroll_docs(4), {'i', 'c'}), -- Scroll documentation down [''] = cmp.mapping(cmp.mapping.scroll_docs(-4), {'i', 'c'}), -- Complete common substring @@ -844,7 +889,13 @@ cmp.setup.filetype({'dap-repl', 'dapui_watches', 'dapui_hover'}, { { name = 'dap' }, }, }) +-- Which client functionality to tell LSP servers we support local capabilities = require'cmp_nvim_lsp'.default_capabilities() +-- nvim-ufo folding capabilities +capabilities.textDocument.foldingRange = { + dynamicRegistration = false, + lineFoldingOnly = true, +} ---- lsp: language servers ---- --- Performs keymaps and other setup specific to buffers with LSP enabled @@ -855,12 +906,14 @@ local function on_attach(client, bufnr) require'which-key'.register({ ['l'] = { D = {vim.lsp.buf.declaration, 'Declaration'}, - d = {vim.lsp.buf.definition, 'Definition'}, - i = {vim.lsp.buf.implementation, 'Implementation'}, + d = {'Telescope lsp_definitions', 'Definition'}, + i = {'Telescope lsp_implementations', 'Implementation'}, a = {vim.lsp.buf.code_action, 'Code action'}, r = {vim.lsp.buf.rename, 'Rename'}, - t = {vim.lsp.buf.type_definition, 'Type definition'}, - u = {vim.lsp.buf.references, 'Usages/references'} + l = {vim.lsp.codelens.refresh, 'Show codelenses'}, + L = {vim.lsp.codelens.run, 'Run codelens'}, + t = {'Telescope lsp_type_definitions', 'Type definition'}, + u = {'Telescope lsp_references', 'Usages/references'} }, g = { d = {vim.lsp.buf.definition, 'Goto definition'}, @@ -888,7 +941,7 @@ local function on_attach(client, bufnr) [''] = {vim.lsp.buf.signature_help, 'Function signature'}, }, {buffer = bufnr}) require'which-key'.register({ - [''] = {vim.lsp.buf.signature_help, 'Function signature'} }, {buffer = bufnr, mode = 'i'}) vim.bo.tagfunc = 'v:lua.vim.lsp.tagfunc' @@ -959,11 +1012,11 @@ au('FileType', { bundles = (function () -- add java-debug-adapter local bundles = { - vim.fn.glob(vim.fn.stdpath('data') .. '/mason/packages/java-debug-adapter/extension/server/com.microsoft.java.debug.plugin-*.jar', 1) + vim.fn.glob(vim.fn.stdpath('data') .. '/mason/packages/java-debug-adapter/extension/server/com.microsoft.java.debug.plugin-*.jar', true) } -- add java-test vim.list_extend(bundles, vim.split( - vim.fn.glob(vim.fn.stdpath'data' .. '/mason/packages/java-test/extension/server/*.jar', 1), + vim.fn.glob(vim.fn.stdpath'data' .. '/mason/packages/java-test/extension/server/*.jar', true), '\n' )) @@ -971,6 +1024,8 @@ au('FileType', { end)(), }, + capabilities = capabilities, + on_attach = function (client, bufnr) on_attach(client, bufnr) jdtls.setup_dap() @@ -1171,6 +1226,18 @@ require('nvim-tree').setup { width = 45, }, } +-- Handle restoring sessions with nvim-tree windows properly +au('BufEnter', { + pattern = 'NvimTree*', + callback = function() + local api = require('nvim-tree.api') + local view = require('nvim-tree.view') + + if not view.is_visible() then + api.tree.open() + end + end, +}) vim.cmd'highlight NvimTreeOpenedFile guifg=NONE guibg=NONE gui=italic' vim.keymap.set('n', 't', 'NvimTreeFindFile', {desc = 'Nvim Tree'})