local lsp_have_feature = { rename = function(client) return client.supports_method "textDocument/rename" end, inlay_hint = function(client) return client.supports_method "textDocument/inlayHint" end, } local function get_lsp_client_names(have_feature) local client_names = {} local attached_clients = vim.lsp.get_clients { bufnr = 0 } for _, client in ipairs(attached_clients) do if have_feature(client) then table.insert(client_names, client.name) end end return client_names end local function lsp_buf_rename(client_name) vim.lsp.buf.rename(nil, { name = client_name }) end function LSP_BUF_RENAME_USE_ANY(fallback) local client_names = get_lsp_client_names(lsp_have_feature.rename) for _, client_name in ipairs(client_names) do lsp_buf_rename(client_name) return end if fallback then fallback() end end return { { "ellisonleao/dotenv.nvim", config = function() require('dotenv').setup({ enable_on_load = true, -- will load your .env file upon loading a buffer }) vim.api.nvim_create_autocmd("BufEnter", { pattern = "*", callback = require('dotenv').autocmd }) end }, { "ThePrimeagen/refactoring.nvim", dependencies = { "nvim-lua/plenary.nvim", }, config = function() require("telescope").load_extension("refactoring") end, keys = { { "r", "", desc = "Refactoring", mode = {"n", "v"} }, { "rr", ":lua require('refactoring').select_refactor()", desc = "Select refactoring", mode = {"n", "x"}, }, -- Refactoring operations { "re", "lua require('refactoring').refactor('Extract Function')", desc = "Extract Function", mode = "x", }, { "rf", "lua require('refactoring').refactor('Extract Function To File')", desc = "Extract Function To File", mode = "x", }, { "rv", "lua require('refactoring').refactor('Extract Variable')", desc = "Extract Variable", mode = "x", }, { "rI", "lua require('refactoring').refactor('Inline Function')", desc = "Inline Function", mode = "n", }, { "ri", "lua require('refactoring').refactor('Inline Variable')", desc = "Inline Variable", mode = {"n", "x"}, }, -- Extract block { "rb", "lua require('refactoring').refactor('Extract Block')", desc = "Extract Block", mode = "n", }, { "rbf", "lua require('refactoring').refactor('Extract Block To File')", desc = "Extract Block To File", mode = "n", }, -- Telescope { "fr", "lua require('telescope').extensions.refactoring.refactors()", desc = "Telescope refactorings", mode = "n", } } }, { 'folke/neodev.nvim', ft = {'lua'}, dependencies = { 'neovim/nvim-lspconfig' }, config = function() require('neodev').setup() end }, { 'folke/trouble.nvim', dependencies = { 'kyazdani42/nvim-web-devicons' }, config = function() require("trouble").setup() vim.keymap.set("n", "x", "", {desc = "Diagnostics"}) local function set_trouble_keymap(key, cmd, opts) vim.keymap.set( "n", string.format("x%s", key), string.format("Trouble %s", cmd), opts ) end set_trouble_keymap("x", "diagnostics toggle", {desc = "Workspace diagnostics window"}) set_trouble_keymap("X", "diagnostics toggle filter.buf=0", {desc = "Buffer diagnostics window"}) set_trouble_keymap("Q", "qflist toggle", {desc = "Qflist"}) set_trouble_keymap("l", "lsp toggle focus=false win.position=right", {desc = "Toggle LSP diagnostics"}) end }, { 'lewis6991/gitsigns.nvim', event = "BufReadPost", enabled = vim.fn.executable "git" == 1, config = function() require("gitsigns").setup({ signs = { add = { text = "+" }, change = { text = "|" }, delete = { text = "-" }, topdelete = { text = "^" }, changedelete = { text = "~" }, untracked = { text = "0" }, }, signs_staged = { add = { text = '+' }, change = { text = '|' }, delete = { text = '-' }, topdelete = { text = "^" }, changedelete = { text = '~' }, untracked = { text = '0' }, }, signs_staged_enable = true, }) vim.keymap.set("n", "g", "", {desc = "Git actions"}) local function set_gitsigns_keymap(key, cmd, opts) vim.keymap.set( "n", string.format("g%s", key), string.format("Gitsigns %s", cmd), opts ) end set_gitsigns_keymap('p', 'preview_hunk', {desc = "Preview hunk"}) set_gitsigns_keymap('b', 'blame_line', {desc = "Show line commit info"}) set_gitsigns_keymap('n', 'next_hunk', {desc = "Next changes"}) set_gitsigns_keymap('N', 'prev_hunk', {desc = "Previous changes"}) set_gitsigns_keymap('r', 'reset_hunk', {desc = "Reset changes"}) set_gitsigns_keymap('h', 'toggle_linehl', {desc = "Toggle changes highlight"}) end }, { "wsdjeg/vim-fetch", }, { "aznhe21/actions-preview.nvim", dependencies = { 'nvim-telescope/telescope.nvim', 'MunifTanjim/nui.nvim' }, config = function() require("actions-preview").setup { telescope = { sorting_strategy = "ascending", layout_strategy = "vertical", layout_config = { width = 0.8, height = 0.9, prompt_position = "top", preview_cutoff = 20, preview_height = function(_, _, max_lines) return max_lines - 15 end, }, }, } vim.keymap.set("n", "c", "", {desc = "Code action"}) vim.keymap.set("n", "ca", require("actions-preview").code_actions, {desc = "Code action"}) end, }, { "neovim/nvim-lspconfig", dependencies = { "mason-org/mason.nvim", "mason-org/mason-lspconfig.nvim", 'nvim-telescope/telescope.nvim', }, config = function() local opts = { noremap=true, silent=true } local function desc(description) return vim.tbl_extend("keep", opts, {desc = description}) end -- Sections vim.api.nvim_set_keymap('n', 'w', '', {desc = "Workspace manage"}) -- See `:help vim.lsp.*` for documentation on any of the below functions vim.api.nvim_set_keymap('n', 'gD', 'lua vim.lsp.buf.declaration()', desc("Go declaration")) vim.api.nvim_set_keymap('n', 'gd', 'Telescope lsp_definitions', desc("Go definition")) vim.api.nvim_set_keymap('n', 'gi', 'Telescope lsp_implementations', desc("Go implementation")) vim.api.nvim_set_keymap('n', 'gr', 'Telescope lsp_references', desc("Go references")) vim.api.nvim_set_keymap('n', 'gt', 'Telescope lsp_type_definitions', desc("Go type references")) vim.api.nvim_set_keymap('n', 'k', 'lua vim.lsp.buf.hover()', desc("Show help")) vim.api.nvim_set_keymap('n', 'K', 'lua vim.lsp.buf.signature_help()', desc("Show signature")) vim.api.nvim_set_keymap('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', desc("Add workspace folder")) vim.api.nvim_set_keymap('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', desc("Remove workspace folder")) vim.api.nvim_set_keymap('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', desc("Show workspace folders")) vim.api.nvim_set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', desc("Show type")) vim.api.nvim_set_keymap('n', 'rn', "lua LSP_BUF_RENAME_USE_ANY()", desc("Rename object")) vim.api.nvim_set_keymap('n', 'e', 'lua vim.diagnostic.open_float()', desc("Show diagnostic")) vim.api.nvim_set_keymap('n', 'p', 'lua vim.diagnostic.goto_prev()', desc("Previous problem")) vim.api.nvim_set_keymap('n', 'n', 'lua vim.diagnostic.goto_next()', desc("Next problem")) vim.api.nvim_set_keymap('n', 'q', 'lua vim.diagnostic.setloclist()', opts) vim.api.nvim_set_keymap('n', 'f', 'lua vim.lsp.buf.format()', desc("Format file")) -- Mason настройки require("mason").setup() require("mason-lspconfig").setup({ ensure_installed = { "lua_ls", "pyright", "gopls", "rust_analyzer", "ts_ls", }, handlers = { function(server_name) local config = vim.deepcopy(require('lspconfig')[server_name].config) config.capabilities = vim.lsp.protocol.make_client_capabilities() vim.lsp.config(server_name, config) vim.lsp.enable(server_name) end, } }) end }, }