my NixOS and nix-darwin config
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

a lot of movement?

+2250 -10
+27 -5
flake.nix
··· 16 16 inputs.nixpkgs.follows = "nixpkgs"; 17 17 }; 18 18 19 + rust-overlay = { 20 + url = "github:oxalica/rust-overlay"; 21 + inputs.nixpkgs.follows = "nixpkgs"; 22 + }; 23 + 19 24 }; 20 25 21 26 # Flake outputs 22 - outputs = { self, darwin, nixpkgs, home-manager, ... }@inputs: 23 - let inherit (self) outputs; 27 + outputs = { self, darwin, nixpkgs, home-manager, rust-overlay, ... }@inputs: 28 + let 29 + overlays = [ rust-overlay.overlays.default ]; 30 + mkPkgs = system: 31 + import nixpkgs { 32 + inherit system overlays; 33 + config.allowUnfree = true; 34 + }; 24 35 25 36 in { 26 37 ··· 28 39 # Available through 'nixos-rebuild --flake .#your-hostname' 29 40 nixosConfigurations = { 30 41 Khaos = nixpkgs.lib.nixosSystem { 31 - specialArgs = { inherit inputs outputs; }; 32 - modules = [ ./hosts/Khaos ]; 42 + modules = [ ./hosts/Khaos { nixpkgs.overlays = overlays; } ]; 33 43 }; 34 - 35 44 }; 36 45 37 46 darwinConfigurations = { ··· 39 48 system = "aarch64-darwin"; # or x86_64-darwin 40 49 modules = [ 41 50 ./hosts/Daedalus 51 + { nixpkgs.overlays = overlays; } 42 52 home-manager.darwinModules.home-manager 43 53 { 44 54 home-manager = { ··· 50 60 }; 51 61 } 52 62 ]; 63 + }; 64 + }; 65 + 66 + homeConfigurations = { 67 + "suri@Daedalus" = home-manager.lib.homeManagerConfiguration { 68 + pkgs = mkPkgs "aarch64-darwin"; 69 + modules = [ ./users/suri/Daedalus.nix ]; 70 + }; 71 + 72 + "suri@Khaos" = home-manager.lib.homeManagerConfiguration { 73 + pkgs = mkPkgs "x86_64-linux"; 74 + modules = [ ./users/suri/Khaos.nix ]; 53 75 }; 54 76 }; 55 77
+11
modules/home/bars/sketchybar/default.nix
··· 1 + { ... }: { 2 + home.file.".config/sketchybar/".source = ./sketchybar; 3 + # home.file.".config/sketchybar/".source = builtins.fetchGit { 4 + # url = "https://github.com/zphrs/sketchybar-config"; 5 + # rev = "2545e7bab0c41577a8bcabc783c17e0593100182"; 6 + # }; 7 + 8 + # home.file.".config/sketchybar/".source = ./sketchybar-config; 9 + # home.file.".config/sketchybar/" 10 + 11 + }
+8
modules/home/bars/sketchybar/sketchybar/colors.sh
··· 1 + BLACK=0xFF2E312D 2 + RED=0xFFFF8C54 3 + GREEN=0xFF86B59E 4 + YELLOW=0xFFDCA11D 5 + BLUE=0xFFA5A1FF 6 + MAGENTA=0xFFE79788 7 + CYAN=0xFFBCEED5 8 + WHITE=0xFF777771
+33
modules/home/bars/sketchybar/sketchybar/graphs/cpu.sh
··· 1 + #!/usr/bin/env sh 2 + source "$HOME/.config/sketchybar/colors.sh" 3 + sketchybar \ 4 + --add item cpu.percent q \ 5 + --set cpu.percent label.font="FiraCode Nerd Font:Bold:12" \ 6 + label=CPU \ 7 + y_offset=-4 \ 8 + width=0 \ 9 + icon.drawing=off \ 10 + update_freq=2 \ 11 + \ 12 + --add graph cpu.sys q 80 \ 13 + --set cpu.sys width=0 \ 14 + graph.color=$RED \ 15 + graph.fill_color=$RED \ 16 + label.drawing=off \ 17 + icon.drawing=off \ 18 + background.padding_right=5 \ 19 + \ 20 + --add item cpu.top q \ 21 + --set cpu.top label.font="FiraCode Nerd Font:Medium:7" \ 22 + label=CPU \ 23 + icon.drawing=off \ 24 + y_offset=6 \ 25 + background.padding_right=5 \ 26 + width=0 \ 27 + --add graph cpu.user q 80 \ 28 + --set cpu.user graph.color=$BLUE \ 29 + update_freq=2 \ 30 + label.drawing=off \ 31 + icon.drawing=off \ 32 + background.padding_left=4 \ 33 + script="$PLUGIN_DIR/cpu.sh" \
+21
modules/home/bars/sketchybar/sketchybar/graphs/disk.sh
··· 1 + 2 + #!/usr/bin/env sh 3 + source "$HOME/.config/sketchybar/colors.sh" 4 + sketchybar \ 5 + --add item disk.used_txt q \ 6 + --set disk.used_txt label.font="FiraCode Nerd Font:Bold:10" \ 7 + label=DISK \ 8 + y_offset=-4 \ 9 + width=0 \ 10 + icon.drawing=off \ 11 + update_freq=1 \ 12 + padding_left=15 \ 13 + \ 14 + --add graph disk.used e 80 \ 15 + --set disk.used graph.color=$RED \ 16 + update_freq=1 \ 17 + label.drawing=off \ 18 + icon.drawing=off \ 19 + background.padding_left=4 \ 20 + padding_left=15 \ 21 + script="$PLUGIN_DIR/disk.sh" \
+20
modules/home/bars/sketchybar/sketchybar/graphs/memory.sh
··· 1 + #!/usr/bin/env sh 2 + source "$HOME/.config/sketchybar/colors.sh" 3 + sketchybar \ 4 + --add item mem.used_txt e \ 5 + --set mem.used_txt label.font="FiraCode Nerd Font:Bold:10" \ 6 + label=MEM \ 7 + y_offset=-4 \ 8 + width=0 \ 9 + icon.drawing=off \ 10 + update_freq=2 \ 11 + padding_left=15 \ 12 + \ 13 + --add graph mem.used e 80 \ 14 + --set mem.used graph.color=$RED \ 15 + update_freq=2 \ 16 + label.drawing=off \ 17 + icon.drawing=off \ 18 + background.padding_left=4 \ 19 + padding_left=15 \ 20 + script="$PLUGIN_DIR/memory.sh" \
+16
modules/home/bars/sketchybar/sketchybar/graphs/network.sh
··· 1 + sketchybar --add graph net.in e 100 \ 2 + --set net.in icon.drawing=off label.drawing=off graph.color=$BLUE width=0 script="$PLUGIN_DIR/network.sh" \ 3 + padding_left=15 \ 4 + --add item net.in_txt e \ 5 + --set net.in_txt icon.drawing=off icon.font.size=10 width=0 label="-.--KB/s" label.font.size=10 label.font.style=Bold \ 6 + padding_left=15 \ 7 + --add item net.out_txt e \ 8 + --set net.out_txt icon.drawing=off icon.font.size=10 width=0 label="-.--KB/s" label.font.size=10 label.font.style=Bold \ 9 + y_offset=12 \ 10 + padding_left=15 \ 11 + --add graph net.out e 100 \ 12 + --set net.out icon.drawing=off label.drawing=off graph.color=$YELLOW padding_left=0 \ 13 + padding_left=15 \ 14 + --add bracket networks net.out net.in net.in_txt net.out_txt \ 15 + --set networks background.color=0xff000000 padding_left=5 padding_right=5 background.corner_radius=0 background.height=40 \ 16 + padding_left=15 \
+20
modules/home/bars/sketchybar/sketchybar/plugins/aerospace.sh
··· 1 + #!/usr/bin/env bash 2 + 3 + # make sure it's executable with: 4 + # chmod +x ~/.config/sketchybar/plugins/aerospace.sh 5 + 6 + if [ "$1" = "$FOCUSED_WORKSPACE" ]; then 7 + # sketchybar --set $NAME background.drawing=on 8 + 9 + sketchybar --animate quadratic 7 \ 10 + --set $NAME icon.font.size=25 11 + 12 + # --set $NAME y_offset=10 \ 13 + 14 + else 15 + # sketchybar --set $NAME background.drawing=off 16 + sketchybar --animate quadratic 7 \ 17 + --set $NAME icon.font.size=15 18 + 19 + # --set $NAME y_offset=0 \ 20 + fi
+28
modules/home/bars/sketchybar/sketchybar/plugins/battery.sh
··· 1 + #!/bin/sh 2 + 3 + PERCENTAGE="$(pmset -g batt | grep -Eo "\d+%" | cut -d% -f1)" 4 + CHARGING="$(pmset -g batt | grep 'AC Power')" 5 + 6 + if [ "$PERCENTAGE" = "" ]; then 7 + exit 0 8 + fi 9 + 10 + case "${PERCENTAGE}" in 11 + 9[0-9]|100) ICON="" 12 + ;; 13 + [6-8][0-9]) ICON="" 14 + ;; 15 + [3-5][0-9]) ICON="" 16 + ;; 17 + [1-2][0-9]) ICON="" 18 + ;; 19 + *) ICON="" 20 + esac 21 + 22 + if [[ "$CHARGING" != "" ]]; then 23 + ICON="" 24 + fi 25 + 26 + # The item invoking this script (name $NAME) will get its icon and label 27 + # updated with the current battery status 28 + sketchybar --set "$NAME" icon="$ICON" label="${PERCENTAGE}%"
+7
modules/home/bars/sketchybar/sketchybar/plugins/clock.sh
··· 1 + #!/bin/sh 2 + 3 + # The $NAME variable is passed from sketchybar and holds the name of 4 + # the item invoking this script: 5 + # https://felixkratz.github.io/SketchyBar/config/events#events-and-scripting 6 + 7 + sketchybar --set "$NAME" label="$(date '+%m/%d %l:%M %p')"
+18
modules/home/bars/sketchybar/sketchybar/plugins/cpu.sh
··· 1 + #!/usr/bin/env sh 2 + 3 + source "$HOME/.config/sketchybar/colors.sh" 4 + 5 + CORE_COUNT=$(sysctl -n machdep.cpu.thread_count) 6 + CPU_INFO=$(ps -eo pcpu,user) 7 + CPU_SYS=$(echo "$CPU_INFO" | grep -v $(whoami) | sed "s/[^ 0-9\.]//g" | awk "{sum+=\$1} END {print sum/(100.0 * $CORE_COUNT)}") 8 + CPU_USER=$(echo "$CPU_INFO" | grep $(whoami) | sed "s/[^ 0-9\.]//g" | awk "{sum+=\$1} END {print sum/(100.0 * $CORE_COUNT)}") 9 + 10 + TOPPROC=$(LANG=C && ps axo "%cpu,ucomm" | sort -nr | tail +1 | head -n1 | awk '{printf "%.0f%% %s\n", $1, $2}' | sed -e 's/com.apple.//g') 11 + CPUP=$(echo $TOPPROC | sed -nr 's/([^\%]+).*/\1/p') 12 + 13 + CPU_PERCENT="$(echo "$CPU_SYS $CPU_USER" | awk '{printf "%.0f\n", ($1 + $2)*100}')" 14 + 15 + sketchybar --set cpu.percent label=$CPU_PERCENT% \ 16 + --set cpu.top label="$TOPPROC" \ 17 + --push cpu.sys $CPU_SYS \ 18 + --push cpu.user $CPU_USER
+32
modules/home/bars/sketchybar/sketchybar/plugins/disk.sh
··· 1 + #!/bin/bash 2 + 3 + # Script to sum up the "Used" column from df -k output 4 + # Usage: ./df-k-usage-sum.sh 5 + 6 + # No conversion function needed since df -k outputs in kilobytes 7 + 8 + # Function to convert kilobytes to human-readable format 9 + kb_to_human() { 10 + local kb="$1" 11 + 12 + if (( kb >= 1073741824 )); then # 1 TiB in KB 13 + echo "$kb" | awk '{printf "%.1fT", $1/1073741824}' 14 + elif (( kb >= 1048576 )); then # 1 GiB in KB 15 + echo "$kb" | awk '{printf "%.1fG", $1/1048576}' 16 + elif (( kb >= 1024 )); then # 1 MiB in KB 17 + echo "$kb" | awk '{printf "%.1fM", $1/1024}' 18 + else 19 + echo "${kb}K" 20 + fi 21 + } 22 + 23 + # Get df -k output and process it 24 + total_kb=$(df -k | awk ' 25 + BEGIN { total = 0 } 26 + NR > 1 && $3 ~ /^[0-9]+$/ { total += $3 } 27 + END { print total } 28 + ') 29 + 30 + total_kb_human=$(kb_to_human $total_kb) 31 + 32 + sketchybar --set "$NAME" icon="" label="$total_kb_human"
+10
modules/home/bars/sketchybar/sketchybar/plugins/front_app.sh
··· 1 + #!/bin/sh 2 + 3 + # Some events send additional information specific to the event in the $INFO 4 + # variable. E.g. the front_app_switched event sends the name of the newly 5 + # focused application in the $INFO variable: 6 + # https://felixkratz.github.io/SketchyBar/config/events#events-and-scripting 7 + 8 + if [ "$SENDER" = "front_app_switched" ]; then 9 + sketchybar --set "$NAME" label="$INFO" 10 + fi
+26
modules/home/bars/sketchybar/sketchybar/plugins/memory.sh
··· 1 + #!/bin/bash 2 + 3 + # Get total physical memory in bytes 4 + total_ram=$(sysctl -n hw.memsize) 5 + 6 + # Get used memory using vm_stat (convert page counts to bytes) 7 + pages_free=$(vm_stat | awk '/Pages free/ {print $3}' | tr -d '.') 8 + pages_speculative=$(vm_stat | awk '/Pages speculative/ {print $3}' | tr -d '.') 9 + pages_purgeable=$(vm_stat | awk '/Pages purgeable/ {print $3}' | tr -d '.') 10 + page_size=$(vm_stat | head -1 | awk '{print $8}') 11 + page_size=${page_size%\.} # remove any trailing period 12 + 13 + # Calculate used RAM in bytes 14 + free_ram=$(( (pages_free + pages_speculative + pages_purgeable) * page_size )) 15 + used_ram=$(( total_ram - free_ram )) 16 + 17 + # Calculate percentage used (rounded) 18 + ram_usage_frac=$(awk "BEGIN {printf \"%.6f\", $used_ram / $total_ram}") 19 + 20 + # Optional: format output for human readability 21 + total_ram_human=$(bc <<< "$total_ram / (1024^3)") 22 + used_ram_human=$(bc <<< "scale=2; $used_ram / (1024^3)") 23 + 24 + sketchybar \ 25 + --set mem.used_txt label="$used_ram_human/$total_ram_human GB" \ 26 + --push mem.used $ram_usage_frac
+28
modules/home/bars/sketchybar/sketchybar/plugins/network.sh
··· 1 + #!/usr/bin/env sh 2 + source "$HOME/.config/sketchybar/colors.sh" 3 + 4 + ifstat -i en0 | while read -r IN_KB OUT_KB; do 5 + if [[ $IN_KB == "KB/s" ]] || [[ $IN_KB == "en0" ]]; then 6 + sketchybar --push net.in 0 \ 7 + --push net.out 0 8 + continue; 9 + fi 10 + 11 + if [[ $IN_KB == "0.00" ]]; then 12 + sketchybar --push net.in 0 \ 13 + --set net.in_txt label="0.00KB/s " label.color=$BLUE icon.color=$BLUE 14 + else 15 + IN=$(echo "l(5 + $IN_KB)/21" | bc -l) 16 + sketchybar --push net.in $IN \ 17 + --set net.in_txt label="${IN_KB}KB/s " label.color=$BLUE icon.color=$BLUE 18 + fi 19 + if [[ $OUT_KB == "0.00" ]]; then 20 + sketchybar --push net.out 0 \ 21 + --set net.out_txt label="0.00KB/s " label.color=$YELLOW icon.color=$YELLOW 22 + else 23 + OUT=$(echo "l(5 + $OUT_KB)/21" | bc -l) 24 + sketchybar --push net.out $OUT \ 25 + --set net.out_txt label="${OUT_KB}KB/s " label.color=$YELLOW icon.color=$YELLOW 26 + 27 + fi 28 + done
+7
modules/home/bars/sketchybar/sketchybar/plugins/space.sh
··· 1 + #!/bin/sh 2 + 3 + # The $SELECTED variable is available for space components and indicates if 4 + # the space invoking this script (with name: $NAME) is currently selected: 5 + # https://felixkratz.github.io/SketchyBar/config/components#space----associate-mission-control-spaces-with-an-item 6 + 7 + sketchybar --set "$NAME" background.drawing="$SELECTED"
+20
modules/home/bars/sketchybar/sketchybar/plugins/volume.sh
··· 1 + #!/bin/sh 2 + 3 + # The volume_change event supplies a $INFO variable in which the current volume 4 + # percentage is passed to the script. 5 + 6 + if [ "$SENDER" = "volume_change" ]; then 7 + VOLUME="$INFO" 8 + 9 + case "$VOLUME" in 10 + [6-9][0-9]|100) ICON="󰕾" 11 + ;; 12 + [3-5][0-9]) ICON="󰖀" 13 + ;; 14 + [1-9]|[1-2][0-9]) ICON="󰕿" 15 + ;; 16 + *) ICON="󰖁" 17 + esac 18 + 19 + sketchybar --set "$NAME" icon="$ICON" label="$VOLUME%" 20 + fi
+133
modules/home/bars/sketchybar/sketchybar/sketchybarrc
··· 1 + # This is a demo config to showcase some of the most important commands. 2 + # It is meant to be changed and configured, as it is intentionally kept sparse. 3 + # For a (much) more advanced configuration example see my dotfiles: 4 + # https://github.com/FelixKratz/dotfiles 5 + 6 + PLUGIN_DIR="$CONFIG_DIR/plugins" 7 + 8 + ##### Bar Appearance ##### 9 + # Configuring the general appearance of the bar. 10 + # These are only some of the options available. For all options see: 11 + # https://felixkratz.github.io/SketchyBar/config/bar 12 + # If you are looking for other colors, see the color picker: 13 + # https://felixkratz.github.io/SketchyBar/config/tricks#color-picker 14 + 15 + sketchybar --bar position=top height=40 blur_radius=30 color=0x40000000 16 + 17 + ##### Changing Defaults ##### 18 + # We now change some default values, which are applied to all further items. 19 + # For a full list of all available item properties see: 20 + # https://felixkratz.github.io/SketchyBar/config/items 21 + 22 + default=( 23 + padding_left=5 24 + padding_right=5 25 + icon.font="Hack Nerd Font:Bold:17.0" 26 + label.font="Hack Nerd Font:Bold:14.0" 27 + icon.color=0xffffffff 28 + label.color=0xffffffff 29 + icon.padding_left=4 30 + icon.padding_right=4 31 + label.padding_left=4 32 + label.padding_right=4 33 + ) 34 + sketchybar --default "${default[@]}" 35 + 36 + ##### Adding Mission Control Space Indicators ##### 37 + # Let's add some mission control spaces: 38 + # https://felixkratz.github.io/SketchyBar/config/components#space----associate-mission-control-spaces-with-an-item 39 + # to indicate active and available mission control spaces. 40 + 41 + # SPACE_ICONS=("1" "2" "3" "4" "5" "6" "7" "8" "9" "10") 42 + # for i in "${!SPACE_ICONS[@]}" 43 + # do 44 + # sid="$(($i+1))" 45 + # space=( 46 + # space="$sid" 47 + # icon="${SPACE_ICONS[i]}" 48 + # icon.padding_left=7 49 + # icon.padding_right=7 50 + # background.color=0x40ffffff 51 + # background.corner_radius=5 52 + # background.height=25 53 + # label.drawing=off 54 + # script="$PLUGIN_DIR/space.sh" 55 + # click_script="yabai -m space --focus $sid" 56 + # ) 57 + # sketchybar --add space space."$sid" left --set space."$sid" "${space[@]}" 58 + # done 59 + 60 + ##### Adding Left Items ##### 61 + # We add some regular items to the left side of the bar, where 62 + # only the properties deviating from the current defaults need to be set 63 + 64 + sketchybar --add item chevron left \ 65 + --set chevron icon= label.drawing=off \ 66 + --add item front_app left \ 67 + --set front_app icon.drawing=off script="$PLUGIN_DIR/front_app.sh" \ 68 + --subscribe front_app front_app_switched 69 + 70 + ##### Adding Right Items ##### 71 + # In the same way as the left items we can add items to the right side. 72 + # Additional position (e.g. center) are available, see: 73 + # https://felixkratz.github.io/SketchyBar/config/items#adding-items-to-sketchybar 74 + 75 + # Some items refresh on a fixed cycle, e.g. the clock runs its script once 76 + # every 10s. Other items respond to events they subscribe to, e.g. the 77 + # volume.sh script is only executed once an actual change in system audio 78 + # volume is registered. More info about the event system can be found here: 79 + # https://felixkratz.github.io/SketchyBar/config/events 80 + 81 + sketchybar --add item clock right \ 82 + --set clock update_freq=10 icon= script="$PLUGIN_DIR/clock.sh" \ 83 + --add item volume right \ 84 + --set volume script="$PLUGIN_DIR/volume.sh" \ 85 + --subscribe volume volume_change \ 86 + --add item battery right \ 87 + --set battery update_freq=120 script="$PLUGIN_DIR/battery.sh" \ 88 + --subscribe battery system_woke power_source_change \ 89 + --add item disk right \ 90 + --set disk update_freq=20 script="$PLUGIN_DIR/disk.sh" \ 91 + 92 + 93 + 94 + ##### Aerospace Configuration ##### 95 + sketchybar --add event aerospace_workspace_change 96 + 97 + # Get all aerospace workspaces and reverse them 98 + WORKSPACES=($(aerospace list-workspaces --all)) 99 + REVERSED_WORKSPACES=() 100 + 101 + # Reverse the array 102 + for ((i=${#WORKSPACES[@]}-1; i>=0; i--)); do 103 + REVERSED_WORKSPACES+=("${WORKSPACES[i]}") 104 + done 105 + 106 + source "${CONFIG_DIR}/graphs/cpu.sh" 107 + 108 + sketchybar --add item spacer q \ 109 + --set spacer \ 110 + padding_right=25 111 + 112 + # Add workspace items to sketchybar in reversed order 113 + for sid in "${REVERSED_WORKSPACES[@]}"; do 114 + sketchybar --add item space.$sid q \ 115 + --subscribe space.$sid aerospace_workspace_change \ 116 + --set space.$sid \ 117 + background.color=0x44ffffff \ 118 + background.corner_radius=5 \ 119 + background.height=20 \ 120 + background.drawing=off \ 121 + icon="◉" \ 122 + label.padding_left=0 \ 123 + label.padding_right=0 \ 124 + click_script="aerospace workspace $sid" \ 125 + script="$CONFIG_DIR/plugins/aerospace.sh $sid" 126 + done 127 + 128 + 129 + source "${CONFIG_DIR}/graphs/memory.sh" 130 + source "${CONFIG_DIR}/graphs/network.sh" 131 + 132 + ##### Force all scripts to run the first time (never do this in a script) ##### 133 + sketchybar --update
+5
modules/home/prompts/oh-my-posh/default.nix
··· 1 + { pkgs, ... }: { 2 + 3 + home.file.".config/oh-my-posh/theme.toml".source = ./mypure.omp.toml; 4 + 5 + }
+79
modules/home/prompts/oh-my-posh/mypure.omp.toml
··· 1 + console_title_template = '{{if .Root}}(Admin){{end}} {{.PWD}}' 2 + version = 3 3 + 4 + [transient_prompt] 5 + template = '❯ ' 6 + foreground = '#B48EAD' 7 + foreground_templates = ['{{ if gt .Code 0 }}#BF616A{{ end }}'] 8 + 9 + [upgrade] 10 + source = 'cdn' 11 + interval = '168h' 12 + auto = false 13 + notice = false 14 + 15 + [[blocks]] 16 + type = 'prompt' 17 + alignment = 'left' 18 + 19 + [[blocks.segments]] 20 + template = '{{ .UserName }} ' 21 + foreground = '#FD971E' 22 + type = 'session' 23 + style = 'plain' 24 + 25 + [[blocks.segments]] 26 + template = '{{ .Path }} ' 27 + foreground = '#98E025' 28 + type = 'path' 29 + style = 'plain' 30 + 31 + [blocks.segments.properties] 32 + style = 'full' 33 + 34 + [[blocks]] 35 + type = 'prompt' 36 + alignment = 'left' 37 + 38 + [[blocks.segments]] 39 + template = '{{ .UpstreamIcon }}{{ .HEAD }}{{if .BranchStatus }} {{ .BranchStatus }}{{ end }}{{ if .Working.Changed }}<#FFAFD7>*</>{{ .Working.String }}{{ end }}{{ if and (.Working.Changed) (.Staging.Changed) }} |{{ end }}{{ if .Staging.Changed }}  {{ .Staging.String }}{{ end }}{{ if gt .StashCount 0 }}  {{ .StashCount }}{{ end }} ' 40 + foreground = '#6C6C6C' 41 + type = 'git' 42 + style = 'plain' 43 + 44 + [blocks.segments.properties] 45 + branch_ahead_icon = '<#88C0D0>⇡ </>' 46 + branch_behind_icon = '<#88C0D0>⇣ </>' 47 + branch_icon = '' 48 + fetch_stash_count = true 49 + fetch_status = true 50 + fetch_upstream_icon = true 51 + github_icon = '' 52 + 53 + [[blocks]] 54 + type = 'prompt' 55 + alignment = 'left' 56 + 57 + [[blocks.segments]] 58 + template = ' {{ .FormattedMs }} ' 59 + foreground = '#A3BE8C' 60 + type = 'executiontime' 61 + style = 'plain' 62 + 63 + [blocks.segments.properties] 64 + style = 'austin' 65 + 66 + [[blocks]] 67 + type = 'prompt' 68 + alignment = 'left' 69 + newline = true 70 + 71 + [[blocks.segments]] 72 + template = '❯ ' 73 + foreground = '#B48EAD' 74 + type = 'status' 75 + style = 'plain' 76 + foreground_templates = ['{{ if gt .Code 0 }}#BF616A{{ end }}'] 77 + 78 + [blocks.segments.properties] 79 + always_enabled = true
+11
modules/home/prompts/starship/default.nix
··· 1 + { lib, home, ... }: { 2 + 3 + programs.starship = { 4 + enable = true; 5 + 6 + settings = 7 + lib.mkForce (builtins.fromTOML (builtins.readFile ./starship.toml)); 8 + }; 9 + # home.file.".config/starship.toml".source = lib.mkForce ./starship.toml; 10 + 11 + }
+347
modules/home/prompts/starship/starship.toml
··· 1 + # Get editor completions based on the config schema 2 + "$schema" = 'https://starship.rs/config-schema.json' 3 + 4 + # ### --------- 5 + # ### "Power10" 6 + # ### --------- 7 + # - Variant 2: two line prompt, no background in top line, separators on left side, filling solid line in top row 8 + # - This preset is inspired by a [powerlevel10k](https://github.com/romkatv/powerlevel10k) configuration variant. 9 + # 10 + # - Recommended / tested with Font 'MesloLGS NF Regular' from: Meslo Nerd Font patched for Powerlevel10k 11 + # Link: https://github.com/romkatv/powerlevel10k?tab=readme-ov-file#manual-font-installation 12 + # --> "Manual font installation", with currently 4 Font Types 13 + 14 + # - If you do not want the filling solid line in top row: 15 + # set the fill symbol to ' ' 16 + # - Shell [shell]: 17 + # If you want to see the content of the shell module, search for [shell] and change 'disabled = true' to false 18 + # - '$line_break': everything from the next line on refers to the second line of the prompt 19 + # - Some modules listed further down will not show up (all the time), as their default value is 'disabled = true' or 20 + # they are only displayed under certain conditions 21 + # - added but disabled modules: [battery], [time] 22 + # - if you want to see them: search for the module and set 'disabled' to 'false' 23 + # - Symbols: 24 + # Don't be confused if you don't see any "real" symbols here. If Nerd-fonts are installed on your system, it should work. 25 + 26 + # Customizing the prompt (and placing desired modules at desired position and sequence): 27 + # ╭╴ # \u256D\u2574 28 + # ╰╴ # \u2570\u2574 29 + format = """ 30 + [\u256D\u2574](fg:greydimmed)\ 31 + $os\ 32 + $shell\ 33 + $username\ 34 + $hostname\ 35 + $sudo\ 36 + $directory\ 37 + $direnv\ 38 + $php\ 39 + $python\ 40 + $git_branch$git_commit$git_state$git_metrics$git_status\ 41 + [ ](fg:greydarker)\ 42 + $fill\ 43 + $fill\ 44 + $status\ 45 + $jobs\ 46 + $memory_usage\ 47 + $cmd_duration\ 48 + $battery\ 49 + $time\ 50 + $line_break\ 51 + \ 52 + [\u2570\u2574](fg:greydimmed)\ 53 + [$character]($style)""" 54 + 55 + # move the rest of the prompt to the right 56 + right_format = """ 57 + [$localip]($style)""" 58 + 59 + # Inserts a blank line between shell prompts: 60 + add_newline = true 61 + 62 + # Color Palette 63 + palette = "Power10Gruv" 64 + 65 + [palettes.Power10] 66 + # only lowercase names 67 + greydimmed = '#424242' 68 + greydarker = '#242424' 69 + ossymbol = '#AAAAAA' # dimmed white 70 + user = 'green' 71 + userroot = 'red' 72 + sshsymbol = 'green' 73 + hostname = 'green' 74 + sudo = 'red' 75 + directory = 'cyan' 76 + php = '#7a86b8' # light blue 77 + python = 'yellow' 78 + # git start --- 79 + orangegit = '#E04D27' 80 + conflicted = 'red' 81 + ahead = 'yellow' 82 + behind = 'yellow' 83 + diverged = 'yellow' 84 + uptodate = 'green' 85 + untracked = 'red' 86 + stashed = '#A52A2A' # redbrown 87 + modified = '#C8AC00' # darker yellow 88 + staged = 'green' 89 + renamed = 'yellow' 90 + deleted = 'orange' 91 + # git end --- 92 + jobs = 'blue' 93 + memory = 'purple' 94 + duration = 'yellow' 95 + fill = '#424242' # greydimmed 96 + status = 'red' 97 + localip = 'green' 98 + shell = '#424242' # greydimmed 99 + 100 + [palettes.Power10Gruv] 101 + greydimmed = '#424242' 102 + greydarker = '#242424' 103 + # only lowercase names 104 + # greydimmed = '#32302f' # Gruvbox dark gray 105 + # greydarker = '#1d2021' # Gruvbox darkest gray 106 + ossymbol = '#a89984' # Gruvbox light gray 107 + user = '#b8bb26' # Gruvbox green 108 + userroot = '#fb4934' # Gruvbox red 109 + sshsymbol = '#b8bb26' # Gruvbox green 110 + hostname = '#b8bb26' # Gruvbox green 111 + sudo = '#fb4934' # Gruvbox red 112 + directory = '#83a598' # Gruvbox blue 113 + php = '#d3869b' # Gruvbox purple 114 + python = '#fabd2f' # Gruvbox yellow 115 + # git start --- 116 + orangegit = '#fe8019' # Gruvbox orange 117 + conflicted = '#fb4934' # Gruvbox red 118 + ahead = '#fabd2f' # Gruvbox yellow 119 + behind = '#fabd2f' # Gruvbox yellow 120 + diverged = '#fabd2f' # Gruvbox yellow 121 + uptodate = '#b8bb26' # Gruvbox green 122 + untracked = '#fb4934' # Gruvbox red 123 + stashed = '#d65d0e' # Gruvbox dark orange 124 + modified = '#d79921' # Gruvbox dark yellow 125 + staged = '#b8bb26' # Gruvbox green 126 + renamed = '#fabd2f' # Gruvbox yellow 127 + deleted = '#fe8019' # Gruvbox orange 128 + # git end --- 129 + jobs = '#458588' # Gruvbox blue 130 + memory = '#d3869b' # Gruvbox purple 131 + duration = '#fabd2f' # Gruvbox yellow 132 + fill = '#32302f' # Gruvbox dark gray 133 + status = '#fb4934' # Gruvbox red 134 + localip = '#b8bb26' # Gruvbox green 135 + shell = '#32302f' # Gruvbox dark gray 136 + # Customization and activation of some modules: 137 + # Listed in the order of their position in the module rows above 138 + [os] 139 + format = "[$symbol]($style)()" 140 + style = "ossymbol" 141 + disabled = false 142 + 143 + [os.symbols] 144 + AIX = "AIX " 145 + Alpaquita = "\uf26a " # \uf26a  # \ue3a5\ue390  146 + AlmaLinux = "\uf31d " #  147 + Alpine = "\uf300 " # "" 148 + Amazon = "\uf270 " # "" 149 + Android = "\ue70e " # "" 150 + Arch = "\uf303 " # "" 151 + Artix = "\uf31f " #  152 + CentOS = "\uf304 " # "" 153 + Debian = "\uf306 " # "" 154 + DragonFly = "\ueef8 " #   🐉 155 + Emscripten = "\u26A1 " # ⚡ 156 + EndeavourOS = "\uf322 " # "" #  157 + Fedora = "\uf30a " # "" 158 + FreeBSD = "\uf30c " # "" 159 + Garuda = "\uf337 " # "" 160 + Gentoo = "\uf30d " # "" 161 + HardenedBSD = "\uf132 " #  162 + Illumos = "\uf326 " # "🐦" 163 + Kali = "\uf327 " #  164 + Linux = "\uf17c " # "" 165 + Mabox = "\uf1b2 " #  📦 166 + Macos = "\uf302 " # "" 167 + Manjaro = "\uf312 " # "" 168 + Mariner = "\ue7ae " # \ue7ae  169 + MidnightBSD = "\ue3e0 " # 🌘 170 + Mint = "\uf30e " # "" 171 + NetBSD = "\u2691 " # ⚑ 172 + NixOS = "\uf313 " # "" 173 + OpenBSD = "\uf328 " # "" 174 + OpenCloudOS = "\uf0c2 " #  175 + openEuler = "\u2208 " # \u2208 ∈ 176 + openSUSE = "\uf314 " # "" 177 + OracleLinux = "\u213A " # \u213A ℺ # ⊂⊃ \u2282\u2283 178 + Pop = "\uf32a " # "" 179 + Raspbian = "\uf315 " # "" 180 + Redhat = "\uf316 " # "" # 󱄛 181 + RedHatEnterprise = "\uf316 " # "" # 󱄛 182 + RockyLinux = "\uf32b " #  183 + Redox = "\uf331 " #  󰺕 184 + Solus = "\uf32d " # "" # " " 185 + SUSE = "\uef6d " # "" 186 + Ubuntu = "\uf31b " # "" 187 + Ultramarine = "󱙳 " # 🔷 188 + Unknown = "\uf108 " # "" 189 + Void = "\uf32e " #   190 + Windows = "\uf17a " # "" 191 + 192 + [shell] 193 + format = '[$indicator]($style)()' 194 + style = 'fg:shell' 195 + # empty indicator (''): e.g. if you do not want to see indicator for your standard shell 196 + zsh_indicator = '%_ ' # '%_ ' '󰰶 ' 197 + bash_indicator = '\$_ ' # "\uebca " ' ' '\$_ ' 198 + fish_indicator = '>> ' # "\uee41 " '󰈺 ' '>>_ ' 199 + powershell_indicator = '>_ ' # "\uebc7 " ' ' '>_' 200 + unknown_indicator = '?_ ' # '?_ ' ' ' 201 + disabled = true # set to false if you want to see the shell indicator 202 + 203 + [username] 204 + format = "[\ueab6 ](fg:user bold)[$user]($style)[ ]()" # \u276F ❯ \ueab6  205 + style_user = 'fg:user bold' 206 + style_root = 'fg:userroot bold' 207 + show_always = false 208 + disabled = false 209 + 210 + [hostname] 211 + format = '[$ssh_symbol ](fg:sshsymbol bold)[$hostname](fg:hostname bold)[ ]()' 212 + ssh_only = true 213 + ssh_symbol = "\ue36e" # \ue36e '' # '⇒' # ' ' # 'fi⇒' 214 + # trim_at = '.companyname.com' 215 + disabled = false 216 + 217 + [sudo] 218 + format = "[\ueab6 ](fg:sudo bold)[as $symbol]($style)" # \u276F ❯ \ueab6  219 + style = 'fg:red bold' 220 + symbol = "\uf007! " # \uf007  # \uf21b \uedcc ' ' # ' ' 221 + disabled = false 222 + 223 + [directory] 224 + format = "[\ueab6 ](fg:directory bold)[$read_only]($read_only_style)[$repo_root]($repo_root_style)[$path ]($style)" # \u276F ❯ \ueab6  225 + style = 'fg:directory bold' 226 + home_symbol = "\uf015 ~" # \uf015 ' ~' 227 + read_only = "\uf023 " # \uf023 ' ' 228 + read_only_style = 'fg:directory' 229 + truncation_length = 3 230 + truncation_symbol = '…/' 231 + truncate_to_repo = true 232 + repo_root_format = "[\ueab6 ](fg:directory bold)[$read_only]($read_only_style)[$before_root_path]($before_repo_root_style)[$repo_root]($repo_root_style)[$path ]($style)" # \u276F ❯ \ueab6  233 + repo_root_style = 'fg:directory bold' 234 + use_os_path_sep = true 235 + disabled = false 236 + 237 + [direnv] 238 + symbol = 'direnv' 239 + style = 'fg:greydimmed' 240 + format = "[\u3009$symbol $loaded/$allowed ]($style)" 241 + allowed_msg = 'a' # 'ok' # '✓' 242 + not_allowed_msg = '!a' # 'nok' # '!' 243 + denied_msg = 'x' # '✘' 244 + loaded_msg = '+' # "\ueabc" # \ueabc  # '->' # 'yo' # '󰗡' # \udb81\udde1 # '󱥸✓' # '󱥸✓' #  245 + unloaded_msg = '-' # "\ueabc!" # \ueabc ! # '->!' # 'no' # '󰅚' # '󱥸!' \udb86\udd78 246 + disabled = false 247 + 248 + [php] 249 + format = " [\u3009[$symbol](php italic)($version )]($style)" 250 + style = 'fg:php' 251 + symbol = "php " # \ue73d  # 󰌟 252 + 253 + [python] 254 + format = "[\u3009${symbol}${pyenv_prefix}(${version} )(($virtualenv) )]($style)" 255 + style = 'fg:python' 256 + symbol = "\ue73c " #  257 + pyenv_version_name = true 258 + 259 + [git_branch] 260 + format = "[\u3009$symbol $branch(:$remote_branch)]($style)[ ]()" # \u3009 \uf460 ❯ 261 + style = 'fg:orangegit' 262 + symbol = "\ue702" # \ue702  263 + # ignore_branches = ['master', 'main'] 264 + 265 + [git_commit] 266 + format = '[\($hash$tag\)]($style)[ ]()' 267 + style = 'fg:orangegit' 268 + commit_hash_length = 8 269 + tag_symbol = " \uf412 " # \uf412 '  ' # '  '' 270 + tag_disabled = false 271 + disabled = false 272 + 273 + [git_metrics] 274 + format = '[\[+$added/]($added_style)[-$deleted\]]($deleted_style)[ ]()' 275 + added_style = 'fg:orangegit' 276 + deleted_style = 'fg:orangegit' 277 + disabled = false 278 + 279 + [git_status] 280 + format = '([$all_status$ahead_behind]($style))' 281 + style = 'fg:orangegit' 282 + conflicted = "[\ueaaf${count} ](fg:conflicted)" #  283 + ahead = "[\u21E1${count} ](fg:ahead)" # ⇡ \ueaa0 284 + behind = "[\u21E3${unt} ](fg:behind)" # ⇣ \uea9d 285 + diverged = "[\u2195\u21E1${ahead_count} \u21E3${behind_count} ](fg:diverged)" # \u2195\u21E1 ⇕ ↕ ⇳ 󰹹 󰹺 󰧈 286 + up_to_date = "[\u2714 ](fg:uptodate)" # \u2714 ✔ \u2713 \ueab2 ✓ 287 + untracked = "[󰟉.${count} ](fg:untracked)" # 󰟉 \uf441 \ueb32 ﳇ ' ' # '? ' 288 + stashed = "[\ueb29${count} ](fg:stashed)" # \ueb29  '📦 '# ' ' # ' ' # ' ' # ' ' 289 + modified = "[\uf040${count} ](fg:modified)" # \uf040 󰷉 '📝' # '! ' #  #  #  \uf044 \uea73 290 + staged = "[\u26DF .${count} ](fg:staged)" # \u26DF  '+ ' 291 + renamed = "[\u0373${count} ](fg:renamed)" # \u0373 \ueb69  ' ' # '﫦' # ᴂ #  #  #  # ﳳ 292 + deleted = "[\uea81${count} ](fg:deleted)" # \uea81 \uf507 ﯊ '🗑 ' '- ' 293 + disabled = false 294 + 295 + [fill] 296 + style = 'fg:fill' 297 + symbol = "\u2500" # "\u2500" "─" # no line: ' ' 298 + 299 + [status] 300 + format = "[$symbol $status $hex_status( \uf0a2 $signal_number-$signal_name)]($style)" # \uf0a2  , \ueaa2 301 + style = 'fg:status' 302 + symbol = " \u2717" # \u2717 \uf467 \uebde  ✘ 303 + disabled = false 304 + 305 + [jobs] 306 + format = "[ \ueab5 ](fg:jobs bold)[$symbol $number]($style)" # \u3009 307 + style = 'fg:jobs' 308 + symbol = "\ueb7b" # \ueb7b  \uef0c 省 # '廒' # '󰜎' # '' 309 + symbol_threshold = 1 310 + number_threshold = 2 311 + disabled = false 312 + 313 + [memory_usage] 314 + format = "[ \ueab5 ](fg:memory bold)[$symbol ${ram} ${swap}]($style)" # \u3009 315 + style = "fg:memory" 316 + symbol = "\ueb50 \uebcb" # "\ueb50 \uebcb" \uf1ec '﬙ 北' '﬙ 痢' # '﬙ 󰾵' # '󰍛 󰾵' # '﬙ 󰾴' # '﬙ 󰾶' '﬙ 󰣂' 317 + threshold = 75 318 + disabled = false 319 + 320 + [cmd_duration] 321 + format = "[ \ueab5 \uf017 $duration]($style)" # \ueab5 \uf017   322 + style = 'fg:duration' 323 + min_time = 500 324 + disabled = false 325 + 326 + [battery] 327 + format = "[ \ueab5 $symbol$percentage]($style)" 328 + full_symbol = '󰁹 ' 329 + charging_symbol = '󰂄 ' 330 + discharging_symbol = '󰂃 ' 331 + unknown_symbol = '󰁽? ' 332 + empty_symbol = '󰂎 ' 333 + disabled = true # set to 'false', if you want to see the battery status 334 + 335 + [[battery.display]] 336 + threshold = 100 # show always 337 + style = 'fg:greydimmed' 338 + 339 + [time] 340 + format = "[ \ueab5 $time]($style)" 341 + style = 'fg:greydimmed' 342 + disabled = false # set to 'false', if you want to see the time 343 + 344 + [localip] 345 + format = '[$localipv4](fg:localip bold)' 346 + ssh_only = true 347 + disabled = false
+136
modules/home/shells/fish/default.nix
··· 1 + { config, pkgs, ... }: 2 + 3 + { 4 + home.packages = with pkgs; [ fish ]; 5 + 6 + # whereis fish 7 + # sudo hx /etc/shells 8 + # chsh -s {locaiton of fish} 9 + 10 + home.file."~/.config/fish/conf.d/nix-env.fish".source = ./nix-fix.fish; 11 + 12 + programs.fish = { 13 + 14 + enable = true; 15 + 16 + interactiveShellInit = '' 17 + set fish_greeting 18 + eval (ssh-agent -c) &> /dev/null 19 + ssh-add ~/.ssh/github &> /dev/null 20 + ssh-add ~/.ssh/ucsc_gitlab &> /dev/null 21 + 22 + eval "$(zoxide init fish)" 23 + eval "$(starship init fish)" 24 + 25 + enable_transience 26 + ''; 27 + 28 + shellAliases = { 29 + ".." = "cd .."; 30 + "..." = "cd ../.."; 31 + "...." = "cd ../../../"; 32 + "....." = "cd ../../../../"; 33 + 34 + "dots" = "cd ~/dev/dots"; 35 + 36 + "cp" = "cp -v"; 37 + "ddf" = "df -h"; 38 + "etc" = "erd -H"; 39 + "mkdir" = "mkdir -p"; 40 + "mv" = "mv -v"; 41 + "rm" = "rm -v"; 42 + "rr" = "rm -rf"; 43 + 44 + "ld" = "eza -ld */ --no-quotes --time-style long-iso"; 45 + "lla" = "eza -lah --no-quotes --time-style long-iso"; 46 + "ll" = "eza -lh --no-quotes --time-style long-iso"; 47 + "llr" = "eza -lhr --no-quotes --time-style long-iso"; 48 + "lls" = "eza -lh -s size --no-quotes --time-style long-iso"; 49 + "llt" = "eza -lh -s time --no-quotes --time-style long-iso"; 50 + "lltr" = "eza -lhr -s time --no-quotes --time-style long-iso"; 51 + 52 + "ree" = 53 + "sudo nixos-rebuild switch --flake ~/dots/nixdots#zephryus && git push"; 54 + 55 + "fcd" = '' 56 + cd "$(find ~/coding/ ~/storage/ -type d -not \( -path "*/.git/*" -o -path "*/target/*" -o -path "*/.venv/*" -o -path "*/node_modules/*" -o -path "*/venv/*" -o -path "*/build/*" -o -path "*/.*/*" \) -print 2>/dev/null | fzf)" ''; 57 + 58 + "l" = "exa"; 59 + 60 + "lg" = "lazygit"; 61 + }; 62 + 63 + shellAbbrs = { 64 + # cargo abbreviations 65 + cb = "cargo build"; 66 + cc = "cargo check"; 67 + cdo = "cargo doc --open"; 68 + cr = "cargo run"; 69 + 70 + # git abbreviations 71 + gaa = "git add -A"; 72 + ga = "git add"; 73 + gbd = "git branch --delete"; 74 + gb = "git branch"; 75 + gc = "git commit"; 76 + gcm = "git commit -m"; 77 + gcob = "git checkout -b"; 78 + gco = "git checkout"; 79 + gd = "git diff"; 80 + gl = "git log"; 81 + gp = "git push"; 82 + gpom = "git push origin main"; 83 + gs = "git status"; 84 + gst = "git stash"; 85 + gstp = "git stash pop"; 86 + 87 + }; 88 + 89 + functions = { 90 + 91 + # TODO: figure out how this is supposed to work, rn need to call it twice for it to 92 + # use argument 93 + mkcd = '' 94 + function mkcd --argument name 95 + mkdir -p $name 96 + cd $name 97 + end 98 + ''; 99 + # re = '' 100 + # set VERSION (math (readlink /nix/var/nix/profiles/system | grep -o "[0-9]*") + 1) 101 + # z ~/dots/nixdots 102 + # git add -A 103 + # git commit -m "Generation: $VERSION" 104 + # sudo nixos-rebuild switch --flake /home/suri/dots/nixdots#zephryus 105 + # git push 106 + # ''; 107 + 108 + y = '' 109 + set tmp (mktemp -t "yazi-cwd.XXXXXX") 110 + yazi $argv --cwd-file="$tmp" 111 + if test -s "$tmp" 112 + set cwd (cat -- "$tmp") 113 + if test -n "$cwd" -a "$cwd" != "$PWD" 114 + cd -- "$cwd" 115 + end 116 + end 117 + rm -f -- "$tmp" &> /dev/null 118 + 119 + ''; 120 + 121 + tz = '' 122 + if test (count $argv) -eq 0 123 + echo "Usage: tz <file.typ>" 124 + return 1 125 + end 126 + 127 + set input_file $argv[1] 128 + set output_file (string replace ".typ" ".pdf" -- $input_file) 129 + 130 + typst watch "$input_file" "$output_file" & # Watch and compile Typst file 131 + sleep 1 # Give Typst some time to generate the PDF 132 + zathura "$output_file" # Open the generated PDF 133 + ''; 134 + }; 135 + }; 136 + }
+139
modules/home/shells/fish/nix-fix.fish
··· 1 + 2 + # Setup Nix 3 + 4 + # We need to distinguish between single-user and multi-user installs. 5 + # This is difficult because there's no official way to do this. 6 + # We could look for the presence of /nix/var/nix/daemon-socket/socket but this will fail if the 7 + # daemon hasn't started yet. /nix/var/nix/daemon-socket will exist if the daemon has ever run, but 8 + # I don't think there's any protection against accidentally running `nix-daemon` as a user. 9 + # We also can't just look for /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh because 10 + # older single-user installs used the default profile instead of a per-user profile. 11 + # We can still check for it first, because all multi-user installs should have it, and so if it's 12 + # not present that's a pretty big indicator that this is a single-user install. If it does exist, 13 + # we still need to verify the install type. To that end we'll look for a root owner and sticky bit 14 + # on /nix/store. Multi-user installs set both, single-user installs don't. It's certainly possible 15 + # someone could do a single-user install as root and then manually set the sticky bit but that 16 + # would be extremely unusual. 17 + 18 + set -l nix_profile_path /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh 19 + set -l single_user_profile_path ~/.nix-profile/etc/profile.d/nix.sh 20 + if test -e $nix_profile_path 21 + # The path exists. Double-check that this is a multi-user install. 22 + # We can't just check for ~/.nix-profile/… because this may be a single-user install running as 23 + # the wrong user. 24 + 25 + # stat is not portable. Splitting the output of ls -nd is reliable on most platforms. 26 + set -l owner (string split -n ' ' (command ls -nd /nix/store 2>/dev/null))[3] 27 + if not test -k /nix/store -a $owner -eq 0 28 + # /nix/store is either not owned by root or not sticky. Assume single-user. 29 + set nix_profile_path $single_user_profile_path 30 + end 31 + else 32 + # The path doesn't exist. Assume single-user 33 + set nix_profile_path $single_user_profile_path 34 + end 35 + 36 + if test -e $nix_profile_path 37 + # Source the nix setup script 38 + # We're going to run the regular Nix profile under bash and then print out a few variables 39 + for line in (command env -u BASH_ENV bash -c '. "$0"; for name in PATH "${!NIX_@}"; do printf "%s=%s\0" "$name" "${!name}"; done' $nix_profile_path | string split0) 40 + set -xg (string split -m 1 = $line) 41 + end 42 + 43 + # Insert Nix's fish share directories into fish's special variables. 44 + # nixpkgs-installed fish tries to set these up already if NIX_PROFILES is defined, which won't 45 + # be the case when sourcing $__fish_data_dir/share/config.fish normally, but might be for a 46 + # recursive invocation. To guard against that, we'll only insert paths that don't already exit. 47 + # Furthermore, for the vendor_conf.d sourcing, we'll use the pre-existing presence of a path in 48 + # $fish_function_path to determine whether we want to source the relevant vendor_conf.d folder. 49 + 50 + # To start, let's locally define NIX_PROFILES if it doesn't already exist. 51 + set -al NIX_PROFILES 52 + if test (count $NIX_PROFILES) -eq 0 53 + set -a NIX_PROFILES $HOME/.nix-profile 54 + end 55 + # Replicate the logic from nixpkgs version of $__fish_data_dir/__fish_build_paths.fish. 56 + set -l __nix_profile_paths (string split ' ' -- $NIX_PROFILES)[-1..1] 57 + set -l __extra_completionsdir \ 58 + $__nix_profile_paths/etc/fish/completions \ 59 + $__nix_profile_paths/share/fish/vendor_completions.d 60 + set -l __extra_functionsdir \ 61 + $__nix_profile_paths/etc/fish/functions \ 62 + $__nix_profile_paths/share/fish/vendor_functions.d 63 + set -l __extra_confdir \ 64 + $__nix_profile_paths/etc/fish/conf.d \ 65 + $__nix_profile_paths/share/fish/vendor_conf.d \ 66 + 67 + ### Configure fish_function_path ### 68 + # Remove any of our extra paths that may already exist. 69 + # Record the equivalent __extra_confdir path for any function path that exists. 70 + set -l existing_conf_paths 71 + for path in $__extra_functionsdir 72 + if set -l idx (contains --index -- $path $fish_function_path) 73 + set -e fish_function_path[$idx] 74 + set -a existing_conf_paths $__extra_confdir[(contains --index -- $path $__extra_functionsdir)] 75 + end 76 + end 77 + # Insert the paths before $__fish_data_dir. 78 + if set -l idx (contains --index -- $__fish_data_dir/functions $fish_function_path) 79 + # Fish has no way to simply insert into the middle of an array. 80 + set -l new_path $fish_function_path[1..$idx] 81 + set -e new_path[$idx] 82 + set -a new_path $__extra_functionsdir 83 + set fish_function_path $new_path $fish_function_path[$idx..-1] 84 + else 85 + set -a fish_function_path $__extra_functionsdir 86 + end 87 + 88 + ### Configure fish_complete_path ### 89 + # Remove any of our extra paths that may already exist. 90 + for path in $__extra_completionsdir 91 + if set -l idx (contains --index -- $path $fish_complete_path) 92 + set -e fish_complete_path[$idx] 93 + end 94 + end 95 + # Insert the paths before $__fish_data_dir. 96 + if set -l idx (contains --index -- $__fish_data_dir/completions $fish_complete_path) 97 + set -l new_path $fish_complete_path[1..$idx] 98 + set -e new_path[$idx] 99 + set -a new_path $__extra_completionsdir 100 + set fish_complete_path $new_path $fish_complete_path[$idx..-1] 101 + else 102 + set -a fish_complete_path $__extra_completionsdir 103 + end 104 + 105 + ### Source conf directories ### 106 + # The built-in directories were already sourced during shell initialization. 107 + # Any __extra_confdir that came from $__fish_data_dir/__fish_build_paths.fish was also sourced. 108 + # As explained above, we're using the presence of pre-existing paths in $fish_function_path as a 109 + # signal that the corresponding conf dir has also already been sourced. 110 + # In order to simulate this, we'll run through the same algorithm as found in 111 + # $__fish_data_dir/config.fish except we'll avoid sourcing the file if it comes from an 112 + # already-sourced location. 113 + # Caveats: 114 + # * Files will be sourced in a different order than we'd ideally do (because we're coming in 115 + # after the fact to source them). 116 + # * If there are existing extra conf paths, files in them may have been sourced that should have 117 + # been suppressed by paths we're inserting in front. 118 + # * Similarly any files in $__fish_data_dir/vendor_conf.d that should have been suppressed won't 119 + # have been. 120 + set -l sourcelist 121 + for file in $__fish_config_dir/conf.d/*.fish $__fish_sysconf_dir/conf.d/*.fish 122 + # We know these paths were sourced already. Just record them. 123 + set -l basename (string replace -r '^.*/' '' -- $file) 124 + contains -- $basename $sourcelist 125 + or set -a sourcelist $basename 126 + end 127 + for root in $__extra_confdir 128 + for file in $root/*.fish 129 + set -l basename (string replace -r '^.*/' '' -- $file) 130 + contains -- $basename $sourcelist 131 + and continue 132 + set -a sourcelist $basename 133 + contains -- $root $existing_conf_paths 134 + and continue # this is a pre-existing path, it will have been sourced already 135 + [ -f $file -a -r $file ] 136 + and source $file 137 + end 138 + end 139 + end
modules/home/shells/zsh/default.nix

This is a binary file and will not be displayed.

modules/home/term/ghostty/default.nix

This is a binary file and will not be displayed.

+125
modules/home/term/ghostty/ghostty/config
··· 1 + initial-command = "/etc/profiles/per-user/suri/bin/suri_zellij_session_helper" 2 + 3 + custom-shader = ./shaders/cursor_blaze.glsl 4 + 5 + # custom-shader = ./shaders/starfield-colors.glsl 6 + 7 + # funny 8 + # custom-shader = ./shaders/bettercrt.glsl 9 + 10 + # Im hacker 11 + # custom-shader = ./shaders/inside-the-matrix.glsl 12 + 13 + 14 + # really cool 15 + # custom-shader = ./shaders/glow-rgbsplit-twitchy.glsl 16 + # custom-shader = ./shaders/glow.glsl 17 + # custom-shader = ./shaders/tunnel.glsl 18 + 19 + 20 + 21 + 22 + 23 + 24 + 25 + # custom-shader-animation = always 26 + 27 + font-family = "" 28 + 29 + font-family = "Monaspace Krypton SemiBold" 30 + 31 + font-family-bold = "Monaspace Neon SemiBold" 32 + 33 + font-family-italic = "Monaspace Argon SemiBold" 34 + 35 + font-family-bold-italic = "Monaspace Neon SemiBold" 36 + 37 + cursor-style = "bar" 38 + 39 + font-feature = "calt" 40 + font-feature = "clig" 41 + font-feature = "liga" 42 + font-feature = "dlig" 43 + font-feature = "ss01" 44 + font-feature = "ss02" 45 + font-feature = "ss03" 46 + font-feature = "ss04" 47 + font-feature = "ss05" 48 + font-feature = "ss06" 49 + font-feature = "ss07" 50 + font-feature = "ss08" 51 + 52 + font-size = "14" 53 + 54 + mouse-hide-while-typing = true 55 + 56 + # background-opacity = 0.8 57 + 58 + # background-blur = true 59 + 60 + window-padding-x = 5,5 61 + 62 + window-padding-y = 5,5 63 + 64 + # window-decoration = false 65 + 66 + # Disable conflicting Ghostty defaults to allow Zellij keybinds 67 + 68 + 69 + # keybind = clear 70 + 71 + # keybind = super+shift+,=reload 72 + 73 + # Ghostty uses super+k for clear_screen, Zellij uses it for MoveFocus up 74 + keybind = super+k=unbind 75 + keybind = super+d=unbind 76 + keybind = super+t=unbind 77 + # Ghostty uses super+n for new_window, Zellij uses it for NewPane 78 + keybind = super+n=unbind 79 + # Ghostty uses super+left_bracket for goto_split:previous, Zellij uses Super+[ for PreviousSwapLayout 80 + keybind = super+left_bracket=unbind 81 + # Ghostty uses super+right_bracket for goto_split:next, Zellij uses Super+] for NextSwapLayout 82 + keybind = super+right_bracket=unbind 83 + # Ghostty uses super+up for jump_to_prompt:-1, Zellij uses it for MoveFocus up 84 + keybind = super+up=unbind 85 + # Ghostty uses super+down for jump_to_prompt:1, Zellij uses it for MoveFocus down 86 + keybind = super+down=unbind 87 + # Ghostty uses super+right for text:\x05, Zellij uses it for MoveFocusOrTab right 88 + keybind = super+right=unbind 89 + # Ghostty uses super+left for text:\x01, Zellij uses it for MoveFocusOrTab left 90 + keybind = super+left=unbind 91 + # Ghostty tab navigation conflicts with Zellij GoToTab 92 + # keybind = super+one=unbind 93 + # keybind = super+two=unbind 94 + # keybind = super+three=unbind 95 + # keybind = super+four=unbind 96 + # keybind = super+five=unbind 97 + # keybind = super+six=unbind 98 + # keybind = super+seven=unbind 99 + # keybind = super+eight=unbind 100 + # keybind = super+nine=unbind 101 + 102 + keybind = super+digit_1=unbind 103 + keybind = super+digit_2=unbind 104 + keybind = super+digit_3=unbind 105 + keybind = super+digit_4=unbind 106 + keybind = super+digit_5=unbind 107 + keybind = super+digit_6=unbind 108 + keybind = super+digit_7=unbind 109 + keybind = super+digit_8=unbind 110 + keybind = super+digit_9=unbind 111 + 112 + keybind = super+1=unbind 113 + keybind = super+2=unbind 114 + keybind = super+3=unbind 115 + keybind = super+4=unbind 116 + keybind = super+5=unbind 117 + keybind = super+6=unbind 118 + keybind = super+7=unbind 119 + keybind = super+8=unbind 120 + keybind = super+9=unbind 121 + # theme = "gruvbox-material" 122 + # theme = GruvboxDarkHard 123 + # theme = Monokai Remastered 124 + # theme = Kanagawa Dragon 125 + theme = ayu
+8
modules/home/tools/btop.nix
··· 1 + { 2 + programs.btop = { 3 + enable = true; 4 + settings = { 5 + # color_theme = "TTY"; 6 + }; 7 + }; 8 + }
+29
modules/home/tools/default.nix
··· 1 + { pkgs, lib, ... }: { 2 + 3 + imports = [ ./helix ./zellij ]; 4 + 5 + home.sessionVariables.LIBRARY_PATH = 6 + "${lib.makeLibraryPath [ pkgs.libiconv ]}\${LIBRARY_PATH:+:$LIBRARY_PATH}"; 7 + 8 + home.packages = with pkgs; [ 9 + 10 + fastfetch 11 + zoxide 12 + zstd 13 + coreutils-prefixed 14 + lazygit 15 + docker 16 + yazi 17 + fzf 18 + github-cli 19 + dust 20 + glow 21 + just 22 + typst 23 + tokei 24 + ripgrep 25 + bat 26 + 27 + ]; 28 + 29 + }
+12
modules/home/tools/git.nix
··· 1 + { 2 + programs.git = { 3 + enable = true; 4 + settings.user = { 5 + name = "suri312006"; 6 + email = "suri312006@gmail.com"; 7 + 8 + }; 9 + 10 + lfs = { enable = true; }; 11 + }; 12 + }
+213
modules/home/tools/helix/default.nix
··· 1 + { pkgs, ... }: { 2 + 3 + home.file.".config/helix/ignore".text = '' 4 + !.notes/ 5 + !.gitignore 6 + !.gitmodules 7 + !.github/ 8 + !.devcontainer/ 9 + !.env* 10 + !.sqlx/ 11 + !.cargo/ 12 + !.config/ 13 + !puzzles/* 14 + !examples/* 15 + !inputs/* 16 + target/ 17 + ''; 18 + 19 + home.file.".config/helix/themes/theme-trans.toml".source = ./theme-trans.toml; 20 + 21 + programs.helix = { 22 + enable = true; 23 + defaultEditor = true; 24 + extraPackages = with pkgs; [ 25 + # markdown-oxide 26 + gopls 27 + nil 28 + texlab 29 + taplo 30 + lua-language-server 31 + haskell-language-server 32 + python312Packages.python-lsp-server 33 + typescript-language-server 34 + svelte-language-server 35 + tailwindcss-language-server 36 + emmet-language-server 37 + vale-ls 38 + tinymist 39 + ltex-ls 40 + nixd 41 + nil 42 + codebook 43 + markdown-oxide 44 + ruff 45 + ]; 46 + 47 + settings = { 48 + # theme = "gruvbox_dark_hard"; 49 + theme = "theme-trans"; 50 + # theme = lib.mkForce "stylix"; 51 + # theme = lib.mkForce "monokai_soda"; 52 + # theme = lib.mkForce "helix-ayu"; 53 + editor.cursor-shape = { 54 + normal = "block"; 55 + insert = "bar"; 56 + select = "underline"; 57 + 58 + }; 59 + 60 + editor = { 61 + 62 + line-number = "relative"; 63 + inline-diagnostics.cursor-line = "hint"; 64 + end-of-line-diagnostics = "hint"; 65 + color-modes = true; 66 + completion-trigger-len = 1; 67 + completion-timeout = 5; 68 + 69 + auto-save = { focus-lost = true; }; 70 + 71 + lsp = { display-inlay-hints = true; }; 72 + 73 + statusline = { 74 + left = [ 75 + "mode" 76 + "spinner" 77 + "file-name" 78 + "file-type" 79 + "total-line-numbers" 80 + "file-encoding" 81 + ]; 82 + right = [ 83 + "version-control" 84 + "position" 85 + "selections" 86 + "primary-selection-length" 87 + "position-percentage" 88 + "spacer" 89 + "workspace-diagnostics" 90 + ]; 91 + separator = "│"; 92 + mode.normal = "NORMAL"; 93 + mode.insert = "INSERT"; 94 + mode.select = "SELECT"; 95 + }; 96 + }; 97 + keys.normal = { X = "extend_line_above"; }; 98 + keys.normal = { ret = "goto_word"; }; 99 + 100 + }; 101 + 102 + languages = { 103 + language-server.ltex = { 104 + command = "ltex-ls-plus"; 105 + config.ltex.dictionary."en-US" = [ "ewwe" "flaberrasted" ]; 106 + config.ltex.disabledRules."en-US" = [ "WHITESPACE_RULE" ]; 107 + 108 + }; 109 + 110 + language-server.rust-analyzer.config.check.command = "clippy"; 111 + 112 + language-server.texlab = { 113 + command = "texlab"; 114 + config.texlab = { 115 + build = { 116 + onSave = true; 117 + forwardSearchAfter = true; 118 + executable = "latexmk"; 119 + args = [ 120 + "-pdf" 121 + "-interaction=nonstopmode" 122 + "-synctex=1" 123 + "-shell-escape" 124 + "%f" 125 + ]; 126 + }; 127 + forwardSearch = { 128 + executable = "zathura"; 129 + args = [ "--synctex-forward" "%l:%c:%f" "%p" ]; 130 + }; 131 + chktex = { 132 + onOpenAndSave = true; 133 + onEdit = true; 134 + }; 135 + }; 136 + }; 137 + 138 + language-server.codebook = { 139 + command = "codebook"; 140 + args = [ "serve" ]; 141 + 142 + }; 143 + 144 + language-server.gdscript = { 145 + command = "nc"; 146 + args = [ "127.0.0.1" "6005" ]; 147 + }; 148 + 149 + language = [ 150 + { 151 + name = "typst"; 152 + auto-format = true; 153 + formatter.command = "typstyle"; 154 + # idk how to fucking set this shit up 155 + # language-servers = [ "tinymist" "vale-ls" ]; 156 + # language-servers = [ "tinymist" "ltex-ls" ]; 157 + 158 + language-servers = [ "tinymist" ]; 159 + } 160 + { 161 + name = "latex"; 162 + # language-servers = [ "texlab" "ltex-ls-plus" "vale-ls" ]; 163 + language-servers = [ "texlab" "ltex-ls-plus" ]; 164 + } 165 + { 166 + name = "nix"; 167 + auto-format = true; 168 + formatter.command = "${pkgs.nixfmt-classic}/bin/nixfmt"; 169 + } 170 + { 171 + name = "svelte"; 172 + auto-format = true; 173 + formatter = { 174 + command = "dprint"; 175 + args = [ "fmt" "--stdin" "svelte" ]; 176 + }; 177 + language-servers = 178 + [ "svelteserver" "tailwindcss-language-server" "codebook" ]; 179 + } 180 + { 181 + name = "html"; 182 + language-servers = [ "vscode-html-language-server" "tailwindcss-ls" ]; 183 + } 184 + { 185 + name = "css"; 186 + language-servers = [ "vscode-css-language-server" "tailwindcss-ls" ]; 187 + } 188 + 189 + { 190 + name = "gdscript"; 191 + language-servers = [ "gdscript" ]; 192 + language-id = "gdscript"; 193 + } 194 + 195 + { 196 + name = "rust"; 197 + language-servers = [ "rust-analyzer" "codebook" ]; 198 + } 199 + { 200 + name = "markdown"; 201 + # auto-format = true; 202 + # formatter = { 203 + # command = "fmt"; 204 + # args = [ "70" ]; 205 + # }; 206 + language-servers = [ "codebook" "markdown-oxide" ]; 207 + } 208 + 209 + ]; 210 + }; 211 + 212 + }; 213 + }
+5
modules/home/tools/helix/theme-trans.toml
··· 1 + inherits = "gruvbox_dark_hard" 2 + 3 + 4 + "ui.background" = { bg = "#0B0E14" } 5 + "ui.statusline" = { bg = "#0B0E14" }
+264
modules/home/tools/zellij/config.kdl
··· 1 + keybinds clear-defaults=true { 2 + normal { 3 + // Switch to different modes with Super key 4 + bind "Super p" { SwitchToMode "pane"; } 5 + bind "Super t" { SwitchToMode "tab"; } 6 + bind "Super r" { SwitchToMode "resize"; } 7 + bind "Super m" { SwitchToMode "move"; } 8 + bind "Super v" { SwitchToMode "scroll"; } 9 + bind "Super o" { SwitchToMode "session"; } 10 + } 11 + 12 + locked { 13 + bind "Super g" { SwitchToMode "normal"; } 14 + } 15 + 16 + pane { 17 + bind "left" { MoveFocus "left"; } 18 + bind "down" { MoveFocus "down"; } 19 + bind "up" { MoveFocus "up"; } 20 + bind "right" { MoveFocus "right"; } 21 + bind "c" { SwitchToMode "renamepane"; PaneNameInput 0; } 22 + bind "d" { NewPane "down"; SwitchToMode "normal"; } 23 + bind "e" { TogglePaneEmbedOrFloating; SwitchToMode "normal"; } 24 + bind "f" { ToggleFocusFullscreen; SwitchToMode "normal"; } 25 + bind "h" { MoveFocus "left"; } 26 + bind "j" { MoveFocus "down"; } 27 + bind "k" { MoveFocus "up"; } 28 + bind "l" { MoveFocus "right"; } 29 + bind "n" { NewPane; SwitchToMode "normal"; } 30 + bind "p" { SwitchToMode "normal"; } 31 + bind "r" { NewPane "right"; SwitchToMode "normal"; } 32 + bind "w" { ToggleFloatingPanes; SwitchToMode "normal"; } 33 + bind "x" { CloseFocus; SwitchToMode "normal"; } 34 + bind "z" { TogglePaneFrames; SwitchToMode "normal"; } 35 + bind "tab" { SwitchFocus; } 36 + } 37 + 38 + tab { 39 + bind "left" { GoToPreviousTab; } 40 + bind "down" { GoToNextTab; } 41 + bind "up" { GoToPreviousTab; } 42 + bind "right" { GoToNextTab; } 43 + bind "1" { GoToTab 1; SwitchToMode "normal"; } 44 + bind "2" { GoToTab 2; SwitchToMode "normal"; } 45 + bind "3" { GoToTab 3; SwitchToMode "normal"; } 46 + bind "4" { GoToTab 4; SwitchToMode "normal"; } 47 + bind "5" { GoToTab 5; SwitchToMode "normal"; } 48 + bind "6" { GoToTab 6; SwitchToMode "normal"; } 49 + bind "7" { GoToTab 7; SwitchToMode "normal"; } 50 + bind "8" { GoToTab 8; SwitchToMode "normal"; } 51 + bind "9" { GoToTab 9; SwitchToMode "normal"; } 52 + bind "[" { BreakPaneLeft; SwitchToMode "normal"; } 53 + bind "]" { BreakPaneRight; SwitchToMode "normal"; } 54 + bind "b" { BreakPane; SwitchToMode "normal"; } 55 + bind "h" { GoToPreviousTab; } 56 + bind "j" { GoToNextTab; } 57 + bind "k" { GoToPreviousTab; } 58 + bind "l" { GoToNextTab; } 59 + bind "n" { NewTab; SwitchToMode "normal"; } 60 + bind "r" { SwitchToMode "renametab"; TabNameInput 0; } 61 + bind "s" { ToggleActiveSyncTab; SwitchToMode "normal"; } 62 + bind "t" { SwitchToMode "normal"; } 63 + bind "x" { CloseTab; SwitchToMode "normal"; } 64 + bind "tab" { ToggleTab; } 65 + } 66 + 67 + resize { 68 + bind "left" { Resize "Increase left"; } 69 + bind "down" { Resize "Increase down"; } 70 + bind "up" { Resize "Increase up"; } 71 + bind "right" { Resize "Increase right"; } 72 + bind "+" { Resize "Increase"; } 73 + bind "-" { Resize "Decrease"; } 74 + bind "=" { Resize "Increase"; } 75 + bind "H" { Resize "Decrease left"; } 76 + bind "J" { Resize "Decrease down"; } 77 + bind "K" { Resize "Decrease up"; } 78 + bind "L" { Resize "Decrease right"; } 79 + bind "h" { Resize "Increase left"; } 80 + bind "j" { Resize "Increase down"; } 81 + bind "k" { Resize "Increase up"; } 82 + bind "l" { Resize "Increase right"; } 83 + bind "r" { SwitchToMode "normal"; } 84 + } 85 + 86 + move { 87 + bind "left" { MovePane "left"; } 88 + bind "down" { MovePane "down"; } 89 + bind "up" { MovePane "up"; } 90 + bind "right" { MovePane "right"; } 91 + bind "h" { MovePane "left"; } 92 + bind "j" { MovePane "down"; } 93 + bind "k" { MovePane "up"; } 94 + bind "l" { MovePane "right"; } 95 + bind "m" { SwitchToMode "normal"; } 96 + bind "n" { MovePane; } 97 + bind "p" { MovePaneBackwards; } 98 + bind "tab" { MovePane; } 99 + } 100 + 101 + scroll { 102 + bind "Alt left" { MoveFocusOrTab "left"; SwitchToMode "normal"; } 103 + bind "Alt down" { MoveFocus "down"; SwitchToMode "normal"; } 104 + bind "Alt up" { MoveFocus "up"; SwitchToMode "normal"; } 105 + bind "Alt right" { MoveFocusOrTab "right"; SwitchToMode "normal"; } 106 + bind "e" { EditScrollback; SwitchToMode "normal"; } 107 + bind "f" { SwitchToMode "entersearch"; SearchInput 0; } 108 + bind "Alt h" { MoveFocusOrTab "left"; SwitchToMode "normal"; } 109 + bind "Alt j" { MoveFocus "down"; SwitchToMode "normal"; } 110 + bind "Alt k" { MoveFocus "up"; SwitchToMode "normal"; } 111 + bind "Alt l" { MoveFocusOrTab "right"; SwitchToMode "normal"; } 112 + bind "s" { SwitchToMode "normal"; } 113 + } 114 + 115 + search { 116 + bind "c" { SearchToggleOption "CaseSensitivity"; } 117 + bind "n" { Search "down"; } 118 + bind "o" { SearchToggleOption "WholeWord"; } 119 + bind "p" { Search "up"; } 120 + bind "w" { SearchToggleOption "Wrap"; } 121 + } 122 + 123 + session { 124 + bind "c" { 125 + LaunchOrFocusPlugin "configuration" { 126 + floating true 127 + move_to_focused_tab true 128 + } 129 + SwitchToMode "normal" 130 + } 131 + bind "d" { Detach; } 132 + bind "o" { SwitchToMode "normal"; } 133 + bind "p" { 134 + LaunchOrFocusPlugin "plugin-manager" { 135 + floating true 136 + move_to_focused_tab true 137 + } 138 + SwitchToMode "normal" 139 + } 140 + bind "w" { 141 + LaunchOrFocusPlugin "session-manager" { 142 + floating true 143 + move_to_focused_tab true 144 + } 145 + SwitchToMode "normal" 146 + } 147 + } 148 + 149 + shared_among "normal" "locked" { 150 + bind "Super [" { PreviousSwapLayout; } 151 + bind "Super ]" { NextSwapLayout; } 152 + bind "Super f" { ToggleFloatingPanes; } 153 + 154 + bind "Super left" { MoveFocusOrTab "left"; } 155 + bind "Super down" { MoveFocus "down"; } 156 + bind "Super up" { MoveFocus "up"; } 157 + bind "Super right" { MoveFocusOrTab "right"; } 158 + 159 + bind "Super h" { MoveFocusOrTab "left"; } 160 + bind "Super j" { MoveFocus "down"; } 161 + bind "Super k" { MoveFocus "up"; } 162 + bind "Super l" { MoveFocusOrTab "right"; } 163 + 164 + bind "Super n" { NewPane; } 165 + bind "Super x" { CloseFocus; } 166 + bind "Super s" { 167 + LaunchOrFocusPlugin "session-manager" { 168 + floating true 169 + move_to_focused_tab true 170 + } 171 + } 172 + 173 + bind "Super o" { MoveTab "right"; } 174 + bind "Super i" { MoveTab "left"; } 175 + 176 + bind "Super 1" { GoToTab 1; } 177 + bind "Super 2" { GoToTab 2; } 178 + bind "Super 3" { GoToTab 3; } 179 + bind "Super 4" { GoToTab 4; } 180 + bind "Super 5" { GoToTab 5; } 181 + bind "Super 6" { GoToTab 6; } 182 + bind "Super 7" { GoToTab 7; } 183 + bind "Super 8" { GoToTab 8; } 184 + bind "Super 9" { GoToTab 9; } 185 + } 186 + 187 + shared_except "locked" "renametab" "renamepane" { 188 + bind "Ctrl g" { SwitchToMode "locked"; } 189 + bind "Ctrl q" { Quit; } 190 + } 191 + 192 + shared_except "normal" "locked" "entersearch" { 193 + bind "enter" { SwitchToMode "normal"; } 194 + } 195 + 196 + shared_except "normal" "locked" "entersearch" "renametab" "renamepane" { 197 + bind "esc" { SwitchToMode "normal"; } 198 + } 199 + 200 + shared_among "scroll" "search" { 201 + bind "PageDown" { PageScrollDown; } 202 + bind "PageUp" { PageScrollUp; } 203 + bind "left" { PageScrollUp; } 204 + bind "down" { ScrollDown; } 205 + bind "up" { ScrollUp; } 206 + bind "right" { PageScrollDown; } 207 + bind "Ctrl b" { PageScrollUp; } 208 + bind "Ctrl c" { ScrollToBottom; SwitchToMode "normal"; } 209 + bind "d" { HalfPageScrollDown; } 210 + bind "Ctrl f" { PageScrollDown; } 211 + bind "h" { PageScrollUp; } 212 + bind "j" { ScrollDown; } 213 + bind "k" { ScrollUp; } 214 + bind "l" { PageScrollDown; } 215 + bind "u" { HalfPageScrollUp; } 216 + } 217 + 218 + entersearch { 219 + bind "Ctrl c" { SwitchToMode "scroll"; } 220 + bind "esc" { SwitchToMode "scroll"; } 221 + bind "enter" { SwitchToMode "search"; } 222 + } 223 + 224 + renametab { 225 + bind "esc" { UndoRenameTab; SwitchToMode "tab"; } 226 + } 227 + 228 + shared_among "renametab" "renamepane" { 229 + bind "Ctrl c" { SwitchToMode "normal"; } 230 + } 231 + 232 + renamepane { 233 + bind "esc" { UndoRenamePane; SwitchToMode "pane"; } 234 + } 235 + } 236 + 237 + plugins { 238 + compact-bar location="zellij:compact-bar" 239 + configuration location="zellij:configuration" 240 + filepicker location="zellij:strider" { 241 + cwd "/" 242 + } 243 + plugin-manager location="zellij:plugin-manager" 244 + session-manager location="zellij:session-manager" 245 + status-bar location="zellij:status-bar" 246 + strider location="zellij:strider" 247 + tab-bar location="zellij:tab-bar" 248 + welcome-screen location="zellij:session-manager" { 249 + welcome_screen true 250 + } 251 + } 252 + 253 + load_plugins { 254 + } 255 + 256 + // theme "onedark" 257 + theme "ayu_dark" 258 + 259 + // Changed from "locked" to "normal" 260 + default_mode "normal" 261 + 262 + pane_frames false 263 + 264 + scrollback_lines_to_serialize 10000
+44
modules/home/tools/zellij/default.nix
··· 1 + { pkgs, ... }: 2 + # let 3 + # suri_zellij_session_helper = 4 + # pkgs.writeShellScriptBin "suri_zellij_session_helper" '' 5 + 6 + # ZELLIJ_SESSIONS=$(zellij ls | sed 's/\x1b\[[0-9;]*m//g' | cut -d ' ' -f 1) 7 + # NUM_SESSIONS=$(echo "''${ZELLIJ_SESSIONS}" | wc -l ) 8 + 9 + # if [ "''${NUM_SESSIONS}" -ge 1 ]; then 10 + # SESSION="$(echo "''${ZELLIJ_SESSIONS}" | fzf)" 11 + 12 + # zellij a ''${SESSION} 13 + 14 + # else 15 + # zellij attach -c 16 + # fi 17 + 18 + # ''; 19 + # in { 20 + 21 + # home = { 22 + # packages = [ pkgs.zellij suri_zellij_session_helper ]; 23 + # file.".config/zellij/config.kdl".source = ./config.kdl; 24 + # }; 25 + # } 26 + 27 + let 28 + suri_zellij_session_helper = 29 + pkgs.writeShellScriptBin "suri_zellij_session_helper" '' 30 + ZELLIJ_SESSIONS=$(${pkgs.zellij}/bin/zellij ls | sed 's/\x1b\[[0-9;]*m//g' | cut -d ' ' -f 1) 31 + NUM_SESSIONS=$(echo "''${ZELLIJ_SESSIONS}" | wc -l ) 32 + if [ "''${NUM_SESSIONS}" -ge 1 ]; then 33 + SESSION="$(echo "''${ZELLIJ_SESSIONS}" | ${pkgs.fzf}/bin/fzf)" 34 + ${pkgs.zellij}/bin/zellij a ''${SESSION} 35 + else 36 + ${pkgs.zellij}/bin/zellij attach -c 37 + fi 38 + ''; 39 + in { 40 + home = { 41 + packages = [ pkgs.zellij pkgs.fzf suri_zellij_session_helper ]; 42 + file.".config/zellij/config.kdl".source = ./config.kdl; 43 + }; 44 + }
+354
modules/home/wm/aerospace/aerospace.toml
··· 1 + 2 + # Place a copy of this config to ~/.aerospace.toml 3 + # After that, you can edit ~/.aerospace.toml to your liking 4 + 5 + # You can use it to add commands that run after login to macOS user session. 6 + # 'start-at-login' needs to be 'true' for 'after-login-command' to work 7 + # Available commands: https://nikitabobko.github.io/AeroSpace/commands 8 + after-login-command = [] 9 + 10 + # You can use it to add commands that run after AeroSpace startup. 11 + # 'after-startup-command' is run after 'after-login-command' 12 + # Available commands : https://nikitabobko.github.io/AeroSpace/commands 13 + # 14 + # Run Sketchybar together with AeroSpace 15 + # sketchbar has a built-in detection of already running process, 16 + # so it won't be run twice on AeroSpace restart 17 + # after-startup-command = ['exec-and-forget sketchybar'] 18 + 19 + # # Notify Sketchybar about workspace change 20 + # exec-on-workspace-change = ['/bin/bash', '-c', 21 + # 'sketchybar --trigger aerospace_workspace_change FOCUSED_WORKSPACE=$AEROSPACE_FOCUSED_WORKSPACE' 22 + # ] 23 + # 24 + exec-on-workspace-change = [ 25 + '/bin/bash', 26 + '-c', 27 + 'sketchybar --trigger aerospace_workspace_change FOCUSED_WORKSPACE=$AEROSPACE_FOCUSED_WORKSPACE FOCUSED_DISPLAY=$(aerospace list-monitors --focused | awk "{print $1}")', 28 + ] 29 + 30 + # Notify Sketchybar about focuse change 31 + # See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks 32 + on-focus-changed = [ 33 + 'exec-and-forget sketchybar --trigger aerospace_focus_change FOCUSED_WORKSPACE=$AEROSPACE_FOCUSED_WORKSPACE', 34 + ] 35 + # startup apps 36 + after-startup-command = [ 37 + # 'exec-and-forget borders active_color=0xffe1e3e4 inactive_color=0xff494d64 width=3.0', 38 + 39 + '''exec-and-forget osascript -e ' 40 + 41 + -- Launch applications in sequence 42 + tell application "Zen" 43 + activate 44 + delay 0.8 45 + end tell 46 + 47 + tell application "Ghostty" 48 + activate 49 + delay 0.8 50 + end tell 51 + 52 + tell application "Discord" 53 + activate 54 + delay 0.8 55 + end tell 56 + 57 + 58 + tell application "Zulip" 59 + activate 60 + delay 0.8 61 + end tell 62 + 63 + tell application "Mail" 64 + activate 65 + delay 0.8 66 + end tell 67 + 68 + tell application "Spotify" 69 + activate 70 + delay 0.8 71 + end tell 72 + ' 73 + 74 + ''' 75 + ] 76 + 77 + # Start AeroSpace at login 78 + start-at-login = true 79 + 80 + # Normalizations. See: https://nikitabobko.github.io/AeroSpace/guide#normalization 81 + enable-normalization-flatten-containers = true 82 + enable-normalization-opposite-orientation-for-nested-containers = true 83 + 84 + # See: https://nikitabobko.github.io/AeroSpace/guide#layouts 85 + # The 'accordion-padding' specifies the size of accordion padding 86 + # You can set 0 to disable the padding feature 87 + accordion-padding = 30 88 + 89 + # Possible values: tiles|accordion 90 + default-root-container-layout = 'tiles' 91 + 92 + # Possible values: horizontal|vertical|auto 93 + # 'auto' means: wide monitor (anything wider than high) gets horizontal orientation, 94 + # tall monitor (anything higher than wide) gets vertical orientation 95 + default-root-container-orientation = 'auto' 96 + 97 + # Mouse follows focus when focused monitor changes 98 + # Drop it from your config, if you don't like this behavior 99 + # See https://nikitabobko.github.io/AeroSpace/guide#on-focus-changed-callbacks 100 + # See https://nikitabobko.github.io/AeroSpace/commands#move-mouse 101 + # Fallback value (if you omit the key): on-focused-monitor-changed = [] 102 + on-focused-monitor-changed = ['move-mouse monitor-lazy-center'] 103 + 104 + # You can effectively turn off macOS "Hide application" (cmd-h) feature by toggling this flag 105 + # Useful if you don't use this macOS feature, but accidentally hit cmd-h or cmd-alt-h key 106 + # Also see: https://nikitabobko.github.io/AeroSpace/goodies#disable-hide-app 107 + automatically-unhide-macos-hidden-apps = false 108 + 109 + # Possible values: (qwerty|dvorak|colemak) 110 + # See https://nikitabobko.github.io/AeroSpace/guide#key-mapping 111 + [key-mapping] 112 + preset = 'qwerty' 113 + 114 + # Gaps between windows (inner-*) and between monitor edges (outer-*). 115 + # Possible values: 116 + # - Constant: gaps.outer.top = 8 117 + # - Per monitor: gaps.outer.top = [{ monitor.main = 16 }, { monitor."some-pattern" = 32 }, 24] 118 + # In this example, 24 is a default value when there is no match. 119 + # Monitor pattern is the same as for 'workspace-to-monitor-force-assignment'. 120 + # See: 121 + # https://nikitabobko.github.io/AeroSpace/guide#assign-workspaces-to-monitors 122 + [gaps] 123 + inner.horizontal = 5 124 + inner.vertical = 5 125 + outer.left = 10 126 + outer.bottom = 10 127 + outer.right = 10 128 + # need to do this so sketchybar looks good 129 + # outer.top = [{monitor."SB270" = 40}, {monitor."CB272" = 40}, 10] 130 + # outer.top = 10 131 + 132 + 133 + # 'main' binding mode declaration 134 + # See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes 135 + # 'main' binding mode must be always presented 136 + # Fallback value (if you omit the key): mode.main.binding = {} 137 + [mode.main.binding] 138 + alt-v= 'layout v_tiles' 139 + alt-shift-v='layout h_tiles' 140 + # All possible keys: 141 + # - Letters. a, b, c, ..., z 142 + # - Numbers. 0, 1, 2, ..., 9 143 + # - Keypad numbers. keypad0, keypad1, keypad2, ..., keypad9 144 + # - F-keys. f1, f2, ..., f20 145 + # - Special keys. minus, equal, period, comma, slash, backslash, quote, semicolon, 146 + # backtick, leftSquareBracket, rightSquareBracket, space, enter, esc, 147 + # backspace, tab, pageUp, pageDown, home, end, forwardDelete, 148 + # sectionSign (ISO keyboards only, european keyboards only) 149 + # - Keypad special. keypadClear, keypadDecimalMark, keypadDivide, keypadEnter, keypadEqual, 150 + # keypadMinus, keypadMultiply, keypadPlus 151 + # - Arrows. left, down, up, right 152 + 153 + # All possible modifiers: cmd, alt, ctrl, shift 154 + 155 + # All possible commands: https://nikitabobko.github.io/AeroSpace/commands 156 + 157 + # See: https://nikitabobko.github.io/AeroSpace/commands#exec-and-forget 158 + # You can uncomment the following lines to open up terminal with alt + enter shortcut 159 + # (like in i3) 160 + # alt-enter = '''exec-and-forget osascript -e ' 161 + # tell application "Terminal" 162 + # do script 163 + # activate 164 + # end tell' 165 + # ''' 166 + # 167 + alt-enter = '''exec-and-forget osascript -e ' 168 + tell application "Ghostty" 169 + do script 170 + activate 171 + end tell' 172 + ''' 173 + 174 + alt-f = 'fullscreen' 175 + 176 + # See: https://nikitabobko.github.io/AeroSpace/commands#layout 177 + alt-slash = 'layout tiles horizontal vertical' 178 + alt-comma = 'layout accordion horizontal vertical' 179 + 180 + # See: https://nikitabobko.github.io/AeroSpace/commands#focus 181 + alt-h = 'focus left' 182 + alt-j = 'focus down' 183 + alt-k = 'focus up' 184 + alt-l = 'focus right' 185 + 186 + # See: https://nikitabobko.github.io/AeroSpace/commands#move 187 + alt-shift-h = 'move left' 188 + alt-shift-j = 'move down' 189 + alt-shift-k = 'move up' 190 + alt-shift-l = 'move right' 191 + 192 + # See: https://nikitabobko.github.io/AeroSpace/commands#resize 193 + alt-minus = 'resize smart -50' 194 + alt-equal = 'resize smart +50' 195 + 196 + # See: https://nikitabobko.github.io/AeroSpace/commands#workspace 197 + alt-1 = 'workspace 1' 198 + alt-2 = 'workspace 2' 199 + alt-3 = 'workspace 3' 200 + alt-4 = 'workspace 4' 201 + alt-5 = 'workspace 5' 202 + alt-6 = 'workspace 6' 203 + alt-7 = 'workspace 7' 204 + alt-8 = 'workspace 8' 205 + alt-9 = 'workspace 9' 206 + alt-0 = 'workspace 10' 207 + # alt-a = 'workspace A' # In your config, you can drop workspace bindings that you don't need 208 + # alt-b = 'workspace B' 209 + # alt-c = 'workspace C' 210 + # alt-d = 'workspace D' 211 + # alt-e = 'workspace E' 212 + # alt-f = 'workspace F' 213 + # alt-g = 'workspace G' 214 + # alt-i = 'workspace I' 215 + # alt-m = 'workspace M' 216 + # alt-n = 'workspace N' 217 + # alt-o = 'workspace O' 218 + # alt-p = 'workspace P' 219 + # alt-q = 'workspace Q' 220 + # alt-r = 'workspace R' 221 + # alt-s = 'workspace S' 222 + # alt-t = 'workspace T' 223 + # alt-u = 'workspace U' 224 + # alt-v = 'workspace V' 225 + # alt-w = 'workspace W' 226 + # alt-x = 'workspace X' 227 + # alt-y = 'workspace Y' 228 + # alt-z = 'workspace Z' 229 + 230 + # See: https://nikitabobko.github.io/AeroSpace/commands#move-node-to-workspace 231 + alt-shift-1 = ['move-node-to-workspace 1', 'workspace 1'] 232 + alt-shift-2 = ['move-node-to-workspace 2', 'workspace 2'] 233 + alt-shift-3 = ['move-node-to-workspace 3', 'workspace 3'] 234 + alt-shift-4 = ['move-node-to-workspace 4', 'workspace 4'] 235 + alt-shift-5 = ['move-node-to-workspace 5', 'workspace 5'] 236 + alt-shift-6 = ['move-node-to-workspace 6', 'workspace 6'] 237 + alt-shift-7 = ['move-node-to-workspace 7', 'workspace 7'] 238 + alt-shift-8 = ['move-node-to-workspace 8', 'workspace 8'] 239 + alt-shift-9 = ['move-node-to-workspace 9', 'workspace 9'] 240 + alt-shift-0 = ['move-node-to-workspace 10', 'workspace 10'] 241 + # alt-shift-a = 'move-node-to-workspace A' 242 + # alt-shift-b = 'move-node-to-workspace B' 243 + # alt-shift-c = 'move-node-to-workspace C' 244 + # alt-shift-d = 'move-node-to-workspace D' 245 + # alt-shift-e = 'move-node-to-workspace E' 246 + # alt-shift-f = 'move-node-to-workspace F' 247 + # alt-shift-g = 'move-node-to-workspace G' 248 + # alt-shift-i = 'move-node-to-workspace I' 249 + # alt-shift-m = 'move-node-to-workspace M' 250 + # alt-shift-n = 'move-node-to-workspace N' 251 + # alt-shift-o = 'move-node-to-workspace O' 252 + # alt-shift-p = 'move-node-to-workspace P' 253 + # alt-shift-q = 'move-node-to-workspace Q' 254 + # alt-shift-r = 'move-node-to-workspace R' 255 + # alt-shift-s = 'move-node-to-workspace S' 256 + # alt-shift-t = 'move-node-to-workspace T' 257 + # alt-shift-u = 'move-node-to-workspace U' 258 + # alt-shift-v = 'move-node-to-workspace V' 259 + # alt-shift-w = 'move-node-to-workspace W' 260 + # alt-shift-x = 'move-node-to-workspace X' 261 + # alt-shift-y = 'move-node-to-workspace Y' 262 + # alt-shift-z = 'move-node-to-workspace Z' 263 + 264 + # See: https://nikitabobko.github.io/AeroSpace/commands#workspace-back-and-forth 265 + alt-tab = 'workspace-back-and-forth' 266 + # See: https://nikitabobko.github.io/AeroSpace/commands#move-workspace-to-monitor 267 + alt-shift-tab = 'move-workspace-to-monitor --wrap-around next' 268 + 269 + # See: https://nikitabobko.github.io/AeroSpace/commands#mode 270 + alt-shift-semicolon = 'mode service' 271 + 272 + # 'service' binding mode declaration. 273 + # See: https://nikitabobko.github.io/AeroSpace/guide#binding-modes 274 + [mode.service.binding] 275 + esc = ['reload-config', 'mode main'] 276 + r = ['flatten-workspace-tree', 'mode main'] # reset layout 277 + f = ['layout floating tiling', 'mode main'] # Toggle between floating and tiling layout 278 + backspace = ['close-all-windows-but-current', 'mode main'] 279 + 280 + # sticky is not yet supported https://github.com/nikitabobko/AeroSpace/issues/2 281 + #s = ['layout sticky tiling', 'mode main'] 282 + 283 + alt-shift-h = ['join-with left', 'mode main'] 284 + alt-shift-j = ['join-with down', 'mode main'] 285 + alt-shift-k = ['join-with up', 'mode main'] 286 + 287 + alt-shift-l = ['join-with right', 'mode main'] 288 + 289 + down = 'volume down' 290 + up = 'volume up' 291 + shift-down = ['volume set 0', 'mode main'] 292 + 293 + [workspace-to-monitor-force-assignment] 294 + 1 = 2 295 + 2 = 2 296 + 3 = 2 297 + 4 = 2 298 + 5 = 2 299 + 6 = 3 300 + 7 = 3 301 + 8 = 3 302 + 9 = 3 303 + # 9 = 1 304 + 10 = 1 305 + 306 + 307 + [[on-window-detected]] 308 + if.app-id = 'app.zen-browser.zen' 309 + run = ['move-node-to-workspace 3'] 310 + 311 + [[on-window-detected]] 312 + if.app-id = 'com.hnc.Discord' 313 + run = ['move-node-to-workspace 7'] 314 + 315 + [[on-window-detected]] 316 + if.app-id = 'com.spotify.client' 317 + run = ['move-node-to-workspace 7'] 318 + 319 + [[on-window-detected]] 320 + if.app-id = 'org.zulip.zulip-electron' 321 + run = ['move-node-to-workspace 8'] 322 + 323 + [[on-window-detected]] 324 + if.app-id = 'com.tinyspeck.slackmacgap' 325 + run = ['move-node-to-workspace 8'] 326 + 327 + [[on-window-detected]] 328 + if.app-id = 'com.apple.mail' 329 + run = ['move-node-to-workspace 6'] 330 + 331 + [[on-window-detected]] 332 + if.app-id = 'com.mitchellh.ghostty' 333 + run = ['move-node-to-workspace 2'] 334 + 335 + [[on-window-detected]] 336 + if.window-title-regex-substring = '(?i)emergence' 337 + run = ['move-node-to-workspace 10'] 338 + 339 + 340 + [[on-window-detected]] 341 + if.app-id = 'com.mitchellh.ghostty' 342 + run = ['move-node-to-workspace 2'] 343 + 344 + 345 + [[on-window-detected]] 346 + if.app-id = 'org.mozilla.firefox' 347 + if.window-title-regex-substring = 'Picture-in-Picture' 348 + run = 'layout floating' 349 + 350 + 351 + [[on-window-detected]] 352 + if.app-id = 'app.zen-browser.zen' 353 + if.window-title-regex-substring = 'Picture-in-Picture' 354 + run = ['layout floating']
+6
modules/home/wm/aerospace/default.nix
··· 1 + { pkgs, stdenv, ... }: 2 + 3 + { 4 + home.file.".aerospace.toml" = 5 + pkgs.lib.mkIf pkgs.stdenv.isDarwin { source = ./aerospace.toml; }; 6 + }
modules/home/wm/default.nix

This is a binary file and will not be displayed.

modules/home/wm/hyprland/default.nix

This is a binary file and will not be displayed.

system/boot.nix modules/system/boot.nix
system/sound.nix modules/system/sound.nix
+8 -5
users/suri/home.nix
··· 1 - { config, pkgs, ... }: 1 + { config, ... }: 2 2 let 3 3 4 4 OOS = path: config.lib.file.mkOutOfStoreSymlink path; ··· 6 6 in { 7 7 8 8 # imports = [ ./apps ]; 9 + # 10 + imports = [ 9 11 10 - home.packages = [ 11 - 12 - pkgs.fastfetch 12 + ../../modules/home/wm/aerospace 13 + ../../modules/home/prompts/oh-my-posh 14 + ../../modules/home/shells/zsh 15 + ../../modules/home/term/ghostty 16 + ../../modules/home/tools 13 17 14 18 ]; 15 19 16 20 home.file = { 17 - 18 21 # REMEMBER to lift the config file out, and refacts this after kenric puts his config 19 22 # on the public internet, study and refactor my dotfiles! 20 23 "Library/Application Support/com.mitchellh.ghostty".source =