Compare commits
No commits in common. "main" and "myputer" have entirely different histories.
166 changed files with 3555 additions and 8591 deletions
7
.gitignore
vendored
Normal file → Executable file
7
.gitignore
vendored
Normal file → Executable file
|
|
@ -1,7 +1,4 @@
|
||||||
hidden/
|
ISSUES/
|
||||||
|
secrets/
|
||||||
|
|
||||||
result
|
result
|
||||||
rebuild*.log
|
|
||||||
|
|
||||||
secrets/
|
|
||||||
!/secrets
|
|
||||||
|
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
keys:
|
|
||||||
- &cry age1e5e32alqa20cf40wt9jq8aaa2x3gh32207xj6ea5veszlpxnzgjqd2htm7
|
|
||||||
- &idk age1tc9j8mxetvhzeq2razwvgwyy8xdlpu4d9jrp76ga929w9vxjwetq7zwtnq
|
|
||||||
creation_rules:
|
|
||||||
- path_regex: secrets/[^/]+\.(yaml|json|env|ini)$
|
|
||||||
key_groups:
|
|
||||||
- pgp:
|
|
||||||
- *cry
|
|
||||||
- *idk
|
|
||||||
25
DEVDOC.md
Normal file
25
DEVDOC.md
Normal file
|
|
@ -0,0 +1,25 @@
|
||||||
|
## Users
|
||||||
|
|
||||||
|
#### me
|
||||||
|
My main personal account, used on my PC and laptop.
|
||||||
|
Contains a hyprland graphical environment by default.
|
||||||
|
|
||||||
|
#### ae
|
||||||
|
Primary account on my servers. Contains the bare
|
||||||
|
essentials for my work, no graphical environment.
|
||||||
|
|
||||||
|
|
||||||
|
#### friends
|
||||||
|
A simple account I let me friends connect to.
|
||||||
|
Limited functionality, mostly just for letting
|
||||||
|
them test small things or for giving them files.
|
||||||
|
|
||||||
|
|
||||||
|
## Setup Guide
|
||||||
|
##### Adding a New Server
|
||||||
|
Enable an ssh server on the remote host, then on the
|
||||||
|
local machine set `.ssh/config` to have a profile for
|
||||||
|
your desired host and have a key pair that's authorised
|
||||||
|
to your desired user.
|
||||||
|
|
||||||
|
NOTE: these keys must have permission 600 (only readable/writable by you)
|
||||||
3
DEV_ENV
Normal file
3
DEV_ENV
Normal file
|
|
@ -0,0 +1,3 @@
|
||||||
|
- [ ] Stop colmena adding inputs for unmanaged nodes
|
||||||
|
- [ ] Use latest commit for colmena
|
||||||
|
- [ ] Program colmena to have an option that adds `--no-check-sigs` to `nix copy`
|
||||||
8
INSPIRATION
Executable file
8
INSPIRATION
Executable file
|
|
@ -0,0 +1,8 @@
|
||||||
|
Godlike
|
||||||
|
https://github.com/end-4/dots-hyprland
|
||||||
|
|
||||||
|
Gorgeous
|
||||||
|
https://github.com/prasanthrangan/hyprdots
|
||||||
|
|
||||||
|
Very nice
|
||||||
|
https://github.com/linuxmobile/hyprland-dots
|
||||||
77
README.md
Normal file → Executable file
77
README.md
Normal file → Executable file
|
|
@ -1,15 +1,51 @@
|
||||||
## My NixOS Flake
|
|
||||||
>[!TIP]
|
|
||||||
> My flake is written using [my Cerulean project](https://github.com/cry128/cerulean). Hopefully
|
|
||||||
> it can serve as a decent example of my vision with the Cerulean + Snowflake projects.
|
|
||||||
|
|
||||||
### Philosophy
|
### Philosophy
|
||||||
>[!TODO]
|
I try to use Home Manager as little as possible. When I first started with NixOS I found
|
||||||
> My philosophy has kinda changed since the beginning
|
it distracting and confusing. NixOS already handles system wide and user packages, so having
|
||||||
|
another user level package management method was baffling. Obviously I understand now how
|
||||||
|
it can be useful (so I do use it). But where possible I will instead use the functionality
|
||||||
|
of Nix rather than Home Manager.
|
||||||
|
|
||||||
### Links
|
###### Structuring Modules
|
||||||
#### Inspiration
|
Modules are organised into groups (ie "Core"), from here a module is structured as either:
|
||||||
##### Explaining my Vision with r/unixporn posts
|
1. a single `.nix` file (ie bluetooth.nix). I do this when I won't implement an alternative
|
||||||
|
2. a directory (ie `sound`) containing a set of alternative implementations and a `default.nix`
|
||||||
|
that simply imports one of the implementations. For the `sound` example I currently have it structured
|
||||||
|
to default to `pipewire.nix`. I haven't made alternatives yet but the idea is that it is HIGHLY likely
|
||||||
|
I do in future.
|
||||||
|
|
||||||
|
|
||||||
|
### TODO
|
||||||
|
There are a lot of `TODO` items in this repository. To improve these dotfiles
|
||||||
|
I should run a command to find files containing "TODO" and then implement the
|
||||||
|
recommendation I left behind :)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
##### Small Explanation of Fonts
|
||||||
|
There are four types of fonts (to my knowledge at least):
|
||||||
|
1. serif (funny squigles / small elegant strokes included)
|
||||||
|
2. sans-serif (meaning "without serifs")
|
||||||
|
3. monospace (all glyphs are of a uniform size)
|
||||||
|
4. emoji (cute lil faces)
|
||||||
|
|
||||||
|
Fun fact: on Android, the emojis you are seeing are part of the noto-emoji font :)
|
||||||
|
|
||||||
|
For finding a font for programming I highly recommend trying https://www.codingfont.com/
|
||||||
|
|
||||||
|
|
||||||
|
### My config
|
||||||
|
|
||||||
|
Font:
|
||||||
|
Iosevka nerd font set as default/prefered font
|
||||||
|
Terminal uses IosevkaTerm nerd font
|
||||||
|
|
||||||
|
Home-Manager:
|
||||||
|
I just to use home-manager standalone and not as a NixOS module, thus allowing
|
||||||
|
my dotfiles to also work on non-NixOS systems.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
### Explaining my Vision with r/unixporn posts
|
||||||
I want the side panel from https://www.reddit.com/r/unixporn/comments/12wpvyf/hyprland_eww_is_all_i_need/
|
I want the side panel from https://www.reddit.com/r/unixporn/comments/12wpvyf/hyprland_eww_is_all_i_need/
|
||||||
but not the colour scheme and I'm 50/50 on the bar being on th eleft side lol. Also I love the volume bar on the right!
|
but not the colour scheme and I'm 50/50 on the bar being on th eleft side lol. Also I love the volume bar on the right!
|
||||||
|
|
||||||
|
|
@ -28,29 +64,22 @@ Their window decorations and bar are great, also being able to hide everything u
|
||||||
https://www.reddit.com/r/unixporn/comments/vkcasz/i3gaps_i_prefer_light_mode/
|
https://www.reddit.com/r/unixporn/comments/vkcasz/i3gaps_i_prefer_light_mode/
|
||||||
If their colour scheme was a little less white I'd love it but overall one of my favourites every
|
If their colour scheme was a little less white I'd love it but overall one of my favourites every
|
||||||
|
|
||||||
##### Other Inspiring Shtuff
|
|
||||||
1. https://github.com/sabrehagen/desktop-environment
|
|
||||||
|
|
||||||
#### Wallpaper Sources
|
### Wallpaper Sources
|
||||||
1. https://www.wallpaperflare.com/
|
1. https://www.wallpaperflare.com/
|
||||||
2. https://alphacoders.com
|
2. https://alphacoders.com
|
||||||
especially this one person: https://alphacoders.com/users/profile/69089/robokoboto
|
especially this one person: https://alphacoders.com/users/profile/69089/robokoboto
|
||||||
and also the lofi category: https://alphacoders.com/lofi
|
and also the lofi category: https://alphacoders.com/lofi
|
||||||
|
|
||||||
#### Teach Yourself Nix
|
|
||||||
1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles)
|
|
||||||
Really good security oriented NixOS stuff
|
|
||||||
2. https://jade.fyi/blog/flakes-arent-real/
|
|
||||||
Interesting blog post on using flakes
|
|
||||||
|
|
||||||
#### Credits
|
### Credits
|
||||||
1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles
|
1. https://github.com/XNM1/linux-nixos-hyprland-config-dotfiles
|
||||||
The simplicity of their layout is amazing, was really good to pick out small modules and learn how something works / is configured.
|
The simplicity of their layout is amazing, was really good to pick out small modules and learn how something works / is configured.
|
||||||
2. https://github.com/Misterio77/nix-starter-configs
|
2. https://github.com/Misterio77/nix-starter-configs
|
||||||
Really great starter config for learning how parts interact and how to generally structure flakes
|
Really great starter config for learning how parts interact and how to generally structure flakes
|
||||||
3. https://nixos.wiki/wiki/Fonts
|
3. https://nixos.wiki/wiki/Fonts
|
||||||
Wiki page explaining how to install fonts and nerd fonts on NixOS
|
Wiki page explaining how to install fonts and nerd fonts on NixOS
|
||||||
4. https://github.com/adi1090x/rofi
|
4. https://github.com/adi1090x/rofi
|
||||||
For the Rofi theme
|
For the Rofi theme
|
||||||
5. https://github.com/zDyanTB/HyprNova
|
5. https://github.com/zDyanTB/HyprNova
|
||||||
For the really cool hyprlock theme
|
For the really cool hyprlock theme
|
||||||
|
|
|
||||||
91
TODO
Executable file
91
TODO
Executable file
|
|
@ -0,0 +1,91 @@
|
||||||
|
Get Utilities:
|
||||||
|
1. httpie
|
||||||
|
2. curlie
|
||||||
|
3. zoxide
|
||||||
|
4. doggo
|
||||||
|
|
||||||
|
1. Get helix editor
|
||||||
|
2. Custom helix
|
||||||
|
3. Complete helix tutorial
|
||||||
|
|
||||||
|
Get nixcord working
|
||||||
|
Get thunar working
|
||||||
|
Set a GTK theme & icon theme
|
||||||
|
Get better wallpapers
|
||||||
|
Get hyprcursor working with Bibata-Modern-Ice
|
||||||
|
|
||||||
|
Get a GRUB theme working
|
||||||
|
Get SDDM and a theme working
|
||||||
|
|
||||||
|
Make a custom hyprlock screen
|
||||||
|
|
||||||
|
Get AGS working
|
||||||
|
Make an applauncher in AGS
|
||||||
|
Remove hyprland splash screen on init
|
||||||
|
Made lolcathost home modular
|
||||||
|
|
||||||
|
Overtime just install more programs that I need regularly: ie
|
||||||
|
- btop/htop/etc
|
||||||
|
|
||||||
|
Get GTK Bibata Cursors to be the same size as my system cursor (NOT SURE WHAT I DID...)
|
||||||
|
|
||||||
|
|
||||||
|
Get waybar (or another bar) working
|
||||||
|
|
||||||
|
Get a QT theme
|
||||||
|
|
||||||
|
Fix pipewire audio sometimes working and sometimes not :(
|
||||||
|
|
||||||
|
Bind new terminal to SUPER+Enter instead of SUPER+Q
|
||||||
|
|
||||||
|
Join Rio Terminal's discord and ask if they support nerdfonts or if I'm doing something wrong
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Change Dell loading screen (Boot Graphics Resource Table, aka BGRT)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Fix: your 131072x1 screen size is bogus. expect trouble
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Search for all "TODO" items in my nix dotfiles
|
||||||
|
|
||||||
|
Push nixdots to github
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Check out the Ekala Project (I joined their discord server)
|
||||||
|
|
||||||
|
|
||||||
|
Create a program that enables/disables passwordless sudo access
|
||||||
|
(add to github too)
|
||||||
|
|
||||||
|
Learn to package my own home-manager modules
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Ideal Features:
|
||||||
|
1. AI assistant
|
||||||
|
2. searching can also be used to calculate stuff (like I do on my iPad)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Fork nixcord and fix documentation (the installation is confusing)
|
||||||
|
But firstly the first code snippet is wrong...
|
||||||
|
```nix
|
||||||
|
inputs.nixcord = {
|
||||||
|
url = "github:kaylorben/nixcord"
|
||||||
|
};
|
||||||
|
```
|
||||||
|
Should actually be
|
||||||
|
```nix
|
||||||
|
inputs.nixcord = {
|
||||||
|
url = "github:kaylorben/nixcord"; # dont forget the semicolon
|
||||||
|
};
|
||||||
|
```
|
||||||
26
TODO.md
26
TODO.md
|
|
@ -1,26 +0,0 @@
|
||||||
- [ ] get kanshi working with hyprland
|
|
||||||
|
|
||||||
- [ ] Update the README.md
|
|
||||||
- [ ] switch ssh keys to ECC (fuck RSA)
|
|
||||||
|
|
||||||
- [ ] setup my own VPN
|
|
||||||
- [ ] connect matcha to my VPN
|
|
||||||
- [ ] use matcha to build stuff instead of using my laptop
|
|
||||||
|
|
||||||
- [ ] switch to zsh? or maybe elvish?
|
|
||||||
- [ ] switch to neovim
|
|
||||||
- [ ] switch to mangowc
|
|
||||||
|
|
||||||
- [ ] fix my fuck ass emojis
|
|
||||||
|
|
||||||
# add sddm profile pic
|
|
||||||
systemd.tmpfiles.rules = let
|
|
||||||
imagePath = /${root}/homes/aurora/profile.png;
|
|
||||||
in
|
|
||||||
lib.mkIf (builtins.pathExists imagePath) [
|
|
||||||
"L /var/lib/AccountsService/icons/${config.home.username} - - - - ${imagePath}"
|
|
||||||
];
|
|
||||||
|
|
||||||
|
|
||||||
# Cerulean should automatically add set home-managers `home.username` and `home.homeDirectory`
|
|
||||||
# (this can be done by using .extendModule from the nixos module system :3)
|
|
||||||
3
TODO_UI
Executable file
3
TODO_UI
Executable file
|
|
@ -0,0 +1,3 @@
|
||||||
|
1. Create more themes for my applauncher
|
||||||
|
2. Create more themes for hyprlock
|
||||||
|
check out: https://github.com/MrVivekRajan/Hyprlock-Styles
|
||||||
58
deploy
Executable file
58
deploy
Executable file
|
|
@ -0,0 +1,58 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
usage="Usage: $(basename $0) [OPTIONS]
|
||||||
|
|
||||||
|
Options:
|
||||||
|
-f, --fresh Remove old content in the nixstore (good for debugging)
|
||||||
|
-b, --bootloader Reinstall the bootloader
|
||||||
|
-h, --help Show this message (^_^)"
|
||||||
|
|
||||||
|
# delete all cached entries
|
||||||
|
# to make the system from scratch
|
||||||
|
collect_garbage () {
|
||||||
|
sudo nix-collect-garbage --delete-old
|
||||||
|
}
|
||||||
|
|
||||||
|
rebuild_flake () {
|
||||||
|
# make sure all changes are visible to nixos
|
||||||
|
git add . --verbose
|
||||||
|
if [ "$1" = "reinstall-bootloader" ]; then
|
||||||
|
sudo nixos-rebuild switch --flake . --install-bootloader
|
||||||
|
else
|
||||||
|
sudo nixos-rebuild switch --flake .
|
||||||
|
#nixos-rebuild build --flake .# --cores 8 -j 1
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
# check which flags were given
|
||||||
|
flag_fresh=false
|
||||||
|
flag_bootloader=false
|
||||||
|
for flag in "$@"; do
|
||||||
|
case "$flag" in
|
||||||
|
-f|--fresh)
|
||||||
|
flag_fresh=true ;;
|
||||||
|
-b|--bootloader)
|
||||||
|
flag_bootloader=true ;;
|
||||||
|
-h|--help)
|
||||||
|
echo "$usage"
|
||||||
|
exit 0 ;;
|
||||||
|
*)
|
||||||
|
echo "[!] Unknown flag \"$flag\""
|
||||||
|
exit 1 ;;
|
||||||
|
esac
|
||||||
|
done
|
||||||
|
|
||||||
|
# delete cached items in nixstore
|
||||||
|
if [ "$flag_fresh" = true ]; then
|
||||||
|
collect_garbage
|
||||||
|
exit 0
|
||||||
|
fi
|
||||||
|
|
||||||
|
# nixos-rebuild switch ...
|
||||||
|
if [ "$flag_bootloader" = true ]; then
|
||||||
|
collect_garbage
|
||||||
|
rebuild_flake "reinstall-bootloader"
|
||||||
|
else
|
||||||
|
rebuild_flake
|
||||||
|
fi
|
||||||
13
deploy-remote
Executable file
13
deploy-remote
Executable file
|
|
@ -0,0 +1,13 @@
|
||||||
|
#!/usr/bin/env bash
|
||||||
|
|
||||||
|
set -e # terminate if any command fails
|
||||||
|
|
||||||
|
echo "[+] Adding keys to ssh-agent"
|
||||||
|
ssh-add ~/.ssh/id_hyrule
|
||||||
|
printf "\n"
|
||||||
|
|
||||||
|
git add .
|
||||||
|
# Deploy to all Colmena hives
|
||||||
|
colmena build --experimental-flake-eval
|
||||||
|
colmena apply --experimental-flake-eval
|
||||||
|
# colmena apply --on hyrule --experimental-flake-eval
|
||||||
1454
flake.lock
generated
Normal file → Executable file
1454
flake.lock
generated
Normal file → Executable file
File diff suppressed because it is too large
Load diff
228
flake.nix
Normal file → Executable file
228
flake.nix
Normal file → Executable file
|
|
@ -1,107 +1,147 @@
|
||||||
{
|
{
|
||||||
description = "im gonna cry again ;-;";
|
description = "Emile's Nix Dotfiles";
|
||||||
|
|
||||||
inputs = {
|
inputs = {
|
||||||
systems.url = "github:nix-systems/default-linux";
|
# nixpkgs.url = "github:nixos/nixpkgs/nixos-24.05";
|
||||||
|
nixpkgs.url = "github:nixos/nixpkgs/nixos-24.11";
|
||||||
|
#nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
|
||||||
|
|
||||||
nixpkgs.url = "github:nixos/nixpkgs/nixos-25.11";
|
#home-manager = {
|
||||||
nixpkgs-unstable.url = "github:NixOS/nixpkgs/nixos-unstable";
|
# url = "github:nix-community/home-manager";
|
||||||
nixpkgs-master.url = "github:NixOS/nixpkgs/master";
|
# inputs.nixpkgs.follows = "nixpkgs";
|
||||||
|
#};
|
||||||
home-manager = {
|
|
||||||
url = "github:nix-community/home-manager/release-25.11";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
nt.url = "git+https://tearforge.net/cry/nt";
|
|
||||||
|
|
||||||
cerulean = {
|
|
||||||
url = "github:cry128/cerulean/refactor/snowflake";
|
|
||||||
inputs = {
|
|
||||||
nt.follows = "nt";
|
|
||||||
systems.follows = "systems";
|
|
||||||
nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
grub2-themes = {
|
|
||||||
url = "github:vinceliuice/grub2-themes";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
sddm-silent = {
|
|
||||||
url = "github:uiriansan/SilentSDDM";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
mango = {
|
|
||||||
url = "github:DreamMaoMao/mango";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
hyprland = {
|
|
||||||
url = "github:hyprwm/Hyprland";
|
|
||||||
|
|
||||||
inputs = {
|
|
||||||
nixpkgs.follows = "nixpkgs-unstable";
|
|
||||||
systems.follows = "systems";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
awww = {
|
|
||||||
url = "git+https://codeberg.org/LGFae/awww";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
nixcats.url = "github:BirdeeHub/nixCats-nvim";
|
|
||||||
|
|
||||||
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=latest";
|
|
||||||
|
|
||||||
nixcord = {
|
|
||||||
url = "github:FlameFlag/nixcord";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
|
||||||
};
|
|
||||||
|
|
||||||
millennium = {
|
|
||||||
url = "github:SteamClientHomebrew/millennium?dir=packages/nix";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs-unstable";
|
|
||||||
};
|
|
||||||
|
|
||||||
spicetify-nix = {
|
spicetify-nix = {
|
||||||
url = "github:Gerg-L/spicetify-nix";
|
url = "github:Gerg-L/spicetify-nix";
|
||||||
inputs = {
|
|
||||||
systems.follows = "systems";
|
|
||||||
nixpkgs.follows = "nixpkgs-unstable";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
zen-browser = {
|
|
||||||
url = "github:0xc000022070/zen-browser-flake";
|
|
||||||
inputs = {
|
|
||||||
nixpkgs.follows = "nixpkgs-unstable";
|
|
||||||
home-manager.follows = "home-manager";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
dobutterfliescry-net = {
|
|
||||||
url = "git+https://tearforge.net/cry/site";
|
|
||||||
inputs = {
|
|
||||||
nixpkgs.follows = "nixpkgs";
|
|
||||||
nixpkgs-unstable.follows = "nixpkgs-unstable";
|
|
||||||
systems.follows = "systems";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
mcsr = {
|
|
||||||
url = "https://git.uku3lig.net/uku/mcsr-nixos/archive/main.tar.gz";
|
|
||||||
inputs.nixpkgs.follows = "nixpkgs";
|
inputs.nixpkgs.follows = "nixpkgs";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
nixcord.url = "github:kaylorben/nixcord";
|
||||||
|
|
||||||
|
grub2-themes.url = "github:vinceliuice/grub2-themes";
|
||||||
|
|
||||||
|
# is this necessary? (aren't I enabling it in `configuration.nix` anyways?)
|
||||||
|
hyprland.url = "github:hyprwm/Hyprland";
|
||||||
|
|
||||||
|
swww.url = "github:LGFae/swww";
|
||||||
|
|
||||||
|
# TODO: declarative flatpak management
|
||||||
|
nix-flatpak.url = "github:gmodena/nix-flatpak/?ref=v0.4.1";
|
||||||
|
|
||||||
|
ags.url = "github:Aylur/ags";
|
||||||
|
|
||||||
|
hyprpanel.url = "github:Jas-SinghFSU/HyprPanel";
|
||||||
|
|
||||||
|
# colmena.url = "github:zhaofengli/colmena";
|
||||||
|
colmena.url = "github:zhaofengli/colmena/?rev=47b6414d800c8471e98ca072bc0835345741a56a";
|
||||||
|
# alternative to colmena (currently in testing)
|
||||||
|
#deploy-rs.url = "github:serokell/deploy-rs";
|
||||||
|
|
||||||
|
#wishlist.url = "path:/home/me/nixdots/flakes/wishlist";
|
||||||
};
|
};
|
||||||
|
|
||||||
nixConfig = {
|
outputs = {
|
||||||
extra-experimental-features = "pipe-operators";
|
self,
|
||||||
};
|
nixpkgs,
|
||||||
|
#home-manager,
|
||||||
|
hyprland,
|
||||||
|
grub2-themes,
|
||||||
|
nixcord,
|
||||||
|
colmena,
|
||||||
|
#deploy-rs,
|
||||||
|
...
|
||||||
|
} @ inputs: let
|
||||||
|
system = "x86_64-linux";
|
||||||
|
|
||||||
outputs = {cerulean, ...} @ inputs:
|
pkgs = import nixpkgs {
|
||||||
cerulean.snow.flake inputs ./.;
|
inherit system;
|
||||||
|
|
||||||
|
config = {
|
||||||
|
allowUnfree = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# TODO: come back to this its really cool
|
||||||
|
# this is just something I'm experimenting with
|
||||||
|
PROJECT_ROOT = builtins.toString ./.;
|
||||||
|
in {
|
||||||
|
# `nix develop` shell
|
||||||
|
devShells."x86_64-linux".default = pkgs.mkShell {
|
||||||
|
buildInputs = [
|
||||||
|
#colmena-new
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
nixosConfigurations = {
|
||||||
|
# i be on my puter fr
|
||||||
|
myputer = nixpkgs.lib.nixosSystem {
|
||||||
|
# nix passes these to every single module
|
||||||
|
specialArgs = {inherit inputs pkgs;};
|
||||||
|
|
||||||
|
modules = [
|
||||||
|
./hosts/myputer
|
||||||
|
grub2-themes.nixosModules.default
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# my laptop 0w0
|
||||||
|
lolcathost = nixpkgs.lib.nixosSystem {
|
||||||
|
specialArgs = {inherit inputs pkgs;};
|
||||||
|
|
||||||
|
modules = [
|
||||||
|
./hosts/lolcathost
|
||||||
|
grub2-themes.nixosModules.default
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# meine vps
|
||||||
|
# hyrule = nixpkgs.lib.nixosSystem {
|
||||||
|
# # manually set system architecture since
|
||||||
|
# # this is for a remote deployment
|
||||||
|
# system = "x86_64-linux";
|
||||||
|
# specialargs = {inherit inputs pkgs;};
|
||||||
|
#
|
||||||
|
# modules = [
|
||||||
|
# ./hosts/hyrule
|
||||||
|
# ];
|
||||||
|
# };
|
||||||
|
};
|
||||||
|
|
||||||
|
# remote deployment with deploy-rs
|
||||||
|
# deploy.nodes.hyrule = {
|
||||||
|
# hostname = "imbored.dev";
|
||||||
|
# # create a primary profile called "system"
|
||||||
|
# profiles.system = {
|
||||||
|
# user = "root"; # user to deploy to
|
||||||
|
# path = deploy-rs.lib.x86_64-linux.activate.nixos self.nixosConfigurations.hyrule;
|
||||||
|
#
|
||||||
|
# # ssh configuration for reaching the server
|
||||||
|
# sshUser = "ae";
|
||||||
|
# #interactiveSudo = true; # TODO: use this and revoke passwordless sudo for ae
|
||||||
|
# sshOpts = ["-i" "/home/me/.ssh/id_hyrule"];
|
||||||
|
# remoteBuild = false; # build locally then deploy to remote host
|
||||||
|
# };
|
||||||
|
# };
|
||||||
|
|
||||||
|
# remote deployment to my servers!!
|
||||||
|
colmenaHive = colmena.lib.makeHive {
|
||||||
|
meta = {
|
||||||
|
# set nixpkgs global
|
||||||
|
nixpkgs = pkgs;
|
||||||
|
# set nixpkgs per server
|
||||||
|
nodeNixpkgs = {
|
||||||
|
hyrule = import nixpkgs {
|
||||||
|
system = "x86_64-linux";
|
||||||
|
config.allowUnfree = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# we can use `specialArgs.inputs` to inject wishlist into hyrule's module
|
||||||
|
#specialArgs.inputs = with inputs; {inherit wishlist;};
|
||||||
|
};
|
||||||
|
|
||||||
|
# meine vps
|
||||||
|
hyrule = import ./hosts/hyrule;
|
||||||
|
};
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
31
flakes/wishlist/README
Normal file
31
flakes/wishlist/README
Normal file
|
|
@ -0,0 +1,31 @@
|
||||||
|
#### wishlist.nix
|
||||||
|
This is a simple Nix flake defining a service from which
|
||||||
|
wishlist can run automatically. This flake runs wishlist-0.15.1
|
||||||
|
and lacks configurability unfortunately. However this was an
|
||||||
|
intentional choice, allowing wishlist to read from the user's
|
||||||
|
`~/.ssh/config` file, which can be configured seperately using
|
||||||
|
the something akin to the follow home-manager snippet:
|
||||||
|
```nix
|
||||||
|
programs.ssh = {
|
||||||
|
enable = true;
|
||||||
|
addKeysToAgent = "yes"; # always add keys to ssh-agent
|
||||||
|
|
||||||
|
matchBlocks = {
|
||||||
|
hyrule = {
|
||||||
|
hostname = "imbored.dev";
|
||||||
|
user = "ae";
|
||||||
|
port = 22;
|
||||||
|
identityFile = "/home/me/.ssh/id_hyrule";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
```
|
||||||
|
|
||||||
|
This decision was mostly selfish as it was easiest...
|
||||||
|
But it comes at the cost of not being able to set the
|
||||||
|
port wishlist listens on. So for now you're stuck with `2222`.
|
||||||
|
|
||||||
|
###### The Future!! (woooowwww)
|
||||||
|
Create an option for wishlist that is used to construct
|
||||||
|
the `config.yaml` file
|
||||||
93
flakes/wishlist/flake.nix
Normal file
93
flakes/wishlist/flake.nix
Normal file
|
|
@ -0,0 +1,93 @@
|
||||||
|
{
|
||||||
|
inputs = {
|
||||||
|
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||||
|
flake-utils.url = "github:numtide/flake-utils";
|
||||||
|
};
|
||||||
|
|
||||||
|
outputs = {
|
||||||
|
self,
|
||||||
|
config,
|
||||||
|
nixpkgs,
|
||||||
|
lib,
|
||||||
|
flake-utils,
|
||||||
|
}: let
|
||||||
|
cfg = config.services.wishlist;
|
||||||
|
supportedSystems = ["x86_64-linux" "i686-linux" "aarch64-linux" "x86_64-darwin" "aarch64-darwin"];
|
||||||
|
in {
|
||||||
|
# TODO: 1. add options (ie one to set whether the server should be enabled),
|
||||||
|
# 2. create a systemd service
|
||||||
|
# 3. create a main program
|
||||||
|
# 4. celibrate
|
||||||
|
|
||||||
|
# TODO: do I need to make this a home-manager option and set the yaml config?
|
||||||
|
|
||||||
|
# define what settings a user can change
|
||||||
|
options = {
|
||||||
|
services.wishlist = with lib; {
|
||||||
|
enable = mkEnableOption "wishlist";
|
||||||
|
|
||||||
|
port = mkOption {
|
||||||
|
type = types.port;
|
||||||
|
default = 2222;
|
||||||
|
description = "Port to listen on";
|
||||||
|
};
|
||||||
|
|
||||||
|
package = mkOption {
|
||||||
|
type = types.package;
|
||||||
|
default = self.packages.${nixpkgs.system}.default;
|
||||||
|
description = "Package to use";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# define a systemd service for wishlist ^_^
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
systemd.services.wishlist = {
|
||||||
|
description = "Single entrypoint for multiple SSH endpoints";
|
||||||
|
wantedBy = ["multi-user.target"];
|
||||||
|
|
||||||
|
serviceConfig = {
|
||||||
|
DynamicUser = "yes";
|
||||||
|
ExecStart = "${cfg.package}/bin/wishlist serve";
|
||||||
|
Restart = "always";
|
||||||
|
RestartSec = "2s";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
packages = flake-utils.lib.eachSystem supportedSystems (
|
||||||
|
system: let
|
||||||
|
version = "0.15.1";
|
||||||
|
#pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
pkgs = import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
config.allowUnfree = false;
|
||||||
|
};
|
||||||
|
#lib = pkgs.lib;
|
||||||
|
in rec {
|
||||||
|
defaultPackage = self.packages.${system}.wishlist;
|
||||||
|
wishlist = pkgs.buildGoModule {
|
||||||
|
pname = "wishlist";
|
||||||
|
inherit version;
|
||||||
|
meta = with lib; {
|
||||||
|
description = "Single entrypoint for multiple SSH endpoints";
|
||||||
|
homepage = "https://github.com/charmbracelet/wishlist";
|
||||||
|
changelog = "https://github.com/charmbracelet/wishlist/releases/tag/v${version}";
|
||||||
|
license = licenses.mit;
|
||||||
|
maintainers = with maintainers; [caarlos0 penguwin];
|
||||||
|
mainProgram = "wishlist";
|
||||||
|
};
|
||||||
|
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "charmbracelet";
|
||||||
|
repo = "wishlist";
|
||||||
|
rev = "v${version}";
|
||||||
|
# rev = "d7f058e115a8b4a4131406d01dde84fb4a8e93c4";
|
||||||
|
hash = "53fojA+gdvpSVNjx6QncH16F8/x+lpY5SkNs7obW2XQ=";
|
||||||
|
};
|
||||||
|
vendorSha256 = "0x6rss3fwv2398wrd5kyzkrqaphzvh4ykwfqai9glxm01y6fhxz7";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
};
|
||||||
|
}
|
||||||
99
flakes/wishlist/wishlist.nix
Normal file
99
flakes/wishlist/wishlist.nix
Normal file
|
|
@ -0,0 +1,99 @@
|
||||||
|
# NOTE: Wishlist service fails on nix because of readonly file system
|
||||||
|
# and it can't find a config file for itself, it needs to write that
|
||||||
|
# itself I suppose :(
|
||||||
|
# So:
|
||||||
|
# 1. Get it to write that file, and
|
||||||
|
# 2. Allow it to inherit profiles from configured ssh
|
||||||
|
{
|
||||||
|
self,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
lib,
|
||||||
|
}: let
|
||||||
|
cfg = config.services.wishlist;
|
||||||
|
in {
|
||||||
|
options = {
|
||||||
|
services.wishlist = with lib; {
|
||||||
|
enable = mkEnableOption "wishlist";
|
||||||
|
|
||||||
|
name = mkOption {
|
||||||
|
type = types.str;
|
||||||
|
default =
|
||||||
|
};
|
||||||
|
|
||||||
|
port = mkOption {
|
||||||
|
type = types.port;
|
||||||
|
default = 2222;
|
||||||
|
description = "Port to listen on";
|
||||||
|
};
|
||||||
|
|
||||||
|
#configPath = mkOption {
|
||||||
|
# type = types.path;
|
||||||
|
# default = ;
|
||||||
|
# description = "Path to config file";
|
||||||
|
#};
|
||||||
|
|
||||||
|
package = mkOption {
|
||||||
|
type = types.package;
|
||||||
|
default = self.packages.${nixpkgs.system}.default;
|
||||||
|
description = "Package to use";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# define a systemd service for wishlist ^_^
|
||||||
|
config = lib.mkIf cfg.enable {
|
||||||
|
systemd.services.wishlist = {
|
||||||
|
description = "Single entrypoint for multiple SSH endpoints";
|
||||||
|
wantedBy = ["multi-user.target"];
|
||||||
|
|
||||||
|
serviceConfig = let
|
||||||
|
wishlistServiceConfig = pkgs.writeText "config.yaml" ''
|
||||||
|
hello world!
|
||||||
|
'';
|
||||||
|
in {
|
||||||
|
DynamicUser = "yes";
|
||||||
|
ExecStart = "${pkgs.wishlist}/bin/wishlist serve --config ${wishlistServiceConfig}";
|
||||||
|
Restart = "always";
|
||||||
|
RestartSec = "2s";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
packages = flake-utils.lib.eachSystem supportedSystems (
|
||||||
|
system: let
|
||||||
|
version = "0.15.1";
|
||||||
|
#pkgs = nixpkgs.legacyPackages.${system};
|
||||||
|
pkgs = import nixpkgs {
|
||||||
|
inherit system;
|
||||||
|
config.allowUnfree = false;
|
||||||
|
};
|
||||||
|
#lib = pkgs.lib;
|
||||||
|
in rec {
|
||||||
|
defaultPackage = self.packages.${system}.wishlist;
|
||||||
|
wishlist = pkgs.buildGoModule {
|
||||||
|
pname = "wishlist";
|
||||||
|
inherit version;
|
||||||
|
meta = with lib; {
|
||||||
|
description = "Single entrypoint for multiple SSH endpoints";
|
||||||
|
homepage = "https://github.com/charmbracelet/wishlist";
|
||||||
|
changelog = "https://github.com/charmbracelet/wishlist/releases/tag/v${version}";
|
||||||
|
license = licenses.mit;
|
||||||
|
maintainers = with maintainers; [caarlos0 penguwin];
|
||||||
|
mainProgram = "wishlist";
|
||||||
|
};
|
||||||
|
|
||||||
|
src = pkgs.fetchFromGitHub {
|
||||||
|
owner = "charmbracelet";
|
||||||
|
repo = "wishlist";
|
||||||
|
rev = "v${version}";
|
||||||
|
# rev = "d7f058e115a8b4a4131406d01dde84fb4a8e93c4";
|
||||||
|
hash = "53fojA+gdvpSVNjx6QncH16F8/x+lpY5SkNs7obW2XQ=";
|
||||||
|
};
|
||||||
|
vendorSha256 = "0x6rss3fwv2398wrd5kyzkrqaphzvh4ykwfqai9glxm01y6fhxz7";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
);
|
||||||
|
*/
|
||||||
|
}
|
||||||
|
|
@ -1,68 +0,0 @@
|
||||||
{
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
imports = [
|
|
||||||
./modules/flatpak.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
security.sudo-rs = {
|
|
||||||
enable = true;
|
|
||||||
wheelNeedsPassword = lib.mkOverride 200 true;
|
|
||||||
};
|
|
||||||
|
|
||||||
networking = {
|
|
||||||
networkmanager.enable = true;
|
|
||||||
|
|
||||||
nftables.enable = true;
|
|
||||||
firewall = {
|
|
||||||
enable = lib.mkDefault true;
|
|
||||||
allowPing = lib.mkDefault true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Use CloudFlare's WARP+ 1.1.1.1 DNS service
|
|
||||||
nameservers = [
|
|
||||||
"1.1.1.1"
|
|
||||||
"1.0.0.1"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.nh = {
|
|
||||||
enable = true;
|
|
||||||
clean.enable = true;
|
|
||||||
clean.extraArgs = "--keep-since 7d --keep 3";
|
|
||||||
# TODO: move nh config to be home-manager
|
|
||||||
flake = "/home/me/flake"; # sets NH_OS_FLAKE variable for you
|
|
||||||
};
|
|
||||||
|
|
||||||
nix.settings = {
|
|
||||||
# make wheel group trusted users allows my "ae" user
|
|
||||||
# to import packages not signed by a trusted key
|
|
||||||
# (aka super duper easier to remote deploy)
|
|
||||||
trusted-users = ["root" "@wheel"];
|
|
||||||
experimental-features = [
|
|
||||||
"nix-command"
|
|
||||||
"flakes"
|
|
||||||
"pipe-operators"
|
|
||||||
];
|
|
||||||
download-buffer-size = 524288000; # 500 MiB
|
|
||||||
};
|
|
||||||
|
|
||||||
time.timeZone = lib.mkDefault "Australia/Brisbane";
|
|
||||||
|
|
||||||
i18n.defaultLocale = lib.mkDefault "en_US.UTF-8";
|
|
||||||
console = {
|
|
||||||
font = "Lat2-Terminus16";
|
|
||||||
keyMap = "us";
|
|
||||||
};
|
|
||||||
|
|
||||||
users.defaultUserShell = pkgs.bash;
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
git
|
|
||||||
vim
|
|
||||||
wget
|
|
||||||
tree
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
||||||
{...}: {
|
|
||||||
services.flatpak = {
|
|
||||||
# DEBUG: remotes = [
|
|
||||||
# DEBUG: {
|
|
||||||
# DEBUG: location = "https://dl.flathub.org/repo/flathub.flatpakrepo";
|
|
||||||
# DEBUG: name = "flathub";
|
|
||||||
# DEBUG: }
|
|
||||||
# DEBUG: ];
|
|
||||||
|
|
||||||
# DEBUG: uninstallUnmanaged = true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,127 +0,0 @@
|
||||||
{
|
|
||||||
inputs,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
config,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
imports = [
|
|
||||||
./programs.nix
|
|
||||||
|
|
||||||
../../hosts/modules/bashistrans.nix
|
|
||||||
../../hosts/modules/wm/hyprland.nix
|
|
||||||
../../hosts/modules/gaming/steam.nix
|
|
||||||
../../hosts/modules/obsidian.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
boot.loader.grub2-theme = {
|
|
||||||
enable = true;
|
|
||||||
# GitHub: vinceliuice/grub2-themes
|
|
||||||
theme = "whitesur"; # stylish, vimix, or whitesur
|
|
||||||
footer = true;
|
|
||||||
customResolution = "1920x1080";
|
|
||||||
};
|
|
||||||
|
|
||||||
services = {
|
|
||||||
# Set display manager (login screen)
|
|
||||||
displayManager = {
|
|
||||||
# sddm relies on pkgs.libsForQt5.qt5.qtgraphicaleffects
|
|
||||||
sddm = {
|
|
||||||
enable = true;
|
|
||||||
wayland.enable = ! config.services.xserver.enable; # experimental
|
|
||||||
# theme = lib.mkForce "silent";
|
|
||||||
};
|
|
||||||
|
|
||||||
# defaultSession = "mango"; # DEBUG
|
|
||||||
defaultSession =
|
|
||||||
if config.programs.hyprland.withUWSM == true
|
|
||||||
then "hyprland-uwsm"
|
|
||||||
else "hyprland";
|
|
||||||
};
|
|
||||||
|
|
||||||
tumbler.enable = true; # Thunar image thumbnail support
|
|
||||||
gvfs.enable = true; # Thunar mount, trash, and other functionality
|
|
||||||
};
|
|
||||||
|
|
||||||
home-manager.sharedModules = [
|
|
||||||
inputs.mango.hmModules.mango
|
|
||||||
];
|
|
||||||
|
|
||||||
programs = {
|
|
||||||
zsh.enable = true;
|
|
||||||
fish.enable = true;
|
|
||||||
|
|
||||||
nix-ld.enable = true;
|
|
||||||
|
|
||||||
mango.enable = true;
|
|
||||||
|
|
||||||
# silentSDDM = {
|
|
||||||
# enable = true;
|
|
||||||
# theme = "rei";
|
|
||||||
# };
|
|
||||||
|
|
||||||
# Thunar also uses: `services.tumbler` & `services.gvfs`
|
|
||||||
thunar = {
|
|
||||||
enable = true;
|
|
||||||
plugins = with pkgs.xfce; [
|
|
||||||
thunar-volman # for removable drives (ie USBs)
|
|
||||||
thunar-archive-plugin # create and extract archives
|
|
||||||
thunar-media-tags-plugin # change metadata for media files
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
# mozilla's email client
|
|
||||||
thunderbird.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
# ----- FONTS -----
|
|
||||||
fonts = {
|
|
||||||
enableDefaultPackages = true; # no clue what this line does tbh
|
|
||||||
packages = with pkgs;
|
|
||||||
[
|
|
||||||
geist-font # for my hyprlock theme
|
|
||||||
# texlive maintains a noto-emoji flake
|
|
||||||
texlivePackages.noto-emoji
|
|
||||||
]
|
|
||||||
++ builtins.filter lib.attrsets.isDerivation (
|
|
||||||
builtins.attrValues pkgs.nerd-fonts
|
|
||||||
);
|
|
||||||
|
|
||||||
# TODO: change my default fonts
|
|
||||||
fontconfig = {
|
|
||||||
defaultFonts = {
|
|
||||||
serif = ["Geist"]; # TODO: package Iosevka Etoile since Iosevka isn't a serif font
|
|
||||||
sansSerif = ["Geist"];
|
|
||||||
monospace = ["Cousine"];
|
|
||||||
emoji = ["Noto Emoji"];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# ---- ENVIRONMENT VARIABLES ----
|
|
||||||
environment = {
|
|
||||||
sessionVariables = {
|
|
||||||
# Hint Electrons apps to use Wayland
|
|
||||||
NIXOS_OZONE_WL = "1";
|
|
||||||
};
|
|
||||||
# systemPackages = with pkgs; [
|
|
||||||
# sddm-theme-corners
|
|
||||||
# ];
|
|
||||||
};
|
|
||||||
|
|
||||||
# ------- USERS -------
|
|
||||||
users = {
|
|
||||||
users = {
|
|
||||||
# literally me fr (personal account)
|
|
||||||
me = {
|
|
||||||
isNormalUser = true;
|
|
||||||
extraGroups = ["wheel" "netdev" "docker"];
|
|
||||||
shell = pkgs.bash;
|
|
||||||
packages = with pkgs; [
|
|
||||||
firefox
|
|
||||||
gitkraken
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
{
|
|
||||||
pkgs,
|
|
||||||
upkgs,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
# ---- SYSTEM PACKAGES -----
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
# User Environment
|
|
||||||
awww # swww
|
|
||||||
helvum
|
|
||||||
easyeffects
|
|
||||||
pavucontrol
|
|
||||||
ani-cli
|
|
||||||
bluetui
|
|
||||||
wl-clipboard # clipboard for wayland
|
|
||||||
hyprpicker # color picker
|
|
||||||
hyprshot # screenshot utility
|
|
||||||
wl-screenrec # screen recording utility
|
|
||||||
qbittorrent # torrenting
|
|
||||||
signal-desktop
|
|
||||||
kdePackages.gwenview # image viewer
|
|
||||||
video-trimmer
|
|
||||||
element-desktop
|
|
||||||
vlc
|
|
||||||
|
|
||||||
# Games
|
|
||||||
upkgs.olympus # celeste
|
|
||||||
upkgs.ekphos
|
|
||||||
|
|
||||||
prismlauncher # minecraft
|
|
||||||
libxtst # used for MCSR modpack
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
@ -1,131 +0,0 @@
|
||||||
{...}: {
|
|
||||||
imports = [
|
|
||||||
./programs.nix
|
|
||||||
./keybinds.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
boot.loader = {
|
|
||||||
efi = {
|
|
||||||
canTouchEfiVariables = true;
|
|
||||||
efiSysMountPoint = "/boot/efi";
|
|
||||||
};
|
|
||||||
grub = {
|
|
||||||
efiSupport = true;
|
|
||||||
device = "nodev";
|
|
||||||
# useOSProber = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Enable initrd hook for virtual console customisation
|
|
||||||
# aka cool colours when bootting yay!!
|
|
||||||
console = {
|
|
||||||
enable = true;
|
|
||||||
earlySetup = true; # initrd pre hook
|
|
||||||
keyMap = "us";
|
|
||||||
font = "Lat2-Terminus16";
|
|
||||||
# ANSI 24-bit color definitions (theme: dracula)
|
|
||||||
colors = [
|
|
||||||
"21222c"
|
|
||||||
"ff5555"
|
|
||||||
"50fa7b"
|
|
||||||
"f1fa8c"
|
|
||||||
"bd93f9"
|
|
||||||
"ff79c6"
|
|
||||||
"8be9fd"
|
|
||||||
"f8f8f2"
|
|
||||||
"6272a4"
|
|
||||||
"ff6e6e"
|
|
||||||
"69ff94"
|
|
||||||
"ffffa5"
|
|
||||||
"d6acff"
|
|
||||||
"ff92df"
|
|
||||||
"a4ffff"
|
|
||||||
"ffffff"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
hardware = {
|
|
||||||
graphics = {
|
|
||||||
enable = true;
|
|
||||||
enable32Bit = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
bluetooth = {
|
|
||||||
enable = true;
|
|
||||||
powerOnBoot = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
virtualisation.docker.enable = true;
|
|
||||||
|
|
||||||
services = {
|
|
||||||
# systemd-resolved provides network name resolution
|
|
||||||
# to local processes via a D-Bus interface.
|
|
||||||
resolved = {
|
|
||||||
enable = true;
|
|
||||||
dnssec = "true";
|
|
||||||
domains = ["~."];
|
|
||||||
# Use CloudFlare's WARP+ 1.1.1.1 DNS service
|
|
||||||
fallbackDns = [
|
|
||||||
"1.1.1.1#one.one.one.one"
|
|
||||||
"1.0.0.1#one.one.one.one"
|
|
||||||
];
|
|
||||||
dnsovertls = "true";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Multimedia Framework
|
|
||||||
# With backwards compatability for alsa/pulseaudio/jack
|
|
||||||
pipewire = {
|
|
||||||
enable = true;
|
|
||||||
audio.enable = true;
|
|
||||||
wireplumber.enable = true;
|
|
||||||
|
|
||||||
alsa.enable = true;
|
|
||||||
alsa.support32Bit = true;
|
|
||||||
# pulse.enable = true;
|
|
||||||
# jack.enable = true;
|
|
||||||
|
|
||||||
# disable X11 bell module, which plays a sound on urgency hint
|
|
||||||
extraConfig = {
|
|
||||||
pipewire."99-silent-bell.conf" = {
|
|
||||||
"context.properties" = {
|
|
||||||
"module.x11.bell" = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# allows pipewire to use the realtime scheduler for increased performance
|
|
||||||
security.rtkit.enable = true;
|
|
||||||
|
|
||||||
# ---- ENVIRONMENT VARIABLES ----
|
|
||||||
environment = {
|
|
||||||
# always install "dev" derivation outputs
|
|
||||||
extraOutputsToInstall = ["dev" "man"];
|
|
||||||
|
|
||||||
sessionVariables = {
|
|
||||||
# folder names with capitalisation look awful!
|
|
||||||
XDG_DOWNLOAD_DIR = "$HOME/downloads";
|
|
||||||
XDG_CONFIG_HOME = "$HOME/.config";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
documentation = {
|
|
||||||
enable = true;
|
|
||||||
doc.enable = true; # install /share/doc packages
|
|
||||||
man = {
|
|
||||||
enable = true; # install manpages
|
|
||||||
|
|
||||||
# https://discourse.nixos.org/t/slow-build-at-building-man-cache/52365/4
|
|
||||||
generateCaches = false;
|
|
||||||
};
|
|
||||||
info.enable = true; # install GNU info
|
|
||||||
dev.enable = true; # install docs intended for developers
|
|
||||||
nixos = {
|
|
||||||
enable = true; # install NixOS documentation (ie man -k nix, & nixos-help)
|
|
||||||
options.splitBuild = true;
|
|
||||||
includeAllModules = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
{...}: {
|
|
||||||
services.keyd = {
|
|
||||||
enable = true;
|
|
||||||
keyboards.default = {
|
|
||||||
ids = ["*"];
|
|
||||||
settings = {
|
|
||||||
main = {
|
|
||||||
capslock = "meta";
|
|
||||||
|
|
||||||
# NOTE: unsure whether or not i like oneshot...
|
|
||||||
# shift = "oneshot(shift)";
|
|
||||||
# control = "oneshot(control)";
|
|
||||||
# leftalt = "oneshot(alt)";
|
|
||||||
# rightalt = "oneshot(rightalt)";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,125 +0,0 @@
|
||||||
{pkgs, ...}: {
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
# Shell
|
|
||||||
bash
|
|
||||||
fish
|
|
||||||
shellcheck
|
|
||||||
grc # colorise command outputs
|
|
||||||
moreutils
|
|
||||||
|
|
||||||
# Systems Emulation
|
|
||||||
qemu # Fellice Bellard's Quick Emulator
|
|
||||||
# Binaries
|
|
||||||
binutils
|
|
||||||
strace
|
|
||||||
ltrace
|
|
||||||
perf-tools # ftrace + perf
|
|
||||||
radare2
|
|
||||||
gdb
|
|
||||||
hexyl
|
|
||||||
# ASM
|
|
||||||
nasm
|
|
||||||
x86-manpages
|
|
||||||
# C Family
|
|
||||||
gcc
|
|
||||||
clang
|
|
||||||
clang-tools
|
|
||||||
gnumake
|
|
||||||
cmake
|
|
||||||
|
|
||||||
# Rust
|
|
||||||
cargo
|
|
||||||
rustc
|
|
||||||
rustfmt
|
|
||||||
# Go
|
|
||||||
go
|
|
||||||
# Nim
|
|
||||||
nim
|
|
||||||
nimble
|
|
||||||
# Haskell
|
|
||||||
ghc
|
|
||||||
ghcid
|
|
||||||
ormolu
|
|
||||||
|
|
||||||
# Nix
|
|
||||||
nix-prefetch-git
|
|
||||||
nix-index
|
|
||||||
nix-unit
|
|
||||||
ns # nix-search-tv overlay
|
|
||||||
|
|
||||||
# Python
|
|
||||||
python312 # I use 3.12 since it's in a pretty stable state now
|
|
||||||
python314 # also 3.14 for latest features
|
|
||||||
poetry
|
|
||||||
# Sage
|
|
||||||
sageWithDoc # SageMath + HTML Documentation
|
|
||||||
|
|
||||||
# .NET
|
|
||||||
dotnetCorePackages.dotnet_9.sdk
|
|
||||||
dotnetCorePackages.dotnet_9.aspnetcore
|
|
||||||
dotnetCorePackages.dotnet_9.runtime
|
|
||||||
|
|
||||||
openvpn
|
|
||||||
inetutils
|
|
||||||
wireguard-tools
|
|
||||||
|
|
||||||
# security tools
|
|
||||||
rustscan
|
|
||||||
nmap
|
|
||||||
dig
|
|
||||||
gobuster
|
|
||||||
nth
|
|
||||||
zap
|
|
||||||
|
|
||||||
httpie
|
|
||||||
curlie
|
|
||||||
zoxide
|
|
||||||
doggo
|
|
||||||
tlrc
|
|
||||||
btop
|
|
||||||
eza
|
|
||||||
yazi
|
|
||||||
exiftool # for yazi
|
|
||||||
ripgrep
|
|
||||||
viddy # modern `watch` command
|
|
||||||
timg # terminal image (sixel) viewer
|
|
||||||
wormhole-rs
|
|
||||||
|
|
||||||
# Pretty necessary
|
|
||||||
git
|
|
||||||
git-filter-repo
|
|
||||||
brightnessctl
|
|
||||||
acpi
|
|
||||||
# upower
|
|
||||||
vim
|
|
||||||
powertop
|
|
||||||
imagemagick
|
|
||||||
ffmpeg
|
|
||||||
usbutils
|
|
||||||
|
|
||||||
# "Standard" Unix Commands
|
|
||||||
file
|
|
||||||
wget
|
|
||||||
tree
|
|
||||||
pstree
|
|
||||||
zip
|
|
||||||
unzip
|
|
||||||
unrar-free
|
|
||||||
lz4
|
|
||||||
man-pages
|
|
||||||
man-pages-posix
|
|
||||||
|
|
||||||
# Cryptography
|
|
||||||
openssl
|
|
||||||
libargon2
|
|
||||||
];
|
|
||||||
|
|
||||||
services.pcscd.enable = true;
|
|
||||||
programs = {
|
|
||||||
gnupg.agent = {
|
|
||||||
enable = true;
|
|
||||||
# pinentryPackage = pkgs.pinentry-curses;
|
|
||||||
enableSSHSupport = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
||||||
{
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
networking = {
|
|
||||||
firewall = {
|
|
||||||
allowedTCPPorts = [
|
|
||||||
42069 # ssh
|
|
||||||
];
|
|
||||||
};
|
|
||||||
nftables.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
security = {
|
|
||||||
# accept Lets Encrypt's security policy
|
|
||||||
acme = {
|
|
||||||
acceptTerms = true;
|
|
||||||
defaults.email = "them@dobutterfliescry.net";
|
|
||||||
};
|
|
||||||
|
|
||||||
# allow SSH keys for passwordless auth
|
|
||||||
pam = {
|
|
||||||
sshAgentAuth.enable = true;
|
|
||||||
services.sudo.sshAgentAuth = true; # pam_ssh_agent_auth module
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
services = {
|
|
||||||
openssh = {
|
|
||||||
enable = true;
|
|
||||||
ports = [42069];
|
|
||||||
settings = {
|
|
||||||
PasswordAuthentication = false;
|
|
||||||
PermitRootLogin = "no";
|
|
||||||
AllowUsers = ["cry"]; # DO NOT ALLOW ALL
|
|
||||||
UseDns = true;
|
|
||||||
X11Forwarding = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# simple fail2ban config (not production ready or anything though)
|
|
||||||
# refer to: https://nixos.wiki/wiki/Fail2Ban
|
|
||||||
services.fail2ban = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
ignoreIP = ["192.168.0.0/16"];
|
|
||||||
maxretry = 5;
|
|
||||||
bantime = "10m"; # 10 minute ban
|
|
||||||
bantime-increment = {
|
|
||||||
enable = true;
|
|
||||||
formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)";
|
|
||||||
# multipliers = "1 2 4 8 16 32 64";
|
|
||||||
maxtime = "168h"; # dont ban for more than 1 week
|
|
||||||
overalljails = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
users = {
|
|
||||||
users = {
|
|
||||||
# primary user
|
|
||||||
cry = {
|
|
||||||
isNormalUser = true;
|
|
||||||
createHome = true;
|
|
||||||
home = "/home/cry";
|
|
||||||
extraGroups = ["wheel"];
|
|
||||||
openssh.authorizedKeys.keys = lib.mkDefault [
|
|
||||||
(throw ''
|
|
||||||
You goofy goober :3
|
|
||||||
Hosts in the `server` group must set `users.users.cry.openssh.authorizedKeys.keys = [ ... ]`.
|
|
||||||
'')
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
environment.systemPackages = with pkgs; [
|
|
||||||
unixtools.netstat
|
|
||||||
];
|
|
||||||
}
|
|
||||||
56
homes/ae/default.nix
Normal file
56
homes/ae/default.nix
Normal file
|
|
@ -0,0 +1,56 @@
|
||||||
|
{
|
||||||
|
inputs,
|
||||||
|
outputs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
nixpkgs = {
|
||||||
|
config.allowUnfree = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
];
|
||||||
|
|
||||||
|
home = {
|
||||||
|
username = "ae";
|
||||||
|
homeDirectory = "/home/ae";
|
||||||
|
};
|
||||||
|
|
||||||
|
programs = {
|
||||||
|
};
|
||||||
|
|
||||||
|
# Nicely reload system units when changing configs
|
||||||
|
systemd.user.startServices = "sd-switch";
|
||||||
|
|
||||||
|
# ssh = {
|
||||||
|
# enable = true;
|
||||||
|
# forwardAgent = true;
|
||||||
|
# addKeysToAgent = "yes";
|
||||||
|
|
||||||
|
# matchBlocks = {
|
||||||
|
# hyrule = {
|
||||||
|
# hostname = "imbored.dev";
|
||||||
|
# user = "ae";
|
||||||
|
# port = 22;
|
||||||
|
# identityFile = "/home/ae/.ssh/id_hyrule";
|
||||||
|
# };
|
||||||
|
# };
|
||||||
|
# };
|
||||||
|
|
||||||
|
# SERVICE: webfishing (example for wishlist)
|
||||||
|
#systemd.user.services.webfishing = {
|
||||||
|
# Unit.Description = "I be out here webfishing frfr";
|
||||||
|
|
||||||
|
# Install.WantedBy = ["default.target"];
|
||||||
|
|
||||||
|
# Service = {
|
||||||
|
# Type = "exec";
|
||||||
|
# ExecStart = "echo $HOME; cat $HOME/.ssh/config";
|
||||||
|
# Restart = "always";
|
||||||
|
# };
|
||||||
|
#};
|
||||||
|
|
||||||
|
home.stateVersion = "24.11"; # DO NOT MODIFY
|
||||||
|
}
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
{...}: {
|
|
||||||
imports = [
|
|
||||||
../modules/fish.nix
|
|
||||||
../modules/bat.nix
|
|
||||||
../modules/btop.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
home = {
|
|
||||||
username = "cry";
|
|
||||||
homeDirectory = "/home/cry";
|
|
||||||
};
|
|
||||||
|
|
||||||
# Nicely reload system units when changing configs
|
|
||||||
systemd.user.startServices = "sd-switch";
|
|
||||||
|
|
||||||
home.stateVersion = "24.11"; # DO NOT MODIFY
|
|
||||||
}
|
|
||||||
|
|
@ -1,51 +1,52 @@
|
||||||
{pkgs, ...}: {
|
{
|
||||||
|
inputs,
|
||||||
|
outputs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
nixpkgs = {
|
||||||
|
config.allowUnfree = true;
|
||||||
|
};
|
||||||
|
|
||||||
imports = [
|
imports = [
|
||||||
./modules/cli/git.nix
|
../modules/git.nix
|
||||||
./modules/cli/ssh.nix
|
../modules/bat.nix
|
||||||
|
../modules/fish.nix
|
||||||
../modules/term/foot.nix
|
|
||||||
../modules/shell/zsh.nix
|
|
||||||
../modules/shell/zsh.nix
|
|
||||||
../modules/shell/fish.nix
|
|
||||||
../modules/shell/elvish.nix
|
|
||||||
../modules/editor/helix.nix
|
../modules/editor/helix.nix
|
||||||
../modules/editor/neovim
|
|
||||||
|
|
||||||
../modules/cli/bat.nix
|
../modules/btop.nix
|
||||||
../modules/cli/btop.nix
|
../modules/rio.nix
|
||||||
../modules/cli/hyfetch.nix
|
../modules/firefox.nix
|
||||||
../modules/cli/tmux.nix
|
../modules/nixcord.nix
|
||||||
|
|
||||||
../modules/apps/firefox.nix
|
#../modules/hypr/hypridle.nix
|
||||||
../modules/apps/zen-browser.nix
|
#../modules/hypr/hyprlock.nix
|
||||||
../modules/apps/thunderbird.nix
|
../modules/kanshi.nix
|
||||||
../modules/apps/nixcord.nix
|
../modules/ags
|
||||||
../modules/apps/spicetify.nix
|
|
||||||
|
|
||||||
../modules/wm/hyprland
|
|
||||||
../modules/wm/mango
|
|
||||||
../modules/de/mako.nix
|
|
||||||
../modules/de/waybar
|
|
||||||
];
|
];
|
||||||
|
|
||||||
programs.elvish.enable = true;
|
/*
|
||||||
|
programs.spicetify =
|
||||||
|
let
|
||||||
|
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
enable = true;
|
||||||
|
enabledExtensions = with spicePkgs.extensions; [
|
||||||
|
adblock
|
||||||
|
hidePodcasts
|
||||||
|
shuffle # shuffle+ (special characters are sanitized out of extension names)
|
||||||
|
];
|
||||||
|
theme = spicePkgs.themes.catppuccin;
|
||||||
|
colorScheme = "mocha";
|
||||||
|
};
|
||||||
|
*/
|
||||||
|
|
||||||
home = {
|
home = {
|
||||||
shellAliases = {
|
username = "me";
|
||||||
# nix
|
homeDirectory = "/home/me";
|
||||||
nd = "nix develop";
|
|
||||||
ntv = "nix-search-tv";
|
|
||||||
rebuild = "nh os switch ~/flake";
|
|
||||||
trybuild = "nh os test ~/flake";
|
|
||||||
|
|
||||||
# shell utilities
|
|
||||||
ls = "eza --color=auto";
|
|
||||||
l = "eza -Alh --color=auto --icons=auto";
|
|
||||||
ll = "eza -lh --color=auto --icons=auto";
|
|
||||||
li = "eza --color=auto --git-ignore";
|
|
||||||
rgf = "rg --files | rg";
|
|
||||||
watch = "viddy";
|
|
||||||
};
|
|
||||||
|
|
||||||
pointerCursor = {
|
pointerCursor = {
|
||||||
gtk.enable = true;
|
gtk.enable = true;
|
||||||
|
|
@ -54,18 +55,6 @@
|
||||||
name = "Bibata-Modern-Ice";
|
name = "Bibata-Modern-Ice";
|
||||||
size = 16;
|
size = 16;
|
||||||
};
|
};
|
||||||
|
|
||||||
packages = with pkgs; [
|
|
||||||
# for services.gnome-keyring
|
|
||||||
gcr # provides org.gnome.keyring.SystemPrompter
|
|
||||||
seahorse # gui
|
|
||||||
|
|
||||||
krita
|
|
||||||
tor-browser
|
|
||||||
|
|
||||||
fuzzel
|
|
||||||
speedtest-cli
|
|
||||||
];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
gtk = {
|
gtk = {
|
||||||
|
|
@ -82,21 +71,99 @@
|
||||||
# TODO: use a variable to mirror this cursor size
|
# TODO: use a variable to mirror this cursor size
|
||||||
# with the `home.pointerCurser.size`
|
# with the `home.pointerCurser.size`
|
||||||
cursorTheme = {
|
cursorTheme = {
|
||||||
|
# dont set the theme (use system default instead)
|
||||||
|
# only set size to match the system
|
||||||
package = pkgs.bibata-cursors;
|
package = pkgs.bibata-cursors;
|
||||||
name = "Bibata-Modern-Ice";
|
name = "Bibata-Modern-Ice";
|
||||||
size = 16;
|
size = 16;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# TODO: this lowkey doesnt work... (maybe the name "Dracula" is wrong?)
|
||||||
qt = {
|
qt = {
|
||||||
enable = true;
|
enable = true;
|
||||||
platformTheme.name = "gtk2";
|
platformTheme.name = "gtk2";
|
||||||
style.name = "gtk2";
|
style.name = "gtk2";
|
||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
programs = {
|
||||||
gnome-keyring.enable = true;
|
# these are both required for home-manager to work
|
||||||
|
home-manager.enable = true;
|
||||||
|
|
||||||
|
# DEBUG: testing if my xdg-desktop-portal-hyprland is working or not
|
||||||
|
obs-studio = {
|
||||||
|
enable = true;
|
||||||
|
plugins = with pkgs.obs-studio-plugins; [
|
||||||
|
wlrobs
|
||||||
|
obs-backgroundremoval
|
||||||
|
obs-pipewire-audio-capture
|
||||||
|
];
|
||||||
|
};
|
||||||
|
|
||||||
|
# set ssh profiles
|
||||||
|
# (all we need is hyrule, everything else is through wishlist)
|
||||||
|
# NOTE: (IMPORTANT) this DOES NOT start the ssh-agent
|
||||||
|
# for that you need to use `services.ssh-agent.enable`
|
||||||
|
ssh = {
|
||||||
|
enable = true;
|
||||||
|
forwardAgent = true;
|
||||||
|
addKeysToAgent = "yes"; # always add keys to ssh-agent
|
||||||
|
|
||||||
|
matchBlocks = {
|
||||||
|
hyrule = {
|
||||||
|
hostname = "imbored.dev";
|
||||||
|
user = "ae";
|
||||||
|
port = 22;
|
||||||
|
identityFile = "~/.ssh/id_hyrule";
|
||||||
|
};
|
||||||
|
subspace = {
|
||||||
|
hostname = "imbored.dev";
|
||||||
|
user = "subspace";
|
||||||
|
port = 22;
|
||||||
|
identityFile = "~/.ssh/id_subspace";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# I want to use fish as my login shell but it always
|
||||||
|
# goes terrible cause it isn't POSIX compliant, so
|
||||||
|
# instead Bash is my login and it will just exec fish
|
||||||
|
#bash = {
|
||||||
|
# interactiveShellInit = ''
|
||||||
|
# if [[ $(${pkgs.procps}/bin/ps --no-header --pid=$PPID --format=comm) != "fish" && -z ''${BASH_EXECUTION_STRING} ]]
|
||||||
|
# then
|
||||||
|
# shopt -q login_shell && LOGIN_OPTION='--login' || LOGIN_OPTION=""
|
||||||
|
# exec ${pkgs.fish}/bin/fish $LOGIN_OPTION
|
||||||
|
# fi
|
||||||
|
# '';
|
||||||
|
#};
|
||||||
|
|
||||||
|
/*
|
||||||
|
spicetify =
|
||||||
|
let
|
||||||
|
spicePkgs = inputs.spicetify-nix.legacyPackages.${pkgs.system};
|
||||||
|
in
|
||||||
|
{
|
||||||
|
enable = true;
|
||||||
|
enabledExtensions = with spicePkgs.extensions; [
|
||||||
|
adblock
|
||||||
|
hidePodcasts
|
||||||
|
#shuffle
|
||||||
|
];
|
||||||
|
theme = spicePkgs.themes.catppuccin;
|
||||||
|
colorScheme = "mocha";
|
||||||
|
};
|
||||||
|
*/
|
||||||
};
|
};
|
||||||
|
|
||||||
|
# enable OpenSSH private key agent
|
||||||
|
services.ssh-agent.enable = true;
|
||||||
|
# the ssh-agent won't set this for itself...
|
||||||
|
systemd.user.sessionVariables.SSH_AUTH_SOCK = "$XDG_RUNTIME_DIR/ssh-agent";
|
||||||
|
#home.sessionVariables.SSH_AUTH_SOCK = "$XDG_RUNTIME_DIR/ssh-agent";
|
||||||
|
|
||||||
|
# Nicely reload system units when changing configs
|
||||||
|
systemd.user.startServices = "sd-switch";
|
||||||
|
|
||||||
home.stateVersion = "24.05"; # don't change this
|
home.stateVersion = "24.05"; # don't change this
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,122 +0,0 @@
|
||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
delta # git diff viewer
|
|
||||||
];
|
|
||||||
|
|
||||||
programs = {
|
|
||||||
git = {
|
|
||||||
enable = true;
|
|
||||||
lfs.enable = true;
|
|
||||||
|
|
||||||
signing = {
|
|
||||||
key = "F68745A836CA0412";
|
|
||||||
format = "openpgp";
|
|
||||||
signByDefault = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
settings = {
|
|
||||||
user.name = "_cry64";
|
|
||||||
user.email = "them@dobutterfliescry.net";
|
|
||||||
|
|
||||||
alias = {
|
|
||||||
s = "status";
|
|
||||||
d = "diff";
|
|
||||||
l = "log";
|
|
||||||
c = "commit";
|
|
||||||
p = "push";
|
|
||||||
};
|
|
||||||
|
|
||||||
color.ui = true;
|
|
||||||
core.editor = "hx";
|
|
||||||
github.user = "cry128";
|
|
||||||
|
|
||||||
# delta diff viewer
|
|
||||||
core.pager = "delta";
|
|
||||||
interactive.diffFilter = "delta --color-only";
|
|
||||||
delta = {
|
|
||||||
navigate = true;
|
|
||||||
line-numbers = true;
|
|
||||||
side-by-side = true;
|
|
||||||
};
|
|
||||||
merge.conflictStyle = "zdiff3";
|
|
||||||
|
|
||||||
init = {
|
|
||||||
defaultBranch = "main";
|
|
||||||
};
|
|
||||||
url = {
|
|
||||||
"git@github.com:" = {
|
|
||||||
insteadOf = [
|
|
||||||
"gh:"
|
|
||||||
"github:"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
"https://gitlab.com/" = {
|
|
||||||
insteadOf = [
|
|
||||||
"gl:"
|
|
||||||
"gitlab:"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
"git@codeberg.org:" = {
|
|
||||||
insteadOf = [
|
|
||||||
"cb:"
|
|
||||||
"codeberg:"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
"git@tearforge.net/" = {
|
|
||||||
insteadOf = [
|
|
||||||
"cry:"
|
|
||||||
"forge:"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
includes = [
|
|
||||||
{
|
|
||||||
path = "/home/me/agribit/.gitconfig";
|
|
||||||
condition = "gitdir:/home/me/agribit/**";
|
|
||||||
}
|
|
||||||
# {
|
|
||||||
# path = "/home/me/luminary/.gitconfig";
|
|
||||||
# condition = "gitdir:/home/me/luminary/**";
|
|
||||||
# }
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
lazygit = {
|
|
||||||
enable = true;
|
|
||||||
enableFishIntegration = true;
|
|
||||||
enableZshIntegration = true;
|
|
||||||
|
|
||||||
shellWrapperName = "lg";
|
|
||||||
|
|
||||||
settings = {
|
|
||||||
gui = {
|
|
||||||
useHunkModeInStagingView = false;
|
|
||||||
|
|
||||||
skipDiscardChangeWarning = false;
|
|
||||||
skipStashWarning = true;
|
|
||||||
|
|
||||||
animateExplosion = true; # FUCK YEAHHHHHHHHHHHHHHHHHHHHHHHHH
|
|
||||||
|
|
||||||
theme = {
|
|
||||||
lightTheme = false;
|
|
||||||
activeBorderColor = ["green" "bold"];
|
|
||||||
inactiveBorderColor = ["white"];
|
|
||||||
selectedLineBgColor = ["default"];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
git.pagers = [
|
|
||||||
{
|
|
||||||
pager = "delta --dark --pager=never";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,46 +0,0 @@
|
||||||
{...}: {
|
|
||||||
# set ssh profiles
|
|
||||||
# WARNING: this DOES NOT start the ssh-agent
|
|
||||||
# WARNING: for that you need to use `services.ssh-agent.enable`
|
|
||||||
programs.ssh = {
|
|
||||||
enable = true;
|
|
||||||
forwardAgent = false;
|
|
||||||
addKeysToAgent = "yes";
|
|
||||||
|
|
||||||
matchBlocks = {
|
|
||||||
butterfly = {
|
|
||||||
hostname = "dobutterfliescry.net";
|
|
||||||
user = "cry";
|
|
||||||
port = 42069;
|
|
||||||
identityFile = "~/keys/butterfly";
|
|
||||||
setEnv = {
|
|
||||||
TERM = "xterm-256color";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
hyrule = {
|
|
||||||
hostname = "hyrule.dobutterfliescry.net";
|
|
||||||
user = "cry";
|
|
||||||
port = 42069;
|
|
||||||
identityFile = "~/keys/hyrule";
|
|
||||||
setEnv = {
|
|
||||||
TERM = "xterm-256color";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
matcha = {
|
|
||||||
hostname = "192.168.88.250";
|
|
||||||
user = "cry";
|
|
||||||
port = 22;
|
|
||||||
identityFile = "~/keys/matcha";
|
|
||||||
};
|
|
||||||
youcue = {
|
|
||||||
hostname = "moss.labs.eait.uq.edu.au";
|
|
||||||
user = "s4740056";
|
|
||||||
port = 22;
|
|
||||||
identityFile = "~/keys/other/youcue";
|
|
||||||
setEnv = {
|
|
||||||
TERM = "xterm-256color";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
26
homes/modules/ags/config.js
Executable file
26
homes/modules/ags/config.js
Executable file
|
|
@ -0,0 +1,26 @@
|
||||||
|
import { AppLauncher } from "./widgets/applauncher.js"
|
||||||
|
import { Notifications } from "./widgets/notifications.js"
|
||||||
|
|
||||||
|
const date = Variable('', {
|
||||||
|
poll: [1000, 'date'],
|
||||||
|
})
|
||||||
|
|
||||||
|
const Bar = (monitor = 0) => Widget.Window({
|
||||||
|
monitor,
|
||||||
|
name: 'bar${monitor}',
|
||||||
|
anchor: ['top', 'left', 'right'],
|
||||||
|
child: Widget.Label({ label: date.bind() }),
|
||||||
|
})
|
||||||
|
|
||||||
|
App.config({
|
||||||
|
style: "./style.css",
|
||||||
|
// icons: "./assets",
|
||||||
|
windows: [
|
||||||
|
Bar(),
|
||||||
|
AppLauncher,
|
||||||
|
Notifications()
|
||||||
|
]
|
||||||
|
// gtkTheme: "Adwaita-dark",
|
||||||
|
// cursorTheme: "Qogir",
|
||||||
|
// iconTheme: "MoreWaita",[]
|
||||||
|
})
|
||||||
12
homes/modules/ags/default.nix
Normal file
12
homes/modules/ags/default.nix
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
{pkgs, ...}: {
|
||||||
|
programs.ags = {
|
||||||
|
enable = true;
|
||||||
|
configDir = ./.;
|
||||||
|
|
||||||
|
extraPackages = with pkgs; [
|
||||||
|
gtksourceview
|
||||||
|
webkitgtk
|
||||||
|
accountsservice
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
0
homes/modules/ags/style.css
Executable file
0
homes/modules/ags/style.css
Executable file
125
homes/modules/ags/widgets/applauncher.js
Executable file
125
homes/modules/ags/widgets/applauncher.js
Executable file
|
|
@ -0,0 +1,125 @@
|
||||||
|
const { query } = await Service.import("applications");
|
||||||
|
const WINDOW_NAME = "applauncher";
|
||||||
|
|
||||||
|
const AppItem = app => Widget.Button({
|
||||||
|
on_clicked: () => {
|
||||||
|
App.closeWindow(WINDOW_NAME)
|
||||||
|
app.launch()
|
||||||
|
},
|
||||||
|
attribute: { app },
|
||||||
|
child: Widget.Box({
|
||||||
|
children: [
|
||||||
|
Widget.Icon({
|
||||||
|
icon: app.icon_name || "",
|
||||||
|
size: 42,
|
||||||
|
}),
|
||||||
|
Widget.Label({
|
||||||
|
class_name: "title",
|
||||||
|
label: app.name,
|
||||||
|
xalign: 0,
|
||||||
|
vpack: "center",
|
||||||
|
truncate: "end",
|
||||||
|
css: "margin-left: 10px;"
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
const AppLauncherWidget = ({ width = 500, height = 500, spacing = 12 }) => {
|
||||||
|
let applications = query("").map(AppItem)
|
||||||
|
|
||||||
|
const list = Widget.Box({
|
||||||
|
vertical: true,
|
||||||
|
children: applications,
|
||||||
|
spacing,
|
||||||
|
})
|
||||||
|
|
||||||
|
function refresh() {
|
||||||
|
applications = query("").map(AppItem)
|
||||||
|
list.children = applications
|
||||||
|
}
|
||||||
|
|
||||||
|
const entry = Widget.Entry({
|
||||||
|
placeholder_text: "Search",
|
||||||
|
hexpand: true,
|
||||||
|
css: "min-height: 50px;",
|
||||||
|
|
||||||
|
// launch first item when Enter is pressed
|
||||||
|
on_accept: () => {
|
||||||
|
// only consider applications that are visible in the list
|
||||||
|
const results = applications.filter((item) => item.visible);
|
||||||
|
if (results[0]) {
|
||||||
|
App.toggleWindow(WINDOW_NAME);
|
||||||
|
results[0].attribute.app.launch()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// filter the applications based on search term
|
||||||
|
on_change: ({ text }) => applications.forEach(item => {
|
||||||
|
item.visible = item.attribute.app.match(text ?? "")
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
|
||||||
|
return Widget.Box({
|
||||||
|
vertical: false,
|
||||||
|
children: [
|
||||||
|
// LEFT
|
||||||
|
Widget.Box({
|
||||||
|
vertical: true,
|
||||||
|
css: `min-width: ${width}px;`
|
||||||
|
+ `min-height: ${height}px;`
|
||||||
|
+ "background-image: url('https://images2.alphacoders.com/135/1351579.png');"
|
||||||
|
+ "background-size: cover;"
|
||||||
|
+ "background-position: center;"
|
||||||
|
+ "background-repeat: no-repeat;",
|
||||||
|
children: [
|
||||||
|
// align the entry field with the app list
|
||||||
|
Widget.Box({
|
||||||
|
css: `margin: ${spacing * 2}px;`,
|
||||||
|
child: entry,
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
}),
|
||||||
|
|
||||||
|
// RIGHT
|
||||||
|
Widget.Box({
|
||||||
|
vertical: true,
|
||||||
|
css: `margin: ${spacing * 2}px;`,
|
||||||
|
child:
|
||||||
|
// make scrollable
|
||||||
|
Widget.Scrollable({
|
||||||
|
hscroll: "never",
|
||||||
|
css: `min-width: ${width}px; min-height: ${height}px;`,
|
||||||
|
child: list,
|
||||||
|
}),
|
||||||
|
|
||||||
|
setup: self => self.hook(App, (_, windowName, visible) => {
|
||||||
|
if (windowName !== WINDOW_NAME)
|
||||||
|
return
|
||||||
|
|
||||||
|
// when the launcher becomes visible
|
||||||
|
if (visible) {
|
||||||
|
refresh()
|
||||||
|
entry.text = ""
|
||||||
|
entry.grab_focus()
|
||||||
|
}
|
||||||
|
}),
|
||||||
|
}),
|
||||||
|
],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
// the app launcher should be a singleton
|
||||||
|
export const AppLauncher = Widget.Window({
|
||||||
|
name: WINDOW_NAME,
|
||||||
|
setup: self => self.keybind("Escape", () => {
|
||||||
|
App.closeWindow(WINDOW_NAME)
|
||||||
|
}),
|
||||||
|
visible: false,
|
||||||
|
keymode: "exclusive",
|
||||||
|
child: AppLauncherWidget({
|
||||||
|
width: 500,
|
||||||
|
height: 500,
|
||||||
|
spacing: 12,
|
||||||
|
}),
|
||||||
|
})
|
||||||
38
homes/modules/ags/widgets/bar.ts
Executable file
38
homes/modules/ags/widgets/bar.ts
Executable file
|
|
@ -0,0 +1,38 @@
|
||||||
|
import options from "options"p
|
||||||
|
|
||||||
|
const { start, center, end } = options.bar.layout
|
||||||
|
|
||||||
|
// place all your bar widgets in here
|
||||||
|
const widgets = {
|
||||||
|
expander: () => Widget.Box({ expand: true}),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//export type BarWidget = keyof typeof widget;
|
||||||
|
|
||||||
|
export default (monitor: number) => Widget.Window({
|
||||||
|
monitor,
|
||||||
|
class_name: "bar",
|
||||||
|
name: "bar-${monitor}",
|
||||||
|
// anchor: position.bind().as(pos => [pos, "left", "right"]),
|
||||||
|
anchor: ["top", "left", "right"],
|
||||||
|
child: Widget.CenterBox({
|
||||||
|
// ensure bar is shown
|
||||||
|
css: "min-width: 2px; min-height: 2px;"
|
||||||
|
startWidget: Widget.Box({
|
||||||
|
hexpand: true,
|
||||||
|
// map all start widgets to be childen
|
||||||
|
childen: start.bind().as(s => s.map(w => widgets[w]()))
|
||||||
|
}),
|
||||||
|
centerWidget: Widget.Box({
|
||||||
|
hpack: "center",
|
||||||
|
// map all center widgets to be childen
|
||||||
|
childen: center.bind().as(c => c.map(w => widgets[w]()))
|
||||||
|
}),
|
||||||
|
endWidget: Widget.Box({
|
||||||
|
hexpand: true
|
||||||
|
// map all end widgets to be childen
|
||||||
|
childen: end.bind().as(e => e.map(w => widgets[w]()))
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
})
|
||||||
23
homes/modules/ags/widgets/fullscreen.js
Executable file
23
homes/modules/ags/widgets/fullscreen.js
Executable file
|
|
@ -0,0 +1,23 @@
|
||||||
|
const WINDOW_NAME = "fullscreen";
|
||||||
|
|
||||||
|
const Fullscreen = (children) => Widget.Box({
|
||||||
|
vertical: true,
|
||||||
|
css: "background-image: url('https://images2.alphacoders.com/135/1351579.png');"
|
||||||
|
+ "background-size: cover;"
|
||||||
|
+ "background-position: center;"
|
||||||
|
+ "background-repeat: no-repeat;",
|
||||||
|
children: children,
|
||||||
|
})
|
||||||
|
|
||||||
|
export const fullscreen = Widget.Window({
|
||||||
|
name: WINDOW_NAME,
|
||||||
|
setup: self => self.keybind("Escape", () => {
|
||||||
|
App.closeWindow(WINDOW_NAME)
|
||||||
|
}),
|
||||||
|
anchor: ["top", "bottom", "left", "right"],
|
||||||
|
visible: false,
|
||||||
|
keymode: "exclusive",
|
||||||
|
child: Fullscreen(
|
||||||
|
Widget.Label({"Hello World"});
|
||||||
|
)
|
||||||
|
})
|
||||||
122
homes/modules/ags/widgets/notifications.js
Normal file
122
homes/modules/ags/widgets/notifications.js
Normal file
|
|
@ -0,0 +1,122 @@
|
||||||
|
const notifications = await Service.import("notifications");
|
||||||
|
|
||||||
|
function NotificationIcon({ app_entry, app_icon, image}) {
|
||||||
|
if (image) {
|
||||||
|
return Widget.Box({
|
||||||
|
css: `background-image: url("${image}");`
|
||||||
|
+ "background-size: contain;"
|
||||||
|
+ "background-repeat: no-repeat;"
|
||||||
|
+ "background-position: center;"
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
let icon = "dialog-information-symbolic"
|
||||||
|
if (Utils.lookUpIcon(app_icon))
|
||||||
|
icon = app_icon
|
||||||
|
|
||||||
|
if (app_entry && Utils.lookUpIcon(app_entry))
|
||||||
|
icon = app_entry
|
||||||
|
|
||||||
|
return Widget.Box({
|
||||||
|
child: Widget.Icon(icon),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function Notification(n) {
|
||||||
|
const icon = Widget.Box({
|
||||||
|
vpack: "start",
|
||||||
|
class_name: "icon",
|
||||||
|
child: NotificationIcon(n),
|
||||||
|
})
|
||||||
|
|
||||||
|
const title = Widget.Label({
|
||||||
|
class_name: "title",
|
||||||
|
xalign: 0,
|
||||||
|
justification: "left",
|
||||||
|
hexpand: true,
|
||||||
|
max_width_chars: 24,
|
||||||
|
truncate: "end",
|
||||||
|
wrap: true,
|
||||||
|
label: n.summary,
|
||||||
|
use_markup: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
const body = Widget.Label({
|
||||||
|
class_name: "body",
|
||||||
|
hexpand: true,
|
||||||
|
use_markup: true,
|
||||||
|
xalign: 0,
|
||||||
|
justification: "left",
|
||||||
|
label: n.body,
|
||||||
|
wrap: true,
|
||||||
|
})
|
||||||
|
|
||||||
|
const actions = Widget.Box({
|
||||||
|
class_name: "actions",
|
||||||
|
children: n.actions.map(({ id, label}) => Widget.Button({
|
||||||
|
class_name: "action-button",
|
||||||
|
on_clicked: () => {
|
||||||
|
n.invoke(id),
|
||||||
|
n.dismiss()
|
||||||
|
},
|
||||||
|
hexpand: true,
|
||||||
|
child: Widget.Label(label),
|
||||||
|
})),
|
||||||
|
})
|
||||||
|
|
||||||
|
return Widget.EventBox(
|
||||||
|
{
|
||||||
|
attribute: {id: n.id},
|
||||||
|
on_primary_click: n.dismiss,
|
||||||
|
},
|
||||||
|
Widget.Box(
|
||||||
|
{
|
||||||
|
class_name: `notification ${n.urgency}`,
|
||||||
|
vertical: true,
|
||||||
|
},
|
||||||
|
Widget.Box([
|
||||||
|
icon,
|
||||||
|
Widget.Box(
|
||||||
|
{ vertical: true },
|
||||||
|
title,
|
||||||
|
body,
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
actions,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
export function Notifications(monitor = 0) {
|
||||||
|
const list = Widget.Box({
|
||||||
|
vertical: true,
|
||||||
|
children: notifications.popups.map(Notification),
|
||||||
|
})
|
||||||
|
|
||||||
|
function onNotified(_, id) {
|
||||||
|
const n = notifications.getNotification(id)
|
||||||
|
if (n)
|
||||||
|
list.children = [Notification(n), ...list.children]
|
||||||
|
}
|
||||||
|
|
||||||
|
function onDismissed(_, id) {
|
||||||
|
list.children.find(n => n.attribute.id === id)?.destroy()
|
||||||
|
}
|
||||||
|
|
||||||
|
list.hook(notifications, onNotified, "notified")
|
||||||
|
.hook(notifications, onDismissed, "dismissed")
|
||||||
|
|
||||||
|
return Widget.Window({
|
||||||
|
monitor,
|
||||||
|
class_name: "notifications-widget",
|
||||||
|
name: `notifications-${monitor}`,
|
||||||
|
anchor: ["top", "left"],
|
||||||
|
child: Widget.Box({
|
||||||
|
css: "min-width: 2px; min-height: 2px;",
|
||||||
|
class_name: "notifications",
|
||||||
|
vertical: true,
|
||||||
|
child: list,
|
||||||
|
}),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
@ -1,262 +0,0 @@
|
||||||
{
|
|
||||||
inputs,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
imports = [
|
|
||||||
inputs.nixcord.homeModules.nixcord
|
|
||||||
];
|
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
discordo
|
|
||||||
];
|
|
||||||
|
|
||||||
programs.nixcord = {
|
|
||||||
enable = true;
|
|
||||||
equibop.enable = true;
|
|
||||||
|
|
||||||
discord = {
|
|
||||||
vencord.enable = false;
|
|
||||||
equicord.enable = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
config = {
|
|
||||||
enabledThemes = [
|
|
||||||
"aurorastheme.css"
|
|
||||||
"base16-colors.css"
|
|
||||||
];
|
|
||||||
plugins = {
|
|
||||||
invisibleChat.enable = true;
|
|
||||||
anonymiseFileNames = {
|
|
||||||
enable = true;
|
|
||||||
anonymiseByDefault = true;
|
|
||||||
method = 0;
|
|
||||||
randomisedLength = 16;
|
|
||||||
};
|
|
||||||
betterSessions = {
|
|
||||||
backgroundCheck = true;
|
|
||||||
checkInterval = 1;
|
|
||||||
};
|
|
||||||
biggerStreamPreview.enable = true;
|
|
||||||
callTimer.enable = true;
|
|
||||||
fixYoutubeEmbeds.enable = true;
|
|
||||||
fixSpotifyEmbeds.enable = true;
|
|
||||||
tidalEmbeds.enable = true;
|
|
||||||
youtubeAdblock.enable = true;
|
|
||||||
followVoiceUser.enable = true;
|
|
||||||
friendsSince.enable = true;
|
|
||||||
ircColors = {
|
|
||||||
enable = true;
|
|
||||||
lightness = 80;
|
|
||||||
memberListColors = true;
|
|
||||||
applyColorOnlyInDms = false;
|
|
||||||
applyColorOnlyToUsersWithoutColor = false;
|
|
||||||
};
|
|
||||||
messageLogger = {
|
|
||||||
enable = true;
|
|
||||||
showEditDiffs = true;
|
|
||||||
separatedDiffs = false;
|
|
||||||
};
|
|
||||||
fakeNitro.enable = true;
|
|
||||||
ghosted.enable = false;
|
|
||||||
noF1.enable = true;
|
|
||||||
noMaskedUrlPaste.enable = true;
|
|
||||||
messageLatency = {
|
|
||||||
enable = false;
|
|
||||||
latency = -1;
|
|
||||||
showMillis = true;
|
|
||||||
};
|
|
||||||
openInApp.enable = true;
|
|
||||||
crashHandler.enable = true;
|
|
||||||
disableCallIdle.enable = true;
|
|
||||||
experiments.enable = true;
|
|
||||||
expressionCloner.enable = true;
|
|
||||||
favoriteGifSearch.enable = true;
|
|
||||||
fixImagesQuality.enable = true;
|
|
||||||
forceOwnerCrown.enable = true;
|
|
||||||
forwardAnywhere.enable = true;
|
|
||||||
spotifyCrack.enable = true;
|
|
||||||
spotifyShareCommands.enable = true;
|
|
||||||
fullUserInChatbox.enable = true;
|
|
||||||
gifPaste.enable = true;
|
|
||||||
ignoreActivities = {
|
|
||||||
enable = true;
|
|
||||||
ignorePlaying = true;
|
|
||||||
ignoreStreaming = true;
|
|
||||||
ignoreListening = true;
|
|
||||||
ignoreWatching = true;
|
|
||||||
ignoreCompeting = true;
|
|
||||||
};
|
|
||||||
imageLink.enable = true;
|
|
||||||
imageZoom.enable = true;
|
|
||||||
memberCount.enable = true;
|
|
||||||
noDevtoolsWarning.enable = true;
|
|
||||||
noUnblockToJump.enable = true;
|
|
||||||
pauseInvitesForever.enable = true;
|
|
||||||
permissionsViewer.enable = true;
|
|
||||||
pictureInPicture = {
|
|
||||||
enable = true;
|
|
||||||
loop = true;
|
|
||||||
};
|
|
||||||
platformIndicators.enable = true;
|
|
||||||
previewMessage.enable = true;
|
|
||||||
relationshipNotifier.enable = true;
|
|
||||||
revealAllSpoilers.enable = true;
|
|
||||||
serverInfo.enable = true;
|
|
||||||
serverListIndicators.enable = true;
|
|
||||||
musicControls = {
|
|
||||||
enable = true;
|
|
||||||
showSpotifyControls = true;
|
|
||||||
showSpotifyLyrics = true;
|
|
||||||
};
|
|
||||||
showHiddenChannels.enable = true;
|
|
||||||
showHiddenThings.enable = true;
|
|
||||||
showTimeoutDuration = {
|
|
||||||
enable = true;
|
|
||||||
displayStyle = "tooltip";
|
|
||||||
};
|
|
||||||
silentTyping = {
|
|
||||||
enable = true;
|
|
||||||
enabledGlobally = true;
|
|
||||||
};
|
|
||||||
startupTimings.enable = true;
|
|
||||||
typingIndicator.enable = true;
|
|
||||||
unlockedAvatarZoom = {
|
|
||||||
enable = true;
|
|
||||||
zoomMultiplier = 4.0;
|
|
||||||
};
|
|
||||||
userMessagesPronouns.enable = true;
|
|
||||||
validUser.enable = true;
|
|
||||||
validReply.enable = true;
|
|
||||||
viewIcons = {
|
|
||||||
enable = true;
|
|
||||||
format = "webp";
|
|
||||||
imgSize = "4096";
|
|
||||||
};
|
|
||||||
voiceChatDoubleClick.enable = true;
|
|
||||||
voiceDownload.enable = true;
|
|
||||||
voiceMessages = {
|
|
||||||
enable = true;
|
|
||||||
noiseSuppression = false;
|
|
||||||
echoCancellation = true;
|
|
||||||
};
|
|
||||||
volumeBooster.enable = true;
|
|
||||||
webKeybinds.enable = true;
|
|
||||||
webScreenShareFixes.enable = true;
|
|
||||||
whoReacted.enable = true;
|
|
||||||
whosWatching.enable = true;
|
|
||||||
quickReply.enable = true;
|
|
||||||
shikiCodeblocks = {
|
|
||||||
enable = true;
|
|
||||||
useDevIcon = "COLOR";
|
|
||||||
theme = "https://raw.githubusercontent.com/shikijs/textmate-grammars-themes/2d87559c7601a928b9f7e0f0dda243d2fb6d4499/packages/tm-themes/themes/kanagawa-wave.json";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.nixcord.config.plugins.PinDMs = {
|
|
||||||
enable = true;
|
|
||||||
canCollapseDmSection = true;
|
|
||||||
# userBasedCategoryList = {
|
|
||||||
# "1202666382760607774" = [
|
|
||||||
# {
|
|
||||||
# id = "i9dflmraztc";
|
|
||||||
# name = "🏳️⚧️ girlfriends!!! :3 🏳️⚧️";
|
|
||||||
# color = 16359423;
|
|
||||||
# collapsed = false;
|
|
||||||
# channels = [
|
|
||||||
# "1436964273162289185"
|
|
||||||
# "1436988320474206311"
|
|
||||||
# "1449837047383855119"
|
|
||||||
# "1436965652861685891"
|
|
||||||
# "1436968495190642722"
|
|
||||||
# "1465424321919975454"
|
|
||||||
# "1468324280445046824"
|
|
||||||
# ];
|
|
||||||
# }
|
|
||||||
# {
|
|
||||||
# id = "p2v1f5y9zbd";
|
|
||||||
# name = "🦋 best frens <3 🦋";
|
|
||||||
# color = 10223511;
|
|
||||||
# collapsed = false;
|
|
||||||
# channels = [
|
|
||||||
# "1436985374286155799"
|
|
||||||
# "1436965657076826222"
|
|
||||||
# "1429921297160212681"
|
|
||||||
# "1394808379381387385"
|
|
||||||
# "1433593753183977545"
|
|
||||||
# "1438254055452446881"
|
|
||||||
# "1436966389549236376"
|
|
||||||
# "1202678007026819134"
|
|
||||||
# "1437151552224624660"
|
|
||||||
# "1441906462094921789"
|
|
||||||
# "1450340272079769712"
|
|
||||||
# "1458123717124165764"
|
|
||||||
# "1436975341129306155"
|
|
||||||
# "1461885176534794427"
|
|
||||||
# "1462155159470866443"
|
|
||||||
# "1468735915076878407"
|
|
||||||
# "1461929299727749145"
|
|
||||||
# "1470963392121536657"
|
|
||||||
# ];
|
|
||||||
# }
|
|
||||||
# {
|
|
||||||
# id = "c0mg5w635j8";
|
|
||||||
# name = "🏳️🌈 close frens x3 🏳️🌈";
|
|
||||||
# color = 10780927;
|
|
||||||
# collapsed = false;
|
|
||||||
# channels = [
|
|
||||||
# "1437077103873888290"
|
|
||||||
# "1436975346338762823"
|
|
||||||
# "1437123353101205590"
|
|
||||||
# "1441516692164575283"
|
|
||||||
# "1419557866502754334"
|
|
||||||
# "1436985041203892315"
|
|
||||||
# "1438071327515742229"
|
|
||||||
# ];
|
|
||||||
# }
|
|
||||||
# {
|
|
||||||
# id = "ghjrq5el3b";
|
|
||||||
# name = "frens :3";
|
|
||||||
# color = 7334399;
|
|
||||||
# collapsed = false;
|
|
||||||
# channels = [
|
|
||||||
# "1437007154132422701"
|
|
||||||
# "1437006448948416526"
|
|
||||||
# "1446781617422209068"
|
|
||||||
# "1444723474835837103"
|
|
||||||
# "1437098569483161721"
|
|
||||||
# "1437237573146771469"
|
|
||||||
# "1436973705421914123"
|
|
||||||
# "1437135359359320125"
|
|
||||||
# "1438010723837022343"
|
|
||||||
# "1440553969461104740"
|
|
||||||
# "1437097082887475201"
|
|
||||||
# "1447222320015085740"
|
|
||||||
# "1462624704027164824"
|
|
||||||
# "1449513783893692589"
|
|
||||||
# "1463737720961634461"
|
|
||||||
# "1463000874392748249"
|
|
||||||
# "1436984534712451105"
|
|
||||||
# "1436983282582683813"
|
|
||||||
# "1437283420312047659"
|
|
||||||
# "1437089201651847315"
|
|
||||||
# "1467307140443148288"
|
|
||||||
# ];
|
|
||||||
# }
|
|
||||||
# {
|
|
||||||
# id = "zbmj00xw7d8";
|
|
||||||
# name = "goop chats";
|
|
||||||
# color = 14876549;
|
|
||||||
# collapsed = false;
|
|
||||||
# channels = [
|
|
||||||
# "1437132769141719040"
|
|
||||||
# "1445549416516681902"
|
|
||||||
# "1458849972815663209"
|
|
||||||
# ];
|
|
||||||
# }
|
|
||||||
# ];
|
|
||||||
# };
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
programs = {
|
|
||||||
obs-studio = {
|
|
||||||
enable = true;
|
|
||||||
plugins = with pkgs.obs-studio-plugins; [
|
|
||||||
wlrobs
|
|
||||||
obs-backgroundremoval
|
|
||||||
obs-pipewire-audio-capture
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,32 +0,0 @@
|
||||||
{
|
|
||||||
inputs,
|
|
||||||
upkgs,
|
|
||||||
system,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
spicetifyPkgs = inputs.spicetify-nix.legacyPackages.${system};
|
|
||||||
in {
|
|
||||||
imports = [inputs.spicetify-nix.homeManagerModules.default];
|
|
||||||
programs.spicetify = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
enabledExtensions = with spicetifyPkgs.extensions; [
|
|
||||||
adblock
|
|
||||||
shuffle
|
|
||||||
keyboardShortcut
|
|
||||||
{
|
|
||||||
src =
|
|
||||||
(upkgs.fetchFromGitHub {
|
|
||||||
owner = "Spikerko";
|
|
||||||
repo = "spicy-lyrics";
|
|
||||||
rev = "568c83326aa6aba6ded28c95df6fcfb25cab3648";
|
|
||||||
hash = "sha256-lej93EDzGkmyrg5YMdPSqzrxlIfKsfaDBZosTvxoTNw=";
|
|
||||||
})
|
|
||||||
+ /builds;
|
|
||||||
name = "spicy-lyrics.mjs";
|
|
||||||
}
|
|
||||||
];
|
|
||||||
theme = spicetifyPkgs.themes.comfy;
|
|
||||||
colorScheme = "Sakura";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
||||||
{...}: {
|
|
||||||
programs.thunderbird = {
|
|
||||||
enable = true;
|
|
||||||
profiles = {
|
|
||||||
"me" = {
|
|
||||||
isDefault = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
{
|
|
||||||
inputs,
|
|
||||||
system,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
inherit (inputs) zen-browser;
|
|
||||||
in {
|
|
||||||
imports = [
|
|
||||||
zen-browser.homeModules.twilight
|
|
||||||
];
|
|
||||||
|
|
||||||
programs.zen-browser = {
|
|
||||||
enable = true;
|
|
||||||
package = zen-browser.packages.${system}.twilight;
|
|
||||||
# suppressXdgMigrationWarning = true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
15
homes/modules/bat.nix
Executable file
15
homes/modules/bat.nix
Executable file
|
|
@ -0,0 +1,15 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
# like `/bin/cat` but with syntax highlighting
|
||||||
|
# TODO: change the pager (maybe use Github:sachaos/viddy instead)
|
||||||
|
programs.bat = {
|
||||||
|
enable = true;
|
||||||
|
config = {
|
||||||
|
pager = "less -FR";
|
||||||
|
theme = "Dracula";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -16,7 +16,7 @@
|
||||||
|
|
||||||
# UI
|
# UI
|
||||||
background_update = true;
|
background_update = true;
|
||||||
update_ms = 100;
|
update_ms = 2000;
|
||||||
rounded_corners = false;
|
rounded_corners = false;
|
||||||
graph_symbol = "braille"; # braille/block/tty
|
graph_symbol = "braille"; # braille/block/tty
|
||||||
graph_symbol_cpu = "default";
|
graph_symbol_cpu = "default";
|
||||||
|
|
@ -1,109 +0,0 @@
|
||||||
let
|
|
||||||
# Module Meta Configuration
|
|
||||||
setShellAliases = true;
|
|
||||||
supportBash = true;
|
|
||||||
supportZsh = true;
|
|
||||||
supportFish = true;
|
|
||||||
in
|
|
||||||
{
|
|
||||||
osConfig,
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
username,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
inherit
|
|
||||||
(builtins)
|
|
||||||
elemAt
|
|
||||||
;
|
|
||||||
|
|
||||||
inherit
|
|
||||||
(lib)
|
|
||||||
flip
|
|
||||||
mkIf
|
|
||||||
optional
|
|
||||||
splitString
|
|
||||||
;
|
|
||||||
|
|
||||||
cfg = config.programs.bat;
|
|
||||||
|
|
||||||
# NOTE: `<derivation>.pname` can be used instead of `<derivation>.meta.mainProgram`
|
|
||||||
# NOTE: but then `pkgs.bash` would return `"bash-interactive"` which is annoying...
|
|
||||||
shellPkg = osConfig.users.users.${username}.shell;
|
|
||||||
shell = shellPkg.meta.mainProgram;
|
|
||||||
|
|
||||||
pager =
|
|
||||||
cfg.config.pager
|
|
||||||
|> splitString " "
|
|
||||||
|> flip elemAt 0;
|
|
||||||
in {
|
|
||||||
programs.bat = {
|
|
||||||
enable = true;
|
|
||||||
config = {
|
|
||||||
# WARNING: pager must be set for this module to function
|
|
||||||
# NOTE: not sure whether to use ov/moor/viddy as my pager?
|
|
||||||
pager = "less -FR";
|
|
||||||
# theme = "Dracula";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
home = {
|
|
||||||
shellAliases = mkIf setShellAliases {
|
|
||||||
bat = "prettybat";
|
|
||||||
cat = "prettybat";
|
|
||||||
diff = "batdiff";
|
|
||||||
brg = "batgrep";
|
|
||||||
man = "batman";
|
|
||||||
# watch = "batwatch"; # NOTE: using viddy instead atm
|
|
||||||
};
|
|
||||||
|
|
||||||
sessionVariables = {
|
|
||||||
PAGER = pager;
|
|
||||||
|
|
||||||
# REF: https://github.com/eth-p/bat-extras/blob/master/doc/batpipe.md
|
|
||||||
BATPIPE_ENABLE_COLOR = "true";
|
|
||||||
BATPIPE_INSIDE_LESS = "true";
|
|
||||||
BATPIPE_TERM_WIDTH = "-"; # hyphone -> auto detect
|
|
||||||
};
|
|
||||||
|
|
||||||
packages = with pkgs.bat-extras;
|
|
||||||
[
|
|
||||||
batdiff
|
|
||||||
batgrep
|
|
||||||
batman
|
|
||||||
batpipe
|
|
||||||
batwatch
|
|
||||||
prettybat
|
|
||||||
]
|
|
||||||
++ (with pkgs; [
|
|
||||||
bat
|
|
||||||
entr # required by pkgs.bat-extras.batwatch
|
|
||||||
ripgrep # required by pkgs.bat-extras.batgrep
|
|
||||||
delta # required by pkgs.bat-extras.batdiff
|
|
||||||
])
|
|
||||||
++ optional (pkgs?${pager}) pkgs.${pager};
|
|
||||||
};
|
|
||||||
|
|
||||||
# Configure the user's shell to source batpipe
|
|
||||||
# WARNING: only currently supports bash, zsh, & fish
|
|
||||||
programs = {
|
|
||||||
bash = mkIf (supportBash || shell == "bash") {
|
|
||||||
initExtra = ''
|
|
||||||
eval "$(batpipe)"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
zsh = mkIf (supportZsh || shell == "zsh") {
|
|
||||||
initContent = ''
|
|
||||||
eval "$(batpipe)"
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
|
|
||||||
fish = mkIf (supportFish || shell == "fish") {
|
|
||||||
interactiveShellInit = ''
|
|
||||||
eval (batpipe)
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
{...}: {
|
|
||||||
programs.hyfetch = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
backend = "neofetch";
|
|
||||||
args = null;
|
|
||||||
distro = null;
|
|
||||||
|
|
||||||
preset = "transfeminine"; # "nonbinary";
|
|
||||||
pride_month_disable = false;
|
|
||||||
custom_ascii_path = null;
|
|
||||||
|
|
||||||
mode = "rgb";
|
|
||||||
light_dark = "dark";
|
|
||||||
auto_detect_light_dark = true;
|
|
||||||
lightness = 0.65;
|
|
||||||
color_align = {
|
|
||||||
mode = "horizontal";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
{...}: {
|
|
||||||
programs.tmux = {
|
|
||||||
enable = true;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,59 +0,0 @@
|
||||||
{
|
|
||||||
lib,
|
|
||||||
hostname,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
dracula = rec {
|
|
||||||
background = "#282A36";
|
|
||||||
border = cyan;
|
|
||||||
|
|
||||||
cyan = "#8BE9FD";
|
|
||||||
yellow = "#F1FA8C";
|
|
||||||
red = "#FF5555";
|
|
||||||
};
|
|
||||||
|
|
||||||
theme = dracula;
|
|
||||||
in {
|
|
||||||
# notification daemon for Wayland
|
|
||||||
services.mako = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
actions = true;
|
|
||||||
output = lib.optionalString (hostname == "myputer") "DP-2";
|
|
||||||
anchor = "top-right";
|
|
||||||
layer = "overlay";
|
|
||||||
sort = "-time";
|
|
||||||
|
|
||||||
height = 100;
|
|
||||||
width = 300;
|
|
||||||
margin = 50;
|
|
||||||
background-color = theme.background;
|
|
||||||
border-color = theme.border;
|
|
||||||
border-radius = 20;
|
|
||||||
border-size = 4;
|
|
||||||
font = "monospace 10";
|
|
||||||
|
|
||||||
markup = true;
|
|
||||||
icons = true;
|
|
||||||
max-icon-size = 64;
|
|
||||||
|
|
||||||
default-timeout = 5000;
|
|
||||||
ignore-timeout = false;
|
|
||||||
|
|
||||||
"actionable=true" = {
|
|
||||||
anchor = "top-right";
|
|
||||||
};
|
|
||||||
|
|
||||||
"urgency=low" = {
|
|
||||||
border-color = theme.border;
|
|
||||||
};
|
|
||||||
"urgency=normal" = {
|
|
||||||
border-color = theme.yellow;
|
|
||||||
};
|
|
||||||
"urgency=high" = {
|
|
||||||
default-timeout = 0;
|
|
||||||
border-color = theme.red;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,19 +0,0 @@
|
||||||
@define-color colorbg #26233a;
|
|
||||||
@define-color colorfg #eb6f92;
|
|
||||||
|
|
||||||
@define-color color00 #26233a; /* black (Overlay) */
|
|
||||||
@define-color color01 #eb6f92; /* red (Love) */
|
|
||||||
@define-color color02 #9ccfd8; /* green (Foam) */
|
|
||||||
@define-color color03 #f6c177; /* yellow (Gold) */
|
|
||||||
@define-color color04 #31748f; /* blue (Pine) */
|
|
||||||
@define-color color05 #c4a7e7; /* magenta (Iris) */
|
|
||||||
@define-color color06 #ebbcba; /* cyan (Rose) */
|
|
||||||
@define-color color07 #e0def4; /* white (Text) */
|
|
||||||
@define-color color08 #47435d; /* bright black (lighter Overlay) */
|
|
||||||
@define-color color09 #ff98ba; /* bright red (lighter Love) */
|
|
||||||
@define-color color10 #c5f9ff; /* bright green (lighter Foam) */
|
|
||||||
@define-color color11 #ffeb9e; /* bright yellow (lighter Gold) */
|
|
||||||
@define-color color12 #5b9ab7; /* bright blue (lighter Pine) */
|
|
||||||
@define-color color13 #eed0ff; /* bright magenta (lighter Iris) */
|
|
||||||
@define-color color14 #ffe5e3; /* bright cyan (lighter Rose) */
|
|
||||||
@define-color color15 #fefcff; /* bright white (lighter Text) */
|
|
||||||
|
|
@ -1,91 +0,0 @@
|
||||||
{...}: {
|
|
||||||
programs.waybar = {
|
|
||||||
enable = true;
|
|
||||||
settings = {
|
|
||||||
mainBar = {
|
|
||||||
layer = "top";
|
|
||||||
position = "top";
|
|
||||||
height = 30;
|
|
||||||
|
|
||||||
modules-left = ["hyprland/workspaces"];
|
|
||||||
modules-center = ["clock"];
|
|
||||||
modules-right = ["cpu" "memory" "network" "pulseaudio" "privacy" "tray"];
|
|
||||||
|
|
||||||
# left
|
|
||||||
"hyprland/workspaces" = {
|
|
||||||
format = "{id}";
|
|
||||||
};
|
|
||||||
"ext/workspaces" = {
|
|
||||||
# not enabled yet, hyprland and mango need two different configs ;-;
|
|
||||||
format = "{id}";
|
|
||||||
ignore-hidden = true;
|
|
||||||
on-click = "activate";
|
|
||||||
};
|
|
||||||
|
|
||||||
# center
|
|
||||||
"clock" = {
|
|
||||||
format = "{:%b %a | %d %r}";
|
|
||||||
interval = 1;
|
|
||||||
tooltip = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
# right
|
|
||||||
"cpu" = {
|
|
||||||
format = " {usage}%";
|
|
||||||
interval = 1;
|
|
||||||
};
|
|
||||||
"memory" = {
|
|
||||||
format = " {used:0.1f} / {total:0.1f} GiB";
|
|
||||||
interval = 1;
|
|
||||||
};
|
|
||||||
"network" = {
|
|
||||||
format = "{bandwidthUpBits} {bandwidthDownBits} {ifname}";
|
|
||||||
format-wifi = " {bandwidthUpBits} {bandwidthDownBits} {ifname}";
|
|
||||||
format-ethernet = " {bandwidthUpBits} {bandwidthDownBits} {ifname}";
|
|
||||||
format-disconnected = "no internet ~ rawr! ~ ;w;"; # empty format hides module
|
|
||||||
interval = 1;
|
|
||||||
max-length = 32;
|
|
||||||
};
|
|
||||||
"pulseaudio" = {
|
|
||||||
format = "{icon} {volume}%";
|
|
||||||
format-muted = " {volume}%";
|
|
||||||
format-icons = {
|
|
||||||
default = [
|
|
||||||
""
|
|
||||||
""
|
|
||||||
""
|
|
||||||
];
|
|
||||||
};
|
|
||||||
"scroll-step" = 5;
|
|
||||||
};
|
|
||||||
"privacy" = {
|
|
||||||
icon-size = 12;
|
|
||||||
icon-spacing = 5;
|
|
||||||
transition-duration = 200;
|
|
||||||
modules = [
|
|
||||||
{
|
|
||||||
type = "screenshare";
|
|
||||||
tooltip = true;
|
|
||||||
tooltip-icon-size = 12;
|
|
||||||
}
|
|
||||||
{
|
|
||||||
type = "audio-in";
|
|
||||||
tooltip = true;
|
|
||||||
tooltip-icon-size = 12;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
"tray" = {
|
|
||||||
icon-size = 12;
|
|
||||||
spacing = 10;
|
|
||||||
# fixes spotify not showing up when "close button should minimize the Spotify window" is false
|
|
||||||
show-passive-items = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
style =
|
|
||||||
builtins.readFile ./colors.css
|
|
||||||
+ builtins.readFile ./style.css;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,165 +0,0 @@
|
||||||
* {
|
|
||||||
border: none;
|
|
||||||
border-radius: 0;
|
|
||||||
font-family: 'GeistMono Nerd Font';
|
|
||||||
font-size: 15px;
|
|
||||||
font-weight: bold;
|
|
||||||
min-height: 10px;
|
|
||||||
}
|
|
||||||
window#waybar {
|
|
||||||
background: rgba(0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
adds a margin around the edge of the taskbar, surrounding the modules,
|
|
||||||
spacing it out from the edge of the screen and windows below
|
|
||||||
*/
|
|
||||||
window#waybar > box {
|
|
||||||
margin: 0px 12px;
|
|
||||||
}
|
|
||||||
|
|
||||||
tooltip {
|
|
||||||
background: @colorbg;
|
|
||||||
color: @colorfg;
|
|
||||||
opacity: 0.9;
|
|
||||||
padding: 4px;
|
|
||||||
border-radius: 12px;
|
|
||||||
border: 1px solid @color01;
|
|
||||||
}
|
|
||||||
tooltip label {
|
|
||||||
background: rgba(0, 0, 0, 0);
|
|
||||||
color: @colorfg;
|
|
||||||
}
|
|
||||||
|
|
||||||
#clock,
|
|
||||||
#memory,
|
|
||||||
#network,
|
|
||||||
#workspaces,
|
|
||||||
#taskbar,
|
|
||||||
#cpu,
|
|
||||||
#pulseaudio,
|
|
||||||
#privacy,
|
|
||||||
#tray,
|
|
||||||
#custom-media {
|
|
||||||
background: @colorbg;
|
|
||||||
color: @colorfg;
|
|
||||||
opacity: 0.9;
|
|
||||||
padding: 4px 16px;
|
|
||||||
border-radius: 32px;
|
|
||||||
border: 1px solid @color01;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
left-side modules
|
|
||||||
*/
|
|
||||||
#workspaces,
|
|
||||||
#taskbar,
|
|
||||||
#custom-media {
|
|
||||||
margin: 4px 4px 4px 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
center modules
|
|
||||||
*/
|
|
||||||
#clock {
|
|
||||||
margin: 4px 0px 4px 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
right-side modules
|
|
||||||
*/
|
|
||||||
#memory,
|
|
||||||
#network,
|
|
||||||
#cpu,
|
|
||||||
#pulseaudio,
|
|
||||||
#tray,
|
|
||||||
#privacy {
|
|
||||||
margin: 4px 0px 4px 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces,
|
|
||||||
#taskbar {
|
|
||||||
padding: 0px;
|
|
||||||
}
|
|
||||||
|
|
||||||
#taskbar.empty {
|
|
||||||
opacity: 0;
|
|
||||||
padding: 0px;
|
|
||||||
margin: 0px;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
#tray.empty {
|
|
||||||
opacity: 0;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
border: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
connects the workspace and taskbar together :3
|
|
||||||
*/
|
|
||||||
/*
|
|
||||||
#workspaces {
|
|
||||||
margin: 4px 0px 4px 12px;
|
|
||||||
padding: 0px 8px 0px 0px;
|
|
||||||
border-radius: 100px 0px 0px 100px;
|
|
||||||
border-width: 1px 0px 1px 1px;
|
|
||||||
}
|
|
||||||
#taskbar {
|
|
||||||
margin: 4px 0px 4px 0px;
|
|
||||||
padding: 0px 0px 0px 8px;
|
|
||||||
border-radius: 0px 100px 100px 0px;
|
|
||||||
}
|
|
||||||
*/
|
|
||||||
|
|
||||||
#cpu {
|
|
||||||
margin: 4px 0 4px 0;
|
|
||||||
border-radius: 32px 0px 0px 32px;
|
|
||||||
}
|
|
||||||
#memory {
|
|
||||||
margin: 4px 0 4px 0;
|
|
||||||
border-radius: 0px;
|
|
||||||
border-width: 1px 0px 1px 0px;
|
|
||||||
}
|
|
||||||
#network {
|
|
||||||
margin: 4px 0 4px 0;
|
|
||||||
border-radius: 0px 32px 32px 0px;
|
|
||||||
min-width: 100px; /* surely there's a better way to fix the size? */
|
|
||||||
}
|
|
||||||
|
|
||||||
#workspaces button {
|
|
||||||
padding: 2px 4px;
|
|
||||||
border-radius: 32px;
|
|
||||||
color: @colorfg;
|
|
||||||
}
|
|
||||||
#workspaces button:hover {
|
|
||||||
background: @colorfg;
|
|
||||||
color: @colorbg;
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
#workspaces button.active {
|
|
||||||
background: @colorfg;
|
|
||||||
color: @colorbg;
|
|
||||||
}
|
|
||||||
|
|
||||||
#taskbar button {
|
|
||||||
padding: 2px 4px;
|
|
||||||
border-radius: 32px;
|
|
||||||
color: @colorfg;
|
|
||||||
}
|
|
||||||
#taskbar button:hover {
|
|
||||||
background: @colorfg;
|
|
||||||
color: @colorbg;
|
|
||||||
opacity: 0.8;
|
|
||||||
}
|
|
||||||
#taskbar button.active {
|
|
||||||
background: @colorfg;
|
|
||||||
color: @colorbg;
|
|
||||||
}
|
|
||||||
/*
|
|
||||||
icons in each button on the taskbar to correct
|
|
||||||
for them not being properly centred sometimes :3
|
|
||||||
*/
|
|
||||||
#taskbar button box image {
|
|
||||||
padding-left: 2px;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,69 +1,13 @@
|
||||||
{
|
{
|
||||||
|
config,
|
||||||
pkgs,
|
pkgs,
|
||||||
# upkgs,
|
|
||||||
...
|
...
|
||||||
}: let
|
}: {
|
||||||
lsps = {
|
# read https://docs.helix-editor.com/editor.html
|
||||||
bash-language-server = {
|
|
||||||
pkg = pkgs.bash-language-server;
|
|
||||||
cmd = "bash-language-server";
|
|
||||||
};
|
|
||||||
|
|
||||||
clangd = {
|
|
||||||
pkg = pkgs.clang-tools;
|
|
||||||
cmd = "clangd";
|
|
||||||
};
|
|
||||||
|
|
||||||
glsl_analyzer = {
|
|
||||||
pkg = pkgs.glsl_analyzer;
|
|
||||||
cmd = "glsl_analyzer";
|
|
||||||
};
|
|
||||||
|
|
||||||
haskell-language-server = {
|
|
||||||
pkg = pkgs.haskell-language-server;
|
|
||||||
cmd = "haskell-language-server-wrapper";
|
|
||||||
};
|
|
||||||
|
|
||||||
# TODO: once upgraded past Nix-24.07 this line won't be necessary (I think)
|
|
||||||
# helix will support nixd by default
|
|
||||||
# SOURCE: https://github.com/nix-community/nixd/blob/main/nixd/docs/editor-setup.md#Helix
|
|
||||||
nixd = {
|
|
||||||
pkg = pkgs.nixd;
|
|
||||||
cmd = "nixd";
|
|
||||||
};
|
|
||||||
|
|
||||||
OmniSharp = {
|
|
||||||
pkg = pkgs.omnisharp-roslyn;
|
|
||||||
cmd = "OmniSharp";
|
|
||||||
};
|
|
||||||
|
|
||||||
rust-analyzer = {
|
|
||||||
pkg = pkgs.rust-analyzer;
|
|
||||||
cmd = "rust-analyzer";
|
|
||||||
};
|
|
||||||
|
|
||||||
ty = {
|
|
||||||
pkg = pkgs.ty; # DEBUG: upkgs.ty;
|
|
||||||
cmd = "ty";
|
|
||||||
};
|
|
||||||
|
|
||||||
typescript-language-server = {
|
|
||||||
pkg = pkgs.typescript-language-server;
|
|
||||||
cmd = "typescript-language-server";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
home.packages =
|
|
||||||
lsps
|
|
||||||
|> builtins.attrValues
|
|
||||||
|> map (lsp: lsp.pkg);
|
|
||||||
|
|
||||||
# REF: https://docs.helix-editor.com/editor.html
|
|
||||||
programs.helix = {
|
programs.helix = {
|
||||||
enable = true;
|
enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
theme = "dracula";
|
theme = "dracula";
|
||||||
|
|
||||||
editor = {
|
editor = {
|
||||||
line-number = "absolute";
|
line-number = "absolute";
|
||||||
popup-border = "all";
|
popup-border = "all";
|
||||||
|
|
@ -132,7 +76,7 @@ in {
|
||||||
hidden = true; # show hidden files
|
hidden = true; # show hidden files
|
||||||
follow-symlinks = true;
|
follow-symlinks = true;
|
||||||
deduplicate-links = true;
|
deduplicate-links = true;
|
||||||
git-ignore = true; # dont read .gitignore files
|
git-ignore = false; # dont read .gitignore files
|
||||||
ignore = true; # use .ignore for helix instead of .gitignore
|
ignore = true; # use .ignore for helix instead of .gitignore
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
@ -163,107 +107,29 @@ in {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
languages = {
|
languages.language = [
|
||||||
language = [
|
{
|
||||||
{
|
name = "nix";
|
||||||
name = "nix";
|
indent = {
|
||||||
indent = {
|
tab-width = 2;
|
||||||
tab-width = 2;
|
unit = " ";
|
||||||
unit = " ";
|
};
|
||||||
};
|
block-comment-tokens = {
|
||||||
block-comment-tokens = {
|
start = "/*";
|
||||||
start = "/*";
|
end = "*/";
|
||||||
end = "*/";
|
};
|
||||||
};
|
auto-format = true;
|
||||||
auto-format = true;
|
formatter.command = "${pkgs.alejandra}/bin/alejandra";
|
||||||
formatter.command = "${pkgs.alejandra}/bin/alejandra";
|
}
|
||||||
language-servers = ["nixd"];
|
{
|
||||||
}
|
name = "python";
|
||||||
{
|
indent = {
|
||||||
name = "python";
|
tab-width = 4;
|
||||||
indent = {
|
unit = " ";
|
||||||
tab-width = 4;
|
};
|
||||||
unit = " ";
|
auto-format = false; # my python is beautiful ^_^
|
||||||
};
|
rulers = [80];
|
||||||
auto-format = false; # my python is beautiful ^_^
|
}
|
||||||
rulers = [80];
|
];
|
||||||
language-servers = ["ty"];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "c";
|
|
||||||
file-types = ["c" "h"]; # use .hpp for C++
|
|
||||||
auto-format = true;
|
|
||||||
formatter.command = "${pkgs.clang-tools}/bin/clang-format";
|
|
||||||
language-servers = ["clangd"];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "cpp";
|
|
||||||
file-types = ["cc" "hh" "cpp" "hpp" "cxx" "hxx"];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "haskell";
|
|
||||||
auto-format = true;
|
|
||||||
formatter.command = "${pkgs.ormolu}/bin/ormolu";
|
|
||||||
language-servers = ["haskell-language-server"];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "rust";
|
|
||||||
indent = {
|
|
||||||
tab-width = 2;
|
|
||||||
unit = " ";
|
|
||||||
};
|
|
||||||
auto-format = true;
|
|
||||||
formatter.command = "${pkgs.rustfmt}/bin/rustfmt";
|
|
||||||
language-servers = ["rust-analyzer"];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "c-sharp";
|
|
||||||
file-types = ["cs"];
|
|
||||||
indent = {
|
|
||||||
tab-width = 4;
|
|
||||||
unit = " ";
|
|
||||||
};
|
|
||||||
block-comment-tokens = {
|
|
||||||
start = "/*";
|
|
||||||
end = "*/";
|
|
||||||
};
|
|
||||||
# auto-format = true;
|
|
||||||
# formatter.command = "${pkgs.omnisharp-roslyn}/bin/OmniSharp";
|
|
||||||
# language-servers = ["OmniSharp"];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "javascript";
|
|
||||||
file-types = ["js"];
|
|
||||||
indent = {
|
|
||||||
tab-width = 2;
|
|
||||||
unit = " ";
|
|
||||||
};
|
|
||||||
block-comment-tokens = {
|
|
||||||
start = "/*";
|
|
||||||
end = "*/";
|
|
||||||
};
|
|
||||||
auto-format = true;
|
|
||||||
language-servers = ["typescript-language-server"];
|
|
||||||
}
|
|
||||||
{
|
|
||||||
name = "glsl";
|
|
||||||
file-types = ["glsl"];
|
|
||||||
indent = {
|
|
||||||
tab-width = 2;
|
|
||||||
unit = " ";
|
|
||||||
};
|
|
||||||
block-comment-tokens = {
|
|
||||||
start = "/*";
|
|
||||||
end = "*/";
|
|
||||||
};
|
|
||||||
auto-format = false;
|
|
||||||
language-servers = ["glsl_analyzer"];
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
language-server =
|
|
||||||
lsps
|
|
||||||
|> builtins.mapAttrs (_: lsp: {command = "${lsp.pkg}/bin/${lsp.cmd}";});
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1,236 +0,0 @@
|
||||||
# TODO: look into changing to this:
|
|
||||||
# https://github.com/BirdeeHub/nix-wrapper-modules
|
|
||||||
{
|
|
||||||
inputs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
inherit
|
|
||||||
(inputs.nixcats)
|
|
||||||
utils
|
|
||||||
;
|
|
||||||
in {
|
|
||||||
imports = [
|
|
||||||
inputs.nixcats.homeModule
|
|
||||||
];
|
|
||||||
|
|
||||||
nixCats = {
|
|
||||||
enable = true;
|
|
||||||
nixpkgs_version = inputs.nixpkgs-unstable;
|
|
||||||
addOverlays =
|
|
||||||
[
|
|
||||||
(utils.standardPluginOverlay inputs)
|
|
||||||
]
|
|
||||||
++ lib.optional (builtins.pathExists ./overlays.nix) ./overlays.nix;
|
|
||||||
|
|
||||||
# see the packageDefinitions below.
|
|
||||||
# This says which of those to install.
|
|
||||||
packageNames = ["cryvim"];
|
|
||||||
|
|
||||||
luaPath = ./.;
|
|
||||||
|
|
||||||
# NOTE: the .replace vs .merge options are for modules based on existing configurations,
|
|
||||||
# NOTE: they refer to how multiple categoryDefinitions get merged together by the module.
|
|
||||||
# NOTE: for useage of this section, refer to :h nixCats.flake.outputs.categories
|
|
||||||
categoryDefinitions.replace = {
|
|
||||||
pkgs,
|
|
||||||
settings,
|
|
||||||
categories,
|
|
||||||
extra,
|
|
||||||
name,
|
|
||||||
mkNvimPlugin,
|
|
||||||
...
|
|
||||||
} @ packageDef: {
|
|
||||||
lspsAndRuntimeDeps = with pkgs; {
|
|
||||||
general = [
|
|
||||||
ripgrep
|
|
||||||
fd
|
|
||||||
];
|
|
||||||
treesitter = [
|
|
||||||
tree-sitter
|
|
||||||
];
|
|
||||||
lang = {
|
|
||||||
lua = [
|
|
||||||
lua-language-server
|
|
||||||
stylua
|
|
||||||
];
|
|
||||||
nix = [
|
|
||||||
nil
|
|
||||||
nix-doc # TODO: i forgot what this is for
|
|
||||||
nixfmt
|
|
||||||
];
|
|
||||||
rust = [
|
|
||||||
rust-analyzer
|
|
||||||
rustfmt
|
|
||||||
];
|
|
||||||
zig = [
|
|
||||||
zls
|
|
||||||
];
|
|
||||||
elixir = [
|
|
||||||
elixir-ls
|
|
||||||
];
|
|
||||||
gleam = [
|
|
||||||
gleam
|
|
||||||
];
|
|
||||||
haskell = [
|
|
||||||
haskell-language-server
|
|
||||||
ormolu
|
|
||||||
];
|
|
||||||
java = [
|
|
||||||
jdt-language-server
|
|
||||||
javaPackages.compiler.openjdk17
|
|
||||||
javaPackages.compiler.openjdk21
|
|
||||||
];
|
|
||||||
protobuf = [
|
|
||||||
protols
|
|
||||||
buf
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
startupPlugins = with pkgs.vimPlugins; {
|
|
||||||
general = [
|
|
||||||
lze
|
|
||||||
plenary-nvim
|
|
||||||
nvim-notify
|
|
||||||
nvim-web-devicons
|
|
||||||
base16-nvim
|
|
||||||
mini-nvim
|
|
||||||
];
|
|
||||||
treesitter = [
|
|
||||||
nvim-treesitter-textobjects
|
|
||||||
nvim-treesitter.withAllGrammars
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
optionalPlugins = with pkgs.vimPlugins; {
|
|
||||||
general = [
|
|
||||||
];
|
|
||||||
ui = [
|
|
||||||
dressing-nvim
|
|
||||||
];
|
|
||||||
qol = [
|
|
||||||
undotree
|
|
||||||
mini-hipatterns
|
|
||||||
];
|
|
||||||
telescope = [
|
|
||||||
telescope-nvim
|
|
||||||
telescope-fzf-native-nvim
|
|
||||||
telescope-ui-select-nvim
|
|
||||||
];
|
|
||||||
fyler = [
|
|
||||||
fyler-nvim
|
|
||||||
];
|
|
||||||
lsp = [
|
|
||||||
nvim-lspconfig
|
|
||||||
];
|
|
||||||
completion = [
|
|
||||||
blink-cmp
|
|
||||||
nvim-cmp
|
|
||||||
luasnip
|
|
||||||
friendly-snippets
|
|
||||||
cmp_luasnip
|
|
||||||
cmp-buffer
|
|
||||||
cmp-path
|
|
||||||
cmp-nvim-lua
|
|
||||||
cmp-nvim-lsp
|
|
||||||
cmp-cmdline
|
|
||||||
cmp-nvim-lsp-signature-help
|
|
||||||
cmp-cmdline-history
|
|
||||||
lspkind-nvim
|
|
||||||
];
|
|
||||||
format = [
|
|
||||||
conform-nvim
|
|
||||||
];
|
|
||||||
comment = [
|
|
||||||
comment-nvim
|
|
||||||
];
|
|
||||||
lang = {
|
|
||||||
java = [
|
|
||||||
nvim-jdtls
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# shared libraries to be added to nvim runtime's LD_LIBRARY_PATH
|
|
||||||
sharedLibraries = {
|
|
||||||
general = with pkgs; [
|
|
||||||
# libgit2
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
environmentVariables = {
|
|
||||||
lang = {
|
|
||||||
rust.lsp = {
|
|
||||||
# it literally won't see the rust-analyzer provided to it
|
|
||||||
RUST_ANALYZER_CMD = "${pkgs.rust-analyzer}/bin/rust-analyzer";
|
|
||||||
};
|
|
||||||
elixir.lsp = {
|
|
||||||
ELIXIR_LS_CMD = "${pkgs.elixir-ls}/scripts/language_server.sh";
|
|
||||||
};
|
|
||||||
java.lsp = {
|
|
||||||
JAVA_HOME = "${pkgs.javaPackages.compiler.openjdk17}";
|
|
||||||
OPENJDK_17 = "${pkgs.javaPackages.compiler.openjdk17}";
|
|
||||||
OPENJDK_21 = "${pkgs.javaPackages.compiler.openjdk21}";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
extraWrapperArgs = {};
|
|
||||||
# lists of the functions you would have passed to
|
|
||||||
# python.withPackages or lua.withPackages
|
|
||||||
|
|
||||||
# get the path to this python environment
|
|
||||||
# in your lua config via
|
|
||||||
# vim.g.python3_host_prog
|
|
||||||
# or run from nvim terminal via :!<packagename>-python3
|
|
||||||
extraPython3Packages = {};
|
|
||||||
# populates $LUA_PATH and $LUA_CPATH
|
|
||||||
extraLuaPackages = {};
|
|
||||||
};
|
|
||||||
|
|
||||||
# REF: :help nixCats.flake.outputs.packageDefinitions
|
|
||||||
packageDefinitions.replace = {
|
|
||||||
# these are the names of your packages
|
|
||||||
# you can include as many as you wish.
|
|
||||||
cryvim = {pkgs, ...}: {
|
|
||||||
# they contain a settings set defined above
|
|
||||||
# REF: :help nixCats.flake.outputs.settings
|
|
||||||
settings = {
|
|
||||||
wrapRc = true;
|
|
||||||
aliases = [
|
|
||||||
"ce"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
# and a set of categories that you want
|
|
||||||
# (and other information to pass to lua)
|
|
||||||
categories = {
|
|
||||||
general = true;
|
|
||||||
|
|
||||||
ui = true;
|
|
||||||
qol = true;
|
|
||||||
telescope = true;
|
|
||||||
fyler = true;
|
|
||||||
lsp = true;
|
|
||||||
completion = true;
|
|
||||||
treesitter = true;
|
|
||||||
format = true;
|
|
||||||
comment = true;
|
|
||||||
|
|
||||||
lang = {
|
|
||||||
lua = true;
|
|
||||||
nix = true;
|
|
||||||
rust = true;
|
|
||||||
zig = true;
|
|
||||||
elixir = true;
|
|
||||||
gleam = true;
|
|
||||||
haskell = true;
|
|
||||||
java = true;
|
|
||||||
protobuf = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
vim.g.mapleader = " "
|
|
||||||
|
|
||||||
vim.opt.termguicolors = true -- use terminal colors
|
|
||||||
vim.opt.relativenumber = true
|
|
||||||
vim.opt.wrap = false
|
|
||||||
vim.opt.colorcolumn = "80"
|
|
||||||
|
|
||||||
require("plugins")
|
|
||||||
require("lsp")
|
|
||||||
|
|
@ -1,66 +0,0 @@
|
||||||
local M = {}
|
|
||||||
|
|
||||||
function M.on_attach(_, bufnr)
|
|
||||||
-- we create a function that lets us more easily define mappings specific
|
|
||||||
-- for LSP related items. It sets the mode, buffer and description for us each time.
|
|
||||||
|
|
||||||
local nmap = function(keys, func, desc)
|
|
||||||
if desc then
|
|
||||||
desc = "LSP: " .. desc
|
|
||||||
end
|
|
||||||
|
|
||||||
vim.keymap.set("n", keys, func, { buffer = bufnr, desc = desc })
|
|
||||||
end
|
|
||||||
|
|
||||||
nmap("<leader>rn", vim.lsp.buf.rename, "[R]e[n]ame")
|
|
||||||
nmap("<leader>ca", vim.lsp.buf.code_action, "[C]ode [A]ction")
|
|
||||||
|
|
||||||
nmap("gd", vim.lsp.buf.definition, "[G]oto [D]efinition")
|
|
||||||
|
|
||||||
-- NOTE: why are these functions that call the telescope builtin?
|
|
||||||
-- because otherwise they would load telescope eagerly when this is defined.
|
|
||||||
-- due to us using the on_require handler to make sure it is available.
|
|
||||||
if nixCats("general.telescope") then
|
|
||||||
nmap("gr", function()
|
|
||||||
require("telescope.builtin").lsp_references()
|
|
||||||
end, "[G]oto [R]eferences")
|
|
||||||
nmap("gI", function()
|
|
||||||
require("telescope.builtin").lsp_implementations()
|
|
||||||
end, "[G]oto [I]mplementation")
|
|
||||||
nmap("<leader>ds", function()
|
|
||||||
require("telescope.builtin").lsp_document_symbols()
|
|
||||||
end, "[D]ocument [S]ymbols")
|
|
||||||
nmap("<leader>ws", function()
|
|
||||||
require("telescope.builtin").lsp_dynamic_workspace_symbols()
|
|
||||||
end, "[W]orkspace [S]ymbols")
|
|
||||||
nmap("<leader>dd", "<cmd>Telescope diagnostics bufnr=0<CR>", "[D]ocument [D]iagnostics")
|
|
||||||
nmap("<leader>wd", "<cmd>Telescope diagnostics<CR>", "[W]orkspace [D]iagnostics")
|
|
||||||
end -- TODO: someone who knows the builtin versions of these to do instead help me out please.
|
|
||||||
|
|
||||||
nmap("<leader>D", vim.lsp.buf.type_definition, "Type [D]efinition")
|
|
||||||
nmap("<leader>e", vim.diagnostic.open_float, "Show [E]rror")
|
|
||||||
|
|
||||||
-- See `:help K` for why this keymap
|
|
||||||
nmap("K", vim.lsp.buf.hover, "Hover Documentation")
|
|
||||||
nmap("<C-k>", vim.lsp.buf.signature_help, "Signature Documentation")
|
|
||||||
|
|
||||||
-- Lesser used LSP functionality
|
|
||||||
nmap("gD", vim.lsp.buf.declaration, "[G]oto [D]eclaration")
|
|
||||||
nmap("<leader>wa", vim.lsp.buf.add_workspace_folder, "[W]orkspace [A]dd Folder")
|
|
||||||
nmap("<leader>wr", vim.lsp.buf.remove_workspace_folder, "[W]orkspace [R]emove Folder")
|
|
||||||
nmap("<leader>wl", function()
|
|
||||||
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
|
|
||||||
end, "[W]orkspace [L]ist Folders")
|
|
||||||
|
|
||||||
-- Create a command `:Format` local to the LSP buffer
|
|
||||||
vim.api.nvim_buf_create_user_command(bufnr, "Format", function(_)
|
|
||||||
vim.lsp.buf.format()
|
|
||||||
end, { desc = "Format current buffer with LSP" })
|
|
||||||
end
|
|
||||||
|
|
||||||
function M.get(server_name)
|
|
||||||
local capabilities = require("blink.cmp").get_lsp_capabilities()
|
|
||||||
|
|
||||||
return capabilities
|
|
||||||
end
|
|
||||||
return M
|
|
||||||
|
|
@ -1,103 +0,0 @@
|
||||||
return {
|
|
||||||
{
|
|
||||||
"friendly-snippets",
|
|
||||||
dep_of = { "blink.cmp" },
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"blink.cmp",
|
|
||||||
event = { "InsertEnter", "CmdlineEnter" },
|
|
||||||
on_require = "blink",
|
|
||||||
load = function(name)
|
|
||||||
vim.cmd.packadd(name)
|
|
||||||
end,
|
|
||||||
after = function(plugin)
|
|
||||||
local blink = require("blink.cmp")
|
|
||||||
|
|
||||||
blink.setup({
|
|
||||||
keymap = {
|
|
||||||
["<C-space>"] = { "show", "show_documentation", "hide_documentation" },
|
|
||||||
["<C-e>"] = { "hide", "fallback" },
|
|
||||||
["<C-y>"] = { "select_and_accept", "fallback" },
|
|
||||||
|
|
||||||
["<C-k>"] = { "select_prev", "fallback_to_mappings" },
|
|
||||||
["<C-j>"] = { "select_next", "fallback_to_mappings" },
|
|
||||||
["<Up>"] = { "select_prev", "fallback" },
|
|
||||||
["<Down>"] = { "select_next", "fallback" },
|
|
||||||
|
|
||||||
["<C-b>"] = { "scroll_documentation_up", "fallback" },
|
|
||||||
["<C-f>"] = { "scroll_documentation_down", "fallback" },
|
|
||||||
|
|
||||||
["<Tab>"] = { "snippet_forward", "fallback" },
|
|
||||||
["<S-Tab>"] = { "snippet_backward", "fallback" },
|
|
||||||
|
|
||||||
["<C-S-k>"] = { "show_signature", "hide_signature", "fallback" },
|
|
||||||
},
|
|
||||||
|
|
||||||
appearance = {
|
|
||||||
nerd_font_variant = "mono",
|
|
||||||
},
|
|
||||||
|
|
||||||
sources = {
|
|
||||||
default = { "lsp", "path", "snippets", "buffer" },
|
|
||||||
providers = {
|
|
||||||
lsp = {
|
|
||||||
name = "LSP",
|
|
||||||
module = "blink.cmp.sources.lsp",
|
|
||||||
enabled = true,
|
|
||||||
},
|
|
||||||
path = {
|
|
||||||
name = "Path",
|
|
||||||
module = "blink.cmp.sources.path",
|
|
||||||
enabled = true,
|
|
||||||
},
|
|
||||||
snippets = {
|
|
||||||
name = "Snippets",
|
|
||||||
module = "blink.cmp.sources.snippets",
|
|
||||||
enabled = true,
|
|
||||||
},
|
|
||||||
buffer = {
|
|
||||||
name = "Buffer",
|
|
||||||
module = "blink.cmp.sources.buffer",
|
|
||||||
enabled = true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
completion = {
|
|
||||||
accept = {
|
|
||||||
auto_brackets = {
|
|
||||||
enabled = true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
menu = {
|
|
||||||
border = "rounded",
|
|
||||||
max_height = 12,
|
|
||||||
scrolloff = 2,
|
|
||||||
|
|
||||||
draw = {
|
|
||||||
columns = {
|
|
||||||
{ "kind_icon", gap = 1 },
|
|
||||||
{ "label", "label_description", gap = 1 },
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
documentation = {
|
|
||||||
auto_show = false,
|
|
||||||
window = {
|
|
||||||
border = "rounded",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
|
|
||||||
signature = {
|
|
||||||
enabled = true,
|
|
||||||
window = {
|
|
||||||
border = "rounded",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,20 +0,0 @@
|
||||||
vim.api.nvim_create_autocmd("FileType", {
|
|
||||||
pattern = { "lua", "nix", "gleam" },
|
|
||||||
callback = function()
|
|
||||||
vim.opt_local.shiftwidth = 2
|
|
||||||
vim.opt_local.tabstop = 2
|
|
||||||
vim.opt_local.expandtab = true
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
vim.api.nvim_create_autocmd("User", {
|
|
||||||
pattern = "TelescopePreviewerLoaded",
|
|
||||||
callback = function(args)
|
|
||||||
local ft = args.data.filetype
|
|
||||||
if vim.tbl_contains({ "lua", "nix", "gleam", "rust" }, ft) then
|
|
||||||
vim.bo.shiftwidth = 2
|
|
||||||
vim.bo.tabstop = 2
|
|
||||||
vim.bo.expandtab = true
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
@ -1,6 +0,0 @@
|
||||||
require("lze").load({
|
|
||||||
{ import = "lsp.completion" },
|
|
||||||
})
|
|
||||||
|
|
||||||
require("lsp.indentation")
|
|
||||||
require("lsp.lsp")
|
|
||||||
|
|
@ -1,134 +0,0 @@
|
||||||
local servers = {}
|
|
||||||
|
|
||||||
servers.lua_ls = {
|
|
||||||
settings = {
|
|
||||||
Lua = {
|
|
||||||
formatters = {
|
|
||||||
ignoreComments = false,
|
|
||||||
},
|
|
||||||
signatureHelp = { enable = true },
|
|
||||||
diagnostics = {
|
|
||||||
globals = { "nixCats", "vim" },
|
|
||||||
-- disable = { 'missing-fields' },
|
|
||||||
},
|
|
||||||
workspace = {
|
|
||||||
-- make the server aware of the neovim runtime files
|
|
||||||
library = vim.api.nvim_get_runtime_file("", true),
|
|
||||||
checkThirdParty = false,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
telemetry = { enabled = false },
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
servers.nil_ls = {
|
|
||||||
settings = {},
|
|
||||||
}
|
|
||||||
|
|
||||||
local rust_analyzer_cmd = os.getenv("RUST_ANALYZER_CMD")
|
|
||||||
servers.rust_analyzer = {
|
|
||||||
cmd = { rust_analyzer_cmd },
|
|
||||||
settings = {
|
|
||||||
server = {
|
|
||||||
-- For debugging rust-analyzer, to see log location do :LspInfo in neovim
|
|
||||||
-- extraEnv = { {["RA_LOG"]="project_model=debug"} },
|
|
||||||
},
|
|
||||||
cargo = {
|
|
||||||
allFeatures = false,
|
|
||||||
allTargets = false,
|
|
||||||
buildScripts = { enable = true },
|
|
||||||
target = "x86_64-unknown-linux-gnu",
|
|
||||||
},
|
|
||||||
diagnostics = {
|
|
||||||
enable = true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
servers.zls = {
|
|
||||||
settings = {},
|
|
||||||
}
|
|
||||||
|
|
||||||
local elixir_ls_cmd = os.getenv("ELIXIR_LS_CMD")
|
|
||||||
servers.elixirls = {
|
|
||||||
cmd = { elixir_ls_cmd },
|
|
||||||
settings = {},
|
|
||||||
}
|
|
||||||
|
|
||||||
servers.gleam = {
|
|
||||||
settings = {},
|
|
||||||
}
|
|
||||||
|
|
||||||
servers.hls = {
|
|
||||||
settings = {},
|
|
||||||
}
|
|
||||||
|
|
||||||
local java_home = os.getenv("JAVA_HOME")
|
|
||||||
servers.jdtls = {
|
|
||||||
settings = {
|
|
||||||
java = {
|
|
||||||
contentProvider = { preferred = "fernflower" },
|
|
||||||
configuration = {
|
|
||||||
runtimes = {
|
|
||||||
{
|
|
||||||
name = "OpenJDK 17",
|
|
||||||
path = os.getenv("OPENJDK_17"),
|
|
||||||
},
|
|
||||||
{
|
|
||||||
name = "OpenJDK 21",
|
|
||||||
path = os.getenv("OPENJDK_21"),
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
||||||
servers.protols = {
|
|
||||||
settings = {},
|
|
||||||
}
|
|
||||||
|
|
||||||
-- Taken from nixCats example:
|
|
||||||
-- If you were to comment out this autocommand
|
|
||||||
-- and instead pass the on attach function directly to
|
|
||||||
-- nvim-lspconfig, it would do the same thing.
|
|
||||||
-- come to think of it, it might be better because then lspconfig doesnt have to be called before lsp attach?
|
|
||||||
-- but you would still end up triggering on a FileType event anyway, so, it makes little difference.
|
|
||||||
vim.api.nvim_create_autocmd("LspAttach", {
|
|
||||||
group = vim.api.nvim_create_augroup("nixCats-lsp-attach", { clear = true }),
|
|
||||||
callback = function(event)
|
|
||||||
require("lsp.capabilities").on_attach(vim.lsp.get_client_by_id(event.data.client_id), event.buf)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
|
|
||||||
require("lze").load({
|
|
||||||
{
|
|
||||||
"nvim-lspconfig",
|
|
||||||
event = "FileType",
|
|
||||||
after = function(plugin)
|
|
||||||
-- Just register configs, don't enable yet
|
|
||||||
for server_name, cfg in pairs(servers) do
|
|
||||||
vim.lsp.config(server_name, {
|
|
||||||
capabilities = require("lsp.capabilities").get(server_name),
|
|
||||||
settings = (cfg or {}).settings,
|
|
||||||
filetypes = (cfg or {}).filetypes,
|
|
||||||
cmd = (cfg or {}).cmd,
|
|
||||||
root_pattern = (cfg or {}).root_pattern,
|
|
||||||
})
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Enable on-demand per filetype
|
|
||||||
for server_name, cfg in pairs(servers) do
|
|
||||||
local filetypes = cfg.filetypes or vim.lsp.config[server_name].filetypes
|
|
||||||
if filetypes then
|
|
||||||
vim.api.nvim_create_autocmd("FileType", {
|
|
||||||
pattern = filetypes,
|
|
||||||
callback = function()
|
|
||||||
vim.lsp.enable(server_name)
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
@ -1,23 +0,0 @@
|
||||||
return {
|
|
||||||
{
|
|
||||||
"comment.nvim",
|
|
||||||
event = { "BufReadPost", "BufNewFile" },
|
|
||||||
after = function(plugin)
|
|
||||||
require("Comment").setup({
|
|
||||||
toggler = {
|
|
||||||
line = "<leader>cc",
|
|
||||||
block = "<leader>bc",
|
|
||||||
},
|
|
||||||
opleader = {
|
|
||||||
line = "<leader>c",
|
|
||||||
block = "<leader>b",
|
|
||||||
},
|
|
||||||
extra = {
|
|
||||||
above = "<leader>c<S-o>",
|
|
||||||
below = "<leader>co",
|
|
||||||
eol = "<leader>cA",
|
|
||||||
},
|
|
||||||
})
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,5 +0,0 @@
|
||||||
return {
|
|
||||||
{
|
|
||||||
"dressing.nvim",
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,34 +0,0 @@
|
||||||
-- docs -> https://github.com/stevearc/conform.nvim
|
|
||||||
return {
|
|
||||||
{
|
|
||||||
"conform.nvim",
|
|
||||||
enabled = nixCats("format") or false,
|
|
||||||
keys = {
|
|
||||||
{ "<leader>p", desc = "Format File (pretty :3)" },
|
|
||||||
},
|
|
||||||
after = function(plugin)
|
|
||||||
local conform = require("conform")
|
|
||||||
|
|
||||||
conform.setup({
|
|
||||||
formatters_by_ft = {
|
|
||||||
lua = nixCats("lang.lua") and { "stylua" } or nil,
|
|
||||||
nix = nixCats("lang.nix") and { "nixfmt" } or nil,
|
|
||||||
rust = nixCats("lang.rust") and { "rustfmt", lsp_format = "fallback" } or nil,
|
|
||||||
haskell = nixCats("lang.haskell") and { "ormolu" } or nil,
|
|
||||||
proto = nixCats("lang.protobuf") and { "buf" } or nil,
|
|
||||||
},
|
|
||||||
format_on_save = {
|
|
||||||
timeout_ms = 500,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
vim.keymap.set({ "n", "v" }, "<leader>p", function()
|
|
||||||
conform.format({
|
|
||||||
lsp_fallback = false,
|
|
||||||
async = false,
|
|
||||||
timeout_ms = 1000,
|
|
||||||
})
|
|
||||||
end, { desc = "Format File (pretty :3)" })
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,22 +0,0 @@
|
||||||
return {
|
|
||||||
{
|
|
||||||
"fyler.nvim",
|
|
||||||
cmd = { "Fyler" },
|
|
||||||
keys = {
|
|
||||||
{
|
|
||||||
"<leader>tf",
|
|
||||||
function()
|
|
||||||
return require("fyler").toggle({ kind = "split_right" })
|
|
||||||
end,
|
|
||||||
mode = { "n" },
|
|
||||||
desc = "Open [F]yler",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
load = function(name)
|
|
||||||
vim.cmd.packadd(name)
|
|
||||||
end,
|
|
||||||
after = function(plugin)
|
|
||||||
local fyler = require("fyler").setup()
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,9 +0,0 @@
|
||||||
require("lze").load({
|
|
||||||
{ import = "plugins.dressing" },
|
|
||||||
{ import = "plugins.telescope" },
|
|
||||||
{ import = "plugins.treesitter" },
|
|
||||||
{ import = "plugins.fyler" },
|
|
||||||
{ import = "plugins.mini-hipatterns" },
|
|
||||||
{ import = "plugins.format" },
|
|
||||||
{ import = "plugins.comment" },
|
|
||||||
})
|
|
||||||
|
|
@ -1,76 +0,0 @@
|
||||||
return {
|
|
||||||
{
|
|
||||||
"mini.hipatterns",
|
|
||||||
after = function(plugin)
|
|
||||||
local hipatterns = require("mini.hipatterns")
|
|
||||||
|
|
||||||
-- Returns hex color group for matching short hex color.
|
|
||||||
--
|
|
||||||
---@param match string
|
|
||||||
---@return string
|
|
||||||
local hex_color_short = function(_, match)
|
|
||||||
local style = "fg" -- 'fg' or 'bg', for extmark_opts_inline use 'fg'
|
|
||||||
local r, g, b = match:sub(2, 2), match:sub(3, 3), match:sub(4, 4)
|
|
||||||
local hex = string.format("#%s%s%s%s%s%s", r, r, g, g, b, b)
|
|
||||||
return hipatterns.compute_hex_color_group(hex, style)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Returns hex color group for matching alpha hex color.
|
|
||||||
--
|
|
||||||
---@param match string
|
|
||||||
---@return string
|
|
||||||
local hex_color_alpha = function(_, match)
|
|
||||||
local style = "fg" -- 'fg' or 'bg', for extmark_opts_inline use 'fg'
|
|
||||||
local r, g, b = match:sub(2, 3), match:sub(4, 5), match:sub(6, 7)
|
|
||||||
local hex = string.format("#%s%s%s", r, g, b)
|
|
||||||
return hipatterns.compute_hex_color_group(hex, style)
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Returns extmark opts for highlights with virtual inline text.
|
|
||||||
--
|
|
||||||
---@param data table Includes `hl_group`, `full_match` and more.
|
|
||||||
---@return table
|
|
||||||
local extmark_opts_inline = function(_, _, data)
|
|
||||||
return {
|
|
||||||
virt_text = { { "", data.hl_group } },
|
|
||||||
virt_text_pos = "inline",
|
|
||||||
right_gravity = false,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
-- Returns extmark opts for highlights with virtual inline text.
|
|
||||||
--
|
|
||||||
---@param data table Includes `hl_group`, `full_match` and more.
|
|
||||||
---@return table
|
|
||||||
local extmark_opts_inline_alpha = function(_, _, data)
|
|
||||||
return {
|
|
||||||
virt_text = { { "", data.hl_group } },
|
|
||||||
virt_text_pos = "inline",
|
|
||||||
right_gravity = false,
|
|
||||||
}
|
|
||||||
end
|
|
||||||
|
|
||||||
hipatterns.setup({
|
|
||||||
highlighters = {
|
|
||||||
-- #rrggbb
|
|
||||||
hex_color = hipatterns.gen_highlighter.hex_color({
|
|
||||||
style = "inline",
|
|
||||||
inline_text = "",
|
|
||||||
}),
|
|
||||||
-- #rgb
|
|
||||||
hex_color_short = {
|
|
||||||
pattern = "#%x%x%x%f[%X]",
|
|
||||||
group = hex_color_short,
|
|
||||||
extmark_opts = extmark_opts_inline,
|
|
||||||
},
|
|
||||||
-- #rrggbbaa
|
|
||||||
hex_color_alpha = {
|
|
||||||
pattern = "#%x%x%x%x%x%x%x%x%f[%X]",
|
|
||||||
group = hex_color_alpha,
|
|
||||||
extmark_opts = extmark_opts_inline_alpha,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,78 +0,0 @@
|
||||||
return {
|
|
||||||
{
|
|
||||||
"telescope.nvim",
|
|
||||||
cmd = { "Telescope" },
|
|
||||||
keys = {
|
|
||||||
{
|
|
||||||
"<leader>f",
|
|
||||||
function()
|
|
||||||
return require("telescope.builtin").find_files()
|
|
||||||
end,
|
|
||||||
mode = { "n" },
|
|
||||||
desc = "Telescope search [F]iles",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"<leader>tr",
|
|
||||||
function()
|
|
||||||
return require("telescope.builtin").oldfiles()
|
|
||||||
end,
|
|
||||||
mode = { "n" },
|
|
||||||
desc = "[T]elescope search [R]ecent files",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"<leader>ts",
|
|
||||||
function()
|
|
||||||
return require("telescope.builtin").live_grep()
|
|
||||||
end,
|
|
||||||
mode = { "n" },
|
|
||||||
desc = "[T]elescope [S]earch cwd with grep",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"<leader>tw",
|
|
||||||
function()
|
|
||||||
return require("telescope.builtin").grep_string()
|
|
||||||
end,
|
|
||||||
mode = { "n" },
|
|
||||||
desc = "[T]elescope search current [W]ord",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"<leader>tk",
|
|
||||||
function()
|
|
||||||
return require("telescope.builtin").keymaps()
|
|
||||||
end,
|
|
||||||
mode = { "n" },
|
|
||||||
desc = "[T]elescope search [K]eymaps",
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"<leader>tb",
|
|
||||||
function()
|
|
||||||
return require("telescope.builtin").buffers()
|
|
||||||
end,
|
|
||||||
mode = { "n" },
|
|
||||||
desc = "[T]elescope search [B]uffers",
|
|
||||||
},
|
|
||||||
},
|
|
||||||
load = function(name)
|
|
||||||
vim.cmd.packadd(name)
|
|
||||||
vim.cmd.packadd("telescope-fzf-native.nvim")
|
|
||||||
end,
|
|
||||||
after = function(plugin)
|
|
||||||
local telescope = require("telescope")
|
|
||||||
local actions = require("telescope.actions")
|
|
||||||
|
|
||||||
telescope.setup({
|
|
||||||
defaults = {
|
|
||||||
mappings = {
|
|
||||||
i = {
|
|
||||||
["<C-k>"] = actions.move_selection_previous, -- move to prev result
|
|
||||||
["<C-j>"] = actions.move_selection_next, -- move to next result
|
|
||||||
["<C-q>"] = actions.send_selected_to_qflist + actions.open_qflist,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
pcall(telescope.load_extension, "fzf")
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
|
|
@ -1,95 +0,0 @@
|
||||||
-- to help me write this after nvim-treesitter updated, i used:
|
|
||||||
-- https://github.com/BirdeeHub/nixCats-nvim/blob/3c9bc4d7123e1b48d92f25ba505b889af541e897/templates/example/lua/myLuaConf/plugins/treesitter.lua
|
|
||||||
|
|
||||||
return {
|
|
||||||
{
|
|
||||||
"nvim-treesitter",
|
|
||||||
lazy = false,
|
|
||||||
after = function(plugin)
|
|
||||||
--@param buf integer
|
|
||||||
--@param language string
|
|
||||||
local function treesitter_try_attach(buf, language)
|
|
||||||
--check if parser exists and load it
|
|
||||||
if not vim.treesitter.language.add(language) then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
-- enables syntax highlight and other treesitter features
|
|
||||||
vim.treesitter.start(buf, language)
|
|
||||||
|
|
||||||
-- enables treesitter based folds
|
|
||||||
vim.wo.foldexpr = "v:lua.vim.treesitter.foldexpr()"
|
|
||||||
|
|
||||||
-- enables treesiter based indentation
|
|
||||||
vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
|
|
||||||
end
|
|
||||||
|
|
||||||
local available_parsers = require("nvim-treesitter").get_available()
|
|
||||||
vim.api.nvim_create_autocmd("FileType", {
|
|
||||||
callback = function(args)
|
|
||||||
local buf, filetype = args.buf, args.match
|
|
||||||
local language = vim.treesitter.language.get_lang(filetype)
|
|
||||||
if not language then
|
|
||||||
return
|
|
||||||
end
|
|
||||||
|
|
||||||
local installed_parsers = require("nvim-treesitter").get_installed("parsers")
|
|
||||||
|
|
||||||
if vim.tbl_contains(installed_parsers, language) then
|
|
||||||
-- enable the parser if it is installed
|
|
||||||
treesitter_try_attach(buf, language)
|
|
||||||
elseif vim.tbl_contains(available_parsers, language) then
|
|
||||||
-- if a parser is available in `nvim-treesitter` enable it after ensuring it is installed
|
|
||||||
require("nvim-treesitter").install(language):await(function()
|
|
||||||
treesitter_try_attach(buf, language)
|
|
||||||
end)
|
|
||||||
else
|
|
||||||
-- try to enable treesitter features in case the parser exists but is not available from `nvim-treesitter`
|
|
||||||
treesitter_try_attach(buf, language)
|
|
||||||
end
|
|
||||||
end,
|
|
||||||
})
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"nvim-treesitter-textobjects",
|
|
||||||
lazy = false,
|
|
||||||
before = function(plugin)
|
|
||||||
vim.g.no_plugin_maps = true
|
|
||||||
end,
|
|
||||||
after = function(plugin)
|
|
||||||
require("nvim-treesitter-textobjects").setup({
|
|
||||||
select = {
|
|
||||||
lookahead = true,
|
|
||||||
selection_modes = {
|
|
||||||
["@parameter.outer"] = "v", -- charwise
|
|
||||||
["@function.outer"] = "V", -- linewise
|
|
||||||
},
|
|
||||||
include_surrounding_whitespace = false,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
|
|
||||||
-- keymaps
|
|
||||||
vim.keymap.set({ "x", "o" }, "am", function()
|
|
||||||
require("nvim-treesitter-textobjects.select").select_textobject("@function.outer", "textobjects")
|
|
||||||
end)
|
|
||||||
vim.keymap.set({ "x", "o" }, "im", function()
|
|
||||||
require("nvim-treesitter-textobjects.select").select_textobject("@function.inner", "textobjects")
|
|
||||||
end)
|
|
||||||
vim.keymap.set({ "x", "o" }, "ac", function()
|
|
||||||
require("nvim-treesitter-textobjects.select").select_textobject("@class.outer", "textobjects")
|
|
||||||
end)
|
|
||||||
vim.keymap.set({ "x", "o" }, "ic", function()
|
|
||||||
require("nvim-treesitter-textobjects.select").select_textobject("@class.inner", "textobjects")
|
|
||||||
end)
|
|
||||||
-- You can also use captures from other query groups like `locals.scm`
|
|
||||||
vim.keymap.set({ "x", "o" }, "as", function()
|
|
||||||
require("nvim-treesitter-textobjects.select").select_textobject("@local.scope", "locals")
|
|
||||||
end)
|
|
||||||
|
|
||||||
-- NOTE: for more textobjects options, see the following link.
|
|
||||||
-- This template is using the new `main` branch of the repo.
|
|
||||||
-- https://github.com/nvim-treesitter/nvim-treesitter-textobjects/tree/main
|
|
||||||
end,
|
|
||||||
},
|
|
||||||
}
|
|
||||||
24
homes/modules/editor/nixvim.nix
Executable file
24
homes/modules/editor/nixvim.nix
Executable file
|
|
@ -0,0 +1,24 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
programs.nixvim = {
|
||||||
|
enable = true;
|
||||||
|
# TODO: allow clipboard to be configurable based on system clipboard
|
||||||
|
colorschemes.dracula.enable = true;
|
||||||
|
plugins = {
|
||||||
|
lualine.enable = true;
|
||||||
|
treesitter.enable = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
opts = {
|
||||||
|
number = true;
|
||||||
|
tabstop = 4;
|
||||||
|
softtabstop = 4;
|
||||||
|
shiftwidth = 4;
|
||||||
|
};
|
||||||
|
|
||||||
|
clipboard.providers.wl-copy.enable = true;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,133 +0,0 @@
|
||||||
{
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
vscodium ? false,
|
|
||||||
secret-service ? "gnome-libsecret",
|
|
||||||
vscode-argv ? ".vscode/argv.json",
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
nixpkgs.overlays = [
|
|
||||||
(
|
|
||||||
self: super: {
|
|
||||||
vscode-extensions = super.vscode-extensions.overrideAttrs (prev: let
|
|
||||||
mkVscMarketplaceExtension = {
|
|
||||||
publisher,
|
|
||||||
name,
|
|
||||||
version,
|
|
||||||
hash,
|
|
||||||
description ? "",
|
|
||||||
homepage ? null,
|
|
||||||
changelog ? null,
|
|
||||||
license ? null,
|
|
||||||
maintainers ? [],
|
|
||||||
}:
|
|
||||||
with pkgs.vscode-utils.buildVscodeMarketplaceExtension; {
|
|
||||||
${publisher}.${name} = buildVscodeMarketplaceExtension {
|
|
||||||
mktplcRef = {
|
|
||||||
inherit
|
|
||||||
publisher
|
|
||||||
name
|
|
||||||
version
|
|
||||||
hash
|
|
||||||
;
|
|
||||||
};
|
|
||||||
|
|
||||||
meta = {
|
|
||||||
inherit
|
|
||||||
(
|
|
||||||
if license != null
|
|
||||||
then {license = license;}
|
|
||||||
else {}
|
|
||||||
)
|
|
||||||
description
|
|
||||||
homepage
|
|
||||||
maintainers
|
|
||||||
;
|
|
||||||
downloadPage = "https://marketplace.visualstudio.com/items?itemName=${publisher}.${name}";
|
|
||||||
changelog =
|
|
||||||
if changelog != null
|
|
||||||
then changelog
|
|
||||||
else "https://marketplace.visualstudio.com/items/${publisher}.${name}/changelog";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
in
|
|
||||||
lib.mergeAttrsList [
|
|
||||||
(mkVscMarketplaceExtension {
|
|
||||||
publisher = "ms-dotnettools";
|
|
||||||
name = "dotnet-maui";
|
|
||||||
version = "1.11.14";
|
|
||||||
hash = lib.fakeHash;
|
|
||||||
|
|
||||||
description = "Extend C# Dev Kit with tools for building .NET Multi-platform App UI (MAUI) apps";
|
|
||||||
homepage = "https://github.com/microsoft/vscode-dotnettools";
|
|
||||||
license = lib.licenses.unfree;
|
|
||||||
})
|
|
||||||
]);
|
|
||||||
}
|
|
||||||
)
|
|
||||||
];
|
|
||||||
|
|
||||||
# REF: https://home-manager-options.extranix.com/?query=vscode&release=release-25.05
|
|
||||||
programs.vscode = {
|
|
||||||
enable = true;
|
|
||||||
# TODO: clean up
|
|
||||||
package =
|
|
||||||
(
|
|
||||||
if vscodium
|
|
||||||
then pkgs.vscodium
|
|
||||||
else pkgs.vscode
|
|
||||||
).overrideAttrs (oldAttrs: {
|
|
||||||
# runtimeDependencies = oldAttrs.runtimeDependencies ++ []
|
|
||||||
});
|
|
||||||
|
|
||||||
mutableExtensionsDir = true;
|
|
||||||
|
|
||||||
profiles.default = {
|
|
||||||
enableUpdateCheck = false;
|
|
||||||
enableExtensionUpdateCheck = false;
|
|
||||||
# extension format: USER.PACKAGENAME
|
|
||||||
extensions = with pkgs.vscode-extensions; [
|
|
||||||
# .NET
|
|
||||||
ms-dotnettools.csharp
|
|
||||||
ms-dotnettools.csdevkit
|
|
||||||
ms-dotnettools.vscode-dotnet-runtime
|
|
||||||
# TODO: these extensions aren't packaged :(
|
|
||||||
# deitry.solution-syntax
|
|
||||||
# ms-dotnettools.vscode-dotnet-pack
|
|
||||||
# ms-dotnettools.dotnet-maui
|
|
||||||
|
|
||||||
# Python
|
|
||||||
ms-python.python
|
|
||||||
|
|
||||||
# GitLens by GitKraken
|
|
||||||
eamodio.gitlens
|
|
||||||
ms-azuretools.vscode-docker
|
|
||||||
|
|
||||||
github.copilot
|
|
||||||
github.copilot-chat
|
|
||||||
|
|
||||||
# Colors & Themes
|
|
||||||
dracula-theme.theme-dracula
|
|
||||||
catppuccin.catppuccin-vsc
|
|
||||||
catppuccin.catppuccin-vsc-icons
|
|
||||||
mvllow.rose-pine
|
|
||||||
];
|
|
||||||
|
|
||||||
userSettings = {
|
|
||||||
"workbench.colorTheme" = "Dracula Theme";
|
|
||||||
"github.copilot.nextEditSuggestions.enabled" = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# TODO: this is super ugly, make sure the JSON is formatted!!
|
|
||||||
home.file.${vscode-argv}.text = builtins.toJSON {
|
|
||||||
password-store = secret-service;
|
|
||||||
|
|
||||||
disable-hardware-acceleration = false;
|
|
||||||
disable-color-correct-rendering = false;
|
|
||||||
enable-crash-reporter = false;
|
|
||||||
# crash-report-id = ...;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,37 +0,0 @@
|
||||||
{
|
|
||||||
lib,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
# REF: https://home-manager-options.extranix.com/?query=vscode&release=release-25.05
|
|
||||||
programs.vscode = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.vscodium;
|
|
||||||
|
|
||||||
mutableExtensionsDir = true;
|
|
||||||
|
|
||||||
profiles.default = {
|
|
||||||
enableUpdateCheck = false;
|
|
||||||
enableExtensionUpdateCheck = false;
|
|
||||||
# extension format: USER.PACKAGENAME
|
|
||||||
extensions = with pkgs.vscode-extensions; [
|
|
||||||
# .NET
|
|
||||||
ms-dotnettools.csharp
|
|
||||||
ms-dotnettools.csdevkit
|
|
||||||
ms-dotnettools.vscode-dotnet-runtime
|
|
||||||
# ms-dotnettools.vscode-dotnet-pack
|
|
||||||
# ms-dotnettools.dotnet-maui
|
|
||||||
|
|
||||||
# Colors & Themes
|
|
||||||
dracula-theme.theme-dracula
|
|
||||||
catppuccin.catppuccin-vsc
|
|
||||||
catppuccin.catppuccin-vsc-icons
|
|
||||||
mvllow.rose-pine
|
|
||||||
];
|
|
||||||
|
|
||||||
userSettings = {
|
|
||||||
"workbench.colorTheme" = "Dracula Theme";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
19
homes/modules/fish.nix
Executable file
19
homes/modules/fish.nix
Executable file
|
|
@ -0,0 +1,19 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
programs.fish = {
|
||||||
|
enable = true;
|
||||||
|
interactiveShellInit = ''
|
||||||
|
#set -g fish_greeting "Welcome weary traveler to my shop"
|
||||||
|
cat ~/banner
|
||||||
|
'';
|
||||||
|
plugins = [
|
||||||
|
{
|
||||||
|
name = "grc";
|
||||||
|
src = pkgs.fishPlugins.grc.src;
|
||||||
|
}
|
||||||
|
];
|
||||||
|
};
|
||||||
|
}
|
||||||
11
homes/modules/git.nix
Executable file
11
homes/modules/git.nix
Executable file
|
|
@ -0,0 +1,11 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
programs.git = {
|
||||||
|
enable = true;
|
||||||
|
userName = "Emile Clark-Boman";
|
||||||
|
userEmail = "eclarkboman@gmail.com";
|
||||||
|
};
|
||||||
|
}
|
||||||
0
homes/modules/hypr/hyprland.nix
Executable file
0
homes/modules/hypr/hyprland.nix
Executable file
|
|
@ -1,9 +1,13 @@
|
||||||
{...}: {
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
# Change monitor positions
|
# Change monitor positions
|
||||||
# TODO: find a way to make this modular (ie put something different for my laptop)
|
# TODO: find a way to make this modular (ie put something different for my laptop)
|
||||||
# my idea is to have a "monitors" module and use kanshi for wayland
|
# my idea is to have a "monitors" module and use kanshi for wayland
|
||||||
services.kanshi = {
|
services.kanshi = {
|
||||||
enable = false;
|
enable = true;
|
||||||
systemdTarget = "hyprland-session.target";
|
systemdTarget = "hyprland-session.target";
|
||||||
# You can find your monitors in hyprland by using `hyprctl monitors all`
|
# You can find your monitors in hyprland by using `hyprctl monitors all`
|
||||||
settings = [
|
settings = [
|
||||||
16
homes/modules/nixcord.nix
Executable file
16
homes/modules/nixcord.nix
Executable file
|
|
@ -0,0 +1,16 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
programs.nixcord = {
|
||||||
|
enable = true;
|
||||||
|
config = {
|
||||||
|
frameless = true;
|
||||||
|
plugins = {
|
||||||
|
# TODO: remove this plugin
|
||||||
|
hideAttachments.enable = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,14 +1,10 @@
|
||||||
{pkgs, ...}: {
|
{
|
||||||
home = {
|
config,
|
||||||
packages = [
|
pkgs,
|
||||||
pkgs.rio
|
...
|
||||||
];
|
}: {
|
||||||
|
|
||||||
# currently set to ghostty (on lolcathost)
|
|
||||||
#sessionVariables.TERMINAL = "rio";
|
|
||||||
};
|
|
||||||
|
|
||||||
# The terminal I use
|
# The terminal I use
|
||||||
|
# TODO: this is dependent on nvim being installed
|
||||||
# TODO: make this into a module with a configurable editor option
|
# TODO: make this into a module with a configurable editor option
|
||||||
programs.rio = {
|
programs.rio = {
|
||||||
enable = true;
|
enable = true;
|
||||||
13
homes/modules/rofi.nix
Executable file
13
homes/modules/rofi.nix
Executable file
|
|
@ -0,0 +1,13 @@
|
||||||
|
{
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
programs.rofi = {
|
||||||
|
enable = true;
|
||||||
|
package = pkgs.rofi-wayland;
|
||||||
|
font = "JetBrains Mono Nerd Font 10";
|
||||||
|
location = "center";
|
||||||
|
terminal = "${pkgs.rio}/bin/rio";
|
||||||
|
};
|
||||||
|
}
|
||||||
17
homes/modules/server/fail2ban.nix
Executable file
17
homes/modules/server/fail2ban.nix
Executable file
|
|
@ -0,0 +1,17 @@
|
||||||
|
{...}: {
|
||||||
|
# simple fail2ban config (not production ready or anything though)
|
||||||
|
# refer to: https://nixos.wiki/wiki/Fail2Ban
|
||||||
|
services.fail2ban = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
maxretry = 5;
|
||||||
|
bantime = "10m"; # 10 minute ban
|
||||||
|
bantime-increment = {
|
||||||
|
enable = true;
|
||||||
|
formula = "ban.Time * math.exp(float(ban.Count+1)*banFactor)/math.exp(1*banFactor)";
|
||||||
|
multipliers = "1 2 4 8 16 32 64";
|
||||||
|
maxtime = "168h"; # dont ban for more than 1 week
|
||||||
|
overalljails = true;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
35
homes/modules/server/nginx.nix
Executable file
35
homes/modules/server/nginx.nix
Executable file
|
|
@ -0,0 +1,35 @@
|
||||||
|
{...}: {
|
||||||
|
services = {
|
||||||
|
# use nginx as the reverse proxy
|
||||||
|
# (also will use certbot and Let's Encrypt)
|
||||||
|
# refer to: https://nixos.wiki/wiki/Nginx
|
||||||
|
nginx = {
|
||||||
|
enable = true;
|
||||||
|
|
||||||
|
recommendedProxySettings = true;
|
||||||
|
recommendedTlsSettings = true;
|
||||||
|
recommendedGzipSettings = true;
|
||||||
|
recommendedOptimisation = true;
|
||||||
|
|
||||||
|
# https://imbored.dev
|
||||||
|
virtualHosts = {
|
||||||
|
"imbored.dev" = {
|
||||||
|
forceSSL = true;
|
||||||
|
enableACME = true;
|
||||||
|
# config reverse proxy paths
|
||||||
|
locations = {
|
||||||
|
"/" = {
|
||||||
|
# TODO
|
||||||
|
proxyPass = "http://127.0.0.1:12345";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
security.acme = {
|
||||||
|
acceptTerms = true;
|
||||||
|
defaults.email = "eclarkboman@gmail.com";
|
||||||
|
};
|
||||||
|
}
|
||||||
13
homes/modules/server/ssh.nix
Executable file
13
homes/modules/server/ssh.nix
Executable file
|
|
@ -0,0 +1,13 @@
|
||||||
|
{...}: {
|
||||||
|
services.openssh = {
|
||||||
|
enable = true;
|
||||||
|
ports = [22];
|
||||||
|
settings = {
|
||||||
|
PasswordAuthentication = true;
|
||||||
|
PermitRootLogin = "no";
|
||||||
|
AllowUsers = null; # allow all users by default
|
||||||
|
UseDns = true;
|
||||||
|
X11Forwarding = false;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
@ -1,16 +0,0 @@
|
||||||
{osConfig, ...}: {
|
|
||||||
assertions = [
|
|
||||||
{
|
|
||||||
assertion = !osConfig.services.gnupg.agent.enable;
|
|
||||||
message = ''
|
|
||||||
It is not recommended to enable both `homeConfig.services.ssh-agent.enable` and `osConfig.services.gnupg.agent.enable`!
|
|
||||||
'';
|
|
||||||
}
|
|
||||||
];
|
|
||||||
|
|
||||||
# enable OpenSSH private key agent
|
|
||||||
services.ssh-agent.enable = true;
|
|
||||||
|
|
||||||
# WARNING: the ssh-agent won't set this for itself...
|
|
||||||
systemd.user.sessionVariables.SSH_AUTH_SOCK = "$XDG_RUNTIME_DIR/ssh-agent";
|
|
||||||
}
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
cfg = config.programs.elvish;
|
|
||||||
in {
|
|
||||||
options.programs.elvish = {
|
|
||||||
enable = lib.mkEnableOption "elvish";
|
|
||||||
};
|
|
||||||
|
|
||||||
config = lib.mkIf cfg.enable {
|
|
||||||
home = {
|
|
||||||
packages = with pkgs; [elvish];
|
|
||||||
|
|
||||||
file.".elvish/nix.elv".source = let
|
|
||||||
elvish-modules = pkgs.fetchFromGitHub {
|
|
||||||
owner = "zzamboni";
|
|
||||||
repo = "elvish-modules";
|
|
||||||
rev = "9005c970346ab06214b3cd3ed3e70f04f3c632ba";
|
|
||||||
hash = "sha256-/Dwtl12QzPvMoMMGoj+v3dwX2ZwFT8t/bohVy1zDE0c=";
|
|
||||||
};
|
|
||||||
in
|
|
||||||
builtins.toPath "${elvish-modules}/nix.elv";
|
|
||||||
# /${builtins.toPath elvish-modules.outPath}/nix.elv;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,71 +0,0 @@
|
||||||
{pkgs, ...}: {
|
|
||||||
programs.fish = {
|
|
||||||
enable = true;
|
|
||||||
generateCompletions = true;
|
|
||||||
|
|
||||||
interactiveShellInit = let
|
|
||||||
greetings =
|
|
||||||
[
|
|
||||||
# Official _cry64 quotes
|
|
||||||
"Do butterflies cry when they're sad?"
|
|
||||||
"I hope they do"
|
|
||||||
"I think Alice is lost..."
|
|
||||||
"I once again retreat to the sanctuary of my virtual realm"
|
|
||||||
|
|
||||||
# Unknown
|
|
||||||
"Welcome weary traveler to my shop"
|
|
||||||
|
|
||||||
# Legend of Zelda
|
|
||||||
"It's dangerous to go alone! Take this."
|
|
||||||
|
|
||||||
# ULTRAKILL
|
|
||||||
"Something wicked this way comes"
|
|
||||||
"May your L's be many... and your bitches few"
|
|
||||||
|
|
||||||
# Terraria
|
|
||||||
"What a horrible night to have a curse."
|
|
||||||
"The ancient spirits of light and dark have been released."
|
|
||||||
|
|
||||||
# Calamity
|
|
||||||
"The god of the stars rejects your offering. The ritual can only be performed at night."
|
|
||||||
"You should have just died..."
|
|
||||||
"Supreme Witch, Calamitas has killed every player!"
|
|
||||||
|
|
||||||
# Key Fairy
|
|
||||||
"A broken heart beats in fractals"
|
|
||||||
|
|
||||||
# Signalis
|
|
||||||
"Remember our promise"
|
|
||||||
]
|
|
||||||
|> map (x: "\"${x}\"")
|
|
||||||
|> builtins.concatStringsSep " ";
|
|
||||||
in ''
|
|
||||||
# add dotnet completions if it exists (ie we're in a virtual environment)
|
|
||||||
if type -q dotnet
|
|
||||||
complete -f -c dotnet -a "(dotnet complete (commandline -cp))"
|
|
||||||
end
|
|
||||||
|
|
||||||
function rand_greet
|
|
||||||
set greetings ${greetings}
|
|
||||||
echo -n $greetings[(random 1 (count $greetings))]
|
|
||||||
end
|
|
||||||
|
|
||||||
function gitignore -a type
|
|
||||||
curl -sL "https://www.gitignore.io/api/$type"
|
|
||||||
end
|
|
||||||
|
|
||||||
function decompile
|
|
||||||
objdump --disassemble --demangle --debugging --debugging-tags $argv | bat --language asm
|
|
||||||
end
|
|
||||||
|
|
||||||
set -g fish_greeting (rand_greet)
|
|
||||||
'';
|
|
||||||
|
|
||||||
plugins = [
|
|
||||||
{
|
|
||||||
name = "grc";
|
|
||||||
src = pkgs.fishPlugins.grc.src;
|
|
||||||
}
|
|
||||||
];
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,17 +0,0 @@
|
||||||
{...}: {
|
|
||||||
programs.zsh = {
|
|
||||||
enable = true;
|
|
||||||
enableCompletion = true;
|
|
||||||
autosuggestion.enable = true;
|
|
||||||
syntaxHighlighting.enable = true;
|
|
||||||
|
|
||||||
history = {
|
|
||||||
size = 10000;
|
|
||||||
ignoreAllDups = true;
|
|
||||||
path = "$HOME/.zsh_history";
|
|
||||||
ignorePatterns = [
|
|
||||||
"rm *"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,328 +0,0 @@
|
||||||
# DEBUG: {upkgs, ...}: {
|
|
||||||
{pkgs, ...}: {
|
|
||||||
programs.foot = {
|
|
||||||
enable = true;
|
|
||||||
package = pkgs.foot; # DEBUG: upkgs.foot;
|
|
||||||
|
|
||||||
server.enable = true;
|
|
||||||
|
|
||||||
settings = let
|
|
||||||
none = "\"\"";
|
|
||||||
in {
|
|
||||||
main = {
|
|
||||||
term = "foot"; # set $TERM
|
|
||||||
login-shell = "no";
|
|
||||||
title = "foot";
|
|
||||||
locked-title = "no";
|
|
||||||
|
|
||||||
# font = "GeistMono Nerd Font:size=12";
|
|
||||||
# font = "Mononoki Nerd Font Mono:size=12";
|
|
||||||
# font = "0xProto Nerd Font Mono:size=12";
|
|
||||||
font = "JetBrainsMonoNL Nerd Font:size=12";
|
|
||||||
# font-bold = "";
|
|
||||||
# font-italice = "";
|
|
||||||
# font-bold-italice = "";
|
|
||||||
# font-size-adjustment = 0.5;
|
|
||||||
# line-height = ...;
|
|
||||||
# letter-spacing = 0;
|
|
||||||
# horizontal-letter-offset = 0;
|
|
||||||
# vertical-letter-offset = 0;
|
|
||||||
# underline-offset = ...;
|
|
||||||
# underline-thickness = ...;
|
|
||||||
# strikeout-thickness = ...;
|
|
||||||
box-drawings-uses-font-glyphs = "no";
|
|
||||||
dpi-aware = "no";
|
|
||||||
gamma-correct-blending = "no";
|
|
||||||
|
|
||||||
initial-color-theme = "1";
|
|
||||||
# initial-window-size-pixels = "700x500"; # pixel COLSxROWS
|
|
||||||
initial-window-size-chars = "90x26"; # char COLSxROWS
|
|
||||||
initial-window-mode = "windowed";
|
|
||||||
pad = "32x32 center-when-maximized-and-fullscreen";
|
|
||||||
resize-by-cells = "yes";
|
|
||||||
resize-keep-grid = "yes";
|
|
||||||
resize-delay-ms = "100";
|
|
||||||
|
|
||||||
bold-text-in-bright = "no";
|
|
||||||
word-delimiters = ",│`|:\"'()[]{}<>";
|
|
||||||
selection-target = "primary";
|
|
||||||
# workers = ...; # number of logical CPUs
|
|
||||||
};
|
|
||||||
|
|
||||||
# environment = {
|
|
||||||
# name = "value";
|
|
||||||
# }
|
|
||||||
|
|
||||||
security = {
|
|
||||||
osc52 = "enabled";
|
|
||||||
};
|
|
||||||
|
|
||||||
bell = {
|
|
||||||
system = "no";
|
|
||||||
urgent = "no";
|
|
||||||
notify = "no";
|
|
||||||
visual = "no";
|
|
||||||
# command = ...;
|
|
||||||
# command-focused = "no";
|
|
||||||
};
|
|
||||||
|
|
||||||
desktop-notifications = {
|
|
||||||
command = "notify-send --wait --app-name \${app-id} --icon \${app-id} --category \${category} --urgency \${urgency} --expire-time \${expire-time} --hint STRING:image-path:\${icon} --hint BOOLEAN:suppress-sound:\${muted} --hint STRING:sound-name:\${sound-name} --replace-id \${replace-id} \${action-argument} --print-id -- \${title} \${body}";
|
|
||||||
command-action-argument = "--action \${action-name=\${action-label}}";
|
|
||||||
close = none;
|
|
||||||
inhibit-when-focused = "no";
|
|
||||||
};
|
|
||||||
|
|
||||||
scrollback = {
|
|
||||||
lines = 1000;
|
|
||||||
multiplier = 1.0;
|
|
||||||
indicator-position = "relative";
|
|
||||||
indicator-format = none;
|
|
||||||
};
|
|
||||||
|
|
||||||
url = {
|
|
||||||
launch = "xdg-open \${url}";
|
|
||||||
label-letters = "sadfjklewcmpgh";
|
|
||||||
osc8-underline = "url-mode";
|
|
||||||
regex = "(((https?://|mailto:|ftp://|file:|ssh:|ssh://|git://|tel:|magnet:|ipfs://|ipns://|gemini://|gopher://|news:)|www\\.)([0-9a-zA-Z:/?#@!$&*+,;=.~_%^\\-]+|\\([]\\[\"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\\-]*\\)|\\[[\\(\\)\"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\\-]*\\]|\"[]\\[\\(\\)0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\\-]*\"|'[]\\[\\(\\)0-9a-zA-Z:/?#@!$&*+,;=.~_%^\\-]*')+([0-9a-zA-Z/#@$&*+=~_%^\\-]|\\([]\\[\"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\\-]*\\)|\\[[\\(\\)\"0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\\-]*\\]|\"[]\\[\\(\\)0-9a-zA-Z:/?#@!$&'*+,;=.~_%^\\-]*\"|'[]\\[\\(\\)0-9a-zA-Z:/?#@!$&*+,;=.~_%^\\-]*'))";
|
|
||||||
};
|
|
||||||
|
|
||||||
# "regex:your-fancy-name" = {
|
|
||||||
# regex = ...;
|
|
||||||
# launch = "[path to script/application] \${match}"
|
|
||||||
# };
|
|
||||||
#
|
|
||||||
# key-bindings = {
|
|
||||||
# regex-launch = "[your-fancy-name] Control+Shift+q";
|
|
||||||
# regex-copy = "[your-fancy-name] Control+Alt+shift+q";
|
|
||||||
# };
|
|
||||||
|
|
||||||
cursor = {
|
|
||||||
style = "block";
|
|
||||||
blink = "no";
|
|
||||||
# blink-rate = 500;
|
|
||||||
beam-thickness = 1.0;
|
|
||||||
# underline-thickness = ...;
|
|
||||||
};
|
|
||||||
|
|
||||||
mouse = {
|
|
||||||
hide-when-typing = "yes";
|
|
||||||
alternate-scroll-mode = "yes";
|
|
||||||
};
|
|
||||||
|
|
||||||
touch = {
|
|
||||||
long-press-delay = 400;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Theme: Dracula
|
|
||||||
# REF: https://github.com/dracula/foot
|
|
||||||
colors = {
|
|
||||||
alpha = 1.0;
|
|
||||||
alpha-mode = "default"; # default/matching/all
|
|
||||||
|
|
||||||
background = "282a36";
|
|
||||||
foreground = "f8f8f2";
|
|
||||||
|
|
||||||
## Normal/regular colors (color palette 0-7)
|
|
||||||
regular0 = "21222c"; # black
|
|
||||||
regular1 = "ff5555"; # red
|
|
||||||
regular2 = "50fa7b"; # green
|
|
||||||
regular3 = "f1fa8c"; # yellow
|
|
||||||
regular4 = "bd93f9"; # blue
|
|
||||||
regular5 = "ff79c6"; # magenta
|
|
||||||
regular6 = "8be9fd"; # cyan
|
|
||||||
regular7 = "f8f8f2"; # white
|
|
||||||
|
|
||||||
## Bright colors (color palette 8-15)
|
|
||||||
bright0 = "6272a4"; # bright black
|
|
||||||
bright1 = "ff6e6e"; # bright red
|
|
||||||
bright2 = "69ff94"; # bright green
|
|
||||||
bright3 = "ffffa5"; # bright yellow
|
|
||||||
bright4 = "d6acff"; # bright blue
|
|
||||||
bright5 = "ff92df"; # bright magenta
|
|
||||||
bright6 = "a4ffff"; # bright cyan
|
|
||||||
bright7 = "ffffff"; # bright white
|
|
||||||
|
|
||||||
## Misc colors
|
|
||||||
selection-foreground = "ffffff";
|
|
||||||
selection-background = "44475a";
|
|
||||||
# jump-labels=<regular0> <regular3> # black-on-yellow
|
|
||||||
# scrollback-indicator=<regular0> <bright4> # black-on-bright-blue
|
|
||||||
# search-box-no-match=<regular0> <regular1> # black-on-red
|
|
||||||
# search-box-match=<regular0> <regular3> # black-on-yellow
|
|
||||||
urls = "8be9fd";
|
|
||||||
|
|
||||||
flash = "7f7f00";
|
|
||||||
flash-alpha = 0.5;
|
|
||||||
};
|
|
||||||
|
|
||||||
# Alternative colour palette (see `man 5 foot.ini`)
|
|
||||||
colors2 = {
|
|
||||||
alpha = 1.0;
|
|
||||||
alpha-mode = "default";
|
|
||||||
|
|
||||||
background = "191724";
|
|
||||||
foreground = "e0def4";
|
|
||||||
|
|
||||||
regular0 = "26233a"; # black (Overlay)
|
|
||||||
regular1 = "eb6f92"; # red (Love)
|
|
||||||
regular2 = "9ccfd8"; # green (Foam)
|
|
||||||
regular3 = "f6c177"; # yellow (Gold)
|
|
||||||
regular4 = "31748f"; # blue (Pine)
|
|
||||||
regular5 = "c4a7e7"; # magenta (Iris)
|
|
||||||
regular6 = "ebbcba"; # cyan (Rose)
|
|
||||||
regular7 = "e0def4"; # white (Text)
|
|
||||||
|
|
||||||
bright0 = "47435d"; # bright black (lighter Overlay)
|
|
||||||
bright1 = "ff98ba"; # bright red (lighter Love)
|
|
||||||
bright2 = "c5f9ff"; # bright green (lighter Foam)
|
|
||||||
bright3 = "ffeb9e"; # bright yellow (lighter Gold)
|
|
||||||
bright4 = "5b9ab7"; # bright blue (lighter Pine)
|
|
||||||
bright5 = "eed0ff"; # bright magenta (lighter Iris)
|
|
||||||
bright6 = "ffe5e3"; # bright cyan (lighter Rose)
|
|
||||||
bright7 = "fefcff"; # bright white (lighter Text)
|
|
||||||
|
|
||||||
selection-foreground = "ffffff";
|
|
||||||
selection-background = "393553";
|
|
||||||
|
|
||||||
urls = "ebbcba"; # Rose
|
|
||||||
|
|
||||||
flash = "f6c177"; # yellow (Gold)
|
|
||||||
flash-alpha = 0.5;
|
|
||||||
|
|
||||||
cursor = "191724 e0def4";
|
|
||||||
};
|
|
||||||
|
|
||||||
# csd = {
|
|
||||||
# preferred = "server";
|
|
||||||
# size = 26;
|
|
||||||
# font = ...;
|
|
||||||
# color = ...; # foreground color
|
|
||||||
# hide-when-maximized = "no";
|
|
||||||
# border-width = 0;
|
|
||||||
# border-color = ...;
|
|
||||||
# button-width = 26;
|
|
||||||
# button-color = ...; # background color
|
|
||||||
# button-minimize-color = ...;
|
|
||||||
# button-maximize-color = ...;
|
|
||||||
# button-close-color = ...;
|
|
||||||
# };
|
|
||||||
|
|
||||||
key-bindings = {
|
|
||||||
scrollback-up-page = "Shift+Page_Up Shift+KP_Page_Up";
|
|
||||||
# scrollback-up-half-page = "none";
|
|
||||||
# scrollback-up-line = "none";
|
|
||||||
scrollback-down-page = "Shift+Page_Down Shift+KP_Page_Down";
|
|
||||||
# scrollback-down-half-page = "none";
|
|
||||||
# scrollback-down-line = "none";
|
|
||||||
# scrollback-home = "none";
|
|
||||||
# scrollback-end = "none";
|
|
||||||
|
|
||||||
clipboard-copy = "Control+Shift+c XF86Copy";
|
|
||||||
clipboard-paste = "Control+Shift+v XF86Paste";
|
|
||||||
primary-paste = "Shift+Insert";
|
|
||||||
search-start = "Control+Shift+r";
|
|
||||||
|
|
||||||
font-increase = "Control+plus Control+equal Control+KP_Add";
|
|
||||||
font-decrease = "Control+minus Control+KP_Subtract";
|
|
||||||
font-reset = "Control+0 Control+KP_0";
|
|
||||||
|
|
||||||
spawn-terminal = "Control+Shift+n";
|
|
||||||
# minimize = "none";
|
|
||||||
# maximize = "none";
|
|
||||||
# fullscreen = "none";
|
|
||||||
|
|
||||||
pipe-visible = "[sh -c \"xurls | fuzzel | xargs -r firefox\"] none";
|
|
||||||
pipe-scrollback = "[sh -c \"xurls | fuzzel | xargs -r firefox\"] none";
|
|
||||||
pipe-selected = "[xargs -r firefox] none";
|
|
||||||
pipe-command-output = "[wl-copy] none";
|
|
||||||
|
|
||||||
show-urls-launch = "Control+Shift+o";
|
|
||||||
# show-urls-copy = "none";
|
|
||||||
# show-urls-persistent = "none";
|
|
||||||
|
|
||||||
prompt-prev = "Control+Shift+z";
|
|
||||||
prompt-next = "Control+Shift+x";
|
|
||||||
|
|
||||||
unicode-input = "Control+Shift+u";
|
|
||||||
# color-theme-switch-1 = "none";
|
|
||||||
# color-theme-switch-2 = "none";
|
|
||||||
color-theme-toggle = "Control+Alt+p";
|
|
||||||
|
|
||||||
# noop = "none";
|
|
||||||
# quit = "none";
|
|
||||||
};
|
|
||||||
|
|
||||||
search-bindings = {
|
|
||||||
cancel = "Control+g Control+c Escape";
|
|
||||||
commit = "Return KP_Enter";
|
|
||||||
|
|
||||||
find-prev = "Control+r";
|
|
||||||
find-next = "Control+s";
|
|
||||||
|
|
||||||
cursor-left = "Left Control+b";
|
|
||||||
cursor-left-word = "Control+Left Mod1+b";
|
|
||||||
cursor-right = "Right Control+f";
|
|
||||||
cursor-right-word = "Control+Right Mod1+f";
|
|
||||||
cursor-home = "Home Control+a";
|
|
||||||
cursor-end = "End Control+e";
|
|
||||||
|
|
||||||
delete-prev = "BackSpace";
|
|
||||||
delete-prev-word = "Mod1+BackSpace Control+BackSpace";
|
|
||||||
delete-next = "Delete";
|
|
||||||
delete-next-word = "Mod1+d Control+Delete";
|
|
||||||
delete-to-start = "Control+u";
|
|
||||||
delete-to-end = "Control+k";
|
|
||||||
|
|
||||||
extend-char = "Shift+Right";
|
|
||||||
extend-to-word-boundary = "Control+w Control+Shift+Right";
|
|
||||||
extend-to-next-whitespace = "Control+Shift+w";
|
|
||||||
extend-line-down = "Shift+Down";
|
|
||||||
extend-backward-char = "Shift+Left";
|
|
||||||
extend-backward-to-word-boundary = "Control+Shift+Left";
|
|
||||||
# extend-backward-to-next-whitespace = "none";
|
|
||||||
extend-line-up = "Shift+Up";
|
|
||||||
|
|
||||||
clipboard-paste = "Control+v Control+Shift+v Control+y XF86Paste";
|
|
||||||
primary-paste = "Shift+Insert";
|
|
||||||
|
|
||||||
# unicode-input = "none";
|
|
||||||
|
|
||||||
scrollback-up-page = "Shift+Page_Up Shift+KP_Page_Up";
|
|
||||||
# scrollback-up-half-page = "none";
|
|
||||||
# scrollback-up-line = "none";
|
|
||||||
scrollback-down-page = "Shift+Page_Down Shift+KP_Page_Down";
|
|
||||||
# scrollback-down-half-page = "none";
|
|
||||||
# scrollback-down-line = "none";
|
|
||||||
# scrollback-home = "none";
|
|
||||||
# scrollback-end = "none";
|
|
||||||
};
|
|
||||||
|
|
||||||
url-bindings = {
|
|
||||||
cancel = "Control+g Control+c Control+d Escape";
|
|
||||||
toggle-url-visible = "t";
|
|
||||||
};
|
|
||||||
|
|
||||||
text-bindings = {
|
|
||||||
"\\x03" = "Mod4+c"; # map Super+c -> Control+c
|
|
||||||
};
|
|
||||||
|
|
||||||
mouse-bindings = {
|
|
||||||
scrollback-up-mouse = "BTN_WHEEL_BACK";
|
|
||||||
scrollback-down-mouse = "BTN_WHEEL_FORWARD";
|
|
||||||
font-increase = "Control+BTN_WHEEL_BACK";
|
|
||||||
font-decrease = "Control+BTN_WHEEL_FORWARD";
|
|
||||||
selection-override-modifiers = "Shift";
|
|
||||||
primary-paste = "BTN_MIDDLE";
|
|
||||||
select-begin = "BTN_LEFT";
|
|
||||||
select-begin-block = "Control+BTN_LEFT";
|
|
||||||
select-extend = "BTN_RIGHT";
|
|
||||||
select-extend-character-wise = "Control+BTN_RIGHT";
|
|
||||||
select-word = "BTN_LEFT-2";
|
|
||||||
select-word-whitespace = "Control+BTN_LEFT-2";
|
|
||||||
select-quote = "BTN_LEFT-3";
|
|
||||||
select-row = "BTN_LEFT-4";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,45 +0,0 @@
|
||||||
{pkgs, ...}: {
|
|
||||||
home = {
|
|
||||||
packages = [
|
|
||||||
pkgs.ghostty
|
|
||||||
];
|
|
||||||
|
|
||||||
sessionVariables.TERMINAL = "ghostty";
|
|
||||||
};
|
|
||||||
|
|
||||||
programs.ghostty = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
settings = {
|
|
||||||
theme = "Dracula";
|
|
||||||
font-family = "Geist Nerd Font";
|
|
||||||
font-feature = ["liga" "calt"];
|
|
||||||
|
|
||||||
window-padding-x = 12;
|
|
||||||
window-padding-y = 6;
|
|
||||||
window-theme = "system";
|
|
||||||
|
|
||||||
window-height = 26;
|
|
||||||
window-width = 90;
|
|
||||||
copy-on-select = true;
|
|
||||||
gtk-single-instance = false;
|
|
||||||
adw-toolbar-style = "flat";
|
|
||||||
|
|
||||||
# disable close confirmations
|
|
||||||
confirm-close-surface = false;
|
|
||||||
|
|
||||||
keybind = [
|
|
||||||
"ctrl+shift+plus=increase_font_size:1"
|
|
||||||
"ctrl+shift+minus=decrease_font_size:1"
|
|
||||||
|
|
||||||
"ctrl+h=goto_split:left"
|
|
||||||
"ctrl+l=goto_split:right"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
#themes = {
|
|
||||||
#aylur-dark = colors (import ./colors.nix {scheme = "dark";});
|
|
||||||
#aylur-light = colors (import ./colors.nix {scheme = "light";});
|
|
||||||
#};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
209
homes/modules/theme.rasi
Executable file
209
homes/modules/theme.rasi
Executable file
|
|
@ -0,0 +1,209 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Author : Aditya Shakya (adi1090x)
|
||||||
|
* Github : @adi1090x
|
||||||
|
*
|
||||||
|
* Rofi Theme File
|
||||||
|
* Rofi Version: 1.7.3
|
||||||
|
**/
|
||||||
|
|
||||||
|
/*****----- Configuration -----*****/
|
||||||
|
configuration {
|
||||||
|
modi: "drun,run,filebrowser,window";
|
||||||
|
show-icons: true;
|
||||||
|
display-drun: "APPS";
|
||||||
|
display-run: "RUN";
|
||||||
|
display-filebrowser: "FILES";
|
||||||
|
display-window: "WINDOW";
|
||||||
|
drun-display-format: "{name}";
|
||||||
|
window-format: "{w} · {c} · {t}";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****----- Global Properties -----*****/
|
||||||
|
* {
|
||||||
|
font: "JetBrains Mono Nerd Font 10";
|
||||||
|
background: #11092D;
|
||||||
|
background-alt: #281657;
|
||||||
|
foreground: #FFFFFF;
|
||||||
|
selected: #DF5296;
|
||||||
|
active: #6E77FF;
|
||||||
|
urgent: #8E3596;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****----- Main Window -----*****/
|
||||||
|
window {
|
||||||
|
/* properties for window widget */
|
||||||
|
transparency: "real";
|
||||||
|
location: center;
|
||||||
|
anchor: center;
|
||||||
|
fullscreen: false;
|
||||||
|
width: 1000px;
|
||||||
|
x-offset: 0px;
|
||||||
|
y-offset: 0px;
|
||||||
|
|
||||||
|
/* properties for all widgets */
|
||||||
|
enabled: true;
|
||||||
|
border-radius: 15px;
|
||||||
|
cursor: "default";
|
||||||
|
background-color: @background;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****----- Main Box -----*****/
|
||||||
|
mainbox {
|
||||||
|
enabled: true;
|
||||||
|
spacing: 0px;
|
||||||
|
background-color: transparent;
|
||||||
|
orientation: horizontal;
|
||||||
|
children: [ "imagebox", "listbox" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
imagebox {
|
||||||
|
padding: 20px;
|
||||||
|
background-color: transparent;
|
||||||
|
background-image: url("~/.config/rofi/images/j.jpg", height);
|
||||||
|
orientation: vertical;
|
||||||
|
children: [ "inputbar", "dummy", "mode-switcher" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
listbox {
|
||||||
|
spacing: 20px;
|
||||||
|
padding: 20px;
|
||||||
|
background-color: transparent;
|
||||||
|
orientation: vertical;
|
||||||
|
children: [ "message", "listview" ];
|
||||||
|
}
|
||||||
|
|
||||||
|
dummy {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****----- Inputbar -----*****/
|
||||||
|
inputbar {
|
||||||
|
enabled: true;
|
||||||
|
spacing: 10px;
|
||||||
|
padding: 15px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background-color: @background-alt;
|
||||||
|
text-color: @foreground;
|
||||||
|
children: [ "textbox-prompt-colon", "entry" ];
|
||||||
|
}
|
||||||
|
textbox-prompt-colon {
|
||||||
|
enabled: true;
|
||||||
|
expand: false;
|
||||||
|
str: "";
|
||||||
|
background-color: inherit;
|
||||||
|
text-color: inherit;
|
||||||
|
}
|
||||||
|
entry {
|
||||||
|
enabled: true;
|
||||||
|
background-color: inherit;
|
||||||
|
text-color: inherit;
|
||||||
|
cursor: text;
|
||||||
|
placeholder: "Search";
|
||||||
|
placeholder-color: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****----- Mode Switcher -----*****/
|
||||||
|
mode-switcher{
|
||||||
|
enabled: true;
|
||||||
|
spacing: 20px;
|
||||||
|
background-color: transparent;
|
||||||
|
text-color: @foreground;
|
||||||
|
}
|
||||||
|
button {
|
||||||
|
padding: 15px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background-color: @background-alt;
|
||||||
|
text-color: inherit;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
button selected {
|
||||||
|
background-color: @selected;
|
||||||
|
text-color: @foreground;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****----- Listview -----*****/
|
||||||
|
listview {
|
||||||
|
enabled: true;
|
||||||
|
columns: 1;
|
||||||
|
lines: 8;
|
||||||
|
cycle: true;
|
||||||
|
dynamic: true;
|
||||||
|
scrollbar: false;
|
||||||
|
layout: vertical;
|
||||||
|
reverse: false;
|
||||||
|
fixed-height: true;
|
||||||
|
fixed-columns: true;
|
||||||
|
|
||||||
|
spacing: 10px;
|
||||||
|
background-color: transparent;
|
||||||
|
text-color: @foreground;
|
||||||
|
cursor: "default";
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****----- Elements -----*****/
|
||||||
|
element {
|
||||||
|
enabled: true;
|
||||||
|
spacing: 15px;
|
||||||
|
padding: 8px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background-color: transparent;
|
||||||
|
text-color: @foreground;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
element normal.normal {
|
||||||
|
background-color: inherit;
|
||||||
|
text-color: inherit;
|
||||||
|
}
|
||||||
|
element normal.urgent {
|
||||||
|
background-color: @urgent;
|
||||||
|
text-color: @foreground;
|
||||||
|
}
|
||||||
|
element normal.active {
|
||||||
|
background-color: @active;
|
||||||
|
text-color: @foreground;
|
||||||
|
}
|
||||||
|
element selected.normal {
|
||||||
|
background-color: @selected;
|
||||||
|
text-color: @foreground;
|
||||||
|
}
|
||||||
|
element selected.urgent {
|
||||||
|
background-color: @urgent;
|
||||||
|
text-color: @foreground;
|
||||||
|
}
|
||||||
|
element selected.active {
|
||||||
|
background-color: @urgent;
|
||||||
|
text-color: @foreground;
|
||||||
|
}
|
||||||
|
element-icon {
|
||||||
|
background-color: transparent;
|
||||||
|
text-color: inherit;
|
||||||
|
size: 32px;
|
||||||
|
cursor: inherit;
|
||||||
|
}
|
||||||
|
element-text {
|
||||||
|
background-color: transparent;
|
||||||
|
text-color: inherit;
|
||||||
|
cursor: inherit;
|
||||||
|
vertical-align: 0.5;
|
||||||
|
horizontal-align: 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*****----- Message -----*****/
|
||||||
|
message {
|
||||||
|
background-color: transparent;
|
||||||
|
}
|
||||||
|
textbox {
|
||||||
|
padding: 15px;
|
||||||
|
border-radius: 10px;
|
||||||
|
background-color: @background-alt;
|
||||||
|
text-color: @foreground;
|
||||||
|
vertical-align: 0.5;
|
||||||
|
horizontal-align: 0.0;
|
||||||
|
}
|
||||||
|
error-message {
|
||||||
|
padding: 15px;
|
||||||
|
border-radius: 20px;
|
||||||
|
background-color: @background;
|
||||||
|
text-color: @foreground;
|
||||||
|
}
|
||||||
|
|
@ -1,379 +0,0 @@
|
||||||
# NOTE: hyprland must be enabled in BOTH your host config (for running hyprland)
|
|
||||||
# NOTE: and your home-manager config (for managing hyprland's config files)
|
|
||||||
{
|
|
||||||
hostname,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
imports = [
|
|
||||||
./kanshi.nix
|
|
||||||
];
|
|
||||||
|
|
||||||
home.packages = with pkgs; [
|
|
||||||
playerctl
|
|
||||||
];
|
|
||||||
|
|
||||||
wayland.windowManager.hyprland = {
|
|
||||||
enable = true;
|
|
||||||
package = null;
|
|
||||||
portalPackage = null;
|
|
||||||
|
|
||||||
xwayland.enable = true;
|
|
||||||
|
|
||||||
# systemd= {
|
|
||||||
# enable = true;
|
|
||||||
# # enable autostart of applications
|
|
||||||
# # REF: `man 8 systemd-xdg-autostart-generator`
|
|
||||||
# enableXdgAutostart = true;
|
|
||||||
# };
|
|
||||||
|
|
||||||
settings = {
|
|
||||||
"$MOD" =
|
|
||||||
if hostname == "myputer"
|
|
||||||
then "ALT" # my SUPER key broke ;w;
|
|
||||||
else "SUPER";
|
|
||||||
|
|
||||||
# applications
|
|
||||||
"$editor" = "hx";
|
|
||||||
"$terminal" = "foot";
|
|
||||||
"$menu" = "fuzzel";
|
|
||||||
"$colorpicker" = "hyprpicker | head -c 7 | wl-copy";
|
|
||||||
"$screenshot_region" = "hyprshot -m region --clipboard-only";
|
|
||||||
"$screenshot_window" = "hyprshot -m window --clipboard-only";
|
|
||||||
"$cursorLock" = "~/scripts/bin/hyprland-cursor-lock";
|
|
||||||
|
|
||||||
# startup programs
|
|
||||||
exec-once = [
|
|
||||||
# TODO: make these independent of hyprland, add these to the
|
|
||||||
"mako &"
|
|
||||||
"awww-daemon &"
|
|
||||||
"waybar &"
|
|
||||||
|
|
||||||
# "wl-paste --type text --watch cliphist store"
|
|
||||||
# "wl-paste --type image --watch cliphist store"
|
|
||||||
# "wl-clip-persist --clipboard regular"
|
|
||||||
# "playerctld daemon"
|
|
||||||
];
|
|
||||||
|
|
||||||
# monitor configuration
|
|
||||||
monitor =
|
|
||||||
if hostname == "lolcathost"
|
|
||||||
then [
|
|
||||||
"eDP-1, highres@highrr, 0x0, 1.0" # Programming
|
|
||||||
# "eDP-1, highres@highrr, 0x0, 1.5" # Comfy
|
|
||||||
]
|
|
||||||
else if hostname == "myputer"
|
|
||||||
then [
|
|
||||||
"DP-2, 3840x2160@60.00Hz, 0x0, 1.0"
|
|
||||||
"HDMI-A-1, 1920x1080@119.98Hz, 3840x0, 1.0"
|
|
||||||
]
|
|
||||||
else [];
|
|
||||||
|
|
||||||
# .__. .___ __..___. . . .___ .___. ._. __ __.
|
|
||||||
# [__] [__ (__ | |__| [__ | | / ` (__
|
|
||||||
# | | [___ .__) | | | [___ | _|_ \__. .__)
|
|
||||||
general = {
|
|
||||||
gaps_in = 12; # margin between windows
|
|
||||||
gaps_out = 25; # margin from windows to monitor edge
|
|
||||||
gaps_workspaces = 0; # margin between workspaces (stacks with gaps_out)
|
|
||||||
# float_gaps = 0; # gaps_out but for floating windows
|
|
||||||
|
|
||||||
border_size = 4;
|
|
||||||
|
|
||||||
"col.active_border" = "rgba(33ccffee) rgba(00ff99ee) 45deg";
|
|
||||||
"col.inactive_border" = "rgba(00000000)";
|
|
||||||
|
|
||||||
# Enable resizing windows by clicking and dragging the border
|
|
||||||
resize_on_border = true;
|
|
||||||
|
|
||||||
# REF: https://wiki.hyprland.org/Configuring/Tearing/
|
|
||||||
allow_tearing = false;
|
|
||||||
|
|
||||||
layout = "dwindle";
|
|
||||||
|
|
||||||
snap = {
|
|
||||||
enabled = false;
|
|
||||||
window_gap = 10;
|
|
||||||
monitor_gap = 10;
|
|
||||||
border_overlap = false;
|
|
||||||
# respect_gaps = false;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
decoration = {
|
|
||||||
rounding = 20;
|
|
||||||
rounding_power = 4.0; # Lp norm
|
|
||||||
border_part_of_window = true; # consider border as part of its window
|
|
||||||
# screen_shader = ...; # path to custom GLSL fragment shader
|
|
||||||
|
|
||||||
# window Transparency
|
|
||||||
active_opacity = 1.0;
|
|
||||||
inactive_opacity = 0.95;
|
|
||||||
fullscreen_opacity = 1.0; # fullscreened windows
|
|
||||||
# inactive Window Dimming
|
|
||||||
dim_inactive = false;
|
|
||||||
dim_strength = 0.5;
|
|
||||||
dim_special = 0.2;
|
|
||||||
dim_around = 0.4;
|
|
||||||
|
|
||||||
blur = {
|
|
||||||
enabled = true;
|
|
||||||
new_optimizations = true;
|
|
||||||
xray = false; # floating windows xray through tiling windows
|
|
||||||
ignore_opacity = true;
|
|
||||||
|
|
||||||
# blur Parameters
|
|
||||||
size = 8;
|
|
||||||
passes = 1;
|
|
||||||
noise = 0.0117; # default
|
|
||||||
contrast = 0.8916; # default
|
|
||||||
brightness = 0.8172; # default
|
|
||||||
vibrancy = 0.1696; # default
|
|
||||||
vibrancy_darkness = 0.0; # default
|
|
||||||
|
|
||||||
# blurring For Specific Window Types
|
|
||||||
special = false; # blur special windows
|
|
||||||
popups = false; # blur popups
|
|
||||||
popups_ignorealpha = 0.2;
|
|
||||||
input_methods = false;
|
|
||||||
input_methods_ignorealpha = 0.2;
|
|
||||||
};
|
|
||||||
|
|
||||||
shadow = {
|
|
||||||
enabled = true;
|
|
||||||
ignore_window = true; # only render at edges (not behind)
|
|
||||||
|
|
||||||
range = 3;
|
|
||||||
render_power = 1; # falloff rate
|
|
||||||
sharp = false; # aka infinite shadow.render_power
|
|
||||||
offset = "0 0"; # vec2
|
|
||||||
scale = 1.0;
|
|
||||||
|
|
||||||
color = "rgba(00000000)";
|
|
||||||
color_inactive = "rgba(000000ff)"; # defaults to shadow.color if unset
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
# REF: https://cubic-bezier.com
|
|
||||||
bezier = [
|
|
||||||
"easeOutQuint,0.23,1,0.32,1"
|
|
||||||
"easeInOutCubic,0.65,0.05,0.36,1"
|
|
||||||
"linear,0,0,1,1"
|
|
||||||
"almostLinear,0.5,0.5,0.75,1.0"
|
|
||||||
"quick,0.15,0,0.1,1"
|
|
||||||
];
|
|
||||||
|
|
||||||
# REF: https://wiki.hyprland.org/Configuring/Animations
|
|
||||||
# Animation Declaration Format:
|
|
||||||
# "animation = NAME, ENABLE, SPEED, BEZIER [,STYLE]"
|
|
||||||
# NOTE: SPEED is in ds (where 1ds = 100ms)
|
|
||||||
animations = [
|
|
||||||
"global, 1, 10, default"
|
|
||||||
"border, 1, 5.39, easeOutQuint"
|
|
||||||
|
|
||||||
"windowsIn, 1, 4, linear, slide bottom"
|
|
||||||
"windowsOut, 1, 10, linear, popin"
|
|
||||||
|
|
||||||
"fadeIn, 1, 1.73, almostLinear"
|
|
||||||
"fadeOut, 1, 1.46, almostLinear"
|
|
||||||
"fade, 1, 3.03, quick"
|
|
||||||
|
|
||||||
"layers, 1, 3.81, easeOutQuint"
|
|
||||||
"layersIn, 1, 4, easeOutQuint, fade"
|
|
||||||
"layersOut, 1, 1.5, linear, fade"
|
|
||||||
|
|
||||||
"fadeLayersIn, 1, 1.79, almostLinear"
|
|
||||||
"fadeLayersOut, 1, 1.39, almostLinear"
|
|
||||||
|
|
||||||
"workspaces, 1, 1.94, almostLinear, fade"
|
|
||||||
"workspacesIn, 1, 1.21, almostLinear, fade"
|
|
||||||
"workspacesOut, 1, 1.94, almostLinear, fade"
|
|
||||||
];
|
|
||||||
|
|
||||||
# REF: https://wiki.hyprland.org/Configuring/Dwindle-Layout
|
|
||||||
dwindle = {
|
|
||||||
# master switch for pseudotiling. enabling is bound to MOD + P in the keybinds section below
|
|
||||||
pseudotile = true;
|
|
||||||
preserve_split = true; # You probably want this
|
|
||||||
};
|
|
||||||
|
|
||||||
# REF: https://wiki.hyprland.org/Configuring/Master-Layout
|
|
||||||
master = {
|
|
||||||
new_status = "master";
|
|
||||||
};
|
|
||||||
|
|
||||||
misc = {
|
|
||||||
#force_default_wallpaper = -1; # Set to 0 or 1 to disable the anime mascot wallpapers
|
|
||||||
disable_hyprland_logo = true;
|
|
||||||
disable_splash_rendering = true;
|
|
||||||
|
|
||||||
enable_anr_dialog = false;
|
|
||||||
font_family = "Geist Mono";
|
|
||||||
};
|
|
||||||
|
|
||||||
input = {
|
|
||||||
# kb_layout = "us";
|
|
||||||
# kb_variant =
|
|
||||||
# kb_model =
|
|
||||||
# kb_options =
|
|
||||||
# kb_rules =
|
|
||||||
|
|
||||||
follow_mouse = 1;
|
|
||||||
|
|
||||||
sensitivity = 0; # -1.0 - 1.0, 0 means no modification
|
|
||||||
accel_profile = "flat";
|
|
||||||
force_no_accel = false; # not recommended to turn on
|
|
||||||
|
|
||||||
repeat_rate = 50;
|
|
||||||
repeat_delay = 300;
|
|
||||||
|
|
||||||
touchpad = {
|
|
||||||
natural_scroll = hostname == "lolcathost";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
cursor.no_hardware_cursors = true;
|
|
||||||
|
|
||||||
# standard keypress bindings
|
|
||||||
bind = [
|
|
||||||
# terminal commands
|
|
||||||
"$MOD, RETURN, exec, $terminal"
|
|
||||||
"$MOD SHIFT, RETURN, exec, $terminal -D `[ -f ~/cry/.projdir ] && cat ~/cry/.projdir || echo ~`"
|
|
||||||
|
|
||||||
# btop
|
|
||||||
"$MOD, P, exec, bash -c \"{ hyprctl clients | rg '^\w*title: btop' &>/dev/null; } && hyprctl dispatch closewindow title:btop || $terminal -T btop btop & disown\""
|
|
||||||
|
|
||||||
"$MOD, R, exec, $menu"
|
|
||||||
|
|
||||||
# lock mouse to window (mostly, for gaming)
|
|
||||||
"$MOD, F1, exec, pkill hyprland-cursor || $cursorLock"
|
|
||||||
"$MOD, F2, exec, $colorpicker"
|
|
||||||
|
|
||||||
# screenshots
|
|
||||||
"$MOD, S, exec, $screenshot_region"
|
|
||||||
"$MOD SHIFT, S, exec, $screenshot_window"
|
|
||||||
|
|
||||||
"$MOD, F, fullscreen"
|
|
||||||
"$MOD SHIFT, F, fullscreenstate, 0 3" # fakefullscreen
|
|
||||||
"$MOD, C, killactive"
|
|
||||||
"$MOD SHIFT, Delete, exit"
|
|
||||||
|
|
||||||
# switch window
|
|
||||||
"$MOD, left, movefocus, l"
|
|
||||||
"$MOD, right, movefocus, r"
|
|
||||||
"$MOD, up, movefocus, u"
|
|
||||||
"$MOD, down, movefocus, d"
|
|
||||||
"$MOD, H, movefocus, l"
|
|
||||||
"$MOD, J, movefocus, d"
|
|
||||||
"$MOD, K, movefocus, u"
|
|
||||||
"$MOD, L, movefocus, r"
|
|
||||||
|
|
||||||
# switch workspaces
|
|
||||||
"$MOD, 1, workspace, 1"
|
|
||||||
"$MOD, 2, workspace, 2"
|
|
||||||
"$MOD, 3, workspace, 3"
|
|
||||||
"$MOD, 4, workspace, 4"
|
|
||||||
"$MOD, 5, workspace, 5"
|
|
||||||
"$MOD, 6, workspace, 6"
|
|
||||||
"$MOD, 7, workspace, 7"
|
|
||||||
"$MOD, 8, workspace, 8"
|
|
||||||
"$MOD, 9, workspace, 9"
|
|
||||||
"$MOD, 0, workspace, 10"
|
|
||||||
"$MOD SHIFT, left, workspace, e-1"
|
|
||||||
"$MOD SHIFT, right, workspace, e+1"
|
|
||||||
|
|
||||||
# move window to workspace
|
|
||||||
"$MOD SHIFT, 1, movetoworkspace, 1"
|
|
||||||
"$MOD SHIFT, 2, movetoworkspace, 2"
|
|
||||||
"$MOD SHIFT, 3, movetoworkspace, 3"
|
|
||||||
"$MOD SHIFT, 4, movetoworkspace, 4"
|
|
||||||
"$MOD SHIFT, 5, movetoworkspace, 5"
|
|
||||||
"$MOD SHIFT, 6, movetoworkspace, 6"
|
|
||||||
"$MOD SHIFT, 7, movetoworkspace, 7"
|
|
||||||
"$MOD SHIFT, 8, movetoworkspace, 8"
|
|
||||||
"$MOD SHIFT, 9, movetoworkspace, 9"
|
|
||||||
"$MOD SHIFT, 0, movetoworkspace, 10"
|
|
||||||
|
|
||||||
# move workspace to monitor
|
|
||||||
"$MOD TAB, 1, movecurrentworkspacetomonitor, DP-2"
|
|
||||||
"$MOD TAB, 2, movecurrentworkspacetomonitor, HDMA-A-1"
|
|
||||||
];
|
|
||||||
|
|
||||||
# bindings for mouse
|
|
||||||
bindm = [
|
|
||||||
"$MOD, mouse:272, movewindow"
|
|
||||||
"$MOD, mouse:273, resizewindow"
|
|
||||||
];
|
|
||||||
|
|
||||||
# bindings that work even while screen is locked
|
|
||||||
bindl = [
|
|
||||||
# WARNING: requires `pkgs.playerctl`
|
|
||||||
", XF86AudioNext, exec, playerctl next"
|
|
||||||
", XF86AudioPause, exec, playerctl play-pause"
|
|
||||||
", XF86AudioPlay, exec, playerctl play-pause"
|
|
||||||
", XF86AudioPrev, exec, playerctl previous"
|
|
||||||
];
|
|
||||||
|
|
||||||
# bindings that work even while screen is locked
|
|
||||||
# and also repeat when the key is held
|
|
||||||
bindel = [
|
|
||||||
",XF86AudioRaiseVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%+"
|
|
||||||
",XF86AudioLowerVolume, exec, wpctl set-volume @DEFAULT_AUDIO_SINK@ 5%-"
|
|
||||||
",XF86AudioMute, exec, wpctl set-mute @DEFAULT_AUDIO_SINK@ toggle"
|
|
||||||
",XF86AudioMicMute, exec, wpctl set-mute @DEFAULT_AUDIO_SOURCE@ toggle"
|
|
||||||
",XF86MonBrightnessUp, exec, brightnessctl s 10%+"
|
|
||||||
",XF86MonBrightnessDown, exec, brightnessctl s 10%-"
|
|
||||||
];
|
|
||||||
|
|
||||||
windowrule = [
|
|
||||||
# btop process manager
|
|
||||||
{
|
|
||||||
name = "terminal-manager";
|
|
||||||
"match:class" = "^(foot)$";
|
|
||||||
"match:title" = "^(btop)$";
|
|
||||||
float = true;
|
|
||||||
center = true;
|
|
||||||
size = "(monitor_w*0.65) (monitor_h*0.65)";
|
|
||||||
}
|
|
||||||
|
|
||||||
# ignore maximize requests from apps
|
|
||||||
{
|
|
||||||
name = "suppress-maximize";
|
|
||||||
suppress_event = "maximize";
|
|
||||||
"match:class" = ".*";
|
|
||||||
}
|
|
||||||
|
|
||||||
# fix some dragging issues with XWayland
|
|
||||||
{
|
|
||||||
name = "no-focus";
|
|
||||||
no_focus = "on";
|
|
||||||
"match:class" = "^$";
|
|
||||||
"match:title" = "^$";
|
|
||||||
"match:xwayland" = true;
|
|
||||||
"match:float" = true;
|
|
||||||
"match:fullscreen" = false;
|
|
||||||
"match:pin" = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
# TODO: style fakefullscreen windows to clearly indicate their difference
|
|
||||||
# {
|
|
||||||
# name = "fake-fullscreen";
|
|
||||||
# }
|
|
||||||
];
|
|
||||||
|
|
||||||
# █▀▀ █▄░█ █░█ █░█ ▄▀█ █▀█
|
|
||||||
# ██▄ █░▀█ ▀▄▀ ▀▄▀ █▀█ █▀▄
|
|
||||||
env = [
|
|
||||||
"XCURSOR_THEME,Bibata-Modern-Ice"
|
|
||||||
"XCURSOR_SIZE,16"
|
|
||||||
"HYPRCURSOR_THEME,Bibata-Modern-Ice"
|
|
||||||
"HYPRCURSOR_SIZE,16"
|
|
||||||
|
|
||||||
"QT_QPA_PLATFORM,wayland"
|
|
||||||
"QT_QPA_PLATFORMTHEME,xdgdesktopportal" # makes portals work correctly
|
|
||||||
"XDG_MENU_PREFIX,arch-"
|
|
||||||
"XDG_CURRENT_DESKTOP,Hyprland"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,107 +0,0 @@
|
||||||
{...}: {
|
|
||||||
home.shellAliases = {
|
|
||||||
logoff = "mmsg -q";
|
|
||||||
};
|
|
||||||
|
|
||||||
wayland.windowManager.mango = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
systemd = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
# enable autostart of applications
|
|
||||||
# REF: `man 8 systemd-xdg-autostart-generator`
|
|
||||||
xdgAutostart = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
settings = ''
|
|
||||||
# REF: config.conf
|
|
||||||
exec-once = awww-daemon
|
|
||||||
exec-once = mako
|
|
||||||
|
|
||||||
bind=SUPER,Return,spawn,foot
|
|
||||||
bind=SUPER,R,spawn,fuzzel
|
|
||||||
|
|
||||||
bind=SUPER+SHIFT,R,reload_config
|
|
||||||
bind=SUPER,Q,killclient
|
|
||||||
|
|
||||||
# Brightness
|
|
||||||
bind=NONE,XF86MonBrightnessUp,spawn,brightnessctl -e4 -n2 set 5%+
|
|
||||||
bind=NONE,XF86MonBrightnessDown,spawn,brightnessctl -e4 -n2 set 5%-
|
|
||||||
bind=SUPER+SHIFT,-,spawn brightnessctl -e4 -n2 set 5%+
|
|
||||||
bind=SUPER+SHIFT,+,spawn brightnessctl -e4 -n2 set 5%-
|
|
||||||
|
|
||||||
# Window Options
|
|
||||||
bind=SUPER,F,togglefullscreen
|
|
||||||
bind=SUPER+SHIFT,F,togglefakefullscreen
|
|
||||||
|
|
||||||
# Window Movement
|
|
||||||
bind=SUPER,Tab,focusstack,next
|
|
||||||
bind=SUPER,h,focusdir,left
|
|
||||||
bind=SUPER,l,focusdir,right
|
|
||||||
bind=SUPER,k,focusdir,up
|
|
||||||
bind=SUPER,j,focusdir,down
|
|
||||||
bind=SUPER,Left,focusdir,left
|
|
||||||
bind=SUPER,Right,focusdir,right
|
|
||||||
bind=SUPER,Up,focusdir,up
|
|
||||||
bind=SUPER,Down,focusdir,down
|
|
||||||
|
|
||||||
keymode=resize
|
|
||||||
bind=NONE,Left,resizewin,-10.0
|
|
||||||
bind=NONE,Right,resizewin,+10.0
|
|
||||||
bind=NONE,Escape,setkeymode,default
|
|
||||||
|
|
||||||
# Keyboard
|
|
||||||
repeat_rate=25
|
|
||||||
repeat_delay=300
|
|
||||||
numlockon=0
|
|
||||||
xkb_rules_layout=us
|
|
||||||
|
|
||||||
# Laptop Specific Things
|
|
||||||
# disable_trackpad=0
|
|
||||||
# mouse_natural_scrolling=1
|
|
||||||
|
|
||||||
|
|
||||||
bind=SUPER,1,view,1,0
|
|
||||||
bind=SUPER,2,view,2,0
|
|
||||||
bind=SUPER,3,view,3,0
|
|
||||||
bind=SUPER,4,view,4,0
|
|
||||||
bind=SUPER,5,view,5,0
|
|
||||||
bind=SUPER,6,view,6,0
|
|
||||||
bind=SUPER,7,view,7,0
|
|
||||||
bind=SUPER,8,view,8,0
|
|
||||||
bind=SUPER,9,view,9,0
|
|
||||||
bind=SUPER+SHIFT,1,tag,1,0
|
|
||||||
bind=SUPER+SHIFT,2,tag,2,0
|
|
||||||
bind=SUPER+SHIFT,3,tag,3,0
|
|
||||||
bind=SUPER+SHIFT,4,tag,4,0
|
|
||||||
bind=SUPER+SHIFT,5,tag,5,0
|
|
||||||
bind=SUPER+SHIFT,6,tag,6,0
|
|
||||||
bind=SUPER+SHIFT,7,tag,7,0
|
|
||||||
bind=SUPER+SHIFT,8,tag,8,0
|
|
||||||
bind=SUPER+SHIFT,9,tag,9,0
|
|
||||||
|
|
||||||
bind=SUPER+SHIFT,h,focusmon,left
|
|
||||||
bind=SUPER+SHIFT,l,focusmon,right
|
|
||||||
bind=SUPER+SHIFT,k,focusmon,up
|
|
||||||
bind=SUPER+SHIFT,j,focusmon,down
|
|
||||||
|
|
||||||
# bind=SUPER,Left,tagmon,left
|
|
||||||
# bind=SUPER,Right,tagmon,right
|
|
||||||
# bind=SUPER,Up,tagmon,up
|
|
||||||
# bind=SUPER,Down,tagmon,down
|
|
||||||
|
|
||||||
bind=SUPER,g,toggleglobal
|
|
||||||
bind=SUPER,o,toggleoverlay
|
|
||||||
bind=SUPER,a,togglefloating
|
|
||||||
bind=SUPER,z,toggle_scratchpad
|
|
||||||
|
|
||||||
'';
|
|
||||||
autostart_sh = ''
|
|
||||||
# REF: autostart.sh
|
|
||||||
|
|
||||||
# XDG_CURRENT_DESKTOP=mango
|
|
||||||
# dbus-update-activation-environment --systemd WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
|
|
||||||
'';
|
|
||||||
};
|
|
||||||
}
|
|
||||||
183
homes/modules/wofi.nix
Executable file
183
homes/modules/wofi.nix
Executable file
|
|
@ -0,0 +1,183 @@
|
||||||
|
{
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
programs.wofi = {
|
||||||
|
enable = true;
|
||||||
|
settings = {
|
||||||
|
location = "center";
|
||||||
|
allow_markup = true;
|
||||||
|
width = 250;
|
||||||
|
};
|
||||||
|
# Force the style to stop Stylix being a bitch and overwriting it
|
||||||
|
style = lib.mkForce ''
|
||||||
|
@define-color rosewater #f2d5cf;
|
||||||
|
@define-color rosewater-rgb rgb(242, 213, 207);
|
||||||
|
@define-color flamingo #eebebe;
|
||||||
|
@define-color flamingo-rgb rgb(238, 190, 190);
|
||||||
|
@define-color pink #f4b8e4;
|
||||||
|
@define-color pink-rgb rgb(244, 184, 228);
|
||||||
|
@define-color mauve #ca9ee6;
|
||||||
|
@define-color mauve-rgb rgb(202, 158, 230);
|
||||||
|
@define-color red #e78284;
|
||||||
|
@define-color red-rgb rgb(231, 130, 132);
|
||||||
|
@define-color maroon #ea999c;
|
||||||
|
@define-color maroon-rgb rgb(234, 153, 156);
|
||||||
|
@define-color peach #ef9f76;
|
||||||
|
@define-color peach-rgb rgb(239, 159, 118);
|
||||||
|
@define-color yellow #e5c890;
|
||||||
|
@define-color yellow-rgb rgb(229, 200, 144);
|
||||||
|
@define-color green #a6d189;
|
||||||
|
@define-color green-rgb rgb(166, 209, 137);
|
||||||
|
@define-color teal #81c8be;
|
||||||
|
@define-color teal-rgb rgb(129, 200, 190);
|
||||||
|
@define-color sky #99d1db;
|
||||||
|
@define-color sky-rgb rgb(153, 209, 219);
|
||||||
|
@define-color sapphire #85c1dc;
|
||||||
|
@define-color sapphire-rgb rgb(133, 193, 220);
|
||||||
|
@define-color blue #8caaee;
|
||||||
|
@define-color blue-rgb rgb(140, 170, 238);
|
||||||
|
@define-color lavender #babbf1;
|
||||||
|
@define-color lavender-rgb rgb(186, 187, 241);
|
||||||
|
@define-color text #c6d0f5;
|
||||||
|
@define-color text-rgb rgb(198, 208, 245);
|
||||||
|
@define-color subtext1 #b5bfe2;
|
||||||
|
@define-color subtext1-rgb rgb(181, 191, 226);
|
||||||
|
@define-color subtext0 #a5adce;
|
||||||
|
@define-color subtext0-rgb rgb(165, 173, 206);
|
||||||
|
@define-color overlay2 #949cbb;
|
||||||
|
@define-color overlay2-rgb rgb(148, 156, 187);
|
||||||
|
@define-color overlay1 #838ba7;
|
||||||
|
@define-color overlay1-rgb rgb(131, 139, 167);
|
||||||
|
@define-color overlay0 #737994;
|
||||||
|
@define-color overlay0-rgb rgb(115, 121, 148);
|
||||||
|
@define-color surface2 #626880;
|
||||||
|
@define-color surface2-rgb rgb(98, 104, 128);
|
||||||
|
@define-color surface1 #51576d;
|
||||||
|
@define-color surface1-rgb rgb(81, 87, 109);
|
||||||
|
@define-color surface0 #414559;
|
||||||
|
@define-color surface0-rgb rgb(65, 69, 89);
|
||||||
|
@define-color base #303446;
|
||||||
|
@define-color base-rgb rgb(48, 52, 70);
|
||||||
|
@define-color mantle #292c3c;
|
||||||
|
@define-color mantle-rgb rgb(41, 44, 60);
|
||||||
|
@define-color crust #232634;
|
||||||
|
@define-color crust-rgb rgb(35, 38, 52);
|
||||||
|
|
||||||
|
* {
|
||||||
|
font-family: 'FiraCode Nerd Font';
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Window */
|
||||||
|
window {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 10px;
|
||||||
|
border: 0.16em solid @teal;
|
||||||
|
border-radius: 0.5em;
|
||||||
|
background-color: @base;
|
||||||
|
animation: slideIn 0.25s ease-in-out both;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Slide In */
|
||||||
|
@keyframes slideIn {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Inner Box */
|
||||||
|
#inner-box {
|
||||||
|
margin: 5px;
|
||||||
|
padding: 10px;
|
||||||
|
border: none;
|
||||||
|
background-color: @base;
|
||||||
|
/*animation: fadeIn 0.5s ease-in-out both;*/
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Fade In */
|
||||||
|
@keyframes fadeIn {
|
||||||
|
0% {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
100% {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Outer Box */
|
||||||
|
#outer-box {
|
||||||
|
margin: 5px;
|
||||||
|
padding: 10px;
|
||||||
|
border: none;
|
||||||
|
background-color: @base;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Scroll */
|
||||||
|
#scroll {
|
||||||
|
margin: 0px;
|
||||||
|
padding: 10px;
|
||||||
|
border: none;
|
||||||
|
background-color: @base;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Input */
|
||||||
|
#input {
|
||||||
|
margin: 5px 20px;
|
||||||
|
padding: 10px;
|
||||||
|
border: none;
|
||||||
|
border-radius: 0.25em;
|
||||||
|
color: @text;
|
||||||
|
background-color: @base;
|
||||||
|
animation: fadeIn 0.25s ease-in-out both;
|
||||||
|
}
|
||||||
|
|
||||||
|
#input image {
|
||||||
|
border: none;
|
||||||
|
color: @red;
|
||||||
|
}
|
||||||
|
|
||||||
|
#input * {
|
||||||
|
outline: 4px solid @red!important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Text */
|
||||||
|
#text {
|
||||||
|
margin: 5px;
|
||||||
|
border: none;
|
||||||
|
color: @text;
|
||||||
|
animation: fadeIn 0.5s ease-in-out both;
|
||||||
|
}
|
||||||
|
|
||||||
|
#entry {
|
||||||
|
background-color: @base;
|
||||||
|
}
|
||||||
|
|
||||||
|
#entry arrow {
|
||||||
|
border: none;
|
||||||
|
color: @teal;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Selected Entry */
|
||||||
|
#entry:selected {
|
||||||
|
border: 0.10em solid @teal;
|
||||||
|
border-radius: 0.25em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#entry:selected #text {
|
||||||
|
color: @teal;
|
||||||
|
}
|
||||||
|
|
||||||
|
#entry:drop(active) {
|
||||||
|
background-color: @lavender!important;
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
72
homes/subspace/default.nix
Normal file
72
homes/subspace/default.nix
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
{
|
||||||
|
inputs,
|
||||||
|
outputs,
|
||||||
|
lib,
|
||||||
|
config,
|
||||||
|
pkgs,
|
||||||
|
...
|
||||||
|
}: {
|
||||||
|
nixpkgs = {
|
||||||
|
config.allowUnfree = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
imports = [
|
||||||
|
];
|
||||||
|
|
||||||
|
home = {
|
||||||
|
username = "subspace";
|
||||||
|
homeDirectory = "/home/subspace";
|
||||||
|
};
|
||||||
|
|
||||||
|
programs = {
|
||||||
|
fish = {
|
||||||
|
enable = true;
|
||||||
|
# Extra commands to run when entering a interactive shell
|
||||||
|
# (for the subspace user this will be exiting fish to
|
||||||
|
# run wishlist instead, a shell should not pop up!)
|
||||||
|
loginShellInit = ''
|
||||||
|
clear
|
||||||
|
exec wishlist
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
ssh = {
|
||||||
|
enable = true;
|
||||||
|
forwardAgent = true;
|
||||||
|
addKeysToAgent = "yes";
|
||||||
|
|
||||||
|
matchBlocks = {
|
||||||
|
hyrule = {
|
||||||
|
hostname = "imbored.dev";
|
||||||
|
user = "ae";
|
||||||
|
port = 22;
|
||||||
|
identityFile = "~/.ssh/id_hyrule";
|
||||||
|
};
|
||||||
|
YearnForTheMines = {
|
||||||
|
hostname = "deadlyserver.com";
|
||||||
|
user = "emile";
|
||||||
|
port = 29843;
|
||||||
|
identityFile = "~/.ssh/id_deadlyserver";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
# Nicely reload system units when changing configs
|
||||||
|
systemd.user.startServices = "sd-switch";
|
||||||
|
|
||||||
|
# SERVICE: webfishing (example for wishlist)
|
||||||
|
#systemd.user.services.webfishing = {
|
||||||
|
# Unit.Description = "I be out here webfishing frfr";
|
||||||
|
|
||||||
|
# Install.WantedBy = ["default.target"];
|
||||||
|
|
||||||
|
# Service = {
|
||||||
|
# Type = "exec";
|
||||||
|
# ExecStart = "echo $HOME; cat $HOME/.ssh/config";
|
||||||
|
# Restart = "always";
|
||||||
|
# };
|
||||||
|
#};
|
||||||
|
|
||||||
|
home.stateVersion = "24.11"; # DO NOT MODIFY
|
||||||
|
}
|
||||||
|
|
@ -1,91 +0,0 @@
|
||||||
{...}: {
|
|
||||||
imports = [
|
|
||||||
./hardware.nix
|
|
||||||
|
|
||||||
./services
|
|
||||||
];
|
|
||||||
|
|
||||||
# super duper minimum grub2 config
|
|
||||||
boot.loader.grub = {
|
|
||||||
enable = true;
|
|
||||||
device = "/dev/vda";
|
|
||||||
};
|
|
||||||
|
|
||||||
networking = {
|
|
||||||
hostName = "butterfly";
|
|
||||||
|
|
||||||
firewall = {
|
|
||||||
allowedTCPPorts = [
|
|
||||||
22 # forgejo ssh
|
|
||||||
80 # nginx
|
|
||||||
# 143 # IMAP4
|
|
||||||
443 # nginx
|
|
||||||
# 587 # SMTPS
|
|
||||||
2222 # TEMP: forgejo ssh
|
|
||||||
# 3000 (INTERNAL) forgejo
|
|
||||||
# 3306 (INTERNAL) forgejo sqlite3 database
|
|
||||||
# 8222 (INTERNAL) vaultwarden
|
|
||||||
42069 # ssh
|
|
||||||
45000 # minecaft server
|
|
||||||
];
|
|
||||||
allowedUDPPorts = [
|
|
||||||
54231 # Wireguard
|
|
||||||
];
|
|
||||||
};
|
|
||||||
|
|
||||||
# wg-quick.interfaces = {
|
|
||||||
# wg0 = {
|
|
||||||
# address = [
|
|
||||||
# "10.10.10.4/24"
|
|
||||||
# ];
|
|
||||||
# dns = ["10.10.10.1"];
|
|
||||||
# privateKeyFile = "/root/wg_agrivpn_hyrule";
|
|
||||||
# peers = [
|
|
||||||
# {
|
|
||||||
# # peer's public key
|
|
||||||
# publicKey = "iZ4aqYjbT8O8tfUHEuV+yWLtdoQbdBb6Nt0M4usMSiY=";
|
|
||||||
|
|
||||||
# # choose which traffic to forward
|
|
||||||
# allowedIPs = [
|
|
||||||
# "10.0.51.0/24"
|
|
||||||
# "10.10.10.0/24"
|
|
||||||
# ];
|
|
||||||
# endpoint = "150.242.34.33:54231";
|
|
||||||
# }
|
|
||||||
# ];
|
|
||||||
# };
|
|
||||||
# };
|
|
||||||
};
|
|
||||||
|
|
||||||
services.pixiecore = {
|
|
||||||
enable = false;
|
|
||||||
|
|
||||||
port = 1234;
|
|
||||||
statusPort = 1234;
|
|
||||||
openFirewall = true;
|
|
||||||
listen = "0.0.0.0";
|
|
||||||
|
|
||||||
quick = "xyz";
|
|
||||||
mode = "boot";
|
|
||||||
};
|
|
||||||
|
|
||||||
users.users = {
|
|
||||||
cry = {
|
|
||||||
openssh.authorizedKeys.keys = [
|
|
||||||
"ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQCsUZY45rgezi+8iROdcR5vPeacJ2fbMjlDijfUrH9hRX2FzCsg/4e3aFKhi2seZMmyTfbstxmDrrH8paUS5TibFgLFBGNngaF3CTjg85i5pm25Hr4IVo31oziBnTWaG6j3buYKtz5e1qSPzXywinJR+5+FCUJU7Fxa+EWTZcOX4wYgArSj4q73rZmvk5N0X44Mudt4nvpD2chvxygsdTzD6ph92qCuaJ/AbfmOoC7b/xvOaOVydUfgDLpHi9VZbd3akvvKxRfW6ZklldgXEzPXKMuastN0mwcBxvIb5G1Vkj8jtSVtKPc5psZ9/NWA5l38xH4qZ6z7eib6thtEMdtcKmTZEEWDADjqTea5Gj61c1n18cr6f3Tff+0bn/cxsl4Y0esi+aDeuCXYiIYNmeKBx0ttDNIxpk4J5Fdh6Xs+AZif5lnJErtu8TPy2aC0bc9wehTjMyvilTHfyerOD1ZJXhN2XwRVDGN7t7leAJZISJlPjqTDcw3Vfvzte/5JqS+FR+hbpG4uz2ix8kUa20u5YF2oSdGl8+zsdozVsdQm10Iv9WSXBV7t4m+oyodgtfzydBpmXq7aBXudCiEKw+7TC7F+1a4YFrVrCNXKFgKUpd1MiVLl7DIbzm5U9MD2BB3Fy7BPCzr3tW6/ExOhhpBWY+HnzVGQfkNr7dRcqfipKw== ae@dobutterfliescry.net"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
foxora = {
|
|
||||||
isNormalUser = true;
|
|
||||||
createHome = true;
|
|
||||||
home = "/home/foxora";
|
|
||||||
openssh.authorizedKeys.keys = [
|
|
||||||
"ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDSBRYKap1p5lPocRTkguhJN72D2R2CImt5cFYx3Qa7h aurora@nixarawrui"
|
|
||||||
];
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
virtualisation.docker.enable = true;
|
|
||||||
|
|
||||||
system.stateVersion = "24.11"; # DO NOT MODIFY
|
|
||||||
}
|
|
||||||
|
|
@ -1,7 +0,0 @@
|
||||||
{...}: {
|
|
||||||
imports = [
|
|
||||||
./nginx.nix
|
|
||||||
./forgejo.nix
|
|
||||||
./vaultwarden.nix
|
|
||||||
];
|
|
||||||
}
|
|
||||||
|
|
@ -1,181 +0,0 @@
|
||||||
{
|
|
||||||
config,
|
|
||||||
lib,
|
|
||||||
...
|
|
||||||
}: let
|
|
||||||
cfg = config.services.forgejo;
|
|
||||||
in {
|
|
||||||
# REF: https://github.com/NixOS/nixpkgs/blob/nixos-25.11/nixos/modules/services/misc/forgejo.nix
|
|
||||||
# REF: forgejo doesn't create the user/group by default if its name isn't "forgejo"
|
|
||||||
users.users = lib.mkIf (cfg.user != "forgejo") {
|
|
||||||
${cfg.user} = {
|
|
||||||
home = cfg.stateDir;
|
|
||||||
useDefaultShell = true;
|
|
||||||
group = cfg.group;
|
|
||||||
isSystemUser = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
users.groups = lib.mkIf (cfg.group != "forgejo") {
|
|
||||||
${cfg.group} = {};
|
|
||||||
};
|
|
||||||
|
|
||||||
# more options here: https://mynixos.com/nixpkgs/options/services.forgejo
|
|
||||||
# TODO: set a favicon https://forgejo.org/docs/next/contributor/customization/#changing-the-logo
|
|
||||||
# (might need me to override settings in the nixpkg)
|
|
||||||
# TODO: create a custom theme for forgejo (modify the source files most likely)
|
|
||||||
services.forgejo = {
|
|
||||||
enable = true;
|
|
||||||
|
|
||||||
# XXX: WARNING: XXX: WARNING: XXX: TODO: set user="git" and settings.server.SSH_PORT=22
|
|
||||||
# XXX: WARNING: XXX: WARNING: XXX: TODO: (currently both cause errors)
|
|
||||||
# XXX: WARNING: XXX: WARNING: XXX: TODO: THE USER FAILS I THINK CAUSE THE DIRECTORY DOESNT CHANGE THE USER PERMISSIONS
|
|
||||||
|
|
||||||
user = "git"; # user forgejo runs as
|
|
||||||
# group = "forgejo"; # group forgejo runs as
|
|
||||||
# stateDir = "/var/lib/forgejo";
|
|
||||||
|
|
||||||
# enable support for Git Large File Storage
|
|
||||||
lfs.enable = true;
|
|
||||||
database = {
|
|
||||||
type = "sqlite3"; # postgres
|
|
||||||
host = "127.0.0.1";
|
|
||||||
port = "3306"; # 5432 if postgres
|
|
||||||
};
|
|
||||||
# settings are written directly to the `app.ini` config file
|
|
||||||
# refer to: https://forgejo.org/docs/latest/admin/config-cheat-sheet/
|
|
||||||
settings = {
|
|
||||||
server = {
|
|
||||||
# ENABLE_ACME = true;
|
|
||||||
# ACME_EMAIL = "them@dobutterfliescry.net";
|
|
||||||
DOMAIN = "tearforge.net";
|
|
||||||
ROOT_URL = "https://tearforge.net";
|
|
||||||
# address and port to listen on
|
|
||||||
HTTP_ADDR = "127.0.0.1";
|
|
||||||
HTTP_PORT = 3000;
|
|
||||||
PROTOCOL = "http"; # http internally, reverse proxy uses https externally
|
|
||||||
|
|
||||||
START_SSH_SERVER = true;
|
|
||||||
DISABLE_SSH = false;
|
|
||||||
SSH_PORT = 2222;
|
|
||||||
|
|
||||||
SSH_SERVER_CIPHERS = "chacha20-poly1305@openssh.com,";
|
|
||||||
SSH_SERVER_KEY_EXCHANGES = "sntrup761x25519-sha512,mlkem768x25519-sha256";
|
|
||||||
};
|
|
||||||
|
|
||||||
DEFAULT = {
|
|
||||||
APP_NAME = "tearforge";
|
|
||||||
APP_SLOGIN = "but cozy";
|
|
||||||
APP_DISPLAY_NAME_FORMAT = "{APP_NAME} ::{APP_SLOGAN}::";
|
|
||||||
};
|
|
||||||
|
|
||||||
repository = {
|
|
||||||
DEFAULT_PRIVATE = "private"; # last, private, public
|
|
||||||
# repo/org created on push to non-existent
|
|
||||||
ENABLE_PUSH_CREATE_USER = true;
|
|
||||||
ENABLE_PUSH_CREATE_ORG = true;
|
|
||||||
DEFAULT_PUSH_CREATE_PRIVATE = true;
|
|
||||||
MAX_CREATION_LIMIT = -1;
|
|
||||||
};
|
|
||||||
|
|
||||||
"repository.upload" = {
|
|
||||||
# max per-file size in MB
|
|
||||||
FILE_MAX_SIZE = 50;
|
|
||||||
# max number of files per upload
|
|
||||||
MAX_FILES = 5;
|
|
||||||
};
|
|
||||||
|
|
||||||
badges = let
|
|
||||||
# flat, flat-square, plastic, for-the-badge, social
|
|
||||||
style = "for-the-badge";
|
|
||||||
in {
|
|
||||||
ENABLED = true;
|
|
||||||
GENERATOR_URL_TEMPLATE = "https://img.shields.io/badge/{{.label}}-{{.text}}-{{.color}}?style=${style}";
|
|
||||||
};
|
|
||||||
|
|
||||||
ui = {
|
|
||||||
DEFAULT_THEME = "forgejo-dark";
|
|
||||||
THEMES = "forgejo-auto,forgejo-light,forgejo-dark";
|
|
||||||
};
|
|
||||||
"ui.meta" = {
|
|
||||||
AUTHOR = "_cry64";
|
|
||||||
DESCRIPTION = "This is my personal self-hosted git forge, where I keep and maintain personal projects! PS do butterflies cry when they're sad?";
|
|
||||||
KEYWORDS = "emile,clark,boman,clarkboman,emileclarkb,cry,_cry64,cry64,dobutterfliescry,butterfly,butterflies,git,forge,forgejo,self-hosted,tearforge";
|
|
||||||
};
|
|
||||||
|
|
||||||
markdown = {
|
|
||||||
ENABLE_HARD_LINE_BREAK_IN_COMMENTS = true;
|
|
||||||
ENABLE_MATH = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
admin = {
|
|
||||||
DEFAULT_EMAIL_NOTIFICATIONS = "enabled";
|
|
||||||
SEND_NOTIFICATION_EMAIL_ON_NEW_USER = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
security = {
|
|
||||||
# Controls access to the installation page.
|
|
||||||
# When set to “true”, the installation page is not accessible.
|
|
||||||
#INSTALL_LOCK = false;
|
|
||||||
|
|
||||||
PASSWORD_HASH_ALGO = "argon2"; # ARGON2 BEST ALGO FR!! (default: argon2$2$65536$8$50)
|
|
||||||
MIN_PASSWORD_LENGTH = 12;
|
|
||||||
PASSWORD_COMPLEXITY = "lower,upper,digit,spec";
|
|
||||||
PASSWORD_CHECK_PWN = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
service = {
|
|
||||||
DISABLE_REGISTRATION = true; # toggle for new users
|
|
||||||
#DEFAULT_USER_IS_RESTRICTED = true;
|
|
||||||
# Forbid login with third-party services (ie github)
|
|
||||||
ALLOW_ONLY_INTERNAL_REGISTRATION = true;
|
|
||||||
ENABLE_CAPTCHA = true;
|
|
||||||
REQUIRE_CAPTCHA_FOR_LOGIN = true;
|
|
||||||
REQUIRE_EXTERNAL_REGISTRATION_CAPTCHA = true;
|
|
||||||
LOGIN_REMEMBER_DAYS = 365;
|
|
||||||
ENABLE_NOTIFY_MAIL = true;
|
|
||||||
};
|
|
||||||
"service.explore" = {
|
|
||||||
REQUIRE_SIGNIN_VIEW = false;
|
|
||||||
DISABLE_USERS_PAGE = false;
|
|
||||||
DISABLE_ORGANIZATIONS_PAGE = false;
|
|
||||||
DISABLE_CODE_PAGE = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
cache = {
|
|
||||||
ADAPTER = "twoqueue";
|
|
||||||
HOST = "{\"size\":100, \"recent_ratio\":0.25, \"ghost_ratio\":0.5}";
|
|
||||||
ITEM_TTL = "16h";
|
|
||||||
};
|
|
||||||
|
|
||||||
# TODO: fill this in once my mail server is configured
|
|
||||||
# email.incoming = { ... };
|
|
||||||
|
|
||||||
# optional
|
|
||||||
mailer = {
|
|
||||||
ENABLED = false;
|
|
||||||
SMTP_ADDR = "mail.tearforge.net";
|
|
||||||
FROM = "noreply@tearforge.net";
|
|
||||||
USER = "noreply@tearforge.net";
|
|
||||||
};
|
|
||||||
|
|
||||||
log = {
|
|
||||||
MODE = "file";
|
|
||||||
LEVEL = "Info"; # "Trace", "Debug", "Info", "Warn", "Error", "Critical"
|
|
||||||
ENABLE_SSH_LOG = true;
|
|
||||||
};
|
|
||||||
|
|
||||||
cron = {
|
|
||||||
ENABLED = true;
|
|
||||||
RUN_AT_START = false;
|
|
||||||
};
|
|
||||||
|
|
||||||
other = {
|
|
||||||
SHOW_FOOTER_VERSION = true;
|
|
||||||
SHOW_FOOTER_TEMPLATE_LOAD_TIME = true;
|
|
||||||
SHOW_FOOTER_POWERED_BY = true;
|
|
||||||
ENABLE_SITEMAP = true;
|
|
||||||
ENABLE_FEED = true;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,38 +0,0 @@
|
||||||
{
|
|
||||||
config,
|
|
||||||
pkgs,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
imports = [
|
|
||||||
(builtins.fetchTarball {
|
|
||||||
url = "https://gitlab.com/simple-nixos-mailserver/nixos-mailserver/-/archive/nixos-25.05/nixos-mailserver-nixos-25.05.tar.gz";
|
|
||||||
sha256 = "0jpp086m839dz6xh6kw5r8iq0cm4nd691zixzy6z11c4z2vf8v85";
|
|
||||||
})
|
|
||||||
];
|
|
||||||
|
|
||||||
# simple-nixos-mailserver
|
|
||||||
# DOCS: https://nixos-mailserver.readthedocs.io/en/latest
|
|
||||||
mailserver = {
|
|
||||||
enable = true;
|
|
||||||
# stateVersion = 3;
|
|
||||||
# Manually open the firewall instead
|
|
||||||
openFirewall = false;
|
|
||||||
virusScanning = false; # expensive memory usage
|
|
||||||
|
|
||||||
fqdn = "mail.imbored.dev";
|
|
||||||
domains = ["imbored.dev"];
|
|
||||||
|
|
||||||
# NOTE: generate hashes with `mkpasswd -sm bcrypt`
|
|
||||||
loginAccounts = {
|
|
||||||
"them@dobutterfliescry.net" = {
|
|
||||||
aliases = ["cry@dobutterfliescry.net"];
|
|
||||||
hashedPasswordFile = let
|
|
||||||
CWD = builtins.getEnv "PWD";
|
|
||||||
# XXX: TODO: use a secrets manager!
|
|
||||||
in "${CWD}/secrets/passwd/me";
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
certificateScheme = "acme-nginx";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,65 +0,0 @@
|
||||||
{
|
|
||||||
pkgs,
|
|
||||||
upkgs,
|
|
||||||
...
|
|
||||||
}: {
|
|
||||||
services.minecraft-server = {
|
|
||||||
enable = true;
|
|
||||||
package = upkgs.minecraft-server; # use latest version only!
|
|
||||||
declarative = true;
|
|
||||||
|
|
||||||
eula = true;
|
|
||||||
|
|
||||||
openFirewall = false; # do this manually instead
|
|
||||||
|
|
||||||
whitelist = {
|
|
||||||
"SECRET1" = "";
|
|
||||||
"SECRET2" = "";
|
|
||||||
};
|
|
||||||
|
|
||||||
# REF: https://minecraft.wiki/w/Server.properties#Java_Edition
|
|
||||||
serverProperties = {
|
|
||||||
server-ip = "195.114.14.69"; # listen on all addresses if unset
|
|
||||||
server-port = 45000; # connection port
|
|
||||||
"query.port" = 45000; # share game info/advertising information
|
|
||||||
user-native-transport = true; # Linux packet RX/TX optimizations
|
|
||||||
|
|
||||||
# Users Connections
|
|
||||||
enforce-secure-profile = true;
|
|
||||||
online-mode = true; # don't allow unlicensed minecraft accounts to join
|
|
||||||
prevent-proxy-connections = false;
|
|
||||||
rate-limit = 0;
|
|
||||||
|
|
||||||
# Server Functionality
|
|
||||||
enable-status = true; # where the server appears as "online"
|
|
||||||
hide-online-players = false;
|
|
||||||
log-ips = true;
|
|
||||||
pause-when-empty-seconds = 60; # pause server when no player online for x seconds
|
|
||||||
view-distance = 10; # range: 3-32
|
|
||||||
simulation-distance = 10; # range: 3-32
|
|
||||||
|
|
||||||
# Players
|
|
||||||
motd = "M&M's Cozycraft Realm <3";
|
|
||||||
max-players = 2;
|
|
||||||
white-list = true;
|
|
||||||
idle-player-timeout = 0; # never kick idle players
|
|
||||||
|
|
||||||
# Gameplay
|
|
||||||
gamemode = "survival";
|
|
||||||
force-gamemode = true;
|
|
||||||
difficulty = "normal";
|
|
||||||
hardcore = false;
|
|
||||||
pvp = true;
|
|
||||||
allow-cheats = true;
|
|
||||||
|
|
||||||
# World
|
|
||||||
level-name = "M&M's Cozycraft"; # world name
|
|
||||||
# level-seed = "" # random seed if unset
|
|
||||||
level-type = "minecraft:normal"; # world generation preset
|
|
||||||
generate-structures = true;
|
|
||||||
spawn-monsters = true;
|
|
||||||
spawn-protection = 0;
|
|
||||||
};
|
|
||||||
jvmOpts = "-Xms2046M -Xmx2046M -XX:+UseG1GC -XX:ParallelGCThreads=2 -XX:MinHeapFreeRatio=5 -XX:MaxHeapFreeRatio=10";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,57 +0,0 @@
|
||||||
{pkgs, ...}: {
|
|
||||||
services.nginx = {
|
|
||||||
enable = true;
|
|
||||||
# NOTE: in wake of CVE-2022-3602/CVE-2022-3786 nginxStable is overlayed
|
|
||||||
package = pkgs.nginx;
|
|
||||||
|
|
||||||
# recommendedGzipSettings = true;
|
|
||||||
# recommendedOptimisation = true;
|
|
||||||
# recommendedProxySettings = true;
|
|
||||||
# recommendedTlsSettings = true;
|
|
||||||
|
|
||||||
# streamConfig = ''
|
|
||||||
# server {
|
|
||||||
# listen 127.0.0.1:53 udp reuseport;
|
|
||||||
# proxy_timeout 20s;
|
|
||||||
# proxy_pass 192.168.0.1:53535;
|
|
||||||
# }
|
|
||||||
# '';
|
|
||||||
|
|
||||||
virtualHosts = let
|
|
||||||
localhost = "http://127.0.0.1";
|
|
||||||
std = {
|
|
||||||
# TODO: should I run over QUIC+HTTP3? (experimental)
|
|
||||||
# quic = true;
|
|
||||||
# http3 = true;
|
|
||||||
enableACME = true;
|
|
||||||
# kTLS = true; # offload TLS to the linux kernel
|
|
||||||
};
|
|
||||||
in {
|
|
||||||
"dobutterfliescry.net" =
|
|
||||||
{
|
|
||||||
default = true;
|
|
||||||
addSSL = true; # addSSL NOT forceSSL <3
|
|
||||||
root = "${pkgs.dobutterfliescry-net}/www";
|
|
||||||
# extraConfig = ''
|
|
||||||
# error_page 404 /custom_404.html;
|
|
||||||
# '';
|
|
||||||
}
|
|
||||||
// std;
|
|
||||||
"vault.imbored.dev" =
|
|
||||||
{
|
|
||||||
forceSSL = true;
|
|
||||||
locations."/".proxyPass = "${localhost}:8222";
|
|
||||||
}
|
|
||||||
// std;
|
|
||||||
"tearforge.net" =
|
|
||||||
{
|
|
||||||
forceSSL = true;
|
|
||||||
extraConfig = ''
|
|
||||||
client_max_body_size 512M;
|
|
||||||
'';
|
|
||||||
locations."/".proxyPass = "${localhost}:3000";
|
|
||||||
}
|
|
||||||
// std;
|
|
||||||
};
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
||||||
{...}: {
|
|
||||||
services.vaultwarden = {
|
|
||||||
enable = true;
|
|
||||||
dbBackend = "sqlite";
|
|
||||||
|
|
||||||
# backupDir = "/var/backup/vaultwarden"; # disable with null
|
|
||||||
|
|
||||||
# https://mynixos.com/nixpkgs/option/services.vaultwarden.config
|
|
||||||
config = {
|
|
||||||
# internal address and port to listen on
|
|
||||||
ROCKET_ADDRESS = "127.0.0.1";
|
|
||||||
ROCKET_PORT = 8222;
|
|
||||||
|
|
||||||
# hostname to listen for
|
|
||||||
DOMAIN = "https://vault.imbored.dev";
|
|
||||||
|
|
||||||
# signup policy
|
|
||||||
SIGNUPS_ALLOWED = false;
|
|
||||||
SIGNUPS_VERIFY = true;
|
|
||||||
INVITATIONS_ALLOWED = true;
|
|
||||||
};
|
|
||||||
# https://mynixos.com/nixpkgs/option/services.vaultwarden.environmentFile
|
|
||||||
environmentFile = "/var/lib/vaultwarden/vaultwarden.env";
|
|
||||||
};
|
|
||||||
}
|
|
||||||
Some files were not shown because too many files have changed in this diff Show more
Loading…
Add table
Add a link
Reference in a new issue