summaryrefslogtreecommitdiff
path: root/home
diff options
context:
space:
mode:
authorGrace Yoder <grace_yoder@outlook.com>2026-09-03 15:36:32 -0400
committerGrace Yoder <grace_yoder@outlook.com>2026-09-03 15:37:10 -0400
commit22b6712c240fea0643cfc01acfce1fda1f125b8a (patch)
treefb8ac2302793c76d3640aab7d3f74f7a57c01933 /home
nix init
Diffstat (limited to 'home')
-rw-r--r--home/base.nix16
-rw-r--r--home/cs_purdue.nix12
-rw-r--r--home/ghostty.nix35
-rw-r--r--home/helix.nix580
-rw-r--r--home/langs.nix20
-rw-r--r--home/packages.nix13
-rw-r--r--home/pkgs_mac.nix8
-rw-r--r--home/shell.nix461
-rw-r--r--home/tmux.nix48
-rw-r--r--home/typst.nix20
-rw-r--r--home/vcs.nix33
-rw-r--r--home/vim.nix15
12 files changed, 1261 insertions, 0 deletions
diff --git a/home/base.nix b/home/base.nix
new file mode 100644
index 0000000..03e1ff3
--- /dev/null
+++ b/home/base.nix
@@ -0,0 +1,16 @@
+{ config, ... }:
+
+{
+ home = {
+ stateVersion = "26.05";
+
+ sessionVariables = {
+ XDG_CONFIG_HOME = "${config.home.homeDirectory}/.config";
+ EDITOR = "nvim";
+ VISUAL = "nvim";
+ };
+ };
+
+ xdg.enable = true;
+ programs.home-manager.enable = true;
+}
diff --git a/home/cs_purdue.nix b/home/cs_purdue.nix
new file mode 100644
index 0000000..b74df52
--- /dev/null
+++ b/home/cs_purdue.nix
@@ -0,0 +1,12 @@
+{ ... }:
+
+{
+ home.sessionVariables = {
+ CS_CLASS = "cortex";
+ CS_SERVER = "xinuserver";
+ };
+
+ home.sessionPath = [
+ "/p/xinu/bin"
+ ];
+}
diff --git a/home/ghostty.nix b/home/ghostty.nix
new file mode 100644
index 0000000..b954f42
--- /dev/null
+++ b/home/ghostty.nix
@@ -0,0 +1,35 @@
+{ pkgs, ... }:
+
+{
+ programs.ghostty = {
+ enable = true;
+
+ package = pkgs.ghostty-bin;
+ enableFishIntegration = true;
+
+ settings = {
+ clipboard-read = "allow";
+ clipboard-write = "allow";
+ copy-on-select = true;
+ theme = "Rose Pine";
+ font-family = "ComicCode Nerd Font SemiBold";
+ font-style-italic = "ComicCode Nerd Font Light";
+ macos-option-as-alt = "left";
+ macos-icon = "blueprint";
+ font-feature = [
+ "-calt"
+ "-liga"
+ "-dlig"
+ ];
+ cursor-click-to-move = true;
+ keybind = [
+ "global:cmd+grave_accent=toggle_quick_terminal"
+ # "alt+i=inspector:toggle"
+ "super+t=unbind"
+ ];
+ quick-terminal-position = "center";
+ quick-terminal-animation-duration = 0.1;
+ };
+ };
+
+}
diff --git a/home/helix.nix b/home/helix.nix
new file mode 100644
index 0000000..1fe17fb
--- /dev/null
+++ b/home/helix.nix
@@ -0,0 +1,580 @@
+{ pkgs, ... }:
+
+let
+ wRoots =
+ roots:
+ roots
+ ++ [
+ ".jj"
+ ".git"
+ ];
+
+in
+{
+ home.packages = [
+ pkgs.nerd-fonts.symbols-only
+ ];
+
+ xdg.configFile."helix/ignore".text = ''
+ .git/
+ node_modules/
+ build/
+ '';
+
+ programs.helix = {
+ enable = true;
+ package = pkgs.helix;
+ defaultEditor = false;
+ settings = {
+ theme = "grace_rose_pine";
+ editor = {
+ clipboard-provider = "termcode";
+ bufferline = "multiple";
+ color-modes = true;
+ default-yank-register = "+";
+ cursorline = true;
+ cursorcolumn = true;
+ continue-comments = false;
+ line-number = "relative";
+ text-width = 100;
+ soft-wrap = {
+ enable = true;
+ max-indent-retain = 40;
+ wrap-at-text-width = true;
+ wrap-indicator = " ";
+ };
+ indent-guides = {
+ render = true;
+ character = "┆";
+ };
+ lsp = {
+ display-messages = true;
+ };
+
+ file-picker = {
+ hidden = false;
+ ignore = true;
+ git-ignore = true;
+ git-global = true;
+ git-exclude = true;
+ };
+
+ statusline = {
+ left = [
+ "mode"
+ "separator"
+ "spinner"
+ "version-control"
+ "file-name"
+ "read-only-indicator"
+ "file-modification-indicator"
+ ];
+ center = [ ];
+ right = [
+ "diagnostics"
+ "workspace-diagnostics"
+ "selections"
+ "position-percentage"
+ "position"
+ "file-type"
+ ];
+ separator = "";
+ mode = {
+ normal = "  NOR ";
+ insert = "  INS ";
+ select = "  SEL ";
+ };
+
+ };
+ };
+ keys.normal = {
+ "C-w" = "no_op";
+ "C-r" = ":reload";
+ y = "yank_to_clipboard";
+ p = "paste_clipboard_after";
+ P = "paste_clipboard_before";
+ space = {
+ t = ":new";
+ v = "vsplit";
+ };
+ };
+ keys.select = {
+ "C-w" = "no_op";
+ };
+ };
+
+ languages = {
+ language-server = {
+ nixd = {
+ command = "${pkgs.nixd}/bin/nixd";
+ };
+ nil = {
+ command = "${pkgs.nil}/bin/nil";
+ };
+ luals = {
+ command = "${pkgs.lua-language-server}/bin/lua-language-server";
+ };
+
+ pyright = {
+ command = "${pkgs.pyright}/bin/pyright-langserver";
+ args = [ "--stdio" ];
+ config = {
+ python.analysis = {
+ autoSearchPaths = true;
+ useLibraryCodeForTypes = true;
+ diagnosticMode = "openFilesOnly";
+ };
+ };
+ };
+
+ ruff = {
+ command = "${pkgs.ruff}/bin/ruff";
+ args = [ "server" ];
+ };
+
+ clangd = {
+ command = "${pkgs.clang-tools}/bin/clangd";
+ args = [
+ "--background-index"
+ "--offset-encoding=utf-8"
+ "--query-driver=/Users/scie/.platformio/packages/toolchain-xtensa-esp32/**"
+ "--query-driver=/Users/scie/.platformio/packages/framework-arduinoststm32/**"
+ ];
+ };
+
+ tailwindcss = {
+ command = "${pkgs.tailwindcss-language-server}/bin/tailwindcss-language-server";
+ args = [ "--stdio" ];
+ };
+
+ zls.command = "${pkgs.zls}/bin/zls";
+ gopls.command = "${pkgs.gopls}/bin/gopls";
+
+ tinymist = {
+ command = "${pkgs.tinymist}/bin/tinymist";
+ config.tinymist.formatterMode = "typstyle";
+ };
+
+ rust-analyzer = {
+ command = "${pkgs.rust-analyzer}/bin/rust-analyzer";
+ config."rust-analyzer" = {
+ check.command = "clippy";
+ diagnostics.enable = true;
+ };
+ };
+
+ gdscript = {
+ command = "${pkgs.netcat}/bin/nc";
+ args = [
+ "127.0.0.1"
+ "6005"
+ ];
+ };
+
+ # csharp-ls = {
+ # command = "${pkgs.csharp-ls}/bin/csharp-ls";
+ # config.AutomaticWorkspaceInit = true;
+ # };
+
+ asm-lsp.command = "${pkgs.asm-lsp}/bin/asm-lsp";
+
+ codebook = {
+ command = "${pkgs.codebook}/bin/codebook-lsp";
+ args = [ "serve" ];
+ };
+
+ json = {
+ command = "${pkgs.vscode-langservers-extracted}/bin/vscode-json-language-server";
+ args = [ "--stdio" ];
+ config.provideFormatter = true;
+ };
+
+ eslint = {
+ command = "${pkgs.vscode-langservers-extracted}/bin/vscode-eslint-language-server";
+ args = [ "--stdio" ];
+ };
+
+ css = {
+ command = "${pkgs.vscode-langservers-extracted}/bin/vscode-css-language-server";
+ args = [ "--stdio" ];
+ };
+
+ html = {
+ command = "${pkgs.vscode-langservers-extracted}/bin/vscode-html-language-server";
+ args = [ "--stdio" ];
+ config = {
+ provideFormatter = true;
+ embeddedLanguages = {
+ css = true;
+ javascript = true;
+ };
+ configurationSection = [
+ "html"
+ "css"
+ "javascript"
+ ];
+ };
+ };
+
+ fish = {
+ command = "${pkgs.fish-lsp}/bin/fish-lsp";
+ args = [ "start" ];
+ };
+
+ astro = {
+ command = "${pkgs.astro-language-server}/bin/astro-ls";
+ args = [ "--stdio" ];
+ config.typescript.tsdk = "./node_modules/typescript/lib";
+ };
+ };
+
+ language = [
+ {
+ name = "nix";
+ scope = "source.nix";
+ file-types = [ "nix" ];
+ language-servers = [
+ "nixd"
+ "nil"
+ "codebook"
+ ];
+ formatter.command = "${pkgs.nixfmt}/bin/nixfmt";
+ auto-format = true;
+ roots = wRoots [ ];
+ }
+ {
+ name = "lua";
+ scope = "source.lua";
+ file-types = [ "lua" ];
+ language-servers = [
+ "luals"
+ "codebook"
+ ];
+ roots = wRoots [
+ ".luarc.json"
+ ".luarc.jsonc"
+ ];
+ }
+ {
+ name = "python";
+ scope = "source.python";
+ file-types = [
+ "py"
+ "pyi"
+ ];
+ language-servers = [
+ "pyright"
+ "ruff"
+ "codebook"
+ ];
+ roots = wRoots [
+ "pyproject.toml"
+ "setup.py"
+ "setup.cfg"
+ "requirements.txt"
+ "Pipfile"
+ "pyrightconfig.json"
+ ];
+ }
+ {
+ name = "c";
+ scope = "source.c";
+ file-types = [
+ "c"
+ "h"
+ "arduino"
+ ];
+ language-servers = [
+ "clangd"
+ "codebook"
+ ];
+ roots = wRoots [
+ ".clangd"
+ ".clang-tidy"
+ ".clang-format"
+ "compile_commands.json"
+ "compile_flags.txt"
+ "configure.ac"
+ ];
+ }
+ {
+ name = "cpp";
+ scope = "source.cpp";
+ file-types = [
+ "cc"
+ "hh"
+ "cxx"
+ "hpp"
+ "cpp"
+ "hxx"
+ "proto"
+ ];
+ language-servers = [
+ "clangd"
+ "codebook"
+ ];
+ roots = wRoots [
+ ".clangd"
+ ".clang-tidy"
+ ".clang-format"
+ "compile_commands.json"
+ "compile_flags.txt"
+ "configure.ac"
+ ];
+ }
+ {
+ name = "zig";
+ scope = "source.zig";
+ file-types = [ "zig" ];
+ language-servers = [
+ "zls"
+ "codebook"
+ ];
+ roots = wRoots [
+ "zls.json"
+ "build.zig"
+ ];
+ }
+ {
+ name = "go";
+ scope = "source.go";
+ file-types = [
+ "go"
+ "gomod"
+ "gowork"
+ "gotmpl"
+ ];
+ language-servers = [
+ "gopls"
+ "codebook"
+ ];
+ roots = wRoots [
+ "go.work"
+ "go.mod"
+ ];
+ }
+ {
+ name = "typst";
+ scope = "source.typst";
+ file-types = [ "typ" ];
+ language-servers = [
+ "tinymist"
+ "codebook"
+ ];
+ roots = wRoots [ ];
+ text-width = 80;
+ soft-wrap = {
+ enable = true;
+ max-indent-retain = 40;
+ wrap-at-text-width = true;
+ wrap-indicator = " ";
+ };
+ }
+ {
+ name = "markdown";
+ language-servers = [ "codebook" ];
+ roots = wRoots [ ];
+ text-width = 80;
+ soft-wrap = {
+ enable = true;
+ max-indent-retain = 40;
+ wrap-at-text-width = true;
+ wrap-indicator = " ";
+ };
+ }
+ {
+ name = "rust";
+ scope = "source.rust";
+ file-types = [ "rs" ];
+ language-servers = [
+ "rust-analyzer"
+ "codebook"
+ ];
+ roots = wRoots [
+ "Cargo.toml"
+ "Cargo.lock"
+ ];
+ }
+ {
+ name = "gdscript";
+ scope = "source.gdscript";
+ file-types = [ "gd" ];
+ language-servers = [ "gdscript" ];
+ roots = wRoots [
+ "project.godot"
+ ];
+ }
+ {
+ name = "c-sharp";
+ scope = "source.cs";
+ file-types = [ "cs" ];
+ language-servers = [ "csharp-ls" ];
+ roots = wRoots [ ];
+ }
+ {
+ name = "asm";
+ scope = "source.asm";
+ file-types = [
+ "s"
+ "S"
+ "asm"
+ ];
+ language-servers = [ "asm-lsp" ];
+ roots = wRoots [
+ ".asm-lsp.toml"
+ ];
+ }
+ {
+ name = "json";
+ scope = "source.json";
+ file-types = [
+ "json"
+ "jsonc"
+ ];
+ language-servers = [
+ "json"
+ "codebook"
+ ];
+ roots = wRoots [ ];
+ }
+ {
+ name = "javascript";
+ scope = "source.js";
+ file-types = [
+ "js"
+ "jsx"
+ "mjs"
+ "cjs"
+ ];
+ language-servers = [
+ "eslint"
+ "tailwindcss"
+ "codebook"
+ ];
+ roots = wRoots [
+ "package.json"
+ ];
+ }
+ {
+ name = "typescript";
+ scope = "source.ts";
+ file-types = [
+ "ts"
+ "tsx"
+ "mts"
+ "cts"
+ ];
+ language-servers = [
+ "eslint"
+ "tailwindcss"
+ "codebook"
+ ];
+ roots = wRoots [
+ "package.json"
+ "tsconfig.json"
+ ];
+ }
+ {
+ name = "html";
+ scope = "source.html";
+ file-types = [ "html" ];
+ language-servers = [
+ "html"
+ "tailwindcss"
+ "codebook"
+ ];
+ roots = wRoots [
+ "package.json"
+ ];
+ }
+ {
+ name = "css";
+ scope = "source.css";
+ file-types = [
+ "css"
+ "scss"
+ "less"
+ ];
+ language-servers = [
+ "css"
+ "tailwindcss"
+ "codebook"
+ ];
+ roots = wRoots [
+ "package.json"
+ ];
+ }
+ {
+ name = "astro";
+ scope = "source.astro";
+ file-types = [ "astro" ];
+ language-servers = [
+ "astro"
+ "eslint"
+ "tailwindcss"
+ ];
+ roots = wRoots [
+ "package.json"
+ "tsconfig.json"
+ "jsconfig.json"
+ ];
+ }
+ {
+ name = "fish";
+ scope = "source.fish";
+ file-types = [ "fish" ];
+ language-servers = [ "fish" ];
+ roots = wRoots [
+ "config.fish"
+ ];
+ }
+ ];
+ };
+
+ themes.grace_rose_pine = {
+ inherits = "rose_pine_moon";
+
+ "ui.statusline" = {
+ fg = "text";
+ bg = "surface";
+ };
+ "ui.statusline.inactive" = {
+ fg = "muted";
+ bg = "base";
+ };
+ "ui.statusline.normal" = {
+ fg = "base";
+ bg = "pine";
+ modifiers = [ "bold" ];
+ };
+ "ui.statusline.insert" = {
+ fg = "base";
+ bg = "pine";
+ modifiers = [ "bold" ];
+ };
+ "ui.statusline.select" = {
+ fg = "base";
+ bg = "pine";
+ modifiers = [ "bold" ];
+ };
+ "ui.statusline.separator" = {
+ fg = "pine";
+ bg = "surface";
+ };
+ "ui.bufferline" = {
+ fg = "subtle";
+ bg = "base";
+ };
+ "ui.bufferline.active" = {
+ fg = "base";
+ bg = "rose";
+ modifiers = [ "bold" ];
+ };
+ "ui.bufferline.background" = {
+ bg = "base";
+ };
+ };
+
+ };
+
+}
diff --git a/home/langs.nix b/home/langs.nix
new file mode 100644
index 0000000..1a25791
--- /dev/null
+++ b/home/langs.nix
@@ -0,0 +1,20 @@
+{ pkgs, ... }:
+
+{
+ home.packages = with pkgs; [
+ go
+ rustup
+ llvm
+ nodejs_22
+ typst
+ zig
+ python313
+
+ # Build and language-specific tooling.
+ cmake
+ gnumake
+ just
+ uv
+ platformio-core
+ ];
+}
diff --git a/home/packages.nix b/home/packages.nix
new file mode 100644
index 0000000..83c65e1
--- /dev/null
+++ b/home/packages.nix
@@ -0,0 +1,13 @@
+{ pkgs, ... }:
+
+{
+ home.packages = with pkgs; [
+ neovim
+ tree-sitter
+
+ sqlite
+ podman
+
+ # kicad
+ ];
+}
diff --git a/home/pkgs_mac.nix b/home/pkgs_mac.nix
new file mode 100644
index 0000000..08d63e4
--- /dev/null
+++ b/home/pkgs_mac.nix
@@ -0,0 +1,8 @@
+{ pkgs, ... }:
+
+{
+ home.packages = with pkgs; [
+ utm
+ vesktop
+ ];
+}
diff --git a/home/shell.nix b/home/shell.nix
new file mode 100644
index 0000000..9788b58
--- /dev/null
+++ b/home/shell.nix
@@ -0,0 +1,461 @@
+{
+ config,
+ lib,
+ pkgs,
+ ...
+}:
+
+let
+ dots = toString ./..;
+in
+{
+ home.packages = with pkgs; [
+ pfetch-rs
+ sesh
+ ripgrep
+ dust
+ tree
+ btop
+ curl
+ fd
+ uutils-coreutils
+ wget
+ jq
+ yq
+ yj
+ most
+ asciinema
+ bash
+ openssh
+ openssl
+ ];
+
+ xdg.configFile."fish/themes/rose_pine.theme".source =
+ config.lib.file.mkOutOfStoreSymlink "${dots}/fish/rose_pine.theme";
+
+ programs.fish = {
+ enable = true;
+
+ shellAliases = {
+ setupidf = "source /opt/esp/esp-idf/export.fish";
+ pysource = "source .venv/bin/activate.fish";
+ tcl = "clear && clear";
+ tclear = "clear && clear";
+ };
+
+ functions = {
+ ask = {
+ description = "Ask for input and respond with input";
+ body = ''
+ read -s -P "Enter Input: " response
+ echo $response
+ '';
+ };
+
+ loadenv = ''
+ argparse h/help print printb U/unload -- $argv
+ or return 1
+
+ if set -q _flag_help
+ echo "Usage: loadenv [OPTIONS] [FILE]"
+ echo ""
+ echo "Export keys and values from a dotenv file."
+ echo ""
+ echo "Options:"
+ echo " --help, -h Show this help message"
+ echo " --print Print env keys (export preview)"
+ echo " --printb Print keys with surrounding brackets"
+ echo " --unload, -U Unexport all keys defined in the dotenv file"
+ echo ""
+ echo "Arguments:"
+ echo " FILE Path to dotenv file (default: .env)"
+ return 0
+ end
+
+ if test (count $argv) -gt 1
+ echo "Too many arguments. Only one argument is allowed. Use --help for more information."
+ return 1
+ end
+
+ set -l dotenv_file ".env"
+ if test (count $argv) -eq 1
+ set dotenv_file $argv[1]
+ end
+
+ if not test -f $dotenv_file
+ echo "Error: File '$dotenv_file' not found in the current directory."
+ return 1
+ end
+
+ set -l mode load
+ if set -q _flag_print
+ set mode print
+ else if set -q _flag_printb
+ set mode printb
+ else if set -q _flag_unload
+ set mode unload
+ end
+
+ set lineNumber 0
+
+ for line in (cat $dotenv_file)
+ set lineNumber (math $lineNumber + 1)
+
+ if string match -qr '^\s*$|^\s*#' $line
+ continue
+ end
+
+ if not string match -qr '^[A-Za-z_][A-Za-z0-9_]*=' $line
+ echo "Error: invalid declaration (line $lineNumber): $line"
+ return 1
+ end
+
+ set -l key (string split -m 1 '=' $line)[1]
+ set -l after_equals_sign (string split -m 1 '=' $line)[2]
+
+ set -l value
+ set -l double_quoted_value_regex '^"(.*)"\s*(?:#.*)*$'
+ set -l single_quoted_value_regex '^\'(.*)\'\s*(?:#.*)*$'
+ set -l plain_value_regex '^([^\'"\s]*)\s*(?:#.*)*$'
+ if string match -qgr $double_quoted_value_regex $after_equals_sign
+ set value (string match -gr $double_quoted_value_regex $after_equals_sign)
+ else if string match -qgr $single_quoted_value_regex $after_equals_sign
+ set value (string match -gr $single_quoted_value_regex $after_equals_sign)
+ else if string match -qgr $plain_value_regex $after_equals_sign
+ set value (string match -gr $plain_value_regex $after_equals_sign)
+ else
+ echo "Error: invalid value (line $lineNumber): $line"
+ return 1
+ end
+
+ switch $mode
+ case print
+ echo "$key=$value"
+ case printb
+ echo "[$key=$value]"
+ case load
+ set -gx $key $value
+ case unload
+ set -e $key
+ end
+ end
+ '';
+
+ # Broken :/
+ nix = {
+ wraps = "nix";
+ body = ''
+ if test (count $argv) -gt 0; and test "$argv[1]" = shell
+ set -lx STARSHIP_NIX_SHELL shell
+ end
+
+ command nix $argv
+ '';
+ };
+ };
+
+ interactiveShellInit = ''
+ set -g fish_greeting ""
+ fish_vi_key_bindings
+ fish_config theme choose rose_pine
+ pfetch
+ '';
+ };
+
+ programs.fzf = {
+ enable = true;
+ enableFishIntegration = true;
+ };
+
+ programs.zoxide = {
+ enable = true;
+ enableFishIntegration = true;
+ };
+
+ programs.starship = {
+ enable = true;
+ enableFishIntegration = true;
+ extraPackages = [
+ pkgs.jj-starship
+ ];
+
+ settings = {
+ format = lib.concatStrings [
+ "$hostname"
+ "$username"
+ "$directory"
+ "$git_branch"
+ "$git_status"
+ "\${custom.jj}"
+ "\${custom.git_status}"
+ "$fill"
+ "\${env_var.NIX_SHELL}"
+ "$c"
+ "$elixir"
+ "$elm"
+ "$golang"
+ "$haskell"
+ "$java"
+ "$julia"
+ "$nodejs"
+ "$nim"
+ "$rust"
+ "$scala"
+ "$conda"
+ "$python"
+ "$time"
+ "\n"
+ "[❯](fg:iris) "
+ ];
+
+ palette = "rose-pine";
+
+ palettes = {
+ rose-pine = {
+ overlay = "#26233a";
+ love = "#eb6f92";
+ gold = "#f6c177";
+ rose = "#ebbcba";
+ pine = "#31748f";
+ foam = "#9ccfd8";
+ iris = "#c4a7e7";
+ };
+ };
+
+ directory = {
+ format = "[](fg:overlay)[ $path ]($style)[](fg:overlay) ";
+ style = "bg:overlay fg:pine";
+ truncation_length = 3;
+ truncation_symbol = "…/";
+
+ substitutions = {
+ Documents = "󰈙";
+ Downloads = " ";
+ Music = " ";
+ Pictures = " ";
+ };
+ };
+
+ fill = {
+ style = "fg:overlay";
+ symbol = " ";
+ };
+
+ git_branch = {
+ disabled = true;
+ format = "[](fg:overlay)[ $symbol $branch ]($style)[](fg:overlay) ";
+ style = "bg:overlay fg:foam";
+ symbol = "";
+ };
+
+ git_status = {
+ disabled = true;
+ style = "bg:overlay fg:love";
+ format = "[](fg:overlay)([$all_status$ahead_behind]($style))[](fg:overlay) ";
+
+ up_to_date = "[ ✓ ](bg:overlay fg:iris)";
+
+ untracked = ''[?\($count\)](bg:overlay fg:gold)'';
+
+ stashed = ''[\$](bg:overlay fg:iris)'';
+
+ modified = ''[!\($count\)](bg:overlay fg:gold)'';
+
+ renamed = ''[»\($count\)](bg:overlay fg:iris)'';
+
+ deleted = ''[✘\($count\)](style)'';
+
+ staged = ''[++\($count\)](bg:overlay fg:gold)'';
+
+ ahead = ''[⇡\(''${count}\)](bg:overlay fg:foam)'';
+
+ diverged = ''⇕[\[](bg:overlay fg:iris)[⇡\(''${ahead_count}\)](bg:overlay fg:foam)[⇣\(''${behind_count}\)](bg:overlay fg:rose)[\]](bg:overlay fg:iris)'';
+
+ behind = ''[⇣\(''${count}\)](bg:overlay fg:rose)'';
+ };
+
+ custom = {
+ jj = {
+ command = ''
+ jj-starship --git-symbol "" --no-git-status | sed "s/\x1b\[0m//g"
+ '';
+
+ when = "jj-starship detect";
+
+ shell = [
+ "sh"
+ ];
+
+ format = "[](fg:overlay)[[ $output ](bg:overlay)]($style)[](fg:overlay) ";
+
+ style = "bg:overlay fg:rose";
+
+ unsafe_no_escape = true;
+ };
+
+ git_status = {
+ command = ''
+ git status --porcelain | awk '
+ /^[MARC ][MD]/ || /^[MARC][MARC ]/ { modified++ }
+ /^\?\?/ { untracked++ }
+ /^[D ]D/ || /^D/ { deleted++ }
+ END {
+ if (modified + untracked + deleted == 0) {
+ printf "\033[38;2;196;167;231m✓"
+ } else {
+ if (modified) printf "\033[38;2;246;193;119m%d ", modified
+ if (untracked) printf "\033[38;2;246;193;119m%d ", untracked
+ if (deleted) printf "\033[38;2;235;111;146m󰆴%d ", deleted
+ }
+ }
+ '
+
+ unpushed=$(git rev-list @{u}..HEAD 2>/dev/null | wc -l | tr -d ' ')
+
+ if [ -n "$unpushed" ] && [ "$unpushed" -gt 0 ]; then
+ printf "\033[38;2;137;220;235m⇡%d " "$unpushed"
+ fi
+ '';
+
+ when = "git rev-parse --is-inside-work-tree 2>/dev/null && ! jj root 2>/dev/null";
+
+ shell = [
+ "sh"
+ ];
+
+ format = "[](fg:overlay)[[ $output ](bg:overlay)]($style)[](fg:overlay) ";
+
+ style = "bg:overlay fg:love";
+
+ unsafe_no_escape = true;
+ };
+ };
+
+ time = {
+ disabled = false;
+ format = " [](fg:overlay)[ $time 󰴈 ]($style)[](fg:overlay)";
+ style = "bg:overlay fg:rose";
+ time_format = "%I:%M%P";
+ use_12hr = true;
+ };
+
+ hostname = {
+ disabled = false;
+ ssh_only = false;
+ trim_at = "";
+ format = "[](fg:overlay)[ 󰠧 $hostname$ssh_symbol ]($style)[](fg:overlay) ";
+ style = "bg:overlay fg:rose";
+ ssh_symbol = " ";
+ };
+
+ username = {
+ disabled = false;
+ format = "[](fg:overlay)[ 󰧱 $user ]($style)[](fg:overlay) ";
+ show_always = true;
+ style_root = "bg:overlay fg:iris";
+ style_user = "bg:overlay fg:iris";
+ };
+
+ env_var.NIX_SHELL = {
+ variable = "STARSHIP_NIX_SHELL";
+ symbol = " ";
+ format = "[](fg:overlay)[ $symbol$env_value ]($style)[](fg:overlay) ";
+ style = "bg:overlay fg:foam";
+ };
+
+ # Languages
+
+ c = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = " ";
+ };
+
+ elixir = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = " ";
+ };
+
+ elm = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = " ";
+ };
+
+ golang = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = " ";
+ };
+
+ haskell = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = " ";
+ };
+
+ java = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = " ";
+ };
+
+ julia = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = " ";
+ };
+
+ nodejs = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = "󰎙 ";
+ };
+
+ nim = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = "󰆥 ";
+ };
+
+ rust = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = " ";
+ };
+
+ scala = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = " ";
+ };
+
+ python = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$version ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = " ";
+ };
+
+ conda = {
+ style = "bg:overlay fg:pine";
+ format = " [](fg:overlay)[ $symbol$environment ]($style)[](fg:overlay)";
+ disabled = false;
+ symbol = "🅒 ";
+ };
+ };
+ };
+
+}
diff --git a/home/tmux.nix b/home/tmux.nix
new file mode 100644
index 0000000..3c3a5d1
--- /dev/null
+++ b/home/tmux.nix
@@ -0,0 +1,48 @@
+{ pkgs, ... }:
+
+{
+ programs.tmux = {
+ enable = true;
+ mouse = true;
+ keyMode = "vi";
+ baseIndex = 1;
+ prefix = "C-\\";
+ terminal = "xterm-ghostty";
+ plugins = with pkgs.tmuxPlugins; [
+ sensible
+ yank
+ resurrect
+ continuum
+ {
+ plugin = rose-pine;
+ extraConfig = ''
+ set -g @rose_pine_variant 'main'
+ set -g @rose_pine_left_separator ' > '
+ set -g @rose_pine_right_separator '  '
+ set -g @rose_pine_field_separator ' | '
+ set -g @rose_pine_window_separator ':'
+ set -g @rose_pine_window_status_separator '  '
+ '';
+ }
+ ];
+ extraConfig = ''
+ set -g status-position top
+ set -g set-clipboard on
+ set -g set-titles on
+ set -g set-titles-string "#{session_name}"
+ setw -g pane-base-index 1
+ set -g allow-passthrough all
+ set -as terminal-features ",xterm-ghostty:hyperlinks"
+ set -ga terminal-overrides ",xterm-ghostty:Tc"
+
+ bind v split-window -h -c "#{pane_current_path}"
+ bind b split-window -v -c "#{pane_current_path}"
+ bind c new-window -c "#{pane_current_path}"
+ bind -n M-h select-pane -L
+ bind -n M-j select-pane -D
+ bind -n M-k select-pane -U
+ bind -n M-l select-pane -R
+ '';
+ };
+
+}
diff --git a/home/typst.nix b/home/typst.nix
new file mode 100644
index 0000000..761bdf9
--- /dev/null
+++ b/home/typst.nix
@@ -0,0 +1,20 @@
+{ config, pkgs, ... }:
+
+let
+ dots = toString ./..;
+in
+{
+ fonts.fontconfig.enable = true;
+
+ home.packages = with pkgs; [
+ montserrat
+ fira-math
+ corefonts
+ ];
+
+ home.sessionVariables.TYPST_FONT_PATHS =
+ "${config.home.profileDirectory}/share/fonts";
+
+ home.file."Library/Application Support/typst/packages/local/grace-personal-template/0.1.0".source =
+ config.lib.file.mkOutOfStoreSymlink "${dots}/typst";
+}
diff --git a/home/vcs.nix b/home/vcs.nix
new file mode 100644
index 0000000..4778311
--- /dev/null
+++ b/home/vcs.nix
@@ -0,0 +1,33 @@
+{ ... }:
+
+{
+ programs = {
+ git = {
+ enable = true;
+ ignores = [ ".DS_Store" ];
+ };
+
+ jujutsu = {
+ enable = true;
+ settings = {
+ user = {
+ name = "Grace Yoder";
+ email = "grace_yoder@outlook.com";
+ };
+ signing = {
+ sign-all = true;
+ backend = "ssh";
+ key = "~/.ssh/id_ed25519";
+ };
+ remotes.origin.auto-track-bookmarks = "*";
+ remotes.github.auto-track-bookmarks = "*";
+ aliases.tug = [
+ "bookmark"
+ "advance"
+ ];
+ };
+ };
+
+ gh.enable = true;
+ };
+}
diff --git a/home/vim.nix b/home/vim.nix
new file mode 100644
index 0000000..c8c882c
--- /dev/null
+++ b/home/vim.nix
@@ -0,0 +1,15 @@
+{ config, ... }:
+
+let
+ dots = toString ./..;
+in
+{
+ xdg.configFile."nvim".source =
+ config.lib.file.mkOutOfStoreSymlink "${dots}/vim/.config/nvim";
+
+ home.file.".vim".source =
+ config.lib.file.mkOutOfStoreSymlink "${dots}/vim/.vim";
+
+ home.file.".vimrc".source =
+ config.lib.file.mkOutOfStoreSymlink "${dots}/vim/.vimrc";
+}