diff options
author | Freya Murphy <freya@freyacat.org> | 2025-06-17 21:57:53 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2025-06-17 21:57:53 -0400 |
commit | e0f2eb724245e02cb247b644f0947261d8665318 (patch) | |
tree | 13f929df40059d37165cbe46be95a6404a1bbecb /programs/neovim/default.nix | |
parent | refactor styles to new color scheme basis (diff) | |
download | dotfiles-nix-e0f2eb724245e02cb247b644f0947261d8665318.tar.gz dotfiles-nix-e0f2eb724245e02cb247b644f0947261d8665318.tar.bz2 dotfiles-nix-e0f2eb724245e02cb247b644f0947261d8665318.zip |
remove nix dir and move out all sub modules
Diffstat (limited to 'programs/neovim/default.nix')
-rw-r--r-- | programs/neovim/default.nix | 541 |
1 files changed, 541 insertions, 0 deletions
diff --git a/programs/neovim/default.nix b/programs/neovim/default.nix new file mode 100644 index 0000000..a88b9d7 --- /dev/null +++ b/programs/neovim/default.nix @@ -0,0 +1,541 @@ +{ 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; + }; + + 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"; + }; + + 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"; + }; + }; + + # 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"; + }; + }; + + # 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} + ''; + } + # 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" + } + ''; + } + ]; + + }; + }; + }; +} |