diff options
-rw-r--r-- | programs/neovim/config.nix | 94 | ||||
-rw-r--r-- | programs/neovim/default.nix | 595 | ||||
-rw-r--r-- | programs/neovim/init.lua | 359 |
3 files changed, 515 insertions, 533 deletions
diff --git a/programs/neovim/config.nix b/programs/neovim/config.nix new file mode 100644 index 0000000..ae10243 --- /dev/null +++ b/programs/neovim/config.nix @@ -0,0 +1,94 @@ +{ + config, + inputs, +}: +inputs.self.lib.lua.fmt { + # Width of tabs in the editor + tabwidth = 4; + # If tabs should be expanded to spaces + expandtab = false; + keys = { + # NeoVIM leader key + leader = " "; + # Keybind to remove active hilighted content + noh = "<leader>h"; + menus = { + # Open file browser + browser = "<leader>e"; + # Show active buffers + buffers = "<leader>fb"; + # Show LSP errors + error = "<leader>t"; + # Find files in working directory + find = "<leader>ff"; + # Grep files in working directory + grep = "<leader>fg"; + # Search help menu + help = "<leader>fh"; + # Voew undo tree + undo = "<leader>u"; + }; + lsp = { + # Open LSP hover menu on a value + hover = "K"; + # Perform an LSP action on a value + action = "<leader>la"; + # View all references of a value + references = "<leader>lr"; + # Rename current and all references of a value + rename = "<leader>ln"; + }; + cmp = { + # Select previous value in completion engine + prev = "<C-p>"; + # Select next value in completion engine + next = "<C-n>"; + # Confirm current value in completion engine + confirm = "<CR>"; + # Auto complete using completion engine + complete = "<C-space>"; + }; + }; + # list of lsp servers to load + lsps = { + clangd = {}; + jdtls = {}; + kotlin_language_server = {}; + phpactor = {}; + rust_analyzer = {}; + ts_ls = {}; + zls = {}; + }; + highlight = { + # max file size in KiB to attempt to parse + max_size = 1024; + }; + # colorscheme + theme = { + colors = { + base00 = "#${config.theme.colors.bg}"; + base01 = "#${config.theme.colors.surface.bg}"; + base02 = "#${config.theme.colors.surface.bg}"; + base03 = "#${config.theme.colors.bright.white}"; + base04 = "#${config.theme.colors.bright.black}"; + base05 = "#${config.theme.colors.fg}"; + base06 = "#${config.theme.colors.bright.white}"; + base07 = "#${config.theme.colors.hover.bg}"; + base08 = "#${config.theme.colors.bright.red}"; + base09 = "#${config.theme.colors.bright.yellow}"; + base0A = "#${config.theme.colors.bright.yellow}"; + base0B = "#${config.theme.colors.bright.green}"; + base0C = "#${config.theme.colors.bright.cyan}"; + base0D = "#${config.theme.colors.bright.blue}"; + base0E = "#${config.theme.colors.bright.magenta}"; + base0F = "#${config.theme.colors.normal.yellow}"; + }; + transparent = true; + }; + # max column width + col = { + # show a bar at `width` characters + show = true; + width = 80; + }; +} diff --git a/programs/neovim/default.nix b/programs/neovim/default.nix index fcea6fe..c1ed000 100644 --- a/programs/neovim/default.nix +++ b/programs/neovim/default.nix @@ -1,545 +1,74 @@ { + inputs, config, lib, pkgs, ... -}: -with lib; { - options = { - neovim = { - tabWidth = mkOption { - type = types.int; - description = "Width of tabes in the editor."; - default = 4; - }; - expandTab = mkOption { - type = types.bool; - description = "If tabs should be expanded to spaces."; - default = false; - }; +}: let + lua_cfg = import ./config.nix {inherit config inputs;}; + lua = builtins.readFile ./init.lua; +in { + environment.variables.EDITOR = "nvim"; - keys = { - leader = mkOption { - type = types.str; - description = "NeoVIM leader key"; - default = " "; - }; - noh = mkOption { - type = types.str; - description = "Keybind to remove active hilighted content."; - default = "<leader>h"; - }; + home-manager.users.${config.user} = { + programs.neovim = { + enable = true; + viAlias = true; + vimAlias = true; - menus = { - # file browser - browser = mkOption { - type = types.str; - description = "Keybind to open file browser."; - default = "<leader>e"; - }; - # active buffers - buffers = mkOption { - type = types.str; - description = "Keybind to show active buffers."; - default = "<leader>fb"; - }; - # error list - error = mkOption { - type = types.str; - description = "Keybind to show LSP errors."; - default = "<leader>t"; - }; - # find files - find = mkOption { - type = types.str; - description = "Keybind to search files in working directory."; - default = "<leader>ff"; - }; - # grep files - grep = mkOption { - type = types.str; - description = "Keybind to grep files in working directory."; - default = "<leader>fg"; - }; - # help menu - help = mkOption { - type = types.str; - description = "Keybind to search help menus."; - default = "<leader>fh"; - }; - # undo tree - undo = mkOption { - type = types.str; - description = "Keybind to view undo tree."; - default = "<leader>u"; - }; - }; + extraLuaConfig = '' + local config = ${lua_cfg} - # lsp actions - lsp = { - hover = mkOption { - type = types.str; - description = "Keybind to open LSP hover menu on a value."; - default = "K"; - }; - action = mkOption { - type = types.str; - description = "Keybind to perform an LSP action on a value."; - default = "<leader>la"; - }; - references = mkOption { - type = types.str; - description = "Keybind to view all references of a value."; - default = "<leader>lr"; - }; - rename = mkOption { - type = types.str; - description = "Keybind to rename currrent and all references of a value."; - default = "<leader>ln"; - }; - }; + ${lua} + ''; - # completion - cmp = { - prev = mkOption { - type = types.str; - description = "Keybind to select previous value in completion engine."; - default = "<C-p>"; - }; - next = mkOption { - type = types.str; - description = "Keybind to select next value in completion engine."; - default = "<C-n>"; - }; - confirm = mkOption { - type = types.str; - description = "Keybind to confirm current value in completion engine."; - default = "<CR>"; - }; - complete = mkOption { - type = types.str; - description = "Keybind to auto complete using completion engine."; - default = "<C-space>"; - }; - }; - }; - - # active lsp servers - lsps = mkOption { - type = with types; listOf str; - description = "List of lsp servers to load"; - default = ["clangd" "zls" "rust_analyzer" "jdtls" "kotlin_language_server"]; - }; - }; - }; - - config = { - environment.variables.EDITOR = "nvim"; - - home-manager.users.${config.user} = { - programs.neovim = { - enable = true; - viAlias = true; - vimAlias = true; - extraLuaConfig = '' - - --[[ VIM ]]-- - - vim.opt.tabstop = ${toString config.neovim.tabWidth} - vim.opt.softtabstop = ${toString config.neovim.tabWidth} - vim.opt.shiftwidth = ${toString config.neovim.tabWidth} - vim.opt.expandtab = ${boolToString config.neovim.expandTab} - vim.opt.mouse = "a" - vim.opt.clipboard = "unnamedplus" - vim.opt.hlsearch = true - vim.opt.autoindent = true - vim.opt.ttyfast = true - vim.opt.number = true - vim.opt.relativenumber = true - vim.opt.rnu = true - vim.opt.swapfile = false - vim.opt.fillchars = { eob = " "} - - - --[[ BUF ]]-- - - -- remove trailing whitespace on save - vim.api.nvim_create_autocmd({ "BufWritePre" }, { - pattern = { "*" }, - command = [[%s/\s\+$//e]], - }) - - --[[ KEYBINDS ]]-- - - -- leader - - vim.g.mapleader = "${config.neovim.keys.leader}" - vim.g.maplocalleader = "${config.neovim.keys.leader}" - vim.keymap.set("", '<leader>', '<Nop>', { noremap = true, silent = true }) - - -- bind helper function - - local function bind(key, action, opts) - opts = opts or {} - vim.keymap.set('n', key, action, opts) - end - - -- lsp - - bind("${config.neovim.keys.noh}", vim.cmd.noh) - - vim.api.nvim_create_autocmd('LspAttach', { - desc = 'LSP actions', - callback = function(event) - local opts = {buffer = event.buf} - bind("${config.neovim.keys.lsp.hover}", function() vim.lsp.buf.hover() end, opts) - bind("${config.neovim.keys.lsp.action}", function() vim.lsp.buf.code_action() end, opts) - bind("${config.neovim.keys.lsp.references}", function() vim.lsp.buf.references() end, opts) - bind("${config.neovim.keys.lsp.rename}", function() vim.lsp.buf.rename() end, opts) - end - }) - - ''; - - plugins = with pkgs.vimPlugins; [ - # Dependencies - vim-devicons - nvim-web-devicons - plenary-nvim - # Colorscheme - { - plugin = base16-nvim; - type = "lua"; - config = '' - vim.opt.termguicolors = true - vim.g.base16_transparent_background = 1 - - local colorscheme = require('base16-colorscheme') - colorscheme.setup({ - base00 = '#${config.theme.colors.bg}', - base01 = '#${config.theme.colors.surface.bg}', - base02 = '#${config.theme.colors.surface.bg}', - base03 = '#${config.theme.colors.bright.white}', - base04 = '#${config.theme.colors.bright.black}', - base05 = '#${config.theme.colors.fg}', - base06 = '#${config.theme.colors.bright.white}', - base07 = '#${config.theme.colors.hover.bg}', - base08 = '#${config.theme.colors.bright.red}', - base09 = '#${config.theme.colors.bright.yellow}', - base0A = '#${config.theme.colors.bright.yellow}', - base0B = '#${config.theme.colors.bright.green}', - base0C = '#${config.theme.colors.bright.cyan}', - base0D = '#${config.theme.colors.bright.blue}', - base0E = '#${config.theme.colors.bright.magenta}', - base0F = '#${config.theme.colors.normal.yellow}', - }) - - -- make transparent background - local colors = { - -- Text - "Normal", "NormalNC", "NormalFloat", - -- Line Numbers - "LineNr", "EndOfBuffer", "SignColumn", - -- Floating - "FloatBorder", - -- Mode/Buffer Lines - "TabLine", "TabLineFill", "StatusLine", - }; - for _,color in pairs(colors) do - vim.api.nvim_set_hl(0, color, { bg = "none" }); - end - -- identifiers should not be colored - vim.api.nvim_set_hl(0, "Identifier", { fg = "#${config.theme.colors.fg}" }) - vim.api.nvim_set_hl(0, "TSVariable", { fg = "#${config.theme.colors.fg}" }) - -- macro should be colored as a keyword - vim.api.nvim_set_hl(0, "TSFuncMacro", { fg = "#${config.theme.colors.bright.magenta}" }) - ''; - } - # Mode line - { - plugin = lualine-nvim; - type = "lua"; - config = '' - local lualine_theme = require('lualine.themes.base16') - lualine_theme.normal.c = { fg = "#${config.theme.colors.fg}" } - - require('lualine').setup { - options = { - theme = lualine_theme, - icons_enabled = true, - globalstatus = true, - }, - }; - ''; - } - # Buffer line - { - plugin = bufferline-nvim; - type = "lua"; - config = '' - require('bufferline').setup {} - ''; - } - # File browser - { - plugin = nvim-tree-lua; - type = "lua"; - config = '' - vim.g.loaded_netrw = 1 - vim.g.loaded_netrwPlugin = 1 - - require('nvim-tree').setup { - sort = { - sorter = "case_sensitive", - }, - view = { - centralize_selection = true, - signcolumn = "yes", - float = { - enable = true, - quit_on_focus_loss = true, - open_win_config = { - relative = "editor", - border = "rounded", - width = 80, - height = 30, - row = 1, - col = 1, - }, - }; - }, - renderer = { - group_empty = true, - }, - actions = { - use_system_clipboard = true, - change_dir = { - enable = true, - global = false, - restrict_above_cwd = false, - }, - expand_all = { - max_folder_discovery = 300, - exclude = {}, - }, - file_popup = { - open_win_config = { - col = 1, - row = 1, - relative = "cursor", - border = "shadow", - style = "minimal", - }, - }, - open_file = { - quit_on_open = true, - window_picker = { - enable = false, - picker = "default", - chars = "abcdefghijklmnopqrstuvwxyz1234567890", - exclude = { - filetype = { "notify", "lazy", "qf", "diff", "fugitive", "fugitiveblame" }, - buftype = { "nofile", "terminal", "help" }, - }, - } - }, - remove_file = { - close_window = true, - }, - }, - filters = { - dotfiles = false, - }, - tab = { - sync = { - open = false, - close = false, - ignore = {}, - }, - }, - git = { - enable = false, - }, - update_cwd = true, - respect_buf_cwd = true, - update_focused_file = { - enable = true, - update_cwd = true - }, - }; - - bind("${config.neovim.keys.menus.browser}", vim.cmd.NvimTreeToggle) - ''; - } - # Undo tree - { - plugin = undotree; - type = "lua"; - config = '' - bind("${config.neovim.keys.menus.undo}", vim.cmd.UndotreeToggle) - ''; - } - # Trouble (error menu) - { - plugin = trouble-nvim; - type = "lua"; - config = '' - bind("${config.neovim.keys.menus.error}", function() require('trouble').toggle() end) - ''; - } - # Telescope (buffers/find/grep/help) - { - plugin = telescope-nvim; - type = "lua"; - config = '' - local telescope = require('telescope.builtin') - bind("${config.neovim.keys.menus.buffers}", telescope.buffers) - bind("${config.neovim.keys.menus.find}", telescope.find_files) - bind("${config.neovim.keys.menus.grep}", telescope.live_grep) - bind("${config.neovim.keys.menus.help}", telescope.help_tags) - vim.api.nvim_set_hl(0, 'TelescopeNormal', { bg = "none" }) - vim.api.nvim_set_hl(0, 'TelescopeBorder', { bg = "none" }) - vim.api.nvim_set_hl(0, 'TelescopeResultsTitle', { bg = "none" }) - vim.api.nvim_set_hl(0, 'TelescopePromptTitle', { bg = "none" }) - vim.api.nvim_set_hl(0, 'TelescopePreviewTitle', { bg = "none" }) - vim.api.nvim_set_hl(0, 'TelescopePromptNormal', { bg = "none" }) - vim.api.nvim_set_hl(0, 'TelescopePromptBorder', { bg = "none" }) - ''; - } - # Snippets - vim-vsnip - vim-vsnip-integ - friendly-snippets - # Completion - cmp-buffer - cmp-nvim-lsp - cmp-vsnip - { - plugin = nvim-cmp; - type = "lua"; - config = '' - local cmp = require('cmp'); - local cmp_select = {behavior = cmp.SelectBehavior.select} - local cmp_mappings = cmp.mapping.preset.insert({ - ["${config.neovim.keys.cmp.prev}"] = cmp.mapping.select_prev_item(cmp_select), - ["${config.neovim.keys.cmp.next}"] = cmp.mapping.select_next_item(cmp_select), - ["${config.neovim.keys.cmp.confirm}"] = cmp.mapping.confirm({ select = true }), - ["${config.neovim.keys.cmp.complete}"] = cmp.mapping.complete(), - }) - - cmp_mappings['<Tab>'] = nil - cmp_mappings['<S-Tab>'] = nil - - cmp.setup { - snippet = { - expand = function(args) - vim.fn["vsnip#anonymous"](args.body) - end, - }, - sources = cmp.config.sources { - { name = 'nvim_lsp' }, - { name = 'vsnip' }, - { name = 'buffer' }, - }, - mapping = cmp_mappings, - } - ''; - } - # Sourround delimiters - { - plugin = nvim-surround; - type = "lua"; - config = '' - require('nvim-surround').setup {} - ''; - } - # Comment functions - nerdcommenter - # Treesitter - nvim-treesitter.withAllGrammars - # Syntax hilighting - { - plugin = vim-illuminate; - type = "lua"; - config = '' - require('illuminate').configure { - providers = { - 'lsp', - 'treesitter', - 'regex', - }, - } - ''; - } - # Todo comments - { - plugin = todo-comments-nvim; - type = "lua"; - config = '' - require('todo-comments').setup() - ''; - } - # Lsp server - { - plugin = nvim-lspconfig; - type = "lua"; - config = let - lspConfigs = - map (server: '' - lspconfig["${server}"].setup({ - capabilities = capabilities - }) - '') - config.neovim.lsps; - in '' - local lspconfig = require('lspconfig') - local capabilities = require'cmp_nvim_lsp'.default_capabilities() - ${lib.concatStrings lspConfigs} - - vim.diagnostic.config { - virtual_lines = true - } - ''; - } - # Notifications - { - plugin = fidget-nvim; - type = "lua"; - config = '' - require("fidget").setup { - notification = { - window = { - winblend = 0, - }, - }, - } - ''; - } - # Auto indentation - { - plugin = indent-o-matic; - type = "lua"; - config = '' - require('indent-o-matic').setup { - max_lines = 2048, - standard_widths = { 2, 4, 8 }, - skip_multiline = true, - }; - ''; - } - # 80 column width - { - plugin = virt-column-nvim; - type = "lua"; - config = '' - require('virt-column').setup { - enabled = true, - virtcolumn = "80" - } - ''; - } - ]; - }; + plugins = with pkgs.vimPlugins; [ + # Dependencies + vim-devicons + nvim-web-devicons + plenary-nvim + # Colorscheme + base16-nvim + # Mode line + lualine-nvim + # Buffer line + bufferline-nvim + # File browser + nvim-tree-lua + # Undo tree + undotree + # Trouble (error menu) + trouble-nvim + # Telescope (buffers/find/grep/help) + telescope-nvim + # Snippets + vim-vsnip + vim-vsnip-integ + friendly-snippets + # Completion + cmp-buffer + cmp-nvim-lsp + cmp-vsnip + nvim-cmp + # Sourround delimiters + nvim-surround + # Comment functions + nerdcommenter + # Treesitter + nvim-treesitter.withAllGrammars + # Syntax hilighting + vim-illuminate + # Todo comments + todo-comments-nvim + # Lsp server + nvim-lspconfig + # Notifications + fidget-nvim + # Auto indentation + indent-o-matic + # 80 column width + virt-column-nvim + ]; }; }; } diff --git a/programs/neovim/init.lua b/programs/neovim/init.lua new file mode 100644 index 0000000..2be7fee --- /dev/null +++ b/programs/neovim/init.lua @@ -0,0 +1,359 @@ +--[[ + + NeoVIM Configuration + Copyright (c) Freya Murphy 2025 + +]]-- + +--[[ LIB ]]-- + +local function bind(key, action, opts) + opts = opts or {} + vim.keymap.set('n', key, action, opts) +end + +local function join(left, right) + if not left then return right end + if not right then return left end + for k,v in pairs(right) do + local lv, rv = left[k], right[k] + if type(rv) == "table" then + left[k] = join(lv, rv) + else + left[k] = rv + end + end + return left +end + +--[[ VIM ]]-- + +vim.opt.tabstop = config.tabwidth +vim.opt.softtabstop = config.tabwidth +vim.opt.shiftwidth = config.tabwidth +vim.opt.expandtab = config.expandtab +vim.opt.mouse = "a" +vim.opt.clipboard = "unnamedplus" +vim.opt.hlsearch = true +vim.opt.autoindent = true +vim.opt.ttyfast = true +vim.opt.number = true +vim.opt.relativenumber = true +vim.opt.rnu = true +vim.opt.swapfile = false +vim.opt.fillchars = { eob = " "} + + +--[[ BUF ]]-- + +-- remove trailing whitespace on save +vim.api.nvim_create_autocmd({ "BufWritePre" }, { + pattern = { "*" }, + command = [[%s/\s\+$//e]], +}) + +--[[ KEYBINDS ]]-- + +-- leader +vim.g.mapleader = config.keys.leader +vim.g.maplocalleader = config.keys.leader +vim.keymap.set("", '<leader>', '<Nop>', { noremap = true, silent = true }) + +-- lsp +bind(config.keys.noh, vim.cmd.noh) +vim.api.nvim_create_autocmd('LspAttach', { + desc = 'LSP actions', + callback = function(event) + local opts = {buffer = event.buf} + bind(config.keys.lsp.hover, function() vim.lsp.buf.hover() end, opts) + bind(config.keys.lsp.action, function() vim.lsp.buf.code_action() end, opts) + bind(config.keys.lsp.references, function() vim.lsp.buf.references() end, opts) + bind(config.keys.lsp.rename, function() vim.lsp.buf.rename() end, opts) + end +}) + +--[[ COLORSCHEME ]]-- + +vim.opt.termguicolors = true +if config.theme.transparent then + vim.g.base16_transparent_background = 1 +end + +local colorscheme = require('base16-colorscheme') +colorscheme.setup({ + base00 = config.theme.colors.base00, + base01 = config.theme.colors.base01, + base02 = config.theme.colors.base02, + base03 = config.theme.colors.base03, + base04 = config.theme.colors.base04, + base05 = config.theme.colors.base05, + base06 = config.theme.colors.base06, + base07 = config.theme.colors.base07, + base08 = config.theme.colors.base08, + base09 = config.theme.colors.base09, + base0A = config.theme.colors.base0A, + base0B = config.theme.colors.base0B, + base0C = config.theme.colors.base0C, + base0D = config.theme.colors.base0D, + base0E = config.theme.colors.base0E, + base0F = config.theme.colors.base0F, +}) + +-- make transparent background +if config.theme.transparent then + local colors = { + -- Text + "Normal", "NormalNC", "NormalFloat", + -- Line Numbers + "LineNr", "EndOfBuffer", "SignColumn", + -- Floating + "FloatBorder", + -- Mode/Buffer Lines + "TabLine", "TabLineFill", "StatusLine", + } + for _,color in pairs(colors) do + vim.api.nvim_set_hl(0, color, { bg = "none" }) + end +end +-- identifiers should not be colored +vim.api.nvim_set_hl(0, "Identifier", { fg = config.theme.colors.base05 }) +vim.api.nvim_set_hl(0, "TSVariable", { fg = config.theme.colors.base05 }) +-- macro should be colored as a keyword +vim.api.nvim_set_hl(0, "TSFuncMacro", { fg = config.theme.colors.base0E }) +-- comments are too dark +vim.api.nvim_set_hl(0, "Comment", { fg = config.theme.colors.base07 }) +vim.api.nvim_set_hl(0, "@comment", { link = "Comment" }) + +--[[ MODE LINE ]]-- + +local lualine_theme = require('lualine.themes.base16') +if config.theme.transparent then + lualine_theme.normal.c = { fg = config.theme.colors.base05, bg = "none" } +end + +require('lualine').setup { + options = { + theme = lualine_theme, + icons_enabled = true, + globalstatus = true, + }, +} + +--[[ BUFFER LINE ]]-- + +require('bufferline').setup {} + +--[[ FILE BROWSER ]]-- + +vim.g.loaded_netrw = 1 +vim.g.loaded_netrwPlugin = 1 + +require('nvim-tree').setup { + sort = { + sorter = "case_sensitive", + }, + view = { + centralize_selection = true, + signcolumn = "yes", + float = { + enable = true, + quit_on_focus_loss = true, + open_win_config = { + relative = "editor", + border = "rounded", + width = 80, + height = 30, + row = 1, + col = 1, + }, + } + }, + renderer = { + group_empty = true, + }, + actions = { + use_system_clipboard = true, + change_dir = { + enable = true, + global = false, + restrict_above_cwd = false, + }, + expand_all = { + max_folder_discovery = 300, + exclude = {}, + }, + file_popup = { + open_win_config = { + col = 1, + row = 1, + relative = "cursor", + border = "shadow", + style = "minimal", + }, + }, + open_file = { + quit_on_open = true, + window_picker = { + enable = false, + picker = "default", + chars = "abcdefghijklmnopqrstuvwxyz1234567890", + exclude = { + filetype = { "notify", "lazy", "qf", "diff", "fugitive", "fugitiveblame" }, + buftype = { "nofile", "terminal", "help" }, + }, + }, + }, + remove_file = { + close_window = true, + }, + }, + filters = { + dotfiles = false, + }, + tab = { + sync = { + open = false, + close = false, + ignore = {}, + }, + }, + git = { + enable = false, + }, + update_cwd = true, + respect_buf_cwd = true, + update_focused_file = { + enable = true, + update_cwd = true + }, +} + +bind(config.keys.menus.browser, vim.cmd.NvimTreeToggle) + +--[[ UNDO TREE ]]-- + +bind(config.keys.menus.undo, vim.cmd.UndotreeToggle) + +--[[ ERROR MENU ]]-- + +bind(config.keys.menus.error, function() require('trouble').toggle() end) + +--[[ TELESCOPE ]]-- + +local telescope = require('telescope.builtin') +bind(config.keys.menus.buffers, telescope.buffers) +bind(config.keys.menus.find, telescope.find_files) +bind(config.keys.menus.grep, telescope.live_grep) +bind(config.keys.menus.help, telescope.help_tags) +if config.theme.transparent then + vim.api.nvim_set_hl(0, 'TelescopeNormal', { bg = "none" }) + vim.api.nvim_set_hl(0, 'TelescopeBorder', { bg = "none" }) + vim.api.nvim_set_hl(0, 'TelescopeResultsTitle', { bg = "none" }) + vim.api.nvim_set_hl(0, 'TelescopePromptTitle', { bg = "none" }) + vim.api.nvim_set_hl(0, 'TelescopePreviewTitle', { bg = "none" }) + vim.api.nvim_set_hl(0, 'TelescopePromptNormal', { bg = "none" }) + vim.api.nvim_set_hl(0, 'TelescopePromptBorder', { bg = "none" }) +end + +--[[ COMPLETION ]]-- + +local cmp = require('cmp') +local cmp_select = {behavior = cmp.SelectBehavior.select} +local cmp_mappings = cmp.mapping.preset.insert({ + [config.keys.cmp.prev] = cmp.mapping.select_prev_item(cmp_select), + [config.keys.cmp.next] = cmp.mapping.select_next_item(cmp_select), + [config.keys.cmp.confirm] = cmp.mapping.confirm({ select = true }), + [config.keys.cmp.complete] = cmp.mapping.complete(), +}) + +cmp_mappings['<Tab>'] = nil +cmp_mappings['<S-Tab>'] = nil + +cmp.setup { + snippet = { + expand = function(args) + vim.fn["vsnip#anonymous"](args.body) + end, + }, + sources = cmp.config.sources { + { name = 'nvim_lsp' }, + { name = 'vsnip' }, + { name = 'buffer' }, + }, + mapping = cmp_mappings, +} + +--[[ Surround Delimiters ]]-- + +require('nvim-surround').setup {} + +--[[ SYNTAX HIGHLIGHTING ]]-- + +require('nvim-treesitter.configs').setup { + highlight = { + enable = true, + disable = function(lang, buf) + local max_filesize = config.highlight.max_size * 1024 + local ok, stats = pcall(vim.loop.fs_stat, vim.api.nvim_buf_get_name(buf)) + if ok and stats and stats.size > max_filesize then + return true + end + end, + additional_vim_regex_highlighting = true, + }, +} + +require('illuminate').configure { + providers = { + 'lsp', + 'treesitter', + 'regex', + }, +} + +--[[ TODO COMMENTS ]]-- + +require('todo-comments').setup() + +--[[ LSP SERVER ]]-- + +local lspconfig = require('lspconfig') +local capabilities = require('cmp_nvim_lsp').default_capabilities() + +for lsp,config in pairs(config.lsps) do + local config = join(capabilities, config) + lspconfig[lsp].setup { + capabilities = config, + } +end + +vim.diagnostic.config({ + virtual_lines = true, +}) + +--[[ NOTIFICATIONS ]]-- + +require('fidget').setup { + notification = { + window = { + winblend = 0, + }, + }, +} + +--[[ AUTO INDENTATION ]]-- + +require('indent-o-matic').setup { + max_lines = 2048, + standard_widths = { 2, 4, 8 }, + skip_multiline = true, +} + +--[[ 80 COLUMN WIDTH ]]-- + +if config.col.show then + require('virt-column').setup { + enabled = true, + virtcolumn = tostring(config.col.width), + } +end |