view modules/neovim.nix @ 4:7c8c5e548075 default tip

fix stuff
author Yasuri <yasuri@charliesmp.net>
date Sat, 03 Oct 2026 19:23:53 -0500
parents face7f4d84f7
children
line wrap: on
line source

{ pkgs, ... }:

{
  programs.neovim = {
    enable = true;
    defaultEditor = true;
    viAlias = true;
    vimAlias = true;

    plugins = with pkgs.vimPlugins; [
      nvim-treesitter.withAllGrammars
      telescope-nvim
      plenary-nvim
      lualine-nvim
      gitsigns-nvim
    ];

    extraLuaConfig = ''
      -- options
      local o = vim.opt
      o.number = true
      o.relativenumber = true
      o.termguicolors = true
      o.expandtab = true
      o.shiftwidth = 2
      o.tabstop = 2
      o.smartindent = true
      o.ignorecase = true
      o.smartcase = true
      o.cursorline = true
      o.scrolloff = 8
      o.signcolumn = "yes"
      o.undofile = true
      o.mouse = "a"
      o.clipboard = "unnamedplus"

      vim.g.mapleader = " "
      local map = vim.keymap.set
      local tb = require("telescope.builtin")
      map("n", "<leader>ff", tb.find_files)
      map("n", "<leader>fg", tb.live_grep)
      map("n", "<leader>fb", tb.buffers)
      map("n", "<leader>w", "<cmd>w<cr>")
      map("n", "<esc>", "<cmd>nohlsearch<cr>")

      -- colorscheme from the wallpaper
      local c = {
        bg = "#1c1a2b", fg = "#e8e0f0", sel = "#2f2b47", gray = "#4a4668",
        dim = "#7a769a", pink = "#f5b0d8", rose = "#f28fad", mint = "#8fe3c8",
        peach = "#f5d5b8", blue = "#79a6f5", mag = "#e9a0e6", cyan = "#7fd6f5",
      }
      vim.cmd("highlight clear")
      vim.g.colors_name = "wall"
      local function hl(g, v) vim.api.nvim_set_hl(0, g, v) end

      -- transparent bg so st shows the wallpaper through
      hl("Normal",       { fg = c.fg })
      hl("NormalFloat",  { fg = c.fg, bg = c.sel })
      hl("SignColumn",   {})
      hl("CursorLine",   { bg = c.sel })
      hl("Visual",       { bg = c.gray })
      hl("LineNr",       { fg = c.gray })
      hl("CursorLineNr", { fg = c.pink, bold = true })
      hl("WinSeparator", { fg = c.gray })
      hl("MatchParen",   { fg = c.cyan, bold = true })
      hl("Search",       { fg = c.bg, bg = c.peach })
      hl("IncSearch",    { fg = c.bg, bg = c.pink })
      hl("Pmenu",        { fg = c.fg, bg = c.sel })
      hl("PmenuSel",     { fg = c.bg, bg = c.pink })
      hl("Directory",    { fg = c.blue })
      hl("Comment",      { fg = c.dim, italic = true })
      hl("Constant",     { fg = c.peach })
      hl("String",       { fg = c.mint })
      hl("Number",       { fg = c.peach })
      hl("Identifier",   { fg = c.fg })
      hl("Function",     { fg = c.blue })
      hl("Statement",    { fg = c.pink })
      hl("Type",         { fg = c.cyan })
      hl("PreProc",      { fg = c.mag })
      hl("Special",      { fg = c.mag })
      hl("Error",        { fg = c.rose })
      hl("DiagnosticError", { fg = c.rose })
      hl("DiagnosticWarn",  { fg = c.peach })
      hl("DiagnosticInfo",  { fg = c.cyan })
      hl("DiagnosticHint",  { fg = c.mint })

      -- statusline
      local function mode(bg)
        return {
          a = { fg = c.bg, bg = bg, gui = "bold" },
          b = { fg = c.fg, bg = c.sel },
          c = { fg = c.dim },
        }
      end
      require("lualine").setup({
        options = {
          theme = {
            normal = mode(c.pink), insert = mode(c.mint), visual = mode(c.blue),
            replace = mode(c.rose), command = mode(c.peach), inactive = mode(c.gray),
          },
          section_separators = "",
          component_separators = "|",
        },
      })

      require("gitsigns").setup()
      vim.api.nvim_create_autocmd("FileType", {
  callback = function(args) pcall(vim.treesitter.start, args.buf) end,
})
    '';
  };
}