diff options
| author | Robert Günzler <r@gnzler.io> | 2023-01-19 18:33:43 +0100 |
|---|---|---|
| committer | Robert Günzler <r@gnzler.io> | 2023-01-19 18:33:43 +0100 |
| commit | fc67eecc8a40bf28d3d2b190702e58c580bfba9f (patch) | |
| tree | 0b8d0455046ae484e036d2f9dfa69306bbea811d /.vim | |
| parent | c03b74ce367d6e9e2988dbb4a18985bc372dd8a6 (diff) | |
vim: format config with stylua
Signed-off-by: Robert Günzler <r@gnzler.io>
Diffstat (limited to '.vim')
| -rw-r--r-- | .vim/after/ftplugin/gitrebase.lua | 30 | ||||
| -rw-r--r-- | .vim/after/ftplugin/go.lua | 33 | ||||
| -rw-r--r-- | .vim/after/ftplugin/ledger.lua | 1 | ||||
| -rw-r--r-- | .vim/after/ftplugin/mail.lua | 1 | ||||
| -rw-r--r-- | .vim/after/ftplugin/markdown.lua | 50 | ||||
| -rw-r--r-- | .vim/after/ftplugin/norg.lua | 1 | ||||
| -rw-r--r-- | .vim/after/ftplugin/tex.lua | 3 | ||||
| -rw-r--r-- | .vim/after/snippets/sh.snippets | 25 | ||||
| -rw-r--r-- | .vim/init.lua | 294 | ||||
| -rw-r--r-- | .vim/lua/internal/align.lua | 75 | ||||
| -rw-r--r-- | .vim/lua/internal/dap.lua | 63 | ||||
| -rw-r--r-- | .vim/lua/internal/exrc.lua | 49 | ||||
| -rw-r--r-- | .vim/lua/internal/hardmode.lua | 10 | ||||
| -rw-r--r-- | .vim/lua/internal/job.lua | 59 | ||||
| -rw-r--r-- | .vim/lua/internal/lsp.lua | 258 | ||||
| -rw-r--r-- | .vim/lua/internal/misc.lua | 146 | ||||
| -rw-r--r-- | .vim/lua/internal/snips.lua | 106 | ||||
| -rw-r--r-- | .vim/lua/internal/spell.lua | 3 | ||||
| -rw-r--r-- | .vim/lua/internal/statusline.lua | 215 | ||||
| -rw-r--r-- | .vim/lua/plugins.lua | 2069 | ||||
| -rw-r--r-- | .vim/lua/telescope/_extensions/jobs.lua | 76 | ||||
| -rw-r--r-- | .vim/snippets/all.lua | 94 | ||||
| -rw-r--r-- | .vim/snippets/gitcommit.lua | 7 | ||||
| -rw-r--r-- | .vim/snippets/go.lua | 19 | ||||
| -rw-r--r-- | .vim/snippets/lua.lua | 27 |
25 files changed, 1954 insertions, 1760 deletions
diff --git a/.vim/after/ftplugin/gitrebase.lua b/.vim/after/ftplugin/gitrebase.lua index 50684f4..e48b296 100644 --- a/.vim/after/ftplugin/gitrebase.lua +++ b/.vim/after/ftplugin/gitrebase.lua @@ -1,12 +1,16 @@ - local commit_preview = function() local commit = vim.api.nvim_get_current_line():match([[ ([0-9a-f]+) ]]) - local result = require('internal.job').jobstart({ - command = 'git', - args = { 'show', commit }, - format_title = function(_, _) return 'git-show' end, - populate_quickfix = false, - }):wait():result() + local result = require('internal.job') + .jobstart({ + command = 'git', + args = { 'show', commit }, + format_title = function(_, _) + return 'git-show' + end, + populate_quickfix = false, + }) + :wait() + :result() -- create buffer local bufnr = vim.api.nvim_create_buf(false, true) @@ -21,18 +25,18 @@ local commit_preview = function() -- create window local winpos = 'belowright' local winheight = #result <= 25 and #result or 25 - vim.cmd(string.format("%s %dsplit", winpos, winheight)) + vim.cmd(string.format('%s %dsplit', winpos, winheight)) local winid = vim.api.nvim_get_current_win() -- vim.cmd(string.format("buffer %d", bufnr)) vim.api.nvim_win_set_buf(winid, bufnr) - vim.cmd("wincmd p") + vim.cmd('wincmd p') local close = function() pcall(vim.api.nvim_win_close, winid, true) pcall(vim.api.nvim_buf_delete, bufnr, { force = true }) end -- close with q - vim.keymap.set('n', 'q', close, {buffer = bufnr}) + vim.keymap.set('n', 'q', close, { buffer = bufnr }) -- close on CursorMoved local old_cursor = vim.api.nvim_win_get_cursor(0) local group = vim.api.nvim_create_augroup('gitcommit_win_' .. winid, {}) @@ -40,8 +44,10 @@ local commit_preview = function() group = group, callback = function() local cursor = vim.api.nvim_win_get_cursor(0) - if (old_cursor[1] ~= cursor[1] or old_cursor[2] ~= cursor[2]) and - vim.api.nvim_get_current_win() ~= winid then + if + (old_cursor[1] ~= cursor[1] or old_cursor[2] ~= cursor[2]) + and vim.api.nvim_get_current_win() ~= winid + then close() return end diff --git a/.vim/after/ftplugin/go.lua b/.vim/after/ftplugin/go.lua index c881292..94eaa0e 100644 --- a/.vim/after/ftplugin/go.lua +++ b/.vim/after/ftplugin/go.lua @@ -1,20 +1,19 @@ -- vim.opt.shiftwidth = 4 -vim.keymap.set('n', - '<leader>i', - function() - local iface = vim.fn.input('Impl: ') - if not iface or iface == '' then return end - require('misc').word_under_cursor(function(word) - vim.cmd ('normal ][o') - local args = { - 'impl', - '-dir', - vim.fn.expand('%:h:p'), - '"'..string.lower(word:sub(0,1))..' *'..word..'"', - iface, - } - vim.cmd ('r!' .. table.concat(args, ' ')) - end) +vim.keymap.set('n', '<leader>i', function() + local iface = vim.fn.input('Impl: ') + if not iface or iface == '' then + return end -) + require('misc').word_under_cursor(function(word) + vim.cmd('normal ][o') + local args = { + 'impl', + '-dir', + vim.fn.expand('%:h:p'), + '"' .. string.lower(word:sub(0, 1)) .. ' *' .. word .. '"', + iface, + } + vim.cmd('r!' .. table.concat(args, ' ')) + end) +end) diff --git a/.vim/after/ftplugin/ledger.lua b/.vim/after/ftplugin/ledger.lua index 0baeab5..bcdcf9a 100644 --- a/.vim/after/ftplugin/ledger.lua +++ b/.vim/after/ftplugin/ledger.lua @@ -1,3 +1,2 @@ - vim.opt_local.commentstring = '; %s' vim.opt_local.cursorcolumn = true diff --git a/.vim/after/ftplugin/mail.lua b/.vim/after/ftplugin/mail.lua index 8abc2df..1aa5caf 100644 --- a/.vim/after/ftplugin/mail.lua +++ b/.vim/after/ftplugin/mail.lua @@ -1,3 +1,2 @@ - require('internal.spell') vim.opt.cursorline = false diff --git a/.vim/after/ftplugin/markdown.lua b/.vim/after/ftplugin/markdown.lua index 65fc646..87fe69d 100644 --- a/.vim/after/ftplugin/markdown.lua +++ b/.vim/after/ftplugin/markdown.lua @@ -8,47 +8,63 @@ vim.fn.matchadd('Conceal', '- \\[ \\]\\&- \\zs\\[ ', 0, -1, { conceal = '☐ ' } vim.fn.matchadd('Conceal', '- \\[x\\]\\&- \\zs\\[x', 0, -1, { conceal = '🞕 ' }) vim.fn.matchadd('Conceal', '- \\[[ x]\\zs\\]', 0, -1, { conceal = ' ' }) -vim.keymap.set('n', '<Plug>Markdown_OpenUrlUnderCursor', - function() require('internal.misc').open_under_cursor('url-launcher') end) +vim.keymap.set('n', '<Plug>Markdown_OpenUrlUnderCursor', function() + require('internal.misc').open_under_cursor('url-launcher') +end) -vim.keymap.set('n', '<localleader>l', require('internal.misc').link_preview, {desc='link preview'}) +vim.keymap.set( + 'n', + '<localleader>l', + require('internal.misc').link_preview, + { desc = 'link preview' } +) local function toggle_checkbox() local ln, n = vim.api.nvim_get_current_line(), 0 ln, n = string.gsub(ln, '%[ %]', '[x]', 1) - if n > 0 then goto set_line end + if n > 0 then + goto set_line + end ln, n = string.gsub(ln, '%[x%]', '[ ]', 1) - if n > 0 then goto set_line end + if n > 0 then + goto set_line + end ln, n = string.gsub(ln, 'TODO', 'DONE', 1) - if n > 0 then goto set_line end + if n > 0 then + goto set_line + end ln, n = string.gsub(ln, 'DONE', 'TODO', 1) - if n > 0 then goto set_line end + if n > 0 then + goto set_line + end -::set_line:: + ::set_line:: vim.api.nvim_set_current_line(ln) end -vim.keymap.set('n', '<space><space>', toggle_checkbox, {desc='toggle checkbox', buffer=true}) -vim.keymap.set('i', '<c-space>', toggle_checkbox, {desc='toggle checkbox', buffer=true}) + +vim.keymap.set('n', '<space><space>', toggle_checkbox, { desc = 'toggle checkbox', buffer = true }) +vim.keymap.set('i', '<c-space>', toggle_checkbox, { desc = 'toggle checkbox', buffer = true }) -- vim.keymap.set('n', '<leader>zn', function() require('zk').new() end, {buffer=true}) -- vim.keymap.set('n', '<leader>zi', function() require('zk').index() end, {buffer=true}) -- vim.cmd [[ command! -nargs=* ZettelkastenNew lua require('zk').new(nil, <f-args>) ]] vim.keymap.set('n', 'gt', function() - require('telescope._extensions.todo-comments').exports.todo {cwd=vim.env.ZK_NOTEBOOK_DIR} -end, {desc='show zk todos', buffer=true}) + require('telescope._extensions.todo-comments').exports.todo({ cwd = vim.env.ZK_NOTEBOOK_DIR }) +end, { desc = 'show zk todos', buffer = true }) vim.keymap.set('n', 'o', function() local cursor = vim.api.nvim_win_get_cursor(0) -- need to decrement the row number here, to account for 0 indexing - local node = vim.treesitter.get_node_at_pos(0, cursor[1]-1, cursor[2], {}) + local node = vim.treesitter.get_node_at_pos(0, cursor[1] - 1, cursor[2], {}) while node do if node:type() == 'list_item' then local ln = vim.treesitter.get_node_text(node:child(0), 0, {}) - local ln_start = string.match(ln, '^(%d+)%.'); if ln_start ~= nil then - ln = ln:gsub(ln_start, tonumber(ln_start)+1) + local ln_start = string.match(ln, '^(%d+)%.') + if ln_start ~= nil then + ln = ln:gsub(ln_start, tonumber(ln_start) + 1) end - vim.api.nvim_buf_set_lines(0, cursor[1], cursor[1], false, {ln}) + vim.api.nvim_buf_set_lines(0, cursor[1], cursor[1], false, { ln }) vim.api.nvim_feedkeys('jA', 'n', false) return end @@ -56,4 +72,4 @@ vim.keymap.set('n', 'o', function() end vim.api.nvim_feedkeys('o', 'n', false) -end, {desc='smart-o', buffer=true}) +end, { desc = 'smart-o', buffer = true }) diff --git a/.vim/after/ftplugin/norg.lua b/.vim/after/ftplugin/norg.lua index 506e4bd..9bf66e6 100644 --- a/.vim/after/ftplugin/norg.lua +++ b/.vim/after/ftplugin/norg.lua @@ -1,2 +1 @@ - vim.keymap.set('n', '<leader>im', [[:Neorg inject-metadata<cr>]]) diff --git a/.vim/after/ftplugin/tex.lua b/.vim/after/ftplugin/tex.lua index 031c63b..740ad48 100644 --- a/.vim/after/ftplugin/tex.lua +++ b/.vim/after/ftplugin/tex.lua @@ -1,3 +1,2 @@ - -vim.opt_local.makeprg = "latexmk -1 -n %" +vim.opt_local.makeprg = 'latexmk -1 -n %' vim.opt_local.textwidth = 80 diff --git a/.vim/after/snippets/sh.snippets b/.vim/after/snippets/sh.snippets index 8973dd5..d87442e 100644 --- a/.vim/after/snippets/sh.snippets +++ b/.vim/after/snippets/sh.snippets @@ -1,28 +1,3 @@ -snippet usage "usage" - usage() { - printf "usage: %s" "$(basename "\$0")\n" - printf "\n" - printf "$1\n" - } - - case "\$1" in - -h) usage && exit 0 ;; - esac - - $0 -snippet getopt "while getopts" - $2= - while getopts $1h opt; do - case "$opt" in - $1) $2=1 ;; - h|?) printf "usage: %s [-h]\n" "$(basename "\$0")" - printf "\n" - printf " -$1 \t $2\n" - printf "\n" - exit 2 ;; - esac - done - shift $((OPTIND - 1)) snippet deps "for app in" # check requirements for tool in $1; do diff --git a/.vim/init.lua b/.vim/init.lua index 3b5bf52..99c2516 100644 --- a/.vim/init.lua +++ b/.vim/init.lua @@ -7,21 +7,21 @@ g.maplocalleader = '\\' local opt = vim.opt opt.backspace = 'indent,eol,start' -opt.clipboard:prepend { 'unnamedplus' } +opt.clipboard:prepend({ 'unnamedplus' }) opt.cmdheight = 1 opt.colorcolumn = '+1' -opt.formatoptions:remove 't' +opt.formatoptions:remove('t') -- opt.complete = '.,w,b,u' -opt.completeopt = {'menu','menuone','noinsert'} +opt.completeopt = { 'menu', 'menuone', 'noinsert' } opt.concealcursor = '' opt.conceallevel = 2 opt.cursorline = true opt.expandtab = false opt.exrc = true -opt.fillchars:append { +opt.fillchars:append({ fold = '─', horiz = '─', -} +}) opt.foldenable = true opt.foldmethod = 'expr' opt.foldexpr = 'nvim_treesitter#foldexpr()' @@ -36,11 +36,11 @@ opt.incsearch = true opt.laststatus = 3 opt.lazyredraw = true opt.list = true -opt.listchars:append { +opt.listchars:append({ trail = '¬', tab = '> ', -- space/lead = '⋅', -} +}) opt.mouse = 'a' opt.number = true opt.relativenumber = false @@ -49,7 +49,7 @@ opt.redrawtime = 1500 opt.ruler = true opt.scrolloff = 3 opt.shiftround = true -opt.shortmess:append { c = true } +opt.shortmess:append({ c = true }) opt.breakindent = true opt.breakindentopt = { shift = 2 } opt.showbreak = '↪ ' @@ -59,7 +59,7 @@ opt.showmatch = true opt.signcolumn = 'auto' opt.smartcase = true opt.spell = false -opt.spelllang = {'en_gb'} +opt.spelllang = { 'en_gb' } -- opt.splitkeep = 'topline' opt.termguicolors = true opt.textwidth = 80 @@ -69,8 +69,8 @@ opt.ttimeoutlen = 10 opt.undolevels = 1000 opt.updatetime = 200 opt.wrap = true -opt.path = {'', '.', '.;$HOME', '/usr/include/**'} -opt.isfname:remove ':' +opt.path = { '', '.', '.;$HOME', '/usr/include/**' } +opt.isfname:remove(':') opt.guicursor = { -- block shape in normal/visual/command 'n-c-v:block', @@ -80,7 +80,7 @@ opt.guicursor = { 'r-cr-o:hor10', -- 'sm:block-blinkwait175-blinkoff150-blinkon175', - -- 'a:blinkwait700-blinkoff400-blinkon250-Cursor/lCursor', + -- 'a:blinkwait700-blinkoff400-blinkon250-Cgrsor/lCursor', -- 'a:blinkon0-Cursor', } @@ -99,72 +99,84 @@ g.undodir = undodir opt.undofile = true -- }}} --- swap between newpaper and karafuru -g.night_and_day = 'night' - g.do_filetype_lua = true -- g.do_legacy_filetype = false -- g.did_load_filetypes = 0 +vim.g.night_and_day = 'night' + require('_globals') require('plugins') -require('internal.align').setup { bindings = true } + +require('internal.align').setup({ bindings = true }) require('internal.hardmode') --- Configure builtin diagnositics {{{ -vim.diagnostic.config { - underline = true, - virtual_text = false, - -- virtual_text = { - -- severity = {min=vim.diagnostic.severity.WARN}, - -- source = true, - -- prefix = '', - -- }, - signs = true, - float = true, - virtual_lines = { prefix = '⬐ ' }, +-- DIAGNOSITIC {{{ +vim.diagnostic.config({ + signs = true, + underline = { + severity = { min = vim.diagnostic.severity.WARN }, + }, + float = { + severity = { min = vim.diagnostic.severity.INFO }, + focusable = false, + source = 'always', + prefix = '', + scope = 'cursor', + }, + virtual_text = { + severity = { max = vim.diagnostic.severity.HINT }, + source = true, + prefix = '', + }, + -- virtual_lines = { prefix = '⬐ ' }, update_in_insert = false, - severity_sort = true, -} + severity_sort = true, +}) vim.fn.sign_define({ - {name='DiagnosticSignError', text='✗', texthl='DiagnosticSignError'}, + { name = 'DiagnosticSignError', text = '✗', texthl = 'DiagnosticSignError' }, -- {name='DiagnosticSignWarn', text='⚡', texthl='DiagnosticSignWarn'}, - {name='DiagnosticSignWarn', text='⚐', texthl='DiagnosticSignWarn'}, - {name='DiagnosticSignInfo', text='ℹ', texthl='DiagnosticSignInfo'}, - {name='DiagnosticSignHint', text='🞶', texthl='DiagnosticSignHint'} + { name = 'DiagnosticSignWarn', text = '⚐', texthl = 'DiagnosticSignWarn' }, + { name = 'DiagnosticSignInfo', text = 'ℹ', texthl = 'DiagnosticSignInfo' }, + { name = 'DiagnosticSignHint', text = '🞶', texthl = 'DiagnosticSignHint' }, }) -vim.keymap.set('n', ']d', vim.diagnostic.goto_next, {desc='next diagnostic'}) -vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, {desc='prev diagnostic'}) -vim.keymap.set('n', '<localleader>d', vim.diagnostic.open_float, {desc='show line diagnositics'}) +vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'next diagnostic' }) +vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'prev diagnostic' }) +vim.keymap.set( + 'n', + '<localleader>d', + vim.diagnostic.open_float, + { desc = 'show line diagnositics' } +) vim.keymap.set('n', '<leader>D', function() - if not _G.diagnostic_hidden then - vim.diagnostic.hide() - else - vim.diagnostic.show() - end - _G.diagnostic_hidden = not _G.diagnostic_hidden - end, {desc='toggle diagnositics'}) + if not _G.diagnostic_hidden then + vim.diagnostic.hide() + else + vim.diagnostic.show() + end + _G.diagnostic_hidden = not _G.diagnostic_hidden +end, { desc = 'toggle diagnositics' }) -- }}} -- KEY BINDS -- {{{ -vim.keymap.set('n', 'Q', [[ :quitall<cr> ]], {silent = true}) -vim.keymap.set('n', 'gb', [[ :bnext<cr> ]], {silent = true}) -vim.keymap.set('n', 'gB', [[ :bprevious<cr> ]], {silent = true}) -vim.keymap.set('n', '<tab>', [[ :normal za<cr> ]], {silent = true}) +vim.keymap.set('n', 'Q', [[ :quitall<cr> ]], { silent = true }) +vim.keymap.set('n', 'gb', [[ :bnext<cr> ]], { silent = true }) +vim.keymap.set('n', 'gB', [[ :bprevious<cr> ]], { silent = true }) +vim.keymap.set('n', '<tab>', [[ :normal za<cr> ]], { silent = true }) -- vim.keymap.set('n', '<tab>', [[ :exe 'normal za' | IndentBlanklineRefresh<cr> ]], {silent = true}) -- swap gf and gF -- vim.keymap.set('n', 'gf', [[ :e <cfile><cr> ]]) -- vim.keymap.set('v', 'gf', [[ :e <cfile><cr> ]]) -vim.keymap.set({'n', 'v'}, 'gf', function(a) +vim.keymap.set({ 'n', 'v' }, 'gf', function(a) local Path = require('plenary.path') local cfile = Path:new(vim.fn.expand('<cfile>')) if not cfile:is_absolute() then cfile = Path:new(vim.fn.expand('%:p:h'), cfile):normalize() end vim.cmd.edit(cfile) -end, {desc='extends `:e <cfile>` with path normalization'}) +end, { desc = 'extends `:e <cfile>` with path normalization' }) vim.keymap.set('n', '{', [[ {zz ]]) vim.keymap.set('n', '}', [[ }zz ]]) @@ -172,47 +184,58 @@ vim.keymap.set('n', '}', [[ }zz ]]) -- vim.keymap.set({'n', 'v'}, 'c', '_c') -- vim.keymap.set({'n', 'v'}, 'C', '_C') -vim.keymap.set('t', '<esc>', [[ <c-\><c-n> ]]) +vim.keymap.set('t', '<esc>', [[ <c-\><c-n> ]]) vim.keymap.set('t', '<leader>qq', [[ <c-\><c-n> :bdelete!<cr> ]]) -vim.keymap.set('v', 'T', - function() - vim.cmd [[retab!]] - vim.api.nvim_input("<esc>") - end) +vim.keymap.set('v', 'T', function() + vim.cmd([[retab!]]) + vim.api.nvim_input('<esc>') +end) local misc = require('internal.misc') -vim.keymap.set('n', 'gd', function() misc.open_under_cursor(nil, true) end, {desc='open under cursor'}) -vim.keymap.set('n', 'gx', function() misc.open_under_cursor('url-launcher') end, {desc='url-launcher'}) -vim.keymap.set('n', 'gu', function() misc.open_under_cursor('url-launcher') end, {desc='url-launcher'}) +vim.keymap.set('n', 'gd', function() + misc.open_under_cursor(nil, true) +end, { desc = 'open under cursor' }) +vim.keymap.set('n', 'gx', function() + misc.open_under_cursor('url-launcher') +end, { desc = 'url-launcher' }) +vim.keymap.set('n', 'gu', function() + misc.open_under_cursor('url-launcher') +end, { desc = 'url-launcher' }) -- vim.keymap.set('n', '<localleader>gs', function() misc.word_under_cursor(function(s) vim.fn.feedkeys(':%s/' .. s .. '//g'); cmd [[ call feedkeys("\<left>\<left>") ]] end) end) -vim.keymap.set('n', '<leader>r', misc.live_grep, {desc='live grep (rg)'}) -vim.keymap.set('n', '<leader>f', misc.find_files, {desc='find files (fd)'}) +vim.keymap.set('n', '<leader>r', misc.live_grep, { desc = 'live grep (rg)' }) +vim.keymap.set('n', '<leader>f', misc.find_files, { desc = 'find files (fd)' }) -vim.keymap.set('n', '<localleader>dgl', 'diffget LOCAL', {desc='diff get local'}) -vim.keymap.set('n', '<localleader>dgr', 'diffget REMOTE', {desc='diff get remote'}) -vim.keymap.set('n', '<localleader>dpl', 'diffpush LOCAL', {desc='diff push local'}) -vim.keymap.set('n', '<localleader>dpr', 'diffpush REMOTE', {desc='diff push remote'}) +vim.keymap.set('n', '<localleader>dgl', 'diffget LOCAL', { desc = 'diff get local' }) +vim.keymap.set('n', '<localleader>dgr', 'diffget REMOTE', { desc = 'diff get remote' }) +vim.keymap.set('n', '<localleader>dpl', 'diffpush LOCAL', { desc = 'diff push local' }) +vim.keymap.set('n', '<localleader>dpr', 'diffpush REMOTE', { desc = 'diff push remote' }) -vim.keymap.set('x', '<localleader>f', +vim.keymap.set( + 'x', + '<localleader>f', [[<ESC><CMD>lua require("internal.misc").fold_block()<CR>]], - { noremap = true, silent = true, desc = 'fold block' }) + { noremap = true, silent = true, desc = 'fold block' } +) -- vim.keymap.set('v', '<c-r>', [[y:%s/<c-r>h//gc<left><left><left>]], { noremap = true, silent = true }) -vim.keymap.set('n', '<leader>C', function() - local fnln = (vim.fn.expand('%') .. ':' .. vim.fn.line('.')) +vim.keymap.set('n', 'yP', function() + local fnln = (vim.fn.expand('%:p') .. ':' .. vim.fn.line('.')) vim.fn.setreg('+', fnln) vim.notify(fnln) -end, {desc='copy file path'}) - -vim.keymap.set('n', '<leader>J', require('internal.job').list, {desc='list jobs started through internal.job'}) +end, { desc = 'yank absolute file path' }) +vim.keymap.set('n', 'yT', function() + local fnln = (vim.fn.expand('%:t') .. ':' .. vim.fn.line('.')) + vim.fn.setreg('+', fnln) + vim.notify(fnln) +end, { desc = 'yank file name' }) -- }}} -- AUTO GROUPS -- {{{ local augroup = vim.api.nvim_create_augroup local autocmd = vim.api.nvim_create_autocmd -autocmd('TextYankPost', {callback=vim.highlight.on_yank}) +autocmd('TextYankPost', { callback = vim.highlight.on_yank }) do local group = augroup('ObviousActiveWin', { clear = true }) @@ -220,70 +243,99 @@ do autocmd('WinLeave', { command = 'set nocul', group = group }) end -autocmd('QuickFixCmdPost', { - callback = function() - -- make sure there is anyting in the qflist before opening it, - -- avoids: `E42: No Errors` - local qf = vim.fn.getqflist({size = true}) - if qf and qf.size > 0 then vim.cmd [[clist]] end - end, - group = augroup('OpenQuickFix', {}), -}) +do + local group = augroup('OpenQuickFix', { clear = true }) + autocmd('QuickFixCmdPost', { + callback = function() + local qf = vim.fn.getqflist({ qfbufnr = true, size = true }) + if (not qf == vim.empty_dict()) and qf and qf.size > 0 then + -- check if the quickfix buffer is already open + for bufnr in ipairs(vim.api.nvim_list_bufs()) do + if vim.api.nvim_buf_get_option(bufnr, 'buftype') == 'quickfix' then + return + end + end + vim.cmd.copen() + end + end, + group = group, + }) + autocmd('BufEnter', { + pattern = 'qf', + command = [[silent normal! G]], + group = group, + }) +end do local group = augroup('ManualCommentString', { clear = true }) - autocmd('FileType', { pattern = 'i3config', - callback = function() vim.opt_local.commentstring = '# %s' end, + autocmd('FileType', { + pattern = 'i3config', + callback = function() + vim.opt_local.commentstring = '# %s' + end, group = group, }) - autocmd('FileType', { pattern = 'jsonc', - callback = function() vim.opt_local.commentstring = '// %s' end, + autocmd('FileType', { + pattern = 'jsonc', + callback = function() + vim.opt_local.commentstring = '// %s' + end, group = group, }) end do local group = augroup('ManualFolds', { clear = true }) - autocmd('VimEnter', { pattern = 'vim/*', - callback = function() vim.opt_local.foldenable = true end, + autocmd('VimEnter', { + pattern = 'vim/*', + callback = function() + vim.opt_local.foldenable = true + end, group = group, }) - autocmd('FileType', { pattern = 'json,jsonc,yaml,toml', - callback = function() vim.opt_local.foldenable = false end, + autocmd('FileType', { + pattern = 'json,jsonc,yaml,toml', + callback = function() + vim.opt_local.foldenable = false + end, group = group, }) end do local group = augroup('EasyQuit', { clear = true }) - autocmd('FileType', { pattern = 'help,neorg,dap-float', + autocmd('FileType', { + pattern = 'help,neorg,dap-float,qf', callback = function() - vim.keymap.set('n', 'q', '<cmd>close<cr>', - { silent = true, buffer = 0 } - ) + vim.keymap.set('n', 'q', '<cmd>close<cr>', { silent = true, buffer = 0 }) end, group = group, }) - autocmd('FileType', { pattern = 'alpha', + autocmd('FileType', { + pattern = 'alpha', callback = function() - vim.keymap.set('n', 'q', '<cmd>bdel<cr>', - { silent = true, buffer = 0 } - ) + vim.keymap.set('n', 'q', '<cmd>bdel<cr>', { silent = true, buffer = 0 }) end, group = group, }) - autocmd('TermClose', { pattern = 'term://*', + autocmd('TermClose', { + pattern = 'term://*', command = [[ if !v:event.status | exe 'bdelete! '..expand('<abuf>') | endif ]], group = group, }) end -autocmd({'BufRead', 'BufNewFile'}, { pattern = '/home/robert/bin/*', - callback = function() vim.opt_local.filetype = 'sh' end, +autocmd({ 'BufRead', 'BufNewFile' }, { + pattern = '/home/robert/bin/*', + callback = function() + vim.opt_local.filetype = 'sh' + end, group = augroup('DetectBinDir', {}), }) -autocmd({'TermOpen'}, { pattern = 'term://*', +autocmd({ 'TermOpen' }, { + pattern = 'term://*', callback = function() local bufnr = vim.api.nvim_get_current_buf() vim.opt_local.number = false @@ -298,40 +350,48 @@ autocmd({'TermOpen'}, { pattern = 'term://*', -- }}} -- USER COMMANDS -- {{{ -vim.api.nvim_create_user_command('Make', function(opts) require('internal.job').make(opts.fargs) end, - { nargs = '*', desc = 'run make target' }) -vim.api.nvim_create_user_command('Sh', function(opts) require('internal.job').sh(table.concat(opts.fargs, ' ')) end, - { nargs = '*', desc = 'run shell command' }) - -require('internal.misc').setup { +vim.api.nvim_create_user_command('Make', function(opts) + require('internal.job').make(opts.fargs) +end, { nargs = '*', desc = 'run make target' }) +vim.api.nvim_create_user_command('Sh', function(opts) + require('internal.job').sh(table.concat(opts.fargs, ' ')) +end, { nargs = '*', desc = 'run shell command' }) + +require('internal.misc').setup({ grep = true, find = true, sortline = true, -} +}) -- }}} _G.statusline_enable_notifysend = false require('internal.statusline') -require('internal.exrc').setup {} +require('internal.job').setup({}) -- TODO: remove eventually local is_gotmpl = function(bufnr) for ln = 1, vim.api.nvim_buf_line_count(bufnr), 1 do - local line = vim.api.nvim_buf_get_lines(bufnr, ln-1, ln, true) - if #line == 0 then break end + local line = vim.api.nvim_buf_get_lines(bufnr, ln - 1, ln, true) + if #line == 0 then + break + end if line[1]:match('{{.+}}') then return true end end return false end -vim.filetype.add { +vim.filetype.add({ extension = { ha = 'hare', - html = function(_, bufnr) return is_gotmpl(bufnr) and 'gotmpl.html' or 'html' end, - yaml = function(_, bufnr) return is_gotmpl(bufnr) and 'gotmpl.yaml' or 'yaml' end, + html = function(_, bufnr) + return is_gotmpl(bufnr) and 'gotmpl.html' or 'html' + end, + yaml = function(_, bufnr) + return is_gotmpl(bufnr) and 'gotmpl.yaml' or 'yaml' + end, }, filename = { ['Caddyfile'] = 'conf', - } -} + }, +}) diff --git a/.vim/lua/internal/align.lua b/.vim/lua/internal/align.lua index 5dcf7c0..1ada01d 100644 --- a/.vim/lua/internal/align.lua +++ b/.vim/lua/internal/align.lua @@ -14,11 +14,15 @@ function M.align_lines(pat, line1, line2, preview_ns, preview_bufnr) local max = -1 for _, line in pairs(lines) do local s = re:match_str(line) - if s and max < s then max = s end + if s and max < s then + max = s + end end -- exit if nothing was found - if max == -1 then return error('nothing found') end + if max == -1 then + return error('nothing found') + end for i, line in pairs(lines) do local s = re:match_str(line) @@ -27,33 +31,45 @@ function M.align_lines(pat, line1, line2, preview_ns, preview_bufnr) local changeset = { string.sub(line, 1, s), string.rep(' ', rep), - string.sub(line, s+1), + string.sub(line, s + 1), } local newline = table.concat(changeset) -- append to changse if not inside the preview callback if not preview_ns then - newlines[#newlines+1] = newline + newlines[#newlines + 1] = newline end if preview_ns ~= nil then -- set extmarks inside the live buffer - vim.api.nvim_buf_set_extmark(bufnr, preview_ns, line1+i - 2, 0, - { - hl_mode = 'combine', - virt_text_pos = 'overlay', - virt_text = { - {changeset[1]}, - {changeset[2], 'Substitute'}, - {changeset[3]}, - }, - }) + vim.api.nvim_buf_set_extmark(bufnr, preview_ns, line1 + i - 2, 0, { + hl_mode = 'combine', + virt_text_pos = 'overlay', + virt_text = { + { changeset[1] }, + { changeset[2], 'Substitute' }, + { changeset[3] }, + }, + }) -- modify preview buffer if preview_bufnr ~= nil then local prefix = string.format('|%d| ', line1 + i - 1) - vim.api.nvim_buf_set_lines(preview_bufnr, preview_buf_line, preview_buf_line, false, { prefix .. newline }) - vim.api.nvim_buf_add_highlight(preview_bufnr, preview_ns, 'Substitute', preview_buf_line, #prefix + s, #prefix + s + #changeset[2]) + vim.api.nvim_buf_set_lines( + preview_bufnr, + preview_buf_line, + preview_buf_line, + false, + { prefix .. newline } + ) + vim.api.nvim_buf_add_highlight( + preview_bufnr, + preview_ns, + 'Substitute', + preview_buf_line, + #prefix + s, + #prefix + s + #changeset[2] + ) preview_buf_line = preview_buf_line + 1 end end @@ -63,7 +79,9 @@ function M.align_lines(pat, line1, line2, preview_ns, preview_bufnr) -- only change buffer when not previewing if not preview_ns then -- exit if nothing was changed - if #newlines == 0 then return error('nothing changed') end + if #newlines == 0 then + return error('nothing changed') + end vim.api.nvim_buf_set_lines(bufnr, line1 - 1, line2, 0, newlines) return 0 end @@ -75,10 +93,10 @@ function M.align_lines(pat, line1, line2, preview_ns, preview_bufnr) end function M.align(pat) - local top, bot = vim.fn.getpos("'<"), vim.fn.getpos("'>") - M.align_lines(pat, top[2]-1, bot[2]) - vim.fn.setpos("'<", top) - vim.fn.setpos("'>", bot) + local top, bot = vim.fn.getpos("'<"), vim.fn.getpos("'>") + M.align_lines(pat, top[2] - 1, bot[2]) + vim.fn.setpos("'<", top) + vim.fn.setpos("'>", bot) end local function aligncmd(opts, preview_ns, preview_bufnr) @@ -86,18 +104,21 @@ local function aligncmd(opts, preview_ns, preview_bufnr) end local default_opts = { - bindings = true + bindings = true, } function M.setup(opts) opts = vim.tbl_extend('keep', opts or {}, default_opts) - vim.api.nvim_create_user_command('SimpleAlign', aligncmd, - {nargs = 1, range = '%', preview = aligncmd}) + vim.api.nvim_create_user_command( + 'SimpleAlign', + aligncmd, + { nargs = 1, range = '%', preview = aligncmd } + ) - if opts.bindings then - vim.keymap.set('v', '<enter>', ':SimpleAlign ') - end + -- if opts.bindings then + -- vim.keymap.set('v', '<enter>', ':SimpleAlign ') + -- end end return M diff --git a/.vim/lua/internal/dap.lua b/.vim/lua/internal/dap.lua index aa419ea..1790575 100644 --- a/.vim/lua/internal/dap.lua +++ b/.vim/lua/internal/dap.lua @@ -10,30 +10,43 @@ dap.listeners.after['event_initialized']['me'] = function() end -- signs -vim.fn.sign_define({{name='DapBreakpoint', text='🞱', texthl='DapBreakpoint', linehl='DapBreakpointLn'}}) -vim.fn.sign_define({{name='DapStopped', text='→', texthl='DapStopped', linehl='DapStoppedLn'}}) +vim.fn.sign_define({ + { name = 'DapBreakpoint', text = '🞱', texthl = 'DapBreakpoint', linehl = 'DapBreakpointLn' }, +}) +vim.fn.sign_define({ + { name = 'DapStopped', text = '→', texthl = 'DapStopped', linehl = 'DapStoppedLn' }, +}) -- keymaps -vim.keymap.set('n', '<leader>dd', dap.toggle_breakpoint, {desc='toggle breakpoint'}) -- convenience -vim.keymap.set('n', '<leader>db', dap.toggle_breakpoint, {desc='toggle breakpoint'}) -vim.keymap.set('n', '<leader>dc', dap.continue, {desc='continue'}) -vim.keymap.set('n', '<leader>do', dap.step_over, {desc='step over'}) -vim.keymap.set('n', '<leader>di', dap.step_into, {desc='step into'}) -vim.keymap.set('n', '<leader>dO', dap.step_out, {desc='step out'}) -vim.keymap.set('n', '<leader>dR', dap.repl.toggle, {desc='toggle REPL'}) -vim.keymap.set('n', '<leader>dL', dap.run_last, {desc='run last'}) -vim.keymap.set('n', '<leader>dt', dap.terminate, {desc='terminate'}) +vim.keymap.set('n', '<leader>dd', dap.toggle_breakpoint, { desc = 'toggle breakpoint' }) -- convenience +vim.keymap.set('n', '<leader>db', dap.toggle_breakpoint, { desc = 'toggle breakpoint' }) +vim.keymap.set('n', '<leader>dc', dap.continue, { desc = 'continue' }) +vim.keymap.set('n', '<leader>do', dap.step_over, { desc = 'step over' }) +vim.keymap.set('n', '<leader>di', dap.step_into, { desc = 'step into' }) +vim.keymap.set('n', '<leader>dO', dap.step_out, { desc = 'step out' }) +vim.keymap.set('n', '<leader>dR', dap.repl.toggle, { desc = 'toggle REPL' }) +vim.keymap.set('n', '<leader>dL', dap.run_last, { desc = 'run last' }) +vim.keymap.set('n', '<leader>dt', dap.terminate, { desc = 'terminate' }) local widgets = require('dap.ui.widgets') -vim.keymap.set('n', '<leader>dh', widgets.hover, {desc='hover'}) -vim.keymap.set('n', '<leader>dB', require('telescope').extensions.dap.list_breakpoints, {desc='list breakpoints'}) +vim.keymap.set('n', '<leader>dh', widgets.hover, { desc = 'hover' }) +vim.keymap.set( + 'n', + '<leader>dB', + require('telescope').extensions.dap.list_breakpoints, + { desc = 'list breakpoints' } +) -- Common local bin_from_var_or_pick = function() local ok, retval = pcall(vim.api.nvim_buf_get_var, 0, 'dap_bin') - if ok then return retval end + if ok then + return retval + end local bin = nil - vim.ui.input({prompt = 'DAP Binary: '}, function(choice) bin = choice end) + vim.ui.input({ prompt = 'DAP Binary: ' }, function(choice) + bin = choice + end) return bin end @@ -44,21 +57,29 @@ dap.adapters.go_dlv_local = function(callback, config) -- {{{ local pid_or_err local port = 38697 local opts = { - stdio = {nil, stdout}, - args = {'dap', '-l', '127.0.0.1:' .. port}, + stdio = { nil, stdout }, + args = { 'dap', '-l', '127.0.0.1:' .. port }, detached = true, } - handle, pid_or_err = vim.loop.spawn("dlv", opts, function(exit) + handle, pid_or_err = vim.loop.spawn('dlv', opts, function(exit) stdout:close() handle:close() - if exit ~= 0 then vim.notify('dlv exited with exit code ' .. exit) end + if exit ~= 0 then + vim.notify('dlv exited with exit code ' .. exit) + end end) assert(handle, 'Error running dlv: ' .. tostring(pid_or_err)) stdout:read_start(function(err, chunk) assert(not err, err) - if chunk then vim.schedule(function() require('dap.repl').append(chunk) end) end + if chunk then + vim.schedule(function() + require('dap.repl').append(chunk) + end) + end end) - vim.defer_fn(function() callback({type = 'server', host = '127.0.0.1', port = port}) end, 100) + vim.defer_fn(function() + callback({ type = 'server', host = '127.0.0.1', port = port }) + end, 100) end -- }}} dap.adapters.go_dlv_remote = { diff --git a/.vim/lua/internal/exrc.lua b/.vim/lua/internal/exrc.lua deleted file mode 100644 index 1b3b22b..0000000 --- a/.vim/lua/internal/exrc.lua +++ /dev/null @@ -1,49 +0,0 @@ -local root_pattern = require('lspconfig.util').root_pattern - -local M = { - config = { - filenames = {'.nvimrc'} - } -} - -M.setup = function (opt) - vim.validate { - filenames = { opt.filenames, 'table', true }, - } - - M.config = vim.tbl_extend('force', M.config, opt) - - local group = vim.api.nvim_create_augroup('ExrcLoad', { clear = true }) - vim.api.nvim_create_autocmd('VimEnter', { - callback = M.load, - group = group, - }) -end - -local load = function (root, filename) - local fpath = root .. '/' .. filename - if root and vim.loop.fs_stat(fpath) then - vim.cmd('luafile ' .. fpath) - vim.g.nvimrc_loaded = fpath - else - error(string.format('[exrc] %s not found', fpath)) - end -end - -M.load = function () - local root = vim.fn.getcwd() - for _, fname in ipairs(M.config.filenames) do - local ok = false - ok, _ = pcall(load, root, fname) - if ok then return true end - - -- try harder by searching up the dir tree - root = root_pattern(fname)(root) - ok, _ = pcall(load, root, fname) - if ok then return true end - end - - return false -end - -return M diff --git a/.vim/lua/internal/hardmode.lua b/.vim/lua/internal/hardmode.lua index cc71baf..2774ead 100644 --- a/.vim/lua/internal/hardmode.lua +++ b/.vim/lua/internal/hardmode.lua @@ -1,10 +1,10 @@ -- hard mode means we're not using the arrow keys! local bail = function() - vim.cmd [[silent! echohl ErrorMsg | echo "HARD MODE: hjkl operation only" | echohl None]] + vim.cmd([[silent! echohl ErrorMsg | echo "HARD MODE: hjkl operation only" | echohl None]]) end -vim.keymap.set({'n', 'v', 'i'}, '<up>', bail) -vim.keymap.set({'n', 'v', 'i'}, '<down>', bail) -vim.keymap.set({'n', 'v', 'i'}, '<left>', bail) -vim.keymap.set({'n', 'v', 'i'}, '<right>', bail) +vim.keymap.set({ 'n', 'v', 'i' }, '<up>', bail) +vim.keymap.set({ 'n', 'v', 'i' }, '<down>', bail) +vim.keymap.set({ 'n', 'v', 'i' }, '<left>', bail) +vim.keymap.set({ 'n', 'v', 'i' }, '<right>', bail) diff --git a/.vim/lua/internal/job.lua b/.vim/lua/internal/job.lua index 64d9837..42a548b 100644 --- a/.vim/lua/internal/job.lua +++ b/.vim/lua/internal/job.lua @@ -1,7 +1,5 @@ -local spinner_ok, spinner = pcall(require, 'spinner.core') - local M = { - current_jobs = {} + current_jobs = {}, } local strip_ansi = function(line) @@ -14,14 +12,15 @@ local setqf = function(opts, pid, data) end vim.fn.setqflist({}, 'a', { title = opts.format_title, - lines = {strip_ansi(data)}, + lines = { strip_ansi(data) }, efm = '%m', context = { - cmd = {opts.command, unpack(opts.args)}, + cmd = { opts.command, unpack(opts.args) }, pid = pid, source = 'jobstart', - } + }, }) + vim.cmd.doautocmd('QuickFixCmdPost') end --create a new job and register @@ -29,13 +28,14 @@ end function M.jobstart(opts) opts = opts or {} + local spinner_ok, spinner = pcall(require, 'spinner.core') + -- default options - -- opts.enable_recording = true opts.enable_spinner = (opts.enable_spinner or true) and spinner_ok opts.populate_quickfix = opts.populate_quickfix or 'onerror' if opts.format_title == nil then - opts.format_title = table.concat({opts.command, unpack(opts.args)}, ' ') + opts.format_title = table.concat({ opts.command, unpack(opts.args) }, ' ') elseif type(opts.format_title) == 'function' then opts.format_title = opts.format_title(opts.command, opts.args) elseif type(opts.format_title) == 'string' then @@ -45,7 +45,7 @@ function M.jobstart(opts) end opts.on_start = vim.schedule_wrap(function(j) - table.insert(M.current_jobs, j.pid, j) + M.current_jobs[j.pid] = j if opts.populate_quickfix then vim.fn.setqflist({}, 'r') -- clear quickfix @@ -57,7 +57,7 @@ function M.jobstart(opts) end) opts.on_exit = vim.schedule_wrap(function(j, code) - table.remove(M.current_jobs, j.pid) + M.current_jobs[j.pid] = nil if not (code == 0) then vim.notify(string.format('[%d] exit %d', j.pid, code), vim.log.levels.ERROR) @@ -67,7 +67,7 @@ function M.jobstart(opts) spinner.on_exit(nil, nil, j.pid) end if opts.populate_quickfix then - vim.cmd.doautocmd [[QuickFixCmdPost]] + vim.cmd.doautocmd('QuickFixCmdPost') end end) @@ -92,11 +92,11 @@ function M.jobstart(opts) end) -- run vim.fn.expand() on all args - for i=1, #opts.args do + for i = 1, #opts.args do opts.args[i] = vim.fn.expandcmd(opts.args[i]) end - local j = require ('plenary.job'):new(opts) + local j = require('plenary.job'):new(opts) j:start() return j @@ -116,31 +116,44 @@ function M.make(extra_args) cwd = require('lspconfig.util').root_pattern('Makefile')(cwd) end - table.foreach(extra_args or {}, function(_, v) table.insert(args, v) end) + for _, v in pairs(extra_args or {}) do + table.insert(args, v) + end + -- table.foreach(extra_args or {}, function(_, v) end) - return M.jobstart { + return M.jobstart({ command = command, args = args, cwd = cwd, - } + }) end function M.sh(command_string) - return M.jobstart { + return M.jobstart({ command = vim.env.SHELL, - args = {'-c', command_string}, + args = { '-c', command_string }, -- strip 'sh -c' from the title (used by progress reporting etc.) format_title = function(_, args) - return table.concat({unpack(args, 2, #args)}, ' ') - end - } + return table.concat({ unpack(args, 2, #args) }, ' ') + end, + }) end - function M.list() - require('telescope').load_extension('jobs') require('telescope._extensions').manager['jobs']['jobs']() end +function M.setup() + require('telescope').load_extension('jobs') + + vim.keymap.set( + 'n', + '<leader>J', + require('internal.job').list, + { desc = 'list jobs managed by internal.job' } + ) + vim.api.nvim_create_user_command('Jobs', M.list, { desc = 'list jobs managed by internal.job' }) +end + return M diff --git a/.vim/lua/internal/lsp.lua b/.vim/lua/internal/lsp.lua index aa2794e..2bdd270 100644 --- a/.vim/lua/internal/lsp.lua +++ b/.vim/lua/internal/lsp.lua @@ -1,5 +1,9 @@ -local lsp = require('lspconfig') -local lspstatus = require('lsp-status') +-- TODO vim.api.nvim_create_autocmd('LspAttach', { +-- callback = function(args) +-- local client = vim.lsp.get_client_by_id(args.data.client_id) +-- local bufnr = args.buf +-- end, +-- }) local my_attach = function(client, bufnr) if vim.opt.diff:get() then @@ -13,67 +17,112 @@ local my_attach = function(client, bufnr) buffer = bufnr, group = group, callback = function() - if not _G.diagnostic_hidden then - vim.diagnostic.open_float(nil, { - focusable = false, - close_events = {'BufLeave', 'CursorMoved', 'InsertEnter', 'FocusLost'}, - border = _G.floating_win_border, - source = 'always', - prefix = ' ', - scope = 'cursor', - }) + if _G.diagnostic_hidden then + return + end + -- evalutate if there's already a floating preview buffer + local existing = vim.F.npcall(vim.api.nvim_buf_get_var, bufnr, 'lsp_floating_preview') + if not existing or not vim.api.nvim_win_is_valid(existing) then + vim.diagnostic.open_float() end end, }) - lspstatus.on_attach(client) + require('lsp-status').on_attach(client) if client.supports_method('textDocument/documentSymbol') then require('nvim-navic').attach(client, bufnr) -- require('aerial').on_attach(client, bufnr) -- vim.keymap.set('n', 'g0', vim.lsp.buf.document_symbol, {buffer = bufnr}) end if client.supports_method('workspace/symbol') then - vim.keymap.set('n', 'gW' , vim.lsp.buf.workspace_symbol, {buffer = bufnr, desc = 'goto symbol'}) - vim.keymap.set('n', ';s' , require('telescope.builtin').lsp_workspace_symbols, {desc='lsp workspace symbols'}) + vim.keymap.set( + 'n', + 'gW', + vim.lsp.buf.workspace_symbol, + { buffer = bufnr, desc = 'goto symbol' } + ) + vim.keymap.set( + 'n', + ';s', + require('telescope.builtin').lsp_workspace_symbols, + { desc = 'lsp workspace symbols' } + ) end if client.supports_method('textDocument/definition') then - vim.keymap.set('n', '<C-]>' , vim.lsp.buf.definition, {buffer = bufnr, desc = 'goto definition'}) - vim.keymap.set('n', 'gd' , vim.lsp.buf.definition, {buffer = bufnr, desc = 'goto definition'}) - vim.keymap.set('n', 'gR' , vim.lsp.buf.references, {buffer = bufnr, desc = 'goto references'}) - vim.keymap.set('n', ';R' , require('telescope.builtin').lsp_references, {desc='lsp references'}) + vim.keymap.set( + 'n', + '<C-]>', + vim.lsp.buf.definition, + { buffer = bufnr, desc = 'goto definition' } + ) + vim.keymap.set('n', 'gd', vim.lsp.buf.definition, { buffer = bufnr, desc = 'goto definition' }) + vim.keymap.set('n', 'gR', vim.lsp.buf.references, { buffer = bufnr, desc = 'goto references' }) + vim.keymap.set( + 'n', + ';R', + require('telescope.builtin').lsp_references, + { desc = 'lsp references' } + ) end if client.supports_method('textDocument/hover') then - vim.keymap.set('n', 'K' , vim.lsp.buf.hover, {buffer = bufnr, desc = 'hover'}) + vim.keymap.set('n', 'K', vim.lsp.buf.hover, { buffer = bufnr, desc = 'hover' }) end if client.supports_method('textDocument/rename') then - vim.keymap.set('n', 'grr' , vim.lsp.buf.rename, {buffer = bufnr, desc = 'rename'}) + vim.keymap.set('n', 'grr', vim.lsp.buf.rename, { buffer = bufnr, desc = 'rename' }) end if client.supports_method('signatureHelp') then - vim.keymap.set('n', '<c-h>' , vim.lsp.buf.signature_help, {buffer = bufnr, desc = 'signature help'}) + vim.keymap.set( + 'n', + '<c-h>', + vim.lsp.buf.signature_help, + { buffer = bufnr, desc = 'signature help' } + ) end if client.supports_method('textDocument/formatting') then vim.api.nvim_buf_set_option(bufnr, 'formatexpr', 'v:lua.vim.lsp.formatexpr()') - vim.keymap.set('n', '<leader>f' , vim.lsp.buf.format, {buffer = bufnr, desc = 'format'}) + vim.keymap.set('n', '<leader>f', vim.lsp.buf.format, { buffer = bufnr, desc = 'format' }) vim.api.nvim_create_autocmd('BufWritePre', { buffer = bufnr, group = group, - callback = function() require('internal.lsp').format(vim.fn.expand('<afile>:p')) end, + callback = function() + require('internal.lsp').format(vim.fn.expand('<afile>:p')) + end, }) end if client.supports_method('textDocument/typeDefinition') then - vim.keymap.set('n', 'gT' , vim.lsp.buf.type_definition, {buffer = bufnr, desc = 'goto typedef'}) + vim.keymap.set( + 'n', + 'gT', + vim.lsp.buf.type_definition, + { buffer = bufnr, desc = 'goto typedef' } + ) end if client.supports_method('textDocument/declaration') then - vim.keymap.set('n', 'gD' , vim.lsp.buf.declaration, {buffer = bufnr, desc = 'goto declaration'}) + vim.keymap.set( + 'n', + 'gD', + vim.lsp.buf.declaration, + { buffer = bufnr, desc = 'goto declaration' } + ) end if client.supports_method('textDocument/implementation') then - vim.keymap.set('n', 'gI' , vim.lsp.buf.implementation, {buffer = bufnr, desc = 'goto implementation'}) + vim.keymap.set( + 'n', + 'gI', + vim.lsp.buf.implementation, + { buffer = bufnr, desc = 'goto implementation' } + ) end if client.supports_method('textDocument/codeAction') then - vim.keymap.set('n', 'ga', vim.lsp.buf.code_action, {buffer = bufnr, desc = 'code action'}) + vim.keymap.set('n', 'ga', vim.lsp.buf.code_action, { buffer = bufnr, desc = 'code action' }) end if client.supports_method('textDocument/documentHighlight') then - vim.keymap.set('n', '<leader>8', vim.lsp.buf.document_highlight, {buffer = bufnr, desc = 'document highlight'}) + vim.keymap.set( + 'n', + '<leader>8', + vim.lsp.buf.document_highlight, + { buffer = bufnr, desc = 'document highlight' } + ) -- vim.keymap.set('n', '', vim.lsp.buf.clear_references, {buffer = bufnr, desc = 'clear references'}) vim.api.nvim_create_autocmd('CursorMoved', { callback = vim.lsp.buf.clear_references, @@ -82,8 +131,7 @@ local my_attach = function(client, bufnr) end end -local my_exit = function(_, _, _) -end +local my_exit = function(_, _, _) end local capabilities = function() local caps = vim.lsp.protocol.make_client_capabilities() @@ -94,33 +142,22 @@ local capabilities = function() 'documentation', 'detail', 'additionalTextEdits', - } + }, } -- add window/workDoneProgress capability - caps = vim.tbl_extend('keep', caps or {}, lspstatus.capabilities) + caps = vim.tbl_extend('keep', caps or {}, require('lsp-status').capabilities) return caps end local servers = { - ccls = { disabled = true, - root_dir = lsp.util.root_pattern('.ccls','meson.build','.git'), - init_options = { - compilationDatabaseDirectory = "build", - index = { threads = 0 }, - completion = { - filterAndSort = false, - }, - clang = { excludeArgs = { '-frounding-math' } }, - }, - }, clangd = {}, elixirls = { cmd = { 'elixir-ls' }, settings = { elixirLS = { dialyzerEnabled = false, - } - } + }, + }, }, gopls = { settings = { @@ -135,11 +172,12 @@ local servers = { }, gofumpt = true, -- hoverKind = 'Structured', - } - } + }, + }, }, sumneko_lua = { - cmd = { 'lua-language-server' }, + -- cmd = { 'lua-language-server' }, + cmd = { 'luals' }, settings = { Lua = { runtime = { @@ -153,7 +191,8 @@ local servers = { 'error', 'os', 'package', - 'pairs', 'ipairs', + 'pairs', + 'ipairs', 'pcall', 'require', 'string', @@ -165,14 +204,14 @@ local servers = { }, neededFileStatus = { ['code-style-check'] = 'Any', - } + }, }, format = { - enable = true, + enable = true, defaultConfig = { indent_style = 'space', indent_size = '2', - } + }, }, workspace = { -- library = vim.api.nvim_get_runtime_file("", true), @@ -180,7 +219,7 @@ local servers = { [vim.env.VIMRUNTIME .. '/lua'] = true, [vim.env.VIMRUNTIME .. '/lua/vim/lsp'] = true, [vim.fn.stdpath('config') .. '/lua'] = true, - } + }, }, telemetry = { enable = false, @@ -189,61 +228,69 @@ local servers = { }, }, rust_analyzer = { - cmd = { 'env', 'CARGO_TARGET_DIR=/tmp', 'RUST_SRC_PATH=/usr/src/rustlib/library', 'rust-analyzer' }, + -- cmd = { 'env', 'CARGO_TARGET_DIR=/tmp', 'RUST_SRC_PATH=/usr/src/rustlib/library', 'rust-analyzer' }, settings = { ['rust-analyzer'] = { checkOnSave = { - command = 'clippy' - } - } - }, - }, - tsserver = { disabled = true, - cmd = { - 'toolbox', 'run', '--', - 'sh', '-c', - '. /etc/profile.d/nvm.sh && typescript-language-server --stdio' + command = 'clippy', + }, + }, }, }, - zls = { disabled = true, - }, - zk = { disabled = true, - root_dir = lsp.util.root_pattern('.zk'), - }, + pylsp = {}, + -- tsserver = { disabled = true, + -- cmd = { + -- 'toolbox', 'run', '--', + -- 'sh', '-c', + -- '. /etc/profile.d/nvm.sh && typescript-language-server --stdio' + -- }, + -- }, + -- zls = { disabled = true }, + -- zk = { + -- cmd = {'zk', 'lsp', '--log', '/tmp/zk-lsp.log'}, + -- autostart = true, + -- }, } local setup = function() -- configure floating win handlers - vim.lsp.handlers['textDocument/hover'] = vim.lsp.with( - vim.lsp.handlers.hover, { border = _G.floating_win_border }) - vim.lsp.handlers['textDocument/signature_help'] = vim.lsp.with( - vim.lsp.handlers.signature_help, { border = _G.floating_win_border }) + vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { + focus = false, + zindex = 100, + border = _G.floating_win_border, + }) + vim.lsp.handlers['textDocument/signature_help'] = + vim.lsp.with(vim.lsp.handlers.signature_help, { border = _G.floating_win_border }) local caps = capabilities() for server, opts in pairs(servers) do if not opts.disabled then opts = vim.tbl_extend('error', opts, { - on_attach = my_attach, - on_exit = my_exit, + on_attach = my_attach, + on_exit = my_exit, capabilities = caps, }) -- lsp-status custom handlers - local ok, lspstatus_ext = pcall(lspstatus.extensions[server]) + local ok, lspstatus_ext = pcall(require('lsp-status').extensions[server]) if ok then opts = vim.tbl_extend('error', opts, { handlers = lspstatus_ext.setup(), }) end - lsp[server].setup(opts) + require('lspconfig')[server].setup(opts) end end end local format = function(afile) - if vim.g.nofmt then return end + if vim.g.nofmt then + return + end local ok, isMatch = pcall(string.match, afile, '^/home/robert/devel/upstream') - if not ok or isMatch then return end + if not ok or isMatch then + return + end local errhandler = function(err) vim.notify('fmt failed: ' .. err, vim.log.levels.ERROR) @@ -251,54 +298,21 @@ local format = function(afile) end xpcall(vim.lsp.buf.format, errhandler) if string.match(afile, '.go$') then - xpcall(vim.lsp.buf.code_action, errhandler, {context = {only = {'source.organizeImports'}}, apply = true}) + xpcall( + vim.lsp.buf.code_action, + errhandler, + { context = { only = { 'source.organizeImports' } }, apply = true } + ) end -- vim.notify('%#MoreMsg#%#Italic# fmt', vim.log.levels.INFO) vim.notify(' ', vim.log.levels.INFO) end -local symbols = { - -- - Array = ' ', - Boolean = ' ', - Class = ' ', - Color = ' ', - Constant = ' ', - Constructor = ' ', - Enum = ' ', - EnumMember = ' ', - Event = ' ', - -- Field = ' ', - Field = ' ', - File = ' ', - Folder = ' ', - Function = ' ', - Interface = ' ', - Key = ' ', - Keyword = ' ', - Method = ' ', - Module = ' ', - Namespace = ' ', - Null = ' ', - Object = ' ', - Operator = ' ', - Property = ' ', - Package = ' ', - Reference = ' ', - Snippet = ' ', - Struct = ' ', - Text = ' ', - TypeParameter = ' ', - Unit = ' ', - Value = ' ', - Variable = ' ', -} - return { - my_attach = my_attach, - my_exit = my_exit, + my_attach = my_attach, + my_exit = my_exit, capabilities = capabilities, - setup = setup, - format = format, - symbols = symbols, + setup = setup, + format = format, + symbols = symbols, } diff --git a/.vim/lua/internal/misc.lua b/.vim/lua/internal/misc.lua index b7d1a06..8664cbc 100644 --- a/.vim/lua/internal/misc.lua +++ b/.vim/lua/internal/misc.lua @@ -28,19 +28,23 @@ function M.open_under_cursor(cmd, detect_cmd) if vim.regex([[^(\.\./|[\w\d_/\-])*(\.[\w\d]+)?$]]):match_str(txt) then cmd = ':edit' end - vim.notify("open_under_cursor: detected command " .. txt .. " => " .. (cmd or "<nil>")) + vim.notify('open_under_cursor: detected command ' .. txt .. ' => ' .. (cmd or '<nil>')) end if not cmd then vim.fn.inputsave() - vim.ui.input('open with: ', function(result) cmd = result end) + vim.ui.input('open with: ', function(result) + cmd = result + end) vim.fn.inputrestore() - if not cmd then return end + if not cmd then + return + end end -- detect vim command - if cmd:sub(1, 1) == ":" then + if cmd:sub(1, 1) == ':' then vim.cmd(cmd:sub(2) .. ' ' .. txt) else - vim.loop.spawn(cmd, {args = {txt}}) + vim.loop.spawn(cmd, { args = { txt } }) end end) end @@ -54,7 +58,7 @@ local function get_visual_selection() if vim.opt.selection:get() == 'inclusive' then lines[#lines] = lines[#lines]:sub(1, bot.col) else - lines[#lines] = lines[#lines]:sub(1, (bot.col -1)) + lines[#lines] = lines[#lines]:sub(1, (bot.col - 1)) end lines[1] = lines[1]:sub(top.col) return top, bot, lines @@ -64,12 +68,12 @@ function M.sort_lines(_, preview_ns, preview_bufnr) local bufnr = vim.api.nvim_get_current_buf() local top, bot, lines = get_visual_selection() - for i=1, #lines do - lines[i] = vim.fn.join(vim.fn.sort(vim.fn.split(lines[i], " "))) + for i = 1, #lines do + lines[i] = vim.fn.join(vim.fn.sort(vim.fn.split(lines[i], ' '))) end if not preview_ns then - vim.api.nvim_buf_set_lines(bufnr, top.ln-1, bot.ln, false, lines) + vim.api.nvim_buf_set_lines(bufnr, top.ln - 1, bot.ln, false, lines) vim.notify('no preview') return 0 end @@ -77,16 +81,23 @@ function M.sort_lines(_, preview_ns, preview_bufnr) -- inccommand preview if preview_ns ~= nil then for i, line in ipairs(lines) do - vim.api.nvim_buf_set_extmark(bufnr, preview_ns, top.ln+i - 2, 0, { + vim.api.nvim_buf_set_extmark(bufnr, preview_ns, top.ln + i - 2, 0, { hl_mode = 'combine', virt_text_pos = 'overlay', - virt_text = {{line, 'Substitute'}}, + virt_text = { { line, 'Substitute' } }, }) if preview_bufnr ~= nil then local prefix = string.format('|%d| ', top.ln + i - 1) - vim.api.nvim_buf_set_lines(preview_bufnr, i-1, -1, false, { prefix .. line }) - vim.api.nvim_buf_add_highlight(preview_bufnr, preview_ns, 'Substitute', i, #prefix, #prefix+#line) + vim.api.nvim_buf_set_lines(preview_bufnr, i - 1, -1, false, { prefix .. line }) + vim.api.nvim_buf_add_highlight( + preview_bufnr, + preview_ns, + 'Substitute', + i, + #prefix, + #prefix + #line + ) end end return (#lines > 1 and 2 or 1) @@ -96,20 +107,24 @@ end local get_searchdirs = function(dirs) if type(dirs) == 'table' and #dirs > 0 then return dirs - elseif type(dirs) == 'string' and not (dirs == "") then + elseif type(dirs) == 'string' and not (dirs == '') then dirs = vim.split(dirs, ',') end -- skip asking if we're looking at known filetypes local ft = vim.api.nvim_buf_get_option(0, 'filetype') if #dirs == 0 and (ft == 'dirbuf' or ft == 'alpha') then - dirs = {'%:p:h'} + dirs = { '%:p:h' } end -- ask user if #dirs == 0 then - vim.ui.input({prompt = 'Search directories: '}, function(result) dirs = {result} end) + vim.ui.input({ prompt = 'Search directories: ' }, function(result) + dirs = { result } + end) end -- default to something reasonable - if #dirs == 0 then dirs = {'%:p:h'} end + if #dirs == 0 then + dirs = { '%:p:h' } + end -- finally return for i = 1, #dirs do dirs[i] = vim.fn.expand(dirs[i]) @@ -118,11 +133,15 @@ local get_searchdirs = function(dirs) end function onchoice(opts, cb) - if not cb then return end + if not cb then + return + end opts.attach_mappings = function(prompt_bufnr) require('telescope.actions').select_default:replace(function() local selection = require('telescope.actions.state').get_selected_entry() - if selection == nil then return end + if selection == nil then + return + end require('telescope.actions').close(prompt_bufnr) on_choice(selection.path) end) @@ -134,25 +153,28 @@ function M.live_grep(dirs, opts, cb) opts = opts or {} local search_dirs = get_searchdirs(dirs) opts.search_dirs = search_dirs - opts.prompt_title = 'Grep: '.. vim.inspect(search_dirs) + opts.prompt_title = 'Grep: ' .. vim.inspect(search_dirs) onchoice(opts, cb) require('telescope.builtin').live_grep(opts) end function M.find_files(dirs, opts, cb) -- convenience aliases - if dirs == 'plugins' then dirs = vim.fn.stdpath('data') .. '/site/pack/' end + if dirs == 'plugins' then + dirs = vim.fn.stdpath('data') .. '/site/pack/' + end opts = opts or {} local search_dirs = dirs - if type(dirs) == 'string' then search_dirs = get_searchdirs(dirs) end + if type(dirs) == 'string' then + search_dirs = get_searchdirs(dirs) + end opts.search_dirs = search_dirs - opts.prompt_title = 'Find: '.. vim.inspect(search_dirs) + opts.prompt_title = 'Find: ' .. vim.inspect(search_dirs) onchoice(opts, cb) require('telescope.builtin').find_files(opts) end - function M.fold_block() -- {{{ local Comment = require('Comment.api') local m = vim.api.nvim_buf_get_mark @@ -179,51 +201,67 @@ end -- }}} function M.link_preview() local link = vim.fn.expand('<cfile>') - if not link then return end + if not link then + return + end local buf = vim.api.nvim_get_current_buf() - local ln = (vim.api.nvim_win_get_cursor(0)[1]) - 1 - - require('job').jobstart({ - format_title = function() return "link-preview" end, - command = vim.env.SHELL, - args = {'-c', [[ curl -sSfL ]] .. link .. [[ | grep -iPo '(?<=property="og:title" content=")([^\"]+)(?=")' ]]}, - populate_quickfix = false, - enable_recording = true, - }):after_success( - vim.schedule_wrap(function(j, code, _) + local ln = vim.api.nvim_win_get_cursor(0)[1] - 1 + + require('job') + .jobstart({ + format_title = function() + return 'link-preview' + end, + command = vim.env.SHELL, + args = { + '-c', + [[ curl -sSfL ]] + .. link + .. [[ | grep -iPo '(?<=property="og:title" content=")([^\"]+)(?=")' ]], + }, + populate_quickfix = false, + enable_recording = true, + }) + :after_success(vim.schedule_wrap(function(j, code, _) local results = j:result() - if not code == 0 or #results == 0 then return end + if not code == 0 or #results == 0 then + return + end local ns = vim.api.nvim_create_namespace('') vim.api.nvim_buf_set_extmark(buf, ns, ln, 0, { - virt_text = {{results[1], 'Error'}}, - virt_text_pos = 'eol' + virt_text = { { results[1], 'Error' } }, + virt_text_pos = 'eol', }) - end) - ) + end)) end function M.setup(opts) if opts.sortline then - vim.api.nvim_create_user_command('SortLine', M.sort_lines, - { desc = 'sort line', range = '%', preview = M.sort_lines }) + vim.api.nvim_create_user_command( + 'SortLine', + M.sort_lines, + { desc = 'sort line', range = '%', preview = M.sort_lines } + ) end if opts.grep then - vim.api.nvim_create_user_command('Grep', function(o) M.live_grep(table.concat(o.fargs)) end, - { - desc = 'live grep (rg)', - nargs = '*', - complete = 'dir', - }) + vim.api.nvim_create_user_command('Grep', function(o) + M.live_grep(table.concat(o.fargs)) + end, { + desc = 'live grep (rg)', + nargs = '*', + complete = 'dir', + }) end if opts.find then - vim.api.nvim_create_user_command('Find', function(o) M.find_files(table.concat(o.fargs)) end, - { - desc = 'find files (fd)', - nargs = '*', - complete = 'dir', - }) + vim.api.nvim_create_user_command('Find', function(o) + M.find_files(table.concat(o.fargs)) + end, { + desc = 'find files (fd)', + nargs = '*', + complete = 'dir', + }) end end diff --git a/.vim/lua/internal/snips.lua b/.vim/lua/internal/snips.lua index 318c9f7..423eec6 100644 --- a/.vim/lua/internal/snips.lua +++ b/.vim/lua/internal/snips.lua @@ -1,4 +1,3 @@ - local ls = require('luasnip') local types = require('luasnip.util.types') @@ -13,7 +12,7 @@ vim.api.nvim_set_hl(0, 'LuasnipIndicator', { local autowrap = function(top, bot, inner) local autoinsert = function(args, _, _, wrap_with) local nodes = {} - if vim.trim(table.concat(args[1] or {})) ~= "" then + if vim.trim(table.concat(args[1] or {})) ~= '' then table.insert(nodes, wrap_with) end return ls.sn(nil, nodes) @@ -31,9 +30,11 @@ local autowrap = function(top, bot, inner) end local nodes = {} - table.insert(nodes, ls.d(maxpos+1, autoinsert, argnodes, {user_args = {top}})) - for _, e in ipairs(inner) do table.insert(nodes, e) end - table.insert(nodes, ls.d(maxpos+2, autoinsert, argnodes, {user_args = {bot}})) + table.insert(nodes, ls.d(maxpos + 1, autoinsert, argnodes, { user_args = { top } })) + for _, e in ipairs(inner) do + table.insert(nodes, e) + end + table.insert(nodes, ls.d(maxpos + 2, autoinsert, argnodes, { user_args = { bot } })) return nodes end @@ -41,61 +42,88 @@ end local comment = function(wrapped, blockcomment) -- commentstring helper local get_cstring = function() - local cs = require('Comment.ft').calculate { + local cs = require('Comment.ft').calculate({ ctype = blockcomment and 2 or 1, - range = require('Comment.utils').get_region() - } - local tbl = vim.split(cs or '', '%s', {plain = true, trimempty = true}) - return (#tbl == 0) and {'', ''} - or ((#tbl == 1) and {tbl[1] .. ' ', ''} - or {tbl[1], tbl[2]}) + range = require('Comment.utils').get_region(), + }) + local tbl = vim.split(cs or '', '%s', { plain = true, trimempty = true }) + return (#tbl == 0) and { '', '' } + or ((#tbl == 1) and { tbl[1] .. ' ', '' } or { tbl[1], tbl[2] }) end - if type(wrapped) ~= "table" then - wrapped = {wrapped} + if type(wrapped) ~= 'table' then + wrapped = { wrapped } end local nodes = {} - table.insert(nodes, ls.f(function() return get_cstring()[1] end)) - for _, n in ipairs(wrapped) do table.insert(nodes, n) end - table.insert(nodes, ls.f(function() return get_cstring()[2] end)) + table.insert( + nodes, + ls.f(function() + return get_cstring()[1] + end) + ) + for _, n in ipairs(wrapped) do + table.insert(nodes, n) + end + table.insert( + nodes, + ls.f(function() + return get_cstring()[2] + end) + ) return nodes end -- exec: inserts the output of command local exec = function(command) return ls.f(function(_, _, ...) - local results, code = require('plenary.job'):new({ - command = vim.env.SHELL, - args = {'-c', ...}, - enable_recording = true, - }):sync() + local results, code = require('plenary.job') + :new({ + command = vim.env.SHELL, + args = { '-c', ... }, + enable_recording = true, + }) + :sync() if not code == 0 or #results == 0 then error(string.format('exec "%s" failed', ...)) end return results - end, {}, {user_args = {command}}) + end, {}, { user_args = { command } }) +end + +local file_contents = function(path, vargs) + return ls.d(1, function(_, _, _, ...) + local lines = {} + for line in io.lines(path) do + table.insert(lines, line) + end + return ls.sn(nil, require('luasnip.extras.fmt').fmt(table.concat(lines, '\n'), ...)) + end, {}, { user_args = { vargs } }) end -ls.setup { +ls.setup({ ext_opts = { [types.snippet] = { - active = { virt_text = {{ '<-- luasnip', 'LuasnipIndicator' }}, virt_text_pos = 'right_align' } + active = { + virt_text = { { '<-- luasnip', 'LuasnipIndicator' } }, + virt_text_pos = 'right_align', + }, }, [types.insertNode] = { - unvisited = { hl_group = 'LuasnipIndicator' } + unvisited = { hl_group = 'LuasnipIndicator' }, }, [types.choiceNode] = { active = { - virt_text = {{'<-- choice node', 'LuasnipIndicator'}}, - } - } + virt_text = { { '<-- choice node', 'LuasnipIndicator' } }, + }, + }, }, snip_env = vim.tbl_extend('keep', ls.session.config.snip_env, { autowrap = autowrap, exec = exec, comment = comment, + file_contents = file_contents, user_email = { exec([[git config --get user.name]]), @@ -107,18 +135,16 @@ ls.setup { }), ls.t('>'), }, - }) -} + }), +}) -- snipmate snippets -require('luasnip.loaders.from_snipmate').lazy_load {paths = './after/snippets'} +require('luasnip.loaders.from_snipmate').lazy_load({ paths = './after/snippets' }) -- lua snippets -require("luasnip.loaders.from_lua").lazy_load {paths = './snippets'} +require('luasnip.loaders.from_lua').lazy_load({ paths = './snippets' }) -vim.api.nvim_create_user_command('LuaSnipUnlinkAll', - function() - while #package.loaded.luasnip.session.current_nodes > 0 do - package.loaded.luasnip.unlink_current() - end - end, - { desc = 'unlink all active snippets' }) +vim.api.nvim_create_user_command('LuaSnipUnlinkAll', function() + while #package.loaded.luasnip.session.current_nodes > 0 do + package.loaded.luasnip.unlink_current() + end +end, { desc = 'unlink all active snippets' }) diff --git a/.vim/lua/internal/spell.lua b/.vim/lua/internal/spell.lua index 57cbad2..3c37dad 100644 --- a/.vim/lua/internal/spell.lua +++ b/.vim/lua/internal/spell.lua @@ -1,8 +1,7 @@ - vim.opt_local.spell = true vim.opt.spellfile = vim.fn['spellfile#WritableSpellDir']() .. '/spellfile.utf-8.add' vim.opt.spellcapcheck = '' -vim.opt.spelloptions = {'camel'} +vim.opt.spelloptions = { 'camel' } vim.opt.spellsuggest = 'double' vim.keymap.set('n', '<C-l>', require('telescope.builtin').spell_suggest) diff --git a/.vim/lua/internal/statusline.lua b/.vim/lua/internal/statusline.lua index 97f5031..1c09271 100644 --- a/.vim/lua/internal/statusline.lua +++ b/.vim/lua/internal/statusline.lua @@ -5,28 +5,21 @@ function _G.statusline() local sl = hi -- sl = sl .. statusline_append([[ ⢷]], 'StatusLineIcon', hi) - sl = sl .. statusline_append(statusline_lightbulb(), - 'StatusLineLightbulb', hi) + sl = sl .. statusline_append(statusline_lightbulb(), 'StatusLineLightbulb', hi) - sl = sl .. statusline_append(statusline_ts(), - 'StatusLineTreesitter', hi) + sl = sl .. statusline_append(statusline_ts(), 'StatusLineTreesitter', hi) - sl = sl .. statusline_append(statusline_lsp_diagnostics(bufnr, hi), - 'StatusLineDiagnostics', hi) + sl = sl .. statusline_append(statusline_lsp_diagnostics(bufnr, hi), 'StatusLineDiagnostics', hi) - sl = sl .. statusline_append(statusline_lspstatus(), - 'StatusLineLsp', hi) + sl = sl .. statusline_append(statusline_lspstatus(), 'StatusLineLsp', hi) - sl = sl .. statusline_append(statusline_dap(), - 'StatusLineDap', hi) + sl = sl .. statusline_append(statusline_dap(), 'StatusLineDap', hi) sl = sl .. [[ %= ]] -- spacer - sl = sl .. statusline_append(statusline_notify(hi), - 'StatusLineNotify', hi) + sl = sl .. statusline_append(statusline_notify(hi), 'StatusLineNotify', hi) - sl = sl .. statusline_append(statusline_spinner(bufnr), - 'StatusLineJobs', hi) + sl = sl .. statusline_append(statusline_spinner(bufnr), 'StatusLineJobs', hi) sl = sl .. statusline_append([[ %l:%v --%p%%-- %y]], hi, hi) @@ -49,83 +42,123 @@ function _G.statusline_color(mode) end -- does item highlighting and conditionnal spacing function _G.statusline_append(element, hi, default_hi, opts) - if not element or element == '' then return '' end + if not element or element == '' then + return '' + end opts = opts or { append_space = true } - if hi ~= nil then hi = '%#' .. hi .. '#' end - if not (default_hi == '%*') then hi = default_hi end + if hi ~= nil then + hi = '%#' .. hi .. '#' + end + if not (default_hi == '%*') then + hi = default_hi + end local el = hi .. element .. default_hi - if opts.append_space then el = el .. ' ' end + if opts.append_space then + el = el .. ' ' + end return el end function _G.statusline_combine_hi(outer_name, inner_name) local outer = vim.api.nvim_get_hl_by_id(vim.api.nvim_get_hl_id_by_name(outer_name), true) local inner = vim.api.nvim_get_hl_by_id(vim.api.nvim_get_hl_id_by_name(inner_name), true) local hi = 'auto' .. outer_name .. inner_name - if pcall(vim.api.nvim_get_hl_by_name, hi, true) then return hi end + if pcall(vim.api.nvim_get_hl_by_name, hi, true) then + return hi + end local gui gui = inner.bold and 'bold' gui = inner.italic and 'italic' gui = inner.underline and 'underline' - vim.api.nvim_set_hl(0, hi, {bg = outer.background, fg = inner.foreground, gui = gui}) + vim.api.nvim_set_hl(0, hi, { bg = outer.background, fg = inner.foreground, gui = gui }) return hi end function _G.statusline_lsp_diagnostics(bufnr, default_hi) - local error_num = vim.diagnostic.get(bufnr, {severity=vim.diagnostic.severity.ERROR}) - local warn_num = vim.diagnostic.get(bufnr, {severity=vim.diagnostic.severity.WARN}) + local error_num = vim.diagnostic.get(bufnr, { severity = vim.diagnostic.severity.ERROR }) + local warn_num = vim.diagnostic.get(bufnr, { severity = vim.diagnostic.severity.WARN }) local s = '' if #error_num > 0 then local errs = vim.fn.sign_getdefined('DiagnosticSignError')[1].text .. #error_num - s = s .. statusline_append(errs, statusline_combine_hi('StatusLineDiagnostics', 'DiagnosticError'), default_hi) + s = s + .. statusline_append( + errs, + statusline_combine_hi('StatusLineDiagnostics', 'DiagnosticError'), + default_hi + ) end if #warn_num > 0 then local warns = vim.fn.sign_getdefined('DiagnosticSignWarn')[1].text .. #warn_num - s = s .. statusline_append(warns, statusline_combine_hi('StatusLineDiagnostics', 'DiagnosticWarn'), default_hi) + s = s + .. statusline_append( + warns, + statusline_combine_hi('StatusLineDiagnostics', 'DiagnosticWarn'), + default_hi + ) end return vim.trim(s) end function _G.statusline_ts() local navic = package.loaded['nvim-navic'] - if not navic then return '' end + if not navic then + return '' + end local data = navic.get_data() - if not data then return '' end + if not data then + return '' + end local s = {} for i = 1, #data do - table.insert(s, string.format('%%#CmpItemKind%s#%s%%* %%#StatusLine#%s%%*', data[i].type, data[i].icon, data[i].name)) + table.insert( + s, + string.format( + '%%#CmpItemKind%s#%s%%* %%#StatusLine#%s%%*', + data[i].type, + data[i].icon, + data[i].name + ) + ) end return table.concat(s, ' > ') end function _G.statusline_lspstatus() local lst = package.loaded['lsp-status'] - if not lst then return '' end + if not lst then + return '' + end return vim.trim(lst.status()) end function _G.statusline_lightbulb() local lb = package.loaded['nvim-lightbulb'] - if not lb then return '' end + if not lb then + return '' + end return lb.get_status_text() end function _G.statusline_spinner(bufnr) local sp = package.loaded.spinner - if not sp then return '' end + if not sp then + return '' + end return sp.status(bufnr) end function _G.statusline_dap() local dap = package.loaded.dap - if not dap then return '' end + if not dap then + return '' + end local s = dap.status() - if s == '' then return s end + if s == '' then + return s + end return '[DAP: ' .. s .. ']' end --- notifications cache -_G.statusline_notifications = {} -_G.statusline_notifications_archive = {} - function _G.statusline_notify(default_hi) - if #_G.statusline_notifications == 0 then return '' end + if not _G.statusline_notifications or #_G.statusline_notifications == 0 then + return '' + end local n = _G.statusline_notifications[1] local timeout = (n.options and n.options.timeout) or 2000 -- pop message after <timeout> and move to archive @@ -140,110 +173,18 @@ function _G.statusline_notify(default_hi) local s = '' if n.hi then - s = s .. statusline_append(n.lvl_string .. ' ', statusline_combine_hi('StatusLineNotify', n.hi), default_hi, { append_space = false }) + s = s + .. statusline_append( + n.lvl_string .. ' ', + statusline_combine_hi('StatusLineNotify', n.hi), + default_hi, + { append_space = false } + ) end - s = s .. statusline_append(n.message, 'StatusLineNotify', default_hi) + s = s .. statusline_append(vim.inspect(n.message), 'StatusLineNotify', default_hi) return vim.trim(s) end --- out vim.notify implementation -local notify = function(m, l, o) - local lvl_string = l - local hi = nil - if l and type(l) == 'number' then - if l == vim.log.levels.TRACE then - hi = 'deEmph' - elseif l == vim.log.levels.DEBUG then - hi = 'DiagnosticHint' - elseif l == vim.log.levels.INFO then - hi = 'DiagnosticInfo' - elseif l == vim.log.levels.WARN then - hi = 'DiagnosticWarn' - elseif l == vim.log.levels.ERROR then - hi = 'DiagnosticError' - end - -- get level string - lvl_string = vim.lsp.log_levels[l] - end - local display = m - if lvl_string then display = lvl_string .. ' ' .. display end - table.insert(_G.statusline_notifications, { - message = m, - level = l, - options = o, - lvl_string = lvl_string, - hi = hi, - display = display, - }) - - if _G.statusline_enable_notifysend then - local args = {} - if lvl_string then - if lvl_string == 'ERROR' then - table.insert(args, '--category=error') - end - if lvl_string == 'WARN' then - table.insert(args, '--category=warning') - end - end - table.insert(args, 'nvim') - table.insert(args, display) - require('internal.job').jobstart { command = 'notify-send', args = args } - end -end - --- overwrite vim.notify -vim.notify = function( m, l, o) - if vim.in_fast_event() then - vim.schedule(function() - notify(m, l, o) - end) - else - return notify(m, l, o) - end -end - -vim.keymap.set('n', '<leader>n', function() - local pickers = require('telescope.pickers') - local finders = require('telescope.finders') - local conf = require('telescope.config').values - local actions = require('telescope.actions') - -- local action_state = require('telescope.actions.state') - -- local previewers = require('telescope.previewers') - - local opts = {} - pickers.new(opts, { - prompt_title = "Notifications", - finder = finders.new_dynamic { - fn = function() - return _G.statusline_notifications_archive - end, - entry_maker = function(n) - return { - value = n, - display = n.display, - ordinal = n.message, - } - end, - }, - sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr, _) - actions.select_default:replace(function() - actions.close(prompt_bufnr) - -- noop - -- local sel = action_state.get_selected_entry() - -- vim.notify(sel.value.message, sel.value.level, sel.value.options) - end) - return true - end, - -- previewer = previewers.new_buffer_previewer { - -- define_preview = function(self, entry) - -- vim.api.nvim_buf_set_lines(self.state.bufnr, 0, -1, false, {entry.value.display}) - -- end, - -- }, - }):find() -end, {desc='notifications'}) - -- vim.opt.statusline = '%!luaeval("statusline()")' vim.opt.statusline = '%{%v:lua.statusline()%}' diff --git a/.vim/lua/plugins.lua b/.vim/lua/plugins.lua index cc008bc..d250a4a 100644 --- a/.vim/lua/plugins.lua +++ b/.vim/lua/plugins.lua @@ -1,485 +1,314 @@ --- vim: fdm=marker fdl=0 ----@diagnostic disable: undefined-global --- load by calling `lua require('plugins')` from init.vim - -local g = vim.g - --- force packer into a system directory {{{ -if not vim.fn.filewritable(vim.fn.stdpath('cache')) == 2 then --- TODO: what does this check for? - return -end - -local ensure_packer = function() - local install_path = vim.fn.stdpath('data') .. '/site/pack/packer/start/packer.nvim' - if vim.fn.empty(vim.fn.glob(install_path)) > 0 then - vim.notify('Installing packer.nvim...') - vim.fn.system({ 'git', 'clone', '--depth=1', 'https://github.com/wbthomason/packer.nvim', install_path }) - vim.cmd.packadd [[packer.nvim]] - return true - end - return false -end -local packer_bootstrapped = ensure_packer() --- }}} - -local function disable_distribution_plugins() -- {{{ - g.loaded_gzip = 1 - g.loaded_tar = 1 - g.loaded_tarPlugin = 1 - g.loaded_zip = 1 - g.loaded_zipPlugin = 1 - g.loaded_getscript = 1 - g.loaded_getscriptPlugin = 1 - g.loaded_vimball = 1 - g.loaded_vimballPlugin = 1 - g.loaded_matchit = 1 - -- g.loaded_matchparen = 1 - g.loaded_2html_plugin = 1 - g.loaded_logiPat = 1 - g.loaded_rrhelper = 1 - g.loaded_netrw = 1 - g.loaded_netrwPlugin = 1 - g.loaded_netrwSettings = 1 - g.loaded_netrwFileHandlers = 1 -end -- }}} - --- we change the packer.compile_path below, so we need to require it here... -local compilepath = vim.fn.stdpath('config') .. '/lua/packer_compiled.lua' -if not (vim.fn.empty(vim.fn.glob(compilepath)) > 0) then - require('packer_compiled') +-- disable distribution plugins +vim.g.loaded_gzip = 1 +vim.g.loaded_tar = 1 +vim.g.loaded_tarPlugin = 1 +vim.g.loaded_zip = 1 +vim.g.loaded_zipPlugin = 1 +vim.g.loaded_getscript = 1 +vim.g.loaded_getscriptPlugin = 1 +vim.g.loaded_vimball = 1 +vim.g.loaded_vimballPlugin = 1 +vim.g.loaded_matchit = 1 +-- vim.g.loaded_matchparen = 1 +vim.g.loaded_2html_plugin = 1 +vim.g.loaded_logiPat = 1 +vim.g.loaded_rrhelper = 1 +vim.g.loaded_netrw = 1 +vim.g.loaded_netrwPlugin = 1 +vim.g.loaded_netrwSettings = 1 +vim.g.loaded_netrwFileHandlers = 1 + +local lazypath = vim.fn.stdpath('data') .. '/lazy/lazy.nvim' +if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + 'git', + 'clone', + '--filter=blob:none', + 'https://github.com/folke/lazy.nvim.git', + '--branch=stable', + lazypath, + }) end - -require('packer').startup({function() - -- auto-compile on save -- {{{ - do - vim.api.nvim_create_user_command('PackerRecompile', - function() - for _, client in pairs(vim.lsp.get_active_clients()) do - if vim.tbl_contains(client.config.filetypes, 'lua') then - client.stop() +vim.opt.rtp:prepend(lazypath) + +local pluginspec = { + { + 'lewis6991/gitsigns.nvim', + lazy = false, + opts = { + signs = { + change = { hl = 'GitSignsChange', text = '▋', numhl = 'GitSignsChangeLn' }, + add = { hl = 'GitSignsAdd', text = '▋', numhl = 'GitSignsAddLn' }, + delete = { hl = 'GitSignsDelete', text = '_', numhl = 'GitSignsDeleteLn' }, + topdelete = { hl = 'GitSignsDelete', text = '‾', numhl = 'GitSignsDeleteLn' }, + changedelete = { hl = 'GitSignsChange', text = '~', numhl = 'GitSignsChangeLn' }, + }, + signcolumn = true, + numhl = false, + linehl = false, + word_diff = false, + preview_config = { + border = _G.floating_win_border, + }, + on_attach = function(bufnr) + local gs = require('gitsigns') + vim.keymap.set('n', ']c', function() + if vim.wo.diff then + return ']c' end - end - vim.cmd [[luafile $HOME/.vim/lua/plugins.lua]] - vim.cmd [[PackerCompile]] - vim.notify('packer: lazy-loading refreshed') + vim.schedule(gs.next_hunk) + return '<Ignore>' + end, { buffer = bufnr, expr = true, desc = 'next hunk' }) + vim.keymap.set('n', '[c', function() + if vim.wo.diff then + return '[c' + end + vim.schedule(gs.prev_hunk) + return '<Ignore>' + end, { buffer = bufnr, expr = true, desc = 'previous hunk' }) + vim.keymap.set('n', '<leader>hb', function() + gs.blame_line({ full = true }) + end, { buffer = bufnr, desc = 'show line blame (full)' }) + vim.keymap.set('n', '<leader>hB', function() + gs.blame_line({ full = false }) + end, { buffer = bufnr, desc = 'show line blame (compact)' }) + vim.keymap.set( + 'n', + '<leader>hp', + gs.preview_hunk, + { buffer = bufnr, desc = 'preview hunk' } + ) + vim.keymap.set('n', '<leader>hd', gs.diffthis, { buffer = bufnr, desc = 'diff this' }) + vim.keymap.set('n', '<leader>hl', function() + gs.setqflist(0, { open = false }) + vim.schedule(function() + require('telescope.builtin').quickfix() + end) + end, { buffer = bufnr, desc = 'list hunks' }) end, - {desc = 'recompile packer lazy-loading files'}) - - vim.api.nvim_create_autocmd('BufWritePost', { - pattern = 'plugins.lua', - command = [[PackerRecompile]], - group = vim.api.nvim_create_augroup('PackerAutoCompile', {}), - }) - end -- }}} - - -- run sync() if packer was just bootstrapped, usually means fresh install - if packer_bootstrapped then - -- require('packer').sync() - vim.cmd.PackerRecompile() - end - - -- disable built-in plugins - disable_distribution_plugins() - - -- manage packer itself - use {'wbthomason/packer.nvim'} - - -- improve startup time by optimizing lua `require` - use {'lewis6991/impatient.nvim'} - - -- neat helper for when you don't remember your keymap - use {'folke/which-key.nvim', -- {{{ - config = function() - require('which-key').setup { - icons = { separator = '→ ', group = '🞱 ' }, - triggers = {'<leader>', '<localleader>', ';', 'g', '[', ']'}, - } - end} -- }}} - - use {'lewis6991/gitsigns.nvim', --- {{{ - requires = {'nvim-lua/plenary.nvim'}, - config = function() - require('gitsigns').setup { - signs = { - change = {hl='GitSignsChange', text='▋', numhl='GitSignsChangeLn'}, - add = {hl='GitSignsAdd', text='▋', numhl='GitSignsAddLn'}, - delete = {hl='GitSignsDelete', text='_', numhl='GitSignsDeleteLn'}, - topdelete = {hl='GitSignsDelete', text='‾', numhl='GitSignsDeleteLn'}, - changedelete = {hl='GitSignsChange', text='~', numhl='GitSignsChangeLn'}, - }, - signcolumn = true, - numhl = false, - linehl = false, - word_diff = false, - preview_config = { - border = _G.floating_win_border, - }, - - on_attach = function(bufnr) - local gs = package.loaded.gitsigns - - vim.keymap.set('n', ']c', function() - if vim.wo.diff then return ']c' end - vim.schedule(gs.next_hunk) - return '<Ignore>' - end, {expr=true, buffer=bufnr, desc='next hunk'}) - - vim.keymap.set('n', '[c', function() - if vim.wo.diff then return '[c' end - vim.schedule(gs.prev_hunk) - return '<Ignore>' - end, {expr=true, buffer=bufnr, desc='previous hunk'}) - - vim.keymap.set('n', '<leader>hb', function() gs.blame_line {full=true} end, {buffer=bufnr, desc='show line blame (full)'}) - vim.keymap.set('n', '<leader>hB', function() gs.blame_line {full=false} end, {buffer=bufnr, desc='show line blame (compact)'}) - vim.keymap.set('n', '<leader>hp', gs.preview_hunk, {buffer=bufnr, desc='preview hunk'}) - vim.keymap.set('n', '<leader>hd', gs.diffthis, {buffer=bufnr, desc='diff this'}) - vim.keymap.set('n', '<leader>hl', function() - gs.setqflist(0, {open=false}) - vim.schedule(function() require('telescope.builtin').quickfix() end) - end, {buffer=bufnr, desc='list hunks'}) - end, - } - end} -- }}} + }, + }, - use {'lukas-reineke/indent-blankline.nvim', -- {{{ - config = function() - require('indent_blankline').setup { - char = '▏', - char_highlight_list = {'Whitespace'}, - -- space_char = ' ', - -- space_char_highlight_list = {}, - show_first_indent_level = true, - show_trailing_blankline_indent = false, - show_end_of_line = true, - use_treesitter = true, - disable_with_nolist = true, - buftype_exclude = {'terminal'}, - bufname_exclude = {'README.md'}, - strict_tabs = true, - show_current_context = true, - context_patterns = {'class', 'function', 'method', 'block'}, - -- context_highlight_list = {'Folded'}, - context_highlight_list = {'deEmph'}, - } - end} -- }}} + { + 'lukas-reineke/indent-blankline.nvim', + lazy = false, + opts = { + char = '▏', + char_highlight_list = { 'Whitespace' }, + -- space_char = ' ', + -- space_char_highlight_list = {}, + show_first_indent_level = true, + show_trailing_blankline_indent = false, + show_end_of_line = true, + use_treesitter = true, + disable_with_nolist = true, + buftype_exclude = { 'terminal' }, + bufname_exclude = { 'README.md' }, + filetype_exclude = { 'alpha' }, + strict_tabs = true, + show_current_context = true, + context_patterns = { 'class', 'function', 'method', 'block' }, + -- context_highlight_list = {'Folded'}, + context_highlight_list = { 'deEmph' }, + }, + }, - -- gcc to comment out text - use {'numToStr/Comment.nvim', -- {{{ - config = function() - require('Comment').setup { - opleader = { - block = 'gC', - } - } - end} -- }}} + { + 'numToStr/Comment.nvim', + opts = { + opleader = { block = 'gC' }, + }, + keys = { + 'gcc', + { 'gc', mode = 'v' }, + { 'gC', mode = 'v' }, + }, + }, - use {'editorconfig/editorconfig-vim', -- {{{ + { + 'editorconfig/editorconfig-vim', + event = 'VeryLazy', config = function() - local group = vim.api.nvim_create_augroup('EditorConfigDisable', { clear = true }) vim.api.nvim_create_autocmd('FileType', { - pattern = {'gitcommit'}, + pattern = { 'gitcommit' }, command = [[let b:EditorConfig_disable = 1]], - group = group, + group = vim.api.nvim_create_augroup('EditorConfigDisable', {}), }) - end} -- }}} + end, + }, - use {'windwp/nvim-autopairs', -- {{{ - config = function() - require('nvim-autopairs').setup() - end} -- }}} + { 'windwp/nvim-autopairs', priority = 40, event = 'InsertEnter', config = true }, - use {'elihunter173/dirbuf.nvim', -- {{{ + { + 'elihunter173/dirbuf.nvim', + lazy = false, config = function() - require('dirbuf').setup { + require('dirbuf').setup({ hash_padding = 4, sort_order = 'directories_first', - } + }) vim.api.nvim_create_autocmd('FileType', { pattern = 'dirbuf', callback = function() vim.keymap.set('n', 'gT', function() - vim.loop.spawn('swaymsg', {args = {'exec', '--', 'foot', '-D', vim.fn.expand('%')}}) + vim.loop.spawn('swaymsg', { args = { 'exec', '--', 'foot', '-D', vim.fn.expand('%') } }) -- vim.fn.system('swaymsg exec -- foot -D ' .. vim.fn.expand('%')) - end, {buffer=0, desc='open in foot terminal'}) + end, { buffer = 0, desc = 'open in foot terminal' }) end, group = vim.api.nvim_create_augroup('DirBufEnter', {}), }) - end} -- }}} - - _G.treesitter_enabled = { -- {{{ - 'bash', - 'bibtex', - 'c', - 'c_sharp', - 'cpp', - 'cmake', - 'comment', - 'css', - 'dockerfile', - -- 'elixir', - 'go', - 'gomod', - 'gowork', - 'hcl', - 'help', - 'html', - 'java', - 'javascript', - 'json', - 'jsonc', - 'latex', - 'ledger', - 'lua', - 'make', - 'markdown', - 'markdown_inline', - 'ninja', - 'norg', - 'regex', - 'rust', - 'scss', - 'toml', - 'typescript', - 'vim', - 'yaml', - 'zig', + end, + }, - 'org', - 'hare', - 'gotmpl', - 'vimdoc', - } -- }}} - use {'nvim-treesitter/nvim-treesitter', -- {{{ - run = ':TSUpdate', - requires = { - 'nvim-treesitter/nvim-treesitter-refactor', - 'nvim-treesitter/nvim-treesitter-textobjects', - 'nvim-treesitter/playground', - }, - config = function() + { + 'nvim-treesitter/nvim-treesitter', + lazy = false, + build = ':TSUpdate', + config = function(_, opts) local tsconf = require('nvim-treesitter.parsers').get_parser_configs() - tsconf.org = { - install_info = { - url = 'https://github.com/milisims/tree-sitter-org', - files = {'src/parser.c', 'src/scanner.cc'}, - revision = 'main', - } - } tsconf.hare = { install_info = { url = 'https://git.sr.ht/~ecmma/tree-sitter-hare', - files = {'src/parser.c'}, - } + files = { 'src/parser.c' }, + }, } tsconf.gotmpl = { install_info = { url = 'https://github.com/ngalaiko/tree-sitter-go-template', - files = {'src/parser.c'}, + files = { 'src/parser.c' }, }, filetype = 'gotmpl', - used_by = {'gotmpl.html', 'gotmpl.yaml', 'gotmpl'}, + used_by = { 'gotmpl.html', 'gotmpl.yaml', 'gotmpl' }, } - - require('nvim-treesitter.configs').setup { - ensure_installed = _G.treesitter_enabled, - disable = {'jsonc'}, - highlight = { - enable = true, - additional_vim_regex_highlighting = {'markdown'}, - }, - indent = { - enable = true, + require('nvim-treesitter.configs').setup(opts) + end, + opts = { + ensure_installed = { + 'bash', + 'bibtex', + 'c', + 'c_sharp', + 'cpp', + 'cmake', + 'comment', + 'css', + 'dockerfile', + -- 'elixir', + 'go', + 'gomod', + 'gowork', + 'hcl', + 'help', + 'html', + 'java', + 'javascript', + 'json', + 'jsonc', + 'latex', + 'ledger', + 'lua', + 'make', + 'markdown', + 'markdown_inline', + 'ninja', + 'norg', + 'regex', + 'rust', + 'scss', + 'toml', + 'typescript', + 'vim', + 'yaml', + 'zig', + -- experimental + 'hare', + 'gotmpl', + }, + -- disable = { 'jsonc' }, + highlight = { + enable = true, + additional_vim_regex_highlighting = { 'markdown' }, + }, + indent = { + enable = true, + }, + incremental_selection = { + enable = true, + keymaps = { + init_selection = 'gnn', + node_incremental = 'grn', + node_decremental = 'grm', }, - incremental_selection = { + }, + refactor = { + navigation = { enable = true, keymaps = { - init_selection = 'gnn', - node_incremental = 'grn', - node_decremental = 'grm', + goto_definition = '<c-]>', }, }, - refactor = { - navigation = { - enable = true, - keymaps = { - goto_definition = "<c-]>", - }, - }, - smart_rename = { - enable = true, - keymaps = { - smart_rename = "grr", - }, + smart_rename = { + enable = true, + keymaps = { + smart_rename = 'grr', }, }, - textobjects = { - select = { - enable = true, - keymaps = { - ["ib"] = '@block.inner', - ["ob"] = '@block.outer', - ["ic"] = '@conditional.inner', - ["oc"] = '@conditional.outer', - ["if"] = '@function.inner', - ["of"] = '@function.outer', - ["il"] = '@loop.inner', - ["ol"] = '@loop.outer', - ["is"] = '@scopename.inner', - ["os"] = '@scopename.outer', - }, + }, + textobjects = { + select = { + enable = true, + keymaps = { + ['ib'] = '@block.inner', + ['ob'] = '@block.outer', + ['ic'] = '@conditional.inner', + ['oc'] = '@conditional.outer', + ['if'] = '@function.inner', + ['of'] = '@function.outer', + ['il'] = '@loop.inner', + ['ol'] = '@loop.outer', + ['is'] = '@scopename.inner', + ['os'] = '@scopename.outer', }, }, - } - end} -- }}} - - use {'neovim/nvim-lspconfig', -- {{{ + }, + }, + }, + { 'nvim-treesitter/nvim-treesitter-refactor', keys = { '<c-]>', 'grr' } }, + { + 'nvim-treesitter/nvim-treesitter-textobjects', + keys = { 'ib', 'ob', 'ic', 'oc', 'if', 'of', 'il', 'ol', 'is', 'os' }, + }, + { 'nvim-treesitter/playground', cmd = 'TSPlaygroundToggle' }, + + { + 'neovim/nvim-lspconfig', + lazy = false, + -- event = 'InsertEnter', + priority = 100, + dependencies = { + { + 'nvim-lua/lsp-status.nvim', + config = function() + local lspstatus = require('lsp-status') + lspstatus.config({ + diagnostics = false, + current_function = false, + status_symbol = '', + }) + lspstatus.register_progress() + end, + }, + }, config = function() require('telescope').load_extension('lsp_handlers') require('internal.lsp').setup() - end} -- }}} - - use {'nvim-lua/lsp-status.nvim', module = {'lsp-status'}, -- {{{ - config = function() - local lspstatus = require('lsp-status') - lspstatus.config { - diagnostics = false, - current_function = false, - status_symbol = '', - } - lspstatus.register_progress() - end} -- }}} - - use {'stevearc/aerial.nvim', module = {'aerial'}, cmd = {'AerialOpen', 'AerialToggle'}, disable = false, -- {{{ - config = function() - require('aerial').setup({ - backends = { 'lsp', 'treesitter', 'markdown' }, - filter_kind = { - -- default: - 'Class', - 'Constructor', - 'Enum', - 'Function', - 'Interface', - 'Module', - 'Method', - 'Struct', - -- custom: - 'Constant', - 'Variable', - }, - icons = require('internal.lsp').symbols, - close_automatic_events = { 'unsupported' }, - placement = 'edge', - open_automatic = false, - -- open_automatic = function(bufnr) - -- return vim.api.nvim_buf_line_count(bufnr) > 200 - -- and package.loaded.aerial.num_symbols(bufnr) > 4 - -- and not package.loaded.aerial.was_closed() - -- end, - default_keybinds = false, - show_guides = true, - }) - -- TODO: https://github.com/neovim/neovim/issues/18660 - -- vim.api.nvim_create_autocmd('FileType', { pattern = 'aerial', - -- callback = function() vim.opt_local.winbar = '' end, - -- }) - end} --- }}} - - use {'SmiteshP/nvim-navic', module = 'nvim-navic', -- {{{ - requires = {'neovim/nvim-lspconfig'}, - config = function() - local navic = require('nvim-navic') - navic.setup { - icons = require('internal.lsp').symbols, - } - end} -- }}} - - use {'kosayoda/nvim-lightbulb', disable = true, -- {{{ - config = function() - require('nvim-lightbulb').setup { - ignore = {'null-ls'}, - sign = { enabled = false }, - virtual_text = { enabled = false, text = '← ' }, - status_text = { enabled = true, text = '', text_unavailable = '' }, - autocmd = { enabled = true }, - } - vim.fn.sign_define({{name='LightBulbSign', text='', texthl='LightBulbSign'}}) - end} -- }}} - - use {'weilbith/nvim-code-action-menu', - config = function() - vim.lsp.handlers['textDocument/codeAction'] = require('code_action_menu').open_code_action_menu - end} - - use {'jose-elias-alvarez/null-ls.nvim', -- {{{ - requires = {'nvim-lua/plenary.nvim'}, - config = function() - local nls = require('null-ls') - nls.setup { - -- debug = true, - sources = { - nls.builtins.diagnostics.shellcheck, - nls.builtins.formatting.shfmt, - nls.builtins.formatting.yapf, -- python - -- nls.builtins.formatting.clang_format, - -- nls.builtins.formatting.gofumpt, - -- nls.builtins.formatting.json_tool, - -- nls.builtins.formatting.rustfmt, - -- nls.builtins.formatting.stylua, - }, - on_attach = require('internal.lsp').my_attach, - } - - local h = require('null-ls.helpers') - - nls.register({ - h.make_builtin({ - name = 'html-beautify', - filetypes = {'html', 'gotmpl.html'}, - method = nls.methods.FORMATTING, - generator_opts = { - command = vim.env.HOME .. '/.yarn/bin/html-beautify', - args = {'--file', '-', '--editorconfig'}, - to_stdin = true, - }, - factory = h.formatter_factory, - }), - h.make_builtin({ - name = 'html-beautify', - filetypes = {'html', 'gotmpl.html'}, - method = nls.methods.FORMATTING, - generator_opts = { - command = vim.env.HOME .. '/.yarn/bin/html-beautify', - args = {'--file', '-', '--editorconfig'}, - to_stdin = true, - }, - factory = h.formatter_factory, - }), - h.make_builtin({ - name = 'css-beautify', - filetypes = {'css', 'scss'}, - method = nls.methods.FORMATTING, - generator_opts = { - command = vim.env.HOME .. '/.yarn/bin/css-beautify', - args = {'--file', '-', '--editorconfig'}, - to_stdin = true, - }, - factory = h.formatter_factory, - }), - }) - end} -- }}} - - use {'mfussenegger/nvim-dap', module = {'dap'}, -- {{{ - requires = {'nvim-telescope/telescope-dap.nvim'}, - config = function() - require('telescope').load_extension('dap') - require('internal.dap') - end} -- }}} + end, + }, - use {'hrsh7th/nvim-cmp', -- {{{ - requires = { + { + 'hrsh7th/nvim-cmp', + event = 'InsertEnter', + dependencies = { -- 'hrsh7th/cmp-buffer', 'hrsh7th/cmp-cmdline', 'hrsh7th/cmp-path', @@ -489,130 +318,102 @@ require('packer').startup({function() 'hrsh7th/cmp-nvim-lsp-signature-help', 'saadparwaiz1/cmp_luasnip', 'f3fora/cmp-spell', - 'windwp/nvim-autopairs', - 'neovim/nvim-lspconfig', }, config = function() local cmp = require('cmp') local luasnip = require('luasnip') - cmp.setup { + cmp.setup({ + experimental = { ghost_text = true }, -- disable completion in comments enabled = function() - local ctx = require('cmp.config.context') - if vim.api.nvim_get_mode().mode == 'c' then + local ok, enable = pcall(function() + local ctx = require('cmp.config.context') + if vim.api.nvim_get_mode().mode == 'i' then + if ctx.in_treesitter_capture('comment') or ctx.in_syntax_group('Comment') then + return false + end + if vim.opt.filetype:get() == 'TelescopePrompt' then + return false + end + end return true - else - return ctx.in_treesitter_capture('comment') - and not ctx.in_syntax_group('Comment') - end + end) + return not ok or enable end, preselect = cmp.PreselectMode.Item, window = { + completion = { + border = 'none', + }, documentation = { - border = _G.floating_win_border, + border = 'solid', }, }, - mapping = { -- {{{2 - ['<cr>'] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.mapping.confirm({ select = true }) - elseif luasnip.expandable() then - luasnip.expand() - else - fallback() - end - end), + mapping = cmp.mapping.preset.insert({ ['<c-space>'] = cmp.mapping.complete(), + ['<cr>'] = cmp.mapping(function(fallback) + if luasnip.expandable() then + luasnip.expand() + elseif cmp.visible() then + cmp.mapping.confirm({ select = true }) + else + fallback() + end + end), ['<c-n>'] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_next_item() - elseif luasnip.locally_jumpable(1) then - luasnip.jump(1) - else - fallback() - end - end, { 'c', 'i', 's', 'n' }), + if luasnip.locally_jumpable(1) then + luasnip.jump(1) + elseif cmp.visible() then + cmp.select_next_item() + else + fallback() + end + end), ['<c-p>'] = cmp.mapping(function(fallback) - if cmp.visible() then - cmp.select_prev_item() - elseif luasnip.locally_jumpable(-1) then - luasnip.jump(-1) - else - fallback() - end - end, { 'c', 'i', 's', 'n' }), - ['<tab>'] = cmp.mapping({ - i = function(fallback) - if cmp.visible() then - cmp.mapping.confirm({ select = true }) - elseif luasnip.expand_or_locally_jumpable() then - luasnip.expand_or_jump() - else - fallback() - end - end, - s = function(fallback) - if cmp.visible() then - cmp.select_next_item() - elseif luasnip.expand_or_locally_jumpable() then - luasnip.expand_or_jump() - else - fallback() - end - end, - c = function(fallback) - if cmp.visible() then - cmp.select_next_item() - else - fallback() - end - end, - }), - ['<s-tab>'] = cmp.mapping({ - i = function(fallback) - if cmp.visible() then - cmp.select_prev_item() - elseif luasnip.locally_jumpable(-1) then - luasnip.jump(-1) - else - fallback() - end - end, - s = function(fallback) - if cmp.visible() then - cmp.select_prev_item() - elseif luasnip.locally_jumpable(-1) then - luasnip.jump(-1) - else - fallback() - end - end, - c = function(fallback) - if cmp.visible() then - cmp.select_prev_item() - else - fallback() - end - end, - }), + if luasnip.locally_jumpable(-1) then + luasnip.jump(-1) + elseif cmp.visible() then + cmp.select_prev_item() + else + fallback() + end + end), + ['<tab>'] = cmp.mapping(function(fallback) + if luasnip.expand_or_locally_jumpable() then + luasnip.expand_or_jump() + elseif cmp.visible() then + cmp.mapping.confirm({ select = true }) + else + fallback() + end + end), + ['<s-tab>'] = cmp.mapping(function(fallback) + if luasnip.locally_jumpable(-1) then + luasnip.jump(-1) + elseif cmp.visible() then + cmp.select_prev_item() + else + fallback() + end + end), -- map c-j/k for luasnip choice nodes ['<c-j>'] = cmp.mapping(function(fallback) - if luasnip.choice_active() then - luasnip.change_choice(1) - else - fallback() - end - end, { 'i', 's'}), + if luasnip.choice_active() then + luasnip.change_choice(1) + else + fallback() + end + end, { 'i', 's' }), ['<c-k>'] = cmp.mapping(function(fallback) - if luasnip.choice_active() then - luasnip.change_choice(-1) - else - fallback() - end - end, { 'i', 's'}), + if luasnip.choice_active() then + luasnip.change_choice(-1) + else + fallback() + end + end, { 'i', 's' }), ['<s-pagedown>'] = cmp.mapping.scroll_docs(-4), ['<s-pageup>'] = cmp.mapping.scroll_docs(4), - }, -- 2}}} + }), snippet = { expand = function(args) require('luasnip').lsp_expand(args.body) @@ -624,79 +425,100 @@ require('packer').startup({function() { name = 'luasnip' }, { name = 'nvim_lua' }, }, { - { name = 'neorg' }, + -- { name = 'neorg' }, -- { name = 'orgmode' }, { name = 'spell', keyword_length = 3, max_item_count = 5 }, { name = 'path' }, -- { name = 'buffer', keyword_length = 3 }, }), formatting = { - fields = {'kind', 'abbr', 'menu'}, + fields = { 'kind', 'abbr', 'menu' }, format = function(entry, item) local menus = { nvim_lsp = '░ lsp', - luasnip = '░ snip', + luasnip = '░ snip', nvim_lua = '░ nvim', -- orgmode = '░ org', - spell = '░ spell', - path = '░ path', - buffer = '░ buf', + spell = '░ spell', + path = '░ path', + buffer = '░ buf', } - item.kind = require('internal.lsp').symbols[item.kind] or '' + item.kind = require('internal.lsp_symbols')[item.kind] or '' item.menu = menus[entry.source.name] return item end, }, - } - cmp.setup.cmdline({'/', '?', '@'}, { + }) + cmp.setup.cmdline({ '/', '?', '@' }, { mapping = cmp.mapping.preset.cmdline(), sources = cmp.config.sources({ { name = 'nvim_lsp_document_symbol' }, - { name = 'buffer' } + -- { name = 'buffer' } }), formatting = { - fields = {'abbr', 'menu'}, + fields = { 'abbr', 'menu' }, }, }) cmp.setup.cmdline(':', { mapping = vim.tbl_extend('force', cmp.mapping.preset.cmdline(), { - ['<c-r>'] = cmp.mapping({ c = function() vim.cmd.Telescope 'command_history' end}), + ['<c-r>'] = cmp.mapping({ + c = function() + vim.cmd.Telescope('command_history') + end, + }), }), sources = cmp.config.sources({ { name = 'path' }, }, { - { name = 'cmdline' } + { name = 'cmdline' }, }), formatting = { - fields = {'abbr', 'menu'}, + fields = { 'abbr', 'menu' }, }, }) - -- insert `(` after selecting function/method items - cmp.event:on('confirm_done', require('nvim-autopairs.completion.cmp').on_confirm_done { - map_char = {tex = ''} - }) - end} -- }}} + cmp.event:on( + 'confirm_done', + require('nvim-autopairs.completion.cmp').on_confirm_done({ + map_char = { tex = '' }, + }) + ) + end, + }, - use {'L3MON4D3/LuaSnip', -- {{{ + { + 'L3MON4D3/LuaSnip', config = function() require('internal.snips') - end} -- }}} + end, + }, - use {'nvim-telescope/telescope.nvim', --- {{{ - requires = { + { + 'nvim-telescope/telescope.nvim', + cmd = 'Telescope', + dependencies = { 'nvim-lua/popup.nvim', 'nvim-lua/plenary.nvim', - -- telescope plugins: - {'nvim-telescope/telescope-fzf-native.nvim', run = 'make'}, - {'nvim-telescope/telescope-ui-select.nvim'}, - {'gbrlsnchs/telescope-lsp-handlers.nvim'}, + { + 'nvim-telescope/telescope-fzf-native.nvim', + build = 'make', + config = function() + require('telescope').load_extension('fzf') + end, + }, + { + 'nvim-telescope/telescope-ui-select.nvim', + config = function() + require('telescope').load_extension('ui-select') + end, + }, + 'gbrlsnchs/telescope-lsp-handlers.nvim', }, config = function() - require('telescope').setup{ + require('telescope').setup({ defaults = { - prompt_prefix = '> ', - selection_caret = '* ', + prompt_prefix = '', + selection_caret = '⯈ ', sorting_strategy = 'ascending', preview = false, @@ -707,18 +529,15 @@ require('packer').startup({function() -- preview_cutoff = 1, -- height = 20, }, - border = true, borderchars = { - preview = { '─', '│', '─', '│', '┌', '┐', '┘', '└'}, - prompt = { '─', ' ', ' ', ' ', '─', '─', ' ', ' ' }, + preview = { '─', '│', '─', '│', '┌', '┐', '┘', '└' }, + prompt = { '─', '', '', '', '╾', '╼', '', '' }, results = { '' }, }, - - file_previewer = require('telescope.previewers').vim_buffer_cat.new, - grep_previewer = require('telescope.previewers').vim_buffer_vimgrep.new, + file_previewer = require('telescope.previewers').vim_buffer_cat.new, + grep_previewer = require('telescope.previewers').vim_buffer_vimgrep.new, qflist_previewer = require('telescope.previewers').vim_buffer_qflist.new, - mappings = { i = { ['<C-Space>'] = require('telescope.actions.layout').toggle_preview, @@ -727,341 +546,536 @@ require('packer').startup({function() ['<C-Space>'] = require('telescope.actions.layout').toggle_preview, }, }, - - extensions = { - ['fzf'] = { - fuzzy = true, - override_generic_sorter = true, - override_file_sorter = true, - case_mode = 'smart_case', - }, - - ['lsp_handlers'] = { - disable = { - -- ['textDocument/codeAction'] = true, - }, + }, + extensions = { + ['fzf'] = { + fuzzy = true, + override_generic_sorter = true, + override_file_sorter = true, + case_mode = 'smart_case', + }, + ['lsp_handlers'] = { + disable = { + -- ['textDocument/codeAction'] = true, }, - - ['ui-select'] = { - require("telescope.themes").get_cursor { - initial_mode = 'normal', - previewer = false, - } - } - } - } - } - - -- required to get fzf-native working - require('telescope').load_extension('fzf') - require('telescope').load_extension('ui-select') - - vim.keymap.set('n', ';Q', require('telescope.builtin').quickfix, {desc='quickfix'}) - vim.keymap.set('n', ';C', require('telescope.builtin').loclist, {desc='loclist'}) - vim.keymap.set('n', ';H', require('telescope.builtin').help_tags, {desc='help_tags'}) - vim.keymap.set('n', ';b', require('telescope.builtin').buffers, {desc='buffer'}) - vim.keymap.set('n', ';c', require('telescope.builtin').commands, {desc='commands'}) - vim.keymap.set('n', ';f', require('telescope.builtin').fd, {desc='fd'}) - vim.keymap.set('n', ';g', require('telescope.builtin').live_grep, {desc='grep'}) - vim.keymap.set('n', ';h', require('telescope.builtin').command_history, {desc='command history'}) - vim.keymap.set('n', ';l', require('telescope.builtin').current_buffer_fuzzy_find, {desc='buffer'}) - vim.keymap.set('n', ';o', require('telescope.builtin').oldfiles, {desc='oldfiles'}) - vim.keymap.set('n', ';d', require('telescope.builtin').diagnostics, {desc='diagnostics'}) - vim.keymap.set('n', ';v', function() + }, + ['ui-select'] = { + require('telescope.themes').get_cursor({ + initial_mode = 'normal', + previewer = false, + }), + }, + }, + }) + end, + keys = { + { + ';Q', + function() + require('telescope.builtin').quickfix() + end, + desc = 'quickfix', + }, + { + ';C', + function() + require('telescope.builtin').loclist() + end, + desc = 'loclist', + }, + { + ';H', + function() + require('telescope.builtin').help_tags() + end, + desc = 'help_tags', + }, + { + ';b', + function() + require('telescope.builtin').buffers() + end, + desc = 'buffer', + }, + { + ';c', + function() + require('telescope.builtin').commands() + end, + desc = 'commands', + }, + { + ';f', + function() + require('telescope.builtin').fd() + end, + desc = 'fd', + }, + { + ';g', + function() + require('telescope.builtin').live_grep() + end, + desc = 'grep', + }, + { + ';h', + function() + require('telescope.builtin').command_history() + end, + desc = 'command history', + }, + { + ';l', + function() + require('telescope.builtin').current_buffer_fuzzy_find() + end, + desc = 'buffer', + }, + { + ';o', + function() + require('telescope.builtin').oldfiles() + end, + desc = 'oldfiles', + }, + { + ';d', + function() + require('telescope.builtin').diagnostics() + end, + desc = 'diagnostics', + }, + { + ';v', + function() require('telescope.builtin').find_files({ prompt_title = 'vimrc', previewer = false, cwd = vim.fn.stdpath('config'), }) - end, {desc='vim config'}) - - vim.keymap.set('n', 'gw', function() - misc.word_under_cursor(function(s) require('telescope.builtin').grep_string({ search = s }) end) - end, {desc='grep for word under cursor'}) - -- vim.keymap.set('n', '<localleader>ge', function() - -- misc.expr_under_cursor(function(s) require('telescope.builtin').grep_string({ search = s }) end) - -- end) - -- vim.keymap.set('n', '<localleader>gf', function() - -- misc.file_under_cursor(function(s) require('telescope.builtin').grep_string({ search = s }) end) - -- end) - end} -- }}} + end, + desc = 'vim config', + }, + { + 'gw', + function() + require('internal.misc').word_under_cursor(function(s) + require('telescope.builtin').grep_string({ search = s }) + end) + end, + desc = 'grep for word under cursor', + }, + }, + }, - use {'tpope/vim-surround'} - use {'tpope/vim-repeat'} -- extend '.' to plugins - use {'michaeljsmith/vim-indent-object'} -- indentation text-objects - use {'kshenoy/vim-signature', disable = true} -- toggle, display and navigate marks - use {'norcalli/nvim-colorizer.lua', -- {{{ + { + 'norcalli/nvim-colorizer.lua', + -- event = 'VeryLazy', config = function() require('colorizer').setup(nil, { - name = true; - RRGGBB = true; - RRGGBBAA = false; - rgb_fn = true; - hsl_fn = true; - mode = 'background'; + name = true, + RRGGBB = true, + RRGGBBAA = false, + rgb_fn = true, + hsl_fn = true, + mode = 'background', }) - end} -- }}} + end, + }, + + { 'gentoo/gentoo-syntax', lazy = false }, + + { + 'NMAC427/guess-indent.nvim', + opts = { + auto_cmd = true, + filetype_exclude = { 'netrw', 'tutor', 'dirbuf' }, + buftype_exclude = { 'help', 'nofile', 'terminal', 'prompt' }, + }, + }, - use {'rhysd/conflict-marker.vim', disable = true} - use {'kassio/neoterm', disable = true} + { + url = 'https://git.sr.ht/~robertgzr/spinner.nvim', + opts = { + spinner = { '⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏' }, + interval = 120, -- spinner frame rate in ms + }, + }, - use {'kristijanhusak/orgmode.nvim', ft = {'org'}, module = {'orgmode'}, disable = true, -- {{{ + { + 'stevearc/aerial.nvim', + cmd = { 'AerialOpen', 'AerialToggle' }, + opts = { + backends = { 'lsp', 'treesitter', 'markdown' }, + filter_kind = { + -- default: + 'Class', + 'Constructor', + 'Enum', + 'Function', + 'Interface', + 'Module', + 'Method', + 'Struct', + -- custom: + 'Constant', + 'Variable', + }, + icons = require('internal.lsp_symbols'), + close_automatic_events = { 'unsupported' }, + placement = 'edge', + open_automatic = false, + -- open_automatic = function(bufnr) + -- return vim.api.nvim_buf_line_count(bufnr) > 200 + -- and package.loaded.aerial.num_symbols(bufnr) > 4 + -- and not package.loaded.aerial.was_closed() + -- end, + default_keybinds = false, + show_guides = true, + }, + }, + + { + 'SmiteshP/nvim-navic', + opts = { + icons = require('internal.lsp_symbols'), + }, + }, + + -- {'kosayoda/nvim-lightbulb', + -- config = { + -- ignore = {'null-ls'}, + -- sign = { enabled = false }, + -- virtual_text = { enabled = false, text = '← ' }, + -- status_text = { enabled = true, text = '', text_unavailable = '' }, + -- autocmd = { enabled = true }, + -- }, + -- init = function() + -- vim.fn.sign_define({{name='LightBulbSign', text='', texthl='LightBulbSign'}}) + -- end, + -- }, + + { + 'weilbith/nvim-code-action-menu', + event = 'VeryLazy', config = function() - require('orgmode').setup_ts_grammar() - require('orgmode').setup { - org_agenda_files = {vim.env.HOME..'/Documents/org/*.org'}, - org_default_notes_file = vim.env.HOME..'/Documents/org/todo.org', - org_todo_keywords = {'TODO', 'DONE'}, - -- org_indent_mode = 'noindent', - org_agenda_templates = { - t = { - description = 'Todo', - template = '* TODO %?', - }, - n = { - description = 'Note', - template = '* %?', - target = vim.env.HOME..'/Documents/org/notes.org', - }, - }, - mappings = { - agenda = { - org_agenda_close = nil, - } + vim.lsp.handlers['textDocument/codeAction'] = + require('code_action_menu').open_code_action_menu + end, + }, + + { + 'jose-elias-alvarez/null-ls.nvim', + ft = { 'sh', 'bash', 'lua', 'rust', 'c', 'cpp' }, + dependencies = { 'nvim-lua/plenary.nvim' }, + config = function() + local nls = require('null-ls') + nls.setup({ + -- debug = true, + sources = { + nls.builtins.diagnostics.shellcheck, + nls.builtins.formatting.shfmt, + nls.builtins.formatting.yapf, -- python + nls.builtins.formatting.clang_format, + nls.builtins.formatting.rustfmt, + nls.builtins.formatting.stylua, + -- nls.builtins.formatting.gofumpt, + -- nls.builtins.formatting.json_tool, }, - } + on_attach = require('internal.lsp').my_attach, + }) + + local h = require('null-ls.helpers') - local pickers = require('telescope.pickers') - local finders = require('telescope.finders') + nls.register({ + h.make_builtin({ + name = 'html-beautify', + filetypes = { 'html', 'gotmpl.html' }, + method = nls.methods.FORMATTING, + generator_opts = { + command = vim.env.HOME .. '/.yarn/bin/html-beautify', + args = { '--file', '-', '--editorconfig' }, + to_stdin = true, + }, + factory = h.formatter_factory, + }), + h.make_builtin({ + name = 'html-beautify', + filetypes = { 'html', 'gotmpl.html' }, + method = nls.methods.FORMATTING, + generator_opts = { + command = vim.env.HOME .. '/.yarn/bin/html-beautify', + args = { '--file', '-', '--editorconfig' }, + to_stdin = true, + }, + factory = h.formatter_factory, + }), + h.make_builtin({ + name = 'css-beautify', + filetypes = { 'css', 'scss' }, + method = nls.methods.FORMATTING, + generator_opts = { + command = vim.env.HOME .. '/.yarn/bin/css-beautify', + args = { '--file', '-', '--editorconfig' }, + to_stdin = true, + }, + factory = h.formatter_factory, + }), + }) + end, + }, - vim.keymap.set('s', ';O', function() - pickers.new(opts, { - prompt_title = 'Orgmode', - finder = finders.new_table(require('orgmode.config'):get_all_files()), - }):find() - end) + { + 'mfussenegger/nvim-dap', + dependencies = { 'nvim-telescope/telescope-dap.nvim' }, + config = function() + require('telescope').load_extension('dap') + require('internal.dap') + end, + keys = { '<leader>d' }, + }, - -- wk_register { - -- ['<leader>o'] = {name = '+Orgmode', - -- a = {'agenda prompt'}, - -- c = {'capture prompt'}, - -- r = {'refile'}, - -- [','] = {'set priority'}, - -- ['*'] = {'toggle headline'}, - -- ['o'] = {'follow link/date'}, - -- ['\''] = {'create source block'}, - -- ['$'] = {'archive current headline'}, - -- ['<cr>'] = {'insert heading/item/row'}, - -- t = {'set tags'}, - -- A = {'toggle ARCHIVE tag'}, - -- K = {'subtree up'}, - -- J = {'subtree down'}, - -- e = {'export'}, - -- ['i'] = { - -- name = '+Timestamp', - -- d = {'set deadline'}, - -- s = {'set scheduled'}, - -- h = {'insert heading (respect content)'}, - -- T = {'insert todo'}, - -- t = {'insert todo (respect content)'}, - -- ['.'] = {'set date'}, - -- ['!'] = {'set inactive'}, - -- }, - -- ['x'] = { - -- name = '+Clock', - -- i = {'clock in'}, - -- o = {'clock out'}, - -- q = {'cancel active clock'}, - -- j = {'jump to active clock'}, - -- e = {'set effort estimate property'}, - -- } - -- }, - -- } - end} -- }}} + { 'farmergreg/vim-lastplace', event = 'VeryLazy' }, -- restore last cursor position (and handle many edge cases) + { 'tpope/vim-surround', event = 'VeryLazy' }, + { 'tpope/vim-repeat', event = 'VeryLazy' }, -- extend '.' to plugins + { 'michaeljsmith/vim-indent-object', event = 'VeryLazy' }, -- indentation text-objects + -- {'kshenoy/vim-signature'}, -- toggle, display and navigate marks + -- {'rhysd/conflict-marker.vim'}, + -- {'kassio/neoterm'}, + + { + 'kristijanhusak/orgmode.nvim', + ft = 'org', + build = function() + require('orgmode').setup_ts_grammar() + vim.cmd.TSUpdate() + end, + opts = { + org_agenda_files = { vim.env.HOME .. '/documents/org/*.org' }, + org_default_notes_file = vim.env.HOME .. '/documents/org/todo.org', + org_todo_keywords = { 'TODO', 'DONE' }, + -- org_indent_mode = 'noindent', + org_agenda_templates = { + t = { + description = 'Todo', + template = '* TODO %?', + }, + n = { + description = 'Note', + template = '* %?', + target = vim.env.HOME .. '/documents/org/notes.org', + }, + }, + mappings = { + agenda = { + org_agenda_close = nil, + }, + }, + }, + -- keys = { + -- { mode = 's', ';O', function() + -- local pickers = require('telescope.pickers') + -- local finders = require('telescope.finders') + -- pickers.new(opts, { + -- prompt_title = 'Orgmode', + -- finder = finders.new_table(require('orgmode.config'):get_all_files()), + -- }):find() + -- end }, + -- }, + }, - use {'nvim-neorg/neorg', ft = {'norg'}, module = {'neorg'}, cmd = {'Neorg'}, -- {{{ - run = ':Neorg sync-parsers', - requires = { + { + 'nvim-neorg/neorg', + enabled = false, + ft = 'norg', + cmd = { 'Neorg' }, + build = ':Neorg sync-parsers', + dependencies = { 'nvim-lua/plenary.nvim', 'nvim-neorg/neorg-telescope', 'nvim-treesitter/nvim-treesitter', }, - setup = vim.cmd [[autocmd BufRead,BufNewFile *.norg setlocal filetype=norg]], - after = {'nvim-treesitter'}, - config = function() - require('neorg').setup { - load = { - ['core.defaults'] = {}, - ['core.keybinds'] = { - config = { - default_keybinds = true, - -- NOTE: neorg uses localleader by default, see init.lua:6 - -- neorg_leader = '<leader>n', - } - }, - ['core.norg.concealer'] = { - config = { - icons = { - todo = { enabled = true } - }, - } - }, - ['core.norg.dirman'] = { - config = { - workspaces = { - default = '$HOME/Documents/neorg/default', - work = '$HOME/Documents/neorg/work', - gtd = '$HOME/Documents/neorg/gtd', - } - } - }, - ['core.norg.completion'] = { - config = { engine = 'nvim-cmp' } - }, - ['core.integrations.telescope'] = {}, - ['core.norg.qol.todo_items'] = {}, - ['core.presenter'] = {}, - ['core.gtd.base'] = { - config = { - workspace = 'gtd' - } + init = function() + -- vim.cmd [[autocmd BufRead,BufNewFile *.norg setlocal filetype=norg]], + end, + opts = { + load = { + ['core.defaults'] = {}, + ['core.keybinds'] = { + config = { default_keybinds = true }, + }, + ['core.norg.concealer'] = { + config = { icons = { todo = { enabled = true } } }, + }, + ['core.norg.dirman'] = { + config = { + workspaces = { + default = '$HOME/documents/neorg/default', + work = '$HOME/documents/neorg/work', + gtd = '$HOME/documents/neorg/gtd', + }, }, }, - } - end} -- }}} + ['core.norg.completion'] = { + config = { engine = 'nvim-cmp' }, + }, + ['core.integrations.telescope'] = {}, + ['core.norg.qol.todo_items'] = {}, + ['core.presenter'] = {}, + ['core.gtd.base'] = { + config = { workspace = 'gtd' }, + }, + }, + }, + }, - use {'mickael-menu/zk-nvim', module = {'zk', 'telescope._extensions.zk'}, -- {{{ + { + 'mickael-menu/zk-nvim', + cmd = { 'ZkNew', 'ZkNotes' }, + ft = { 'markdown', 'neorg' }, config = function() - local lsp = require('internal.lsp') - require('telescope').load_extension('zk') - require('zk').setup { + require('zk').setup({ picker = 'telescope', lsp = { config = { - cmd = {'/home/robert/devel/upstream/github.com/mickael-menu/zk/zk', 'lsp', '--log', '/tmp/zk-lsp.log'}, - on_attach = lsp.my_attach, - on_exit = lsp.my_exit, - capabilities = lsp.capabilities(), + cmd = { 'zk', 'lsp', '--log', '/tmp/zk-lsp.log' }, + on_attach = require('internal.lsp').my_attach, + on_exit = require('internal.lsp').my_exit, + capabilities = require('internal.lsp').capabilities(), }, auto_attach = { enabled = true, - filetypes = { 'markdown', 'norg' }, + filetypes = { 'markdown', 'neorg' }, }, }, - } - vim.keymap.set('n', ';z', function() require('zk').edit(nil, { multi_select = false }) end, {desc='zk'}) - end} -- }}} - - -- languages - -- NOTE: these should only be loaded when they are required... - -- use {'rhysd/vim-grammarous', - -- ft = {'markdown', 'latex', 'tex'} - -- } + }) + end, + keys = { + { + ';z', + function() + require('zk').edit(nil, { multi_select = false }) + end, + desc = 'zk', + }, + }, + }, - use {'lervag/vimtex', ft = {'latex','tex'}, -- {{{ - config = function() - vim.g.tex_flavor = 'latex' - vim.g.vimtex_compiler_enabled = 0 - vim.g.vimtex_compiler_method = 'tectonic' - vim.g.vimtex_compiler_tectonic = "{'executable': 'tectonic'}" - vim.g.vimtex_view_method = 'zathura' - -- vim.g.vimtex_view_zathura_check_libsynctex = false - -- vim.g.vimtex_view_use_temp_files = true - -- vim.g.vimtex_view_forward_search_on_start = false - end} -- }}} + -- {'rhysd/vim-grammarous', + -- ft = {'markdown', 'latex', 'tex'} + -- }, - use {'plasticboy/vim-markdown', ft = {'markdown'}, -- {{{ + { + 'lervag/vimtex', + ft = { 'latex', 'tex' }, config = function() - vim.g.vim_markdown_folding_disabled = true - vim.g.vim_markdown_math = true - vim.g.vim_markdown_frontmatter = true - vim.g.vim_markdown_json_frontmatter = true - vim.g.vim_markdown_toml_frontmatter = true - vim.g.vim_markdown_yaml_frontmatter = true - -- vim.g.vim_markdown_folding_level = 2 - vim.g.vim_markdown_strikethrough = true - vim.g.vim_markdown_auto_insert_bullets = true - vim.g.vim_markdown_new_list_item_indent = false - vim.g.vim_markdown_conceal = true - vim.g.vim_markdown_conceal_code_blocks = true - end} -- }}} - - use {'gentoo/gentoo-syntax'} + local g = vim.g + g.tex_flavor = 'latex' + g.vimtex_compiler_enabled = 0 + g.vimtex_compiler_method = 'tectonic' + g.vimtex_compiler_tectonic = "{'executable': 'tectonic'}" + g.vimtex_view_method = 'zathura' + -- g.vimtex_view_zathura_check_libsynctex = false + -- g.vimtex_view_use_temp_files = true + -- g.vimtex_view_forward_search_on_start = false + end, + }, - use {'NMAC427/guess-indent.nvim', disable = false, -- {{{ + { + 'plasticboy/vim-markdown', + ft = 'markdown', config = function() - require('guess-indent').setup { - auto_cmd = true, - filetype_exclude = {'netrw', 'tutor', 'dirbuf'}, - buftype_exclude = {'help', 'nofile', 'terminal', 'prompt'}, - } - end} -- }}} + local g = vim.g + g.vim_markdown_folding_disabled = true + g.vim_markdown_math = true + g.vim_markdown_frontmatter = true + g.vim_markdown_json_frontmatter = true + g.vim_markdown_toml_frontmatter = true + g.vim_markdown_yaml_frontmatter = true + -- g.vim_markdown_folding_level = 2 + g.vim_markdown_strikethrough = true + g.vim_markdown_auto_insert_bullets = true + g.vim_markdown_new_list_item_indent = false + g.vim_markdown_conceal = true + g.vim_markdown_conceal_code_blocks = true + end, + }, - use {'folke/zen-mode.nvim', cmd = {'ZenMode'}, -- {{{ - module = {'zen-mode'}, - config = function() - require('zen-mode').setup { - window = { - backdrop = 1, - width = 0.3, - -- height = 1, - options = { - number = false, - list = false, + { + 'folke/zen-mode.nvim', + dependencies = { + { + 'folke/twilight.nvim', + opts = { + context = 15, + dimming = { + alpha = 0.3, + color = { 'Normal', '#ffffff' }, }, }, - plugins = { - options = { - enabled = true, - ruler = false, - showcmd = false, - }, - twilight = { enabled = true }, - } - } - end} -- }}} - - use {'folke/twilight.nvim', module = {'twilight'}, -- {{{ - config = function() - require('twilight').setup { - context = 15, - dimming = { - alpha = 0.3, - color = { 'Normal', '#ffffff' }, + }, + }, + cmd = { 'ZenMode' }, + opts = { + window = { + backdrop = 1, + width = 0.3, + -- height = 1, + options = { + number = false, + list = false, }, - } - end} -- }}} + }, + plugins = { + options = { + enabled = true, + ruler = false, + showcmd = false, + }, + twilight = { enabled = true }, + }, + }, + }, - use {'goolord/alpha-nvim', cmd = {'Alpha'}, module = {'alpha'}, -- {{{ - setup = function() - vim.keymap.set('n', '<leader>a', function() vim.cmd [[Alpha]] end, {desc='alpha'}) - end, + { + 'folke/which-key.nvim', + event = 'VeryLazy', + opts = { + icons = { separator = '→ ', group = '🞱 ' }, + triggers = { '<leader>', '<localleader>', ';', 'g', '[', ']' }, + }, + }, + + { + 'goolord/alpha-nvim', + cmd = 'Alpha', config = function() local MAX_WIDTH = 80 local alpha = require('alpha') local them = require('alpha.themes.theta') - local button = function(...) -- {{{ + local button = function(...) local b = require('alpha.themes.dashboard').button(...) b.opts = vim.tbl_extend('force', b.opts, { hl = 'Normal', width = MAX_WIDTH, }) return b - end -- }}} - local fit_path = function(path, max_width) -- {{{ + end + local fit_path = function(path, max_width) local Path = require('plenary.path') path = vim.fn.fnamemodify(path, ':.') if vim.fn.strdisplaywidth(path) > max_width then - path = Path.new(path):shorten(1, {-2, -1}) + path = Path.new(path):shorten(1, { -2, -1 }) end if vim.fn.strdisplaywidth(path) > max_width then path = '_ ' .. path:sub((vim.fn.strdisplaywidth(path) - max_width), -1) end return path - end -- }}} - local hr = function(margin, max_width, label, opts) -- {{{ - max_width = max_width - (2*margin) + end + local hr = function(margin, max_width, label, opts) + max_width = max_width - (2 * margin) label = label and (' ' .. label .. ' ') or '' opts = vim.tbl_extend('force', opts or {}, { position = 'center', hl = 'Comment' }) return { @@ -1071,46 +1085,52 @@ require('packer').startup({function() local label_len = vim.fn.strdisplaywidth(label) -- exit here if we're not showing a label if label_len == 0 then - return string.rep(' ', margin) .. string.rep('─', max_width) .. string.rep(' ', margin) + return string.rep(' ', margin) + .. string.rep('─', max_width) + .. string.rep(' ', margin) end if label_len > max_width then return error('overfull box: ' .. label) end max_width = max_width - label_len - return string.rep(' ', margin) .. string.rep('─', max_width/2) .. label .. string.rep('─', max_width/2) .. string.rep(' ', margin) + return string.rep(' ', margin) + .. string.rep('─', max_width / 2) + .. label + .. string.rep('─', max_width / 2) + .. string.rep(' ', margin) end, } - end -- }}} - local fortune = function(margin, max_width) -- {{{ - max_width = max_width - (margin*2) - local Job = require('plenary.job') - local ok, j = pcall(Job.new, Job, { - command = 'sh', - args = {'-c', 'fortune ' .. vim.env.HOME..'/devel/projects/zig/fortune/fortunes' .. ' | fmt -w ' .. max_width}, - enable_recording = true, - }) - if not ok then return {} end - local lines, exit_code = j:sync() - if not exit_code == 0 then return {} end - local val = {} - for i = 1, #lines do - if vim.fn.strdisplaywidth(lines[i]) > max_width then - return error('overful box: ' .. lines[i]) - end - table.insert(val, - (string.rep(' ', margin) .. lines[i] .. string.rep(' ', margin))) - end - if vim.trim(val[#val]) == '' then table.remove(val, #val) end + end + local fortune = function(margin, max_width) + max_width = max_width - (margin * 2) + -- local Job = require('plenary.job') + -- local ok, j = pcall(Job.new, Job, { + -- command = 'sh', + -- args = {'-c', 'fortune ' .. vim.env.HOME..'/devel/projects/zig/fortune/fortunes' .. ' | fmt -w ' .. max_width}, + -- enable_recording = true, + -- }) + -- if not ok then return {} end + -- local lines, exit_code = j:sync() + -- if not exit_code == 0 then return {} end + -- local val = {} + -- for i = 1, #lines do + -- if vim.fn.strdisplaywidth(lines[i]) > max_width then + -- return error('overful box: ' .. lines[i]) + -- end + -- table.insert(val, + -- (string.rep(' ', margin) .. lines[i] .. string.rep(' ', margin))) + -- end + -- if vim.trim(val[#val]) == '' then table.remove(val, #val) end return { type = 'text', - val = val, + val = 'noop', opts = { position = 'center', hl = 'AlphaFortune', }, } - end -- }}} - local mru = function(max_width) -- {{{ + end + local mru = function(max_width) return { type = 'group', val = function() @@ -1120,21 +1140,29 @@ require('packer').startup({function() local oldfiles = {} local cwd = vim.loop.cwd() for _, v in pairs(vim.v.oldfiles) do - if #oldfiles == 10 then break end + if #oldfiles == 10 then + break + end if vim.startswith(v, cwd) and (vim.fn.filereadable(v) == 1) then table.insert(oldfiles, v) end end -- exit early if there's nothing to show - if not oldfiles or #oldfiles == 0 then return {} end + if not oldfiles or #oldfiles == 0 then + return {} + end table.insert(items, hr(0, max_width, 'MRU: ' .. fit_path(cwd, max_width))) table.insert(items, { type = 'padding', val = 1 }) for i, fn in pairs(oldfiles) do - table.insert(items, button( - tostring(i-1), -- keybind is <n> - fit_path(fn, max_width), - ":edit " .. fn .. " <cr>")) + table.insert( + items, + button( + tostring(i - 1), -- keybind is <n> + fit_path(fn, max_width), + ':edit ' .. fn .. ' <cr>' + ) + ) end return items end, @@ -1142,8 +1170,8 @@ require('packer').startup({function() position = 'center', }, } - end -- }}} - local buffers = function(max_width) -- {{{ + end + local buffers = function(max_width) return { type = 'group', val = function() @@ -1163,15 +1191,18 @@ require('packer').startup({function() end) -- exit early if there's nothing to show - if not bufnrs or #bufnrs == 0 then return {} end + if not bufnrs or #bufnrs == 0 then + return {} + end - table.insert(items, {type = 'padding', val = 1}) + table.insert(items, { type = 'padding', val = 1 }) table.insert(items, hr(0, max_width, 'Buffers')) - table.insert(items, {type = 'padding', val = 1}) + table.insert(items, { type = 'padding', val = 1 }) for _, bufnr in ipairs(bufnrs) do - local bufpath = require('plenary.path').new(vim.fn.getbufinfo(bufnr)[1].name):shorten(1, {-2, -1}) - table.insert(items, button('b'..bufnr, bufpath, ':b'..bufnr..'<cr>')) + local bufpath = + require('plenary.path').new(vim.fn.getbufinfo(bufnr)[1].name):shorten(1, { -2, -1 }) + table.insert(items, button('b' .. bufnr, bufpath, ':b' .. bufnr .. '<cr>')) end return items end, @@ -1179,134 +1210,184 @@ require('packer').startup({function() position = 'center', }, } - end -- }}} - them.config.layout = { -- {{{ - {type = 'padding', val = 2}, + end + them.config.layout = { + { type = 'padding', val = 2 }, require('alpha.themes.dashboard').section.header, - {type = 'padding', val = 1}, + { type = 'padding', val = 1 }, fortune(5, MAX_WIDTH), - {type = 'padding', val = 1}, + { type = 'padding', val = 1 }, hr(0, MAX_WIDTH), - {type = 'padding', val = 1}, - {type = 'group', val = { -- buttons {{{ - button('e', ' new', [[<cmd>ene <bar> startinsert<cr>]]), - button('r', ' live grep', [[<cmd>lua require('internal.misc').live_grep()<cr>]]), - button('f', ' find files', [[<cmd>lua require('internal.misc').find_files()<cr>]]), - button('m', ' mru', [[<cmd>lua require('telescope.builtin').oldfiles()<cr>]]), - -- button('o', ' orgmode', [[<cmd>lua require('packer').loader('orgmode.nvim'); require('orgmode').action('agenda.prompt')<cr>]]), - button('T', ' todos', [[<cmd>lua require('telescope._extensions.todo-comments').exports.todo {cwd=vim.env.ZK_NOTEBOOK_DIR}<cr>]]), - button('u', ' update plugins', [[<cmd>lua require('packer').sync()<cr>]]), - button('v', ' edit config', [[<cmd>lua require('telescope.builtin').find_files {search_dirs={vim.env.HOME..'/.vim/'}}<cr>]]), - button('M', ' mail', [[<cmd>K2<cr>]]), - }}, -- }}} - {type = 'padding', val = 1}, + { type = 'padding', val = 1 }, + { + type = 'group', + val = { + button('e', ' new', [[<cmd>ene <bar> startinsert<cr>]]), + button('r', ' live grep', [[<cmd>lua require('internal.misc').live_grep()<cr>]]), + button('f', ' find files', [[<cmd>lua require('internal.misc').find_files()<cr>]]), + button('m', ' mru', [[<cmd>lua require('telescope.builtin').oldfiles()<cr>]]), + button( + 'o', + ' orgmode', + [[<cmd>lua require('orgmode').action('agenda.prompt')<cr>]] + ), + button( + 't', + ' todos', + [[<cmd>lua require('telescope._extensions.todo-comments').exports.todo {cwd=vim.env.ZK_NOTEBOOK_DIR}<cr>]] + ), + button('u', ' update plugins', [[<cmd>lua require('lazy').update()<cr>]]), + button( + 'v', + ' edit config', + [[<cmd>lua require('telescope.builtin').find_files {search_dirs={vim.env.HOME..'/.vim/'}}<cr>]] + ), + }, + }, + { type = 'padding', val = 1 }, mru(MAX_WIDTH), buffers(MAX_WIDTH), - } -- }}} + } alpha.setup(them.config) - - do - local group = vim.api.nvim_create_augroup('AlphaIndent', { clear = true }) - vim.api.nvim_create_autocmd('FileType', { - pattern = 'alpha', - command = [[IndentBlanklineDisable]], - group = group, - }) - end - end} -- }}} - - use {'ruifm/gitlinker.nvim', module = {'gitlinker'}, -- {{{ - requires = {'nvim-lua/plenary.nvim'}, - setup = function() - vim.keymap.set({'n', 'v'}, '<leader>gy', function() require('gitlinker').get_buf_range_url() end, {desc='gitlinker'}) end, - config = function() - require('gitlinker').setup { - opts = { - action_callback = require('gitlinker.actions').copy_to_clipboard, - }, - } - end} -- }}} + keys = { + { '<leader>a', vim.cmd.Alpha, desc = 'alpha' }, + }, + }, - use {'rhysd/git-messenger.vim', cmd = {'GitMessenger'}, -- {{{ - setup = function() - vim.keymap.set('n', '<leader>gm', function() vim.cmd.GitMessenger() end, {desc='git-messenger'}) - end, + { + 'ruifm/gitlinker.nvim', + dependencies = { 'nvim-lua/plenary.nvim' }, + config = { + opts = { + -- action_callback = require('gitlinker.actions').copy_to_clipboard, + }, + }, + keys = { + { + '<leader>gy', + function() + require('gitlinker').get_buf_range_url() + end, + desc = 'gitlinker', + }, + { + mode = 'v', + '<leader>gy', + function() + require('gitlinker').get_buf_range_url() + end, + desc = 'gitlinker', + }, + }, + }, + + { + 'rhysd/git-messenger.vim', + cmd = 'GitMessenger', config = function() -- vim.g.git_messenger_include_diff = false vim.g.git_messenger_always_into_popup = true vim.g.git_messenger_close_on_cursor_moved = true vim.g.git_messenger_no_default_mappings = true - end} -- }}} - - -- restore last cursor position (and handle many edge cases) - use {'farmergreg/vim-lastplace'} - - use {'folke/todo-comments.nvim', module = {'telescope._extensions.todo-comments'}, cmd = {'TodoTelescope'}, -- {{{ - setup = function() - vim.keymap.set('n', ';t', function() vim.cmd [[TodoTelescope]] end, {desc='todo-comments'}) end, - config = function() - require('todo-comments').setup {} - end} -- }}} - - -- spelling related stuff - use {'lewis6991/spellsitter.nvim', disable = true, -- {{{ - config = function() - require('spellsitter').setup { - enable = true, - -- spellchecker = 'ffi' - } - end} -- }}} - - -- TODO: experimental section + keys = { + { '<leader>gm', vim.cmd.GitMessenger, desc = 'git-messenger' }, + }, + }, - use {'tjdevries/sg.nvim', disable = true, -- {{{ - requires = {'nvim-lua/plenary.nvim'}, - config = function() - end} -- }}} + { + 'folke/todo-comments.nvim', + cmd = { 'TodoTelescope' }, + config = true, + keys = { + { ';t', vim.cmd.TodoTelescope, desc = 'todo-comments' }, + }, + }, - use {'yorik1984/newpaper.nvim', disable = true, -- {{{ - config = function() - if vim.g.night_and_day == 'day' then - require('newpaper').setup() - end - end} -- }}} + { + 'cbochs/grapple.nvim', + dependencies = { 'nvim-lua/plenary.nvim' }, + cmd = 'GrapplePopup', + opts = { + popup_options = { + border = 'none', + }, + }, + keys = { + { + '<leader>m', + function() + require('grapple').popup_tags() + end, + desc = 'grapple: show tags', + }, + { + '<leader>ms', + function() + require('grapple').popup_scopes() + end, + desc = 'grapple: show scopes', + }, + { + '<leader>mm', + function() + require('grapple').toggle() + end, + desc = 'grapple: anonymous tag', + }, + { + '<leader>mn', + function() + require('grapple').cycle_forward() + end, + desc = 'grapple: next tag', + }, + { + '<leader>mp', + function() + require('grapple').cycle_backward() + end, + desc = 'grapple: prev tag', + }, + }, + }, - use {'nyoom-engineering/oxocarbon.nvim', disable = false, -- {{{ - config = function() - if vim.g.night_and_day == 'day' then - vim.opt.background = 'light' - vim.cmd.colorscheme 'oxocarbon' - end - end} -- }}} + { + url = 'https://git.sr.ht/~robertgzr/karafuru', + lazy = false, + -- build = 'make colorscheme', + priority = 1000, + cond = vim.g.night_and_day == 'night', + config = function(plugin) + vim.opt.rtp:append(plugin.dir .. '/vim') + vim.cmd.colorscheme('karafuru') + end, + }, - use {'https://git.sr.ht/~robertgzr/karafuru', rtp = 'vim', -- {{{ - run = 'make colorscheme', + { + 'yorik1984/newpaper.nvim', + lazy = false, + priority = 1000, + cond = vim.g.night_and_day == 'day', config = function() - if not vim.g.night_and_day or vim.g.night_and_day == 'night' then - vim.cmd.colorscheme "karafuru" - end - end} -- }}} + vim.cmd.colorscheme('newpaper') + end, + }, - use {'https://git.sr.ht/~robertgzr/spinner.nvim', module = {'spinner'}, -- {{{ + { + 'nyoom-engineering/oxocarbon.nvim', + lazy = false, + enabled = false, + priority = 1000, + cond = vim.g.night_and_day == 'night', config = function() - require('spinner').setup { - spinner = {'⠋', '⠙', '⠹', '⠸', '⠼', '⠴', '⠦', '⠧', '⠇', '⠏'}, - interval = 120, -- spinner frame rate in ms - } - end} -- }}} - -end, -config = { - compile_path = compilepath, - git = { - subcommands = { - update = 'pull --ff-only --progress --rebase=true', - } + vim.opt.background = 'dark' + vim.cmd.colorscheme('oxocarbon') + end, }, - profile = { - enable = false, - threshold = 1, - } -}}) +} + +require('lazy').setup(pluginspec, { + defaults = { lazy = true }, +}) diff --git a/.vim/lua/telescope/_extensions/jobs.lua b/.vim/lua/telescope/_extensions/jobs.lua index ea97ed0..be55a47 100644 --- a/.vim/lua/telescope/_extensions/jobs.lua +++ b/.vim/lua/telescope/_extensions/jobs.lua @@ -1,4 +1,4 @@ -local job = require('job') +local job = require('internal.job') local pickers = require('telescope.pickers') local finders = require('telescope.finders') @@ -10,7 +10,7 @@ local entry_display = require('telescope.pickers.entry_display') local function job_entry_maker(_) return function(j) local displayer = entry_display.create({ - separator = " ", + separator = ' ', items = { { width = 8 }, { remaining = true }, @@ -18,7 +18,7 @@ local function job_entry_maker(_) }) local make_display = function(e) return displayer({ - { e.value.pid, "TelescopeResultsNumber" }, + { e.value.pid, 'TelescopeResultsNumber' }, (e.value.command .. ' ' .. table.concat(e.value.args, ' ')), }) end @@ -35,42 +35,50 @@ local function list_jobs(opts) for _, j in pairs(job.current_jobs) do table.insert(jobs, j) end - if #jobs == 0 then return end + if #jobs == 0 then + vim.notify('no jobs') + return + end - opts = vim.tbl_extend("force", { prompt_title = 'Jobs' }, opts or {}) - pickers.new(opts, { - finder = finders.new_table { - results = jobs, - entry_maker = job_entry_maker(opts), - }, - sorter = conf.generic_sorter(opts), - attach_mappings = function(prompt_bufnr, _) - actions.select_default:replace(function() - local entry = action_state.get_selected_entry() - if not entry then return end - actions.close(prompt_bufnr) - vim.ui.select( - {'Terminate', 'Kill', 'Show', 'Cancel'}, - {prompt = 'Select an action:'}, - function(choice) - if choice == 'Cancel' then - return - elseif choice == 'Show' then - vim.fn.getqflist({ id = entry.value.pid }) - elseif choice == 'Kill' then - entry.value.handle:kill('sigkill') - elseif choice == 'Terminate' then - entry.value.handle:kill('sigterm') + opts = vim.tbl_extend('force', { prompt_title = 'Jobs' }, opts or {}) + pickers + .new(opts, { + finder = finders.new_table({ + results = jobs, + entry_maker = job_entry_maker(opts), + }), + sorter = conf.generic_sorter(opts), + attach_mappings = function(prompt_bufnr, _) + actions.select_default:replace(function() + local entry = action_state.get_selected_entry() + if not entry then + return + end + actions.close(prompt_bufnr) + vim.ui.select( + { 'Terminate', 'Kill', 'Show', 'Cancel' }, + { prompt = 'Select an action:' }, + function(choice) + if choice == 'Cancel' then + return + elseif choice == 'Show' then + vim.fn.getqflist({ id = entry.value.pid }) + elseif choice == 'Kill' then + entry.value.handle:kill('sigkill') + elseif choice == 'Terminate' then + entry.value.handle:kill('sigterm') + end end - end) - end) - return true - end, - }):find() + ) + end) + return true + end, + }) + :find() end return require('telescope').register_extension({ exports = { jobs = list_jobs, - } + }, }) diff --git a/.vim/snippets/all.lua b/.vim/snippets/all.lua index ba26a8f..b4fa8c3 100644 --- a/.vim/snippets/all.lua +++ b/.vim/snippets/all.lua @@ -1,46 +1,63 @@ +---@diagnostic disable: undefined-global local todo_comment = function(key) local nodes = {} if type(key) == 'string' then table.insert(nodes, t(key)) elseif type(key) == 'table' then - table.insert(nodes, c(1, vim.tbl_map(function(e) return t(e) end, key))) + table.insert( + nodes, + c( + 1, + vim.tbl_map(function(e) + return t(e) + end, key) + ) + ) end local wrapped = autowrap(t('('), t(')'), { c(#nodes, { t(''), -- bare sn(1, user_email), - f(function() return os.date('%Y-%m-%d') end, {}), -- time + f(function() + return os.date('%Y-%m-%d') + end, {}), -- time }), }) - for _, n in ipairs(wrapped) do table.insert(nodes, n) end + for _, n in ipairs(wrapped) do + table.insert(nodes, n) + end table.insert(nodes, t(': ')) return comment(nodes) end -local from_file = function(path, vargs) - return d(1, function(_, _, _, ...) - local lines = {} - for line in io.lines(path) do table.insert(lines, line) end - return sn(nil, fmt(table.concat(lines, "\n"), ...)) - end, {}, { user_args = {vargs}}) -end - return { s('me', user_email), s('date', exec([[date --rfc-email]])), - s('today', f(function() return os.date('%Y-%m-%d') end, {})), - s('now' , f(function() return os.date('%Y-%m-%dT%H:%M:%SZ') end, {})), + s( + 'today', + f(function() + return os.date('%Y-%m-%d') + end, {}) + ), + s( + 'now', + f(function() + return os.date('%Y-%m-%dT%H:%M:%SZ') + end, {}) + ), -- todo comments s('todo', todo_comment('TODO')), s('note', todo_comment('NOTE')), s('hack', todo_comment('HACK')), - s('warn', todo_comment({'WARN', 'XXX'})), - s('fix' , todo_comment({'FIX', 'FIXME', 'ISSUE', 'BUG'})), + s('warn', todo_comment({ 'WARN', 'XXX' })), + s('fix', todo_comment({ 'FIX', 'FIXME', 'ISSUE', 'BUG' })), - s({trig='#!', name='Shell script skeleton'}, - fmt([=[ + s( + { trig = '#!', name = 'Shell script skeleton' }, + fmt( + [=[ #!/bin/sh set -e @@ -50,33 +67,32 @@ return { exit 0 }} - ]=], {i(1, 'what does this script do')}), + ]=], + { i(1, 'what does this script do') } + ), { callbacks = { [-1] = { - [events.enter] = function(_, _) vim.opt_local.filetype = 'sh' end - } - } + [events.enter] = function(_, _) + vim.opt_local.filetype = 'sh' + end, + }, + }, } ), - -- licenses (full-text) - s({trig='license-mit', name='MIT license'}, from_file( - vim.fn.stdpath('config') .. '/snippets/.licenses/mit', - { - year = f(function() return os.date('%Y') end, {}), - copyright = sn(1, user_email), - }) - ), - s({trig='license-gpl-3.0', name='GPL-3.0 license'}, from_file( - vim.fn.stdpath('config') .. '/snippets/.licenses/gpl-3.0', {})), - s({trig='license-agpl-3.0', name='AGPL-3.0 license'}, from_file( - vim.fn.stdpath('config') .. '/snippets/.licenses/agpl-3.0', {})), - s({trig='license-cc0-1.0', name='CC-Zero-1.0 license'}, from_file( - vim.fn.stdpath('config') .. '/snippets/.licenses/cc0-1.0', {})), -- licenses (SPDX header) - s({trig='spdx-mit', name='MIT license'}, comment({t([[SPDX-License-Identifier: MIT]])})), - s({trig='spdx-gpl-3.0', name='MIT license'}, comment({t([[SPDX-License-Identifier: GPL-3.0]])})), - s({trig='spdx-agpl-3.0', name='MIT license'}, comment({t([[SPDX-License-Identifier: AGPL-3.0]])})), - s({trig='spdx-cc0-1.0', name='MIT license'}, comment({t([[SPDX-License-Identifier: CC0-1.0]])})), + s({ trig = 'spdx-mit', name = 'MIT license' }, comment({ t([[SPDX-License-Identifier: MIT]]) })), + s( + { trig = 'spdx-gpl-3.0', name = 'MIT license' }, + comment({ t([[SPDX-License-Identifier: GPL-3.0]]) }) + ), + s( + { trig = 'spdx-agpl-3.0', name = 'MIT license' }, + comment({ t([[SPDX-License-Identifier: AGPL-3.0]]) }) + ), + s( + { trig = 'spdx-cc0-1.0', name = 'MIT license' }, + comment({ t([[SPDX-License-Identifier: CC0-1.0]]) }) + ), } diff --git a/.vim/snippets/gitcommit.lua b/.vim/snippets/gitcommit.lua index c6153a3..8e8e18f 100644 --- a/.vim/snippets/gitcommit.lua +++ b/.vim/snippets/gitcommit.lua @@ -1,5 +1,6 @@ +---@diagnostic disable: undefined-global return { - s('sign' , fmt([[Signed-off-by: {}]], {sn(1, user_email)})), - s('change', fmt([[Change-type: {}]], {c(1, {t('patch'), t('minor'), t('major')})})), - s('coauth', fmt([[Co-authored-by: {}]], {i(1)})), + s('sign', fmt([[Signed-off-by: {}]], { sn(1, user_email) })), + s('change', fmt([[Change-type: {}]], { c(1, { t('patch'), t('minor'), t('major') }) })), + s('coauth', fmt([[Co-authored-by: {}]], { i(1) })), } diff --git a/.vim/snippets/go.lua b/.vim/snippets/go.lua index ee63158..7b3bb71 100644 --- a/.vim/snippets/go.lua +++ b/.vim/snippets/go.lua @@ -1,15 +1,21 @@ return { - s({trig='package main', name='Go skeleton'}, - fmt([[ + s( + { trig = 'package main', name = 'Go skeleton' }, + fmt( + [[ package main func main() {{ {} }} - ]], {i(0, 'println("hello world!")')}) + ]], + { i(0, 'println("hello world!")') } + ) ), - s({trig='package test', name='Go test skeleton'}, - fmt([[ + s( + { trig = 'package test', name = 'Go test skeleton' }, + fmt( + [[ package main import ( @@ -19,7 +25,8 @@ return { func Test{}(t *testing.T) {{ {} }} - ]], { + ]], + { i(1, 'Foobar'), i(0, 't.Logf("Hello world")'), } diff --git a/.vim/snippets/lua.lua b/.vim/snippets/lua.lua index 0d2609a..dc75ec8 100644 --- a/.vim/snippets/lua.lua +++ b/.vim/snippets/lua.lua @@ -1,18 +1,23 @@ +---@diagnostic disable: undefined-global return { - s('use', fmt([[ + s( + 'use', + fmt( + [[ use {{'{}'{} -- {{{{{{ config = function() require('{}').setup {{}} end}} -- }}}}}} - ]], { - i(1, 'username/repo'), - c(2, { - t(','), - t(', disabled = true,'), - fmt([[, cmd = {{'{}'}}, module = {{'{}'}},]], - {i(1, 'Cmd'), i(2, 'module')}) - }), - i(3, 'module'), - }) + ]], + { + i(1, 'username/repo'), + c(2, { + t(','), + t(', disabled = true,'), + fmt([[, cmd = {{'{}'}}, module = {{'{}'}},]], { i(1, 'Cmd'), i(2, 'module') }), + }), + i(3, 'module'), + } + ) ), } |