summaryrefslogtreecommitdiff
path: root/programs/neovim/default.nix
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-06-19 15:33:19 -0400
committerFreya Murphy <freya@freyacat.org>2025-06-19 15:33:19 -0400
commite4d72d288703c0936d819f285cdbc9ef1f083b33 (patch)
treea685fc9d2d8838bc5b8b8fd600d1c9ca1fc0993d /programs/neovim/default.nix
parentrefactor build fn in pkgs (diff)
downloaddotfiles-nix-e4d72d288703c0936d819f285cdbc9ef1f083b33.tar.gz
dotfiles-nix-e4d72d288703c0936d819f285cdbc9ef1f083b33.tar.bz2
dotfiles-nix-e4d72d288703c0936d819f285cdbc9ef1f083b33.zip
refactor neovim, split out init.lua
Diffstat (limited to 'programs/neovim/default.nix')
-rw-r--r--programs/neovim/default.nix595
1 files changed, 62 insertions, 533 deletions
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
+ ];
};
};
}