Mercurial > dotfiles
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 |