27 Commits

Author SHA1 Message Date
318524004b Lock flake 2025-10-15 21:05:53 +02:00
799348ff91 Add minimal readme to my neovim configuration 2025-10-15 21:03:55 +02:00
52bf665774 Remove neovim lazy load related config 2025-10-15 20:50:58 +02:00
4f011cf8ef Fall back to 'paq.nvim' only when not on 'nixCats' 2025-10-15 20:38:39 +02:00
1b57185b72 Add 'nixCatsUtils' from 'nixCats' 2025-10-15 20:15:43 +02:00
a3437b04e8 Source kitty configuration in home manager 2025-10-15 19:45:01 +02:00
59e4821b4c Add 'nixCats' neovim flake to NixOS flake 2025-10-14 22:59:24 +02:00
9a4c8df398 Add neovim packages to 'nixCats' flake 2025-10-14 22:03:49 +02:00
7c36539033 Add minimal 'nixCats' flake template 2025-10-13 21:59:58 +02:00
b25fc9a2b8 Source relevant '.bashrc.d/*' files in NixOS home manager 2025-10-05 19:56:38 +02:00
7bbd0dd8a8 Simplify NixOS fzf configuration 2025-10-05 19:56:38 +02:00
07e4669bb8 Update disko virtual machine configuration 2025-10-05 19:56:38 +02:00
203665a051 Migrate 'dots/.bashrc' fzf config to NixOS home manager 2025-10-05 19:56:38 +02:00
431fa046be Add packages from 'dots/.bin/setup' 2025-10-05 19:56:38 +02:00
83464117ae Move packages into host's 'home.nix' 2025-10-05 19:56:38 +02:00
c8cf7aa5ca Refactor 2025-10-05 19:56:38 +02:00
0ad84eed45 Move home manager config into host's 'home.nix' 2025-10-05 19:56:38 +02:00
811388006f Format nix files using 'nixfmt' 2025-10-05 19:56:38 +02:00
fc7e346f1e Ignore 'nixos-efi-vars.fd' (output from building vm) 2025-10-05 13:39:16 +02:00
0da72e9513 Update NixOS readme 2025-10-05 13:39:16 +02:00
749bd75992 Use disko 'single-disk-ext4' template for vm host 2025-10-05 13:39:16 +02:00
54b228381d Add 'kitty' package 2025-10-05 12:31:24 +02:00
ee62f092e5 Update readme 2025-10-05 12:31:24 +02:00
6007760092 Add 'networking.hostId' (required for ZFS) 2025-10-05 12:31:24 +02:00
f8fddbba14 Fix ZFS issue with virtual disks (https://discourse.nixos.org/t/zfs-with-disko-faluire-to-import-zfs-pool/61988/3) 2025-10-05 12:31:24 +02:00
f824649f85 Fix inputrc path 2025-10-05 12:31:24 +02:00
c4fe75a1b9 Set up disko zfs encrypted root for 'vm' host 2025-10-05 12:31:24 +02:00
19 changed files with 1112 additions and 92 deletions

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@
result result
result-* result-*
nixos-efi-vars.fd

View File

@@ -1,3 +1,15 @@
# nixos # nixos
My NixOS config ## Set up virtual machine ([`disko`](https://github.com/nix-community/disko/blob/master/docs/interactive-vm.md))
1. Build the virtual machine
```
nix build -L '.#nixosConfigurations.vm.config.system.build.vmWithDisko'
```
2. Run the virtual machine
```
./result/bin/disko-vm
```

View File

@@ -0,0 +1,6 @@
# Neovim configuration
My neovim configuration. Available as a Nix flake [^nixcats]. When installing manually,
`paq.nvim` is used as a fallback plugin manager.
[^nixcats] Based on [this nixCats `example` template](https://github.com/BirdeeHub/nixCats-nvim/tree/77dffad8235eb77684fcb7599487c8e9f23d5b8f/templates/example)

162
dots/.config/nvim/flake.lock generated Normal file
View File

@@ -0,0 +1,162 @@
{
"nodes": {
"nixCats": {
"locked": {
"lastModified": 1759730664,
"narHash": "sha256-boRlBQ/c4CaHsK/z04QL6+t81mcar37Io94HBX2GflY=",
"owner": "BirdeeHub",
"repo": "nixCats-nvim",
"rev": "77dffad8235eb77684fcb7599487c8e9f23d5b8f",
"type": "github"
},
"original": {
"owner": "BirdeeHub",
"repo": "nixCats-nvim",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1760256791,
"narHash": "sha256-uTpzDHRASEDeFUuToWSQ46Re8beXyG9dx4W36FQa0/c=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "832e3b6db48508ae436c2c7bfc0cf914eac6938e",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixpkgs-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"plugins-beancount-nvim": {
"flake": false,
"locked": {
"lastModified": 1707748314,
"narHash": "sha256-LuACGVB3kiaiJqoGtvFy6kbPNtqoGliKLDeR+Z7Wzbw=",
"owner": "polarmutex",
"repo": "beancount.nvim",
"rev": "869564aba3087ee5df8f282aa37555e314aa2152",
"type": "github"
},
"original": {
"owner": "polarmutex",
"repo": "beancount.nvim",
"type": "github"
}
},
"plugins-crazy-node-movement": {
"flake": false,
"locked": {
"lastModified": 1693654676,
"narHash": "sha256-hQcQEp39zFN2zphMfcr97yRVcuHhBsSkzKO7XNloDpQ=",
"owner": "theHamsta",
"repo": "crazy-node-movement",
"rev": "d5cf01cc44c5715501d3d6fe439af7c8b7fa5df2",
"type": "github"
},
"original": {
"owner": "theHamsta",
"repo": "crazy-node-movement",
"type": "github"
}
},
"plugins-helm-ls-nvim": {
"flake": false,
"locked": {
"lastModified": 1757598429,
"narHash": "sha256-nzuJxAAaEmuVYg9k0B8OKslxsihhg6RKlhz6E7xJTQU=",
"owner": "qvalentin",
"repo": "helm-ls.nvim",
"rev": "f36ecbd3e7b0b2ac8358a9d6a3213888e29943db",
"type": "github"
},
"original": {
"owner": "qvalentin",
"repo": "helm-ls.nvim",
"type": "github"
}
},
"plugins-mcphub-nvim": {
"flake": false,
"locked": {
"lastModified": 1759035242,
"narHash": "sha256-I6EbgY/2sAdtrxtmH0qbAAQvMCHhOsfolJfblV0fXOk=",
"owner": "ravitemer",
"repo": "mcphub.nvim",
"rev": "8ff40b5edc649959bb7e89d25ae18e055554859a",
"type": "github"
},
"original": {
"owner": "ravitemer",
"repo": "mcphub.nvim",
"type": "github"
}
},
"plugins-nvimkit-nvim": {
"flake": false,
"locked": {
"lastModified": 1721393835,
"narHash": "sha256-MdmrhLHMxrn6upu1chjKyitPZ5WkCQtpI465AKJXDOA=",
"owner": "jamesblckwell",
"repo": "nvimkit.nvim",
"rev": "af363d22699760f66988e8d36539a5753039217a",
"type": "github"
},
"original": {
"owner": "jamesblckwell",
"repo": "nvimkit.nvim",
"type": "github"
}
},
"plugins-shipwright-nvim": {
"flake": false,
"locked": {
"lastModified": 1711725275,
"narHash": "sha256-xh/2m//Cno5gPucjOYih79wVZj3X1Di/U3/IQhKXjc0=",
"owner": "rktjmp",
"repo": "shipwright.nvim",
"rev": "e596ab48328c31873f4f4d2e070243bf9de16ff3",
"type": "github"
},
"original": {
"owner": "rktjmp",
"repo": "shipwright.nvim",
"type": "github"
}
},
"plugins-tailwind-fold-nvim": {
"flake": false,
"locked": {
"lastModified": 1752559116,
"narHash": "sha256-8uefZIVsn9USEd6FyiO3m3TRKAS/vigU4t9Tk5ijd3c=",
"owner": "razak17",
"repo": "tailwind-fold.nvim",
"rev": "d9e7ca11691d252b35795726dff087bf013b2ebf",
"type": "github"
},
"original": {
"owner": "razak17",
"repo": "tailwind-fold.nvim",
"type": "github"
}
},
"root": {
"inputs": {
"nixCats": "nixCats",
"nixpkgs": "nixpkgs",
"plugins-beancount-nvim": "plugins-beancount-nvim",
"plugins-crazy-node-movement": "plugins-crazy-node-movement",
"plugins-helm-ls-nvim": "plugins-helm-ls-nvim",
"plugins-mcphub-nvim": "plugins-mcphub-nvim",
"plugins-nvimkit-nvim": "plugins-nvimkit-nvim",
"plugins-shipwright-nvim": "plugins-shipwright-nvim",
"plugins-tailwind-fold-nvim": "plugins-tailwind-fold-nvim"
}
}
},
"root": "root",
"version": 7
}

212
dots/.config/nvim/flake.nix Normal file
View File

@@ -0,0 +1,212 @@
{
inputs = {
nixpkgs.url = "github:nixos/nixpkgs/nixpkgs-unstable";
nixCats.url = "github:BirdeeHub/nixCats-nvim";
plugins-shipwright-nvim = {
url = "github:rktjmp/shipwright.nvim";
flake = false;
};
plugins-crazy-node-movement = {
url = "github:theHamsta/crazy-node-movement";
flake = false;
};
plugins-beancount-nvim = {
url = "github:polarmutex/beancount.nvim";
flake = false;
};
plugins-tailwind-fold-nvim = {
url = "github:razak17/tailwind-fold.nvim";
flake = false;
};
plugins-nvimkit-nvim = {
url = "github:jamesblckwell/nvimkit.nvim";
flake = false;
};
plugins-mcphub-nvim = {
url = "github:ravitemer/mcphub.nvim";
flake = false;
};
plugins-helm-ls-nvim = {
url = "github:qvalentin/helm-ls.nvim";
flake = false;
};
};
outputs =
{
self,
nixpkgs,
nixCats,
...
}@inputs:
let
inherit (nixCats) utils;
luaPath = ./.;
forEachSystem = utils.eachSystem nixpkgs.lib.platforms.all;
extra_pkg_config = { };
dependencyOverlays = [
(utils.standardPluginOverlay inputs)
];
categoryDefinitions =
{
pkgs,
...
}:
{
lspsAndRuntimeDeps = with pkgs; {
general = [
tree-sitter
];
};
startupPlugins = {
general = with pkgs.vimPlugins; [
eyeliner-nvim
fzf-lua
ltex_extra-nvim
nvim-lspconfig
lsp_lines-nvim
lsp-progress-nvim
neodev-nvim
SchemaStore-nvim
nvim-lint
conform-nvim
luasnip
cmp_luasnip
nvim-cmp
cmp-nvim-lsp
cmp-buffer
cmp-path
plenary-nvim
nui-nvim
trouble-nvim
pkgs.neovimPlugins.shipwright-nvim
lush-nvim
zenbones-nvim
pkgs.neovimPlugins.crazy-node-movement
nvim-treesitter.withAllGrammars
nvim-treesitter-textobjects
# nvim-treesitter-context
nvim-ts-context-commentstring
treesj
sniprun
gitsigns-nvim
nvim-highlight-colors
pkgs.neovimPlugins.tailwind-fold-nvim
auto-session
nvim-dbee
image-nvim
pkgs.neovimPlugins.beancount-nvim
pkgs.neovimPlugins.nvimkit-nvim
codecompanion-nvim
pkgs.neovimPlugins.mcphub-nvim
copilot-lua
copilot-cmp
pkgs.neovimPlugins.helm-ls-nvim
];
};
optionalPlugins = {
general = with pkgs.vimPlugins; [
];
};
sharedLibraries = {
general = [ ];
};
environmentVariables = { };
};
packageDefinitions = {
nvim =
{ ... }:
{
settings = {
suffix-path = true;
suffix-LD = true;
wrapRc = true;
aliases = [ "vim" ];
};
categories = {
general = true;
};
};
};
defaultPackageName = "nvim";
in
forEachSystem (
system:
let
nixCatsBuilder = utils.baseBuilder luaPath {
inherit
nixpkgs
system
dependencyOverlays
extra_pkg_config
;
} categoryDefinitions packageDefinitions;
defaultPackage = nixCatsBuilder defaultPackageName;
pkgs = import nixpkgs { inherit system; };
in
{
packages = utils.mkAllWithDefault defaultPackage;
devShells = {
default = pkgs.mkShell {
name = defaultPackageName;
packages = [ defaultPackage ];
inputsFrom = [ ];
shellHook = '''';
};
};
}
)
// (
let
nixosModule = utils.mkNixosModules {
moduleNamespace = [ defaultPackageName ];
inherit
defaultPackageName
dependencyOverlays
luaPath
categoryDefinitions
packageDefinitions
extra_pkg_config
nixpkgs
;
};
homeModule = utils.mkHomeModules {
moduleNamespace = [ defaultPackageName ];
inherit
defaultPackageName
dependencyOverlays
luaPath
categoryDefinitions
packageDefinitions
extra_pkg_config
nixpkgs
;
};
in
{
overlays = utils.makeOverlays luaPath {
inherit nixpkgs dependencyOverlays extra_pkg_config;
} categoryDefinitions packageDefinitions defaultPackageName;
nixosModules.default = nixosModule;
homeModules.default = homeModule;
inherit utils nixosModule homeModule;
inherit (utils) templates;
}
);
}

View File

@@ -1,9 +1,12 @@
require("nixCatsUtils").setup({ non_nix_value = true }) -- https://github.com/BirdeeHub/nixCats-nvim/blob/77dffad8235eb77684fcb7599487c8e9f23d5b8f/templates/example/init.lua
require("vim") require("vim")
require("ftdetect") require("ftdetect")
require("keymaps") require("keymaps")
require("highlight") require("highlight")
require("paq-setup")
require("diagnostic") require("diagnostic")
require("paq-setup") -- when not on nixCats
-- vim.opt.background = "dark" -- vim.opt.background = "dark"
-- vim.opt.laststatus = 3 -- vim.opt.laststatus = 3

View File

@@ -0,0 +1,53 @@
-- Source: https://github.com/BirdeeHub/nixCats-nvim/blob/main/templates/example/lua/nixCatsUtils/catPacker.lua
--[[
This directory is the luaUtils template.
You can choose what things from it that you would like to use.
And then delete the rest.
Everything in this directory is optional.
--]]
local M = {}
-- NOTE: This function is for defining a paq.nvim fallback method of downloading plugins
-- when nixCats was not used to install your config.
-- If you only ever load your config using nixCats, you don't need this file.
-- it literally just only runs it when not on nixCats
-- all neovim package managers that use the regular plugin loading scheme
-- can be used this way, just do whatever the plugin manager needs to put it in the
-- opt directory for lazy loading, and add the build steps so that when theres no nix the steps are ran
function M.setup(v)
if not vim.g[ [[nixCats-special-rtp-entry-nixCats]] ] then
local function clone_paq()
local path = vim.fn.stdpath("data") .. "/site/pack/paqs/start/paq-nvim"
local is_installed = vim.fn.empty(vim.fn.glob(path)) == 0
if not is_installed then
vim.fn.system({ "git", "clone", "--depth=1", "https://github.com/savq/paq-nvim.git", path })
return true
end
end
local function bootstrap_paq(packages)
local first_install = clone_paq()
vim.cmd.packadd("paq-nvim")
local paq = require("paq")
if first_install then
vim.notify("Installing plugins... If prompted, hit Enter to continue.")
end
paq(packages)
paq.install()
end
vim.api.nvim_create_autocmd("VimEnter", {
once = true,
callback = function()
local pkgs_count = #require("paq").query("to_install")
if pkgs_count < 1 then
return
end
vim.notify(string.format("There are %d to install", pkgs_count))
end,
})
bootstrap_paq(vim.list_extend({ "savq/paq-nvim" }, v))
end
end
return M

View File

@@ -0,0 +1,136 @@
-- Source: https://github.com/BirdeeHub/nixCats-nvim/blob/main/templates/example/lua/nixCatsUtils/init.lua
--[[
This directory is the luaUtils template.
You can choose what things from it that you would like to use.
And then delete the rest.
Everything in this directory is optional.
--]]
local M = {}
--[[
This file is for making your config still work WITHOUT nixCats.
When you don't use nixCats to load your config,
you wont have the nixCats plugin.
The setup function defined here defines a mock nixCats plugin when nixCats wasnt used to load the config.
This will help avoid indexing errors when the nixCats plugin doesnt exist.
NOTE: If you only ever use nixCats to load your config, you don't need this file.
--]]
---@type boolean
M.isNixCats = vim.g[ [[nixCats-special-rtp-entry-nixCats]] ] ~= nil
---@class nixCatsSetupOpts
---@field non_nix_value boolean|nil
---This function will setup a mock nixCats plugin when not using nix
---It will help prevent you from running into indexing errors without a nixCats plugin from nix.
---If you loaded the config via nix, it does nothing
---non_nix_value defaults to true if not provided or is not a boolean.
---@param v nixCatsSetupOpts
function M.setup(v)
if not M.isNixCats then
local nixCats_default_value
if type(v) == "table" and type(v.non_nix_value) == "boolean" then
nixCats_default_value = v.non_nix_value
else
nixCats_default_value = true
end
local mk_with_meta = function(tbl)
return setmetatable(tbl, {
__call = function(_, attrpath)
local strtable = {}
if type(attrpath) == "table" then
strtable = attrpath
elseif type(attrpath) == "string" then
for key in attrpath:gmatch("([^%.]+)") do
table.insert(strtable, key)
end
else
print("function requires a table of strings or a dot separated string")
return
end
return vim.tbl_get(tbl, unpack(strtable))
end,
})
end
package.preload["nixCats"] = function()
local ncsub = {
get = function(_)
return nixCats_default_value
end,
cats = mk_with_meta({
nixCats_config_location = vim.fn.stdpath("config"),
wrapRc = false,
}),
settings = mk_with_meta({
nixCats_config_location = vim.fn.stdpath("config"),
configDirName = os.getenv("NVIM_APPNAME") or "nvim",
wrapRc = false,
}),
petShop = mk_with_meta({}),
extra = mk_with_meta({}),
pawsible = mk_with_meta({
allPlugins = {
start = {},
opt = {},
},
}),
configDir = vim.fn.stdpath("config"),
packageBinPath = os.getenv("NVIM_WRAPPER_PATH_NIX") or vim.v.progpath,
}
return setmetatable(ncsub, {
__call = function(_, cat)
return ncsub.get(cat)
end,
})
end
_G.nixCats = require("nixCats")
end
end
---allows you to guarantee a boolean is returned, and also declare a different
---default value than specified in setup when not using nix to load the config
---@overload fun(v: string|string[]): boolean
---@overload fun(v: string|string[], default: boolean): boolean
function M.enableForCategory(v, default)
if M.isNixCats or default == nil then
if nixCats(v) then
return true
else
return false
end
else
return default
end
end
---if nix, return value of nixCats(v) else return default
---Exists to specify a different non_nix_value than the one in setup()
---@param v string|string[]
---@param default any
---@return any
function M.getCatOrDefault(v, default)
if M.isNixCats then
return nixCats(v)
else
return default
end
end
---for conditionally disabling build steps on nix, as they are done via nix
---I should probably have named it dontAddIfCats or something.
---@overload fun(v: any): any|nil
---Will return the second value if nix, otherwise the first
---@overload fun(v: any, o: any): any
function M.lazyAdd(v, o)
if M.isNixCats then
return o
else
return v
end
end
return M

View File

@@ -1,38 +1,4 @@
-- Automate paq installation {{{ require("nixCatsUtils.catPacker").setup({
local function clone_paq()
local path = vim.fn.stdpath("data") .. "/site/pack/paqs/start/paq-nvim"
local is_installed = vim.fn.empty(vim.fn.glob(path)) == 0
if not is_installed then
vim.fn.system({ "git", "clone", "--depth=1", "https://github.com/savq/paq-nvim.git", path })
return true
end
end
local function bootstrap_paq(packages)
local first_install = clone_paq()
vim.cmd.packadd("paq-nvim")
local paq = require("paq")
if first_install then
vim.notify("Installing plugins... If prompted, hit Enter to continue.")
end
paq(packages)
paq.install()
end
vim.api.nvim_create_autocmd("VimEnter", {
once = true,
callback = function()
local pkgs_count = #require("paq").query("to_install")
if pkgs_count < 1 then
return
end
vim.notify(string.format("There are %d to install", pkgs_count))
end,
})
-- }}}
-- Set up paq plugins {{{
bootstrap_paq({
{ "savq/paq-nvim" }, { "savq/paq-nvim" },
{ "jinh0/eyeliner.nvim" }, { "jinh0/eyeliner.nvim" },
{ "ibhagwan/fzf-lua" }, { "ibhagwan/fzf-lua" },
@@ -77,4 +43,3 @@ bootstrap_paq({
{ "zbirenbaum/copilot-cmp" }, { "zbirenbaum/copilot-cmp" },
{ "qvalentin/helm-ls.nvim", ft = "helm" }, { "qvalentin/helm-ls.nvim", ft = "helm" },
}) })
-- }}}

223
flake.lock generated Normal file
View File

@@ -0,0 +1,223 @@
{
"nodes": {
"disko": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1746728054,
"narHash": "sha256-eDoSOhxGEm2PykZFa/x9QG5eTH0MJdiJ9aR00VAofXE=",
"owner": "nix-community",
"repo": "disko",
"rev": "ff442f5d1425feb86344c028298548024f21256d",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "latest",
"repo": "disko",
"type": "github"
}
},
"home-manager": {
"inputs": {
"nixpkgs": [
"nixpkgs"
]
},
"locked": {
"lastModified": 1758463745,
"narHash": "sha256-uhzsV0Q0I9j2y/rfweWeGif5AWe0MGrgZ/3TjpDYdGA=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "3b955f5f0a942f9f60cdc9cacb7844335d0f21c3",
"type": "github"
},
"original": {
"owner": "nix-community",
"ref": "release-25.05",
"repo": "home-manager",
"type": "github"
}
},
"nixCats": {
"locked": {
"lastModified": 1759730664,
"narHash": "sha256-boRlBQ/c4CaHsK/z04QL6+t81mcar37Io94HBX2GflY=",
"owner": "BirdeeHub",
"repo": "nixCats-nvim",
"rev": "77dffad8235eb77684fcb7599487c8e9f23d5b8f",
"type": "github"
},
"original": {
"owner": "BirdeeHub",
"repo": "nixCats-nvim",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1760423683,
"narHash": "sha256-Tb+NYuJhWZieDZUxN6PgglB16yuqBYQeMJyYBGCXlt8=",
"owner": "nixos",
"repo": "nixpkgs",
"rev": "a493e93b4a259cd9fea8073f89a7ed9b1c5a1da2",
"type": "github"
},
"original": {
"owner": "nixos",
"ref": "nixos-25.05",
"repo": "nixpkgs",
"type": "github"
}
},
"nvim": {
"inputs": {
"nixCats": "nixCats",
"nixpkgs": [
"nixpkgs"
],
"plugins-beancount-nvim": "plugins-beancount-nvim",
"plugins-crazy-node-movement": "plugins-crazy-node-movement",
"plugins-helm-ls-nvim": "plugins-helm-ls-nvim",
"plugins-mcphub-nvim": "plugins-mcphub-nvim",
"plugins-nvimkit-nvim": "plugins-nvimkit-nvim",
"plugins-shipwright-nvim": "plugins-shipwright-nvim",
"plugins-tailwind-fold-nvim": "plugins-tailwind-fold-nvim"
},
"locked": {
"path": "./dots/.config/nvim",
"type": "path"
},
"original": {
"path": "./dots/.config/nvim",
"type": "path"
},
"parent": []
},
"plugins-beancount-nvim": {
"flake": false,
"locked": {
"lastModified": 1707748314,
"narHash": "sha256-LuACGVB3kiaiJqoGtvFy6kbPNtqoGliKLDeR+Z7Wzbw=",
"owner": "polarmutex",
"repo": "beancount.nvim",
"rev": "869564aba3087ee5df8f282aa37555e314aa2152",
"type": "github"
},
"original": {
"owner": "polarmutex",
"repo": "beancount.nvim",
"type": "github"
}
},
"plugins-crazy-node-movement": {
"flake": false,
"locked": {
"lastModified": 1693654676,
"narHash": "sha256-hQcQEp39zFN2zphMfcr97yRVcuHhBsSkzKO7XNloDpQ=",
"owner": "theHamsta",
"repo": "crazy-node-movement",
"rev": "d5cf01cc44c5715501d3d6fe439af7c8b7fa5df2",
"type": "github"
},
"original": {
"owner": "theHamsta",
"repo": "crazy-node-movement",
"type": "github"
}
},
"plugins-helm-ls-nvim": {
"flake": false,
"locked": {
"lastModified": 1757598429,
"narHash": "sha256-nzuJxAAaEmuVYg9k0B8OKslxsihhg6RKlhz6E7xJTQU=",
"owner": "qvalentin",
"repo": "helm-ls.nvim",
"rev": "f36ecbd3e7b0b2ac8358a9d6a3213888e29943db",
"type": "github"
},
"original": {
"owner": "qvalentin",
"repo": "helm-ls.nvim",
"type": "github"
}
},
"plugins-mcphub-nvim": {
"flake": false,
"locked": {
"lastModified": 1759035242,
"narHash": "sha256-I6EbgY/2sAdtrxtmH0qbAAQvMCHhOsfolJfblV0fXOk=",
"owner": "ravitemer",
"repo": "mcphub.nvim",
"rev": "8ff40b5edc649959bb7e89d25ae18e055554859a",
"type": "github"
},
"original": {
"owner": "ravitemer",
"repo": "mcphub.nvim",
"type": "github"
}
},
"plugins-nvimkit-nvim": {
"flake": false,
"locked": {
"lastModified": 1721393835,
"narHash": "sha256-MdmrhLHMxrn6upu1chjKyitPZ5WkCQtpI465AKJXDOA=",
"owner": "jamesblckwell",
"repo": "nvimkit.nvim",
"rev": "af363d22699760f66988e8d36539a5753039217a",
"type": "github"
},
"original": {
"owner": "jamesblckwell",
"repo": "nvimkit.nvim",
"type": "github"
}
},
"plugins-shipwright-nvim": {
"flake": false,
"locked": {
"lastModified": 1711725275,
"narHash": "sha256-xh/2m//Cno5gPucjOYih79wVZj3X1Di/U3/IQhKXjc0=",
"owner": "rktjmp",
"repo": "shipwright.nvim",
"rev": "e596ab48328c31873f4f4d2e070243bf9de16ff3",
"type": "github"
},
"original": {
"owner": "rktjmp",
"repo": "shipwright.nvim",
"type": "github"
}
},
"plugins-tailwind-fold-nvim": {
"flake": false,
"locked": {
"lastModified": 1752559116,
"narHash": "sha256-8uefZIVsn9USEd6FyiO3m3TRKAS/vigU4t9Tk5ijd3c=",
"owner": "razak17",
"repo": "tailwind-fold.nvim",
"rev": "d9e7ca11691d252b35795726dff087bf013b2ebf",
"type": "github"
},
"original": {
"owner": "razak17",
"repo": "tailwind-fold.nvim",
"type": "github"
}
},
"root": {
"inputs": {
"disko": "disko",
"home-manager": "home-manager",
"nixpkgs": "nixpkgs",
"nvim": "nvim"
}
}
},
"root": "root",
"version": 7
}

View File

@@ -1,21 +1,41 @@
{ {
inputs = { inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-25.05"; nixpkgs = {
home-manager.url = "github:nix-community/home-manager/release-25.05"; url = "github:nixos/nixpkgs?ref=nixos-25.05";
home-manager.inputs.nixpkgs.follows = "nixpkgs"; };
disko = {
url = "github:nix-community/disko/latest";
inputs.nixpkgs.follows = "nixpkgs";
};
home-manager = {
url = "github:nix-community/home-manager/release-25.05";
inputs.nixpkgs.follows = "nixpkgs";
};
nvim = {
url = "path:./dots/.config/nvim";
inputs.nixpkgs.follows = "nixpkgs";
};
}; };
outputs = { self, nixpkgs, home-manager }: { outputs =
nixosConfigurations.vm = nixpkgs.lib.nixosSystem { {
self,
nixpkgs,
disko,
home-manager,
nvim,
}:
{
nixosConfigurations = {
vm = nixpkgs.lib.nixosSystem {
system = "x86_64-linux"; system = "x86_64-linux";
modules = [ modules = [
disko.nixosModules.disko
home-manager.nixosModules.home-manager
./hosts/vm/configuration.nix ./hosts/vm/configuration.nix
home-manager.nixosModules.home-manager { { environment.systemPackages = [ nvim.packages.x86_64-linux.nvim ]; }
home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true;
home-manager.users.h = ./hosts/vm/home.nix;
}
]; ];
}; };
}; };
};
} }

View File

@@ -1,11 +1,11 @@
{ pkgs, ... }: { ... }:
{ {
system.stateVersion = "25.05"; system.stateVersion = "25.05";
imports = imports = [
[
./hard.nix ./hard.nix
./disk.nix
../../modules/bootloader.nix ../../modules/bootloader.nix
../../modules/networking.nix ../../modules/networking.nix
../../modules/users.nix ../../modules/users.nix
@@ -15,16 +15,40 @@
../../modules/x.nix ../../modules/x.nix
]; ];
nix.settings.experimental-features = [ "nix-command" "flakes" ]; nix.settings.experimental-features = [
"nix-command"
"flakes"
];
programs.git.enable = true; disko = {
programs.firefox.enable = true; devices.disk.main.device = "/dev/vda";
devices.disk.main.imageName = "nixos-vm";
devices.disk.main.imageSize = "32G";
};
virtualisation.vmVariantWithDisko = {
virtualisation = {
cores = 8;
memorySize = 16384;
qemu.options = [
"-enable-kvm"
"-cpu host"
"-nographic"
];
};
};
nixpkgs.config.allowUnfree = true; nixpkgs.config.allowUnfree = true;
environment.systemPackages = with pkgs; [ neovim ]; home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
users.h = ./home.nix;
};
services.qemuGuest.enable = true;
services.spice-vdagentd.enable = true; services.spice-vdagentd.enable = true;
services.openssh = { services.openssh = {
enable = true; enable = true;
startWhenNeeded = true; startWhenNeeded = true;

36
hosts/vm/disk.nix Normal file
View File

@@ -0,0 +1,36 @@
{
disko.devices = {
disk = {
main = {
type = "disk";
content = {
type = "gpt";
partitions = {
boot = {
size = "1M";
type = "EF02"; # for grub MBR
};
ESP = {
size = "1G";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = [ "umask=0077" ];
};
};
root = {
size = "100%";
content = {
type = "filesystem";
format = "ext4";
mountpoint = "/";
};
};
};
};
};
};
};
}

View File

@@ -1,27 +1,30 @@
# Do not modify this file! It was generated by nixos-generate-config # Do not modify this file! It was generated by nixos-generate-config
# and may be overwritten by future invocations. Please make changes # and may be overwritten by future invocations. Please make changes
# to /etc/nixos/configuration.nix instead. # to /etc/nixos/configuration.nix instead.
{ config, lib, pkgs, modulesPath, ... }: {
config,
lib,
pkgs,
modulesPath,
...
}:
{ {
imports = imports = [
[ (modulesPath + "/profiles/qemu-guest.nix") (modulesPath + "/profiles/qemu-guest.nix")
]; ];
boot.initrd.availableKernelModules = [ "ahci" "xhci_pci" "virtio_pci" "sr_mod" "virtio_blk" ]; boot.initrd.availableKernelModules = [
"ahci"
"xhci_pci"
"virtio_pci"
"sr_mod"
"virtio_blk"
];
boot.initrd.kernelModules = [ ]; boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" ]; boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ]; boot.extraModulePackages = [ ];
fileSystems."/" =
{ device = "/dev/disk/by-uuid/7d406784-bf6b-420e-a956-134f719c8206";
fsType = "ext4";
};
swapDevices =
[ { device = "/dev/disk/by-uuid/4cbaffdb-0ca2-4735-87d0-eefe994f0e18"; }
];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's
# still possible to use this option, but it's recommended to use it in conjunction # still possible to use this option, but it's recommended to use it in conjunction

View File

@@ -6,7 +6,86 @@
home.username = "h"; home.username = "h";
home.homeDirectory = "/home/h"; home.homeDirectory = "/home/h";
home.file.".inputrc".source = ./dots/.inputrc; programs = {
bash = {
enable = true;
enableCompletion = true;
initExtra = ''
for f in ${config.home.homeDirectory}/.bashrc.d/*; do
[ -f "$f" ] && source "$f"
done
'';
};
firefox.enable = true;
fzf = {
enable = true;
enableBashIntegration = true;
};
git.enable = true;
home-manager.enable = true;
};
programs.home-manager.enable = true; home.packages = with pkgs; [
bash-completion
bash-language-server
bat
brightnessctl
entr
eslint_d
feh
firefox-devedition
fzf
git
haskell-language-server
haskellPackages.pandoc-crossref
haskellPackages.hadolint
htop
iosevka
jq
keepassxc
kitty
lua-language-server
# neovim
nmap
nodejs_24
nodePackages.ts-node
nvimpager
ormolu
pandoc
parallel
pass
pnpm
ripgrep
silver-searcher
sshfs
stylelint
svelte-language-server
tailwindcss-language-server
taskwarrior3
tldr
tmux
tmuxp
tree
tree-sitter
typescript-language-server
unzip
vim-language-server
vimPlugins.vim-plug
vtsls
wget
xbanish
xclip
yaml-language-server
];
home.file = {
".inputrc".source = ../../dots/.inputrc;
".bashrc.d/prompt".source = ../../dots/.bashrc.d/prompt;
".bashrc.d/editor".source = ../../dots/.bashrc.d/editor;
".config/kitty/kitty.conf".source = ../../dots/.config/kitty/kitty.conf;
".config/kitty/themes/zenwritten_light.conf".source =
../../dots/.config/kitty/themes/zenwritten_light.conf;
".config/kitty/themes/zenwritten_dark.conf".source =
../../dots/.config/kitty/themes/zenwritten_dark.conf;
};
} }

View File

@@ -0,0 +1,81 @@
{
disko.devices = {
disk = {
root = {
type = "disk";
device = "/dev/vda";
content = {
type = "gpt";
partitions = {
ESP = {
size = "1G";
type = "EF00";
content = {
type = "filesystem";
format = "vfat";
mountpoint = "/boot";
mountOptions = [ "nofail" ];
};
};
zfs = {
size = "100%";
content = {
type = "zfs";
pool = "zroot";
};
};
};
};
};
};
zpool = {
zroot = {
type = "zpool";
rootFsOptions = {
mountpoint = "none";
compression = "zstd";
acltype = "posixacl";
xattr = "sa";
"com.sun:auto-snapshot" = "true";
};
options.ashift = "12";
datasets = {
"root" = {
type = "zfs_fs";
options = {
encryption = "aes-256-gcm";
keyformat = "passphrase";
#keylocation = "file:///tmp/secret.key";
keylocation = "prompt";
};
mountpoint = "/";
};
"root/nix" = {
type = "zfs_fs";
options.mountpoint = "/nix";
mountpoint = "/nix";
};
# README MORE: https://wiki.archlinux.org/title/ZFS#Swap_volume
"root/swap" = {
type = "zfs_volume";
size = "10M";
content = {
type = "swap";
};
options = {
volblocksize = "4096";
compression = "zle";
logbias = "throughput";
sync = "always";
primarycache = "metadata";
secondarycache = "none";
"com.sun:auto-snapshot" = "false";
};
};
};
};
};
};
}

View File

@@ -2,7 +2,11 @@
{ {
networking.hostName = "nixos"; networking.hostName = "nixos";
networking.wireless = { iwd = { enable = true; }; }; networking.wireless = {
iwd = {
enable = true;
};
};
networking.firewall = { networking.firewall = {
enable = true; enable = true;
allowedTCPPorts = [ 22 ]; allowedTCPPorts = [ 22 ];