# Neovim configuration (basic setup - can be extended) { config, lib, pkgs, ... }: { programs.neovim = { enable = true; defaultEditor = true; viAlias = true; vimAlias = true; extraPackages = with pkgs; [ # LSP servers nil # Nix lua-language-server nodePackages.typescript-language-server nodePackages.vscode-langservers-extracted # HTML, CSS, JSON rust-analyzer zls # Zig gopls pyright marksman # Markdown taplo # TOML yaml-language-server ltex-ls # Grammar # Formatters nixfmt stylua prettierd black rustfmt # Tools ripgrep fd tree-sitter wl-clipboard ]; plugins = with pkgs.vimPlugins; [ # Core plenary-nvim nvim-web-devicons # Fuzzy finder telescope-nvim # Treesitter nvim-treesitter.withAllGrammars # LSP nvim-lspconfig # Completion nvim-cmp cmp-nvim-lsp cmp-buffer cmp-path luasnip cmp_luasnip # UI lualine-nvim bufferline-nvim indent-blankline-nvim # Git gitsigns-nvim # File tree nvim-tree-lua # Theme (can be customized to match nomarchy theme) tokyonight-nvim ]; extraLuaConfig = /* backwards compat */ '' -- Basic settings vim.opt.number = true vim.opt.relativenumber = true vim.opt.expandtab = true vim.opt.tabstop = 2 vim.opt.shiftwidth = 2 vim.opt.smartindent = true vim.opt.termguicolors = true vim.opt.signcolumn = "yes" vim.opt.updatetime = 250 vim.opt.clipboard = "unnamedplus" -- Leader key vim.g.mapleader = " " -- Theme vim.cmd.colorscheme("tokyonight-night") -- Telescope keymaps local telescope = require("telescope.builtin") vim.keymap.set("n", "ff", telescope.find_files, { desc = "Find files" }) vim.keymap.set("n", "fg", telescope.live_grep, { desc = "Live grep" }) vim.keymap.set("n", "fb", telescope.buffers, { desc = "Buffers" }) -- LSP setup local lspconfig = require("lspconfig") local capabilities = require("cmp_nvim_lsp").default_capabilities() local servers = { "nil_ls", "lua_ls", "ts_ls", "html", "cssls", "jsonls", "rust_analyzer", "zls", "gopls", "pyright", "marksman", "taplo", "yamlls" } for _, server in ipairs(servers) do lspconfig[server].setup({ capabilities = capabilities }) end -- Completion local cmp = require("cmp") cmp.setup({ snippet = { expand = function(args) require("luasnip").lsp_expand(args.body) end, }, mapping = cmp.mapping.preset.insert({ [""] = cmp.mapping.scroll_docs(-4), [""] = cmp.mapping.scroll_docs(4), [""] = cmp.mapping.complete(), [""] = cmp.mapping.confirm({ select = true }), }), sources = cmp.config.sources({ { name = "nvim_lsp" }, { name = "luasnip" }, }, { { name = "buffer" }, { name = "path" }, }), }) -- File tree require("nvim-tree").setup() vim.keymap.set("n", "e", ":NvimTreeToggle", { silent = true }) -- Git signs require("gitsigns").setup() -- Status line require("lualine").setup() -- Buffer line require("bufferline").setup() ''; }; }