First Try
This commit is contained in:
		
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
README.md~
 | 
			
		||||
							
								
								
									
										11
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
# A NIX Config To Rule Them all
 | 
			
		||||
_now mostly focused on my Mac Machines_
 | 
			
		||||
 | 
			
		||||
Started with a configuration generated from [this nixos config template](https://github.com/dustinlyons/nixos-config/)
 | 
			
		||||
 | 
			
		||||
Created the full verion with secret-management:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
mkdir -p nixos-config && cd nixos-config && nix flake --extra-experimental-features 'nix-command flakes' init -t github:dustinlyons/nixos-config#starter-with-secrets
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										245
									
								
								apps/aarch64-darwin/apply
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										245
									
								
								apps/aarch64-darwin/apply
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,245 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
RED='\033[0;31m'
 | 
			
		||||
GREEN='\033[0;32m'
 | 
			
		||||
YELLOW='\033[1;33m'
 | 
			
		||||
NC='\033[0m' # No Color
 | 
			
		||||
 | 
			
		||||
# Determine the operating system
 | 
			
		||||
export OS=$(uname)
 | 
			
		||||
 | 
			
		||||
# Primary network interface
 | 
			
		||||
if [[ "$OS" != "Darwin" ]]; then
 | 
			
		||||
  export PRIMARY_IFACE=$(ip -o -4 route show to default | awk '{print $5}')
 | 
			
		||||
  echo -e "${GREEN}Found primary network interface $PRIMARY_IFACE${NC}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Custom print function
 | 
			
		||||
_print() {
 | 
			
		||||
  if [[ "$OS" == "Darwin" ]]; then
 | 
			
		||||
    echo -e "$1"
 | 
			
		||||
  else
 | 
			
		||||
    echo "$1"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Custom prompt function
 | 
			
		||||
_prompt() {
 | 
			
		||||
  local message="$1"
 | 
			
		||||
  local variable="$2"
 | 
			
		||||
 | 
			
		||||
  _print "$message"
 | 
			
		||||
  read -r $variable
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
insert_secrets_output() {
 | 
			
		||||
  local pattern="outputs = { self, darwin, nix-homebrew, homebrew-bundle, homebrew-core, homebrew-cask, home-manager, nixpkgs, disko, agenix } @inputs:"
 | 
			
		||||
  local insert_text="secrets "
 | 
			
		||||
 | 
			
		||||
  awk -v pat="$pattern" -v insert="$insert_text" '
 | 
			
		||||
    $0 ~ pat {
 | 
			
		||||
      sub(/} @inputs:/, ", " insert "} @inputs:"); # Replace the closing brace with the insert text followed by the brace
 | 
			
		||||
      gsub(/ ,/, ","); # Correct any spaces before commas
 | 
			
		||||
      print
 | 
			
		||||
      next
 | 
			
		||||
    }
 | 
			
		||||
    { print }
 | 
			
		||||
  ' flake.nix > flake.nix.tmp
 | 
			
		||||
 | 
			
		||||
  mv flake.nix.tmp flake.nix
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
insert_secrets_input() {
 | 
			
		||||
  # Define file path
 | 
			
		||||
  FILE_PATH="flake.nix"
 | 
			
		||||
 | 
			
		||||
  # Backup the original file
 | 
			
		||||
  cp "$FILE_PATH" "${FILE_PATH}.bak"
 | 
			
		||||
 | 
			
		||||
  # Temporary file for the text to insert
 | 
			
		||||
  TEMP_FILE="temp_insert.txt"
 | 
			
		||||
 | 
			
		||||
  # Write the formatted text to the temporary file
 | 
			
		||||
cat > "$TEMP_FILE" << 'EOF'
 | 
			
		||||
    secrets = {
 | 
			
		||||
      url = "git+ssh://git@github.com/%GITHUB_USER%/%GITHUB_SECRETS_REPO%.git";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
  # Check if the 'secrets' block already exists
 | 
			
		||||
  if grep -q 'url = "git+ssh://git@github.com/%GITHUB_USER%/%GITHUB_SECRETS_REPO%.git"' "$FILE_PATH"; then
 | 
			
		||||
      echo "The 'secrets' block already exists in the file."
 | 
			
		||||
      rm "$TEMP_FILE"
 | 
			
		||||
      rm "${FILE_PATH}.bak"
 | 
			
		||||
      exit 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Find the start and end line numbers of the 'disko' block
 | 
			
		||||
  START_LINE=$(grep -n 'disko = {' "$FILE_PATH" | head -n 1 | cut -d: -f1)
 | 
			
		||||
  END_LINE=$(tail -n +$START_LINE "$FILE_PATH" | grep -n '};' | head -n 1 | cut -d: -f1)
 | 
			
		||||
  END_LINE=$((START_LINE + END_LINE - 1))
 | 
			
		||||
 | 
			
		||||
  # Create a new file with the insertion
 | 
			
		||||
  {
 | 
			
		||||
      sed -n "1,${END_LINE}p" "$FILE_PATH"
 | 
			
		||||
      cat "$TEMP_FILE"
 | 
			
		||||
      sed -n "$((END_LINE + 1)),\$p" "$FILE_PATH"
 | 
			
		||||
  } > "${FILE_PATH}.new"
 | 
			
		||||
 | 
			
		||||
  # Replace the original file with the new file
 | 
			
		||||
  mv "${FILE_PATH}.new" "$FILE_PATH"
 | 
			
		||||
 | 
			
		||||
  # Clean up the temporary files
 | 
			
		||||
  rm "$TEMP_FILE"
 | 
			
		||||
  rm "${FILE_PATH}.bak"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ask_for_star() {
 | 
			
		||||
  _print "${YELLOW}Would you like to support my work by starring my GitHub repo? yes/no [yes]: ${NC}"
 | 
			
		||||
  local response
 | 
			
		||||
  read -r response
 | 
			
		||||
  response=${response:-yes} # Set default response to 'yes' if input is empty
 | 
			
		||||
  if [[ "$response" =~ ^[Yy](es)?$ ]] || [[ -z "$response" ]]; then
 | 
			
		||||
    if [[ "$OS" == "Darwin" ]]; then
 | 
			
		||||
      open "https://github.com/dustinlyons/nixos-config"
 | 
			
		||||
    else
 | 
			
		||||
      xdg-open "https://github.com/dustinlyons/nixos-config"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ask_for_star
 | 
			
		||||
 | 
			
		||||
# Fetch username from the system
 | 
			
		||||
export USERNAME=$(whoami)
 | 
			
		||||
 | 
			
		||||
# If the username is 'nixos' or 'root', ask the user for their username
 | 
			
		||||
if [[ "$USERNAME" == "nixos" ]] || [[ "$USERNAME" == "root" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}You're running as $USERNAME. Please enter your desired username: ${NC}" USERNAME
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Check if git is available
 | 
			
		||||
if command -v git >/dev/null 2>&1; then
 | 
			
		||||
  # Fetch email and name from git config
 | 
			
		||||
  export GIT_EMAIL=$(git config --get user.email)
 | 
			
		||||
  export GIT_NAME=$(git config --get user.name)
 | 
			
		||||
else
 | 
			
		||||
  _print "${RED}Git is not available on this system.${NC}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# If git email is not found or git is not available, ask the user
 | 
			
		||||
if [[ -z "$GIT_EMAIL" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}Please enter your email: ${NC}" GIT_EMAIL
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# If git name is not found or git is not available, ask the user
 | 
			
		||||
if [[ -z "$GIT_NAME" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}Please enter your name: ${NC}" GIT_NAME
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
_prompt "${YELLOW}Please enter your Github username: ${NC}" GITHUB_USER
 | 
			
		||||
_prompt "${YELLOW}Please enter your Github secrets repository name: ${NC}" GITHUB_SECRETS_REPO
 | 
			
		||||
 | 
			
		||||
export GITHUB_USER
 | 
			
		||||
export GITHUB_SECRETS_REPO
 | 
			
		||||
 | 
			
		||||
select_boot_disk() {
 | 
			
		||||
  local disks
 | 
			
		||||
  local _boot_disk
 | 
			
		||||
 | 
			
		||||
  _print "${YELLOW}Available disks:${NC}"
 | 
			
		||||
  disks=$(lsblk -nd --output NAME,SIZE | grep -v loop)
 | 
			
		||||
  echo "$disks"
 | 
			
		||||
 | 
			
		||||
  # Warning message for data deletion
 | 
			
		||||
  _print "${RED}WARNING: All data on the chosen disk will be erased during the installation!${NC}"
 | 
			
		||||
  _prompt "${YELLOW}Please enter the name of your boot disk (e.g., sda, nvme0n1). Do not include the full path ("/dev/"): ${NC}" _boot_disk
 | 
			
		||||
 | 
			
		||||
  # Confirmation for disk selection to prevent accidental data loss
 | 
			
		||||
  _print "${YELLOW}You have selected $_boot_disk as the boot disk. This will delete everything on this disk. Are you sure? (Y/N): ${NC}"
 | 
			
		||||
  read -r confirmation
 | 
			
		||||
  if [[ "$confirmation" =~ ^[Yy]$ ]]; then
 | 
			
		||||
    export BOOT_DISK=$_boot_disk
 | 
			
		||||
  else
 | 
			
		||||
    _print "${RED}Disk selection cancelled by the user. Please run the script again to select the correct disk.${NC}"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Set hostname and find primary disk if this is NixOS
 | 
			
		||||
if [[ "$OS" != "Darwin" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}Please enter a hostname for the system: ${NC}" HOST_NAME
 | 
			
		||||
  export HOST_NAME
 | 
			
		||||
  select_boot_disk
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Confirmation step
 | 
			
		||||
confirm_details() {
 | 
			
		||||
  _print "${GREEN}Username: $USERNAME"
 | 
			
		||||
  _print "Email: $GIT_EMAIL"
 | 
			
		||||
  _print "Name: $GIT_NAME${NC}"
 | 
			
		||||
 | 
			
		||||
  if([[ "$OS" != "Darwin" ]]); then
 | 
			
		||||
    _print "${GREEN}Primary interface: $PRIMARY_IFACE"
 | 
			
		||||
    _print "Boot disk: $BOOT_DISK"
 | 
			
		||||
    _print "Hostname: $HOST_NAME${NC}"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  _print "${GREEN}Secrets repository: $GITHUB_USER/$GITHUB_SECRETS_REPO${NC}"
 | 
			
		||||
 | 
			
		||||
  _prompt "${YELLOW}Is this correct? yes/no: ${NC}" choice
 | 
			
		||||
 | 
			
		||||
  case "$choice" in
 | 
			
		||||
    [Nn] | [Nn][Oo] ) 
 | 
			
		||||
      _print "${RED}Exiting script.${NC}" 
 | 
			
		||||
      exit 1
 | 
			
		||||
      ;;
 | 
			
		||||
    [Yy] | [Yy][Ee][Ss] ) 
 | 
			
		||||
      _print "${GREEN}Continuing...${NC}"
 | 
			
		||||
      ;;
 | 
			
		||||
    * ) 
 | 
			
		||||
      _print "${RED}Invalid option. Exiting script.${NC}" 
 | 
			
		||||
      exit 1
 | 
			
		||||
      ;;
 | 
			
		||||
  esac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Call the confirmation function
 | 
			
		||||
confirm_details
 | 
			
		||||
 | 
			
		||||
# Function to replace tokens in each file
 | 
			
		||||
replace_tokens() {
 | 
			
		||||
  local file="$1"
 | 
			
		||||
  if [[ $(basename $1) != "apply" ]]; then
 | 
			
		||||
    if [[ "$OS" == "Darwin" ]]; then
 | 
			
		||||
      # macOS
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%USER%/$USERNAME/g" "$file"
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%EMAIL%/$GIT_EMAIL/g" "$file"
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%NAME%/$GIT_NAME/g" "$file"
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%GITHUB_USER%/$GITHUB_USER/g" "$file"
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%GITHUB_SECRETS_REPO%/$GITHUB_SECRETS_REPO/g" "$file"
 | 
			
		||||
    else
 | 
			
		||||
      # Linux or other
 | 
			
		||||
      sed -i -e "s/%USER%/$USERNAME/g" "$file"
 | 
			
		||||
      sed -i -e "s/%EMAIL%/$GIT_EMAIL/g" "$file"
 | 
			
		||||
      sed -i -e "s/%NAME%/$GIT_NAME/g" "$file"
 | 
			
		||||
      sed -i -e "s/%INTERFACE%/$PRIMARY_IFACE/g" "$file"
 | 
			
		||||
      sed -i -e "s/%DISK%/$BOOT_DISK/g" "$file"
 | 
			
		||||
      sed -i -e "s/%HOST%/$HOST_NAME/g" "$file"
 | 
			
		||||
      sed -i -e "s/%GITHUB_USER%/$GITHUB_USER/g" "$file"
 | 
			
		||||
      sed -i -e "s/%GITHUB_SECRETS_REPO%/$GITHUB_SECRETS_REPO/g" "$file"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Insert secrets repo into flake
 | 
			
		||||
insert_secrets_input
 | 
			
		||||
insert_secrets_output
 | 
			
		||||
 | 
			
		||||
# Traverse directories and call replace_tokens on each Nix file
 | 
			
		||||
export -f replace_tokens
 | 
			
		||||
find . -type f -exec bash -c 'replace_tokens "$0"' {} \;
 | 
			
		||||
 | 
			
		||||
echo "$USERNAME" > /tmp/username.txt
 | 
			
		||||
_print "${GREEN}User $USERNAME information applied.${NC}"
 | 
			
		||||
							
								
								
									
										19
									
								
								apps/aarch64-darwin/build
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										19
									
								
								apps/aarch64-darwin/build
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
#!/bin/sh -e
 | 
			
		||||
 | 
			
		||||
GREEN='\033[1;32m'
 | 
			
		||||
YELLOW='\033[1;33m'
 | 
			
		||||
RED='\033[1;31m'
 | 
			
		||||
NC='\033[0m'
 | 
			
		||||
 | 
			
		||||
SYSTEM_TYPE="aarch64-darwin"
 | 
			
		||||
FLAKE_SYSTEM="darwinConfigurations.${SYSTEM_TYPE}.system"
 | 
			
		||||
 | 
			
		||||
export NIXPKGS_ALLOW_UNFREE=1
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Starting build...${NC}"
 | 
			
		||||
nix --extra-experimental-features 'nix-command flakes' build .#$FLAKE_SYSTEM $@
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Cleaning up...${NC}"
 | 
			
		||||
unlink ./result
 | 
			
		||||
 | 
			
		||||
echo "${GREEN}Switch to new generation complete!${NC}"
 | 
			
		||||
							
								
								
									
										22
									
								
								apps/aarch64-darwin/build-switch
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										22
									
								
								apps/aarch64-darwin/build-switch
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
#!/bin/sh -e
 | 
			
		||||
 | 
			
		||||
GREEN='\033[1;32m'
 | 
			
		||||
YELLOW='\033[1;33m'
 | 
			
		||||
RED='\033[1;31m'
 | 
			
		||||
NC='\033[0m'
 | 
			
		||||
 | 
			
		||||
SYSTEM_TYPE="aarch64-darwin"
 | 
			
		||||
FLAKE_SYSTEM="darwinConfigurations.${SYSTEM_TYPE}.system"
 | 
			
		||||
 | 
			
		||||
export NIXPKGS_ALLOW_UNFREE=1
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Starting build...${NC}"
 | 
			
		||||
nix --extra-experimental-features 'nix-command flakes' build .#$FLAKE_SYSTEM $@
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Switching to new generation...${NC}"
 | 
			
		||||
./result/sw/bin/darwin-rebuild switch --flake .#${SYSTEM_TYPE} $@
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Cleaning up...${NC}"
 | 
			
		||||
unlink ./result
 | 
			
		||||
 | 
			
		||||
echo "${GREEN}Switch to new generation complete!${NC}"
 | 
			
		||||
							
								
								
									
										33
									
								
								apps/aarch64-darwin/check-keys
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										33
									
								
								apps/aarch64-darwin/check-keys
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
RED='\033[0;31m'
 | 
			
		||||
GREEN='\033[0;32m'
 | 
			
		||||
NC='\033[0m'
 | 
			
		||||
 | 
			
		||||
username=${USER}
 | 
			
		||||
export SSH_DIR=/Users/${username}/.ssh
 | 
			
		||||
 | 
			
		||||
lint_keys() {
 | 
			
		||||
  if [[ -f "${SSH_DIR}/id_ed25519" && -f "${SSH_DIR}/id_ed25519.pub" && -f "${SSH_DIR}/id_ed25519_agenix" && -f "${SSH_DIR}/id_ed25519_agenix.pub" ]]; then
 | 
			
		||||
    echo -e "${GREEN}All SSH keys are present.${NC}"
 | 
			
		||||
  else
 | 
			
		||||
    echo -e "${RED}Some SSH keys are missing.${NC}"
 | 
			
		||||
    if [[ ! -f "${SSH_DIR}/id_ed25519" ]]; then
 | 
			
		||||
      echo -e "${RED}Missing: id_ed25519${NC}"
 | 
			
		||||
    fi
 | 
			
		||||
    if [[ ! -f "${SSH_DIR}/id_ed25519.pub" ]]; then
 | 
			
		||||
      echo -e "${RED}Missing: id_ed25519.pub${NC}"
 | 
			
		||||
    fi
 | 
			
		||||
    if [[ ! -f "${SSH_DIR}/id_ed25519_agenix" ]]; then
 | 
			
		||||
      echo -e "${RED}Missing: id_ed25519_agenix${NC}"
 | 
			
		||||
    fi
 | 
			
		||||
    if [[ ! -f "${SSH_DIR}/id_ed25519_agenix.pub" ]]; then
 | 
			
		||||
      echo -e "${RED}Missing: id_ed25519_agenix.pub${NC}"
 | 
			
		||||
    fi
 | 
			
		||||
    echo -e "${GREEN}Run the createKeys command to generate the missing keys.${NC}"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
lint_keys
 | 
			
		||||
							
								
								
									
										68
									
								
								apps/aarch64-darwin/copy-keys
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										68
									
								
								apps/aarch64-darwin/copy-keys
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,68 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
RED='\033[0;31m'
 | 
			
		||||
GREEN='\033[0;32m'
 | 
			
		||||
NC='\033[0m'
 | 
			
		||||
 | 
			
		||||
username=${USER}
 | 
			
		||||
export SSH_DIR=/Users/${username}/.ssh
 | 
			
		||||
 | 
			
		||||
handle_no_usb() {
 | 
			
		||||
  echo -e ${RED}No USB drive found or mounted.${NC}"
 | 
			
		||||
  echo -e ${GREEN}If you have not yet set up your keys, run the script to generate new SSH keys.${NC}"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mount_usb() {
 | 
			
		||||
  MOUNT_PATH=""
 | 
			
		||||
  for dev in $(diskutil list | grep -o 'disk[0-9]'); do
 | 
			
		||||
    MOUNT_PATH="$(diskutil info /dev/${dev} | grep \"Mount Point\" | awk -F: '{print $2}' | xargs)"
 | 
			
		||||
    if [ -n "${MOUNT_PATH}" ]; then
 | 
			
		||||
      echo -e "${GREEN}USB drive found at ${MOUNT_PATH}.${NC}"
 | 
			
		||||
      break
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  if [ -z "${MOUNT_PATH}" ]; then
 | 
			
		||||
    echo -e "${RED}No USB drive found.${NC}"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
copy_keys() {
 | 
			
		||||
  if [ -n "${MOUNT_PATH}" ]; then
 | 
			
		||||
    cp "${MOUNT_PATH}/id_ed25519_agenix.pub" ${SSH_DIR}
 | 
			
		||||
    cp "${MOUNT_PATH}/id_ed25519_agenix" ${SSH_DIR}
 | 
			
		||||
    chmod 600 ${SSH_DIR}/id_ed25519_{agenix,agenix.pub}
 | 
			
		||||
  else
 | 
			
		||||
    echo -e "${RED}No USB drive found. Aborting.${NC}"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
setup_ssh_directory() {
 | 
			
		||||
  mkdir -p ${SSH_DIR}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
set_keys() {
 | 
			
		||||
  cp ${MOUNT_PATH}/id_ed25519_github.pub ${SSH_DIR}/id_ed25519.pub
 | 
			
		||||
  cp ${MOUNT_PATH}/id_ed25519_github ${SSH_DIR}/id_ed25519
 | 
			
		||||
  chmod 600 ${SSH_DIR}/id_ed25519
 | 
			
		||||
  chmod 644 ${SSH_DIR}/id_ed25519.pub
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
change_ownership() {
 | 
			
		||||
  chown ${username}:staff ${SSH_DIR}/id_ed25519{,.pub}
 | 
			
		||||
  chown ${username}:staff ${SSH_DIR}/id_ed25519_{agenix,agenix.pub}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
setup_ssh_directory
 | 
			
		||||
mount_usb
 | 
			
		||||
 | 
			
		||||
if [ -z "${MOUNT_PATH}" ]; then
 | 
			
		||||
  handle_no_usb
 | 
			
		||||
else
 | 
			
		||||
  copy_keys
 | 
			
		||||
  set_keys
 | 
			
		||||
  change_ownership
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										46
									
								
								apps/aarch64-darwin/create-keys
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										46
									
								
								apps/aarch64-darwin/create-keys
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
RED='\033[0;31m'
 | 
			
		||||
GREEN='\033[0;32m'
 | 
			
		||||
NC='\033[0m'
 | 
			
		||||
 | 
			
		||||
username=${USER}
 | 
			
		||||
export SSH_DIR=/Users/${username}/.ssh
 | 
			
		||||
 | 
			
		||||
setup_ssh_directory() {
 | 
			
		||||
  mkdir -p ${SSH_DIR}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
prompt_for_key_generation() {
 | 
			
		||||
  local key_name=$1
 | 
			
		||||
  if [[ -f "${SSH_DIR}/${key_name}" ]]; then
 | 
			
		||||
    echo -e "${RED}Existing SSH key found for ${key_name}.${NC}"
 | 
			
		||||
    cat "${SSH_DIR}/${key_name}.pub"
 | 
			
		||||
    read -p "Do you want to replace it? (y/n) " -n 1 -r
 | 
			
		||||
    echo
 | 
			
		||||
    if [[ $REPLY =~ ^[Yy]$ ]]; then
 | 
			
		||||
      return 0 # Indicate key should be replaced
 | 
			
		||||
    else
 | 
			
		||||
      return 1 # Indicate key should be kept
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
  return 0 # Indicate no key exists, so it should be created
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
generate_key() {
 | 
			
		||||
  local key_name=$1
 | 
			
		||||
  if prompt_for_key_generation "$key_name"; then
 | 
			
		||||
    ssh-keygen -t ed25519 -f "${SSH_DIR}/${key_name}" -N ""
 | 
			
		||||
    chown ${username}:staff "${SSH_DIR}/${key_name}"{,.pub}
 | 
			
		||||
  else
 | 
			
		||||
    echo -e "${GREEN}Kept existing ${key_name}.${NC}"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
setup_ssh_directory
 | 
			
		||||
generate_key "id_ed25519"
 | 
			
		||||
generate_key "id_ed25519_agenix"
 | 
			
		||||
 | 
			
		||||
echo -e "${GREEN}SSH key setup complete.${NC}"
 | 
			
		||||
echo -e "${GREEN}Remember to add the necessary keys to Github or other services as required.${NC}"
 | 
			
		||||
							
								
								
									
										24
									
								
								apps/aarch64-darwin/rollback
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										24
									
								
								apps/aarch64-darwin/rollback
									
									
									
									
									
										Executable file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
#!/bin/sh -e
 | 
			
		||||
 | 
			
		||||
GREEN='\033[1;32m'
 | 
			
		||||
YELLOW='\033[1;33m'
 | 
			
		||||
RED='\033[1;31m'
 | 
			
		||||
NC='\033[0m'
 | 
			
		||||
 | 
			
		||||
FLAKE="macos"
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Available generations:${NC}"
 | 
			
		||||
/run/current-system/sw/bin/darwin-rebuild --list-generations
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Enter the generation number for rollback:${NC}"
 | 
			
		||||
read GEN_NUM
 | 
			
		||||
 | 
			
		||||
if [ -z "$GEN_NUM" ]; then
 | 
			
		||||
  echo "${RED}No generation number entered. Aborting rollback.${NC}"
 | 
			
		||||
  exit 1
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Rolling back to generation $GEN_NUM...${NC}"
 | 
			
		||||
/run/current-system/sw/bin/darwin-rebuild switch --flake .#$FLAKE --switch-generation $GEN_NUM
 | 
			
		||||
 | 
			
		||||
echo "${GREEN}Rollback to generation $GEN_NUM complete!${NC}"
 | 
			
		||||
							
								
								
									
										1
									
								
								apps/aarch64-linux
									
									
									
									
									
										Symbolic link
									
								
							
							
						
						
									
										1
									
								
								apps/aarch64-linux
									
									
									
									
									
										Symbolic link
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
x86_64-linux
 | 
			
		||||
							
								
								
									
										245
									
								
								apps/x86_64-darwin/apply
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										245
									
								
								apps/x86_64-darwin/apply
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,245 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
RED='\033[0;31m'
 | 
			
		||||
GREEN='\033[0;32m'
 | 
			
		||||
YELLOW='\033[1;33m'
 | 
			
		||||
NC='\033[0m' # No Color
 | 
			
		||||
 | 
			
		||||
# Determine the operating system
 | 
			
		||||
export OS=$(uname)
 | 
			
		||||
 | 
			
		||||
# Primary network interface
 | 
			
		||||
if [[ "$OS" != "Darwin" ]]; then
 | 
			
		||||
  export PRIMARY_IFACE=$(ip -o -4 route show to default | awk '{print $5}')
 | 
			
		||||
  echo -e "${GREEN}Found primary network interface $PRIMARY_IFACE${NC}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Custom print function
 | 
			
		||||
_print() {
 | 
			
		||||
  if [[ "$OS" == "Darwin" ]]; then
 | 
			
		||||
    echo -e "$1"
 | 
			
		||||
  else
 | 
			
		||||
    echo "$1"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Custom prompt function
 | 
			
		||||
_prompt() {
 | 
			
		||||
  local message="$1"
 | 
			
		||||
  local variable="$2"
 | 
			
		||||
 | 
			
		||||
  _print "$message"
 | 
			
		||||
  read -r $variable
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
insert_secrets_output() {
 | 
			
		||||
  local pattern="outputs = { self, darwin, nix-homebrew, homebrew-bundle, homebrew-core, homebrew-cask, home-manager, nixpkgs, disko, agenix } @inputs:"
 | 
			
		||||
  local insert_text="secrets "
 | 
			
		||||
 | 
			
		||||
  awk -v pat="$pattern" -v insert="$insert_text" '
 | 
			
		||||
    $0 ~ pat {
 | 
			
		||||
      sub(/} @inputs:/, ", " insert "} @inputs:"); # Replace the closing brace with the insert text followed by the brace
 | 
			
		||||
      gsub(/ ,/, ","); # Correct any spaces before commas
 | 
			
		||||
      print
 | 
			
		||||
      next
 | 
			
		||||
    }
 | 
			
		||||
    { print }
 | 
			
		||||
  ' flake.nix > flake.nix.tmp
 | 
			
		||||
 | 
			
		||||
  mv flake.nix.tmp flake.nix
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
insert_secrets_input() {
 | 
			
		||||
  # Define file path
 | 
			
		||||
  FILE_PATH="flake.nix"
 | 
			
		||||
 | 
			
		||||
  # Backup the original file
 | 
			
		||||
  cp "$FILE_PATH" "${FILE_PATH}.bak"
 | 
			
		||||
 | 
			
		||||
  # Temporary file for the text to insert
 | 
			
		||||
  TEMP_FILE="temp_insert.txt"
 | 
			
		||||
 | 
			
		||||
  # Write the formatted text to the temporary file
 | 
			
		||||
cat > "$TEMP_FILE" << 'EOF'
 | 
			
		||||
    secrets = {
 | 
			
		||||
      url = "git+ssh://git@github.com/%GITHUB_USER%/%GITHUB_SECRETS_REPO%.git";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
EOF
 | 
			
		||||
 | 
			
		||||
  # Check if the 'secrets' block already exists
 | 
			
		||||
  if grep -q 'url = "git+ssh://git@github.com/%GITHUB_USER%/%GITHUB_SECRETS_REPO%.git"' "$FILE_PATH"; then
 | 
			
		||||
      echo "The 'secrets' block already exists in the file."
 | 
			
		||||
      rm "$TEMP_FILE"
 | 
			
		||||
      rm "${FILE_PATH}.bak"
 | 
			
		||||
      exit 0
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  # Find the start and end line numbers of the 'disko' block
 | 
			
		||||
  START_LINE=$(grep -n 'disko = {' "$FILE_PATH" | head -n 1 | cut -d: -f1)
 | 
			
		||||
  END_LINE=$(tail -n +$START_LINE "$FILE_PATH" | grep -n '};' | head -n 1 | cut -d: -f1)
 | 
			
		||||
  END_LINE=$((START_LINE + END_LINE - 1))
 | 
			
		||||
 | 
			
		||||
  # Create a new file with the insertion
 | 
			
		||||
  {
 | 
			
		||||
      sed -n "1,${END_LINE}p" "$FILE_PATH"
 | 
			
		||||
      cat "$TEMP_FILE"
 | 
			
		||||
      sed -n "$((END_LINE + 1)),\$p" "$FILE_PATH"
 | 
			
		||||
  } > "${FILE_PATH}.new"
 | 
			
		||||
 | 
			
		||||
  # Replace the original file with the new file
 | 
			
		||||
  mv "${FILE_PATH}.new" "$FILE_PATH"
 | 
			
		||||
 | 
			
		||||
  # Clean up the temporary files
 | 
			
		||||
  rm "$TEMP_FILE"
 | 
			
		||||
  rm "${FILE_PATH}.bak"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ask_for_star() {
 | 
			
		||||
  _print "${YELLOW}Would you like to support my work by starring my GitHub repo? yes/no [yes]: ${NC}"
 | 
			
		||||
  local response
 | 
			
		||||
  read -r response
 | 
			
		||||
  response=${response:-yes} # Set default response to 'yes' if input is empty
 | 
			
		||||
  if [[ "$response" =~ ^[Yy](es)?$ ]] || [[ -z "$response" ]]; then
 | 
			
		||||
    if [[ "$OS" == "Darwin" ]]; then
 | 
			
		||||
      open "https://github.com/dustinlyons/nixos-config"
 | 
			
		||||
    else
 | 
			
		||||
      xdg-open "https://github.com/dustinlyons/nixos-config"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ask_for_star
 | 
			
		||||
 | 
			
		||||
# Fetch username from the system
 | 
			
		||||
export USERNAME=$(whoami)
 | 
			
		||||
 | 
			
		||||
# If the username is 'nixos' or 'root', ask the user for their username
 | 
			
		||||
if [[ "$USERNAME" == "nixos" ]] || [[ "$USERNAME" == "root" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}You're running as $USERNAME. Please enter your desired username: ${NC}" USERNAME
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Check if git is available
 | 
			
		||||
if command -v git >/dev/null 2>&1; then
 | 
			
		||||
  # Fetch email and name from git config
 | 
			
		||||
  export GIT_EMAIL=$(git config --get user.email)
 | 
			
		||||
  export GIT_NAME=$(git config --get user.name)
 | 
			
		||||
else
 | 
			
		||||
  _print "${RED}Git is not available on this system.${NC}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# If git email is not found or git is not available, ask the user
 | 
			
		||||
if [[ -z "$GIT_EMAIL" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}Please enter your email: ${NC}" GIT_EMAIL
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# If git name is not found or git is not available, ask the user
 | 
			
		||||
if [[ -z "$GIT_NAME" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}Please enter your name: ${NC}" GIT_NAME
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
_prompt "${YELLOW}Please enter your Github username: ${NC}" GITHUB_USER
 | 
			
		||||
_prompt "${YELLOW}Please enter your Github secrets repository name: ${NC}" GITHUB_SECRETS_REPO
 | 
			
		||||
 | 
			
		||||
export GITHUB_USER
 | 
			
		||||
export GITHUB_SECRETS_REPO
 | 
			
		||||
 | 
			
		||||
select_boot_disk() {
 | 
			
		||||
  local disks
 | 
			
		||||
  local _boot_disk
 | 
			
		||||
 | 
			
		||||
  _print "${YELLOW}Available disks:${NC}"
 | 
			
		||||
  disks=$(lsblk -nd --output NAME,SIZE | grep -v loop)
 | 
			
		||||
  echo "$disks"
 | 
			
		||||
 | 
			
		||||
  # Warning message for data deletion
 | 
			
		||||
  _print "${RED}WARNING: All data on the chosen disk will be erased during the installation!${NC}"
 | 
			
		||||
  _prompt "${YELLOW}Please enter the name of your boot disk (e.g., sda, nvme0n1). Do not include the full path ("/dev/"): ${NC}" _boot_disk
 | 
			
		||||
 | 
			
		||||
  # Confirmation for disk selection to prevent accidental data loss
 | 
			
		||||
  _print "${YELLOW}You have selected $_boot_disk as the boot disk. This will delete everything on this disk. Are you sure? (Y/N): ${NC}"
 | 
			
		||||
  read -r confirmation
 | 
			
		||||
  if [[ "$confirmation" =~ ^[Yy]$ ]]; then
 | 
			
		||||
    export BOOT_DISK=$_boot_disk
 | 
			
		||||
  else
 | 
			
		||||
    _print "${RED}Disk selection cancelled by the user. Please run the script again to select the correct disk.${NC}"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Set hostname and find primary disk if this is NixOS
 | 
			
		||||
if [[ "$OS" != "Darwin" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}Please enter a hostname for the system: ${NC}" HOST_NAME
 | 
			
		||||
  export HOST_NAME
 | 
			
		||||
  select_boot_disk
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Confirmation step
 | 
			
		||||
confirm_details() {
 | 
			
		||||
  _print "${GREEN}Username: $USERNAME"
 | 
			
		||||
  _print "Email: $GIT_EMAIL"
 | 
			
		||||
  _print "Name: $GIT_NAME${NC}"
 | 
			
		||||
 | 
			
		||||
  if([[ "$OS" != "Darwin" ]]); then
 | 
			
		||||
    _print "${GREEN}Primary interface: $PRIMARY_IFACE"
 | 
			
		||||
    _print "Boot disk: $BOOT_DISK"
 | 
			
		||||
    _print "Hostname: $HOST_NAME${NC}"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  _print "${GREEN}Secrets repository: $GITHUB_USER/$GITHUB_SECRETS_REPO${NC}"
 | 
			
		||||
 | 
			
		||||
  _prompt "${YELLOW}Is this correct? yes/no: ${NC}" choice
 | 
			
		||||
 | 
			
		||||
  case "$choice" in
 | 
			
		||||
    [Nn] | [Nn][Oo] ) 
 | 
			
		||||
      _print "${RED}Exiting script.${NC}" 
 | 
			
		||||
      exit 1
 | 
			
		||||
      ;;
 | 
			
		||||
    [Yy] | [Yy][Ee][Ss] ) 
 | 
			
		||||
      _print "${GREEN}Continuing...${NC}"
 | 
			
		||||
      ;;
 | 
			
		||||
    * ) 
 | 
			
		||||
      _print "${RED}Invalid option. Exiting script.${NC}" 
 | 
			
		||||
      exit 1
 | 
			
		||||
      ;;
 | 
			
		||||
  esac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Call the confirmation function
 | 
			
		||||
confirm_details
 | 
			
		||||
 | 
			
		||||
# Function to replace tokens in each file
 | 
			
		||||
replace_tokens() {
 | 
			
		||||
  local file="$1"
 | 
			
		||||
  if [[ $(basename $1) != "apply" ]]; then
 | 
			
		||||
    if [[ "$OS" == "Darwin" ]]; then
 | 
			
		||||
      # macOS
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%USER%/$USERNAME/g" "$file"
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%EMAIL%/$GIT_EMAIL/g" "$file"
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%NAME%/$GIT_NAME/g" "$file"
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%GITHUB_USER%/$GITHUB_USER/g" "$file"
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%GITHUB_SECRETS_REPO%/$GITHUB_SECRETS_REPO/g" "$file"
 | 
			
		||||
    else
 | 
			
		||||
      # Linux or other
 | 
			
		||||
      sed -i -e "s/%USER%/$USERNAME/g" "$file"
 | 
			
		||||
      sed -i -e "s/%EMAIL%/$GIT_EMAIL/g" "$file"
 | 
			
		||||
      sed -i -e "s/%NAME%/$GIT_NAME/g" "$file"
 | 
			
		||||
      sed -i -e "s/%INTERFACE%/$PRIMARY_IFACE/g" "$file"
 | 
			
		||||
      sed -i -e "s/%DISK%/$BOOT_DISK/g" "$file"
 | 
			
		||||
      sed -i -e "s/%HOST%/$HOST_NAME/g" "$file"
 | 
			
		||||
      sed -i -e "s/%GITHUB_USER%/$GITHUB_USER/g" "$file"
 | 
			
		||||
      sed -i -e "s/%GITHUB_SECRETS_REPO%/$GITHUB_SECRETS_REPO/g" "$file"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Insert secrets repo into flake
 | 
			
		||||
insert_secrets_input
 | 
			
		||||
insert_secrets_output
 | 
			
		||||
 | 
			
		||||
# Traverse directories and call replace_tokens on each Nix file
 | 
			
		||||
export -f replace_tokens
 | 
			
		||||
find . -type f -exec bash -c 'replace_tokens "$0"' {} \;
 | 
			
		||||
 | 
			
		||||
echo "$USERNAME" > /tmp/username.txt
 | 
			
		||||
_print "${GREEN}User $USERNAME information applied.${NC}"
 | 
			
		||||
							
								
								
									
										19
									
								
								apps/x86_64-darwin/build
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										19
									
								
								apps/x86_64-darwin/build
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,19 @@
 | 
			
		||||
#!/bin/sh -e
 | 
			
		||||
 | 
			
		||||
GREEN='\033[1;32m'
 | 
			
		||||
YELLOW='\033[1;33m'
 | 
			
		||||
RED='\033[1;31m'
 | 
			
		||||
NC='\033[0m'
 | 
			
		||||
 | 
			
		||||
SYSTEM_TYPE="x86_64-darwin"
 | 
			
		||||
FLAKE_SYSTEM="darwinConfigurations.${SYSTEM_TYPE}.system"
 | 
			
		||||
 | 
			
		||||
export NIXPKGS_ALLOW_UNFREE=1
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Starting build...${NC}"
 | 
			
		||||
nix --extra-experimental-features 'nix-command flakes' build .#$FLAKE_SYSTEM $@
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Cleaning up...${NC}"
 | 
			
		||||
unlink ./result
 | 
			
		||||
 | 
			
		||||
echo "${GREEN}Switch to new generation complete!${NC}"
 | 
			
		||||
							
								
								
									
										22
									
								
								apps/x86_64-darwin/build-switch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								apps/x86_64-darwin/build-switch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,22 @@
 | 
			
		||||
#!/bin/sh -e
 | 
			
		||||
 | 
			
		||||
GREEN='\033[1;32m'
 | 
			
		||||
YELLOW='\033[1;33m'
 | 
			
		||||
RED='\033[1;31m'
 | 
			
		||||
NC='\033[0m'
 | 
			
		||||
 | 
			
		||||
SYSTEM_TYPE="x86_64-darwin" 
 | 
			
		||||
FLAKE_SYSTEM="darwinConfigurations.${SYSTEM_TYPE}.system"
 | 
			
		||||
 | 
			
		||||
export NIXPKGS_ALLOW_UNFREE=1
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Starting build...${NC}"
 | 
			
		||||
nix --extra-experimental-features 'nix-command flakes' build .#$FLAKE_SYSTEM $@
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Switching to new generation...${NC}"
 | 
			
		||||
./result/sw/bin/darwin-rebuild switch --flake .#${SYSTEM_TYPE} $@
 | 
			
		||||
 | 
			
		||||
echo "${YELLOW}Cleaning up...${NC}"
 | 
			
		||||
unlink ./result
 | 
			
		||||
 | 
			
		||||
echo "${GREEN}Switch to new generation complete!${NC}"
 | 
			
		||||
							
								
								
									
										33
									
								
								apps/x86_64-darwin/check-keys
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								apps/x86_64-darwin/check-keys
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,33 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
RED='\033[0;31m'
 | 
			
		||||
GREEN='\033[0;32m'
 | 
			
		||||
NC='\033[0m'
 | 
			
		||||
 | 
			
		||||
username=${USER}
 | 
			
		||||
export SSH_DIR=/Users/${username}/.ssh
 | 
			
		||||
 | 
			
		||||
lint_keys() {
 | 
			
		||||
  if [[ -f "${SSH_DIR}/id_ed25519" && -f "${SSH_DIR}/id_ed25519.pub" && -f "${SSH_DIR}/id_ed25519_agenix" && -f "${SSH_DIR}/id_ed25519_agenix.pub" ]]; then
 | 
			
		||||
    echo -e "${GREEN}All SSH keys are present.${NC}"
 | 
			
		||||
  else
 | 
			
		||||
    echo -e "${RED}Some SSH keys are missing.${NC}"
 | 
			
		||||
    if [[ ! -f "${SSH_DIR}/id_ed25519" ]]; then
 | 
			
		||||
      echo -e "${RED}Missing: id_ed25519${NC}"
 | 
			
		||||
    fi
 | 
			
		||||
    if [[ ! -f "${SSH_DIR}/id_ed25519.pub" ]]; then
 | 
			
		||||
      echo -e "${RED}Missing: id_ed25519.pub${NC}"
 | 
			
		||||
    fi
 | 
			
		||||
    if [[ ! -f "${SSH_DIR}/id_ed25519_agenix" ]]; then
 | 
			
		||||
      echo -e "${RED}Missing: id_ed25519_agenix${NC}"
 | 
			
		||||
    fi
 | 
			
		||||
    if [[ ! -f "${SSH_DIR}/id_ed25519_agenix.pub" ]]; then
 | 
			
		||||
      echo -e "${RED}Missing: id_ed25519_agenix.pub${NC}"
 | 
			
		||||
    fi
 | 
			
		||||
    echo -e "${GREEN}Run the createKeys command to generate the missing keys.${NC}"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
lint_keys
 | 
			
		||||
							
								
								
									
										68
									
								
								apps/x86_64-darwin/copy-keys
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										68
									
								
								apps/x86_64-darwin/copy-keys
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,68 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
RED='\033[0;31m'
 | 
			
		||||
GREEN='\033[0;32m'
 | 
			
		||||
NC='\033[0m'
 | 
			
		||||
 | 
			
		||||
username=${USER}
 | 
			
		||||
export SSH_DIR=/Users/${username}/.ssh
 | 
			
		||||
 | 
			
		||||
handle_no_usb() {
 | 
			
		||||
  echo -e ${RED}No USB drive found or mounted.${NC}"
 | 
			
		||||
  echo -e ${GREEN}If you have not yet set up your keys, run the script to generate new SSH keys.${NC}"
 | 
			
		||||
  exit 1
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mount_usb() {
 | 
			
		||||
  MOUNT_PATH=""
 | 
			
		||||
  for dev in $(diskutil list | grep -o 'disk[0-9]'); do
 | 
			
		||||
    MOUNT_PATH="$(diskutil info /dev/${dev} | grep \"Mount Point\" | awk -F: '{print $2}' | xargs)"
 | 
			
		||||
    if [ -n "${MOUNT_PATH}" ]; then
 | 
			
		||||
      echo -e "${GREEN}USB drive found at ${MOUNT_PATH}.${NC}"
 | 
			
		||||
      break
 | 
			
		||||
    fi
 | 
			
		||||
  done
 | 
			
		||||
 | 
			
		||||
  if [ -z "${MOUNT_PATH}" ]; then
 | 
			
		||||
    echo -e "${RED}No USB drive found.${NC}"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
copy_keys() {
 | 
			
		||||
  if [ -n "${MOUNT_PATH}" ]; then
 | 
			
		||||
    cp "${MOUNT_PATH}/id_ed25519_agenix.pub" ${SSH_DIR}
 | 
			
		||||
    cp "${MOUNT_PATH}/id_ed25519_agenix" ${SSH_DIR}
 | 
			
		||||
    chmod 600 ${SSH_DIR}/id_ed25519_{agenix,agenix.pub}
 | 
			
		||||
  else
 | 
			
		||||
    echo -e "${RED}No USB drive found. Aborting.${NC}"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
setup_ssh_directory() {
 | 
			
		||||
  mkdir -p ${SSH_DIR}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
set_keys() {
 | 
			
		||||
  cp ${MOUNT_PATH}/id_ed25519_github.pub ${SSH_DIR}/id_ed25519.pub
 | 
			
		||||
  cp ${MOUNT_PATH}/id_ed25519_github ${SSH_DIR}/id_ed25519
 | 
			
		||||
  chmod 600 ${SSH_DIR}/id_ed25519
 | 
			
		||||
  chmod 644 ${SSH_DIR}/id_ed25519.pub
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
change_ownership() {
 | 
			
		||||
  chown ${username}:staff ${SSH_DIR}/id_ed25519{,.pub}
 | 
			
		||||
  chown ${username}:staff ${SSH_DIR}/id_ed25519_{agenix,agenix.pub}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
setup_ssh_directory
 | 
			
		||||
mount_usb
 | 
			
		||||
 | 
			
		||||
if [ -z "${MOUNT_PATH}" ]; then
 | 
			
		||||
  handle_no_usb
 | 
			
		||||
else
 | 
			
		||||
  copy_keys
 | 
			
		||||
  set_keys
 | 
			
		||||
  change_ownership
 | 
			
		||||
fi
 | 
			
		||||
							
								
								
									
										46
									
								
								apps/x86_64-darwin/create-keys
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								apps/x86_64-darwin/create-keys
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
set -e
 | 
			
		||||
 | 
			
		||||
RED='\033[0;31m'
 | 
			
		||||
GREEN='\033[0;32m'
 | 
			
		||||
NC='\033[0m'
 | 
			
		||||
 | 
			
		||||
username=${USER}
 | 
			
		||||
export SSH_DIR=/Users/${username}/.ssh
 | 
			
		||||
 | 
			
		||||
setup_ssh_directory() {
 | 
			
		||||
  mkdir -p ${SSH_DIR}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
prompt_for_key_generation() {
 | 
			
		||||
  local key_name=$1
 | 
			
		||||
  if [[ -f "${SSH_DIR}/${key_name}" ]]; then
 | 
			
		||||
    echo -e "${RED}Existing SSH key found for ${key_name}.${NC}"
 | 
			
		||||
    cat "${SSH_DIR}/${key_name}.pub"
 | 
			
		||||
    read -p "Do you want to replace it? (y/n) " -n 1 -r
 | 
			
		||||
    echo
 | 
			
		||||
    if [[ $REPLY =~ ^[Yy]$ ]]; then
 | 
			
		||||
      return 0 # Indicate key should be replaced
 | 
			
		||||
    else
 | 
			
		||||
      return 1 # Indicate key should be kept
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
  return 0 # Indicate no key exists, so it should be created
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
generate_key() {
 | 
			
		||||
  local key_name=$1
 | 
			
		||||
  if prompt_for_key_generation "$key_name"; then
 | 
			
		||||
    ssh-keygen -t ed25519 -f "${SSH_DIR}/${key_name}" -N ""
 | 
			
		||||
    chown ${username}:staff "${SSH_DIR}/${key_name}"{,.pub}
 | 
			
		||||
  else
 | 
			
		||||
    echo -e "${GREEN}Kept existing ${key_name}.${NC}"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
setup_ssh_directory
 | 
			
		||||
generate_key "id_ed25519"
 | 
			
		||||
generate_key "id_ed25519_agenix"
 | 
			
		||||
 | 
			
		||||
echo -e "${GREEN}SSH key setup complete.${NC}"
 | 
			
		||||
echo -e "${GREEN}Remember to add the necessary keys to Github or other services as required.${NC}"
 | 
			
		||||
							
								
								
									
										183
									
								
								apps/x86_64-linux/apply
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								apps/x86_64-linux/apply
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,183 @@
 | 
			
		||||
#!/usr/bin/env bash
 | 
			
		||||
 | 
			
		||||
RED='\033[0;31m'
 | 
			
		||||
GREEN='\033[0;32m'
 | 
			
		||||
YELLOW='\033[1;33m'
 | 
			
		||||
NC='\033[0m' # No Color
 | 
			
		||||
 | 
			
		||||
# Determine the operating system
 | 
			
		||||
export OS=$(uname)
 | 
			
		||||
 | 
			
		||||
# Primary network interface
 | 
			
		||||
if [[ "$OS" != "Darwin" ]]; then
 | 
			
		||||
  export PRIMARY_IFACE=$(ip -o -4 route show to default | awk '{print $5}')
 | 
			
		||||
  echo -e "${GREEN}Found primary network interface $PRIMARY_IFACE${NC}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Custom print function
 | 
			
		||||
_print() {
 | 
			
		||||
  if [[ "$OS" == "Darwin" ]]; then
 | 
			
		||||
    echo -e "$1"
 | 
			
		||||
  else
 | 
			
		||||
    echo "$1"
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Custom prompt function
 | 
			
		||||
_prompt() {
 | 
			
		||||
  local message="$1"
 | 
			
		||||
  local variable="$2"
 | 
			
		||||
 | 
			
		||||
  _print "$message"
 | 
			
		||||
  read -r $variable
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ask_for_star() {
 | 
			
		||||
  _print "${YELLOW}Would you like to support my work by starring my GitHub repo? yes/no [yes]: ${NC}"
 | 
			
		||||
  local response
 | 
			
		||||
  read -r response
 | 
			
		||||
  response=${response:-yes} # Set default response to 'yes' if input is empty
 | 
			
		||||
  if [[ "$response" =~ ^[Yy](es)?$ ]] || [[ -z "$response" ]]; then
 | 
			
		||||
    if [[ "$OS" == "Darwin" ]]; then
 | 
			
		||||
      open "https://github.com/dustinlyons/nixos-config"
 | 
			
		||||
    else
 | 
			
		||||
      xdg-open "https://github.com/dustinlyons/nixos-config"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
ask_for_star
 | 
			
		||||
 | 
			
		||||
# Fetch username from the system
 | 
			
		||||
export USERNAME=$(whoami)
 | 
			
		||||
 | 
			
		||||
# If the username is 'nixos' or 'root', ask the user for their username
 | 
			
		||||
if [[ "$USERNAME" == "nixos" ]] || [[ "$USERNAME" == "root" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}You're running as $USERNAME. Please enter your desired username: ${NC}" USERNAME
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Check if git is available
 | 
			
		||||
if command -v git >/dev/null 2>&1; then
 | 
			
		||||
  # Fetch email and name from git config
 | 
			
		||||
  export GIT_EMAIL=$(git config --get user.email)
 | 
			
		||||
  export GIT_NAME=$(git config --get user.name)
 | 
			
		||||
else
 | 
			
		||||
  _print "${RED}Git is not available on this system.${NC}"
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# If git email is not found or git is not available, ask the user
 | 
			
		||||
if [[ -z "$GIT_EMAIL" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}Please enter your email: ${NC}" GIT_EMAIL
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# If git name is not found or git is not available, ask the user
 | 
			
		||||
if [[ -z "$GIT_NAME" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}Please enter your name: ${NC}" GIT_NAME
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ -z "$GITHUB_USER" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}Please enter your Github username: ${NC}" GITHUB_USER
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
if [[ -z "$GITHUB_SECRETS_REPO" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}Please enter your Github secrets repository name: ${NC}" GITHUB_SECRETS_REPO
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
export GITHUB_USER
 | 
			
		||||
export GITHUB_SECRETS_REPO
 | 
			
		||||
 | 
			
		||||
select_boot_disk() {
 | 
			
		||||
  local disks
 | 
			
		||||
  local _boot_disk
 | 
			
		||||
 | 
			
		||||
  _print "${YELLOW}Available disks:${NC}"
 | 
			
		||||
  disks=$(lsblk -nd --output NAME,SIZE | grep -v loop)
 | 
			
		||||
  echo "$disks"
 | 
			
		||||
 | 
			
		||||
  # Warning message for data deletion
 | 
			
		||||
  _print "${RED}WARNING: All data on the chosen disk will be erased during the installation!${NC}"
 | 
			
		||||
  _prompt "${YELLOW}Please enter the name of your boot disk (e.g., sda, nvme0n1). Do not include the full path ("/dev/"): ${NC}" _boot_disk
 | 
			
		||||
 | 
			
		||||
  # Confirmation for disk selection to prevent accidental data loss
 | 
			
		||||
  _print "${YELLOW}You have selected $_boot_disk as the boot disk. This will delete everything on this disk. Are you sure? (Y/N): ${NC}"
 | 
			
		||||
  read -r confirmation
 | 
			
		||||
  if [[ "$confirmation" =~ ^[Yy]$ ]]; then
 | 
			
		||||
    export BOOT_DISK=$_boot_disk
 | 
			
		||||
  else
 | 
			
		||||
    _print "${RED}Disk selection cancelled by the user. Please run the script again to select the correct disk.${NC}"
 | 
			
		||||
    exit 1
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Set hostname and find primary disk if this is NixOS
 | 
			
		||||
if [[ "$OS" != "Darwin" ]]; then
 | 
			
		||||
  _prompt "${YELLOW}Please enter a hostname for the system: ${NC}" HOST_NAME
 | 
			
		||||
  export HOST_NAME
 | 
			
		||||
  select_boot_disk
 | 
			
		||||
fi
 | 
			
		||||
 | 
			
		||||
# Confirmation step
 | 
			
		||||
confirm_details() {
 | 
			
		||||
  _print "${GREEN}Username: $USERNAME"
 | 
			
		||||
  _print "Email: $GIT_EMAIL"
 | 
			
		||||
  _print "Name: $GIT_NAME${NC}"
 | 
			
		||||
 | 
			
		||||
  if([[ "$OS" != "Darwin" ]]); then
 | 
			
		||||
    _print "${GREEN}Primary interface: $PRIMARY_IFACE"
 | 
			
		||||
    _print "Boot disk: $BOOT_DISK"
 | 
			
		||||
    _print "Hostname: $HOST_NAME${NC}"
 | 
			
		||||
  fi
 | 
			
		||||
 | 
			
		||||
  _print "${GREEN}Secrets repository: $GITHUB_USER/$GITHUB_SECRETS_REPO${NC}"
 | 
			
		||||
 | 
			
		||||
  _prompt "${YELLOW}Is this correct? yes/no: ${NC}" choice
 | 
			
		||||
 | 
			
		||||
  case "$choice" in
 | 
			
		||||
    [Nn] | [Nn][Oo] ) 
 | 
			
		||||
      _print "${RED}Exiting script.${NC}" 
 | 
			
		||||
      exit 1
 | 
			
		||||
      ;;
 | 
			
		||||
    [Yy] | [Yy][Ee][Ss] ) 
 | 
			
		||||
      _print "${GREEN}Continuing...${NC}"
 | 
			
		||||
      ;;
 | 
			
		||||
    * ) 
 | 
			
		||||
      _print "${RED}Invalid option. Exiting script.${NC}" 
 | 
			
		||||
      exit 1
 | 
			
		||||
      ;;
 | 
			
		||||
  esac
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Call the confirmation function
 | 
			
		||||
confirm_details
 | 
			
		||||
 | 
			
		||||
# Function to replace tokens in each file
 | 
			
		||||
replace_tokens() {
 | 
			
		||||
  local file="$1"
 | 
			
		||||
  if [[ $(basename $1) != "apply" ]]; then
 | 
			
		||||
    if [[ "$OS" == "Darwin" ]]; then
 | 
			
		||||
      # macOS
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%USER%/$USERNAME/g" "$file"
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%EMAIL%/$GIT_EMAIL/g" "$file"
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%NAME%/$GIT_NAME/g" "$file"
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%GITHUB_USER%/$GITHUB_USER/g" "$file"
 | 
			
		||||
      LC_ALL=C LANG=C sed -i '' -e "s/%GITHUB_SECRETS_REPO%/$GITHUB_SECRETS_REPO/g" "$file"
 | 
			
		||||
    else
 | 
			
		||||
      # Linux or other
 | 
			
		||||
      sed -i -e "s/%USER%/$USERNAME/g" "$file"
 | 
			
		||||
      sed -i -e "s/%EMAIL%/$GIT_EMAIL/g" "$file"
 | 
			
		||||
      sed -i -e "s/%NAME%/$GIT_NAME/g" "$file"
 | 
			
		||||
      sed -i -e "s/%INTERFACE%/$PRIMARY_IFACE/g" "$file"
 | 
			
		||||
      sed -i -e "s/%DISK%/$BOOT_DISK/g" "$file"
 | 
			
		||||
      sed -i -e "s/%HOST%/$HOST_NAME/g" "$file"
 | 
			
		||||
      sed -i -e "s/%GITHUB_USER%/$GITHUB_USER/g" "$file"
 | 
			
		||||
      sed -i -e "s/%GITHUB_SECRETS_REPO%/$GITHUB_SECRETS_REPO/g" "$file"
 | 
			
		||||
    fi
 | 
			
		||||
  fi
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
# Traverse directories and call replace_tokens on each Nix file
 | 
			
		||||
export -f replace_tokens
 | 
			
		||||
find . -type f -exec bash -c 'replace_tokens "$0"' {} \;
 | 
			
		||||
 | 
			
		||||
echo "$USERNAME" > /tmp/username.txt
 | 
			
		||||
_print "${GREEN}User $USERNAME information applied.${NC}"
 | 
			
		||||
							
								
								
									
										30
									
								
								apps/x86_64-linux/build-switch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								apps/x86_64-linux/build-switch
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
#!/bin/sh -e
 | 
			
		||||
 | 
			
		||||
VERSION=1.0
 | 
			
		||||
 | 
			
		||||
GREEN='\033[1;32m'
 | 
			
		||||
RED='\033[1;31m'
 | 
			
		||||
YELLOW='\033[1;33m'
 | 
			
		||||
NC='\033[0m'
 | 
			
		||||
 | 
			
		||||
SYSTEM=$(uname -m)
 | 
			
		||||
 | 
			
		||||
case "$SYSTEM" in
 | 
			
		||||
  x86_64)
 | 
			
		||||
    FLAKE_TARGET="x86_64-linux"
 | 
			
		||||
    ;;
 | 
			
		||||
  aarch64)
 | 
			
		||||
    FLAKE_TARGET="aarch64-linux"
 | 
			
		||||
    ;;
 | 
			
		||||
  *)
 | 
			
		||||
    echo -e "${RED}Unsupported architecture: $SYSTEM${NC}"
 | 
			
		||||
    exit 1
 | 
			
		||||
    ;;
 | 
			
		||||
esac
 | 
			
		||||
 | 
			
		||||
echo -e "${YELLOW}Starting...${NC}"
 | 
			
		||||
 | 
			
		||||
# We pass SSH from user to root so root can download secrets from our private Github
 | 
			
		||||
sudo SSH_AUTH_SOCK=$SSH_AUTH_SOCK /run/current-system/sw/bin/nixos-rebuild switch --flake .#$FLAKE_TARGET $@
 | 
			
		||||
 | 
			
		||||
echo -e "${GREEN}Switch to new generation complete!${NC}"
 | 
			
		||||
							
								
								
									
										118
									
								
								flake.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										118
									
								
								flake.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,118 @@
 | 
			
		||||
{
 | 
			
		||||
  description = "Starter Configuration with secrets for MacOS and NixOS";
 | 
			
		||||
  inputs = {
 | 
			
		||||
    nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
 | 
			
		||||
    agenix.url = "github:ryantm/agenix";
 | 
			
		||||
    home-manager.url = "github:nix-community/home-manager";
 | 
			
		||||
    darwin = {
 | 
			
		||||
      url = "github:LnL7/nix-darwin/master";
 | 
			
		||||
      inputs.nixpkgs.follows = "nixpkgs";
 | 
			
		||||
    };
 | 
			
		||||
    nix-homebrew = {
 | 
			
		||||
      url = "github:zhaofengli-wip/nix-homebrew";
 | 
			
		||||
    };
 | 
			
		||||
    homebrew-bundle = {
 | 
			
		||||
      url = "github:homebrew/homebrew-bundle";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    homebrew-core = {
 | 
			
		||||
      url = "github:homebrew/homebrew-core";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    };
 | 
			
		||||
    homebrew-cask = {
 | 
			
		||||
      url = "github:homebrew/homebrew-cask";
 | 
			
		||||
      flake = false;
 | 
			
		||||
    }; 
 | 
			
		||||
    disko = {
 | 
			
		||||
      url = "github:nix-community/disko";
 | 
			
		||||
      inputs.nixpkgs.follows = "nixpkgs";
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
  outputs = { self, darwin, nix-homebrew, homebrew-bundle, homebrew-core, homebrew-cask, home-manager, nixpkgs, disko, agenix } @inputs:
 | 
			
		||||
    let
 | 
			
		||||
      user = "%USER%";
 | 
			
		||||
      linuxSystems = [ "x86_64-linux" "aarch64-linux" ];
 | 
			
		||||
      darwinSystems = [ "aarch64-darwin" "x86_64-darwin" ];
 | 
			
		||||
      forAllSystems = f: nixpkgs.lib.genAttrs (linuxSystems ++ darwinSystems) f;
 | 
			
		||||
      devShell = system: let pkgs = nixpkgs.legacyPackages.${system}; in {
 | 
			
		||||
        default = with pkgs; mkShell {
 | 
			
		||||
          nativeBuildInputs = with pkgs; [ bashInteractive git age age-plugin-yubikey ];
 | 
			
		||||
          shellHook = with pkgs; ''
 | 
			
		||||
            export EDITOR=vim
 | 
			
		||||
          '';
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
      mkApp = scriptName: system: {
 | 
			
		||||
        type = "app";
 | 
			
		||||
        program = "${(nixpkgs.legacyPackages.${system}.writeScriptBin scriptName ''
 | 
			
		||||
          #!/usr/bin/env bash
 | 
			
		||||
          PATH=${nixpkgs.legacyPackages.${system}.git}/bin:$PATH
 | 
			
		||||
          echo "Running ${scriptName} for ${system}"
 | 
			
		||||
          exec ${self}/apps/${system}/${scriptName}
 | 
			
		||||
        '')}/bin/${scriptName}";
 | 
			
		||||
      };
 | 
			
		||||
      mkLinuxApps = system: {
 | 
			
		||||
        "apply" = mkApp "apply" system;
 | 
			
		||||
        "build-switch" = mkApp "build-switch" system;
 | 
			
		||||
        "copy-keys" = mkApp "copy-keys" system;
 | 
			
		||||
        "create-keys" = mkApp "create-keys" system;
 | 
			
		||||
        "check-keys" = mkApp "check-keys" system;
 | 
			
		||||
        "install" = mkApp "install" system;
 | 
			
		||||
        "install-with-secrets" = mkApp "install-with-secrets" system;
 | 
			
		||||
      };
 | 
			
		||||
      mkDarwinApps = system: {
 | 
			
		||||
        "apply" = mkApp "apply" system;
 | 
			
		||||
        "build" = mkApp "build" system;
 | 
			
		||||
        "build-switch" = mkApp "build-switch" system;
 | 
			
		||||
        "copy-keys" = mkApp "copy-keys" system;
 | 
			
		||||
        "create-keys" = mkApp "create-keys" system;
 | 
			
		||||
        "check-keys" = mkApp "check-keys" system;
 | 
			
		||||
        "rollback" = mkApp "rollback" system;
 | 
			
		||||
      };
 | 
			
		||||
    in
 | 
			
		||||
    {
 | 
			
		||||
      devShells = forAllSystems devShell;
 | 
			
		||||
      apps = nixpkgs.lib.genAttrs linuxSystems mkLinuxApps // nixpkgs.lib.genAttrs darwinSystems mkDarwinApps;
 | 
			
		||||
 | 
			
		||||
      darwinConfigurations = nixpkgs.lib.genAttrs darwinSystems (system:
 | 
			
		||||
        darwin.lib.darwinSystem {
 | 
			
		||||
          inherit system;
 | 
			
		||||
          specialArgs = inputs;
 | 
			
		||||
          modules = [
 | 
			
		||||
            home-manager.darwinModules.home-manager
 | 
			
		||||
            nix-homebrew.darwinModules.nix-homebrew
 | 
			
		||||
            {
 | 
			
		||||
              nix-homebrew = {
 | 
			
		||||
                inherit user;
 | 
			
		||||
                enable = true;
 | 
			
		||||
                taps = {
 | 
			
		||||
                  "homebrew/homebrew-core" = homebrew-core;
 | 
			
		||||
                  "homebrew/homebrew-cask" = homebrew-cask;
 | 
			
		||||
                  "homebrew/homebrew-bundle" = homebrew-bundle;
 | 
			
		||||
                };
 | 
			
		||||
                mutableTaps = false;
 | 
			
		||||
                autoMigrate = true;
 | 
			
		||||
              };
 | 
			
		||||
            }
 | 
			
		||||
            ./hosts/darwin
 | 
			
		||||
          ];
 | 
			
		||||
        }
 | 
			
		||||
      );
 | 
			
		||||
 | 
			
		||||
      nixosConfigurations = nixpkgs.lib.genAttrs linuxSystems (system: nixpkgs.lib.nixosSystem {
 | 
			
		||||
        inherit system;
 | 
			
		||||
        specialArgs = inputs;
 | 
			
		||||
        modules = [
 | 
			
		||||
          disko.nixosModules.disko
 | 
			
		||||
          home-manager.nixosModules.home-manager {
 | 
			
		||||
            home-manager = {
 | 
			
		||||
              useGlobalPkgs = true;
 | 
			
		||||
              useUserPackages = true;
 | 
			
		||||
              users.${user} = import ./modules/nixos/home-manager.nix;
 | 
			
		||||
            };
 | 
			
		||||
          }
 | 
			
		||||
          ./hosts/nixos
 | 
			
		||||
        ];
 | 
			
		||||
     });
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										93
									
								
								hosts/darwin/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								hosts/darwin/default.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
{ agenix, config, pkgs, ... }:
 | 
			
		||||
 | 
			
		||||
let user = "%USER%"; in
 | 
			
		||||
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  imports = [
 | 
			
		||||
    ../../modules/darwin/secrets.nix
 | 
			
		||||
    ../../modules/darwin/home-manager.nix
 | 
			
		||||
    ../../modules/shared
 | 
			
		||||
     agenix.darwinModules.default
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  # Setup user, packages, programs
 | 
			
		||||
  nix = {
 | 
			
		||||
    package = pkgs.nix;
 | 
			
		||||
 | 
			
		||||
    settings = {
 | 
			
		||||
      trusted-users = [ "@admin" "${user}" ];
 | 
			
		||||
      substituters = [ "https://nix-community.cachix.org" "https://cache.nixos.org" ];
 | 
			
		||||
      trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ];
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    gc = {
 | 
			
		||||
      automatic = true;
 | 
			
		||||
      interval = { Weekday = 0; Hour = 2; Minute = 0; };
 | 
			
		||||
      options = "--delete-older-than 30d";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    extraOptions = ''
 | 
			
		||||
      experimental-features = nix-command flakes
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # Turn off NIX_PATH warnings now that we're using flakes
 | 
			
		||||
  system.checks.verifyNixPath = false;
 | 
			
		||||
 | 
			
		||||
  # Load configuration that is shared across systems
 | 
			
		||||
  environment.systemPackages = with pkgs; [
 | 
			
		||||
    emacs-unstable
 | 
			
		||||
    agenix.packages."${pkgs.system}".default
 | 
			
		||||
  ] ++ (import ../../modules/shared/packages.nix { inherit pkgs; });
 | 
			
		||||
 | 
			
		||||
  launchd.user.agents.emacs.path = [ config.environment.systemPath ];
 | 
			
		||||
  launchd.user.agents.emacs.serviceConfig = {
 | 
			
		||||
    KeepAlive = true;
 | 
			
		||||
    ProgramArguments = [
 | 
			
		||||
      "/bin/sh"
 | 
			
		||||
      "-c"
 | 
			
		||||
      "/bin/wait4path ${pkgs.emacs}/bin/emacs && exec ${pkgs.emacs}/bin/emacs --fg-daemon"
 | 
			
		||||
    ];
 | 
			
		||||
    StandardErrorPath = "/tmp/emacs.err.log";
 | 
			
		||||
    StandardOutPath = "/tmp/emacs.out.log";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  system = {
 | 
			
		||||
    stateVersion = 4;
 | 
			
		||||
 | 
			
		||||
    defaults = {
 | 
			
		||||
      NSGlobalDomain = {
 | 
			
		||||
        AppleShowAllExtensions = true;
 | 
			
		||||
        ApplePressAndHoldEnabled = false;
 | 
			
		||||
 | 
			
		||||
        # 120, 90, 60, 30, 12, 6, 2
 | 
			
		||||
        KeyRepeat = 2;
 | 
			
		||||
 | 
			
		||||
        # 120, 94, 68, 35, 25, 15
 | 
			
		||||
        InitialKeyRepeat = 15;
 | 
			
		||||
 | 
			
		||||
        "com.apple.mouse.tapBehavior" = 1;
 | 
			
		||||
        "com.apple.sound.beep.volume" = 0.0;
 | 
			
		||||
        "com.apple.sound.beep.feedback" = 0;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      dock = {
 | 
			
		||||
        autohide = false;
 | 
			
		||||
        show-recents = false;
 | 
			
		||||
        launchanim = true;
 | 
			
		||||
        orientation = "bottom";
 | 
			
		||||
        tilesize = 48;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      finder = {
 | 
			
		||||
        _FXShowPosixPathInTitle = false;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      trackpad = {
 | 
			
		||||
        Clicking = true;
 | 
			
		||||
        TrackpadThreeFingerDrag = true;
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										307
									
								
								hosts/nixos/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										307
									
								
								hosts/nixos/default.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,307 @@
 | 
			
		||||
{ config, inputs, pkgs, agenix, ... }:
 | 
			
		||||
 | 
			
		||||
let user = "%USER%";
 | 
			
		||||
    keys = [ "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOk8iAnIaa1deoc7jw8YACPNVka1ZFJxhnU4G74TmS+p" ]; in
 | 
			
		||||
{
 | 
			
		||||
  imports = [
 | 
			
		||||
    ../../modules/nixos/secrets.nix
 | 
			
		||||
    ../../modules/nixos/disk-config.nix
 | 
			
		||||
    ../../modules/shared
 | 
			
		||||
    agenix.nixosModules.default
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  # Use the systemd-boot EFI boot loader.
 | 
			
		||||
  boot = {
 | 
			
		||||
    loader = {
 | 
			
		||||
      systemd-boot = {
 | 
			
		||||
        enable = true;
 | 
			
		||||
        configurationLimit = 42;
 | 
			
		||||
      };
 | 
			
		||||
      efi.canTouchEfiVariables = true;
 | 
			
		||||
    };
 | 
			
		||||
    initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "usb_storage" "sd_mod" ];
 | 
			
		||||
    # Uncomment for AMD GPU
 | 
			
		||||
    # initrd.kernelModules = [ "amdgpu" ];
 | 
			
		||||
    kernelPackages = pkgs.linuxPackages_latest;
 | 
			
		||||
    kernelModules = [ "uinput" ];
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # Set your time zone.
 | 
			
		||||
  time.timeZone = "America/New_York";
 | 
			
		||||
 | 
			
		||||
  # The global useDHCP flag is deprecated, therefore explicitly set to false here.
 | 
			
		||||
  # Per-interface useDHCP will be mandatory in the future, so this generated config
 | 
			
		||||
  # replicates the default behaviour.
 | 
			
		||||
  networking = {
 | 
			
		||||
    hostName = "%HOST%"; # Define your hostname.
 | 
			
		||||
    useDHCP = false;
 | 
			
		||||
    interfaces."%INTERFACE%".useDHCP = true;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  nix = {
 | 
			
		||||
    nixPath = [ "nixos-config=/home/${user}/.local/share/src/nixos-config:/etc/nixos" ];
 | 
			
		||||
    settings = {
 | 
			
		||||
      allowed-users = [ "${user}" ];
 | 
			
		||||
      trusted-users = [ "@admin" "${user}" ];
 | 
			
		||||
      substituters = [ "https://nix-community.cachix.org" "https://cache.nixos.org" ];
 | 
			
		||||
      trusted-public-keys = [ "cache.nixos.org-1:6NCHdD59X431o0gWypbMrAURkbJ16ZPMQFGspcDShjY=" ];
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    package = pkgs.nix;
 | 
			
		||||
    extraOptions = ''
 | 
			
		||||
      experimental-features = nix-command flakes
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # Manages keys and such
 | 
			
		||||
  programs = {
 | 
			
		||||
    gnupg.agent.enable = true;
 | 
			
		||||
 | 
			
		||||
    # Needed for anything GTK related
 | 
			
		||||
    dconf.enable = true;
 | 
			
		||||
 | 
			
		||||
    # My shell
 | 
			
		||||
    zsh.enable = true;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  services = {
 | 
			
		||||
    displayManager.defaultSession = "none+bspwm";
 | 
			
		||||
    xserver = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
 | 
			
		||||
      # Uncomment these for AMD or Nvidia GPU
 | 
			
		||||
      # videoDrivers = [ "amdgpu" ];
 | 
			
		||||
      # videoDrivers = [ "nvidia" ];
 | 
			
		||||
 | 
			
		||||
      # Uncomment this for Nvidia GPU
 | 
			
		||||
      # This helps fix tearing of windows for Nvidia cards
 | 
			
		||||
      # services.xserver.screenSection = ''
 | 
			
		||||
      #   Option       "metamodes" "nvidia-auto-select +0+0 {ForceFullCompositionPipeline=On}"
 | 
			
		||||
      #   Option       "AllowIndirectGLXProtocol" "off"
 | 
			
		||||
      #   Option       "TripleBuffer" "on"
 | 
			
		||||
      # '';
 | 
			
		||||
 | 
			
		||||
      # LightDM Display Manager
 | 
			
		||||
      displayManager.lightdm = {
 | 
			
		||||
        enable = true;
 | 
			
		||||
        greeters.slick.enable = true;
 | 
			
		||||
        background = ../../modules/nixos/config/login-wallpaper.png;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      # Tiling window manager
 | 
			
		||||
      windowManager.bspwm = {
 | 
			
		||||
        enable = true;
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      xkb = {
 | 
			
		||||
        # Turn Caps Lock into Ctrl
 | 
			
		||||
        layout = "us";
 | 
			
		||||
        options = "ctrl:nocaps";
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Better support for general peripherals
 | 
			
		||||
    libinput.enable = true;
 | 
			
		||||
 | 
			
		||||
    # Let's be able to SSH into this machine
 | 
			
		||||
    openssh.enable = true;
 | 
			
		||||
 | 
			
		||||
    # Sync state between machines
 | 
			
		||||
    # Sync state between machines
 | 
			
		||||
    syncthing = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
      openDefaultPorts = true;
 | 
			
		||||
      dataDir = "/home/${user}/.local/share/syncthing";
 | 
			
		||||
      configDir = "/home/${user}/.config/syncthing";
 | 
			
		||||
      user = "${user}";
 | 
			
		||||
      group = "users";
 | 
			
		||||
      guiAddress = "127.0.0.1:8384";
 | 
			
		||||
      overrideFolders = true;
 | 
			
		||||
      overrideDevices = true;
 | 
			
		||||
 | 
			
		||||
      settings = {
 | 
			
		||||
        devices = {};
 | 
			
		||||
        options.globalAnnounceEnabled = false; # Only sync on LAN
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Picom, my window compositor with fancy effects
 | 
			
		||||
    #
 | 
			
		||||
    # Notes on writing exclude rules:
 | 
			
		||||
    #
 | 
			
		||||
    #   class_g looks up index 1 in WM_CLASS value for an application
 | 
			
		||||
    #   class_i looks up index 0
 | 
			
		||||
    #
 | 
			
		||||
    #   To find the value for a specific application, use `xprop` at the
 | 
			
		||||
    #   terminal and then click on a window of the application in question
 | 
			
		||||
    #
 | 
			
		||||
    picom = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
      settings = {
 | 
			
		||||
        animations = true;
 | 
			
		||||
        animation-stiffness = 300.0;
 | 
			
		||||
        animation-dampening = 35.0;
 | 
			
		||||
        animation-clamping = false;
 | 
			
		||||
        animation-mass = 1;
 | 
			
		||||
        animation-for-workspace-switch-in = "auto";
 | 
			
		||||
        animation-for-workspace-switch-out = "auto";
 | 
			
		||||
        animation-for-open-window = "slide-down";
 | 
			
		||||
        animation-for-menu-window = "none";
 | 
			
		||||
        animation-for-transient-window = "slide-down";
 | 
			
		||||
        corner-radius = 12;
 | 
			
		||||
        rounded-corners-exclude = [
 | 
			
		||||
          "class_i = 'polybar'"
 | 
			
		||||
          "class_g = 'i3lock'"
 | 
			
		||||
        ];
 | 
			
		||||
        round-borders = 3;
 | 
			
		||||
        round-borders-exclude = [];
 | 
			
		||||
        round-borders-rule = [];
 | 
			
		||||
        shadow = true;
 | 
			
		||||
        shadow-radius = 8;
 | 
			
		||||
        shadow-opacity = 0.4;
 | 
			
		||||
        shadow-offset-x = -8;
 | 
			
		||||
        shadow-offset-y = -8;
 | 
			
		||||
        fading = false;
 | 
			
		||||
        inactive-opacity = 0.8;
 | 
			
		||||
        frame-opacity = 0.7;
 | 
			
		||||
        inactive-opacity-override = false;
 | 
			
		||||
        active-opacity = 1.0;
 | 
			
		||||
        focus-exclude = [
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        opacity-rule = [
 | 
			
		||||
          "100:class_g = 'i3lock'"
 | 
			
		||||
          "60:class_g = 'Dunst'"
 | 
			
		||||
          "100:class_g = 'Alacritty' && focused"
 | 
			
		||||
          "90:class_g = 'Alacritty' && !focused"
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        blur-kern = "3x3box";
 | 
			
		||||
        blur = {
 | 
			
		||||
          method = "kernel";
 | 
			
		||||
          strength = 8;
 | 
			
		||||
          background = false;
 | 
			
		||||
          background-frame = false;
 | 
			
		||||
          background-fixed = false;
 | 
			
		||||
          kern = "3x3box";
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        shadow-exclude = [
 | 
			
		||||
          "class_g = 'Dunst'"
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        blur-background-exclude = [
 | 
			
		||||
          "class_g = 'Dunst'"
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        backend = "glx";
 | 
			
		||||
        vsync = false;
 | 
			
		||||
        mark-wmwin-focused = true;
 | 
			
		||||
        mark-ovredir-focused = true;
 | 
			
		||||
        detect-rounded-corners = true;
 | 
			
		||||
        detect-client-opacity = false;
 | 
			
		||||
        detect-transient = true;
 | 
			
		||||
        detect-client-leader = true;
 | 
			
		||||
        use-damage = true;
 | 
			
		||||
        log-level = "info";
 | 
			
		||||
 | 
			
		||||
        wintypes = {
 | 
			
		||||
          normal = { fade = true; shadow = false; };
 | 
			
		||||
          tooltip = { fade = true; shadow = false; opacity = 0.75; focus = true; full-shadow = false; };
 | 
			
		||||
          dock = { shadow = false; };
 | 
			
		||||
          dnd = { shadow = false; };
 | 
			
		||||
          popup_menu = { opacity = 1.0; };
 | 
			
		||||
          dropdown_menu = { opacity = 1.0; };
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    gvfs.enable = true; # Mount, trash, and other functionalities
 | 
			
		||||
    tumbler.enable = true; # Thumbnail support for images
 | 
			
		||||
 | 
			
		||||
    # Emacs runs as a daemon
 | 
			
		||||
    emacs = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
      package = pkgs.emacs-unstable;
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # When emacs builds from no cache, it exceeds the 90s timeout default
 | 
			
		||||
  systemd.user.services.emacs = {
 | 
			
		||||
    serviceConfig.TimeoutStartSec = "7min";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # Enable CUPS to print documents
 | 
			
		||||
  # services.printing.enable = true;
 | 
			
		||||
  # services.printing.drivers = [ pkgs.brlaser ]; # Brother printer driver
 | 
			
		||||
 | 
			
		||||
  # Enable sound
 | 
			
		||||
  # sound.enable = true;
 | 
			
		||||
  # hardware.pulseaudio.enable = true;
 | 
			
		||||
 | 
			
		||||
  # Video support
 | 
			
		||||
  hardware = {
 | 
			
		||||
    graphics.enable = true;
 | 
			
		||||
    # nvidia.modesetting.enable = true;
 | 
			
		||||
 | 
			
		||||
    # Enable Xbox support
 | 
			
		||||
    # xone.enable = true;
 | 
			
		||||
 | 
			
		||||
    # Crypto wallet support
 | 
			
		||||
    ledger.enable = true;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
 # Add docker daemon
 | 
			
		||||
  virtualisation.docker.enable = true;
 | 
			
		||||
  virtualisation.docker.logDriver = "json-file";
 | 
			
		||||
 | 
			
		||||
  # It's me, it's you, it's everyone
 | 
			
		||||
  users.users = {
 | 
			
		||||
    ${user} = {
 | 
			
		||||
      isNormalUser = true;
 | 
			
		||||
      extraGroups = [
 | 
			
		||||
        "wheel" # Enable ‘sudo’ for the user.
 | 
			
		||||
        "docker"
 | 
			
		||||
      ];
 | 
			
		||||
      shell = pkgs.zsh;
 | 
			
		||||
      openssh.authorizedKeys.keys = keys;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    root = {
 | 
			
		||||
      openssh.authorizedKeys.keys = keys;
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # Don't require password for users in `wheel` group for these commands
 | 
			
		||||
  security.sudo = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    extraRules = [{
 | 
			
		||||
      commands = [
 | 
			
		||||
       {
 | 
			
		||||
         command = "${pkgs.systemd}/bin/reboot";
 | 
			
		||||
         options = [ "NOPASSWD" ];
 | 
			
		||||
        }
 | 
			
		||||
      ];
 | 
			
		||||
      groups = [ "wheel" ];
 | 
			
		||||
    }];
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  fonts.packages = with pkgs; [
 | 
			
		||||
    dejavu_fonts
 | 
			
		||||
    emacs-all-the-icons-fonts
 | 
			
		||||
    feather-font # from overlay
 | 
			
		||||
    jetbrains-mono
 | 
			
		||||
    font-awesome
 | 
			
		||||
    noto-fonts
 | 
			
		||||
    noto-fonts-emoji
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  environment.systemPackages = with pkgs; [
 | 
			
		||||
    agenix.packages."${pkgs.system}".default # "x86_64-linux"
 | 
			
		||||
    gitAndTools.gitFull
 | 
			
		||||
    inetutils
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  system.stateVersion = "21.05"; # Don't change this
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								modules/darwin/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								modules/darwin/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
 | 
			
		||||
## Layout
 | 
			
		||||
```
 | 
			
		||||
.
 | 
			
		||||
├── dock               # MacOS dock configuration
 | 
			
		||||
├── casks.nix          # List of homebrew casks
 | 
			
		||||
├── default.nix        # Defines module, system-level config
 | 
			
		||||
├── files.nix          # Non-Nix, static configuration files (now immutable!)
 | 
			
		||||
├── home-manager.nix   # Defines user programs
 | 
			
		||||
├── packages.nix       # List of packages to install for MacOS
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										26
									
								
								modules/darwin/casks.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										26
									
								
								modules/darwin/casks.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,26 @@
 | 
			
		||||
_:
 | 
			
		||||
 | 
			
		||||
[
 | 
			
		||||
  # Development Tools
 | 
			
		||||
  "homebrew/cask/docker"
 | 
			
		||||
  "visual-studio-code"
 | 
			
		||||
 | 
			
		||||
  # Communication Tools
 | 
			
		||||
  "discord"
 | 
			
		||||
  "notion"
 | 
			
		||||
  "slack"
 | 
			
		||||
  "telegram"
 | 
			
		||||
  "zoom"
 | 
			
		||||
 | 
			
		||||
  # Utility Tools
 | 
			
		||||
  "syncthing"
 | 
			
		||||
 | 
			
		||||
  # Entertainment Tools
 | 
			
		||||
  "vlc"
 | 
			
		||||
 | 
			
		||||
  # Productivity Tools
 | 
			
		||||
  "raycast"
 | 
			
		||||
 | 
			
		||||
  # Browsers
 | 
			
		||||
  "google-chrome"
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										70
									
								
								modules/darwin/dock/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								modules/darwin/dock/default.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,70 @@
 | 
			
		||||
{ config, pkgs, lib, ... }:
 | 
			
		||||
 | 
			
		||||
# Original source: https://gist.github.com/antifuchs/10138c4d838a63c0a05e725ccd7bccdd
 | 
			
		||||
 | 
			
		||||
with lib;
 | 
			
		||||
let
 | 
			
		||||
  cfg = config.local.dock;
 | 
			
		||||
  inherit (pkgs) stdenv dockutil;
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
  options = {
 | 
			
		||||
    local.dock.enable = mkOption {
 | 
			
		||||
      description = "Enable dock";
 | 
			
		||||
      default = stdenv.isDarwin;
 | 
			
		||||
      example = false;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    local.dock.entries = mkOption
 | 
			
		||||
      {
 | 
			
		||||
        description = "Entries on the Dock";
 | 
			
		||||
        type = with types; listOf (submodule {
 | 
			
		||||
          options = {
 | 
			
		||||
            path = lib.mkOption { type = str; };
 | 
			
		||||
            section = lib.mkOption {
 | 
			
		||||
              type = str;
 | 
			
		||||
              default = "apps";
 | 
			
		||||
            };
 | 
			
		||||
            options = lib.mkOption {
 | 
			
		||||
              type = str;
 | 
			
		||||
              default = "";
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
        });
 | 
			
		||||
        readOnly = true;
 | 
			
		||||
      };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  config =
 | 
			
		||||
    mkIf cfg.enable
 | 
			
		||||
      (
 | 
			
		||||
        let
 | 
			
		||||
          normalize = path: if hasSuffix ".app" path then path + "/" else path;
 | 
			
		||||
          entryURI = path: "file://" + (builtins.replaceStrings
 | 
			
		||||
            [" "   "!"   "\""  "#"   "$"   "%"   "&"   "'"   "("   ")"]
 | 
			
		||||
            ["%20" "%21" "%22" "%23" "%24" "%25" "%26" "%27" "%28" "%29"]
 | 
			
		||||
            (normalize path)
 | 
			
		||||
          );
 | 
			
		||||
          wantURIs = concatMapStrings
 | 
			
		||||
            (entry: "${entryURI entry.path}\n")
 | 
			
		||||
            cfg.entries;
 | 
			
		||||
          createEntries = concatMapStrings
 | 
			
		||||
            (entry: "${dockutil}/bin/dockutil --no-restart --add '${entry.path}' --section ${entry.section} ${entry.options}\n")
 | 
			
		||||
            cfg.entries;
 | 
			
		||||
        in
 | 
			
		||||
        {
 | 
			
		||||
          system.activationScripts.postUserActivation.text = ''
 | 
			
		||||
            echo >&2 "Setting up the Dock..."
 | 
			
		||||
            haveURIs="$(${dockutil}/bin/dockutil --list | ${pkgs.coreutils}/bin/cut -f2)"
 | 
			
		||||
            if ! diff -wu <(echo -n "$haveURIs") <(echo -n '${wantURIs}') >&2 ; then
 | 
			
		||||
              echo >&2 "Resetting Dock."
 | 
			
		||||
              ${dockutil}/bin/dockutil --no-restart --remove all
 | 
			
		||||
              ${createEntries}
 | 
			
		||||
              killall Dock
 | 
			
		||||
            else
 | 
			
		||||
              echo >&2 "Dock setup complete."
 | 
			
		||||
            fi
 | 
			
		||||
          '';
 | 
			
		||||
        }
 | 
			
		||||
      );
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								modules/darwin/files.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								modules/darwin/files.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
{ user, config, pkgs, ... }:
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
  xdg_configHome = "${config.users.users.${user}.home}/.config";
 | 
			
		||||
  xdg_dataHome   = "${config.users.users.${user}.home}/.local/share";
 | 
			
		||||
  xdg_stateHome  = "${config.users.users.${user}.home}/.local/state"; in
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  # Raycast script so that "Run Emacs" is available and uses Emacs daemon
 | 
			
		||||
  "${xdg_dataHome}/bin/emacsclient" = {
 | 
			
		||||
    executable = true;
 | 
			
		||||
    text = ''
 | 
			
		||||
      #!/bin/zsh
 | 
			
		||||
      #
 | 
			
		||||
      # Required parameters:
 | 
			
		||||
      # @raycast.schemaVersion 1
 | 
			
		||||
      # @raycast.title Run Emacs
 | 
			
		||||
      # @raycast.mode silent
 | 
			
		||||
      #
 | 
			
		||||
      # Optional parameters:
 | 
			
		||||
      # @raycast.packageName Emacs
 | 
			
		||||
      # @raycast.icon ${xdg_dataHome}/img/icons/Emacs.icns
 | 
			
		||||
      # @raycast.iconDark ${xdg_dataHome}/img/icons/Emacs.icns
 | 
			
		||||
 | 
			
		||||
      if [[ $1 = "-t" ]]; then
 | 
			
		||||
        # Terminal mode
 | 
			
		||||
        ${pkgs.emacs}/bin/emacsclient -t $@
 | 
			
		||||
      else
 | 
			
		||||
        # GUI mode
 | 
			
		||||
        ${pkgs.emacs}/bin/emacsclient -c -n $@
 | 
			
		||||
      fi
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										103
									
								
								modules/darwin/home-manager.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								modules/darwin/home-manager.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,103 @@
 | 
			
		||||
{ config, pkgs, lib, home-manager, ... }:
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
  user = "%USER%";
 | 
			
		||||
  # Define the content of your file as a derivation
 | 
			
		||||
  myEmacsLauncher = pkgs.writeScript "emacs-launcher.command" ''
 | 
			
		||||
    #!/bin/sh
 | 
			
		||||
    emacsclient -c -n &
 | 
			
		||||
  '';
 | 
			
		||||
  sharedFiles = import ../shared/files.nix { inherit config pkgs; };
 | 
			
		||||
  additionalFiles = import ./files.nix { inherit user config pkgs; };
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
  imports = [
 | 
			
		||||
   ./dock
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  # It me
 | 
			
		||||
  users.users.${user} = {
 | 
			
		||||
    name = "${user}";
 | 
			
		||||
    home = "/Users/${user}";
 | 
			
		||||
    isHidden = false;
 | 
			
		||||
    shell = pkgs.zsh;
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  homebrew = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    casks = pkgs.callPackage ./casks.nix {};
 | 
			
		||||
    # onActivation.cleanup = "uninstall";
 | 
			
		||||
 | 
			
		||||
    # These app IDs are from using the mas CLI app
 | 
			
		||||
    # mas = mac app store
 | 
			
		||||
    # https://github.com/mas-cli/mas
 | 
			
		||||
    #
 | 
			
		||||
    # $ nix shell nixpkgs#mas
 | 
			
		||||
    # $ mas search <app name>
 | 
			
		||||
    #
 | 
			
		||||
    # If you have previously added these apps to your Mac App Store profile (but not installed them on this system),
 | 
			
		||||
    # you may receive an error message "Redownload Unavailable with This Apple ID".
 | 
			
		||||
    # This message is safe to ignore. (https://github.com/dustinlyons/nixos-config/issues/83)
 | 
			
		||||
 | 
			
		||||
    masApps = {
 | 
			
		||||
      "1password" = 1333542190;
 | 
			
		||||
      "wireguard" = 1451685025;
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # Enable home-manager
 | 
			
		||||
  home-manager = {
 | 
			
		||||
    useGlobalPkgs = true;
 | 
			
		||||
    users.${user} = { pkgs, config, lib, ... }:{
 | 
			
		||||
      home = {
 | 
			
		||||
        enableNixpkgsReleaseCheck = false;
 | 
			
		||||
        packages = pkgs.callPackage ./packages.nix {};
 | 
			
		||||
        file = lib.mkMerge [
 | 
			
		||||
          sharedFiles
 | 
			
		||||
          additionalFiles
 | 
			
		||||
          { "emacs-launcher.command".source = myEmacsLauncher; }
 | 
			
		||||
        ];
 | 
			
		||||
 | 
			
		||||
        stateVersion = "23.11";
 | 
			
		||||
      };
 | 
			
		||||
      programs = {} // import ../shared/home-manager.nix { inherit config pkgs lib; };
 | 
			
		||||
 | 
			
		||||
      # Marked broken Oct 20, 2022 check later to remove this
 | 
			
		||||
      # https://github.com/nix-community/home-manager/issues/3344
 | 
			
		||||
      manual.manpages.enable = false;
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # Fully declarative dock using the latest from Nix Store
 | 
			
		||||
  local = { 
 | 
			
		||||
    dock = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
      entries = [
 | 
			
		||||
        { path = "/Applications/Slack.app/"; }
 | 
			
		||||
        { path = "/System/Applications/Messages.app/"; }
 | 
			
		||||
        { path = "/System/Applications/Facetime.app/"; }
 | 
			
		||||
        { path = "${pkgs.alacritty}/Applications/Alacritty.app/"; }
 | 
			
		||||
        { path = "/System/Applications/Music.app/"; }
 | 
			
		||||
        { path = "/System/Applications/News.app/"; }
 | 
			
		||||
        { path = "/System/Applications/Photos.app/"; }
 | 
			
		||||
        { path = "/System/Applications/Photo Booth.app/"; }
 | 
			
		||||
        { path = "/System/Applications/TV.app/"; }
 | 
			
		||||
        { path = "/System/Applications/Home.app/"; }
 | 
			
		||||
        {
 | 
			
		||||
          path = toString myEmacsLauncher;
 | 
			
		||||
          section = "others";
 | 
			
		||||
        }
 | 
			
		||||
        {
 | 
			
		||||
          path = "${config.users.users.${user}.home}/.local/share/";
 | 
			
		||||
          section = "others";
 | 
			
		||||
          options = "--sort name --view grid --display folder";
 | 
			
		||||
        }
 | 
			
		||||
        {
 | 
			
		||||
          path = "${config.users.users.${user}.home}/.local/share/downloads";
 | 
			
		||||
          section = "others";
 | 
			
		||||
          options = "--sort name --view grid --display stack";
 | 
			
		||||
        }
 | 
			
		||||
      ];
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										7
									
								
								modules/darwin/packages.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										7
									
								
								modules/darwin/packages.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,7 @@
 | 
			
		||||
{ pkgs }:
 | 
			
		||||
 | 
			
		||||
with pkgs;
 | 
			
		||||
let shared-packages = import ../shared/packages.nix { inherit pkgs; }; in
 | 
			
		||||
shared-packages ++ [
 | 
			
		||||
  dockutil
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										37
									
								
								modules/darwin/secrets.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								modules/darwin/secrets.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,37 @@
 | 
			
		||||
{ config, pkgs, agenix, secrets, ... }:
 | 
			
		||||
 | 
			
		||||
let user = "%USER%"; in
 | 
			
		||||
{
 | 
			
		||||
  age.identityPaths = [
 | 
			
		||||
    "/Users/${user}/.ssh/id_ed25519"
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  # Your secrets go here
 | 
			
		||||
  #
 | 
			
		||||
  # Note: the installWithSecrets command you ran to boostrap the machine actually copies over
 | 
			
		||||
  #       a Github key pair. However, if you want to store the keypair in your nix-secrets repo
 | 
			
		||||
  #       instead, you can reference the age files and specify the symlink path here. Then add your
 | 
			
		||||
  #       public key in shared/files.nix.
 | 
			
		||||
  #
 | 
			
		||||
  #       If you change the key name, you'll need to update the SSH configuration in shared/home-manager.nix
 | 
			
		||||
  #       so Github reads it correctly.
 | 
			
		||||
 | 
			
		||||
  #
 | 
			
		||||
  # age.secrets."github-ssh-key" = {
 | 
			
		||||
  #   symlink = true;
 | 
			
		||||
  #   path = "/Users/${user}/.ssh/id_github";
 | 
			
		||||
  #   file =  "${secrets}/github-ssh-key.age";
 | 
			
		||||
  #   mode = "600";
 | 
			
		||||
  #   owner = "${user}";
 | 
			
		||||
  #   group = "staff";
 | 
			
		||||
  # };
 | 
			
		||||
 | 
			
		||||
  # age.secrets."github-signing-key" = {
 | 
			
		||||
  #   symlink = false;
 | 
			
		||||
  #   path = "/Users/${user}/.ssh/pgp_github.key";
 | 
			
		||||
  #   file =  "${secrets}/github-signing-key.age";
 | 
			
		||||
  #   mode = "600";
 | 
			
		||||
  #   owner = "${user}";
 | 
			
		||||
  # };
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										11
									
								
								modules/nixos/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								modules/nixos/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,11 @@
 | 
			
		||||
## Layout
 | 
			
		||||
```
 | 
			
		||||
.
 | 
			
		||||
├── config             # Config files not written in Nix
 | 
			
		||||
├── default.nix        # Defines module, system-level config,
 | 
			
		||||
├── disk-config.nix    # Disks, partitions, and filesystems
 | 
			
		||||
├── files.nix          # Non-Nix, static configuration files (now immutable!)
 | 
			
		||||
├── home-manager.nix   # Defines user programs
 | 
			
		||||
├── packages.nix       # List of packages to install for NixOS
 | 
			
		||||
├── secrets.nix        # Age-encrypted secrets with agenix
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										
											BIN
										
									
								
								modules/nixos/config/login-wallpaper.png
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										
											BIN
										
									
								
								modules/nixos/config/login-wallpaper.png
									
									
									
									
									
										Normal file
									
								
							
										
											Binary file not shown.
										
									
								
							| 
		 After Width: | Height: | Size: 692 KiB  | 
							
								
								
									
										498
									
								
								modules/nixos/config/polybar/bars.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										498
									
								
								modules/nixos/config/polybar/bars.ini
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,498 @@
 | 
			
		||||
;; ┌────────────────────────────────────────────────────┐
 | 
			
		||||
;; │░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄░░░░░░░░░█▀▄░█▀█░█▀▄░█▀▀│
 | 
			
		||||
;; │░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄░░░░▀░░░░█▀▄░█▀█░█▀▄░▀▀█│
 | 
			
		||||
;; │░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀░░░░▀░░░░▀▀░░▀░▀░▀░▀░▀▀▀│
 | 
			
		||||
;; │░Created░By░Aditya░Shakya░@adi1090x░░░░░░░░░░░░░░░░░│
 | 
			
		||||
;; └────────────────────────────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[bar]
 | 
			
		||||
fill = 
 | 
			
		||||
empty = 
 | 
			
		||||
indicator = ⏽
 | 
			
		||||
; Nerd font :   ,  ⏽,  樂 籠 錄 , 雷 絛
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/volume]
 | 
			
		||||
type = internal/alsa
 | 
			
		||||
 | 
			
		||||
; Soundcard to be used
 | 
			
		||||
; Usually in the format hw:# where # is the card number
 | 
			
		||||
; You can find the different card numbers in `/proc/asound/cards`
 | 
			
		||||
master-soundcard = default
 | 
			
		||||
speaker-soundcard = default
 | 
			
		||||
headphone-soundcard = default
 | 
			
		||||
 | 
			
		||||
; Name of the master, speaker and headphone mixers
 | 
			
		||||
; Use the following command to list available mixer controls:
 | 
			
		||||
; $ amixer scontrols | sed -nr "s/.*'([[:alnum:]]+)'.*/\1/p"
 | 
			
		||||
; If master, speaker or headphone-soundcard isn't the default, 
 | 
			
		||||
; use `amixer -c # scontrols` instead where # is the number 
 | 
			
		||||
; of the master, speaker or headphone soundcard respectively
 | 
			
		||||
;
 | 
			
		||||
; Default: Master
 | 
			
		||||
master-mixer = Master
 | 
			
		||||
 | 
			
		||||
; Optionally define speaker and headphone mixers
 | 
			
		||||
; Default: none
 | 
			
		||||
;;speaker-mixer = Speaker
 | 
			
		||||
; Default: none
 | 
			
		||||
;;headphone-mixer = Headphone
 | 
			
		||||
 | 
			
		||||
; NOTE: This is required if headphone_mixer is defined
 | 
			
		||||
; Use the following command to list available device controls
 | 
			
		||||
; $ amixer controls | sed -r "/CARD/\!d; s/.*=([0-9]+).*name='([^']+)'.*/printf '%3.0f: %s\n' '\1' '\2'/e" | sort
 | 
			
		||||
; You may also need to use `amixer -c # controls` as above for the mixer names
 | 
			
		||||
; Default: none
 | 
			
		||||
;;headphone-id = 9
 | 
			
		||||
 | 
			
		||||
; Use volume mapping (similar to amixer -M and alsamixer), where the increase in volume is linear to the ear
 | 
			
		||||
; Default: false
 | 
			
		||||
;;mapped = true
 | 
			
		||||
 | 
			
		||||
; Interval for volume increase/decrease (in percent points)
 | 
			
		||||
; Default: 5
 | 
			
		||||
interval = 5
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-volume> (default)
 | 
			
		||||
;   <ramp-volume>
 | 
			
		||||
;   <bar-volume>
 | 
			
		||||
format-volume = <ramp-volume> <bar-volume>
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-muted> (default)
 | 
			
		||||
;   <ramp-volume>
 | 
			
		||||
;   <bar-volume>
 | 
			
		||||
format-muted = <label-muted>
 | 
			
		||||
format-muted-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage% (default)
 | 
			
		||||
label-volume = %percentage%%
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage% (default
 | 
			
		||||
label-muted = " Muted"
 | 
			
		||||
label-muted-foreground = ${color.foreground-alt}
 | 
			
		||||
 | 
			
		||||
; Only applies if <ramp-volume> is used
 | 
			
		||||
ramp-volume-0 = 
 | 
			
		||||
ramp-volume-1 = 
 | 
			
		||||
ramp-volume-2 = 
 | 
			
		||||
 | 
			
		||||
; Only applies if <bar-volume> is used
 | 
			
		||||
bar-volume-width = 10
 | 
			
		||||
bar-volume-gradient = false
 | 
			
		||||
 | 
			
		||||
bar-volume-indicator = ${bar.indicator}
 | 
			
		||||
bar-volume-indicator-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-volume-fill = ${bar.fill}
 | 
			
		||||
bar-volume-foreground-0 = ${color.foreground}
 | 
			
		||||
bar-volume-foreground-1 = ${color.foreground}
 | 
			
		||||
bar-volume-foreground-2 = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-volume-empty = ${bar.empty}
 | 
			
		||||
bar-volume-empty-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
; If defined, it will replace <ramp-volume> when
 | 
			
		||||
; headphones are plugged in to `headphone_control_numid`
 | 
			
		||||
; If undefined, <ramp-volume> will be used for both
 | 
			
		||||
; Only applies if <ramp-volume> is used
 | 
			
		||||
ramp-headphones-0 = 
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/brightness]
 | 
			
		||||
;type = internal/xbacklight
 | 
			
		||||
type = internal/backlight
 | 
			
		||||
 | 
			
		||||
; Use the following command to list available cards:
 | 
			
		||||
; $ ls -1 /sys/class/backlight/
 | 
			
		||||
;card = intel_backlight
 | 
			
		||||
card = amdgpu_bl0
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label> (default)
 | 
			
		||||
;   <ramp>
 | 
			
		||||
;   <bar>
 | 
			
		||||
format = <ramp> <bar>
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage% (default)
 | 
			
		||||
label = %percentage%%
 | 
			
		||||
 | 
			
		||||
; Only applies if <ramp> is used
 | 
			
		||||
ramp-0 = 
 | 
			
		||||
ramp-1 = 
 | 
			
		||||
ramp-2 = 
 | 
			
		||||
ramp-3 = 
 | 
			
		||||
ramp-4 = 
 | 
			
		||||
 | 
			
		||||
; Only applies if <bar> is used
 | 
			
		||||
bar-width = 10
 | 
			
		||||
bar-gradient = false
 | 
			
		||||
 | 
			
		||||
bar-indicator = ${bar.indicator}
 | 
			
		||||
bar-indicator-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-fill = ${bar.fill}
 | 
			
		||||
bar-foreground-0 = ${color.foreground}
 | 
			
		||||
bar-foreground-1 = ${color.foreground}
 | 
			
		||||
bar-foreground-2 = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-empty = ${bar.empty}
 | 
			
		||||
bar-empty-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/battery_bar]
 | 
			
		||||
type = internal/battery
 | 
			
		||||
 | 
			
		||||
; This is useful in case the battery never reports 100% charge
 | 
			
		||||
full-at = 99
 | 
			
		||||
 | 
			
		||||
; Use the following command to list batteries and adapters:
 | 
			
		||||
; $ ls -1 /sys/class/power_supply/
 | 
			
		||||
battery = BAT1
 | 
			
		||||
adapter = ACAD
 | 
			
		||||
 | 
			
		||||
; If an inotify event haven't been reported in this many
 | 
			
		||||
; seconds, manually poll for new values.
 | 
			
		||||
;
 | 
			
		||||
; Needed as a fallback for systems that don't report events
 | 
			
		||||
; on sysfs/procfs.
 | 
			
		||||
;
 | 
			
		||||
; Disable polling by setting the interval to 0.
 | 
			
		||||
;
 | 
			
		||||
; Default: 5
 | 
			
		||||
poll-interval = 2
 | 
			
		||||
 | 
			
		||||
; see "man date" for details on how to format the time string
 | 
			
		||||
; NOTE: if you want to use syntax tags here you need to use %%{...}
 | 
			
		||||
; Default: %H:%M:%S
 | 
			
		||||
time-format = %H:%M
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-charging> (default)
 | 
			
		||||
;   <bar-capacity>
 | 
			
		||||
;   <ramp-capacity>
 | 
			
		||||
;   <animation-charging>
 | 
			
		||||
format-charging = <bar-capacity>
 | 
			
		||||
format-charging-prefix = " "
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-discharging> (default)
 | 
			
		||||
;   <bar-capacity>
 | 
			
		||||
;   <ramp-capacity>
 | 
			
		||||
;   <animation-discharging>
 | 
			
		||||
format-discharging = <bar-capacity>
 | 
			
		||||
format-discharging-prefix = " " 
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-full> (default)
 | 
			
		||||
;   <bar-capacity>
 | 
			
		||||
;   <ramp-capacity>
 | 
			
		||||
format-full = <label-full>
 | 
			
		||||
format-full-prefix = " "
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage% (default)
 | 
			
		||||
;   %time%
 | 
			
		||||
;   %consumption% (shows current charge rate in watts)
 | 
			
		||||
 | 
			
		||||
label-charging = %percentage%%
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage% (default)
 | 
			
		||||
;   %time%
 | 
			
		||||
;   %consumption% (shows current discharge rate in watts)
 | 
			
		||||
label-discharging = %percentage%%
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage% (default)
 | 
			
		||||
label-full = " Full"
 | 
			
		||||
 | 
			
		||||
; Only applies if <bar-capacity> is used
 | 
			
		||||
bar-capacity-width = 10
 | 
			
		||||
bar-capacity-gradient = false
 | 
			
		||||
 | 
			
		||||
bar-capacity-indicator = ${bar.indicator}
 | 
			
		||||
bar-capacity-indicator-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-capacity-fill = ${bar.fill}
 | 
			
		||||
bar-capacity-foreground-0 = ${color.foreground}
 | 
			
		||||
bar-capacity-foreground-1 = ${color.foreground}
 | 
			
		||||
bar-capacity-foreground-2 = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-capacity-empty = ${bar.empty}
 | 
			
		||||
bar-capacity-empty-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/cpu_bar]
 | 
			
		||||
type = internal/cpu
 | 
			
		||||
 | 
			
		||||
; Seconds to sleep between updates
 | 
			
		||||
; Default: 1
 | 
			
		||||
interval = 0.5
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label> (default)
 | 
			
		||||
;   <bar-load>
 | 
			
		||||
;   <ramp-load>
 | 
			
		||||
;   <ramp-coreload>
 | 
			
		||||
;;format = <label> <ramp-coreload>
 | 
			
		||||
format = <bar-load> <label>
 | 
			
		||||
format-prefix = " "
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage% (default) - total cpu load averaged over all cores
 | 
			
		||||
;   %percentage-sum% - Cumulative load on all cores
 | 
			
		||||
;   %percentage-cores% - load percentage for each core
 | 
			
		||||
;   %percentage-core[1-9]% - load percentage for specific core
 | 
			
		||||
label = "%percentage%%"
 | 
			
		||||
 | 
			
		||||
; Only applies if <bar-load> is used
 | 
			
		||||
bar-load-width = 10
 | 
			
		||||
bar-load-gradient = false
 | 
			
		||||
 | 
			
		||||
bar-load-indicator = ${bar.indicator}
 | 
			
		||||
bar-load-indicator-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-load-fill = ${bar.fill}
 | 
			
		||||
bar-load-foreground-0 = ${color.foreground}
 | 
			
		||||
bar-load-foreground-1 = ${color.foreground}
 | 
			
		||||
bar-load-foreground-2 = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-load-empty = ${bar.empty}
 | 
			
		||||
bar-load-empty-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/filesystem_bar]
 | 
			
		||||
type = internal/fs
 | 
			
		||||
 | 
			
		||||
; Mountpoints to display
 | 
			
		||||
mount-0 = /
 | 
			
		||||
;;mount-1 = /home
 | 
			
		||||
;;mount-2 = /var
 | 
			
		||||
 | 
			
		||||
; Seconds to sleep between updates
 | 
			
		||||
; Default: 30
 | 
			
		||||
interval = 30
 | 
			
		||||
 | 
			
		||||
; Display fixed precision values
 | 
			
		||||
; Default: false
 | 
			
		||||
fixed-values = false
 | 
			
		||||
 | 
			
		||||
; Spacing between entries
 | 
			
		||||
; Default: 2
 | 
			
		||||
;;spacing = 4
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-mounted> (default)
 | 
			
		||||
;   <bar-free>
 | 
			
		||||
;   <bar-used>
 | 
			
		||||
;   <ramp-capacity>
 | 
			
		||||
format-mounted = <bar-used> <label-mounted>
 | 
			
		||||
format-mounted-prefix = " "
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-unmounted> (default)
 | 
			
		||||
format-unmounted = <label-unmounted>
 | 
			
		||||
format-unmounted-prefix = " "
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %mountpoint%
 | 
			
		||||
;   %type%
 | 
			
		||||
;   %fsname%
 | 
			
		||||
;   %percentage_free%
 | 
			
		||||
;   %percentage_used%
 | 
			
		||||
;   %total%
 | 
			
		||||
;   %free%
 | 
			
		||||
;   %used%
 | 
			
		||||
; Default: %mountpoint% %percentage_free%%
 | 
			
		||||
label-mounted = %used%/%total%
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %mountpoint%
 | 
			
		||||
; Default: %mountpoint% is not mounted
 | 
			
		||||
label-unmounted = "%mountpoint%: not mounted"
 | 
			
		||||
 | 
			
		||||
; Only applies if <bar-used> is used
 | 
			
		||||
bar-used-width = 10
 | 
			
		||||
bar-used-gradient = false
 | 
			
		||||
 | 
			
		||||
bar-used-indicator = ${bar.indicator}
 | 
			
		||||
bar-used-indicator-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-used-fill = ${bar.fill}
 | 
			
		||||
bar-used-foreground-0 = ${color.foreground}
 | 
			
		||||
bar-used-foreground-1 = ${color.foreground}
 | 
			
		||||
bar-used-foreground-2 = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-used-empty = ${bar.empty}
 | 
			
		||||
bar-used-empty-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/memory_bar]
 | 
			
		||||
type = internal/memory
 | 
			
		||||
 | 
			
		||||
; Seconds to sleep between updates
 | 
			
		||||
; Default: 1
 | 
			
		||||
interval = 2
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label> (default)
 | 
			
		||||
;   <bar-used>
 | 
			
		||||
;   <bar-free>
 | 
			
		||||
;   <ramp-used>
 | 
			
		||||
;   <ramp-free>
 | 
			
		||||
;   <bar-swap-used>
 | 
			
		||||
;   <bar-swap-free>
 | 
			
		||||
;   <ramp-swap-used>
 | 
			
		||||
;   <ramp-swap-free>
 | 
			
		||||
format = <bar-used> <label>
 | 
			
		||||
format-prefix = " "
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage_used% (default)
 | 
			
		||||
;   %percentage_free%
 | 
			
		||||
;   %gb_used%
 | 
			
		||||
;   %gb_free%
 | 
			
		||||
;   %gb_total%
 | 
			
		||||
;   %mb_used%
 | 
			
		||||
;   %mb_free%
 | 
			
		||||
;   %mb_total%
 | 
			
		||||
;   %percentage_swap_used%
 | 
			
		||||
;   %percentage_swap_free%
 | 
			
		||||
;   %mb_swap_total%
 | 
			
		||||
;   %mb_swap_free%
 | 
			
		||||
;   %mb_swap_used%
 | 
			
		||||
;   %gb_swap_total%
 | 
			
		||||
;   %gb_swap_free%
 | 
			
		||||
;   %gb_swap_used%
 | 
			
		||||
 | 
			
		||||
label = "%mb_used%"
 | 
			
		||||
 | 
			
		||||
; Only applies if <bar-used> is used
 | 
			
		||||
bar-used-width = 10
 | 
			
		||||
bar-used-gradient = false
 | 
			
		||||
 | 
			
		||||
bar-used-indicator = ${bar.indicator}
 | 
			
		||||
bar-used-indicator-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-used-fill = ${bar.fill}
 | 
			
		||||
bar-used-foreground-0 = ${color.foreground}
 | 
			
		||||
bar-used-foreground-1 = ${color.foreground}
 | 
			
		||||
bar-used-foreground-2 = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-used-empty = ${bar.empty}
 | 
			
		||||
bar-used-empty-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/mpd_bar]
 | 
			
		||||
type = internal/mpd
 | 
			
		||||
 | 
			
		||||
; Host where mpd is running (either ip or domain name)
 | 
			
		||||
; Can also be the full path to a unix socket where mpd is running.
 | 
			
		||||
;;host = 127.0.0.1
 | 
			
		||||
;;port = 6600
 | 
			
		||||
;;password = mysecretpassword
 | 
			
		||||
 | 
			
		||||
; Seconds to sleep between progressbar/song timer sync
 | 
			
		||||
; Default: 1
 | 
			
		||||
interval = 1
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-song> (default)
 | 
			
		||||
;   <label-time>
 | 
			
		||||
;   <bar-progress>
 | 
			
		||||
;   <toggle> - gets replaced with <icon-(pause|play)>
 | 
			
		||||
;   <toggle-stop> - gets replaced with <icon-(stop|play)>
 | 
			
		||||
;   <icon-random>
 | 
			
		||||
;   <icon-repeat>
 | 
			
		||||
;   <icon-repeatone> (deprecated)
 | 
			
		||||
;   <icon-single> - Toggle playing only a single song. Replaces <icon-repeatone>
 | 
			
		||||
;   <icon-consume>
 | 
			
		||||
;   <icon-prev>
 | 
			
		||||
;   <icon-stop>
 | 
			
		||||
;   <icon-play>
 | 
			
		||||
;   <icon-pause>
 | 
			
		||||
;   <icon-next>
 | 
			
		||||
;   <icon-seekb>
 | 
			
		||||
;   <icon-seekf>
 | 
			
		||||
format-online = <label-song> <bar-progress> <label-time>
 | 
			
		||||
format-online-prefix = 
 | 
			
		||||
 | 
			
		||||
;format-playing = ${self.format-online}
 | 
			
		||||
;format-paused = ${self.format-online}
 | 
			
		||||
;format-stopped = ${self.format-online}
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-offline>
 | 
			
		||||
format-offline = <label-offline>
 | 
			
		||||
format-offline-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %artist%
 | 
			
		||||
;   %album-artist%
 | 
			
		||||
;   %album%
 | 
			
		||||
;   %date%
 | 
			
		||||
;   %title%
 | 
			
		||||
; Default: %artist% - %title%
 | 
			
		||||
label-song =  " %artist% - %title%"
 | 
			
		||||
label-song-maxlen = 25
 | 
			
		||||
label-song-ellipsis = true
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %elapsed%
 | 
			
		||||
;   %total%
 | 
			
		||||
; Default: %elapsed% / %total%
 | 
			
		||||
label-time = %elapsed% / %total%
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   None
 | 
			
		||||
label-offline = " Offline"
 | 
			
		||||
 | 
			
		||||
; Only applies if <icon-X> is used
 | 
			
		||||
icon-play = 
 | 
			
		||||
icon-pause = 
 | 
			
		||||
icon-stop = 
 | 
			
		||||
icon-next = 
 | 
			
		||||
icon-prev = 
 | 
			
		||||
icon-seekf = 
 | 
			
		||||
icon-seekb = 
 | 
			
		||||
icon-random = 
 | 
			
		||||
icon-repeat = 
 | 
			
		||||
icon-repeatone = 
 | 
			
		||||
icon-single = 
 | 
			
		||||
icon-consume =
 | 
			
		||||
 | 
			
		||||
; Used to display the state of random/repeat/repeatone/single
 | 
			
		||||
; Only applies if <icon-[random|repeat|repeatone|single]> is used
 | 
			
		||||
toggle-on-foreground = ${color.primary}
 | 
			
		||||
toggle-off-foreground = ${color.secondary}
 | 
			
		||||
 | 
			
		||||
; Only applies if <bar-progress> is used
 | 
			
		||||
bar-progress-width = 10
 | 
			
		||||
bar-progress-gradient = false
 | 
			
		||||
 | 
			
		||||
bar-progress-indicator = ${bar.indicator}
 | 
			
		||||
bar-progress-indicator-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-progress-fill = ${bar.fill}
 | 
			
		||||
bar-progress-foreground-0 = ${color.foreground}
 | 
			
		||||
bar-progress-foreground-1 = ${color.foreground}
 | 
			
		||||
bar-progress-foreground-2 = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
bar-progress-empty = ${bar.empty}
 | 
			
		||||
bar-progress-empty-foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
							
								
								
									
										9
									
								
								modules/nixos/config/polybar/colors.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								modules/nixos/config/polybar/colors.ini
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
[color]
 | 
			
		||||
 | 
			
		||||
background = #1F1F1F
 | 
			
		||||
foreground = #FFFFFF
 | 
			
		||||
foreground-alt = #8F8F8F
 | 
			
		||||
module-fg = #FFFFFF
 | 
			
		||||
primary = #546e7a
 | 
			
		||||
secondary = #E53935
 | 
			
		||||
alternate = #7cb342
 | 
			
		||||
							
								
								
									
										215
									
								
								modules/nixos/config/polybar/config.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										215
									
								
								modules/nixos/config/polybar/config.ini
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,215 @@
 | 
			
		||||
[global/wm]
 | 
			
		||||
; Adjust the _NET_WM_STRUT_PARTIAL top value
 | 
			
		||||
; Used for top aligned bars
 | 
			
		||||
margin-bottom = 0
 | 
			
		||||
 | 
			
		||||
; Adjust the _NET_WM_STRUT_PARTIAL bottom value
 | 
			
		||||
; Used for bottom aligned bars
 | 
			
		||||
margin-top = 0
 | 
			
		||||
 | 
			
		||||
;; Bar Settings
 | 
			
		||||
 | 
			
		||||
[bar/main]
 | 
			
		||||
; Use either of the following command to list available outputs:
 | 
			
		||||
; If unspecified, the application will pick the first one it finds.
 | 
			
		||||
; $ polybar -m | cut -d ':' -f 1
 | 
			
		||||
; $ xrandr -q | grep " connected" | cut -d ' ' -f1
 | 
			
		||||
monitor =
 | 
			
		||||
 | 
			
		||||
; Use the specified monitor as a fallback if the main one is not found.
 | 
			
		||||
monitor-fallback =
 | 
			
		||||
 | 
			
		||||
; Require the monitor to be in connected state
 | 
			
		||||
; XRandR sometimes reports my monitor as being disconnected (when in use)
 | 
			
		||||
monitor-strict = false
 | 
			
		||||
 | 
			
		||||
; Tell the Window Manager not to configure the window.
 | 
			
		||||
; Use this to detach the bar if your WM is locking its size/position.
 | 
			
		||||
override-redirect = false
 | 
			
		||||
 | 
			
		||||
; Put the bar at the bottom of the screen
 | 
			
		||||
bottom = false
 | 
			
		||||
 | 
			
		||||
; Prefer fixed center position for the `modules-center` block
 | 
			
		||||
; When false, the center position will be based on the size of the other blocks.
 | 
			
		||||
fixed-center = true
 | 
			
		||||
 | 
			
		||||
; Dimension defined as pixel value (e.g. 35) or percentage (e.g. 50%),
 | 
			
		||||
; the percentage can optionally be extended with a pixel offset like so:
 | 
			
		||||
; 50%:-10, this will result in a width or height of 50% minus 10 pixels
 | 
			
		||||
width = 98%
 | 
			
		||||
height = 40
 | 
			
		||||
 | 
			
		||||
; Offset defined as pixel value (e.g. 35) or percentage (e.g. 50%)
 | 
			
		||||
; the percentage can optionally be extended with a pixel offset like so:
 | 
			
		||||
; 50%:-10, this will result in an offset in the x or y direction 
 | 
			
		||||
; of 50% minus 10 pixels
 | 
			
		||||
offset-x = 1%
 | 
			
		||||
offset-y = 2%:-12
 | 
			
		||||
 | 
			
		||||
; Background ARGB color (e.g. #f00, #ff992a, #ddff1023)
 | 
			
		||||
background = ${color.background}
 | 
			
		||||
 | 
			
		||||
; Foreground ARGB color (e.g. #f00, #ff992a, #ddff1023)
 | 
			
		||||
foreground = ${color.foreground}
 | 
			
		||||
 | 
			
		||||
; Value used for drawing rounded corners
 | 
			
		||||
; Individual top/bottom values can be defined using:
 | 
			
		||||
;   radius-{top,bottom}
 | 
			
		||||
radius-top = 2.0
 | 
			
		||||
radius-bottom = 2.0
 | 
			
		||||
 | 
			
		||||
; Under-/overline pixel size and argb color
 | 
			
		||||
; Individual values can be defined using:
 | 
			
		||||
;   {overline,underline}-size
 | 
			
		||||
;   {overline,underline}-color
 | 
			
		||||
line-size = 2
 | 
			
		||||
line-color = ${color.primary}
 | 
			
		||||
 | 
			
		||||
; Values applied to all borders
 | 
			
		||||
; Individual side values can be defined using:
 | 
			
		||||
;   border-{left,top,right,bottom}-size
 | 
			
		||||
;   border-{left,top,right,bottom}-color
 | 
			
		||||
border-bottom-size = 0
 | 
			
		||||
border-bottom-color = ${color.primary}
 | 
			
		||||
 | 
			
		||||
; Number of spaces to add at the beginning/end of the bar
 | 
			
		||||
; Individual side values can be defined using:
 | 
			
		||||
;   padding-{left,right}
 | 
			
		||||
padding = 0
 | 
			
		||||
 | 
			
		||||
; Number of spaces to add before/after each module
 | 
			
		||||
; Individual side values can be defined using:
 | 
			
		||||
;   module-margin-{left,right}
 | 
			
		||||
module-margin-left = 2
 | 
			
		||||
module-margin-right = 2
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
; Fonts
 | 
			
		||||
font-0 = "@font0@"
 | 
			
		||||
font-1 = "@font1@"
 | 
			
		||||
 | 
			
		||||
; Modules
 | 
			
		||||
modules-left = launcher workspaces
 | 
			
		||||
modules-center = date popup-calendar
 | 
			
		||||
modules-right = pulseaudio memory cpu updates sysmenu
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
; The separator will be inserted between the output of each module
 | 
			
		||||
separator =
 | 
			
		||||
 | 
			
		||||
; Opacity value between 0.0 and 1.0 used on fade in/out
 | 
			
		||||
dim-value = 1.0
 | 
			
		||||
 | 
			
		||||
; Value to be used to set the WM_NAME atom
 | 
			
		||||
; If the value is empty or undefined, the atom value
 | 
			
		||||
; will be created from the following template: polybar-[BAR]_[MONITOR]
 | 
			
		||||
wm-name = bspwm
 | 
			
		||||
 | 
			
		||||
; Locale used to localize various module data (e.g. date)
 | 
			
		||||
; Expects a valid libc locale, for example: sv_SE.UTF-8
 | 
			
		||||
locale = 
 | 
			
		||||
 | 
			
		||||
; Position of the system tray window
 | 
			
		||||
; If empty or undefined, tray support will be disabled
 | 
			
		||||
; NOTE: A center aligned tray will cover center aligned modules
 | 
			
		||||
;
 | 
			
		||||
; Available positions:
 | 
			
		||||
;   left
 | 
			
		||||
;   center
 | 
			
		||||
;   right
 | 
			
		||||
;   none
 | 
			
		||||
tray-position = none
 | 
			
		||||
 | 
			
		||||
; If true, the bar will not shift its
 | 
			
		||||
; contents when the tray changes
 | 
			
		||||
tray-detached = false
 | 
			
		||||
 | 
			
		||||
; Tray icon max size
 | 
			
		||||
tray-maxsize = 16
 | 
			
		||||
 | 
			
		||||
; Background color for the tray container 
 | 
			
		||||
; ARGB color (e.g. #f00, #ff992a, #ddff1023)
 | 
			
		||||
; By default the tray container will use the bar
 | 
			
		||||
; background color.
 | 
			
		||||
tray-background = ${color.background}
 | 
			
		||||
 | 
			
		||||
; Tray offset defined as pixel value (e.g. 35) or percentage (e.g. 50%)
 | 
			
		||||
tray-offset-x = 0
 | 
			
		||||
tray-offset-y = 0
 | 
			
		||||
 | 
			
		||||
; Pad the sides of each tray icon
 | 
			
		||||
tray-padding = 0
 | 
			
		||||
 | 
			
		||||
; Scale factor for tray clients
 | 
			
		||||
tray-scale = 1.0
 | 
			
		||||
 | 
			
		||||
; Restack the bar window and put it above the
 | 
			
		||||
; selected window manager's root
 | 
			
		||||
;
 | 
			
		||||
; Fixes the issue where the bar is being drawn
 | 
			
		||||
; on top of fullscreen window's
 | 
			
		||||
;
 | 
			
		||||
; Available options:
 | 
			
		||||
;   bspwm
 | 
			
		||||
;   i3 (requires: `override-redirect = true`)
 | 
			
		||||
wm-restack = bspwm
 | 
			
		||||
 | 
			
		||||
; Set a DPI values used when rendering text
 | 
			
		||||
; This only affects scalable fonts
 | 
			
		||||
; dpi = 
 | 
			
		||||
 | 
			
		||||
; Enable support for inter-process messaging
 | 
			
		||||
; See the Messaging wiki page for more details.
 | 
			
		||||
enable-ipc = true
 | 
			
		||||
 | 
			
		||||
; Fallback click handlers that will be called if
 | 
			
		||||
; there's no matching module handler found.
 | 
			
		||||
click-left = 
 | 
			
		||||
click-middle = bspc desktop -l next
 | 
			
		||||
click-right =
 | 
			
		||||
double-click-left =
 | 
			
		||||
double-click-middle =
 | 
			
		||||
double-click-right =
 | 
			
		||||
 | 
			
		||||
; Requires polybar to be built with xcursor support (xcb-util-cursor)
 | 
			
		||||
; Possible values are:
 | 
			
		||||
; - default   : The default pointer as before, can also be an empty string (default)
 | 
			
		||||
; - pointer   : Typically in the form of a hand
 | 
			
		||||
; - ns-resize : Up and down arrows, can be used to indicate scrolling
 | 
			
		||||
cursor-click = 
 | 
			
		||||
cursor-scroll = 
 | 
			
		||||
 | 
			
		||||
; bspwm
 | 
			
		||||
scroll-up = bspc desktop -f prev.local
 | 
			
		||||
scroll-down = bspc desktop -f next.local
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
;; Application Settings
 | 
			
		||||
 | 
			
		||||
[settings]
 | 
			
		||||
; The throttle settings lets the eventloop swallow up til X events
 | 
			
		||||
; if they happen within Y millisecond after first event was received.
 | 
			
		||||
throttle-output = 5
 | 
			
		||||
throttle-output-for = 10
 | 
			
		||||
 | 
			
		||||
; Time in milliseconds that the input handler will wait between processing events
 | 
			
		||||
;throttle-input-for = 30
 | 
			
		||||
 | 
			
		||||
; Reload upon receiving XCB_RANDR_SCREEN_CHANGE_NOTIFY events
 | 
			
		||||
screenchange-reload = false
 | 
			
		||||
 | 
			
		||||
; Compositing operators
 | 
			
		||||
; @see: https://www.cairographics.org/manual/cairo-cairo-t.html#cairo-operator-t
 | 
			
		||||
compositing-background = source
 | 
			
		||||
compositing-foreground = over
 | 
			
		||||
compositing-overline = over
 | 
			
		||||
compositing-underline = over
 | 
			
		||||
compositing-border = over
 | 
			
		||||
 | 
			
		||||
; Enables pseudo-transparency for the bar
 | 
			
		||||
; If set to true the bar can be transparent without a compositor.
 | 
			
		||||
pseudo-transparency = false
 | 
			
		||||
							
								
								
									
										674
									
								
								modules/nixos/config/polybar/modules.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										674
									
								
								modules/nixos/config/polybar/modules.ini
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,674 @@
 | 
			
		||||
;; ┌────────────────────────────────────────────────────────────────┐
 | 
			
		||||
;; │░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄░░░░░░░░░█▄█░█▀█░█▀▄░█░█░█░░░█▀▀░█▀▀│
 | 
			
		||||
;; │░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄░░░░▀░░░░█░█░█░█░█░█░█░█░█░░░█▀▀░▀▀█│
 | 
			
		||||
;; │░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀░░░░▀░░░░▀░▀░▀▀▀░▀▀░░▀▀▀░▀▀▀░▀▀▀░▀▀▀│
 | 
			
		||||
;; │░Created░By░Aditya░Shakya░@adi1090x░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
 | 
			
		||||
;; └────────────────────────────────────────────────────────────────┘
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/alsa]
 | 
			
		||||
type = internal/alsa
 | 
			
		||||
 | 
			
		||||
; Soundcard to be used
 | 
			
		||||
; Usually in the format hw:# where # is the card number
 | 
			
		||||
; You can find the different card numbers in `/proc/asound/cards`
 | 
			
		||||
master-soundcard = default
 | 
			
		||||
speaker-soundcard = default
 | 
			
		||||
headphone-soundcard = default
 | 
			
		||||
 | 
			
		||||
; Name of the master, speaker and headphone mixers
 | 
			
		||||
; Use the following command to list available mixer controls:
 | 
			
		||||
; $ amixer scontrols | sed -nr "s/.*'([[:alnum:]]+)'.*/\1/p"
 | 
			
		||||
; If master, speaker or headphone-soundcard isn't the default, 
 | 
			
		||||
; use `amixer -c # scontrols` instead where # is the number 
 | 
			
		||||
; of the master, speaker or headphone soundcard respectively
 | 
			
		||||
;
 | 
			
		||||
; Default: Master
 | 
			
		||||
master-mixer = Master
 | 
			
		||||
 | 
			
		||||
; Optionally define speaker and headphone mixers
 | 
			
		||||
; Default: none
 | 
			
		||||
;;speaker-mixer = Speaker
 | 
			
		||||
; Default: none
 | 
			
		||||
;;headphone-mixer = Headphone
 | 
			
		||||
 | 
			
		||||
; NOTE: This is required if headphone_mixer is defined
 | 
			
		||||
; Use the following command to list available device controls
 | 
			
		||||
; $ amixer controls | sed -r "/CARD/\!d; s/.*=([0-9]+).*name='([^']+)'.*/printf '%3.0f: %s\n' '\1' '\2'/e" | sort
 | 
			
		||||
; You may also need to use `amixer -c # controls` as above for the mixer names
 | 
			
		||||
; Default: none
 | 
			
		||||
;;headphone-id = 9
 | 
			
		||||
 | 
			
		||||
; Use volume mapping (similar to amixer -M and alsamixer), where the increase in volume is linear to the ear
 | 
			
		||||
; Default: false
 | 
			
		||||
;;mapped = true
 | 
			
		||||
 | 
			
		||||
; Interval for volume increase/decrease (in percent points)
 | 
			
		||||
; Default: 5
 | 
			
		||||
interval = 5
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-volume> (default)
 | 
			
		||||
;   <ramp-volume>
 | 
			
		||||
;   <bar-volume>
 | 
			
		||||
format-volume = <ramp-volume> <label-volume>
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-muted> (default)
 | 
			
		||||
;   <ramp-volume>
 | 
			
		||||
;   <bar-volume>
 | 
			
		||||
format-muted = <label-muted>
 | 
			
		||||
format-muted-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage% (default)
 | 
			
		||||
label-volume = %percentage%%
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage% (default
 | 
			
		||||
label-muted = " Muted"
 | 
			
		||||
label-muted-foreground = ${color.foreground-alt}
 | 
			
		||||
 | 
			
		||||
; Only applies if <ramp-volume> is used
 | 
			
		||||
ramp-volume-0 = 
 | 
			
		||||
ramp-volume-1 = 
 | 
			
		||||
ramp-volume-2 = 
 | 
			
		||||
 | 
			
		||||
; If defined, it will replace <ramp-volume> when
 | 
			
		||||
; headphones are plugged in to `headphone_control_numid`
 | 
			
		||||
; If undefined, <ramp-volume> will be used for both
 | 
			
		||||
; Only applies if <ramp-volume> is used
 | 
			
		||||
ramp-headphones-0 = 
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/cpu]
 | 
			
		||||
type = internal/cpu
 | 
			
		||||
 | 
			
		||||
; Seconds to sleep between updates
 | 
			
		||||
; Default: 1
 | 
			
		||||
interval = 1
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label> (default)
 | 
			
		||||
;   <bar-load>
 | 
			
		||||
;   <ramp-load>
 | 
			
		||||
;   <ramp-coreload>
 | 
			
		||||
;;format = <label> <ramp-coreload>
 | 
			
		||||
format = <label>
 | 
			
		||||
format-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage% (default) - total cpu load averaged over all cores
 | 
			
		||||
;   %percentage-sum% - Cumulative load on all cores
 | 
			
		||||
;   %percentage-cores% - load percentage for each core
 | 
			
		||||
;   %percentage-core[1-9]% - load percentage for specific core
 | 
			
		||||
label = " %percentage%%"
 | 
			
		||||
 | 
			
		||||
; Spacing between individual per-core ramps
 | 
			
		||||
;;ramp-coreload-spacing = 1
 | 
			
		||||
;;ramp-coreload-0 = ${cpu.load0}
 | 
			
		||||
;;ramp-coreload-1 = ${cpu.load1}
 | 
			
		||||
 | 
			
		||||
;;ramp-load-0 = ${cpu.load0}
 | 
			
		||||
;;ramp-load-1 = ${cpu.load1}
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/date]
 | 
			
		||||
type = internal/date
 | 
			
		||||
 | 
			
		||||
; Seconds to sleep between updates
 | 
			
		||||
interval = 1.0
 | 
			
		||||
 | 
			
		||||
; See "http://en.cppreference.com/w/cpp/io/manip/put_time" for details on how to format the date string
 | 
			
		||||
; NOTE: if you want to use syntax tags here you need to use %%{...}
 | 
			
		||||
;;date = %Y-%m-%d%
 | 
			
		||||
 | 
			
		||||
; Optional time format
 | 
			
		||||
time = " %I:%M %p"
 | 
			
		||||
 | 
			
		||||
; if `date-alt` or `time-alt` is defined, clicking
 | 
			
		||||
; the module will toggle between formats
 | 
			
		||||
;;date-alt = %A, %d %B %Y
 | 
			
		||||
#time-alt = " %a, %d %b %Y"
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label> (default)
 | 
			
		||||
format = <label>
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %date%
 | 
			
		||||
;   %time%
 | 
			
		||||
; Default: %date%
 | 
			
		||||
label = %time%
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/filesystem]
 | 
			
		||||
type = internal/fs
 | 
			
		||||
 | 
			
		||||
; Mountpoints to display
 | 
			
		||||
mount-0 = /
 | 
			
		||||
;;mount-1 = /home
 | 
			
		||||
;;mount-2 = /var
 | 
			
		||||
 | 
			
		||||
; Seconds to sleep between updates
 | 
			
		||||
; Default: 30
 | 
			
		||||
interval = 30
 | 
			
		||||
 | 
			
		||||
; Display fixed precision values
 | 
			
		||||
; Default: false
 | 
			
		||||
fixed-values = true
 | 
			
		||||
 | 
			
		||||
; Spacing between entries
 | 
			
		||||
; Default: 2
 | 
			
		||||
;;spacing = 4
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-mounted> (default)
 | 
			
		||||
;   <bar-free>
 | 
			
		||||
;   <bar-used>
 | 
			
		||||
;   <ramp-capacity>
 | 
			
		||||
format-mounted = <label-mounted>
 | 
			
		||||
format-mounted-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-unmounted> (default)
 | 
			
		||||
format-unmounted = <label-unmounted>
 | 
			
		||||
format-unmounted-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %mountpoint%
 | 
			
		||||
;   %type%
 | 
			
		||||
;   %fsname%
 | 
			
		||||
;   %percentage_free%
 | 
			
		||||
;   %percentage_used%
 | 
			
		||||
;   %total%
 | 
			
		||||
;   %free%
 | 
			
		||||
;   %used%
 | 
			
		||||
; Default: %mountpoint% %percentage_free%%
 | 
			
		||||
label-mounted = " %free%"
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %mountpoint%
 | 
			
		||||
; Default: %mountpoint% is not mounted
 | 
			
		||||
label-unmounted = " %mountpoint%: not mounted"
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/memory]
 | 
			
		||||
type = internal/memory
 | 
			
		||||
 | 
			
		||||
; Seconds to sleep between updates
 | 
			
		||||
; Default: 1
 | 
			
		||||
interval = 1
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label> (default)
 | 
			
		||||
;   <bar-used>
 | 
			
		||||
;   <bar-free>
 | 
			
		||||
;   <ramp-used>
 | 
			
		||||
;   <ramp-free>
 | 
			
		||||
;   <bar-swap-used>
 | 
			
		||||
;   <bar-swap-free>
 | 
			
		||||
;   <ramp-swap-used>
 | 
			
		||||
;   <ramp-swap-free>
 | 
			
		||||
format = <label>
 | 
			
		||||
format-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage_used% (default)
 | 
			
		||||
;   %percentage_free%
 | 
			
		||||
;   %gb_used%
 | 
			
		||||
;   %gb_free%
 | 
			
		||||
;   %gb_total%
 | 
			
		||||
;   %mb_used%
 | 
			
		||||
;   %mb_free%
 | 
			
		||||
;   %mb_total%
 | 
			
		||||
;   %percentage_swap_used%
 | 
			
		||||
;   %percentage_swap_free%
 | 
			
		||||
;   %mb_swap_total%
 | 
			
		||||
;   %mb_swap_free%
 | 
			
		||||
;   %mb_swap_used%
 | 
			
		||||
;   %gb_swap_total%
 | 
			
		||||
;   %gb_swap_free%
 | 
			
		||||
;   %gb_swap_used%
 | 
			
		||||
 | 
			
		||||
label = " %mb_used%"
 | 
			
		||||
 | 
			
		||||
; Only applies if <ramp-used> is used
 | 
			
		||||
;;ramp-used-0 = ${memory.used0}
 | 
			
		||||
;;ramp-used-1 = ${memory.used1}
 | 
			
		||||
;;ramp-used-2 = ${memory.used2}
 | 
			
		||||
 | 
			
		||||
; Only applies if <ramp-free> is used
 | 
			
		||||
;;ramp-free-0 = ${memory.free0}
 | 
			
		||||
;;ramp-free-1 = ${memory.free1}
 | 
			
		||||
;;ramp-free-2 = ${memory.free2}
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/mpd]
 | 
			
		||||
type = internal/mpd
 | 
			
		||||
 | 
			
		||||
; Host where mpd is running (either ip or domain name)
 | 
			
		||||
; Can also be the full path to a unix socket where mpd is running.
 | 
			
		||||
;;host = 127.0.0.1
 | 
			
		||||
;;port = 6600
 | 
			
		||||
;;password = mysecretpassword
 | 
			
		||||
 | 
			
		||||
; Seconds to sleep between progressbar/song timer sync
 | 
			
		||||
; Default: 1
 | 
			
		||||
interval = 1
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-song> (default)
 | 
			
		||||
;   <label-time>
 | 
			
		||||
;   <bar-progress>
 | 
			
		||||
;   <toggle> - gets replaced with <icon-(pause|play)>
 | 
			
		||||
;   <toggle-stop> - gets replaced with <icon-(stop|play)>
 | 
			
		||||
;   <icon-random>
 | 
			
		||||
;   <icon-repeat>
 | 
			
		||||
;   <icon-repeatone> (deprecated)
 | 
			
		||||
;   <icon-single> - Toggle playing only a single song. Replaces <icon-repeatone>
 | 
			
		||||
;   <icon-consume>
 | 
			
		||||
;   <icon-prev>
 | 
			
		||||
;   <icon-stop>
 | 
			
		||||
;   <icon-play>
 | 
			
		||||
;   <icon-pause>
 | 
			
		||||
;   <icon-next>
 | 
			
		||||
;   <icon-seekb>
 | 
			
		||||
;   <icon-seekf>
 | 
			
		||||
format-online = <label-song> <icon-prev> <toggle> <icon-next>
 | 
			
		||||
format-online-prefix = 
 | 
			
		||||
 | 
			
		||||
;format-playing = ${self.format-online}
 | 
			
		||||
;format-paused = ${self.format-online}
 | 
			
		||||
;format-stopped = ${self.format-online}
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-offline>
 | 
			
		||||
format-offline = <label-offline>
 | 
			
		||||
format-offline-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %artist%
 | 
			
		||||
;   %album-artist%
 | 
			
		||||
;   %album%
 | 
			
		||||
;   %date%
 | 
			
		||||
;   %title%
 | 
			
		||||
; Default: %artist% - %title%
 | 
			
		||||
label-song =  " %artist% - %title%"
 | 
			
		||||
label-song-maxlen = 25
 | 
			
		||||
label-song-ellipsis = true
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %elapsed%
 | 
			
		||||
;   %total%
 | 
			
		||||
; Default: %elapsed% / %total%
 | 
			
		||||
label-time = %elapsed% / %total%
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   None
 | 
			
		||||
label-offline = " Offline"
 | 
			
		||||
 | 
			
		||||
; Only applies if <icon-X> is used
 | 
			
		||||
icon-play = 
 | 
			
		||||
icon-pause = 
 | 
			
		||||
icon-stop = 
 | 
			
		||||
icon-next = 
 | 
			
		||||
icon-prev = 
 | 
			
		||||
icon-seekf = 
 | 
			
		||||
icon-seekb = 
 | 
			
		||||
icon-random = 
 | 
			
		||||
icon-repeat = 
 | 
			
		||||
icon-repeatone = 
 | 
			
		||||
icon-single = 
 | 
			
		||||
icon-consume =
 | 
			
		||||
 | 
			
		||||
; Used to display the state of random/repeat/repeatone/single
 | 
			
		||||
; Only applies if <icon-[random|repeat|repeatone|single]> is used
 | 
			
		||||
toggle-on-foreground = ${color.primary}
 | 
			
		||||
toggle-off-foreground = ${color.secondary}
 | 
			
		||||
 | 
			
		||||
; Only applies if <bar-progress> is used
 | 
			
		||||
;;bar-progress-width = 45
 | 
			
		||||
;;bar-progress-indicator = |
 | 
			
		||||
;;bar-progress-fill = ─
 | 
			
		||||
;;bar-progress-empty = ─
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
; If you use both a wired and a wireless network, just add 2 module definitions. For example
 | 
			
		||||
[module/wired-network]
 | 
			
		||||
type = internal/network
 | 
			
		||||
interface = eth0
 | 
			
		||||
 | 
			
		||||
; Seconds to sleep between updates
 | 
			
		||||
; Default: 1
 | 
			
		||||
interval = 1.0
 | 
			
		||||
 | 
			
		||||
; Test connectivity every Nth update
 | 
			
		||||
; A value of 0 disables the feature
 | 
			
		||||
; NOTE: Experimental (needs more testing)
 | 
			
		||||
; Default: 0
 | 
			
		||||
;ping-interval = 3
 | 
			
		||||
 | 
			
		||||
; @deprecated: Define min width using token specifiers (%downspeed:min% and %upspeed:min%)
 | 
			
		||||
; Minimum output width of upload/download rate
 | 
			
		||||
; Default: 3
 | 
			
		||||
;;udspeed-minwidth = 5
 | 
			
		||||
 | 
			
		||||
; Accumulate values from all interfaces
 | 
			
		||||
; when querying for up/downspeed rate
 | 
			
		||||
; Default: false
 | 
			
		||||
accumulate-stats = true
 | 
			
		||||
 | 
			
		||||
; Consider an `UNKNOWN` interface state as up.
 | 
			
		||||
; Some devices have an unknown state, even when they're running
 | 
			
		||||
; Default: false
 | 
			
		||||
unknown-as-up = true
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-connected> (default)
 | 
			
		||||
;   <ramp-signal>
 | 
			
		||||
format-connected = <label-connected>
 | 
			
		||||
format-connected-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-disconnected> (default)
 | 
			
		||||
format-disconnected = <label-disconnected>
 | 
			
		||||
format-disconnected-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-connected> (default)
 | 
			
		||||
;   <label-packetloss>
 | 
			
		||||
;   <animation-packetloss>
 | 
			
		||||
;;format-packetloss = <animation-packetloss> <label-connected>
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %ifname%    [wireless+wired]
 | 
			
		||||
;   %local_ip%  [wireless+wired]
 | 
			
		||||
;   %local_ip6% [wireless+wired]
 | 
			
		||||
;   %essid%     [wireless]
 | 
			
		||||
;   %signal%    [wireless]
 | 
			
		||||
;   %upspeed%   [wireless+wired]
 | 
			
		||||
;   %downspeed% [wireless+wired]
 | 
			
		||||
;   %linkspeed% [wired]
 | 
			
		||||
; Default: %ifname% %local_ip%
 | 
			
		||||
label-connected = "%{A1:networkmanager_dmenu &:} %essid%%{A}"
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %ifname%    [wireless+wired]
 | 
			
		||||
; Default: (none)
 | 
			
		||||
label-disconnected = "%{A1:networkmanager_dmenu &:} Offline%{A}"
 | 
			
		||||
;;label-disconnected-foreground = #66ffffff
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %ifname%    [wireless+wired]
 | 
			
		||||
;   %local_ip%  [wireless+wired]
 | 
			
		||||
;   %local_ip6% [wireless+wired]
 | 
			
		||||
;   %essid%     [wireless]
 | 
			
		||||
;   %signal%    [wireless]
 | 
			
		||||
;   %upspeed%   [wireless+wired]
 | 
			
		||||
;   %downspeed% [wireless+wired]
 | 
			
		||||
;   %linkspeed% [wired]
 | 
			
		||||
; Default: (none)
 | 
			
		||||
;label-packetloss = %essid%
 | 
			
		||||
;label-packetloss-foreground = #eefafafa
 | 
			
		||||
 | 
			
		||||
; Only applies if <ramp-signal> is used
 | 
			
		||||
ramp-signal-0 = 
 | 
			
		||||
ramp-signal-1 = 
 | 
			
		||||
ramp-signal-2 = 
 | 
			
		||||
 | 
			
		||||
; Only applies if <animation-packetloss> is used
 | 
			
		||||
;;animation-packetloss-0 = ⚠
 | 
			
		||||
;;animation-packetloss-0-foreground = #ffa64c
 | 
			
		||||
;;animation-packetloss-1 = ⚠
 | 
			
		||||
;;animation-packetloss-1-foreground = #000000
 | 
			
		||||
; Framerate in milliseconds
 | 
			
		||||
;;animation-packetloss-framerate = 500
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/pulseaudio]
 | 
			
		||||
type = internal/pulseaudio
 | 
			
		||||
 | 
			
		||||
; Sink to be used, if it exists (find using `pacmd list-sinks`, name field)
 | 
			
		||||
; If not, uses default sink
 | 
			
		||||
; sink = @pulseaudiosink@
 | 
			
		||||
 | 
			
		||||
; Use PA_VOLUME_UI_MAX (~153%) if true, or PA_VOLUME_NORM (100%) if false
 | 
			
		||||
; Default: true
 | 
			
		||||
use-ui-max = false
 | 
			
		||||
 | 
			
		||||
; Interval for volume increase/decrease (in percent points)
 | 
			
		||||
; Default: 5
 | 
			
		||||
interval = 5
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-volume> (default)
 | 
			
		||||
;   <ramp-volume>
 | 
			
		||||
;   <bar-volume>
 | 
			
		||||
format-volume = <ramp-volume> <label-volume>
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-muted> (default)
 | 
			
		||||
;   <ramp-volume>
 | 
			
		||||
;   <bar-volume>
 | 
			
		||||
format-muted = <label-muted>
 | 
			
		||||
format-muted-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage% (default)
 | 
			
		||||
label-volume = %percentage%%
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %percentage% (default
 | 
			
		||||
label-muted = " Muted"
 | 
			
		||||
label-muted-foreground = ${color.foreground-alt}
 | 
			
		||||
 | 
			
		||||
; Only applies if <ramp-volume> is used
 | 
			
		||||
ramp-volume-0 = 
 | 
			
		||||
ramp-volume-1 = 
 | 
			
		||||
ramp-volume-2 = 
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/temperature]
 | 
			
		||||
type = internal/temperature
 | 
			
		||||
 | 
			
		||||
; Seconds to sleep between updates
 | 
			
		||||
; Default: 1
 | 
			
		||||
interval = 0.5
 | 
			
		||||
 | 
			
		||||
; Thermal zone to use
 | 
			
		||||
; To list all the zone types, run 
 | 
			
		||||
; $ for i in /sys/class/thermal/thermal_zone*; do echo "$i: $(<$i/type)"; done
 | 
			
		||||
; Default: 0
 | 
			
		||||
thermal-zone = 0
 | 
			
		||||
 | 
			
		||||
; Full path of temperature sysfs path
 | 
			
		||||
; Use `sensors` to find preferred temperature source, then run
 | 
			
		||||
; $ for i in /sys/class/hwmon/hwmon*/temp*_input; do echo "$(<$(dirname $i)/name): $(cat ${i%_*}_label 2>/dev/null || echo $(basename ${i%_*})) $(readlink -f $i)"; done
 | 
			
		||||
; to find path to desired file
 | 
			
		||||
; Default reverts to thermal zone setting
 | 
			
		||||
;;hwmon-path = /sys/devices/platform/coretemp.0/hwmon/hwmon2/temp1_input
 | 
			
		||||
hwmon-path = /sys/devices/pci0000:00/0000:00:01.3/0000:01:00.0/hwmon/hwmon0/temp1_input
 | 
			
		||||
 | 
			
		||||
; Threshold temperature to display warning label (in degrees celsius)
 | 
			
		||||
; Default: 80
 | 
			
		||||
warn-temperature = 65
 | 
			
		||||
 | 
			
		||||
; Whether or not to show units next to the temperature tokens (°C, °F)
 | 
			
		||||
; Default: true
 | 
			
		||||
units = true
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label> (default)
 | 
			
		||||
;   <ramp>
 | 
			
		||||
format = <ramp> <label>
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-warn> (default)
 | 
			
		||||
;   <ramp>
 | 
			
		||||
format-warn = <ramp> <label-warn>
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %temperature% (deprecated)
 | 
			
		||||
;   %temperature-c%   (default, temperature in °C)
 | 
			
		||||
;   %temperature-f%   (temperature in °F)
 | 
			
		||||
label = %temperature-c%
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %temperature% (deprecated)
 | 
			
		||||
;   %temperature-c%   (default, temperature in °C)
 | 
			
		||||
;   %temperature-f%   (temperature in °F)
 | 
			
		||||
label-warn = "%temperature-c%"
 | 
			
		||||
label-warn-foreground = ${color.secondary}
 | 
			
		||||
 | 
			
		||||
; Requires the <ramp> tag
 | 
			
		||||
; The icon selection will range from 0 to `warn-temperature`
 | 
			
		||||
; with the current temperature as index.
 | 
			
		||||
ramp-0 = 
 | 
			
		||||
ramp-1 = 
 | 
			
		||||
ramp-2 = 
 | 
			
		||||
ramp-3 = 
 | 
			
		||||
ramp-4 = 
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/keyboard]
 | 
			
		||||
type = internal/xkeyboard
 | 
			
		||||
 | 
			
		||||
; List of indicators to ignore
 | 
			
		||||
blacklist-0 = num lock
 | 
			
		||||
blacklist-1 = scroll lock
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-layout> (default)
 | 
			
		||||
;   <label-indicator> (default)
 | 
			
		||||
format = <label-layout> <label-indicator>
 | 
			
		||||
format-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %layout%
 | 
			
		||||
;   %name%
 | 
			
		||||
;   %number%
 | 
			
		||||
; Default: %layout%
 | 
			
		||||
label-layout = " %layout%"
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %name%
 | 
			
		||||
; Default: %name%
 | 
			
		||||
label-indicator-on = %name%
 | 
			
		||||
label-indicator-on-foreground = ${color.primary}
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/title]
 | 
			
		||||
type = internal/xwindow
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label> (default)
 | 
			
		||||
format = <label>
 | 
			
		||||
format-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %title%
 | 
			
		||||
; Default: %title%
 | 
			
		||||
label = " %title%"
 | 
			
		||||
label-maxlen = 30
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/workspaces]
 | 
			
		||||
type = internal/xworkspaces
 | 
			
		||||
 | 
			
		||||
; Only show workspaces defined on the same output as the bar
 | 
			
		||||
;
 | 
			
		||||
; Useful if you want to show monitor specific workspaces
 | 
			
		||||
; on different bars
 | 
			
		||||
;
 | 
			
		||||
; Default: false
 | 
			
		||||
pin-workspaces = true
 | 
			
		||||
 | 
			
		||||
; Create click handler used to focus desktop
 | 
			
		||||
; Default: true
 | 
			
		||||
enable-click = true
 | 
			
		||||
 | 
			
		||||
; Create scroll handlers used to cycle desktops
 | 
			
		||||
; Default: true
 | 
			
		||||
enable-scroll = true
 | 
			
		||||
 | 
			
		||||
; icon-[0-9]+ = <desktop-name>;<icon>
 | 
			
		||||
; NOTE: The desktop name needs to match the name configured by the WM
 | 
			
		||||
; You can get a list of the defined desktops using:
 | 
			
		||||
; $ xprop -root _NET_DESKTOP_NAMES
 | 
			
		||||
 | 
			
		||||
; Emacs, Calendar, News (General)
 | 
			
		||||
icon-0 = 1;
 | 
			
		||||
; Terminal, Emacs (IDE)
 | 
			
		||||
icon-1 = 2;
 | 
			
		||||
; Slack, Dev Tools Browser
 | 
			
		||||
icon-2 = 3;
 | 
			
		||||
; Chat, News (Financial)
 | 
			
		||||
icon-3 = 4;
 | 
			
		||||
; Apple Music, Media
 | 
			
		||||
icon-4 = 5;
 | 
			
		||||
; Monitoring, Emacs (Journal)
 | 
			
		||||
icon-5 = 6;
 | 
			
		||||
icon-default = 
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <label-monitor>
 | 
			
		||||
;   <label-state> - gets replaced with <label-(active|urgent|occupied|empty)>
 | 
			
		||||
; Default: <label-state>
 | 
			
		||||
format = <label-state>
 | 
			
		||||
format-padding = 0
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %name%
 | 
			
		||||
; Default: %name%
 | 
			
		||||
label-monitor = %name%
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %name%
 | 
			
		||||
;   %icon%
 | 
			
		||||
;   %index%
 | 
			
		||||
; Default: %icon%  %name%
 | 
			
		||||
label-active = %icon%
 | 
			
		||||
label-active-foreground = ${color.primary}
 | 
			
		||||
label-active-overline = ${color.primary}
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %name%
 | 
			
		||||
;   %icon%
 | 
			
		||||
;   %index%
 | 
			
		||||
; Default: %icon%  %name%
 | 
			
		||||
label-occupied = %icon%
 | 
			
		||||
label-occupied-foreground = ${color.alternate}
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %name%
 | 
			
		||||
;   %icon%
 | 
			
		||||
;   %index%
 | 
			
		||||
; Default: %icon%  %name%
 | 
			
		||||
label-urgent = %icon%
 | 
			
		||||
label-urgent-foreground = ${color.secondary}
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %name%
 | 
			
		||||
;   %icon%
 | 
			
		||||
;   %index%
 | 
			
		||||
; Default: %icon%  %name%
 | 
			
		||||
label-empty = %icon%
 | 
			
		||||
 | 
			
		||||
label-active-padding = 2
 | 
			
		||||
label-urgent-padding = 2
 | 
			
		||||
label-occupied-padding = 2
 | 
			
		||||
label-empty-padding = 2
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
							
								
								
									
										74
									
								
								modules/nixos/config/polybar/user_modules.ini
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								modules/nixos/config/polybar/user_modules.ini
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,74 @@
 | 
			
		||||
;; ┌──────────────────────────────────────────────────────────────────────────────-----┐
 | 
			
		||||
;; │░█▀█░█▀█░█░░░█░█░█▀▄░█▀█░█▀▄░░░░░░░░░█░█░█▀▀░█▀▀░█▀▄░░░█▄█░█▀█░█▀▄░█░█░█░░░█▀▀░█▀▀ │
 | 
			
		||||
;; │░█▀▀░█░█░█░░░░█░░█▀▄░█▀█░█▀▄░░░░▀░░░░█░█░▀▀█░█▀▀░█▀▄░░░█░█░█░█░█░█░█░█░█░░░█▀▀░▀▀█ │
 | 
			
		||||
;; │░▀░░░▀▀▀░▀▀▀░░▀░░▀▀░░▀░▀░▀░▀░░░░▀░░░░▀▀▀░▀▀▀░▀▀▀░▀░▀░░░▀░▀░▀▀▀░▀▀░░▀▀▀░▀▀▀░▀▀▀░▀▀▀ │
 | 
			
		||||
;; │░Created░By░Aditya░Shakya░@adi1090x░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░│
 | 
			
		||||
;; └──────────────────────────────────────────────────────────────────────────────-----┘
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/updates]
 | 
			
		||||
type = custom/script
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %counter%
 | 
			
		||||
; Command to be executed (using "/usr/bin/env sh -c [command]")
 | 
			
		||||
exec = @packages@
 | 
			
		||||
 | 
			
		||||
; Conditional command that, if defined, needs to exit successfully
 | 
			
		||||
; before the main exec command is invoked.
 | 
			
		||||
; Default: ""
 | 
			
		||||
;;exec-if = ""
 | 
			
		||||
 | 
			
		||||
; Will the script output continous content?
 | 
			
		||||
; Default: false
 | 
			
		||||
tail = true
 | 
			
		||||
 | 
			
		||||
; Seconds to sleep between updates
 | 
			
		||||
; Default: 2 (0 if `tail = true`)
 | 
			
		||||
interval = 0
 | 
			
		||||
 | 
			
		||||
; Available tags:
 | 
			
		||||
;   <output> - deprecated
 | 
			
		||||
;   <label> (default)
 | 
			
		||||
format = <label>
 | 
			
		||||
format-prefix = 
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %output%
 | 
			
		||||
; Default: %output%
 | 
			
		||||
label = %output%
 | 
			
		||||
 | 
			
		||||
; Available tokens:
 | 
			
		||||
;   %counter%
 | 
			
		||||
;   %pid%
 | 
			
		||||
;
 | 
			
		||||
click-left = @searchpkgs@
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/launcher]
 | 
			
		||||
type = custom/text
 | 
			
		||||
content =  
 | 
			
		||||
content-background = ${color.primary}
 | 
			
		||||
content-foreground = ${color.module-fg}
 | 
			
		||||
content-padding = 2
 | 
			
		||||
click-left = @launcher@
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
 | 
			
		||||
[module/popup-calendar]
 | 
			
		||||
type = custom/script
 | 
			
		||||
exec = @calendar@
 | 
			
		||||
interval = 5
 | 
			
		||||
click-left = @calendar@ --popup &
 | 
			
		||||
 | 
			
		||||
[module/sysmenu]
 | 
			
		||||
type = custom/text
 | 
			
		||||
content = 
 | 
			
		||||
content-background = ${color.primary}
 | 
			
		||||
content-foreground = ${color.module-fg}
 | 
			
		||||
content-padding = 2
 | 
			
		||||
click-left = @powermenu@ &
 | 
			
		||||
 | 
			
		||||
;; _-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_-_
 | 
			
		||||
							
								
								
									
										10
									
								
								modules/nixos/config/rofi/colors.rasi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								modules/nixos/config/rofi/colors.rasi
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,10 @@
 | 
			
		||||
/* colors */
 | 
			
		||||
 | 
			
		||||
* {
 | 
			
		||||
  al:   #00000000;
 | 
			
		||||
  bg:   #1F1F1FFF;
 | 
			
		||||
  bga:  #546e7a33;
 | 
			
		||||
  bar:  #FFFFFFFF;
 | 
			
		||||
  fg:   #FFFFFFFF;
 | 
			
		||||
  ac:   #546e7aFF;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								modules/nixos/config/rofi/confirm.rasi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								modules/nixos/config/rofi/confirm.rasi
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
/* Confirm Dialog */
 | 
			
		||||
 | 
			
		||||
@import "colors.rasi"
 | 
			
		||||
 | 
			
		||||
* {
 | 
			
		||||
    background-color:       @bg;
 | 
			
		||||
    text-color:             @fg;
 | 
			
		||||
	font:				 	"Iosevka Nerd Font 10";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
window {
 | 
			
		||||
    width:      			225px;
 | 
			
		||||
    padding:    			25px;
 | 
			
		||||
    border:					0px 0px 2px 0px;
 | 
			
		||||
    border-radius:          0px;
 | 
			
		||||
    border-color:           @ac;
 | 
			
		||||
    location:               center;
 | 
			
		||||
    y-offset:               -2em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
entry {
 | 
			
		||||
    expand: 				true;
 | 
			
		||||
    text-color:				@ac;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										119
									
								
								modules/nixos/config/rofi/launcher.rasi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								modules/nixos/config/rofi/launcher.rasi
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,119 @@
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Author  : Aditya Shakya
 | 
			
		||||
 * Mail    : adi1090x@gmail.com
 | 
			
		||||
 * Github  : @adi1090x
 | 
			
		||||
 * Twitter : @adi1090x
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
configuration {
 | 
			
		||||
	font:                "Iosevka Nerd Font 10";
 | 
			
		||||
	show-icons:          true;
 | 
			
		||||
	icon-theme:          "Papirus";
 | 
			
		||||
	display-drun:        "";
 | 
			
		||||
	drun-display-format: "{name}";
 | 
			
		||||
	disable-history:     false;
 | 
			
		||||
	fullscreen:          false;
 | 
			
		||||
	hide-scrollbar:      true;
 | 
			
		||||
	sidebar-mode:        false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@import "colors.rasi"
 | 
			
		||||
 | 
			
		||||
window {
 | 
			
		||||
	transparency:      "real";
 | 
			
		||||
	background-color:  @bg;
 | 
			
		||||
	text-color:        @fg;
 | 
			
		||||
	border:            0px 0px 2px 0px;
 | 
			
		||||
	border-color:      @ac;
 | 
			
		||||
	border-radius:     0px;
 | 
			
		||||
	width:             350px;
 | 
			
		||||
	location:          center;
 | 
			
		||||
	x-offset:          0;
 | 
			
		||||
	y-offset:          0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
prompt {
 | 
			
		||||
	enabled:          true;
 | 
			
		||||
	padding:          0px;
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	text-color:       @bar;
 | 
			
		||||
	font:             "feather 12";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
entry {
 | 
			
		||||
	background-color:     @al;
 | 
			
		||||
	text-color:           @bar;
 | 
			
		||||
	placeholder-color:    @bar;
 | 
			
		||||
	expand:               true;
 | 
			
		||||
	horizontal-align:     0;
 | 
			
		||||
	placeholder:          "Search...";
 | 
			
		||||
	padding:              0px 0px 0px 10px;
 | 
			
		||||
	blink:                true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inputbar {
 | 
			
		||||
	children:            [ prompt, entry ];
 | 
			
		||||
	background-color:     @ac;
 | 
			
		||||
	text-color:           @bar;
 | 
			
		||||
	expand:               false;
 | 
			
		||||
	border:               0px;
 | 
			
		||||
	border-radius:        0px;
 | 
			
		||||
	border-color:         @ac;
 | 
			
		||||
	margin:               0px;
 | 
			
		||||
	padding:              12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
listview {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	padding:          0px;
 | 
			
		||||
	columns:          1;
 | 
			
		||||
	lines:            5;
 | 
			
		||||
	spacing:          5px;
 | 
			
		||||
	cycle:            true;
 | 
			
		||||
	dynamic:          true;
 | 
			
		||||
	layout:           vertical;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mainbox {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	border:           0px;
 | 
			
		||||
	border-radius:    0px;
 | 
			
		||||
	border-color:     @ac;
 | 
			
		||||
	children:         [ inputbar, listview ];
 | 
			
		||||
	spacing:          0px;
 | 
			
		||||
	padding:          0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	text-color:       @fg;
 | 
			
		||||
	orientation:      horizontal;
 | 
			
		||||
	border-radius:    0px;
 | 
			
		||||
	padding:          10px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element-icon {
 | 
			
		||||
	background-color: transparent;
 | 
			
		||||
	text-color:       inherit;
 | 
			
		||||
	size:             24px;
 | 
			
		||||
	border:           0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element-text {
 | 
			
		||||
	background-color: transparent;
 | 
			
		||||
	text-color:       inherit;
 | 
			
		||||
	expand:           true;
 | 
			
		||||
	horizontal-align: 0;
 | 
			
		||||
	vertical-align:   0.5;
 | 
			
		||||
	margin:           0px 2.5px 0px 2.5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element selected {
 | 
			
		||||
	background-color: @bga;
 | 
			
		||||
	text-color:       @fg;
 | 
			
		||||
	border:           0px 0px 0px 0px;
 | 
			
		||||
	border-radius:    0px;
 | 
			
		||||
	border-color:     @ac;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										24
									
								
								modules/nixos/config/rofi/message.rasi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								modules/nixos/config/rofi/message.rasi
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
/* Confirm Dialog */
 | 
			
		||||
 | 
			
		||||
@import "colors.rasi"
 | 
			
		||||
 | 
			
		||||
* {
 | 
			
		||||
    background-color:       @bg;
 | 
			
		||||
    text-color:             @fg;
 | 
			
		||||
	font:				 	"Iosevka Nerd Font 10";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
window {
 | 
			
		||||
    width:      			320px;
 | 
			
		||||
    padding:    			25px;
 | 
			
		||||
    border:					0px 0px 2px 0px;
 | 
			
		||||
    border-radius:          0px;
 | 
			
		||||
    border-color:           @ac;
 | 
			
		||||
    location:               center;
 | 
			
		||||
    y-offset:               -2em;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
entry {
 | 
			
		||||
    expand: 				true;
 | 
			
		||||
    text-color:				@ac;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										126
									
								
								modules/nixos/config/rofi/networkmenu.rasi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								modules/nixos/config/rofi/networkmenu.rasi
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,126 @@
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Author  : Aditya Shakya
 | 
			
		||||
 * Mail    : adi1090x@gmail.com
 | 
			
		||||
 * Github  : @adi1090x
 | 
			
		||||
 * Twitter : @adi1090x
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
configuration {
 | 
			
		||||
	font:                "Iosevka Nerd Font 10";
 | 
			
		||||
	show-icons:          true;
 | 
			
		||||
	icon-theme:          "Papirus";
 | 
			
		||||
	display-drun:        "";
 | 
			
		||||
	drun-display-format: "{name}";
 | 
			
		||||
	disable-history:     false;
 | 
			
		||||
	fullscreen:          false;
 | 
			
		||||
	hide-scrollbar:      true;
 | 
			
		||||
	sidebar-mode:        false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@import "colors.rasi"
 | 
			
		||||
 | 
			
		||||
window {
 | 
			
		||||
	transparency:      "real";
 | 
			
		||||
	background-color:  @bg;
 | 
			
		||||
	text-color:        @fg;
 | 
			
		||||
	border:            0px 0px 2px 0px;
 | 
			
		||||
	border-color:      @ac;
 | 
			
		||||
	border-radius:     0px;
 | 
			
		||||
	width:             400px;
 | 
			
		||||
	location:          center;
 | 
			
		||||
	x-offset:          0;
 | 
			
		||||
	y-offset:          0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
prompt {
 | 
			
		||||
	enabled:          true;
 | 
			
		||||
	padding:          0px 0px 0px 5px;
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	text-color:       @bar;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
textbox-prompt-colon {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	text-color:       @bar;
 | 
			
		||||
	expand:           false;
 | 
			
		||||
	str:              "";
 | 
			
		||||
	font:             "feather 12";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
entry {
 | 
			
		||||
	background-color:     @al;
 | 
			
		||||
	text-color:           @bar;
 | 
			
		||||
	placeholder-color:    @bar;
 | 
			
		||||
	expand:               true;
 | 
			
		||||
	horizontal-align:     0;
 | 
			
		||||
	placeholder:          "Search...";
 | 
			
		||||
	padding:              0px 0px 0px 10px;
 | 
			
		||||
	blink:                true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inputbar {
 | 
			
		||||
	children:            [ textbox-prompt-colon, prompt ];
 | 
			
		||||
	background-color:     @ac;
 | 
			
		||||
	text-color:           @bar;
 | 
			
		||||
	expand:               false;
 | 
			
		||||
	border:               0px;
 | 
			
		||||
	border-radius:        0px;
 | 
			
		||||
	border-color:         @ac;
 | 
			
		||||
	margin:               0px;
 | 
			
		||||
	padding:              12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
listview {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	padding:          0px;
 | 
			
		||||
	columns:          1;
 | 
			
		||||
	lines:            8;
 | 
			
		||||
	spacing:          5px;
 | 
			
		||||
	cycle:            true;
 | 
			
		||||
	dynamic:          true;
 | 
			
		||||
	layout:           vertical;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mainbox {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	border:           0px;
 | 
			
		||||
	border-radius:    0px;
 | 
			
		||||
	border-color:     @ac;
 | 
			
		||||
	children:         [ inputbar, listview ];
 | 
			
		||||
	spacing:          0px;
 | 
			
		||||
	padding:          0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	text-color:       @fg;
 | 
			
		||||
	orientation:      horizontal;
 | 
			
		||||
	border-radius:    0px;
 | 
			
		||||
	padding:          10px 10px 10px -17px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element-icon {
 | 
			
		||||
	background-color: transparent;
 | 
			
		||||
	text-color:       inherit;
 | 
			
		||||
	size:             24px;
 | 
			
		||||
	border:           0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element-text {
 | 
			
		||||
	background-color: transparent;
 | 
			
		||||
	text-color:       inherit;
 | 
			
		||||
	expand:           true;
 | 
			
		||||
	horizontal-align: 0;
 | 
			
		||||
	vertical-align:   0.5;
 | 
			
		||||
	margin:           0px 2.5px 0px 2.5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element selected {
 | 
			
		||||
	background-color: @bga;
 | 
			
		||||
	text-color:       @fg;
 | 
			
		||||
	border:           0px 0px 0px 0px;
 | 
			
		||||
	border-radius:    0px;
 | 
			
		||||
	border-color:     @ac;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										126
									
								
								modules/nixos/config/rofi/powermenu.rasi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								modules/nixos/config/rofi/powermenu.rasi
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,126 @@
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Author  : Aditya Shakya
 | 
			
		||||
 * Mail    : adi1090x@gmail.com
 | 
			
		||||
 * Github  : @adi1090x
 | 
			
		||||
 * Twitter : @adi1090x
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
configuration {
 | 
			
		||||
	font:                "Iosevka Nerd Font 10";
 | 
			
		||||
	show-icons:          true;
 | 
			
		||||
	icon-theme:          "Papirus";
 | 
			
		||||
	display-drun:        "";
 | 
			
		||||
	drun-display-format: "{name}";
 | 
			
		||||
	disable-history:     false;
 | 
			
		||||
	fullscreen:          false;
 | 
			
		||||
	hide-scrollbar:      true;
 | 
			
		||||
	sidebar-mode:        false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@import "colors.rasi"
 | 
			
		||||
 | 
			
		||||
window {
 | 
			
		||||
	transparency:      "real";
 | 
			
		||||
	background-color:  @bg;
 | 
			
		||||
	text-color:        @fg;
 | 
			
		||||
	border:            0px 0px 2px 0px;
 | 
			
		||||
	border-color:      @ac;
 | 
			
		||||
	border-radius:     0px;
 | 
			
		||||
	width:             350px;
 | 
			
		||||
	location:          center;
 | 
			
		||||
	x-offset:          0;
 | 
			
		||||
	y-offset:          0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
prompt {
 | 
			
		||||
	enabled:          true;
 | 
			
		||||
	padding:          0px 0px 0px 5px;
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	text-color:       @bar;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
textbox-prompt-colon {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	text-color:       @bar;
 | 
			
		||||
	expand:           false;
 | 
			
		||||
	str:              "";
 | 
			
		||||
	font:             "feather 12";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
entry {
 | 
			
		||||
	background-color:     @al;
 | 
			
		||||
	text-color:           @bar;
 | 
			
		||||
	placeholder-color:    @bar;
 | 
			
		||||
	expand:               true;
 | 
			
		||||
	horizontal-align:     0;
 | 
			
		||||
	placeholder:          "Search...";
 | 
			
		||||
	padding:              0px 0px 0px 10px;
 | 
			
		||||
	blink:                true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inputbar {
 | 
			
		||||
	children:            [ textbox-prompt-colon, prompt ];
 | 
			
		||||
	background-color:     @ac;
 | 
			
		||||
	text-color:           @bar;
 | 
			
		||||
	expand:               false;
 | 
			
		||||
	border:               0px;
 | 
			
		||||
	border-radius:        0px;
 | 
			
		||||
	border-color:         @ac;
 | 
			
		||||
	margin:               0px;
 | 
			
		||||
	padding:              12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
listview {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	padding:          0px;
 | 
			
		||||
	columns:          1;
 | 
			
		||||
	lines:            5;
 | 
			
		||||
	spacing:          5px;
 | 
			
		||||
	cycle:            true;
 | 
			
		||||
	dynamic:          true;
 | 
			
		||||
	layout:           vertical;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mainbox {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	border:           0px;
 | 
			
		||||
	border-radius:    0px;
 | 
			
		||||
	border-color:     @ac;
 | 
			
		||||
	children:         [ inputbar, listview ];
 | 
			
		||||
	spacing:          0px;
 | 
			
		||||
	padding:          0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	text-color:       @fg;
 | 
			
		||||
	orientation:      horizontal;
 | 
			
		||||
	border-radius:    0px;
 | 
			
		||||
	padding:          10px 10px 10px -17px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element-icon {
 | 
			
		||||
	background-color: transparent;
 | 
			
		||||
	text-color:       inherit;
 | 
			
		||||
	size:             24px;
 | 
			
		||||
	border:           0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element-text {
 | 
			
		||||
	background-color: transparent;
 | 
			
		||||
	text-color:       inherit;
 | 
			
		||||
	expand:           true;
 | 
			
		||||
	horizontal-align: 0;
 | 
			
		||||
	vertical-align:   0.5;
 | 
			
		||||
	margin:           0px 2.5px 0px 2.5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element selected {
 | 
			
		||||
	background-color: @bga;
 | 
			
		||||
	text-color:       @fg;
 | 
			
		||||
	border:           0px 0px 0px 0px;
 | 
			
		||||
	border-radius:    0px;
 | 
			
		||||
	border-color:     @ac;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										126
									
								
								modules/nixos/config/rofi/styles.rasi
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								modules/nixos/config/rofi/styles.rasi
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,126 @@
 | 
			
		||||
/*
 | 
			
		||||
 *
 | 
			
		||||
 * Author  : Aditya Shakya
 | 
			
		||||
 * Mail    : adi1090x@gmail.com
 | 
			
		||||
 * Github  : @adi1090x
 | 
			
		||||
 * Twitter : @adi1090x
 | 
			
		||||
 *
 | 
			
		||||
 */
 | 
			
		||||
 | 
			
		||||
configuration {
 | 
			
		||||
	font:                "Iosevka Nerd Font 10";
 | 
			
		||||
	show-icons:          true;
 | 
			
		||||
	icon-theme:          "Papirus";
 | 
			
		||||
	display-drun:        "";
 | 
			
		||||
	drun-display-format: "{name}";
 | 
			
		||||
	disable-history:     false;
 | 
			
		||||
	fullscreen:          false;
 | 
			
		||||
	hide-scrollbar:      true;
 | 
			
		||||
	sidebar-mode:        false;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@import "colors.rasi"
 | 
			
		||||
 | 
			
		||||
window {
 | 
			
		||||
	transparency:      "real";
 | 
			
		||||
	background-color:  @bg;
 | 
			
		||||
	text-color:        @fg;
 | 
			
		||||
	border:            0px 0px 2px 0px;
 | 
			
		||||
	border-color:      @ac;
 | 
			
		||||
	border-radius:     0px;
 | 
			
		||||
	width:             350px;
 | 
			
		||||
	location:          center;
 | 
			
		||||
	x-offset:          0;
 | 
			
		||||
	y-offset:          0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
prompt {
 | 
			
		||||
	enabled:          true;
 | 
			
		||||
	padding:          0px 0px 0px 5px;
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	text-color:       @bar;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
textbox-prompt-colon {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	text-color:       @bar;
 | 
			
		||||
	expand:           false;
 | 
			
		||||
	str:              "";
 | 
			
		||||
	font:             "feather 12";
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
entry {
 | 
			
		||||
	background-color:     @al;
 | 
			
		||||
	text-color:           @bar;
 | 
			
		||||
	placeholder-color:    @bar;
 | 
			
		||||
	expand:               true;
 | 
			
		||||
	horizontal-align:     0;
 | 
			
		||||
	placeholder:          "Search...";
 | 
			
		||||
	padding:              0px 0px 0px 5px;
 | 
			
		||||
	blink:                true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inputbar {
 | 
			
		||||
	children:            [ textbox-prompt-colon, entry ];
 | 
			
		||||
	background-color:     @ac;
 | 
			
		||||
	text-color:           @bar;
 | 
			
		||||
	expand:               false;
 | 
			
		||||
	border:               0px;
 | 
			
		||||
	border-radius:        0px;
 | 
			
		||||
	border-color:         @ac;
 | 
			
		||||
	margin:               0px;
 | 
			
		||||
	padding:              12px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
listview {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	padding:          0px;
 | 
			
		||||
	columns:          1;
 | 
			
		||||
	lines:            5;
 | 
			
		||||
	spacing:          5px;
 | 
			
		||||
	cycle:            true;
 | 
			
		||||
	dynamic:          true;
 | 
			
		||||
	layout:           vertical;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
mainbox {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	border:           0px;
 | 
			
		||||
	border-radius:    0px;
 | 
			
		||||
	border-color:     @ac;
 | 
			
		||||
	children:         [ inputbar, listview ];
 | 
			
		||||
	spacing:          0px;
 | 
			
		||||
	padding:          0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element {
 | 
			
		||||
	background-color: @al;
 | 
			
		||||
	text-color:       @fg;
 | 
			
		||||
	orientation:      horizontal;
 | 
			
		||||
	border-radius:    0px;
 | 
			
		||||
	padding:          10px 10px 10px -17px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element-icon {
 | 
			
		||||
	background-color: transparent;
 | 
			
		||||
	text-color:       inherit;
 | 
			
		||||
	size:             24px;
 | 
			
		||||
	border:           0px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element-text {
 | 
			
		||||
	background-color: transparent;
 | 
			
		||||
	text-color:       inherit;
 | 
			
		||||
	expand:           true;
 | 
			
		||||
	horizontal-align: 0;
 | 
			
		||||
	vertical-align:   0.5;
 | 
			
		||||
	margin:           0px 2.5px 0px 2.5px;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
element selected {
 | 
			
		||||
	background-color: @bga;
 | 
			
		||||
	text-color:       @fg;
 | 
			
		||||
	border:           0px 0px 0px 0px;
 | 
			
		||||
	border-radius:    0px;
 | 
			
		||||
	border-color:     @ac;
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										34
									
								
								modules/nixos/disk-config.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								modules/nixos/disk-config.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,34 @@
 | 
			
		||||
_: {
 | 
			
		||||
  # This formats the disk with the ext4 filesystem
 | 
			
		||||
  # Other examples found here: https://github.com/nix-community/disko/tree/master/example
 | 
			
		||||
  disko.devices = {
 | 
			
		||||
    disk = {
 | 
			
		||||
      vdb = {
 | 
			
		||||
        device = "/dev/%DISK%";
 | 
			
		||||
        type = "disk";
 | 
			
		||||
        content = {
 | 
			
		||||
          type = "gpt";
 | 
			
		||||
          partitions = {
 | 
			
		||||
            ESP = {
 | 
			
		||||
              type = "EF00";
 | 
			
		||||
              size = "100M";
 | 
			
		||||
              content = {
 | 
			
		||||
                type = "filesystem";
 | 
			
		||||
                format = "vfat";
 | 
			
		||||
                mountpoint = "/boot";
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
            root = {
 | 
			
		||||
              size = "100%";
 | 
			
		||||
              content = {
 | 
			
		||||
                type = "filesystem";
 | 
			
		||||
                format = "ext4";
 | 
			
		||||
                mountpoint = "/";
 | 
			
		||||
              };
 | 
			
		||||
            };
 | 
			
		||||
          };
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										368
									
								
								modules/nixos/files.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										368
									
								
								modules/nixos/files.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,368 @@
 | 
			
		||||
{ user, ... }:
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
  home           = builtins.getEnv "HOME";
 | 
			
		||||
  xdg_configHome = "${home}/.config";
 | 
			
		||||
  xdg_dataHome   = "${home}/.local/share";
 | 
			
		||||
  xdg_stateHome  = "${home}/.local/state"; in
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  "${xdg_configHome}/bspwm/bspwmrc" = {
 | 
			
		||||
    executable = true;
 | 
			
		||||
    text = ''
 | 
			
		||||
      #! /bin/sh
 | 
			
		||||
      #
 | 
			
		||||
      # Set the number of workspaces
 | 
			
		||||
      bspc monitor -d 1 2 3 4 5 6
 | 
			
		||||
 | 
			
		||||
      # Launch keybindings daemon
 | 
			
		||||
      pgrep -x sxhkd > /dev/null || sxhkd &
 | 
			
		||||
 | 
			
		||||
      # Window configurations
 | 
			
		||||
      bspc config border_width         0
 | 
			
		||||
      bspc config window_gap          16
 | 
			
		||||
      bspc config split_ratio          0.52
 | 
			
		||||
      bspc config borderless_monocle   true
 | 
			
		||||
      bspc config gapless_monocle      true
 | 
			
		||||
 | 
			
		||||
      # Padding outside of the window
 | 
			
		||||
      bspc config top_padding            60
 | 
			
		||||
      bspc config bottom_padding         60
 | 
			
		||||
      bspc config left_padding           60
 | 
			
		||||
      bspc config right_padding          60
 | 
			
		||||
 | 
			
		||||
      # Move floating windows
 | 
			
		||||
      bspc config pointer_action1 move
 | 
			
		||||
 | 
			
		||||
      # Resize floating windows
 | 
			
		||||
      bspc config pointer_action2 resize_side
 | 
			
		||||
      bspc config pointer_action2 resize_corner
 | 
			
		||||
 | 
			
		||||
      # Set background and top bar
 | 
			
		||||
      systemctl --user start polybar
 | 
			
		||||
 | 
			
		||||
      sleep .25
 | 
			
		||||
 | 
			
		||||
      # Wait for the network to be up
 | 
			
		||||
      notify-send 'Waiting for network...'
 | 
			
		||||
      while ! systemctl is-active --quiet network-online.target; do sleep 1; done
 | 
			
		||||
      notify-send 'Network found.'
 | 
			
		||||
 | 
			
		||||
      # Wait for the Emacs daemon
 | 
			
		||||
      notify-send 'Starting Emacs...'
 | 
			
		||||
      /run/current-system/sw/bin/emacsclient -a "" -e '(progn)' &
 | 
			
		||||
 | 
			
		||||
      # Wait for Emacs daemon to be ready
 | 
			
		||||
      while ! /run/current-system/sw/bin/emacsclient -e '(progn)' &>/dev/null; do
 | 
			
		||||
      sleep 1
 | 
			
		||||
      done
 | 
			
		||||
      notify-send 'Emacs daemon started.'
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  "${xdg_configHome}/sxhkd/sxhkdrc" = {
 | 
			
		||||
    text = ''
 | 
			
		||||
    # Close window
 | 
			
		||||
    alt + F4
 | 
			
		||||
          bspc node --close
 | 
			
		||||
 | 
			
		||||
    # Make split ratios equal
 | 
			
		||||
    super + equal
 | 
			
		||||
          bspc node @/ --equalize
 | 
			
		||||
 | 
			
		||||
    # Make split ratios balanced
 | 
			
		||||
    super + minus
 | 
			
		||||
          bspc node @/ --balance
 | 
			
		||||
 | 
			
		||||
    # Toogle tiling of window
 | 
			
		||||
    super + d
 | 
			
		||||
          bspc query --nodes -n focused.tiled && state=floating || state=tiled; \
 | 
			
		||||
          bspc node --state \~$state
 | 
			
		||||
 | 
			
		||||
    # Toggle fullscreen of window
 | 
			
		||||
    super + f
 | 
			
		||||
          bspc node --state \~fullscreen
 | 
			
		||||
 | 
			
		||||
    # Swap the current node and the biggest window
 | 
			
		||||
    super + g
 | 
			
		||||
          bspc node -s biggest.window
 | 
			
		||||
 | 
			
		||||
    # Swap the current node and the smallest window
 | 
			
		||||
    super + shift + g
 | 
			
		||||
          bspc node -s biggest.window
 | 
			
		||||
 | 
			
		||||
    # Alternate between the tiled and monocle layout
 | 
			
		||||
    super + m
 | 
			
		||||
          bspc desktop -l next
 | 
			
		||||
 | 
			
		||||
    # Move between windows in monocle layout
 | 
			
		||||
    super + {_, alt + }m
 | 
			
		||||
          bspc node -f {next, prev}.local.!hidden.window
 | 
			
		||||
 | 
			
		||||
    # Focus the node in the given direction
 | 
			
		||||
    super + {_,shift + }{h,j,k,l}
 | 
			
		||||
          bspc node -{f,s} {west,south,north,east}
 | 
			
		||||
 | 
			
		||||
    # Focus left/right occupied desktop
 | 
			
		||||
    super + {Left,Right}
 | 
			
		||||
          bspc desktop --focus {prev,next}.occupied
 | 
			
		||||
 | 
			
		||||
    # Focus left/right occupied desktop
 | 
			
		||||
    super + {Up,Down}
 | 
			
		||||
          bspc desktop --focus {prev,next}.occupied
 | 
			
		||||
 | 
			
		||||
    # Focus left/right desktop
 | 
			
		||||
    ctrl + alt + {Left,Right}
 | 
			
		||||
          bspc desktop --focus {prev,next}
 | 
			
		||||
 | 
			
		||||
    # Focus left/right desktop
 | 
			
		||||
    ctrl + alt + {Up, Down}
 | 
			
		||||
          bspc desktop --focus {prev,next}
 | 
			
		||||
 | 
			
		||||
    # Focus the older or newer node in the focus history
 | 
			
		||||
    super + {o,i}
 | 
			
		||||
          bspc wm -h off; \
 | 
			
		||||
          bspc node {older,newer} -f; \
 | 
			
		||||
          bspc wm -h on
 | 
			
		||||
 | 
			
		||||
    # Focus or send to the given desktop
 | 
			
		||||
    super + {_,shift + }{1-9,0}
 | 
			
		||||
          bspc {desktop -f,node -d} '^{1-9,10}'
 | 
			
		||||
 | 
			
		||||
    # Preselect the direction
 | 
			
		||||
    super + alt + {h,j,k,l}
 | 
			
		||||
          bspc node -p {west,south,north,east}
 | 
			
		||||
 | 
			
		||||
    # Cancel the preselect
 | 
			
		||||
    # For context on syntax: https://github.com/baskerville/bspwm/issues/344
 | 
			
		||||
    super + alt + {_,shift + }Escape
 | 
			
		||||
          bspc query -N -d | xargs -I id -n 1 bspc node id -p cancel
 | 
			
		||||
 | 
			
		||||
    # Preselect the direction
 | 
			
		||||
    super + ctrl + {h,j,k,l}
 | 
			
		||||
          bspc node -p {west,south,north,east}
 | 
			
		||||
 | 
			
		||||
    # Cancel the preselect
 | 
			
		||||
    # For context on syntax: https://github.com/baskerville/bspwm/issues/344
 | 
			
		||||
    super + ctrl + {_,shift + }Escape
 | 
			
		||||
          bspc query -N -d | xargs -I id -n 1 bspc node id -p cancel
 | 
			
		||||
 | 
			
		||||
    # Set the node flags
 | 
			
		||||
    super + ctrl + {m,x,s,p}
 | 
			
		||||
          bspc node -g {marked,locked,sticky,private}
 | 
			
		||||
 | 
			
		||||
    # Send the newest marked node to the newest preselected node
 | 
			
		||||
    super + y
 | 
			
		||||
          bspc node newest.marked.local -n newest.!automatic.local
 | 
			
		||||
 | 
			
		||||
    # Program launcher
 | 
			
		||||
    super + @space
 | 
			
		||||
          rofi -config -no-lazy-grab -show drun -modi drun -theme /home/${user}/.config/rofi/launcher.rasi
 | 
			
		||||
 | 
			
		||||
    # Terminal emulator
 | 
			
		||||
    super + Return
 | 
			
		||||
          bspc rule -a Alacritty -o state=floating rectangle=1024x768x0x0 center=true && /etc/profiles/per-user/${user}/bin/alacritty
 | 
			
		||||
 | 
			
		||||
    # Terminal emulator
 | 
			
		||||
    super + ctrl + Return
 | 
			
		||||
          /etc/profiles/per-user/${user}/bin/alacritty
 | 
			
		||||
 | 
			
		||||
    # Jump to workspaces
 | 
			
		||||
    super + t
 | 
			
		||||
          bspc desktop --focus ^2
 | 
			
		||||
    super + b
 | 
			
		||||
          bspc desktop --focus ^1
 | 
			
		||||
    super + w
 | 
			
		||||
          bspc desktop --focus ^4
 | 
			
		||||
    super + Tab
 | 
			
		||||
          bspc {node,desktop} -f last
 | 
			
		||||
 | 
			
		||||
    # Keepass XC
 | 
			
		||||
    super + shift + x
 | 
			
		||||
          /etc/profiles/per-user/${user}/bin/keepassxc
 | 
			
		||||
 | 
			
		||||
    # Emacs
 | 
			
		||||
    # -c flag is --create-frame
 | 
			
		||||
    # -a flag is fallback to plain emacs if daemon fails
 | 
			
		||||
    super + alt + Return
 | 
			
		||||
         emacsclient -c -a emacs
 | 
			
		||||
 | 
			
		||||
    super + alt + e
 | 
			
		||||
         systemctl --user restart emacs.service && \
 | 
			
		||||
         emacsclient -c -a emacs
 | 
			
		||||
 | 
			
		||||
    # Web browser
 | 
			
		||||
    ctrl + alt + Return
 | 
			
		||||
         google-chrome-stable
 | 
			
		||||
 | 
			
		||||
    # File browser at home dir
 | 
			
		||||
    super + shift + @space
 | 
			
		||||
         pcmanfm
 | 
			
		||||
 | 
			
		||||
    # Take a screenshot with PrintSc
 | 
			
		||||
    Print
 | 
			
		||||
         flameshot gui -c -p $HOME/.local/share/img/screenshots
 | 
			
		||||
 | 
			
		||||
    # Lock the screen
 | 
			
		||||
    ctrl + alt + BackSpace
 | 
			
		||||
         i3lock
 | 
			
		||||
 | 
			
		||||
    # Audio controls for + volume
 | 
			
		||||
    XF86AudioRaiseVolume
 | 
			
		||||
        pactl set-sink-volume @DEFAULT_SINK@ +5%
 | 
			
		||||
 | 
			
		||||
    # Audio controls for - volume
 | 
			
		||||
    XF86AudioLowerVolume
 | 
			
		||||
        pactl set-sink-volume @DEFAULT_SINK@ -5%
 | 
			
		||||
 | 
			
		||||
    # Audio controls for mute
 | 
			
		||||
    XF86AudioMute
 | 
			
		||||
        pactl set-sink-mute @DEFAULT_SINK@ toggle
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  "${xdg_configHome}/polybar/bin/popup-calendar.sh" = {
 | 
			
		||||
    executable = true;
 | 
			
		||||
    text = ''
 | 
			
		||||
      #!/bin/sh
 | 
			
		||||
 | 
			
		||||
      DATE="$(/run/current-system/sw/bin/date +"%B %d, %Y")"
 | 
			
		||||
      SCREEN_WIDTH=$(/run/current-system/sw/bin/xrandr | /run/current-system/sw/bin/grep '*' | /run/current-system/sw/bin/awk '{print $1}' | /run/current-system/sw/bin/cut -d 'x' -f1)
 | 
			
		||||
      POSX=$(( (SCREEN_WIDTH / 2) - ((SCREEN_WIDTH / 2 * 625) / 10000) ))
 | 
			
		||||
 | 
			
		||||
      case "$1" in
 | 
			
		||||
      --popup)
 | 
			
		||||
          /etc/profiles/per-user/${user}/bin/yad --calendar --fixed \
 | 
			
		||||
            --posx=$POSX --posy=80 --no-buttons --borders=0 --title="yad-calendar" \
 | 
			
		||||
            --close-on-unfocus
 | 
			
		||||
        ;;
 | 
			
		||||
      *)
 | 
			
		||||
          echo "$DATE"
 | 
			
		||||
        ;;
 | 
			
		||||
      esac
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  "${xdg_configHome}/polybar/bin/check-nixos-updates.sh" = {
 | 
			
		||||
    executable = true;
 | 
			
		||||
    text = ''
 | 
			
		||||
      #!/bin/sh
 | 
			
		||||
 | 
			
		||||
      /run/current-system/sw/bin/git -C ~/.local/share/src/nixpkgs fetch upstream master
 | 
			
		||||
      UPDATES=$(/run/current-system/sw/bin/git -C ~/.local/share/src/nixpkgs rev-list origin/master..upstream/master --count 2>/dev/null);
 | 
			
		||||
      /run/current-system/sw/bin/echo " $UPDATES"; # Extra space for presentation with icon
 | 
			
		||||
      /run/current-system/sw/bin/sleep 1800;
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  "${xdg_configHome}/polybar/bin/search-nixos-updates.sh" = {
 | 
			
		||||
    executable = true;
 | 
			
		||||
    text = ''
 | 
			
		||||
      #!/bin/sh
 | 
			
		||||
 | 
			
		||||
      /etc/profiles/per-user/${user}/bin/google-chrome-stable --new-window "https://search.nixos.org/packages"
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  "${xdg_configHome}/rofi/colors.rasi".text = builtins.readFile ./config/rofi/colors.rasi;
 | 
			
		||||
  "${xdg_configHome}/rofi/confirm.rasi".text = builtins.readFile ./config/rofi/confirm.rasi;
 | 
			
		||||
  "${xdg_configHome}/rofi/launcher.rasi".text = builtins.readFile ./config/rofi/launcher.rasi;
 | 
			
		||||
  "${xdg_configHome}/rofi/message.rasi".text = builtins.readFile ./config/rofi/message.rasi;
 | 
			
		||||
  "${xdg_configHome}/rofi/networkmenu.rasi".text = builtins.readFile ./config/rofi/networkmenu.rasi;
 | 
			
		||||
  "${xdg_configHome}/rofi/powermenu.rasi".text = builtins.readFile ./config/rofi/powermenu.rasi;
 | 
			
		||||
  "${xdg_configHome}/rofi/styles.rasi".text = builtins.readFile ./config/rofi/styles.rasi;
 | 
			
		||||
 | 
			
		||||
  "${xdg_configHome}/rofi/bin/launcher.sh" = {
 | 
			
		||||
    executable = true;
 | 
			
		||||
    text = ''
 | 
			
		||||
      #!/bin/sh
 | 
			
		||||
 | 
			
		||||
      rofi -no-config -no-lazy-grab -show drun -modi drun -theme ${xdg_configHome}/rofi/launcher.rasi
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # @todo: Don't use hardcoded src paths
 | 
			
		||||
  "${xdg_configHome}/rofi/bin/powermenu.sh" = {
 | 
			
		||||
    executable = true;
 | 
			
		||||
    text = ''
 | 
			
		||||
      #!/bin/sh
 | 
			
		||||
 | 
			
		||||
      configDir="${xdg_configHome}/rofi"
 | 
			
		||||
      uptime=$(uptime -p | sed -e 's/up //g')
 | 
			
		||||
      rofi_command="rofi -no-config -theme $configDir/powermenu.rasi"
 | 
			
		||||
 | 
			
		||||
      # Options
 | 
			
		||||
      shutdown=" Shutdown"
 | 
			
		||||
      reboot=" Restart"
 | 
			
		||||
      lock=" Lock"
 | 
			
		||||
      suspend=" Sleep"
 | 
			
		||||
      logout=" Logout"
 | 
			
		||||
 | 
			
		||||
      # Confirmation
 | 
			
		||||
      confirm_exit() {
 | 
			
		||||
	      rofi -dmenu\
 | 
			
		||||
              -no-config\
 | 
			
		||||
		      -i\
 | 
			
		||||
		      -no-fixed-num-lines\
 | 
			
		||||
		      -p "Are You Sure? : "\
 | 
			
		||||
		      -theme $configDir/confirm.rasi
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      # Message
 | 
			
		||||
      msg() {
 | 
			
		||||
	      rofi -no-config -theme "$configDir/message.rasi" -e "Available Options  -  yes / y / no / n"
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      # Variable passed to rofi
 | 
			
		||||
      options="$lock\n$suspend\n$logout\n$reboot\n$shutdown"
 | 
			
		||||
      chosen="$(echo -e "$options" | $rofi_command -p "Uptime: $uptime" -dmenu -selected-row 0)"
 | 
			
		||||
      case $chosen in
 | 
			
		||||
          $shutdown)
 | 
			
		||||
		      ans=$(confirm_exit &)
 | 
			
		||||
		      if [[ $ans == "yes" || $ans == "YES" || $ans == "y" || $ans == "Y" ]]; then
 | 
			
		||||
			      systemctl poweroff
 | 
			
		||||
		      elif [[ $ans == "no" || $ans == "NO" || $ans == "n" || $ans == "N" ]]; then
 | 
			
		||||
			      exit 0
 | 
			
		||||
              else
 | 
			
		||||
			      msg
 | 
			
		||||
              fi
 | 
			
		||||
              ;;
 | 
			
		||||
          $reboot)
 | 
			
		||||
		      ans=$(confirm_exit &)
 | 
			
		||||
		      if [[ $ans == "yes" || $ans == "YES" || $ans == "y" || $ans == "Y" ]]; then
 | 
			
		||||
			      systemctl reboot
 | 
			
		||||
		      elif [[ $ans == "no" || $ans == "NO" || $ans == "n" || $ans == "N" ]]; then
 | 
			
		||||
			      exit 0
 | 
			
		||||
              else
 | 
			
		||||
			      msg
 | 
			
		||||
              fi
 | 
			
		||||
              ;;
 | 
			
		||||
          $lock)
 | 
			
		||||
          betterlockscreen -l
 | 
			
		||||
              ;;
 | 
			
		||||
          $suspend)
 | 
			
		||||
		      ans=$(confirm_exit &)
 | 
			
		||||
		      if [[ $ans == "yes" || $ans == "YES" || $ans == "y" || $ans == "Y" ]]; then
 | 
			
		||||
			      mpc -q pause
 | 
			
		||||
			      amixer set Master mute
 | 
			
		||||
			      systemctl suspend
 | 
			
		||||
		      elif [[ $ans == "no" || $ans == "NO" || $ans == "n" || $ans == "N" ]]; then
 | 
			
		||||
			      exit 0
 | 
			
		||||
              else
 | 
			
		||||
			      msg
 | 
			
		||||
              fi
 | 
			
		||||
              ;;
 | 
			
		||||
          $logout)
 | 
			
		||||
		      ans=$(confirm_exit &)
 | 
			
		||||
		      if [[ $ans == "yes" || $ans == "YES" || $ans == "y" || $ans == "Y" ]]; then
 | 
			
		||||
			      bspc quit
 | 
			
		||||
		      elif [[ $ans == "no" || $ans == "NO" || $ans == "n" || $ans == "N" ]]; then
 | 
			
		||||
			      exit 0
 | 
			
		||||
              else
 | 
			
		||||
			      msg
 | 
			
		||||
              fi
 | 
			
		||||
              ;;
 | 
			
		||||
      esac
 | 
			
		||||
   '';
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										119
									
								
								modules/nixos/home-manager.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										119
									
								
								modules/nixos/home-manager.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,119 @@
 | 
			
		||||
{ config, pkgs, lib, ... }:
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
  user = "%USER%";
 | 
			
		||||
  xdg_configHome  = "/home/${user}/.config";
 | 
			
		||||
  shared-programs = import ../shared/home-manager.nix { inherit config pkgs lib; };
 | 
			
		||||
  shared-files = import ../shared/files.nix { inherit config pkgs; };
 | 
			
		||||
 | 
			
		||||
  polybar-user_modules = builtins.readFile (pkgs.substituteAll {
 | 
			
		||||
    src = ./config/polybar/user_modules.ini;
 | 
			
		||||
    packages = "${xdg_configHome}/polybar/bin/check-nixos-updates.sh";
 | 
			
		||||
    searchpkgs = "${xdg_configHome}/polybar/bin/search-nixos-updates.sh";
 | 
			
		||||
    launcher = "${xdg_configHome}/polybar/bin/launcher.sh";
 | 
			
		||||
    powermenu = "${xdg_configHome}/rofi/bin/powermenu.sh";
 | 
			
		||||
    calendar = "${xdg_configHome}/polybar/bin/popup-calendar.sh";
 | 
			
		||||
  });
 | 
			
		||||
 | 
			
		||||
  polybar-config = pkgs.substituteAll {
 | 
			
		||||
    src = ./config/polybar/config.ini;
 | 
			
		||||
    font0 = "DejaVu Sans:size=12;3";
 | 
			
		||||
    font1 = "feather:size=12;3"; # from overlay
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  polybar-modules = builtins.readFile ./config/polybar/modules.ini;
 | 
			
		||||
  polybar-bars = builtins.readFile ./config/polybar/bars.ini;
 | 
			
		||||
  polybar-colors = builtins.readFile ./config/polybar/colors.ini;
 | 
			
		||||
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
  home = {
 | 
			
		||||
    enableNixpkgsReleaseCheck = false;
 | 
			
		||||
    username = "${user}";
 | 
			
		||||
    homeDirectory = "/home/${user}";
 | 
			
		||||
    packages = pkgs.callPackage ./packages.nix {};
 | 
			
		||||
    file = shared-files // import ./files.nix { inherit user; };
 | 
			
		||||
    stateVersion = "21.05";
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # Use a dark theme
 | 
			
		||||
  gtk = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    iconTheme = {
 | 
			
		||||
      name = "Adwaita-dark";
 | 
			
		||||
      package = pkgs.adwaita-icon-theme;
 | 
			
		||||
    };
 | 
			
		||||
    theme = {
 | 
			
		||||
      name = "Adwaita-dark";
 | 
			
		||||
      package = pkgs.adwaita-icon-theme;
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  # Screen lock
 | 
			
		||||
  services = {
 | 
			
		||||
    screen-locker = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
      inactiveInterval = 10;
 | 
			
		||||
      lockCmd = "${pkgs.i3lock-fancy-rapid}/bin/i3lock-fancy-rapid 10 15";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    # Auto mount devices
 | 
			
		||||
    udiskie.enable = true;
 | 
			
		||||
 | 
			
		||||
    polybar = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
      config = polybar-config;
 | 
			
		||||
      extraConfig = polybar-bars + polybar-colors + polybar-modules + polybar-user_modules;
 | 
			
		||||
      package = pkgs.polybarFull;
 | 
			
		||||
      script = "polybar main &";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    dunst = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
      package = pkgs.dunst;
 | 
			
		||||
      settings = {
 | 
			
		||||
        global = {
 | 
			
		||||
          monitor = 0;
 | 
			
		||||
          follow = "mouse";
 | 
			
		||||
          border = 0;
 | 
			
		||||
          height = 400;
 | 
			
		||||
          width = 320;
 | 
			
		||||
          offset = "33x65";
 | 
			
		||||
          indicate_hidden = "yes";
 | 
			
		||||
          shrink = "no";
 | 
			
		||||
          separator_height = 0;
 | 
			
		||||
          padding = 32;
 | 
			
		||||
          horizontal_padding = 32;
 | 
			
		||||
          frame_width = 0;
 | 
			
		||||
          sort = "no";
 | 
			
		||||
          idle_threshold = 120;
 | 
			
		||||
          font = "Noto Sans";
 | 
			
		||||
          line_height = 4;
 | 
			
		||||
          markup = "full";
 | 
			
		||||
          format = "<b>%s</b>\n%b";
 | 
			
		||||
          alignment = "left";
 | 
			
		||||
          transparency = 10;
 | 
			
		||||
          show_age_threshold = 60;
 | 
			
		||||
          word_wrap = "yes";
 | 
			
		||||
          ignore_newline = "no";
 | 
			
		||||
          stack_duplicates = false;
 | 
			
		||||
          hide_duplicate_count = "yes";
 | 
			
		||||
          show_indicators = "no";
 | 
			
		||||
          icon_position = "left";
 | 
			
		||||
          icon_theme = "Adwaita-dark";
 | 
			
		||||
          sticky_history = "yes";
 | 
			
		||||
          history_length = 20;
 | 
			
		||||
          history = "ctrl+grave";
 | 
			
		||||
          browser = "google-chrome-stable";
 | 
			
		||||
          always_run_script = true;
 | 
			
		||||
          title = "Dunst";
 | 
			
		||||
          class = "Dunst";
 | 
			
		||||
          max_icon_size = 64;
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  programs = shared-programs // { gpg.enable = true; };
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										67
									
								
								modules/nixos/packages.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								modules/nixos/packages.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,67 @@
 | 
			
		||||
{ pkgs }:
 | 
			
		||||
 | 
			
		||||
with pkgs;
 | 
			
		||||
let shared-packages = import ../shared/packages.nix { inherit pkgs; }; in
 | 
			
		||||
shared-packages ++ [
 | 
			
		||||
 | 
			
		||||
  # Security and authentication
 | 
			
		||||
  yubikey-agent
 | 
			
		||||
  keepassxc
 | 
			
		||||
 | 
			
		||||
  # App and package management
 | 
			
		||||
  appimage-run
 | 
			
		||||
  gnumake
 | 
			
		||||
  cmake
 | 
			
		||||
  home-manager
 | 
			
		||||
 | 
			
		||||
  # Media and design tools
 | 
			
		||||
  vlc
 | 
			
		||||
  fontconfig
 | 
			
		||||
  font-manager
 | 
			
		||||
 | 
			
		||||
  # Productivity tools
 | 
			
		||||
  bc # old school calculator
 | 
			
		||||
  galculator
 | 
			
		||||
 | 
			
		||||
  # Audio tools
 | 
			
		||||
  pavucontrol # Pulse audio controls
 | 
			
		||||
 | 
			
		||||
  # Testing and development tools
 | 
			
		||||
  direnv
 | 
			
		||||
  rofi
 | 
			
		||||
  rofi-calc
 | 
			
		||||
  postgresql
 | 
			
		||||
  libtool # for Emacs vterm
 | 
			
		||||
 | 
			
		||||
  # Screenshot and recording tools
 | 
			
		||||
  flameshot
 | 
			
		||||
 | 
			
		||||
  # Text and terminal utilities
 | 
			
		||||
  feh # Manage wallpapers
 | 
			
		||||
  screenkey
 | 
			
		||||
  tree
 | 
			
		||||
  unixtools.ifconfig
 | 
			
		||||
  unixtools.netstat
 | 
			
		||||
  xclip # For the org-download package in Emacs
 | 
			
		||||
  xorg.xwininfo # Provides a cursor to click and learn about windows
 | 
			
		||||
  xorg.xrandr
 | 
			
		||||
 | 
			
		||||
  # File and system utilities
 | 
			
		||||
  inotify-tools # inotifywait, inotifywatch - For file system events
 | 
			
		||||
  i3lock-fancy-rapid
 | 
			
		||||
  libnotify
 | 
			
		||||
  pcmanfm # File browser
 | 
			
		||||
  sqlite
 | 
			
		||||
  xdg-utils
 | 
			
		||||
 | 
			
		||||
  # Other utilities
 | 
			
		||||
  yad # yad-calendar is used with polybar
 | 
			
		||||
  xdotool
 | 
			
		||||
  google-chrome
 | 
			
		||||
 | 
			
		||||
  # PDF viewer
 | 
			
		||||
  zathura
 | 
			
		||||
 | 
			
		||||
  # Music and entertainment
 | 
			
		||||
  spotify
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										29
									
								
								modules/nixos/secrets.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								modules/nixos/secrets.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
{ config, pkgs, agenix, secrets, ... }:
 | 
			
		||||
 | 
			
		||||
let user = "%USER%"; in
 | 
			
		||||
{
 | 
			
		||||
  age.identityPaths = [
 | 
			
		||||
    "/home/${user}/.ssh/id_ed25519"
 | 
			
		||||
  ];
 | 
			
		||||
 | 
			
		||||
  # Your secrets go here
 | 
			
		||||
  #
 | 
			
		||||
  # Note: the installWithSecrets command you ran to boostrap the machine actually copies over
 | 
			
		||||
  #       a Github key pair. However, if you want to store the keypair in your nix-secrets repo
 | 
			
		||||
  #       instead, you can reference the age files and specify the symlink path here. Then add your
 | 
			
		||||
  #       public key in shared/files.nix.
 | 
			
		||||
  #
 | 
			
		||||
  #       If you change the key name, you'll need to update the SSH configuration in shared/home-manager.nix
 | 
			
		||||
  #       so Github reads it correctly.
 | 
			
		||||
 | 
			
		||||
  #
 | 
			
		||||
  # age.secrets."github-ssh-key" = {
 | 
			
		||||
  #   symlink = false;
 | 
			
		||||
  #   path = "/home/${user}/.ssh/id_github";
 | 
			
		||||
  #   file =  "${secrets}/github-ssh-key.age";
 | 
			
		||||
  #   mode = "600";
 | 
			
		||||
  #   owner = "${user}";
 | 
			
		||||
  #   group = "wheel";
 | 
			
		||||
  # };
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								modules/shared/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								modules/shared/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
## Shared
 | 
			
		||||
Much of the code running on MacOS or NixOS is actually found here.
 | 
			
		||||
 | 
			
		||||
This configuration gets imported by both modules. Some configuration examples include `git`, `zsh`, `vim`, and `tmux`.
 | 
			
		||||
 | 
			
		||||
## Layout
 | 
			
		||||
```
 | 
			
		||||
.
 | 
			
		||||
├── config             # Config files not written in Nix
 | 
			
		||||
├── cachix             # Defines cachix, a global cache for builds
 | 
			
		||||
├── default.nix        # Defines how we import overlays 
 | 
			
		||||
├── files.nix          # Non-Nix, static configuration files (now immutable!)
 | 
			
		||||
├── home-manager.nix   # The goods; most all shared config lives here
 | 
			
		||||
├── packages.nix       # List of packages to share
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
							
								
								
									
										1
									
								
								modules/shared/config/emacs/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								modules/shared/config/emacs/.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
config.el
 | 
			
		||||
							
								
								
									
										1477
									
								
								modules/shared/config/emacs/config.org
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1477
									
								
								modules/shared/config/emacs/config.org
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										142
									
								
								modules/shared/config/emacs/init.el
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								modules/shared/config/emacs/init.el
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,142 @@
 | 
			
		||||
;; -------------------------
 | 
			
		||||
;; Variable Declarations
 | 
			
		||||
;; -------------------------
 | 
			
		||||
(defvar org-config-file "~/.local/share/src/nixos-config/modules/shared/config/emacs/config.org")
 | 
			
		||||
(defvar default-config-file "~/.emacs.d/default-config.org")
 | 
			
		||||
(defvar default-config-url "https://raw.githubusercontent.com/dustinlyons/nixos-config/9ad810c818b895c1f67f4daf21bbef31d8b5e8cd/shared/config/emacs/config.org")
 | 
			
		||||
 | 
			
		||||
;; -------------------------
 | 
			
		||||
;; Package Manager Setup
 | 
			
		||||
;; -------------------------
 | 
			
		||||
(require 'package)
 | 
			
		||||
(setq package-archives '(("melpa" . "https://melpa.org/packages/")
 | 
			
		||||
                         ("gnu" . "http://elpa.gnu.org/packages/")))
 | 
			
		||||
 | 
			
		||||
(unless (assoc-default "melpa" package-archives)
 | 
			
		||||
  (message "Warning: MELPA source not found. Adding MELPA to package-archives.")
 | 
			
		||||
  (add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t))
 | 
			
		||||
(unless (assoc-default "org" package-archives)
 | 
			
		||||
  (message "Warning: Org source not found. Adding Org to package-archives.")
 | 
			
		||||
  (add-to-list 'package-archives '("org" . "https://orgmode.org/elpa/") t))
 | 
			
		||||
 | 
			
		||||
(setq package-enable-at-startup nil)
 | 
			
		||||
 | 
			
		||||
;; -------------------------
 | 
			
		||||
;; Use-Package Setup
 | 
			
		||||
;; -------------------------
 | 
			
		||||
(unless (package-installed-p 'use-package)
 | 
			
		||||
  (package-initialize)
 | 
			
		||||
  (if (package-install 'use-package)
 | 
			
		||||
      (message "use-package installed successfully.")
 | 
			
		||||
    (error "Error: Failed to install use-package."))
 | 
			
		||||
  (setq use-package-verbose t)
 | 
			
		||||
  (setq use-package-always-ensure t)
 | 
			
		||||
  (require 'use-package))
 | 
			
		||||
 | 
			
		||||
;; -------------------------
 | 
			
		||||
;; Environment Variables Setup
 | 
			
		||||
;; -------------------------
 | 
			
		||||
(use-package exec-path-from-shell
 | 
			
		||||
  :if (memq window-system '(mac ns x))
 | 
			
		||||
  :config
 | 
			
		||||
  (setq exec-path-from-shell-variables '("PATH" "GOPATH" "PNPM_HOME"))
 | 
			
		||||
  (if (exec-path-from-shell-initialize)
 | 
			
		||||
      (message "Environment variables initialized successfully.")
 | 
			
		||||
    (error "Error: Failed to initialize environment variables.")))
 | 
			
		||||
 | 
			
		||||
(when (daemonp)
 | 
			
		||||
  (exec-path-from-shell-initialize))
 | 
			
		||||
 | 
			
		||||
;; -------------------------
 | 
			
		||||
;; Straight.el Setup
 | 
			
		||||
;; -------------------------
 | 
			
		||||
(setq straight-repository-branch "develop")
 | 
			
		||||
(defvar bootstrap-version)
 | 
			
		||||
(let ((bootstrap-file
 | 
			
		||||
       (expand-file-name "straight/repos/straight.el/bootstrap.el" user-emacs-directory))
 | 
			
		||||
      (bootstrap-version 6))
 | 
			
		||||
  (unless (file-exists-p bootstrap-file)
 | 
			
		||||
    (with-current-buffer
 | 
			
		||||
        (url-retrieve-synchronously
 | 
			
		||||
         "https://raw.githubusercontent.com/radian-software/straight.el/develop/install.el"
 | 
			
		||||
         'silent 'inhibit-cookies)
 | 
			
		||||
      (goto-char (point-max))
 | 
			
		||||
      (eval-print-last-sexp)))
 | 
			
		||||
  (if (load bootstrap-file nil 'nomessage)
 | 
			
		||||
      (message "Straight.el loaded successfully.")
 | 
			
		||||
    (error "Error: Failed to load Straight.el.")))
 | 
			
		||||
 | 
			
		||||
(setq straight-use-package-by-default t)
 | 
			
		||||
(package-initialize)
 | 
			
		||||
 | 
			
		||||
;; -------------------------
 | 
			
		||||
;; Window and UI Setup
 | 
			
		||||
;; -------------------------
 | 
			
		||||
(defun dl/window-setup ()
 | 
			
		||||
  (condition-case nil
 | 
			
		||||
      (progn
 | 
			
		||||
        (column-number-mode)
 | 
			
		||||
        (scroll-bar-mode 0)
 | 
			
		||||
        (menu-bar-mode -1)
 | 
			
		||||
        (tool-bar-mode 0)
 | 
			
		||||
        (winner-mode 1)
 | 
			
		||||
        (add-to-list 'default-frame-alist '(ns-transparent-titlebar . t))
 | 
			
		||||
        (add-to-list 'default-frame-alist '(ns-appearance . dark))
 | 
			
		||||
        (setq ns-use-proxy-icon nil)
 | 
			
		||||
        (setq frame-title-format nil)
 | 
			
		||||
        (message "Window and UI setup completed successfully."))
 | 
			
		||||
    (error (message "Error occurred in Window and UI setup."))))
 | 
			
		||||
(dl/window-setup)
 | 
			
		||||
 | 
			
		||||
;; -------------------------
 | 
			
		||||
;; Org Mode Setup
 | 
			
		||||
;; -------------------------
 | 
			
		||||
(defun dl/org-mode-setup ()
 | 
			
		||||
  (condition-case nil
 | 
			
		||||
      (progn
 | 
			
		||||
        (org-indent-mode)
 | 
			
		||||
        (variable-pitch-mode 1)
 | 
			
		||||
        (auto-fill-mode 0)
 | 
			
		||||
        (visual-line-mode 1)
 | 
			
		||||
        (setq evil-auto-indent nil)
 | 
			
		||||
        (message "Org mode setup completed successfully."))
 | 
			
		||||
    (error (message "Error occurred in Org mode setup."))))
 | 
			
		||||
 | 
			
		||||
(use-package org
 | 
			
		||||
  :defer t
 | 
			
		||||
  :hook (org-mode . dl/org-mode-setup)
 | 
			
		||||
  :config
 | 
			
		||||
  (setq org-edit-src-content-indentation 2
 | 
			
		||||
        org-ellipsis " ▾"
 | 
			
		||||
        org-hide-emphasis-markers t
 | 
			
		||||
        org-hide-block-startup nil)
 | 
			
		||||
  :bind (("C-c a" . org-agenda)))
 | 
			
		||||
 | 
			
		||||
;; -------------------------
 | 
			
		||||
;; Default Config Download
 | 
			
		||||
;; -------------------------
 | 
			
		||||
(defun dl/download-default-config ()
 | 
			
		||||
  (condition-case nil
 | 
			
		||||
      (progn
 | 
			
		||||
        (unless (file-exists-p default-config-file)
 | 
			
		||||
          (url-retrieve default-config-url
 | 
			
		||||
                        (lambda (_status)
 | 
			
		||||
                          ;; delete-region removes the HTTP headers from the downloaded content.
 | 
			
		||||
                          (delete-region (point-min) (1+ url-http-end-of-headers))
 | 
			
		||||
                          ;; save the contents of the buffer to the file.
 | 
			
		||||
                          (write-file default-config-file)))
 | 
			
		||||
          (message "Default configuration downloaded successfully.")))
 | 
			
		||||
    (error (message "Error occurred while downloading the default configuration."))))
 | 
			
		||||
 | 
			
		||||
;; -------------------------
 | 
			
		||||
;; Load Org Config or Default
 | 
			
		||||
;; -------------------------
 | 
			
		||||
(condition-case nil
 | 
			
		||||
    (progn
 | 
			
		||||
      (unless (file-exists-p org-config-file)
 | 
			
		||||
        (dl/download-default-config))
 | 
			
		||||
      (if (file-exists-p org-config-file)
 | 
			
		||||
          (org-babel-load-file org-config-file)
 | 
			
		||||
        (org-babel-load-file default-config-file))
 | 
			
		||||
      (message "Configuration loaded successfully."))
 | 
			
		||||
  (error (message "Error occurred while loading the configuration.")))
 | 
			
		||||
							
								
								
									
										288
									
								
								modules/shared/config/p10k.zsh
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										288
									
								
								modules/shared/config/p10k.zsh
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,288 @@
 | 
			
		||||
# Temporarily change options.
 | 
			
		||||
'builtin' 'local' '-a' 'p10k_config_opts'
 | 
			
		||||
[[ ! -o 'aliases'         ]] || p10k_config_opts+=('aliases')
 | 
			
		||||
[[ ! -o 'sh_glob'         ]] || p10k_config_opts+=('sh_glob')
 | 
			
		||||
[[ ! -o 'no_brace_expand' ]] || p10k_config_opts+=('no_brace_expand')
 | 
			
		||||
'builtin' 'setopt' 'no_aliases' 'no_sh_glob' 'brace_expand'
 | 
			
		||||
 | 
			
		||||
() {
 | 
			
		||||
  emulate -L zsh
 | 
			
		||||
  setopt no_unset
 | 
			
		||||
 | 
			
		||||
  autoload -Uz is-at-least && is-at-least 5.1 || return
 | 
			
		||||
 | 
			
		||||
  # Unset all configuration options.
 | 
			
		||||
  unset -m 'POWERLEVEL9K_*'
 | 
			
		||||
 | 
			
		||||
  # Left prompt segments.
 | 
			
		||||
  typeset -g POWERLEVEL9K_LEFT_PROMPT_ELEMENTS=(
 | 
			
		||||
      dir                       # current directory
 | 
			
		||||
      vcs                       # git status
 | 
			
		||||
      context                   # user@host
 | 
			
		||||
      command_execution_time    # previous command duration
 | 
			
		||||
      virtualenv                # python virtual environment
 | 
			
		||||
      prompt_char               # prompt symbol
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  # Right prompt segments.
 | 
			
		||||
  typeset -g POWERLEVEL9K_RIGHT_PROMPT_ELEMENTS=(
 | 
			
		||||
      nix_shell_with_name
 | 
			
		||||
  )
 | 
			
		||||
 | 
			
		||||
  # Defines character set used by powerlevel10k.
 | 
			
		||||
  typeset -g POWERLEVEL9K_MODE=nerdfont-complete
 | 
			
		||||
 | 
			
		||||
  # When set to `moderate`, some icons will have an extra space after them. This is meant to avoid
 | 
			
		||||
  # icon overlap when using non-monospace fonts. When set to `none`, spaces are not added.
 | 
			
		||||
  typeset -g POWERLEVEL9K_ICON_PADDING=none
 | 
			
		||||
 | 
			
		||||
  # Basic style options that define the overall prompt look.
 | 
			
		||||
  typeset -g POWERLEVEL9K_BACKGROUND=                            # transparent background
 | 
			
		||||
  typeset -g POWERLEVEL9K_{LEFT,RIGHT}_{LEFT,RIGHT}_WHITESPACE=  # no surrounding whitespace
 | 
			
		||||
  typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SUBSEGMENT_SEPARATOR=' '  # separate segments with a space
 | 
			
		||||
  typeset -g POWERLEVEL9K_{LEFT,RIGHT}_SEGMENT_SEPARATOR=        # no end-of-line symbol
 | 
			
		||||
  typeset -g POWERLEVEL9K_VISUAL_IDENTIFIER_EXPANSION=           # no segment icons
 | 
			
		||||
 | 
			
		||||
  # Add an empty line before each prompt except the first. This doesn't emulate the bug
 | 
			
		||||
  # in Pure that makes prompt drift down whenever you use the ALT-C binding from fzf or similar.
 | 
			
		||||
  typeset -g POWERLEVEL9K_PROMPT_ADD_NEWLINE=true
 | 
			
		||||
 | 
			
		||||
  # Green prompt symbol if the last command succeeded.
 | 
			
		||||
  typeset -g POWERLEVEL9K_PROMPT_CHAR_OK_{VIINS,VICMD,VIVIS}_FOREGROUND=002
 | 
			
		||||
  # Red prompt symbol if the last command failed.
 | 
			
		||||
  typeset -g POWERLEVEL9K_PROMPT_CHAR_ERROR_{VIINS,VICMD,VIVIS}_FOREGROUND=001
 | 
			
		||||
  # Default prompt symbol.
 | 
			
		||||
  typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIINS_CONTENT_EXPANSION='❯'
 | 
			
		||||
  # Prompt symbol in command vi mode.
 | 
			
		||||
  typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VICMD_CONTENT_EXPANSION='❮'
 | 
			
		||||
  # Prompt symbol in visual vi mode is the same as in command mode.
 | 
			
		||||
  typeset -g POWERLEVEL9K_PROMPT_CHAR_{OK,ERROR}_VIVIS_CONTENT_EXPANSION='❮'
 | 
			
		||||
  # Prompt symbol in overwrite vi mode is the same as in command mode.
 | 
			
		||||
  typeset -g POWERLEVEL9K_PROMPT_CHAR_OVERWRITE_STATE=false
 | 
			
		||||
 | 
			
		||||
  # Grey Python Virtual Environment.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VIRTUALENV_FOREGROUND=007
 | 
			
		||||
  # Don't show Python version.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VIRTUALENV_SHOW_PYTHON_VERSION=false
 | 
			
		||||
  typeset -g POWERLEVEL9K_VIRTUALENV_{LEFT,RIGHT}_DELIMITER=
 | 
			
		||||
 | 
			
		||||
  # Blue current directory.
 | 
			
		||||
  typeset -g POWERLEVEL9K_DIR_FOREGROUND=blue
 | 
			
		||||
 | 
			
		||||
  # Context format when root: user@host. The first part white, the rest grey.
 | 
			
		||||
  typeset -g POWERLEVEL9K_CONTEXT_ROOT_TEMPLATE='%7F%n%f%007F@%m%f'
 | 
			
		||||
  # Context format when not root: user@host. The whole thing grey.
 | 
			
		||||
  typeset -g POWERLEVEL9K_CONTEXT_TEMPLATE='%007F%n@%m%f'
 | 
			
		||||
  # Don't show context unless root or in SSH.
 | 
			
		||||
  typeset -g POWERLEVEL9K_CONTEXT_{DEFAULT,SUDO}_CONTENT_EXPANSION=
 | 
			
		||||
 | 
			
		||||
  # Show previous command duration only if it's >= 5s.
 | 
			
		||||
  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_THRESHOLD=5
 | 
			
		||||
  # Don't show fractional seconds. Thus, 7s rather than 7.3s.
 | 
			
		||||
  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_PRECISION=0
 | 
			
		||||
  # Duration format: 1d 2h 3m 4s.
 | 
			
		||||
  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FORMAT='d h m s'
 | 
			
		||||
  # Yellow previous command duration.
 | 
			
		||||
  typeset -g POWERLEVEL9K_COMMAND_EXECUTION_TIME_FOREGROUND=007
 | 
			
		||||
 | 
			
		||||
  # Branch icon. Set this parameter to '\uF126 ' for the popular Powerline branch icon.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_BRANCH_ICON='\uF126 '
 | 
			
		||||
 | 
			
		||||
  # Untracked files icon. It's really a question mark, your font isn't broken.
 | 
			
		||||
  # Change the value of this parameter to show a different icon.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_UNTRACKED_ICON='?'
 | 
			
		||||
 | 
			
		||||
  # Version control system colors.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=2
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=3
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=2
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_CONFLICTED_FOREGROUND=3
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_LOADING_FOREGROUND=8
 | 
			
		||||
 | 
			
		||||
  # Nix shell color.
 | 
			
		||||
  typeset -g POWERLEVEL9K_NIX_SHELL_FOREGROUND=0
 | 
			
		||||
  typeset -g POWERLEVEL9K_NIX_SHELL_BACKGROUND=4
 | 
			
		||||
 | 
			
		||||
  # Tip: If you want to see just the icon without "pure" and "impure", uncomment the next line.
 | 
			
		||||
  typeset -g POWERLEVEL9K_NIX_SHELL_CONTENT_EXPANSION=
 | 
			
		||||
 | 
			
		||||
  function prompt_nix_shell_with_name() {
 | 
			
		||||
    if [[ -n "${IN_NIX_SHELL-}" ]]; then
 | 
			
		||||
      if [[ "${name-nix-shell}" != nix-shell ]] && [ "${name-shell}" != shell ]; then
 | 
			
		||||
        p10k segment -b 4 -f 15 -r -i NIX_SHELL_ICON -t "$name"
 | 
			
		||||
      else
 | 
			
		||||
        p10k segment -b 4 -f 15 -r -i NIX_SHELL_ICON
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  # VCS_STATUS_* parameters are set by gitstatus plugin. See reference:
 | 
			
		||||
  # https://github.com/romkatv/gitstatus/blob/master/gitstatus.plugin.zsh.
 | 
			
		||||
  function my_git_formatter() {
 | 
			
		||||
    emulate -L zsh
 | 
			
		||||
 | 
			
		||||
    if [[ -n $P9K_CONTENT ]]; then
 | 
			
		||||
      # If P9K_CONTENT is not empty, use it. It's either "loading" or from vcs_info (not from
 | 
			
		||||
      # gitstatus plugin). VCS_STATUS_* parameters are not available in this case.
 | 
			
		||||
      typeset -g my_git_format=$P9K_CONTENT
 | 
			
		||||
      return
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if (( $1 )); then
 | 
			
		||||
      # Styling for up-to-date Git status.
 | 
			
		||||
      local       meta='%f'     # default foreground
 | 
			
		||||
      local      clean='%002F'   # green foreground
 | 
			
		||||
      local   modified='%003F'  # yellow foreground
 | 
			
		||||
      local  untracked='%004F'   # blue foreground
 | 
			
		||||
      local conflicted='%001F'  # red foreground
 | 
			
		||||
    else
 | 
			
		||||
      # Styling for incomplete and stale Git status.
 | 
			
		||||
      local       meta='%244F'  # grey foreground
 | 
			
		||||
      local      clean='%244F'  # grey foreground
 | 
			
		||||
      local   modified='%244F'  # grey foreground
 | 
			
		||||
      local  untracked='%244F'  # grey foreground
 | 
			
		||||
      local conflicted='%244F'  # grey foreground
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    local res
 | 
			
		||||
 | 
			
		||||
    if [[ -n $VCS_STATUS_LOCAL_BRANCH ]]; then
 | 
			
		||||
      local branch=${(V)VCS_STATUS_LOCAL_BRANCH}
 | 
			
		||||
 | 
			
		||||
      # If local branch name is at most 32 characters long, show it in full.
 | 
			
		||||
      # Otherwise show the first 12 … the last 12.
 | 
			
		||||
      (( $#branch > 32 )) && branch[13,-13]="…"  # <-- this line
 | 
			
		||||
 | 
			
		||||
      if (( VCS_STATUS_HAS_CONFLICTED)); then
 | 
			
		||||
        res+="${conflicted}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}"
 | 
			
		||||
      else
 | 
			
		||||
        if (( VCS_STATUS_HAS_STAGED || VCS_STATUS_HAS_UNSTAGED )); then
 | 
			
		||||
          res+="${modified}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}"
 | 
			
		||||
        else
 | 
			
		||||
          if (( VCS_STATUS_HAS_UNTRACKED )); then
 | 
			
		||||
            res+="${untracked}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}"
 | 
			
		||||
          else
 | 
			
		||||
            res+="${clean}${(g::)POWERLEVEL9K_VCS_BRANCH_ICON}${branch//\%/%%}"
 | 
			
		||||
          fi
 | 
			
		||||
        fi
 | 
			
		||||
      fi
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    if [[ -n $VCS_STATUS_TAG
 | 
			
		||||
          # Show tag only if not on a branch.
 | 
			
		||||
          && -z $VCS_STATUS_LOCAL_BRANCH  # <-- this line
 | 
			
		||||
        ]]; then
 | 
			
		||||
      local tag=${(V)VCS_STATUS_TAG}
 | 
			
		||||
      # If tag name is at most 32 characters long, show it in full.
 | 
			
		||||
      # Otherwise show the first 12 … the last 12.
 | 
			
		||||
      (( $#tag > 32 )) && tag[13,-13]="…"  # <-- this line
 | 
			
		||||
      res+="${meta}#${clean}${tag//\%/%%}"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    # Display the current Git commit if there is no branch and no tag.
 | 
			
		||||
    # Tip: To always display the current Git commit, delete the next line.
 | 
			
		||||
    [[ -z $VCS_STATUS_LOCAL_BRANCH && -z $VCS_STATUS_TAG ]] &&  # <-- this line
 | 
			
		||||
      res+="${meta}@${clean}${VCS_STATUS_COMMIT[1,8]}"
 | 
			
		||||
 | 
			
		||||
    # Show tracking branch name if it differs from local branch.
 | 
			
		||||
    if [[ -n ${VCS_STATUS_REMOTE_BRANCH:#$VCS_STATUS_LOCAL_BRANCH} ]]; then
 | 
			
		||||
      res+="${meta}:${clean}${(V)VCS_STATUS_REMOTE_BRANCH//\%/%%}"
 | 
			
		||||
    fi
 | 
			
		||||
 | 
			
		||||
    typeset -g my_git_format=$res
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  functions -M my_git_formatter 2>/dev/null
 | 
			
		||||
 | 
			
		||||
  # Don't count the number of unstaged, untracked and conflicted files in Git repositories with
 | 
			
		||||
  # more than this many files in the index. Negative value means infinity.
 | 
			
		||||
  #
 | 
			
		||||
  # If you are working in Git repositories with tens of millions of files and seeing performance
 | 
			
		||||
  # sagging, try setting POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY to a number lower than the output
 | 
			
		||||
  # of `git ls-files | wc -l`. Alternatively, add `bash.showDirtyState = false` to the repository's
 | 
			
		||||
  # config: `git config bash.showDirtyState false`.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_MAX_INDEX_SIZE_DIRTY=-1
 | 
			
		||||
 | 
			
		||||
  # Don't show Git status in prompt for repositories whose workdir matches this pattern.
 | 
			
		||||
  # For example, if set to '~', the Git repository at $HOME/.git will be ignored.
 | 
			
		||||
  # Multiple patterns can be combined with '|': '~(|/foo)|/bar/baz/*'.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_DISABLED_WORKDIR_PATTERN='~'
 | 
			
		||||
 | 
			
		||||
  # Disable the default Git status formatting.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_DISABLE_GITSTATUS_FORMATTING=true
 | 
			
		||||
 | 
			
		||||
  # Install our own Git status formatter.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${$((my_git_formatter(1)))+${my_git_format}}'
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_LOADING_CONTENT_EXPANSION='${$((my_git_formatter(0)))+${my_git_format}}'
 | 
			
		||||
 | 
			
		||||
  # Enable counters for staged, unstaged, etc.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED,CONFLICTED,COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=-1
 | 
			
		||||
 | 
			
		||||
  # Icon color.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_VISUAL_IDENTIFIER_COLOR=007
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_LOADING_VISUAL_IDENTIFIER_COLOR=008
 | 
			
		||||
 | 
			
		||||
  # Show status of repositories of these types. You can add svn and/or hg if you are
 | 
			
		||||
  # using them. If you do, your prompt may become slow even when your current directory
 | 
			
		||||
  # isn't in an svn or hg reposotiry.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_BACKENDS=(git)
 | 
			
		||||
 | 
			
		||||
  # These settings are used for repositories other than Git or when gitstatusd fails and
 | 
			
		||||
  # Powerlevel10k has to fall back to using vcs_info.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_CLEAN_FOREGROUND=002
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_UNTRACKED_FOREGROUND=004
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_MODIFIED_FOREGROUND=003
 | 
			
		||||
 | 
			
		||||
  ##########################[ end git configuration ]###########################
 | 
			
		||||
 | 
			
		||||
  # Don't wait for Git status even for a millisecond, so that prompt always updates
 | 
			
		||||
  # asynchronously when Git state changes.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_MAX_SYNC_LATENCY_SECONDS=0
 | 
			
		||||
 | 
			
		||||
  # Cyan ahead/behind arrows.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_{INCOMING,OUTGOING}_CHANGESFORMAT_FOREGROUND=cyan
 | 
			
		||||
 | 
			
		||||
  # Don't show remote branch, current tag or stashes.
 | 
			
		||||
  # typeset -g POWERLEVEL9K_VCS_GIT_HOOKS=(vcs-detect-changes git-untracked git-aheadbehind)
 | 
			
		||||
 | 
			
		||||
  # When in detached HEAD state, show @commit where branch normally goes.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_COMMIT_ICON='@'
 | 
			
		||||
 | 
			
		||||
  # Don't show staged, unstaged, untracked indicators.
 | 
			
		||||
  # typeset -g POWERLEVEL9K_VCS_{STAGED,UNSTAGED,UNTRACKED}_ICON=$'\b'
 | 
			
		||||
 | 
			
		||||
  # Show '*' when there are staged, unstaged or untracked files.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_DIRTY_ICON='*'
 | 
			
		||||
 | 
			
		||||
  # Show '⇣' if local branch is behind remote.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_INCOMING_CHANGES_ICON='⇣'
 | 
			
		||||
 | 
			
		||||
  # Show '⇡' if local branch is ahead of remote.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_OUTGOING_CHANGES_ICON='⇡'
 | 
			
		||||
 | 
			
		||||
  # Don't show the number of commits next to the ahead/behind arrows.
 | 
			
		||||
  typeset -g POWERLEVEL9K_VCS_{COMMITS_AHEAD,COMMITS_BEHIND}_MAX_NUM=1
 | 
			
		||||
 | 
			
		||||
  # Remove space between '⇣' and '⇡'.
 | 
			
		||||
  # typeset -g POWERLEVEL9K_VCS_CONTENT_EXPANSION='${P9K_CONTENT/⇣* ⇡/⇣⇡}'
 | 
			
		||||
 | 
			
		||||
  # Transient prompt works similarly to the builtin transient_rprompt option. It trims down prompt
 | 
			
		||||
  # when accepting a command line. Supported values:
 | 
			
		||||
  typeset -g POWERLEVEL9K_TRANSIENT_PROMPT=off
 | 
			
		||||
 | 
			
		||||
  # Instant prompt mode.
 | 
			
		||||
  typeset -g POWERLEVEL9K_INSTANT_PROMPT=verbose
 | 
			
		||||
 | 
			
		||||
  # Hot reload allows you to change POWERLEVEL9K options after Powerlevel10k has been initialized.
 | 
			
		||||
  # For example, you can type POWERLEVEL9K_BACKGROUND=red and see your prompt turn red. Hot reload
 | 
			
		||||
  # can slow down prompt by 1-2 milliseconds, so it's better to keep it turned off unless you
 | 
			
		||||
  # really need it.
 | 
			
		||||
  typeset -g POWERLEVEL9K_DISABLE_HOT_RELOAD=true
 | 
			
		||||
 | 
			
		||||
  # If p10k is already loaded, reload configuration.
 | 
			
		||||
  # This works even with POWERLEVEL9K_DISABLE_HOT_RELOAD=true.
 | 
			
		||||
  (( ! $+functions[p10k] )) || p10k reload
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
(( ${#p10k_config_opts} )) && setopt ${p10k_config_opts[@]}
 | 
			
		||||
'builtin' 'unset' 'p10k_config_opts'
 | 
			
		||||
							
								
								
									
										29
									
								
								modules/shared/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								modules/shared/default.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,29 @@
 | 
			
		||||
{ config, pkgs, ... }:
 | 
			
		||||
 | 
			
		||||
let
 | 
			
		||||
  emacsOverlaySha256 = "06413w510jmld20i4lik9b36cfafm501864yq8k4vxl5r4hn0j0h";
 | 
			
		||||
in
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  nixpkgs = {
 | 
			
		||||
    config = {
 | 
			
		||||
      allowUnfree = true;
 | 
			
		||||
      allowBroken = true;
 | 
			
		||||
      allowInsecure = false;
 | 
			
		||||
      allowUnsupportedSystem = true;
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    overlays =
 | 
			
		||||
      # Apply each overlay found in the /overlays directory
 | 
			
		||||
      let path = ../../overlays; in with builtins;
 | 
			
		||||
      map (n: import (path + ("/" + n)))
 | 
			
		||||
          (filter (n: match ".*\\.nix" n != null ||
 | 
			
		||||
                      pathExists (path + ("/" + n + "/default.nix")))
 | 
			
		||||
                  (attrNames (readDir path)))
 | 
			
		||||
 | 
			
		||||
      ++ [(import (builtins.fetchTarball {
 | 
			
		||||
               url = "https://github.com/dustinlyons/emacs-overlay/archive/refs/heads/master.tar.gz";
 | 
			
		||||
               sha256 = emacsOverlaySha256;
 | 
			
		||||
           }))];
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										16
									
								
								modules/shared/files.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								modules/shared/files.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,16 @@
 | 
			
		||||
{ pkgs, config, ... }:
 | 
			
		||||
 | 
			
		||||
# let
 | 
			
		||||
#  githubPublicKey = "ssh-ed25519 AAAA...";
 | 
			
		||||
# in
 | 
			
		||||
{
 | 
			
		||||
 | 
			
		||||
  # ".ssh/id_github.pub" = {
 | 
			
		||||
  #   text = githubPublicKey;
 | 
			
		||||
  # };
 | 
			
		||||
 | 
			
		||||
  # Initializes Emacs with org-mode so we can tangle the main config
 | 
			
		||||
  ".emacs.d/init.el" = {
 | 
			
		||||
    text = builtins.readFile ../shared/config/emacs/init.el;
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										370
									
								
								modules/shared/home-manager.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										370
									
								
								modules/shared/home-manager.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,370 @@
 | 
			
		||||
{ config, pkgs, lib, ... }:
 | 
			
		||||
 | 
			
		||||
let name = "%NAME%";
 | 
			
		||||
    user = "%USER%";
 | 
			
		||||
    email = "%EMAIL%"; in
 | 
			
		||||
{
 | 
			
		||||
  # Shared shell configuration
 | 
			
		||||
  zsh = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    autocd = false;
 | 
			
		||||
    cdpath = [ "~/.local/share/src" ];
 | 
			
		||||
    plugins = [
 | 
			
		||||
      {
 | 
			
		||||
          name = "powerlevel10k";
 | 
			
		||||
          src = pkgs.zsh-powerlevel10k;
 | 
			
		||||
          file = "share/zsh-powerlevel10k/powerlevel10k.zsh-theme";
 | 
			
		||||
      }
 | 
			
		||||
      {
 | 
			
		||||
          name = "powerlevel10k-config";
 | 
			
		||||
          src = lib.cleanSource ./config;
 | 
			
		||||
          file = "p10k.zsh";
 | 
			
		||||
      }
 | 
			
		||||
    ];
 | 
			
		||||
    initExtraFirst = ''
 | 
			
		||||
      if [[ -f /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh ]]; then
 | 
			
		||||
        . /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh
 | 
			
		||||
        . /nix/var/nix/profiles/default/etc/profile.d/nix.sh
 | 
			
		||||
      fi
 | 
			
		||||
 | 
			
		||||
      # Define variables for directories
 | 
			
		||||
      export PATH=$HOME/.pnpm-packages/bin:$HOME/.pnpm-packages:$PATH
 | 
			
		||||
      export PATH=$HOME/.npm-packages/bin:$HOME/bin:$PATH
 | 
			
		||||
      export PATH=$HOME/.local/share/bin:$PATH
 | 
			
		||||
 | 
			
		||||
      # Remove history data we don't want to see
 | 
			
		||||
      export HISTIGNORE="pwd:ls:cd"
 | 
			
		||||
 | 
			
		||||
      # Ripgrep alias
 | 
			
		||||
      alias search=rg -p --glob '!node_modules/*'  $@
 | 
			
		||||
 | 
			
		||||
      # Emacs is my editor
 | 
			
		||||
      export ALTERNATE_EDITOR=""
 | 
			
		||||
      export EDITOR="emacsclient -t"
 | 
			
		||||
      export VISUAL="emacsclient -c -a emacs"
 | 
			
		||||
 | 
			
		||||
      e() {
 | 
			
		||||
          emacsclient -t "$@"
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      # nix shortcuts
 | 
			
		||||
      shell() {
 | 
			
		||||
          nix-shell '<nixpkgs>' -A "$1"
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      # pnpm is a javascript package manager
 | 
			
		||||
      alias pn=pnpm
 | 
			
		||||
      alias px=pnpx
 | 
			
		||||
 | 
			
		||||
      # Use difftastic, syntax-aware diffing
 | 
			
		||||
      alias diff=difft
 | 
			
		||||
 | 
			
		||||
      # Always color ls and group directories
 | 
			
		||||
      alias ls='ls --color=auto'
 | 
			
		||||
    '';
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  git = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    ignores = [ "*.swp" ];
 | 
			
		||||
    userName = name;
 | 
			
		||||
    userEmail = email;
 | 
			
		||||
    lfs = {
 | 
			
		||||
      enable = true;
 | 
			
		||||
    };
 | 
			
		||||
    extraConfig = {
 | 
			
		||||
      init.defaultBranch = "main";
 | 
			
		||||
      core = {
 | 
			
		||||
	    editor = "vim";
 | 
			
		||||
        autocrlf = "input";
 | 
			
		||||
      };
 | 
			
		||||
      commit.gpgsign = true;
 | 
			
		||||
      pull.rebase = true;
 | 
			
		||||
      rebase.autoStash = true;
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  vim = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    plugins = with pkgs.vimPlugins; [ vim-airline vim-airline-themes vim-startify vim-tmux-navigator ];
 | 
			
		||||
    settings = { ignorecase = true; };
 | 
			
		||||
    extraConfig = ''
 | 
			
		||||
      "" General
 | 
			
		||||
      set number
 | 
			
		||||
      set history=1000
 | 
			
		||||
      set nocompatible
 | 
			
		||||
      set modelines=0
 | 
			
		||||
      set encoding=utf-8
 | 
			
		||||
      set scrolloff=3
 | 
			
		||||
      set showmode
 | 
			
		||||
      set showcmd
 | 
			
		||||
      set hidden
 | 
			
		||||
      set wildmenu
 | 
			
		||||
      set wildmode=list:longest
 | 
			
		||||
      set cursorline
 | 
			
		||||
      set ttyfast
 | 
			
		||||
      set nowrap
 | 
			
		||||
      set ruler
 | 
			
		||||
      set backspace=indent,eol,start
 | 
			
		||||
      set laststatus=2
 | 
			
		||||
      set clipboard=autoselect
 | 
			
		||||
 | 
			
		||||
      " Dir stuff
 | 
			
		||||
      set nobackup
 | 
			
		||||
      set nowritebackup
 | 
			
		||||
      set noswapfile
 | 
			
		||||
      set backupdir=~/.config/vim/backups
 | 
			
		||||
      set directory=~/.config/vim/swap
 | 
			
		||||
 | 
			
		||||
      " Relative line numbers for easy movement
 | 
			
		||||
      set relativenumber
 | 
			
		||||
      set rnu
 | 
			
		||||
 | 
			
		||||
      "" Whitespace rules
 | 
			
		||||
      set tabstop=8
 | 
			
		||||
      set shiftwidth=2
 | 
			
		||||
      set softtabstop=2
 | 
			
		||||
      set expandtab
 | 
			
		||||
 | 
			
		||||
      "" Searching
 | 
			
		||||
      set incsearch
 | 
			
		||||
      set gdefault
 | 
			
		||||
 | 
			
		||||
      "" Statusbar
 | 
			
		||||
      set nocompatible " Disable vi-compatibility
 | 
			
		||||
      set laststatus=2 " Always show the statusline
 | 
			
		||||
      let g:airline_theme='bubblegum'
 | 
			
		||||
      let g:airline_powerline_fonts = 1
 | 
			
		||||
 | 
			
		||||
      "" Local keys and such
 | 
			
		||||
      let mapleader=","
 | 
			
		||||
      let maplocalleader=" "
 | 
			
		||||
 | 
			
		||||
      "" Change cursor on mode
 | 
			
		||||
      :autocmd InsertEnter * set cul
 | 
			
		||||
      :autocmd InsertLeave * set nocul
 | 
			
		||||
 | 
			
		||||
      "" File-type highlighting and configuration
 | 
			
		||||
      syntax on
 | 
			
		||||
      filetype on
 | 
			
		||||
      filetype plugin on
 | 
			
		||||
      filetype indent on
 | 
			
		||||
 | 
			
		||||
      "" Paste from clipboard
 | 
			
		||||
      nnoremap <Leader>, "+gP
 | 
			
		||||
 | 
			
		||||
      "" Copy from clipboard
 | 
			
		||||
      xnoremap <Leader>. "+y
 | 
			
		||||
 | 
			
		||||
      "" Move cursor by display lines when wrapping
 | 
			
		||||
      nnoremap j gj
 | 
			
		||||
      nnoremap k gk
 | 
			
		||||
 | 
			
		||||
      "" Map leader-q to quit out of window
 | 
			
		||||
      nnoremap <leader>q :q<cr>
 | 
			
		||||
 | 
			
		||||
      "" Move around split
 | 
			
		||||
      nnoremap <C-h> <C-w>h
 | 
			
		||||
      nnoremap <C-j> <C-w>j
 | 
			
		||||
      nnoremap <C-k> <C-w>k
 | 
			
		||||
      nnoremap <C-l> <C-w>l
 | 
			
		||||
 | 
			
		||||
      "" Easier to yank entire line
 | 
			
		||||
      nnoremap Y y$
 | 
			
		||||
 | 
			
		||||
      "" Move buffers
 | 
			
		||||
      nnoremap <tab> :bnext<cr>
 | 
			
		||||
      nnoremap <S-tab> :bprev<cr>
 | 
			
		||||
 | 
			
		||||
      "" Like a boss, sudo AFTER opening the file to write
 | 
			
		||||
      cmap w!! w !sudo tee % >/dev/null
 | 
			
		||||
 | 
			
		||||
      let g:startify_lists = [
 | 
			
		||||
        \ { 'type': 'dir',       'header': ['   Current Directory '. getcwd()] },
 | 
			
		||||
        \ { 'type': 'sessions',  'header': ['   Sessions']       },
 | 
			
		||||
        \ { 'type': 'bookmarks', 'header': ['   Bookmarks']      }
 | 
			
		||||
        \ ]
 | 
			
		||||
 | 
			
		||||
      let g:startify_bookmarks = [
 | 
			
		||||
        \ '~/.local/share/src',
 | 
			
		||||
        \ ]
 | 
			
		||||
 | 
			
		||||
      let g:airline_theme='bubblegum'
 | 
			
		||||
      let g:airline_powerline_fonts = 1
 | 
			
		||||
      '';
 | 
			
		||||
     };
 | 
			
		||||
 | 
			
		||||
  alacritty = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    settings = {
 | 
			
		||||
      cursor = {
 | 
			
		||||
        style = "Block";
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      window = {
 | 
			
		||||
        opacity = 1.0;
 | 
			
		||||
        padding = {
 | 
			
		||||
          x = 24;
 | 
			
		||||
          y = 24;
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      font = {
 | 
			
		||||
        normal = {
 | 
			
		||||
          family = "MesloLGS NF";
 | 
			
		||||
          style = "Regular";
 | 
			
		||||
        };
 | 
			
		||||
        size = lib.mkMerge [
 | 
			
		||||
          (lib.mkIf pkgs.stdenv.hostPlatform.isLinux 10)
 | 
			
		||||
          (lib.mkIf pkgs.stdenv.hostPlatform.isDarwin 14)
 | 
			
		||||
        ];
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      dynamic_padding = true;
 | 
			
		||||
      decorations = "full";
 | 
			
		||||
      title = "Terminal";
 | 
			
		||||
      class = {
 | 
			
		||||
        instance = "Alacritty";
 | 
			
		||||
        general = "Alacritty";
 | 
			
		||||
      };
 | 
			
		||||
 | 
			
		||||
      colors = {
 | 
			
		||||
        primary = {
 | 
			
		||||
          background = "0x1f2528";
 | 
			
		||||
          foreground = "0xc0c5ce";
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        normal = {
 | 
			
		||||
          black = "0x1f2528";
 | 
			
		||||
          red = "0xec5f67";
 | 
			
		||||
          green = "0x99c794";
 | 
			
		||||
          yellow = "0xfac863";
 | 
			
		||||
          blue = "0x6699cc";
 | 
			
		||||
          magenta = "0xc594c5";
 | 
			
		||||
          cyan = "0x5fb3b3";
 | 
			
		||||
          white = "0xc0c5ce";
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        bright = {
 | 
			
		||||
          black = "0x65737e";
 | 
			
		||||
          red = "0xec5f67";
 | 
			
		||||
          green = "0x99c794";
 | 
			
		||||
          yellow = "0xfac863";
 | 
			
		||||
          blue = "0x6699cc";
 | 
			
		||||
          magenta = "0xc594c5";
 | 
			
		||||
          cyan = "0x5fb3b3";
 | 
			
		||||
          white = "0xd8dee9";
 | 
			
		||||
        };
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  ssh = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    includes = [
 | 
			
		||||
      (lib.mkIf pkgs.stdenv.hostPlatform.isLinux
 | 
			
		||||
        "/home/${user}/.ssh/config_external"
 | 
			
		||||
      )
 | 
			
		||||
      (lib.mkIf pkgs.stdenv.hostPlatform.isDarwin
 | 
			
		||||
        "/Users/${user}/.ssh/config_external"
 | 
			
		||||
      )
 | 
			
		||||
    ];
 | 
			
		||||
    matchBlocks = {
 | 
			
		||||
      "github.com" = {
 | 
			
		||||
        identitiesOnly = true;
 | 
			
		||||
        identityFile = [
 | 
			
		||||
          (lib.mkIf pkgs.stdenv.hostPlatform.isLinux
 | 
			
		||||
            "/home/${user}/.ssh/id_github"
 | 
			
		||||
          )
 | 
			
		||||
          (lib.mkIf pkgs.stdenv.hostPlatform.isDarwin
 | 
			
		||||
            "/Users/${user}/.ssh/id_github"
 | 
			
		||||
          )
 | 
			
		||||
        ];
 | 
			
		||||
      };
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
 | 
			
		||||
  tmux = {
 | 
			
		||||
    enable = true;
 | 
			
		||||
    plugins = with pkgs.tmuxPlugins; [
 | 
			
		||||
      vim-tmux-navigator
 | 
			
		||||
      sensible
 | 
			
		||||
      yank
 | 
			
		||||
      prefix-highlight
 | 
			
		||||
      {
 | 
			
		||||
        plugin = power-theme;
 | 
			
		||||
        extraConfig = ''
 | 
			
		||||
           set -g @tmux_power_theme 'gold'
 | 
			
		||||
        '';
 | 
			
		||||
      }
 | 
			
		||||
      {
 | 
			
		||||
        plugin = resurrect; # Used by tmux-continuum
 | 
			
		||||
 | 
			
		||||
        # Use XDG data directory
 | 
			
		||||
        # https://github.com/tmux-plugins/tmux-resurrect/issues/348
 | 
			
		||||
        extraConfig = ''
 | 
			
		||||
          set -g @resurrect-dir '$HOME/.cache/tmux/resurrect'
 | 
			
		||||
          set -g @resurrect-capture-pane-contents 'on'
 | 
			
		||||
          set -g @resurrect-pane-contents-area 'visible'
 | 
			
		||||
        '';
 | 
			
		||||
      }
 | 
			
		||||
      {
 | 
			
		||||
        plugin = continuum;
 | 
			
		||||
        extraConfig = ''
 | 
			
		||||
          set -g @continuum-restore 'on'
 | 
			
		||||
          set -g @continuum-save-interval '5' # minutes
 | 
			
		||||
        '';
 | 
			
		||||
      }
 | 
			
		||||
    ];
 | 
			
		||||
    terminal = "screen-256color";
 | 
			
		||||
    prefix = "C-x";
 | 
			
		||||
    escapeTime = 10;
 | 
			
		||||
    historyLimit = 50000;
 | 
			
		||||
    extraConfig = ''
 | 
			
		||||
      # Remove Vim mode delays
 | 
			
		||||
      set -g focus-events on
 | 
			
		||||
 | 
			
		||||
      # Enable full mouse support
 | 
			
		||||
      set -g mouse on
 | 
			
		||||
 | 
			
		||||
      # -----------------------------------------------------------------------------
 | 
			
		||||
      # Key bindings
 | 
			
		||||
      # -----------------------------------------------------------------------------
 | 
			
		||||
 | 
			
		||||
      # Unbind default keys
 | 
			
		||||
      unbind C-b
 | 
			
		||||
      unbind '"'
 | 
			
		||||
      unbind %
 | 
			
		||||
 | 
			
		||||
      # Split panes, vertical or horizontal
 | 
			
		||||
      bind-key x split-window -v
 | 
			
		||||
      bind-key v split-window -h
 | 
			
		||||
 | 
			
		||||
      # Move around panes with vim-like bindings (h,j,k,l)
 | 
			
		||||
      bind-key -n M-k select-pane -U
 | 
			
		||||
      bind-key -n M-h select-pane -L
 | 
			
		||||
      bind-key -n M-j select-pane -D
 | 
			
		||||
      bind-key -n M-l select-pane -R
 | 
			
		||||
 | 
			
		||||
      # Smart pane switching with awareness of Vim splits.
 | 
			
		||||
      # This is copy paste from https://github.com/christoomey/vim-tmux-navigator
 | 
			
		||||
      is_vim="ps -o state= -o comm= -t '#{pane_tty}' \
 | 
			
		||||
        | grep -iqE '^[^TXZ ]+ +(\\S+\\/)?g?(view|n?vim?x?)(diff)?$'"
 | 
			
		||||
      bind-key -n 'C-h' if-shell "$is_vim" 'send-keys C-h'  'select-pane -L'
 | 
			
		||||
      bind-key -n 'C-j' if-shell "$is_vim" 'send-keys C-j'  'select-pane -D'
 | 
			
		||||
      bind-key -n 'C-k' if-shell "$is_vim" 'send-keys C-k'  'select-pane -U'
 | 
			
		||||
      bind-key -n 'C-l' if-shell "$is_vim" 'send-keys C-l'  'select-pane -R'
 | 
			
		||||
      tmux_version='$(tmux -V | sed -En "s/^tmux ([0-9]+(.[0-9]+)?).*/\1/p")'
 | 
			
		||||
      if-shell -b '[ "$(echo "$tmux_version < 3.0" | bc)" = 1 ]' \
 | 
			
		||||
        "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\'  'select-pane -l'"
 | 
			
		||||
      if-shell -b '[ "$(echo "$tmux_version >= 3.0" | bc)" = 1 ]' \
 | 
			
		||||
        "bind-key -n 'C-\\' if-shell \"$is_vim\" 'send-keys C-\\\\'  'select-pane -l'"
 | 
			
		||||
 | 
			
		||||
      bind-key -T copy-mode-vi 'C-h' select-pane -L
 | 
			
		||||
      bind-key -T copy-mode-vi 'C-j' select-pane -D
 | 
			
		||||
      bind-key -T copy-mode-vi 'C-k' select-pane -U
 | 
			
		||||
      bind-key -T copy-mode-vi 'C-l' select-pane -R
 | 
			
		||||
      bind-key -T copy-mode-vi 'C-\' select-pane -l
 | 
			
		||||
      '';
 | 
			
		||||
    };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										61
									
								
								modules/shared/packages.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										61
									
								
								modules/shared/packages.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,61 @@
 | 
			
		||||
{ pkgs }:
 | 
			
		||||
 | 
			
		||||
with pkgs; [
 | 
			
		||||
  # General packages for development and system management
 | 
			
		||||
  alacritty
 | 
			
		||||
  aspell
 | 
			
		||||
  aspellDicts.en
 | 
			
		||||
  bash-completion
 | 
			
		||||
  bat
 | 
			
		||||
  btop
 | 
			
		||||
  coreutils
 | 
			
		||||
  killall
 | 
			
		||||
  neofetch
 | 
			
		||||
  openssh
 | 
			
		||||
  sqlite
 | 
			
		||||
  wget
 | 
			
		||||
  zip
 | 
			
		||||
 | 
			
		||||
  # Encryption and security tools
 | 
			
		||||
  age
 | 
			
		||||
  age-plugin-yubikey
 | 
			
		||||
  gnupg
 | 
			
		||||
  libfido2
 | 
			
		||||
 | 
			
		||||
  # Cloud-related tools and SDKs
 | 
			
		||||
  docker
 | 
			
		||||
  docker-compose
 | 
			
		||||
 | 
			
		||||
  # Media-related packages
 | 
			
		||||
  emacs-all-the-icons-fonts
 | 
			
		||||
  dejavu_fonts
 | 
			
		||||
  ffmpeg
 | 
			
		||||
  fd
 | 
			
		||||
  font-awesome
 | 
			
		||||
  hack-font
 | 
			
		||||
  noto-fonts
 | 
			
		||||
  noto-fonts-emoji
 | 
			
		||||
  meslo-lgs-nf
 | 
			
		||||
 | 
			
		||||
  # Node.js development tools
 | 
			
		||||
  nodePackages.npm # globally install npm
 | 
			
		||||
  nodePackages.prettier
 | 
			
		||||
  nodejs
 | 
			
		||||
 | 
			
		||||
  # Text and terminal utilities
 | 
			
		||||
  htop
 | 
			
		||||
  hunspell
 | 
			
		||||
  iftop
 | 
			
		||||
  jetbrains-mono
 | 
			
		||||
  jq
 | 
			
		||||
  ripgrep
 | 
			
		||||
  tree
 | 
			
		||||
  tmux
 | 
			
		||||
  unrar
 | 
			
		||||
  unzip
 | 
			
		||||
  zsh-powerlevel10k
 | 
			
		||||
 | 
			
		||||
  # Python packages
 | 
			
		||||
  python3
 | 
			
		||||
  virtualenv
 | 
			
		||||
]
 | 
			
		||||
							
								
								
									
										30
									
								
								overlays/10-feather-font.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								overlays/10-feather-font.nix
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,30 @@
 | 
			
		||||
self: super: with super; {
 | 
			
		||||
 | 
			
		||||
  feather-font = let
 | 
			
		||||
    version = "1.0";
 | 
			
		||||
    pname = "feather-font";
 | 
			
		||||
  in stdenv.mkDerivation {
 | 
			
		||||
    name = "${pname}-${version}";
 | 
			
		||||
 | 
			
		||||
    src = fetchzip {
 | 
			
		||||
      url = "https://github.com/dustinlyons/feather-font/archive/refs/tags/${version}.zip";
 | 
			
		||||
      sha256 = "sha256-Zsz8/qn7XAG6BVp4XdqooEqioFRV7bLH0bQkHZvFbsg=";
 | 
			
		||||
    };
 | 
			
		||||
 | 
			
		||||
    buildInputs = [ unzip ];
 | 
			
		||||
    phases = [ "unpackPhase" "installPhase" ];
 | 
			
		||||
 | 
			
		||||
    installPhase = ''
 | 
			
		||||
      mkdir -p $out/share/fonts/truetype
 | 
			
		||||
      cp $src/feather.ttf $out/share/fonts/truetype/
 | 
			
		||||
    '';
 | 
			
		||||
 | 
			
		||||
    meta = with lib; {
 | 
			
		||||
      homepage = "https://www.feathericons.com/";
 | 
			
		||||
      description = "Set of font icons from the open source collection Feather Icons";
 | 
			
		||||
      license = licenses.mit;
 | 
			
		||||
      maintainers = [ maintainers.dlyons ];
 | 
			
		||||
      platforms = [ platforms.x86_64-linux platforms.x86_64-darwin ];
 | 
			
		||||
    };
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										6
									
								
								overlays/README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								overlays/README.md
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,6 @@
 | 
			
		||||
# Overlays
 | 
			
		||||
 | 
			
		||||
Files in this directory run automatically as part of each build. Some common ways I've used overlays in the past:
 | 
			
		||||
* Applying patches
 | 
			
		||||
* Downloading different versions of files (locking to a version or trying a fork)
 | 
			
		||||
* Workarounds and stuff I need to run temporarily
 | 
			
		||||
		Reference in New Issue
	
	Block a user