refactor!: switch to dendritic pattern
BREAKING CHANGE: complete reorganization of the repository
This commit is contained in:
@@ -0,0 +1,40 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.home-base = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home;
|
||||
in {
|
||||
imports = [
|
||||
m.basics
|
||||
m.cli
|
||||
m.desktop
|
||||
m.dev
|
||||
m.media
|
||||
m.my-services
|
||||
m.security
|
||||
m.shell
|
||||
];
|
||||
|
||||
options.home = {
|
||||
fullDesktop = mkEnableOption "Enable most modules";
|
||||
gpuType = mkOption {
|
||||
type = types.nullOr (types.enum ["nvidia" "amd" "intel"]);
|
||||
default = null;
|
||||
example = "amd";
|
||||
};
|
||||
};
|
||||
config.home = {
|
||||
cli.fullDesktop = mkDefault cfg.fullDesktop;
|
||||
desktop.fullDesktop = mkDefault cfg.fullDesktop;
|
||||
dev.fullDesktop = mkDefault cfg.fullDesktop;
|
||||
media.fullDesktop = mkDefault cfg.fullDesktop;
|
||||
security.fullDesktop = mkDefault cfg.fullDesktop;
|
||||
myServices.fullDesktop = mkDefault cfg.fullDesktop;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
flake.modules.homeManager.basics = {
|
||||
programs = {
|
||||
fd.enable = true;
|
||||
fzf.enable = true;
|
||||
home-manager.enable = true;
|
||||
htop.enable = true;
|
||||
jq.enable = true;
|
||||
ripgrep.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "askpass" ''
|
||||
${pkgs.rofi}/bin/rofi -dmenu -password -no-fixed-num-lines -p $(printf \"$*\" | sed 's/://')''
|
||||
@@ -0,0 +1,3 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "backup" ''
|
||||
cp -r "$1" "$1.bak.$(date +%Y%m%d%H%M%S)"''
|
||||
@@ -0,0 +1,3 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "keygen"
|
||||
"tr -cd '[:alnum:]' < /dev/urandom | fold -w 64 | head -n 1 | tr -d '\n'"
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
pkgs.writeShellScriptBin "launch-with-emacsclient" ''
|
||||
filename="$1"
|
||||
line="$2"
|
||||
column="$3"
|
||||
${config.home.dev.editors.emacs.package}/bin/emacsclient +$line:$column "$filename"''
|
||||
@@ -0,0 +1,23 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "app-launcher" ''
|
||||
LOG_FILE="$HOME/.local/share/app-launcher.log"
|
||||
|
||||
logger() {
|
||||
local level="$1"
|
||||
local message="$2"
|
||||
local timestamp
|
||||
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
|
||||
printf "[%s] [%-7s] %s\n" "$timestamp" "''${level^^}" "$message" >> "$LOG_FILE"
|
||||
}
|
||||
|
||||
CAELESTIA_ACTIVE=$(systemctl --user is-active caelestia.service)
|
||||
logger debug "Caelestia activity: $CAELESTIA_ACTIVE"
|
||||
|
||||
if systemctl --user is-active caelestia.service | grep 'active' &> /dev/null ; then
|
||||
logger info "Using Caelestia app launcher"
|
||||
caelestia shell drawers toggle launcher || \
|
||||
logger error "failed to launch Caelestia app launcher"
|
||||
exit 0
|
||||
fi
|
||||
rofi -show drun
|
||||
''
|
||||
@@ -0,0 +1,3 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "mp42webm" ''
|
||||
${pkgs.ffmpeg}/bin/ffmpeg -i "$1" -c:v libvpx -crf 10 -b:v 1M -c:a -hwaccel=auto libvorbis "$1".webm''
|
||||
@@ -0,0 +1,40 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "plock" ''
|
||||
LOG_FILE="$HOME/.local/share/plock.log"
|
||||
|
||||
logger() {
|
||||
local level="$1"
|
||||
local message="$2"
|
||||
local timestamp
|
||||
timestamp=$(date +"%Y-%m-%d %H:%M:%S")
|
||||
printf "[%s] [%-7s] %s\n" "$timestamp" "''${level^^}" "$message" >> "$LOG_FILE"
|
||||
}
|
||||
|
||||
CAELESTIA_ACTIVE=$(systemctl --user is-active caelestia.service)
|
||||
logger debug "Caelestia activity: $CAELESTIA_ACTIVE"
|
||||
if systemctl --user is-active caelestia.service | grep 'active' &> /dev/null ; then
|
||||
logger info "locking Caelestia session"
|
||||
caelestia shell lock lock || \
|
||||
logger error "failed to lock Caelestia session"
|
||||
exit 0
|
||||
fi
|
||||
|
||||
TMPBG="/tmp/screen.png"
|
||||
if [ "$XDG_SESSION_TYPE" = "wayland" ]; then
|
||||
logger info "wayland session detected"
|
||||
SCREENER=${pkgs.grim}/bin/grim
|
||||
LOCKER="${pkgs.swaylock}/bin/swaylock -feF"
|
||||
else
|
||||
logger info "x11 session detected"
|
||||
SCREENER=${pkgs.scrot}/bin/scrot
|
||||
LOCKER="${pkgs.i3lock}/bin/i3lock -ef"
|
||||
fi
|
||||
|
||||
$SCREENER "$TMPBG"
|
||||
logger info "generating lock screen image"
|
||||
${pkgs.corrupter}/bin/corrupter -add 0 "$TMPBG" "$TMPBG" || logger error "failed to generate lock screen image"
|
||||
logger info "locking screen"
|
||||
logger debug "locking screen with command `''${SCREENER}`"
|
||||
$LOCKER -ti "$TMPBG"
|
||||
rm "$TMPBG"
|
||||
''
|
||||
@@ -0,0 +1,56 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "screenshot" ''
|
||||
OUTFILE_BASE="$HOME/Pictures/Screenshots/Screenshot_$(date +%Y-%m-%d_%H.%M.%S)"
|
||||
OUTFILE="$OUTFILE_BASE.png"
|
||||
SUFFIX=0
|
||||
|
||||
while getopts ':cd:egs' OPTION; do
|
||||
case "$OPTION" in
|
||||
c )
|
||||
COPY="yes"
|
||||
;;
|
||||
d )
|
||||
DELAY="$OPTARG"
|
||||
;;
|
||||
e )
|
||||
EDIT="yes"
|
||||
;;
|
||||
g )
|
||||
GIMP="yes"
|
||||
;;
|
||||
s )
|
||||
SELECT="yes"
|
||||
;;
|
||||
? )
|
||||
echo "Usage: $(basename "$0") [-c] [-d DELAY] [-e] [-g] [-s]"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
if [ "$SELECT" = "yes" ]; then
|
||||
AREA="$(${pkgs.slurp}/bin/slurp)"
|
||||
fi
|
||||
|
||||
if [ -n "$DELAY" ]; then
|
||||
sleep "$DELAY"
|
||||
fi
|
||||
|
||||
if [ "$SELECT" = "yes" ]; then
|
||||
${pkgs.grim}/bin/grim -g "$AREA" "$OUTFILE"
|
||||
else
|
||||
${pkgs.grim}/bin/grim "$OUTFILE"
|
||||
fi
|
||||
|
||||
if [ "$EDIT" = "yes" ];then
|
||||
${pkgs.swappy}/bin/swappy -f "$OUTFILE" -o "$OUTFILE"
|
||||
fi
|
||||
|
||||
if [ "$GIMP" = "yes" ]; then
|
||||
${pkgs.gimp}/bin/gimp "$OUTFILE"
|
||||
fi
|
||||
|
||||
if [ "$COPY" = "yes" ]; then
|
||||
${pkgs.wl-clipboard-rs}/bin/wl-copy < "$OUTFILE"
|
||||
fi
|
||||
''
|
||||
@@ -0,0 +1,3 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "sshbind" ''
|
||||
ssh -L "$1:$3:$1" "$2" -N''
|
||||
@@ -0,0 +1,16 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "ytplay" ''
|
||||
URL=$(rofi -dmenu -i -p "Video URL")
|
||||
if [ -z "$URL" ]; then
|
||||
echo "You need to provide a URL"
|
||||
exit 1
|
||||
fi
|
||||
RESOLUTION_CHOICE=$(${pkgs.yt-dlp}/bin/yt-dlp --list-formats "$URL" | \
|
||||
grep -E "webm.*[0-9]+x[0-9]" | \
|
||||
awk '{print $3 " " $1}' | \
|
||||
sort -gu | \
|
||||
rofi -dmenu -i -p "Resolution")
|
||||
mapfile -t RESOLUTION <<< "$RESOLUTION_CHOICE"
|
||||
RESOLUTION_CODE=''${RESOLUTION[0]}
|
||||
${pkgs.mpv}/bin/mpv --ytdl-format="''${RESOLUTION_CODE}+bestaudio/best" "$URL"
|
||||
''
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
flake.modules.homeManager.bat = {
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.cli.bat;
|
||||
in {
|
||||
options.home.cli.bat.extras = mkEnableOption "Enables extra packages for bat.";
|
||||
config.programs.bat = {
|
||||
enable = true;
|
||||
config = {
|
||||
theme = "Nord";
|
||||
map-syntax = [
|
||||
".spacemacs*:Lisp"
|
||||
];
|
||||
};
|
||||
extraPackages = mkIf cfg.extras (with pkgs.bat-extras; [
|
||||
batman
|
||||
batpipe
|
||||
]);
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
flake.modules.homeManager.btop = {
|
||||
pkgs,
|
||||
config,
|
||||
...
|
||||
}: let
|
||||
inherit (config.home) gpuType;
|
||||
in {
|
||||
programs.btop = {
|
||||
enable = true;
|
||||
package =
|
||||
if gpuType != null
|
||||
then
|
||||
pkgs.btop.override {
|
||||
rocmSupport = gpuType == "amd";
|
||||
cudaSupport = gpuType == "nvidia";
|
||||
}
|
||||
else pkgs.btop;
|
||||
settings = {
|
||||
color_theme = "${pkgs.btop}/share/btop/themes/nord.theme";
|
||||
cpu_bottom = false;
|
||||
cpu_sensor = "auto";
|
||||
io_graph_combined = false;
|
||||
io_mode = true;
|
||||
only_physical = true;
|
||||
proc_tree = true;
|
||||
rounded_corners = true;
|
||||
show_disks = true;
|
||||
show_gpu_info = "on";
|
||||
show_uptime = true;
|
||||
theme_background = true;
|
||||
vim_keys = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.cli = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.cli;
|
||||
in {
|
||||
imports = [
|
||||
m.bat
|
||||
m.btop
|
||||
m.direnv
|
||||
m.eza
|
||||
m.mu
|
||||
m.nh
|
||||
m.nix-index
|
||||
m.scripts
|
||||
m.tealdeer
|
||||
m.yt-dlp
|
||||
];
|
||||
|
||||
options.home.cli.fullDesktop = mkEnableOption "Enable all optional modules and options";
|
||||
config.home.cli = {
|
||||
bat.extras = mkDefault cfg.fullDesktop;
|
||||
mu.enable = mkDefault cfg.fullDesktop;
|
||||
scripts.enable = mkDefault cfg.fullDesktop;
|
||||
yt-dlp.enable = mkDefault cfg.fullDesktop;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{
|
||||
flake.modules.homeManager.direnv = {
|
||||
programs.direnv = {
|
||||
enable = true;
|
||||
config.global = {
|
||||
load_dotenv = true;
|
||||
hide_env_diff = true;
|
||||
};
|
||||
nix-direnv.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,10 @@
|
||||
{
|
||||
flake.modules.homeManager.eza = {
|
||||
programs.eza = {
|
||||
enable = true;
|
||||
colors = "auto";
|
||||
icons = "auto";
|
||||
git = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
flake.modules.homeManager.mu = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.cli.mu;
|
||||
in {
|
||||
options.home.cli.mu.enable = mkEnableOption "Enable mu";
|
||||
config.programs.mu.enable = cfg.enable;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{
|
||||
flake.modules.homeManager.nh = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.cli.nh;
|
||||
in {
|
||||
options.home.cli.nh.flake = mkOption {
|
||||
type = types.path;
|
||||
default = "/home/phundrak/.dotfiles";
|
||||
example = "/etc/nixos";
|
||||
};
|
||||
config.programs.nh = {
|
||||
enable = true;
|
||||
clean.enable = true;
|
||||
clean.extraArgs = "--keep-since 15d --keep 5";
|
||||
inherit (cfg) flake;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{inputs, ...}: {
|
||||
flake-file.inputs.nix-index-database = {
|
||||
url = "github:nix-community/nix-index-database";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
flake.modules.homeManager.nix-index = {
|
||||
imports = [
|
||||
inputs.nix-index-database.homeModules.nix-index
|
||||
];
|
||||
|
||||
programs = {
|
||||
nix-index.enable = true;
|
||||
nix-index-database.comma.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
flake.modules.homeManager.scripts = {
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.cli.scripts;
|
||||
scriptFiles = filesystem.listFilesRecursive ./_scripts;
|
||||
scripts = map (file: (import file {inherit pkgs config;})) scriptFiles;
|
||||
in {
|
||||
options.home.cli.scripts.enable = mkEnableOption "Add custom scripts to PATH";
|
||||
config.home.packages = mkIf cfg.enable scripts;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
{
|
||||
flake.modules.homeManager.tealdeer = {
|
||||
programs.tealdeer = {
|
||||
enable = true;
|
||||
enableAutoUpdates = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,20 @@
|
||||
{
|
||||
flake.modules.homeManager.yt-dlp = {
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.cli.yt-dlp;
|
||||
in {
|
||||
options.home.cli.yt-dlp.enable = mkEnableOption "Enable yt-dlp";
|
||||
config.programs.yt-dlp = mkIf cfg.enable {
|
||||
inherit (cfg) enable;
|
||||
settings = {
|
||||
embed-thumbnail = true;
|
||||
embed-subs = true;
|
||||
sub-langs = "all";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.creug = {
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.creug;
|
||||
in {
|
||||
imports = [m.home-base];
|
||||
|
||||
options.home.creug = {
|
||||
sshKey = {
|
||||
content = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
example = "ssh-ed25519 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
|
||||
default = null;
|
||||
};
|
||||
file = mkOption {
|
||||
type = with types; nullOr path;
|
||||
default = "/home/creug/.ssh/id_ed25519.pub";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
|
||||
home = {
|
||||
username = "creug";
|
||||
homeDirectory = "/home/creug";
|
||||
packages = [pkgs.tree pkgs.ncdu];
|
||||
preferXdgDirectories = true;
|
||||
|
||||
creug.sshKey.file = "${config.home.homeDirectory}/.ssh/id_ed25519.pub";
|
||||
|
||||
dev.vcs = {
|
||||
name = "Creug";
|
||||
email = "gregory.foulachon@gmail.com";
|
||||
editor = "${pkgs.nano}/bin/nano";
|
||||
jj = {
|
||||
enable = true;
|
||||
cz = {
|
||||
enable = true;
|
||||
alias = true;
|
||||
};
|
||||
};
|
||||
git.enable = true;
|
||||
publicKey = cfg.sshKey;
|
||||
};
|
||||
|
||||
security.ssh.enable = true;
|
||||
|
||||
shell = {
|
||||
bash.enable = true;
|
||||
zsh.enable = true;
|
||||
starship.enable = true;
|
||||
tmux.enable = false;
|
||||
zoxide.enable = false;
|
||||
};
|
||||
|
||||
stateVersion = "24.11"; # Do not modify!
|
||||
};
|
||||
|
||||
manual.manpages.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager."creug-elcafe" = {...}: {
|
||||
imports = [m.creug];
|
||||
|
||||
home = {
|
||||
cli.nh.flake = "/home/creug/.dotfiles";
|
||||
dev.editors.emacs.enable = false;
|
||||
creug.sshKey.content = builtins.readFile ../keys/id_elcafe.pub;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBdd4cNNhONjhuH4jWZ8Z8K1gbBmeDNqRybKRHMQEvZj gregoryfoulachon@googlemail.com
|
||||
@@ -0,0 +1,98 @@
|
||||
{inputs, ...}: {
|
||||
flake-file.inputs.caelestia-shell = {
|
||||
url = "github:caelestia-dots/shell";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
flake.modules.homeManager.caelestia = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.desktop.caelestia;
|
||||
in {
|
||||
imports = [inputs.caelestia-shell.homeManagerModules.default];
|
||||
|
||||
options.home.desktop.caelestia = {
|
||||
enable = mkEnableOption "Enables Caelestia Shell";
|
||||
idleTimeout = mkOption {
|
||||
description = "Idle duration in seconds before locking the session";
|
||||
default = 60 * 60; # an hour
|
||||
type = types.int;
|
||||
};
|
||||
};
|
||||
config.programs.caelestia = mkIf cfg.enable {
|
||||
inherit (cfg) enable;
|
||||
systemd = {
|
||||
enable = true;
|
||||
target = "graphical-session.target";
|
||||
environment = ["QT3_QPA_PLATFORMTHEME=gtk3"];
|
||||
};
|
||||
settings = {
|
||||
paths.wallpaperDir = "~/Pictures/Wallpapers/nord";
|
||||
general = {
|
||||
apps = {
|
||||
terminal = ["kitty"];
|
||||
audio = ["pavucontrol"];
|
||||
playback = ["mpv"];
|
||||
explorer = ["${pkgs.nemo-with-extensions}/bin/nemo"];
|
||||
};
|
||||
idle = {
|
||||
inhibitWhenAudio = true;
|
||||
timeouts = [
|
||||
{
|
||||
timeout = cfg.idleTimeout;
|
||||
idleAction = "lock";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
background = {
|
||||
desktopClock.enabled = true;
|
||||
visualiser.enabled = true;
|
||||
};
|
||||
dashboard = {
|
||||
enabled = true;
|
||||
showOnHover = true;
|
||||
};
|
||||
launcher = {
|
||||
enabled = true;
|
||||
showOnHover = false;
|
||||
useFuzzy = {
|
||||
apps = true;
|
||||
schemes = true;
|
||||
wallpapers = true;
|
||||
};
|
||||
};
|
||||
osd.enableMicrophone = true;
|
||||
bar = {
|
||||
status = {
|
||||
showAudio = true;
|
||||
showKbLayout = false;
|
||||
};
|
||||
tray.compact = true;
|
||||
};
|
||||
services = mkIf (config.home.gpuType != null) {
|
||||
inherit (config.home) gpuType;
|
||||
};
|
||||
session.commands = {
|
||||
logout = ["uwsm" "stop"];
|
||||
shutdown = ["systemctl" "poweroff"];
|
||||
hibernate = ["systemctl" "hibernate"];
|
||||
reboot = ["systemctl" "reboot"];
|
||||
};
|
||||
utilities.toasts = {
|
||||
capsLockChanged = false;
|
||||
numLockChanged = false;
|
||||
kbLayoutChanged = false;
|
||||
};
|
||||
};
|
||||
cli = {
|
||||
enable = true;
|
||||
settings.theme.enableGtk = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,44 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.desktop = {
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.desktop;
|
||||
in {
|
||||
imports = [
|
||||
m.caelestia
|
||||
m.firefox
|
||||
m.hyprland
|
||||
m.hyprpaper
|
||||
m.kdeconnect
|
||||
m.kitty
|
||||
m.obs
|
||||
m.rofi
|
||||
m.spotify
|
||||
m.swaync
|
||||
m.theme
|
||||
m.waybar
|
||||
m.wl-kbptr
|
||||
m.wlr-which-key
|
||||
m.wlsunset
|
||||
];
|
||||
|
||||
options.home.desktop.fullDesktop = mkEnableOption "Enable options for graphical environments";
|
||||
config.home.desktop = {
|
||||
firefox.enable = mkDefault cfg.fullDesktop;
|
||||
hyprland.enable = mkDefault cfg.fullDesktop;
|
||||
kdeconnect.enable = mkDefault cfg.fullDesktop;
|
||||
kitty.enable = mkDefault cfg.fullDesktop;
|
||||
obs.enable = mkDefault cfg.fullDesktop;
|
||||
rofi.enable = mkDefault cfg.fullDesktop;
|
||||
spotify.enable = mkDefault cfg.fullDesktop;
|
||||
spotify.spicetify.enable = mkDefault cfg.fullDesktop;
|
||||
theme.enable = mkDefault cfg.fullDesktop;
|
||||
wlr-which-key.enable = mkDefault cfg.fullDesktop;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
{inputs, ...}: {
|
||||
flake-file.inputs.zen-browser = {
|
||||
url = "github:youwen5/zen-browser-flake";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
flake.modules.homeManager.firefox = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.desktop.firefox;
|
||||
inherit (pkgs.stdenv.hostPlatform) system;
|
||||
zen = inputs.zen-browser.packages.${system}.default;
|
||||
settingsToLines = settings:
|
||||
concatStringsSep "\n" (mapAttrsToList (name: value: "set ${name} ${toString value}") settings);
|
||||
in {
|
||||
options.home.desktop.firefox = {
|
||||
enable = mkEnableOption "enable Firefox";
|
||||
useZen = mkEnableOption "use Zen instead of Firefox";
|
||||
tridactyl = {
|
||||
enable = mkEnableOption "enable Tridactyl";
|
||||
preConfig = mkOption {
|
||||
description = "Lines to add to the beginning of tridactylrc";
|
||||
type = types.lines;
|
||||
default = "";
|
||||
};
|
||||
config = mkOption {
|
||||
type = with types;
|
||||
attrsOf (oneOf [
|
||||
int
|
||||
str
|
||||
bool
|
||||
]);
|
||||
description = "Tridactyl settings (converted to 'set key value' lines)";
|
||||
default = {};
|
||||
example = {
|
||||
smoothscroll = true;
|
||||
history = 1000;
|
||||
};
|
||||
};
|
||||
extraConfig = mkOption {
|
||||
description = "Extra lines to add to tridactylrc (for bindings, autocmds, etc)";
|
||||
type = types.lines;
|
||||
default = "";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
home.sessionVariables.MOZ_ENABLE_WAYLAND = "1";
|
||||
programs.firefox = {
|
||||
inherit (cfg) enable;
|
||||
package =
|
||||
if cfg.useZen
|
||||
then zen
|
||||
else pkgs.firefox;
|
||||
nativeMessagingHosts = lists.optional cfg.tridactyl.enable pkgs.tridactyl-native;
|
||||
configPath = ".mozilla/firefox";
|
||||
};
|
||||
xdg.configFile."tridactyl/tridactylrc" = mkIf cfg.tridactyl.enable {
|
||||
text = concatStringsSep "\n" (filter (s: s != "") [
|
||||
cfg.tridactyl.preConfig
|
||||
(settingsToLines (cfg.tridactyl.config
|
||||
// {
|
||||
browser =
|
||||
if cfg.useZen
|
||||
then "zen"
|
||||
else "firefox";
|
||||
}))
|
||||
cfg.tridactyl.extraConfig
|
||||
]);
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
flake.modules.homeManager.hyprpaper = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.desktop.hyprpaper;
|
||||
in {
|
||||
options.home.desktop.hyprpaper = {
|
||||
enable = mkEnableOption "Enables Hyprpaper";
|
||||
default = mkOption {
|
||||
type = types.str;
|
||||
default = "/home/phundrak/Pictures/Wallpapers/nord/Nordic6.jpg";
|
||||
example = "/home/user/image.jpg";
|
||||
};
|
||||
wallpapers-dir = mkOption {
|
||||
type = types.str;
|
||||
default = "/home/phundrak/Pictures/Wallpapers/nord/";
|
||||
example = "/home/user/Pictures/";
|
||||
};
|
||||
rotation-interval = mkOption {
|
||||
type = types.str;
|
||||
default = "5m";
|
||||
example = "10m";
|
||||
description = "Interval between wallpaper rotations";
|
||||
};
|
||||
};
|
||||
config = mkIf cfg.enable {
|
||||
services.hyprpaper = {
|
||||
inherit (cfg) enable;
|
||||
settings = {
|
||||
ipc = "on";
|
||||
splash = false;
|
||||
preload = cfg.default;
|
||||
wallpaper = ", ${cfg.default}";
|
||||
};
|
||||
};
|
||||
systemd.user = {
|
||||
services.hyprpaper-rotation = {
|
||||
Unit = {
|
||||
Description = "Rotate Hyprpaper wallpaper";
|
||||
After = "graphical-session.target";
|
||||
};
|
||||
Service = {
|
||||
Type = "oneshot";
|
||||
ExecCondition = "${pkgs.procps}/bin/pidof Hyprland";
|
||||
ExecStart = "${config.home.homeDirectory}/.config/hypr/hyprpaper-rotate.sh";
|
||||
};
|
||||
};
|
||||
|
||||
timers.hyprpaper-rotation = {
|
||||
Unit = {
|
||||
Description = "Timer for rotating Hyprpaper wallpaper";
|
||||
};
|
||||
Timer = {
|
||||
OnBootSec = cfg.rotation-interval;
|
||||
OnUnitActiveSec = cfg.rotation-interval;
|
||||
};
|
||||
Install = {
|
||||
WantedBy = ["timers.target"];
|
||||
};
|
||||
};
|
||||
};
|
||||
home.file.".config/hypr/hyprpaper-rotate.sh" = {
|
||||
text = ''
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
WALLPAPER_DIR="${cfg.wallpapers-dir}"
|
||||
|
||||
# Find a random wallpaper
|
||||
WP=$(find "$WALLPAPER_DIR" -type f \( -iname "*.jpg" -o -iname "*.jpeg" -o -iname "*.png" \) | shuf -n 1)
|
||||
|
||||
if [ -z "$WP" ]; then
|
||||
echo "No wallpapers found in $WALLPAPER_DIR"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
echo "Setting wallpaper to: $WP"
|
||||
|
||||
# Load and set the wallpaper
|
||||
${pkgs.hyprland}/bin/hyprctl hyprpaper preload "$WP" && ${pkgs.hyprland}/bin/hyprctl hyprpaper wallpaper ",$WP"
|
||||
'';
|
||||
executable = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{
|
||||
flake.modules.homeManager.kdeconnect = {
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.desktop.kdeconnect;
|
||||
in {
|
||||
options.home.desktop.kdeconnect.enable = mkEnableOption "Enable KDE Connect";
|
||||
config.services.kdeconnect = mkIf cfg.enable {
|
||||
enable = true;
|
||||
indicator = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
{
|
||||
flake.modules.homeManager.kitty = {
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.desktop.kitty;
|
||||
in {
|
||||
options.home.desktop.kitty.enable = mkEnableOption "Enable kitty terminal";
|
||||
config.programs.kitty = mkIf cfg.enable {
|
||||
inherit (cfg) enable;
|
||||
themeFile = "Nord";
|
||||
font = {
|
||||
package = pkgs.cascadia-code;
|
||||
name = "Cascadia Code";
|
||||
size = 10;
|
||||
};
|
||||
settings = {
|
||||
enable_audio_bell = true;
|
||||
visual_bell_duration = 0.1;
|
||||
enabled_layouts = "fat,fat:mirrored=true,tall,tall:mirrored=true";
|
||||
kitty_mod = "ctrl+shift";
|
||||
disable_ligatures = "never";
|
||||
font_features = "Cascadia-Mono +onum +zero";
|
||||
cursor_shape = "block";
|
||||
scrollback_lines = "10000";
|
||||
mouse_hide_wait = 3.0;
|
||||
detect_urls = true;
|
||||
background_opacity = 0.7;
|
||||
};
|
||||
keybindings = let
|
||||
prefix = "kitty_mod+space";
|
||||
in {
|
||||
"alt+c" = "copy_to_clipboard";
|
||||
"kitty_mod+c" = "copy_to_clipboard";
|
||||
"alt+v" = "paste_from_clipboard";
|
||||
"kitty_mod+v" = "paste_from_clipboard";
|
||||
|
||||
"${prefix}>s>c" = "show_scrollback";
|
||||
"${prefix}>s>down" = "scroll_line_down";
|
||||
"${prefix}>s>t" = "scroll_line_down";
|
||||
"${prefix}>s>up" = "scroll_line_up";
|
||||
"${prefix}>s>s" = "scroll_line_up";
|
||||
"${prefix}>s>end" = "scroll_end";
|
||||
"${prefix}>s>home" = "scroll_home";
|
||||
"${prefix}>s>page_down" = "scroll_page_down";
|
||||
"${prefix}>s>page_up" = "scroll_page_up";
|
||||
|
||||
"${prefix}>enter" = "new_window";
|
||||
"${prefix}>w>q" = "close_window";
|
||||
"${prefix}>w>p" = "next_window";
|
||||
"${prefix}>w>n" = "previous_window";
|
||||
"${prefix}>w>f" = "move_window_forward";
|
||||
"${prefix}>w>b" = "move_window_backward";
|
||||
"${prefix}>w>t" = "move_window_to_top";
|
||||
"${prefix}>w>r" = "start_resizing_window";
|
||||
"${prefix}>w>1" = "first_window";
|
||||
"${prefix}>w>2" = "second_window";
|
||||
"${prefix}>w>3" = "third_window";
|
||||
"${prefix}>w>4" = "fourth_window";
|
||||
"${prefix}>w>5" = "fifth_window";
|
||||
"${prefix}>w>6" = "sixth_window";
|
||||
"${prefix}>w>7" = "seventh_window";
|
||||
"${prefix}>w>8" = "eighth_window";
|
||||
"${prefix}>w>9" = "ninth_window";
|
||||
"${prefix}>w>0" = "tenth_window";
|
||||
|
||||
"${prefix}>tab>n" = "next_tab";
|
||||
"${prefix}>tab>p" = "previous_tab";
|
||||
"${prefix}>tab>c" = "new_tab";
|
||||
"${prefix}>tab>q" = "close_tab";
|
||||
"${prefix}>tab>shift+n" = "move_tab_backward";
|
||||
"${prefix}>tab>shift+p" = "move_tab_forward";
|
||||
"${prefix}>tab>t" = "set_tab_title";
|
||||
|
||||
"${prefix}>l" = "next_layout";
|
||||
|
||||
"${prefix}>f>equal" = "change_font_size all 0";
|
||||
"${prefix}>f>kp_add" = "change_font_size all +2.0";
|
||||
"${prefix}>f>plus" = "change_font_size all +2.0";
|
||||
"${prefix}>f>kp_subtract" = "change_font_size all -2.0";
|
||||
"${prefix}>f>minus" = "change_font_size all -2.0";
|
||||
|
||||
"${prefix}>shift+h" = "kitten hints";
|
||||
"${prefix}>h>p" = "kitten hints --type path --program -";
|
||||
"${prefix}>h>shift+p" = "kitten hints --type path";
|
||||
"${prefix}>h>l" = "kitten hints --type line --program -";
|
||||
"${prefix}>h>w" = "kitten hints --type word --program -";
|
||||
"${prefix}>h>h" = "kitten hints --type hash --program -";
|
||||
"${prefix}>h>n" = "kitten hints --type linenum";
|
||||
"${prefix}>h>y" = "kitten hints --type hyperlink";
|
||||
|
||||
"${prefix}>f10" = "toggle_maximized";
|
||||
"${prefix}>f11" = "toggle_fullscreen";
|
||||
|
||||
"${prefix}>a>equal" = "set_background_opacity 1";
|
||||
"${prefix}>a>d" = "set_background_opacity default";
|
||||
"${prefix}>a>plus" = "set_background_opacity +0.1";
|
||||
"${prefix}>a>up" = "set_background_opacity +0.1";
|
||||
"${prefix}>a>kp_add" = "set_background_opacity +0.1";
|
||||
"${prefix}>a>minus" = "set_background_opacity -0.1";
|
||||
"${prefix}>a>down" = "set_background_opacity -0.1";
|
||||
"${prefix}>a>kp_substract" = "set_background_opacity -0.1";
|
||||
|
||||
"${prefix}>delete" = "clear_terminal reset active";
|
||||
"${prefix}>escape" = "kitty_shell window";
|
||||
"${prefix}>f2" = "edit_config_file";
|
||||
"${prefix}>n" = "new_os_window";
|
||||
"${prefix}>o" = "pass_selection_to_program";
|
||||
"${prefix}>u" = "kitten unicode_input";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
{
|
||||
flake.modules.homeManager.obs = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.desktop.obs;
|
||||
obs-image-reaction = pkgs.callPackage ../../../packages/obs-image-reaction.nix {};
|
||||
in {
|
||||
options.home.desktop.obs.enable = mkEnableOption "Enables OBS Studio";
|
||||
config.programs.obs-studio = mkIf cfg.enable {
|
||||
inherit (cfg) enable;
|
||||
plugins = with pkgs.obs-studio-plugins; [
|
||||
input-overlay
|
||||
obs-backgroundremoval
|
||||
obs-markdown
|
||||
obs-mute-filter
|
||||
obs-pipewire-audio-capture
|
||||
obs-scale-to-sound
|
||||
obs-source-clone
|
||||
obs-source-record
|
||||
obs-tuna
|
||||
obs-image-reaction
|
||||
];
|
||||
};
|
||||
};
|
||||
}
|
||||
Binary file not shown.
|
After Width: | Height: | Size: 228 KiB |
@@ -0,0 +1,109 @@
|
||||
{
|
||||
flake.modules.homeManager.rofi = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.desktop.rofi;
|
||||
inherit (config.lib.formats.rasi) mkLiteral;
|
||||
in {
|
||||
options.home.desktop.rofi = {
|
||||
enable = mkEnableOption "Enable Rofi";
|
||||
};
|
||||
config = mkIf cfg.enable {
|
||||
home.packages = with pkgs; [rofi-bluetooth];
|
||||
programs.rofi = {
|
||||
enable = true;
|
||||
plugins = with pkgs; [
|
||||
rofi-calc
|
||||
rofi-emoji
|
||||
];
|
||||
terminal = "${pkgs.kitty}/bin/kitty";
|
||||
location = "center";
|
||||
modes = ["drun" "emoji" "calc" "combi"];
|
||||
extraConfig.show-icons = true;
|
||||
theme = {
|
||||
"*" = {
|
||||
font = "Cascadia Code 14";
|
||||
blur = true;
|
||||
padding = mkLiteral "10px";
|
||||
background-color = mkLiteral "transparent";
|
||||
border-radius = mkLiteral "0px";
|
||||
};
|
||||
window = {
|
||||
width = mkLiteral "1050px";
|
||||
height = mkLiteral "625px";
|
||||
location = mkLiteral "center";
|
||||
blur = true;
|
||||
border = mkLiteral "2px";
|
||||
border-radius = mkLiteral "3px";
|
||||
border-color = mkLiteral "#61afef";
|
||||
background-color = mkLiteral "transparent";
|
||||
padding = mkLiteral "0px";
|
||||
margin = mkLiteral "30px 50px";
|
||||
};
|
||||
mainbox = {
|
||||
orientation = mkLiteral "horizontal";
|
||||
children = map mkLiteral ["borderbox"];
|
||||
spacing = mkLiteral "0px";
|
||||
padding = mkLiteral "0px";
|
||||
};
|
||||
borderbox = {
|
||||
orientation = mkLiteral "horizontal";
|
||||
children = map mkLiteral ["imagebox" "contentbox"];
|
||||
padding = mkLiteral "0px";
|
||||
spacing = mkLiteral "0px";
|
||||
border-radius = mkLiteral "3px";
|
||||
};
|
||||
contentbox = {
|
||||
orientation = mkLiteral "vertical";
|
||||
children = map mkLiteral ["entry" "listview"];
|
||||
spacing = mkLiteral "0px";
|
||||
padding = mkLiteral "0px";
|
||||
expand = true;
|
||||
};
|
||||
imagebox = {
|
||||
background-image = mkLiteral "url(\"${./image.jpg}\")";
|
||||
background-repeat = false;
|
||||
size = mkLiteral "200px 625px";
|
||||
};
|
||||
element = {
|
||||
border-radius = mkLiteral "0px";
|
||||
};
|
||||
"element-text, element-icon" = {
|
||||
padding = mkLiteral "6px 8px";
|
||||
spacing = mkLiteral "2px";
|
||||
text-color = mkLiteral "#fab387";
|
||||
};
|
||||
"element selected" = {
|
||||
background-color = mkLiteral "#191919";
|
||||
text-color = mkLiteral "#e5c07b";
|
||||
border-radius = mkLiteral "3px";
|
||||
};
|
||||
prompt = {
|
||||
enabled = false;
|
||||
background-color = mkLiteral "transparent";
|
||||
text-color = mkLiteral "#61afef";
|
||||
padding = mkLiteral "5px 10px";
|
||||
};
|
||||
entry = {
|
||||
padding = mkLiteral "8px";
|
||||
expand = false;
|
||||
font = "Cascadia Code 14";
|
||||
text-color = mkLiteral "#fab387";
|
||||
border-radius = mkLiteral "0px 3px 0px 0px";
|
||||
background-color = mkLiteral "#292e36";
|
||||
};
|
||||
listview = {
|
||||
lines = mkLiteral "1";
|
||||
background-color = mkLiteral "rgba(46, 52, 64, 0.8)";
|
||||
border-radius = mkLiteral "0px 0px 3px 0px";
|
||||
padding = mkLiteral "5px";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,33 @@
|
||||
{inputs, ...}: {
|
||||
flake-file.inputs.spicetify = {
|
||||
url = "github:Gerg-L/spicetify-nix";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
flake.modules.homeManager.spotify = {
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
inherit (pkgs.stdenv.hostPlatform) system;
|
||||
cfg = config.home.desktop.spotify;
|
||||
spicePkgs = inputs.spicetify.legacyPackages.${system};
|
||||
in {
|
||||
imports = [inputs.spicetify.homeManagerModules.default];
|
||||
|
||||
options.home.desktop.spotify = {
|
||||
enable = mkEnableOption "Enable Spotify";
|
||||
spicetify.enable = mkEnableOption "Enable Spicetify";
|
||||
};
|
||||
config.programs = mkIf cfg.enable {
|
||||
spotify-player.enable = cfg.enable;
|
||||
spicetify = mkIf cfg.spicetify.enable {
|
||||
inherit (cfg.spicetify) enable;
|
||||
theme = spicePkgs.themes.sleek;
|
||||
colorScheme = "Nord";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
{...}: {
|
||||
flake.modules.homeManager.swaync = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.desktop.swaync;
|
||||
in {
|
||||
options.home.desktop.swaync.enable = mkEnableOption "Enables swaync";
|
||||
config = mkIf cfg.enable {
|
||||
services.swaync.enable = true;
|
||||
home.packages = [pkgs.swaynotificationcenter];
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
{
|
||||
flake.modules.homeManager.theme = {
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.desktop.theme;
|
||||
in {
|
||||
options.home.desktop.theme.enable = mkEnableOption "Enable theme options";
|
||||
config = mkIf cfg.enable {
|
||||
gtk = {
|
||||
enable = true;
|
||||
colorScheme = "dark";
|
||||
iconTheme = {
|
||||
name = "Nordzy-icons";
|
||||
package = pkgs.nordzy-icon-theme;
|
||||
};
|
||||
theme = {
|
||||
package = pkgs.nordic;
|
||||
name = "Nordic";
|
||||
};
|
||||
gtk4.theme = config.gtk.theme;
|
||||
};
|
||||
home.pointerCursor = {
|
||||
enable = true;
|
||||
gtk.enable = true;
|
||||
hyprcursor.enable = config.home.desktop.hyprland.enable;
|
||||
name = "Nordzy-cursors";
|
||||
package = pkgs.nordzy-cursor-theme;
|
||||
};
|
||||
qt.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,156 @@
|
||||
{
|
||||
flake.modules.homeManager.waybar = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.desktop.waybar;
|
||||
in {
|
||||
options.home.desktop.waybar = {
|
||||
enable = mkEnableOption "Enables waybar.";
|
||||
battery = mkEnableOption "Enables battery support.";
|
||||
style = mkOption {
|
||||
type = types.path;
|
||||
example = ./style.css;
|
||||
};
|
||||
};
|
||||
config.programs.waybar = mkIf cfg.enable {
|
||||
inherit (cfg) enable;
|
||||
systemd.enable = true;
|
||||
settings = {
|
||||
topBar = {
|
||||
height = 24;
|
||||
spacing = 2;
|
||||
modules-left = ["hyprland/workspaces" "hyprland/submap" "hyprland/window"];
|
||||
modules-center = [];
|
||||
modules-right = [
|
||||
"idle_inhibitor"
|
||||
"group/audio"
|
||||
"group/hardware"
|
||||
"network"
|
||||
"privacy"
|
||||
"clock"
|
||||
"tray"
|
||||
];
|
||||
|
||||
idle_inhibitor = {
|
||||
format = "{icon}";
|
||||
format-icons = {
|
||||
activated = "";
|
||||
deactivated = "";
|
||||
};
|
||||
};
|
||||
|
||||
mpris = {
|
||||
dynamic-order = ["title" "artist" "album"];
|
||||
dynamic-importance-order = ["title" "artist" "album"];
|
||||
format = "DEFAULT: {player_icon} {dynamic}";
|
||||
format-paused = "DEFAULT: {status_icon} <i>{dynamic}</i>";
|
||||
player-icons = {
|
||||
default = "▶";
|
||||
mpv = "🎵";
|
||||
};
|
||||
status-icons.paused = "⏸";
|
||||
ignored-players = [];
|
||||
};
|
||||
|
||||
pulseaudio = {
|
||||
format = "{volume}% {icon} {format_source}";
|
||||
format-bluetooth = "{volume}% {icon} {format_source}";
|
||||
format-bluetooth-muted = " {icon} {format_source}";
|
||||
format-muted = " {format_source}";
|
||||
format-source = "{volume}% ";
|
||||
format-source-muted = "";
|
||||
format-icons = {
|
||||
headphone = "";
|
||||
hands-free = "";
|
||||
headset = "";
|
||||
phone = "";
|
||||
portable = "";
|
||||
car = "";
|
||||
default = ["" "" ""];
|
||||
};
|
||||
on-click = "pavucontrol";
|
||||
};
|
||||
|
||||
network = {
|
||||
format-wifi = "{essid} ({signalStrength}%) ";
|
||||
format-ethernet = "{ipaddr}/{cidr} ";
|
||||
tooltip-format = "{ifname} via {gwaddr} ";
|
||||
format-linked = "{ifname} (No IP) ";
|
||||
format-disconnected = "Disconnected ⚠";
|
||||
format-alt = "{ifname}: {ipaddr}/{cidr}";
|
||||
};
|
||||
|
||||
"group/audio" = {
|
||||
modules = ["pulseaudio" "pulseaudio/slider" "mpris"];
|
||||
orientation = "inherit";
|
||||
drawer.transition-duration = 300;
|
||||
};
|
||||
|
||||
"group/hardware" = {
|
||||
modules = lists.optional cfg.battery "battery" ++ ["cpu" "memory" "disk"];
|
||||
orientation = "inherit";
|
||||
drawer.transition-duration = 300;
|
||||
};
|
||||
|
||||
cpu = {
|
||||
format = "{usage}% ";
|
||||
tooltip = false;
|
||||
};
|
||||
|
||||
memory.format = "{}% ";
|
||||
|
||||
disk = {
|
||||
format = "{path}: {used}/{total} ({percentage_used}%)";
|
||||
unit = "GB";
|
||||
};
|
||||
|
||||
battery = {
|
||||
states = {
|
||||
good = 90;
|
||||
warning = 30;
|
||||
critical = 15;
|
||||
};
|
||||
format = "{capacity}% {icon}";
|
||||
format-charging = "{capacity}% ";
|
||||
format-plugged = "{capacity}% ";
|
||||
format-alt = "{time} {icon}";
|
||||
# An empty format will hide the module
|
||||
format-good = "";
|
||||
format-full = "";
|
||||
format-icons = ["" "" "" "" ""];
|
||||
};
|
||||
|
||||
clock = {
|
||||
timezones = ["Europe/Paris" "Asia/Tokyo" "America/New_York" "America/Los_Angeles" "Asia/Kathmandu"];
|
||||
tooltip-format = "<big>{:%Y %B}</big>\n<tt><small>{calendar}</small></tt>";
|
||||
format-alt = "{:%Y-%m-%d}";
|
||||
actions = {
|
||||
on-click-right = "mode";
|
||||
on-scroll-up = "tz_up";
|
||||
on-scroll-down = "tz_down";
|
||||
};
|
||||
calendar = {
|
||||
mode = "year";
|
||||
mode-mon-col = 3;
|
||||
weeks-pos = "right";
|
||||
on-scroll = 1;
|
||||
format = {
|
||||
months = "<span color='#eceff4'><b>{}</b></span>";
|
||||
days = "<span color='#5e81ac'><b>{}</b></span>";
|
||||
weeks = "<span color='#8fbcbb'><b>W{:%W}</b></span>";
|
||||
weekdays = "<span color='#d8dee9'><b>{}</b></span>";
|
||||
today = "<span color='#a3be8c'><b><u>{}</u></b></span>";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
tray.spacing = 10;
|
||||
};
|
||||
};
|
||||
style = builtins.readFile cfg.style;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,39 @@
|
||||
{
|
||||
flake.modules.homeManager.wl-kbptr = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
configDir = config.xdg.configHome;
|
||||
cfg = config.home.desktop.wl-kbptr;
|
||||
iniFormat = pkgs.formats.ini {};
|
||||
in {
|
||||
options.home.desktop.wl-kbptr = {
|
||||
enable = mkEnableOption "enable wl-kbptr";
|
||||
config = mkOption {
|
||||
inherit (iniFormat) type;
|
||||
default = {};
|
||||
description = ''
|
||||
Options to add to the {file}`config` file. See
|
||||
<https://github.com/moverest/wl-kbptr/blob/main/config.example>
|
||||
for options.
|
||||
'';
|
||||
example = {
|
||||
general = {
|
||||
home_row_keys = "abcd";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
config = mkIf cfg.enable {
|
||||
home = {
|
||||
packages = [pkgs.wl-kbptr];
|
||||
file."${configDir}/wl-kbptr/config" = mkIf (cfg.config != {}) {
|
||||
source = iniFormat.generate "wl-kbptr-config" cfg.config;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,191 @@
|
||||
{
|
||||
flake.modules.homeManager.wlr-which-key = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}: let
|
||||
inherit
|
||||
(lib)
|
||||
literalExpression
|
||||
mkIf
|
||||
mkOption
|
||||
mkEnableOption
|
||||
types
|
||||
;
|
||||
cfg = config.home.desktop.wlr-which-key;
|
||||
yamlFormat = pkgs.formats.yaml {};
|
||||
|
||||
# Convert kebab-case to snake_case
|
||||
toSnakeCase = str: builtins.replaceStrings ["-"] ["_"] str;
|
||||
|
||||
# Recursively filter out null values and convert kebab-case keys to snake_case
|
||||
filterNulls = value:
|
||||
if lib.isAttrs value
|
||||
then lib.mapAttrs' (n: v: lib.nameValuePair (toSnakeCase n) (filterNulls v)) (lib.filterAttrs (_: v: v != null) value)
|
||||
else if lib.isList value
|
||||
then map filterNulls value
|
||||
else value;
|
||||
menuEntryType = types.submodule {
|
||||
freeformType = yamlFormat.type;
|
||||
options = with types; {
|
||||
key = mkOption {
|
||||
type = str;
|
||||
example = "p";
|
||||
};
|
||||
desc = mkOption {
|
||||
type = str;
|
||||
example = "Power";
|
||||
};
|
||||
cmd = mkOption {
|
||||
type = nullOr str;
|
||||
default = null;
|
||||
example = "echo example";
|
||||
};
|
||||
keep-open = mkOption {
|
||||
type = nullOr bool;
|
||||
default = null;
|
||||
example = true;
|
||||
};
|
||||
submenu = mkOption {
|
||||
type = nullOr (listOf menuEntryType);
|
||||
default = null;
|
||||
example = literalExpression ''
|
||||
[
|
||||
{ key = "s"; desc = "Suspend"; cmd = "systemctl suspend"; }
|
||||
{ key = "r"; desc = "Reboot"; cmd = "systemctl reboot"; }
|
||||
{ key = "o"; desc = "Poweroff"; cmd = "systemctl poweroff"; }
|
||||
]
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
settingsType = types.submodule {
|
||||
freeformType = yamlFormat.type;
|
||||
options = with types; {
|
||||
background = mkOption {
|
||||
type = nullOr str;
|
||||
default = null;
|
||||
example = "#282828FF";
|
||||
};
|
||||
color = mkOption {
|
||||
type = nullOr str;
|
||||
default = null;
|
||||
example = "#FBF1C7FF";
|
||||
};
|
||||
border = mkOption {
|
||||
type = nullOr str;
|
||||
default = null;
|
||||
example = "#8EC07CFF";
|
||||
};
|
||||
anchor = mkOption {
|
||||
type = nullOr (enum ["center" "top" "bottom" "left" "right" "top-left" "top-right" "bottom-left" "bottom-right"]);
|
||||
default = null;
|
||||
example = "top-left";
|
||||
};
|
||||
margin-top = mkOption {
|
||||
type = nullOr int;
|
||||
default = null;
|
||||
example = "0";
|
||||
};
|
||||
margin-right = mkOption {
|
||||
type = nullOr int;
|
||||
default = null;
|
||||
example = "0";
|
||||
};
|
||||
margin-bottom = mkOption {
|
||||
type = nullOr int;
|
||||
default = null;
|
||||
example = "0";
|
||||
};
|
||||
margin-left = mkOption {
|
||||
type = nullOr int;
|
||||
default = null;
|
||||
example = "0";
|
||||
};
|
||||
font = mkOption {
|
||||
type = nullOr str;
|
||||
default = null;
|
||||
example = "monospace 10";
|
||||
};
|
||||
separator = mkOption {
|
||||
type = nullOr str;
|
||||
default = null;
|
||||
example = " ➜ ";
|
||||
};
|
||||
border-width = mkOption {
|
||||
type = nullOr (either float int);
|
||||
default = null;
|
||||
example = 4.0;
|
||||
};
|
||||
corder-r = mkOption {
|
||||
type = nullOr (either float int);
|
||||
default = null;
|
||||
example = 20.0;
|
||||
};
|
||||
padding = mkOption {
|
||||
type = nullOr (either float int);
|
||||
default = null;
|
||||
example = 15.0;
|
||||
};
|
||||
rows-per-column = mkOption {
|
||||
type = nullOr int;
|
||||
default = null;
|
||||
example = 5;
|
||||
};
|
||||
column-padding = mkOption {
|
||||
type = nullOr (either float int);
|
||||
default = null;
|
||||
example = 25.0;
|
||||
};
|
||||
inhibit-compositor-keyboard-shortcuts = mkOption {
|
||||
type = bool;
|
||||
default = true;
|
||||
example = false;
|
||||
};
|
||||
auto_kbd_layout = mkOption {
|
||||
type = bool;
|
||||
default = true;
|
||||
example = false;
|
||||
};
|
||||
namespace = mkOption {
|
||||
type = nullOr str;
|
||||
default = null;
|
||||
example = "wlr_which_key";
|
||||
};
|
||||
menu = mkOption {
|
||||
type = listOf menuEntryType;
|
||||
default = [];
|
||||
example = literalExpression ''
|
||||
[
|
||||
{
|
||||
key = "p";
|
||||
desc = "Power";
|
||||
submenu = [
|
||||
{ key = "s"; desc = "Suspend"; cmd = "systemctl suspend"; }
|
||||
{ key = "r"; desc = "Reboot"; cmd = "systemctl reboot"; }
|
||||
{ key = "o"; desc = "Poweroff"; cmd = "systemctl poweroff"; }
|
||||
];
|
||||
}
|
||||
]
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
in {
|
||||
options.home.desktop.wlr-which-key = {
|
||||
enable = mkEnableOption "Enables wlr-which-key";
|
||||
package = lib.mkPackageOption pkgs "wlr-which-key" {};
|
||||
settings = mkOption {
|
||||
type = settingsType;
|
||||
default = {};
|
||||
description = "Configuration written to {file}`$XDG_CONFIG_HOME/wlr-which-key/config.yaml`.";
|
||||
};
|
||||
};
|
||||
config = mkIf cfg.enable {
|
||||
xdg.configFile = {
|
||||
"wlr-which-key/config.yaml".source = yamlFormat.generate "wlr-which-key-config.yml" (filterNulls cfg.settings);
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
flake.modules.homeManager.wlsunset = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.desktop.wlsunset;
|
||||
in {
|
||||
options.home.desktop.wlsunset = {
|
||||
enable = mkEnableOption "Enables wlsunset";
|
||||
latitude = mkOption {
|
||||
type = with types; nullOr (oneOf [str ints.unsigned float]);
|
||||
default = 48.5;
|
||||
};
|
||||
longitude = mkOption {
|
||||
type = with types; nullOr (oneOf [str ints.unsigned float]);
|
||||
default = 2.2;
|
||||
};
|
||||
};
|
||||
|
||||
config.services.wlsunset = mkIf cfg.enable {
|
||||
inherit (cfg) enable latitude longitude;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.ai = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.dev.ai;
|
||||
jsonFormat = pkgs.formats.json {};
|
||||
in {
|
||||
imports = [
|
||||
m.claude
|
||||
m.ollama
|
||||
m.opencode
|
||||
];
|
||||
|
||||
options.home.dev.ai = {
|
||||
enable = mkEnableOption "Enables AI features";
|
||||
lmStudio = mkOption {
|
||||
default = cfg.enable;
|
||||
example = true;
|
||||
description = "Enables LM Studio. Enabled by default when AI is enabled.";
|
||||
};
|
||||
mcpServers = mkOption {
|
||||
inherit (jsonFormat) type;
|
||||
default = {};
|
||||
};
|
||||
};
|
||||
config = {
|
||||
home = mkIf cfg.enable {
|
||||
dev.ai = {
|
||||
claude = {
|
||||
enable = mkDefault cfg.enable;
|
||||
mcpServers = mkDefault cfg.mcpServers;
|
||||
};
|
||||
ollama.enable = mkDefault cfg.enable;
|
||||
opencode.enable = mkDefault cfg.enable;
|
||||
};
|
||||
packages = lists.optional cfg.lmStudio pkgs.lmstudio;
|
||||
};
|
||||
programs.mcp = mkIf (cfg.mcpServers != {}) {
|
||||
enable = true;
|
||||
servers = cfg.mcpServers;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{
|
||||
flake.modules.homeManager.claude = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.dev.ai.claude;
|
||||
jsonFormat = pkgs.formats.json {};
|
||||
in {
|
||||
options.home.dev.ai.claude = {
|
||||
enable = mkEnableOption "Enables Claude-related packages";
|
||||
mcpServers = mkOption {
|
||||
inherit (jsonFormat) type;
|
||||
default = {};
|
||||
};
|
||||
};
|
||||
config = mkIf cfg.enable {
|
||||
home.packages = let
|
||||
claude-jj = pkgs.writeShellScriptBin "claude-jj" ''
|
||||
${pkgs.claude-code}/bin/claude --append-system-prompt 'CRITICAL: This repository uses Jujutsu (jj), NOT git. Never use git commands. Use jj equivalents.' "$@"
|
||||
'';
|
||||
in [claude-jj pkgs.sox];
|
||||
programs.claude-code = {
|
||||
inherit (cfg) enable mcpServers;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
{
|
||||
flake.modules.homeManager.ollama = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.dev.ai.ollama;
|
||||
in {
|
||||
options.home.dev.ai.ollama = {
|
||||
enable = mkEnableOption "Enables Ollama";
|
||||
gpu = mkOption {
|
||||
type = types.nullOr (types.enum [false "rocm" "cuda"]);
|
||||
example = "rocm";
|
||||
default = null;
|
||||
description = "Which type of GPU should be used for hardware acceleration";
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
services.ollama = mkIf cfg.enable {
|
||||
inherit (cfg) enable;
|
||||
acceleration = cfg.gpu;
|
||||
host = "0.0.0.0";
|
||||
environmentVariables = {
|
||||
OLLAMA_CONTEXT_LENGTH = "8192";
|
||||
OLLAMA_MAX_LOADED_MODELS = "1";
|
||||
OLLAMA_KEEP_ALIVE = "10m";
|
||||
};
|
||||
};
|
||||
home.sessionVariables.OLLAMA_API_BASE = "http://${config.services.ollama.host}:11434/";
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
{
|
||||
flake.modules.homeManager.opencode = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
bunBaseline,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.dev.ai.opencode;
|
||||
|
||||
# On x86_64-linux CPUs without AVX2, use the baseline bun variant
|
||||
# when building opencode - the regular `bun` from nixpkgs requires
|
||||
# AVX2 and crashes on older hardware, such as my Thinkpad x220’s
|
||||
# Intel Core i5 2640M.
|
||||
needsBaselineBun =
|
||||
pkgs.stdenv.hostPlatform.isx86_64 && !pkgs.stdenv.hostPlatform.avx2Support;
|
||||
|
||||
defaultPackageCli =
|
||||
if needsBaselineBun
|
||||
then pkgs.opencode.override {bun = bunBaseline;}
|
||||
else pkgs.opencode;
|
||||
|
||||
defaultPackageDesktop =
|
||||
if needsBaselineBun
|
||||
then pkgs.opencode-desktop.override {bun = bunBaseline;}
|
||||
else pkgs.opencode-desktop;
|
||||
|
||||
corsList = domains: lists.remove "" (lists.forEach (strings.splitString "," domains) trim);
|
||||
in {
|
||||
options.home.dev.ai.opencode = {
|
||||
enable = mkEnableOption "Enables OpenCode";
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = defaultPackageCli;
|
||||
description = "The CLI package for OpenCode";
|
||||
};
|
||||
settings = mkOption {
|
||||
type = types.json;
|
||||
default = {};
|
||||
};
|
||||
tui = mkOption {
|
||||
type = types.json;
|
||||
default = {};
|
||||
};
|
||||
desktop = {
|
||||
enable = mkEnableOption "Enables the desktop app";
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = defaultPackageDesktop;
|
||||
description = "The desktop package for OpenCode";
|
||||
};
|
||||
};
|
||||
web = {
|
||||
enable = mkEnableOption "Enables OpenCode web";
|
||||
extraArgs = mkOption {
|
||||
type = types.listOf types.str;
|
||||
default = [];
|
||||
example = [
|
||||
"--hostname"
|
||||
"0.0.0.0"
|
||||
];
|
||||
};
|
||||
cors = mkOption {
|
||||
type = types.nullOr (types.either types.str types.path);
|
||||
default = null;
|
||||
example = "opencode.example.com,code.example.com";
|
||||
description = ''
|
||||
Either a string containing the domain allowed to connect to OpenCode’s web instance, or a file containing the target value. The latter is useful when using secret management if you don’t want to publicize the hostname of your OpenCode instance.
|
||||
|
||||
If you want to use multiple domains, you can separate them with a comma.
|
||||
'';
|
||||
};
|
||||
mdns = {
|
||||
enable = mkEnableOption "Enables mDNS with OpenCode";
|
||||
hostname = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
example = "opencode.local";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
config.programs.opencode = mkIf cfg.enable {
|
||||
inherit (cfg) enable tui package;
|
||||
enableMcpIntegration = true;
|
||||
extraPackages = with pkgs; [uv] ++ lists.optional cfg.desktop.enable cfg.desktop.package;
|
||||
settings =
|
||||
{
|
||||
server = mkIf cfg.web.mdns.enable {
|
||||
mdns = true;
|
||||
mdnsDomain = mkIf (cfg.web.mdns.hostname != null) cfg.web.mdns.hostname;
|
||||
cors = corsList cfg.web.cors;
|
||||
};
|
||||
}
|
||||
// cfg.settings;
|
||||
web = {
|
||||
inherit (cfg.web) enable extraArgs;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.dev = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.dev;
|
||||
in {
|
||||
imports = [
|
||||
m.ai
|
||||
m.editors
|
||||
m.vcs
|
||||
];
|
||||
|
||||
options.home.dev.fullDesktop = mkEnableOption "Enables everything except AI";
|
||||
config.home.dev = {
|
||||
vcs.fullDesktop = mkDefault cfg.fullDesktop;
|
||||
editors.fullDesktop = mkDefault cfg.fullDesktop;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.editors = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.dev.editors;
|
||||
in {
|
||||
imports = [
|
||||
m.emacs
|
||||
];
|
||||
|
||||
options.home.dev.editors.fullDesktop = mkEnableOption "Enable all editors";
|
||||
config.home.dev.editors.emacs = {
|
||||
enable = mkDefault cfg.fullDesktop;
|
||||
service = mkDefault cfg.fullDesktop;
|
||||
mu4eMime = mkDefault cfg.fullDesktop;
|
||||
org-protocol = mkDefault cfg.fullDesktop;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,70 @@
|
||||
{
|
||||
flake.modules.homeManager.emacs = {
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
emacsDefaultPackage = with pkgs; ((emacsPackagesFor emacs).emacsWithPackages (
|
||||
epkgs:
|
||||
with epkgs; [
|
||||
mu4e
|
||||
pdf-tools
|
||||
]
|
||||
));
|
||||
cfg = config.home.dev.editors.emacs;
|
||||
in {
|
||||
options.home.dev.editors.emacs = {
|
||||
enable = mkEnableOption "enables Emacs";
|
||||
package = mkOption {
|
||||
type = types.package;
|
||||
default = emacsDefaultPackage;
|
||||
};
|
||||
service = mkEnableOption "enables Emacs service";
|
||||
mu4eMime = mkEnableOption "Enables mu4e to handle mailto scheme";
|
||||
org-protocol = mkEnableOption "Enables org-protocol";
|
||||
};
|
||||
|
||||
config = {
|
||||
home.packages = with pkgs; [
|
||||
emacs-all-the-icons-fonts
|
||||
emacs-lsp-booster
|
||||
];
|
||||
programs.emacs = mkIf cfg.enable {
|
||||
enable = true;
|
||||
inherit (cfg) package;
|
||||
};
|
||||
services.emacs = mkIf cfg.service {
|
||||
enable = true;
|
||||
inherit (cfg) package;
|
||||
defaultEditor = true;
|
||||
startWithUserSession = "graphical";
|
||||
client = {
|
||||
enable = true;
|
||||
arguments = ["-c" "-a" "${cfg.package}/bin/emacs"];
|
||||
};
|
||||
};
|
||||
|
||||
xdg.desktopEntries.mu4e = mkIf cfg.mu4eMime {
|
||||
name = "mu4e";
|
||||
genericName = "mu4e";
|
||||
comment = "Maildir Utils for Emacs";
|
||||
mimeType = ["x-scheme-handler/mailto"];
|
||||
noDisplay = true;
|
||||
exec = "${cfg.package}/bin/emacsclient -c -n -a ${cfg.package}/bin/emacs -e \"(browse-url-mail \\\"\\$*\\\")\"";
|
||||
terminal = false;
|
||||
categories = ["Network" "Email" "TextEditor" "Utility"];
|
||||
};
|
||||
|
||||
xdg.desktopEntries.org-protocol = mkIf cfg.org-protocol {
|
||||
name = "org-protocol";
|
||||
exec = "${cfg.package}/bin/emacsclient -c -n -a ${cfg.package}/bin/emacs %u";
|
||||
terminal = false;
|
||||
noDisplay = true;
|
||||
categories = ["System"];
|
||||
mimeType = ["x-scheme-handler/org-protocol"];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,287 @@
|
||||
{
|
||||
flake.modules.homeManager.git = {
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.dev.vcs.git;
|
||||
in {
|
||||
options.home.dev.vcs.git = {
|
||||
enable = mkEnableOption "enables git";
|
||||
email = mkOption {
|
||||
type = types.str;
|
||||
default = "lucien@phundrak.com";
|
||||
};
|
||||
name = mkOption {
|
||||
type = types.str;
|
||||
default = "Lucien Cartier-Tilet";
|
||||
};
|
||||
cliff = mkEnableOption "enables git-cliff support";
|
||||
sendmail = {
|
||||
enable = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
server = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = "mail.phundrak.com";
|
||||
};
|
||||
user = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
};
|
||||
encryption = mkOption {
|
||||
type = types.enum ["tls" "ssl" "none"];
|
||||
default = "none";
|
||||
};
|
||||
port = mkOption {
|
||||
type = types.nullOr types.int;
|
||||
default = 587;
|
||||
};
|
||||
passwordFile = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
description = ''
|
||||
Path to a file containing the password necessary for authenticating
|
||||
against the mailserver.
|
||||
|
||||
This file should contain the password only, with no newline.
|
||||
'';
|
||||
};
|
||||
};
|
||||
browser = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
example = "${pkgs.firefox}/bin/firefox";
|
||||
default = null;
|
||||
};
|
||||
completeConfig = mkEnableOption "Complete configuration for workstations";
|
||||
emacs = {
|
||||
integration = mkOption {
|
||||
description = "enables Emacs integration";
|
||||
type = types.bool;
|
||||
default = config.home.dev.editors.emacs.enable;
|
||||
};
|
||||
pkg = mkOption {
|
||||
type = types.package;
|
||||
default = pkgs.emacs;
|
||||
};
|
||||
};
|
||||
mergeTool = mkOption {
|
||||
type = types.str;
|
||||
default = "ediff";
|
||||
};
|
||||
editor = mkOption {
|
||||
type = types.str;
|
||||
default = "${pkgs.emacs}/bin/emacsclient -c -a ${pkgs.emacs}/bin/emacs";
|
||||
};
|
||||
publicKeyFile = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
default = null;
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.git-cliff.enable = cfg.cliff;
|
||||
programs.git = let
|
||||
smtpEmail =
|
||||
if (cfg.sendmail.user == null)
|
||||
then cfg.email
|
||||
else cfg.sendmail.user;
|
||||
in {
|
||||
enable = true;
|
||||
ignores = [
|
||||
".env"
|
||||
".direnv/"
|
||||
|
||||
"*~"
|
||||
"\#*\#"
|
||||
"*.elc"
|
||||
"auto-save-list"
|
||||
".\#*"
|
||||
"*_flymake.*"
|
||||
"/auto/"
|
||||
".projectile"
|
||||
".dir-locals.el"
|
||||
|
||||
"# Org mode files"
|
||||
".org-id-locations"
|
||||
"*_archive"
|
||||
|
||||
"*.out"
|
||||
"*.o"
|
||||
"*.so"
|
||||
|
||||
"# Archives"
|
||||
"*.7zz"
|
||||
"*.dmg"
|
||||
"*.gz"
|
||||
"*.iso"
|
||||
"*.jar"
|
||||
"*.rar"
|
||||
"*.tar"
|
||||
"*.zip"
|
||||
|
||||
"*.log"
|
||||
"*.sqlite"
|
||||
|
||||
"dist/"
|
||||
];
|
||||
signing = {
|
||||
format =
|
||||
if cfg.publicKeyFile != null
|
||||
then "ssh"
|
||||
else "openpgp";
|
||||
key = cfg.publicKeyFile;
|
||||
signByDefault = true;
|
||||
};
|
||||
settings = {
|
||||
user = {
|
||||
inherit (cfg) name email;
|
||||
};
|
||||
color.ui = "auto";
|
||||
column.ui = "auto";
|
||||
tag.sort = "version:refname";
|
||||
core = mkIf cfg.completeConfig {
|
||||
compression = 9;
|
||||
inherit (cfg) editor;
|
||||
whitespace = "fix,-indent-with-non-tab,trailing-space";
|
||||
preloadindex = true;
|
||||
};
|
||||
status = {
|
||||
branch = true;
|
||||
showStash = true;
|
||||
};
|
||||
diff = {
|
||||
algorithm = "histogram";
|
||||
colorMoved = "plain";
|
||||
mnemonicPrefix = true;
|
||||
renames = "copy";
|
||||
interHunkContext = 10;
|
||||
};
|
||||
gpg.ssh.allowedSignersFile = "${config.home.homeDirectory}/.ssh/allowed_signers";
|
||||
init.defaultBranch = "main";
|
||||
pull.rebase = true;
|
||||
push = {
|
||||
default = "simple";
|
||||
autoSetupRemote = true;
|
||||
followTags = true;
|
||||
};
|
||||
rebase = {
|
||||
autoSquash = true;
|
||||
autoStash = true;
|
||||
missingCommitsCheck = "warn";
|
||||
updateRefs = true;
|
||||
};
|
||||
help.autocorrect = "prompt";
|
||||
web.browser = mkIf (cfg.browser != null) cfg.browser;
|
||||
sendemail = mkIf cfg.sendmail.enable {
|
||||
smtpserver = cfg.sendmail.server;
|
||||
smtpuser = smtpEmail;
|
||||
smtpencryption = cfg.sendmail.encryption;
|
||||
smtpserverport = cfg.sendmail.port;
|
||||
};
|
||||
credentials = mkIf (cfg.sendmail.passwordFile != null) {
|
||||
"smtp://${smtpEmail}@${cfg.sendmail.server}:${toString cfg.sendmail.port}" = {
|
||||
helper = "cat ${cfg.sendmail.passwordFile}";
|
||||
};
|
||||
};
|
||||
magithub = mkIf cfg.emacs.integration {
|
||||
online = true;
|
||||
"status" = {
|
||||
includeStatusHeader = true;
|
||||
includePullRequestsSection = true;
|
||||
includeIssuesSection = true;
|
||||
};
|
||||
};
|
||||
merge = {
|
||||
tool = mkIf cfg.completeConfig cfg.mergeTool;
|
||||
conflictstyle = "zdiff3";
|
||||
};
|
||||
mergetool.ediff.cmd = mkIf (cfg.emacs.integration && cfg.completeConfig) "\"${cfg.emacs.pkg} --eval \" (progn (defun ediff-write-merge-buffer () (let ((file ediff-merge-store-file)) (set-buffer ediff-buffer-C) (write-region (point-min) (point-max) file) (message \\\"Merge buffer saved in: %s\\\" file) (set-buffer-modified-p nil) (sit-for 1))) (setq ediff-quit-hook 'kill-emacs ediff-quit-merge-hook 'ediff-write-merge-buffer) (ediff-merge-files-with-ancestor \\\"$LOCAL\\\" \\\"$REMOTE\\\" \\\"$BASE\\\" nil \\\"$MERGED\\\"))\"\"";
|
||||
github.user = "phundrak";
|
||||
url = {
|
||||
"https://phundrak@github.com" = {
|
||||
insteadOf = "https://github.com";
|
||||
};
|
||||
"https://phundrak@labs.phundrak.com" = {
|
||||
insteadOf = "https://labs.phundrak.com";
|
||||
};
|
||||
"https://github.com/RustSec/advisory-db" = {
|
||||
insteadOf = "https://github.com/RustSec/advisory-db";
|
||||
};
|
||||
"git@github.com:Phundrak/" = {
|
||||
insteadOf = "pg:";
|
||||
};
|
||||
"git@labs.phundrak.com/phundrak:" = {
|
||||
insteadOf = "p:";
|
||||
};
|
||||
"git@github.com" = {
|
||||
insteadOf = "gh:";
|
||||
};
|
||||
"git@labs.phundrak.com" = {
|
||||
insteadOf = "labs:";
|
||||
};
|
||||
};
|
||||
alias = {
|
||||
a = "add --all";
|
||||
aca = "!git add --all && git commit --amend";
|
||||
acan = "!git add --all && git commit --amend --no-edit";
|
||||
ap = "add --patch";
|
||||
b = "branch";
|
||||
bd = "branch -d";
|
||||
bdd = "branch -D";
|
||||
c = "commit -S";
|
||||
ca = "commit -Sa";
|
||||
can = "commit -Sa --no-edit";
|
||||
cm = "commit -Sm";
|
||||
cam = "commit -Sam";
|
||||
co = "checkout";
|
||||
cob = "checkout -b";
|
||||
cod = "checkout develop";
|
||||
cl = "clone";
|
||||
cl1 = "clone --depth 1";
|
||||
f = "fetch";
|
||||
fp = "fetch --prune";
|
||||
ps = "push";
|
||||
psf = "push --force-with-lease";
|
||||
pso = "push origin";
|
||||
psfo = "push --force-with-lease origin";
|
||||
pushall = "!git remote \vert{} xargs -L1 git push";
|
||||
psl = "!git remote \vert{} xargs -L1 git push";
|
||||
pullall = "!git remote \vert{} xargs -L1 git pull";
|
||||
pll = "!git remote \vert{} xargs -L1 git pull";
|
||||
pl = "pull";
|
||||
pb = "pull --rebase";
|
||||
r = "rebase";
|
||||
ra = "rebase --abort";
|
||||
rc = "rebase --continue";
|
||||
rd = "rebase develop";
|
||||
ri = "rebase -i";
|
||||
rmf = "rm -f";
|
||||
rmd = "rm -r";
|
||||
rmdf = "rm -rf";
|
||||
sm = "submodule";
|
||||
sms = "submodule status";
|
||||
sma = "submodule add";
|
||||
smu = "submodule update";
|
||||
smui = "submodule update --init";
|
||||
smuir = "submodule update --init --recursive";
|
||||
st = "stash";
|
||||
stc = "stash clear";
|
||||
stp = "stash pop";
|
||||
stw = "stash show";
|
||||
u = "reset --";
|
||||
d = "diff -w";
|
||||
l = "log --all --oneline --graph --decorate --pretty=format':%C(magenta)%h %C(white) %an %ar%C(auto) %D%n%s%n'";
|
||||
s = "status";
|
||||
staged = "diff --cached";
|
||||
upstream = "!git push -u origin HEAD";
|
||||
unstage = "reset --";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,141 @@
|
||||
{inputs, ...}: {
|
||||
flake-file.inputs.jj-cz = {
|
||||
url = "git+https://labs.phundrak.com/phundrak/jj-cz?ref=develop";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
flake.modules.homeManager.jujutsu = {
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
inherit (pkgs.stdenv.hostPlatform) system;
|
||||
cfg = config.home.dev.vcs.jj;
|
||||
jj-cz = inputs.jj-cz.packages.${system}.default;
|
||||
in {
|
||||
options.home.dev.vcs.jj = {
|
||||
enable = mkEnableOption "enables jj";
|
||||
name = mkOption {
|
||||
type = types.str;
|
||||
default = "Lucien Cartier-Tilet";
|
||||
};
|
||||
email = mkOption {
|
||||
type = types.str;
|
||||
default = "lucien@phundrak.com";
|
||||
};
|
||||
editor = mkOption {
|
||||
type = types.str;
|
||||
default =
|
||||
if config.home.dev.editors.emacs.enable
|
||||
then "${pkgs.emacs}/bin/emacsclient -c -a ${pkgs.emacs}/bin/emacs"
|
||||
else "${pkgs.nano}/bin/nano";
|
||||
};
|
||||
signing = {
|
||||
enable = mkEnableOption "enables signing jj commits";
|
||||
sshKey = mkOption {
|
||||
type = with types; nullOr (either path str);
|
||||
example = "~/.ssh/id_ed25519.pub";
|
||||
default = "${config.home.homeDirectory}/.ssh/id_ed25519.pub";
|
||||
description = "Path to the private SSH key for signing.";
|
||||
};
|
||||
};
|
||||
cz = {
|
||||
enable = mkEnableOption "Enables jj-cz";
|
||||
alias = mkEnableOption "Enable `jj cz` as an alias to `jj-cz`";
|
||||
};
|
||||
# used in my shell .nix files
|
||||
shellCompletion = mkOption {
|
||||
description = "Enable Jujutsu shell completion";
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
home.packages = mkIf cfg.cz.enable [jj-cz];
|
||||
programs.jujutsu = {
|
||||
enable = true;
|
||||
settings = {
|
||||
user = {
|
||||
inherit (cfg) name email;
|
||||
};
|
||||
ui = {
|
||||
inherit (cfg) editor;
|
||||
default-command = "st";
|
||||
pager = ":builtin";
|
||||
show-cryptographic-signatures = true;
|
||||
diff-editor = ":builtin";
|
||||
merge-editort = ":builtin";
|
||||
# These are for vc-jj.el in Emacs
|
||||
diff-formatter = ":git";
|
||||
conflict-marker-style = "git";
|
||||
};
|
||||
signing = mkIf cfg.signing.enable {
|
||||
behavior = "own";
|
||||
backend = "ssh";
|
||||
key = cfg.signing.sshKey;
|
||||
backends.ssh.allowed-signers = "${config.home.homeDirectory}/.ssh/allowed_signers";
|
||||
backends.ssh.program = "${pkgs.openssh}/bin/ssh-keygen";
|
||||
};
|
||||
aliases = {
|
||||
blame = ["file" "annotate"];
|
||||
consume = ["squash" "--into" "@" "--from"];
|
||||
cz = mkIf cfg.cz.alias ["util" "exec" "--" "${jj-cz}/bin/jj-cz"];
|
||||
eject = ["squash" "--from" "@" "--into"];
|
||||
d = ["diff"];
|
||||
dm = ["desc" "-m"];
|
||||
gc = ["git" "clone"];
|
||||
gcc = ["git" "clone" "--colocate"];
|
||||
l = ["log"];
|
||||
la = ["log" "-r" "::"];
|
||||
lc = ["log" "-r" "(remote_bookmarks()..@)::"];
|
||||
ll = ["log" "-T" "builtin_log_detailed"];
|
||||
open = ["log" "-r" "open()"];
|
||||
n = ["new"];
|
||||
nd = ["new" "dev()"];
|
||||
nt = ["new" "trunk()"];
|
||||
revlog = ["evolog"];
|
||||
s = ["show"];
|
||||
tug = ["bookmark" "move" "--from" "heads(::@- & bookmarks())" "--to" "@-"];
|
||||
};
|
||||
colors.working_copy.underline = true;
|
||||
git = {
|
||||
private-commits = "blacklist()";
|
||||
colocate = true;
|
||||
subprocess = true;
|
||||
};
|
||||
revset-aliases = {
|
||||
"immutable_heads()" = "present(trunk()) | tags()";
|
||||
# Resolves by default to latest main/master remote bookmarks
|
||||
"trunk()" = "latest((present(main) | present(master)) & remote_bookmarks())";
|
||||
# Same as trunk() but for `dev` or `develop` bookmarks
|
||||
"dev()" = "latest((present(dev) | present(develop)) & remote_bookmarks())";
|
||||
|
||||
"user(x)" = "author(x) | committer(x)";
|
||||
"gh_pages()" = "ancestors(remote_bookmarks(exact:\"gh-pages\"))";
|
||||
|
||||
#Private and WIP commits that should never be pushed
|
||||
"wip()" = "description(glob:\"wip:*\")";
|
||||
"private()" = "description(glob:\"private:*\")";
|
||||
"blacklist()" = "wip() | private()";
|
||||
|
||||
# stack(x, n) is the set of mutable commits reachable from
|
||||
# 'x', with 'n' parents. 'n' is often useful to customize the
|
||||
# display and return set for certain operations. 'x' can be
|
||||
# used to target the set of 'roots' to traverse, e.g. @ is the
|
||||
# current stack.
|
||||
"stack()" = "ancestors(reachable(@, mutable()), 2)";
|
||||
"stack(x)" = "ancestors(reachable(x, mutable()), 2)";
|
||||
"stack(x, n)" = "ancestors(reachable(x, mutable()), n)";
|
||||
|
||||
"open()" = "stack(dev().. & mine(), 1)";
|
||||
"ready()" = "open() ~ blacklist()::";
|
||||
};
|
||||
remotes.origin.auto-track-bookmarks = "*";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.vcs = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.dev.vcs;
|
||||
in {
|
||||
imports = [m.git m.jujutsu];
|
||||
|
||||
options.home.dev.vcs = {
|
||||
fullDesktop = mkEnableOption "Enable all optional values";
|
||||
name = mkOption {
|
||||
type = types.str;
|
||||
default = "Lucien Cartier-Tilet";
|
||||
};
|
||||
email = mkOption {
|
||||
type = types.str;
|
||||
default = "lucien@phundrak.com";
|
||||
};
|
||||
editor = mkOption {
|
||||
type = types.str;
|
||||
default = "${pkgs.emacs}/bin/emacsclient -c -a ${pkgs.emacs}/bin/emacs";
|
||||
};
|
||||
publicKey = {
|
||||
content = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
example = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGj+J6N6SO+4P8dOZqfR1oiay2yxhhHnagH52avUqw5h";
|
||||
default = null;
|
||||
};
|
||||
file = mkOption {
|
||||
type = with types; nullOr path;
|
||||
default = "/home/phundrak/.ssh/id_ed25519.pub";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config.home.dev.vcs = {
|
||||
git = {
|
||||
enable = mkDefault true;
|
||||
inherit (cfg) name email editor;
|
||||
publicKeyFile = cfg.publicKey.file;
|
||||
cliff = mkDefault cfg.fullDesktop;
|
||||
completeConfig = mkDefault cfg.fullDesktop;
|
||||
};
|
||||
jj = {
|
||||
enable = mkDefault true;
|
||||
inherit (cfg) name email editor;
|
||||
signing.sshKey = mkDefault (cfg.publicKey.file or cfg.publicKey.content);
|
||||
cz = {
|
||||
enable = mkDefault true;
|
||||
alias = mkDefault true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.media = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.media;
|
||||
in {
|
||||
imports = [
|
||||
m.mopidy
|
||||
m.mpd
|
||||
m.mpd-mpris
|
||||
m.mpv
|
||||
m.ncmpcpp
|
||||
m.streamlink
|
||||
];
|
||||
|
||||
options.home.media.fullDesktop = mkEnableOption "Enables everything";
|
||||
config.home.media = {
|
||||
mopidy.enable = mkDefault cfg.fullDesktop;
|
||||
mpd.enable = mkDefault (cfg.fullDesktop or cfg.mpd-mpris.enable);
|
||||
mpv.enable = mkDefault cfg.fullDesktop;
|
||||
ncmpcpp.enable = mkDefault config.home.media.mpd.enable;
|
||||
streamlink.enable = mkDefault config.home.media.mpv.enable;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
{
|
||||
flake.modules.homeManager.mopidy = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.media.mopidy;
|
||||
in {
|
||||
options.home.media.mopidy = {
|
||||
enable = mkEnableOption "Enables Mopidy.";
|
||||
};
|
||||
|
||||
config.services.mopidy = mkIf cfg.enable {
|
||||
inherit (cfg) enable;
|
||||
extensionPackages = with pkgs; [
|
||||
mopidy-bandcamp
|
||||
mopidy-mpd
|
||||
mopidy-mpris
|
||||
mopidy-muse
|
||||
mopidy-notify
|
||||
mopidy-spotify
|
||||
];
|
||||
extraConfigFiles = [
|
||||
config.sops.secrets."mopidy/bandcamp".path
|
||||
config.sops.secrets."mopidy/spotify".path
|
||||
];
|
||||
settings = {
|
||||
mpd = {
|
||||
enabled = true;
|
||||
hostname = "::";
|
||||
port = 6600;
|
||||
};
|
||||
mpris.enabled = true;
|
||||
muse = {
|
||||
enabled = true;
|
||||
mopidy_host = "localhost";
|
||||
mopidy_port = 6690;
|
||||
mopidy_ssl = false;
|
||||
snapcast_host = "localhost";
|
||||
snapcast_port = 1780;
|
||||
snapcast_ssl = false;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
{
|
||||
flake.modules.homeManager.mpd-mpris = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.media.mpd-mpris;
|
||||
cfgMpd = config.home.media.mpd;
|
||||
in {
|
||||
options.home.media.mpd-mpris.enable = mkOption {
|
||||
type = types.bool;
|
||||
default = cfgMpd.enable;
|
||||
example = false;
|
||||
};
|
||||
config.services.mpd-mpris.enable = cfg.enable;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
{
|
||||
flake.modules.homeManager.mpd = {
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.media.mpd;
|
||||
in {
|
||||
options.home.media.mpd.enable = mkEnableOption "Enables MPD";
|
||||
config.services.mpd = mkIf cfg.enable {
|
||||
inherit (cfg) enable;
|
||||
musicDirectory = "${config.home.homeDirectory}/Music";
|
||||
playlistDirectory = "${config.home.homeDirectory}/Music/playlists";
|
||||
network.startWhenNeeded = true;
|
||||
extraConfig = ''
|
||||
follow_outside_symlinks "yes"
|
||||
follow_inside_symlinks "yes"
|
||||
|
||||
bind_to_address "localhost"
|
||||
auto_update "yes"
|
||||
|
||||
audio_output {
|
||||
type "pipewire"
|
||||
name "PipeWire"
|
||||
}
|
||||
|
||||
audio_output {
|
||||
type "fifo"
|
||||
name "my_fifo"
|
||||
path "/tmp/mpd.fifo"
|
||||
format "44100:16:2"
|
||||
}
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
{
|
||||
flake.modules.homeManager.mpv = {
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.media.mpv;
|
||||
in {
|
||||
options.home.media.mpv.enable = mkEnableOption "Enable MPV";
|
||||
config.programs.mpv = mkIf cfg.enable {
|
||||
inherit (cfg) enable;
|
||||
config = {
|
||||
force-window = "immediate";
|
||||
force-seekable = true; # force streams to be seekable
|
||||
slang = "jpn,jp,eng,en,fra,fr";
|
||||
alang = "eng,en,fra,fr";
|
||||
gpu-api = "auto";
|
||||
osc = true;
|
||||
profile = "gpu-hq";
|
||||
# geometry = "50%x50%";
|
||||
# autofit-larger = "90%x90%";
|
||||
|
||||
# Screenshots
|
||||
screenshot-format = "png";
|
||||
screenshot-high-bit-depth = true;
|
||||
screenshot-png-compression = 6;
|
||||
screenshot-directory = "${config.home.homeDirectory}/Pictures/Screenshots/mpv";
|
||||
|
||||
deband = true;
|
||||
deband-iterations = 2;
|
||||
deband-threshold = 35;
|
||||
deband-range = 20;
|
||||
|
||||
dither-depth = "auto";
|
||||
|
||||
sub-auto = "fuzzy";
|
||||
|
||||
scale = "ewa_lanczossharp";
|
||||
cscale = "ewa_lanczossharp";
|
||||
};
|
||||
scripts = with pkgs.mpvScripts; [
|
||||
crop
|
||||
encode
|
||||
inhibit-gnome
|
||||
mpris
|
||||
mpv-cheatsheet-ng
|
||||
quality-menu
|
||||
sponsorblock
|
||||
thumbfast
|
||||
twitch-chat
|
||||
youtube-chat
|
||||
youtube-upnext
|
||||
];
|
||||
bindings = {
|
||||
Q = "quit-watch-later";
|
||||
P = "show-progress";
|
||||
"/" = "add volume -2";
|
||||
"*" = "add volume 2";
|
||||
m = "cycle mute";
|
||||
M = "vf toggle hflip";
|
||||
"Ctrl+r" = "cycle_values video-rotate \"90\" \"180\" \"270\" \"0\"";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
{
|
||||
flake.modules.homeManager.ncmpcpp = {
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.media.ncmpcpp;
|
||||
in {
|
||||
options.home.media.ncmpcpp.enable = mkEnableOption "Enable ncmpcpp";
|
||||
config.programs.ncmpcpp = let
|
||||
musicDir = config.services.mpd.musicDirectory;
|
||||
in
|
||||
mkIf cfg.enable {
|
||||
inherit (cfg) enable;
|
||||
mpdMusicDir = musicDir;
|
||||
settings = {
|
||||
# directories
|
||||
ncmpcpp_directory = "${config.home.homeDirectory}/.config/ncmpcpp";
|
||||
lyrics_directory = "${musicDir}/.lyrics";
|
||||
|
||||
# MPD
|
||||
mpd_host = "localhost";
|
||||
mpd_port = 6600;
|
||||
mpd_connection_timeout = 5;
|
||||
mpd_crossfade_time = 0;
|
||||
|
||||
# music visualizer
|
||||
visualizer_output_name = "my_fifo";
|
||||
visualizer_in_stereo = "yes";
|
||||
# visualizer_type = "spectrum";
|
||||
visualizer_look = "+|";
|
||||
visualizer_color = "blue, cyan, green, yellow, magenta, red";
|
||||
|
||||
system_encoding = "UTF-8";
|
||||
|
||||
# song format
|
||||
song_list_format = "(6)[]{} (23)[red]{a} (26)[yellow]{t|f} (40)[green]{b} (4)[blue]{l}";
|
||||
now_playing_prefix = "$b";
|
||||
now_playing_suffix = "$8$/b";
|
||||
|
||||
# columns settings
|
||||
song_columns_list_format = "(6)[]{} (23)[red]{a} (26)[yellow]{t|f} (40)[green]{b} (4)[blue]{l}";
|
||||
|
||||
playlist_shorten_total_times = "yes";
|
||||
playlist_display_mode = "columns";
|
||||
browser_display_mode = "columns";
|
||||
search_engine_display_mode = "columns";
|
||||
playlist_editor_display_mode = "columns";
|
||||
autocenter_mode = "yes";
|
||||
centered_cursor = "yes";
|
||||
|
||||
progressbar_look = "─> ";
|
||||
header_visibility = "no";
|
||||
statusbar_visibility = "no";
|
||||
titles_visibility = "no";
|
||||
allow_for_physical_item_deletion = "yes";
|
||||
|
||||
lastfm_preferred_language = "en";
|
||||
space_add_mode = "add_remove";
|
||||
|
||||
locked_screen_width_part = "50";
|
||||
ask_for_locked_screen_width_part = "yes";
|
||||
jump_to_now_playing_song_at_start = "yes";
|
||||
ask_before_clearing_playlists = "yes";
|
||||
clock_display_seconds = "no";
|
||||
display_volume_level = "yes";
|
||||
display_bitrate = "no";
|
||||
display_remaining_time = "yes";
|
||||
regular_expressions = "extended";
|
||||
ignore_leading_the = "yes";
|
||||
ignore_diacritics = "yes";
|
||||
mouse_support = "no";
|
||||
tags_separator = ";";
|
||||
enable_window_title = "yes";
|
||||
search_engine_default_search_mode = 1;
|
||||
external_editor = "emacsclient -c";
|
||||
use_console_editor = "yes";
|
||||
|
||||
# colours
|
||||
colors_enabled = "yes";
|
||||
volume_color = "default";
|
||||
progressbar_color = "black";
|
||||
progressbar_elapsed_color = "white";
|
||||
statusbar_color = "white";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
{
|
||||
flake.modules.homeManager.streamlink = {
|
||||
lib,
|
||||
config,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.media.streamlink;
|
||||
in {
|
||||
options.home.media.streamlink.enable = mkEnableOption "Enable Streamlink";
|
||||
config.programs.streamlink = mkIf cfg.enable {
|
||||
enable = true;
|
||||
settings = {
|
||||
player = "${pkgs.mpv}/bin/mpv";
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,4 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "center-window" ''
|
||||
${pkgs.procps}/bin/pidof -x Hyprland && ${pkgs.hyprland}/bin/hyprctl dispatch centerwindow
|
||||
''
|
||||
@@ -0,0 +1,4 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "close-window" ''
|
||||
${pkgs.procps}/bin/pidof -x Hyprland && ${pkgs.hyprland}/bin/hyprctl dispatch killactive
|
||||
''
|
||||
@@ -0,0 +1,259 @@
|
||||
{
|
||||
config,
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}: {
|
||||
config.home.desktop.wlr-which-key.settings = {
|
||||
font = "Cascadia Code 12";
|
||||
background = "#3b4252d0";
|
||||
color = "#eceff4";
|
||||
border = "#2e3440";
|
||||
border_width = 2;
|
||||
corner_r = 10;
|
||||
rows_per_column = 5;
|
||||
column_padding = 25;
|
||||
inhibit_compositor_keyboard_shortcuts = true;
|
||||
auto_kbd_layout = true;
|
||||
menu = let
|
||||
left = "c";
|
||||
down = "t";
|
||||
up = "s";
|
||||
right = "r";
|
||||
center-window = import ./center-window.nix {inherit pkgs;};
|
||||
close-window = import ./close-window.nix {inherit pkgs;};
|
||||
float-window = import ./float-window.nix {inherit pkgs;};
|
||||
focus-urgent = import ./focus-urgent.nix {inherit pkgs;};
|
||||
fullscreen = import ./fullscreen.nix {inherit pkgs;};
|
||||
logout = import ./logout.nix {inherit pkgs;};
|
||||
app-launcher = import ../../cli/_scripts/launcher.nix {inherit pkgs;};
|
||||
plock = import ../../cli/_scripts/plock.nix {inherit pkgs;};
|
||||
ytplay = import ../../cli/_scripts/ytplay.nix {inherit pkgs;};
|
||||
in
|
||||
[
|
||||
{
|
||||
key = "a";
|
||||
desc = "Apps";
|
||||
submenu = [
|
||||
{
|
||||
key = "b";
|
||||
desc = "Browser";
|
||||
cmd = "zen";
|
||||
}
|
||||
{
|
||||
key = "B";
|
||||
desc = "Qutebrowser";
|
||||
cmd = "${pkgs.qutebrowser}/bin/qutebrowser";
|
||||
}
|
||||
{
|
||||
key = "d";
|
||||
desc = "Discord";
|
||||
cmd = "${pkgs.vesktop}/bin/vesktop";
|
||||
}
|
||||
{
|
||||
key = "e";
|
||||
desc = "Emacs";
|
||||
cmd = "${config.home.dev.editors.emacs.package}/bin/emacsclient -c -n";
|
||||
}
|
||||
{
|
||||
key = "g";
|
||||
desc = "Gimp";
|
||||
cmd = "${pkgs.gimp}/bin/gimp";
|
||||
}
|
||||
{
|
||||
key = "h";
|
||||
desc = "Handy";
|
||||
cmd = "pkill -USR2 -n handy";
|
||||
}
|
||||
{
|
||||
key = "n";
|
||||
desc = "Nemo";
|
||||
cmd = "${pkgs.nemo-with-extensions}/bin/nemo";
|
||||
}
|
||||
{
|
||||
key = "N";
|
||||
desc = "Nextcloud";
|
||||
cmd = "${pkgs.nextcloud-client}/bin/nextcloud";
|
||||
}
|
||||
{
|
||||
key = "r";
|
||||
desc = "Rofi";
|
||||
submenu = [
|
||||
{
|
||||
key = "b";
|
||||
desc = "Bluetooth";
|
||||
cmd = "${pkgs.rofi-bluetooth}/bin/rofi-bluetooth";
|
||||
}
|
||||
{
|
||||
key = "c";
|
||||
desc = "calc";
|
||||
cmd = "rofi -show calc";
|
||||
}
|
||||
{
|
||||
key = "e";
|
||||
desc = "Emoji";
|
||||
cmd = "rofi -show emoji";
|
||||
}
|
||||
{
|
||||
key = "r";
|
||||
desc = "App Menu";
|
||||
cmd = "${app-launcher}/bin/app-launcher";
|
||||
}
|
||||
{
|
||||
key = "s";
|
||||
desc = "SSH";
|
||||
cmd = "rofi -show ssh";
|
||||
}
|
||||
{
|
||||
key = "y";
|
||||
desc = "YouTube";
|
||||
cmd = "${ytplay}/bin/ytplay";
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
}
|
||||
{
|
||||
key = "b";
|
||||
desc = "Buffers";
|
||||
submenu = [
|
||||
{
|
||||
key = "c";
|
||||
desc = "Center";
|
||||
cmd = "${center-window}/bin/center-window";
|
||||
}
|
||||
{
|
||||
key = "d";
|
||||
desc = "Close";
|
||||
cmd = "${close-window}/bin/close-window";
|
||||
}
|
||||
{
|
||||
key = "f";
|
||||
desc = "Fullscreen";
|
||||
cmd = "${fullscreen}/bin/fullscreen";
|
||||
}
|
||||
{
|
||||
key = "F";
|
||||
desc = "Float";
|
||||
cmd = "${float-window}/bin/float-window";
|
||||
}
|
||||
{
|
||||
key = "u";
|
||||
desc = "Urgent";
|
||||
cmd = "${focus-urgent}/bin/focus-urgent";
|
||||
}
|
||||
{
|
||||
key = ".";
|
||||
desc = "Resize";
|
||||
submenu = [
|
||||
{
|
||||
key = left;
|
||||
desc = "Decrease Width";
|
||||
cmd = "echo decrease width";
|
||||
keep-open = true;
|
||||
}
|
||||
{
|
||||
key = down;
|
||||
desc = "Increase Height";
|
||||
cmd = "echo decrease height";
|
||||
keep-open = true;
|
||||
}
|
||||
{
|
||||
key = up;
|
||||
desc = "Decrease Height";
|
||||
cmd = "echo decrease height";
|
||||
keep-open = true;
|
||||
}
|
||||
{
|
||||
key = right;
|
||||
desc = "Increase Width";
|
||||
cmd = "echo increase width";
|
||||
keep-open = true;
|
||||
}
|
||||
];
|
||||
}
|
||||
];
|
||||
}
|
||||
{
|
||||
key = "l";
|
||||
desc = "Lock session";
|
||||
cmd = "${plock}/bin/plock";
|
||||
}
|
||||
{
|
||||
key = "p";
|
||||
desc = "Power";
|
||||
submenu = [
|
||||
{
|
||||
key = "l";
|
||||
desc = "Logout";
|
||||
cmd = "${logout}/bin/logout";
|
||||
}
|
||||
{
|
||||
key = "s";
|
||||
desc = "Suspend";
|
||||
cmd = "systemctl suspend";
|
||||
}
|
||||
{
|
||||
key = "r";
|
||||
desc = "Reboot";
|
||||
cmd = "systemctl reboot";
|
||||
}
|
||||
{
|
||||
key = "o";
|
||||
desc = "Poweroff";
|
||||
cmd = "systemctl poweroff";
|
||||
}
|
||||
];
|
||||
}
|
||||
{
|
||||
key = "s";
|
||||
desc = "Screenshots";
|
||||
submenu = [
|
||||
{
|
||||
key = "Print";
|
||||
desc = "Screenshot";
|
||||
cmd = "screenshot";
|
||||
}
|
||||
{
|
||||
key = "d";
|
||||
desc = "Delayed";
|
||||
cmd = "screenshot -d 3";
|
||||
}
|
||||
{
|
||||
key = "D";
|
||||
desc = "Select, Delay, Edit, and Copy";
|
||||
cmd = "screenshot -secd 3";
|
||||
}
|
||||
{
|
||||
key = "e";
|
||||
desc = "Select, Edit, and Copy";
|
||||
cmd = "screenshot -sec";
|
||||
}
|
||||
{
|
||||
key = "g";
|
||||
desc = "Select, Gimp, and Copy";
|
||||
cmd = "screenshot -sgc";
|
||||
}
|
||||
{
|
||||
key = "s";
|
||||
desc = "Select and Copy";
|
||||
cmd = "screenshot -sc";
|
||||
}
|
||||
];
|
||||
}
|
||||
]
|
||||
++ lib.lists.optionals config.home.desktop.wl-kbptr.enable [
|
||||
{
|
||||
key = "m";
|
||||
desc = "Mouse Warp";
|
||||
cmd = "wl-kbptr";
|
||||
}
|
||||
{
|
||||
key = "M";
|
||||
desc = "Mouse click";
|
||||
# cmd = "wl-kbptr -o modes=floating,click";
|
||||
cmd = "wl-kbptr -o modes=floating,click -o mode_floating.source=detect";
|
||||
}
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "float" ''
|
||||
${pkgs.procps}/bin/pidof -x Hyprland && ${pkgs.hyprland}/bin/hyprctl dispatch togglefloating
|
||||
''
|
||||
@@ -0,0 +1,4 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "focus-urgent" ''
|
||||
${pkgs.procps}/bin/pidof -x Hyprland && ${pkgs.hyprland}/bin/hyprctl dispatch focusurgentorlast
|
||||
''
|
||||
@@ -0,0 +1,4 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "fullscreen" ''
|
||||
${pkgs.procps}/bin/pidof -x Hyprland && ${pkgs.hyprland}/bin/hyprctl dispatch fullscreen
|
||||
''
|
||||
@@ -0,0 +1,4 @@
|
||||
{pkgs, ...}:
|
||||
pkgs.writeShellScriptBin "logout" ''
|
||||
${pkgs.procps}/bin/pidof -x Hyprland && uwsm stop
|
||||
''
|
||||
@@ -0,0 +1,181 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.phundrak = {
|
||||
pkgs,
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.phundrak;
|
||||
fullDesktop = config.home.fullDesktop;
|
||||
emacsPackage = with pkgs; ((emacsPackagesFor emacs).emacsWithPackages (
|
||||
epkgs:
|
||||
with epkgs; [
|
||||
mu4e
|
||||
pdf-tools
|
||||
tree-sitter
|
||||
tree-sitter-langs
|
||||
(treesit-grammars.with-grammars (grammar:
|
||||
with grammar; [
|
||||
tree-sitter-bash
|
||||
tree-sitter-c
|
||||
tree-sitter-cpp
|
||||
tree-sitter-css
|
||||
tree-sitter-dockerfile
|
||||
tree-sitter-http
|
||||
tree-sitter-javascript
|
||||
tree-sitter-jsdoc
|
||||
tree-sitter-json
|
||||
tree-sitter-just
|
||||
tree-sitter-markdown
|
||||
tree-sitter-markdown-inline
|
||||
tree-sitter-nix
|
||||
tree-sitter-rust
|
||||
tree-sitter-sql
|
||||
tree-sitter-toml
|
||||
tree-sitter-typescript
|
||||
tree-sitter-typst
|
||||
tree-sitter-vue
|
||||
tree-sitter-yaml
|
||||
]))
|
||||
]
|
||||
));
|
||||
askpass = import ../cli/_scripts/askpass.nix {inherit pkgs;};
|
||||
launchWithEmacsclient = import ../cli/_scripts/launch-with-emacsclient.nix {
|
||||
inherit pkgs config;
|
||||
};
|
||||
in {
|
||||
imports = [
|
||||
m.home-base
|
||||
m.sops-user-phundrak
|
||||
m.phundrak-ai
|
||||
m.phundrak-email
|
||||
m.phundrak-firefox
|
||||
m.phundrak-tmux
|
||||
m.phundrak-zellij
|
||||
m.phundrak-packages
|
||||
./_wlr-which-key
|
||||
];
|
||||
|
||||
options.home.phundrak = {
|
||||
sshKey = {
|
||||
content = mkOption {
|
||||
type = types.nullOr types.str;
|
||||
example = "ssh-ed25519 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
|
||||
default = null;
|
||||
};
|
||||
file = mkOption {
|
||||
type = with types; nullOr path;
|
||||
default = "/home/phundrak/.ssh/id_ed25519.pub";
|
||||
};
|
||||
};
|
||||
};
|
||||
|
||||
config = mkMerge [
|
||||
# light-home.nix — unconditional base
|
||||
{
|
||||
nixpkgs.config.allowUnfree = true;
|
||||
|
||||
home = {
|
||||
username = "phundrak";
|
||||
homeDirectory = "/home/phundrak";
|
||||
packages = [pkgs.tree pkgs.ncdu];
|
||||
preferXdgDirectories = true;
|
||||
|
||||
phundrak.sshKey.file = "${config.home.homeDirectory}/.ssh/id_ed25519.pub";
|
||||
|
||||
dev.vcs = {
|
||||
jj.enable = true;
|
||||
git.enable = true;
|
||||
publicKey = cfg.sshKey;
|
||||
};
|
||||
|
||||
security.ssh = {
|
||||
enable = true;
|
||||
hosts = config.sops.secrets."ssh/hosts".path;
|
||||
};
|
||||
|
||||
shell = {
|
||||
bash.enable = true;
|
||||
zsh.enable = true;
|
||||
starship = {
|
||||
enable = true;
|
||||
jjIntegration = true;
|
||||
};
|
||||
tmux.enable = true;
|
||||
zoxide = {
|
||||
enable = true;
|
||||
replaceCd = true;
|
||||
};
|
||||
};
|
||||
|
||||
stateVersion = "24.11"; # Do not modify!
|
||||
};
|
||||
|
||||
manual.manpages.enable = true;
|
||||
}
|
||||
|
||||
# home.nix — full-desktop content, now gated on home.fullDesktop
|
||||
(mkIf fullDesktop {
|
||||
sops.secrets = {
|
||||
emailPassword = {};
|
||||
"mopidy/bandcamp" = {};
|
||||
"mopidy/spotify" = {};
|
||||
"opencode/cors" = {};
|
||||
};
|
||||
|
||||
home = {
|
||||
sessionVariables = {
|
||||
LAUNCH_EDITOR = "${launchWithEmacsclient}/bin/launch-with-emacsclient";
|
||||
SUDO_ASKPASS = "${askpass}/bin/askpass";
|
||||
LSP_USE_PLISTS = "true";
|
||||
OPENAI_API_URL = "http://localhost:1234/";
|
||||
};
|
||||
desktop = {
|
||||
caelestia.enable = true;
|
||||
spotify = {
|
||||
enable = true;
|
||||
spicetify.enable = true;
|
||||
};
|
||||
wl-kbptr = {
|
||||
enable = true;
|
||||
config = {
|
||||
general = {
|
||||
# first eight chars to select areas, last three chars
|
||||
# for left, right, middle click
|
||||
# First eigh chars to select areas: auiectsr
|
||||
# last three chars for left, right, and middle click: tsr
|
||||
home_row_keys = "auiectsrtsr";
|
||||
modes = "tile,bisect,click";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
dev = {
|
||||
editors.emacs.package = emacsPackage;
|
||||
vcs.jj.signing.enable = true;
|
||||
};
|
||||
file = {
|
||||
".XCompose".source = ./XCompose;
|
||||
"${config.home.homeDirectory}/.ssh/allowed_signers" = {
|
||||
enable = true;
|
||||
text = lib.strings.join "\n" (
|
||||
map (file: let
|
||||
content = lib.strings.trim (builtins.readFile file);
|
||||
parts = lib.strings.splitString " " content;
|
||||
email = lib.lists.last parts;
|
||||
in "${email} namespaces=\"git\" ${content}")
|
||||
(lib.filesystem.listFilesRecursive ./keys)
|
||||
);
|
||||
};
|
||||
};
|
||||
media.mopidy.enable = false;
|
||||
};
|
||||
|
||||
manual.html.enable = true;
|
||||
})
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager."phundrak-elcafe" = {...}: {
|
||||
imports = [m.phundrak];
|
||||
|
||||
home = {
|
||||
cli.nh.flake = "/home/phundrak/.dotfiles";
|
||||
dev.editors.emacs.enable = false;
|
||||
phundrak.sshKey.content = builtins.readFile ../keys/id_elcafe.pub;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager."phundrak-gampo" = {config, ...}: {
|
||||
imports = [m.phundrak];
|
||||
|
||||
home = {
|
||||
fullDesktop = true;
|
||||
cli.nh.flake = "${config.home.homeDirectory}/.dotfiles";
|
||||
dev.ai.lmStudio = false;
|
||||
desktop.hyprland.host = "gampo";
|
||||
phundrak.sshKey.content = builtins.readFile ../keys/id_gampo.pub;
|
||||
};
|
||||
programs.caelestia.settings.bar.persistent = false;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager."phundrak-marpa" = {config, ...}: {
|
||||
imports = [m.phundrak];
|
||||
|
||||
home = {
|
||||
fullDesktop = true;
|
||||
gpuType = "amd";
|
||||
cli.nh.flake = "${config.home.homeDirectory}/.dotfiles";
|
||||
dev.ai = {
|
||||
enable = true;
|
||||
ollama.gpu = "rocm";
|
||||
};
|
||||
desktop = {
|
||||
hyprland.host = "marpa";
|
||||
caelestia.idleTimeout = 60 * 60 * 24; # a day
|
||||
};
|
||||
phundrak.sshKey.content = builtins.readFile ../keys/id_marpa.pub;
|
||||
};
|
||||
programs.caelestia.settings.bar.status = {
|
||||
showBattery = false;
|
||||
showWifi = false;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager."phundrak-NaroMk3" = {...}: {
|
||||
imports = [m.phundrak];
|
||||
|
||||
home = {
|
||||
cli.nh.flake = "/home/phundrak/.dotfiles";
|
||||
phundrak.sshKey.content = builtins.readFile ../keys/id_naromk3.pub;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager."phundrak-pinetab2" = {config, ...}: {
|
||||
imports = [m.phundrak];
|
||||
|
||||
home = {
|
||||
fullDesktop = true;
|
||||
cli.nh.flake = "${config.home.homeDirectory}/.dotfiles";
|
||||
desktop.hyprland.host = "gampo";
|
||||
phundrak.sshKey.content = builtins.readFile ../keys/id_pinetab2.pub;
|
||||
};
|
||||
programs.caelestia.settings.bar.persistent = false;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager."phundrak-tilo" = {...}: {
|
||||
imports = [m.phundrak];
|
||||
|
||||
home = {
|
||||
cli.nh.flake = "/tank/phundrak/.dotfiles";
|
||||
phundrak.sshKey.content = builtins.readFile ../keys/id_tilo.pub;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIA+UvZISwPdbDUQKbcBksi6dKvsVccvRIbdOE0zDQt60 lucien@phundrak.com
|
||||
@@ -0,0 +1 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIBPhP4p9KGk6jSOxJzBu+RzJPHI6baT0o+xrgPeNRwfq lucien@phundrak.com
|
||||
@@ -0,0 +1 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAILw9oiK8tZ5Vpz82RaRLpITU8qeJrT2hjvudGEDQu2QW lucien@phundrak.com
|
||||
@@ -0,0 +1 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAID8C2Upks4/feloFsgZkQ6iOZBEJ6o87NdXdHeBYNUhg lucien@phundrak.com
|
||||
@@ -0,0 +1 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIFVzXgt8Md+PgOMM3qcBIR/a8uf5s6dnxGbFlG9yD+Gx lucien@phundrak.com
|
||||
@@ -0,0 +1 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJCMgI5WDOKVUe6rUrOG4VS+hoUUVrAb1UhOECawUkrv Lucien Cartier-Tilet <lucien@phundrak.com>
|
||||
@@ -0,0 +1 @@
|
||||
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIJ7GXp4OfK2j1+7TMjVBL29Ol/6nsEMbfE2wRGkjk3Ya lucien@phundrak.com
|
||||
@@ -0,0 +1,60 @@
|
||||
{
|
||||
flake.modules.homeManager.phundrak-ai = {config, ...}: {
|
||||
home.dev.ai = {
|
||||
enable = true;
|
||||
opencode = {
|
||||
tui = {
|
||||
mouse = true;
|
||||
theme = "nord";
|
||||
attention = {
|
||||
enabled = true;
|
||||
notifications = true;
|
||||
};
|
||||
keybinds = {
|
||||
leader = "ctrl+x";
|
||||
"command_list" = "<leader><leader>";
|
||||
};
|
||||
};
|
||||
settings = {
|
||||
autoupdate = false;
|
||||
provider = {
|
||||
ollama = {
|
||||
npm = "@ai-sdk/openai-compatible";
|
||||
name = "Ollama (marpa)";
|
||||
options.baseURL = "http://marpa:11434/v1";
|
||||
};
|
||||
models = {
|
||||
"qwen3.5:9b".name = "Qwen 3.5 Medium";
|
||||
"gemma4:e4b".name = "Gemma E4B";
|
||||
"qwen2.5-coder:1.5b-base".name = "Qwen 2.5 Coder Light";
|
||||
};
|
||||
};
|
||||
permission = {
|
||||
"*" = "ask";
|
||||
glob = "allow";
|
||||
grep = "allow";
|
||||
read = {
|
||||
"*" = "allow";
|
||||
"*.env" = "deny";
|
||||
"*.env.*" = "deny";
|
||||
"*.env.example" = "allow";
|
||||
};
|
||||
skill = "allow";
|
||||
question = "allow";
|
||||
task = "allow";
|
||||
todowrite = "allow";
|
||||
};
|
||||
formatter.nixfmt = {
|
||||
command = ["nix" "fmt" "$FILE"];
|
||||
extensions = [".nix"];
|
||||
};
|
||||
};
|
||||
web = {
|
||||
enable = true;
|
||||
cors = config.sops.secrets."opencode/cors".path;
|
||||
mdns.enable = true;
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
{
|
||||
flake.modules.homeManager.phundrak-email = {config, ...}: let
|
||||
signature = ''
|
||||
Lucien “Phundrak” Cartier-Tilet
|
||||
https://phundrak.com (Français)
|
||||
https://phundrak.com/en (English)
|
||||
|
||||
Sent from GNU/Emacs
|
||||
|
||||
@@@ Sauvez un arbre, mangez un castor @@@
|
||||
@@@ Save a tree, eat a beaver @@@
|
||||
@@@ Bjarg tré, et bjórr @@@
|
||||
'';
|
||||
in {
|
||||
home.file.".signature" = {
|
||||
target = ".signature";
|
||||
text = signature;
|
||||
};
|
||||
accounts.email = {
|
||||
maildirBasePath = "Mail";
|
||||
accounts."lucien@phundrak.com" = {
|
||||
realName = "Lucien Cartier-Tilet";
|
||||
address = "lucien@phundrak.com";
|
||||
aliases = [
|
||||
"lucien@cartier-tilet.com"
|
||||
"admin@phundrak.com"
|
||||
"webmaster@phundrak.com"
|
||||
"youdontknow@phundrak.com"
|
||||
];
|
||||
passwordCommand = "cat ${config.sops.secrets.emailPassword.path}";
|
||||
signature = {
|
||||
text = signature;
|
||||
showSignature = "append";
|
||||
};
|
||||
userName = "lucien@phundrak.com";
|
||||
imap.host = "mail.phundrak.com";
|
||||
smtp.host = "mail.phundrak.com";
|
||||
mu.enable = true;
|
||||
primary = true;
|
||||
|
||||
mbsync = {
|
||||
create = "maildir";
|
||||
enable = true;
|
||||
expunge = "both";
|
||||
remove = "both";
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,90 @@
|
||||
{
|
||||
flake.modules.homeManager.phundrak-firefox = {pkgs, ...}: {
|
||||
config.home.desktop.firefox = {
|
||||
enable = true;
|
||||
useZen = true;
|
||||
tridactyl = {
|
||||
enable = true;
|
||||
preConfig = "sanitise tridactyllocal tridactylsync";
|
||||
config = {
|
||||
editorcmd = "emacsclient -c";
|
||||
keyboardlayoutbase = "bepo";
|
||||
keyboardlayoutforce = "true";
|
||||
hintchars = "auiectsr";
|
||||
smothscroll = "true";
|
||||
};
|
||||
extraConfig = ''
|
||||
command openTwitchInMpv js -d@\
|
||||
const url = new URL(document.location.href);\
|
||||
const cleanUrl = url.hostname + url.pathname;\
|
||||
const token = document.cookie.split("; ")\
|
||||
.find(item => item.startsWith("auth-token="))?.split("=")[1];\
|
||||
const auth = "--twitch-api-header=Authorization=OAuth " + token;\
|
||||
const cmd = `${pkgs.streamlink}/bin/streamlink "''${auth}" "''${cleanUrl}" best`;\
|
||||
tri.native.run(cmd)\
|
||||
@
|
||||
|
||||
unbind h
|
||||
unbind j
|
||||
unbind k
|
||||
unbind l
|
||||
unbind c
|
||||
unbind t
|
||||
unbind s
|
||||
unbind r
|
||||
unbind H
|
||||
unbind J
|
||||
unbind K
|
||||
unbind L
|
||||
unbind C
|
||||
unbind T
|
||||
unbind S
|
||||
unbind R
|
||||
|
||||
" === Bépo layout — scrolling (ctsr = hjkl) ===
|
||||
bind c scrollpx -300 0
|
||||
bind t scrollline 5
|
||||
bind s scrollline -5
|
||||
bind r scrollpx 300 0
|
||||
|
||||
" Half/full page scroll (replacing C-f/C-b/C-d/C-u)
|
||||
bind <C-t> scrollpage 0.5
|
||||
bind <C-s> scrollpage -0.5
|
||||
|
||||
" === History navigation (C/R = H/L) ===
|
||||
bind C back
|
||||
bind R forward
|
||||
|
||||
" === Tab navigation ===
|
||||
bind T tabnext
|
||||
bind S tabprev
|
||||
|
||||
" === Displaced commands ===
|
||||
" reload was on r → move to h (bépo's 'replace' position)
|
||||
bind h reload
|
||||
bind H reloadhard
|
||||
|
||||
" tabopen was on t → move to j (bépo's 'find char to' position)
|
||||
bind j fillcmdline tabopen
|
||||
|
||||
unbind ^http(s?)://youtube\.com f
|
||||
unbind ^http(s?)://youtube\.com t
|
||||
unbind ^http(s?)://youtube\.com l
|
||||
unbind ^http(s?)://youtube\.com j
|
||||
unbind ^http(s?)://twitch\.tv f
|
||||
|
||||
bind n findnext
|
||||
bind N findnext -f
|
||||
bind p findnext --reverse
|
||||
bind P findnext -f --reverse
|
||||
|
||||
bind < urlincrement -1
|
||||
bind > urlincrement 1
|
||||
bind ypt openTwitchInMpv
|
||||
bind ypv js tri.native.run(`mpv --ytdl-format="[height >=? 480]" --ontop --fs "''${document.location.href}"`)
|
||||
bind ypm hint -JF e => tri.native.run(`mpv --ytdl-format="[height >=? 480]" --ontop --fs "''${e.href}"`)
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,97 @@
|
||||
{inputs, ...}: {
|
||||
flake-file.inputs.pumo-system-info = {
|
||||
url = "git+https://labs.phundrak.com/phundrak/pumo-system-info";
|
||||
inputs.nixpkgs.follows = "nixpkgs";
|
||||
};
|
||||
|
||||
flake.modules.homeManager.phundrak-packages = {
|
||||
pkgs,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
inherit (pkgs.stdenv.hostPlatform) system;
|
||||
handy = pkgs.callPackage ../../../packages/handy.nix {};
|
||||
pumo-system-info = inputs.pumo-system-info.packages.${system}.default;
|
||||
in {
|
||||
programs.bun.enable = true;
|
||||
home.packages = with pkgs; [
|
||||
# Terminal stuff
|
||||
duf
|
||||
ffmpeg
|
||||
ripgrep-all
|
||||
unzip
|
||||
|
||||
# Fonts
|
||||
#nerdfonts
|
||||
noto-fonts-cjk-sans
|
||||
noto-fonts-cjk-serif
|
||||
tibetan-machine
|
||||
|
||||
# Browsers
|
||||
amfora
|
||||
|
||||
# Media
|
||||
ani-cli
|
||||
audacity
|
||||
plexamp
|
||||
plex-desktop
|
||||
pavucontrol # Volume control
|
||||
|
||||
# Social
|
||||
vesktop # Discord alternative that works well with wayland
|
||||
signal-desktop
|
||||
|
||||
# Misc
|
||||
# gplates
|
||||
kicad-small
|
||||
qgis
|
||||
handy
|
||||
libnotify
|
||||
nextcloud-client
|
||||
onlyoffice-desktopeditors
|
||||
pumo-system-info
|
||||
scrcpy
|
||||
syncthing
|
||||
watchmate
|
||||
chatterino7
|
||||
|
||||
# Games
|
||||
atlauncher
|
||||
heroic
|
||||
openmw
|
||||
openttd-jgrpp
|
||||
moonlight-qt
|
||||
|
||||
# Gnome stuff
|
||||
gnomeExtensions.tray-icons-reloaded
|
||||
gthumb
|
||||
|
||||
# Graphics
|
||||
inkscape
|
||||
gimp
|
||||
gimpPlugins.gmic
|
||||
|
||||
# Dev
|
||||
dbeaver-bin
|
||||
devenv
|
||||
nodejs
|
||||
sqlite
|
||||
tectonic # better LaTeX engine
|
||||
wakatime-cli
|
||||
zeal
|
||||
pandoc
|
||||
|
||||
## LSP servers
|
||||
bash-language-server
|
||||
docker-language-server
|
||||
kdePackages.qtdeclarative # For QML LSP
|
||||
nixd
|
||||
nixfmt
|
||||
marksman
|
||||
python3 # for Emacs and LSP
|
||||
vscode-json-languageserver
|
||||
yaml-language-server # Yaml (Docker, GitHub Actions, ...)
|
||||
];
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,212 @@
|
||||
{
|
||||
flake.modules.homeManager.phundrak-tmux = {
|
||||
home.shell.tmux = {
|
||||
enable = true;
|
||||
extraConfig = "set-option -sa terminal-overrides \",xterm*:Tc\"";
|
||||
unbind = [
|
||||
"C-b"
|
||||
{"copy-mode-vi" = ["H" "J" "K" "L" "h" "j" "k" "l"];}
|
||||
];
|
||||
bind = {
|
||||
prefix = [
|
||||
{
|
||||
key = "«";
|
||||
action = "select-window -p";
|
||||
}
|
||||
{
|
||||
key = "»";
|
||||
action = "select-window -n";
|
||||
}
|
||||
{
|
||||
key = "Tab";
|
||||
action = "switch-client -T windows";
|
||||
}
|
||||
{
|
||||
key = "w";
|
||||
action = "switch-client -T pane";
|
||||
}
|
||||
{
|
||||
key = "y";
|
||||
action = "switch-client -T copy-mode";
|
||||
}
|
||||
];
|
||||
pane = [
|
||||
{
|
||||
key = "/";
|
||||
action = "split-window -h -c \"#{pane-current_path}\"";
|
||||
}
|
||||
{
|
||||
key = "-";
|
||||
action = "split-window -v -c \"#{pane-current_path}\"";
|
||||
}
|
||||
{
|
||||
key = "c";
|
||||
action = "select-pane -L";
|
||||
}
|
||||
{
|
||||
key = "t";
|
||||
action = "select-pane -D";
|
||||
}
|
||||
{
|
||||
key = "s";
|
||||
action = "select-pane -U";
|
||||
}
|
||||
{
|
||||
key = "r";
|
||||
action = "select-pane -R";
|
||||
}
|
||||
{
|
||||
key = "f";
|
||||
action = "resize-pane -Z";
|
||||
}
|
||||
{
|
||||
key = ".";
|
||||
action = "switch-client -T pane-resize";
|
||||
}
|
||||
];
|
||||
"pane-resize" = [
|
||||
{
|
||||
key = "c";
|
||||
action = "resize-pane -L 5\\; switch-client -T pane-resize";
|
||||
}
|
||||
{
|
||||
key = "t";
|
||||
action = "resize-pane -D 5\\; switch-client -T pane-resize";
|
||||
}
|
||||
{
|
||||
key = "s";
|
||||
action = "resize-pane -U 5\\; switch-client -T pane-resize";
|
||||
}
|
||||
{
|
||||
key = "r";
|
||||
action = "resize-pane -R 5\\; switch-client -T pane-resize";
|
||||
}
|
||||
{
|
||||
key = "C";
|
||||
action = "resize-pane -L\\; switch-client -T pane-resize";
|
||||
}
|
||||
{
|
||||
key = "T";
|
||||
action = "resize-pane -D\\; switch-client -T pane-resize";
|
||||
}
|
||||
{
|
||||
key = "S";
|
||||
action = "resize-pane -U\\; switch-client -T pane-resize";
|
||||
}
|
||||
{
|
||||
key = "R";
|
||||
action = "resize-pane -R\\; switch-client -T pane-resize";
|
||||
}
|
||||
];
|
||||
windows = [
|
||||
{
|
||||
key = "c";
|
||||
action = "new-window";
|
||||
}
|
||||
{
|
||||
key = "n";
|
||||
action = "next-window";
|
||||
}
|
||||
{
|
||||
key = "p";
|
||||
action = "previous-window";
|
||||
}
|
||||
{
|
||||
key = "r";
|
||||
action = "command-prompt \"rename-window '%%'\"";
|
||||
}
|
||||
{
|
||||
key = "\\\"";
|
||||
action = "select-window -t :=1";
|
||||
}
|
||||
{
|
||||
key = "«";
|
||||
action = "select-window -t :=2";
|
||||
}
|
||||
{
|
||||
key = "»";
|
||||
action = "select-window -t :=3";
|
||||
}
|
||||
{
|
||||
key = "(";
|
||||
action = "select-window -t :=4";
|
||||
}
|
||||
{
|
||||
key = ")";
|
||||
action = "select-window -t :=5";
|
||||
}
|
||||
{
|
||||
key = "@";
|
||||
action = "select-window -t :=6";
|
||||
}
|
||||
{
|
||||
key = "+";
|
||||
action = "select-window -t :=7";
|
||||
}
|
||||
{
|
||||
key = "-";
|
||||
action = "select-window -t :=8";
|
||||
}
|
||||
{
|
||||
key = "/";
|
||||
action = "select-window -t :=9";
|
||||
}
|
||||
{
|
||||
key = "*";
|
||||
action = "select-window -t :=10";
|
||||
}
|
||||
];
|
||||
"copy-mode-vi" = [
|
||||
{
|
||||
key = "v";
|
||||
action = "send-keys -X begin-selection";
|
||||
}
|
||||
{
|
||||
key = "C-v";
|
||||
action = "send-keys -X rectangle-toggle";
|
||||
}
|
||||
{
|
||||
key = "y";
|
||||
action = "send-keys -X copy-selection-and-cancel";
|
||||
}
|
||||
{
|
||||
key = "C";
|
||||
action = "send-keys -X top-line";
|
||||
}
|
||||
{
|
||||
key = "J";
|
||||
action = "send-keys -X jump-to-backward";
|
||||
}
|
||||
{
|
||||
key = "S";
|
||||
action = "send-keys -X scroll-up";
|
||||
}
|
||||
{
|
||||
key = "R";
|
||||
action = "send-keys -X bottom-line";
|
||||
}
|
||||
{
|
||||
key = "T";
|
||||
action = "send-keys -X scroll-down";
|
||||
}
|
||||
{
|
||||
key = "c";
|
||||
action = "send-keys -X cursor-left";
|
||||
}
|
||||
{
|
||||
key = "t";
|
||||
action = "send-keys -X cursor-down";
|
||||
}
|
||||
{
|
||||
key = "s";
|
||||
action = "send-keys -X cursor-up";
|
||||
}
|
||||
{
|
||||
key = "r";
|
||||
action = "send-keys -X cursor-right";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,266 @@
|
||||
{
|
||||
flake.modules.homeManager.phundrak-zellij = {lib, ...}: {
|
||||
home.shell.zellij = with lib; {
|
||||
enable = true;
|
||||
clearDefaultKeybinds = true;
|
||||
useUnlockFirst = true;
|
||||
settings.copy_on_select = true;
|
||||
extraSettings = ''
|
||||
plugins {
|
||||
about location="zellij:about"
|
||||
compact-bar location="zellij:compact-bar"
|
||||
configuration location="zellij:configuration"
|
||||
filepicker location="zellij:strider" {
|
||||
cwd "/"
|
||||
}
|
||||
plugin-manager location="zellij:plugin-manager"
|
||||
session-manager location="zellij:session-manager"
|
||||
status-bar location="zellij:status-bar"
|
||||
strider location="zellij:strider"
|
||||
tab-bar location="zellij:tab-bar"
|
||||
welcome-screen location="zellij:session-manager" {
|
||||
welcome_screen true
|
||||
}
|
||||
}
|
||||
'';
|
||||
keybinds = let
|
||||
# bépo layout
|
||||
left = ["c" "Left"];
|
||||
down = ["t" "Down"];
|
||||
up = ["s" "Up"];
|
||||
right = ["r" "Right"];
|
||||
numRow = ["\"" "«" "»" "(" ")" "@" "+" "-" "/" "*"];
|
||||
in {
|
||||
locked = [
|
||||
{
|
||||
bind = "Ctrl Alt g";
|
||||
actions = {SwitchToMode = "normal";};
|
||||
}
|
||||
];
|
||||
pane = [
|
||||
{
|
||||
bind = left;
|
||||
actions = {MoveFocus = "Left";};
|
||||
}
|
||||
{
|
||||
bind = down;
|
||||
actions = {MoveFocus = "Down";};
|
||||
}
|
||||
{
|
||||
bind = up;
|
||||
actions = {MoveFocus = "Up";};
|
||||
}
|
||||
{
|
||||
bind = right;
|
||||
actions = {MoveFocus = "Right";};
|
||||
}
|
||||
{
|
||||
bind = "n";
|
||||
actions = {NewPane = [];};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "T";
|
||||
actions = {NewPane = "Down";};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "R";
|
||||
actions = {NewPane = "Right";};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "S";
|
||||
actions = {NewPane = "stacked";};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "N";
|
||||
actions = {SwitchToMode = "normal";};
|
||||
}
|
||||
{
|
||||
bind = "e";
|
||||
actions = {TogglePaneEmbedOrFloating = [];};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "i";
|
||||
actions = {TogglePanePinned = [];};
|
||||
}
|
||||
{
|
||||
bind = "f";
|
||||
actions = {ToggleFocusFullscreen = [];};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "F";
|
||||
actions = {ToggleFloatingPanes = [];};
|
||||
}
|
||||
{
|
||||
bind = "q";
|
||||
actions = {CloseFocus = [];};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "p";
|
||||
actions = {SwitchToMode = "normal";};
|
||||
}
|
||||
{
|
||||
bind = "P";
|
||||
actions = {
|
||||
SwitchToMode = "renamepane";
|
||||
PaneNameInput = 0;
|
||||
};
|
||||
}
|
||||
{
|
||||
bind = "z";
|
||||
actions = {TogglePaneFrames = [];};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "tab";
|
||||
actions = {SwitchFocus = [];};
|
||||
}
|
||||
];
|
||||
resize = [
|
||||
{
|
||||
bind = "n";
|
||||
actions = {SwitchToMode = "locked";};
|
||||
}
|
||||
{
|
||||
bind = left;
|
||||
actions = {Resize = "Increase Left";};
|
||||
}
|
||||
{
|
||||
bind = down;
|
||||
actions = {Resize = "Increase Down";};
|
||||
}
|
||||
{
|
||||
bind = up;
|
||||
actions = {Resize = "Increase Up";};
|
||||
}
|
||||
{
|
||||
bind = right;
|
||||
actions = {Resize = "Increase Right";};
|
||||
}
|
||||
{
|
||||
bind = "C";
|
||||
actions = {Resize = "Decrease Left";};
|
||||
}
|
||||
{
|
||||
bind = "T";
|
||||
actions = {Resize = "Decrease Down";};
|
||||
}
|
||||
{
|
||||
bind = "S";
|
||||
actions = {Resize = "Decrease Up";};
|
||||
}
|
||||
{
|
||||
bind = "R";
|
||||
actions = {Resize = "Decrease Right";};
|
||||
}
|
||||
{
|
||||
bind = "+";
|
||||
actions = {Resize = "Increase";};
|
||||
}
|
||||
{
|
||||
bind = "-";
|
||||
actions = {Resize = "Decrease";};
|
||||
}
|
||||
];
|
||||
move = [
|
||||
{
|
||||
bind = left;
|
||||
actions = {MovePane = "left";};
|
||||
}
|
||||
{
|
||||
bind = down;
|
||||
actions = {MovePane = "down";};
|
||||
}
|
||||
{
|
||||
bind = up;
|
||||
actions = {MovePane = "up";};
|
||||
}
|
||||
{
|
||||
bind = right;
|
||||
actions = {MovePane = "right";};
|
||||
}
|
||||
{
|
||||
bind = "m";
|
||||
actions = {SwitchToMode = "normal";};
|
||||
}
|
||||
{
|
||||
bind = ["n" "tab"];
|
||||
actions = {MovePane = [];};
|
||||
}
|
||||
{
|
||||
bind = "p";
|
||||
actions = {MovePaneBackwards = [];};
|
||||
}
|
||||
];
|
||||
tab =
|
||||
[
|
||||
{
|
||||
bind = left ++ up;
|
||||
actions = {GoToPreviousTab = [];};
|
||||
}
|
||||
{
|
||||
bind = down ++ right;
|
||||
actions = {GoToNextTab = [];};
|
||||
}
|
||||
{
|
||||
bind = "[";
|
||||
actions = {BreakPaneLeft = [];};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "]";
|
||||
actions = {BreakPaneRight = [];};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "b";
|
||||
actions = {BreakPane = [];};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "n";
|
||||
actions = {NewTab = [];};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "R";
|
||||
actions = {
|
||||
SwitchToMode = "renametab";
|
||||
TabNameInput = 0;
|
||||
};
|
||||
}
|
||||
{
|
||||
bind = "s";
|
||||
actions = {ToggleActiveSyncTab = [];};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "T";
|
||||
actions = {SwitchToMode = "normal";};
|
||||
}
|
||||
{
|
||||
bind = "x";
|
||||
actions = {CloseTab = [];};
|
||||
useUnlockFirst = true;
|
||||
}
|
||||
{
|
||||
bind = "tab";
|
||||
actions = {ToggleTab = [];};
|
||||
}
|
||||
]
|
||||
++ (lists.imap1 (i: key: {
|
||||
bind = key;
|
||||
actions = {GoToTab = i;};
|
||||
useUnlockFirst = true;
|
||||
})
|
||||
numRow);
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
flake.modules.homeManager.gpg = {
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.security.gpg;
|
||||
in {
|
||||
options.home.security.gpg = {
|
||||
enable = mkEnableOption "Enable GPG";
|
||||
pinentry.package = mkOption {
|
||||
type = types.package;
|
||||
default = pkgs.pinentry-gnome3;
|
||||
};
|
||||
};
|
||||
config = mkIf cfg.enable {
|
||||
programs.gpg = {
|
||||
inherit (cfg) enable;
|
||||
mutableKeys = true;
|
||||
mutableTrust = true;
|
||||
};
|
||||
services.gpg-agent = {
|
||||
enable = true;
|
||||
enableSshSupport = false;
|
||||
pinentry.package = cfg.pinentry.package;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.security = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.security;
|
||||
in {
|
||||
imports = [
|
||||
m.gpg
|
||||
m.ssh
|
||||
];
|
||||
options.home.security.fullDesktop = mkEnableOption "Enable all modules";
|
||||
config.home.security = {
|
||||
gpg.enable = mkDefault cfg.fullDesktop;
|
||||
ssh.enable = mkDefault cfg.fullDesktop;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,26 @@
|
||||
{
|
||||
flake.modules.homeManager.ssh = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.security.ssh;
|
||||
in {
|
||||
options.home.security.ssh = {
|
||||
enable = mkEnableOption "enables SSH";
|
||||
hosts = mkOption {
|
||||
type = types.nullOr types.path;
|
||||
default = null;
|
||||
};
|
||||
};
|
||||
|
||||
config = {
|
||||
programs.ssh = mkIf cfg.enable {
|
||||
enable = true;
|
||||
enableDefaultConfig = false;
|
||||
includes = lists.optional (cfg.hosts != null) cfg.hosts;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
flake.modules.homeManager.blanket = {
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.myServices.blanket;
|
||||
in {
|
||||
options.home.myServices.blanket.enable = mkEnableOption "Enable blanket";
|
||||
config.services.blanket.enable = cfg.enable;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,24 @@
|
||||
{
|
||||
flake.modules.homeManager.mbsync = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.myServices.mbsync;
|
||||
in {
|
||||
options.home.myServices.mbsync = {
|
||||
enable = mkEnableOption "Enables mbsync";
|
||||
service.enable = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
systemd.user.services.mbsync.unitConfig.After = ["sops-nix.service"];
|
||||
services.mbsync.enable = cfg.service.enable;
|
||||
programs.mbsync.enable = true;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
flake.modules.homeManager.mpris-proxy = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.myServices.mpris-proxy;
|
||||
in {
|
||||
options.home.myServices.mpris-proxy.enable = mkEnableOption "Enable MPRIS forwarding towards bluetooth and MIDI";
|
||||
config.services.mpris-proxy.enable = cfg.enable;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.my-services = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.myServices;
|
||||
in {
|
||||
imports = [
|
||||
m.blanket
|
||||
m.mbsync
|
||||
m.mpris-proxy
|
||||
m.playerctld
|
||||
];
|
||||
options.home.myServices.fullDesktop = mkOption {
|
||||
description = "Enable all modules";
|
||||
type = types.bool;
|
||||
default = config.home.fullDesktop;
|
||||
};
|
||||
config.home.myServices = {
|
||||
blanket.enable = mkDefault cfg.fullDesktop;
|
||||
mbsync.enable = mkDefault cfg.fullDesktop;
|
||||
mpris-proxy.enable = mkDefault cfg.fullDesktop;
|
||||
playerctld.enable = mkDefault cfg.fullDesktop;
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
{
|
||||
flake.modules.homeManager.playerctld = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.myServices.playerctld;
|
||||
in {
|
||||
options.home.myServices.playerctld.enable = mkEnableOption "Enable playerctld daemon";
|
||||
config.services.playerctld.enable = cfg.enable;
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,60 @@
|
||||
{
|
||||
flake.modules.homeManager.bash = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.shell.bash;
|
||||
in {
|
||||
options.home.shell.bash = {
|
||||
enable = mkEnableOption "Enables bash";
|
||||
aliases = mkOption {
|
||||
type = types.attrsOf types.str;
|
||||
default = {};
|
||||
example = {
|
||||
cp = "cp -i";
|
||||
lns = "ln -si";
|
||||
};
|
||||
};
|
||||
autocompletion = mkOption {
|
||||
type = types.bool;
|
||||
default = config.home.shell.autocompletion;
|
||||
example = true;
|
||||
};
|
||||
eatIntegration = mkEnableOption "Enable Emacs Eat integration";
|
||||
bashrcExtra = mkOption {
|
||||
type = types.lines;
|
||||
default = "";
|
||||
};
|
||||
};
|
||||
|
||||
config = mkIf cfg.enable {
|
||||
programs.bash = {
|
||||
enable = true;
|
||||
# inherit (cfg) bashrcExtra;
|
||||
bashrcExtra =
|
||||
concatLines
|
||||
[
|
||||
(strings.optionalString cfg.eatIntegration ''[ -n "$EAT_SHELL_INTEGRATION_DIR" ] && source "$EAT_SHELL_INTEGRATION_DIR/bash"'')
|
||||
(strings.optionalString config.home.dev.vcs.jj.shellCompletion "source <(jj util completion bash)")
|
||||
cfg.bashrcExtra
|
||||
];
|
||||
enableCompletion = cfg.autocompletion;
|
||||
shellAliases = cfg.aliases;
|
||||
shellOptions = [
|
||||
"histappend"
|
||||
"cmdhist"
|
||||
"lithist"
|
||||
"checkwinsize"
|
||||
"extglob"
|
||||
"globstar"
|
||||
"checkjobs"
|
||||
"autocd"
|
||||
"cdspell"
|
||||
"dirspell"
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,92 @@
|
||||
{
|
||||
flake.modules.homeManager.fish = {
|
||||
config,
|
||||
lib,
|
||||
pkgs,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.shell.fish;
|
||||
in {
|
||||
options.home.shell.fish = {
|
||||
enable = lib.mkEnableOption "enables fish";
|
||||
abbrs = lib.mkOption {
|
||||
type = types.attrsOf types.str;
|
||||
default = {};
|
||||
example = {
|
||||
cp = "cp -i";
|
||||
lns = "ln -si";
|
||||
};
|
||||
};
|
||||
autocompletion = mkOption {
|
||||
type = types.bool;
|
||||
default = config.home.shell.autocompletion;
|
||||
example = true;
|
||||
};
|
||||
extraShellInit = mkOption {
|
||||
type = types.lines;
|
||||
default = "";
|
||||
};
|
||||
};
|
||||
|
||||
config = lib.mkIf cfg.enable {
|
||||
programs.fish = {
|
||||
enable = true;
|
||||
generateCompletions = cfg.autocompletion;
|
||||
shellAbbrs = cfg.abbrs;
|
||||
preferAbbrs = true;
|
||||
shellInit = with lib;
|
||||
concatLines [
|
||||
''
|
||||
function fish_command_not_found
|
||||
__fish_default_command_not_found_handler $argv
|
||||
end
|
||||
''
|
||||
(strings.optionalString config.home.dev.vcs.jj.shellCompletion "jj util completion fish | source")
|
||||
cfg.extraShellInit
|
||||
];
|
||||
plugins = [
|
||||
{
|
||||
name = "bass";
|
||||
inherit (pkgs.fishPlugins.bass) src;
|
||||
# src = pkgs.fishPlugins.bass.src;
|
||||
}
|
||||
{
|
||||
name = "colored-man-pages";
|
||||
inherit (pkgs.fishPlugins.colored-man-pages) src;
|
||||
}
|
||||
{
|
||||
name = "done";
|
||||
inherit (pkgs.fishPlugins.done) src;
|
||||
}
|
||||
{
|
||||
name = "fzf";
|
||||
inherit (pkgs.fishPlugins.fzf) src;
|
||||
}
|
||||
{
|
||||
name = "pisces";
|
||||
inherit (pkgs.fishPlugins.pisces) src;
|
||||
}
|
||||
{
|
||||
name = "getopts.fish";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "jorgebucaran";
|
||||
repo = "getopts.fish";
|
||||
rev = "4b74206725c3e11d739675dc2bb84c77d893e901";
|
||||
sha256 = "9hRFBmjrCgIUNHuOJZvOufyLsfreJfkeS6XDcCPesvw=";
|
||||
};
|
||||
}
|
||||
{
|
||||
name = "replay.fish";
|
||||
src = pkgs.fetchFromGitHub {
|
||||
owner = "jorgebucaran";
|
||||
repo = "replay.fish";
|
||||
rev = "d2ecacd3fe7126e822ce8918389f3ad93b14c86c";
|
||||
sha256 = "TzQ97h9tBRUg+A7DSKeTBWLQuThicbu19DHMwkmUXdg=";
|
||||
};
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,116 @@
|
||||
{config, ...}: let
|
||||
m = config.flake.modules.homeManager;
|
||||
in {
|
||||
flake.modules.homeManager.shell = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
defaultAliases = {
|
||||
df = "df -H";
|
||||
diskspace = "sudo df -h | grep -E \"sd|lv|Size\"";
|
||||
du = "du -ch";
|
||||
meminfo = "free -m -l -t";
|
||||
gpumeminfo = "grep -i --color memory /var/log/Xorg.0.log";
|
||||
cpuinfo = "lscpu";
|
||||
pscpu = "ps auxf | sort -nr -k 3";
|
||||
pscpu10 = "ps auxf | sort -nr -k 3 | head -10";
|
||||
psmem = "ps auxf | sort -nr -k 4";
|
||||
psmem10 = "ps auxf | sort -nr -k 4 | head -10";
|
||||
|
||||
s = "systemctl";
|
||||
ss = "systemctl status";
|
||||
sst = "systemctl stop";
|
||||
sr = "systemctl restart";
|
||||
sre = "systemctl reload";
|
||||
se = "systemctl enable";
|
||||
sen = "systemctl enable --now";
|
||||
su = "systemctl --user";
|
||||
sus = "systemctl --user status";
|
||||
sust = "systemctl --user stop";
|
||||
sur = "systemctl --user restart";
|
||||
sure = "systemctl --user reload";
|
||||
sue = "systemctl --user enable";
|
||||
suen = "systemctl --user enable --now";
|
||||
|
||||
dc = "docker compose";
|
||||
dcd = "docker compose down";
|
||||
dcl = "docker compose logs";
|
||||
dclf = "docker compose logs -f";
|
||||
dcp = "docker compose pull";
|
||||
dcu = "docker compose up";
|
||||
dcud = "docker compose up -d";
|
||||
dcudp = "docker compose up -d --pull=always";
|
||||
dcr = "docker compose restart";
|
||||
pc = "podman compose";
|
||||
pcd = "podman compose down";
|
||||
pcl = "podman compose logs";
|
||||
pclf = "podman compose logs -f";
|
||||
pcp = "podman compose pull";
|
||||
pcu = "podman compose up";
|
||||
pcud = "podman compose up -d";
|
||||
pcudp = "podman compose up -d --pull=always";
|
||||
pcr = "podman compose restart";
|
||||
|
||||
enw = "emacsclient -nw";
|
||||
e = "emacsclient -n -c";
|
||||
|
||||
cp = "cp -i";
|
||||
rsync = "rsync -Pa --progress";
|
||||
ln = "ln -i";
|
||||
lns = "ln -si";
|
||||
mv = "mv -i";
|
||||
rm = "rm -Iv";
|
||||
rmd = "rm --preserve-root -Irv";
|
||||
rmdf = "rm --preserve-root -Irfv";
|
||||
rmf = "rm --preserve-root -Ifv";
|
||||
chgrp = "chgrp --preserve-root -v";
|
||||
chmod = "chmod --preserve-root -v";
|
||||
chown = "chown --preserve-root -v";
|
||||
lsl = "eza -halg@ --group-directories-first --git";
|
||||
|
||||
flac = "yt-dlp -x --audio-format flac --audio-quality 0 o \"~/Music/%(uploader)s/%(title)s.%(ext)s\"";
|
||||
please = "sudo -A";
|
||||
wget = "wget --hsts-file=\"$XDG_DATA_HOME/wget-hsts\" -c";
|
||||
};
|
||||
cfg = config.home.shell;
|
||||
in {
|
||||
imports = [
|
||||
m.bash
|
||||
m.fish
|
||||
m.starship
|
||||
m.tmux
|
||||
m.zellij
|
||||
m.zsh
|
||||
m.zoxide
|
||||
];
|
||||
options.home.shell = {
|
||||
fullDesktop = mkEnableOption "Enable all shells";
|
||||
aliases = mkOption {
|
||||
type = types.attrsOf types.str;
|
||||
default = {};
|
||||
example = {la = "ls -a";};
|
||||
};
|
||||
autocompletion = mkOption {
|
||||
type = types.bool;
|
||||
default = true;
|
||||
};
|
||||
};
|
||||
config.home.shell = {
|
||||
enableShellIntegration = cfg.bash.enable or cfg.zsh.enable or cfg.fish.enable;
|
||||
bash = {
|
||||
aliases = defaultAliases // cfg.aliases;
|
||||
enable = mkDefault cfg.fullDesktop;
|
||||
};
|
||||
fish = {
|
||||
abbrs = defaultAliases // cfg.aliases;
|
||||
enable = mkDefault cfg.fullDesktop;
|
||||
};
|
||||
zsh = {
|
||||
abbrs = defaultAliases // cfg.aliases;
|
||||
enable = mkDefault cfg.fullDesktop;
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,79 @@
|
||||
{
|
||||
flake.modules.homeManager.starship = {
|
||||
config,
|
||||
lib,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.shell.starship;
|
||||
in {
|
||||
options.home.shell.starship = {
|
||||
enable = mkEnableOption "Enables the starship prompt.";
|
||||
jjIntegration = mkOption {
|
||||
description = "Enable Jujutsu integration in starship";
|
||||
default = config.programs.jujutsu.enable;
|
||||
type = types.bool;
|
||||
};
|
||||
};
|
||||
|
||||
config.programs.starship = mkIf cfg.enable {
|
||||
inherit (cfg) enable;
|
||||
enableTransience = true;
|
||||
settings = mkIf cfg.jjIntegration {
|
||||
# Disabling these so they can be enabled conditionally
|
||||
# See https://github.com/jj-vcs/jj/wiki/Starship
|
||||
git_status.disabled = true;
|
||||
git_commit.disabled = true;
|
||||
git_metrics.disabled = true;
|
||||
git_branch.disabled = true;
|
||||
custom = let
|
||||
when = "! jj --ignore-working-copy-root";
|
||||
description = "Only show if we’re not in a jj repository";
|
||||
style = "";
|
||||
in {
|
||||
git_status = {
|
||||
inherit when description style;
|
||||
command = "starship module git_status";
|
||||
};
|
||||
git_commit = {
|
||||
inherit when description style;
|
||||
command = "starship module git_commit";
|
||||
};
|
||||
git_metrics = {
|
||||
inherit when description style;
|
||||
command = "starship module git_metrics";
|
||||
};
|
||||
git_branch = {
|
||||
inherit when description style;
|
||||
command = "starship module git_branch";
|
||||
};
|
||||
jj = {
|
||||
description = "The current jj status";
|
||||
detect_folders = [".jj"];
|
||||
symbol = "🥋 ";
|
||||
command = ''
|
||||
jj log --revisions @ --no-graph --ignore-working-copy --color always --limit 1 --template '
|
||||
separate(" ",
|
||||
change_id.shortest(4),
|
||||
bookmarks,
|
||||
"|",
|
||||
concat(
|
||||
if(conflict, "💥"),
|
||||
if(divergent, "🚧"),
|
||||
if(hidden, "👻"),
|
||||
if(immutable, "🔒"),
|
||||
),
|
||||
raw_escape_sequence("\x1b[1;32m") ++ if(empty, "(empty)"),
|
||||
raw_escape_sequence("\x1b[1;32m") ++ coalesce(
|
||||
truncate_end(29, description.first_line(), "…"),
|
||||
"(no description set)",
|
||||
) ++ raw_escape_sequence("\x1b[0m"),
|
||||
)
|
||||
'
|
||||
'';
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
{
|
||||
flake.modules.homeManager.tmux = {
|
||||
pkgs,
|
||||
lib,
|
||||
config,
|
||||
...
|
||||
}:
|
||||
with lib; let
|
||||
cfg = config.home.shell.tmux;
|
||||
keyType = types.submodule {
|
||||
options = {
|
||||
key = mkOption {
|
||||
type = types.str;
|
||||
example = "C-b";
|
||||
};
|
||||
action = mkOption {
|
||||
type = types.str;
|
||||
example = "resize-pane -Z";
|
||||
};
|
||||
};
|
||||
};
|
||||
in {
|
||||
options.home.shell.tmux = with types; {
|
||||
enable = mkEnableOption "Enable tmux";
|
||||
bind = mkOption {
|
||||
type = attrsOf (listOf keyType);
|
||||
default = {};
|
||||
example = {
|
||||
"prefix" = [
|
||||
{
|
||||
key = "C-r";
|
||||
action = "resize-pane -R";
|
||||
}
|
||||
];
|
||||
};
|
||||
};
|
||||
unbind = mkOption {
|
||||
type = listOf (either str (attrsOf (listOf str)));
|
||||
default = [];
|
||||
};
|
||||
extraConfig = mkOption {
|
||||
type = types.lines;
|
||||
default = "";
|
||||
};
|
||||
};
|
||||
config.programs.tmux = mkIf cfg.enable {
|
||||
inherit (cfg) enable;
|
||||
baseIndex = 1;
|
||||
clock24 = true;
|
||||
customPaneNavigationAndResize = true;
|
||||
keyMode = "vi";
|
||||
mouse = true;
|
||||
newSession = true;
|
||||
prefix = "M-space";
|
||||
plugins = with pkgs.tmuxPlugins; [
|
||||
cpu
|
||||
nord
|
||||
prefix-highlight
|
||||
resurrect
|
||||
sensible
|
||||
yank
|
||||
];
|
||||
extraConfig = let
|
||||
generateBinds = concatLines (
|
||||
mapAttrsToList (table: keys: concatMapStrings (key: "bind -T ${table} ${key.key} ${key.action}\n") keys) cfg.bind
|
||||
);
|
||||
generateUnbind =
|
||||
concatMapStrings (
|
||||
entry:
|
||||
if builtins.isString entry
|
||||
then "unbind ${entry}\n"
|
||||
else concatStrings (mapAttrsToList (table: keys: concatMapStrings (key: "unbind -T ${table} ${key}\n") keys) entry)
|
||||
)
|
||||
cfg.unbind;
|
||||
in ''
|
||||
${cfg.extraConfig}
|
||||
|
||||
${generateUnbind}
|
||||
${generateBinds}
|
||||
'';
|
||||
};
|
||||
};
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user