{ ... }:
{

  programs.nixvim = {
    config = {
      extraConfigLuaPre =
        # lua
        ''
          vim.fn.sign_define("diagnosticsignerror", { text = " ", texthl = "diagnosticerror", linehl = "", numhl = "" })
          vim.fn.sign_define("diagnosticsignwarn", { text = " ", texthl = "diagnosticwarn", linehl = "", numhl = "" })
          vim.fn.sign_define("diagnosticsignhint", { text = "󰌵", texthl = "diagnostichint", linehl = "", numhl = "" })
          vim.fn.sign_define("diagnosticsigninfo", { text = " ", texthl = "diagnosticinfo", linehl = "", numhl = "" })
        '';

      clipboard = {
        providers.wl-copy.enable = true;
      };

      opts = {
        # Show line numbers
        number = true;

        # Show relative line numbers
        relativenumber = true;

        # Use the system clipboard
        clipboard = "unnamedplus";

        # Number of spaces that represent a <TAB>
        tabstop = 2;
        softtabstop = 2;

        # Show tabline always
        showtabline = 2;

        # Use spaces instead of tabs
        expandtab = true;

        # Enable smart indentation
        smartindent = true;

        # Number of spaces to use for each step of (auto)indent
        shiftwidth = 2;

        # Enable break indent
        breakindent = true;

        # Highlight the screen line of the cursor
        cursorline = true;

        # Minimum number of screen lines to keep above and below the cursor
        scrolloff = 8;

        # Enable mouse support
        mouse = "a";

        # Set folding method to manual
        foldmethod = "manual";

        # Disable folding by default
        foldenable = false;

        # Wrap long lines at a character in 'breakat'
        linebreak = true;

        # Disable spell checking
        spell = false;

        # Disable swap file creation
        swapfile = false;

        # Time in milliseconds to wait for a mapped sequence to complete
        timeoutlen = 300;

        # Enable 24-bit RGB color in the TUI
        termguicolors = true;

        # Don't show mode in the command line
        showmode = false;

        # Open new split below the current window
        splitbelow = true;

        # Keep the screen when splitting
        splitkeep = "screen";

        # Open new split to the right of the current window
        splitright = true;

        # Hide command line unless needed
        cmdheight = 0;

        # Remove EOB
        fillchars = {
          eob = " ";
        };
      };
    };
  };

}