From a7bec557b8d4da8586455eba142680515b015f0b Mon Sep 17 00:00:00 2001 From: Kristofers Solo Date: Mon, 1 Aug 2022 03:45:19 +0300 Subject: [PATCH] Rewrite init.vim to init.lua --- .config/nvim/init.lua | 21 ++ .config/nvim/init.vim | 344 ------------------ .config/nvim/lua/user/alpha.lua | 42 +++ .config/nvim/lua/user/autocommands.lua | 43 +++ .config/nvim/lua/user/autopairs.lua | 33 ++ .config/nvim/lua/user/bufferline.lua | 167 +++++++++ .config/nvim/lua/user/cmp.lua | 131 +++++++ .config/nvim/lua/user/colorscheme.lua | 8 + .config/nvim/lua/user/comment.lua | 22 ++ .config/nvim/lua/user/gitsigns.lua | 48 +++ .config/nvim/lua/user/impatient.lua | 6 + .config/nvim/lua/user/indentline.lua | 73 ++++ .config/nvim/lua/user/keymaps.lua | 108 ++++++ .config/nvim/lua/user/lsp/configs.lua | 24 ++ .config/nvim/lua/user/lsp/handlers.lua | 102 ++++++ .config/nvim/lua/user/lsp/init.lua | 8 + .config/nvim/lua/user/lsp/null-ls.lua | 19 + .config/nvim/lua/user/lsp/settings/jsonls.lua | 197 ++++++++++ .../nvim/lua/user/lsp/settings/pyright.lua | 9 + .../lua/user/lsp/settings/sumneko_lua.lua | 15 + .config/nvim/lua/user/lualine.lua | 93 +++++ .config/nvim/lua/user/nvim-tree.lua | 81 +++++ .config/nvim/lua/user/options.lua | 56 +++ .config/nvim/lua/user/plugins.lua | 114 ++++++ .config/nvim/lua/user/project.lua | 48 +++ .config/nvim/lua/user/telescope.lua | 99 +++++ .config/nvim/lua/user/toggleterm.lua | 71 ++++ .config/nvim/lua/user/treesitter.lua | 17 + .config/nvim/lua/user/whichkey.lua | 187 ++++++++++ 29 files changed, 1842 insertions(+), 344 deletions(-) create mode 100644 .config/nvim/init.lua delete mode 100644 .config/nvim/init.vim create mode 100644 .config/nvim/lua/user/alpha.lua create mode 100644 .config/nvim/lua/user/autocommands.lua create mode 100644 .config/nvim/lua/user/autopairs.lua create mode 100644 .config/nvim/lua/user/bufferline.lua create mode 100644 .config/nvim/lua/user/cmp.lua create mode 100644 .config/nvim/lua/user/colorscheme.lua create mode 100644 .config/nvim/lua/user/comment.lua create mode 100644 .config/nvim/lua/user/gitsigns.lua create mode 100644 .config/nvim/lua/user/impatient.lua create mode 100644 .config/nvim/lua/user/indentline.lua create mode 100644 .config/nvim/lua/user/keymaps.lua create mode 100644 .config/nvim/lua/user/lsp/configs.lua create mode 100644 .config/nvim/lua/user/lsp/handlers.lua create mode 100644 .config/nvim/lua/user/lsp/init.lua create mode 100644 .config/nvim/lua/user/lsp/null-ls.lua create mode 100644 .config/nvim/lua/user/lsp/settings/jsonls.lua create mode 100644 .config/nvim/lua/user/lsp/settings/pyright.lua create mode 100644 .config/nvim/lua/user/lsp/settings/sumneko_lua.lua create mode 100644 .config/nvim/lua/user/lualine.lua create mode 100644 .config/nvim/lua/user/nvim-tree.lua create mode 100644 .config/nvim/lua/user/options.lua create mode 100644 .config/nvim/lua/user/plugins.lua create mode 100644 .config/nvim/lua/user/project.lua create mode 100644 .config/nvim/lua/user/telescope.lua create mode 100644 .config/nvim/lua/user/toggleterm.lua create mode 100644 .config/nvim/lua/user/treesitter.lua create mode 100644 .config/nvim/lua/user/whichkey.lua diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua new file mode 100644 index 00000000..2d7538e4 --- /dev/null +++ b/.config/nvim/init.lua @@ -0,0 +1,21 @@ +require ('user.options') +require ('user.keymaps') +require ('user.plugins') +require ('user.colorscheme') +require ('user.cmp') +require ('user.lsp') +require ('user.telescope') +require ('user.treesitter') +require ('user.autopairs') +require ('user.comment') +require ('user.gitsigns') +require ('user.nvim-tree') +require ('user.bufferline') +require ('user.lualine') +require ('user.toggleterm') +require ('user.project') +require ('user.impatient') +require ('user.indentline') +require ('user.alpha') +require ('user.whichkey') +require ('user.autocommands') \ No newline at end of file diff --git a/.config/nvim/init.vim b/.config/nvim/init.vim deleted file mode 100644 index 59c126a9..00000000 --- a/.config/nvim/init.vim +++ /dev/null @@ -1,344 +0,0 @@ -let mapleader=" " - -set mouse=a -set number -set relativenumber -set autoindent -set smarttab -set ignorecase -set smartcase -set termguicolors -syntax on - -" Autocompletion -set wildmode=longest,list,full - -" Fix splitting -set splitbelow splitright - -"Tab settings -set expandtab -set shiftwidth=4 -set softtabstop=4 -set tabstop=4 - -set clipboard+=unnamedplus - - -call plug#begin() - -Plug 'andweeb/presence.nvim' -Plug 'ap/vim-css-color' -Plug 'jiangmiao/auto-pairs' -Plug 'kyazdani42/nvim-web-devicons' -Plug 'L3MON4D3/LuaSnip' -Plug 'lewis6991/gitsigns.nvim' -Plug 'lukas-reineke/indent-blankline.nvim' -Plug 'mattn/emmet-vim' -Plug 'Mofiqul/dracula.nvim' -Plug 'norcalli/nvim-colorizer.lua' -Plug 'numToStr/Comment.nvim' -Plug 'nvim-lualine/lualine.nvim' -Plug 'nvim-lua/plenary.nvim' -Plug 'nvim-telescope/telescope.nvim', { 'tag': '0.1.0' } -Plug 'nvim-telescope/telescope-fzf-native.nvim', { 'do': 'make' } -Plug 'nvim-treesitter/nvim-treesitter', {'do': ':TSUpdate'} -Plug 'preservim/nerdtree' -Plug 'rafi/awesome-vim-colorschemes' -Plug 'ryanoasis/vim-devicons' -Plug 'sbdchd/neoformat' -Plug 'vimwiki/vimwiki' -Plug 'saecki/crates.nvim' -" cmp -Plug 'williamboman/nvim-lsp-installer' -Plug 'neovim/nvim-lspconfig' -Plug 'hrsh7th/cmp-nvim-lsp' -Plug 'hrsh7th/cmp-buffer' -Plug 'hrsh7th/cmp-path' -Plug 'hrsh7th/cmp-cmdline' -Plug 'hrsh7th/nvim-cmp' -Plug 'saadparwaiz1/cmp_luasnip' - - -call plug#end() - -colorscheme dracula - -set cursorline -set cursorcolumn -highlight CursorLine ctermbg=Yellow cterm=bold guibg=#2b2b2b -highlight CursorColumn ctermbg=Yellow cterm=bold guibg=#2b2b2b - -nnoremap n :NERDTreeFocus -nnoremap :NERDTree -nnoremap :NERDTreeToggle -nnoremap :NERDTreeFind -let NERDTreeShowHidden=1 - -" Verticaly center document when entering insert mode -autocmd InsertEnter * norm zz - -" Remove trailing whitespace on save -autocmd BufWritePre * %s/\s\+$//e - -" Enable Disable auto comment -map c :setlocal formatoptions-=cro -map C :setlocal formatoptions=cro - -" Enable spell checking, s for spell check -map s :setlocal spell! spelllang=en_us - -" Enable Disable auto indent -map i :setlocal autoindent -map I :setlocal noautoindent - -" Shortcutting split navigation -map h -map j -map k -map l - -" Moving line up or down by one line -nmap :m -2 -nmap :m -2 -nmap :m +1 -nmap :m +1 - -" Alias replace all to S -" nnoremap S :%s//gI -nnoremap S :%s// - -" run current script with python3 by CTRL+R in command and insert mode -autocmd FileType python map :w:exec '!python3' shellescape(@%, 1) -autocmd FileType python imap :w:exec '!python3' shellescape(@%, 1) -autocmd FileType rust map :w:exec '!cargo run' -autocmd FileType rust imap :w:exec '!cargo run' - -" Prettier configuration -let g:neoformat_enabled_python = ['autopep8'] -let g:neoformat_try_node_exe = 1 -autocmd BufWritePre,InsertLeave *.{py,rs,html,css,md,lua} Neoformat - -" Find files using Telescope command-line sugar. -nnoremap ff Telescope find_files hidden=true -nnoremap fg Telescope live_grep -nnoremap fb Telescope buffers -nnoremap fh Telescope help_tags - -lua << END -require('gitsigns').setup() -require('Comment').setup() -require 'colorizer'.setup() -require('crates').setup() -vim.opt.list = true -vim.opt.listchars:append "eol:↴" -vim.opt.listchars:append "space:⋅" -require('indent_blankline').setup({ - space_char_blankline = " ", - show_end_of_line = true, - show_current_context = true, - show_current_context_start = true, -}) -require("nvim-lsp-installer").setup({ - automatic_installation = true, -- automatically detect which servers to install (based on which servers are set up via lspconfig) - ui = { - icons = { - server_installed = "✓", - server_pending = "➜", - server_uninstalled = "✗" - } - } -}) -require('lualine').setup { - options = { - icons_enabled = true, - theme = 'dracula', - component_separators = { left = '', right = ''}, - section_separators = { left = '', right = ''}, - disabled_filetypes = {}, - always_divide_middle = true, - globalstatus = false, - }, - sections = { - lualine_a = {'mode'}, - lualine_b = {'branch', 'diff', 'diagnostics'}, - lualine_c = {'filename'}, - lualine_x = {'encoding', 'fileformat', 'filetype'}, - lualine_y = {'progress'}, - lualine_z = {'location'} - }, - inactive_sections = { - lualine_a = {}, - lualine_b = {}, - lualine_c = {'filename'}, - lualine_x = {'location'}, - lualine_y = {}, - lualine_z = {} - }, - tabline = {}, - extensions = {} -} -require('telescope').setup{ - defaults = { - vimgrep_arguments = { - 'rg', - '--with-filename', - '--line-number', - '--column', - '--smart-case', - '--no-ignore', -- **This is the added flag** - '--hidden' -- **Also this flag. The combination of the two is the same as `-uu`** - } - } -} --- To get fzf loaded and working with telescope, you need to call --- load_extension, somewhere after setup function: -require('telescope').load_extension('fzf') -END - -" LSP configs -lua << END --- Mappings. --- See `:help vim.diagnostic.*` for documentation on any of the below functions -local opts = { noremap=true, silent=true } -vim.keymap.set('n', 'e', vim.diagnostic.open_float, opts) -vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, opts) -vim.keymap.set('n', ']d', vim.diagnostic.goto_next, opts) -vim.keymap.set('n', 'q', vim.diagnostic.setloclist, opts) - --- Use an on_attach function to only map the following keys --- after the language server attaches to the current buffer -local on_attach = function(client, bufnr) - -- Enable completion triggered by - vim.api.nvim_buf_set_option(bufnr, 'omnifunc', 'v:lua.vim.lsp.omnifunc') - - -- Mappings. - -- See `:help vim.lsp.*` for documentation on any of the below functions - local bufopts = { noremap=true, silent=true, buffer=bufnr } - vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, bufopts) - vim.keymap.set('n', 'gd', vim.lsp.buf.definition, bufopts) - vim.keymap.set('n', 'K', vim.lsp.buf.hover, bufopts) - vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, bufopts) - vim.keymap.set('n', '', vim.lsp.buf.signature_help, bufopts) - vim.keymap.set('n', 'wa', vim.lsp.buf.add_workspace_folder, bufopts) - vim.keymap.set('n', 'wr', vim.lsp.buf.remove_workspace_folder, bufopts) - vim.keymap.set('n', 'wl', function() - print(vim.inspect(vim.lsp.buf.list_workspace_folders())) - end, bufopts) - vim.keymap.set('n', 'D', vim.lsp.buf.type_definition, bufopts) - vim.keymap.set('n', 'rn', vim.lsp.buf.rename, bufopts) - vim.keymap.set('n', 'ca', vim.lsp.buf.code_action, bufopts) - vim.keymap.set('n', 'gr', vim.lsp.buf.references, bufopts) - vim.keymap.set('n', 'f', vim.lsp.buf.formatting, bufopts) -end - -local lsp_flags = { - -- This is the default in Nvim 0.7+ - debounce_text_changes = 150, -} -END - - -" cmp configs -set completeopt=menu,menuone,noselect - -lua <'] = cmp.mapping.scroll_docs(-4), - [''] = cmp.mapping.scroll_docs(4), - [''] = cmp.mapping.complete(), - [''] = cmp.mapping.abort(), - [''] = cmp.mapping.confirm({ select = true }), -- Accept currently selected item. Set `select` to `false` to only confirm explicitly selected items. -}), -sources = cmp.config.sources({ - { name = 'nvim_lsp' }, - { name = 'vsnip' }, -- For vsnip users. - -- { name = 'luasnip' }, -- For luasnip users. - -- { name = 'ultisnips' }, -- For ultisnips users. - -- { name = 'snippy' }, -- For snippy users. -}, { - { name = 'buffer' }, - }) -}) - --- Set configuration for specific filetype. -cmp.setup.filetype('gitcommit', { -sources = cmp.config.sources({ - { name = 'cmp_git' }, -- You can specify the `cmp_git` source if you were installed it. -}, { - { name = 'buffer' }, - }) -}) - --- Use buffer source for `/` (if you enabled `native_menu`, this won't work anymore). -cmp.setup.cmdline('/', { -mapping = cmp.mapping.preset.cmdline(), -sources = { - { name = 'buffer' } -} -}) - --- Use cmdline & path source for ':' (if you enabled `native_menu`, this won't work anymore). -cmp.setup.cmdline(':', { -mapping = cmp.mapping.preset.cmdline(), -sources = cmp.config.sources({ - { name = 'path' } -}, { - { name = 'cmdline' } -}) -}) - --- Setup lspconfig. -local capabilities = require('cmp_nvim_lsp').update_capabilities(vim.lsp.protocol.make_client_capabilities()) --- Replace with each lsp server you've enabled. -require('lspconfig')['pyright'].setup{ - on_attach = on_attach, - flags = lsp_flags, -} -require('lspconfig')['rust_analyzer'].setup{ - on_attach = on_attach, - flags = lsp_flags, - -- Server-specific settings... - settings = { - ["rust-analyzer"] = {} - } -} -require('lspconfig')['bashls'].setup{} -require('lspconfig')['cssls'].setup{} -require('lspconfig')['emmet_ls'].setup{} -require('lspconfig')['ltex'].setup{} -require('lspconfig')['marksman'].setup{} -require('lspconfig')['taplo'].setup{} -require('lspconfig')['vimls'].setup{} -require('lspconfig')['yamlls'].setup{} -EOF - -lua <'), + dashboard.button('e', ' New file', ':ene startinsert '), + dashboard.button('p', ' Find project', ':Telescope projects '), + dashboard.button('r', ' Recently used files', ':Telescope oldfiles '), + dashboard.button('t', ' Find text', ':Telescope live_grep '), + dashboard.button('c', ' Configuration', ':e ~/.config/nvim/init.lua '), + dashboard.button('q', ' Quit Neovim', ':qa'), +} + +local function footer() +-- NOTE: requires the fortune-mod package to work + -- local handle = io.popen('fortune') + -- local fortune = handle:read('*a') + -- handle:close() + -- return fortune + return 'chrisatmachine.com' +end + +dashboard.section.footer.val = footer() + +dashboard.section.footer.opts.hl = 'Type' +dashboard.section.header.opts.hl = 'Include' +dashboard.section.buttons.opts.hl = 'Keyword' + +dashboard.opts.opts.noautocmd = true +-- vim.cmd([[autocmd User AlphaReady echo 'ready']]) +alpha.setup(dashboard.opts) diff --git a/.config/nvim/lua/user/autocommands.lua b/.config/nvim/lua/user/autocommands.lua new file mode 100644 index 00000000..006afabd --- /dev/null +++ b/.config/nvim/lua/user/autocommands.lua @@ -0,0 +1,43 @@ +vim.cmd [[ + augroup _general_settings + autocmd! + autocmd FileType qf,help,man,lspinfo nnoremap q :close + autocmd TextYankPost * silent!lua require('vim.highlight').on_yank({higroup = 'Visual', timeout = 200}) + autocmd BufWinEnter * :set formatoptions-=cro + autocmd FileType qf set nobuflisted + augroup end + + augroup _git + autocmd! + autocmd FileType gitcommit setlocal wrap + autocmd FileType gitcommit setlocal spell + augroup end + + augroup _markdown + autocmd! + autocmd FileType markdown setlocal wrap + autocmd FileType markdown setlocal spell + augroup end + + augroup _auto_resize + autocmd! + autocmd VimResized * tabdo wincmd = + augroup end + + augroup _alpha + autocmd! + autocmd User AlphaReady set showtabline=0 | autocmd BufUnload set showtabline=2 + augroup end +]] + +-- Autoformat +-- augroup _lsp +-- autocmd! +-- autocmd BufWritePre * lua vim.lsp.buf.formatting() +-- augroup end + +-- " Verticaly center document when entering insert mode +-- autocmd InsertEnter * norm zz + +-- " Remove trailing whitespace on save +-- autocmd BufWritePre * %s/\s\+$//e diff --git a/.config/nvim/lua/user/autopairs.lua b/.config/nvim/lua/user/autopairs.lua new file mode 100644 index 00000000..fac46fd6 --- /dev/null +++ b/.config/nvim/lua/user/autopairs.lua @@ -0,0 +1,33 @@ +-- Setup nvim-cmp. +local status_ok, npairs = pcall(require, 'nvim-autopairs') +if not status_ok then + return +end + +npairs.setup { + check_ts = true, + ts_config = { + lua = { 'string', 'source' }, + javascript = { 'string', 'template_string' }, + java = false, + }, + disable_filetype = { 'TelescopePrompt', 'spectre_panel' }, + fast_wrap = { + map = '', + chars = { '{', '[', '(', "'", '"' }, + pattern = string.gsub([[ [%'%"%)%>%]%)%}%,] ]], '%s+', ''), + offset = 0, -- Offset from pattern match + end_key = '$', + keys = 'qwertyuiopzxcvbnmasdfghjkl', + check_comma = true, + highlight = 'PmenuSel', + highlight_grey = 'LineNr', + }, +} + +local cmp_autopairs = require 'nvim-autopairs.completion.cmp' +local cmp_status_ok, cmp = pcall(require, 'cmp') +if not cmp_status_ok then + return +end +cmp.event:on('confirm_done', cmp_autopairs.on_confirm_done { map_char = { tex = '' } }) diff --git a/.config/nvim/lua/user/bufferline.lua b/.config/nvim/lua/user/bufferline.lua new file mode 100644 index 00000000..1cee577d --- /dev/null +++ b/.config/nvim/lua/user/bufferline.lua @@ -0,0 +1,167 @@ +local status_ok, bufferline = pcall(require, 'bufferline') +if not status_ok then + return +end + +bufferline.setup { + options = { + numbers = 'none', -- | 'ordinal' | 'buffer_id' | 'both' | function({ ordinal, id, lower, raise }): string, + close_command = 'Bdelete! %d', -- can be a string | function, see 'Mouse actions' + right_mouse_command = 'Bdelete! %d', -- can be a string | function, see 'Mouse actions' + left_mouse_command = 'buffer %d', -- can be a string | function, see 'Mouse actions' + middle_mouse_command = nil, -- can be a string | function, see 'Mouse actions' + -- NOTE: this plugin is designed with this icon in mind, + -- and so changing this is NOT recommended, this is intended + -- as an escape hatch for people who cannot bear it for whatever reason + indicator_icon = '▎', + buffer_close_icon = '', + -- buffer_close_icon = '', + modified_icon = '●', + close_icon = '', + -- close_icon = '', + left_trunc_marker = '', + right_trunc_marker = '', + --- name_formatter can be used to change the buffer's label in the bufferline. + --- Please note some names can/will break the + --- bufferline so use this at your discretion knowing that it has + --- some limitations that will *NOT* be fixed. + -- name_formatter = function(buf) -- buf contains a 'name', 'path' and 'bufnr' + -- -- remove extension from markdown files for example + -- if buf.name:match('%.md') then + -- return vim.fn.fnamemodify(buf.name, ':t:r') + -- end + -- end, + max_name_length = 30, + max_prefix_length = 30, -- prefix used when a buffer is de-duplicated + tab_size = 21, + diagnostics = false, -- | 'nvim_lsp' | 'coc', + diagnostics_update_in_insert = false, + -- diagnostics_indicator = function(count, level, diagnostics_dict, context) + -- return '('..count..')' + -- end, + -- NOTE: this will be called a lot so don't do any heavy processing here + -- custom_filter = function(buf_number) + -- -- filter out filetypes you don't want to see + -- if vim.bo[buf_number].filetype ~= '' then + -- return true + -- end + -- -- filter out by buffer name + -- if vim.fn.bufname(buf_number) ~= '' then + -- return true + -- end + -- -- filter out based on arbitrary rules + -- -- e.g. filter out vim wiki buffer from tabline in your work repo + -- if vim.fn.getcwd() == '' and vim.bo[buf_number].filetype ~= 'wiki' then + -- return true + -- end + -- end, + offsets = { { filetype = 'NvimTree', text = '', padding = 1 } }, + show_buffer_icons = true, + show_buffer_close_icons = true, + show_close_icon = true, + show_tab_indicators = true, + persist_buffer_sort = true, -- whether or not custom sorted buffers should persist + -- can also be a table containing 2 custom separators + -- [focused and unfocused]. eg: { '|', '|' } + separator_style = 'thin', -- | 'thick' | 'thin' | { 'any', 'any' }, + enforce_regular_tabs = true, + always_show_bufferline = true, + -- sort_by = 'id' | 'extension' | 'relative_directory' | 'directory' | 'tabs' | function(buffer_a, buffer_b) + -- -- add custom logic + -- return buffer_a.modified > buffer_b.modified + -- end + }, + highlights = { + fill = { + guifg = { attribute = 'fg', highlight = '#ff0000' }, + guibg = { attribute = 'bg', highlight = 'TabLine' }, + }, + background = { + guifg = { attribute = 'fg', highlight = 'TabLine' }, + guibg = { attribute = 'bg', highlight = 'TabLine' }, + }, + + -- buffer_selected = { + -- guifg = {attribute='fg',highlight='#ff0000'}, + -- guibg = {attribute='bg',highlight='#0000ff'}, + -- gui = 'none' + -- }, + buffer_visible = { + guifg = { attribute = 'fg', highlight = 'TabLine' }, + guibg = { attribute = 'bg', highlight = 'TabLine' }, + }, + + close_button = { + guifg = { attribute = 'fg', highlight = 'TabLine' }, + guibg = { attribute = 'bg', highlight = 'TabLine' }, + }, + close_button_visible = { + guifg = { attribute = 'fg', highlight = 'TabLine' }, + guibg = { attribute = 'bg', highlight = 'TabLine' }, + }, + -- close_button_selected = { + -- guifg = {attribute='fg',highlight='TabLineSel'}, + -- guibg ={attribute='bg',highlight='TabLineSel'} + -- }, + + tab_selected = { + guifg = { attribute = 'fg', highlight = 'Normal' }, + guibg = { attribute = 'bg', highlight = 'Normal' }, + }, + tab = { + guifg = { attribute = 'fg', highlight = 'TabLine' }, + guibg = { attribute = 'bg', highlight = 'TabLine' }, + }, + tab_close = { + -- guifg = {attribute='fg',highlight='LspDiagnosticsDefaultError'}, + guifg = { attribute = 'fg', highlight = 'TabLineSel' }, + guibg = { attribute = 'bg', highlight = 'Normal' }, + }, + + duplicate_selected = { + guifg = { attribute = 'fg', highlight = 'TabLineSel' }, + guibg = { attribute = 'bg', highlight = 'TabLineSel' }, + gui = 'italic', + }, + duplicate_visible = { + guifg = { attribute = 'fg', highlight = 'TabLine' }, + guibg = { attribute = 'bg', highlight = 'TabLine' }, + gui = 'italic', + }, + duplicate = { + guifg = { attribute = 'fg', highlight = 'TabLine' }, + guibg = { attribute = 'bg', highlight = 'TabLine' }, + gui = 'italic', + }, + + modified = { + guifg = { attribute = 'fg', highlight = 'TabLine' }, + guibg = { attribute = 'bg', highlight = 'TabLine' }, + }, + modified_selected = { + guifg = { attribute = 'fg', highlight = 'Normal' }, + guibg = { attribute = 'bg', highlight = 'Normal' }, + }, + modified_visible = { + guifg = { attribute = 'fg', highlight = 'TabLine' }, + guibg = { attribute = 'bg', highlight = 'TabLine' }, + }, + + separator = { + guifg = { attribute = 'bg', highlight = 'TabLine' }, + guibg = { attribute = 'bg', highlight = 'TabLine' }, + }, + separator_selected = { + guifg = { attribute = 'bg', highlight = 'Normal' }, + guibg = { attribute = 'bg', highlight = 'Normal' }, + }, + -- separator_visible = { + -- guifg = {attribute='bg',highlight='TabLine'}, + -- guibg = {attribute='bg',highlight='TabLine'} + -- }, + indicator_selected = { + guifg = { attribute = 'fg', highlight = 'LspDiagnosticsDefaultHint' }, + guibg = { attribute = 'bg', highlight = 'Normal' }, + }, + }, +} diff --git a/.config/nvim/lua/user/cmp.lua b/.config/nvim/lua/user/cmp.lua new file mode 100644 index 00000000..7763a2bc --- /dev/null +++ b/.config/nvim/lua/user/cmp.lua @@ -0,0 +1,131 @@ +local cmp_status_ok, cmp = pcall(require, 'cmp') +if not cmp_status_ok then + return +end + +local snip_status_ok, luasnip = pcall(require, 'luasnip') +if not snip_status_ok then + return +end + +require('luasnip/loaders/from_vscode').lazy_load() + +local check_backspace = function() + local col = vim.fn.col '.' - 1 + return col == 0 or vim.fn.getline('.'):sub(col, col):match '%s' +end + +--   פּ ﯟ   some other good icons +local kind_icons = { + Text = '', + Method = 'm', + Function = '', + Constructor = '', + Field = '', + Variable = '', + Class = '', + Interface = '', + Module = '', + Property = '', + Unit = '', + Value = '', + Enum = '', + Keyword = '', + Snippet = '', + Color = '', + File = '', + Reference = '', + Folder = '', + EnumMember = '', + Constant = '', + Struct = '', + Event = '', + Operator = '', + TypeParameter = '', +} +-- find more here: https://www.nerdfonts.com/cheat-sheet + +cmp.setup { + snippet = { + expand = function(args) + luasnip.lsp_expand(args.body) -- For `luasnip` users. + end, + }, + mapping = { + [''] = cmp.mapping.select_prev_item(), + [''] = cmp.mapping.select_next_item(), + [''] = cmp.mapping(cmp.mapping.scroll_docs(-1), { 'i', 'c' }), + [''] = cmp.mapping(cmp.mapping.scroll_docs(1), { 'i', 'c' }), + [''] = cmp.mapping(cmp.mapping.complete(), { 'i', 'c' }), + [''] = cmp.config.disable, -- Specify `cmp.config.disable` if you want to remove the default `` mapping. + [''] = cmp.mapping { + i = cmp.mapping.abort(), + c = cmp.mapping.close(), + }, + -- Accept currently selected item. If none selected, `select` first item. + -- Set `select` to `false` to only confirm explicitly selected items. + [''] = cmp.mapping.confirm { select = true }, + [''] = cmp.mapping(function(fallback) + if cmp.visible() then + cmp.select_next_item() + elseif luasnip.expandable() then + luasnip.expand() + elseif luasnip.expand_or_jumpable() then + luasnip.expand_or_jump() + elseif check_backspace() then + fallback() + else + fallback() + end + end, { + 'i', + 's', + }), + [''] = 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', + }), + }, + formatting = { + fields = { 'kind', 'abbr', 'menu' }, + format = function(entry, vim_item) + -- Kind icons + vim_item.kind = string.format('%s', kind_icons[vim_item.kind]) + -- vim_item.kind = string.format('%s %s', kind_icons[vim_item.kind], vim_item.kind) -- This concatonates the icons with the name of the item kind + vim_item.menu = ({ + nvim_lsp = '[LSP]', + luasnip = '[Snippet]', + buffer = '[Buffer]', + path = '[Path]', + })[entry.source.name] + return vim_item + end, + }, + sources = { + { name = 'nvim_lsp' }, + { name = 'luasnip' }, + { name = 'buffer' }, + { name = 'path' }, + }, + confirm_opts = { + behavior = cmp.ConfirmBehavior.Replace, + select = false, + }, + window = { + documentation = { + border = { '╭', '─', '╮', '│', '╯', '─', '╰', '│' }, + }, + }, + experimental = { + ghost_text = false, + native_menu = false, + }, +} diff --git a/.config/nvim/lua/user/colorscheme.lua b/.config/nvim/lua/user/colorscheme.lua new file mode 100644 index 00000000..33c54f37 --- /dev/null +++ b/.config/nvim/lua/user/colorscheme.lua @@ -0,0 +1,8 @@ +vim.cmd [[ +try + colorscheme dracula +catch /^Vim\%((\a\+)\)\=:E185/ + colorscheme default + set background=dark +endtry +]] diff --git a/.config/nvim/lua/user/comment.lua b/.config/nvim/lua/user/comment.lua new file mode 100644 index 00000000..ab9b64a5 --- /dev/null +++ b/.config/nvim/lua/user/comment.lua @@ -0,0 +1,22 @@ +local status_ok, comment = pcall(require, 'Comment') +if not status_ok then + return +end + +comment.setup { + pre_hook = function(ctx) + local U = require 'Comment.utils' + + local location = nil + if ctx.ctype == U.ctype.block then + location = require('ts_context_commentstring.utils').get_cursor_location() + elseif ctx.cmotion == U.cmotion.v or ctx.cmotion == U.cmotion.V then + location = require('ts_context_commentstring.utils').get_visual_start_location() + end + + return require('ts_context_commentstring.internal').calculate_commentstring { + key = ctx.ctype == U.ctype.line and '__default' or '__multiline', + location = location, + } + end, +} diff --git a/.config/nvim/lua/user/gitsigns.lua b/.config/nvim/lua/user/gitsigns.lua new file mode 100644 index 00000000..b41f03d7 --- /dev/null +++ b/.config/nvim/lua/user/gitsigns.lua @@ -0,0 +1,48 @@ +local status_ok, gitsigns = pcall(require, 'gitsigns') +if not status_ok then + return +end + +gitsigns.setup { + signs = { + add = { hl = 'GitSignsAdd', text = '▎', numhl = 'GitSignsAddNr', linehl = 'GitSignsAddLn' }, + change = { hl = 'GitSignsChange', text = '▎', numhl = 'GitSignsChangeNr', linehl = 'GitSignsChangeLn' }, + delete = { hl = 'GitSignsDelete', text = '契', numhl = 'GitSignsDeleteNr', linehl = 'GitSignsDeleteLn' }, + topdelete = { hl = 'GitSignsDelete', text = '契', numhl = 'GitSignsDeleteNr', linehl = 'GitSignsDeleteLn' }, + changedelete = { hl = 'GitSignsChange', text = '▎', numhl = 'GitSignsChangeNr', linehl = 'GitSignsChangeLn' }, + }, + signcolumn = true, -- Toggle with `:Gitsigns toggle_signs` + numhl = false, -- Toggle with `:Gitsigns toggle_numhl` + linehl = false, -- Toggle with `:Gitsigns toggle_linehl` + word_diff = false, -- Toggle with `:Gitsigns toggle_word_diff` + watch_gitdir = { + interval = 1000, + follow_files = true, + }, + attach_to_untracked = true, + current_line_blame = false, -- Toggle with `:Gitsigns toggle_current_line_blame` + current_line_blame_opts = { + virt_text = true, + virt_text_pos = 'eol', -- 'eol' | 'overlay' | 'right_align' + delay = 1000, + ignore_whitespace = false, + }, + current_line_blame_formatter_opts = { + relative_time = false, + }, + sign_priority = 6, + update_debounce = 100, + status_formatter = nil, -- Use default + max_file_length = 40000, + preview_config = { + -- Options passed to nvim_open_win + border = 'single', + style = 'minimal', + relative = 'cursor', + row = 0, + col = 1, + }, + yadm = { + enable = false, + }, +} diff --git a/.config/nvim/lua/user/impatient.lua b/.config/nvim/lua/user/impatient.lua new file mode 100644 index 00000000..f0a7d7d8 --- /dev/null +++ b/.config/nvim/lua/user/impatient.lua @@ -0,0 +1,6 @@ +local status_ok, impatient = pcall(require, 'impatient') +if not status_ok then + return +end + +impatient.enable_profile() diff --git a/.config/nvim/lua/user/indentline.lua b/.config/nvim/lua/user/indentline.lua new file mode 100644 index 00000000..84ed4cbb --- /dev/null +++ b/.config/nvim/lua/user/indentline.lua @@ -0,0 +1,73 @@ +local g = vim.g +local opt = vim.opt +local cmd = vim.cmd +local status_ok, indent_blankline = pcall(require, 'indent_blankline') +if not status_ok then + return +end + +g.indent_blankline_buftype_exclude = { 'terminal', 'nofile' } +g.indent_blankline_filetype_exclude = { + 'help', + 'startify', + 'dashboard', + 'packer', + 'neogitstatus', + 'NvimTree', + 'Trouble', +} +g.indentLine_enabled = 1 +-- g.indent_blankline_char = '│' +g.indent_blankline_char = '▏' +-- g.indent_blankline_char = '▎' +g.indent_blankline_show_trailing_blankline_indent = false +g.indent_blankline_show_first_indent_level = true +g.indent_blankline_use_treesitter = true +g.indent_blankline_show_current_context = true +g.indent_blankline_context_patterns = { + 'class', + 'return', + 'function', + 'method', + '^if', + '^while', + 'jsx_element', + '^for', + '^object', + '^table', + 'block', + 'arguments', + 'if_statement', + 'else_clause', + 'jsx_element', + 'jsx_self_closing_element', + 'try_statement', + 'catch_clause', + 'import_statement', + 'operation_type', +} +-- HACK: work-around for https://github.com/lukas-reineke/indent-blankline.nvim/issues/59 +vim.wo.colorcolumn = '99999' + +-- cmd [[highlight IndentBlanklineIndent1 guifg=#E06C75 gui=nocombine]] +-- cmd [[highlight IndentBlanklineIndent2 guifg=#E5C07B gui=nocombine]] +-- cmd [[highlight IndentBlanklineIndent3 guifg=#98C379 gui=nocombine]] +-- cmd [[highlight IndentBlanklineIndent4 guifg=#56B6C2 gui=nocombine]] +-- cmd [[highlight IndentBlanklineIndent5 guifg=#61AFEF gui=nocombine]] +-- cmd [[highlight IndentBlanklineIndent6 guifg=#C678DD gui=nocombine]] +-- opt.list = true +-- opt.listchars:append 'space:⋅' +-- opt.listchars:append 'space:' +-- opt.listchars:append 'eol:↴' + +indent_blankline.setup({ + -- show_end_of_line = true, + -- space_char_blankline = ' ', + show_current_context = true, + -- show_current_context_start = true, + -- char_highlight_list = { + -- 'IndentBlanklineIndent1', + -- 'IndentBlanklineIndent2', + -- 'IndentBlanklineIndent3', + -- }, +}) diff --git a/.config/nvim/lua/user/keymaps.lua b/.config/nvim/lua/user/keymaps.lua new file mode 100644 index 00000000..6ab01f3e --- /dev/null +++ b/.config/nvim/lua/user/keymaps.lua @@ -0,0 +1,108 @@ +local keymap = vim.api.nvim_set_keymap +local opts = { noremap = true, silent = true } +local term_opts = { silent = true } + +--Remap space as leader key +keymap('', '', '', opts) +vim.g.mapleader = ' ' +vim.g.maplocalleader = ' ' + +-- Modes +-- normal_mode = 'n', +-- insert_mode = 'i', +-- visual_mode = 'v', +-- visual_block_mode = 'x', +-- term_mode = 't', +-- command_mode = 'c', + +-- Normal -- +-- Shortcutting split navigation +keymap('n', '', 'h', opts) +keymap('n', '', 'j', opts) +keymap('n', '', 'k', opts) +keymap('n', '', 'l', opts) + +-- Resize with arrows +keymap('n', '', 'resize -2', opts) +keymap('n', '', 'resize +2', opts) +keymap('n', '', 'vertical resize -2', opts) +keymap('n', '', 'vertical resize +2', opts) + +-- Navigate buffers +keymap('n', '', 'bnext', opts) +keymap('n', '', 'bprevious', opts) + +-- Move text up and down +keymap('n', '', 'm .+1==gi', opts) +keymap('n', '', 'm .-2==gi', opts) + +-- Insert -- +-- Press jk fast to exit insert mode +keymap('i', 'jk', '', opts) + +-- Visual -- +-- Stay in indent mode +keymap('v', '<', '', '>gv', opts) + +-- Move text up and down +keymap('v', '', 'm .+1==', opts) +keymap('v', '', 'm .-2==', opts) +keymap('v', 'p', '"_dP', opts) + +-- Visual Block -- +-- Move text up and down +keymap('x', 'J', 'move ">+1gv-gv', opts) +keymap('x', 'K', 'move "<-2gv-gv', opts) +keymap('x', '', 'move ">+1gv-gv', opts) +keymap('x', '', 'move "<-2gv-gv', opts) + +-- Terminal -- +-- Better terminal navigation +-- keymap('t', '', 'h', term_opts) +-- keymap('t', '', 'j', term_opts) +-- keymap('t', '', 'k', term_opts) +-- keymap('t', '', 'l', term_opts) + +keymap('n', 'n', ':NvimTreeFocus', opts) +keymap('n', 'C-t', ':NvimTreeToggle', opts) +keymap('n', 'C-f', ':NvimTreeFindFile', opts) +keymap('n', '', ':NvimTreeRefresh', opts) + +-- Enable/Disable auto comment +keymap('', 'c', 'setlocal formatoption-=CRo', {}) +keymap('', 'C', 'setlocal formatoption=CRo', {}) + +-- Enable spell checking, s for spell check +keymap('', 's', 'setlocal spell! spelllang=eu_us', {}) + +-- Enable / Disable auto indent +keymap('', 'i', 'setlocal autoindent', {}) +keymap('', 'I', 'setlocal noautoindent', {}) + +-- Moving line up or down by one line +keymap('', '', 'm -2', opts) +keymap('', '', 'm -2', opts) +keymap('', '', 'm +1', opts) +keymap('', '', 'm +1', opts) + +-- Find files using Telescope command-line +keymap('n', 'ff', 'Telescope find_files hidden=true', opts) +keymap('n', 'fg', 'Telescope live_grep', opts) +keymap('n', 'fb', 'Telescope buffers', opts) +keymap('n', 'fh', 'Telescope help_tags', opts) + +-- Alias 'replace all' to S +keymap('n', 'S', 's%//', opts) + + +-- " run current script with python3 by CTRL+R in command and insert mode +-- autocmd FileType python map wexec '!python3' shellescape(@%, 1) +-- autocmd FileType python imap wexec '!python3' shellescape(@%, 1) +-- autocmd FileType rust map wexec '!cargo run' +-- autocmd FileType rust imap wexec '!cargo run' + +-- autocmd BufWritePre,InsertLeave *.{py,rs,html,css,md,lua} Neoformat +-- let g:neoformat_enabled_python = ['autopep8'] +-- let g:neoformat_try_node_exe = 1 + diff --git a/.config/nvim/lua/user/lsp/configs.lua b/.config/nvim/lua/user/lsp/configs.lua new file mode 100644 index 00000000..cbc2a203 --- /dev/null +++ b/.config/nvim/lua/user/lsp/configs.lua @@ -0,0 +1,24 @@ +local status_ok, lsp_installer = pcall(require, 'nvim-lsp-installer') +if not status_ok then + return +end + +local lspconfig = require('lspconfig') + +local servers = { 'jsonls', 'sumneko_lua', 'pyright' } + +lsp_installer.setup({ + ensure_installed = servers, +}) + +for _, server in pairs(servers) do + local opts = { + on_attach = require('user.lsp.handlers').on_attach, + capabilities = require('user.lsp.handlers').capabilities, + } + local has_custom_opts, server_custom_opts = pcall(require, 'user.lsp.settings.' .. server) + if has_custom_opts then + opts = vim.tbl_deep_extend('force', opts, server_custom_opts) + end + lspconfig[server].setup(opts) +end diff --git a/.config/nvim/lua/user/lsp/handlers.lua b/.config/nvim/lua/user/lsp/handlers.lua new file mode 100644 index 00000000..1c857529 --- /dev/null +++ b/.config/nvim/lua/user/lsp/handlers.lua @@ -0,0 +1,102 @@ +local M = {} + +-- TODO: backfill this to template +M.setup = function() + local signs = { + { name = 'DiagnosticSignError', text = '' }, + { name = 'DiagnosticSignWarn', text = '' }, + { name = 'DiagnosticSignHint', text = '' }, + { name = 'DiagnosticSignInfo', text = '' }, + } + + for _, sign in ipairs(signs) do + vim.fn.sign_define(sign.name, { texthl = sign.name, text = sign.text, numhl = '' }) + end + + local config = { + -- disable virtual text + virtual_text = false, + -- show signs + signs = { + active = signs, + }, + update_in_insert = true, + underline = true, + severity_sort = true, + float = { + focusable = false, + style = 'minimal', + border = 'rounded', + source = 'always', + header = '', + prefix = '', + }, + } + + vim.diagnostic.config(config) + + vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { + border = 'rounded', + width = 60, + }) + + vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with(vim.lsp.handlers.signature_help, { + border = 'rounded', + width = 60, + }) +end + +local function lsp_highlight_document(client) + -- Set autocommands conditional on server_capabilities + local status_ok, illuminate = pcall(require, 'illuminate') + if not status_ok then + return + end + illuminate.on_attach(client) + -- end +end + +local function lsp_keymaps(bufnr) + local opts = { noremap = true, silent = true } + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gD', 'lua vim.lsp.buf.declaration()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gd', 'lua vim.lsp.buf.definition()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'K', 'lua vim.lsp.buf.hover()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gi', 'lua vim.lsp.buf.implementation()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', '', 'lua vim.lsp.buf.signature_help()', opts) + -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'rn', 'lua vim.lsp.buf.rename()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'gr', 'lua vim.lsp.buf.references()', opts) + -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'ca', 'lua vim.lsp.buf.code_action()', opts) + -- vim.api.nvim_buf_set_keymap(bufnr, 'n', 'f', 'lua vim.diagnostic.open_float()', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', '[d', 'lua vim.diagnostic.goto_prev({ border = "rounded" })', opts) + vim.api.nvim_buf_set_keymap( + bufnr, + 'n', + 'gl', + 'lua vim.diagnostic.open_float({ border = "rounded" })', + opts + ) + vim.api.nvim_buf_set_keymap(bufnr, 'n', ']d', 'lua vim.diagnostic.goto_next({ border = "rounded" })', opts) + vim.api.nvim_buf_set_keymap(bufnr, 'n', 'q', 'lua vim.diagnostic.setloclist()', opts) + vim.cmd([[ command! Format execute 'lua vim.lsp.buf.format{async=true}' ]]) +end + +M.on_attach = function(client, bufnr) + -- vim.notify(client.name .. ' starting...') + -- TODO: refactor this into a method that checks if string in list + if client.name == 'tsserver' then + client.resolved_capabilities.document_formatting = false + end + lsp_keymaps(bufnr) + lsp_highlight_document(client) +end + +local capabilities = vim.lsp.protocol.make_client_capabilities() + +local status_ok, cmp_nvim_lsp = pcall(require, 'cmp_nvim_lsp') +if not status_ok then + return +end + +M.capabilities = cmp_nvim_lsp.update_capabilities(capabilities) + +return M diff --git a/.config/nvim/lua/user/lsp/init.lua b/.config/nvim/lua/user/lsp/init.lua new file mode 100644 index 00000000..39f39856 --- /dev/null +++ b/.config/nvim/lua/user/lsp/init.lua @@ -0,0 +1,8 @@ +local status_ok, _ = pcall(require, 'lspconfig') +if not status_ok then + return +end + +require('user.lsp.configs') +require('user.lsp.handlers').setup() +require('user.lsp.null-ls') diff --git a/.config/nvim/lua/user/lsp/null-ls.lua b/.config/nvim/lua/user/lsp/null-ls.lua new file mode 100644 index 00000000..83c42438 --- /dev/null +++ b/.config/nvim/lua/user/lsp/null-ls.lua @@ -0,0 +1,19 @@ +local null_ls_status_ok, null_ls = pcall(require, 'null-ls') +if not null_ls_status_ok then + return +end + +-- https://github.com/jose-elias-alvarez/null-ls.nvim/tree/main/lua/null-ls/builtins/formatting +local formatting = null_ls.builtins.formatting +-- https://github.com/jose-elias-alvarez/null-ls.nvim/tree/main/lua/null-ls/builtins/diagnostics +local diagnostics = null_ls.builtins.diagnostics + +null_ls.setup({ + debug = false, + sources = { + formatting.prettier.with({ extra_args = { '--no-semi', '--single-quote', '--jsx-single-quote' } }), + formatting.black.with({ extra_args = { '--fast' } }), + formatting.stylua, + -- diagnostics.flake8 + }, +}) diff --git a/.config/nvim/lua/user/lsp/settings/jsonls.lua b/.config/nvim/lua/user/lsp/settings/jsonls.lua new file mode 100644 index 00000000..856af467 --- /dev/null +++ b/.config/nvim/lua/user/lsp/settings/jsonls.lua @@ -0,0 +1,197 @@ +local default_schemas = nil +local status_ok, jsonls_settings = pcall(require, "nlspsettings.jsonls") +if status_ok then + default_schemas = jsonls_settings.get_default_schemas() +end + +local schemas = { + { + description = "TypeScript compiler configuration file", + fileMatch = { + "tsconfig.json", + "tsconfig.*.json", + }, + url = "https://json.schemastore.org/tsconfig.json", + }, + { + description = "Lerna config", + fileMatch = { "lerna.json" }, + url = "https://json.schemastore.org/lerna.json", + }, + { + description = "Babel configuration", + fileMatch = { + ".babelrc.json", + ".babelrc", + "babel.config.json", + }, + url = "https://json.schemastore.org/babelrc.json", + }, + { + description = "ESLint config", + fileMatch = { + ".eslintrc.json", + ".eslintrc", + }, + url = "https://json.schemastore.org/eslintrc.json", + }, + { + description = "Bucklescript config", + fileMatch = { "bsconfig.json" }, + url = "https://raw.githubusercontent.com/rescript-lang/rescript-compiler/8.2.0/docs/docson/build-schema.json", + }, + { + description = "Prettier config", + fileMatch = { + ".prettierrc", + ".prettierrc.json", + "prettier.config.json", + }, + url = "https://json.schemastore.org/prettierrc", + }, + { + description = "Vercel Now config", + fileMatch = { "now.json" }, + url = "https://json.schemastore.org/now", + }, + { + description = "Stylelint config", + fileMatch = { + ".stylelintrc", + ".stylelintrc.json", + "stylelint.config.json", + }, + url = "https://json.schemastore.org/stylelintrc", + }, + { + description = "A JSON schema for the ASP.NET LaunchSettings.json files", + fileMatch = { "launchsettings.json" }, + url = "https://json.schemastore.org/launchsettings.json", + }, + { + description = "Schema for CMake Presets", + fileMatch = { + "CMakePresets.json", + "CMakeUserPresets.json", + }, + url = "https://raw.githubusercontent.com/Kitware/CMake/master/Help/manual/presets/schema.json", + }, + { + description = "Configuration file as an alternative for configuring your repository in the settings page.", + fileMatch = { + ".codeclimate.json", + }, + url = "https://json.schemastore.org/codeclimate.json", + }, + { + description = "LLVM compilation database", + fileMatch = { + "compile_commands.json", + }, + url = "https://json.schemastore.org/compile-commands.json", + }, + { + description = "Config file for Command Task Runner", + fileMatch = { + "commands.json", + }, + url = "https://json.schemastore.org/commands.json", + }, + { + description = "AWS CloudFormation provides a common language for you to describe and provision all the infrastructure resources in your cloud environment.", + fileMatch = { + "*.cf.json", + "cloudformation.json", + }, + url = "https://raw.githubusercontent.com/awslabs/goformation/v5.2.9/schema/cloudformation.schema.json", + }, + { + description = "The AWS Serverless Application Model (AWS SAM, previously known as Project Flourish) extends AWS CloudFormation to provide a simplified way of defining the Amazon API Gateway APIs, AWS Lambda functions, and Amazon DynamoDB tables needed by your serverless application.", + fileMatch = { + "serverless.template", + "*.sam.json", + "sam.json", + }, + url = "https://raw.githubusercontent.com/awslabs/goformation/v5.2.9/schema/sam.schema.json", + }, + { + description = "Json schema for properties json file for a GitHub Workflow template", + fileMatch = { + ".github/workflow-templates/**.properties.json", + }, + url = "https://json.schemastore.org/github-workflow-template-properties.json", + }, + { + description = "golangci-lint configuration file", + fileMatch = { + ".golangci.toml", + ".golangci.json", + }, + url = "https://json.schemastore.org/golangci-lint.json", + }, + { + description = "JSON schema for the JSON Feed format", + fileMatch = { + "feed.json", + }, + url = "https://json.schemastore.org/feed.json", + versions = { + ["1"] = "https://json.schemastore.org/feed-1.json", + ["1.1"] = "https://json.schemastore.org/feed.json", + }, + }, + { + description = "Packer template JSON configuration", + fileMatch = { + "packer.json", + }, + url = "https://json.schemastore.org/packer.json", + }, + { + description = "NPM configuration file", + fileMatch = { + "package.json", + }, + url = "https://json.schemastore.org/package.json", + }, + { + description = "JSON schema for Visual Studio component configuration files", + fileMatch = { + "*.vsconfig", + }, + url = "https://json.schemastore.org/vsconfig.json", + }, + { + description = "Resume json", + fileMatch = { "resume.json" }, + url = "https://raw.githubusercontent.com/jsonresume/resume-schema/v1.0.0/schema.json", + }, +} + +local function extend(tab1, tab2) + for _, value in ipairs(tab2 or {}) do + table.insert(tab1, value) + end + return tab1 +end + +local extended_schemas = extend(schemas, default_schemas) + +local opts = { + settings = { + json = { + schemas = extended_schemas, + }, + }, + setup = { + commands = { + Format = { + function() + vim.lsp.buf.range_formatting({}, { 0, 0 }, { vim.fn.line "$", 0 }) + end, + }, + }, + }, +} + +return opts diff --git a/.config/nvim/lua/user/lsp/settings/pyright.lua b/.config/nvim/lua/user/lsp/settings/pyright.lua new file mode 100644 index 00000000..501d073d --- /dev/null +++ b/.config/nvim/lua/user/lsp/settings/pyright.lua @@ -0,0 +1,9 @@ +return { + settings = { + python = { + analysis = { + typeCheckingMode = "off" + }, + }, + }, +} \ No newline at end of file diff --git a/.config/nvim/lua/user/lsp/settings/sumneko_lua.lua b/.config/nvim/lua/user/lsp/settings/sumneko_lua.lua new file mode 100644 index 00000000..9848bdd8 --- /dev/null +++ b/.config/nvim/lua/user/lsp/settings/sumneko_lua.lua @@ -0,0 +1,15 @@ +return { + settings = { + Lua = { + diagnostics = { + globals = { "vim" }, + }, + workspace = { + library = { + [vim.fn.expand("$VIMRUNTIME/lua")] = true, + [vim.fn.stdpath("config") .. "/lua"] = true, + }, + }, + }, + }, +} diff --git a/.config/nvim/lua/user/lualine.lua b/.config/nvim/lua/user/lualine.lua new file mode 100644 index 00000000..cfc325ac --- /dev/null +++ b/.config/nvim/lua/user/lualine.lua @@ -0,0 +1,93 @@ +local status_ok, lualine = pcall(require, 'lualine') +if not status_ok then + return +end + +local hide_in_width = function() + return vim.fn.winwidth(0) > 80 +end + +local diagnostics = { + 'diagnostics', + sources = { 'nvim_diagnostic' }, + sections = { 'error', 'warn' }, + symbols = { error = ' ', warn = ' ' }, + colored = false, + update_in_insert = false, + always_visible = true, +} + +local diff = { + 'diff', + colored = false, + symbols = { added = ' ', modified = ' ', removed = ' ' }, -- changes diff symbols + cond = hide_in_width +} + +local mode = { + 'mode', + fmt = function(str) + return '-- ' .. str .. ' --' + end, +} + +local filetype = { + 'filetype', + icons_enabled = false, + icon = nil, +} + +local branch = { + 'branch', + icons_enabled = true, + icon = '', +} + +local location = { + 'location', + padding = 0, +} + +-- cool function for progress +local progress = function() + local current_line = vim.fn.line('.') + local total_lines = vim.fn.line('$') + local chars = { '__', '▁▁', '▂▂', '▃▃', '▄▄', '▅▅', '▆▆', '▇▇', '██' } + local line_ratio = current_line / total_lines + local index = math.ceil(line_ratio * #chars) + return chars[index] +end + +local spaces = function() + return 'spaces: ' .. vim.api.nvim_buf_get_option(0, 'shiftwidth') +end + +lualine.setup({ + options = { + icons_enabled = true, + theme = 'auto', + component_separators = { left = '', right = ''}, + section_separators = { left = '', right = ''}, + disabled_filetypes = {}, + always_divide_middle = true, + globalstatus = false, + }, + sections = { + lualine_a = {'mode'}, + lualine_b = {'branch', 'diff', 'diagnostics'}, + lualine_c = {'filename'}, + lualine_x = {'encoding', 'fileformat', 'filetype'}, + lualine_y = {'progress'}, + lualine_z = {'location'} + }, + inactive_sections = { + lualine_a = {}, + lualine_b = {}, + lualine_c = { 'filename' }, + lualine_x = { 'location' }, + lualine_y = {}, + lualine_z = {}, + }, + tabline = {}, + extensions = {}, +}) diff --git a/.config/nvim/lua/user/nvim-tree.lua b/.config/nvim/lua/user/nvim-tree.lua new file mode 100644 index 00000000..a40958d6 --- /dev/null +++ b/.config/nvim/lua/user/nvim-tree.lua @@ -0,0 +1,81 @@ +local status_ok, nvim_tree = pcall(require, 'nvim-tree') +if not status_ok then + return +end + +local config_status_ok, nvim_tree_config = pcall(require, 'nvim-tree.config') +if not config_status_ok then + return +end + +local tree_cb = nvim_tree_config.nvim_tree_callback + + +nvim_tree.setup { + sort_by = 'case_sensitive', + update_focused_file = { + enable = true, + update_cwd = true, + }, + renderer = { + group_empty = true, + root_folder_modifier = ':t', + icons = { + webdev_colors = true, + show = { + file = true, + folder = true, + folder_arrow = true, + git = true, + }, + glyphs = { + default = '', + symlink = '', + folder = { + arrow_open = '', + arrow_closed = '', + default = '', + open = '', + empty = '', + empty_open = '', + symlink = '', + symlink_open = '', + }, + git = { + unstaged = '', + staged = 'S', + unmerged = '', + renamed = '➜', + untracked = 'U', + deleted = '', + ignored = '◌', + }, + }, + }, + }, + diagnostics = { + enable = true, + show_on_dirs = true, + icons = { + hint = '', + info = '', + warning = '', + error = '', + }, + }, + view = { + width = 30, + height = 30, + side = 'left', + mappings = { + list = { + { key = { 'l', '', 'o' }, cb = tree_cb 'edit' }, + { key = 'h', cb = tree_cb 'close_node' }, + { key = 'v', cb = tree_cb 'vsplit' }, + }, + }, + }, + filters = { + dotfiles = false, + }, +} \ No newline at end of file diff --git a/.config/nvim/lua/user/options.lua b/.config/nvim/lua/user/options.lua new file mode 100644 index 00000000..62cff0f2 --- /dev/null +++ b/.config/nvim/lua/user/options.lua @@ -0,0 +1,56 @@ +local g = vim.g +local o = vim.o + +g.mapleader = ' ' +g.maplocalleader = ' ' + +local options = { + backup = false, -- creates a backup file + clipboard = 'unnamedplus', -- allows neovim to access the system clipboard + cmdheight = 2, -- more space in the neovim command line for displaying messages + completeopt = { 'menu', 'menuone', 'noselect' }, -- mostly just for cmp + conceallevel = 0, -- so that `` is visible in markdown files + fileencoding = 'utf-8', -- the encoding written to a file + hlsearch = true, -- highlight all matches on previous search pattern + ignorecase = true, -- ignore case in search patterns + mouse = 'a', -- allow the mouse to be used in neovim + pumheight = 10, -- pop up menu height + showmode = false, -- we don't need to see things like -- INSERT -- anymore + showtabline = 2, -- always show tabs + smartcase = true, -- smart case + smartindent = true, -- make indenting smarter again + splitbelow = true, -- force all horizontal splits to go below current window + splitright = true, -- force all vertical splits to go to the right of current window + swapfile = true, -- creates a swapfile + termguicolors = true, -- set term gui colors (most terminals support this) + timeoutlen = 100, -- time to wait for a mapped sequence to complete (in milliseconds) + undofile = true, -- enable persistent undo + updatetime = 300, -- faster completion (4000ms default) + writebackup = false, -- if a file is being edited by another program (or was written to file while editing with another program), it is not allowed to be edited + expandtab = true, -- convert tabs to spaces + shiftwidth = 4, -- the number of spaces inserted for each indentation + tabstop = 4, -- insert 4 spaces for a tab + cursorline = true, -- highlight the current line + cursorcolumn = true, -- highlight the current column + number = true, -- set numbered lines + relativenumber = true, -- set relative numbered lines + numberwidth = 4, -- set number column width to 4 {default 4} + signcolumn = 'yes', -- always show the sign column, otherwise it would shift the text each time + wrap = false, -- display lines as one long line + scrolloff = 8, -- is one of my fav + sidescrolloff = 8, + --wildmode = 'longest,list,full', + guifont = 'JetBrainsMono NF:h11', -- the font used in graphical neovim applications +} + +for k, v in pairs(options) do + vim.opt[k] = v +end + +vim.cmd [[highlight CursorLine ctermbg=Yellow cterm=bold guibg=#2b2b2b]] +vim.cmd [[highlight CursorColumn ctermbg=Yellow cterm=bold guibg=#2b2b2b]] + + +g.dracula_transparent_bg = true +g.dracula_italic_comment = true +g.dracula_show_end_of_buffer = true diff --git a/.config/nvim/lua/user/plugins.lua b/.config/nvim/lua/user/plugins.lua new file mode 100644 index 00000000..bd13c5e7 --- /dev/null +++ b/.config/nvim/lua/user/plugins.lua @@ -0,0 +1,114 @@ +local fn = vim.fn + +-- Automatically install packer +local install_path = fn.stdpath('data') .. '/site/pack/packer/start/packer.nvim' +if fn.empty(fn.glob(install_path)) > 0 then + PACKER_BOOTSTRAP = fn.system({ + 'git', + 'clone', + '--depth', + '1', + 'https://github.com/wbthomason/packer.nvim', + install_path, + }) + print('Installing packer close and reopen Neovim...') + vim.cmd([[packadd packer.nvim]]) +end + +-- Autocommand that reloads neovim whenever you save the plugins.lua file +vim.cmd([[ + augroup packer_user_config + autocmd! + autocmd BufWritePost plugins.lua source | PackerSync + augroup end +]]) + +-- Use a protected call so we don't error out on first use +local status_ok, packer = pcall(require, 'packer') +if not status_ok then + return +end + +-- Have packer use a popup window +packer.init({ + display = { + open_fn = function() + return require('packer.util').float({ border = 'rounded' }) + end, + }, +}) + +-- Install your plugins here +return packer.startup( + function(use) + -- My plugins here + + use 'wbthomason/packer.nvim' -- Have packer manage itself + use 'nvim-lua/popup.nvim' -- Useful lua functions used by lots of plugins + use 'nvim-lua/plenary.nvim' -- Useful lua functions used by lots of plugins + use 'windwp/nvim-autopairs' -- Autopairs, integrates with both cmp and treesitter + use 'numToStr/Comment.nvim' + use 'JoosepAlviste/nvim-ts-context-commentstring' + use 'kyazdani42/nvim-web-devicons' + use 'kyazdani42/nvim-tree.lua' + use 'akinsho/bufferline.nvim' + use 'moll/vim-bbye' + use 'nvim-lualine/lualine.nvim' + use 'akinsho/toggleterm.nvim' + use 'ahmedkhalf/project.nvim' + use 'lewis6991/impatient.nvim' + use 'lukas-reineke/indent-blankline.nvim' + use 'goolord/alpha-nvim' + use 'folke/which-key.nvim' + use 'andweeb/presence.nvim' + use 'mattn/emmet-vim' + use 'sbdchd/neoformat' + use 'vimwiki/vimwiki' + use 'saecki/crates.nvim' + use { + 'norcalli/nvim-colorizer.lua', + config = function() + require('colorizer').setup() + end + } + + -- Colorschemes + use 'Mofiqul/dracula.nvim' + use 'folke/tokyonight.nvim' + use 'lunarvim/darkplus.nvim' + + -- cmp plugins + use 'hrsh7th/nvim-cmp'-- The completion plugin + use 'hrsh7th/cmp-buffer' -- buffer completions + use 'hrsh7th/cmp-path'-- path completions + use 'hrsh7th/cmp-cmdline' -- cmdline completions + use 'saadparwaiz1/cmp_luasnip' -- snippet completions + use 'hrsh7th/cmp-nvim-lsp' + use 'hrsh7th/cmp-nvim-lua' + + -- snippets + use 'L3MON4D3/LuaSnip' --snippet engine + use 'rafamadriz/friendly-snippets' -- a bunch of snippets to use + + -- LSP + use 'neovim/nvim-lspconfig' -- enable LSP + use 'williamboman/nvim-lsp-installer' -- simple to use language server installer + use 'jose-elias-alvarez/null-ls.nvim' -- for formatters and linters + + -- Telescope + use 'nvim-telescope/telescope.nvim' + use {'nvim-telescope/telescope-fzf-native.nvim', run = 'make' } + + -- Treesitter + use 'nvim-treesitter/nvim-treesitter' + + -- Git + use 'lewis6991/gitsigns.nvim' + + -- Automatically set up your configuration after cloning packer.nvim + -- Put this at the end after all plugins + if PACKER_BOOTSTRAP then + require('packer').sync() + end + end +) diff --git a/.config/nvim/lua/user/project.lua b/.config/nvim/lua/user/project.lua new file mode 100644 index 00000000..df04f3ca --- /dev/null +++ b/.config/nvim/lua/user/project.lua @@ -0,0 +1,48 @@ +local status_ok, project = pcall(require, "project_nvim") +if not status_ok then + return +end +project.setup({ + ---@usage set to false to disable project.nvim. + --- This is on by default since it's currently the expected behavior. + active = true, + + on_config_done = nil, + + ---@usage set to true to disable setting the current-woriking directory + --- Manual mode doesn't automatically change your root directory, so you have + --- the option to manually do so using `:ProjectRoot` command. + manual_mode = false, + + ---@usage Methods of detecting the root directory + --- Allowed values: **"lsp"** uses the native neovim lsp + --- **"pattern"** uses vim-rooter like glob pattern matching. Here + --- order matters: if one is not detected, the other is used as fallback. You + --- can also delete or rearangne the detection methods. + -- detection_methods = { "lsp", "pattern" }, -- NOTE: lsp detection will get annoying with multiple langs in one project + detection_methods = { "pattern" }, + + ---@usage patterns used to detect root dir, when **"pattern"** is in detection_methods + patterns = { ".git", "_darcs", ".hg", ".bzr", ".svn", "Makefile", "package.json" }, + + ---@ Show hidden files in telescope when searching for files in a project + show_hidden = false, + + ---@usage When set to false, you will get a message when project.nvim changes your directory. + -- When set to false, you will get a message when project.nvim changes your directory. + silent_chdir = true, + + ---@usage list of lsp client names to ignore when using **lsp** detection. eg: { "efm", ... } + ignore_lsp = {}, + + ---@type string + ---@usage path to store the project history for use in telescope + datapath = vim.fn.stdpath("data"), +}) + +local tele_status_ok, telescope = pcall(require, "telescope") +if not tele_status_ok then + return +end + +telescope.load_extension('projects') diff --git a/.config/nvim/lua/user/telescope.lua b/.config/nvim/lua/user/telescope.lua new file mode 100644 index 00000000..84e7e94c --- /dev/null +++ b/.config/nvim/lua/user/telescope.lua @@ -0,0 +1,99 @@ +local status_ok, telescope = pcall(require, 'telescope') +if not status_ok then + return +end + +local actions = require 'telescope.actions' + +telescope.setup { + defaults = { + + prompt_prefix = ' ', + selection_caret = ' ', + path_display = { 'smart' }, + + mappings = { + i = { + [''] = actions.cycle_history_next, + [''] = actions.cycle_history_prev, + + [''] = actions.move_selection_next, + [''] = actions.move_selection_previous, + + [''] = actions.close, + + [''] = actions.move_selection_next, + [''] = actions.move_selection_previous, + + [''] = actions.select_default, + [''] = actions.select_horizontal, + [''] = actions.select_vertical, + [''] = actions.select_tab, + + [''] = actions.preview_scrolling_up, + [''] = actions.preview_scrolling_down, + + [''] = actions.results_scrolling_up, + [''] = actions.results_scrolling_down, + + [''] = actions.toggle_selection + actions.move_selection_worse, + [''] = actions.toggle_selection + actions.move_selection_better, + [''] = actions.send_to_qflist + actions.open_qflist, + [''] = actions.send_selected_to_qflist + actions.open_qflist, + [''] = actions.complete_tag, + [''] = actions.which_key, -- keys from pressing + }, + + n = { + [''] = actions.close, + [''] = actions.select_default, + [''] = actions.select_horizontal, + [''] = actions.select_vertical, + [''] = actions.select_tab, + + [''] = actions.toggle_selection + actions.move_selection_worse, + [''] = actions.toggle_selection + actions.move_selection_better, + [''] = actions.send_to_qflist + actions.open_qflist, + [''] = actions.send_selected_to_qflist + actions.open_qflist, + + ['j'] = actions.move_selection_next, + ['k'] = actions.move_selection_previous, + ['H'] = actions.move_to_top, + ['M'] = actions.move_to_middle, + ['L'] = actions.move_to_bottom, + + [''] = actions.move_selection_next, + [''] = actions.move_selection_previous, + ['gg'] = actions.move_to_top, + ['G'] = actions.move_to_bottom, + + [''] = actions.preview_scrolling_up, + [''] = actions.preview_scrolling_down, + + [''] = actions.results_scrolling_up, + [''] = actions.results_scrolling_down, + + ['?'] = actions.which_key, + }, + }, + }, + pickers = { + -- Default configuration for builtin pickers goes here: + -- picker_name = { + -- picker_config_key = value, + -- ... + -- } + -- Now the picker_config_key will be applied every time you call this + -- builtin picker + }, + extensions = { + fzf = { + fuzzy = true, -- false will only do exact matching + override_generic_sorter = true, -- override the generic sorter + override_file_sorter = true, -- override the file sorter + case_mode = "smart_case", -- or "ignore_case" or "respect_case" + -- the default case_mode is "smart_case" + }, + } +} +require('telescope').load_extension('fzf') \ No newline at end of file diff --git a/.config/nvim/lua/user/toggleterm.lua b/.config/nvim/lua/user/toggleterm.lua new file mode 100644 index 00000000..d4866ca4 --- /dev/null +++ b/.config/nvim/lua/user/toggleterm.lua @@ -0,0 +1,71 @@ +local api = vim.api +local status_ok, toggleterm = pcall(require, 'toggleterm') +if not status_ok then + return +end + +toggleterm.setup({ + size = 20, + open_mapping = [[]], + hide_numbers = true, + shade_filetypes = {}, + shade_terminals = true, + shading_factor = 2, + start_in_insert = true, + insert_mappings = true, + persist_size = true, + direction = 'float', + close_on_exit = true, + shell = vim.o.shell, + float_opts = { + border = 'curved', + winblend = 0, + highlights = { + border = 'Normal', + background = 'Normal', + }, + }, +}) + +function _G.set_terminal_keymaps() + local opts = {noremap = true} + api.nvim_buf_set_keymap(0, 't', '', [[]], opts) + api.nvim_buf_set_keymap(0, 't', 'jk', [[]], opts) + api.nvim_buf_set_keymap(0, 't', '', [[h]], opts) + api.nvim_buf_set_keymap(0, 't', '', [[j]], opts) + api.nvim_buf_set_keymap(0, 't', '', [[k]], opts) + api.nvim_buf_set_keymap(0, 't', '', [[l]], opts) +end + +vim.cmd('autocmd! TermOpen term://* lua set_terminal_keymaps()') + +local Terminal = require('toggleterm.terminal').Terminal +local lazygit = Terminal:new({ cmd = 'lazygit', hidden = true }) + +function _LAZYGIT_TOGGLE() + lazygit:toggle() +end + +local node = Terminal:new({ cmd = 'node', hidden = true }) + +function _NODE_TOGGLE() + node:toggle() +end + +local ncdu = Terminal:new({ cmd = 'ncdu', hidden = true }) + +function _NCDU_TOGGLE() + ncdu:toggle() +end + +local htop = Terminal:new({ cmd = 'htop', hidden = true }) + +function _HTOP_TOGGLE() + htop:toggle() +end + +local python = Terminal:new({ cmd = 'python', hidden = true }) + +function _PYTHON_TOGGLE() + python:toggle() +end diff --git a/.config/nvim/lua/user/treesitter.lua b/.config/nvim/lua/user/treesitter.lua new file mode 100644 index 00000000..6e7644ca --- /dev/null +++ b/.config/nvim/lua/user/treesitter.lua @@ -0,0 +1,17 @@ +local status_ok, configs = pcall(require, 'nvim-treesitter.configs') +if not status_ok then + return +end + +configs.setup({ + ensure_installed = 'all', -- one of 'all' or a list of languages + ignore_install = { '' }, -- List of parsers to ignore installing + highlight = { + enable = true, -- false will disable the whole extension + disable = { }, -- list of language that will be disabled + }, + autopairs = { + enable = true, + }, + indent = { enable = true, disable = { } }, +}) diff --git a/.config/nvim/lua/user/whichkey.lua b/.config/nvim/lua/user/whichkey.lua new file mode 100644 index 00000000..4812cc9a --- /dev/null +++ b/.config/nvim/lua/user/whichkey.lua @@ -0,0 +1,187 @@ +local status_ok, which_key = pcall(require, 'which-key') +if not status_ok then + return +end + +local setup = { + plugins = { + marks = true, -- shows a list of your marks on ' and ` + registers = true, -- shows your registers on ' in NORMAL or in INSERT mode + spelling = { + enabled = true, -- enabling this will show WhichKey when pressing z= to select spelling suggestions + suggestions = 20, -- how many suggestions should be shown in the list? + }, + -- the presets plugin, adds help for a bunch of default keybindings in Neovim + -- No actual key bindings are created + presets = { + operators = false, -- adds help for operators like d, y, ... and registers them for motion / text object completion + motions = true, -- adds help for motions + text_objects = true, -- help for text objects triggered after entering an operator + windows = true, -- default bindings on + nav = true, -- misc bindings to work with windows + z = true, -- bindings for folds, spelling and others prefixed with z + g = true, -- bindings for prefixed with g + }, + }, + -- add operators that will trigger motion and text object completion + -- to enable all native operators, set the preset / operators plugin above + -- operators = { gc = 'Comments' }, + key_labels = { + -- override the label used to display some keys. It doesn't effect WK in any other way. + -- For example: + -- [''] = 'SPC', + -- [''] = 'RET', + -- [''] = 'TAB', + }, + icons = { + breadcrumb = '»', -- symbol used in the command line area that shows your active key combo + separator = '➜', -- symbol used between a key and it's label + group = '+', -- symbol prepended to a group + }, + popup_mappings = { + scroll_down = '', -- binding to scroll down inside the popup + scroll_up = '', -- binding to scroll up inside the popup + }, + window = { + border = 'rounded', -- none, single, double, shadow + position = 'bottom', -- bottom, top + margin = { 1, 0, 1, 0 }, -- extra window margin [top, right, bottom, left] + padding = { 2, 2, 2, 2 }, -- extra window padding [top, right, bottom, left] + winblend = 0, + }, + layout = { + height = { min = 4, max = 25 }, -- min and max height of the columns + width = { min = 20, max = 50 }, -- min and max width of the columns + spacing = 3, -- spacing between columns + align = 'left', -- align columns left, center or right + }, + ignore_missing = true, -- enable this to hide mappings for which you didn't specify a label + hidden = { '', '', '', '', 'call', 'lua', '^:', '^ ' }, -- hide mapping boilerplate + show_help = true, -- show help message on the command line when the popup is visible + triggers = 'auto', -- automatically setup triggers + -- triggers = {''} -- or specify a list manually + triggers_blacklist = { + -- list of mode / prefixes that should never be hooked by WhichKey + -- this is mostly relevant for key maps that start with a native binding + -- most people should not need to change this + i = { 'j', 'k' }, + v = { 'j', 'k' }, + }, +} + +local opts = { + mode = 'n', -- NORMAL mode + prefix = '', + buffer = nil, -- Global mappings. Specify a buffer number for buffer local mappings + silent = true, -- use `silent` when creating keymaps + noremap = true, -- use `noremap` when creating keymaps + nowait = true, -- use `nowait` when creating keymaps +} + +local mappings = { + ['a'] = { 'Alpha', 'Alpha' }, + ['b'] = { + 'lua require("telescope.builtin").buffers(require"telescope.themes").get_dropdown{previewer = false})', + 'Buffers', + }, + ['e'] = { 'NvimTreeToggle', 'Explorer' }, + ['w'] = { 'w!', 'Save' }, + ['q'] = { 'q!', 'Quit' }, + ['c'] = { 'Bdelete!', 'Close Buffer' }, + ['h'] = { 'nohlsearch', 'No Highlight' }, + ['f'] = { + 'lua require("telescope.builtin").find_files(require("telescope.themes").get_dropdown{previewer = false})', + 'Find files', + }, + ['F'] = { 'Telescope live_grep theme=ivy', 'Find Text' }, + ['P'] = { 'lua require("telescope").extensions.projects.projects()', 'Projects' }, + + p = { + name = 'Packer', + c = { 'PackerCompile', 'Compile' }, + i = { 'PackerInstall', 'Install' }, + s = { 'PackerSync', 'Sync' }, + S = { 'PackerStatus', 'Status' }, + u = { 'PackerUpdate', 'Update' }, + }, + + g = { + name = 'Git', + g = { 'lua _LAZYGIT_TOGGLE()', 'Lazygit' }, + j = { 'lua require "gitsigns".next_hunk()', 'Next Hunk' }, + k = { 'lua require "gitsigns".prev_hunk()', 'Prev Hunk' }, + l = { 'lua require "gitsigns".blame_line()', 'Blame' }, + p = { 'lua require "gitsigns".preview_hunk()', 'Preview Hunk' }, + r = { 'lua require "gitsigns".reset_hunk()', 'Reset Hunk' }, + R = { 'lua require "gitsigns".reset_buffer()', 'Reset Buffer' }, + s = { 'lua require "gitsigns".stage_hunk()', 'Stage Hunk' }, + u = { + 'lua require "gitsigns".undo_stage_hunk()', + 'Undo Stage Hunk', + }, + o = { 'Telescope git_status', 'Open changed file' }, + b = { 'Telescope git_branches', 'Checkout branch' }, + c = { 'Telescope git_commits', 'Checkout commit' }, + d = { + 'Gitsigns diffthis HEAD', + 'Diff', + }, + }, + + l = { + name = 'LSP', + a = { 'lua vim.lsp.buf.code_action()', 'Code Action' }, + d = { + 'Telescope lsp_document_diagnostics', + 'Document Diagnostics', + }, + w = { + 'Telescope lsp_workspace_diagnostics', + 'Workspace Diagnostics', + }, + f = { 'lua vim.lsp.buf.format{async=true}', 'Format' }, + i = { 'LspInfo', 'Info' }, + I = { 'LspInstallInfo', 'Installer Info' }, + j = { + 'lua vim.lsp.diagnostic.goto_next()', + 'Next Diagnostic', + }, + k = { + 'lua vim.lsp.diagnostic.goto_prev()', + 'Prev Diagnostic', + }, + l = { 'lua vim.lsp.codelens.run()', 'CodeLens Action' }, + q = { 'lua vim.lsp.diagnostic.set_loclist()', 'Quickfix' }, + r = { 'lua vim.lsp.buf.rename()', 'Rename' }, + s = { 'Telescope lsp_document_symbols', 'Document Symbols' }, + S = { + 'Telescope lsp_dynamic_workspace_symbols', + 'Workspace Symbols', + }, + }, + s = { + name = 'Search', + b = { 'Telescope git_branches', 'Checkout branch' }, + c = { 'Telescope colorscheme', 'Colorscheme' }, + h = { 'Telescope help_tags', 'Find Help' }, + M = { 'Telescope man_pages', 'Man Pages' }, + r = { 'Telescope oldfiles', 'Open Recent File' }, + R = { 'Telescope registers', 'Registers' }, + k = { 'Telescope keymaps', 'Keymaps' }, + C = { 'Telescope commands', 'Commands' }, + }, + + t = { + name = 'Terminal', + n = { 'lua _NODE_TOGGLE()', 'Node' }, + u = { 'lua _NCDU_TOGGLE()', 'NCDU' }, + t = { 'lua _HTOP_TOGGLE()', 'Htop' }, + p = { 'lua _PYTHON_TOGGLE()', 'Python' }, + f = { 'ToggleTerm direction=float', 'Float' }, + h = { 'ToggleTerm size=10 direction=horizontal', 'Horizontal' }, + v = { 'ToggleTerm size=80 direction=vertical', 'Vertical' }, + }, +} + +which_key.setup(setup) +which_key.register(mappings, opts)