diff options
author | Freya Murphy <freya@freyacat.org> | 2025-06-19 15:33:19 -0400 |
---|---|---|
committer | Freya Murphy <freya@freyacat.org> | 2025-06-19 15:33:19 -0400 |
commit | e4d72d288703c0936d819f285cdbc9ef1f083b33 (patch) | |
tree | a685fc9d2d8838bc5b8b8fd600d1c9ca1fc0993d /programs/neovim/default.nix | |
parent | refactor build fn in pkgs (diff) | |
download | dotfiles-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.nix | 595 |
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 + ]; }; }; } |