diff --git a/nix/configuration/flake.lock b/nix/configuration/flake.lock index 8b0048b..e64af3f 100644 --- a/nix/configuration/flake.lock +++ b/nix/configuration/flake.lock @@ -76,6 +76,24 @@ "type": "github" } }, + "flake-utils_2": { + "inputs": { + "systems": "systems_2" + }, + "locked": { + "lastModified": 1731533236, + "narHash": "sha256-l0KFg5HjrsfsO/JpG+r7fRrqm12kzFHyUHqHCVpMMbI=", + "owner": "numtide", + "repo": "flake-utils", + "rev": "11707dc2f618dd54ca8739b309ec4fc024de578b", + "type": "github" + }, + "original": { + "owner": "numtide", + "repo": "flake-utils", + "type": "github" + } + }, "gitignore": { "inputs": { "nixpkgs": [ @@ -259,7 +277,8 @@ "lanzaboote": "lanzaboote", "nixpkgs": "nixpkgs", "nixpkgs-b93b4e9b5": "nixpkgs-b93b4e9b5", - "nixpkgs-unstable": "nixpkgs-unstable" + "nixpkgs-unstable": "nixpkgs-unstable", + "zsh-histdb": "zsh-histdb" } }, "rust-overlay": { @@ -301,6 +320,39 @@ "repo": "default", "type": "github" } + }, + "systems_2": { + "locked": { + "lastModified": 1681028828, + "narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=", + "owner": "nix-systems", + "repo": "default", + "rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e", + "type": "github" + }, + "original": { + "owner": "nix-systems", + "repo": "default", + "type": "github" + } + }, + "zsh-histdb": { + "inputs": { + "flake-utils": "flake-utils_2", + "nixpkgs": [ + "nixpkgs" + ] + }, + "locked": { + "lastModified": 1, + "narHash": "sha256-vPz7cJzdLAWFWQQ/KSXGB+HsUfO8CnPX4AO4zjf9llo=", + "path": "flakes/zsh-histdb", + "type": "path" + }, + "original": { + "path": "flakes/zsh-histdb", + "type": "path" + } } }, "root": "root", diff --git a/nix/configuration/flake.nix b/nix/configuration/flake.nix index 63bd9e2..a320118 100644 --- a/nix/configuration/flake.nix +++ b/nix/configuration/flake.nix @@ -38,6 +38,12 @@ lanzaboote = { url = "github:nix-community/lanzaboote/v0.4.1"; + # Optional but recommended to limit the size of your system closure. + inputs.nixpkgs.follows = "nixpkgs"; + }; + zsh-histdb = { + url = "path:flakes/zsh-histdb"; + # Optional but recommended to limit the size of your system closure. inputs.nixpkgs.follows = "nixpkgs"; }; @@ -52,6 +58,7 @@ impermanence, home-manager, lanzaboote, + zsh-histdb, ... }@inputs: let @@ -73,6 +80,7 @@ home-manager.useGlobalPkgs = true; home-manager.useUserPackages = true; } + { nixpkgs.overlays = [ zsh-histdb.overlays.default ]; } ./configuration.nix ]; }; diff --git a/nix/configuration/roles/zsh/default.nix b/nix/configuration/roles/zsh/default.nix index ec8801a..d4d254b 100644 --- a/nix/configuration/roles/zsh/default.nix +++ b/nix/configuration/roles/zsh/default.nix @@ -5,13 +5,94 @@ ... }: +let + zshrc = pkgs.writeTextFile { + name = ".zshrc"; + text = '' + # Lines configured by zsh-newuser-install + HISTFILE=~/.zhistory + HISTSIZE=100000 + SAVEHIST=100000 + setopt appendhistory notify + unsetopt beep + bindkey -e + # End of lines configured by zsh-newuser-install + # The following lines were added by compinstall + # + + # Use menu complete immediately instead of after the first tab + setopt MENU_COMPLETE + + zstyle :compinstall filename "$HOME/.zshrc" + + autoload -Uz compinit + compinit + # End of lines added by compinstall + + # Enable the 2d menu for tab completion + zstyle ':completion:*' menu select + + autoload colors zsh/terminfo + if [[ "$terminfo[colors]" -ge 8 ]]; then + colors + fi + for color in RED GREEN YELLOW BLUE MAGENTA CYAN WHITE; do + eval PR_$color='%{$terminfo[bold]$fg[''${(L)color}]%}' + eval PR_LIGHT_$color='%{$fg[''${(L)color}]%}' + (( count = $count + 1 )) + done + PR_NO_COLOR="%{$terminfo[sgr0]%}" + PS1="[$PR_BLUE%n$PR_WHITE@$PR_GREEN%U%m%u$PR_NO_COLOR:$PR_RED%2c$PR_NO_COLOR]%(!.#.$) " + + source ${pkgs.zsh-histdb}/share/zsh/plugins/zsh-histdb/sqlite-history.zsh + autoload -Uz add-zsh-hook + + source ${pkgs.zsh-histdb}/share/zsh/plugins/zsh-histdb/histdb-interactive.zsh + bindkey '^r' _histdb-isearch + + # TODO: Consider moving to /etc/profile.d + #while read file; do + # if [ -e "$file" ]; then + # source "$file" + # fi + #done <<<"$(find $HOME/.config/ansible_deploy/zshrc -maxdepth 1 -type f -name '*.zsh' -print)" + ''; + }; +in { imports = [ ]; environment.systemPackages = with pkgs; [ zsh + sqlite # TODO: can this be pulled into zsh-histdb automatically? ]; users.users.talexander.shell = pkgs.zsh; environment.shells = with pkgs; [ zsh ]; + + programs.zsh = { + enable = true; + }; + + home-manager.users.talexander = + { pkgs, ... }: + { + home.file.".zshrc" = { + source = "${zshrc}"; + }; + }; + + environment.persistence."/persist" = lib.mkIf (!config.me.buildingIso) { + hideMounts = true; + users.talexander = { + directories = [ + { + directory = ".histdb"; + user = "talexander"; + group = "talexander"; + mode = "0700"; + } + ]; + }; + }; }