refactor: statix, deadnix, alejandra

This commit is contained in:
Kat Inskip 2023-01-17 14:26:07 -05:00
parent 961ec369ba
commit 53eed4454d
Signed by: kat
GPG key ID: 465E64DECEA8CF0F
57 changed files with 1296 additions and 963 deletions

1
.envrc
View file

@ -1 +1,2 @@
export REPO_ROOT="$(pwd)"
use flake use flake

1
.gitignore vendored
View file

@ -1 +1,2 @@
result result
.direnv/

8
darwin/base/docs.nix Normal file
View file

@ -0,0 +1,8 @@
_: {
documentation = {
enable = false;
man.enable = false;
info.enable = false;
doc.enable = false;
};
}

5
darwin/base/fonts.nix Normal file
View file

@ -0,0 +1,5 @@
_: {
fonts = {
fontDir.enable = true;
};
}

6
darwin/base/gpg.nix Normal file
View file

@ -0,0 +1,6 @@
_: {
programs.gnupg.agent = {
enable = true;
enableSSHSupport = true;
};
}

12
darwin/base/homebrew.nix Normal file
View file

@ -0,0 +1,12 @@
_: {
homebrew = {
enable = true;
onActivation = {
upgrade = true;
cleanup = "zap";
};
brews = [
"mas"
];
};
}

8
darwin/base/nix.nix Normal file
View file

@ -0,0 +1,8 @@
_: {
services.nix-daemon.enable = true;
nix = {
extraOptions = ''
extra-platforms = x86_64-darwin aarch64-darwin
'';
};
}

5
darwin/base/shell.nix Normal file
View file

@ -0,0 +1,5 @@
_: {
programs.zsh = {
enable = true;
};
}

42
darwin/base/system.nix Normal file
View file

@ -0,0 +1,42 @@
_: {
services.activate-system.enable = true;
system = {
defaults = {
SoftwareUpdate.AutomaticallyInstallMacOSUpdates = true;
NSGlobalDomain = {
AppleInterfaceStyleSwitchesAutomatically = true;
AppleShowAllFiles = true;
AppleShowAllExtensions = true;
};
dock = {
autohide = true;
orientation = "left";
tilesize = 32;
wvous-tl-corner = 1;
wvous-tr-corner = 10;
wvous-bl-corner = 4;
wvous-br-corner = 14;
};
finder = {
CreateDesktop = false;
ShowPathbar = true;
ShowStatusBar = true;
AppleShowAllFiles = true;
AppleShowAllExtensions = true;
};
loginwindow = {
GuestEnabled = false;
};
};
keyboard = {
enableKeyMapping = true;
remapCapsLockToControl = true;
userKeyMapping = [
{
HIDKeyboardModifierMappingSrc = 30064771129;
HIDKeyboardModifierMappingDst = 30064771299;
}
];
};
};
}

7
darwin/home.nix Normal file
View file

@ -0,0 +1,7 @@
{config, ...}: {
services.gpg-agent.pinentryFlavor = null;
home.file."${config.programs.gpg.homedir}/gpg-agent.conf".text = ''
pinentry-program /opt/homebrew/bin/pinentry-mac
'';
}

14
darwin/kat.nix Normal file
View file

@ -0,0 +1,14 @@
{pkgs, ...}: {
users.users.kat = {
name = "kat";
home = "/Users/kat";
shell = pkgs.zsh;
uid = 501;
};
users.knownUsers = [
"kat"
];
home-manager.users.kat.programs.zsh.initExtraFirst = ''
source /etc/static/zshrc
'';
}

View file

@ -1,18 +1,24 @@
{ pkgs, lib, ... }:
{ {
pkgs,
lib,
...
}: {
base16 = { base16 = {
vim.enable = false; vim.enable = false;
vim.template = data: let vim.template = data: let
drv = pkgs.base16-templates.vim.withTemplateData data; drv = pkgs.base16-templates.vim.withTemplateData data;
in drv.overrideAttrs (old: { in
drv.overrideAttrs (old: {
src = pkgs.fetchFromGitHub { src = pkgs.fetchFromGitHub {
repo = "base16-vim"; repo = "base16-vim";
owner = "fnune"; owner = "fnune";
rev = "52e4ce93a6234d112bc88e1ad25458904ffafe61"; rev = "52e4ce93a6234d112bc88e1ad25458904ffafe61";
sha256 = "10y8z0ycmdjk47dpxf6r2pc85k0y19a29aww99vgnxp31wrkc17h"; sha256 = "10y8z0ycmdjk47dpxf6r2pc85k0y19a29aww99vgnxp31wrkc17h";
}; };
patches = old.patches or [ ] ++ [ patches =
old.patches
or []
++ [
(pkgs.fetchurl { (pkgs.fetchurl {
# base16background=none # base16background=none
url = "https://github.com/arcnmx/base16-vim/commit/fe16eaaa1de83b649e6867c61494276c1f35c3c3.patch"; url = "https://github.com/arcnmx/base16-vim/commit/fe16eaaa1de83b649e6867c61494276c1f35c3c3.patch";

View file

@ -1,7 +0,0 @@
_: {
home = {
username = "kat";
stateVersion = "22.11";
homeDirectory = "/home/kat";
};
}

17
home/default.nix Normal file
View file

@ -0,0 +1,17 @@
{tree, ...}:
tree.prev
// {
base = {
imports = with tree.prev; [
base16
shell
neovim
];
};
work = {
imports = with tree.prev; [
work
wezterm
];
};
}

16
home/gpg.nix Normal file
View file

@ -0,0 +1,16 @@
{lib, ...}: let
inherit (lib.modules) mkMerge;
in {
services.gpg-agent = {
enable = true;
enableExtraSocket = true;
enableSshSupport = false;
extraConfig = mkMerge [
"auto-expand-secmem 0x30000" # otherwise "gpg: public key decryption failed: Cannot allocate memory"
"pinentry-timeout 30"
"allow-loopback-pinentry"
"enable-ssh-support"
"no-allow-external-cache"
];
};
}

1
home/modules/blank.nix Normal file
View file

@ -0,0 +1 @@
_: {}

3
home/modules/disable.nix Normal file
View file

@ -0,0 +1,3 @@
{modulesPath, ...}: {
disabledModules = map (x: /. + "${toString modulesPath}/${x}") ["programs/neovim.nix"];
}

437
home/modules/neovim.nix Normal file
View file

@ -0,0 +1,437 @@
{
config,
lib,
pkgs,
...
}:
with lib; let
cfg = config.programs.neovim;
jsonFormat = pkgs.formats.json {};
extraPython3PackageType = mkOptionType {
name = "extra-python3-packages";
description = "python3 packages in python.withPackages format";
check = with types; (x:
if isFunction x
then isList (x pkgs.python3Packages)
else false);
merge = mergeOneOption;
};
# Currently, upstream Neovim is pinned on Lua 5.1 for LuaJIT support.
# This will need to be updated if Neovim ever migrates to a newer
# version of Lua.
extraLua51PackageType = mkOptionType {
name = "extra-lua51-packages";
description = "lua5.1 packages in lua5_1.withPackages format";
check = with types; (x:
if isFunction x
then isList (x pkgs.lua51Packages)
else false);
merge = mergeOneOption;
};
pluginWithConfigType = types.submodule {
options = {
config = mkOption {
type = types.lines;
description = "Script to configure this plugin. The scripting language should match type.";
default = "";
};
type = mkOption {
type =
types.either (types.enum ["lua" "viml" "teal" "fennel"]) types.str;
description = "Language used in config. Configurations are aggregated per-language.";
default = "viml";
};
optional =
mkEnableOption "optional"
// {
description = "Don't load by default (load with :packadd)";
};
plugin = mkOption {
type = types.package;
description = "vim plugin";
};
};
};
# A function to get the configuration string (if any) from an element of 'plugins'
pluginConfig = p:
if p ? plugin && (p.config or "") != ""
then ''
" ${p.plugin.pname or p.plugin.name} {{{
${p.config}
" }}}
''
else "";
allPlugins =
cfg.plugins
++ optional cfg.coc.enable {
type = "viml";
plugin = cfg.coc.package;
config = cfg.coc.pluginConfig;
optional = false;
};
moduleConfigure = {
packages.home-manager = {
start = remove null (map
(x:
if x ? plugin && x.optional
then null
else (x.plugin or x))
allPlugins);
opt =
remove null
(map (x:
if x ? plugin && x.optional
then x.plugin
else null)
allPlugins);
};
beforePlugins = "";
};
extraMakeWrapperArgs =
lib.optionalString (cfg.extraPackages != [])
''--suffix PATH : "${lib.makeBinPath cfg.extraPackages}"'';
extraMakeWrapperLuaCArgs = lib.optionalString (cfg.extraLuaPackages != []) ''
--suffix LUA_CPATH ";" "${
lib.concatMapStringsSep ";" pkgs.lua51Packages.getLuaCPath
cfg.extraLuaPackages
}"'';
extraMakeWrapperLuaArgs = lib.optionalString (cfg.extraLuaPackages != []) ''
--suffix LUA_PATH ";" "${
lib.concatMapStringsSep ";" pkgs.lua51Packages.getLuaPath
cfg.extraLuaPackages
}"'';
in {
imports = [
(mkRemovedOptionModule ["programs" "neovim" "withPython"]
"Python2 support has been removed from neovim.")
(mkRemovedOptionModule ["programs" "neovim" "extraPythonPackages"]
"Python2 support has been removed from neovim.")
];
options = {
programs.neovim = {
enable = mkEnableOption "Neovim";
viAlias = mkOption {
type = types.bool;
default = false;
description = ''
Symlink <command>vi</command> to <command>nvim</command> binary.
'';
};
vimAlias = mkOption {
type = types.bool;
default = false;
description = ''
Symlink <command>vim</command> to <command>nvim</command> binary.
'';
};
vimdiffAlias = mkOption {
type = types.bool;
default = false;
description = ''
Alias <command>vimdiff</command> to <command>nvim -d</command>.
'';
};
withNodeJs = mkOption {
type = types.bool;
default = false;
description = ''
Enable node provider. Set to <literal>true</literal> to
use Node plugins.
'';
};
withRuby = mkOption {
type = types.nullOr types.bool;
default = true;
description = ''
Enable ruby provider.
'';
};
withPython3 = mkOption {
type = types.bool;
default = true;
description = ''
Enable Python 3 provider. Set to <literal>true</literal> to
use Python 3 plugins.
'';
};
generatedConfigViml = mkOption {
type = types.unspecified;
visible = true;
readOnly = true;
description = ''
Generated vimscript config.
'';
};
extraPython3Packages = mkOption {
type = with types; either extraPython3PackageType (listOf package);
default = _: [];
defaultText = literalExpression "ps: [ ]";
example = literalExpression "(ps: with ps; [ python-language-server ])";
description = ''
A function in python.withPackages format, which returns a
list of Python 3 packages required for your plugins to work.
'';
};
extraLuaPackages = mkOption {
type = with types; either extraLua51PackageType (listOf package);
default = [];
defaultText = literalExpression "[ ]";
example = literalExpression "(ps: with ps; [ luautf8 ])";
description = ''
A function in lua5_1.withPackages format, which returns a
list of Lua packages required for your plugins to work.
'';
};
generatedConfigs = mkOption {
type = types.attrsOf types.lines;
visible = true;
readOnly = true;
example = literalExpression ''
{
viml = '''
" Generated by home-manager
set packpath^=/nix/store/cn8vvv4ymxjf8cfzg7db15b2838nqqib-vim-pack-dir
set runtimepath^=/nix/store/cn8vvv4ymxjf8cfzg7db15b2838nqqib-vim-pack-dir
''';
lua = '''
-- Generated by home-manager
vim.opt.background = "dark"
''';
}'';
description = ''
Generated configurations with as key their language (set via type).
'';
};
package = mkOption {
type = types.package;
default = pkgs.neovim-unwrapped;
defaultText = literalExpression "pkgs.neovim-unwrapped";
description = "The package to use for the neovim binary.";
};
finalPackage = mkOption {
type = types.package;
visible = false;
readOnly = true;
description = "Resulting customized neovim package.";
};
configure = mkOption {
type = types.attrsOf types.anything;
default = {};
example = literalExpression ''
configure = {
customRC = $''''
" here your custom configuration goes!
$'''';
packages.myVimPackage = with pkgs.vimPlugins; {
# loaded on launch
start = [ fugitive ];
# manually loadable by calling `:packadd $plugin-name`
opt = [ ];
};
};
'';
description = ''
Deprecated. Please use the other options.
Generate your init file from your list of plugins and custom commands,
and loads it from the store via <command>nvim -u /nix/store/hash-vimrc</command>
</para><para>
This option is mutually exclusive with <varname>extraConfig</varname>
and <varname>plugins</varname>.
'';
};
extraConfig = mkOption {
type = types.lines;
default = "";
example = ''
set nocompatible
set nobackup
'';
description = ''
Custom vimrc lines.
</para><para>
This option is mutually exclusive with <varname>configure</varname>.
'';
};
extraPackages = mkOption {
type = with types; listOf package;
default = [];
example = literalExpression "[ pkgs.shfmt ]";
description = "Extra packages available to nvim.";
};
plugins = mkOption {
type = with types; listOf (either package pluginWithConfigType);
default = [];
example = literalExpression ''
with pkgs.vimPlugins; [
yankring
vim-nix
{ plugin = vim-startify;
config = "let g:startify_change_to_vcs_root = 0";
}
]
'';
description = ''
List of vim plugins to install optionally associated with
configuration to be placed in init.vim.
</para><para>
This option is mutually exclusive with <varname>configure</varname>.
'';
};
coc = {
enable = mkEnableOption "Coc";
package = mkOption {
type = types.package;
default = pkgs.vimPlugins.coc-nvim;
defaultText = literalExpression "pkgs.vimPlugins.coc-nvim";
description = "The package to use for the CoC plugin.";
};
settings = mkOption {
inherit (jsonFormat) type;
default = {};
example = literalExpression ''
{
"suggest.noselect" = true;
"suggest.enablePreview" = true;
"suggest.enablePreselect" = false;
"suggest.disableKind" = true;
languageserver = {
haskell = {
command = "haskell-language-server-wrapper";
args = [ "--lsp" ];
rootPatterns = [
"*.cabal"
"stack.yaml"
"cabal.project"
"package.yaml"
"hie.yaml"
];
filetypes = [ "haskell" "lhaskell" ];
};
};
};
'';
description = ''
Extra configuration lines to add to
<filename>$XDG_CONFIG_HOME/nvim/coc-settings.json</filename>
See
<link xlink:href="https://github.com/neoclide/coc.nvim/wiki/Using-the-configuration-file" />
for options.
'';
};
pluginConfig = mkOption {
type = types.lines;
default = "";
description = "Script to configure CoC. Must be viml.";
};
};
};
};
config = let
# transform all plugins into an attrset
pluginsNormalized = map (x:
if (x ? plugin)
then x
else {
type = x.type or "viml";
plugin = x;
config = "";
optional = false;
})
allPlugins;
suppressNotVimlConfig = p:
if p.type != "viml"
then p // {config = "";}
else p;
neovimConfig = pkgs.neovimUtils.makeNeovimConfig {
inherit (cfg) extraPython3Packages withPython3 withRuby viAlias vimAlias;
withNodeJs = cfg.withNodeJs || cfg.coc.enable;
configure = cfg.configure // moduleConfigure;
plugins = map suppressNotVimlConfig pluginsNormalized;
customRC = cfg.extraConfig;
};
in
mkIf cfg.enable {
warnings = optional (cfg.configure != {}) ''
programs.neovim.configure is deprecated.
Other programs.neovim options can override its settings or ignore them.
Please use the other options at your disposal:
configure.packages.*.opt -> programs.neovim.plugins = [ { plugin = ...; optional = true; }]
configure.packages.*.start -> programs.neovim.plugins = [ { plugin = ...; }]
configure.customRC -> programs.neovim.extraConfig
'';
programs.neovim.generatedConfigViml = neovimConfig;
programs.neovim.generatedConfigs = let
grouped = builtins.groupBy (x: x.type) pluginsNormalized;
concatConfigs = lib.concatMapStrings (p: p.config);
in
mapAttrs (_: concatConfigs) grouped;
home.packages = [cfg.finalPackage];
xdg.configFile."nvim/lua/init-home-manager.lua" = mkIf (hasAttr "lua" config.programs.neovim.generatedConfigs) {
text = config.programs.neovim.generatedConfigs.lua;
};
xdg.configFile."nvim/coc-settings.json" = mkIf cfg.coc.enable {
source = jsonFormat.generate "coc-settings.json" cfg.coc.settings;
};
programs.neovim.finalPackage =
pkgs.wrapNeovimUnstable cfg.package
(neovimConfig
// {
wrapperArgs =
(lib.escapeShellArgs neovimConfig.wrapperArgs)
+ " "
+ extraMakeWrapperArgs
+ " "
+ extraMakeWrapperLuaCArgs
+ " "
+ extraMakeWrapperLuaArgs;
wrapRc = false;
});
programs.bash.shellAliases = mkIf cfg.vimdiffAlias {vimdiff = "nvim -d";};
programs.fish.shellAliases = mkIf cfg.vimdiffAlias {vimdiff = "nvim -d";};
programs.zsh.shellAliases = mkIf cfg.vimdiffAlias {vimdiff = "nvim -d";};
};
}

View file

@ -1,93 +0,0 @@
{
config,
lib,
pkgs,
...
}: let
inherit (lib.modules) mkIf;
inherit (lib.strings) fixedWidthNumber hasInfix;
inherit (lib.attrsets) mapAttrs filterAttrs;
packDir = builtins.toString (pkgs.vimUtils.packDir config.programs.neovim.generatedConfigViml.configure.packages);
initLua = pkgs.substituteAll ({
name = "init.lua";
src = ./init.lua;
inherit packDir;
base16ShellPath = config.base16.shell.package;
inherit (config.base16) defaultSchemeName;
defaultSchemeSlug = config.base16.defaultScheme.slug;
}
// mapAttrs (_: col: fixedWidthNumber 2 col.ansiIndex)
(filterAttrs (var: _: hasInfix "base" var) config.base16.defaultScheme));
in
mkIf config.programs.neovim.enable {
home.sessionVariables.EDITOR = "nvim";
programs.neovim = {
vimAlias = true;
viAlias = true;
plugins = with pkgs.vimPlugins; [
# Libraries
plenary-nvim
# Disables and re-enables highlighting when searching
vim-cool
# Colour highlighting
vim-hexokinase
# Git porcelain
vim-fugitive
# Start screen
vim-startify
# Re-open with cursor at the same place
vim-lastplace
# Status Bar
lualine-nvim
# EasyMotion Equivalent
hop-nvim
# base16
config.base16.vim.plugin
# Fonts
nvim-web-devicons
# Completion
nvim-cmp
# Fuzzy Finder
telescope-nvim
# Buffers
bufferline-nvim
# Language Server
nvim-lspconfig
(pkgs.vimPlugins.nvim-treesitter.withPlugins (_:
with pkgs.tree-sitter-grammars; [
tree-sitter-c
tree-sitter-lua
tree-sitter-rust
#tree-sitter-bash
tree-sitter-css
tree-sitter-dockerfile
tree-sitter-go
tree-sitter-hcl
tree-sitter-html
tree-sitter-javascript
tree-sitter-markdown
tree-sitter-nix
tree-sitter-norg
tree-sitter-python
tree-sitter-regex
tree-sitter-scss
]))
# Treesitter Plugins
nvim-ts-rainbow
nvim-treesitter-context
twilight-nvim
];
extraPackages = with pkgs; [
# For nvim-lspconfig, Terraform Language Server
terraform-ls
# For tree-sitter
tree-sitter
nodejs
clang
clangStdenv.cc
];
};
xdg.configFile."nvim/init.lua".source = initLua;
}

View file

@ -1,18 +0,0 @@
{
config,
lib,
pkgs,
...
}: let
inherit (lib.modules) mkIf;
inherit (lib.options) mkEnableOption;
in {
options.programs.wezterm = {
enable = mkEnableOption "the wezterm terminal emulator";
};
config = mkIf config.programs.wezterm.enable {
home.packages = [
pkgs.wezterm
];
};
}

94
home/neovim/default.nix Normal file
View file

@ -0,0 +1,94 @@
{
config,
lib,
pkgs,
...
}: let
inherit (lib.modules) mkIf;
inherit (lib.strings) fixedWidthNumber hasInfix;
inherit (lib.attrsets) mapAttrs filterAttrs;
packDir = builtins.toString (pkgs.vimUtils.packDir config.programs.neovim.generatedConfigViml.configure.packages);
initLua = pkgs.substituteAll ({
name = "init.lua";
src = ./init.lua;
inherit packDir;
base16ShellPath = config.base16.shell.package;
inherit (config.base16) defaultSchemeName;
defaultSchemeSlug = config.base16.defaultScheme.slug;
}
// mapAttrs (_: col: fixedWidthNumber 2 col.ansiIndex)
(filterAttrs (var: _: hasInfix "base" var) config.base16.defaultScheme));
in {
home.sessionVariables = mkIf config.programs.neovim.enable {EDITOR = "nvim";};
programs.neovim = {
enable = true;
vimAlias = true;
viAlias = true;
plugins = with pkgs.vimPlugins; [
# Libraries
plenary-nvim
# Disables and re-enables highlighting when searching
vim-cool
# Colour highlighting
vim-hexokinase
# Git porcelain
vim-fugitive
# Start screen
vim-startify
# Re-open with cursor at the same place
vim-lastplace
# Status Bar
lualine-nvim
# EasyMotion Equivalent
hop-nvim
# org-mode for vim
# neorg
# base16
config.base16.vim.plugin
# Fonts
nvim-web-devicons
# Completion
nvim-cmp
# Fuzzy Finder
telescope-nvim
# Buffers
bufferline-nvim
# Language Server
nvim-lspconfig
(pkgs.vimPlugins.nvim-treesitter.withPlugins (_:
with pkgs.tree-sitter-grammars; [
tree-sitter-c
tree-sitter-lua
tree-sitter-rust
#tree-sitter-bash
tree-sitter-css
tree-sitter-dockerfile
tree-sitter-go
tree-sitter-hcl
tree-sitter-html
tree-sitter-javascript
tree-sitter-markdown
tree-sitter-nix
tree-sitter-norg
tree-sitter-python
tree-sitter-regex
tree-sitter-scss
]))
# Treesitter Plugins
nvim-ts-rainbow
nvim-treesitter-context
twilight-nvim
];
extraPackages = with pkgs; [
# For nvim-lspconfig, Terraform Language Server
terraform-ls
# For tree-sitter
tree-sitter
nodejs
clang
clangStdenv.cc
];
};
xdg.configFile."nvim/init.lua".source = initLua;
}

View file

@ -1,7 +1,7 @@
{ config, pkgs, meta, lib, ... }: { {pkgs, ...}: {
programs.rbw = { programs.rbw = {
enable = true; enable = true;
package = lib.mkIf (meta.trusted ? secrets) (pkgs.writeShellScriptBin "bitw" ''${pkgs.rbw-bitw}/bin/bitw -p gpg://${config.secrets.repo.bitw.source} "$@"''); package = pkgs.rbw-bitw;
settings = { settings = {
email = "kat@kittywit.ch"; email = "kat@kittywit.ch";
base_url = "https://vault.kittywit.ch"; base_url = "https://vault.kittywit.ch";

View file

@ -1,4 +1,4 @@
{ config, ... }: { _: {
programs.direnv = { programs.direnv = {
enable = true; enable = true;
enableZshIntegration = true; enableZshIntegration = true;

View file

@ -1,5 +1,5 @@
{ config, pkgs, ... }: { {pkgs, ...}: {
home.packages = [ pkgs.exa ]; home.packages = [pkgs.exa];
programs.zsh.shellAliases = { programs.zsh.shellAliases = {
exa = "exa --time-style long-iso"; exa = "exa --time-style long-iso";

View file

@ -1,9 +1,15 @@
{ config, pkgs, lib, ... }: { {
pkgs,
lib,
...
}: let
inherit (lib.lists) optional;
in {
programs.fzf = { programs.fzf = {
enable = true; enable = true;
enableZshIntegration = true; enableZshIntegration = true;
}; };
programs.zsh.plugins = lib.optional (pkgs.hostPlatform == pkgs.buildPlatform) { programs.zsh.plugins = optional (pkgs.hostPlatform == pkgs.buildPlatform) {
name = "fzf-tab"; name = "fzf-tab";
src = "${pkgs.zsh-fzf-tab}/share/fzf-tab"; src = "${pkgs.zsh-fzf-tab}/share/fzf-tab";
}; };

View file

@ -1,6 +1,4 @@
{ config, pkgs, lib, ... }: {pkgs, ...}: {
{
home.packages = with pkgs; [ home.packages = with pkgs; [
gitAndTools.git-remote-gcrypt gitAndTools.git-remote-gcrypt
git-crypt git-crypt
@ -13,7 +11,7 @@
userName = "Kat Inskip"; userName = "Kat Inskip";
userEmail = "kat@inskip.me"; userEmail = "kat@inskip.me";
extraConfig = { extraConfig = {
init = { defaultBranch = "main"; }; init = {defaultBranch = "main";};
protocol.gcrypt.allow = "always"; protocol.gcrypt.allow = "always";
annex = { annex = {
autocommit = false; autocommit = false;

View file

@ -1,6 +1,4 @@
{ config, ... }: {config, ...}: {
{
xdg.configFile."inputrc".text = '' xdg.configFile."inputrc".text = ''
set editing-mode vi set editing-mode vi
set keyseq-timeout 1 set keyseq-timeout 1

View file

@ -1,7 +1,6 @@
{ config, ... }: { _: {
home.language = let home.language = let
ca = "en_CA.UTF-8"; ca = "en_CA.UTF-8";
dk = "en_DK.UTF-8";
in { in {
base = ca; base = ca;
ctype = ca; ctype = ca;

View file

@ -1,4 +1,4 @@
{ config, pkgs, ... }: { {pkgs, ...}: {
home.packages = with pkgs; [ home.packages = with pkgs; [
# task managers # task managers
htop htop

View file

@ -1,12 +1,16 @@
{ config, lib, pkgs, ... }:
{ {
pkgs,
lib,
...
}: let
inherit (lib) toTOML;
in {
home.packages = with pkgs; [ home.packages = with pkgs; [
#rink-readline TODO: wait for fix #rink-readline TODO: wait for fix
rink rink
]; ];
xdg.configFile."rink/config.toml".text = lib.toTOML { xdg.configFile."rink/config.toml".text = toTOML {
colors = { colors = {
enabled = true; enabled = true;
theme = "my_theme"; theme = "my_theme";

View file

@ -1,6 +1,4 @@
{ meta, config, pkgs, lib, ... }: _: {
{
programs.ssh = { programs.ssh = {
enable = true; enable = true;
controlMaster = "auto"; controlMaster = "auto";

View file

@ -1,4 +1,4 @@
{ config, ... }: { _: {
programs.starship = { programs.starship = {
enable = true; enable = true;
enableZshIntegration = true; enableZshIntegration = true;

View file

@ -1,6 +1,10 @@
{ config, lib, pkgs, ... }:
{ {
lib,
pkgs,
...
}: let
inherit (lib.attrsets) mapAttrs;
in {
programs.zsh.shellAliases = { programs.zsh.shellAliases = {
tt = "tmux new -AD -s"; tt = "tmux new -AD -s";
}; };
@ -9,7 +13,7 @@
terminal = "tmux-256color"; terminal = "tmux-256color";
keyMode = "vi"; keyMode = "vi";
baseIndex = 1; baseIndex = 1;
extraConfig = with lib.mapAttrs (_: v: "colour${toString v}") pkgs.base16.shell.shell256; '' extraConfig = with mapAttrs (_: v: "colour${toString v}") pkgs.base16.shell.shell256; ''
# proper title handling # proper title handling
set -g set-titles on set -g set-titles on
set -g set-titles-string "#T" set -g set-titles-string "#T"

View file

@ -1,4 +1,8 @@
{ config, pkgs, ... }: { {
config,
pkgs,
...
}: {
# ensure .local/share/z is created # ensure .local/share/z is created
xdg.dataFile."z/.keep".text = ""; xdg.dataFile."z/.keep".text = "";
@ -6,7 +10,8 @@
localVariables = { localVariables = {
_Z_DATA = "${config.xdg.dataHome}/z/data"; _Z_DATA = "${config.xdg.dataHome}/z/data";
}; };
plugins = map (plugin: (with pkgs.${plugin}; { plugins =
map (plugin: (with pkgs.${plugin}; {
name = pname; name = pname;
inherit src; inherit src;
})) [ })) [

View file

@ -1,24 +1,24 @@
{ config, lib, pkgs, ... }:
{ {
config,
lib,
pkgs,
...
}: {
home.packages = with pkgs; [ home.packages = with pkgs; [
# programs.zsh.enableAutosuggestions only includes nix-zsh-autocompletions # programs.zsh.enableAutosuggestions only includes nix-zsh-autocompletions
zsh-completions zsh-completions
]; ];
xdg.configFile."kattheme_immutable.json".text = builtins.toJSON rec { xdg.configFile."kattheme_immutable.json".text = builtins.toJSON rec {
default = config.base16.defaultSchemeName; default = config.base16.defaultSchemeName;
current = default; current = default;
}; };
programs.zsh = { programs.zsh = {
enable = true; enable = true;
enableSyntaxHighlighting = true; enableSyntaxHighlighting = true;
enableAutosuggestions = true; enableAutosuggestions = true;
initExtra = initExtra = let
let
zshOpts = [ zshOpts = [
"auto_pushd" "auto_pushd"
"pushd_ignore_dups" "pushd_ignore_dups"
@ -40,12 +40,16 @@ xdg.configFile."kattheme_immutable.json".text = builtins.toJSON rec {
"nolistbeep" "nolistbeep"
"autolist" "autolist"
"listrowsfirst" "listrowsfirst"
]; in ];
'' in ''
${if pkgs.hostPlatform.isLinux then '' ${
if pkgs.hostPlatform.isLinux
then ''
eval $(dircolors -b | sd "\*#=00;90" "*\#=00;90") eval $(dircolors -b | sd "\*#=00;90" "*\#=00;90")
'' else '' ''
''} else ''
''
}
PROMPT_EOL_MARK=''' PROMPT_EOL_MARK='''
ZSH_TAB_TITLE_ADDITIONAL_TERMS='wezterm' ZSH_TAB_TITLE_ADDITIONAL_TERMS='wezterm'
ZSH_TAB_TITLE_ENABLE_FULL_COMMAND=true ZSH_TAB_TITLE_ENABLE_FULL_COMMAND=true
@ -71,9 +75,12 @@ xdg.configFile."kattheme_immutable.json".text = builtins.toJSON rec {
zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1lb --color=always $realpath' zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1lb --color=always $realpath'
${lib.concatStringsSep "\n" (map (opt: "setopt ${opt}") zshOpts)} ${lib.concatStringsSep "\n" (map (opt: "setopt ${opt}") zshOpts)}
bindkey '^ ' autosuggest-accept bindkey '^ ' autosuggest-accept
${if pkgs.hostPlatform.isDarwin then '' ${
if pkgs.hostPlatform.isDarwin
then ''
export PATH="''${KREW_ROOT:-$HOME/.krew}/bin:$PATH" export PATH="''${KREW_ROOT:-$HOME/.krew}/bin:$PATH"
'' else "" ''
else ""
} }
''; '';
shellAliases = lib.mkMerge [ shellAliases = lib.mkMerge [

3
home/state.nix Normal file
View file

@ -0,0 +1,3 @@
_: {
home.stateVersion = "22.11";
}

View file

@ -1,19 +0,0 @@
{
config,
tree,
machine,
...
}: {
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
sharedModules = with tree; [
home.modules
home.common
];
extraSpecialArgs = {
inherit tree machine;
nixos = config;
};
};
}

View file

@ -1,89 +0,0 @@
{ config, lib, pkgs, nixos, ... }:
let
inherit (lib.modules) mkIf;
inherit (lib.strings) concatStringsSep fixedWidthNumber hasInfix;
inherit (lib.attrsets) mapAttrs filterAttrs;
packDir = builtins.toString(pkgs.vimUtils.packDir config.programs.neovim.generatedConfigViml.configure.packages);
initLua = pkgs.substituteAll ({
name = "init.lua";
src = ./init.lua;
inherit packDir;
base16ShellPath = config.base16.shell.package;
inherit (config.base16) defaultSchemeName;
defaultSchemeSlug = config.base16.defaultScheme.slug;
} // mapAttrs (_: col: fixedWidthNumber 2 col.ansiIndex)
(filterAttrs (var: _: hasInfix "base" var) config.base16.defaultScheme));
in {
home.sessionVariables = mkIf config.programs.neovim.enable { EDITOR = "nvim"; };
programs.neovim = {
enable = true;
vimAlias = true;
viAlias = true;
plugins = with pkgs.vimPlugins; [
# Libraries
plenary-nvim
# Disables and re-enables highlighting when searching
vim-cool
# Colour highlighting
vim-hexokinase
# Git porcelain
vim-fugitive
# Start screen
vim-startify
# Re-open with cursor at the same place
vim-lastplace
# Status Bar
lualine-nvim
# EasyMotion Equivalent
hop-nvim
# org-mode for vim
# neorg
# base16
config.base16.vim.plugin
# Fonts
nvim-web-devicons
# Completion
nvim-cmp
# Fuzzy Finder
telescope-nvim
# Buffers
bufferline-nvim
# Language Server
nvim-lspconfig
(pkgs.vimPlugins.nvim-treesitter.withPlugins (plugins: with pkgs.tree-sitter-grammars; [
tree-sitter-c
tree-sitter-lua
tree-sitter-rust
#tree-sitter-bash
tree-sitter-css
tree-sitter-dockerfile
tree-sitter-go
tree-sitter-hcl
tree-sitter-html
tree-sitter-javascript
tree-sitter-markdown
tree-sitter-nix
tree-sitter-norg
tree-sitter-python
tree-sitter-regex
tree-sitter-scss
]))
# Treesitter Plugins
nvim-ts-rainbow
nvim-treesitter-context
twilight-nvim
];
extraPackages = with pkgs; [
# For nvim-lspconfig, Terraform Language Server
terraform-ls
# For tree-sitter
tree-sitter
nodejs
clang
clangStdenv.cc
];
};
xdg.configFile."nvim/init.lua".source = initLua;
}

View file

@ -1,345 +0,0 @@
-----------------------------------------------------------
-- Variables
-----------------------------------------------------------
local g = vim.g -- Global variables
local opt = vim.opt -- Set options (global/buffer/windows-scoped)
local wo = vim.wo -- Window local variables
local api = vim.api -- Lua API
-----------------------------------------------------------
-- Nix Fuckery
-----------------------------------------------------------
opt.packpath:prepend{"@packDir@"}
opt.runtimepath:prepend{"@packDir@"}
-----------------------------------------------------------
-- Base16
-----------------------------------------------------------
vim.g.base16colorspace = 256
vim.g.base16background = "@defaultSchemeName@"
g.base16_shell_path = "@base16ShellPath@"
vim.cmd("colorscheme base16-@defaultSchemeSlug@")
g.colors_name = "@defaultSchemeSlug@"
local base16 = {
base00 = "@base00@",
base01 = "@base01@",
base02 = "@base02@",
base03 = "@base03@",
base04 = "@base04@",
base05 = "@base05@",
base06 = "@base06@",
base07 = "@base07@",
base08 = "@base08@",
base09 = "@base09@",
base0A = "@base0A@",
base0B = "@base0B@",
base0C = "@base0C@",
base0D = "@base0D@",
base0E = "@base0E@",
base0F = "@base0F@"
}
api.nvim_create_autocmd("vimenter", {
command = "highlight Normal guibg=NONE ctermbg=NONE"
})
api.nvim_create_autocmd("SourcePost", {
command = "highlight Normal ctermbg=NONE guibg=NONE | " ..
"highlight LineNr ctermbg=NONE guibg=NONE | " ..
"highlight SignColumn ctermbg=NONE guibg=NONE"
})
-----------------------------------------------------------
-- General
-----------------------------------------------------------
opt.mouse = 'a' -- Enable mouse support
opt.clipboard = 'unnamedplus' -- Copy/paste to system clipboard
opt.completeopt = 'longest,menuone' -- Autocomplete options
opt.backup = false -- Disable backup
opt.writebackup = false -- Disable backup
opt.ttimeoutlen = 100 -- Mapping timeout
-----------------------------------------------------------
-- Neovim UI
-----------------------------------------------------------
opt.number = true -- Show line number
opt.relativenumber = true -- Relative line numbers
opt.showmatch = true -- Highlight matching parenthesis
opt.foldmethod = 'marker' -- Enable folding (default 'foldmarker')
opt.colorcolumn = '80' -- Line length marker at 80 columns
opt.splitright = true -- Vertical split to the right
opt.splitbelow = true -- Horizontal split to the bottom
opt.ignorecase = true -- Ignore case letters when search
opt.smartcase = true -- Ignore lowercase for the whole pattern
opt.wrap = true -- Wrap on word boundary
opt.linebreak = true -- Wrap on word boundary
opt.showbreak = "" -- Character to use to display word boundary
opt.termguicolors = false -- Enable 24-bit RGB colors
opt.laststatus = 3 -- Set global statusline
opt.cursorline = true -- Highlight cursor screenline
opt.cmdheight = 1 -- Command entry line height
opt.hlsearch = true -- Highlight matches with last search pattern
-----------------------------------------------------------
-- Tabs, indent
-----------------------------------------------------------
opt.expandtab = true -- Use spaces instead of tabs
opt.shiftwidth = 2 -- Shift 2 spaces when tab
opt.tabstop = 2 -- 1 tab == 2 spaces
opt.smartindent = true -- Autoindent new lines
opt.list = true -- List chars
opt.listchars = {
tab = '» ',
extends = '',
precedes= '',
nbsp = '·',
trail = ''
}
-----------------------------------------------------------
-- Memory, CPU
-----------------------------------------------------------
opt.hidden = true -- Enable background buffers
opt.history = 100 -- Remember N lines in history
opt.lazyredraw = true -- Faster scrolling
opt.synmaxcol = 240 -- Max column for syntax highlight
opt.updatetime = 700 -- ms to wait for trigger an event
-----------------------------------------------------------
-- Plugins
-----------------------------------------------------------
-- Remove perl
g.loaded_perl_provider = 0
-- Hexokinaise
g.Hexokinase_highlighters = {'virtual'}
g.Hexokinase_optInPatterns = {
'full_hex',
'rgb',
'rgba',
'hsl',
'hsla',
'colour_names'
}
-- Lastplace
g.lastplace_ignore = 'gitcommit,gitrebase,svn,hgcommit'
-----------------------------------------------------------
-- Startup
-----------------------------------------------------------
-- Disable builtins plugins
local disabled_built_ins = {
"netrw",
"netrwPlugin",
"netrwSettings",
"netrwFileHandlers",
"gzip",
"zip",
"zipPlugin",
"tar",
"tarPlugin",
"getscript",
"getscriptPlugin",
"vimball",
"vimballPlugin",
"2html_plugin",
"logipat",
"rrhelper",
"spellfile_plugin",
"matchit"
}
for _, plugin in pairs(disabled_built_ins) do
g["loaded_" .. plugin] = 1
end
-----------------------------------------------------------
-- Plugins
-----------------------------------------------------------
-- lualine
require('lualine').setup{}
-- nvim-cmp
local cmp = require('cmp')
cmp.setup({
snippet = {
expand = function(args)
vim.fn["vsnip#anonymous"](args.body)
end,
},
mapping = {
['<C-y>'] = cmp.mapping.confirm({ select = true }),
},
sources = {
-- { name = 'neorg' },
}
})
-- lspconfig
require('lspconfig').terraformls.setup{}
api.nvim_create_autocmd('BufWritePre', {
pattern = '*.tf',
command = 'lua vim.lsp.buf.formatting_sync()'
})
--[[
-- neorg
require('neorg').setup {
-- Tell Neorg what modules to load
load = {
['core.defaults'] = {}, -- Load all the default modules
['core.norg.concealer'] = {}, -- Allows for use of icons
['core.norg.dirman'] = { -- Manage your directories with Neorg
config = {
engine = 'nvim-cmp',
workspaces = {
home = '~/neorg'
}
}
}
},
}]]--
-- telescope
local telescope = require('telescope.builtin')
vim.keymap.set("n", "<leader>ff", function()
telescope.find_files()
end, { silent = true })
vim.keymap.set("n", "<leader>fg", function()
telescope.live_grep()
end, { silent = true })
vim.keymap.set("n", "<leader>fb", function()
telescope.buffers()
end, { silent = true })
vim.keymap.set("n", "<leader>fh", function()
telescope.help_tags()
end, { silent = true })
-- treesitter
require('nvim-treesitter.configs').setup {
-- A list of parser names, or "all"
ensure_installed = {
},
sync_install = false,
auto_install = false,
ignore_install = {},
highlight = {
enable = true,
additional_vim_regex_highlighting = false,
},
indent = {
enable = true,
},
rainbow = {
enable = true,
extended_mode = true
},
}
-- twilight
require("twilight").setup {
dimming = {
alpha = 0.5,
},
context = 10,
expand = {
"function",
"method",
"table",
"if_statement",
},
}
-- bufferline
require('bufferline').setup {
options = {
mode = "buffers", -- set to "tabs" to only show tabpages instead
numbers = "ordinal",
close_command = "bdelete! %d", -- can be a string | function, see "Mouse actions"
right_mouse_command = "bdelete! %d", -- can be a string | function, see "Mouse actions"
left_mouse_command = "buffer %d", -- can be a string | function, see "Mouse actions"
middle_mouse_command = nil, -- can be a string | function, see "Mouse actions"
indicator = {
icon = '',
style = 'icon',
},
buffer_close_icon = '',
modified_icon = '',
close_icon = '',
left_trunc_marker = '',
right_trunc_marker = '',
name_formatter = function(buf) -- buf contains a "name", "path" and "bufnr"
-- remove extension from markdown files for example
if buf.name:match('%.md') then
return vim.fn.fnamemodify(buf.name, ':t:r')
end
end,
max_name_length = 18,
max_prefix_length = 15, -- prefix used when a buffer is de-duplicated
tab_size = 18,
diagnostics = "nvim_lsp",
diagnostics_update_in_insert = false,
color_icons = true,
show_buffer_icons = true, -- disable filetype icons for buffers
show_buffer_close_icons = true,
show_close_icon = false,
show_tab_indicators = true,
persist_buffer_sort = true, -- whether or not custom sorted buffers should persist
separator_style = "slant",
always_show_bufferline = true,
}
}
local barColor = base16.base00;
local highlightItems = {
BufferLineFill = "bg",
BufferLineBackground = "bg",
BufferLineSeparator = "fg",
BufferLineSeparatorSelected = "fg",
BufferLineSeparatorVisible = "fg",
}
local commandString = ""
for item, ground in pairs(highlightItems) do
commandString = "highlight " .. item .. " cterm" .. ground .. "=" .. barColor .. " | " .. commandString
end
api.nvim_create_autocmd("ColorScheme", {
command = commandString;
})
-- hop
local hop = require('hop')
local directions = require("hop.hint").HintDirection
hop.setup()
vim.keymap.set("", "t", function()
hop.hint_words()
end, {})
vim.keymap.set("", "T", function()
hop.hint_lines_skip_whitespace()
end, {remap=true})
vim.keymap.set("", "f", function()
hop.hint_char1({ direction = directions.AFTER_CURSOR, current_line_only = true })
end, {remap=true})
vim.keymap.set("", "F", function()
hop.hint_char1({ direction = directions.BEFORE_CURSOR, current_line_only = true })
end, {remap=true})

View file

@ -1,10 +1,12 @@
_: { _: {
programs.wezterm.enable = true; programs.wezterm = {
xdg.configFile."wezterm/wezterm.lua".text = '' enable = true;
extraConfig = ''
local = wezterm = require 'wezterm' local = wezterm = require 'wezterm'
return { return {
check_for_updates = false, check_for_updates = false,
enable_tab_bar = true enable_tab_bar = true
} }
''; '';
};
} }

6
nixos/base.nix Normal file
View file

@ -0,0 +1,6 @@
_: {
boot.loader = {
grub.configurationLimit = 8;
systemd-boot.configurationLimit = 8;
};
}

View file

@ -1,7 +1,4 @@
{ {pkgs, ...}: {
pkgs,
...
}: {
services.xserver = { services.xserver = {
enable = true; enable = true;
desktopManager.gnome.enable = true; desktopManager.gnome.enable = true;

View file

@ -1,7 +1,4 @@
{ {lib, ...}: let
lib,
...
}: let
inherit (lib.modules) mkDefault; inherit (lib.modules) mkDefault;
in { in {
powerManagement.cpuFreqGovernor = mkDefault "powersave"; powerManagement.cpuFreqGovernor = mkDefault "powersave";

9
nixos/nix.nix Normal file
View file

@ -0,0 +1,9 @@
{lib, ...}: let
inherit (lib.modules) mkDefault;
in {
nix.gc = {
automatic = mkDefault true;
dates = mkDefault "weekly";
options = mkDefault "--delete-older-than 7d";
};
}

View file

@ -1,7 +1,4 @@
{ {lib, ...}: let
lib,
...
}: let
inherit (lib.attrsets) mapAttrsToList; inherit (lib.attrsets) mapAttrsToList;
in { in {
systemd.tmpfiles.rules = mapAttrsToList (username: _: "f /var/lib/systemd/linger/${username}") config.users.users; systemd.tmpfiles.rules = mapAttrsToList (username: _: "f /var/lib/systemd/linger/${username}") config.users.users;

View file

@ -1,194 +1,7 @@
{ inputs: let
utils,
nixpkgs,
darwin,
home-manager,
ragenix,
scalpel,
nix-index-database,
arcexprs,
...
} @ inputs: let
tree =
(inputs.tree.tree {
inherit inputs;
folder = ./.;
config = {
"/" = {
excludes = [
"flake"
"default"
];
};
"darwin/modules" = {
functor = {
enable = true;
external = [
home-manager.darwinModules.home-manager
ragenix.nixosModules.age
];
};
};
"system/modules" = {
functor = {
enable = true;
};
};
"nixos/modules" = {
functor = {
enable = true;
external =
[
nix-index-database.nixosModules.nix-index
home-manager.nixosModules.home-manager
ragenix.nixosModules.age
]
++ (with (import (arcexprs + "/modules")).nixos; [
base16
base16-shared
]);
};
};
"home/modules" = {
functor = {
enable = true;
external =
[
nix-index-database.hmModules.nix-index
]
++ (with (import (arcexprs + "/modules")).home-manager; [
base16
base16-shared
]);
};
};
};
})
.impure;
inherit (inputs.nixpkgs) lib; inherit (inputs.nixpkgs) lib;
inherit (lib.lists) fold; tree = import ./tree.nix {inherit inputs;};
inherit (lib.attrsets) mapAttrs mapAttrsToList recursiveUpdate; systems = import ./systems {inherit inputs tree lib;};
inherit (lib.strings) toLower; shells = import ./shells {inherit inputs tree lib;};
inherit (lib.options) mkOption;
inherit (lib.types) str listOf attrs unspecified;
inherit (lib.modules) evalModules;
recursiveMergeAttrs = fold recursiveUpdate {};
defaultSpecialArgs = {
inherit inputs tree;
};
hostModule = {
config,
machine,
...
}: {
options = {
arch = mkOption {
description = "Processor architecture of the host";
type = str;
default = "x86_64";
};
type = mkOption {
description = "Operating system type of the host";
type = str;
default = "NixOS";
};
folder = mkOption {
type = str;
internal = true;
};
system = mkOption {
type = str;
internal = true;
};
modules = mkOption {
type = listOf unspecified;
};
specialArgs = mkOption {
type = attrs;
internal = true;
};
builder = mkOption {
type = unspecified;
internal = true;
};
};
config = {
system = let
kernel =
{
nixos = "linux";
macos = "darwin";
darwin = "darwin";
linux = "linux";
}
.${toLower config.type};
in "${config.arch}-${kernel}";
folder =
{
nixos = "nixos";
macos = "darwin";
darwin = "darwin";
linux = "linux";
}
.${toLower config.type};
modules = with tree; [
tree.${config.folder}.modules
home.system
];
builder =
{
nixos = nixpkgs.lib.nixosSystem;
darwin = darwin.lib.darwinSystem;
macos = darwin.lib.darwinSystem;
}
.${toLower config.type};
specialArgs = {inherit machine;} // defaultSpecialArgs;
};
};
hostConfigs = mapAttrs (name: path:
evalModules {
modules = [
hostModule
path
];
specialArgs =
{
machine = name;
}
// defaultSpecialArgs;
})
tree.systems;
processHost = name: cfg: let
host = cfg.config;
in {
"${host.folder}Configurations".${name} = let
hostConfig = host.builder {
inherit (host) system modules specialArgs;
};
in
if host.folder == "nixos"
then
hostConfig.extendModules {
modules = [scalpel.nixosModule];
specialArgs = {
prev = hostConfig;
};
}
else hostConfig;
};
in in
recursiveMergeAttrs (mapAttrsToList processHost hostConfigs) {inherit inputs tree lib;} // systems // shells
// {
inherit inputs tree hostConfigs;
}
// (utils.lib.eachDefaultSystem (system: {
devShells = let
shells = mapAttrs (_: path:
import path rec {
inherit tree inputs system;
pkgs = nixpkgs.legacyPackages.${system};
inherit (nixpkgs) lib;
})
tree.shells;
in shells // { default = shells.repo; };
}))

20
shells/default.nix Normal file
View file

@ -0,0 +1,20 @@
{
lib,
tree,
inputs,
...
}: let
inherit (lib.attrsets) mapAttrs;
in
inputs.utils.lib.eachDefaultSystem (system: {
devShells = let
shells = mapAttrs (_: path:
import path rec {
inherit tree inputs system;
pkgs = inputs.nixpkgs.legacyPackages.${system};
inherit (inputs.nixpkgs) lib;
})
tree.shells;
in
shells // {default = shells.repo;};
})

View file

@ -1,15 +1,22 @@
{pkgs, inputs, system, ...}: with pkgs; let {
repo = import ../outputs.nix (inputs // { inherit inputs system; }); pkgs,
inputs,
system,
...
}:
with pkgs; let
repo = import ../outputs.nix (inputs // {inherit inputs system;});
inherit (lib.attrsets) mapAttrsToList; inherit (lib.attrsets) mapAttrsToList;
in in
mkShell { mkShell {
nativeBuildInputs = [ nativeBuildInputs =
[
deadnix # dead-code scanner deadnix # dead-code scanner
alejandra # code formatter alejandra # code formatter
statix # anti-pattern finder statix # anti-pattern finder
] ++ mapAttrsToList (name: _: ]
(pkgs.writeShellScriptBin "${name}-rebuild" '' ++ mapAttrsToList (name: _: (pkgs.writeShellScriptBin "${name}-rebuild" ''
darwin-rebuild switch --flake ${toString ../.}#${name} darwin-rebuild switch --flake $REPO_ROOT#${name}
'')) ''))
repo.darwinConfigurations; repo.darwinConfigurations;
} }

10
shells/work.nix Normal file
View file

@ -0,0 +1,10 @@
{pkgs, ...}:
with pkgs;
mkShell {
nativeBuildInputs = [
jq
k9s
terraform
awscli
];
}

29
system/home.nix Normal file
View file

@ -0,0 +1,29 @@
{
config,
tree,
machine,
systemType,
lib,
...
}: let
inherit (lib.lists) optional;
in {
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
sharedModules = with tree;
[
home.modules
home.state
]
++ optional (tree.${systemType} ? home) tree.${systemType}.home;
users.kat.imports = with tree; [
home.base
];
extraSpecialArgs = {
inherit tree machine;
parent = config;
};
};
}

23
system/nix.nix Normal file
View file

@ -0,0 +1,23 @@
{
config,
lib,
inputs,
...
}: let
inherit (lib.attrsets) mapAttrs mapAttrsToList;
inherit (lib.lists) optional;
inherit (lib.strings) versionAtLeast;
in {
nix = {
nixPath = mapAttrsToList (name: flake: "${name}=${flake}") inputs;
registry = mapAttrs (_: flake: {inherit flake;}) inputs;
settings = {
experimental-features = optional (versionAtLeast config.nix.package.version "2.4") "nix-command flakes";
substituters = ["https://arc.cachix.org" "https://kittywitch.cachix.org" "https://nix-community.cachix.org"];
trusted-public-keys = ["arc.cachix.org-1:DZmhclLkB6UO0rc0rBzNpwFbbaeLfyn+fYccuAy7YVY=" "kittywitch.cachix.org-1:KIzX/G5cuPw5WgrXad6UnrRZ8UDr7jhXzRTK/lmqyK0=" "nix-community.cachix.org-1:mB9FSh9qf2dCimDSUo8Zy7bkq5CX+/rkCWyvRCYg3Fs="];
auto-optimise-store = true;
trusted-users = ["root" "@wheel"];
};
};
}

7
system/overlay.nix Normal file
View file

@ -0,0 +1,7 @@
{inputs, ...}: {
nixpkgs = {
overlays = map (path: import "${path}/overlay.nix") [
inputs.arcexprs
];
};
}

124
systems/default.nix Normal file
View file

@ -0,0 +1,124 @@
{
inputs,
tree,
lib,
...
}: let
# The purpose of this file is to set up the host module which allows assigning of the system, e.g. aarch64-linux and the builder used with less pain.
inherit (lib.lists) fold;
inherit (lib.attrsets) mapAttrs mapAttrsToList recursiveUpdate;
inherit (lib.strings) toLower;
inherit (lib.options) mkOption;
inherit (lib.types) str listOf attrs unspecified;
inherit (lib.modules) evalModules;
recursiveMergeAttrs = fold recursiveUpdate {};
defaultSpecialArgs = {
inherit inputs tree;
};
hostModule = {
config,
machine,
...
}: {
options = {
arch = mkOption {
description = "Processor architecture of the host";
type = str;
default = "x86_64";
};
type = mkOption {
description = "Operating system type of the host";
type = str;
default = "NixOS";
};
folder = mkOption {
type = str;
internal = true;
};
system = mkOption {
type = str;
internal = true;
};
modules = mkOption {
type = listOf unspecified;
};
specialArgs = mkOption {
type = attrs;
internal = true;
};
builder = mkOption {
type = unspecified;
internal = true;
};
};
config = {
system = let
kernel =
{
nixos = "linux";
macos = "darwin";
darwin = "darwin";
linux = "linux";
}
.${toLower config.type};
in "${config.arch}-${kernel}";
folder =
{
nixos = "nixos";
macos = "darwin";
darwin = "darwin";
linux = "linux";
}
.${toLower config.type};
modules = with tree; [
tree.${config.folder}.modules
system
];
builder =
{
nixos = inputs.nixpkgs.lib.nixosSystem;
darwin = inputs.darwin.lib.darwinSystem;
macos = inputs.darwin.lib.darwinSystem;
}
.${toLower config.type};
specialArgs =
{
inherit machine;
systemType = config.folder;
}
// defaultSpecialArgs;
};
};
hostConfigs = mapAttrs (name: path:
evalModules {
modules = [
hostModule
path
];
specialArgs =
defaultSpecialArgs
// {
machine = name;
};
})
tree.systems;
processHost = name: cfg: let
host = cfg.config;
in {
"${host.folder}Configurations".${name} = let
hostConfig = host.builder {
inherit (host) system modules specialArgs;
};
in
if host.folder == "nixos"
then
hostConfig.extendModules {
modules = [inputs.scalpel.nixosModule];
specialArgs = {
prev = hostConfig;
};
}
else hostConfig;
};
in
recursiveMergeAttrs (mapAttrsToList processHost hostConfigs)

View file

@ -1,8 +1,5 @@
_: let _: let
hostConfig = { hostConfig = {tree, ...}: {
tree,
...
}: {
imports = with tree; [ imports = with tree; [
nixos.gnome nixos.gnome
]; ];

View file

@ -1,5 +1,92 @@
_: let _: let
hostConfig = _: { hostConfig = {tree, ...}: {
imports = with tree; [
darwin.base
darwin.kat
];
security.pam.enableSudoTouchIdAuth = true;
home-manager.users.root.programs.ssh = {
enable = true;
matchBlocks = {
"daiyousei-build" = {
hostname = "daiyousei.kittywit.ch";
port = 62954;
user = "root";
};
"renko-build" = {
hostname = "192.168.64.3";
port = 62954;
user = "root";
};
};
};
nix = {
envVars = {
"SSH_AUTH_SOCK" = "/Users/kat/.gnupg/S.gpg-agent.ssh";
};
buildMachines = [
{
hostName = "renko-build";
sshUser = "root";
system = "x86_64-linux";
maxJobs = 100;
speedFactor = 1;
supportedFeatures = ["benchmark" "big-parallel" "kvm"];
mandatoryFeatures = [];
}
{
hostName = "daiyousei-build";
sshUser = "root";
system = "aarch64-linux";
maxJobs = 100;
speedFactor = 1;
supportedFeatures = ["benchmark" "big-parallel" "kvm"];
mandatoryFeatures = [];
}
];
distributedBuilds = true;
};
homebrew = {
brewPrefix = "/opt/homebrew/bin";
brews = [
"gnupg"
"pinentry-mac"
];
casks = [
"utm"
"discord"
"mullvadvpn"
"bitwarden"
"deluge"
"telegram-desktop"
"spotify"
"element"
"signal"
"brave-browser"
"disk-inventory-x"
"dozer"
"firefox"
"devtoys"
"cyberduck"
"docker"
"pycharm-ce"
"slack"
"boop"
"obsidian"
"contexts"
];
masApps = {
Tailscale = 1475387142;
Dato = 1470584107;
Lungo = 1263070803;
"Battery Indicator" = 1206020918;
};
};
system.stateVersion = 4; system.stateVersion = 4;
}; };
in { in {

74
tree.nix Normal file
View file

@ -0,0 +1,74 @@
{inputs, ...}:
(inputs.tree.tree {
inherit inputs;
folder = ./.;
config = {
# Exclude things that would overlap with namespace things, potentially
"/" = {
excludes = [
"flake"
"default"
"tree"
"inputs"
"outputs"
];
};
# Ignore the default.nix we actually use
shells = {
excludes = [
"default"
];
};
systems = {
excludes = [
"default"
];
};
# Required for all-system common imports
system.functor.enable = true;
# Re-map home directory profiles
home.evaluateDefault = true;
# Allow profile importing
"nixos/*".functor.enable = true;
"darwin/*".functor.enable = true;
"home/*".functor.enable = true;
# Various modules
"nixos/modules" = {
functor = {
enable = true;
external = with inputs;
[
nix-index-database.nixosModules.nix-index
home-manager.nixosModules.home-manager
ragenix.nixosModules.age
]
++ (with (import (inputs.arcexprs + "/modules")).nixos; [
base16
base16-shared
]);
};
};
"darwin/modules" = {
functor = {
enable = true;
external = with inputs; [
home-manager.darwinModules.home-manager
ragenix.nixosModules.age
];
};
};
"home/modules" = {
functor = {
enable = true;
external = with inputs;
[
nix-index-database.hmModules.nix-index
]
++ (with (import (inputs.arcexprs + "/modules")).home-manager; [
base16
]);
};
};
};
})
.impure