diff --git a/.envrc b/.envrc index e69de29b..3550a30f 100644 --- a/.envrc +++ b/.envrc @@ -0,0 +1 @@ +use flake diff --git a/darwin/modules/blank.nix b/darwin/modules/blank.nix new file mode 100644 index 00000000..eed71245 --- /dev/null +++ b/darwin/modules/blank.nix @@ -0,0 +1 @@ +_: {} diff --git a/darwin/systems/sumireko.nix b/darwin/systems/sumireko.nix deleted file mode 100644 index efe70297..00000000 --- a/darwin/systems/sumireko.nix +++ /dev/null @@ -1,2 +0,0 @@ -{ config, ... }: { -} diff --git a/default.nix b/default.nix index 7fecce2b..16d69bcb 100644 --- a/default.nix +++ b/default.nix @@ -1,7 +1,9 @@ let inputs = import ./inputs.nix; self = import ./outputs.nix ({ - inherit self inputs; - system = builtins.currentSystem; - } // inputs); -in self + inherit self inputs; + system = builtins.currentSystem; + } + // inputs); +in + self diff --git a/flake.lock b/flake.lock index acb7395e..ccbc1141 100644 --- a/flake.lock +++ b/flake.lock @@ -90,21 +90,6 @@ "type": "github" } }, - "flake-utils": { - "locked": { - "lastModified": 1644229661, - "narHash": "sha256-1YdnJAsNy69bpcjuoKdOYQX0YxZBiCYZo4Twxerqv7k=", - "owner": "numtide", - "repo": "flake-utils", - "rev": "3cecb5b042f7f209c56ffd8371b2711a290ec797", - "type": "github" - }, - "original": { - "owner": "numtide", - "repo": "flake-utils", - "type": "github" - } - }, "home-manager": { "inputs": { "nixpkgs": [ @@ -153,6 +138,26 @@ "type": "indirect" } }, + "nix-index-database": { + "inputs": { + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1673752441, + "narHash": "sha256-/g4ImZWV05CrXRWTSJsda6ztIp7LAPxs2L6RCrbQ66U=", + "owner": "Mic92", + "repo": "nix-index-database", + "rev": "391180f77505c1c8cdd45fe1a59dc89d3e40300a", + "type": "github" + }, + "original": { + "owner": "Mic92", + "repo": "nix-index-database", + "type": "github" + } + }, "nixpkgs": { "locked": { "lastModified": 1670064435, @@ -218,6 +223,7 @@ "flake-compat": "flake-compat", "home-manager": "home-manager", "mach-nix": "mach-nix", + "nix-index-database": "nix-index-database", "nixpkgs": "nixpkgs", "pypi-deps-db": "pypi-deps-db", "ragenix": "ragenix", @@ -310,20 +316,17 @@ } }, "utils_2": { - "inputs": { - "flake-utils": "flake-utils" - }, "locked": { - "lastModified": 1657226504, - "narHash": "sha256-GIYNjuq4mJlFgqKsZ+YrgzWm0IpA4axA3MCrdKYj7gs=", - "owner": "gytis-ivaskevicius", - "repo": "flake-utils-plus", - "rev": "2bf0f91643c2e5ae38c1b26893ac2927ac9bd82a", + "lastModified": 1667395993, + "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f", "type": "github" }, "original": { - "owner": "gytis-ivaskevicius", - "repo": "flake-utils-plus", + "owner": "numtide", + "repo": "flake-utils", "type": "github" } } diff --git a/flake.nix b/flake.nix index 9c47cd5e..abd5ed98 100644 --- a/flake.nix +++ b/flake.nix @@ -1,25 +1,33 @@ { - description = "kat's personal system flakes"; + description = "the katzian monorepo effort"; inputs = { + # to allow non-nix 2.4 evaluation flake-compat = { url = "github:edolstra/flake-compat"; flake = false; }; + # used for overriding unwanted flake inputs empty.url = "github:input-output-hk/empty-flake"; + # self-explanatory nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable"; + # self-explanatory home-manager = { url = "github:nix-community/home-manager/master"; inputs.nixpkgs.follows = "nixpkgs"; }; + # self-explanatory darwin = { url = "github:lnl7/nix-darwin/master"; inputs.nixpkgs.follows = "nixpkgs"; }; - utils.url = "github:gytis-ivaskevicius/flake-utils-plus"; + # flake-utils + utils.url = "github:numtide/flake-utils"; + # file structure -> attrset tree = { url = "github:kittywitch/tree"; inputs.nixpkgs.follows = "nixpkgs"; }; + # secrets ragenix = { url = "github:yaxitech/ragenix"; inputs = { @@ -27,20 +35,23 @@ flake-utils.follows = "utils"; }; }; + # secrets templating scalpel = { url = "github:polygon/scalpel"; inputs = { nixpkgs.follows = "nixpkgs"; # i get that you have to test shit, but isn't throwing sops-nix and thus three # whole fucking versions of nixpkgs into shit a little excessive? - # fuck the sops-nix people to begin with :/ + # making people have to stub this out unless they want to deal with importing that is a pain sops-nix.follows = "empty"; }; }; + # dependency database for mach-nix pypi-deps-db = { url = "github:DavHau/pypi-deps-db"; flake = false; }; + # nixified python environments mach-nix = { url = "mach-nix/3.5.0"; inputs = { @@ -49,10 +60,16 @@ pypi-deps-db.follows = "pypi-deps-db"; }; }; + # pre-computed nix-index + nix-index-database = { + url = "github:Mic92/nix-index-database"; + inputs.nixpkgs.follows = "nixpkgs"; + }; + # a bunch of modules (also arcnmx is good) arcexprs = { url = "github:arcnmx/nixexprs/master"; flake = false; }; }; - outputs = { ... }@inputs: import ./outputs.nix inputs; + outputs = inputs: import ./outputs.nix inputs; } diff --git a/home/base16.nix b/home/base16.nix new file mode 100644 index 00000000..290b8361 --- /dev/null +++ b/home/base16.nix @@ -0,0 +1,41 @@ +{ pkgs, lib, ... }: + +{ + base16 = { + vim.enable = false; + vim.template = data: let + drv = pkgs.base16-templates.vim.withTemplateData data; + in drv.overrideAttrs (old: { + src = pkgs.fetchFromGitHub { + repo = "base16-vim"; + owner = "fnune"; + rev = "52e4ce93a6234d112bc88e1ad25458904ffafe61"; + sha256 = "10y8z0ycmdjk47dpxf6r2pc85k0y19a29aww99vgnxp31wrkc17h"; + }; + patches = old.patches or [ ] ++ [ + (pkgs.fetchurl { + # base16background=none + url = "https://github.com/arcnmx/base16-vim/commit/fe16eaaa1de83b649e6867c61494276c1f35c3c3.patch"; + sha256 = "1c0n7mf6161mvxn5xlabhyxzha0m1c41csa6i43ng8zybbspipld"; + }) + (pkgs.fetchurl { + # fix unreadable error highlights under cursor + url = "https://github.com/arcnmx/base16-vim/commit/807e442d95c57740dd3610c9f9c07c9aae8e0995.patch"; + sha256 = "1l3qmk15v8d389363adkmfg8cpxppyhlk215yq3rdcasvw7r8bla"; + }) + ]; + }); + shell.enable = true; + schemes = lib.mkMerge [ + { + light = "atelier.atelier-cave-light"; + dark = "atelier.atelier-cave"; + } + { + dark.ansi.palette.background.alpha = "ee00"; + light.ansi.palette.background.alpha = "d000"; + } + ]; + defaultSchemeName = "dark"; + }; +} diff --git a/home/common.nix b/home/common.nix index 06d04660..ce4bd9fe 100644 --- a/home/common.nix +++ b/home/common.nix @@ -1,4 +1,4 @@ -{ config, ... }: { +_: { home = { username = "kat"; stateVersion = "22.11"; diff --git a/home/modules/development.nix b/home/modules/development.nix deleted file mode 100644 index e920a56f..00000000 --- a/home/modules/development.nix +++ /dev/null @@ -1,9 +0,0 @@ -{ config, lib, pkgs, ... }: let - inherit (lib.modules) mkIf; -in { - config = mkIf config.role.development { - home.packages = [ - pkgs.deadnix - ]; - }; -} diff --git a/home/modules/neovim/default.nix b/home/modules/neovim/default.nix index d7b0468e..fc09bf6b 100644 --- a/home/modules/neovim/default.nix +++ b/home/modules/neovim/default.nix @@ -1,87 +1,93 @@ -{ 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; - defaultSchemeName = config.base16.defaultSchemeName; - defaultSchemeSlug = config.base16.defaultScheme.slug; - } // mapAttrs (_: col: fixedWidthNumber 2 col.ansiIndex) +{ + 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"; +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 + 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; -} + xdg.configFile."nvim/init.lua".source = initLua; + } diff --git a/home/modules/wezterm.nix b/home/modules/wezterm.nix index 0ccf8cbe..62434169 100644 --- a/home/modules/wezterm.nix +++ b/home/modules/wezterm.nix @@ -1,4 +1,9 @@ -{ config, lib, pkgs, ... }: let +{ + config, + lib, + pkgs, + ... +}: let inherit (lib.modules) mkIf; inherit (lib.options) mkEnableOption; in { @@ -9,12 +14,5 @@ in { home.packages = [ pkgs.wezterm ]; - xdg.configFile."wezterm/wezterm.lua".text = '' - local = wezterm = require 'wezterm' - return { - check_for_updates = false, - enable_tab_bar = true - } - ''; }; } diff --git a/home/profiles/base.nix b/home/profiles/base.nix deleted file mode 100644 index efe70297..00000000 --- a/home/profiles/base.nix +++ /dev/null @@ -1,2 +0,0 @@ -{ config, ... }: { -} diff --git a/home/profiles/development.nix b/home/profiles/development.nix deleted file mode 100644 index 7dc69dc6..00000000 --- a/home/profiles/development.nix +++ /dev/null @@ -1,3 +0,0 @@ -{ config, ... }: { - role.development = true; -} diff --git a/home/profiles/gui.nix b/home/profiles/gui.nix deleted file mode 100644 index 6cc12336..00000000 --- a/home/profiles/gui.nix +++ /dev/null @@ -1,3 +0,0 @@ -{ config, ... }: { - programs.wezterm.enable = true; -} diff --git a/home/shell/bitw.nix b/home/shell/bitw.nix new file mode 100644 index 00000000..61cdfccd --- /dev/null +++ b/home/shell/bitw.nix @@ -0,0 +1,12 @@ +{ config, pkgs, meta, lib, ... }: { + programs.rbw = { + enable = true; + package = lib.mkIf (meta.trusted ? secrets) (pkgs.writeShellScriptBin "bitw" ''${pkgs.rbw-bitw}/bin/bitw -p gpg://${config.secrets.repo.bitw.source} "$@"''); + settings = { + email = "kat@kittywit.ch"; + base_url = "https://vault.kittywit.ch"; + identity_url = null; + lock_timeout = 3600; + }; + }; +} diff --git a/home/shell/direnv.nix b/home/shell/direnv.nix new file mode 100644 index 00000000..6c116fa0 --- /dev/null +++ b/home/shell/direnv.nix @@ -0,0 +1,6 @@ +{ config, ... }: { + programs.direnv = { + enable = true; + enableZshIntegration = true; + }; +} diff --git a/home/shell/exa.nix b/home/shell/exa.nix new file mode 100644 index 00000000..cc9eded0 --- /dev/null +++ b/home/shell/exa.nix @@ -0,0 +1,11 @@ +{ config, pkgs, ... }: { + home.packages = [ pkgs.exa ]; + + programs.zsh.shellAliases = { + exa = "exa --time-style long-iso"; + ls = "exa -G"; + la = "exa -Ga"; + ll = "exa -l"; + lla = "exa -lga"; + }; +} diff --git a/home/shell/fzf.nix b/home/shell/fzf.nix new file mode 100644 index 00000000..e49642d9 --- /dev/null +++ b/home/shell/fzf.nix @@ -0,0 +1,10 @@ +{ config, pkgs, lib, ... }: { + programs.fzf = { + enable = true; + enableZshIntegration = true; + }; + programs.zsh.plugins = lib.optional (pkgs.hostPlatform == pkgs.buildPlatform) { + name = "fzf-tab"; + src = "${pkgs.zsh-fzf-tab}/share/fzf-tab"; + }; +} diff --git a/home/shell/git.nix b/home/shell/git.nix new file mode 100644 index 00000000..ada08d47 --- /dev/null +++ b/home/shell/git.nix @@ -0,0 +1,29 @@ +{ config, pkgs, lib, ... }: + +{ + home.packages = with pkgs; [ + gitAndTools.git-remote-gcrypt + git-crypt + git-revise + ]; + + programs.git = { + package = pkgs.gitAndTools.gitFull; + enable = true; + userName = "Kat Inskip"; + userEmail = "kat@inskip.me"; + extraConfig = { + init = { defaultBranch = "main"; }; + protocol.gcrypt.allow = "always"; + annex = { + autocommit = false; + backend = "BLAKE2B512"; + synccontent = true; + }; + }; + signing = { + key = "0xE8DDE3ED1C90F3A0"; + signByDefault = true; + }; + }; +} diff --git a/home/shell/inputrc.nix b/home/shell/inputrc.nix new file mode 100644 index 00000000..8950b4b1 --- /dev/null +++ b/home/shell/inputrc.nix @@ -0,0 +1,21 @@ +{ config, ... }: + +{ + xdg.configFile."inputrc".text = '' + set editing-mode vi + set keyseq-timeout 1 + set mark-symlinked-directories on + set completion-prefix-display-length 8 + set show-all-if-ambiguous on + set show-all-if-unmodified on + set visible-stats on + set colored-stats on + set bell-style audible + set meta-flag on + set input-meta on + set convert-meta off + set output-meta on + ''; + + home.sessionVariables.INPUTRC = "${config.xdg.configHome}/inputrc"; +} diff --git a/home/shell/lc.nix b/home/shell/lc.nix new file mode 100644 index 00000000..e5c39fc8 --- /dev/null +++ b/home/shell/lc.nix @@ -0,0 +1,19 @@ +{ config, ... }: { + home.language = let + ca = "en_CA.UTF-8"; + dk = "en_DK.UTF-8"; + in { + base = ca; + ctype = ca; + time = ca; + numeric = ca; + collate = ca; + monetary = ca; + messages = ca; + paper = ca; + name = ca; + address = ca; + telephone = ca; + measurement = ca; + }; +} diff --git a/home/shell/packages.nix b/home/shell/packages.nix new file mode 100644 index 00000000..877da53f --- /dev/null +++ b/home/shell/packages.nix @@ -0,0 +1,32 @@ +{ config, pkgs, ... }: { + home.packages = with pkgs; [ + # task managers + htop + btop + # disk usage + duc-cli + # nix formatting + nixpkgs-fmt + # show type of files + file + # command monitoring + pv + # cat but better + bat + # ls replacement + exa + # sed replacement + sd + # find replacement + fd + # ripgrep / grep replacement + ripgrep + # remote tmux + tmate + # remote utilities + socat + rsync + wget + whois + ]; +} diff --git a/home/shell/rink.nix b/home/shell/rink.nix new file mode 100644 index 00000000..6f343158 --- /dev/null +++ b/home/shell/rink.nix @@ -0,0 +1,39 @@ +{ config, lib, pkgs, ... }: + +{ + home.packages = with pkgs; [ + #rink-readline TODO: wait for fix + rink + ]; + + xdg.configFile."rink/config.toml".text = lib.toTOML { + colors = { + enabled = true; + theme = "my_theme"; + }; + currency = { + cache_duration = "1h"; + enabled = true; + endpoint = "https://rinkcalc.app/data/currency.json"; + timeout = "2s"; + }; + rink = { + long_output = true; + prompt = "> "; + }; + themes = { + my_theme = { + date_time = "default"; + doc_string = "italic"; + error = "red"; + number = "default"; + plain = "default"; + pow = "default"; + prop_name = "cyan"; + quantity = "dimmed cyan"; + unit = "cyan"; + user_input = "bold"; + }; + }; + }; +} diff --git a/home/shell/ssh.nix b/home/shell/ssh.nix new file mode 100644 index 00000000..e1255062 --- /dev/null +++ b/home/shell/ssh.nix @@ -0,0 +1,11 @@ +{ meta, config, pkgs, lib, ... }: + +{ + programs.ssh = { + enable = true; + controlMaster = "auto"; + controlPersist = "10m"; + hashKnownHosts = true; + compression = true; + }; +} diff --git a/home/shell/starship.nix b/home/shell/starship.nix new file mode 100644 index 00000000..c0dde97e --- /dev/null +++ b/home/shell/starship.nix @@ -0,0 +1,6 @@ +{ config, ... }: { + programs.starship = { + enable = true; + enableZshIntegration = true; + }; +} diff --git a/home/shell/tmux.nix b/home/shell/tmux.nix new file mode 100644 index 00000000..ff94dd0c --- /dev/null +++ b/home/shell/tmux.nix @@ -0,0 +1,50 @@ +{ config, lib, pkgs, ... }: + +{ + programs.zsh.shellAliases = { + tt = "tmux new -AD -s"; + }; + programs.tmux = { + enable = true; + terminal = "tmux-256color"; + keyMode = "vi"; + baseIndex = 1; + extraConfig = with lib.mapAttrs (_: v: "colour${toString v}") pkgs.base16.shell.shell256; '' + # proper title handling + set -g set-titles on + set -g set-titles-string "#T" + set -ga terminal-overrides ",xterm-256color:Tc" + + # modes + setw -g clock-mode-colour colour8 + setw -g mode-style 'fg=${base07} bg=${base02} bold' + + # panes + set -g pane-border-style 'fg=${base06} bg=${base02}' + set -g pane-active-border-style 'bg=${base0D} fg=${base07}' + + # statusbar + set -g status-position bottom + set -g status-justify left + set -g status-style 'bg=${base00} fg=${base06}' + set -g status-left '#[fg=${base06} bg=${base01}] #S@#h ' + set -g status-right '#[fg=${base07},bg=${base01}] %F #[fg=${base07},bg=${base02}] %H:%M:%S %Z ' + set -g status-right-length 50 + set -g status-left-length 20 + + setw -g window-status-current-style 'fg=${base07} bg=${base0D} bold' + setw -g window-status-current-format ' #I#[fg=${base07}]:#[fg=${base07}]#W#[fg=${base07}]#F ' + + setw -g window-status-style 'fg=${base06} bg=${base03}' + setw -g window-status-format ' #I#[fg=${base07}]:#[fg=${base06}]#W#[${base06}]#F ' + + setw -g window-status-bell-style 'fg=colour255 bg=colour1 bold' + + # messages + set -g message-style 'fg=colour232 bg=colour16 bold' + + # mouse + set -g mouse on + ''; + }; +} diff --git a/home/shell/z.nix b/home/shell/z.nix new file mode 100644 index 00000000..22655f63 --- /dev/null +++ b/home/shell/z.nix @@ -0,0 +1,16 @@ +{ config, pkgs, ... }: { + # ensure .local/share/z is created + xdg.dataFile."z/.keep".text = ""; + + programs.zsh = { + localVariables = { + _Z_DATA = "${config.xdg.dataHome}/z/data"; + }; + plugins = map (plugin: (with pkgs.${plugin}; { + name = pname; + inherit src; + })) [ + "zsh-z" + ]; + }; +} diff --git a/home/shell/zsh.nix b/home/shell/zsh.nix new file mode 100644 index 00000000..39b6a45f --- /dev/null +++ b/home/shell/zsh.nix @@ -0,0 +1,107 @@ +{ config, lib, pkgs, ... }: + +{ + + home.packages = with pkgs; [ +# programs.zsh.enableAutosuggestions only includes nix-zsh-autocompletions + zsh-completions + ]; + +xdg.configFile."kattheme_immutable.json".text = builtins.toJSON rec { + default = config.base16.defaultSchemeName; + current = default; +}; + + + programs.zsh = { + enable = true; + enableSyntaxHighlighting = true; + enableAutosuggestions = true; + initExtra = + let + zshOpts = [ + "auto_pushd" + "pushd_ignore_dups" + "pushdminus" + "rmstarsilent" + "nonomatch" + "long_list_jobs" + "interactivecomments" + "append_history" + "hist_ignore_space" + "hist_verify" + "inc_append_history" + "nosharehistory" + "nomenu_complete" + "auto_menu" + "no_auto_remove_slash" + "complete_in_word" + "always_to_end" + "nolistbeep" + "autolist" + "listrowsfirst" + ]; in + '' + ${if pkgs.hostPlatform.isLinux then '' + eval $(dircolors -b | sd "\*#=00;90" "*\#=00;90") + '' else '' + ''} + PROMPT_EOL_MARK=''' + ZSH_TAB_TITLE_ADDITIONAL_TERMS='wezterm' + ZSH_TAB_TITLE_ENABLE_FULL_COMMAND=true + zmodload -i zsh/complist + h=() + if [[ -r ~/.ssh/config ]]; then + h=($h ''${''${''${(@M)''${(f)"$(cat ~/.ssh/config)"}:#Host *}#Host }:#*[*?]*}) + fi + if [[ $#h -gt 0 ]]; then + zstyle ':completion:*:ssh:*' hosts $h + zstyle ':completion:*:slogin:*' hosts $h + fi + unset h + u=(root ${config.home.username}) + zstyle ':completion:*:ssh:*' users $u + unset u + zstyle ':completion:*:*:*:*:*' menu select + zstyle ':completion:*:cd:*' tag-order local-directories directory-stack path-directories + zstyle ':completion:*:*:kill:*:processes' list-colors '=(#b) #([0-9]#) ([0-9a-z-]#)*=01;34=0=01' + zstyle ':completion:*:*:*:*:processes' command "ps -u $USER -o pid,user,comm -w -w" + zstyle ':completion:*:complete:pass:*:*' matcher 'r:|[./_-]=** r:|=*' 'l:|=* r:|=*' + zstyle ':completion:*' list-colors ''${(s.:.)LS_COLORS} + zstyle ':fzf-tab:complete:cd:*' fzf-preview 'exa -1lb --color=always $realpath' + ${lib.concatStringsSep "\n" (map (opt: "setopt ${opt}") zshOpts)} + bindkey '^ ' autosuggest-accept + ${if pkgs.hostPlatform.isDarwin then '' + export PATH="''${KREW_ROOT:-$HOME/.krew}/bin:$PATH" +'' else "" + } + ''; + shellAliases = lib.mkMerge [ + { + nixdirfmt = "nixpkgs-fmt $(fd -e nix)"; + dmesg = "dmesg -HP"; + hg = "history 0 | rg"; + } + (lib.mkIf pkgs.hostPlatform.isLinux { + sys = "systemctl"; + sysu = "systemctl --user"; + logu = "journalctl --user"; + log = "journalctl"; + lg = "log --no-pager | rg"; + }) + ]; + localVariables = { + ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE = "fg=3,bold"; + ZSH_AUTOSUGGEST_USE_ASYNC = 1; + }; + plugins = with pkgs.zsh-plugins; (map (plugin: plugin.zshPlugin) [ + tab-title + vim-mode + evil-registers + ]); + }; + + home.sessionVariables = { + XDG_DATA_HOME = "${config.xdg.dataHome}"; + }; +} diff --git a/nixos/modules/home.nix b/home/system.nix similarity index 60% rename from nixos/modules/home.nix rename to home/system.nix index 85c5ef5b..13f2f90b 100644 --- a/nixos/modules/home.nix +++ b/home/system.nix @@ -1,10 +1,15 @@ -{ config, tree, machine, ... }: { +{ + config, + tree, + machine, + ... +}: { home-manager = { useGlobalPkgs = true; useUserPackages = true; - sharedModules = [ - tree.home.modules - tree.system.modules + sharedModules = with tree; [ + home.modules + home.common ]; extraSpecialArgs = { inherit tree machine; diff --git a/home/vim/default.nix b/home/vim/default.nix new file mode 100644 index 00000000..205e9692 --- /dev/null +++ b/home/vim/default.nix @@ -0,0 +1,89 @@ +{ 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; +} diff --git a/home/vim/init.lua b/home/vim/init.lua new file mode 100644 index 00000000..76223bde --- /dev/null +++ b/home/vim/init.lua @@ -0,0 +1,345 @@ +----------------------------------------------------------- +-- 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 = { + [''] = 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", "ff", function() + telescope.find_files() +end, { silent = true }) + +vim.keymap.set("n", "fg", function() + telescope.live_grep() +end, { silent = true }) + +vim.keymap.set("n", "fb", function() + telescope.buffers() +end, { silent = true }) + +vim.keymap.set("n", "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}) diff --git a/home/wezterm.nix b/home/wezterm.nix new file mode 100644 index 00000000..41f34e32 --- /dev/null +++ b/home/wezterm.nix @@ -0,0 +1,10 @@ +_: { + programs.wezterm.enable = true; + xdg.configFile."wezterm/wezterm.lua".text = '' + local = wezterm = require 'wezterm' + return { + check_for_updates = false, + enable_tab_bar = true + } + ''; +} diff --git a/inputs.nix b/inputs.nix index 33191637..949a7df7 100644 --- a/inputs.nix +++ b/inputs.nix @@ -7,4 +7,5 @@ let kittywitch = import flakeCompat { src = ./.; }; -in kittywitch.defaultNix.inputs +in + kittywitch.defaultNix.inputs diff --git a/nixos/gnome.nix b/nixos/gnome.nix new file mode 100644 index 00000000..6b3004b1 --- /dev/null +++ b/nixos/gnome.nix @@ -0,0 +1,20 @@ +{ + pkgs, + ... +}: { + services.xserver = { + enable = true; + desktopManager.gnome.enable = true; + displayManager.gdm.enable = true; + }; + + environment.systemPackages = with pkgs.gnomeExtensions; [ + dash-to-dock + gsconnect + appindicator + ]; + + services.udev.packages = with pkgs.gnome; [ + gnome-settings-daemon + ]; +} diff --git a/nixos/laptop.nix b/nixos/laptop.nix new file mode 100644 index 00000000..11b2926f --- /dev/null +++ b/nixos/laptop.nix @@ -0,0 +1,9 @@ +{ + lib, + ... +}: let + inherit (lib.modules) mkDefault; +in { + powerManagement.cpuFreqGovernor = mkDefault "powersave"; + programs.light.enable = true; +} diff --git a/nixos/modules/blank.nix b/nixos/modules/blank.nix new file mode 100644 index 00000000..eed71245 --- /dev/null +++ b/nixos/modules/blank.nix @@ -0,0 +1 @@ +_: {} diff --git a/nixos/modules/gnome.nix b/nixos/modules/gnome.nix deleted file mode 100644 index ea97157b..00000000 --- a/nixos/modules/gnome.nix +++ /dev/null @@ -1,21 +0,0 @@ -{ config, lib, pkgs, ... }: let - inherit (lib.modules) mkIf; -in { - config = mkIf config.role.gnome { - services.xserver = { - enable = true; - desktopManager.gnome.enable = true; - displayManager.gdm.enable = true; - }; - - environment.systemPackages = with pkgs.gnomeExtensions; [ - dash-to-dock - gsconnect - appindicator - ]; - - services.udev.packages = with pkgs.gnome; [ - gnome-settings-daemon - ]; - }; -} diff --git a/nixos/modules/laptop.nix b/nixos/modules/laptop.nix deleted file mode 100644 index 8d68baba..00000000 --- a/nixos/modules/laptop.nix +++ /dev/null @@ -1,8 +0,0 @@ -{ config, lib, ... }: let - inherit (lib.modules) mkIf mkDefault; -in { - config = mkIf config.role.laptop { - powerManagement.cpuFreqGovernor = mkDefault "powersave"; - programs.light.enable = true; - }; -} diff --git a/nixos/modules/personal.nix b/nixos/modules/personal.nix deleted file mode 100644 index fe807146..00000000 --- a/nixos/modules/personal.nix +++ /dev/null @@ -1,7 +0,0 @@ -{ config, lib, ... }: let - inherit (lib.modules) mkIf; -in { - config = mkIf config.role.personal { - services.fstrim.enable = true; - }; -} diff --git a/nixos/modules/server.nix b/nixos/modules/server.nix deleted file mode 100644 index 931c630b..00000000 --- a/nixos/modules/server.nix +++ /dev/null @@ -1,10 +0,0 @@ -{ config, lib, ... }: let - inherit (lib.modules) mkIf; - inherit (lib.attrsets) mapAttrsToList; -in { - config = mkIf config.role.server { - # Prevent services from being automatically killed on log-out - # https://wiki.archlinux.org/title/systemd/User#Automatic_start-up_of_systemd_user_instances - systemd.tmpfiles.rules = mapAttrsToList (username: _: "f /var/lib/systemd/linger/${username}" ) config.users.users; - }; -} diff --git a/nixos/personal.nix b/nixos/personal.nix new file mode 100644 index 00000000..eaa706ac --- /dev/null +++ b/nixos/personal.nix @@ -0,0 +1,3 @@ +_: { + services.fstrim.enable = true; +} diff --git a/nixos/server.nix b/nixos/server.nix new file mode 100644 index 00000000..188a8126 --- /dev/null +++ b/nixos/server.nix @@ -0,0 +1,8 @@ +{ + lib, + ... +}: let + inherit (lib.attrsets) mapAttrsToList; +in { + systemd.tmpfiles.rules = mapAttrsToList (username: _: "f /var/lib/systemd/linger/${username}") config.users.users; +} diff --git a/nixos/systems/koishi.nix b/nixos/systems/koishi.nix deleted file mode 100644 index 9e2033ed..00000000 --- a/nixos/systems/koishi.nix +++ /dev/null @@ -1,51 +0,0 @@ -{ config, ... }: { - role = { - laptop = true; - personal = true; - gnome = true; - }; - - fileSystems = { - "/" = { - device = "/dev/disk/by-uuid/a664de0f-9883-420e-acc5-b9602a23e816"; - fsType = "xfs"; - }; - "/boot" = { - device = "/dev/disk/by-uuid/DEBC-8F03"; - fsType = "vfat"; - }; - }; - - swapDevices = [ - { device = "/dev/disk/by-uuid/0d846453-95b4-46e1-8eaf-b910b4321ef0"; } - ]; - - boot = { - supportedFilesystems = [ "xfs" ]; - initrd.luks.devices."cryptroot".device = "/dev/disk/by-uuid/f0ea08b4-6af7-4d90-a2ad-edd5672a2105"; - loader = { - efi = { - canTouchEfiVariables = true; - efiSysMountPoint = "/boot"; - }; - grub = { - devices = [ "nodev" ]; - efiSupport = true; - enable = true; - extraEntries = '' - menuentry "Windows" { - insmod part_gpt - insmod fat - insmod search_fs_uuid - insmod chain - search --fs-uuid --set=root DEBC-8F03 - chainloader /EFI/Microsoft/Boot/bootmgfw.efi - } - ''; - version = 2; - }; - }; - }; - - system.stateVersion = "21.11"; -} diff --git a/nixos/users/kat.nix b/nixos/users/kat.nix index e963974b..2edc7869 100644 --- a/nixos/users/kat.nix +++ b/nixos/users/kat.nix @@ -1,10 +1,10 @@ -{ tree, config, ... }: { +_: { users.users.kat = { uid = 1000; isNormalUser = true; openssh.authorizedKeys.keys = [ "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCocjQqiDIvzq+Qu3jkf7FXw5piwtvZ1Mihw9cVjdVcsra3U2c9WYtYrA3rS50N3p00oUqQm9z1KUrvHzdE+03ZCrvaGdrtYVsaeoCuuvw7qxTQRbItTAEsfRcZLQ5c1v/57HNYNEsjVrt8VukMPRXWgl+lmzh37dd9w45cCY1QPi+JXQQ/4i9Vc3aWSe4X6PHOEMSBHxepnxm5VNHm4PObGcVbjBf0OkunMeztd1YYA9sEPyEK3b8IHxDl34e5t6NDLCIDz0N/UgzCxSxoz+YJ0feQuZtud/YLkuQcMxW2dSGvnJ0nYy7SA5DkW1oqcy6CGDndHl5StOlJ1IF9aGh0gGkx5SRrV7HOGvapR60RphKrR5zQbFFka99kvSQgOZqSB3CGDEQGHv8dXKXIFlzX78jjWDOBT67vA/M9BK9FS2iNnBF5x6shJ9SU5IK4ySxq8qvN7Us8emkN3pyO8yqgsSOzzJT1JmWUAx0tZWG/BwKcFBHfceAPQl6pwxx28TM3BTBRYdzPJLTkAy48y6iXW6UYdfAPlShy79IYjQtEThTuIiEzdzgYdros0x3PDniuAP0KOKMgbikr0gRa6zahPjf0qqBnHeLB6nHAfaVzI0aNbhOg2bdOueE1FX0x48sjKqjOpjlIfq4WeZp9REr2YHEsoLFOBfgId5P3BPtpBQ== yubikey5" -"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPsu3vNsvBb/G+wALpstD/DnoRZ3fipAs00jtl8rzDuv96RlS7AJr4aNvG6Pt2D9SYn2wVLaiw+76mz2gOycH9/N+VCvL4/0MN9uqj+7XIcxNRo0gHVOblmi2bOXcmGKh3eRwHj1xyDwRxo9WIuBEP2bPpDPz75OXRtEdlTgvky7siSguQxJu03cb0p9hNAYhUoohNXyWW2CjDCLUQVE1+QRVUzsKq3KkPy0cHYgmZC1gRSMQyKpMt72L5tayLz3Tp/zrshucc+QO5IJeZdqMxsNAcvALsysT1J5EqxZoYH9VpWLRhSgVD6Nvn853pycJAlXQxgOCpSD3/v/JbgUe5NE+ci0o7NMy5IiHUv2gQMRIEhwBHlRGwokUPL9upx0lsjaEiPya5xQqqDKRom87xytM778ANS5CuMdQMWg9qVbpHZUHMjA0QmNkjPgq71pUDXHk5L4mZuS8wVjyjnvlw68yIJuHEc8P7QiLcjvRHFS2L9Ck8NRmPDTQXlQi9kk6LmMyu6fdevR/kZL21b+xO1e2DMyxBbNDTot8luppiiL8adgUDMwptpIne7JCWB1o9NFCbXUVgwuCCYBif6pOGSc6bGo1JTAKMflRlcy6Mi3t5H0mR2lj/sCSTWwTlP5FM4aPIq08NvW6PeuK1bFJY9fIgTwVsUnbAKOhmsMt62w== cardno:12 078 454" + "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDPsu3vNsvBb/G+wALpstD/DnoRZ3fipAs00jtl8rzDuv96RlS7AJr4aNvG6Pt2D9SYn2wVLaiw+76mz2gOycH9/N+VCvL4/0MN9uqj+7XIcxNRo0gHVOblmi2bOXcmGKh3eRwHj1xyDwRxo9WIuBEP2bPpDPz75OXRtEdlTgvky7siSguQxJu03cb0p9hNAYhUoohNXyWW2CjDCLUQVE1+QRVUzsKq3KkPy0cHYgmZC1gRSMQyKpMt72L5tayLz3Tp/zrshucc+QO5IJeZdqMxsNAcvALsysT1J5EqxZoYH9VpWLRhSgVD6Nvn853pycJAlXQxgOCpSD3/v/JbgUe5NE+ci0o7NMy5IiHUv2gQMRIEhwBHlRGwokUPL9upx0lsjaEiPya5xQqqDKRom87xytM778ANS5CuMdQMWg9qVbpHZUHMjA0QmNkjPgq71pUDXHk5L4mZuS8wVjyjnvlw68yIJuHEc8P7QiLcjvRHFS2L9Ck8NRmPDTQXlQi9kk6LmMyu6fdevR/kZL21b+xO1e2DMyxBbNDTot8luppiiL8adgUDMwptpIne7JCWB1o9NFCbXUVgwuCCYBif6pOGSc6bGo1JTAKMflRlcy6Mi3t5H0mR2lj/sCSTWwTlP5FM4aPIq08NvW6PeuK1bFJY9fIgTwVsUnbAKOhmsMt62w== cardno:12 078 454" "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAII74JrgGsDQ6r7tD7+k3ykxXV7DpeeFRscPMxrBsDPhz kat@goliath" ]; shell = pkgs.zsh; diff --git a/outputs.nix b/outputs.nix index 073ea9a3..aeed0d17 100644 --- a/outputs.nix +++ b/outputs.nix @@ -1,138 +1,194 @@ -{ self, utils, nixpkgs, darwin, home-manager, ragenix, scalpel, mach-nix, arcexprs, ... }@inputs: let - tree = (inputs.tree.tree { - inherit inputs; - folder = ./.; - config = { - "/" = { - excludes = [ - "flake" - "default" - ]; - }; - "system/modules" = { - functor = { - enable = true; - }; - }; - "nixos/modules" = { - functor = { - enable = true; - external = with (import (arcexprs + "/modules")).nixos; [ - base16 - base16-shared +{ + utils, + nixpkgs, + darwin, + home-manager, + ragenix, + scalpel, + nix-index-database, + arcexprs, + ... +} @ inputs: let + tree = + (inputs.tree.tree { + inherit inputs; + folder = ./.; + config = { + "/" = { + excludes = [ + "flake" + "default" ]; }; - }; - "home/modules" = { - functor = { - enable = true; - external = with (import (arcexprs + "/modules")).home-manager; [ - base16 - base16-shared - ]; + "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; - lib = inputs.nixpkgs.lib; + }) + .impure; + inherit (inputs.nixpkgs) lib; inherit (lib.lists) fold; - inherit (lib.attrsets) mapAttrs recursiveUpdate; - recursiveMergeAttrs = listOfAttrsets: fold (attrset: acc: recursiveUpdate attrset acc) {} listOfAttrsets; -in recursiveMergeAttrs [ - (utils.lib.mkFlake { - inherit self inputs; - supportedSystems = [ "x86_64-linux" "aarch64-linux" "aarch64-darwin" ]; - channelsConfig.allowUnfree = true; - - hostDefaults = { - system = "x86_64-linux"; - modules = [ - tree.system.modules + 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 + home.system ]; - extraArgs = { - inherit inputs tree; - }; + builder = + { + nixos = nixpkgs.lib.nixosSystem; + darwin = darwin.lib.darwinSystem; + macos = darwin.lib.darwinSystem; + } + .${toLower config.type}; + specialArgs = {inherit machine;} // defaultSpecialArgs; }; - - hosts = let - outputForSystem = system: { - "x86_64-linux" = "nixosConfigurations"; - "aarch64-darwin" = "darwinConfigurations"; - }.${system}; - builderForSystem = system: { - "x86_64-linux" = nixpkgs.lib.nixosSystem; - "aarch64-darwin" = darwin.lib.darwinSystem; - }.${system}; - modulesForSystem = system: { - "x86_64-linux" = [ - home-manager.nixosModules.home-manager - ragenix.nixosModules.age - tree.nixos.modules - ]; - "aarch64-darwin" = [ - home-manager.darwinModules.home-manager - ragenix.nixosModules.age - tree.darwin.modules - ]; - }.${system}; - mapSystem = system: name: path: { - inherit system; - output = outputForSystem system; - builder = builderForSystem system; - modules = (modulesForSystem system) ++ [ - path - ]; - extraArgs = { + }; + hostConfigs = mapAttrs (name: path: + evalModules { + modules = [ + hostModule + path + ]; + specialArgs = + { machine = name; - }; - }; - in mapAttrs (mapSystem "x86_64-linux") tree.nixos.systems - // mapAttrs (mapSystem "aarch64-darwin") tree.darwin.systems; - - outputsBuilder = channels: { - nixosConfigurations = mapAttrs(_: sys: sys.extendModules { - modules = [ scalpel.nixosModule ]; - specialArgs = { - prev = sys; - }; - }) self.nixosConfigurations; - - homeManagerConfigurations = mapAttrs (name: path: home-manager.lib.homeManagerConfiguration { - pkgs = channels.nixpkgs; - extraSpecialArgs = { - inherit channels inputs tree; - machine = name; - nixos = {}; - }; - modules = [ - tree.system.modules - tree.home.common - path - ]; - }) tree.home.profiles; - - devShells = { - rust = with channels.nixpkgs; mkShell { - nativeBuildInputs = [ - cargo - rustc - rustfmt - rustPackages.clippy - rust-analyzer - ]; - RUST_SRC_PATH = rustPlatform.rustLibSrc; - }; - }; - inherit tree; - }; - }) - (utils.lib.eachDefaultSystem (system: { - devShells.python = nixpkgs.legacyPackages."${system}".mkShell { - buildInputs = let - pythonWithPkgs = mach-nix.lib."${system}".mkPython { - ignoreDataOutdated = true; - python = "python310"; - }; in [ pythonWithPkgs ]; + } + // 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 + recursiveMergeAttrs (mapAttrsToList processHost hostConfigs) + // { + 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; }; })) -] diff --git a/shells/nix.nix b/shells/nix.nix new file mode 100644 index 00000000..da8d597b --- /dev/null +++ b/shells/nix.nix @@ -0,0 +1,9 @@ +{pkgs, ...}: +with pkgs; + mkShell { + nativeBuildInputs = [ + deadnix # dead-code scanner + alejandra # code formatter + statix # anti-pattern finder + ]; + } diff --git a/shells/repo.nix b/shells/repo.nix new file mode 100644 index 00000000..67173fb5 --- /dev/null +++ b/shells/repo.nix @@ -0,0 +1,15 @@ +{pkgs, inputs, system, ...}: with pkgs; let + repo = import ../outputs.nix (inputs // { inherit inputs system; }); + inherit (lib.attrsets) mapAttrsToList; +in + mkShell { + nativeBuildInputs = [ + deadnix # dead-code scanner + alejandra # code formatter + statix # anti-pattern finder + ] ++ mapAttrsToList (name: _: + (pkgs.writeShellScriptBin "${name}-rebuild" '' + darwin-rebuild switch --flake ${toString ../.}#${name} + '')) + repo.darwinConfigurations; + } diff --git a/shells/rust.nix b/shells/rust.nix new file mode 100644 index 00000000..1a9fea11 --- /dev/null +++ b/shells/rust.nix @@ -0,0 +1,12 @@ +{pkgs, ...}: +with pkgs; + mkShell { + nativeBuildInputs = [ + cargo + rustc + rustfmt + rustPackages.clippy + rust-analyzer + ]; + RUST_SRC_PATH = rustPlatform.rustLibSrc; + } diff --git a/system/modules/roles.nix b/system/modules/roles.nix deleted file mode 100644 index fd1e38c1..00000000 --- a/system/modules/roles.nix +++ /dev/null @@ -1,34 +0,0 @@ -{ config, lib, ... }: let - inherit (lib.options) mkOption mdDoc; - inherit (lib.types) bool; -in { - options = { - role = { - server = mkOption { - type = bool; - description = mdDoc "Is this system's role as a server?"; - default = false; - }; - personal = mkOption { - type = bool; - description = mdDoc "Is this system's role as a personal device?"; - default = false; - }; - development = mkOption { - type = bool; - description = mdDoc "Is this system's role as a development device?"; - default = false; - }; - laptop = mkOption { - type = bool; - description = mdDoc "Is this system's role as a laptop?"; - default = false; - }; - gnome = mkOption { - type = bool; - description = mdDoc "Does this system's role include running GNOME?"; - default = false; - }; - }; - }; -} diff --git a/systems/koishi.nix b/systems/koishi.nix new file mode 100644 index 00000000..aec49cc4 --- /dev/null +++ b/systems/koishi.nix @@ -0,0 +1,60 @@ +_: let + hostConfig = { + tree, + ... + }: { + imports = with tree; [ + nixos.gnome + ]; + + fileSystems = { + "/" = { + device = "/dev/disk/by-uuid/a664de0f-9883-420e-acc5-b9602a23e816"; + fsType = "xfs"; + }; + "/boot" = { + device = "/dev/disk/by-uuid/DEBC-8F03"; + fsType = "vfat"; + }; + }; + + swapDevices = [ + {device = "/dev/disk/by-uuid/0d846453-95b4-46e1-8eaf-b910b4321ef0";} + ]; + + boot = { + supportedFilesystems = ["xfs"]; + initrd.luks.devices."cryptroot".device = "/dev/disk/by-uuid/f0ea08b4-6af7-4d90-a2ad-edd5672a2105"; + loader = { + efi = { + canTouchEfiVariables = true; + efiSysMountPoint = "/boot"; + }; + grub = { + devices = ["nodev"]; + efiSupport = true; + enable = true; + extraEntries = '' + menuentry "Windows" { + insmod part_gpt + insmod fat + insmod search_fs_uuid + insmod chain + search --fs-uuid --set=root DEBC-8F03 + chainloader /EFI/Microsoft/Boot/bootmgfw.efi + } + ''; + version = 2; + }; + }; + }; + + system.stateVersion = "21.11"; + }; +in { + arch = "x86_64"; + type = "NixOS"; + modules = [ + hostConfig + ]; +} diff --git a/systems/sumireko.nix b/systems/sumireko.nix new file mode 100644 index 00000000..fb890f17 --- /dev/null +++ b/systems/sumireko.nix @@ -0,0 +1,11 @@ +_: let + hostConfig = _: { + system.stateVersion = 4; + }; +in { + arch = "aarch64"; + type = "macOS"; + modules = [ + hostConfig + ]; +}