summaryrefslogtreecommitdiff
path: root/programs/neovim/default.nix
diff options
context:
space:
mode:
authorFreya Murphy <freya@freyacat.org>2025-06-17 21:57:53 -0400
committerFreya Murphy <freya@freyacat.org>2025-06-17 21:57:53 -0400
commite0f2eb724245e02cb247b644f0947261d8665318 (patch)
tree13f929df40059d37165cbe46be95a6404a1bbecb /programs/neovim/default.nix
parentrefactor styles to new color scheme basis (diff)
downloaddotfiles-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.nix541
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"
+ }
+ '';
+ }
+ ];
+
+ };
+ };
+ };
+}