Last active
August 9, 2023 03:52
-
-
Save khvorov45/abcf282946c980eb043a2105959524dc to your computer and use it in GitHub Desktop.
neovim config
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| vim.g.mapleader = " " | |
| vim.g.maplocalleader = " " | |
| 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", -- latest stable release | |
| lazypath, | |
| }) | |
| end | |
| vim.opt.rtp:prepend(lazypath) | |
| require('lazy').setup({ | |
| 'tpope/vim-sleuth', | |
| { | |
| "folke/which-key.nvim", | |
| event = "VeryLazy", | |
| init = function() | |
| vim.o.timeout = true | |
| vim.o.timeoutlen = 300 | |
| end, | |
| opts = {} | |
| }, | |
| { | |
| "folke/which-key.nvim", | |
| event = "VeryLazy", | |
| init = function() | |
| vim.o.timeout = true | |
| vim.o.timeoutlen = 300 | |
| end, | |
| }, | |
| { | |
| 'rose-pine/neovim', | |
| name = 'rose-pine', | |
| opts = { | |
| disable_italics = true, | |
| }, | |
| config = function(_, opts) | |
| require('rose-pine').setup(opts) | |
| vim.cmd.colorscheme 'rose-pine' | |
| end, | |
| }, | |
| { | |
| 'lukas-reineke/indent-blankline.nvim', | |
| opts = { | |
| char = '┊', | |
| show_trailing_blankline_indent = false, | |
| }, | |
| }, | |
| { | |
| 'nvim-treesitter/nvim-treesitter', | |
| dependencies = { | |
| 'nvim-treesitter/nvim-treesitter-textobjects', | |
| }, | |
| build = ':TSUpdate', | |
| }, | |
| { | |
| 'nvim-telescope/telescope.nvim', | |
| branch = '0.1.x', | |
| dependencies = { | |
| 'nvim-lua/plenary.nvim', | |
| } | |
| }, | |
| { | |
| 'nvim-telescope/telescope-fzf-native.nvim', | |
| build = | |
| 'cmake -S. -Bbuild -DCMAKE_BUILD_TYPE=Release && cmake --build build --config Release && cmake --install build --prefix build' | |
| }, | |
| { 'numToStr/Comment.nvim', opts = {} }, | |
| { | |
| "skywind3000/asynctasks.vim", | |
| dependencies = { | |
| "skywind3000/asyncrun.vim", | |
| }, | |
| }, | |
| { | |
| 'neovim/nvim-lspconfig', | |
| dependencies = { | |
| { 'williamboman/mason.nvim', config = true }, | |
| 'williamboman/mason-lspconfig.nvim', | |
| 'folke/neodev.nvim', | |
| }, | |
| }, | |
| { | |
| 'hrsh7th/nvim-cmp', | |
| dependencies = { | |
| 'hrsh7th/cmp-nvim-lsp', | |
| }, | |
| }, | |
| {'jalvesaq/Nvim-R'}, | |
| {'jalvesaq/cmp-nvim-r'}, | |
| {'tpope/vim-fugitive'}, | |
| { | |
| -- Adds git related signs to the gutter, as well as utilities for managing changes | |
| 'lewis6991/gitsigns.nvim', | |
| opts = { | |
| -- See `:help gitsigns.txt` | |
| signs = { | |
| add = { text = '+' }, | |
| change = { text = '~' }, | |
| delete = { text = '_' }, | |
| topdelete = { text = '‾' }, | |
| changedelete = { text = '~' }, | |
| }, | |
| on_attach = function(bufnr) | |
| vim.keymap.set('n', '<leader>gp', require('gitsigns').prev_hunk, { buffer = bufnr, desc = '[G]o to [P]revious Hunk' }) | |
| vim.keymap.set('n', '<leader>gn', require('gitsigns').next_hunk, { buffer = bufnr, desc = '[G]o to [N]ext Hunk' }) | |
| vim.keymap.set('n', '<leader>ph', require('gitsigns').preview_hunk, { buffer = bufnr, desc = '[P]review [H]unk' }) | |
| end, | |
| }, | |
| }, | |
| 'phaazon/hop.nvim', | |
| }) | |
| require('telescope').load_extension('fzf') | |
| vim.o.hlsearch = false | |
| vim.o.number = true | |
| vim.o.relativenumber = true | |
| vim.o.clipboard = 'unnamedplus' | |
| vim.o.breakindent = true | |
| vim.o.undofile = true | |
| vim.o.ignorecase = true | |
| vim.o.smartcase = true | |
| vim.o.signcolumn = 'yes' | |
| vim.o.updatetime = 250 | |
| vim.o.timeoutlen = 300 | |
| vim.o.completeopt = 'menuone,noselect' | |
| vim.o.termguicolors = true | |
| vim.g.netrw_liststyle = 3 | |
| vim.g.splitbelow = false | |
| vim.g.splitright = true | |
| vim.g.R_nvim_wd = 1 | |
| vim.g.R_assign = 0 | |
| vim.g.Rout_more_colors = 1 | |
| vim.wo.wrap = false | |
| vim.keymap.set({ 'n', 'v' }, '<Space>', '<Nop>', { silent = true }) | |
| vim.keymap.set('n', '<leader>?', require('telescope.builtin').oldfiles, { desc = '[?] Find recently opened files' }) | |
| vim.keymap.set('n', '<leader><space>', require('telescope.builtin').buffers, { desc = '[ ] Find existing buffers' }) | |
| vim.keymap.set('n', '<leader>/', function() | |
| require('telescope.builtin').current_buffer_fuzzy_find(require('telescope.themes').get_dropdown { | |
| winblend = 10, | |
| previewer = true, | |
| }) | |
| end, { desc = '[/] Fuzzily search in current buffer' }) | |
| vim.keymap.set('n', '<leader>gf', require('telescope.builtin').git_files, { desc = 'Search [G]it [F]iles' }) | |
| vim.keymap.set('n', '<leader>sf', function() | |
| require('telescope.builtin').find_files({ hidden = true, no_ignore = true, no_ignore_parent = true }) | |
| end, { desc = '[S]earch [F]iles' }) | |
| vim.keymap.set('n', '<leader>sh', require('telescope.builtin').help_tags, { desc = '[S]earch [H]elp' }) | |
| vim.keymap.set('n', '<leader>sw', require('telescope.builtin').grep_string, { desc = '[S]earch current [W]ord' }) | |
| vim.keymap.set('n', '<leader>sg', require('telescope.builtin').live_grep, { desc = '[S]earch by [G]rep' }) | |
| vim.keymap.set('n', '<leader>sd', require('telescope.builtin').diagnostics, { desc = '[S]earch [D]iagnostics' }) | |
| vim.keymap.set("n", "<leader>xx", function() require("trouble").open() end) | |
| vim.keymap.set("n", "<leader>xl", function() require("trouble").open("quickfix") end) | |
| vim.keymap.set('n', '<leader>b', function() | |
| vim.cmd('AsyncTask build') | |
| vim.cmd('copen') | |
| end, { desc = "run '[b]uild' task" }) | |
| vim.keymap.set('n', ']e', ':cnext<CR>') | |
| vim.keymap.set('n', '[e', ':cprev<CR>') | |
| vim.keymap.set('n', '[d', vim.diagnostic.goto_prev, { desc = 'Go to previous diagnostic message' }) | |
| vim.keymap.set('n', ']d', vim.diagnostic.goto_next, { desc = 'Go to next diagnostic message' }) | |
| vim.keymap.set('n', '<leader>f', vim.lsp.buf.format, { desc = "[F]ormat" }) | |
| vim.keymap.set('n', '<leader>wt', [[:%s/\s\+$//e<cr>]], {desc = "[W]hitespace [T]rim"}) | |
| local hop = require('hop') | |
| hop.setup() | |
| local directions = require('hop.hint').HintDirection | |
| vim.keymap.set('', 'f', function() | |
| hop.hint_char1({ direction = directions.AFTER_CURSOR, current_line_only = true }) | |
| end, {remap=true}) | |
| vim.keymap.set('', 'F', function() | |
| hop.hint_char1({ direction = directions.BEFORE_CURSOR, current_line_only = true }) | |
| end, {remap=true}) | |
| vim.keymap.set('', 't', function() | |
| hop.hint_char1({ direction = directions.AFTER_CURSOR, current_line_only = true, hint_offset = -1 }) | |
| end, {remap=true}) | |
| vim.keymap.set('', 'T', function() | |
| hop.hint_char1({ direction = directions.BEFORE_CURSOR, current_line_only = true, hint_offset = 1 }) | |
| end, {remap=true}) | |
| vim.keymap.set('', 'W', function() | |
| hop.hint_words({}) | |
| end, {remap=true}) | |
| require('nvim-treesitter.configs').setup { | |
| ensure_installed = { 'lua', 'd' }, | |
| auto_install = false, | |
| highlight = { enable = true }, | |
| indent = { enable = true }, | |
| textobjects = { | |
| select = { | |
| enable = true, | |
| lookahead = true, | |
| keymaps = { | |
| ['aa'] = '@parameter.outer', | |
| ['ia'] = '@parameter.inner', | |
| ['af'] = '@function.outer', | |
| ['if'] = '@function.inner', | |
| }, | |
| }, | |
| move = { | |
| enable = true, | |
| set_jumps = true, | |
| goto_next_start = { | |
| [']m'] = '@function.outer', | |
| }, | |
| goto_next_end = { | |
| [']M'] = '@function.outer', | |
| }, | |
| goto_previous_start = { | |
| ['[m'] = '@function.outer', | |
| }, | |
| goto_previous_end = { | |
| ['[M'] = '@function.outer', | |
| }, | |
| }, | |
| }, | |
| } | |
| local on_attach = function(_, bufnr) | |
| local nmap = function(keys, func, desc) | |
| if desc then | |
| desc = 'LSP: ' .. desc | |
| end | |
| vim.keymap.set('n', keys, func, { buffer = bufnr, desc = desc }) | |
| end | |
| nmap('<leader>rn', vim.lsp.buf.rename, '[R]e[n]ame') | |
| nmap('<leader>ca', vim.lsp.buf.code_action, '[C]ode [A]ction') | |
| nmap('gd', vim.lsp.buf.definition, '[G]oto [D]efinition') | |
| nmap('gr', require('telescope.builtin').lsp_references, '[G]oto [R]eferences') | |
| nmap('gI', vim.lsp.buf.implementation, '[G]oto [I]mplementation') | |
| nmap('<leader>D', vim.lsp.buf.type_definition, 'Type [D]efinition') | |
| nmap('<leader>ds', require('telescope.builtin').lsp_document_symbols, '[D]ocument [S]ymbols') | |
| nmap('<leader>ws', require('telescope.builtin').lsp_dynamic_workspace_symbols, '[W]orkspace [S]ymbols') | |
| nmap('K', vim.lsp.buf.hover, 'Hover Documentation') | |
| nmap('<C-k>', vim.lsp.buf.signature_help, 'Signature Documentation') | |
| nmap('gD', vim.lsp.buf.declaration, '[G]oto [D]eclaration') | |
| vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_) | |
| vim.lsp.buf.format() | |
| end, { desc = 'Format current buffer with LSP' }) | |
| end | |
| local servers = { | |
| -- clangd = {}, | |
| -- gopls = {}, | |
| -- pyright = {}, | |
| -- rust_analyzer = {}, | |
| -- tsserver = {}, | |
| -- html = { filetypes = { 'html', 'twig', 'hbs'} }, | |
| lua_ls = { | |
| Lua = { | |
| workspace = { checkThirdParty = false }, | |
| telemetry = { enable = false }, | |
| }, | |
| }, | |
| } | |
| require('neodev').setup() | |
| local capabilities = vim.lsp.protocol.make_client_capabilities() | |
| capabilities = require('cmp_nvim_lsp').default_capabilities(capabilities) | |
| local mason_lspconfig = require 'mason-lspconfig' | |
| mason_lspconfig.setup { | |
| ensure_installed = vim.tbl_keys(servers), | |
| } | |
| mason_lspconfig.setup_handlers { | |
| function(server_name) | |
| require('lspconfig')[server_name].setup { | |
| capabilities = capabilities, | |
| on_attach = on_attach, | |
| settings = servers[server_name], | |
| filetypes = (servers[server_name] or {}).filetypes, | |
| } | |
| end | |
| } | |
| local cmp = require 'cmp' | |
| cmp.setup { | |
| mapping = cmp.mapping.preset.insert { | |
| ['<Tab>'] = cmp.mapping(function(fallback) | |
| if cmp.visible() then | |
| cmp.select_next_item() | |
| else | |
| fallback() | |
| end | |
| end, { 'i', 's' }), | |
| ['<S-Tab>'] = cmp.mapping(function(fallback) | |
| if cmp.visible() then | |
| cmp.select_prev_item() | |
| else | |
| fallback() | |
| end | |
| end, { 'i', 's' }), | |
| }, | |
| sources = { | |
| { name = 'nvim_lsp' }, | |
| { name = 'cmp_nvim_r' }, | |
| }, | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment