initial commit
This commit is contained in:
commit
97f929cd1f
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
@ -0,0 +1,2 @@
|
||||
result
|
||||
*/result
|
12
README.md
Normal file
12
README.md
Normal file
@ -0,0 +1,12 @@
|
||||
# Evie's NixFiles
|
||||
A Nix flake for my system configuration - WIP.
|
||||
|
||||
## Structure
|
||||
- `./evelyne` - A folder for my home-manager configs (aka my user)
|
||||
- `./evelyne/common` - Home configuration available on all systems
|
||||
- `./systems` - A folder for my system-wide configs
|
||||
- `./systems/pogmachine` - System configuration for my desktop (PogMachine)
|
||||
- `overlays.nix` - A file for my nixpkgs overlays
|
||||
|
||||
## Many thanks
|
||||
- ❤️ Thanks to @SpyHoodle who helped me make this config
|
15
evelyne/common/audio.nix
Normal file
15
evelyne/common/audio.nix
Normal file
@ -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;
|
||||
};
|
||||
}
|
6
evelyne/common/audio/ytdlp-music.sh
Executable file
6
evelyne/common/audio/ytdlp-music.sh
Executable file
@ -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"
|
12
evelyne/common/bosskey.nix
Normal file
12
evelyne/common/bosskey.nix
Normal file
@ -0,0 +1,12 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
slock
|
||||
];
|
||||
|
||||
home.file.".local/bin/bosskey" = {
|
||||
source = ./bosskey/bosskey.sh;
|
||||
executable = true;
|
||||
};
|
||||
}
|
50
evelyne/common/bosskey/bosskey.sh
Executable file
50
evelyne/common/bosskey/bosskey.sh
Executable file
@ -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
|
9
evelyne/common/browser.nix
Normal file
9
evelyne/common/browser.nix
Normal file
@ -0,0 +1,9 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
librewolf
|
||||
amfora
|
||||
lynx
|
||||
];
|
||||
}
|
13
evelyne/common/btop.nix
Normal file
13
evelyne/common/btop.nix
Normal file
@ -0,0 +1,13 @@
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
programs.btop = {
|
||||
enable = true;
|
||||
settings = {
|
||||
color_theme = "TTY";
|
||||
theme_background = false;
|
||||
truecolor = true;
|
||||
clock_format = "| /user@/host | /uptime | %y/%m/%d | %H:%M:%S |";
|
||||
};
|
||||
};
|
||||
}
|
7
evelyne/common/calculator.nix
Normal file
7
evelyne/common/calculator.nix
Normal file
@ -0,0 +1,7 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
nodePackages.insect
|
||||
];
|
||||
}
|
29
evelyne/common/chromium.nix
Normal file
29
evelyne/common/chromium.nix
Normal file
@ -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"; }
|
||||
];
|
||||
};
|
||||
}
|
8
evelyne/common/code.nix
Normal file
8
evelyne/common/code.nix
Normal file
@ -0,0 +1,8 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
python3Full # Python
|
||||
go # Go
|
||||
];
|
||||
}
|
16
evelyne/common/dmenu.nix
Normal file
16
evelyne/common/dmenu.nix
Normal file
@ -0,0 +1,16 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
dmenu
|
||||
];
|
||||
|
||||
home.file.".local/bin/dmenu" = {
|
||||
source = ./dmenu;
|
||||
executable = true;
|
||||
};
|
||||
|
||||
home.sessionPath = [
|
||||
"$HOME/.local/bin/dmenu"
|
||||
];
|
||||
}
|
317
evelyne/common/dmenu/dmenu-bluetooth
Executable file
317
evelyne/common/dmenu/dmenu-bluetooth
Executable file
@ -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
|
41
evelyne/common/dmenu/dmenu-kdeconnect
Executable file
41
evelyne/common/dmenu/dmenu-kdeconnect
Executable file
@ -0,0 +1,41 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
NOTIFICATIONS_TITLE="KDE Connect"
|
||||
NOTIFICATIONS_EXPIRE_TIME=1000
|
||||
notify-send "$NOTIFICATIONS_TITLE" "Getting devices..." --expire-time="$NOTIFICATIONS_EXPIRE_TIME"
|
||||
|
||||
# Get available devices
|
||||
devices="$(kdeconnect-cli -a)"
|
||||
[ -z "$devices" ] && notify-send "$NOTIFICATIONS_TITLE" "No devices available" --expire-time="$NOTIFICATIONS_EXPIRE_TIME" && exit 1
|
||||
|
||||
# Let the user choose a device
|
||||
device="$(echo "$devices" | sed 's/-\ //' | sed 's/:.*//' | dmenu -i -p "Devices:")"
|
||||
|
||||
if [ $? -eq 0 ]
|
||||
then
|
||||
# Send files to a device
|
||||
📂File() {
|
||||
file="$(zenity --file-selection)"
|
||||
kdeconnect-cli -n "$device" --share "$file"
|
||||
[ "$?" -eq 0 ] && notify-send "$NOTIFICATIONS_TITLE" "📂 Shared file: $file" --expire-time="$NOTIFICATIONS_EXPIRE_TIME"
|
||||
[ "$?" -ne 0 ] && notify-send "$NOTIFICATIONS_TITLE" "📂 Failed to share file: $file" --expire-time="$NOTIFICATIONS_EXPIRE_TIME" && exit 1
|
||||
}
|
||||
|
||||
# Ping a device
|
||||
📳Ping() {
|
||||
kdeconnect-cli -n "$device" --ping
|
||||
[ "$?" -eq 0 ] && notify-send "$NOTIFICATIONS_TITLE" "📳 Pinged device: $device" --expire-time="$NOTIFICATIONS_EXPIRE_TIME"
|
||||
[ "$?" -ne 0 ] && notify-send "$NOTIFICATIONS_TITLE" "📳 Unable to ping device: $device" --expire-time="$NOTIFICATIONS_EXPIRE_TIME" && exit 1
|
||||
}
|
||||
|
||||
# Make a device ring
|
||||
☎️Ring() {
|
||||
kdeconnect-cli -n "$device" --ring
|
||||
[ "$?" -eq 0 ] && notify-send "$NOTIFICATIONS_TITLE" "☎️ Ringed device: $device" --expire-time="$NOTIFICATIONS_EXPIRE_TIME"
|
||||
[ "$?" -ne 0 ] && notify-send "$NOTIFICATIONS_TITLE" "☎️ Unable to ring device: $device" --expire-time="$NOTIFICATIONS_EXPIRE_TIME" && exit 1
|
||||
}
|
||||
|
||||
# Show functions in dmenu and run the chosen function
|
||||
func="$(declare -F | awk '{print $3}' | dmenu -i -p "$device":)"
|
||||
[ -z "$func" ] || "$func"
|
||||
fi
|
67
evelyne/common/dmenu/dmenu-mount
Executable file
67
evelyne/common/dmenu/dmenu-mount
Executable file
@ -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
|
14
evelyne/common/dmenu/dmenu-mpc
Executable file
14
evelyne/common/dmenu/dmenu-mpc
Executable file
@ -0,0 +1,14 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
playing=$(mpc current)
|
||||
[ -z "$playing" ] && playing="Stopped"
|
||||
|
||||
▶️play() { mpc play ;}
|
||||
⏸️pause() { mpc pause ;}
|
||||
⏭️next() { mpc next ;}
|
||||
⏮️prev() { mpc prev ;}
|
||||
⏹️stop() { mpc stop ;}
|
||||
🔄update() { mpc update ;}
|
||||
|
||||
func="$(declare -F | awk '{print $3}' | dmenu -i -p "$playing":)"
|
||||
[ -z "$func" ] || "$func"
|
35
evelyne/common/dmenu/dmenu-pass
Executable file
35
evelyne/common/dmenu/dmenu-pass
Executable file
@ -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
|
9
evelyne/common/dmenu/dmenu-power
Executable file
9
evelyne/common/dmenu/dmenu-power
Executable file
@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
poweroff() { systemctl shutdown ;}
|
||||
restart() { killall -HUP dwm ;}
|
||||
reboot() { system reboot ;}
|
||||
lock() { bosskey ;}
|
||||
|
||||
func="$(declare -F | awk '{print $3}' | dmenu -i -p "Power:")"
|
||||
[ -z "$func" ] || "$func"
|
18
evelyne/common/dmenu/dmenu-unicode
Executable file
18
evelyne/common/dmenu/dmenu-unicode
Executable file
@ -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
|
44
evelyne/common/dunst.nix
Normal file
44
evelyne/common/dunst.nix
Normal file
@ -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;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
7
evelyne/common/dwm.nix
Normal file
7
evelyne/common/dwm.nix
Normal file
@ -0,0 +1,7 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
dwm # Suckless dynamic window manager
|
||||
];
|
||||
}
|
9
evelyne/common/editor.nix
Normal file
9
evelyne/common/editor.nix
Normal file
@ -0,0 +1,9 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
# Misc editors
|
||||
home.packages = with pkgs; [
|
||||
helix
|
||||
vis
|
||||
];
|
||||
}
|
15
evelyne/common/exa.nix
Normal file
15
evelyne/common/exa.nix
Normal file
@ -0,0 +1,15 @@
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
programs.exa = {
|
||||
enable = true;
|
||||
enableAliases = true;
|
||||
extraOptions = [
|
||||
"--group-directories-first"
|
||||
"--time-style=long-iso"
|
||||
"--git"
|
||||
"-h"
|
||||
];
|
||||
icons = true;
|
||||
};
|
||||
}
|
9
evelyne/common/fetch.nix
Normal file
9
evelyne/common/fetch.nix
Normal file
@ -0,0 +1,9 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
pridefetch # System stats with pride flags
|
||||
neofetch # Generic system stats
|
||||
pfetch # Simple system stats
|
||||
];
|
||||
}
|
8
evelyne/common/files.nix
Normal file
8
evelyne/common/files.nix
Normal file
@ -0,0 +1,8 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
ncdu_2 # Disk space manager
|
||||
clifm # TUI file manager
|
||||
];
|
||||
}
|
8
evelyne/common/games.nix
Normal file
8
evelyne/common/games.nix
Normal file
@ -0,0 +1,8 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
gzdoom # Modern doom runner
|
||||
pcsx2 # PS2 Emulator
|
||||
];
|
||||
}
|
49
evelyne/common/git.nix
Normal file
49
evelyne/common/git.nix
Normal file
@ -0,0 +1,49 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
gh
|
||||
];
|
||||
|
||||
home.file.".local/bin/git-sync" = {
|
||||
source = ./git/git-sync.sh;
|
||||
executable = true;
|
||||
};
|
||||
|
||||
programs.git = {
|
||||
enable = true;
|
||||
lfs.enable = true;
|
||||
|
||||
userName = "Evelyne";
|
||||
userEmail = "retroevelyne@outlook.com";
|
||||
signing = {
|
||||
key = "C4F179337DB0D43A2ABE8EC900FC03E8D01EA976";
|
||||
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";
|
||||
};
|
||||
|
||||
ignores = [
|
||||
"**/.DS_Store"
|
||||
"**/._.DS_Store"
|
||||
".DS_Store"
|
||||
"._.DS_Store"
|
||||
"**/*.swp"
|
||||
"*.swp"
|
||||
];
|
||||
};
|
||||
}
|
6
evelyne/common/git/git-sync.sh
Normal file
6
evelyne/common/git/git-sync.sh
Normal file
@ -0,0 +1,6 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
git add .
|
||||
git commit -am "$(date --iso-8601)"
|
||||
git pull
|
||||
git push
|
24
evelyne/common/gtk.nix
Normal file
24
evelyne/common/gtk.nix
Normal file
@ -0,0 +1,24 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
gtk = {
|
||||
enable = true;
|
||||
font = {
|
||||
package = pkgs.iosevka;
|
||||
name = "Iosevka";
|
||||
size = 10;
|
||||
};
|
||||
theme = {
|
||||
package = pkgs.catppuccin-gtk;
|
||||
name = "Catppuccin-Frappe-Standard-Blue-Dark";
|
||||
};
|
||||
iconTheme = {
|
||||
package = pkgs.zafiro-icons;
|
||||
name = "Zafiro-icons-Dark";
|
||||
};
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
gnome.zenity
|
||||
];
|
||||
}
|
10
evelyne/common/home.nix
Normal file
10
evelyne/common/home.nix
Normal file
@ -0,0 +1,10 @@
|
||||
{ config, username, ... }:
|
||||
|
||||
{
|
||||
programs.home-manager.enable = true;
|
||||
home = {
|
||||
inherit username;
|
||||
homeDirectory = "/home/${username}";
|
||||
stateVersion = "22.11";
|
||||
};
|
||||
}
|
19
evelyne/common/htop.nix
Normal file
19
evelyne/common/htop.nix
Normal file
@ -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;
|
||||
};
|
||||
};
|
||||
}
|
10
evelyne/common/jetbrains.nix
Normal file
10
evelyne/common/jetbrains.nix
Normal file
@ -0,0 +1,10 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
jetbrains.clion
|
||||
jetbrains.goland
|
||||
jetbrains.webstorm
|
||||
jetbrains.pycharm-professional
|
||||
];
|
||||
}
|
25
evelyne/common/kakoune.nix
Normal file
25
evelyne/common/kakoune.nix
Normal file
@ -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
|
||||
];
|
||||
};
|
||||
}
|
10
evelyne/common/kdeconnect.nix
Normal file
10
evelyne/common/kdeconnect.nix
Normal file
@ -0,0 +1,10 @@
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
services.kdeconnect.enable = true;
|
||||
|
||||
home.file.".xinitrc".text = ''
|
||||
# Start kdeconnect when entering a graphical session
|
||||
systemctl restart --user kdeconnect &
|
||||
'';
|
||||
}
|
7
evelyne/common/kdenlive.nix
Normal file
7
evelyne/common/kdenlive.nix
Normal file
@ -0,0 +1,7 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
kdenlive
|
||||
];
|
||||
}
|
26
evelyne/common/lf.nix
Normal file
26
evelyne/common/lf.nix
Normal file
@ -0,0 +1,26 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
programs.lf = {
|
||||
enable = true;
|
||||
previewer.source = ./lf/scope;
|
||||
settings = {
|
||||
relativenumber = true;
|
||||
number = true;
|
||||
hidden = false;
|
||||
preview = true;
|
||||
icons = true;
|
||||
};
|
||||
};
|
||||
|
||||
xdg.configFile = {
|
||||
"lf/icons" = {
|
||||
source = ./lf/icons;
|
||||
};
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
ueberzug
|
||||
file
|
||||
];
|
||||
}
|
93
evelyne/common/lf/icons
Normal file
93
evelyne/common/lf/icons
Normal file
@ -0,0 +1,93 @@
|
||||
di
|
||||
fi
|
||||
tw
|
||||
ow
|
||||
ln
|
||||
or
|
||||
ex
|
||||
*.txt
|
||||
*.mom
|
||||
*.me
|
||||
*.ms
|
||||
*.avif
|
||||
*.png
|
||||
*.webp
|
||||
*.ico
|
||||
*.gif
|
||||
*.tif
|
||||
*.tiff
|
||||
*.jpg
|
||||
*.jpe
|
||||
*.jpeg
|
||||
*.heif
|
||||
*.svg
|
||||
*.xcf
|
||||
*.gpg
|
||||
*.pdf
|
||||
*.djvu
|
||||
*.epub
|
||||
*.csv
|
||||
*.xlsx
|
||||
*.tex
|
||||
*.md
|
||||
*.mp3
|
||||
*.opus
|
||||
*.ogg
|
||||
*.m4a
|
||||
*.flac
|
||||
*.wav
|
||||
*.mkv
|
||||
*.mp4
|
||||
*.webm
|
||||
*.mpeg
|
||||
*.avi
|
||||
*.mov
|
||||
*.mpg
|
||||
*.wmv
|
||||
*.m4b
|
||||
*.flv
|
||||
*.zip
|
||||
*.rar
|
||||
*.7z
|
||||
*.tar
|
||||
*.gz
|
||||
*.z64
|
||||
*.v64
|
||||
*.n64
|
||||
*.gdi
|
||||
*.gba
|
||||
*.nes
|
||||
*.exe
|
||||
*.1
|
||||
*.nfo
|
||||
*.info
|
||||
*.log
|
||||
*.iso
|
||||
*.img
|
||||
*.bib
|
||||
*.part
|
||||
*.torrent
|
||||
*.gitignore
|
||||
*.jar
|
||||
*.java
|
||||
*.r
|
||||
*.R
|
||||
*.rmd
|
||||
*.Rmd
|
||||
*.m
|
||||
*.rs
|
||||
*.go
|
||||
*.c
|
||||
*.cpp
|
||||
*.h
|
||||
*.py
|
||||
*.js
|
||||
*.json
|
||||
*.ts
|
||||
*.sh
|
||||
*.html
|
||||
*.css
|
||||
*.xml
|
||||
*.php
|
||||
*.nix
|
||||
*.vim
|
52
evelyne/common/lf/scope
Executable file
52
evelyne/common/lf/scope
Executable file
@ -0,0 +1,52 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
# File preview handler for lf.
|
||||
|
||||
set -C -f
|
||||
IFS="$(printf '%b_' '\n')"; IFS="${IFS%_}"
|
||||
|
||||
image() {
|
||||
if [ -f "$1" ] && [ -n "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && command -V ueberzug >/dev/null 2>&1; then
|
||||
printf '{"action": "add", "identifier": "PREVIEW", "x": "%s", "y": "%s", "width": "%s", "height": "%s", "scaler": "contain", "path": "%s"}\n' "$4" "$5" "$(($2-1))" "$(($3-1))" "$1" > "$FIFO_UEBERZUG"
|
||||
else
|
||||
mediainfo "$6"
|
||||
fi
|
||||
}
|
||||
|
||||
ifub() {
|
||||
[ -n "$DISPLAY" ] && [ -z "$WAYLAND_DISPLAY" ] && command -V ueberzug >/dev/null 2>&1
|
||||
}
|
||||
|
||||
# Note that the cache file name is a function of file information, meaning if
|
||||
# an image appears in multiple places across the machine, it will not have to
|
||||
# be regenerated once seen.
|
||||
|
||||
case "$(file --dereference --brief --mime-type -- "$1")" in
|
||||
image/avif) CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)"
|
||||
[ ! -f "$CACHE" ] && convert "$1" "$CACHE.jpg"
|
||||
image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1" ;;
|
||||
image/*) image "$1" "$2" "$3" "$4" "$5" "$1" ;;
|
||||
text/html) lynx -width="$4" -display_charset=utf-8 -dump "$1" ;;
|
||||
text/troff) man ./ "$1" | col -b ;;
|
||||
text/* | */xml | application/json) bat --terminal-width "$(($4-2))" -f "$1" ;;
|
||||
audio/* | application/octet-stream) mediainfo "$1" || exit 1 ;;
|
||||
video/* )
|
||||
CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)"
|
||||
[ ! -f "$CACHE" ] && ffmpegthumbnailer -i "$1" -o "$CACHE" -s 0
|
||||
image "$CACHE" "$2" "$3" "$4" "$5" "$1"
|
||||
;;
|
||||
*/pdf)
|
||||
CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)"
|
||||
[ ! -f "$CACHE.jpg" ] && pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE"
|
||||
image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1"
|
||||
;;
|
||||
*/epub+zip|*/mobi*)
|
||||
CACHE="${XDG_CACHE_HOME:-$HOME/.cache}/lf/thumb.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | cut -d' ' -f1)"
|
||||
[ ! -f "$CACHE.jpg" ] && gnome-epub-thumbnailer "$1" "$CACHE.jpg"
|
||||
image "$CACHE.jpg" "$2" "$3" "$4" "$5" "$1"
|
||||
;;
|
||||
application/*zip) atool --list -- "$1" ;;
|
||||
*opendocument*) odt2txt "$1" ;;
|
||||
application/pgp-encrypted) gpg -d -- "$1" ;;
|
||||
esac
|
||||
exit 1
|
12
evelyne/common/librewolf.nix
Normal file
12
evelyne/common/librewolf.nix
Normal file
@ -0,0 +1,12 @@
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
programs.librewolf = {
|
||||
enable = true;
|
||||
settings = {
|
||||
"browser.uidensity" = 1;
|
||||
"webgl.disabled" = false;
|
||||
"privacy.resistFingerprinting" = false;
|
||||
};
|
||||
};
|
||||
}
|
9
evelyne/common/media.nix
Normal file
9
evelyne/common/media.nix
Normal file
@ -0,0 +1,9 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
libheif # Manage .heif files from phones
|
||||
gcolor2 # Color viewer and eyedropper
|
||||
ffmpeg # Video manipulator
|
||||
];
|
||||
}
|
11
evelyne/common/messaging.nix
Normal file
11
evelyne/common/messaging.nix
Normal file
@ -0,0 +1,11 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
element-desktop # Matrix client
|
||||
signal-desktop # Signal client
|
||||
discord-canary # Discord client
|
||||
ripcord # Better discord client
|
||||
nheko # Better matrix client
|
||||
];
|
||||
}
|
9
evelyne/common/minecraft.nix
Normal file
9
evelyne/common/minecraft.nix
Normal file
@ -0,0 +1,9 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
prismlauncher # Minecraft launcher
|
||||
minecraft # Actual minecraft
|
||||
jdk # Needed for running minecraft servers
|
||||
];
|
||||
}
|
12
evelyne/common/mommy.nix
Normal file
12
evelyne/common/mommy.nix
Normal file
@ -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;
|
||||
};
|
||||
}
|
77
evelyne/common/mommy/shell-mommy.sh
Executable file
77
evelyne/common/mommy/shell-mommy.sh
Executable file
@ -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
|
35
evelyne/common/mpd.nix
Normal file
35
evelyne/common/mpd.nix
Normal file
@ -0,0 +1,35 @@
|
||||
{ config, pkgs, username, ... }:
|
||||
|
||||
{
|
||||
services.mpd = {
|
||||
enable = true;
|
||||
musicDirectory = "${config.home.homeDirectory}/Music";
|
||||
extraConfig = ''
|
||||
auto_update "yes"
|
||||
|
||||
audio_output {
|
||||
type "pipewire"
|
||||
name "PipeWire Sound Server"
|
||||
}
|
||||
|
||||
audio_output {
|
||||
type "fifo"
|
||||
name "Visualizer feed"
|
||||
path "/tmp/mpd.fifo"
|
||||
format "44100:16:2"
|
||||
}
|
||||
'';
|
||||
};
|
||||
|
||||
home.packages = with pkgs; [
|
||||
mpc_cli
|
||||
];
|
||||
|
||||
programs.ncmpcpp = {
|
||||
enable = true;
|
||||
settings = {
|
||||
ncmpcpp_directory = "${config.home.homeDirectory}/.local/share/ncmpcpp";
|
||||
lyrics_directory = "${config.home.homeDirectory}/.local/share/lyrics";
|
||||
};
|
||||
};
|
||||
}
|
10
evelyne/common/mpv.nix
Normal file
10
evelyne/common/mpv.nix
Normal file
@ -0,0 +1,10 @@
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
programs.mpv = {
|
||||
enable = true;
|
||||
config = {
|
||||
loop-file = "inf";
|
||||
};
|
||||
};
|
||||
}
|
27
evelyne/common/neovim.nix
Normal file
27
evelyne/common/neovim.nix
Normal file
@ -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;
|
||||
};
|
||||
}
|
1
evelyne/common/neovim/.gitignore
vendored
Normal file
1
evelyne/common/neovim/.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
plugin
|
21
evelyne/common/neovim/LICENSE
Normal file
21
evelyne/common/neovim/LICENSE
Normal file
@ -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.
|
22
evelyne/common/neovim/README.md
Normal file
22
evelyne/common/neovim/README.md
Normal file
@ -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 🏳️⚧️.
|
253
evelyne/common/neovim/init.lua
Normal file
253
evelyne/common/neovim/init.lua
Normal file
@ -0,0 +1,253 @@
|
||||
-- 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()
|
||||
vim.g.transparent_enabled = 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)
|
36
evelyne/common/neovim/lua/basics.lua
Normal file
36
evelyne/common/neovim/lua/basics.lua
Normal file
@ -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 = 'JetBrainsMono Nerd Font:h12'
|
||||
vim.g.neovide_cursor_vfx_mode = 'railgun'
|
||||
vim.g.neovide_remember_window_size = true
|
1
evelyne/common/neovim/lua/colours.lua
Normal file
1
evelyne/common/neovim/lua/colours.lua
Normal file
@ -0,0 +1 @@
|
||||
vim.cmd([[colorscheme onedark]])
|
59
evelyne/common/neovim/lua/keymaps.lua
Normal file
59
evelyne/common/neovim/lua/keymaps.lua
Normal file
@ -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)
|
117
evelyne/common/neovim/lua/plugins/cmp.lua
Normal file
117
evelyne/common/neovim/lua/plugins/cmp.lua
Normal file
@ -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()
|
||||
}
|
6
evelyne/common/neovim/spell/en.utf-8.add
Normal file
6
evelyne/common/neovim/spell/en.utf-8.add
Normal file
@ -0,0 +1,6 @@
|
||||
macOS
|
||||
JS
|
||||
add evelyne
|
||||
evelyne
|
||||
camhs
|
||||
Vernova
|
BIN
evelyne/common/neovim/spell/en.utf-8.add.spl
Normal file
BIN
evelyne/common/neovim/spell/en.utf-8.add.spl
Normal file
Binary file not shown.
16
evelyne/common/nsxiv.nix
Normal file
16
evelyne/common/nsxiv.nix
Normal file
@ -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";
|
||||
};
|
||||
}
|
14
evelyne/common/nsxiv/exec/key-handler
Executable file
14
evelyne/common/nsxiv/exec/key-handler
Executable file
@ -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
|
5
evelyne/common/obs-studio.nix
Normal file
5
evelyne/common/obs-studio.nix
Normal file
@ -0,0 +1,5 @@
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
programs.obs-studio.enable = true;
|
||||
}
|
12
evelyne/common/office.nix
Normal file
12
evelyne/common/office.nix
Normal file
@ -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
|
||||
];
|
||||
}
|
14
evelyne/common/passwords.nix
Normal file
14
evelyne/common/passwords.nix
Normal file
@ -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";
|
||||
};
|
||||
}
|
11
evelyne/common/pcmanfm.nix
Normal file
11
evelyne/common/pcmanfm.nix
Normal file
@ -0,0 +1,11 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
pcmanfm
|
||||
];
|
||||
|
||||
xdg.configFile."pcmanfm" = {
|
||||
source = ./pcmanfm;
|
||||
};
|
||||
}
|
26
evelyne/common/pcmanfm/default/pcmanfm.conf
Normal file
26
evelyne/common/pcmanfm/default/pcmanfm.conf
Normal file
@ -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
|
25
evelyne/common/picom.nix
Normal file
25
evelyne/common/picom.nix
Normal file
@ -0,0 +1,25 @@
|
||||
{ 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'"
|
||||
"90:class_g = 'tabbed-trans'"
|
||||
];
|
||||
shadow = true;
|
||||
vSync = true;
|
||||
};
|
||||
}
|
8
evelyne/common/processes.nix
Normal file
8
evelyne/common/processes.nix
Normal file
@ -0,0 +1,8 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
xorg.xkill # Kill X11 programs with mouse
|
||||
killall # Kill programs
|
||||
];
|
||||
}
|
11
evelyne/common/qt.nix
Normal file
11
evelyne/common/qt.nix
Normal file
@ -0,0 +1,11 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
qt = {
|
||||
enable = true;
|
||||
style = {
|
||||
package = pkgs.adwaita-qt;
|
||||
name = "adwaita-dark";
|
||||
};
|
||||
};
|
||||
}
|
15
evelyne/common/rust.nix
Normal file
15
evelyne/common/rust.nix
Normal file
@ -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 = [ "${config.home.sessionVariables.CARGO_HOME}/bin" ];
|
||||
};
|
||||
}
|
13
evelyne/common/screenshot.nix
Normal file
13
evelyne/common/screenshot.nix
Normal file
@ -0,0 +1,13 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
tesseract5 # Gets text from images
|
||||
maim # X11 screenshot tool
|
||||
];
|
||||
|
||||
home.file.".local/bin/sss" = {
|
||||
source = ./screenshot/sss.sh;
|
||||
executable = true;
|
||||
};
|
||||
}
|
40
evelyne/common/screenshot/sss.sh
Normal file
40
evelyne/common/screenshot/sss.sh
Normal file
@ -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
|
8
evelyne/common/secrets.nix
Normal file
8
evelyne/common/secrets.nix
Normal file
@ -0,0 +1,8 @@
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
services.pass-secret-service = {
|
||||
enable = true;
|
||||
storePath = "${config.xdg.dataHome}/password-store";
|
||||
};
|
||||
}
|
61
evelyne/common/shell.nix
Normal file
61
evelyne/common/shell.nix
Normal file
@ -0,0 +1,61 @@
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
home = {
|
||||
# Aliases
|
||||
shellAliases = {
|
||||
# Core Programs
|
||||
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";
|
||||
cdt = "cd $(mktemp -d)";
|
||||
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"
|
||||
];
|
||||
};
|
||||
}
|
21
evelyne/common/slstatus.nix
Normal file
21
evelyne/common/slstatus.nix
Normal file
@ -0,0 +1,21 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
slstatus
|
||||
];
|
||||
|
||||
home.file.".xinitrc".text = ''
|
||||
# Start slstatus
|
||||
${pkgs.slstatus}/bin/slstatus &
|
||||
'';
|
||||
|
||||
home.file.".local/bin/statusbar" = {
|
||||
source = ./statusbar;
|
||||
executable = true;
|
||||
};
|
||||
|
||||
home.sessionPath = [
|
||||
"$HOME/.local/bin/statusbar"
|
||||
];
|
||||
}
|
15
evelyne/common/ssh.nix
Normal file
15
evelyne/common/ssh.nix
Normal file
@ -0,0 +1,15 @@
|
||||
{ config, pkgs, username, ... }:
|
||||
|
||||
{
|
||||
# SSH
|
||||
programs.ssh = {
|
||||
enable = true;
|
||||
matchBlocks = {
|
||||
lambda = {
|
||||
identityFile = "~/.ssh/id_ed25519";
|
||||
hostname = "home.spyhoodle.me";
|
||||
user = "evelyne";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
1
evelyne/common/ssh/id_ed25519.pub
Normal file
1
evelyne/common/ssh/id_ed25519.pub
Normal file
@ -0,0 +1 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFMeYbc+IeL0nvIO98Ajlo8W73uDHv8t+SlIjbFqF1+Z retro@PogMachine
|
3
evelyne/common/statusbar/sb-clock
Executable file
3
evelyne/common/statusbar/sb-clock
Executable file
@ -0,0 +1,3 @@
|
||||
#!/bin/sh
|
||||
|
||||
echo " $(date "+%a %d %b") $(date "+%I:%M:%S%p")"
|
6
evelyne/common/statusbar/sb-cpu
Executable file
6
evelyne/common/statusbar/sb-cpu
Executable file
@ -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%"
|
7
evelyne/common/statusbar/sb-disk
Executable file
7
evelyne/common/statusbar/sb-disk
Executable file
@ -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"
|
35
evelyne/common/statusbar/sb-forecast
Executable file
35
evelyne/common/statusbar/sb-forecast
Executable file
@ -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
|
10
evelyne/common/statusbar/sb-iplocate
Executable file
10
evelyne/common/statusbar/sb-iplocate
Executable file
@ -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/;.*//"
|
5
evelyne/common/statusbar/sb-kernel
Executable file
5
evelyne/common/statusbar/sb-kernel
Executable file
@ -0,0 +1,5 @@
|
||||
#!/bin/sh
|
||||
|
||||
kernel=$(uname -r)
|
||||
icon=""
|
||||
echo "$icon $kernel"
|
7
evelyne/common/statusbar/sb-memory
Executable file
7
evelyne/common/statusbar/sb-memory
Executable file
@ -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"
|
13
evelyne/common/statusbar/sb-temp
Executable file
13
evelyne/common/statusbar/sb-temp
Executable file
@ -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"
|
6
evelyne/common/statusbar/sb-uptime
Executable file
6
evelyne/common/statusbar/sb-uptime
Executable file
@ -0,0 +1,6 @@
|
||||
#!/bin/sh
|
||||
|
||||
uptime=$(uptime | awk '{print $3}' | sed 's/,//')
|
||||
icon=""
|
||||
|
||||
echo "$icon $uptime"
|
15
evelyne/common/statusbar/sb-volume
Executable file
15
evelyne/common/statusbar/sb-volume
Executable file
@ -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%"
|
13
evelyne/common/steam.nix
Normal file
13
evelyne/common/steam.nix
Normal file
@ -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;
|
||||
};
|
||||
}
|
9
evelyne/common/steam/steam-killer.sh
Executable file
9
evelyne/common/steam/steam-killer.sh
Executable file
@ -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
|
16
evelyne/common/tabbed.nix
Normal file
16
evelyne/common/tabbed.nix
Normal file
@ -0,0 +1,16 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
tabbed
|
||||
];
|
||||
|
||||
home.file.".local/bin/tabbed" = {
|
||||
source = ./tabbed;
|
||||
executable = true;
|
||||
};
|
||||
|
||||
home.sessionPath = [
|
||||
"$HOME/.local/bin/tabbed"
|
||||
];
|
||||
}
|
3
evelyne/common/tabbed/tabbed-st
Executable file
3
evelyne/common/tabbed/tabbed-st
Executable file
@ -0,0 +1,3 @@
|
||||
#!/usr/bin/env sh
|
||||
|
||||
picom-trans -w $(tabbed $@ -d -n "tabbed-trans" -r 2 st -w '') -o 90
|
9
evelyne/common/terminal.nix
Normal file
9
evelyne/common/terminal.nix
Normal file
@ -0,0 +1,9 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
cool-retro-term # Retro-style terminal
|
||||
kitty # Used for testing
|
||||
st # Suckless terminal
|
||||
];
|
||||
}
|
10
evelyne/common/tmux.nix
Normal file
10
evelyne/common/tmux.nix
Normal file
@ -0,0 +1,10 @@
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
programs.tmux = {
|
||||
enable = true;
|
||||
clock24 = true;
|
||||
mouse = true;
|
||||
terminal = "screen-256color";
|
||||
};
|
||||
}
|
7
evelyne/common/tor.nix
Normal file
7
evelyne/common/tor.nix
Normal file
@ -0,0 +1,7 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
home.packages = with pkgs; [
|
||||
tor-browser-bundle-bin
|
||||
];
|
||||
}
|
14
evelyne/common/wezterm.nix
Normal file
14
evelyne/common/wezterm.nix
Normal file
@ -0,0 +1,14 @@
|
||||
{ config, pkgs, ... }:
|
||||
|
||||
{
|
||||
programs.wezterm = {
|
||||
enable = true;
|
||||
extraConfig = ''
|
||||
return {
|
||||
color_scheme = 'OneDark (base16)',
|
||||
hide_tab_bar_if_only_one_tab = true,
|
||||
window_close_confirmation = 'NeverPrompt'
|
||||
}
|
||||
'';
|
||||
};
|
||||
}
|
73
evelyne/common/xdg.nix
Normal file
73
evelyne/common/xdg.nix
Normal file
@ -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";
|
||||
};
|
||||
};
|
||||
}
|
66
evelyne/common/xorg.nix
Normal file
66
evelyne/common/xorg.nix
Normal file
@ -0,0 +1,66 @@
|
||||
{ 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";
|
||||
};
|
||||
|
||||
# Install notify-send
|
||||
home.packages = with pkgs; [
|
||||
libnotify
|
||||
];
|
||||
|
||||
# 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
|
||||
|
||||
# Apply wallpaper
|
||||
${pkgs.feh}/bin/feh --no-fehbg --bg-fill "$HOME/Pictures/Wallpapers/hearts.png"
|
||||
|
||||
# Refresh xresources
|
||||
${pkgs.xorg.xrdb}/bin/xrdb "$HOME/.Xresources"
|
||||
|
||||
# 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
|
||||
|
||||
# Start the window manager
|
||||
${pkgs.openssh}/bin/ssh-agent ${pkgs.dwm}/bin/dwm
|
||||
'';
|
||||
|
||||
xresources.properties = {
|
||||
"*.font" = "Iosevka:pixelsize=14:antialias=true:autohint=true";
|
||||
};
|
||||
}
|
5
evelyne/common/zathura.nix
Normal file
5
evelyne/common/zathura.nix
Normal file
@ -0,0 +1,5 @@
|
||||
{ config, ... }:
|
||||
|
||||
{
|
||||
programs.zathura.enable = true;
|
||||
}
|
123
evelyne/common/zsh.nix
Normal file
123
evelyne/common/zsh.nix
Normal file
@ -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;
|
||||
};
|
||||
};
|
||||
}
|
62
flake.lock
Normal file
62
flake.lock
Normal file
@ -0,0 +1,62 @@
|
||||
{
|
||||
"nodes": {
|
||||
"home-manager": {
|
||||
"inputs": {
|
||||
"nixpkgs": [
|
||||
"nixpkgs"
|
||||
],
|
||||
"utils": "utils"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1679480702,
|
||||
"narHash": "sha256-npuRD61YmxUPitI1TqKwlxLrU6iGl5E+BPT196LgUDo=",
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"rev": "363c46b2480f1b73ec37cf68caac61f5daa82a2e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-community",
|
||||
"repo": "home-manager",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1679614379,
|
||||
"narHash": "sha256-2KddLHHmcIlJu0PuS/vISLKxihTyICUwKWGn0R//028=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "994e2ef9e9c70b4dd7257f73452a94e871723685",
|
||||
"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
|
||||
}
|
40
flake.nix
Normal file
40
flake.nix
Normal file
@ -0,0 +1,40 @@
|
||||
{
|
||||
description = "Evelyne's NixOS configurations";
|
||||
|
||||
inputs = {
|
||||
# Home manager
|
||||
home-manager.url = "github:nix-community/home-manager";
|
||||
home-manager.inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, home-manager }:
|
||||
let
|
||||
username = "retro";
|
||||
utils = import ./utils nixpkgs;
|
||||
|
||||
nixpkgs_x86_64 = import nixpkgs {
|
||||
config.allowUnfree = true;
|
||||
config.allowUnsupportedSystem = false;
|
||||
config.allowBroken = false;
|
||||
overlays = import ./overlays.nix;
|
||||
system = "x86_64-linux";
|
||||
};
|
||||
in
|
||||
{
|
||||
nixosConfigurations."PogMachine" = nixpkgs.lib.nixosSystem {
|
||||
specialArgs = { inherit username; };
|
||||
pkgs = nixpkgs_x86_64;
|
||||
system = "x86_64-linux";
|
||||
modules = [
|
||||
home-manager.nixosModules.home-manager
|
||||
{
|
||||
home-manager.users.${username}.imports = utils.nixFilesIn ./evelyne/common;
|
||||
home-manager.extraSpecialArgs = { inherit username; pkgs = nixpkgs_x86_64; };
|
||||
}
|
||||
] ++ utils.nixFilesIn ./systems/pogmachine;
|
||||
};
|
||||
|
||||
formatter.x86_64-linux = nixpkgs_x86_64.legacyPackages.x86_64-linux.nixpkgs-fmt;
|
||||
};
|
||||
}
|
||||
|
62
overlays.nix
Normal file
62
overlays.nix
Normal file
@ -0,0 +1,62 @@
|
||||
[
|
||||
# My build of suckless dwm
|
||||
(final: prev: {
|
||||
dwm = prev.dwm.overrideAttrs (oldAttrs: {
|
||||
src = final.fetchFromGitHub {
|
||||
owner = "RetroEvelyne";
|
||||
repo = "dwm";
|
||||
rev = "0409fc4967bbe2b15dd8dc83e8e5c2d1bff41c1d";
|
||||
sha256 = "sha256-EqzueCxJ+yCzKp5INV5Op/znoZYWmqMbcpcVuo8ddnQ=";
|
||||
};
|
||||
});
|
||||
st = prev.st.overrideAttrs (oldAttrs: {
|
||||
src = final.fetchFromGitHub {
|
||||
owner = "RetroEvelyne";
|
||||
repo = "st";
|
||||
rev = "45efc73331df1c5877e3c6e75a879780bb84504e";
|
||||
sha256 = "sha256-D0YmbURDyTW5qzNZjIIwlWOHr5j8kenggSQ8GxhuLKo=";
|
||||
};
|
||||
buildInputs = oldAttrs.buildInputs ++ [ final.harfbuzz ];
|
||||
});
|
||||
dmenu = prev.dmenu.overrideAttrs (oldAttrs: {
|
||||
src = final.fetchFromGitHub {
|
||||
owner = "RetroEvelyne";
|
||||
repo = "dickmenu";
|
||||
rev = "34073a1a7de2b6f23909154d4425355a04a63f16";
|
||||
sha256 = "sha256-JqM6fecuV6ObsPPQQub3WY2dZp2rWcX9u3EqYmhG8WI=";
|
||||
};
|
||||
});
|
||||
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 = "8c5d321b641961237f747d3e68f52b163d673634";
|
||||
sha256 = "sha256-y+6VU3jXbUOyhUcyPC7CDGjyWLSJcCkhYiHscVib7j4=";
|
||||
};
|
||||
buildInputs = oldAttrs.buildInputs ++ [ final.xorg.libXpm ];
|
||||
});
|
||||
tabbed = prev.tabbed.overrideAttrs (oldAttrs: {
|
||||
src = final.fetchFromGitHub {
|
||||
owner = "SpyHoodle";
|
||||
repo = "tabbed";
|
||||
rev = "1001f193fd076cba12bd1ec9f113c144b37d8689";
|
||||
sha256 = "sha256-M5LrFplGfzCdhLTutsPNmox69brvAm2BlXnyza9kGxQ=";
|
||||
};
|
||||
});
|
||||
ncmpcpp = prev.ncmpcpp.override {
|
||||
visualizerSupport = true;
|
||||
clockSupport = false;
|
||||
};
|
||||
nerdfonts = prev.nerdfonts.override {
|
||||
fonts = [ "Iosevka" "JetBrainsMono" "Terminus" ];
|
||||
};
|
||||
})
|
||||
]
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user