neovim

Personal neovim configuration files
git clone git://gtms.dev:neovim
Log | Files | Refs

commit 9e6a397cbf62135cf01080b1cd6b4fd7285a7319
parent b4dba0c4fd562e13d602b1c00bdc5927a6de0456
Author: Tomas Nemec <nemi@skaut.cz>
Date:   Thu, 21 Apr 2022 15:44:52 +0200

update

Diffstat:
Mafter/plugin/bqf.lua | 2+-
Dafter/plugin/fugitive.lua | 5-----
Mafter/plugin/git.lua | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--
Dafter/plugin/gitsigns.lua | 66------------------------------------------------------------------
Mafter/plugin/nulls.lua | 26++++++++++++++++++--------
Mftplugin/dart.lua | 3++-
Mlua/tms/ft/dart/lsp.lua | 55++++++++++++++++++++++++++++++++++++++++++-------------
Mlua/tms/lsp/init.lua | 16+++++++++-------
Mlua/tms/plugins.lua | 2+-
Atest/dart.dart | 9+++++++++
Atest/dart.lua | 32++++++++++++++++++++++++++++++++
11 files changed, 201 insertions(+), 104 deletions(-)

diff --git a/after/plugin/bqf.lua b/after/plugin/bqf.lua @@ -1,3 +1,3 @@ if not pcall(require, 'bqf') then return end -require('bqf').setup { auto_enable = true, auto_resize_height = false, preview = { auto_preview = true } } +require('bqf').setup { auto_enable = true, auto_resize_height = true, preview = { auto_preview = false } } diff --git a/after/plugin/fugitive.lua b/after/plugin/fugitive.lua @@ -1,5 +0,0 @@ -if not vim.g.loaded_fugitive then return end - -vim.keymap.set('n', '<leader>gg', '<cmd>G<cr>', { noremap = true }) -vim.keymap.set('n', '<leader>gc', '<cmd>G commit<cr>', { noremap = true }) -vim.keymap.set('n', '<leader>gb', '<cmd>Git blame<cr>', { noremap = true }) diff --git a/after/plugin/git.lua b/after/plugin/git.lua @@ -1,4 +1,89 @@ if vim.g.loaded_git_messenger == 1 then - vim.g.git_messenger_floating_win_opts = { border = 'single' } - vim.keymap.set('n', '<leader>gm', '<plug>(git-messenger)', { noremap = true }) + vim.g.git_messenger_floating_win_opts = { border = 'single' } + vim.keymap.set('n', '<leader>gm', '<plug>(git-messenger)', { noremap = true, desc = 'Git Message' }) +end + +if vim.g.loaded_fugitive then + vim.keymap.set('n', '<leader>gg', '<cmd>G<cr>', { noremap = true, desc = 'Git Status' }) + vim.keymap.set('n', '<leader>gc', '<cmd>G commit<cr>', { noremap = true, desc = 'Git Commit' }) + vim.keymap.set('n', '<leader>gb', '<cmd>Git blame<cr>', { noremap = true, desc = 'Git Blame' }) +end + +local has_igit, igit = pcall(require, 'igit') +if has_igit then + igit.setup({ + command = 'IG', + -- branch = { open_cmd = 'botright' }, + -- log = { open_cmd = 'botright' }, + -- status = { open_cmd = 'botright' }, + }) +end + +local has_gsigns, gsigns = pcall(require, 'gitsigns') +if has_gsigns then + local get_theme = function() + local dark_theme = { add = '│', change = '│', delete = '│', topdelete = '‾', changedel = '│' } + local light_theme = { add = ' ', change = ' ', delete = ' ', topdelete = ' ', changedel = ' ' } + local theme = dark_theme + if vim.opt.background:get() == 'light' then theme = light_theme end + return theme + end + + local theme = get_theme() + gsigns.setup { + signs = { + add = { + hl = 'GitSignsAdd', + text = theme.add, + -- text = ' ', + numhl = 'GitSignsAddNr', + linehl = 'GitSignsAddLn', + }, + change = { + hl = 'GitSignsChange', + text = theme.change, + -- text = ' ', + numhl = 'GitSignsChangeNr', + linehl = 'GitSignsChangeLn', + }, + delete = { + hl = 'GitSignsDelete', + text = theme.delete, + -- text = ' ', + numhl = 'GitSignsDeleteNr', + linehl = 'GitSignsDeleteLn', + }, + topdelete = { + hl = 'GitSignsDelete', + text = theme.topdelete, + -- text = ' ', + numhl = 'GitSignsDeleteNr', + linehl = 'GitSignsDeleteLn', + }, + changedelete = { + hl = 'GitSignsChange', + text = theme.changedel, + -- text = ' ', + numhl = 'GitSignsChangeNr', + linehl = 'GitSignsChangeLn', + }, + }, + keymaps = {}, + } + + vim.keymap.set('n', '>c', function() gsigns.next_hunk() end, { desc = 'Git Next Hunk' }) + vim.keymap.set('n', '>[', function() gsigns.next_hunk() end, { desc = 'Git Next Hunk' }) + vim.keymap.set('n', '<c', function() gsigns.prev_hunk() end, { desc = 'Git Previous Hunk' }) + vim.keymap.set('n', '<[', function() gsigns.prev_hunk() end, { desc = 'Git Previous Hunk' }) + vim.keymap.set('n', '<leader>hs', function() gsigns.stage_hunk() end, { desc = 'Git Stage Hunk' }) + vim.keymap.set('n', '<leader>hu', function() gsigns.undo_stage_hunk() end, { desc = 'Git Undo Stage Hunk' }) + vim.keymap.set('n', '<leader>hr', function() gsigns.reset_hunk() end, { desc = 'Git Reset Hunk' }) + vim.keymap.set('n', '<leader>hR', function() gsigns.reset_buffer() end, { desc = 'Git Reset Buffer' }) + vim.keymap.set('n', '<leader>hp', function() gsigns.preview_hunk() end, { desc = 'Git Preview Hunk' }) + vim.keymap.set('n', '<leader>hb', function() gsigns.toggle_current_line_blame() end, + { desc = 'Git Toggle Blame Line' }) + vim.keymap.set('n', '<leader>hl', function() gsigns.toggle_linehl() end, { desc = 'Git Highlight Lines' }) + vim.keymap.set('n', '<leader>hn', function() gsigns.toggle_numhl() end, { desc = 'Git Highlight Num' }) + vim.keymap.set('o', 'ig', ':<C-U>lua require("gitsigns").select_hunk()<cr>') + vim.keymap.set('x', 'ig', ':<C-U>lua require("gitsigns").select_hunk()<cr>') end diff --git a/after/plugin/gitsigns.lua b/after/plugin/gitsigns.lua @@ -1,66 +0,0 @@ -if not pcall(require, 'gitsigns') then return end - -local get_theme = function() - local dark_theme = { add = '│', change = '│', delete = '│', topdelete = '‾', changedel = '│' } - local light_theme = { add = ' ', change = ' ', delete = ' ', topdelete = ' ', changedel = ' ' } - local theme = dark_theme - if vim.opt.background:get() == 'light' then theme = light_theme end - return theme -end - -local theme = get_theme() -require('gitsigns').setup { - signs = { - add = { - hl = 'GitSignsAdd', - text = theme.add, - -- text = ' ', - numhl = 'GitSignsAddNr', - linehl = 'GitSignsAddLn', - }, - change = { - hl = 'GitSignsChange', - text = theme.change, - -- text = ' ', - numhl = 'GitSignsChangeNr', - linehl = 'GitSignsChangeLn', - }, - delete = { - hl = 'GitSignsDelete', - text = theme.delete, - -- text = ' ', - numhl = 'GitSignsDeleteNr', - linehl = 'GitSignsDeleteLn', - }, - topdelete = { - hl = 'GitSignsDelete', - text = theme.topdelete, - -- text = ' ', - numhl = 'GitSignsDeleteNr', - linehl = 'GitSignsDeleteLn', - }, - changedelete = { - hl = 'GitSignsChange', - text = theme.changedel, - -- text = ' ', - numhl = 'GitSignsChangeNr', - linehl = 'GitSignsChangeLn', - }, - }, - keymaps = {}, -} - -vim.keymap.set('n', '>c', function() require('gitsigns').next_hunk() end) -vim.keymap.set('n', '>[', function() require('gitsigns').next_hunk() end) -vim.keymap.set('n', '<c', function() require('gitsigns').prev_hunk() end) -vim.keymap.set('n', '<[', function() require('gitsigns').prev_hunk() end) -vim.keymap.set('n', '<leader>hs', function() require('gitsigns').stage_hunk() end) -vim.keymap.set('n', '<leader>hu', function() require('gitsigns').undo_stage_hunk() end) -vim.keymap.set('n', '<leader>hr', function() require('gitsigns').reset_hunk() end) -vim.keymap.set('n', '<leader>hR', function() require('gitsigns').reset_buffer() end) -vim.keymap.set('n', '<leader>hp', function() require('gitsigns').preview_hunk() end) -vim.keymap.set('n', '<leader>hb', function() require('gitsigns').toggle_current_line_blame() end) -vim.keymap.set('n', '<leader>hl', function() require('gitsigns').toggle_linehl() end) -vim.keymap.set('n', '<leader>hn', function() require('gitsigns').toggle_numhl() end) -vim.keymap.set('o', 'ig', ':<C-U>lua require("gitsigns").select_hunk()<cr>') -vim.keymap.set('x', 'ig', ':<C-U>lua require("gitsigns").select_hunk()<cr>') diff --git a/after/plugin/nulls.lua b/after/plugin/nulls.lua @@ -21,14 +21,11 @@ local zsh_diag = { } null_ls.setup({ - on_attach = function(client, bufnr) - if client.resolved_capabilities.document_formatting == true then - -- vim.api.nvim_buf_set_option(bufnr, 'formatexpr', 'v:lua.vim.lsp.formatexpr()') - vim.keymap.set('n', 'Q', vim.lsp.buf.formatting, - { silent = true, buffer = bufnr, noremap = true, desc = 'LSP Format (nulls)' }) - vim.keymap.set('v', 'Q', vim.lsp.buf.range_formatting, - { silent = true, buffer = bufnr, noremap = true, desc = 'LSP Range Format (nulls)' }) - end + on_attach = function(_, bufnr) + vim.keymap.set('n', 'Q', vim.lsp.buf.formatting, + { silent = true, buffer = bufnr, noremap = true, desc = 'LSP Format (nulls)' }) + vim.keymap.set('v', 'Q', vim.lsp.buf.range_formatting, + { silent = true, buffer = bufnr, noremap = true, desc = 'LSP Range Format (nulls)' }) end, sources = { -- formatting @@ -41,6 +38,19 @@ null_ls.setup({ '$FILENAME', }, '--range-start', '--range-end'), }, + builtins.formatting.prettier.with { + filetypes = { 'typescript' }, + args = h.range_formatting_args_factory({ + '--parser', + vim.api.nvim_buf_get_option(0, 'filetype'), + '--trailing-comma', + 'all', + '--tab-width', + '2', + '--stdin-filepath', + '$FILENAME', + }, '--range-start', '--range-end'), + }, builtins.formatting.lua_format, -- builtins.formatting.clang_format, builtins.formatting.shfmt.with { diff --git a/ftplugin/dart.lua b/ftplugin/dart.lua @@ -7,7 +7,8 @@ vim.api.nvim_create_user_command('DartDebug', require('tms.ft.dart.debug').func, vim.api.nvim_create_user_command('DartPrint', require('tms.ft.dart.debug').print, opts) vim.api.nvim_create_user_command('DartOrganizeImports', require('tms.ft.dart.lsp').organize_imports, opts) vim.api.nvim_create_user_command('DartFixAll', require('tms.ft.dart.lsp').fix_all, opts) -vim.api.nvim_create_user_command('DartExtract', require('tms.ft.dart.lsp').extract, opts) +vim.api.nvim_create_user_command('DartExtract', require('tms.ft.dart.lsp').extract_method, opts) +vim.api.nvim_create_user_command('DartVariable', require('tms.ft.dart.lsp').extract_local_variable, opts) opts = { buffer = true, noremap = true } vim.keymap.set('n', '<leader>pp', function() require('tms.ft.dart.debug').print() end, opts) diff --git a/lua/tms/ft/dart/lsp.lua b/lua/tms/ft/dart/lsp.lua @@ -6,25 +6,54 @@ local M = {} local execute_command = function(command) local cur_buf = api.nvim_get_current_buf() local cur_buf_name = api.nvim_buf_get_name(cur_buf) - local params = {command = command, arguments = {cur_buf_name}, title = ''} + local params = { command = command, arguments = { cur_buf_name }, title = '' } lsp.buf_request_sync(cur_buf, 'workspace/executeCommand', params, 1500) end +local get_visual = function() + local vs_start = vim.fn.getcurpos()[2] + local vs_end = vim.fn.line('v') + if vs_start > vs_end then + return vs_end - 1, vs_start - 1 + else + return vs_start - 1, vs_end - 1 + end +end + M.organize_imports = function() execute_command('edit.organizeImports') end M.fix_all = function() execute_command('edit.fixAll') end --- TODO(tms) 20.10.2021: -M.extract = function() - local cur_buf = api.nvim_get_current_buf() - local cur_buf_name = api.nvim_buf_get_name(cur_buf) - local range = vim.lsp.util.make_range_params() - local params = {command = 'refactor.perform', arguments = {'EXTRACT_METHOD', cur_buf_name, range}, title = ''} - D(lsp.get_active_clients()[1].request('codeAction/resolve', 'EXTRACT_METHOD', function(err, resolved_action) - if err then - vim.notify(err.code .. ': ' .. err.message, vim.log.levels.ERROR) - return +M.extract_method = function() + local buf = vim.api.nvim_get_current_buf() + local buf_name = vim.api.nvim_buf_get_name(buf) + local start, stop = get_visual() + local start_offset = vim.api.nvim_buf_get_offset(buf, start) + local end_offset = vim.api.nvim_buf_get_offset(buf, stop + 1) + local length = end_offset - start_offset + vim.ui.input({}, function(input) + if input and #input ~= 0 then + vim.lsp.buf_request(buf, 'workspace/executeCommand', { + command = 'refactor.perform', + arguments = { 'EXTRACT_METHOD', buf_name, nil, start_offset, length, { name = input } }, + }) + end + end) +end +-- TODO(tms) 20.04.22: +M.extract_local_variable = function() + local buf = vim.api.nvim_get_current_buf() + local buf_name = vim.api.nvim_buf_get_name(buf) + local start, stop = get_visual() + local start_offset = vim.api.nvim_buf_get_offset(buf, start) + local end_offset = vim.api.nvim_buf_get_offset(buf, stop + 1) + local length = end_offset - start_offset + vim.ui.input({}, function(input) + if input and #input ~= 0 then + vim.lsp.buf_request(buf, 'workspace/executeCommand', { + command = 'refactor.perform', + arguments = { 'EXTRACT_LOCAL_VARIABLE', buf_name, nil, start_offset, length, { name = input } }, + }) end - -- apply_action(resolved_action, client) - end, cur_buf)) + end) end return M diff --git a/lua/tms/lsp/init.lua b/lua/tms/lsp/init.lua @@ -15,12 +15,6 @@ local on_attach = function(client, bufnr) -- vim.api.nvim_buf_set_option(bufnr, 'formatexpr', 'v:lua.vim.lsp.formatexpr()') -- end - -- TODO(tms) 11.04.22: handle genericaly for all servers - if (client.name == 'sumneko_lua') then - client.resolved_capabilities.document_formatting = false - client.resolved_capabilities.range_formatting = false - end - vim.keymap.set('n', 'gd', vim.lsp.buf.definition, { silent = true, buffer = bufnr, desc = 'LSP Definition' }) vim.keymap.set('n', 'gD', '<cmd>vsplit | lua vim.lsp.buf.definition()<cr>', { silent = true, buffer = bufnr, desc = 'LSP definition in vsplit' }) @@ -34,12 +28,20 @@ local on_attach = function(client, bufnr) { silent = true, buffer = bufnr, desc = 'LSP Signature Help' }) vim.keymap.set('n', 'gr', vim.lsp.buf.references, { silent = true, buffer = bufnr, desc = 'LSP References' }) vim.keymap.set('n', 'ga', vim.lsp.buf.code_action, { silent = true, buffer = bufnr, desc = 'LSP Code Actions' }) + vim.keymap.set('v', 'ga', vim.lsp.buf.range_code_action, { silent = true, buffer = bufnr, desc = 'LSP Code Actions' }) vim.keymap.set('n', 'gn', vim.lsp.buf.rename, { silent = true, buffer = bufnr, desc = 'LSP Rename' }) + -- formatting - if client.resolved_capabilities.document_formatting == true then + -- TODO(tms) 11.04.22 + local excluded = { tsserver = true, sumneko_lua = true } + if not excluded[client.name] then vim.keymap.set('n', 'Q', vim.lsp.buf.formatting, { silent = true, buffer = bufnr, desc = 'LSP Format' }) vim.keymap.set('v', 'Q', vim.lsp.buf.range_formatting, { silent = true, buffer = bufnr, desc = 'LSP Range Format' }) + else + client.resolved_capabilities.document_formatting = false + client.resolved_capabilities.range_formatting = false end + -- symbols local t = require('tms.p.telescope') vim.keymap.set('n', 'gm', t.lsp_document_symbols, { silent = true, buffer = bufnr, desc = 'LSP Document Symbols' }) diff --git a/lua/tms/plugins.lua b/lua/tms/plugins.lua @@ -24,7 +24,6 @@ return packer.startup({ -- editor use 'tpope/vim-repeat' - use 'tpope/vim-eunuch' -- usefull unix utililties cmds use 'tpope/vim-surround' use 'chaoren/vim-wordmotion' -- word counts with _,.,-,... use 'romgrk/equal.operator' -- equal text object `lefthand = righthand` @@ -61,6 +60,7 @@ return packer.startup({ use { 'lewis6991/gitsigns.nvim', requires = { 'nvim-lua/plenary.nvim' } } use 'sindrets/diffview.nvim' use 'tpope/vim-fugitive' + use { 'ipod825/igit.nvim', requires = { 'nvim-lua/plenary.nvim', 'ipod825/libp.nvim' } } use 'rhysd/git-messenger.vim' use 'ThePrimeagen/git-worktree.nvim' diff --git a/test/dart.dart b/test/dart.dart @@ -0,0 +1,9 @@ +class Test { + Test() { + var test = ''; + test += 'hej'; + print(test); + } + + void a() => ''; +} diff --git a/test/dart.lua b/test/dart.lua @@ -0,0 +1,32 @@ +local get_visual = function() + local vs_start = vim.fn.getcurpos()[2] + local vs_end = vim.fn.line('v') + if vs_start > vs_end then + return vs_end - 1, vs_start - 1 + else + return vs_start - 1, vs_end - 1 + end +end + +local extract = function() + local buf = vim.api.nvim_get_current_buf() + local buf_name = vim.api.nvim_buf_get_name(buf) + local start, stop = get_visual() + local start_offset = vim.api.nvim_buf_get_offset(buf, start) + local end_offset = vim.api.nvim_buf_get_offset(buf, stop + 1) + local length = end_offset - start_offset + vim.ui.input({}, function(input) + if input and #input ~= 0 then + vim.lsp.buf_request(buf, 'workspace/executeCommand', { + command = 'refactor.perform', + arguments = { 'EXTRACT_METHOD', buf_name, nil, start_offset, length, { name = input } }, + }) + end + end) +end + +vim.keymap.set('n', ',e', extract) +vim.keymap.set('v', ',e', extract) + +vim.cmd [[messages clear]] +print('loaded')