From 5aabf26cd75bb3fef27bdf8b6c58a1954fef9f5f Mon Sep 17 00:00:00 2001 From: Madeleine Date: Thu, 9 Mar 2023 08:33:38 +0000 Subject: [PATCH] initial commit --- .gitignore | 2 + README.md | 10 + flake.lock | 62 ++++++ flake.nix | 36 +++ maddie/audio.nix | 15 ++ maddie/audio/ytdlp-music.sh | 6 + maddie/bosskey.nix | 12 + maddie/bosskey/bosskey.sh | 50 +++++ maddie/browser.nix | 10 + maddie/btop.nix | 12 + maddie/calculator.nix | 7 + maddie/chromium.nix | 29 +++ maddie/code.nix | 9 + maddie/dmenu.nix | 17 ++ maddie/dmenu/dmenu-bluetooth | 317 +++++++++++++++++++++++++++ maddie/dmenu/dmenu-mount | 67 ++++++ maddie/dmenu/dmenu-pass | 35 +++ maddie/dmenu/dmenu-power | 9 + maddie/dmenu/dmenu-unicode | 18 ++ maddie/dunst.nix | 44 ++++ maddie/dwm.nix | 7 + maddie/editor.nix | 10 + maddie/fetch.nix | 9 + maddie/files.nix | 8 + maddie/firefox.nix | 48 ++++ maddie/games.nix | 9 + maddie/git.nix | 41 ++++ maddie/git/git-sync.sh | 6 + maddie/gtk.nix | 20 ++ maddie/home.nix | 10 + maddie/htop.nix | 19 ++ maddie/jetbrains.nix | 10 + maddie/kakoune.nix | 25 +++ maddie/kdeconnect.nix | 10 + maddie/media.nix | 9 + maddie/messaging.nix | 10 + maddie/minecraft.nix | 9 + maddie/mommy.nix | 12 + maddie/mommy/shell-mommy.sh | 77 +++++++ maddie/mpd.nix | 17 ++ maddie/mpv.nix | 10 + maddie/neovim.nix | 27 +++ maddie/neovim/.gitignore | 1 + maddie/neovim/LICENSE | 21 ++ maddie/neovim/README.md | 22 ++ maddie/neovim/init.lua | 255 +++++++++++++++++++++ maddie/neovim/lua/basics.lua | 36 +++ maddie/neovim/lua/colours.lua | 1 + maddie/neovim/lua/keymaps.lua | 59 +++++ maddie/neovim/lua/plugins/cmp.lua | 117 ++++++++++ maddie/neovim/spell/en.utf-8.add | 6 + maddie/neovim/spell/en.utf-8.add.spl | Bin 0 -> 111 bytes maddie/nsxiv.nix | 16 ++ maddie/nsxiv/exec/key-handler | 14 ++ maddie/obs-studio.nix | 5 + maddie/office.nix | 12 + maddie/openrgb.nix | 12 + maddie/passwords.nix | 14 ++ maddie/pcmanfm.nix | 11 + maddie/pcmanfm/default/pcmanfm.conf | 26 +++ maddie/picom.nix | 24 ++ maddie/processes.nix | 9 + maddie/qt.nix | 11 + maddie/rust.nix | 15 ++ maddie/screenshot.nix | 13 ++ maddie/screenshot/sst.sh | 40 ++++ maddie/shell.nix | 62 ++++++ maddie/slstatus.nix | 22 ++ maddie/smart-home.nix | 7 + maddie/ssh.nix | 25 +++ maddie/ssh/id_ed25519_sk.pub | 1 + maddie/statusbar/sb-clock | 3 + maddie/statusbar/sb-cpu | 6 + maddie/statusbar/sb-disk | 7 + maddie/statusbar/sb-forecast | 35 +++ maddie/statusbar/sb-iplocate | 10 + maddie/statusbar/sb-kernel | 5 + maddie/statusbar/sb-memory | 7 + maddie/statusbar/sb-temp | 13 ++ maddie/statusbar/sb-uptime | 6 + maddie/statusbar/sb-volume | 15 ++ maddie/steam.nix | 13 ++ maddie/steam/steam-killer.sh | 9 + maddie/terminal.nix | 9 + maddie/virtualisation.nix | 9 + maddie/xdg.nix | 73 ++++++ maddie/xorg.nix | 58 +++++ maddie/zathura.nix | 5 + maddie/zoxide.nix | 8 + maddie/zsh.nix | 123 +++++++++++ overlays.nix | 54 +++++ system/android.nix | 5 + system/audio.nix | 14 ++ system/bluetooth.nix | 6 + system/boot.nix | 31 +++ system/cpu.nix | 6 + system/disks.nix | 24 ++ system/doas.nix | 13 ++ system/firewall.nix | 6 + system/fonts.nix | 17 ++ system/gpg.nix | 9 + system/locale.nix | 13 ++ system/networking.nix | 17 ++ system/nix.nix | 16 ++ system/nixos.nix | 6 + system/nvidia.nix | 8 + system/packages.nix | 48 ++++ system/security.nix | 6 + system/services.nix | 6 + system/ssh.nix | 11 + system/systemd.nix | 8 + system/unfree.nix | 19 ++ system/users.nix | 10 + system/virtualisation.nix | 6 + system/xorg.nix | 19 ++ system/yubikey.nix | 22 ++ system/zsh.nix | 10 + utils/default.nix | 28 +++ utils/nixFilesIn.nix | 2 + utils/nixFilesInWithName.nix | 8 + 120 files changed, 2889 insertions(+) create mode 100644 .gitignore create mode 100644 README.md create mode 100644 flake.lock create mode 100644 flake.nix create mode 100644 maddie/audio.nix create mode 100755 maddie/audio/ytdlp-music.sh create mode 100644 maddie/bosskey.nix create mode 100755 maddie/bosskey/bosskey.sh create mode 100644 maddie/browser.nix create mode 100644 maddie/btop.nix create mode 100644 maddie/calculator.nix create mode 100644 maddie/chromium.nix create mode 100644 maddie/code.nix create mode 100644 maddie/dmenu.nix create mode 100755 maddie/dmenu/dmenu-bluetooth create mode 100755 maddie/dmenu/dmenu-mount create mode 100755 maddie/dmenu/dmenu-pass create mode 100755 maddie/dmenu/dmenu-power create mode 100755 maddie/dmenu/dmenu-unicode create mode 100644 maddie/dunst.nix create mode 100644 maddie/dwm.nix create mode 100644 maddie/editor.nix create mode 100644 maddie/fetch.nix create mode 100644 maddie/files.nix create mode 100644 maddie/firefox.nix create mode 100644 maddie/games.nix create mode 100644 maddie/git.nix create mode 100644 maddie/git/git-sync.sh create mode 100644 maddie/gtk.nix create mode 100644 maddie/home.nix create mode 100644 maddie/htop.nix create mode 100644 maddie/jetbrains.nix create mode 100644 maddie/kakoune.nix create mode 100644 maddie/kdeconnect.nix create mode 100644 maddie/media.nix create mode 100644 maddie/messaging.nix create mode 100644 maddie/minecraft.nix create mode 100644 maddie/mommy.nix create mode 100755 maddie/mommy/shell-mommy.sh create mode 100644 maddie/mpd.nix create mode 100644 maddie/mpv.nix create mode 100644 maddie/neovim.nix create mode 100644 maddie/neovim/.gitignore create mode 100644 maddie/neovim/LICENSE create mode 100644 maddie/neovim/README.md create mode 100644 maddie/neovim/init.lua create mode 100644 maddie/neovim/lua/basics.lua create mode 100644 maddie/neovim/lua/colours.lua create mode 100644 maddie/neovim/lua/keymaps.lua create mode 100644 maddie/neovim/lua/plugins/cmp.lua create mode 100644 maddie/neovim/spell/en.utf-8.add create mode 100644 maddie/neovim/spell/en.utf-8.add.spl create mode 100644 maddie/nsxiv.nix create mode 100755 maddie/nsxiv/exec/key-handler create mode 100644 maddie/obs-studio.nix create mode 100644 maddie/office.nix create mode 100644 maddie/openrgb.nix create mode 100644 maddie/passwords.nix create mode 100644 maddie/pcmanfm.nix create mode 100644 maddie/pcmanfm/default/pcmanfm.conf create mode 100644 maddie/picom.nix create mode 100644 maddie/processes.nix create mode 100644 maddie/qt.nix create mode 100644 maddie/rust.nix create mode 100644 maddie/screenshot.nix create mode 100644 maddie/screenshot/sst.sh create mode 100644 maddie/shell.nix create mode 100644 maddie/slstatus.nix create mode 100644 maddie/smart-home.nix create mode 100644 maddie/ssh.nix create mode 100644 maddie/ssh/id_ed25519_sk.pub create mode 100755 maddie/statusbar/sb-clock create mode 100755 maddie/statusbar/sb-cpu create mode 100755 maddie/statusbar/sb-disk create mode 100755 maddie/statusbar/sb-forecast create mode 100755 maddie/statusbar/sb-iplocate create mode 100755 maddie/statusbar/sb-kernel create mode 100755 maddie/statusbar/sb-memory create mode 100755 maddie/statusbar/sb-temp create mode 100755 maddie/statusbar/sb-uptime create mode 100755 maddie/statusbar/sb-volume create mode 100644 maddie/steam.nix create mode 100755 maddie/steam/steam-killer.sh create mode 100644 maddie/terminal.nix create mode 100644 maddie/virtualisation.nix create mode 100644 maddie/xdg.nix create mode 100644 maddie/xorg.nix create mode 100644 maddie/zathura.nix create mode 100644 maddie/zoxide.nix create mode 100644 maddie/zsh.nix create mode 100644 overlays.nix create mode 100644 system/android.nix create mode 100644 system/audio.nix create mode 100644 system/bluetooth.nix create mode 100644 system/boot.nix create mode 100644 system/cpu.nix create mode 100644 system/disks.nix create mode 100644 system/doas.nix create mode 100644 system/firewall.nix create mode 100644 system/fonts.nix create mode 100644 system/gpg.nix create mode 100644 system/locale.nix create mode 100644 system/networking.nix create mode 100644 system/nix.nix create mode 100644 system/nixos.nix create mode 100644 system/nvidia.nix create mode 100644 system/packages.nix create mode 100644 system/security.nix create mode 100644 system/services.nix create mode 100644 system/ssh.nix create mode 100644 system/systemd.nix create mode 100644 system/unfree.nix create mode 100644 system/users.nix create mode 100644 system/virtualisation.nix create mode 100644 system/xorg.nix create mode 100644 system/yubikey.nix create mode 100644 system/zsh.nix create mode 100644 utils/default.nix create mode 100644 utils/nixFilesIn.nix create mode 100644 utils/nixFilesInWithName.nix diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62d8881 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +result +*/result diff --git a/README.md b/README.md new file mode 100644 index 0000000..28d549c --- /dev/null +++ b/README.md @@ -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 diff --git a/flake.lock b/flake.lock new file mode 100644 index 0000000..a518439 --- /dev/null +++ b/flake.lock @@ -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 +} diff --git a/flake.nix b/flake.nix new file mode 100644 index 0000000..13ed6b9 --- /dev/null +++ b/flake.nix @@ -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; + }; +} diff --git a/maddie/audio.nix b/maddie/audio.nix new file mode 100644 index 0000000..846ae07 --- /dev/null +++ b/maddie/audio.nix @@ -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; + }; +} diff --git a/maddie/audio/ytdlp-music.sh b/maddie/audio/ytdlp-music.sh new file mode 100755 index 0000000..36b12d9 --- /dev/null +++ b/maddie/audio/ytdlp-music.sh @@ -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" diff --git a/maddie/bosskey.nix b/maddie/bosskey.nix new file mode 100644 index 0000000..b4a55d2 --- /dev/null +++ b/maddie/bosskey.nix @@ -0,0 +1,12 @@ +{ config, pkgs, ...}: + +{ + home.packages = with pkgs; [ + slock + ]; + + home.file.".local/bin/bosskey" = { + source = ./bosskey/bosskey.sh; + executable = true; + }; +} diff --git a/maddie/bosskey/bosskey.sh b/maddie/bosskey/bosskey.sh new file mode 100755 index 0000000..fb0f46c --- /dev/null +++ b/maddie/bosskey/bosskey.sh @@ -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 diff --git a/maddie/browser.nix b/maddie/browser.nix new file mode 100644 index 0000000..f68dff5 --- /dev/null +++ b/maddie/browser.nix @@ -0,0 +1,10 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + tor-browser-bundle-bin + librewolf + amfora + lynx + ]; +} diff --git a/maddie/btop.nix b/maddie/btop.nix new file mode 100644 index 0000000..0b25080 --- /dev/null +++ b/maddie/btop.nix @@ -0,0 +1,12 @@ +{ config, ...}: + +{ + programs.btop = { + enable = true; + settings = { + color_theme = "TTY"; + theme_background = false; + truecolor = true; + }; + }; +} diff --git a/maddie/calculator.nix b/maddie/calculator.nix new file mode 100644 index 0000000..fb1cf64 --- /dev/null +++ b/maddie/calculator.nix @@ -0,0 +1,7 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + nodePackages.insect + ]; +} diff --git a/maddie/chromium.nix b/maddie/chromium.nix new file mode 100644 index 0000000..30bc36a --- /dev/null +++ b/maddie/chromium.nix @@ -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"; } + ]; + }; +} diff --git a/maddie/code.nix b/maddie/code.nix new file mode 100644 index 0000000..34a848f --- /dev/null +++ b/maddie/code.nix @@ -0,0 +1,9 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + python3Full # Python + go # Go + gcc # C + ]; +} diff --git a/maddie/dmenu.nix b/maddie/dmenu.nix new file mode 100644 index 0000000..222dc3e --- /dev/null +++ b/maddie/dmenu.nix @@ -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" + ]; +} diff --git a/maddie/dmenu/dmenu-bluetooth b/maddie/dmenu/dmenu-bluetooth new file mode 100755 index 0000000..0eb5a07 --- /dev/null +++ b/maddie/dmenu/dmenu-bluetooth @@ -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 diff --git a/maddie/dmenu/dmenu-mount b/maddie/dmenu/dmenu-mount new file mode 100755 index 0000000..3cb1f81 --- /dev/null +++ b/maddie/dmenu/dmenu-mount @@ -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 diff --git a/maddie/dmenu/dmenu-pass b/maddie/dmenu/dmenu-pass new file mode 100755 index 0000000..76d92ab --- /dev/null +++ b/maddie/dmenu/dmenu-pass @@ -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 diff --git a/maddie/dmenu/dmenu-power b/maddie/dmenu/dmenu-power new file mode 100755 index 0000000..760fab1 --- /dev/null +++ b/maddie/dmenu/dmenu-power @@ -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" diff --git a/maddie/dmenu/dmenu-unicode b/maddie/dmenu/dmenu-unicode new file mode 100755 index 0000000..18ee0a5 --- /dev/null +++ b/maddie/dmenu/dmenu-unicode @@ -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 diff --git a/maddie/dunst.nix b/maddie/dunst.nix new file mode 100644 index 0000000..05198be --- /dev/null +++ b/maddie/dunst.nix @@ -0,0 +1,44 @@ +{ config, pkgs, ... }: + +{ + services.dunst = { + enable = true; + settings = { + global = { + # Style + format = "%s\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; + }; + }; + }; +} diff --git a/maddie/dwm.nix b/maddie/dwm.nix new file mode 100644 index 0000000..305b7cf --- /dev/null +++ b/maddie/dwm.nix @@ -0,0 +1,7 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + dwm # Suckless dynamic window manager + ]; +} diff --git a/maddie/editor.nix b/maddie/editor.nix new file mode 100644 index 0000000..e0488f2 --- /dev/null +++ b/maddie/editor.nix @@ -0,0 +1,10 @@ +{ config, pkgs, ... }: + +{ + # Misc editors + home.packages = with pkgs; [ + vscode + helix + vis + ]; +} diff --git a/maddie/fetch.nix b/maddie/fetch.nix new file mode 100644 index 0000000..b32cf64 --- /dev/null +++ b/maddie/fetch.nix @@ -0,0 +1,9 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + pridefetch # System stats with pride flags + neofetch # Generic system stats + pfetch # Simple system stats + ]; +} diff --git a/maddie/files.nix b/maddie/files.nix new file mode 100644 index 0000000..cff192e --- /dev/null +++ b/maddie/files.nix @@ -0,0 +1,8 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + ncdu_2 # Disk space manager + clifm # TUI file manager + ]; +} diff --git a/maddie/firefox.nix b/maddie/firefox.nix new file mode 100644 index 0000000..3a4bb28 --- /dev/null +++ b/maddie/firefox.nix @@ -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"; + } + ]; + } + ]; + }; + }; + }; +} diff --git a/maddie/games.nix b/maddie/games.nix new file mode 100644 index 0000000..7ce47a8 --- /dev/null +++ b/maddie/games.nix @@ -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 + ]; +} diff --git a/maddie/git.nix b/maddie/git.nix new file mode 100644 index 0000000..c1c199c --- /dev/null +++ b/maddie/git.nix @@ -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"; + }; + }; +} diff --git a/maddie/git/git-sync.sh b/maddie/git/git-sync.sh new file mode 100644 index 0000000..b012d63 --- /dev/null +++ b/maddie/git/git-sync.sh @@ -0,0 +1,6 @@ +#!/usr/bin/env sh + +git add . +git commit -am "$(date --iso-8601)" +git pull +git push diff --git a/maddie/gtk.nix b/maddie/gtk.nix new file mode 100644 index 0000000..2ae6a26 --- /dev/null +++ b/maddie/gtk.nix @@ -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"; + }; + }; +} diff --git a/maddie/home.nix b/maddie/home.nix new file mode 100644 index 0000000..c70266e --- /dev/null +++ b/maddie/home.nix @@ -0,0 +1,10 @@ +{ config, username, ... }: + +{ + programs.home-manager.enable = true; + home = { + inherit username; + homeDirectory = "/home/${username}"; + stateVersion = "22.11"; + }; +} diff --git a/maddie/htop.nix b/maddie/htop.nix new file mode 100644 index 0000000..729222c --- /dev/null +++ b/maddie/htop.nix @@ -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; + }; + }; +} diff --git a/maddie/jetbrains.nix b/maddie/jetbrains.nix new file mode 100644 index 0000000..e153807 --- /dev/null +++ b/maddie/jetbrains.nix @@ -0,0 +1,10 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + jetbrains.clion + jetbrains.goland + jetbrains.webstorm + jetbrains.pycharm-professional + ]; +} diff --git a/maddie/kakoune.nix b/maddie/kakoune.nix new file mode 100644 index 0000000..5e487d0 --- /dev/null +++ b/maddie/kakoune.nix @@ -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 + ]; + }; +} diff --git a/maddie/kdeconnect.nix b/maddie/kdeconnect.nix new file mode 100644 index 0000000..51b90f5 --- /dev/null +++ b/maddie/kdeconnect.nix @@ -0,0 +1,10 @@ +{ config, ... }: + +{ + services.kdeconnect.enable = true; + + home.file.".xinitrc".text = '' + # Start kdeconnect when entering a graphical session + systemctl restart --user kdeconnect & + ''; +} diff --git a/maddie/media.nix b/maddie/media.nix new file mode 100644 index 0000000..9ce7a54 --- /dev/null +++ b/maddie/media.nix @@ -0,0 +1,9 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + libheif # Manage .heif files from phones + gcolor2 # Color viewer and eyedropper + ffmpeg # Video manipulator + ]; +} diff --git a/maddie/messaging.nix b/maddie/messaging.nix new file mode 100644 index 0000000..290f13e --- /dev/null +++ b/maddie/messaging.nix @@ -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 + ]; +} diff --git a/maddie/minecraft.nix b/maddie/minecraft.nix new file mode 100644 index 0000000..b92549e --- /dev/null +++ b/maddie/minecraft.nix @@ -0,0 +1,9 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + prismlauncher # Minecraft launcher + minecraft # Actual minecraft + jdk # Needed for running minecraft servers + ]; +} diff --git a/maddie/mommy.nix b/maddie/mommy.nix new file mode 100644 index 0000000..d78da2a --- /dev/null +++ b/maddie/mommy.nix @@ -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; + }; +} diff --git a/maddie/mommy/shell-mommy.sh b/maddie/mommy/shell-mommy.sh new file mode 100755 index 0000000..ac215eb --- /dev/null +++ b/maddie/mommy/shell-mommy.sh @@ -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 diff --git a/maddie/mpd.nix b/maddie/mpd.nix new file mode 100644 index 0000000..18840f7 --- /dev/null +++ b/maddie/mpd.nix @@ -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"; + }; + }; +} diff --git a/maddie/mpv.nix b/maddie/mpv.nix new file mode 100644 index 0000000..9841efd --- /dev/null +++ b/maddie/mpv.nix @@ -0,0 +1,10 @@ +{ config, ... }: + +{ + programs.mpv = { + enable = true; + config = { + loop-file = "inf"; + }; + }; +} diff --git a/maddie/neovim.nix b/maddie/neovim.nix new file mode 100644 index 0000000..7916dee --- /dev/null +++ b/maddie/neovim.nix @@ -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; + }; +} diff --git a/maddie/neovim/.gitignore b/maddie/neovim/.gitignore new file mode 100644 index 0000000..8cb205e --- /dev/null +++ b/maddie/neovim/.gitignore @@ -0,0 +1 @@ +plugin diff --git a/maddie/neovim/LICENSE b/maddie/neovim/LICENSE new file mode 100644 index 0000000..f608636 --- /dev/null +++ b/maddie/neovim/LICENSE @@ -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. diff --git a/maddie/neovim/README.md b/maddie/neovim/README.md new file mode 100644 index 0000000..e509bf7 --- /dev/null +++ b/maddie/neovim/README.md @@ -0,0 +1,22 @@ +# Maddie's NeoVim config +A clean, fast, feature-rich IDE layer for my needs in [NeoVim](https://neovim.io/).
+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.
+I likely won't make changes to make the config more acceptable and general to the public.
+Made with ❤️ and 🏳️‍⚧️. diff --git a/maddie/neovim/init.lua b/maddie/neovim/init.lua new file mode 100644 index 0000000..de906a8 --- /dev/null +++ b/maddie/neovim/init.lua @@ -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) diff --git a/maddie/neovim/lua/basics.lua b/maddie/neovim/lua/basics.lua new file mode 100644 index 0000000..0028c9b --- /dev/null +++ b/maddie/neovim/lua/basics.lua @@ -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 diff --git a/maddie/neovim/lua/colours.lua b/maddie/neovim/lua/colours.lua new file mode 100644 index 0000000..344eaf8 --- /dev/null +++ b/maddie/neovim/lua/colours.lua @@ -0,0 +1 @@ +vim.cmd([[colorscheme onedark]]) diff --git a/maddie/neovim/lua/keymaps.lua b/maddie/neovim/lua/keymaps.lua new file mode 100644 index 0000000..745fc15 --- /dev/null +++ b/maddie/neovim/lua/keymaps.lua @@ -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', 'c', ':sp :term :resize 20N i', term_opts) +keymap('n', 'r', ':luafile %:PackerSync', term_opts) +keymap('n', 'h', ':nohl', term_opts) +keymap('n', 'z', ':ZenMode:set wrap:set linebreak', term_opts) +keymap('n', 'Z', ':ZenMode:set nowrap:set nolinebreak', term_opts) +keymap('n', '', ':Telescope colorscheme', term_opts) +keymap('n', '', ':wqa', term_opts) +keymap('n', '', ':w', term_opts) +keymap('n', 'U', ':redo', term_opts) + +-- Window management +keymap('n', 'vs', ':vs', opts) +keymap('n', 'hs', ':sp', opts) +keymap('n', 'tn', ':tabnew', opts) +keymap('n', 'th', ':tabprev', opts) +keymap('n', 'tj', ':tabprev', opts) +keymap('n', 'tk', ':tabnext', opts) +keymap('n', 'tl', ':tabnext', opts) +keymap('n', 'to', ':tabo', opts) +keymap('n', 'tc', ':tabc', opts) + +-- Window navigation +keymap('n', '', 'w', opts) +keymap('n', '', 'h', opts) +keymap('n', '', 'j', opts) +keymap('n', '', 'k', opts) +keymap('n', '', 'l', opts) + +-- Buffer navigation +keymap('n', '', ':bnext', opts) +keymap('n', '', ':bprevious', opts) + +-- Stay in visual mode when indenting +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', '', ':NvimTreeToggle', term_opts) + +-- Telescope +keymap('n', '', 'lua require("telescope.builtin").find_files()', opts) +keymap('n', 'ff', 'lua require("telescope.builtin").find_files()', opts) +keymap('n', 'fg', 'lua require("telescope.builtin").live_grep()', opts) +keymap('n', 'fb', 'lua require("telescope.builtin").buffers()', opts) +keymap('n', 'fh', 'lua require("telescope.builtin").help_tags()', opts) + +-- Easy alignment +keymap('n', 'ga', ':EasyAlign', opts) +keymap('v', 'ga', ':EasyAlign', opts) diff --git a/maddie/neovim/lua/plugins/cmp.lua b/maddie/neovim/lua/plugins/cmp.lua new file mode 100644 index 0000000..224eccb --- /dev/null +++ b/maddie/neovim/lua/plugins/cmp.lua @@ -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 = { + [""] = cmp.mapping.select_prev_item(), + [""] = cmp.mapping.select_next_item(), + [""] = cmp.mapping(cmp.mapping.scroll_docs(-1), { "i", "c" }), + [""] = cmp.mapping(cmp.mapping.scroll_docs(1), { "i", "c" }), + [""] = cmp.mapping(cmp.mapping.complete(), { "i", "c" }), + [""] = cmp.config.disable, + [""] = cmp.mapping { + i = cmp.mapping.abort(), + c = cmp.mapping.close(), + }, + [""] = cmp.mapping.confirm { select = true }, + [""] = 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", + }), + [""] = 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() +} diff --git a/maddie/neovim/spell/en.utf-8.add b/maddie/neovim/spell/en.utf-8.add new file mode 100644 index 0000000..6f1ee5d --- /dev/null +++ b/maddie/neovim/spell/en.utf-8.add @@ -0,0 +1,6 @@ +macOS +JS +add evelyne +evelyne +camhs +Vernova diff --git a/maddie/neovim/spell/en.utf-8.add.spl b/maddie/neovim/spell/en.utf-8.add.spl new file mode 100644 index 0000000000000000000000000000000000000000..44abfca3a3e482e4cd6390872f6a72b75a2e6077 GIT binary patch literal 111 zcmWIZ^erw(&B-zP&%nUo$d;I#nw49|m;!_fjEoEnlBtY|jJb>%jKz!$jAe|ej5&;z vjCmj#@l>D~6AMr}nK2*4Yyip@0p;?6>Jk~5n1JT-0JVbT{TYLSIzRvbGS(C5 literal 0 HcmV?d00001 diff --git a/maddie/nsxiv.nix b/maddie/nsxiv.nix new file mode 100644 index 0000000..8b538c9 --- /dev/null +++ b/maddie/nsxiv.nix @@ -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"; + }; +} diff --git a/maddie/nsxiv/exec/key-handler b/maddie/nsxiv/exec/key-handler new file mode 100755 index 0000000..70c7593 --- /dev/null +++ b/maddie/nsxiv/exec/key-handler @@ -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 diff --git a/maddie/obs-studio.nix b/maddie/obs-studio.nix new file mode 100644 index 0000000..07f8a87 --- /dev/null +++ b/maddie/obs-studio.nix @@ -0,0 +1,5 @@ +{ config, ... }: + +{ + programs.obs-studio.enable = true; +} diff --git a/maddie/office.nix b/maddie/office.nix new file mode 100644 index 0000000..892c7b1 --- /dev/null +++ b/maddie/office.nix @@ -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 + ]; +} diff --git a/maddie/openrgb.nix b/maddie/openrgb.nix new file mode 100644 index 0000000..9ef4ccb --- /dev/null +++ b/maddie/openrgb.nix @@ -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 & + ''; +} diff --git a/maddie/passwords.nix b/maddie/passwords.nix new file mode 100644 index 0000000..c43e87d --- /dev/null +++ b/maddie/passwords.nix @@ -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"; + }; +} diff --git a/maddie/pcmanfm.nix b/maddie/pcmanfm.nix new file mode 100644 index 0000000..e235e38 --- /dev/null +++ b/maddie/pcmanfm.nix @@ -0,0 +1,11 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + pcmanfm + ]; + + xdg.configFile."pcmanfm" = { + source = ./pcmanfm; + }; +} diff --git a/maddie/pcmanfm/default/pcmanfm.conf b/maddie/pcmanfm/default/pcmanfm.conf new file mode 100644 index 0000000..79dfed0 --- /dev/null +++ b/maddie/pcmanfm/default/pcmanfm.conf @@ -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 diff --git a/maddie/picom.nix b/maddie/picom.nix new file mode 100644 index 0000000..f0ff73d --- /dev/null +++ b/maddie/picom.nix @@ -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; + }; +} diff --git a/maddie/processes.nix b/maddie/processes.nix new file mode 100644 index 0000000..27c0201 --- /dev/null +++ b/maddie/processes.nix @@ -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 + ]; +} diff --git a/maddie/qt.nix b/maddie/qt.nix new file mode 100644 index 0000000..a0f7efc --- /dev/null +++ b/maddie/qt.nix @@ -0,0 +1,11 @@ +{ config, pkgs, ... }: + +{ + qt = { + enable = true; + style = { + package = pkgs.adwaita-qt; + name = "adwaita-dark"; + }; + }; +} diff --git a/maddie/rust.nix b/maddie/rust.nix new file mode 100644 index 0000000..990c3ef --- /dev/null +++ b/maddie/rust.nix @@ -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" ]; + }; +} diff --git a/maddie/screenshot.nix b/maddie/screenshot.nix new file mode 100644 index 0000000..efd34d8 --- /dev/null +++ b/maddie/screenshot.nix @@ -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; + }; +} diff --git a/maddie/screenshot/sst.sh b/maddie/screenshot/sst.sh new file mode 100644 index 0000000..efe43ee --- /dev/null +++ b/maddie/screenshot/sst.sh @@ -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 diff --git a/maddie/shell.nix b/maddie/shell.nix new file mode 100644 index 0000000..7af6ff2 --- /dev/null +++ b/maddie/shell.nix @@ -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" + ]; + }; +} diff --git a/maddie/slstatus.nix b/maddie/slstatus.nix new file mode 100644 index 0000000..0ba11ba --- /dev/null +++ b/maddie/slstatus.nix @@ -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" + ]; +} diff --git a/maddie/smart-home.nix b/maddie/smart-home.nix new file mode 100644 index 0000000..a13660e --- /dev/null +++ b/maddie/smart-home.nix @@ -0,0 +1,7 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + home-assistant-cli + ]; +} diff --git a/maddie/ssh.nix b/maddie/ssh.nix new file mode 100644 index 0000000..b004949 --- /dev/null +++ b/maddie/ssh.nix @@ -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"; + }; + }; + }; +} diff --git a/maddie/ssh/id_ed25519_sk.pub b/maddie/ssh/id_ed25519_sk.pub new file mode 100644 index 0000000..39cc2d1 --- /dev/null +++ b/maddie/ssh/id_ed25519_sk.pub @@ -0,0 +1 @@ +sk-ssh-ed25519@openssh.com AAAAGnNrLXNzaC1lZDI1NTE5QG9wZW5zc2guY29tAAAAIA1jTkcMhBQQoYqNVLofrNnTbB8RCyzSYmdsnPeoOineAAAABHNzaDo= spy@luna (yubikey) diff --git a/maddie/statusbar/sb-clock b/maddie/statusbar/sb-clock new file mode 100755 index 0000000..d39f8db --- /dev/null +++ b/maddie/statusbar/sb-clock @@ -0,0 +1,3 @@ +#!/bin/sh + +echo " $(date "+%a %d %b")  $(date "+%I:%M:%S%p")" diff --git a/maddie/statusbar/sb-cpu b/maddie/statusbar/sb-cpu new file mode 100755 index 0000000..0e63fbb --- /dev/null +++ b/maddie/statusbar/sb-cpu @@ -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%" diff --git a/maddie/statusbar/sb-disk b/maddie/statusbar/sb-disk new file mode 100755 index 0000000..9ae903d --- /dev/null +++ b/maddie/statusbar/sb-disk @@ -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" diff --git a/maddie/statusbar/sb-forecast b/maddie/statusbar/sb-forecast new file mode 100755 index 0000000..685be80 --- /dev/null +++ b/maddie/statusbar/sb-forecast @@ -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 diff --git a/maddie/statusbar/sb-iplocate b/maddie/statusbar/sb-iplocate new file mode 100755 index 0000000..02adab8 --- /dev/null +++ b/maddie/statusbar/sb-iplocate @@ -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/;.*//" diff --git a/maddie/statusbar/sb-kernel b/maddie/statusbar/sb-kernel new file mode 100755 index 0000000..6619a05 --- /dev/null +++ b/maddie/statusbar/sb-kernel @@ -0,0 +1,5 @@ +#!/bin/sh + +kernel=$(uname -r) +icon="" +echo "$icon $kernel" diff --git a/maddie/statusbar/sb-memory b/maddie/statusbar/sb-memory new file mode 100755 index 0000000..2ff0c4e --- /dev/null +++ b/maddie/statusbar/sb-memory @@ -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" diff --git a/maddie/statusbar/sb-temp b/maddie/statusbar/sb-temp new file mode 100755 index 0000000..bbbd63d --- /dev/null +++ b/maddie/statusbar/sb-temp @@ -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" diff --git a/maddie/statusbar/sb-uptime b/maddie/statusbar/sb-uptime new file mode 100755 index 0000000..28046d5 --- /dev/null +++ b/maddie/statusbar/sb-uptime @@ -0,0 +1,6 @@ +#!/bin/sh + +uptime=$(uptime | awk '{print $3}' | sed 's/,//') +icon="" + +echo "$icon $uptime" diff --git a/maddie/statusbar/sb-volume b/maddie/statusbar/sb-volume new file mode 100755 index 0000000..f75b83d --- /dev/null +++ b/maddie/statusbar/sb-volume @@ -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%" diff --git a/maddie/steam.nix b/maddie/steam.nix new file mode 100644 index 0000000..6a3c994 --- /dev/null +++ b/maddie/steam.nix @@ -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; + }; +} diff --git a/maddie/steam/steam-killer.sh b/maddie/steam/steam-killer.sh new file mode 100755 index 0000000..93b501b --- /dev/null +++ b/maddie/steam/steam-killer.sh @@ -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 diff --git a/maddie/terminal.nix b/maddie/terminal.nix new file mode 100644 index 0000000..aaa4690 --- /dev/null +++ b/maddie/terminal.nix @@ -0,0 +1,9 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + cool-retro-term # Retro-style terminal + kitty # Used for testing + st # Suckless terminal + ]; +} diff --git a/maddie/virtualisation.nix b/maddie/virtualisation.nix new file mode 100644 index 0000000..68b90f2 --- /dev/null +++ b/maddie/virtualisation.nix @@ -0,0 +1,9 @@ +{ config, pkgs, ... }: + +{ + home.packages = with pkgs; [ + virt-manager # Manages QEMU virtual machines + bottles # GTK interface for wine + wine # Windows emulation + ]; +} diff --git a/maddie/xdg.nix b/maddie/xdg.nix new file mode 100644 index 0000000..08a1993 --- /dev/null +++ b/maddie/xdg.nix @@ -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"; + }; + }; +} diff --git a/maddie/xorg.nix b/maddie/xorg.nix new file mode 100644 index 0000000..1f8cc1c --- /dev/null +++ b/maddie/xorg.nix @@ -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"; + }; +} diff --git a/maddie/zathura.nix b/maddie/zathura.nix new file mode 100644 index 0000000..6430428 --- /dev/null +++ b/maddie/zathura.nix @@ -0,0 +1,5 @@ +{ config, ... }: + +{ + programs.zathura.enable = true; +} diff --git a/maddie/zoxide.nix b/maddie/zoxide.nix new file mode 100644 index 0000000..5a727b0 --- /dev/null +++ b/maddie/zoxide.nix @@ -0,0 +1,8 @@ +{ config, ... }: + +{ + programs.zoxide = { + enable = true; + options = [ "--cmd=cd" ]; + }; +} diff --git a/maddie/zsh.nix b/maddie/zsh.nix new file mode 100644 index 0000000..434cbae --- /dev/null +++ b/maddie/zsh.nix @@ -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; + }; + }; +} diff --git a/overlays.nix b/overlays.nix new file mode 100644 index 0000000..e07e9bc --- /dev/null +++ b/overlays.nix @@ -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" ]; + }; + }) +] diff --git a/system/android.nix b/system/android.nix new file mode 100644 index 0000000..b9fd5f2 --- /dev/null +++ b/system/android.nix @@ -0,0 +1,5 @@ +{ config, ... }: + +{ + programs.adb.enable = true; +} diff --git a/system/audio.nix b/system/audio.nix new file mode 100644 index 0000000..329fa97 --- /dev/null +++ b/system/audio.nix @@ -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; + }; +} diff --git a/system/bluetooth.nix b/system/bluetooth.nix new file mode 100644 index 0000000..fae0e1d --- /dev/null +++ b/system/bluetooth.nix @@ -0,0 +1,6 @@ +{ config, ... }: + +{ + hardware.bluetooth.enable = true; + services.blueman.enable = true; +} diff --git a/system/boot.nix b/system/boot.nix new file mode 100644 index 0000000..9120626 --- /dev/null +++ b/system/boot.nix @@ -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; +} diff --git a/system/cpu.nix b/system/cpu.nix new file mode 100644 index 0000000..dcb9255 --- /dev/null +++ b/system/cpu.nix @@ -0,0 +1,6 @@ +{ config, lib, ... }: + +{ + powerManagement.cpuFreqGovernor = lib.mkDefault "powersave"; + hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware; +} diff --git a/system/disks.nix b/system/disks.nix new file mode 100644 index 0000000..b78af9a --- /dev/null +++ b/system/disks.nix @@ -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"; }]; +} diff --git a/system/doas.nix b/system/doas.nix new file mode 100644 index 0000000..6aa5f72 --- /dev/null +++ b/system/doas.nix @@ -0,0 +1,13 @@ +{ config, username, ... }: + +{ + security.sudo.enable = false; + security.doas = { + enable = true; + extraRules = [{ + users = [ "${username}" ]; + keepEnv = true; + persist = true; + }]; + }; +} diff --git a/system/firewall.nix b/system/firewall.nix new file mode 100644 index 0000000..1abda33 --- /dev/null +++ b/system/firewall.nix @@ -0,0 +1,6 @@ +{ config, ... }: + +{ + # Disable the firewall altogether + networking.firewall.enable = false; +} diff --git a/system/fonts.nix b/system/fonts.nix new file mode 100644 index 0000000..d458bf1 --- /dev/null +++ b/system/fonts.nix @@ -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 + ]; +} diff --git a/system/gpg.nix b/system/gpg.nix new file mode 100644 index 0000000..8ce0a92 --- /dev/null +++ b/system/gpg.nix @@ -0,0 +1,9 @@ +{ config, ... }: + +{ + programs.gnupg.agent = { + enable = true; + enableSSHSupport = true; + pinentryFlavor = "gtk2"; + }; +} diff --git a/system/locale.nix b/system/locale.nix new file mode 100644 index 0000000..1c7fd22 --- /dev/null +++ b/system/locale.nix @@ -0,0 +1,13 @@ +{ config, ... }: + +{ + # Time zone + time.timeZone = "Europe/London"; + + # Internationalisation properties + i18n.defaultLocale = "en_GB.UTF-8"; + console = { + font = "Lat2-Terminus16"; + keyMap = "uk"; + }; +} diff --git a/system/networking.nix b/system/networking.nix new file mode 100644 index 0000000..37abd0e --- /dev/null +++ b/system/networking.nix @@ -0,0 +1,17 @@ +{ config, lib, ... }: + +{ + # DHCP + networking.useDHCP = lib.mkDefault true; + + # Hostname + networking.hostName = "luna"; + + # Enable wireless support & configuration + networking.wireless.enable = true; + networking.wireless.networks = { + "BT-C5CPMR" = { + psk = "hN3LtFrkp36bXc"; + }; + }; +} diff --git a/system/nix.nix b/system/nix.nix new file mode 100644 index 0000000..533f7e9 --- /dev/null +++ b/system/nix.nix @@ -0,0 +1,16 @@ +{ config, pkgs, ... }: + +{ + # Enable flakes and nix-command + nix = { + package = pkgs.nixVersions.stable; + settings = { + experimental-features = [ "nix-command" "flakes" ]; + auto-optimise-store = true; + }; + gc = { + automatic = true; + options = "--delete-older-than 7d"; + }; + }; +} diff --git a/system/nixos.nix b/system/nixos.nix new file mode 100644 index 0000000..5a803d6 --- /dev/null +++ b/system/nixos.nix @@ -0,0 +1,6 @@ +{ config, lib, ... }: + +{ + system.stateVersion = "22.05"; + nixpkgs.hostPlatform = lib.mkDefault "x86_64-linux"; +} diff --git a/system/nvidia.nix b/system/nvidia.nix new file mode 100644 index 0000000..ab6ee92 --- /dev/null +++ b/system/nvidia.nix @@ -0,0 +1,8 @@ +{ config, ... }: + +{ + hardware.opengl.enable = true; + hardware.opengl.driSupport32Bit = true; + hardware.nvidia.package = config.boot.kernelPackages.nvidiaPackages.stable; + services.xserver.videoDrivers = [ "nvidia" ]; +} diff --git a/system/packages.nix b/system/packages.nix new file mode 100644 index 0000000..72a7ca8 --- /dev/null +++ b/system/packages.nix @@ -0,0 +1,48 @@ +{ config, pkgs, ... }: + +{ + # System-wide packages + # I want these available for all users at all times + environment.systemPackages = with pkgs; [ + # Xorg packages + xorg.xinit + xorg.xkill + xorg.xprop + xorg.xwininfo + xorg.xrandr + xdotool + xclip + + # Processes + killall + appimage-run + ani-cli + yt-dlp + mediainfo + + # Filesystems + dosfstools + ntfs3g + exfatprogs + libimobiledevice + ifuse + + # Archives + zip + unrar + unzip + p7zip + + # Cli tools + wget + fzf + bat + + # XDG + xdg-utils + xdg-user-dirs + + # Git + git + ]; +} diff --git a/system/security.nix b/system/security.nix new file mode 100644 index 0000000..65a4e9a --- /dev/null +++ b/system/security.nix @@ -0,0 +1,6 @@ +{ config, pkgs, ... }: + +{ + programs.slock.enable = true; + security.wrappers.slock.source = "${pkgs.slock.out}/bin/slock"; +} diff --git a/system/services.nix b/system/services.nix new file mode 100644 index 0000000..291c999 --- /dev/null +++ b/system/services.nix @@ -0,0 +1,6 @@ +{ config, ... }: + +{ + # Misc services + services.usbmuxd.enable = true; +} diff --git a/system/ssh.nix b/system/ssh.nix new file mode 100644 index 0000000..d87450f --- /dev/null +++ b/system/ssh.nix @@ -0,0 +1,11 @@ +{ config, username, ... }: + +{ + services.openssh = { + enable = true; + settings.permitRootLogin = "no"; + settings.passwordAuthentication = false; + }; + programs.ssh.hostKeyAlgorithms = [ "sk-ssh-ed25519@openssh.com" "ssh-ed25519" ]; + users.users.${username}.openssh.authorizedKeys.keyFiles = [ ../maddie/ssh/id_ed25519_sk.pub ]; +} diff --git a/system/systemd.nix b/system/systemd.nix new file mode 100644 index 0000000..93db17e --- /dev/null +++ b/system/systemd.nix @@ -0,0 +1,8 @@ +{ config, ... }: + +{ + # Stop systemd from hanging for ages + systemd.extraConfig = '' + DefaultTimeoutStopSec=10s + ''; +} diff --git a/system/unfree.nix b/system/unfree.nix new file mode 100644 index 0000000..5203d7b --- /dev/null +++ b/system/unfree.nix @@ -0,0 +1,19 @@ +{ config, lib, ... }: +let + allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) config.internal.allowUnfree; +in +{ + options.internal.allowUnfree = with lib; + mkOption { + type = types.listOf types.str; + default = [ ]; + description = "Unfree packages to permit installing via the AllowUnfreePredicate"; + }; + config = { + environment.variables = { + NIXPKGS_ALLOW_UNFREE = "1"; + }; + nixpkgs.config.allowUnfreePredicate = allowUnfreePredicate; + }; +} + diff --git a/system/users.nix b/system/users.nix new file mode 100644 index 0000000..0b6ec4d --- /dev/null +++ b/system/users.nix @@ -0,0 +1,10 @@ +{ config, pkgs, username, ... }: + +{ + users.users.${username} = { + isNormalUser = true; + shell = pkgs.zsh; + description = "Madeleine"; + extraGroups = [ "adbusers" "dialout" "libvirtd" "plugdev" ]; + }; +} diff --git a/system/virtualisation.nix b/system/virtualisation.nix new file mode 100644 index 0000000..dad25d2 --- /dev/null +++ b/system/virtualisation.nix @@ -0,0 +1,6 @@ +{ config, ... }: + +{ + virtualisation.libvirtd.enable = true; + programs.dconf.enable = true; +} diff --git a/system/xorg.nix b/system/xorg.nix new file mode 100644 index 0000000..6d8a649 --- /dev/null +++ b/system/xorg.nix @@ -0,0 +1,19 @@ +{ config, pkgs, ... }: + +{ + services.xserver = { + # Enable X11 windowing system + enable = true; + + # Set gb X11 keymap + layout = "gb"; + xkbOptions = "eurosign:e"; + + # Use startx for starting window managers + displayManager = { + startx.enable = true; + sessionCommands = '' + ''; + }; + }; +} diff --git a/system/yubikey.nix b/system/yubikey.nix new file mode 100644 index 0000000..46d9af9 --- /dev/null +++ b/system/yubikey.nix @@ -0,0 +1,22 @@ +{ config, pkgs, ... }: + +{ + services.pcscd.enable = false; + services.udev.packages = [ pkgs.yubikey-personalization pkgs.android-udev-rules ]; + security.pam = { + services = { + login.u2fAuth = true; + doas.u2fAuth = true; + }; + yubico = { + enable = true; + mode = "challenge-response"; + control = "optional"; + }; + }; + + environment.systemPackages = with pkgs; [ + yubioath-flutter + yubikey-personalization + ]; +} diff --git a/system/zsh.nix b/system/zsh.nix new file mode 100644 index 0000000..3aab6fb --- /dev/null +++ b/system/zsh.nix @@ -0,0 +1,10 @@ +{ config, pkgs, ... }: + +{ + programs.zsh = { + enable = true; + autosuggestions.enable = true; + syntaxHighlighting.enable = true; + }; + users.defaultUserShell = pkgs.zsh; +} diff --git a/utils/default.nix b/utils/default.nix new file mode 100644 index 0000000..04a7376 --- /dev/null +++ b/utils/default.nix @@ -0,0 +1,28 @@ +pkgs_or_lib: +let + is_pkgs = pkgs_or_lib ? lib; + lib = if is_pkgs then pkgs_or_lib.lib else pkgs_or_lib; + utils = lib.pipe ./. [ + (import ./nixFilesInWithName.nix lib) + (builtins.map (file: rec { + name = lib.removeSuffix ".nix" file.name; + func = import file.path; + accepts_pkgs = builtins.hasAttr "pkgs" (builtins.functionArgs func); + value = + if accepts_pkgs then + func + (builtins.intersectAttrs (builtins.functionArgs func) { + inherit + lib utils; pkgs = pkgs_or_lib; + }) + else if is_pkgs + then func lib + else + func pkgs_or_lib; + include = file.name != "default.nix" && (!accepts_pkgs || is_pkgs); + })) + (builtins.filter (utility: utility.include)) + builtins.listToAttrs + ]; +in +utils diff --git a/utils/nixFilesIn.nix b/utils/nixFilesIn.nix new file mode 100644 index 0000000..e85fa1c --- /dev/null +++ b/utils/nixFilesIn.nix @@ -0,0 +1,2 @@ +# Modified from http://chriswarbo.net/projects/nixos/useful_hacks.html +lib: dir: map (name: dir + "/${name}") (lib.attrNames (lib.filterAttrs (name: type: type == "regular" && lib.hasSuffix ".nix" name) (builtins.readDir dir))) diff --git a/utils/nixFilesInWithName.nix b/utils/nixFilesInWithName.nix new file mode 100644 index 0000000..760b7cf --- /dev/null +++ b/utils/nixFilesInWithName.nix @@ -0,0 +1,8 @@ +# Modified from http://chriswarbo.net/projects/nixos/useful_hacks.html +lib: dir: +map + (name: { + inherit name; + path = dir + "/${name}"; + }) + (lib.attrNames (lib.filterAttrs (name: type: lib.hasSuffix ".nix" name && type == "regular") (builtins.readDir dir)))