comparison .chezmoitemplates/init.lua @ 451:d99353d71702

Use common template for windows nvim config
author zegervdv <zegervdv@me.com>
date Sun, 12 Sep 2021 11:01:25 +0200
parents
children 6053959484ec
comparison
equal deleted inserted replaced
450:f46d7731ae5e 451:d99353d71702
1 --
2 -- Neovim dotfiles
3 --
4 --
5 local execute = vim.api.nvim_command
6 local fn = vim.fn
7
8 -- Bootstrap package manager
9 local install_path = fn.stdpath 'data' .. '/site/pack/packer/opt/packer.nvim'
10
11 if fn.empty(fn.glob(install_path)) > 0 then
12 execute('!git clone https://github.com/wbthomason/packer.nvim ' .. install_path)
13 end
14
15 vim.defer_fn(function()
16 -- Packer configuration is compiled and only needs to be loaded on changes
17 vim.cmd 'packadd packer.nvim'
18
19 require('packer').startup(function()
20 use { 'wbthomason/packer.nvim', opt = true }
21
22 -- General plugins
23 use { 'tpope/vim-sensible' }
24 use { 'tpope/vim-repeat' }
25 use { 'tpope/vim-rsi' }
26 use { 'sgur/vim-editorconfig' }
27 use { 'ShikChen/osc52.vim' }
28 use { 'einfachtoll/didyoumean' }
29
30 use { 'tpope/vim-obsession' }
31 use {
32 'tpope/vim-eunuch',
33 cmd = {
34 'Delete',
35 'Unlink',
36 'Move',
37 'Rename',
38 'Mkdir',
39 'Chmod',
40 'Cfind',
41 'Clocate',
42 'Lfind',
43 'Llocate',
44 'SudoEdit',
45 'SudoWrite',
46 'Wall',
47 },
48 }
49
50 use { 'psliwka/vim-smoothie' }
51
52 use { 'nvim-lua/plenary.nvim' }
53
54 -- Spelling/autocorrection
55 use { 'tpope/vim-abolish' }
56
57 -- Git/VCS
58 use { 'vim-scripts/gitignore' }
59 use {
60 'sjl/splice.vim',
61 opt = true,
62 cmd = { 'SpliceInit' },
63 config = function()
64 vim.g.splice_initial_diff_grid = 1
65 vim.g.splice_initial_diff_compare = 1
66 vim.g.splice_initial_diff_path = 0
67 vim.g.splice_initial_scrollbind_grid = 1
68 vim.g.splice_initial_scrollbind_compare = 1
69 vim.g.splice_initial_scrollbind_path = 1
70 vim.g.splice_wrap = 'nowrap'
71 end,
72 }
73 use { 'tpope/vim-git', ft = { 'gitcommit', 'gitrebase' } }
74
75 -- Comments
76 use {
77 'b3nj5m1n/kommentary',
78 config = function()
79 require('kommentary.config').configure_language('default', { prefer_single_line_comments = true })
80 end,
81 keys = {
82 { 'n', 'gcc' },
83 { 'v', 'gc' },
84 },
85 }
86
87 -- Undoing
88 use { 'sjl/gundo.vim', cmd = { 'GundoToggle' } }
89
90 -- Parentheses etc
91 use { 'tpope/vim-surround' }
92 use {
93 'windwp/nvim-autopairs',
94 config = function()
95 local npairs = require 'nvim-autopairs'
96 local Rule = require 'nvim-autopairs.rule'
97
98 require('nvim-autopairs.completion.cmp').setup {
99 map_cr = true, -- map <CR> on insert mode
100 map_complete = true, -- it will auto insert `(` after select function or method item
101 auto_select = false, -- automatically select the first item
102 }
103
104 npairs.setup {
105 ignored_next_char = string.gsub([[ [%w%%%'%[%.] ]], '%s+', ''),
106 }
107
108 npairs.add_rules {
109 Rule(' ', ' '):with_pair(function(opts)
110 local pair = opts.line:sub(opts.col - 1, opts.col)
111 return vim.tbl_contains({ '()', '[]', '{}' }, pair)
112 end),
113 Rule('( ', ' )')
114 :with_pair(function()
115 return false
116 end)
117 :with_move(function(opts)
118 return opts.prev_char:match '.%)' ~= nil
119 end)
120 :use_key ')',
121 Rule('{ ', ' }')
122 :with_pair(function()
123 return false
124 end)
125 :with_move(function(opts)
126 return opts.prev_char:match '.%}' ~= nil
127 end)
128 :use_key '}',
129 Rule('[ ', ' ]')
130 :with_pair(function()
131 return false
132 end)
133 :with_move(function(opts)
134 return opts.prev_char:match '.%]' ~= nil
135 end)
136 :use_key ']',
137 }
138
139 npairs.get_rule('`'):with_pair(function()
140 return vim.bo.filetype ~= 'systemverilog'
141 end)
142
143 npairs.get_rule("'"):with_pair(function()
144 return vim.bo.filetype ~= 'systemverilog'
145 end)
146 end,
147 after = { 'nvim-cmp' },
148 }
149
150 -- Moving around within lines
151 use { 'wellle/targets.vim', event = 'InsertEnter *' }
152
153 -- Searching
154 use { 'mhinz/vim-grepper', cmd = { 'Grepper' } }
155
156 -- Keymaps TODO: to be removed when #13823 is merged
157 use {
158 'tjdevries/astronauta.nvim',
159 config = function()
160 require 'astronauta.keymap'
161 end,
162 }
163
164 -- Opening files
165 use { 'wsdjeg/vim-fetch' }
166
167 -- Indent lines
168 use {
169 'lukas-reineke/indent-blankline.nvim',
170 config = function()
171 vim.g.indent_blankline_buftype_exclude = { 'terminal', 'help', 'nofile' }
172 vim.g.indent_blankline_show_first_indent_level = false
173 vim.g.indent_blankline_char = '│'
174 end,
175 }
176
177 -- Increment/decrement
178 use {
179 'zegervdv/nrpattern.nvim',
180 requires = 'tpope/vim-repeat',
181 config = function()
182 local nrpattern = require 'nrpattern'
183 local defaults = require 'nrpattern.default'
184
185 defaults[{ 'input', 'output' }] = { priority = 12, filetypes = { 'verilog', 'systemverilog' } }
186 defaults[{ "'1", "'0" }] = { priority = 9, filetypes = { 'verilog', 'systemverilog' } }
187
188 nrpattern.setup(defaults)
189 end,
190 }
191
192 -- Tmux
193 use {
194 'numtostr/navigator.nvim',
195 config = function()
196 require('Navigator').setup { auto_save = 'current', disable_on_zoom = true }
197
198 local nnoremap = vim.keymap.nnoremap
199 nnoremap { '<c-h>', require('Navigator').left, silent = true }
200 nnoremap { '<c-j>', require('Navigator').down, silent = true }
201 nnoremap { '<c-k>', require('Navigator').up, silent = true }
202 nnoremap { '<c-l>', require('Navigator').right, silent = true }
203 end,
204 requires = 'tjdevries/astronauta.nvim',
205 after = 'astronauta.nvim',
206 }
207
208 -- Completion/snippets/LSP
209 use { 'neovim/nvim-lspconfig' }
210 use {
211 'hrsh7th/nvim-cmp',
212 requires = { 'hrsh7th/cmp-buffer', 'hrsh7th/cmp-nvim-lsp', 'hrsh7th/cmp-vsnip', 'hrsh7th/cmp-path' },
213 config = function()
214 local cmp = require 'cmp'
215 cmp.setup {
216 snippet = {
217 expand = function(args)
218 vim.fn['vsnip#anonymous'](args.body)
219 end,
220 },
221 mapping = {
222 ['<C-p>'] = cmp.mapping.select_prev_item(),
223 ['<C-n>'] = cmp.mapping.select_next_item(),
224 ['<C-d>'] = cmp.mapping.scroll_docs(-4),
225 ['<C-f>'] = cmp.mapping.scroll_docs(4),
226 ['<C-y>'] = cmp.mapping.complete(),
227 ['<C-e>'] = cmp.mapping.close(),
228 ['<CR>'] = cmp.mapping.confirm {
229 behavior = cmp.ConfirmBehavior.Replace,
230 },
231 },
232 sources = {
233 { name = 'nvim_lsp' },
234 { name = 'buffer' },
235 { name = 'vsnip' },
236 { name = 'path' },
237 },
238 }
239 end,
240 }
241 use {
242 {
243 'nvim-treesitter/nvim-treesitter',
244 config = function()
245 require 'nvim-treesitter.highlight'
246
247 require('nvim-treesitter.configs').setup {
248 highlight = { enable = false },
249 incremental_selection = {
250 enable = true,
251 keymaps = {
252 init_selection = 'gnn',
253 node_incremental = 'grn',
254 scope_incremental = 'grc',
255 node_decremental = 'grm',
256 },
257 },
258 refactor = {
259 highlight_definitions = { enable = true },
260 smart_rename = { enable = true, keymaps = { smart_rename = 'gsr' } },
261 navigation = {
262 enable = true,
263 keymaps = { goto_definition = 'gnd', list_definitions = 'gnD' },
264 },
265 },
266 textobjects = {
267 move = {
268 enable = true,
269 goto_next_start = { [']]'] = '@block.outer' },
270 goto_previous_start = { ['[['] = '@block.outer' },
271 goto_next_end = { [']['] = '@block.outer' },
272 goto_previous_end = { ['[]'] = '@block.outer' },
273 },
274 },
275 playground = { enable = true, disable = {}, updatetime = 25, persist_queries = false },
276 }
277 end,
278 },
279 'nvim-treesitter/nvim-treesitter-refactor',
280 'nvim-treesitter/nvim-treesitter-textobjects',
281 { 'nvim-treesitter/playground', opt = true },
282 }
283 use { 'hrsh7th/vim-vsnip', requires = 'hrsh7th/vim-vsnip-integ' }
284 use {
285 'rmagatti/goto-preview',
286 config = function()
287 require('goto-preview').setup {}
288 end,
289 }
290 use {
291 'jose-elias-alvarez/null-ls.nvim',
292 requires = 'nvim-lua/plenary.nvim',
293 }
294 use { 'folke/lua-dev.nvim' }
295
296 use { 'vimjas/vim-python-pep8-indent', ft = { 'python' } }
297
298 -- Vanity
299 use {
300 'yamatsum/nvim-web-nonicons',
301 requires = 'kyazdani42/nvim-web-devicons',
302 config = function()
303 require 'nvim-nonicons'
304 end,
305 }
306
307 use {
308 'glepnir/galaxyline.nvim',
309 branch = 'main',
310 -- your statusline
311 config = function()
312 local gl = require 'galaxyline'
313 local colors = require('galaxyline.theme').default
314 local condition = require 'galaxyline.condition'
315 local gls = gl.section
316
317 colors.bg = '#2C323C'
318
319 gls.left[1] = {
320 RainbowRed = {
321 provider = function()
322 return '▊ '
323 end,
324 highlight = { colors.blue, colors.bg },
325 },
326 }
327
328 gls.left[2] = {
329 FileName = {
330 provider = function()
331 return require('galaxyline.provider_fileinfo').get_current_file_name '⊙'
332 end,
333 condition = condition.buffer_not_empty,
334 highlight = { colors.magenta, colors.bg, 'bold' },
335 },
336 }
337
338 gls.right[1] = {
339 ShowLspClient = {
340 provider = 'GetLspClient',
341 condition = function()
342 local tbl = { ['dashboard'] = true, [''] = true }
343 if tbl[vim.bo.filetype] then
344 return false
345 end
346 return true
347 end,
348 highlight = { colors.green, colors.bg, 'bold' },
349 },
350 }
351
352 gls.right[2] = {
353 LineInfo = {
354 provider = 'LineColumn',
355 separator = ' ',
356 separator_highlight = { 'NONE', colors.bg },
357 highlight = { colors.fg, colors.bg },
358 },
359 }
360
361 gls.right[3] = {
362 PerCent = {
363 provider = 'LinePercent',
364 separator = ' ',
365 separator_highlight = { 'NONE', colors.bg },
366 highlight = { colors.fg, colors.bg, 'bold' },
367 },
368 }
369 gls.right[8] = {
370 RainbowBlue = {
371 provider = function()
372 return ' ▊'
373 end,
374 highlight = { colors.blue, colors.bg },
375 },
376 }
377
378 gls.short_line_left[1] = {
379 BufferType = {
380 provider = 'FileTypeName',
381 separator = ' ',
382 separator_highlight = { 'NONE', colors.bg },
383 highlight = { colors.blue, colors.bg, 'bold' },
384 },
385 }
386
387 gls.short_line_left[2] = {
388 SFileName = {
389 provider = 'SFileName',
390 condition = condition.buffer_not_empty,
391 highlight = { colors.fg, colors.bg, 'bold' },
392 },
393 }
394
395 gls.short_line_right[1] = {
396 BufferIcon = { provider = 'BufferIcon', highlight = { colors.fg, colors.bg } },
397 }
398 end,
399 }
400
401 -- File navigation
402 use { 'justinmk/vim-dirvish' }
403
404 -- Colorscheme
405 use {
406 'zegervdv/one-lush',
407 requires = 'rktjmp/lush.nvim',
408 config = function()
409 require 'lush_theme.one-lush'
410 vim.cmd [[ colorscheme one-lush ]]
411 end,
412 }
413
414 -- Terminal
415 use {
416 'akinsho/nvim-toggleterm.lua',
417 config = function()
418 require('toggleterm').setup {
419 size = 15,
420 open_mapping = [[<F12>]],
421 shade_filetypes = { 'none' },
422 shade_terminals = true,
423 persist_size = true,
424 direction = 'horizontal',
425 }
426 end,
427 keys = { [[<F12>]] },
428 }
429
430 -- Filetypes
431 use { 'lepture/vim-jinja' }
432 end)
433 end, 0)
434
435 -- Configuration
436 local opt = vim.opt
437
438 opt.backspace = { 'indent', 'eol', 'start' } -- Backspace everything
439
440 opt.autoread = true -- Read changed files
441 opt.hidden = true -- Allow to move away from modified files
442 opt.autowriteall = true -- Write changes when losing focus
443
444 -- Visuals
445 opt.number = true
446 opt.relativenumber = true
447 opt.scrolloff = 4
448 opt.showcmd = true -- Show incomplete commands while typing
449
450 opt.termguicolors = true
451 opt.background = 'dark'
452
453 opt.showmatch = true -- Highligh matching braces
454
455 opt.wrap = true -- Wrap lines
456 opt.wrapmargin = 2 -- Stay 2 chars from side
457 opt.textwidth = 79
458 opt.colorcolumn = '81' -- Show indication of 81 chars
459 opt.linebreak = true -- Smarter wrapping
460 opt.breakindent = true -- Indent wrapped lines to same level
461
462 opt.fixendofline = true -- Add EOL when missing
463
464 opt.expandtab = true -- Add spaces when pressing tab
465 opt.tabstop = 2 -- Tab is 2 spaces
466 opt.shiftwidth = 2 -- Shift per 2 spaces
467 opt.shiftround = true -- Round shifts to allign (1 space + tab = 2 spaces)
468
469 -- Searching and substitute
470 opt.magic = true -- Enable regexes
471 opt.hlsearch = true -- Highlight all matches
472 opt.incsearch = true -- Show matches while typing
473 opt.ignorecase = true
474 opt.smartcase = true -- When search pattern contains cases, be case sensitive
475 opt.gdefault = true -- Use global flag for substitute: replace all matches on line
476 opt.inccommand = 'nosplit' -- Show live replacements directly in text
477
478 opt.autoindent = true
479 opt.cindent = true -- C-syntax based indenting
480
481 opt.updatetime = 300 -- Faster triggering of CursorHold events
482
483 opt.errorbells = false -- Don't you beep to me
484
485 opt.history = 1000 -- Remember last commands
486
487 opt.wildmenu = true -- Command completion
488 opt.wildmode = 'longest:full,full'
489 opt.shortmess:append 'c' -- Hide ins-completion messages
490
491 opt.ttyfast = true -- fast terminal
492 opt.lazyredraw = true
493 opt.ttimeoutlen = -1 -- Minimum timeout
494
495 opt.diffopt:append 'iwhite' -- Ignore whitespace in diffs
496 opt.diffopt:append 'internal' -- Internal diff engine
497 opt.diffopt:append 'algorithm:patience' -- Use patience algorithm
498
499 opt.tags = { '.git/tags', 'tags' }
500
501 opt.path:append '**' -- Recursively search current directory
502
503 opt.formatoptions = {
504 c = true, -- Wrap comments
505 r = true, -- Continue comments
506 o = true, -- Insert comment with o/O
507 q = true, -- Format comments with gq
508 n = true, -- Indent numbered lists
509 [2] = true, -- Indent from 2nd line of paragraph
510 [1] = true, -- Don't break before one letter words
511 }
512
513 opt.signcolumn = 'yes' -- Always show signcolumn
514
515 opt.cursorline = true
516
517 -- Show certain characters
518 opt.list = true
519 opt.listchars = { trail = '·', extends = '>', precedes = '<', nbsp = '+' }
520
521 opt.sessionoptions:remove 'options' -- Remove options from saved sessions (reload from config)
522
523 opt.completeopt = { 'menu', 'menuone', 'noselect' }
524
525 opt.splitright = true -- Open new splits to right
526 opt.virtualedit = 'block' -- Enable block editting
527
528 opt.conceallevel = 0 -- Disable conceal
529
530 opt.pastetoggle = '<F2>' -- Enable paste mode
531
532 opt.undofile = true -- Persistently remember undos
533 opt.undolevels = 1000
534 if os.getenv('HOME') ~= nil then
535 opt.undodir = os.getenv 'HOME' .. '/.config/nvim/tmp/undo//'
536 end
537 opt.swapfile = false -- Disable swap files
538 opt.backup = true -- Keep backups
539 if os.getenv('HOME') ~= nil then
540 opt.backupdir = os.getenv 'HOME' .. '/.config/nvim/tmp/backup//'
541 end
542
543 -- Files to ignore from completion
544 opt.wildignore:append {
545 '*/tmp/*',
546 '*.so',
547 '*.swp',
548 '*.zip',
549 '*.o',
550 '*.bin',
551 '*.elf',
552 '*.hex',
553 '*.eps',
554 '.git/*',
555 '*.dup',
556 '.hg/**',
557 '*.orig',
558 '*.*~',
559 }
560
561 opt.mouse = {
562 n = true, -- Normal mode
563 i = true, -- Insert mode
564 c = true, -- Commandline mode
565 }
566
567 -- LSP config
568 local lsp = require 'lspconfig'
569 local null_ls = require 'null-ls'
570
571 local on_attach = function(client)
572 local nnoremap = vim.keymap.nnoremap
573 local inoremap = vim.keymap.inoremap
574 nnoremap { 'gd', vim.lsp.buf.declaration, silent = true }
575 nnoremap { '<c-]>', vim.lsp.buf.definition, silent = true }
576 nnoremap {
577 'g<c-]>',
578 function()
579 local params = vim.lsp.util.make_position_params()
580 opts = {}
581 local results_lsp = vim.lsp.buf_request_sync(0, 'textDocument/definition', params, opts.timeout or 10000)
582 if not results_lsp or vim.tbl_isempty(results_lsp) then
583 print 'No results from textDocument/definition'
584 return
585 end
586 for _, lsp_data in pairs(results_lsp) do
587 if lsp_data ~= nil and lsp_data.result ~= nil and not vim.tbl_isempty(lsp_data.result) then
588 for _, value in pairs(lsp_data.result) do
589 local range = value.range or value.targetRange
590 if range ~= nil then
591 local file = value.uri or value.targetUri
592 if file ~= nil then
593 vim.api.nvim_command [[split]]
594 vim.lsp.util.jump_to_location(value)
595 return
596 end
597 end
598 end
599 end
600 end
601 -- try to call default lsp function
602 vim.lsp.buf.definition()
603 end,
604 silent = true,
605 }
606 nnoremap { 'K', vim.lsp.buf.hover, silent = true }
607 nnoremap { 'gD', vim.lsp.buf.implementation, silent = true }
608 nnoremap { '1gD', vim.lsp.buf.type_definition, silent = true }
609 nnoremap { 'gr', vim.lsp.buf.references, silent = true }
610 nnoremap { 'g0', vim.lsp.buf.document_symbol, silent = true }
611 nnoremap {
612 '<c-p>',
613 function()
614 vim.lsp.buf.formatting_sync({}, 5000)
615 end,
616 silent = true,
617 }
618 -- nnoremap { 'gp', require'lspsaga.provider'.preview_definition, silent = true }
619 nnoremap { 'gp', require('goto-preview').goto_preview_definition, silent = true }
620 nnoremap { 'gP', require('goto-preview').close_all_win, silent = true }
621
622 inoremap { '<c-l>', vim.lsp.buf.signature_help, silent = true }
623
624 vim.fn.sign_define(
625 'LspDiagnosticsSignError',
626 { texthl = 'LspDiagnosticsSignError', linehl = '', numhl = '', text = '▎' }
627 )
628 vim.fn.sign_define('LspDiagnosticsSignWarning', {
629 texthl = 'LspDiagnosticsSignWarning',
630 linehl = '',
631 numhl = '',
632 text = '▎',
633 })
634 vim.fn.sign_define('LspDiagnosticsSignInformation', {
635 texthl = 'LspDiagnosticsSignInformation',
636 linehl = '',
637 numhl = '',
638 text = '▎',
639 })
640 vim.fn.sign_define(
641 'LspDiagnosticsSignHint',
642 { texthl = 'LspDiagnosticsSignHint', linehl = '', numhl = '', text = '▎' }
643 )
644
645 vim.lsp.handlers['textDocument/hover'] = vim.lsp.with(vim.lsp.handlers.hover, { border = 'single' })
646 vim.lsp.handlers['textDocument/signatureHelp'] = vim.lsp.with(vim.lsp.handlers.hover, { border = 'single' })
647 vim.lsp.handlers['textDocument/publishDiagnostics'] = vim.lsp.with(vim.lsp.diagnostic.on_publish_diagnostics, {
648 underline = true,
649 update_in_insert = false,
650 virtual_text = { severity_limit = 'Warning' },
651 })
652 end
653
654 local capabilities = vim.lsp.protocol.make_client_capabilities()
655 capabilities.textDocument.completion.completionItem.snippetSupport = true
656 capabilities.textDocument.completion.completionItem.resolveSupport = {
657 properties = {
658 'documentation',
659 'detail',
660 'additionalTextEdits',
661 },
662 }
663 capabilities = require('cmp_nvim_lsp').update_capabilities(capabilities)
664
665 lsp.pyright.setup { on_attach = on_attach, capabilities = capabilities }
666
667 null_ls.config {
668 sources = {
669 null_ls.builtins.formatting.black,
670 null_ls.builtins.formatting.stylua,
671 },
672 }
673 lsp['null-ls'].setup {
674 on_attach = on_attach,
675 root_dir = require('lspconfig.util').root_pattern('.hg', '.git'),
676 }
677
678 local luadev = require('lua-dev').setup {
679 lspconfig = {
680 cmd = { 'lua-language-server' },
681 on_attach = on_attach,
682 capabilities = capabilities,
683 settings = {
684 Lua = {
685 diagnostics = {
686 globals = { 'use' },
687 },
688 },
689 },
690 },
691 }
692
693 lsp.sumneko_lua.setup(luadev)
694
695 -- Populate quickfix with all locations of rename
696 function LspRename()
697 local params = vim.lsp.util.make_position_params()
698 params.newName = vim.fn.input("Rename: ", vim.fn.expand('<cword>'))
699 vim.lsp.buf_request(0, 'textDocument/rename', params, function(err, result, ctx, ...)
700 vim.lsp.handlers['textDocument/rename'](err, result, ctx, ...)
701 local changed = {}
702 for uri, changes in pairs(result.changes) do
703 local bufnr = vim.uri_to_bufnr(uri)
704 for _, edits in ipairs(changes) do
705 table.insert(changed, {
706 bufnr = bufnr,
707 lnum = edits.range.start.line + 1,
708 col = edits.range.start.character + 1,
709 text = vim.api.nvim_buf_get_lines(bufnr, edits.range.start.line, edits.range.start.line + 1, false)[1],
710 })
711 end
712 end
713 vim.fn.setqflist(changed, 'r')
714 end)
715 end
716
717 vim.cmd [[command! LspRename lua LspRename()]]
718
719 -- Try importing local config
720 local ok, localconfig = pcall(require, 'localconfig')
721 if ok then
722 localconfig.setup { on_attach = on_attach, capabilities = capabilities }
723 end