-- Enable line numbers vim.o.number = true -- Enable true color support if vim.fn.has("termguicolors") then vim.o.termguicolors = true end -- Set the indentation rules vim.o.tabstop = 4 vim.o.shiftwidth = 4 vim.o.expandtab = true -- Enable syntax highlighting vim.cmd [[packadd packer.nvim]] -- Use a protected call to avoid errors on first use local status_ok, packer = pcall(require, "packer") if not status_ok then print("Packer not found!") return end -- Initialize the plugins packer.init({ display = { open_fn = function() return require('packer.util').float({ border = 'single' }) end, }, }) -- Specify the plugins packer.startup(function(use) -- Packer can manage itself use 'wbthomason/packer.nvim' -- File icons use 'kyazdani42/nvim-web-devicons' -- Gruvbox theme use { 'morhetz/gruvbox', config = function() vim.cmd 'colorscheme gruvbox' end } -- Commenting use { 'numToStr/Comment.nvim', config = function() require('Comment').setup() end } -- Status line use { 'nvim-lualine/lualine.nvim', requires = {'kyazdani42/nvim-web-devicons', opt = true}, config = function() require('lualine').setup { options = { icons_enabled = true, theme = 'gruvbox', component_separators = '|', section_separators = '', }, sections = { lualine_a = {'mode'}, lualine_b = {'branch', 'diff', {'diagnostics', sources={'nvim_lsp', 'coc'}}}, lualine_c = {'filename'}, lualine_x = {'encoding', 'fileformat', 'filetype'}, lualine_y = {'progress'}, lualine_z = {'location'} }, inactive_sections = { lualine_a = {}, lualine_b = {}, lualine_c = {'filename'}, lualine_x = {'location'}, }, tabline = {}, extensions = {} } end } -- Markdown preview use {'iamcco/markdown-preview.nvim'} -- Vimwiki use { 'vimwiki/vimwiki', config = function() vim.g.vimwiki_list = {{ path = '~/vimwiki/', syntax = 'markdown', ext = '.md', diary_rel_path = 'diary/' }} end } -- Gitsigns use { 'lewis6991/gitsigns.nvim', requires = { 'nvim-lua/plenary.nvim' }, config = function() require('gitsigns').setup() end } -- Which-key use { 'folke/which-key.nvim', config = function() require('which-key').setup() end } -- nvim-cmp for autocompletion use 'hrsh7th/nvim-cmp' -- Completion framework use 'hrsh7th/cmp-nvim-lsp' -- LSP completion source use 'hrsh7th/cmp-buffer' -- Buffer completion source use 'hrsh7th/cmp-path' -- Path completion source use 'hrsh7th/cmp-cmdline' -- Command line completion source use 'saadparwaiz1/cmp_luasnip' -- Snippet completion source use 'L3MON4D3/LuaSnip' -- Snippet engine -- LSP support use 'neovim/nvim-lspconfig' -- Collection of configurations for built-in LSP client -- File explorer use { 'kyazdani42/nvim-tree.lua', requires = 'kyazdani42/nvim-web-devicons', config = function() require'nvim-tree'.setup {} end } -- Fuzzy finder use { 'nvim-telescope/telescope.nvim', requires = { {'nvim-lua/plenary.nvim'} }, config = function() require'telescope'.setup {} end } -- Treesitter use { 'nvim-treesitter/nvim-treesitter', run = ':TSUpdate', config = function() require'nvim-treesitter.configs'.setup { highlight = { enable = true, }, incremental_selection = { enable = true, }, textobjects = { select = { enable = true, }, }, } end } -- Auto-pairs use { 'windwp/nvim-autopairs', config = function() require'nvim-autopairs'.setup {} end } end) -- LSP settings local lspconfig = require('lspconfig') local on_attach = function(client, bufnr) local function buf_set_keymap(...) vim.api.nvim_buf_set_keymap(bufnr, ...) end local function buf_set_option(...) vim.api.nvim_buf_set_option(bufnr, ...) end buf_set_option('omnifunc', 'v:lua.vim.lsp.omnifunc') local opts = { noremap=true, silent=true } buf_set_keymap('n', 'gD', 'lua vim.lsp.buf.declaration()', opts) buf_set_keymap('n', 'gd', 'lua vim.lsp.buf.definition()', opts) buf_set_keymap('n', 'K', 'lua vim.lsp.buf.hover()', opts) buf_set_keymap('n', 'gi', 'lua vim.lsp.buf.implementation()', opts) buf_set_keymap('n', '', 'lua vim.lsp.buf.signature_help()', opts) buf_set_keymap('n', 'wa', 'lua vim.lsp.buf.add_workspace_folder()', opts) buf_set_keymap('n', 'wr', 'lua vim.lsp.buf.remove_workspace_folder()', opts) buf_set_keymap('n', 'wl', 'lua print(vim.inspect(vim.lsp.buf.list_workspace_folders()))', opts) buf_set_keymap('n', 'D', 'lua vim.lsp.buf.type_definition()', opts) buf_set_keymap('n', 'rn', 'lua vim.lsp.buf.rename()', opts) buf_set_keymap('n', 'ca', 'lua vim.lsp.buf.code_action()', opts) buf_set_keymap('n', 'gr', 'lua vim.lsp.buf.references()', opts) buf_set_keymap('n', 'e', 'lua vim.lsp.diagnostic.show_line_diagnostics()', opts) buf_set_keymap('n', '[d', 'lua vim.lsp.diagnostic.goto_prev()', opts) buf_set_keymap('n', ']d', 'lua vim.lsp.diagnostic.goto_next()', opts) buf_set_keymap('n', 'q', 'lua vim.lsp.diagnostic.set_loclist()', opts) buf_set_keymap('n', 'f', 'lua vim.lsp.buf.formatting()', opts) end -- Enable the following language servers local servers = { 'pyright', 'tsserver', 'gopls', 'rust_analyzer' } for _, lsp in ipairs(servers) do lspconfig[lsp].setup { on_attach = on_attach, } end -- nvim-cmp setup local cmp = require'cmp' cmp.setup({ snippet = { expand = function(args) require'luasnip'.lsp_expand(args.body) end, }, mapping = { [''] = cmp.mapping.scroll_docs(-4), [''] = cmp.mapping.scroll_docs(4), [''] = cmp.mapping.complete(), [''] = cmp.mapping.close(), [''] = cmp.mapping.confirm({ behavior = cmp.ConfirmBehavior.Replace, select = true, }), }, sources = { { name = 'nvim_lsp' }, { name = 'luasnip' }, { name = 'buffer' }, { name = 'path' }, } }) -- Keybindings for custom functions function SearchWikipedia() local query = vim.fn.input('Wikipedia Search: ') query = vim.fn.shellescape(query) local search_url = "https://en.wikipedia.org/wiki/Special:Search?search=" .. query vim.cmd('silent !xdg-open ' .. search_url) end vim.api.nvim_set_keymap('n', 'w', ':lua SearchWikipedia()', {noremap = true, silent = true})