/
telnov.ob
/
nvim-config
Обзор
Документация
Войти
/
telnov.ob
/
nvim-config
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
main
plugin/lsp.lua
189 строк
6 KB
Sergey M
добавил секреты и конфиги для работы с оламой и деревом кода
11 июн 2026, 22:54
11 июн 2026, 22:54
86efe8b
Код
Авторство
О чём код?
vim.pack.add({ 'https://github.com/neovim/nvim-lspconfig', 'https://github.com/mason-org/mason.nvim', 'https://github.com/williamboman/mason-lspconfig.nvim', 'https://github.com/b0o/schemastore.nvim', }, { confirm = false }) require('mason').setup() -- Конфиги самих языковых серверов в ~/.config/nvim/after/lsp. Они рекурсивно -- объединяются со встроенными. -- Полностью переопределить конфиги можно в ~/.config/nvim/lsp. require('mason-lspconfig').setup({ ensure_installed = { 'basedpyright', 'bashls', 'biome', 'clangd', 'cssls', 'docker_compose_language_service', 'docker_language_server', 'gopls', 'html', 'jsonls', 'lua_ls', 'ruff', 'stylua', 'vimls', 'vtsls', 'vue_ls', 'yamlls', }, }) local capabilities = vim.lsp.protocol.make_client_capabilities() -- blink.cmp больше не нужен! -- local ok_blink, blink = pcall(require, 'blink.cmp') -- if ok_blink then -- capabilities = -- vim.tbl_deep_extend('force', capabilities, blink.get_lsp_capabilities()) -- end -- Настройки для всех серверов vim.lsp.config('*', { capabilities = capabilities }) -- Специфичные настройки jsonls vim.lsp.config('jsonls', { settings = { json = { -- Дополнение в json через схемы schemas = require('schemastore').json.schemas(), validate = { enable = true }, }, }, }) -- Включаем сервера vim.lsp.enable({ 'rust_analyzer' }) -- Настройка внешнего вида диагностики vim.diagnostic.config({ virtual_text = false, virtual_lines = { current_line = true, only_current_line = true }, underline = true, severity_sort = true, }) local function pumvisible() return tonumber(vim.fn.pumvisible()) ~= 0 end local function feedkeys(keys) vim.api.nvim_feedkeys( vim.api.nvim_replace_termcodes(keys, true, false, true), 'n', true ) end -- https://mintlify.wiki/neovim/neovim/lsp/completion local lsp_group = vim.api.nvim_create_augroup('lsp', { clear = true }) vim.api.nvim_create_autocmd('LspAttach', { group = lsp_group, callback = function(args) local client = assert(vim.lsp.get_client_by_id(args.data.client_id)) local bufnr = args.buf local function map(lhs, rhs, opts, mode) opts = type(opts) == 'string' and { desc = opts } or opts or {} opts = vim.tbl_extend('force', opts, { buffer = bufnr }) vim.keymap.set(mode or 'n', lhs, rhs, opts) end -- https://gist.github.com/MariaSolOs/2e44a86f569323c478e5a078d0cf98cc if client:supports_method('textDocument/completion') then -- По умолчанию автодополнение вызывается при вводе ".", но это не очень -- удобно, привычнее когда варианты автоподстановки показываются при вводе -- любого символа (тут только печатные ASCII). local chars = {} for i = 32, 126 do table.insert(chars, string.char(i)) end client.server_capabilities.completionProvider.triggerCharacters = chars vim.lsp.completion.enable(true, client.id, bufnr, { autotrigger = true }) map('<cr>', function() return pumvisible() and '<C-y>' or '<cr>' end, { expr = true }, 'i') map('<C-Space>', function() vim.lsp.completion.get() end, 'Trigger Completion', 'i') -- Закрыть меню и отменить подстановку -- Можно на <Esc> повесить map('/', function() return pumvisible() and '<C-e>' or '/' end, { expr = true }, 'i') -- Вызываем автодополнение по Ctrl-N map('<C-n>', function() return pumvisible() and '<C-n>' or '<C-x><C-o>' end, { expr = true }, 'i') -- Я не уверен, что эти табы нужны map('<Tab>', function() return pumvisible() and '<C-n>' or '<Tab>' end, { expr = true }, 'i') map('<S-Tab>', function() return pumvisible() and '<C-p>' or '<S-Tab>' end, { expr = true }, 'i') end -- Это сочетание не всегда связано с LSP по умолчанию, поэтому его нужно -- прописать явно map('gd', vim.lsp.buf.definition, 'Go to definition') map('gD', vim.lsp.buf.declaration, 'Go to declaration') map('K', vim.lsp.buf.hover, 'Show Documentation') map('<C-k>', vim.lsp.buf.signature_help, 'Signature Help', 'i') map('gl', vim.diagnostic.open_float, 'Line Diagnostics') map('[d', function() vim.diagnostic.jump({ count = -1 }) end, 'Prev Diagnostic') map(']d', function() vim.diagnostic.jump({ count = 1 }) end, 'Next Diagnostic') -- Включаем Inlay Hints по умолчанию if client:supports_method('textDocument/inlayHint') then vim.lsp.inlay_hint.enable(true) map('<leader>ih', function() vim.lsp.inlay_hint.enable( not vim.lsp.inlay_hint.is_enabled({ bufnr = bufnr }) ) end, 'Toggle Inlay Hints') end -- Подсветка упоминаний символа под курсором if client:supports_method('textDocument/documentHighlight') then local group = vim.api.nvim_create_augroup('lsp-highlight', { clear = false }) vim.api.nvim_clear_autocmds({ group = group, buffer = bufnr }) vim.api.nvim_create_autocmd({ 'CursorHold', 'CursorHoldI' }, { group = group, buffer = bufnr, callback = vim.lsp.buf.document_highlight, }) vim.api.nvim_create_autocmd({ 'CursorMoved', 'CursorMovedI' }, { group = group, buffer = bufnr, callback = vim.lsp.buf.clear_references, }) end end, }) -- Неудобно, что при выборе части пути, его автодополнение завершается vim.api.nvim_create_autocmd('CompleteDone', { callback = function() local e = vim.v.event if e.complete_type == 'files' and e.reason == 'accept' then feedkeys('<C-x><C-f>') end end, })