Merge home-manager into nixos

Previously the home-manager and nixos sections of my config had been
separated into different branches on the same repository. This commit
merges the home-manager modules into the directory, and convert the
"systems" that used to be on each branch into hosts and users.

The goal of this change is to make it easier to see the hosts and users
paradigm, as well as limit the number of locations the git repository is
installed. Additionally, having different branches tracking different
changes was silly for a git repository.
This commit is contained in:
Julia Lange 2024-11-11 21:01:02 -08:00
commit 86bc28d6d4
Signed by: Julia
SSH key fingerprint: SHA256:KI8YxpkPRbnDRkXPgCuQCVz181++Vy7NAvmQj8alOhM
87 changed files with 2870 additions and 29 deletions

1
.gitignore vendored Normal file
View file

@ -0,0 +1 @@
hmModules/apps/hypr/icons/

159
flake.lock generated
View file

@ -19,6 +19,25 @@
"type": "github"
}
},
"ags": {
"inputs": {
"nixpkgs": "nixpkgs_2",
"systems": "systems"
},
"locked": {
"lastModified": 1728326430,
"narHash": "sha256-tV1ABHuA1HItMdCTuNdA8fMB+qw7LpjvI945VwMSABI=",
"owner": "Aylur",
"repo": "ags",
"rev": "60180a184cfb32b61a1d871c058b31a3b9b0743d",
"type": "github"
},
"original": {
"owner": "Aylur",
"repo": "ags",
"type": "github"
}
},
"aquamarine": {
"inputs": {
"hyprutils": [
@ -106,6 +125,24 @@
"type": "github"
}
},
"home-manager": {
"inputs": {
"nixpkgs": "nixpkgs_3"
},
"locked": {
"lastModified": 1731235328,
"narHash": "sha256-NjavpgE9/bMe/ABvZpyHIUeYF1mqR5lhaep3wB79ucs=",
"owner": "nix-community",
"repo": "home-manager",
"rev": "60bb110917844d354f3c18e05450606a435d2d10",
"type": "github"
},
"original": {
"owner": "nix-community",
"repo": "home-manager",
"type": "github"
}
},
"hyprcursor": {
"inputs": {
"hyprlang": [
@ -143,27 +180,43 @@
"hyprlang": "hyprlang",
"hyprutils": "hyprutils",
"hyprwayland-scanner": "hyprwayland-scanner",
"nixpkgs": "nixpkgs_2",
"nixpkgs": "nixpkgs_4",
"pre-commit-hooks": "pre-commit-hooks",
"systems": "systems",
"systems": "systems_2",
"xdph": "xdph"
},
"locked": {
"lastModified": 1730969692,
"narHash": "sha256-yHY98IWTLDz57TrseUxdh5QnpngcNCjNXTJ2XCeNhtk=",
"lastModified": 1731372835,
"narHash": "sha256-rkNYRi7enNGo9t5ptzsOXWCl963ACPVp2ETtFCrzfWQ=",
"ref": "refs/heads/main",
"rev": "e58e97b0a38b8ccc87a4304c9e4e2b37c9966875",
"revCount": 5425,
"submodules": true,
"rev": "a29cfa78431a054a093f3c843228bac6783a6d33",
"revCount": 5449,
"type": "git",
"url": "https://github.com/hyprwm/Hyprland"
},
"original": {
"submodules": true,
"type": "git",
"url": "https://github.com/hyprwm/Hyprland"
}
},
"hyprland-contrib": {
"inputs": {
"nixpkgs": "nixpkgs_5"
},
"locked": {
"lastModified": 1730743354,
"narHash": "sha256-gU4NySYyXeAzVaF5bI6BKmj2CdgiwGFnuPjXUId3Dx0=",
"owner": "hyprwm",
"repo": "contrib",
"rev": "792f6b83dc719214e0e2a0b380c34f147b28ece2",
"type": "github"
},
"original": {
"owner": "hyprwm",
"repo": "contrib",
"type": "github"
}
},
"hyprland-protocols": {
"inputs": {
"nixpkgs": [
@ -230,11 +283,11 @@
]
},
"locked": {
"lastModified": 1730968903,
"narHash": "sha256-zFvzLXcSm0Ia4XI1SE4FQ9KE63hlGrRWhLtwMolWuR8=",
"lastModified": 1731163338,
"narHash": "sha256-Qflei0JBeqQ0c8jxA8e982xAxJvfMwfx4Aci2eJi84s=",
"owner": "hyprwm",
"repo": "hyprutils",
"rev": "3ce0cde8709cdacbfba471f8e828433b58a561e9",
"rev": "60d3dece30f98e8ad85131829c8529950630d6bc",
"type": "github"
},
"original": {
@ -318,11 +371,11 @@
},
"nixpkgs_2": {
"locked": {
"lastModified": 1730785428,
"narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=",
"lastModified": 1725634671,
"narHash": "sha256-v3rIhsJBOMLR8e/RNWxr828tB+WywYIoajrZKFM+0Gg=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "4aa36568d413aca0ea84a1684d2d46f55dbabad7",
"rev": "574d1eac1c200690e27b8eb4e24887f8df7ac27c",
"type": "github"
},
"original": {
@ -333,6 +386,22 @@
}
},
"nixpkgs_3": {
"locked": {
"lastModified": 1730200266,
"narHash": "sha256-l253w0XMT8nWHGXuXqyiIC/bMvh1VRszGXgdpQlfhvU=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "807e9154dcb16384b1b765ebe9cd2bba2ac287fd",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_4": {
"locked": {
"lastModified": 1730785428,
"narHash": "sha256-Zwl8YgTVJTEum+L+0zVAWvXAGbWAuXHax3KzuejaDyo=",
@ -341,13 +410,45 @@
"rev": "4aa36568d413aca0ea84a1684d2d46f55dbabad7",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_5": {
"locked": {
"lastModified": 1712163089,
"narHash": "sha256-Um+8kTIrC19vD4/lUCN9/cU9kcOsD1O1m+axJqQPyMM=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "fd281bd6b7d3e32ddfa399853946f782553163b5",
"type": "github"
},
"original": {
"owner": "NixOS",
"ref": "nixos-unstable",
"repo": "nixpkgs",
"type": "github"
}
},
"nixpkgs_6": {
"locked": {
"lastModified": 1731139594,
"narHash": "sha256-IigrKK3vYRpUu+HEjPL/phrfh7Ox881er1UEsZvw9Q4=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "76612b17c0ce71689921ca12d9ffdc9c23ce40b2",
"type": "github"
},
"original": {
"id": "nixpkgs",
"ref": "nixos-unstable",
"type": "indirect"
}
},
"nixpkgs_4": {
"nixpkgs_7": {
"locked": {
"lastModified": 1730272153,
"narHash": "sha256-B5WRZYsRlJgwVHIV6DvidFN7VX7Fg9uuwkRW9Ha8z+w=",
@ -390,22 +491,25 @@
"root": {
"inputs": {
"aagl": "aagl",
"ags": "ags",
"home-manager": "home-manager",
"hyprland": "hyprland",
"nixpkgs": "nixpkgs_3",
"hyprland-contrib": "hyprland-contrib",
"nixpkgs": "nixpkgs_6",
"sops-nix": "sops-nix"
}
},
"sops-nix": {
"inputs": {
"nixpkgs": "nixpkgs_4",
"nixpkgs": "nixpkgs_7",
"nixpkgs-stable": "nixpkgs-stable_2"
},
"locked": {
"lastModified": 1731008979,
"narHash": "sha256-yN1NxvmqV8UltLkqYBWTeZNgpD/eyh/7LM58caHiEfE=",
"lastModified": 1731364708,
"narHash": "sha256-HC0anOL+KmUQ2hdRl0AtunbAckasxrkn4VLmxbW/WaA=",
"owner": "Mic92",
"repo": "sops-nix",
"rev": "fe63071416471abdab06caa234122932a7c4b980",
"rev": "4c91d52db103e757fc25b58998b0576ae702d659",
"type": "github"
},
"original": {
@ -429,6 +533,21 @@
"type": "github"
}
},
"systems_2": {
"locked": {
"lastModified": 1689347949,
"narHash": "sha256-12tWmuL2zgBgZkdoB6qXZsgJEH9LR3oUgpaQq2RbI80=",
"owner": "nix-systems",
"repo": "default-linux",
"rev": "31732fcf5e8fea42e59c2488ad31a0e651500f68",
"type": "github"
},
"original": {
"owner": "nix-systems",
"repo": "default-linux",
"type": "github"
}
},
"xdph": {
"inputs": {
"hyprland-protocols": [

View file

@ -2,23 +2,41 @@
inputs = {
nixpkgs.url = "nixpkgs/nixos-unstable";
hyprland.url = "git+https://github.com/hyprwm/Hyprland?submodules=1";
home-manager.url = "github:nix-community/home-manager";
hyprland.url = "git+https://github.com/hyprwm/Hyprland";
hyprland-contrib.url = "github:hyprwm/contrib";
sops-nix.url = "github:Mic92/sops-nix";
ags.url = "github:Aylur/ags";
aagl.url = "github:ezKEa/aagl-gtk-on-nix";
};
outputs = { self, nixpkgs, ... }@inputs:
let
defaultConfig = extraModules: nixpkgs.lib.nixosSystem {
outputs = { self, home-manager, nixpkgs, ... }@inputs: let
system = "x86_64-linux";
pkgs = nixpkgs.legacyPackages.${system};
hostConfig = extraModules: nixpkgs.lib.nixosSystem {
specialArgs = { inherit inputs; };
system = "x86_64-linux";
system = system;
modules = [
./nixosModules
] ++ extraModules;
};
userConfig = extraModules: home-manager.lib.homeManagerConfiguration {
inherit pkgs;
extraSpecialArgs = { inherit inputs; };
modules = [
./hmModules
] ++ extraModules;
};
in
{
nixosConfigurations.onizuka = defaultConfig [ ./systems/onizuka ];
nixosConfigurations.jibril = defaultConfig [ ./systems/jibril ];
nixosConfigurations.onizuka = hostConfig [ ./hosts/onizuka ];
homeConfigurations."pan@onizuka" = userConfig [ ./hosts/onizuka/users/pan ];
nixosConfigurations.jibril = hostConfig [ ./hosts/jibril ];
homeConfigurations."pan@jibril" = userConfig [ ./hosts/jibril/users/pan ];
};
}

View file

@ -0,0 +1,13 @@
{ config, pkgs, lib, ... }:
{
options.beeper = {
enable = lib.mkEnableOption "Enables beeper";
};
config = lib.mkIf config.beeper.enable {
home.packages = with pkgs; [
beeper
];
};
}

View file

@ -0,0 +1,8 @@
{ config, pkgs, ... }:
{
imports = [
./discord
./beeper
];
}

View file

@ -0,0 +1,12 @@
{ config, pkgs, lib, ... }:
{
options.discord = {
enable = lib.mkEnableOption "Enables discord";
};
config = lib.mkIf config.discord.enable {
home.packages = with pkgs; [
vesktop # Base app
];
};
}

View file

@ -0,0 +1,20 @@
{ config, pkgs, ... }:
{
imports = [
./chat
./file-browsers
./gimp
./git
./hypr
./librewolf
./lutris
./media-viewers
./neovim
./obs
./rofi
./shells
./terminal-emulators
./zoxide
];
}

View file

@ -0,0 +1,8 @@
{ config, pkgs, lib, ... }:
{
imports = [
./lf
./nnn
];
}

View file

@ -0,0 +1,105 @@
{ config, pkgs, lib, ... }:
{
options.lf = {
enable = lib.mkEnableOption "Enables lf";
hiddenfiles = lib.mkOption { default = [ ".*" ]; };
leader = lib.mkOption { default = "<space>"; };
};
config = lib.mkIf config.lf.enable {
xdg.configFile."lf/icons".source = ./icons;
fish.extraFunctions = lib.mkIf config.fish.enable {
lf = {
body = ''cd "$(command ${pkgs.lf}/bin/lf -print-last-dir "$argv")"'';
wraps = "${pkgs.lf}/bin/lf";
};
};
programs.lf = {
enable = true;
settings = {
# Hide specific files rather than "hidden" files
hiddenfiles = config.lf.hiddenfiles;
ratios = [
2
3
];
preview = true;
ignorecase = true;
icons = true;
number = true;
relativenumber = true;
};
commands = {
dragon-out = ''%${pkgs.xdragon}/bin/xdragon -a -x "$fx"'';
trash = lib.mkIf config.trash.enable ''
%${pkgs.trash-cli}/bin/trash "$fx"
'';
zoxide-cd = lib.mkIf config.zoxide.enable ''
''${{
result="$(${pkgs.zoxide}/bin/zoxide query -i | sed 's/\\/\\\\/g;s/"/\\"/g')"
${pkgs.lf}/bin/lf -remote "send $id cd \"$result\""
}}
'';
mkdir = ''
''${{
printf "Directory Name: "
read DIR
mkdir $DIR
}}
'';
mkfile = ''
''${{
printf "File Name: "
read FILE
touch $FILE
}}
'';
on-cd = lib.mkIf config.zoxide.enable ''
&{{
${pkgs.zoxide}/bin/zoxide add "$PWD"
}}
'';
};
keybindings = let
leader = config.lf.leader;
in {
"${leader}" = "";
"v" = ":toggle; down";
"." = "set hidden!";
"x" = lib.mkIf config.trash.enable "trash";
"${leader}d" = "mkdir";
"${leader}f" = "mkfile";
"${leader}m" = "dragon-out";
"${leader}z" = lib.mkIf config.zoxide.enable "zoxide-cd";
};
extraConfig =
let
previewer =
pkgs.writeShellScriptBin "pv.sh" ''
file=$1
w=$2
h=$3
x=$4
y=$5
if [[ "$( ${pkgs.file}/bin/file -Lb --mime-type "$file")" =~ ^image ]]; then
${pkgs.kitty}/bin/kitty +kitten icat --silent --stdin no --transfer-mode file --place "''${w}x''${h}@''${x}x''${y}" "$file" < /dev/null > /dev/tty
exit 1
fi
${pkgs.pistol}/bin/pistol "$file"
'';
cleaner = pkgs.writeShellScriptBin "clean.sh" ''
${pkgs.kitty}/bin/kitty +kitten icat --clear --stdin no --silent --transfer-mode file < /dev/null > /dev/tty
'';
in
''
set cleaner ${cleaner}/bin/clean.sh
set previewer ${previewer}/bin/pv.sh
'';
};
};
}

View file

@ -0,0 +1,361 @@
# vim:ft=conf
# These examples require Nerd Fonts or a compatible font to be used.
# See https://www.nerdfonts.com for more information.
# default values from lf (with matching order)
# ln l # LINK
# or l # ORPHAN
# tw t # STICKY_OTHER_WRITABLE
# ow d # OTHER_WRITABLE
# st t # STICKY
# di d # DIR
# pi p # FIFO
# so s # SOCK
# bd b # BLK
# cd c # CHR
# su u # SETUID
# sg g # SETGID
# ex x # EXEC
# fi - # FILE
# file types (with matching order)
ln  # LINK
or  # ORPHAN
tw t # STICKY_OTHER_WRITABLE
ow  # OTHER_WRITABLE
st t # STICKY
di  # DIR
pi p # FIFO
so s # SOCK
bd b # BLK
cd c # CHR
su u # SETUID
sg g # SETGID
ex  # EXEC
fi  # FILE
# file extensions (vim-devicons)
*.styl 
*.sass 
*.scss 
*.htm 
*.html 
*.slim 
*.haml 
*.ejs 
*.css 
*.less 
*.md 
*.mdx 
*.markdown 
*.rmd 
*.json 
*.webmanifest 
*.js 
*.mjs 
*.jsx 
*.rb 
*.gemspec 
*.rake 
*.php 
*.py 
*.pyc 
*.pyo 
*.pyd 
*.coffee 
*.mustache 
*.hbs 
*.conf 
*.ini 
*.yml 
*.yaml 
*.toml 
*.bat 
*.mk 
*.jpg 
*.jpeg 
*.bmp 
*.png 
*.webp 
*.gif 
*.ico 
*.twig 
*.cpp 
*.c++ 
*.cxx 
*.cc 
*.cp 
*.c 
*.cs 󰌛
*.h 
*.hh 
*.hpp 
*.hxx 
*.hs 
*.lhs 
*.nix 
*.lua 
*.java 
*.sh 
*.fish 
*.bash 
*.zsh 
*.ksh 
*.csh 
*.awk 
*.ps1 
*.ml λ
*.mli λ
*.diff 
*.db 
*.sql 
*.dump 
*.clj 
*.cljc 
*.cljs 
*.edn 
*.scala 
*.go 
*.dart 
*.xul 
*.sln 
*.suo 
*.pl 
*.pm 
*.t 
*.rss 
'*.f#' 
*.fsscript 
*.fsx 
*.fs 
*.fsi 
*.rs 
*.rlib 
*.d 
*.erl 
*.hrl 
*.ex 
*.exs 
*.eex 
*.leex 
*.heex 
*.vim 
*.ai 
*.psd 
*.psb 
*.ts 
*.tsx 
*.jl 
*.pp 
*.vue 
*.elm 
*.swift 
*.xcplayground 
*.tex 󰙩
*.r 󰟔
*.rproj 󰗆
*.sol 󰡪
*.pem 
# file names (vim-devicons) (case-insensitive not supported in lf)
*gruntfile.coffee 
*gruntfile.js 
*gruntfile.ls 
*gulpfile.coffee 
*gulpfile.js 
*gulpfile.ls 
*mix.lock 
*dropbox 
*.ds_store 
*.gitconfig 
*.gitignore 
*.gitattributes 
*.gitlab-ci.yml 
*.bashrc 
*.zshrc 
*.zshenv 
*.zprofile 
*.vimrc 
*.gvimrc 
*_vimrc 
*_gvimrc 
*.bashprofile 
*favicon.ico 
*license 
*node_modules 
*react.jsx 
*procfile 
*dockerfile 
*docker-compose.yml 
*docker-compose.yaml 
*compose.yml 
*compose.yaml 
*rakefile 
*config.ru 
*gemfile 
*makefile 
*cmakelists.txt 
*robots.txt 󰚩
# file names (case-sensitive adaptations)
*Gruntfile.coffee 
*Gruntfile.js 
*Gruntfile.ls 
*Gulpfile.coffee 
*Gulpfile.js 
*Gulpfile.ls 
*Dropbox 
*.DS_Store 
*LICENSE 
*React.jsx 
*Procfile 
*Dockerfile 
*Docker-compose.yml 
*Docker-compose.yaml 
*Rakefile 
*Gemfile 
*Makefile 
*CMakeLists.txt 
# file patterns (vim-devicons) (patterns not supported in lf)
# .*jquery.*\.js$ 
# .*angular.*\.js$ 
# .*backbone.*\.js$ 
# .*require.*\.js$ 
# .*materialize.*\.js$ 
# .*materialize.*\.css$ 
# .*mootools.*\.js$ 
# .*vimrc.* 
# Vagrantfile$ 
# file patterns (file name adaptations)
*jquery.min.js 
*angular.min.js 
*backbone.min.js 
*require.min.js 
*materialize.min.js 
*materialize.min.css 
*mootools.min.js 
*vimrc 
Vagrantfile 
# archives or compressed (extensions from dircolors defaults)
*.tar 
*.tgz 
*.arc 
*.arj 
*.taz 
*.lha 
*.lz4 
*.lzh 
*.lzma 
*.tlz 
*.txz 
*.tzo 
*.t7z 
*.zip 
*.z 
*.dz 
*.gz 
*.lrz 
*.lz 
*.lzo 
*.xz 
*.zst 
*.tzst 
*.bz2 
*.bz 
*.tbz 
*.tbz2 
*.tz 
*.deb 
*.rpm 
*.jar 
*.war 
*.ear 
*.sar 
*.rar 
*.alz 
*.ace 
*.zoo 
*.cpio 
*.7z 
*.rz 
*.cab 
*.wim 
*.swm 
*.dwm 
*.esd 
# image formats (extensions from dircolors defaults)
*.jpg 
*.jpeg 
*.mjpg 
*.mjpeg 
*.gif 
*.bmp 
*.pbm 
*.pgm 
*.ppm 
*.tga 
*.xbm 
*.xpm 
*.tif 
*.tiff 
*.png 
*.svg 
*.svgz 
*.mng 
*.pcx 
*.mov 
*.mpg 
*.mpeg 
*.m2v 
*.mkv 
*.webm 
*.ogm 
*.mp4 
*.m4v 
*.mp4v 
*.vob 
*.qt 
*.nuv 
*.wmv 
*.asf 
*.rm 
*.rmvb 
*.flc 
*.avi 
*.fli 
*.flv 
*.gl 
*.dl 
*.xcf 
*.xwd 
*.yuv 
*.cgm 
*.emf 
*.ogv 
*.ogx 
# audio formats (extensions from dircolors defaults)
*.aac 
*.au 
*.flac 
*.m4a 
*.mid 
*.midi 
*.mka 
*.mp3 
*.mpc 
*.ogg 
*.ra 
*.wav 
*.oga 
*.opus 
*.spx 
*.xspf 
# other formats
*.pdf 

View file

@ -0,0 +1,20 @@
{ config, pkgs, lib, ... }:
{
options.nnn = {
enable = lib.mkEnableOption "Enables nnn";
};
config = lib.mkIf config.nnn.enable {
programs.nnn.enable = true;
home.sessionVariables = {
NNN_FCOLORS = "0000E6310000000000000000";
NNN_OPTS = "eH";
NNN_FIFO = "/tmp/nnn.fifo";
NNN_TRASH = lib.mkIf config.trash.enable "1";
};
fish.extraFunctions = lib.mkIf config.fish.enable {
n = ''${builtins.readFile ./nnn_fish_function.fish}'';
};
};
}

View file

@ -0,0 +1,30 @@
# Block nesting of nnn in subshells
if test -n "$NNNLVL"
if [ (expr $NNNLVL + 0) -ge 1 ]
exit
return
end
end
# The default behaviour is to cd on quit (nnn checks if NNN_TMPFILE is set)
# To cd on quit only on ^G, remove the "-x" as in:
# set NNN_TMPFILE "$XDG_CONFIG_HOME/nnn/.lastd"
# NOTE: NNN_TMPFILE is fixed, should not be modified
if test -n "$XDG_CONFIG_HOME"
set -x NNN_TMPFILE "$XDG_CONFIG_HOME/nnn/.lastd"
else
set -x NNN_TMPFILE "$HOME/.config/nnn/.lastd"
end
# Unmask ^Q (, ^V etc.) (if required, see `stty -a`) to Quit nnn
# stty start undef
# stty stop undef
# stty lwrap undef
# stty lnext undef
nnn -T v $argv
if test -e $NNN_TMPFILE
source $NNN_TMPFILE
rm $NNN_TMPFILE
end

View file

@ -0,0 +1,13 @@
{ config, pkgs, lib, ... }:
{
options.gimp = {
enable = lib.mkEnableOption "Enables gimp";
};
config = lib.mkIf config.gimp.enable {
home.packages = with pkgs; [
gimp
];
};
}

View file

@ -0,0 +1,25 @@
{ config, pkgs, lib, ... }:
{
options.git = {
enable = lib.mkEnableOption "Enables git";
username = lib.mkOption { default = config.home.username; };
email = lib.mkOption {
default = "git@" + config.home.username + ".com";
};
};
config = lib.mkIf config.git.enable {
programs.git = {
enable = true;
userName = config.git.username;
userEmail = config.git.email;
extraConfig = {
user.signingkey = "${config.home.homeDirectory}/.ssh/id_ed25519.pub";
gpg.format = "ssh";
commit.gpgSign = "true";
tag.gpgSign = "true";
};
};
};
}

View file

@ -0,0 +1,254 @@
{ config, inputs, pkgs, lib, ... }:
let rootPath = ./.; in
{
options.hypr = {
enable = lib.mkEnableOption "Enables hyprland";
mod_key = lib.mkOption { default = "SUPER"; };
monitor = {
details = lib.mkOption { default = []; };
};
workspace = {
workspaces = lib.mkOption { default = {}; };
scratchpad.enable = lib.mkEnableOption "Enables a scratchpad";
defaults = lib.mkOption { default = {}; };
# primary-secondary = {
# enable = lib.mkEnableOption "Enables the primary-secondary navigation style";
# primary = lib.mkOption { default = "DP-1"; };
# secondary = lib.mkOption { default = "DP-2"; };
# secondaries = lib.mkOption { default = []; };
# };
};
windows.opaque = lib.mkOption { default = []; };
background = {
enable = lib.mkEnableOption "Enables a wallpaper";
path = lib.mkOption { default = ""; };
};
cursor = {
enable = lib.mkEnableOption "Enables custom cursor";
theme = lib.mkOption { default = ""; };
size = lib.mkOption { default = "64"; };
};
xwayland.videobridge.enable = lib.mkEnableOption "Enable xwaylandvideobridge";
mouse.sensitivity = lib.mkOption { default = 0; };
master.mfact = lib.mkOption { default = 0.55; };
polkit.enable = lib.mkEnableOption "Enables polkit agent";
screenshot.enable = lib.mkEnableOption "Enables Screenshotting";
};
imports = [ inputs.hyprland.homeManagerModules.default ];
config = let
lopts = lib.lists.optionals;
in {
nix.settings = {
substituters = ["https://hyprland.cachix.org"];
trusted-public-keys = ["hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="];
};
} // lib.mkIf config.hypr.enable {
wayland.windowManager.hyprland = let
mod = config.hypr.mod_key;
# p-s = let
# chw = config.hypr.workspace;
# findDefaultWs = id: if (builtins.hasAttr id chw.workspaces)
# then (builtins.head (builtins.getAttr id chw.workspaces))
# else "";
# in with config.hypr.workspace; lib.mkIf primary-secondary.enable {
# primaryWs = findDefaultWs primary-secondary.primary;
# secondaryWs = findDefaultWs primary-secondary.secondary;
# };
in {
enable = true;
settings = {
monitor = config.hypr.monitor.details;
workspace = let
wsMonitor = monitor: wrksps: map (ws:
if ws == (builtins.head wrksps)
then "name:"+ws+", monitor:"+monitor+", persistent:true, default:true"
else "name:"+ws+", monitor:"+monitor+", persistent:true"
) wrksps;
makeRules = wsAttr: builtins.concatLists (builtins.attrValues (
builtins.mapAttrs wsMonitor wsAttr
));
in makeRules config.hypr.workspace.workspaces
++ [
"w[t1], gapsout:0, gapsin:0"
"w[tg1], gapsout:0, gapsin:0"
"f[1], gapsout:0, gapsin:0"
]
++ lopts config.hypr.workspace.scratchpad.enable [
"special:scratch, on-created-empty: [float; size 50% 50%; center] ${config.defaultApps.terminal}"
];
input = {
accel_profile = "flat";
sensitivity = config.hypr.mouse.sensitivity;
};
general = {
gaps_in = 3;
gaps_out = 3;
border_size = 2;
"col.active_border" = "rgb(F5C2E7)";
"col.inactive_border" = "rgb(1E1D2F)";
layout = "master";
};
decoration = {
rounding = 2;
blur = {
enabled = true;
size = 12;
passes = 2;
special = true;
};
};
animation = [
"windows, 1, 4, default, popin 50%"
"windowsOut, 1, 4, default, popin 50%"
"windowsMove, 1, 3, default"
"border, 1, 3, default"
"fade, 1, 3, default"
"workspaces, 1, 3, default"
];
master = {
mfact = config.hypr.master.mfact;
};
misc = {
focus_on_activate = true;
};
exec-once = lopts config.hypr.polkit.enable [
"${pkgs.polkit-kde-agent}/bin/libexec/polkit-kde-authentication-agent-1"
] ++ lopts config.hypr.background.enable [
"${pkgs.swww}/bin/swww-daemon"
"${pkgs.swww}/bin/swww img ${config.hypr.background.path}"
] ++ lopts config.ags.enable [
"ags"
] ++ lopts config.beeper.enable [
"[workspace name:chat silent] Beeper"
];
env = with config.hypr; [
# "HYPR_MON_PRIMARY, ${workspace.primary-secondary.primary}"
# "HYPR_MON_SECONDARY, ${workspace.primary-secondary.secondary}"
"HYPR_WORK_DB, ${config.xdg.cacheHome}/hypr/workspace.db"
] ++ lopts cursor.enable [
"HYPRCURSOR_THEME,${cursor.theme}"
"HYPRCURSOR_SIZE,${cursor.size}"
] ++ lopts config.nvidia.enable [
"LIBVA_DRIVER_NAME,nvidia"
"XDG_SESSION_TYPE,wayland"
"GBM_BACKEND,nvidia-drm"
"__GLX_VENDOR_LIBRARY_NAME,nvidia"
"WLR_RENDERER_ALLOW_SOFTWARE,1"
"WLR_DRM_DEVICES,/dev/dri/card1"
];
windowrulev2 = let
workspaceDefaults = wsname: applist: map (
app: "workspace " + wsname + ", " + app
) applist;
allDefault = wsAttr: builtins.concatLists (builtins.attrValues (
builtins.mapAttrs workspaceDefaults wsAttr
));
in allDefault config.hypr.workspace.defaults
++ [
"bordersize 0, floating:0, onworkspace:w[t1]"
"rounding 0, floating:0, onworkspace:w[t1]"
"bordersize 0, floating:0, onworkspace:w[tg1]"
"rounding 0, floating:0, onworkspace:w[tg1]"
"bordersize 0, floating:0, onworkspace:f[1]"
"rounding 0, floating:0, onworkspace:f[1]"
]
++ lopts config.hypr.xwayland.videobridge.enable [
"opacity 0.0 override 0.0 override,class:^(xwaylandvideobridge)$"
"noanim,class:^(xwaylandvideobridge)$"
"noinitialfocus,class:^(xwaylandvideobridge)$"
"maxsize 1 1,class:^(xwaylandvideobridge)$"
"noblur,class:^(xwaylandvideobridge)$"
] ++ map (id: "opacity 1 override, " + id) config.hypr.windows.opaque
++ [
"opacity 0.94 fullscreen:0"
"opacity 0.79 override, class:^(${config.defaultApps.terminal})$"
];
# 1, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh home
# 2, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh web
# 3, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh med
# 4, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh game
# 5, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh etc
# _, exec, $XDG_CONFIG_HOME/hypr/scripts/changeprimary.xsh hell
# TAB, exec, $XDG_CONFIG_HOME/hypr/scripts/changesecondary.xsh
#
# SHIFT, 1, movetoworkspacesilent, name:home
# SHIFT, 2, movetoworkspacesilent, name:web
# SHIFT, 3, movetoworkspacesilent, name:med
# SHIFT, 4, movetoworkspacesilent, name:game
# SHIFT, TAB, movetoworkspacesilent, r-1
bind = let
modPrefix = kb: if (lib.strings.hasPrefix "&" kb)
then ("${mod}" + kb)
else ("${mod}, " + kb);
in map modPrefix ([
"Return, exec, ${config.defaultApps.terminal}"
"&SHIFT, Q, exit"
"h, focusmonitor, l"
"l, focusmonitor, r"
"j, cyclenext,"
"k, cyclenext, prev"
"&SHIFT, h, movecurrentworkspacetomonitor, -1"
"&SHIFT, l, movecurrentworkspacetomonitor, +1"
"&SHIFT, j, swapnext,"
"&SHIFT, k, swapnext, prev"
"c, killactive"
"f, togglefloating"
"&SHIFT, f, fullscreen"
] ++ (let
workspaces = builtins.concatLists (
builtins.attrValues config.hypr.workspace.workspaces);
wsBinds = with builtins; wrksps: depth: if depth > (length wrksps)
then []
else let ws = builtins.elemAt wrksps (depth -1); in [
"${toString depth}, workspace, name:${ws}"
"&SHIFT, ${toString depth}, movetoworkspacesilent, name:${ws}"
] ++ wsBinds wrksps (depth + 1);
in wsBinds workspaces 1) ++ lopts config.rofi.enable [
"&SHIFT, return, exec, ${pkgs.rofi}/bin/rofi -show run"
] ++ lopts config.hypr.screenshot.enable [
"P, exec, ${pkgs.grimblast}/bin/grimblast --freeze copy area"
"&SHIFT, P, exec, ${pkgs.grimblast}/bin/grimblast --freeze copysave area"
] ++ lopts config.hypr.workspace.scratchpad.enable [
"i, togglespecialworkspace, scratch"
]);
bindm = map (kb: "${mod}, " + kb) [
"mouse:272, movewindow"
"mouse:273, movewindow"
];
};
};
home.packages = with pkgs; [
wlr-randr # Xrandr for wayland
wl-clipboard # Clipboard manager for wayland
xdg-desktop-portal-hyprland # XDP for hyprland
] ++ lopts config.hypr.xwayland.videobridge.enable [
xwaylandvideobridge
] ++ lopts config.hypr.cursor.enable [
hyprcursor
] ++ lopts config.hypr.screenshot.enable [
hyprpicker # Colorpicker, needed for screenshot tool
inputs.hyprland-contrib.packages.${pkgs.system}.grimblast
];
xdg.configFile."hypr-scripts" = {
source = rootPath + "/scripts";
target = "hypr/scripts";
executable = true;
};
xdg.dataFile."hypr-icons" = lib.mkIf config.hypr.cursor.enable {
source = rootPath + "/icons";
target = "icons/";
recursive = true;
};
};
}

View file

@ -0,0 +1,61 @@
#!/usr/bin/env python3
import shelve
import os
import sys
import subprocess
# Usage:
# ./changeprimary.xsh workspace
# changes to that workspace
# if workspace is "etc" then changes to etcN where N is a number
def changeprimary(workspace, pmonitor, smonitor, dbpath):
current_primary = ""
current_secondary = ""
with shelve.open(dbpath) as db:
current_primary = db.get("primary")
current_secondary = db.get("secondary")
old_primary = current_primary
current_primary = workspace
if current_primary == current_secondary:
workspaces = db.get("secondaries").copy()
if old_primary in workspaces:
current_secondary = old_primary
else:
current_secondary = workspaces[
(workspaces.index(current_secondary)+1) % len(workspaces)
]
db["primary"] = current_primary
db["secondary"] = current_secondary
subprocess.run([
"hyprctl", "dispatch", "moveworkspacetomonitor",
"name:" + current_secondary, smonitor
])
subprocess.run([
"hyprctl", "dispatch", "workspace",
"name:" + current_secondary
])
subprocess.run([
"hyprctl", "dispatch", "moveworkspacetomonitor",
"name:" + current_primary, pmonitor
])
subprocess.run([
"hyprctl", "dispatch", "workspace",
"name:" + current_primary
])
if __name__ == "__main__":
try:
workspace=sys.argv[1]
primary_monitor=os.environ["HYPR_MON_PRIMARY"]
secondary_monitor=os.environ["HYPR_MON_SECONDARY"]
db=os.environ["HYPR_WORK_DB"]
changeprimary(workspace, primary_monitor, secondary_monitor, db)
except KeyError:
print("Please set HYPR_MON_PRIMARY and HYPR_WORK_DB")
sys.exit(1)

View file

@ -0,0 +1,36 @@
#!/usr/bin/env python3
import shelve
import copy
# Usage:
# ./changesecondary.xsh
# cycles through the secondary workspaces
def cyclesecondary(monitor, dbpath):
current_secondary = ""
with shelve.open(dbpath) as db:
workspaces = db.get("secondaries").copy()
current_primary = db.get("primary")
current_secondary = db.get("secondary")
if current_primary in workspaces:
workspaces.remove(current_primary)
current_secondary = workspaces[
(workspaces.index(current_secondary)+1) % len(workspaces)
]
db["secondary"] = current_secondary
# Change primary to bind
hyprctl dispatch moveworkspacetomonitor name:@(current_secondary) $HYPR_MON_SECONDARY
hyprctl dispatch workspace name:@(current_secondary)
if __name__ == "__main__":
try:
monitor=os.environ["HYPR_MON_SECONDARY"]
db=os.environ["HYPR_WORK_DB"]
cyclesecondary(monitor, db)
except KeyError:
print("Please set HYPR_MON_PRIMARY and HYPR_WORK_DB")
sys.exit(1)

View file

@ -0,0 +1,18 @@
{ config, pkgs, lib, ... }:
{
options.librewolf = {
enable = lib.mkEnableOption "Enables librewolf";
make_default = lib.mkEnableOption "Makes librewolf the default browser";
};
config = lib.mkIf config.librewolf.enable {
home.packages = with pkgs; [
librewolf
];
home.sessionVariables = {
BROWSER = "librewolf";
};
defaultApps.browser = lib.mkIf config.librewolf.make_default "librewolf";
};
}

View file

@ -0,0 +1,22 @@
{ config, pkgs, lib, ... }:
{
options.lutris = {
enable = lib.mkEnableOption "Enables lutris";
};
config = lib.mkIf config.lutris.enable {
home.packages = with pkgs; [
lutris
wineWowPackages.stable
# (lutris.override {
# extraLibraries = pkgs: [
# # List library dependencies here
# ];
# extraPkgs = pkgs: [
# # List package dependencies here
# ];
# })
];
};
}

View file

@ -0,0 +1,9 @@
{ config, pkgs, ... }:
{
imports = [
./feh
./mpv
./zathura
];
}

View file

@ -0,0 +1,13 @@
{ config, pkgs, lib, ... }:
{
options.feh = {
enable = lib.mkEnableOption "Enables feh";
};
config = lib.mkIf config.feh.enable {
programs.feh = {
enable = true;
};
};
}

View file

@ -0,0 +1,22 @@
{ config, pkgs, lib, ... }:
{
options.mpv = {
enable = lib.mkEnableOption "Enables mpv";
};
config = lib.mkIf config.mpv.enable {
home.packages = with pkgs; [
yt-dlp
];
programs.mpv = {
enable = true;
config = {
volume-max = 150;
force-window = "yes";
script-opts = "ytdl_hook-ytdl_path=yt-dlp";
ytdl-format = "bestvideo[height<=?1080][vcodec!=vp9]+bestaudio/best";
};
};
};
}

View file

@ -0,0 +1,13 @@
{ config, pkgs, lib, ... }:
{
options.zathura = {
enable = lib.mkEnableOption "Enables zathura";
};
config = lib.mkIf config.zathura.enable {
programs.zathura = {
enable = true;
};
};
}

View file

@ -0,0 +1,120 @@
{ config, pkgs, lib, ... }:
{
options.neovim = {
enable = lib.mkEnableOption "Enables neovim";
languages = {
c.enable = lib.mkEnableOption "Enables c support";
nix.enable = lib.mkEnableOption "Enables nix support";
rust.enable = lib.mkEnableOption "Enables rust support";
};
plugins = {
comments.enable = lib.mkEnableOption "Enables nvim-comment";
fugitive.enable = lib.mkEnableOption "Enables git-fugitive";
lualine.enable = lib.mkEnableOption "Enables lualine";
luasnip.enable = lib.mkEnableOption "Enables luasnip snippets";
nvimcmp.enable = lib.mkEnableOption "Enables nvim completion";
telescope = {
enable = lib.mkEnableOption "Enables telescope";
fzf.enable = lib.mkEnableOption "Enables telescope-fzf";
};
treesitter.enable = lib.mkEnableOption "Enables treesitter";
wiki.enable = lib.mkEnableOption "Enables a wiki";
};
};
imports = [
./plugin/lsp.nix
./plugin/nvimcmp.nix
./plugin/telescope.nix
./plugin/treesitter.nix
];
config = lib.mkIf config.neovim.enable {
home.sessionVariables = {
EDITOR = "nvim";
VISUAL = "nvim";
};
programs.neovim = {
enable = true;
viAlias = true;
vimAlias = true;
vimdiffAlias = true;
extraLuaConfig = ''
${builtins.readFile ./options.lua}
'';
extraPackages = with pkgs; [
(lib.mkIf config.neovim.languages.c.enable libclang)
(lib.mkIf config.neovim.languages.nix.enable nil)
(lib.mkIf config.neovim.languages.rust.enable rust-analyzer)
];
# Additional packages are added through imports
plugins = let
lopts = lib.lists.optionals;
cfgp = config.neovim.plugins;
cfgl = config.neovim.languages;
comments = lopts cfgp.comments.enable (with pkgs.vimPlugins; [
{
plugin = comment-nvim;
type = "lua";
config = "require(\"Comment\").setup()";
}
]);
fugitive = lopts cfgp.fugitive.enable (with pkgs.vimPlugins; [
vim-fugitive
]);
luasnip-pkg = lopts cfgp.luasnip.enable (with pkgs.vimPlugins; [
luasnip
friendly-snippets
(lib.mkIf cfgp.nvimcmp.enable cmp_luasnip)
]);
lualine = lopts cfgp.lualine.enable (with pkgs.vimPlugins; [
{
plugin = lualine-nvim;
type = "lua";
config = ''
require("lualine").setup({
icons_enabled = true,
})
'';
}
nvim-web-devicons
]);
nix-pkg = lopts cfgl.nix.enable (with pkgs.vimPlugins; [
vim-nix
]);
rust-pkg = lopts cfgl.rust.enable (with pkgs.vimPlugins; [
rustaceanvim
]);
wiki = lopts cfgp.wiki.enable (with pkgs.vimPlugins; [
{
plugin = vimwiki;
type = "lua";
config = ''
vim.g.vimwiki_list = {
{
path = '${config.xdg.userDirs.documents}/wiki',
links_space_char = '_',
ext = '.md',
syntax = 'markdown',
}
}
'';
}
]);
in comments ++ fugitive ++ luasnip-pkg ++ lualine ++
nix-pkg ++ rust-pkg ++ wiki;
};
};
}

View file

@ -0,0 +1,57 @@
-- Globals
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '
vim.opt.list = true
vim.bo.filetype = "on"
vim.opt.updatetime = 300
-- Indentations
vim.opt.tabstop = 2
vim.opt.softtabstop = 0
vim.opt.shiftwidth = 2
vim.opt.smarttab = true
vim.opt.expandtab = true
-- Style
vim.opt.colorcolumn = "80"
vim.opt.showmatch = true
vim.opt.number = true
vim.opt.relativenumber = true
-- Easy Split Navigation
-- nnoremap <C-J> <C-W><C-J>
-- nnoremap <C-K> <C-W><C-K>
-- nnoremap <C-L> <C-W><C-L>
-- nnoremap <C-H> <C-W><C-H>
-- Searching
vim.opt.smartcase = true
-- Backups
vim.opt.swapfile = false
vim.opt.backup = false
vim.opt.undofile = true
vim.opt.undodir = '/home/pan/.config/nvim/undodir'
-- Easy copy and pasting to external programs
-- map <C-y> "+yy
-- map <C-p> "+P
-- autocmd BufRead,BufNewFile *.md call WritingMode()
-- autocmd BufRead,BufNewFile *.tex call WritingMode()
-- autocmd BufRead,BufNewFile *.svx call WritingMode()
-- autocmd BufRead,BufNewFile *.py call PythonMode()
-- function! WritingMode()
-- setlocal textwidth=80
-- setlocal wrap linebreak nolist
-- setlocal whichwrap+=<,>,h,l
-- nnoremap j gj
-- nnoremap k gk
-- setlocal spell spelllang=en_us
-- endfunction
-- function! PythonMode()
-- setlocal foldmethod=indent
-- setlocal foldlevel=99
-- endfunction

View file

@ -0,0 +1,53 @@
{ config, pkgs, lib, ... }:
{
config = lib.mkIf config.neovim.enable {
programs.neovim.plugins = let
cfgp = config.neovim.plugins;
cfgl = config.neovim.languages;
configText = ''
local on_attach = function(_, bufnr)
local bufmap = function(keys, func)
vim.keymap.set('n', keys, func, { buffer = bufnr })
end
bufmap('<leader>r', vim.lsp.buf.rename)
bufmap('<leader>a', vim.lsp.buf.code_action)
bufmap('gd', vim.lsp.buf.definition)
bufmap('gD', vim.lsp.buf.declaration)
bufmap('gI', vim.lsp.buf.implementation)
bufmap('<leader>D', vim.lsp.buf.type_definition)
'' + lib.strings.optionalString cfgp.telescope.enable ''
bufmap('gr', require('telescope.builtin').lsp_references)
bufmap('<leader>s', require('telescope.builtin').lsp_document_symbols)
bufmap('<leader>S', require('telescope.builtin').lsp_dynamic_workspace_symbols)
'' + ''
bufmap('K', vim.lsp.buf.hover)
vim.api.nvim_buf_create_user_command(bufnr, 'Format', function(_)
vim.lsp.buf.format()
end, {})
end
local capabilities = vim.lsp.protocol.make_client_capabilities()
'' + lib.strings.optionalString cfgl.nix.enable ''
require('lspconfig').nil_ls.setup {}
'' + lib.strings.optionalString cfgl.c.enable ''
require('lspconfig').clangd.setup {}
'' + lib.strings.optionalString cfgl.rust.enable ''
require('lspconfig').rustaceanvim.setup {}
'';
in with pkgs.vimPlugins; [
{
plugin = nvim-lspconfig;
type = "lua";
config = configText;
}
];
};
}

View file

@ -0,0 +1,72 @@
{ config, pkgs, lib, ... }:
let
cfgp = config.neovim.plugins;
in {
config = lib.mkIf (config.neovim.enable && cfgp.nvimcmp.enable) {
programs.neovim.plugins = let
configText = ''
local cmp = require('cmp')
'' + lib.strings.optionalString cfgp.luasnip.enable ''
local luasnip = require('luasnip')
require('luasnip.loaders.from_vscode').lazy_load()
luasnip.config.setup {}
'' + ''
cmp.setup {
mapping = cmp.mapping.preset.insert {
['<C-n>'] = cmp.mapping.select_next_item(),
['<C-p>'] = cmp.mapping.select_prev_item(),
['<C-d>'] = cmp.mapping.scroll_docs(-4),
['<C-f>'] = cmp.mapping.scroll_docs(4),
['<C-Space>'] = cmp.mapping.complete {},
['<CR>'] = cmp.mapping.confirm {
behavior = cmp.ConfirmBehavior.Replace,
select = true,
},
['<Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_next_item()
'' + lib.strings.optionalString cfgp.luasnip.enable ''
elseif luasnip.expand_or_locally_jumpable() then
luasnip.expand_or_jump()
'' + ''
else
fallback()
end
end, { 'i', 's' }),
['<S-Tab>'] = cmp.mapping(function(fallback)
if cmp.visible() then
cmp.select_prev_item()
'' + lib.strings.optionalString cfgp.luasnip.enable ''
elseif luasnip.locally_jumpable(-1) then
luasnip.jump(-1)
'' + ''
else
fallback()
end
end, { 'i', 's' }),
},
'' + lib.strings.optionalString cfgp.luasnip.enable ''
snippet = {
expand = function(args)
luasnip.lsp_expand(args.body)
end,
},
sources = {
{ name = 'luasnip' },
},
'' + ''
}
'';
in with pkgs.vimPlugins; [
{
plugin = nvim-cmp;
type = "lua";
config = configText;
}
];
};
}

View file

@ -0,0 +1,43 @@
{ config, pkgs, lib, ... }:
let
cfgp = config.neovim.plugins;
in {
config = lib.mkIf (config.neovim.enable && cfgp.telescope.enable) {
programs.neovim.plugins = let
configText = ''
require('telescope').setup({
extensions = {
'' + lib.strings.optionalString cfgp.telescope.fzf.enable ''
fzf = {
fuzzy = true, -- false will only do exact matching
override_generic_sorter = true, -- override the generic sorter
override_file_sorter = true, -- override the file sorter
case_mode = "smart_case", -- or "ignore_case" or "respect_case"
-- the default case_mode is "smart_case"
}
'' + ''
}
})
local builtin = require('telescope.builtin')
vim.keymap.set('n', '<leader>ff', builtin.find_files, {})
vim.keymap.set('n', '<leader>fg', builtin.git_files, {})
'' + lib.strings.optionalString cfgp.telescope.fzf.enable ''
require('telescope').load_extension('fzf')
'';
in with pkgs.vimPlugins; [
{
plugin = telescope-nvim;
type = "lua";
config = configText;
}
(lib.mkIf cfgp.nvimcmp.enable telescope-fzf-native-nvim)
];
home.packages = with pkgs; [
(lib.mkIf cfgp.telescope.fzf.enable fzf)
];
};
}

View file

@ -0,0 +1,36 @@
{ config, pkgs, lib, ... }:
let
cfgp = config.neovim.plugins;
cfgl = config.neovim.languages;
in {
config = lib.mkIf (config.neovim.enable && cfgp.treesitter.enable) {
programs.neovim.plugins = let
configText = ''
require('nvim-treesitter.configs').setup {
ensure_installed = {},
auto_install = false,
highlight = { enable = true },
indent = { enable = true },
}
'';
# I've tried many things, and can't get treesitter plugins changing
# dynamically. For not just have them always loaded regardless of config
treeplugs = p: [
p.tree-sitter-c
p.tree-sitter-nix
p.tree-sitter-rust
];
in with pkgs.vimPlugins; [
{
plugin = (nvim-treesitter.withPlugins treeplugs);
type = "lua";
config = configText;
}
];
};
}

View file

@ -0,0 +1,17 @@
{ config, pkgs, lib, ... }:
{
options.obs = {
enable = lib.mkEnableOption "Enables obs";
};
config = lib.mkIf config.obs.enable {
programs.obs-studio = {
enable = true;
plugins = with pkgs.obs-studio-plugins; [
wlrobs
obs-backgroundremoval
obs-pipewire-audio-capture
];
};
};
}

View file

@ -0,0 +1,14 @@
{ config, pkgs, lib, ... }:
{
options.rofi = {
enable = lib.mkEnableOption "Enables rofi";
};
config = lib.mkIf config.rofi.enable {
programs.rofi = {
enable = true;
package = pkgs.rofi-wayland;
};
};
}

View file

@ -0,0 +1,9 @@
{ config, pkgs, lib, ... }:
{
imports = [
./fish
./xonsh
./zsh
];
}

View file

@ -0,0 +1,43 @@
{ config, pkgs, lib, ... }:
let
functionModule = with lib.types; submodule {
options = {
body = lib.mkOption { type = lines; };
wraps = lib.mkOption {
type = nullOr str;
default = null;
};
};
};
in {
options.fish = {
enable = lib.mkEnableOption "Enables fish";
extraFunctions = lib.mkOption {
type = with lib.types; attrsOf (either lines functionModule);
default = {};
};
};
config = lib.mkIf config.fish.enable {
programs.fish = {
enable = true;
functions = {
fish_greeting = "";
fish_prompt = ''
if test $status -eq 0
echo -n -s (set_color blue -o) τ " " (set_color normal)
else
echo -n -s (set_color red -o) τ " " (set_color normal)
end
'';
fish_right_prompt = ''
git_prompt
echo -n -s (set_color blue) (prompt_pwd) " "
echo -n -s (set_color yellow) $CMD_DURATION ms
echo -n -s (set_color normal)
'';
git_prompt = ''${builtins.readFile ./functions/git_prompt.fish}'';
} // config.fish.extraFunctions;
};
};
}

View file

@ -0,0 +1,69 @@
function git_is_repo
test -d .git
or begin
set -l info (command git rev-parse --git-dir --is-bare-repository 2>/dev/null)
and test $info[2] = false
end
end
function git_is_worktree
git_is_repo
and test (command git rev-parse --is-inside-git-dir) = false
end
function git_is_dirty
git_is_worktree; and not command git diff --no-ext-diff --quiet --exit-code
end
function git_is_staged
git_is_repo; and begin
not command git diff --cached --no-ext-diff --quiet --exit-code
end
end
function git_branch_name
git_is_repo; and begin
command git symbolic-ref --short HEAD 2> /dev/null;
or command git show-ref --head -s --abbrev | head -n1 2> /dev/null
end
end
function git_is_touched
git_is_worktree; and begin
# The first checks for staged changes, the second for unstaged ones.
# We put them in this order because checking staged changes is *fast*.
not command git diff-index --cached --quiet HEAD -- >/dev/null 2>&1
or not command git diff --no-ext-diff --quiet --exit-code >/dev/null 2>&1
end
end
if git_is_repo
echo -n -s (set_color yellow) (git_branch_name) (set_color normal)
set -l git_meta ""
if test (command git ls-files --others --exclude-standard | wc -w 2> /dev/null) -gt 0
set git_meta "$git_meta?"
end
if test (command git rev-list --walk-reflogs --count refs/stash 2> /dev/null)
set git_meta "$git_meta\$"
end
if git_is_touched
git_is_dirty && set git_meta "$git_meta"
git_is_staged && set git_meta "$git_meta"
end
set -l commit_count (command git rev-list --count --left-right (git remote)/(git_branch_name)"...HEAD" 2> /dev/null)
if test $commit_count
set -l behind (echo $commit_count | cut -f 1)
set -l ahead (echo $commit_count | cut -f 2)
if test $behind -gt 0
set git_meta "$git_meta🠋"
end
if test $ahead -gt 0
set git_meta "$git_meta🠉"
end
end
if test $git_meta
echo -n -s (set_color red) " " $git_meta " " (set_color normal)
else
echo -n -s " "
end
end

View file

@ -0,0 +1 @@
command ssh -o IPQoS=0 $argv;

View file

@ -0,0 +1,22 @@
{ config, pkgs, lib, ... }:
let rootPath = ./.; in
{
options.xonsh = {
enable = lib.mkEnableOption "Enables xonsh";
};
config = lib.mkIf config.xonsh.enable {
home.packages = with pkgs; [
xonsh
];
home.sessionVariables = {
PROMPT = "τ ";
RIGHT_PROMPT = "{YELLOW}{gitstatus: {} }{BLUE}{short_cwd}{DEFAULT}";
VI_MODE = 1;
};
xdg.configFile."xonshrc" = {
source = rootPath + "/rc.xsh";
target = "xonsh/rc.xsh";
};
};
}

View file

@ -0,0 +1,7 @@
#!/usr/bin/env xonsh
if $XONSH_INTERACTIVE:
if '__HM_SESS_VARS_SOURCED' in ${...}:
del $__HM_SESS_VARS_SOURCED
source-bash "$HOME/.nix-profile/etc/profile.d/hm-session-vars.sh" --suppress-skip-message
cat "$HOME/.cache/wallust/sequences"

View file

@ -0,0 +1,47 @@
{ config, pkgs, lib, ... }:
{
options.zsh = {
enable = lib.mkEnableOption "Enable zsh";
};
config = lib.mkIf config.zsh.enable {
programs.zsh = {
enable = true;
enableCompletion = true;
autosuggestion.enable = true;
syntaxHighlighting.enable = true;
dotDir = ".config/zsh";
history.save = 10000;
history.size = 10000;
history.path = "${config.xdg.dataHome}/zsh/history";
initExtra = let
lf = lib.optionalString config.lf.enable ''
# Lf changes directory
lf () {
cd "$(command ${pkgs.lf}/bin/lf -print-last-dir "$@")"
}
bindkey -s '^o' 'lf\n'
'';
in lf + ''
# Nix-shell
${pkgs.nix-your-shell}/bin/nix-your-shell zsh | source /dev/stdin
# Prompt
autoload -U colors && colors
autoload -Uz vcs_info
precmd_vcs_info() { vcs_info }
precmd_functions+=( precmd_vcs_info )
setopt prompt_subst
zstyle ':vcs_info:*' check-for-changes true
zstyle ':vcs_info:*' unstagedstr '·*'
zstyle ':vcs_info:*' stagedstr '·+'
zstyle ':vcs_info:git:*' formats '%b%u%c'
export PROMPT="%(0?.%F{white}.%? %F{red})τ%f "
export RPROMPT="%F{yellow}\$vcs_info_msg_0_%f %F{blue}%~%f"
'';
};
};
}

View file

@ -0,0 +1,39 @@
{ config, pkgs, lib, ... }:
{
options.alacritty = {
enable = lib.mkEnableOption "Enables alacritty";
font = lib.mkOption { default = ""; };
font_size = lib.mkOption { default = 18; };
};
config = lib.mkIf config.alacritty.enable {
programs.alacritty.enable = true;
programs.alacritty.settings = {
font = let fam = config.alacritty.font; in {
normal = {
family = fam;
style = "Regular";
};
bold = {
family = fam;
style = "Bold";
};
italic = {
family = fam;
style = "Italic";
};
bold_italic = {
family = fam;
style = "Bold Italic";
};
offset = {
x = 0;
y = 0;
};
size = config.alacritty.font_size;
};
};
};
}

View file

@ -0,0 +1,8 @@
{ config, pkgs, lib, ... }:
{
imports = [
./kitty
./alacritty
];
}

View file

@ -0,0 +1,23 @@
{ config, pkgs, lib, ... }:
{
options.kitty = {
enable = lib.mkEnableOption "Enables kitty";
make_default = lib.mkEnableOption "Makes kitty default terminal emulator";
font = lib.mkOption { default = ""; };
font_size = lib.mkOption { default = 18; };
};
config = lib.mkIf config.kitty.enable {
programs.kitty = {
enable = true;
settings = {
font_family = config.kitty.font;
font_size = config.kitty.font_size;
enable_audio_bell = "no";
confirm_os_window_close = 0;
};
};
defaultApps.terminal = lib.mkIf config.kitty.make_default "kitty";
};
}

View file

@ -0,0 +1,16 @@
{ config, pkgs, lib, ... }:
{
options.zoxide = {
enable = lib.mkEnableOption "Enables Zoxide";
};
config = lib.mkIf config.zoxide.enable {
programs.zoxide = {
enable = true;
options = [
"--cmd cd"
];
};
};
}

8
hmModules/default.nix Normal file
View file

@ -0,0 +1,8 @@
{ config, pkgs, ... }:
{
imports = [
./apps
./services
];
}

View file

@ -0,0 +1,14 @@
{ config, pkgs, ... }:
{
imports = [
./dunst
./home
./manpages
./ssh
./timers
./trash
./wal
./widgets
];
}

View file

@ -0,0 +1,49 @@
{ config, pkgs, lib, ... }:
{
options.dunst = {
enable = lib.mkEnableOption "Enables dunst";
};
config = lib.mkIf config.dunst.enable {
home.packages = with pkgs; [
libnotify
];
services.dunst = {
enable = true;
settings = {
global = {
width = 280;
height = 240;
origin = "bottom-right";
offset = "0x300";
notification_limit = 3;
progress_bar_max_width = 280;
gap_size = 4;
corner_radius = 20;
};
urgency_low = {
background = "#FFFFFFCC";
foreground = "#000000";
frame_color = "#0000";
};
urgency_normal = {
background = "#FFFFFFCC";
foreground = "#000000";
frame_color = "#0000";
};
urgency_critical = {
background = "#FFFFFFCC";
foreground = "#000000";
frame_color = "#0000";
};
};
};
};
}

View file

@ -0,0 +1,43 @@
{ config, pkgs, lib, ... }:
{
options = {
extraPkgs = lib.mkOption { default = []; };
nvidia.enable = lib.mkEnableOption "Enables nvidia requirements";
defaultApps = {
terminal = lib.mkOption { default = ""; };
browser = lib.mkOption { default = ""; };
};
};
config = {
# Let Home Manager install and manage itself.
programs.home-manager.enable = true;
home.sessionVariables = {
GRADLE_USER_HOME = "${config.xdg.dataHome}/gradle";
CUDA_CACHE_PATH = "${config.xdg.cacheHome}/nv";
};
xdg = {
enable = true;
mimeApps.enable = true;
userDirs = let
home = config.home.homeDirectory;
in {
enable = true;
documents = "${home}/dox";
publicShare = "${home}/dox/public";
templates = "${home}/dox/templates";
music = "${home}/med/mus";
pictures = "${home}/med/pix";
videos = "${home}/med/vid";
desktop = "${home}/dwn";
download = "${home}/dwn";
};
};
home.homeDirectory = "/home/" + config.home.username;
home.packages = config.extraPkgs;
};
}

View file

@ -0,0 +1,15 @@
{ config, pkgs, lib, ... }:
{
options.manpages = {
enable = lib.mkEnableOption "Enables manpager";
};
config = lib.mkIf config.manpages.enable {
programs.man.enable = true;
home.packages = with pkgs; [
man-pages
man-pages-posix
];
};
}

View file

@ -0,0 +1,14 @@
{ config, pkgs, lib, ... }:
{
options.ssh = {
enable = lib.mkEnableOption "Enables ssh";
};
config = lib.mkIf config.ssh.enable {
programs.ssh.enable = true;
home.packages = with pkgs; [
sshfs # SSH File system
];
};
}

View file

@ -0,0 +1,60 @@
{ config, pkgs, lib, ... }:
let rootPath = ./.; in
{
options.timer = {
enableHourly = lib.mkEnableOption "Enables an hourly notification";
enableQuarterly = lib.mkEnableOption "Enables a quarterly notification";
};
config = {
systemd.user.timers = {
hourly-time = lib.mkIf config.timer.enableHourly {
Timer = {
OnCalendar = "hourly";
};
Install = {
WantedBy = [
"timers.target"
];
};
};
quarterly-time = lib.mkIf config.timer.enableQuarterly {
Timer = {
OnCalendar = "*-*-* *:15,30,45:00";
};
Install = {
WantedBy = [
"timers.target"
];
};
};
};
systemd.user.services = {
hourly-time = lib.mkIf config.timer.enableHourly {
Unit = {
Description = "Notify the user every hour of time passing";
};
Service = {
Type="simple";
ExecStart="/home/pan/.config/timer_scripts/notify-time.sh 60000 1";
};
};
quarterly-time = lib.mkIf config.timer.enableQuarterly {
Unit = {
Description = "Notify the user every 15 minutes of time passing, \
skips hours";
};
Service = {
Type="simple";
ExecStart="/home/pan/.config/timer_scripts/notify-time.sh 10000 0";
};
};
};
xdg.configFile."timer-scripts" = {
source = rootPath + "/scripts";
target = "timer_scripts/";
executable = true;
};
};
}

Binary file not shown.

View file

@ -0,0 +1,8 @@
#!/bin/sh
export DISPLAY=":0"
export DBUS_SESSION_BUS_ADDRESS="unix:path=/run/user/1000/bus"
/home/pan/.nix-profile/bin/notify-send "$(/run/current-system/sw/bin/date +%H:%M)" -t $1
if [ $2 -eq 1 ]; then
/run/current-system/sw/bin/pw-cat --volume 0.08 -p ./chimes.ogg &
fi

View file

@ -0,0 +1,13 @@
{ config, pkgs, lib, ... }:
{
options.trash = {
enable = lib.mkEnableOption "Enables trash";
};
config = {
home.packages = [
pkgs.trash-cli
];
};
}

View file

@ -0,0 +1,34 @@
{ config, pkgs, lib, ... }:
let rootPath = ./.; in
{
options.colors = {
enable = lib.mkEnableOption "Enables setting colors using wallust";
};
config = lib.mkIf config.colors.enable {
home.packages = with pkgs; [
wallust # A better pywal
pywalfox-native # Update librewolf's colorscheme based on wal
];
xdg.configFile."wallust-config" = {
target = "wallust/wallust.toml";
text = ''
backend = "wal"
color_space = "lab"
threshold = 20
filter = "dark16"
# [[entry]]
# # a relative path to a file where wallust.toml is (~/.config/wallust/)
# template = "dunstrc"
#
# # absolute path to the file to write the template (after templating)
# target = "~/.config/dunst/dunstrc"
'';
};
#xdg.configFile."wallust-templates" = {
# source = rootPath + "/templates";
# target = "wallust/";
#};
};
}

View file

@ -0,0 +1,9 @@
// import { Switch } from "./modules/workspace-switch.js";
import { notificationPopup } from "./modules/notifications/notificationPopup.ts"
export default {
style: App.configDir + '/modules/notifications/style.css',
windows: [
notificationPopup()
]
}

View file

@ -0,0 +1,22 @@
export const Clock = (monitor = 0) => {
return Widget.Window({
monitor,
name: `switch${monitor}`,
anchor: ['top', 'left', 'right'],
margins: [864, 1030],
css: 'background: transparent;',
child: container,
});
};
const container = Widget.Box({
css: `
min-height: 110px;
min-width: 500px;
border: 4px solid #f4d80a;
border-radius: 50px;
margin: 3px;
box-shadow: 0 0 0 3px white;
`,
});

View file

@ -0,0 +1,71 @@
const notifications = await Service.import('notifications');
const popups = notifications.bind('popups');
export const notificationPopup = (monitor = 0) => {
return Widget.Window({
name: 'notifications',
anchor: ['bottom', 'right'],
child: Widget.Box({
class_name: 'notifications',
vertical: true,
children: popups.as(popups => popups.map(Notification)),
}),
});
};
/** @param {import('resource:///com/github/Aylur/ags/service/notifications.js').Notification} n */
const Notification = 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),
hexpand: true,
child: Widget.Label(label),
})),
});
return Widget.EventBox({
on_primary_click: () => n.dismiss(),
child: Widget.Box({
class_name: `notification ${n.urgency}`,
vertical: true,
children: [
Widget.Box({
children: [
Widget.Box({
vertical: true,
children: [
title,
body,
],
}),
],
}),
actions,
],
}),
});
};

View file

@ -0,0 +1,61 @@
window#notifications {
all: unset;
}
window#notifications box.notifications {
padding: .5em;
}
.icon {
min-width: 68px;
min-height: 68px;
margin-right: 1em;
}
.icon image {
font-size: 58px;
/* to center the icon */
margin: 5px;
color: @theme_fg_color;
}
.icon box {
min-width: 68px;
min-height: 68px;
border-radius: 7px;
}
.notification {
min-width: 350px;
border-radius: 11px;
padding: 1em;
margin: .5em;
border: 1px solid @wm_borders_edge;
background-color: @theme_bg_color;
}
.notification.critical {
border: 1px solid lightcoral;
}
.title {
color: @theme_fg_color;
font-size: 1.4em;
}
.body {
color: @theme_unfocused_fg_color;
}
.actions .action-button {
margin: 0 .4em;
margin-top: .8em;
}
.actions .action-button:first-child {
margin-left: 0;
}
.actions .action-button:last-child {
margin-right: 0;
}

View file

@ -0,0 +1,22 @@
export const Switch = (monitor = 0) => {
return Widget.Window({
monitor,
name: `switch${monitor}`,
anchor: ['top', 'left', 'right'],
margins: [864, 1030],
css: 'background: transparent;',
child: container,
});
};
const container = Widget.Box({
css: `
min-height: 110px;
min-width: 500px;
border: 4px solid #f4d80a;
border-radius: 50px;
margin: 3px;
box-shadow: 0 0 0 3px white;
`,
});

View file

@ -0,0 +1,25 @@
{ config, inputs, pkgs, lib, ... }:
{
options.ags = {
enable = lib.mkEnableOption "Enable ags";
};
imports = [ inputs.ags.homeManagerModules.default ];
config = lib.mkIf config.ags.enable {
home.packages = with pkgs; [
libnotify # Notifications through ags
];
programs.ags = {
enable = true;
configDir = ./config;
extraPackages = with pkgs; [
gtksourceview
webkitgtk
accountsservice
];
};
};
}

View file

@ -0,0 +1,8 @@
{ config, pkgs, lib, ... }:
{
imports = [
./ags
./eww
];
}

View file

@ -0,0 +1,11 @@
.content-box {
border: 4px solid yellow;
border-radius: 50px;
background-color: rgba(255,255,255,10);
margin: 2px;
box-shadow: 0 0 0 3px white;
}
.switch {
background: transparent;
}

View file

@ -0,0 +1 @@
(include "modules/switch.yuck")

View file

@ -0,0 +1,40 @@
(include "./widgets/components/hyprwindow.yuck")
(include "./widgets/components/hyprworkspaces.yuck")
(include "./widgets/components/internet.yuck")
(include "./widgets/components/japanesedate.yuck")
(include "./widgets/components/japaneseaudio.yuck")
(defwidget bar []
(centerbox :orientation "horizontal"
:style "padding: 0px 8px"
(box :halign "start"
:spacing 18
:space-evenly false
(hyprworkspaces)
(hyprwindow)
)
""
(box :halign "end"
:spacing 18
:space-evenly false
(eventbox :onhover "eww open preview"
:onhoverlost "eww close preview"
barplayer
)
(internet)
(japaneseaudio)
(japanesedate)
(label :style "color: #FAE3B0"
:text bartime
)
)
)
)
(defpoll bartime :interval "10s"
"date '+%H:%M'"
)
(deflisten barplayer :initial ""
"playerctl --follow metadata --format '{{ artist }} - {{ title }}' || true"
)

View file

@ -0,0 +1,5 @@
(defwidget hyprwindow []
(label :text "${hyprwindow_listener}")
)
(deflisten hyprwindow_listener :initial "" "bash $XDG_CONFIG_HOME/eww/scripts/get-window-title")

View file

@ -0,0 +1,17 @@
(defwidget hyprworkspaces []
(eventbox :onscroll "bash ~/.config/eww/scripts/change-active-workspace {} ${current_workspace}" :class "workspaces-widget"
(box :space-evenly false
:spacing 5
(for workspace in workspaces
(eventbox :onclick "hyprctl dispatch workspace ${workspace.id}"
(box :class "workspace-entry ${workspace.id == current_workspace ? "current" : ""} ${workspace.windows > 0 ? "occupied" : "empty"}"
(label :text "${workspace.id}")
)
)
)
)
)
)
(deflisten workspaces :initial "[]" "bash $XDG_CONFIG_HOME/eww/scripts/get-workspaces")
(deflisten current_workspace :initial "1" "bash $XDG_CONFIG_HOME/eww/scripts/get-active-workspace")

View file

@ -0,0 +1,8 @@
(defwidget internet []
(box :spacing 0 :space-evenly false :style "color: #f5c2e7"
network
)
)
(defpoll network :interval "30s"
"iwgetid -r")

View file

@ -0,0 +1,11 @@
(defwidget japaneseaudio []
(eventbox :onscroll "bash -c 'if [ '{}' = 'up' ]; then pamixer -i 5; else pamixer -d 5; fi'"
(box :spacing 0 :space-evenly false :style "color: #96CDFB"
volume
"音"
)
)
)
(defpoll volume :interval "1s"
"pamixer --get-volume")

View file

@ -0,0 +1,9 @@
(defwidget japanesebattery []
(box :spacing 0 :space-evenly false :style "color: #FAB387"
power
"電"
)
)
(defpoll power :interval "1m"
"cat /sys/class/power_supply/BAT1/capacity")

View file

@ -0,0 +1,9 @@
(defwidget japanesedate []
(label :style "color: #DDB6F2"
:text japanesedate_time
)
)
(defpoll japanesedate_time :interval "100s"
"bash $XDG_CONFIG_HOME/eww/scripts/japanesedate"
)

View file

@ -0,0 +1,15 @@
(defwidget powerbar []
(box
:orientation "vertical"
:spacing 8
:space-evenly false
:style "color: #FAB387"
(progress
:orientation "v"
:value {100 - power})
"電"
)
)
(defpoll power :interval "1m"
"cat /sys/class/power_supply/BAT1/capacity")

View file

@ -0,0 +1,15 @@
(defwindow switch
:monitor 1
:stacking "fg"
:focusable false
:geometry (geometry :y "60%"
:width "500px"
:height "110px"
:anchor "top center")
(border
"Example contenting")
)
(defwidget border []
(box :class "content-box"
(children)))

View file

@ -0,0 +1,21 @@
#!/bin/sh
function clamp {
min=$1
max=$2
val=$3
python -c "print(max($min, min($val, $max)))"
}
direction=$1
current=$2
if test "$direction" = "down"
then
target=$(clamp 1 10 $(($current+1)))
echo "jumping to $target"
hyprctl dispatch workspace $target
elif test "$direction" = "up"
then
target=$(clamp 1 10 $(($current-1)))
echo "jumping to $target"
hyprctl dispatch workspace $target
fi

View file

@ -0,0 +1,3 @@
#!/bin/sh
hyprctl monitors -j | jq --raw-output .[0].activeWorkspace.id
socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | stdbuf -o0 grep '^workspace>>' | stdbuf -o0 awk -F '>>|,' '{print $2}'

View file

@ -0,0 +1,3 @@
#!/bin/sh
hyprctl activewindow -j | jq --raw-output .title
socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | stdbuf -o0 grep '^activewindow>>' | stdbuf -o0 awk -F '>>|,' '{print $3}'

View file

@ -0,0 +1,11 @@
#!/bin/sh
spaces (){
WORKSPACE_WINDOWS=$(hyprctl workspaces -j | jq 'map({key: .id | tostring, value: .windows}) | from_entries')
seq 1 10 | jq --argjson windows "${WORKSPACE_WINDOWS}" --slurp -Mc 'map(tostring) | map({id: ., windows: ($windows[.]//0)})'
}
spaces
socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | while read -r line; do
spaces
done

View file

@ -0,0 +1,31 @@
#!/bin/sh
readarray -t dateparts <<<"$(date "+%0m月%0d日%n%u")"
echo -n "${dateparts[0]}["
case ${dateparts[1]} in
1)
echo -n "月"
;;
2)
echo -n "火"
;;
3)
echo -n "水"
;;
4)
echo -n "木"
;;
5)
echo -n "金"
;;
6)
echo -n "土"
;;
7)
echo -n "日"
;;
esac
echo "]"

View file

@ -0,0 +1,3 @@
#!/bin/sh
playerctl --follow metadata mpris:artUrl | stdbuf -o0 cut -c 8-

View file

@ -0,0 +1,13 @@
{ config, pkgs, lib, ... }:
{
options.eww = {
enable = lib.mkEnableOption "Enables eww";
};
config = lib.mkIf config.eww.enable {
programs.eww.enable = true;
programs.eww.package = pkgs.eww-wayland;
programs.eww.configDir = ./config;
};
}

View file

@ -1,4 +1,4 @@
{ config, pkgs, lib, ... }:
{ config, ... }:
{
imports = [

View file

@ -0,0 +1,110 @@
{ config, ... }:
{
home.username = "pan";
nixpkgs.config.allowUnfree = true;
home.stateVersion = "23.05";
hypr.enable = true;
hypr.monitor = {
details = [
"eDP-2,2256x1504@60,0x0,1"
];
};
hypr.workspace = {
workspaces = {
"eDP-1" = [
"home"
"web"
"chat"
"med"
];
};
scratchpad.enable = true;
defaults = {
"name:web" = [ "class:(librewolf)" ];
"name:med" = [ "class:(librewolf),title:Picture-in-Picture" ];
"name:chat" = [ "class:(Beeper)" ];
};
};
hypr.windows.opaque = [
"initialTitle:^(Discord Popout)$"
"class:^(firefox)$"
"class:^(Gimp)$"
"class:^(feh)$"
"class:^(mpv)$"
];
hypr.background = {
enable = true;
path = "${config.home.homeDirectory}/med/pix/bg.png";
};
hypr.cursor = {
enable = true;
theme = "miku";
};
hypr = {
screenshot.enable = true;
mouse.sensitivity = -0.52;
polkit.enable = true;
master.mfact = 0.53;
xwayland.videobridge.enable = true;
};
# ags.enable = true;
rofi.enable = true;
timer.enableHourly = true;
timer.enableQuarterly = true;
colors.enable = true;
manpages.enable = true;
trash.enable = true;
fish.enable = true;
kitty.enable = true;
kitty.make_default = true;
kitty.font = "Cascadia Code";
git.enable = true;
git.username = "Julia Lange";
git.email = "public@julialange.org";
ssh.enable = true;
librewolf.enable = true;
librewolf.make_default = true;
mpv.enable = true;
zathura.enable = true;
feh.enable = true;
neovim.enable = true;
neovim.languages = {
c.enable = true;
nix.enable = true;
rust.enable = true;
};
neovim.plugins = {
comments.enable = true;
fugitive.enable = true;
lualine.enable = true;
luasnip.enable = true;
nvimcmp.enable = true;
telescope = {
enable = true;
fzf.enable = true;
};
treesitter.enable = true;
wiki.enable = true;
};
lf.enable = true;
lf.hiddenfiles = [
"${config.home.homeDirectory}/.librewolf"
"${config.home.homeDirectory}/.nix-defexpr"
"${config.home.homeDirectory}/.nix-profile"
"${config.home.homeDirectory}/.nv"
"${config.home.homeDirectory}/.pki"
];
zoxide.enable = true;
gimp.enable = true;
beeper.enable = true;
discord.enable = true;
}

View file

@ -1,4 +1,4 @@
{ config, pkgs, lib, ... }:
{ ... }:
{
imports = [

View file

@ -0,0 +1,132 @@
{ config, pkgs, ... }:
{
home.username = "pan";
nixpkgs.config.allowUnfree = true;
home.stateVersion = "23.05";
hypr.enable = true;
hypr.monitor = {
details = [
"DP-2,2560x1440@144,0x0,1"
"DP-1,2560x1440@144,-2560x0,1"
"HDMI-A-1,disable"
];
primary = "DP-2";
secondary = "DP-1";
};
hypr.workspace = {
workspaces = {
"DP-2" = [
"home"
"web"
"med"
"game"
];
"DP-1" = [
"chat"
];
};
scratchpad.enable = true;
defaults = {
"name:web" = [ "librewolf" ];
"name:med" = [ "librewolf,title:Picture-in-Picture" ];
"name:chat" = [ "Beeper" ];
"name:game" = [ "lutris" "explorer.exe" ];
};
};
windows.opaque = [
"initialTitle:^(Discord Popout)$"
"class:^(firefox)$"
"class:^(Gimp)$"
"class:^(feh)$"
"class:^(mpv)$"
];
hypr.background = {
enable = true;
path = "${config.home.homeDirectory}/med/pix/bg.png";
};
hypr.cursor = {
enable = true;
theme = "miku";
};
hypr = {
screenshot.enable = true;
mouse.sensitivity = -0.52;
polkit.enable = true;
master.mfact = 0.53;
xwayland.videobridge.enable = true;
};
ags.enable = true;
rofi.enable = true;
timer.enableHourly = true;
timer.enableQuarterly = true;
colors.enable = true;
manpages.enable = true;
trash.enable = true;
fish.enable = true;
kitty.enable = true;
kitty.make_default = true;
kitty.font = "Cascadia Code";
git.enable = true;
git.username = "Julia Lange";
git.email = "public@julialange.org";
ssh.enable = true;
librewolf.enable = true;
librewolf.make_default = true;
mpv.enable = true;
zathura.enable = true;
feh.enable = true;
neovim.enable = true;
neovim.languages = {
c.enable = true;
nix.enable = true;
rust.enable = true;
};
neovim.plugins = {
comments.enable = true;
fugitive.enable = true;
lualine.enable = true;
luasnip.enable = true;
nvimcmp.enable = true;
telescope = {
enable = true;
fzf.enable = true;
};
treesitter.enable = true;
wiki.enable = true;
};
lf.enable = true;
lf.hiddenfiles = [
"${config.home.homeDirectory}/.librewolf"
"${config.home.homeDirectory}/.nix-defexpr"
"${config.home.homeDirectory}/.nix-profile"
"${config.home.homeDirectory}/.nv"
"${config.home.homeDirectory}/.pki"
"${config.home.homeDirectory}/.steam*"
"${config.home.homeDirectory}/.zshenv"
];
zoxide.enable = true;
gimp.enable = true;
beeper.enable = true;
discord.enable = true;
lutris.enable = true;
extraPkgs = with pkgs; [
# Applications
ani-cli # Easy anime player
lutgen # LUT generator
prismlauncher # Minecraft launcher
jdk8 # For playing older minecraft
gnucash # Personal Finance Manager
zoom-us # Zoom
];
}