local o = vim.opt local g = vim.g local a = vim.api g.mapleader = " " --------------- -- better ui -- --------------- o.number = true o.relativenumber = true o.numberwidth = 2 -- width o numberline o.signcolumn = 'yes:1' -- show gutter o.cursorline = true -- highlights the current line o.scrolloff = 5 -- # lines below/above cursor o.showmode = false -- stop vim from showing mode o.cmdheight = 2 -- vim command height o.mouse = "" -- no mouse o.wrap = true -- wrap lines o.linebreak = true -- fix where line is wraped o.emoji = false -- something to do with the spacing of emojis o.clipboard = 'unnamedplus' -- use system clipboard -- intenting & tabing o.expandtab = true o.smarttab = true o.cindent = true o.autoindent = true o.tabstop = 2 o.shiftwidth = 2 o.softtabstop = -1 -- If negative, shiftwidth value is used -- colors o.termguicolors = true vim.cmd('colorscheme jellybeans-nvim') -- diagnostics vim.diagnostic.config({ underline = true, virtual_text = { prefix = '*', }, }) local colors = { black = '#000000', black2 = '#161616', black3 = '#0E0E0E', black4 = '#101010', grey = '#1E1E1E', grey2 = '#404040', white = '#ffffff', red = '#E06C75', orange = '#EA936C', yellow = '#E5C07B', green = '#98C379', blue = '#61AFEF', purple = '#C678DD', } -- width line o.colorcolumn = { 80 } -- custom opts local copts = { tablines = 'colored', -- false, 'colored', and 'wrap' minimapcolor = colors.grey2, } ------------ -- saving -- ------------ o.swapfile = false o.undofile = true o.confirm = true ------------ -- search -- ------------ o.ignorecase = true o.smartcase = true o.wrapscan = true o.showmatch = true ---------------- -- wild menus -- ---------------- o.wildoptions = 'pum' o.pumblend = 3 o.pumheight = 20 o.wildignorecase = true o.wildignore = '*.o' ----------- -- netrw -- ----------- g.netrw_banner = 0 g.netrw_localcopydircmd = 'cp -r' g.netrw_winsize = 30 g.netrw_liststyle = 1 ------------------- -- auto commands -- ------------------- a.nvim_create_augroup('bufcheck', {clear = true}) -- highlight yanks a.nvim_create_autocmd('TextYankPost', { group = 'bufcheck', pattern = '*', callback = function() vim.highlight.on_yank{timeout = 250} end }) -- start terminal in insert mode a.nvim_create_autocmd('TermOpen', { group = 'bufcheck', pattern = '*', command = 'startinsert | set winfixheight' }) -- close terminal buffers after shell dies a.nvim_create_autocmd('TermClose', { group = 'bufcheck', pattern = 'term://*', command = 'call nvim_input("")' }) -- start git messages in insert mode a.nvim_create_autocmd('FileType', { group = 'bufcheck', pattern = { 'gitcommit', 'gitrebase', }, command = 'startinsert | 1' }) -- return to last place a.nvim_create_autocmd('BufRead', { pattern = '*', command = [[call setpos(".", getpos("'\""))]] }) -- disable color column in certain files a.nvim_create_autocmd('FileType', { pattern = { 'netrw', "help", "term", "gitcommit", "packer", "vim", "Trouble", "norg" }, command = 'set colorcolumn=0' }) -- disable intent markers in certain files a.nvim_create_autocmd('FileType', { pattern = { 'netrw', "help", "term", "gitcommit", "packer", "vim", "Trouble", "norg" }, command = 'IndentBlanklineDisable' }) -- source and compile lua conf when written local packer_group = a.nvim_create_augroup('Packer', { clear = true }) vim.api.nvim_create_autocmd('BufWritePost', { command = 'source | PackerCompile', group = packer_group, pattern = vim.fn.expand '$MYVIMRC', }) -- telescope preview opts a.nvim_create_autocmd('User', { pattern = 'TelescopePreviewerLoaded', command = 'setlocal number', }) -------------- -- keybinds -- -------------- local opts = { noremap = true, silent = true } -- greatest remap ever a.nvim_set_keymap("n", "p", "\"_dP", opts) -- esc to go to normal mode in term bufers a.nvim_set_keymap("t", "", "", opts) -- open term buffer a.nvim_set_keymap("n", "to", "vw:term", opts) -- open Trouble buffer a.nvim_set_keymap("n", "tt", ":TroubleToggle", opts) -- open file viewer a.nvim_set_keymap("n", "fo", ":Ex", opts) a.nvim_set_keymap("n", "fs", ":Sex", opts) -- clear search a.nvim_set_keymap("n", "", ":nohlsearch:echo", opts) -- move selected text a.nvim_set_keymap("v", "", ":m '>+1gv=gv", opts) a.nvim_set_keymap("v", "", ":m '<-2gv=gv", opts) -- keep cursor middle a.nvim_set_keymap("n", "", "mzJ`z", opts) -- when combining lines a.nvim_set_keymap("n", "n", "nzzzv", opts) -- searching a.nvim_set_keymap("n", "N", "Nzzzv", opts) a.nvim_set_keymap("n", "", "zz", opts) -- half page jumping a.nvim_set_keymap("n", "", "zz", opts) -- execute order 111 a.nvim_set_keymap("n", "x", "!chmod +x %", opts) -- resizing splits a.nvim_set_keymap("n", '', "SmartResizeLeft", opts) a.nvim_set_keymap("n", '', "SmartResizeDown", opts) a.nvim_set_keymap("n", '', "SmartResizeUp", opts) a.nvim_set_keymap("n", '', "SmartResizeRight", opts) -- don't blame me pls a.nvim_set_keymap("n", "", ":Gitsigns toggle_current_line_blame", opts ) -- telescope a.nvim_set_keymap('n', 'sf', 'Telescope find_files', opts) a.nvim_set_keymap('n', 'sg', 'Telescope git_commits', opts) a.nvim_set_keymap('n', 'sb', 'Telescope current_buffer_fuzzy_find', opts) a.nvim_set_keymap('n', 'so', 'Telescope oldfiles', opts) a.nvim_set_keymap('n', 'sc', 'Telescope neoclip unnamed', opts) a.nvim_set_keymap('n', 'su', 'Telescope undo', opts) -- auto comand keybinds -- add some keybinds to the file view a.nvim_create_autocmd('FileType', { pattern = 'netrw', callback = function() local bind = function(lhs, rhs) vim.keymap.set('n', lhs, rhs, {remap = true, buffer = true}) end bind('h', '-^') -- Go up a directory bind('l', '') -- Go down a directory / open a file bind('.', 'gh') -- Toggle dotfiles bind('P', 'z') -- Close preview window bind('', 'q') -- Close netrw end }) -- vbox note taking function _G.Toggle_venn() local venn_enabled = vim.inspect(vim.b.venn_enabled) if venn_enabled == "nil" then vim.b.venn_enabled = true vim.cmd[[setlocal ve=all]] -- draw a line on HJKL keystokes a.nvim_buf_set_keymap(0, "n", "J", "j:VBox", {noremap = true}) a.nvim_buf_set_keymap(0, "n", "K", "k:VBox", {noremap = true}) a.nvim_buf_set_keymap(0, "n", "L", "l:VBox", {noremap = true}) a.nvim_buf_set_keymap(0, "n", "H", "h:VBox", {noremap = true}) -- draw a box by pressing "f" with visual selection vim.api.nvim_buf_set_keymap(0, "v", "f", ":VBox", {noremap = true}) -- make easier to navigate o.cursorcolumn = true o.colorcolumn = { 0 } else vim.cmd[[setlocal ve=]] vim.cmd[[mapclear ]] vim.b.venn_enabled = nil o.cursorcolumn = false o.colorcolumn = { 80 } end end -- toggle keymappings for venn using v a.nvim_set_keymap('n', 'v', ":lua Toggle_venn()", { noremap = true}) ---------------- -- highlights -- ---------------- -- indent line colors a.nvim_set_hl(0, "IndentBlanklineIndent1", { fg = colors.red } ) a.nvim_set_hl(0, "IndentBlanklineIndent2", { fg = colors.orange } ) a.nvim_set_hl(0, "IndentBlanklineIndent3", { fg = colors.yellow } ) a.nvim_set_hl(0, "IndentBlanklineIndent4", { fg = colors.green } ) a.nvim_set_hl(0, "IndentBlanklineIndent5", { fg = colors.blue } ) a.nvim_set_hl(0, "IndentBlanklineIndent6", { fg = colors.purple } ) -- code window a.nvim_set_hl(0, 'CodewindowBorder', {fg = copts.minimapcolor}) a.nvim_set_hl(0, "ColorColumn", { bg = colors.grey }) -- color column a.nvim_set_hl(0, "Pmenu", { bg = colors.black2 }) a.nvim_set_hl(0, "PmenuSel", { bg = colors.grey2 }) a.nvim_set_hl(0, "CursorLineNr", { fg = colors.white, bold = true }) a.nvim_set_hl(0, "DiagnosticVirtualTextHint", { fg = "#ffffff", bg = "#1E1E1E" }) a.nvim_set_hl(0, "DiagnosticVirtualTextInfo", { fg = "#006fd8", bg = "#152f47" }) a.nvim_set_hl(0, "DiagnosticVirtualTextWarn", { fg = "#E9AD5A", bg = "#533221" }) a.nvim_set_hl(0, "DiagnosticVirtualTextError", { fg = "#ED3B44", bg = "#4b1313" }) -- cmp/treesitter stuff a.nvim_set_hl(0, "CmpItemMenu", { fg = colors.purple, italic = true }) a.nvim_set_hl(0, "CmpItemKindSnippet", { bg = "#A377BF", bold = true }) a.nvim_set_hl(0, "CmpItemKindText", { bg = "#63bc47", bold = true }) a.nvim_set_hl(0, "CmpItemKindField", { bg = "#db7093", bold = true }) a.nvim_set_hl(0, "CmpItemKindVariable", { bg = "#ff8c00", bold = true }) a.nvim_set_hl(0, "CmpItemKindEnum", { bg = "#FF5733", bold = true }) a.nvim_set_hl(0, "CmpItemKindFunction", { bg = "#483d8b", bold = true }) a.nvim_set_hl(0, "CmpItemKindKeyword", { bg = "#FF339C", bold = true }) a.nvim_set_hl(0, "CmpItemKindProperty", { bg = "#4FBF63", bold = true }) a.nvim_set_hl(0, "CmpItemKindInterface", { bg = "#1e90ff", bold = true }) a.nvim_set_hl(0, "CmpItemKindClass", { bg = "#4D4C5C", bold = true }) a.nvim_set_hl(0, "TreesitterContext", { bg = colors.grey }) -- telescope a.nvim_set_hl(0, "TelescopeMatching", { bg = colors.black3 }) a.nvim_set_hl(0, "TelescopeNormal", { bg = colors.black3 }) a.nvim_set_hl(0, "TelescopePreviewBorder", { bg = colors.black3 }) a.nvim_set_hl(0, "TelescopePreviewNormal", { bg = colors.black3 }) a.nvim_set_hl(0, "TelescopePreviewTitle", { bg = colors.black3, fg = colors.black3 }) a.nvim_set_hl(0, "TelescopePromptBorder", { bg = colors.black2 }) a.nvim_set_hl(0, "TelescopePromptNormal", { bg = colors.black2 }) a.nvim_set_hl(0, "TelescopePromptPrefix", { bg = colors.black2 }) a.nvim_set_hl(0, "TelescopePromptTitle", { bg = colors.black2, fg = colors.black2 }) a.nvim_set_hl(0, "TelescopeResultsBorder", { bg = colors.black4 }) a.nvim_set_hl(0, "TelescopeResultsNormal", { bg = colors.black4 }) a.nvim_set_hl(0, "TelescopeResultsTitle", { bg = colors.black4, fg = colors.black4 }) a.nvim_set_hl(0, "TelescopeSelection", { bg = colors.black2 }) a.nvim_set_hl(0, "TelescopeSelectionCaret", { bg = colors.black2, fg = colors.orange, bold = true }) ---------------------- -- plugin functions -- ---------------------- if copts.tablines == 'colored' then require("indent_blankline").setup { space_char_blankline = ' ', char_highlight_list = { 'IndentBlanklineIndent1', 'IndentBlanklineIndent2', 'IndentBlanklineIndent3', 'IndentBlanklineIndent4', 'IndentBlanklineIndent5', 'IndentBlanklineIndent6', }, } elseif copts.tablines == 'wrap' then o.list = true require('indent_blankline').setup { space_char_blankline = ' ', show_current_context = true, show_current_context_start = true, } else g.indent_blankline_char = ' ' end -- lua line local custom = require'lualine.themes.auto' custom.normal = { a = { fg = colors.black, bg = colors.blue, gui = 'bold' }, b = { fg = colors.black, bg = colors.blue, gui = 'bold' }, c = { fg = colors.white, bg = colors.grey }, x = {}, y = { fg = colors.blue, bg = colors.black2 }, z = { fg = colors.black2, bg = colors.blue, gui = 'bold' }, } custom.insert = { a = { fg = colors.black, bg = colors.green, gui = 'bold' }, b = { fg = colors.black, bg = colors.green, gui = 'bold' }, c = { fg = colors.white, bg = colors.grey }, x = {}, y = { fg = colors.green, bg = colors.black2 }, z = { fg = colors.black2, bg = colors.green, gui = 'bold' }, } custom.replace = { a = { fg = colors.black, bg = colors.orange, gui = 'bold' }, b = { fg = colors.black, bg = colors.orange, gui = 'bold' }, c = { fg = colors.white, bg = colors.grey }, x = {}, y = { fg = colors.orange, bg = colors.black2 }, z = { fg = colors.black2, bg = colors.orange, gui = 'bold' }, } custom.visual = { a = { fg = colors.black, bg = colors.purple, gui = 'bold' }, b = { fg = colors.black, bg = colors.purple, gui = 'bold' }, c = { fg = colors.white, bg = colors.grey }, x = {}, y = { fg = colors.purple, bg = colors.black2 }, z = { fg = colors.black2, bg = colors.purple, gui = 'bold' }, } custom.command = { a = { fg = colors.black, bg = colors.red, gui = 'bold' }, b = { fg = colors.black, bg = colors.red, gui = 'bold' }, c = { fg = colors.white, bg = colors.grey }, x = {}, y = { fg = colors.red, bg = colors.black2 }, z = { fg = colors.black2, bg = colors.red, gui = 'bold' }, } custom.terminal = { a = { fg = colors.black, bg = colors.yellow, gui = 'bold' }, b = { fg = colors.black, bg = colors.yellow, gui = 'bold' }, c = { fg = colors.white, bg = colors.grey }, x = {}, y = { fg = colors.yellow, bg = colors.black2 }, z = { fg = colors.black2, bg = colors.yellow, gui = 'bold' }, } custom.inactive = { a = { bg = colors.grey }, b = { bg = colors.grey }, c = { bg = colors.grey }, x = { bg = colors.grey }, y = { bg = colors.grey }, z = { bg = colors.grey }, } local function diff_source() local gitsigns = vim.b.gitsigns_status_dict if gitsigns then return { added = gitsigns.added, modified = gitsigns.changed, removed = gitsigns.removed } end end require('lualine').setup { options = { icons_enabled = false, component_separators = { left = '', right = '' }, section_separators = { left = '', right = '' }, theme = custom, always_divide_middle = false, globalstatus = false, refresh = { statusline = 100, tabline = 1000, winbar = 1000, } }, sections = { lualine_a = {'mode'}, lualine_b = { { 'filetype', color = { fg = colors.white, bg = colors.grey }, }, { 'filename', filestatus = true, path = 1, symbols = { modified = '[+]', readonly = '[=]', unnamed = 'No Name', newfile = '[New]', } } }, lualine_c = { { 'diff', source = diff_source } }, lualine_x = { { 'fileformat', color = { gui = 'bold' } } }, lualine_y = {'progress'}, lualine_z = { { 'location', padding = 1, } } }, inactive_sections = { lualine_x = {'location'}, }, } -- completion local has_words_before = function() unpack = unpack or table.unpack local line, col = unpack(a.nvim_win_get_cursor(0)) return col ~= 0 and a.nvim_buf_get_lines(0, line - 1, line, true) [1]:sub(col, col):match("%s") == nil end local cmp = require('cmp') local luasnip = require('luasnip') require("luasnip.loaders.from_vscode").lazy_load() cmp.setup { completion = { autocomplete = false, }, snippet = { expand = function(args) luasnip.lsp_expand(args.body) end, }, sources = cmp.config.sources({ { name = 'nvim_lsp', keyword_length = 3 }, { name = 'luasnip', keyword_length = 3 }, { name = 'path' }, { name = 'buffer', keyword_length = 3, max_item_count = 7 }, { name = 'calc' }, }), window = { completion = { winhighlight = "Normal:Pmenu,FloatBorder:Pmenu,Search:None", col_offset = -3, side_padding = 0, } }, formatting = { fields = { "kind", "abbr", "menu" }, format = function(entry, vim_item) local kind_icons = { Text = 'Tx', Snippet = '<>', Method = ' ', Function = '{}', Constructor = ' ', Field = '""', Variable = 'x=', Class = '~{', Interface = '.h', Module = ' ', Property = '@p', Unit = ' ', Value = ' ', Enum = 'E#', Keyword = '$1', Color = ' ', File = ' ', Reference = ' ', Folder = ' ', EnumMember = ' ', Constant = ' ', Struct = ' ', Event = ' ', Operator = ' ', TypeParameter = ' ', } local menu_items = { buffer = "buffer", nvim_lsp = "LSP", luasnip = "luasnip", nvim_lua = "lua", calc = "calc", } vim_item.kind = string.format(' %s ', kind_icons[vim_item.kind]) vim_item.menu = string.format(' (%s)', menu_items[entry.source.name]) return vim_item end }, mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_next_item() elseif luasnip.expand_or_jumpable() then luasnip.expand_or_jump() elseif has_words_before() then cmp.complete() else fallback() end end, { "i", "s" }), [""] = cmp.mapping(function(fallback) if cmp.visible() then cmp.select_prev_item() elseif luasnip.jumpable(-1) then luasnip.jump(-1) else fallback() end end, { "i", "s" }), [''] = cmp.mapping.confirm({ select = true }), [''] = cmp.mapping.close(), }), sorting = { comparators = { cmp.config.compare.offset, cmp.config.compare.exact, cmp.config.compare.score, require "cmp-under-comparator".under, cmp.config.compare.kind, cmp.config.compare.sort_text, cmp.config.compare.length, cmp.config.compare.order, }, }, enabled = function() local context = require 'cmp.config.context' if a.nvim_get_mode().mode == 'c' then return true else return not context.in_treesitter_capture("comment") and not context.in_syntax_group("Comment") end end } ------------- -- plugins -- ------------- -- install packer local ensure_packer = function() local fn = vim.fn local install_path = fn.stdpath('data')..'/site/pack/packer/start/packer.nvim' if fn.empty(fn.glob(install_path)) > 0 then fn.system({'git', 'clone', '--depth', '1', 'https://github.com/wbthomason/packer.nvim', install_path}) vim.cmd [[packadd packer.nvim]] return true end return false end local packer_bootstrap = ensure_packer() return require('packer').startup(function(use) -- I use the packer to manage the packer use 'wbthomason/packer.nvim' -- nice looking but useless use { 'metalelf0/jellybeans-nvim', requires = { 'rktjmp/lush.nvim' }, } use 'lukas-reineke/indent-blankline.nvim' use { 'gorbit99/codewindow.nvim', config = function() local codewindow = require('codewindow') codewindow.setup({ show_cursor = false, minimap_width = 15, window_border = 'single', exclude_filetypes = { "netrw", "help", "term", "gitcommit", "packer", "vim", "Trouble", }, }) codewindow.apply_default_keybinds() end, } use { 'melkster/modicator.nvim', require('modicator').setup({ show_warnings = true, highlights = { modes = { ['i'] = colors.green, ['v'] = colors.purple, ['V'] = colors.purple, ['�'] = colors.purple, ['s'] = colors.yellow, ['S'] = colors.yellow, ['R'] = colors.orange, ['c'] = colors.red, } } }) } -- useful use 'nvim-lualine/lualine.nvim' use { 'numToStr/Comment.nvim', config = function() require('Comment').setup() end } use 'jghauser/mkdir.nvim' use 'jbyuki/venn.nvim' use { 'nvim-neorg/neorg', tag = '*', ft = 'norg', run = ':Neorg sync-parsers', requires = 'nvim-lua/plenary.nvim', config = function() require('neorg').setup { load = { ['core.defaults'] = {}, ['core.norg.concealer'] = { config = { dim_code_blocks = { width = 'content', padding = { right = 2, }, }, folds = false, } }, ['core.norg.completion'] = { config = { engine = 'nvim-cmp', } }, } } end } use { 'folke/which-key.nvim', config = function() require("which-key").setup { icons = { breadcrumb = '>>', separator = '->', }, window = { winblend = 3, }, layout = { align = 'center', }, } end } use { 'nvim-telescope/telescope.nvim', tag = '0.1.x', requires = { 'nvim-lua/plenary.nvim', 'debugloop/telescope-undo.nvim', }, config = function() local telescope = require('telescope') local actions = require('telescope.actions') telescope.load_extension('undo') telescope.setup { defaults = { borderchars = { " ", " ", " ", " ", " ", " ", " ", " " }, sorting_strategy = 'ascending', layout_config = { height = 0.9, prompt_position = 'top', }, mappings = { i = { [''] = 'which_key', [''] = actions.move_selection_next, [''] = actions.move_selection_previous, [''] = actions.select_default, [''] = actions.preview_scrolling_up, [''] = actions.preview_scrolling_down, }, n = { ["gg"] = actions.move_to_top, ["G"] = actions.move_to_bottom, }, }, } } end } use { 'AckslD/nvim-neoclip.lua', config = function() require('neoclip').setup { keys = { telescope = { i = { paste_behind = ' ' } } } } end } use { 'mrjones2014/smart-splits.nvim', requires = { 'kwkarlwang/bufresize.nvim', config = function() require("bufresize").setup() end }, config = function() require('smart-splits').setup { resize_mode = { hooks = { on_leave = require('bufresize').register } } } end } -- gutter use { 'lewis6991/gitsigns.nvim', config = function() require('gitsigns').setup() end } use { 'chentoast/marks.nvim', config = function() require('marks').setup() end } -- syntax related use { 'nvim-treesitter/nvim-treesitter', config = function() require'nvim-treesitter.configs'.setup { ensure_installed = { "help", "c", "lua", }, highlight = { enable = true, additional_vim_regex_highlighting = false, }, } end, requires = { { 'nvim-treesitter/nvim-treesitter-context', config = function() require'treesitter-context'.setup { enable = true, max_lines = 1, patterns = { default = { 'function', }, }, } end }, } } use { 'nvchad/nvim-colorizer.lua', config = function() require('colorizer').setup { filetypes = { '*' }, user_default_options = { names = false, RRGGBBAA = true, AARRGGBB = true, }, } end } use { "folke/trouble.nvim", config = function() require("trouble").setup { icons = false, fold_open = "v", fold_closed = ">", signs = { error = "[x]", warning = "[!]", hint = "[?]", information = "[i]" }, } end } -- completion use { 'VonHeikemen/lsp-zero.nvim', config = function() local lsp = require('lsp-zero') lsp.set_preferences({ suggest_lsp_servers = true, setup_servers_on_start = true, set_lsp_keymaps = true, configure_diagnostics = true, cmp_capabilities = true, manage_nvim_cmp = false, call_servers = 'local', sign_icons = { error = 'x', warn = '!', hint = '?', info = 'i' } }) lsp.setup() end } use { 'hrsh7th/nvim-cmp', requires = { 'hrsh7th/cmp-buffer', 'hrsh7th/cmp-path', 'hrsh7th/cmp-calc', 'saadparwaiz1/cmp_luasnip', 'hrsh7th/cmp-nvim-lua', 'hrsh7th/cmp-nvim-lsp', 'lukas-reineke/cmp-under-comparator', { 'onsails/lspkind.nvim', config = function() require('lspkind').init() end }, } } -- snippets use { 'L3MON4D3/LuaSnip', tag = 'v1.*', requires = { 'rafamadriz/friendly-snippets', }, } use { 'doxnit/cmp-luasnip-choice', config = function() require('cmp_luasnip_choice').setup({ auto_open = true, }) end } -- lsp stuff use 'neovim/nvim-lspconfig' use 'williamboman/mason.nvim' use 'williamboman/mason-lspconfig.nvim' use { 'windwp/nvim-autopairs', config = function() require("nvim-autopairs").setup {} end } if packer_bootstrap then require('packer').sync() end end)