diff --git a/.config/nvim/init.lua b/.config/nvim/init.lua new file mode 100644 index 0000000..0545a4b --- /dev/null +++ b/.config/nvim/init.lua @@ -0,0 +1,3 @@ +require("core") +require("plugins") +require("lsp") diff --git a/.config/nvim/lua/configs/lsp/bash.lua b/.config/nvim/lua/configs/lsp/bash.lua new file mode 100644 index 0000000..89adb9d --- /dev/null +++ b/.config/nvim/lua/configs/lsp/bash.lua @@ -0,0 +1,4 @@ +return { + "bashls", + settings = { }, +} diff --git a/.config/nvim/lua/configs/lsp/clangd.lua b/.config/nvim/lua/configs/lsp/clangd.lua new file mode 100644 index 0000000..a41aea2 --- /dev/null +++ b/.config/nvim/lua/configs/lsp/clangd.lua @@ -0,0 +1,5 @@ +return { + "clangd", + settings = {} +} + diff --git a/.config/nvim/lua/configs/lsp/pylsp.lua b/.config/nvim/lua/configs/lsp/pylsp.lua new file mode 100644 index 0000000..b715756 --- /dev/null +++ b/.config/nvim/lua/configs/lsp/pylsp.lua @@ -0,0 +1,12 @@ +return { + "pylsp", + settings = { + ["pylsp"] = { + plugins = { + pylint = { + enabled = true, + }, + }, + }, + }, +} diff --git a/.config/nvim/lua/configs/plugins/airline.lua b/.config/nvim/lua/configs/plugins/airline.lua new file mode 100644 index 0000000..02fb200 --- /dev/null +++ b/.config/nvim/lua/configs/plugins/airline.lua @@ -0,0 +1 @@ +return { "vim-airline/vim-airline" } diff --git a/.config/nvim/lua/configs/plugins/bufferline.lua b/.config/nvim/lua/configs/plugins/bufferline.lua new file mode 100644 index 0000000..90d435b --- /dev/null +++ b/.config/nvim/lua/configs/plugins/bufferline.lua @@ -0,0 +1,8 @@ +return { + "akinsho/bufferline.nvim", + config = { + options = { + buffer_close_icon = "✕", + } + } +} diff --git a/.config/nvim/lua/configs/plugins/comment.lua b/.config/nvim/lua/configs/plugins/comment.lua new file mode 100644 index 0000000..f3752d4 --- /dev/null +++ b/.config/nvim/lua/configs/plugins/comment.lua @@ -0,0 +1,8 @@ +return { + 'numToStr/Comment.nvim', + opts = { }, + lazy = false, + config = function() + require('Comment').setup() + end, +} diff --git a/.config/nvim/lua/configs/plugins/devicons.lua b/.config/nvim/lua/configs/plugins/devicons.lua new file mode 100644 index 0000000..30835e1 --- /dev/null +++ b/.config/nvim/lua/configs/plugins/devicons.lua @@ -0,0 +1 @@ +return { "nvim-tree/nvim-web-devicons" } diff --git a/.config/nvim/lua/configs/plugins/langmapper.lua b/.config/nvim/lua/configs/plugins/langmapper.lua new file mode 100644 index 0000000..a9d1fd6 --- /dev/null +++ b/.config/nvim/lua/configs/plugins/langmapper.lua @@ -0,0 +1,8 @@ +return { + 'Wansmer/langmapper.nvim', + lazy = false, + priority = 1, + config = { + hack_keymap = true, + } +} diff --git a/.config/nvim/lua/configs/plugins/lastplace.lua b/.config/nvim/lua/configs/plugins/lastplace.lua new file mode 100644 index 0000000..95059b1 --- /dev/null +++ b/.config/nvim/lua/configs/plugins/lastplace.lua @@ -0,0 +1,5 @@ +return { + "ethanholz/nvim-lastplace", + config = {} +} + diff --git a/.config/nvim/lua/configs/plugins/lspconfig.lua b/.config/nvim/lua/configs/plugins/lspconfig.lua new file mode 100644 index 0000000..7e06214 --- /dev/null +++ b/.config/nvim/lua/configs/plugins/lspconfig.lua @@ -0,0 +1 @@ +return { "neovim/nvim-lspconfig" } diff --git a/.config/nvim/lua/configs/plugins/nvim-tree.lua b/.config/nvim/lua/configs/plugins/nvim-tree.lua new file mode 100644 index 0000000..1ca19b1 --- /dev/null +++ b/.config/nvim/lua/configs/plugins/nvim-tree.lua @@ -0,0 +1,10 @@ + +return { + "nvim-tree/nvim-tree.lua", + config = function() + vim.g.loaded_netrw = 1 + vim.g.loaded_netrwPlugin = 1 + require("nvim-tree").setup() + end, +} + diff --git a/.config/nvim/lua/configs/plugins/onedark.lua b/.config/nvim/lua/configs/plugins/onedark.lua new file mode 100644 index 0000000..36ef732 --- /dev/null +++ b/.config/nvim/lua/configs/plugins/onedark.lua @@ -0,0 +1,8 @@ +return { + "joshdick/onedark.vim", + lazy = false, + config = function() + vim.cmd([[colorscheme onedark]]) + end, +} + diff --git a/.config/nvim/lua/configs/plugins/treesitter.lua b/.config/nvim/lua/configs/plugins/treesitter.lua new file mode 100644 index 0000000..6d1bc1e --- /dev/null +++ b/.config/nvim/lua/configs/plugins/treesitter.lua @@ -0,0 +1,14 @@ +return { + "nvim-treesitter/nvim-treesitter", + build = ":TSUpdate", + config = function () + local configs = require("nvim-treesitter.configs") + + configs.setup({ + ensure_installed = { "c", "cpp", "lua", "vim", "vimdoc", "query", "python", "javascript", "html" }, + sync_install = false, + highlight = { enable = true }, + indent = { enable = true }, + }) + end + } diff --git a/.config/nvim/lua/configs/plugins/wakatime.lua b/.config/nvim/lua/configs/plugins/wakatime.lua new file mode 100644 index 0000000..56dcc41 --- /dev/null +++ b/.config/nvim/lua/configs/plugins/wakatime.lua @@ -0,0 +1,4 @@ +return { + "wakatime/vim-wakatime", + lazy = false, +} diff --git a/.config/nvim/lua/core.lua b/.config/nvim/lua/core.lua new file mode 100644 index 0000000..e6ca263 --- /dev/null +++ b/.config/nvim/lua/core.lua @@ -0,0 +1,33 @@ +-- Line numbers +vim.opt.number = true +vim.opt.relativenumber = true + +-- Indentation +vim.opt.expandtab = true +vim.opt.autoindent = true +vim.opt.smarttab = true +vim.opt.shiftwidth = 4 +vim.opt.tabstop = 4 +vim.opt.softtabstop = 4 + +-- Enable syntax highlighting +vim.opt.termguicolors = true +vim.opt.syntax = on + +-- Enable undo after closing vim +vim.opt.undofile = true + +-- Make vim work with russian layout +local function escape(str) + local escape_chars = [[;,."|\]] + return vim.fn.escape(str, escape_chars) +end + +local en = [[`qwertyuiop[]asdfghjkl;'zxcvbnm]] local ru = [[ёйцукенгшщзхъфывапролджэячсмить]] +local en_shift = [[~QWERTYUIOP{}ASDFGHJKL:"ZXCVBNM<>]] +local ru_shift = [[ËЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮ]] + +vim.opt.langmap = vim.fn.join({ + escape(ru_shift) .. ';' .. escape(en_shift), + escape(ru) .. ';' .. escape(en), +}, ',') diff --git a/.config/nvim/lua/lsp.lua b/.config/nvim/lua/lsp.lua new file mode 100644 index 0000000..a6ba2e9 --- /dev/null +++ b/.config/nvim/lua/lsp.lua @@ -0,0 +1,107 @@ +-- require("utils").load_servers{ +-- require("configs.lsp.pylsp"), +-- require("configs.lsp.clangd"), +-- require("configs.lsp.bash"), +-- } +-- +local lspconfig = require("lspconfig") + +local custom_attach = function(client, bufnr) + -- Mappings. + local map = function(mode, l, r, opts) + opts = opts or {} + opts.silent = true + opts.buffer = bufnr + keymap.set(mode, l, r, opts) + end + + map("n", "gd", vim.lsp.buf.definition, { desc = "go to definition" }) + map("n", "", vim.lsp.buf.definition) + map("n", "K", vim.lsp.buf.hover) + map("n", "", vim.lsp.buf.signature_help) + map("n", "rn", vim.lsp.buf.rename, { desc = "varialbe rename" }) + map("n", "gr", vim.lsp.buf.references, { desc = "show references" }) + map("n", "[d", diagnostic.goto_prev, { desc = "previous diagnostic" }) + map("n", "]d", diagnostic.goto_next, { desc = "next diagnostic" }) + -- this puts diagnostics from opened files to quickfix + map("n", "qw", diagnostic.setqflist, { desc = "put window diagnostics to qf" }) + -- this puts diagnostics from current buffer to quickfix + map("n", "qb", function() set_qflist(bufnr) end, { desc = "put buffer diagnostics to qf" }) + map("n", "ca", vim.lsp.buf.code_action, { desc = "LSP code action" }) + map("n", "wa", vim.lsp.buf.add_workspace_folder, { desc = "add workspace folder" }) + map("n", "wr", vim.lsp.buf.remove_workspace_folder, { desc = "remove workspace folder" }) + map("n", "wl", function() + inspect(vim.lsp.buf.list_workspace_folders()) + end, { desc = "list workspace folder" }) + + -- Set some key bindings conditional on server capabilities + if client.server_capabilities.documentFormattingProvider then + map("n", "f", vim.lsp.buf.format, { desc = "format code" }) + end + + api.nvim_create_autocmd("CursorHold", { + buffer = bufnr, + callback = function() + local float_opts = { + focusable = false, + close_events = { "BufLeave", "CursorMoved", "InsertEnter", "FocusLost" }, + border = "rounded", + source = "always", -- show source in diagnostic popup window + prefix = " ", + } + + if not vim.b.diagnostics_pos then + vim.b.diagnostics_pos = { nil, nil } + end + + local cursor_pos = api.nvim_win_get_cursor(0) + if (cursor_pos[1] ~= vim.b.diagnostics_pos[1] or cursor_pos[2] ~= vim.b.diagnostics_pos[2]) + and #diagnostic.get() > 0 + then + diagnostic.open_float(nil, float_opts) + end + + vim.b.diagnostics_pos = cursor_pos + end, + }) + + -- The blow command will highlight the current variable and its usages in the buffer. + if client.server_capabilities.documentHighlightProvider then + vim.cmd([[ + hi! link LspReferenceRead Visual + hi! link LspReferenceText Visual + hi! link LspReferenceWrite Visual + ]]) + + local gid = api.nvim_create_augroup("lsp_document_highlight", { clear = true }) + api.nvim_create_autocmd("CursorHold" , { + group = gid, + buffer = bufnr, + callback = function () + lsp.buf.document_highlight() + end + }) + + api.nvim_create_autocmd("CursorMoved" , { + group = gid, + buffer = bufnr, + callback = function () + lsp.buf.clear_references() + end + }) + end + + if vim.g.logging_level == "debug" then + local msg = string.format("Language server %s started!", client.name) + vim.notify(msg, vim.log.levels.DEBUG, { title = "Nvim-config" }) + end +end + + +lspconfig.clangd.setup { + on_attach = custom_attach, + filetypes = { "c", "cpp", "cc" }, + flags = { + debounce_text_changes = 500, + }, +} diff --git a/.config/nvim/lua/plugins.lua b/.config/nvim/lua/plugins.lua new file mode 100644 index 0000000..88386d9 --- /dev/null +++ b/.config/nvim/lua/plugins.lua @@ -0,0 +1,14 @@ +require("utils").init_lazy() + +require("lazy").setup{ + require("configs.plugins.bufferline"), + require("configs.plugins.comment"), + require("configs.plugins.lastplace"), + require("configs.plugins.nvim-tree"), + require("configs.plugins.onedark"), + require("configs.plugins.airline"), + require("configs.plugins.langmapper"), + require("configs.plugins.devicons"), + require("configs.plugins.treesitter"), + require("configs.plugins.lspconfig"), +} diff --git a/.config/nvim/lua/utils.lua b/.config/nvim/lua/utils.lua new file mode 100644 index 0000000..2795535 --- /dev/null +++ b/.config/nvim/lua/utils.lua @@ -0,0 +1,33 @@ +local M = {} + +function M.init_lazy() + local lazypath = vim.fn.stdpath("data") .. "/lazy/lazy.nvim" + + if not vim.loop.fs_stat(lazypath) then + vim.fn.system({ + "git", + "clone", + "--filter=blob:none", + "https://github.com/folke/lazy.nvim.git", + "--branch=stable", + lazypath, + }) + end + + vim.opt.rtp:prepend(lazypath) +end + +function load_server(lspconfig, server) + server_name = server[1] + table.remove(server, 1) + lspconfig[server_name].setup(server) +end + +function M.load_servers(servers) + lspconfig = require("lspconfig") + for _, server in ipairs(servers) do + load_server(lspconfig, server) + end +end + +return M