initial commit

development
Madeleine 3 years ago
commit 5aabf26cd7
No known key found for this signature in database
GPG Key ID: 64FAA9959751687D

2
.gitignore vendored

@ -0,0 +1,2 @@
result
*/result

@ -0,0 +1,10 @@
# Maddie's NixFiles
A Nix flake for my system configuration - WIP.
## Structure
- `./maddie` - A folder for my home-manager config
- `./system` - A folder for my system-wide config
- `overlays.nix` - A file for my nixpkgs overlays
## Many thanks
- ❤️ Thanks to @Minion3665 who helped me make this config

@ -0,0 +1,62 @@
{
"nodes": {
"home-manager": {
"inputs": {
"nixpkgs": [
"nixpkgs"
],
"utils": "utils"
},
"locked": {
"lastModified": 1678109311,
"narHash": "sha256-Q64FoCH5rp3XHoC8u1+KyjLEFGTY7kX9YaIaYfugvfY=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "04d6cad67557512452decbfe888c68fa11338a96",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "home-manager",
"type": "github"
}
},
"nixpkgs": {
"locked": {
"lastModified": 1678116888,
"narHash": "sha256-/Y4RTkPq+RVJjkoM/mYyCREFLZhvtISc/rLcgM1vLvo=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "49596eb4e50b18337aad3b73317371bcd4e3b047",
"type": "github"
},
"original": {
"id": "nixpkgs",
"type": "indirect"
}
},
"root": {
"inputs": {
"home-manager": "home-manager",
"nixpkgs": "nixpkgs"
}
},
"utils": {
"locked": {
"lastModified": 1676283394,
"narHash": "sha256-XX2f9c3iySLCw54rJ/CZs+ZK6IQy7GXNY4nSOyu2QG4=",
"owner": "numtide",
"repo": "flake-utils",
"rev": "3db36a8b464d0c4532ba1c7dda728f4576d6d073",
"type": "github"
},
"original": {
"owner": "numtide",
"repo": "flake-utils",
"type": "github"
}
}
},
"root": "root",
"version": 7
}

@ -0,0 +1,36 @@
{
description = "Maddie's NixOS configuration";
inputs = {
# Home manager
home-manager.url = "github:nix-community/home-manager";
home-manager.inputs.nixpkgs.follows = "nixpkgs";
};
outputs = { self, nixpkgs, home-manager }:
let
username = "spy";
system = "x86_64-linux";
pkgs = import nixpkgs { inherit system; config.allowUnfree = true; overlays = import ./overlays.nix; };
utils = import ./utils pkgs;
specialArgs = { inherit username; inherit pkgs; };
in
{
packages.${system} = {
nixosConfigurations.luna = nixpkgs.lib.nixosSystem {
inherit system;
inherit pkgs;
inherit specialArgs;
modules = [
home-manager.nixosModules.home-manager
{
home-manager.users.${username}.imports = utils.nixFilesIn ./maddie;
home-manager.extraSpecialArgs = specialArgs;
}
] ++ utils.nixFilesIn ./system;
};
};
formatter.x86_64-linux = nixpkgs.legacyPackages.x86_64-linux.nixpkgs-fmt;
};
}

@ -0,0 +1,15 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
pulsemixer # TUI sound mixer
pamixer # CLI sound mixer
playerctl # Manages media players
cava # Music visualiser
];
home.file.".local/bin/ytdlp-music" = {
source = ./audio/ytdlp-music.sh;
executable = true;
};
}

@ -0,0 +1,6 @@
#!/usr/bin/env sh
echo "Name:" && read name
echo "URL:" && read url
yt-dlp -x --no-playlist --embed-thumbnail -no-embed-metadata --audio-quality 0 --audio-format flac -o "$name" "$url"

@ -0,0 +1,12 @@
{ config, pkgs, ...}:
{
home.packages = with pkgs; [
slock
];
home.file.".local/bin/bosskey" = {
source = ./bosskey/bosskey.sh;
executable = true;
};
}

@ -0,0 +1,50 @@
#!/bin/sh
# ____ _
# | __ ) ___ ___ ___| | _____ _ _
# | _ \ / _ \/ __/ __| |/ / _ \ | | |
# | |_) | (_) \__ \__ \ < __/ |_| |
# |____/ \___/|___/___/_|\_\___|\__, |
# |___/ v1.2
# GitHub: https://github.com/SpyHoodle/bosskey
function refresh_statusbar() {
case $1 in
dwmblocks)
# Refresh dwmblocks as it only updates when told so
kill -35 $(pidof dwmblocks)
;;
esac
}
while getopts "lmpur" options; do
case $options in
m)
# Mute the volume
pamixer --mute
;;
p)
# Pause any playing media
playerctl pause
;;
l)
# Lock the screen using slock(1)
slock
;;
u)
# Unmute the audio
pamixer --unmute
;;
r)
# Refresh a dwmblocks status bar
refresh_statusbar "dwmblocks"
;;
esac
done

@ -0,0 +1,10 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
tor-browser-bundle-bin
librewolf
amfora
lynx
];
}

@ -0,0 +1,12 @@
{ config, ...}:
{
programs.btop = {
enable = true;
settings = {
color_theme = "TTY";
theme_background = false;
truecolor = true;
};
};
}

@ -0,0 +1,7 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
nodePackages.insect
];
}

@ -0,0 +1,29 @@
{ config, ... }:
{
programs.chromium = {
enable = true;
commandLineArgs = [
"--enable-logging=stderr"
"--ignore-gpu-blocklist"
];
extensions = [
# Dark Reader
{ id = "eimadpbcbfnmbkopoojfekhnkhdbieeh"; }
# uBlock Origin
{ id = "cjpalhdlnbpafiamejdnhcphjbkeiagm"; }
# I still don't care about cookies
{ id = "edibdbjcniadpccecjdfdjjppcpchdlm"; }
# NoScript
{ id = "doojmbjmlfjjnbmnoijecmcbfeoakpjm"; }
# Reddit Enhancement Suite
{ id = "kbmfpngjjgdllneeigpgjifpgocmfgmb"; }
# Old Reddit Redirect
{ id = "dneaehbmnbhcippjikoajpoabadpodje"; }
# Return Youtube Dislike
{ id = "gebbhagfogifgggkldgodflihgfeippi"; }
# Vimium
{ id = "dbepggeogbaibhgnhhndojpepiihcmeb"; }
];
};
}

@ -0,0 +1,9 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
python3Full # Python
go # Go
gcc # C
];
}

@ -0,0 +1,17 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
dmenu
];
home.file.".local/bin/dmenu" = {
source = ./dmenu;
executable = true;
recursive = true;
};
home.sessionPath = [
"$HOME/.local/bin/dmenu"
];
}

@ -0,0 +1,317 @@
#!/bin/sh
# _ _ _ _ _ _
# __| |_ __ ___ ___ _ __ _ _ | |__ | |_ _ ___| |_ ___ ___ | |_ | |__
# / _` | '_ ` _ \ / _ \ '_ \| | | |_____| '_ \| | | | |/ _ \ __/ _ \ / _ \| __|| '_ \
# | (_| | | | | | | __/ | | | |_| |_____| |_) | | |_| | __/ || (_) | (_) | |_ | | | |
# \__,_|_| |_| |_|\___|_| |_|\__,_| |_.__/|_|\__,_|\___|\__\___/ \___/ \__||_| |_|
#
# Author: Nick Clyde (clydedroid)
# dmenu support by: Layerex
#
# A script that generates a dmenu menu that uses bluetoothctl to
# connect to bluetooth devices and display status info.
#
# Inspired by networkmanager-dmenu (https://github.com/firecat53/networkmanager-dmenu)
# Thanks to x70b1 (https://github.com/polybar/polybar-scripts/tree/master/polybar-scripts/system-bluetooth-bluetoothctl)
#
# Depends on:
# Arch repositories: dmenu, bluez-utils (contains bluetoothctl)
# Constants
divider="---------"
goback="Back"
# Checks if bluetooth controller is powered on
power_on() {
if bluetoothctl show | grep -F -q "Powered: yes"; then
return 0
else
return 1
fi
}
# Toggles power state
toggle_power() {
if power_on; then
bluetoothctl power off
show_menu
else
if rfkill list bluetooth | grep -F -q 'blocked: yes'; then
rfkill unblock bluetooth && sleep 3
fi
bluetoothctl power on
show_menu
fi
}
# Checks if controller is scanning for new devices
scan_on() {
if bluetoothctl show | grep -F -q "Discovering: yes"; then
echo "Scan: on"
return 0
else
echo "Scan: off"
return 1
fi
}
# Toggles scanning state
toggle_scan() {
if scan_on; then
kill "$(pgrep -F -f "bluetoothctl scan on")"
bluetoothctl scan off
show_menu
else
bluetoothctl scan on &
echo "Scanning..."
sleep 5
show_menu
fi
}
# Checks if controller is able to pair to devices
pairable_on() {
if bluetoothctl show | grep -F -q "Pairable: yes"; then
echo "Pairable: on"
return 0
else
echo "Pairable: off"
return 1
fi
}
# Toggles pairable state
toggle_pairable() {
if pairable_on; then
bluetoothctl pairable off
show_menu
else
bluetoothctl pairable on
show_menu
fi
}
# Checks if controller is discoverable by other devices
discoverable_on() {
if bluetoothctl show | grep -F -q "Discoverable: yes"; then
echo "Discoverable: on"
return 0
else
echo "Discoverable: off"
return 1
fi
}
# Toggles discoverable state
toggle_discoverable() {
if discoverable_on; then
bluetoothctl discoverable off
show_menu
else
bluetoothctl discoverable on
show_menu
fi
}
# Checks if a device is connected
device_connected() {
device_info=$(bluetoothctl info "$1")
if echo "$device_info" | grep -F -q "Connected: yes"; then
return 0
else
return 1
fi
}
# Toggles device connection
toggle_connection() {
if device_connected "$1"; then
bluetoothctl disconnect "$1"
# device_menu "$device"
else
bluetoothctl connect "$1"
# device_menu "$device"
fi
}
# Checks if a device is paired
device_paired() {
device_info=$(bluetoothctl info "$1")
if echo "$device_info" | grep -F -q "Paired: yes"; then
echo "Paired: yes"
return 0
else
echo "Paired: no"
return 1
fi
}
# Toggles device paired state
toggle_paired() {
if device_paired "$1"; then
bluetoothctl remove "$1"
device_menu "$device"
else
bluetoothctl pair "$1"
device_menu "$device"
fi
}
# Checks if a device is trusted
device_trusted() {
device_info=$(bluetoothctl info "$1")
if echo "$device_info" | grep -F -q "Trusted: yes"; then
echo "Trusted: yes"
return 0
else
echo "Trusted: no"
return 1
fi
}
# Toggles device connection
toggle_trust() {
if device_trusted "$1"; then
bluetoothctl untrust "$1"
device_menu "$device"
else
bluetoothctl trust "$1"
device_menu "$device"
fi
}
# Prints a short string with the current bluetooth status
# Useful for status bars like polybar, etc.
print_status() {
if power_on; then
printf ''
mapfile -t paired_devices < <(bluetoothctl paired-devices | grep -F Device | cut -d ' ' -f 2)
counter=0
for device in "${paired_devices[@]}"; do
if device_connected "$device"; then
device_alias="$(bluetoothctl info "$device" | grep -F "Alias" | cut -d ' ' -f 2-)"
if [ $counter -gt 0 ]; then
printf ", %s" "$device_alias"
else
printf " %s" "$device_alias"
fi
((counter++))
fi
done
printf "\n"
else
echo ""
fi
}
# A submenu for a specific device that allows connecting, pairing, and trusting
device_menu() {
device=$1
# Get device name and mac address
device_name="$(echo "$device" | cut -d ' ' -f 3-)"
mac="$(echo "$device" | cut -d ' ' -f 2)"
# Build options
if device_connected "$mac"; then
connected="Connected: yes"
else
connected="Connected: no"
fi
paired=$(device_paired "$mac")
trusted=$(device_trusted "$mac")
options="$connected\n$paired\n$trusted\n$divider\n$goback\nExit"
# Open dmenu menu, read chosen option
chosen="$(echo -e "$options" | run_dmenu "$device_name")"
# Match chosen option to command
case $chosen in
"" | "$divider")
echo "No option chosen."
;;
"$connected")
toggle_connection "$mac"
;;
"$paired")
toggle_paired "$mac"
;;
"$trusted")
toggle_trust "$mac"
;;
"$goback")
show_menu
;;
esac
}
# Opens a dmenu menu with current bluetooth status and options to connect
show_menu() {
# Get menu options
if power_on; then
power="Power: on"
# Human-readable names of devices, one per line
# If scan is off, will only list paired devices
devices=$(bluetoothctl devices | grep -F Device | cut -d ' ' -f 3-)
# Get controller flags
scan=$(scan_on)
pairable=$(pairable_on)
discoverable=$(discoverable_on)
# Options passed to dmenu
options="$devices\n$divider\n$power\n$scan\n$pairable\n$discoverable\nExit"
else
power="Power: off"
options="$power\nExit"
fi
# Open dmenu menu, read chosen option
chosen="$(echo -e "$options" | run_dmenu "Bluetooth")"
# Match chosen option to command
case $chosen in
"" | "$divider")
echo "No option chosen."
;;
"$power")
toggle_power
;;
"$scan")
toggle_scan
;;
"$discoverable")
toggle_discoverable
;;
"$pairable")
toggle_pairable
;;
*)
device=$(bluetoothctl devices | grep -F "$chosen")
# Open a submenu if a device is selected
if [[ $device ]]; then device_menu "$device"; fi
;;
esac
}
original_args=("$@")
# dmenu command to pipe into. Extra arguments to dmenu-bluetooth are passed through to dmenu. This
# allows the user to set fonts, sizes, colours, etc.
run_dmenu() {
dmenu "${original_args[@]}" -i -p "$1"
}
case "$1" in
--status)
print_status
;;
*)
show_menu
;;
esac

@ -0,0 +1,67 @@
#!/bin/sh
# Gives a dmenu prompt to mount unmounted drives and Android phones. If
# they're in /etc/fstab, they'll be mounted automatically. Otherwise, you'll
# be prompted to give a mountpoint from already existsing directories. If you
# input a novel directory, it will prompt you to create that directory.
getmount() { \
[ -z "$chosen" ] && exit 1
# shellcheck disable=SC2086
mp="$(find $1 2>/dev/null | dmenu -i -p "Type in mount point.")" || exit 1
test -z "$mp" && exit 1
if [ ! -d "$mp" ]; then
mkdiryn=$(printf "No\\nYes" | dmenu -i -p "$mp does not exist. Create it?") || exit 1
[ "$mkdiryn" = "Yes" ] && (mkdir -p "$mp" || sudo -A mkdir -p "$mp")
fi
}
mountusb() { \
chosen="$(echo "$usbdrives" | dmenu -i -p "Mount which drive?")" || exit 1
chosen="$(echo "$chosen" | awk '{print $1}')"
sudo -A mount "$chosen" 2>/dev/null && notify-send "💻 USB mounting" "$chosen mounted." && exit 0
alreadymounted=$(lsblk -nrpo "name,type,mountpoint" | awk '$3!~/\/boot|\/home$|SWAP/&&length($3)>1{printf "-not ( -path *%s -prune ) ",$3}')
getmount "/mnt /media /mount /home -maxdepth 5 -type d $alreadymounted"
partitiontype="$(lsblk -no "fstype" "$chosen")"
case "$partitiontype" in
"vfat") sudo -A mount -t vfat "$chosen" "$mp" -o rw,umask=0000;;
"exfat") sudo -A mount "$chosen" "$mp" -o uid="$(id -u)",gid="$(id -g)";;
*) sudo -A mount "$chosen" "$mp"; user="$(whoami)"; ug="$(groups | awk '{print $1}')"; sudo -A chown "$user":"$ug" "$mp";;
esac
notify-send "💻 USB mounting" "$chosen mounted to $mp."
}
mountandroid() { \
chosen="$(echo "$anddrives" | dmenu -i -p "Which Android device?")" || exit 1
chosen="$(echo "$chosen" | cut -d : -f 1)"
getmount "$HOME -maxdepth 3 -type d"
simple-mtpfs --device "$chosen" "$mp"
echo "OK" | dmenu -i -p "Tap Allow on your phone if it asks for permission and then press enter" || exit 1
simple-mtpfs --device "$chosen" "$mp"
notify-send "🤖 Android Mounting" "Android device mounted to $mp."
}
asktype() { \
choice="$(printf "USB\\nAndroid" | dmenu -i -p "Mount a USB drive or Android device?")" || exit 1
case $choice in
USB) mountusb ;;
Android) mountandroid ;;
esac
}
anddrives=$(simple-mtpfs -l 2>/dev/null)
usbdrives="$(lsblk -rpo "name,type,size,mountpoint" | grep 'part\|rom' | awk '$4==""{printf "%s (%s)\n",$1,$3}')"
if [ -z "$usbdrives" ]; then
[ -z "$anddrives" ] && echo "No USB drive or Android device detected" && exit
echo "Android device(s) detected."
mountandroid
else
if [ -z "$anddrives" ]; then
echo "USB drive(s) detected."
mountusb
else
echo "Mountable USB drive(s) and Android device(s) detected."
asktype
fi
fi

@ -0,0 +1,35 @@
#!/usr/bin/env bash
shopt -s nullglob globstar
typeit=0
if [[ $1 == "--type" ]]; then
typeit=1
shift
fi
if [[ -n $WAYLAND_DISPLAY ]]; then
dmenu=dmenu-wl
xdotool="ydotool type --file -"
elif [[ -n $DISPLAY ]]; then
dmenu=dmenu
xdotool="xdotool type --clearmodifiers --file -"
else
echo "Error: No Wayland or X11 display detected" >&2
exit 1
fi
prefix=${PASSWORD_STORE_DIR-~/.password-store}
password_files=( "$prefix"/**/*.gpg )
password_files=( "${password_files[@]#"$prefix"/}" )
password_files=( "${password_files[@]%.gpg}" )
password=$(printf '%s\n' "${password_files[@]}" | "$dmenu" "$@")
[[ -n $password ]] || exit
if [[ $typeit -eq 0 ]]; then
pass show -c "$password" 2>/dev/null
else
pass show "$password" | { IFS= read -r pass; printf %s "$pass"; } | $xdotool
fi

@ -0,0 +1,9 @@
#!/bin/sh
poweroff() { sudo poweroff ;}
restart() { killall -HUP dwm ;}
reboot() { sudo reboot ;}
lock() { bosskey ;}
func="$(declare -F | awk '{print $3}' | dmenu -i -p "Powermenu:")"
[ -z "$func" ] || "$func"

@ -0,0 +1,18 @@
#!/bin/sh
# The famous "get a menu of emojis to copy" script.
# Get user selection via dmenu from emoji file.
chosen=$(cut -d ';' -f1 ~/.local/share/emoji-list | dmenu -i -l 30 | sed "s/ .*//")
# Exit if none chosen.
[ -z "$chosen" ] && exit
# If you run this command with an argument, it will automatically insert the
# character. Otherwise, show a message that the emoji has been copied.
if [ -n "$1" ]; then
xdotool type "$chosen"
else
printf "$chosen" | xclip -selection clipboard
notify-send "'$chosen' copied to clipboard." &
fi

@ -0,0 +1,44 @@
{ config, pkgs, ... }:
{
services.dunst = {
enable = true;
settings = {
global = {
# Style
format = "<b>%s</b>\n%b";
font = "Iosevka 10";
width = 370;
height = 370;
offset = "0x50";
padding = 5;
frame_width = 2;
# Location
monitor = 0;
origin = "bottom-center";
};
urgency_low = {
background = "#121317";
foreground = "#D6DEEB";
frame_color = "#2C323D";
timeout = 3;
};
urgency_normal = {
background = "#121317";
foreground = "#D6DEEB";
frame_color = "#2C323D";
timeout = 5;
};
urgency_critical = {
background = "#121317";
foreground = "#D6DEEB";
frame_color = "#E06C75";
timeout = 10;
};
};
};
}

@ -0,0 +1,7 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
dwm # Suckless dynamic window manager
];
}

@ -0,0 +1,10 @@
{ config, pkgs, ... }:
{
# Misc editors
home.packages = with pkgs; [
vscode
helix
vis
];
}

@ -0,0 +1,9 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
pridefetch # System stats with pride flags
neofetch # Generic system stats
pfetch # Simple system stats
];
}

@ -0,0 +1,8 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
ncdu_2 # Disk space manager
clifm # TUI file manager
];
}

@ -0,0 +1,48 @@
{ config, ... }:
{
programs.firefox = {
enable = true;
profiles = {
"maddie" = {
name = "Maddie";
bookmarks = [
{
name = "Home";
bookmarks = [
{
name = "BT Home Hub";
url = "http://192.168.1.254/";
}
{
name = "Home Assistant";
url = "http://192.168.1.105:8123/lovelace/0";
}
{
name = "Security Cameras";
url = "http://192.168.1.108/";
}
{
name = "Fast";
url = "https://fast.com/";
}
];
}
{
name = "Nix";
bookmarks = [
{
name = "NixOS Packages";
url = "https://search.nixos.org/packages";
}
{
name = "NixOS Options";
url = "https://search.nixos.org/options";
}
];
}
];
};
};
};
}

@ -0,0 +1,9 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
gzdoom # Modern doom runner
pcsx2 # PS2 Emulator# PS2 Emulator# PS2 Emulator
steam # Large games store
];
}

@ -0,0 +1,41 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
gitkraken
gh
];
home.file.".local/bin/git-sync" = {
source = ./git/git-sync.sh;
executable = true;
};
programs.git = {
enable = true;
lfs.enable = true;
userName = "Madeleine";
userEmail = "spyhoodle@icloud.com";
signing = {
key = "A8B3F646462101EEA4493B3164FAA9959751687D";
signByDefault = true;
gpgPath = "gpg2";
};
aliases = {
graph = "log --graph --oneline --decorate";
unstage = "reset HEAD --";
co = "checkout";
br = "branch";
ci = "commit";
st = "status";
ps = "push";
};
extraConfig = {
init.defaultBranch = "development";
pull.rebase = "merges";
};
};
}

@ -0,0 +1,6 @@
#!/usr/bin/env sh
git add .
git commit -am "$(date --iso-8601)"
git pull
git push

@ -0,0 +1,20 @@
{ config, pkgs, ... }:
{
gtk = {
enable = true;
font = {
package = pkgs.iosevka;
name = "Iosevka";
size = 10;
};
theme = {
package = pkgs.gruvbox-dark-gtk;
name = "gruvbox-dark";
};
iconTheme = {
package = pkgs.zafiro-icons;
name = "Zafiro-icons-Dark";
};
};
}

@ -0,0 +1,10 @@
{ config, username, ... }:
{
programs.home-manager.enable = true;
home = {
inherit username;
homeDirectory = "/home/${username}";
stateVersion = "22.11";
};
}

@ -0,0 +1,19 @@
{ config, pkgs, ... }:
{
programs.htop = {
enable = true;
package = pkgs.htop-vim;
settings = {
hide_kernel_threads = 1;
hide_userland_threads = 1;
highlight_base_name = 1;
show_cpu_usage = 1;
show_cpu_frequency = 1;
show_cpu_temperature = 1;
degree_fahrenheit = 0;
enable_mouse = 1;
tree_view = 1;
};
};
}

@ -0,0 +1,10 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
jetbrains.clion
jetbrains.goland
jetbrains.webstorm
jetbrains.pycharm-professional
];
}

@ -0,0 +1,25 @@
{ config, pkgs, ... }:
{
programs.kakoune = {
enable = true;
config = {
numberLines = {
enable = true;
relative = true;
};
scrollOff.lines = 3;
showWhitespace.enable = true;
tabStop = 4;
ui = {
assistant = "cat";
enableMouse = true;
};
};
plugins = with pkgs.kakounePlugins; [
kakoune-rainbow
powerline-kak
auto-pairs-kak
];
};
}

@ -0,0 +1,10 @@
{ config, ... }:
{
services.kdeconnect.enable = true;
home.file.".xinitrc".text = ''
# Start kdeconnect when entering a graphical session
systemctl restart --user kdeconnect &
'';
}

@ -0,0 +1,9 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
libheif # Manage .heif files from phones
gcolor2 # Color viewer and eyedropper
ffmpeg # Video manipulator
];
}

@ -0,0 +1,10 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
signal-desktop # Signal client
discord-canary # Discord client
ripcord # Better discord client
element # Matrix client
];
}

@ -0,0 +1,9 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
prismlauncher # Minecraft launcher
minecraft # Actual minecraft
jdk # Needed for running minecraft servers
];
}

@ -0,0 +1,12 @@
{ config, ... }:
{
programs.zsh.initExtra = ''
precmd() { [ $? -ne 0 ] && $HOME/.local/bin/mommy -n }
'';
home.file.".local/bin/mommy" = {
source = ./mommy/shell-mommy.sh;
executable = true;
};
}

@ -0,0 +1,77 @@
#!/usr/bin/env sh
usage() { printf "usage: $0 [-pn]\n -p: positive response\n -n: negative response\n"; }
[ $# -eq 0 ] && usage && exit 0;
[ -z "$MOMMYS_LITTLE" ] && MOMMYS_LITTLE="girl"
[ -z "$MOMMYS_PRONOUN" ] && MOMMYS_PRONOUN="her"
[ -z "$MOMMYS_ROLE" ] && MOMMYS_ROLE="mommy"
[ -z "$MOMMY_COLOR" ] && MOMMY_COLOR='\e[38;5;217m'
COLOR_RESET='\e[0m'
negative() {
RESPONSES=(
"do you need $MOMMYS_ROLE's help~? ❤️"
"don't give up, my love~ ❤️"
"don't worry, $MOMMYS_ROLE is here to help you~ ❤️"
"I believe in you, my sweet $MOMMYS_LITTLE~ ❤️"
"it's okay to make mistakes, my dear~ ❤️"
"just a little further, sweetie~ ❤️"
"let's try again together, okay~? ❤️"
"$MOMMYS_ROLE believes in you, and knows you can overcome this~ ❤️"
"$MOMMYS_ROLE believes in you~ ❤️"
"$MOMMYS_ROLE is always here for you, no matter what~ ❤️"
"$MOMMYS_ROLE is here to help you through it~ ❤️"
"$MOMMYS_ROLE is proud of you for trying, no matter what the outcome~ ❤️"
"$MOMMYS_ROLE knows it's tough, but you can do it~ ❤️"
"$MOMMYS_ROLE knows $MOMMYS_PRONOUN little $MOMMYS_LITTLE can do better~ ❤️"
"$MOMMYS_ROLE knows you can do it, even if it's tough~ ❤️"
"$MOMMYS_ROLE knows you're feeling down, but you'll get through it~ ❤️"
"$MOMMYS_ROLE knows you're trying your best~ ❤️"
"$MOMMYS_ROLE loves you, and is here to support you~ ❤️"
"$MOMMYS_ROLE still loves you no matter what~ ❤️"
"you're doing your best, and that's all that matters to $MOMMYS_ROLE~ ❤️"
"$MOMMYS_ROLE is always here to encourage you~ ❤️"
)
}
positive() {
RESPONSES=(
"*pats your head*"
"awe, what a good $MOMMYS_LITTLE~\n$MOMMYS_ROLE knew you could do it~ ❤️"
"good $MOMMYS_LITTLE~\n$MOMMYS_ROLE's so proud of you~ ❤️"
"keep up the good work, my love~ ❤️"
"$MOMMYS_ROLE is proud of the progress you've made~ ❤️"
"$MOMMYS_ROLE is so grateful to have you as $MOMMYS_PRONOUN little $MOMMYS_LITTLE~ ❤️"
"I'm so proud of you, my love~ ❤️"
"$MOMMYS_ROLE is so proud of you~ ❤️"
"$MOMMYS_ROLE loves seeing $MOMMYS_PRONOUN little $MOMMYS_LITTLE succeed~ ❤️"
"$MOMMYS_ROLE thinks $MOMMYS_PRONOUN little $MOMMYS_LITTLE earned a big hug~ ❤️"
"that's a good $MOMMYS_LITTLE~ ❤️"
"you did an amazing job, my dear~ ❤️"
"you're such a smart cookie~ ❤️"
)
}
mommy_says() {
says=$1
printf "$MOMMY_COLOR$says$COLOR_RESET\n"
}
random() {
[ $1 == "positive" ] && positive
[ $1 == "negative" ] && negative
index=$(($RANDOM % ${#RESPONSES[@]}))
response="${RESPONSES[$index]}"
mommy_says "$response"
}
while getopts "pn" options; do
case $options in
p) random "positive" ;;
n) random "negative" ;;
*) usage; exit 1 ;;
esac
done

@ -0,0 +1,17 @@
{ config, pkgs, username, ... }:
{
services.mpd.enable = true;
services.mpd.musicDirectory = "/home/${username}/Music";
home.packages = with pkgs; [
mpc_cli
];
programs.ncmpcpp = {
enable = true;
settings = {
ncmpcpp_directory = "~/.local/share/ncmpcpp";
};
};
}

@ -0,0 +1,10 @@
{ config, ... }:
{
programs.mpv = {
enable = true;
config = {
loop-file = "inf";
};
};
}

@ -0,0 +1,27 @@
{ config, pkgs, lib, ... }:
{
programs.neovim = {
enable = true;
defaultEditor = true;
extraPackages = with pkgs; [
nodejs
sumneko-lua-language-server
nodePackages.bash-language-server
nodePackages.vim-language-server
nodePackages.pyright
rust-analyzer
rnix-lsp
universal-ctags
];
};
home.packages = with pkgs; [
neovide
];
xdg.configFile."nvim" = {
source = ./neovim;
recursive = true;
};
}

@ -0,0 +1 @@
plugin

@ -0,0 +1,21 @@
MIT License
Copyright (c) 2022 SpyHoodle
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.

@ -0,0 +1,22 @@
# Maddie's NeoVim config
A clean, fast, feature-rich IDE layer for my needs in [NeoVim](https://neovim.io/).<br>
Written in Lua, designed for NeoVim v0.7.0 or higher.
## Some highlights
- Written entirely in Lua, making it clean and modern for NeoVim
- Uses [impatient.nvim](https://github.com/lewis6991/impatient.nvim) which greatly improves startup performance
- Uses the latest NeoVim LSP features & tree-sitter for highlighting
- Neat, small and structured files that are easy to read with some commenting
- Helpful features for programming such as highlighting indents & whitespaces
- Features for writing prose and taking notes, such as [vimwiki](https://github.com/vimwiki/vimwiki) and [orgmode](https://github.com/nvim-orgmode/orgmode)
- Extensible Lua written NeoVim specific package manager from [packer.nvim](https://github.com/wbthomason/packer.nvim)
- Modern standard Lua plugins such as [lualine.nvim](https://github.com/nvim-lualine/lualine.nvim) and [nvim-tree](https://github.com/kyazdani42/nvim-tree.lua)
- Fixed scrolling in terminals like st with patches and smooth scrolling
- Extra configuration for [Neovide](https://github.com/neovide/neovide), a graphical NeoVim client
- Shortcuts for tabs & splits with the leader key as space
- System clipboard, mouse and scrolling support
## Work in progress!
I'm constantly updating and changing this configuration, by adding new plugins and settings.<br>
I likely won't make changes to make the config more acceptable and general to the public.<br>
Made with ❤️ and 🏳️‍⚧️.

@ -0,0 +1,255 @@
-- Basic vim config
require('basics')
require('keymaps')
require('colours')
-- Packages
return require('packer').startup(function(use)
-- Neovim package manager
use 'wbthomason/packer.nvim'
-- Atom's One Dark theme
use 'navarasu/onedark.nvim'
-- Gruvbox theme
use 'ellisonleao/gruvbox.nvim'
-- VSCode theme
use 'Mofiqul/vscode.nvim'
-- Everforest theme
use 'sainnhe/everforest'
-- Smooth scrolling
use 'psliwka/vim-smoothie'
-- Comments in any language
use 'tpope/vim-commentary'
-- Surrounding
use 'tpope/vim-surround'
-- Repeating
use 'tpope/vim-repeat'
-- Vim-wiki
use 'vimwiki/vimwiki'
-- Rainbow brackets
use 'p00f/nvim-ts-rainbow'
-- Git bindings
use 'tpope/vim-fugitive'
-- Latex
use 'lervag/vimtex'
-- Easy alignment
use 'junegunn/vim-easy-align'
-- Transparent background
use {
'xiyaowong/nvim-transparent',
config = function()
require('transparent').setup({
enable = false;
})
end
}
-- Zen mode
use {
"folke/zen-mode.nvim",
config = function()
require('zen-mode').setup()
end
}
-- Autosaving
use {
'pocco81/auto-save.nvim',
config = function()
require('auto-save').setup({
enabled = true,
execution_message = {
message = function()
return ('>w< autosaved at ' .. vim.fn.strftime('%H:%M:%S'))
end,
cleaning_interval = 1250
},
trigger_events = { 'InsertLeave', 'TextChanged' }
})
end
}
-- Git signs
use {
'lewis6991/gitsigns.nvim',
config = function()
require('gitsigns').setup()
end
}
-- Github Copilot
use {
'zbirenbaum/copilot.lua',
event = { 'VimEnter' },
config = function()
vim.defer_fn(function()
require('copilot').setup()
end, 100)
end
}
-- Liveshare
use {
'jbyuki/instant.nvim',
config = function()
vim.g.instant_username = "Maddie"
end
}
-- Fuzzy finder
use {
'nvim-telescope/telescope.nvim',
requires = { 'nvim-lua/plenary.nvim' }
}
-- Auto-pairs
use {
'windwp/nvim-autopairs',
config = function()
require('nvim-autopairs').setup()
end
}
-- Highlight whitespaces
use {
'ntpeters/vim-better-whitespace',
config = function()
vim.g.better_whitespace_filetypes_blacklist = { 'startify' }
end
}
-- Highlight indents
use {
'nathanaelkane/vim-indent-guides',
config = function()
vim.g.indent_guides_enable_on_vim_startup = 1
vim.g.indent_guides_exclude_filetypes = { 'help', 'NvimTree', 'startify' }
end
}
-- Color hex codes
use {
'norcalli/nvim-colorizer.lua',
config = function()
require('colorizer').setup()
end
}
-- Statusbar line
use {
'nvim-lualine/lualine.nvim',
requires = { 'kyazdani42/nvim-web-devicons', opt = true },
config = function()
require('lualine').setup()
end
}
-- File browser
use {
'kyazdani42/nvim-tree.lua',
requires = { 'kyazdani42/nvim-web-devicons' },
config = function()
require('nvim-tree').setup()
end
}
-- Org-mode
use {
'nvim-orgmode/orgmode',
config = function()
require('orgmode').setup()
require('orgmode').setup_ts_grammar()
end
}
-- Speedup neovim startup
use {
'lewis6991/impatient.nvim',
config = function()
require('impatient')
end
}
-- Rust tools
use 'neovim/nvim-lspconfig'
use {
'simrat39/rust-tools.nvim',
config = function()
require('rust-tools').setup()
end
}
-- -- Language Server Protocol
-- use {
-- 'neovim/nvim-lspconfig',
-- config = function()
-- require('lspconfig').pyright.setup{}
-- require('lspconfig').rnix.setup{}
-- require('lspconfig').bashls.setup{}
-- require('lspconfig').vimls.setup{}
-- require('lspconfig').sumneko_lua.setup {
-- settings = {
-- Lua = {
-- diagnostics = {
-- globals = { 'vim' }
-- }
-- }
-- }
-- }
-- end
-- }
-- Code completion
use 'L3MON4D3/LuaSnip'
use 'rafamadriz/friendly-snippets'
use 'zbirenbaum/copilot-cmp'
use 'hrsh7th/cmp-nvim-lsp'
use 'hrsh7th/cmp-nvim-lua'
use 'hrsh7th/cmp-buffer'
use 'hrsh7th/cmp-path'
use 'hrsh7th/cmp-cmdline'
use {
'hrsh7th/nvim-cmp',
requires = { 'kyazdani42/nvim-web-devicons' },
config = function()
require('plugins.cmp')
end
}
-- Treesitter for highlighting
use {
'nvim-treesitter/nvim-treesitter',
config = function()
require('nvim-treesitter.configs').setup {
ensure_installed = { 'cpp', 'lua', 'go', 'rust', 'python', 'nix', 'vim', 'markdown', 'html', 'css' },
sync_install = true,
highlight = {
enable = true,
additional_vim_regex_highlighting = false,
},
rainbow = {
enable = true,
extended_mode = true
},
indent = {
enable = true;
}
}
end
}
end)

@ -0,0 +1,36 @@
-- Vim settings
vim.g.mapleader = ' '
vim.o.encoding = 'utf8'
vim.o.background = 'dark'
vim.o.relativenumber = true
vim.o.number = true
vim.o.wrap = false
vim.o.expandtab = true
vim.o.incsearch = true
vim.o.scrolloff = 5
vim.o.tabstop = 2
vim.o.shiftwidth = 2
vim.o.cursorline = true
vim.o.ignorecase = true
vim.o.swapfile = false
vim.o.undofile = true
vim.o.splitbelow = true
vim.o.splitright = true
vim.o.errorbells = false
vim.o.termguicolors = true
vim.o.showmode = false
vim.o.showtabline = 1
vim.o.signcolumn = 'auto'
vim.o.clipboard = 'unnamedplus'
vim.o.mouse = 'a'
vim.o.go = 'a'
-- Netrw
vim.g["netrw_banner"] = 0
vim.g["netrw_liststyle"] = 3
vim.g["netrw_winsize"] = 25
-- Neovide
vim.o.guifont = 'Iosevka:h12'
vim.g.neovide_cursor_vfx_mode = 'railgun'
vim.g.neovide_remember_window_size = true

@ -0,0 +1 @@
vim.cmd([[colorscheme onedark]])

@ -0,0 +1,59 @@
-- Neat variables
local opts = { noremap = true, silent = true }
local term_opts = { silent = true }
local keymap = vim.api.nvim_set_keymap
-- Custom/special keymaps
keymap('n', '<leader>c', ':sp<CR> :term<CR> :resize 20N<CR> i', term_opts)
keymap('n', '<leader>r', ':luafile %<CR>:PackerSync<CR>', term_opts)
keymap('n', '<leader>h', ':nohl<CR>', term_opts)
keymap('n', '<leader>z', ':ZenMode<CR>:set wrap<CR>:set linebreak<CR>', term_opts)
keymap('n', '<leader>Z', ':ZenMode<CR>:set nowrap<CR>:set nolinebreak<CR>', term_opts)
keymap('n', '<C-c>', ':Telescope colorscheme<CR>', term_opts)
keymap('n', '<C-q>', ':wqa<CR>', term_opts)
keymap('n', '<C-s>', ':w<CR>', term_opts)
keymap('n', 'U', ':redo<CR>', term_opts)
-- Window management
keymap('n', '<leader>vs', ':vs<CR>', opts)
keymap('n', '<leader>hs', ':sp<CR>', opts)
keymap('n', '<leader>tn', ':tabnew<CR>', opts)
keymap('n', '<leader>th', ':tabprev<CR>', opts)
keymap('n', '<leader>tj', ':tabprev<CR>', opts)
keymap('n', '<leader>tk', ':tabnext<CR>', opts)
keymap('n', '<leader>tl', ':tabnext<CR>', opts)
keymap('n', '<leader>to', ':tabo<CR>', opts)
keymap('n', '<leader>tc', ':tabc<CR>', opts)
-- Window navigation
keymap('n', '<C-Tab>', '<C-w>w', opts)
keymap('n', '<C-h>', '<C-w>h', opts)
keymap('n', '<C-j>', '<C-w>j', opts)
keymap('n', '<C-k>', '<C-w>k', opts)
keymap('n', '<C-l>', '<C-w>l', opts)
-- Buffer navigation
keymap('n', '<S-l>', ':bnext<CR>', opts)
keymap('n', '<S-h>', ':bprevious<CR>', opts)
-- Stay in visual mode when indenting
keymap('v', '<', '<gv', opts)
keymap('v', '>', '>gv', opts)
-- When moving up or down, move physical lines not file lines
keymap('n', 'j', 'gj', opts)
keymap('n', 'k', 'gk', opts)
-- NvimTree
keymap('n', '<C-n>', ':NvimTreeToggle<CR>', term_opts)
-- Telescope
keymap('n', '<C-f>', '<cmd>lua require("telescope.builtin").find_files()<CR>', opts)
keymap('n', '<leader>ff', '<cmd>lua require("telescope.builtin").find_files()<CR>', opts)
keymap('n', '<leader>fg', '<cmd>lua require("telescope.builtin").live_grep()<CR>', opts)
keymap('n', '<leader>fb', '<cmd>lua require("telescope.builtin").buffers()<CR>', opts)
keymap('n', '<leader>fh', '<cmd>lua require("telescope.builtin").help_tags()<CR>', opts)
-- Easy alignment
keymap('n', 'ga', ':EasyAlign', opts)
keymap('v', 'ga', ':EasyAlign', opts)

@ -0,0 +1,117 @@
local cmp = require('cmp')
local luasnip = require('luasnip')
require('luasnip.loaders.from_vscode').lazy_load()
local check_backspace = function()
local col = vim.fn.col "." - 1
return col == 0 or vim.fn.getline("."):sub(col, col):match "%s"
end
local kind_icons = {
Text = "",
Method = "m",
Function = "",
Constructor = "",
Field = "",
Variable = "",
Class = "",
Interface = "",
Module = "",
Property = "",
Unit = "",
Value = "",
Enum = "",
Keyword = "",
Snippet = "",
Color = "",
File = "",
Reference = "",
Folder = "",
EnumMember = "",
Constant = "",
Struct = "",
Event = "",
Operator = "",
TypeParameter = "",
}
cmp.setup {
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
mapping = {
["<C-k>"] = cmp.mapping.select_prev_item(),
["<C-j>"] = cmp.mapping.select_next_item(),
["<C-b>"] = cmp.mapping(cmp.mapping.scroll_docs(-1), { "i", "c" }),
["<C-f>"] = cmp.mapping(cmp.mapping.scroll_docs(1), { "i", "c" }),
["<C-Space>"] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }),
["<C-y>"] = cmp.config.disable,
["<C-e>"] = cmp.mapping {
i = cmp.mapping.abort(),
c = cmp.mapping.close(),
},
["<CR>"] = cmp.mapping.confirm { select = true },
["<Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
elseif luasnip.expandable() then
luasnip.expand()
elseif luasnip.expand_or_jumpable() then
luasnip.expand_or_jump()
elseif check_backspace() then
fallback()
else
fallback()
end
end, {
"i",
"s",
}),
["<S-Tab>"] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
elseif luasnip.jumpable(-1) then
luasnip.jump(-1)
else
fallback()
end
end, {
"i",
"s",
}),
},
formatting = {
fields = { "kind", "abbr", "menu" },
format = function(entry, vim_item)
vim_item.kind = string.format("%s", kind_icons[vim_item.kind])
vim_item.menu = ({
nvim_lsp = "[LSP]",
nvim_lua = "[NVIM_LUA]",
copilot = "[Copilot]",
luasnip = "[Snippet]",
buffer = "[Buffer]",
path = "[Path]",
})[entry.source.name]
return vim_item
end,
},
sources = {
{ name = "nvim_lsp" },
{ name = "nvim_lua" },
{ name = "copilot" },
{ name = "luasnip" },
{ name = "buffer" },
{ name = "path" },
},
confirm_opts = {
behavior = cmp.ConfirmBehavior.Replace,
select = false,
},
experimental = {
ghost_text = false,
native_menu = false,
},
cmp.config.window.bordered()
}

@ -0,0 +1,6 @@
macOS
JS
add evelyne
evelyne
camhs
Vernova

@ -0,0 +1,16 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
nsxiv
];
xdg.configFile."nsxiv" = {
source = ./nsxiv;
};
xresources.properties = {
"Nsxiv.window.foreground" = "#D6DEEB";
"Nsxiv.window.background" = "#1E2127";
"Nsxiv.bar.background" = "#2C323D";
"Nsxiv.bar.foreground" = "#D6DEEB";
};
}

@ -0,0 +1,14 @@
#!/bin/sh
while read file
do
case "$1" in
"d")
rm -rf $file ;;
"r")
convert -rotate 90 "$file" "$file" ;;
"y")
echo -n "$file" | xclip -selection clipboard ;;
"w")
xwallpaper --zoom "$file" && kill $(pidof nsxiv);;
esac
done

@ -0,0 +1,5 @@
{ config, ... }:
{
programs.obs-studio.enable = true;
}

@ -0,0 +1,12 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
texlive.combined.scheme-full # LaTeX
libreoffice # Documents suite
thunderbird # Email client
obsidian # Notes app
sc-im # TUI spreadsheet
anki # Flashcard app
];
}

@ -0,0 +1,12 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
openrgb
];
home.file.".xinitrc".text = ''
# Set RGB perhipherals to white
${pkgs.openrgb}/bin/openrgb -c white -m static &
'';
}

@ -0,0 +1,14 @@
{ config, ... }:
{
programs.password-store = {
enable = true;
settings = {
PASSWORD_STORE_DIR = "${config.xdg.dataHome}/password-store";
};
};
home.sessionVariables = {
PASSWORD_STORE_DIR = "${config.xdg.dataHome}/password-store";
};
}

@ -0,0 +1,11 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
pcmanfm
];
xdg.configFile."pcmanfm" = {
source = ./pcmanfm;
};
}

@ -0,0 +1,26 @@
[config]
bm_open_method=0
[volume]
mount_on_startup=1
mount_removable=1
autorun=1
[ui]
always_show_tabs=0
max_tab_chars=32
win_width=1000
win_height=696
splitter_pos=189
media_in_new_tab=0
desktop_folder_new_win=0
change_tab_on_drop=1
close_on_unmount=1
focus_previous=0
side_pane_mode=places
view_mode=list
show_hidden=0
sort=name;descending;
toolbar=newtab;navigation;home;
show_statusbar=1
pathbar_mode_buttons=0

@ -0,0 +1,24 @@
{ config, pkgs, ... }:
{
home.file.".xinitrc".text = ''
# Import xorg environment into systemd for the picom service to work
systemctl --user import-environment XAUTHORITY DISPLAY &
# Restart picom after importing the xorg environment
systemctl --user restart picom &
'';
services.picom = {
enable = true;
fade = true;
fadeSteps = [
0.1
0.1
];
opacityRules = [
"90:class_g = 'st-256color'"
];
shadow = true;
vSync = true;
};
}

@ -0,0 +1,9 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
xorg.xkill # Kill X11 programs with mouse
killall # Kill programs
gotop # Process manager in go
];
}

@ -0,0 +1,11 @@
{ config, pkgs, ... }:
{
qt = {
enable = true;
style = {
package = pkgs.adwaita-qt;
name = "adwaita-dark";
};
};
}

@ -0,0 +1,15 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
rustup
];
home = {
sessionVariables = {
CARGO_HOME = "${config.xdg.dataHome}/cargo";
RUSTUP_HOME = "${config.xdg.dataHome}/rustup";
};
sessionPath = [ "$CARGO_HOME/bin" ];
};
}

@ -0,0 +1,13 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
tesseract5 # Gets text from images
maim # X11 screenshot tool
];
home.file.".local/bin/sst" = {
source = ./screenshot/sst.sh;
executable = true;
};
}

@ -0,0 +1,40 @@
#!/usr/bin/env sh
# Configuration variables
SST_PIC_DIR="$HOME/Pictures/Screenshots"
while getopts "sctd:" options; do
case $options in
s)
echo "sswm: save mode"
name=$(date --iso-8601=minutes)
maim -s -u -f png > $SST_PIC_DIR/$name.png
echo "sswm: imaged saved as $SST_PIC_DIR/$name.png"
;;
c)
echo "sswm: copy mode"
maim -s -u -f png | xclip -selection clipboard -t image/png
echo "sswm: image copied to clipboard"
;;
t)
echo "sswm: text mode"
maim -s -u -f png "$IMAGE"
[ $? -ne 0 ] && exit 1
tesseract "$IMAGE" "${TEXT//\.txt/}" 2> /dev/null
sed -i 's/\x0c//' "$TEXT"
if [ $(wc -l < $TEXT) -eq 0 ]; then
echo "sswm: no text detected"
else
truncate -s -1 $TEXT
xclip -selection clipboard < "$TEXT"
echo "sswm: text copied to clipboard"
fi
;;
d)
echo "sswm: delay "$OPTARG"s..."
sleep $OPTARG
;;
esac
done

@ -0,0 +1,62 @@
{ config, ... }:
{
home = {
# Aliases
shellAliases = {
# Core Programs
ls = "ls -lhN --color=auto --group-directories-first";
ll = "ls -av";
cp = "cp -iv";
mv = "mv -iv";
rm = "rm -vI";
mkd = "mkdir -pv";
c = "clear";
e = "exit";
# CLI Shortcuts
v = "nvim";
vi = "nvim";
ka = "killall";
xw = "xwallpaper";
nf = "neofetch";
tf = "pridefetch -f trans";
pf = "pfetch";
i = "inertia";
# System shortcuts
heif-convert-dir = "for file in *.heic; do heif-convert -q 100 $file \${file/%.heic/.jpg}; done";
unfuck-wifi = "doas systemctl restart wpa_supplicant.service";
sx = "startx ~/.config/x11/xinitrc";
sdn = "doas shutdown -h now";
kys = "kill $(pidof '$@')";
# Nix system shortucts
nix-system-update = "nix flake update $NIXFILES && doas nixos-rebuild switch --flake $NIXFILES";
# For colour
btop = "btop --utf-force";
grep = "grep --color=auto";
diff = "diff --color=auto";
};
# Environment variables
sessionVariables = {
# Locale
LANG = "en_GB.UTF-8";
LC_ALL = "en_GB.UTF-8";
# Define nixfiles location
NIXFILES = "$HOME/Development/Personal/nixfiles";
# Java windows
_JAVA_AWT_WM_NONREPARENTING = 1;
};
# Default $PATH
sessionPath = [
# Add ~/.local/bin to $PATH
"$HOME/.local/bin"
];
};
}

@ -0,0 +1,22 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
slstatus
];
home.file.".xinitrc".text = ''
# Start slstatus
${pkgs.slstatus}/bin/slstatus &
'';
home.file.".local/bin/statusbar" = {
source = ./statusbar;
recursive = true;
executable = true;
};
home.sessionPath = [
"$HOME/.local/bin/statusbar"
];
}

@ -0,0 +1,7 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
home-assistant-cli
];
}

@ -0,0 +1,25 @@
{ config, pkgs, username, ... }:
{
# Drawterm
home.packages = with pkgs; [
drawterm
];
# SSH
programs.ssh = {
enable = true;
matchBlocks = {
lambda = {
identityFile = "~/.ssh/id_ed25519_sk";
hostname = "home.spyhoodle.me";
user = "maddie";
};
pinea = {
identityFile = "~/.ssh/id_ed25519_sk";
hostname = "ssh.pinea.dev";
user = "maddie";
};
};
};
}

@ -0,0 +1 @@
sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIA1jTkcMhBQQoYqNVLofrNnTbB8RCyzSYmdsnPeoOineAAAABHNzaDo= spy@luna (yubikey)

@ -0,0 +1,3 @@
#!/bin/sh
echo " $(date "+%a %d %b")  $(date "+%I:%M:%S%p")"

@ -0,0 +1,6 @@
#!/bin/sh
cpu=$(top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f\n", prefix, 100 - v }' | awk '{print int($0)}')
icon=""
echo "$icon $cpu%"

@ -0,0 +1,7 @@
#!/bin/sh
disk=$(df -h "/" | awk ' /[0-9]/ {print $3 "/" $2}')
percent=$(df -h "/" | egrep -o '[0-9]+%' | awk '{print int($0)}')
icon=""
echo "$icon $disk"

@ -0,0 +1,35 @@
#!/bin/sh
# Displays todays precipication chance (☔) and daily low (🥶) and high (🌞).
# Usually intended for the statusbar.
# If we have internet, get a weather report from wttr.in and store it locally.
# You could set up a shell alias to view the full file in a pager in the
# terminal if desired. This function will only be run once a day when needed.
weatherreport="${XDG_DATA_HOME:-$HOME/.local/share}/weatherreport"
getforecast() { curl -sf "wttr.in/$LOCATION" > "$weatherreport" || exit 1 ;}
# Some very particular and terse stream manipulation. We get the maximum
# precipitation chance and the daily high and low from the downloaded file and
# display them with coresponding emojis.
showweather() { printf "%s" "$(sed '16q;d' "$weatherreport" |
grep -wo "[0-9]*%" | sort -rn | sed "s/^/☔/g;1q" | tr -d '\n')"
sed '13q;d' "$weatherreport" | grep -o "m\\([-+]\\)*[0-9]\\+" | sed 's/+//g' | sort -n -t 'm' -k 2n | sed -e 1b -e '$!d' | tr '\n|m' ' ' | awk '{print " 🥶" $1 "°","🌞" $2 "°"}' ;}
case BLOCK_BUTTON in
1) setsid -f "$TERMINAL" -e less -Srf "$weatherreport" ;;
2) getforecast && showweather ;;
3) notify-send "🌈 Weather module" "\- Left click for full forecast.
- Middle click to update forecast.
☔: Chance of rain/snow
🥶: Daily low
🌞: Daily high" ;;
6) "$TERMINAL" -e "$EDITOR" "$0" ;;
esac
# The test if our forcecast is updated to the day. If it isn't download a new
# weather report from wttr.in with the above function.
[ "$(stat -c %y "$weatherreport" 2>/dev/null | cut -d' ' -f1)" = "$(date '+%Y-%m-%d')" ] ||
getforecast
showweather

@ -0,0 +1,10 @@
#!/bin/sh
# Gets your public ip address checks which country you are in and
# displays that information in the statusbar
#
# https://www.maketecheasier.com/ip-address-geolocation-lookups-linux/
ifinstalled "geoip" || exit
addr="$(curl ifconfig.me 2>/dev/null)" || exit
grep "flag: " "${XDG_DATA_HOME:-$HOME/.local/share}/larbs/emoji" | grep "$(geoiplookup "$addr" | sed 's/.*, //')" | sed "s/flag: //;s/;.*//"

@ -0,0 +1,5 @@
#!/bin/sh
kernel=$(uname -r)
icon=""
echo "$icon $kernel"

@ -0,0 +1,7 @@
#!/bin/sh
mem=$(free --mebi | sed -n '2{p;q}' | awk '{printf ("%2.2f/%2.2f", ( $3 / 1024), ($2 / 1024))}')
percent=$(free -m | awk 'NR==2{printf "%.2f%%\t\t", $3*100/$2 }' | awk '{print int($0)}')
icon=""
echo "$icon $mem""GB"

@ -0,0 +1,13 @@
#!/bin/sh
temp=$(sensors | awk '/Core 0/ {print $3}' | awk '{print int($0)}')
if [ $temp -ge 70 ]; then
icon=""
elif [ $temp -ge 50 ]; then
icon=""
elif [ $temp -ge 0 ]; then
icon=""
fi
echo "$icon $temp°C"

@ -0,0 +1,6 @@
#!/bin/sh
uptime=$(uptime | awk '{print $3}' | sed 's/,//')
icon=""
echo "$icon $uptime"

@ -0,0 +1,15 @@
#!/bin/sh
vol="$(pamixer --get-volume)"
if [ $(pamixer --get-mute) = true ]; then
icon=""
elif [ "$vol" -ge "50" ]; then
icon=""
elif [ "$vol" -gt "0" ]; then
icon=""
elif [ "$vol" -eq "0" ]; then
icon=""
fi
echo "$icon $vol%"

@ -0,0 +1,13 @@
{ config, pkgs, ...}:
{
home.packages = with pkgs; [
steam
steam-run
];
home.file.".local/bin/steam-killer" = {
source = ./steam/steam-killer.sh;
executable = true;
};
}

@ -0,0 +1,9 @@
#!/bin/sh
while true
do
echo "[sk] killing steamwebhelper"
{ kill $(pidof steamwebhelper) && echo "[fhs] killed!"; } || echo "[fhs] failed!"
echo "[sk] waiting 0.5 seconds..."
sleep 0.5
done

@ -0,0 +1,9 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
cool-retro-term # Retro-style terminal
kitty # Used for testing
st # Suckless terminal
];
}

@ -0,0 +1,9 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
virt-manager # Manages QEMU virtual machines
bottles # GTK interface for wine
wine # Windows emulation
];
}

@ -0,0 +1,73 @@
{ config, pkgs, ... }:
{
home.packages = with pkgs; [
xdg-utils
xdg-user-dirs
];
xdg = {
enable = true;
userDirs.enable = true;
desktopEntries = {
"browser" = {
name = "Web Browser";
type = "Application";
exec = "${pkgs.librewolf}/bin/librewolf %f";
};
"image" = {
name = "Image Viewer";
type = "Application";
exec = "${pkgs.nsxiv}/bin/nsxiv -a %f";
};
"text" = {
name = "Text Editor";
type = "Application";
exec = "${pkgs.st}/bin/st -e ${pkgs.neovim}/bin/nvim %u";
};
"pdf" = {
name = "PDF Reader";
type = "Application";
exec = "${pkgs.zathura}/bin/zathura %u";
};
};
mimeApps = {
enable = true;
defaultApplications = {
"application/pdf" = "pdf.desktop";
"x-scheme-handler/http" = "browser.desktop";
"x-scheme-handler/https" = "browser.desktop";
"image/png" = "image.desktop";
"image/jpeg" = "image.desktop";
"image/jpg" = "image.desktop";
"image/gif" = "image.desktop";
"video/mp4" = "mpv.desktop";
"text/plain" = "text.desktop";
"text/html" = "browser.desktop";
};
};
};
home = {
sessionVariables = {
# Force use of XDG Dir Spec
CUDA_CACHE_PATH = "${config.xdg.cacheHome}/nv";
LESSHISTFILE = "${config.xdg.configHome}/less/history";
LESSKEY = "${config.xdg.configHome}/less/keys";
WINEPREFIX = "${config.xdg.dataHome}/wine";
_JAVA_OPTIONS = "-Djava.util.prefs.userRoot=${config.xdg.configHome}/java";
# Default programs
EDITOR = "nvim";
TERMINAL = "st";
BROWSER = "librewolf";
};
shellAliases = {
# Force use of XDG Dir Spec
wget = "wget --hsts-file='${config.xdg.dataHome}/wget-hsts'";
rxrdb = "xrdb -load '${config.xdg.configHome}/.config/X11/xresources'";
nvidia-settings = "nvidia-settings --config='${config.xdg.configHome}'/nvidia/settings";
};
};
}

@ -0,0 +1,58 @@
{ config, pkgs, ... }:
{
# Run startx on tty1
programs.zsh.profileExtra = ''
# If on /dev/tty1 then run startx automatically
if [ -z $DISPLAY ] && [ "$(tty)" = "/dev/tty1" ]; then
exec ${pkgs.xorg.xinit}/bin/startx
fi
'';
# Attempt to set keyboard layout
home.keyboard = {
layout = "gb";
options = [
"caps:escape"
];
};
# Attempt to set cursor
home.pointerCursor = {
gtk.enable = true;
x11.enable = true;
package = pkgs.phinger-cursors;
name = "phinger-cursors";
size = 24;
};
# Force use of XDG Dir Spec
home.sessionVariables = {
/* XAUTHORITY = "${config.xdg.runtimeDir}/Xauthority"; */
XCOMPOSECACHE = "${config.xdg.cacheHome}/x11/xcompose";
};
# Configure ~/.xinitrc
programs.feh.enable = true;
home.file.".xinitrc".text = ''
# Monitor configuration
${pkgs.xorg.xrandr}/bin/xrandr --output DP-0 --primary --mode 2560x1440 --pos 0x560
${pkgs.xorg.xrandr}/bin/xrandr --output HDMI-0 --noprimary --mode 2560x1440 --pos 2560x0 --rotate right
# Speed up repeated keypresses
${pkgs.xorg.xset}/bin/xset r rate 300 50
# Set keyboard map and remap caps to escape
${pkgs.xorg.setxkbmap}/bin/setxkbmap -layout gb --option caps:escape
# Apply wallpaper
${pkgs.feh}/bin/feh --no-fehbg --bg-fill "$HOME/Pictures/Wallpapers/The Walking Dead/shane_1.jpg" --bg-fill "$HOME/Pictures/Wallpapers/The Walking Dead/shane_3.jpg"
# Start the window manager
${pkgs.openssh}/bin/ssh-agent ${pkgs.dbus}/bin/dbus-run-session ${pkgs.dwm}/bin/dwm
'';
xresources.properties = {
"*.font" = "Iosevka:pixelsize=14:antialias=true:autohint=true";
};
}

@ -0,0 +1,5 @@
{ config, ... }:
{
programs.zathura.enable = true;
}

@ -0,0 +1,8 @@
{ config, ... }:
{
programs.zoxide = {
enable = true;
options = [ "--cmd=cd" ];
};
}

@ -0,0 +1,123 @@
{ config, pkgs, lib, ... }:
{
programs.zsh = {
# Use the zsh shell
enable = true;
# Basic config settings
enableAutosuggestions = true;
enableCompletion = true;
enableSyntaxHighlighting = true;
autocd = true;
/* defaultKeymap = "vicmd"; */
dotDir = ".config/zsh";
history = {
size = 9999999;
expireDuplicatesFirst = true;
extended = true;
path = "${config.xdg.cacheHome}/zsh/history";
};
# Zsh init extras
initExtra = ''
# Disable Ctrl-S to freeze terminal
stty stop undef
# Tab completion
zstyle ':completion:*' menu select # Use a menu
_comp_options+=(globdots) # Include hidden files
# Change cursor shape for different vi modes
export KEYTIMEOUT=1
function zle-keymap-select () {
case $KEYMAP in
vicmd) echo -ne '\e[1 q';; # block
viins|main) echo -ne '\e[5 q';; # beam
esac
}
zle -N zle-keymap-select
zle-line-init() {
zle -K viins # initiate `vi insert` as keymap (can be removed if `bindkey -V` has been set elsewhere)
echo -ne "\e[5 q"
}
zle -N zle-line-init
echo -ne '\e[5 q' # Use beam shape cursor on startup.
preexec() { echo -ne '\e[5 q' ;} # Use beam shape cursor for each new prompt.
'';
};
programs.starship = {
# Use the starship prompt
enable = true;
enableZshIntegration = true;
settings = {
format = lib.concatStrings [
# Directory
"$directory"
# VCS
"$git_branch"
"$git_commit"
"$git_state"
"$git_metrics"
"$git_status"
"$hg_branch"
# Languages
"$package"
"$c"
"$rust"
"$golang"
"$haskell"
"$python"
"$java"
"$kotlin"
"$lua"
"$dart"
"$nim"
"$nodejs"
"$swift"
"$zig"
"$nix_shell"
"$conda"
"$spack"
# Prompt line
"$line_break"
"$username"
"$hostname"
"$localip"
"$cmd_duration"
"$memory_usage"
"$jobs"
"$character"
];
# Prompt character
character = {
success_symbol = "-> [λ](bold purple)";
error_symbol = "-> [λ](bold red)";
vimcmd_symbol = "-> [λ](bold green)";
};
# When in a deep directory or git repo
directory.truncation_symbol = ".../";
# Git widgets
git_metrics.disabled = false;
git_status = {
ahead = "->";
behind = "<-";
diverged = "<->";
renamed = ">>";
deleted = "x";
};
# Enable other starship widgets
memory_usage.disabled = false;
localip.disabled = false;
};
};
}

@ -0,0 +1,54 @@
[
# My build of suckless dwm
(final: prev: {
dwm = prev.dwm.overrideAttrs (oldAttrs: {
src = final.fetchFromGitHub {
owner = "SpyHoodle";
repo = "dwm";
rev = "a8c4c51946229f792e8621bde44a7001f7977dc7";
sha256 = "sha256-7zbUmDVC2QfiZ4SP9fJbiqxQm7X62dlixL1hRR8zv+k=";
};
});
st = prev.st.overrideAttrs (oldAttrs: {
src = final.fetchFromGitHub {
owner = "SpyHoodle";
repo = "st";
rev = "22e582e5acf6e4eb52c57df51f59f84bbb7d2f13";
sha256 = "sha256-ko4be6N/igCMo28/as/AWKMYswm/jIH1ILeVoi2Gpx8=";
};
buildInputs = oldAttrs.buildInputs ++ [ final.harfbuzz ];
});
dmenu = prev.dmenu.overrideAttrs (oldAttrs: {
src = final.fetchFromGitHub {
owner = "SpyHoodle";
repo = "dmenu";
rev = "82156146b3f3ab720ac752a953b952d638e1f935";
sha256 = "sha256-L6aqP7wmegl6Jv4ytMw/j1FwH5lXv8QjWOY5mHotkxI=";
};
});
slstatus = prev.slstatus.overrideAttrs (oldAttrs: {
src = final.fetchFromGitHub {
owner = "SpyHoodle";
repo = "slstatus";
rev = "b22f3d8ec8e2d67bbd32f02721d9d8157a46edd4";
sha256 = "sha256-OhssKVQArcQAgCavkFaCRvxUM3689t1v3YCv9IW7osU=";
};
});
slock = prev.slock.overrideAttrs (oldAttrs: {
src = final.fetchFromGitHub {
owner = "SpyHoodle";
repo = "slock";
rev = "e71c4ac0106a438abb5acf4ae89b8518a9bf3682";
sha256 = "sha256-7ZeARKljyQSHPoFb+6p50uIr2q5VOqE/XSELqurNMBw=";
};
buildInputs = oldAttrs.buildInputs ++ [ final.xorg.libXpm ];
});
ncmpcpp = prev.ncmpcpp.override {
visualizerSupport = true;
clockSupport = true;
};
nerdfonts = prev.nerdfonts.override {
fonts = [ "Iosevka" "Terminus" ];
};
})
]

@ -0,0 +1,5 @@
{ config, ... }:
{
programs.adb.enable = true;
}

@ -0,0 +1,14 @@
{ config, ... }:
{
sound.enable = true;
hardware.pulseaudio.enable = false;
security.rtkit.enable = true;
services.pipewire = {
enable = true;
alsa.enable = true;
alsa.support32Bit = true;
pulse.enable = true;
jack.enable = true;
};
}

@ -0,0 +1,6 @@
{ config, ... }:
{
hardware.bluetooth.enable = true;
services.blueman.enable = true;
}

@ -0,0 +1,31 @@
{ config, pkgs, modulesPath, ... }:
{
imports =
[
(modulesPath + "/installer/scan/not-detected.nix")
];
# Setup bootloader
boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true;
boot.loader.efi.efiSysMountPoint = "/boot/efi";
# Setup crypto keyfile
boot.initrd.secrets = {
"/crypto_keyfile.bin" = null;
};
# Enable LUKS boot devices
boot.initrd.luks.devices."luks-c180a121-376a-432e-a661-f4be3cc23dfa".device = "/dev/disk/by-uuid/c180a121-376a-432e-a661-f4be3cc23dfa";
boot.initrd.luks.devices."luks-16dda63d-9dce-4ef2-9da6-ee458ba3c44c".device = "/dev/disk/by-uuid/16dda63d-9dce-4ef2-9da6-ee458ba3c44c";
boot.initrd.luks.devices."luks-c180a121-376a-432e-a661-f4be3cc23dfa".keyFile = "/crypto_keyfile.bin";
boot.initrd.availableKernelModules = [ "xhci_pci" "ahci" "nvme" "usbhid" "sd_mod" ];
boot.initrd.kernelModules = [ ];
boot.kernelModules = [ "kvm-intel" ];
boot.extraModulePackages = [ ];
# Use the linux-zen kernel
boot.kernelPackages = pkgs.linuxPackages_zen;
}

@ -0,0 +1,6 @@
{ config, lib, ... }:
{
powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
}

@ -0,0 +1,24 @@
{ config, ... }:
{
fileSystems."/" =
{
device = "/dev/disk/by-uuid/0eecf0db-00f9-48db-9d62-0ade3f3edd90";
fsType = "ext4";
};
fileSystems."/boot/efi" =
{
device = "/dev/disk/by-uuid/0042-9914";
fsType = "vfat";
};
fileSystems."/mnt/data" =
{
device = "/dev/disk/by-uuid/5c0f035b-fe9e-4c7f-a137-34b0168e1dde";
fsType = "ext4";
};
swapDevices =
[{ device = "/dev/disk/by-uuid/9be243bf-4f48-42e3-9827-bba2ef04ffa4"; }];
}

@ -0,0 +1,13 @@
{ config, username, ... }:
{
security.sudo.enable = false;
security.doas = {
enable = true;
extraRules = [{
users = [ "${username}" ];
keepEnv = true;
persist = true;
}];
};
}

@ -0,0 +1,6 @@
{ config, ... }:
{
# Disable the firewall altogether
networking.firewall.enable = false;
}

@ -0,0 +1,17 @@
{ config, pkgs, ... }:
{
fonts.fonts = with pkgs; [
terminus-nerdfont
fira-code
fira-code-symbols
dina-font
iosevka
jetbrains-mono
font-awesome
source-han-sans
source-han-serif
source-han-code-jp
nerdfonts
];
}

Some files were not shown because too many files have changed in this diff Show More

Loading…
Cancel
Save