neovim lspconfig

This commit is contained in:
Tristan 2023-12-23 15:43:26 +00:00
parent fb5c04a84a
commit 34aaaf63d2
29 changed files with 1705 additions and 1399 deletions

View file

@ -1,124 +1,167 @@
{ lib, stdenv, fetchurl, wrapGAppsHook, makeWrapper {
, dpkg lib,
, alsa-lib stdenv,
, at-spi2-atk fetchurl,
, at-spi2-core wrapGAppsHook,
, atk makeWrapper,
, cairo dpkg,
, cups alsa-lib,
, dbus at-spi2-atk,
, expat at-spi2-core,
, fontconfig atk,
, freetype cairo,
, gdk-pixbuf cups,
, glib dbus,
, gnome expat,
, gsettings-desktop-schemas fontconfig,
, gtk3 freetype,
, libuuid gdk-pixbuf,
, libdrm glib,
, libX11 gnome,
, libXcomposite gsettings-desktop-schemas,
, libXcursor gtk3,
, libXdamage libuuid,
, libXext libdrm,
, libXfixes libX11,
, libXi libXcomposite,
, libxkbcommon libXcursor,
, libXrandr libXdamage,
, libXrender libXext,
, libXScrnSaver libXfixes,
, libxshmfence libXi,
, libXtst libxkbcommon,
, mesa libXrandr,
, nspr libXrender,
, nss libXScrnSaver,
, pango libxshmfence,
, pipewire libXtst,
, udev mesa,
, wayland nspr,
, xorg nss,
, zlib pango,
, xdg-utils pipewire,
, snappy udev,
wayland,
xorg,
zlib,
xdg-utils,
snappy,
# command line arguments which are always set e.g "--disable-gpu"
commandLineArgs ? "",
# Necessary for USB audio devices.
pulseSupport ? stdenv.isLinux,
libpulseaudio,
# For GPU acceleration support on Wayland (without the lib it doesn't seem to work)
libGL,
# For video acceleration via VA-API (--enable-features=VaapiVideoDecoder,VaapiVideoEncoder)
libvaSupport ? stdenv.isLinux,
libva,
enableVideoAcceleration ? libvaSupport,
# For Vulkan support (--enable-features=Vulkan); disabled by default as it seems to break VA-API
vulkanSupport ? false,
addOpenGLRunpath,
enableVulkan ? vulkanSupport,
}: let
inherit
(lib)
optional
optionals
makeLibraryPath
makeSearchPathOutput
makeBinPath
optionalString
strings
escapeShellArg
;
# command line arguments which are always set e.g "--disable-gpu" deps =
, commandLineArgs ? "" [
alsa-lib
# Necessary for USB audio devices. at-spi2-atk
, pulseSupport ? stdenv.isLinux at-spi2-core
, libpulseaudio atk
cairo
# For GPU acceleration support on Wayland (without the lib it doesn't seem to work) cups
, libGL dbus
expat
# For video acceleration via VA-API (--enable-features=VaapiVideoDecoder,VaapiVideoEncoder) fontconfig
, libvaSupport ? stdenv.isLinux freetype
, libva gdk-pixbuf
, enableVideoAcceleration ? libvaSupport glib
gtk3
# For Vulkan support (--enable-features=Vulkan); disabled by default as it seems to break VA-API libdrm
, vulkanSupport ? false libX11
, addOpenGLRunpath libGL
, enableVulkan ? vulkanSupport libxkbcommon
}: libXScrnSaver
libXcomposite
let libXcursor
inherit (lib) optional optionals makeLibraryPath makeSearchPathOutput makeBinPath libXdamage
optionalString strings escapeShellArg; libXext
libXfixes
deps = [ libXi
alsa-lib at-spi2-atk at-spi2-core atk cairo cups dbus expat libXrandr
fontconfig freetype gdk-pixbuf glib gtk3 libdrm libX11 libGL libXrender
libxkbcommon libXScrnSaver libXcomposite libXcursor libXdamage libxshmfence
libXext libXfixes libXi libXrandr libXrender libxshmfence libXtst
libXtst libuuid mesa nspr nss pango pipewire udev wayland libuuid
xorg.libxcb zlib snappy mesa
] nspr
nss
pango
pipewire
udev
wayland
xorg.libxcb
zlib
snappy
]
++ optional pulseSupport libpulseaudio ++ optional pulseSupport libpulseaudio
++ optional libvaSupport libva; ++ optional libvaSupport libva;
rpath = makeLibraryPath deps + ":" + makeSearchPathOutput "lib" "lib64" deps; rpath = makeLibraryPath deps + ":" + makeSearchPathOutput "lib" "lib64" deps;
binpath = makeBinPath deps; binpath = makeBinPath deps;
enableFeatures = optionals enableVideoAcceleration [ "VaapiVideoDecoder" "VaapiVideoEncoder" ] enableFeatures =
optionals enableVideoAcceleration ["VaapiVideoDecoder" "VaapiVideoEncoder"]
++ optional enableVulkan "Vulkan"; ++ optional enableVulkan "Vulkan";
# The feature disable is needed for VAAPI to work correctly: https://github.com/brave/brave-browser/issues/20935 # The feature disable is needed for VAAPI to work correctly: https://github.com/brave/brave-browser/issues/20935
disableFeatures = optional enableVideoAcceleration "UseChromeOSDirectVideoDecoder"; disableFeatures = optional enableVideoAcceleration "UseChromeOSDirectVideoDecoder";
braveChannel = "nightly"; braveChannel = "nightly";
in in
stdenv.mkDerivation rec {
pname = "brave-${braveChannel}";
version = "1.52.54";
stdenv.mkDerivation rec { src = fetchurl {
pname = "brave-${braveChannel}"; url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser-${braveChannel}_${version}_amd64.deb";
version = "1.52.54"; sha256 = "sha256-k9Vxk9e9514II78pe0FPRNNXwSHKRqLigqefSOmNVjg=";
};
src = fetchurl { dontConfigure = true;
url = "https://github.com/brave/brave-browser/releases/download/v${version}/brave-browser-${braveChannel}_${version}_amd64.deb"; dontBuild = true;
sha256 = "sha256-k9Vxk9e9514II78pe0FPRNNXwSHKRqLigqefSOmNVjg="; dontPatchELF = true;
}; doInstallCheck = true;
dontConfigure = true; nativeBuildInputs = [
dontBuild = true; dpkg
dontPatchELF = true; (wrapGAppsHook.override {inherit makeWrapper;})
doInstallCheck = true; ];
nativeBuildInputs = [ buildInputs = [
dpkg # needed for GSETTINGS_SCHEMAS_PATH
(wrapGAppsHook.override { inherit makeWrapper; }) glib
]; gsettings-desktop-schemas
gtk3
buildInputs = [ # needed for XDG_ICON_DIRS
# needed for GSETTINGS_SCHEMAS_PATH gnome.adwaita-icon-theme
glib gsettings-desktop-schemas gtk3 ];
# needed for XDG_ICON_DIRS unpackPhase = "dpkg-deb --fsys-tarfile $src | tar -x --no-same-permissions --no-same-owner";
gnome.adwaita-icon-theme
];
unpackPhase = "dpkg-deb --fsys-tarfile $src | tar -x --no-same-permissions --no-same-owner"; installPhase = ''
installPhase = ''
runHook preInstall runHook preInstall
mkdir -p $out $out/bin mkdir -p $out $out/bin
@ -164,47 +207,47 @@ stdenv.mkDerivation rec {
ln -sf ${xdg-utils}/bin/xdg-mime $out/opt/brave.com/brave-${braveChannel}/xdg-mime ln -sf ${xdg-utils}/bin/xdg-mime $out/opt/brave.com/brave-${braveChannel}/xdg-mime
runHook postInstall runHook postInstall
'';
preFixup = ''
# Add command line args to wrapGApp.
gappsWrapperArgs+=(
--prefix LD_LIBRARY_PATH : ${rpath}
--prefix PATH : ${binpath}
--suffix PATH : ${lib.makeBinPath [ xdg-utils ]}
${optionalString (enableFeatures != []) ''
--add-flags "--enable-features=${strings.concatStringsSep "," enableFeatures}"
''}
${optionalString (disableFeatures != []) ''
--add-flags "--disable-features=${strings.concatStringsSep "," disableFeatures}"
''}
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}"
${optionalString vulkanSupport ''
--prefix XDG_DATA_DIRS : "${addOpenGLRunpath.driverLink}/share"
''}
--add-flags ${escapeShellArg commandLineArgs}
)
'';
installCheckPhase = ''
# Bypass upstream wrapper which suppresses errors
$out/opt/brave.com/brave-${braveChannel}/brave-browser-${braveChannel} --version
'';
passthru.updateScript = ./update.sh;
meta = with lib; {
homepage = "https://brave.com/";
description = "Privacy-oriented browser for Desktop and Laptop computers";
changelog = "https://github.com/brave/brave-browser/blob/master/CHANGELOG_DESKTOP.md#" + replaceStrings [ "." ] [ "" ] version;
longDescription = ''
Brave browser blocks the ads and trackers that slow you down,
chew up your bandwidth, and invade your privacy. Brave lets you
contribute to your favorite creators automatically.
''; '';
sourceProvenance = with sourceTypes; [ binaryNativeCode ];
license = licenses.mpl20; preFixup = ''
maintainers = with maintainers; [ uskudnik rht jefflabonte nasirhm ]; # Add command line args to wrapGApp.
platforms = [ "x86_64-linux" ]; gappsWrapperArgs+=(
}; --prefix LD_LIBRARY_PATH : ${rpath}
} --prefix PATH : ${binpath}
--suffix PATH : ${lib.makeBinPath [xdg-utils]}
${optionalString (enableFeatures != []) ''
--add-flags "--enable-features=${strings.concatStringsSep "," enableFeatures}"
''}
${optionalString (disableFeatures != []) ''
--add-flags "--disable-features=${strings.concatStringsSep "," disableFeatures}"
''}
--add-flags "\''${NIXOS_OZONE_WL:+\''${WAYLAND_DISPLAY:+--ozone-platform-hint=auto --enable-features=WaylandWindowDecorations}}"
${optionalString vulkanSupport ''
--prefix XDG_DATA_DIRS : "${addOpenGLRunpath.driverLink}/share"
''}
--add-flags ${escapeShellArg commandLineArgs}
)
'';
installCheckPhase = ''
# Bypass upstream wrapper which suppresses errors
$out/opt/brave.com/brave-${braveChannel}/brave-browser-${braveChannel} --version
'';
passthru.updateScript = ./update.sh;
meta = with lib; {
homepage = "https://brave.com/";
description = "Privacy-oriented browser for Desktop and Laptop computers";
changelog = "https://github.com/brave/brave-browser/blob/master/CHANGELOG_DESKTOP.md#" + replaceStrings ["."] [""] version;
longDescription = ''
Brave browser blocks the ads and trackers that slow you down,
chew up your bandwidth, and invade your privacy. Brave lets you
contribute to your favorite creators automatically.
'';
sourceProvenance = with sourceTypes; [binaryNativeCode];
license = licenses.mpl20;
maintainers = with maintainers; [uskudnik rht jefflabonte nasirhm];
platforms = ["x86_64-linux"];
};
}

View file

@ -1,10 +1,10 @@
{ lib {
, stdenv lib,
, buildGoModule stdenv,
, fetchFromGitHub buildGoModule,
, installShellFiles fetchFromGitHub,
installShellFiles,
}: }:
buildGoModule rec { buildGoModule rec {
pname = "lf"; pname = "lf";
version = "28-1"; version = "28-1";
@ -18,13 +18,13 @@ buildGoModule rec {
vendorHash = "sha256-oIIyQbw42+B6T6Qn6nIV62Xr+8ms3tatfFI8ocYNr0A="; vendorHash = "sha256-oIIyQbw42+B6T6Qn6nIV62Xr+8ms3tatfFI8ocYNr0A=";
nativeBuildInputs = [ installShellFiles ]; nativeBuildInputs = [installShellFiles];
ldflags = [ "-s" "-w" "-X main.gVersion=r${version}" ]; ldflags = ["-s" "-w" "-X main.gVersion=r${version}"];
# Force the use of the pure-go implementation of the os/user library. # Force the use of the pure-go implementation of the os/user library.
# Relevant issue: https://github.com/gokcehan/lf/issues/191 # Relevant issue: https://github.com/gokcehan/lf/issues/191
tags = lib.optionals (!stdenv.isDarwin) [ "osusergo" ]; tags = lib.optionals (!stdenv.isDarwin) ["osusergo"];
postInstall = '' postInstall = ''
install -D --mode=444 lf.desktop $out/share/applications/lf.desktop install -D --mode=444 lf.desktop $out/share/applications/lf.desktop
@ -44,6 +44,6 @@ buildGoModule rec {
changelog = "https://github.com/gokcehan/lf/releases/tag/r${version}"; changelog = "https://github.com/gokcehan/lf/releases/tag/r${version}";
license = licenses.mit; license = licenses.mit;
platforms = platforms.unix; platforms = platforms.unix;
maintainers = with maintainers; [ dotlambda ]; maintainers = with maintainers; [dotlambda];
}; };
} }

View file

@ -13,24 +13,28 @@
stylix.url = "github:danth/stylix"; stylix.url = "github:danth/stylix";
}; };
outputs = { nixpkgs, home-manager, hyprland, stylix, ... } @inputs : outputs = {
let nixpkgs,
system = "x86_64-linux"; home-manager,
lib = nixpkgs.lib; hyprland,
mkConf = import ./lib/mkconf.nix; stylix,
...
} @ inputs: let
system = "x86_64-linux";
lib = nixpkgs.lib;
mkConf = import ./lib/mkconf.nix;
user = "tristan"; user = "tristan";
userName = "Tristan Beedell"; userName = "Tristan Beedell";
in in {
{ nixosConfigurations = {
nixosConfigurations = { zenix = mkConf "zenix" {
zenix = mkConf "zenix" { inherit inputs nixpkgs system user userName home-manager;
inherit inputs nixpkgs system user userName home-manager; };
}; FCS-Tristan-Nixbook = mkConf "work" {
FCS-Tristan-Nixbook = mkConf "work" { inherit inputs nixpkgs system user userName home-manager;
inherit inputs nixpkgs system user userName home-manager; work = true;
work = true;
};
}; };
}; };
};
} }

View file

@ -1,4 +1,10 @@
{ config, pkgs, name, lib, ... }: {
config,
pkgs,
name,
lib,
...
}:
# https://nix-community.github.io/home-manager/options.html # https://nix-community.github.io/home-manager/options.html
let let
my-deps = { my-deps = {
@ -21,9 +27,8 @@ let
glow = "${pkgs.glow}/bin/glow"; glow = "${pkgs.glow}/bin/glow";
ffmpegthumbnailer = "${pkgs.ffmpegthumbnailer}/bin/ffmpegthumbnailer"; ffmpegthumbnailer = "${pkgs.ffmpegthumbnailer}/bin/ffmpegthumbnailer";
}; };
lf-sixel = pkgs.callPackage ../custom/lf-sixel/. { }; lf-sixel = pkgs.callPackage ../custom/lf-sixel/. {};
in in {
{
programs.home-manager.enable = true; programs.home-manager.enable = true;
home.username = "tristan"; home.username = "tristan";
@ -31,7 +36,7 @@ in
xdg.userDirs.enable = true; xdg.userDirs.enable = true;
home.packages = (with pkgs; [ home.packages = with pkgs; [
libnotify libnotify
dig dig
jq jq
@ -66,7 +71,7 @@ in
desktopName = "Logseq"; desktopName = "Logseq";
exec = "${logseq}/bin/logseq --ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --disable-gpu"; exec = "${logseq}/bin/logseq --ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --disable-gpu";
}) })
]); ];
programs.fish = { programs.fish = {
enable = true; enable = true;
@ -149,108 +154,108 @@ in
drag = "%${pkgs.ripdrag}/bin/ripdrag -x \"$fx\""; drag = "%${pkgs.ripdrag}/bin/ripdrag -x \"$fx\"";
trash = "%${pkgs.trash-cli}/bin/trash-put \"$fx\""; trash = "%${pkgs.trash-cli}/bin/trash-put \"$fx\"";
open = "$set -f; ${pkgs.ranger}/bin/rifle -p 0 \"$fx\""; open = "$set -f; ${pkgs.ranger}/bin/rifle -p 0 \"$fx\"";
open-with = ''''${{ open-with = '' ''${{
set -f set -f
${pkgs.ranger}/bin/rifle -l "$fx" ${pkgs.ranger}/bin/rifle -l "$fx"
read -p "Open with: " method read -p "Open with: " method
${pkgs.ranger}/bin/rifle -p "$method" "$fx" ${pkgs.ranger}/bin/rifle -p "$method" "$fx"
}}''; }}'';
bulk-rename = ''''${{ bulk-rename = '' ''${{
old="$(mktemp)" old="$(mktemp)"
new="$(mktemp)" new="$(mktemp)"
if [ -n "$fs" ]; then if [ -n "$fs" ]; then
fs="$(basename -a $fs)" fs="$(basename -a $fs)"
else else
fs="$(ls)" fs="$(ls)"
fi fi
printf '%s\n' "$fs" >"$old" printf '%s\n' "$fs" >"$old"
printf '%s\n' "$fs" >"$new" printf '%s\n' "$fs" >"$new"
$EDITOR "$new" $EDITOR "$new"
[ "$(wc -l < "$new")" -ne "$(wc -l < "$old")" ] && exit [ "$(wc -l < "$new")" -ne "$(wc -l < "$old")" ] && exit
paste "$old" "$new" | while IFS= read -r names; do paste "$old" "$new" | while IFS= read -r names; do
src="$(printf '%s' "$names" | cut -f1)" src="$(printf '%s' "$names" | cut -f1)"
dst="$(printf '%s' "$names" | cut -f2)" dst="$(printf '%s' "$names" | cut -f2)"
if [ "$src" = "$dst" ] || [ -e "$dst" ]; then if [ "$src" = "$dst" ] || [ -e "$dst" ]; then
continue continue
fi fi
mv -- "$src" "$dst" mv -- "$src" "$dst"
done done
rm -- "$old" "$new" rm -- "$old" "$new"
lf -remote "send $id unselect" lf -remote "send $id unselect"
}}''; }}'';
}; };
programs.lf.previewer.source = pkgs.writeShellScript "preview" '' programs.lf.previewer.source = pkgs.writeShellScript "preview" ''
image () { image () {
echo "$1" echo "$1"
${my-deps.chafa} "$1" -f sixel -s "$(($2/2))x$3" | sed 's/#/\n#/g' ${my-deps.chafa} "$1" -f sixel -s "$(($2/2))x$3" | sed 's/#/\n#/g'
${ my-deps.exiftool } "$1" ${my-deps.exiftool} "$1"
} }
batted () { batted () {
cat "$@" cat "$@"
} }
mkdir -p "$HOME/.cache/lf" mkdir -p "$HOME/.cache/lf"
CACHE="$HOME/.cache/lf/thumbnail.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | awk '{print $1}'))" CACHE="$HOME/.cache/lf/thumbnail.$(stat --printf '%n\0%i\0%F\0%s\0%W\0%Y' -- "$(readlink -f "$1")" | sha256sum | awk '{print $1}'))"
case "$(printf "%s\n" "$(readlink -f "$1")" | awk '{print tolower($0)}')" in case "$(printf "%s\n" "$(readlink -f "$1")" | awk '{print tolower($0)}')" in
*.tgz|*.tar.gz) tar tzf "$1" ;; *.tgz|*.tar.gz) tar tzf "$1" ;;
*.tar.bz2|*.tbz2) tar tjf "$1" ;; *.tar.bz2|*.tbz2) tar tjf "$1" ;;
*.tar.txz|*.txz) xz --list "$1" ;; *.tar.txz|*.txz) xz --list "$1" ;;
*.tar) tar tf "$1" ;; *.tar) tar tf "$1" ;;
*.zip|*.jar|*.war|*.ear|*.oxt) unzip -l "$1" ;; *.zip|*.jar|*.war|*.ear|*.oxt) unzip -l "$1" ;;
*.rar) unrar l "$1" ;; *.rar) unrar l "$1" ;;
*.md) ${my-deps.glow} -s dark "$1" ;; *.md) ${my-deps.glow} -s dark "$1" ;;
*.7z) 7z l "$1" ;; *.7z) 7z l "$1" ;;
*.[1-8]) man "$1" | col -b ;; *.[1-8]) man "$1" | col -b ;;
*.o) nm "$1";; *.o) nm "$1";;
*.torrent) transmission-show "$1" ;; *.torrent) transmission-show "$1" ;;
*.iso) iso-info --no-header -l "$1" ;; *.iso) iso-info --no-header -l "$1" ;;
*.odt|*.ods|*.odp|*.sxw) odt2txt "$1" ;; *.odt|*.ods|*.odp|*.sxw) odt2txt "$1" ;;
*.doc) catdoc "$1" ;; *.doc) catdoc "$1" ;;
*.docx) docx2txt "$1" - ;; *.docx) docx2txt "$1" - ;;
*.xml|*.html) w3m -dump "$1";; *.xml|*.html) w3m -dump "$1";;
*.xls|*.xlsx) *.xls|*.xlsx)
ssconvert --export-type=Gnumeric_stf:stf_csv "$1" "fd://1" | batted --language=csv ssconvert --export-type=Gnumeric_stf:stf_csv "$1" "fd://1" | batted --language=csv
;; ;;
*.wav|*.mp3|*.flac|*.m4a|*.wma|*.ape|*.ac3|*.og[agx]|*.spx|*.opus|*.as[fx]|*.mka) *.wav|*.mp3|*.flac|*.m4a|*.wma|*.ape|*.ac3|*.og[agx]|*.spx|*.opus|*.as[fx]|*.mka)
${ my-deps.exiftool } "$1" ${my-deps.exiftool} "$1"
;; ;;
*.pdf) *.pdf)
[ ! -f "$CACHE.jpg" ] && \ [ ! -f "$CACHE.jpg" ] && \
pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE" pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE"
image "$CACHE.jpg" "$2" "$3" "$4" "$5" image "$CACHE.jpg" "$2" "$3" "$4" "$5"
;; ;;
*.epub) *.epub)
[ ! -f "$CACHE" ] && \ [ ! -f "$CACHE" ] && \
epub-thumbnailer "$1" "$CACHE" 1024 epub-thumbnailer "$1" "$CACHE" 1024
image "$CACHE" "$2" "$3" "$4" "$5" image "$CACHE" "$2" "$3" "$4" "$5"
;; ;;
*.cbz|*.cbr|*.cbt) *.cbz|*.cbr|*.cbt)
[ ! -f "$CACHE" ] && \ [ ! -f "$CACHE" ] && \
comicthumb "$1" "$CACHE" 1024 comicthumb "$1" "$CACHE" 1024
image "$CACHE" "$2" "$3" "$4" "$5" image "$CACHE" "$2" "$3" "$4" "$5"
;; ;;
*.avi|*.mp4|*.wmv|*.dat|*.3gp|*.ogv|*.mkv|*.mpg|*.mpeg|*.vob|*.fl[icv]|*.m2v|*.mov|*.webm|*.ts|*.mts|*.m4v|*.r[am]|*.qt|*.divx) *.avi|*.mp4|*.wmv|*.dat|*.3gp|*.ogv|*.mkv|*.mpg|*.mpeg|*.vob|*.fl[icv]|*.m2v|*.mov|*.webm|*.ts|*.mts|*.m4v|*.r[am]|*.qt|*.divx)
[ ! -f "$CACHE.jpg" ] && \ [ ! -f "$CACHE.jpg" ] && \
${my-deps.ffmpegthumbnailer} -i "$1" -o "$CACHE.jpg" -s 0 -q 5 ${my-deps.ffmpegthumbnailer} -i "$1" -o "$CACHE.jpg" -s 0 -q 5
image "$CACHE.jpg" "$2" "$3" "$4" "$5" image "$CACHE.jpg" "$2" "$3" "$4" "$5"
;; ;;
*.bmp|*.jpg|*.jpeg|*.png|*.xpm|*.webp|*.jfif) *.bmp|*.jpg|*.jpeg|*.png|*.xpm|*.webp|*.jfif)
image "$1" "$2" "$3" "$4" "$5" image "$1" "$2" "$3" "$4" "$5"
;; ;;
*.svg) *.svg)
[ ! -f "$CACHE.jpg" ] && \ [ ! -f "$CACHE.jpg" ] && \
convert "$1" "$CACHE.jpg" convert "$1" "$CACHE.jpg"
image "$CACHE.jpg" "$2" "$3" "$4" "$5" image "$CACHE.jpg" "$2" "$3" "$4" "$5"
;; ;;
*.ino) *.ino)
batted --language=cpp "$1" batted --language=cpp "$1"
;; ;;
*) *)
batted "$1" batted "$1"
;; ;;
esac esac
''; '';
home.file.".icons/default".source = "${pkgs.vanilla-dmz}/share/icons/Vanilla-DMZ"; home.file.".icons/default".source = "${pkgs.vanilla-dmz}/share/icons/Vanilla-DMZ";
@ -334,6 +339,4 @@ in
pdf-engine = "xelatex"; pdf-engine = "xelatex";
}; };
}; };
} }

View file

@ -1,22 +1,23 @@
# https://search.nixos.org/options # https://search.nixos.org/options
user: {
user: { config, pkgs, lib, ... }: config,
{ pkgs,
lib,
...
}: {
home-manager.users.${user}.imports = [ home-manager.users.${user}.imports = [
./home.nix ./home.nix
]; ];
nix.settings = { nix.settings = {
experimental-features = [ "nix-command" "flakes" ]; experimental-features = ["nix-command" "flakes"];
}; };
nixpkgs.config.permittedInsecurePackages = [ nixpkgs.config.permittedInsecurePackages = [
"electron-25.9.0" "electron-25.9.0"
]; ];
nix.settings.trusted-users = ["root" user];
nix.settings.trusted-users = [ "root" user ];
boot.loader.systemd-boot.enable = true; boot.loader.systemd-boot.enable = true;
boot.loader.efi.canTouchEfiVariables = true; boot.loader.efi.canTouchEfiVariables = true;
@ -43,27 +44,42 @@ user: { config, pkgs, lib, ... }:
jack.enable = true; jack.enable = true;
}; };
# pipewire raop # pipewire raop
networking.firewall.allowedUDPPorts = [ 6002 6001 ]; networking.firewall.allowedUDPPorts = [6002 6001];
# network streaming # network streaming
networking.firewall.allowedTCPPorts = [ 4713 ]; networking.firewall.allowedTCPPorts = [4713];
# kde connect # kde connect
networking.firewall.allowedTCPPortRanges = [{ from = 1714; to = 1764; }]; networking.firewall.allowedTCPPortRanges = [
networking.firewall.allowedUDPPortRanges = [{ from = 1714; to = 1764; }]; {
from = 1714;
to = 1764;
}
];
networking.firewall.allowedUDPPortRanges = [
{
from = 1714;
to = 1764;
}
];
networking.firewall.interfaces.tailscale0 = { networking.firewall.interfaces.tailscale0 = {
allowedTCPPortRanges = [{ from = 0; to = 65535; }]; allowedTCPPortRanges = [
{
from = 0;
to = 65535;
}
];
}; };
services.avahi.enable = true; services.avahi.enable = true;
security.pam.services.swaylock = { }; security.pam.services.swaylock = {};
security.polkit.enable = true; security.polkit.enable = true;
systemd.user.services.polkit-gnome-authentication-agent-1 = { systemd.user.services.polkit-gnome-authentication-agent-1 = {
description = "polkit-gnome-authentication-agent-1"; description = "polkit-gnome-authentication-agent-1";
wantedBy = [ "graphical-session.target" ]; wantedBy = ["graphical-session.target"];
wants = [ "graphical-session.target" ]; wants = ["graphical-session.target"];
after = [ "graphical-session.target" ]; after = ["graphical-session.target"];
serviceConfig = { serviceConfig = {
Type = "simple"; Type = "simple";
ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1"; ExecStart = "${pkgs.polkit_gnome}/libexec/polkit-gnome-authentication-agent-1";
@ -97,7 +113,7 @@ user: { config, pkgs, lib, ... }:
users.users.${user} = { users.users.${user} = {
isNormalUser = true; isNormalUser = true;
extraGroups = [ "wheel" "video" "networkmanager" ]; extraGroups = ["wheel" "video" "networkmanager"];
initialPassword = "pass"; initialPassword = "pass";
shell = pkgs.fish; shell = pkgs.fish;
}; };
@ -119,30 +135,6 @@ user: { config, pkgs, lib, ... }:
trash-cli trash-cli
wget wget
unzip unzip
(neovim.override {
vimAlias = true;
configure = {
packages.myPlugins = with pkgs.vimPlugins; {
start = [ vim-surround vim-commentary vim-nix ];
opt = [ ];
};
customRC = ''
vnoremap * y/\V<C-R>=escape(@",'/\')<CR><CR>
vnoremap <C-R> "ry:%s/<C-R>=escape(@r,'/\')<CR>
vnoremap A :norm A
set number
set rnu
set ignorecase
set smartcase
set mouse=a
set path=.,**
let g:netrw_banner=0
let g:netrw_liststyle=3
set undofile
set undodir=~/.local/share/nvim/undo
'';
};
})
]; ];
services.dbus.enable = true; services.dbus.enable = true;
@ -184,6 +176,4 @@ user: { config, pkgs, lib, ... }:
services.blueman.enable = true; services.blueman.enable = true;
services.prometheus.exporters.node.enable = true; services.prometheus.exporters.node.enable = true;
} }

View file

@ -1,20 +1,26 @@
{ config, ... }: {config, ...}: {
{
displays = { displays = {
enable = true; enable = true;
displays = [ displays = [
{ {
name = "DP-1"; name = "DP-1";
description = "HP Inc. HP 24x 1CR9500W9Q"; description = "HP Inc. HP 24x 1CR9500W9Q";
resolution = { x = 1920; y = 1080; freq = 144; }; resolution = {
x = 1920;
y = 1080;
freq = 144;
};
position.x = 0; position.x = 0;
position.y = 0; position.y = 0;
wallpaper = "/home/tristan/Pictures/backgrounds/demonslayer.jpg"; wallpaper = "/home/tristan/Pictures/backgrounds/demonslayer.jpg";
} }
{ {
name = "HDMI-A-1"; name = "HDMI-A-1";
resolution = { x = 1920; y = 1080; freq = 60; }; resolution = {
x = 1920;
y = 1080;
freq = 60;
};
position = { position = {
x = 1920; x = 1920;
y = 0; y = 0;

View file

@ -1,23 +1,25 @@
{user}: { config, lib, pkgs, modulesPath, ... }: {user}: {
config,
lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/installer/scan/not-detected.nix")
./displays.nix
];
{ boot.initrd.availableKernelModules = ["xhci_pci" "thunderbolt" "nvme" "usb_storage" "sd_mod" "sdhci_pci"];
imports = boot.initrd.kernelModules = ["uas" "usbcore" "usb_storage" "vfat" "nls_cp437" "nls_iso8859_1"];
[ boot.kernelModules = ["kvm-intel"];
(modulesPath + "/installer/scan/not-detected.nix") boot.extraModulePackages = [];
./displays.nix
];
boot.initrd.availableKernelModules = [ "xhci_pci" "thunderbolt" "nvme" "usb_storage" "sd_mod" "sdhci_pci" ]; fileSystems."/" = {
boot.initrd.kernelModules = [ "uas" "usbcore" "usb_storage" "vfat" "nls_cp437" "nls_iso8859_1" ]; device = "/dev/disk/by-uuid/48a07e82-1090-448c-a751-3a410afba0f7";
boot.kernelModules = [ "kvm-intel" ]; fsType = "btrfs";
boot.extraModulePackages = [ ]; options = ["subvol=@" "compress=zstd" "autodefrag"];
};
fileSystems."/" =
{
device = "/dev/disk/by-uuid/48a07e82-1090-448c-a751-3a410afba0f7";
fsType = "btrfs";
options = [ "subvol=@" "compress=zstd" "autodefrag" ];
};
boot.initrd.postDeviceCommands = pkgs.lib.mkBefore '' boot.initrd.postDeviceCommands = pkgs.lib.mkBefore ''
mkdir -m 0755 -p /key mkdir -m 0755 -p /key
@ -40,27 +42,24 @@
preLVM = false; preLVM = false;
}; };
fileSystems."/home" = fileSystems."/home" = {
{ device = "/dev/disk/by-uuid/48a07e82-1090-448c-a751-3a410afba0f7";
device = "/dev/disk/by-uuid/48a07e82-1090-448c-a751-3a410afba0f7"; fsType = "btrfs";
fsType = "btrfs"; options = ["subvol=@home" "compress=zstd" "autodefrag"];
options = [ "subvol=@home" "compress=zstd" "autodefrag" ]; };
};
fileSystems."/swap" = fileSystems."/swap" = {
{ device = "/dev/disk/by-uuid/48a07e82-1090-448c-a751-3a410afba0f7";
device = "/dev/disk/by-uuid/48a07e82-1090-448c-a751-3a410afba0f7"; fsType = "btrfs";
fsType = "btrfs"; options = ["subvol=@swap"];
options = [ "subvol=@swap" ]; };
};
fileSystems."/boot" = fileSystems."/boot" = {
{ device = "/dev/disk/by-uuid/EED9-A165";
device = "/dev/disk/by-uuid/EED9-A165"; fsType = "vfat";
fsType = "vfat"; };
};
swapDevices = [{ device = "/swap/swapfile"; }]; swapDevices = [{device = "/swap/swapfile";}];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's
@ -89,12 +88,13 @@
networking.hostName = "FCS-Tristan-Nixbook"; networking.hostName = "FCS-Tristan-Nixbook";
system.stateVersion = "22.11"; # do not change system.stateVersion = "22.11"; # do not change
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
home.stateVersion = "22.05"; {
home.stateVersion = "22.05";
programs.waybar.settings.mainBar."hyprland/workspaces".persistent_workspaces = {
eDP-1 = 5;
};
}];
programs.waybar.settings.mainBar."hyprland/workspaces".persistent_workspaces = {
eDP-1 = 5;
};
}
];
} }

View file

@ -1,23 +1,25 @@
{user}: { config, lib, pkgs, modulesPath, ... }: {user}: {
config,
lib,
pkgs,
modulesPath,
...
}: {
imports = [
(modulesPath + "/installer/scan/not-detected.nix")
./displays.nix
];
{ boot.initrd.availableKernelModules = ["nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod"];
imports = boot.initrd.kernelModules = ["uas" "usbcore" "usb_storage" "vfat" "nls_cp437" "nls_iso8859_1"];
[ boot.kernelModules = ["kvm-amd"];
(modulesPath + "/installer/scan/not-detected.nix") boot.extraModulePackages = [];
./displays.nix
];
boot.initrd.availableKernelModules = [ "nvme" "xhci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" ]; fileSystems."/" = {
boot.initrd.kernelModules = [ "uas" "usbcore" "usb_storage" "vfat" "nls_cp437" "nls_iso8859_1" ]; device = "/dev/disk/by-uuid/2dad5ed6-44cc-4d9d-9392-32afaa7b3909";
boot.kernelModules = [ "kvm-amd" ]; fsType = "btrfs";
boot.extraModulePackages = [ ]; options = ["subvol=@" "compress=zstd" "autodefrag"];
};
fileSystems."/" =
{
device = "/dev/disk/by-uuid/2dad5ed6-44cc-4d9d-9392-32afaa7b3909";
fsType = "btrfs";
options = [ "subvol=@" "compress=zstd" "autodefrag" ];
};
boot.initrd.postDeviceCommands = pkgs.lib.mkBefore '' boot.initrd.postDeviceCommands = pkgs.lib.mkBefore ''
mkdir -m 0755 -p /key mkdir -m 0755 -p /key
@ -43,21 +45,18 @@
preLVM = false; preLVM = false;
}; };
fileSystems."/home" = fileSystems."/home" = {
{ device = "/dev/disk/by-uuid/2dad5ed6-44cc-4d9d-9392-32afaa7b3909";
device = "/dev/disk/by-uuid/2dad5ed6-44cc-4d9d-9392-32afaa7b3909"; fsType = "btrfs";
fsType = "btrfs"; options = ["subvol=@home" "compress=zstd" "autodefrag"];
options = [ "subvol=@home" "compress=zstd" "autodefrag" ]; };
};
fileSystems."/boot" = fileSystems."/boot" = {
{ device = "/dev/disk/by-uuid/FE7E-0DE3";
device = "/dev/disk/by-uuid/FE7E-0DE3"; fsType = "vfat";
fsType = "vfat"; };
};
swapDevices = swapDevices = [{device = "/dev/disk/by-uuid/da57b489-ab77-4830-b710-9f96cf43d053";}];
[{ device = "/dev/disk/by-uuid/da57b489-ab77-4830-b710-9f96cf43d053"; }];
# Enables DHCP on each ethernet and wireless interface. In case of scripted networking # Enables DHCP on each ethernet and wireless interface. In case of scripted networking
# (the default) this is the recommended approach. When using systemd-networkd it's # (the default) this is the recommended approach. When using systemd-networkd it's
@ -85,23 +84,23 @@
}; };
}; };
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
home.stateVersion = "22.05"; {
home.stateVersion = "22.05";
wayland.windowManager.hyprland = {
extraConfig = ''
workspace = DP-1, 1
workspace = 1, monitor:DP-1
workspace = 2, monitor:DP-1
workspace = 3, monitor:DP-1
workspace = 4, monitor:DP-1
workspace = 5, monitor:DP-1
'';
};
programs.waybar.settings.mainBar."hyprland/workspaces".persistent_workspaces = {
DP-1 = 5;
};
}];
wayland.windowManager.hyprland = {
extraConfig = ''
workspace = DP-1, 1
workspace = 1, monitor:DP-1
workspace = 2, monitor:DP-1
workspace = 3, monitor:DP-1
workspace = 4, monitor:DP-1
workspace = 5, monitor:DP-1
'';
};
programs.waybar.settings.mainBar."hyprland/workspaces".persistent_workspaces = {
DP-1 = 5;
};
}
];
} }

View file

@ -1,29 +1,32 @@
{ user
, name
, work ? false
, displays ? [ ]
, userName
, ...
}:
{ config, pkgs, ... }:
{ {
user,
name,
work ? false,
displays ? [],
userName,
...
}: {
config,
pkgs,
...
}: {
imports = [ imports = [
(import ./modules/terminal.nix { inherit user; }) (import ./modules/terminal.nix {inherit user;})
(import ./modules/scripts.nix { inherit user; }) (import ./modules/scripts.nix {inherit user;})
(import ./modules/editor.nix { inherit user; }) (import ./modules/editor.nix {inherit user;})
(import ./modules/keyboard.nix { inherit user; }) (import ./modules/keyboard.nix {inherit user;})
(import ./modules/display.nix { inherit user; }) (import ./modules/display.nix {inherit user;})
(import ./modules/work.nix { inherit user; }) (import ./modules/work.nix {inherit user;})
(import ./modules/menu.nix { inherit user; }) (import ./modules/menu.nix {inherit user;})
(import ./modules/email.nix { inherit user userName; }) (import ./modules/email.nix {inherit user userName;})
(import ./modules/mpd.nix { inherit user; }) (import ./modules/mpd.nix {inherit user;})
(import ./modules/git.nix { inherit user userName; }) (import ./modules/git.nix {inherit user userName;})
(import ./modules/laptop.nix { inherit user; }) (import ./modules/laptop.nix {inherit user;})
(import ./modules/dev.nix { inherit user; }) (import ./modules/dev.nix {inherit user;})
(import ./modules/personal.nix { inherit user; }) (import ./modules/personal.nix {inherit user;})
(import ./modules/gamer.nix { inherit user; }) (import ./modules/gamer.nix {inherit user;})
(import ./modules/wayland.nix { inherit user; }) (import ./modules/wayland.nix {inherit user;})
(import ../hardware/${name}.nix { inherit user; }) (import ../hardware/${name}.nix {inherit user;})
./scripts.nix ./scripts.nix
(import ../global/system.nix user) (import ../global/system.nix user)
]; ];
@ -35,5 +38,4 @@
roles.personal.enable = !work; roles.personal.enable = !work;
roles.mpd.enable = true; roles.mpd.enable = true;
programs.editor.neovim = true; programs.editor.neovim = true;
} }

View file

@ -1,5 +1,10 @@
name: { pkgs, app-id, browser, desktopName, ... }: name: {
pkgs,
app-id,
browser,
desktopName,
...
}:
pkgs.makeDesktopItem { pkgs.makeDesktopItem {
name = "${name}"; name = "${name}";
desktopName = "${desktopName}"; desktopName = "${desktopName}";

View file

@ -1,23 +1,25 @@
name: name: {
{ nixpkgs nixpkgs,
, inputs inputs,
, home-manager home-manager,
, system system,
, user user,
, laptop ? false laptop ? false,
, work ? false work ? false,
, userName userName,
, ... ...
}: }:
nixpkgs.lib.nixosSystem rec { nixpkgs.lib.nixosSystem rec {
specialArgs = { inherit inputs; }; specialArgs = {inherit inputs;};
inherit system; inherit system;
modules = [ modules = [
({
({ inputs, pkgs, ... }: { inputs,
pkgs,
...
}: {
programs.hyprland = { programs.hyprland = {
enable = true; enable = true;
package = inputs.hyprland.packages.${pkgs.system}.hyprland; package = inputs.hyprland.packages.${pkgs.system}.hyprland;
@ -25,12 +27,12 @@ nixpkgs.lib.nixosSystem rec {
}) })
{ {
nix.settings = { nix.settings = {
substituters = [ "https://hyprland.cachix.org" ]; substituters = ["https://hyprland.cachix.org"];
trusted-public-keys = [ "hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc=" ]; trusted-public-keys = ["hyprland.cachix.org-1:a7pgxzMz7+chwVL3/pzj6jIBMioiJM7ypFP8PwtkuGc="];
}; };
} }
inputs.stylix.nixosModules.stylix inputs.stylix.nixosModules.stylix
({ pkgs, ... }: { ({pkgs, ...}: {
stylix.image = ../images/demonslayer.png; stylix.image = ../images/demonslayer.png;
stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-dark-hard.yaml"; stylix.base16Scheme = "${pkgs.base16-schemes}/share/themes/gruvbox-dark-hard.yaml";
}) })
@ -39,6 +41,6 @@ nixpkgs.lib.nixosSystem rec {
home-manager.useGlobalPkgs = true; home-manager.useGlobalPkgs = true;
home-manager.useUserPackages = true; home-manager.useUserPackages = true;
} }
(import ./home.nix { inherit inputs user userName name laptop work; }) (import ./home.nix {inherit inputs user userName name laptop work;})
]; ];
} }

View file

@ -1,9 +1,12 @@
{ user, ... }: { lib, pkgs, config, ... }: {user, ...}: {
with lib; lib,
let pkgs,
config,
...
}:
with lib; let
cfg = config.roles.dev; cfg = config.roles.dev;
in in {
{
options.roles = { options.roles = {
dev = { dev = {
enable = mkEnableOption "editor"; enable = mkEnableOption "editor";
@ -14,14 +17,16 @@ in
programs.editor.enable = true; programs.editor.enable = true;
roles.git.enable = true; roles.git.enable = true;
programs.terminal.enable = true; programs.terminal.enable = true;
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
home.packages = (with pkgs; [ {
insomnia home.packages = with pkgs; [
dbeaver insomnia
ansible dbeaver
tig ansible
fx tig
]); fx
}]; ];
}
];
}; };
} }

View file

@ -1,77 +1,101 @@
{ user }: { lib, pkgs, config, ... }: {user}: {
with lib; lib,
let pkgs,
config,
...
}:
with lib; let
cfg = config.displays; cfg = config.displays;
renderDisplaysForHyprland = displays: (map displayHyprlandSetting displays); renderDisplaysForHyprland = displays: (map displayHyprlandSetting displays);
displayHyprlandSetting = display: specificDisplay display + displayHyprlandSetting = display:
", " + resToString display.resolution + specificDisplay display
", " + positionToHyprlandString display.position + + ", "
", " + toString display.scaling + + resToString display.resolution
", " + "transform," + toString display.rotation; + ", "
+ positionToHyprlandString display.position
+ ", "
+ toString display.scaling
+ ", "
+ "transform,"
+ toString display.rotation;
swaybgJob = displays: swaybgJob = displays: {
{ Unit = {
Unit = { Description = "SwayBG";
Description = "SwayBG";
};
Service = {
ExecStart = "${pkgs.swaybg}/bin/swaybg " +
concatStringsSep " " (map swaybgCmd displays);
};
Install = {
WantedBy = [ "graphical-session.target" ];
};
}; };
Service = {
ExecStart =
"${pkgs.swaybg}/bin/swaybg "
+ concatStringsSep " " (map swaybgCmd displays);
};
Install = {
WantedBy = ["graphical-session.target"];
};
};
swaybgCmd = display: swaybgCmd = display:
if (display.wallpaper != "") then "-o ${display.name} -i ${display.wallpaper} -m fill" else ""; if (display.wallpaper != "")
then "-o ${display.name} -i ${display.wallpaper} -m fill"
else "";
specificDisplay = display: specificDisplay = display:
if display.description == "" if display.description == ""
then display.name then display.name
else "desc:" + display.description; else "desc:" + display.description;
positionToHyprlandString = { x, y }: positionToHyprlandString = {
if (x == -1 || y == -1) then "auto" else toString x + "x" + toString y; x,
y,
}:
if (x == -1 || y == -1)
then "auto"
else toString x + "x" + toString y;
renderDisplaysForSway = displays: renderDisplaysForSway = displays:
listToAttrs (map displaySwaySetting displays); listToAttrs (map displaySwaySetting displays);
displaySwaySetting = display: { displaySwaySetting = display: {
name = display.name; name = display.name;
value = let res = display.resolution; in value = let
{ res = display.resolution;
mode = mkIf (!resUnset res) in {
"${toString res.x}x${toString res.y}@${toString res.freq}Hz"; mode =
bg = display.wallpaper + " fill"; mkIf (!resUnset res)
scale = toString display.scaling; "${toString res.x}x${toString res.y}@${toString res.freq}Hz";
}; bg = display.wallpaper + " fill";
scale = toString display.scaling;
};
}; };
resolutionType = types.submodule ({ x, y, freq, ... }: resolutionType = types.submodule ({
{ x,
options = { y,
x = mkOption { freq,
description = "x"; ...
type = types.int; }: {
default = 0; options = {
}; x = mkOption {
y = mkOption { description = "x";
description = "y"; type = types.int;
type = types.int; default = 0;
default = 0;
};
freq = mkOption {
description = "frequency";
type = types.int;
default = 0;
};
}; };
}); y = mkOption {
displayType = types.submodule description = "y";
({ ... }: { type = types.int;
default = 0;
};
freq = mkOption {
description = "frequency";
type = types.int;
default = 0;
};
};
});
displayType =
types.submodule
({...}: {
options = { options = {
name = mkOption { name = mkOption {
description = "name of the display"; description = "name of the display";
@ -91,7 +115,7 @@ let
resolution = mkOption { resolution = mkOption {
description = "res"; description = "res";
type = resolutionType; type = resolutionType;
default = { }; default = {};
}; };
position.x = mkOption { position.x = mkOption {
default = -1; default = -1;
@ -108,36 +132,33 @@ let
}; };
}); });
resUnset = res: resUnset = res: (res.x == 0 || res.y == 0 || res.freq == 0);
(res.x == 0 || res.y == 0 || res.freq == 0);
resToString = res: resToString = res:
if resUnset res if resUnset res
then "preferred" then "preferred"
else "${toString res.x}x${toString res.y}@${toString res.freq}"; else "${toString res.x}x${toString res.y}@${toString res.freq}";
in {
in options.displays = {
{ enable = mkEnableOption "manage displays";
options.displays = displays = mkOption {
{ type = types.listOf displayType;
enable = mkEnableOption "manage displays"; default = [];
displays = mkOption {
type = types.listOf displayType;
default = [ ];
};
}; };
};
config = mkIf cfg.enable { config = mkIf cfg.enable {
home-manager.users.${user}.imports = [ home-manager.users.${user}.imports = [
{ {
wayland.windowManager.hyprland.settings.monitor = mkIf (cfg.displays != [ ]) wayland.windowManager.hyprland.settings.monitor =
mkIf (cfg.displays != [])
(renderDisplaysForHyprland cfg.displays); (renderDisplaysForHyprland cfg.displays);
systemd.user.services.swaybg = swaybgJob cfg.displays; systemd.user.services.swaybg = swaybgJob cfg.displays;
wayland.windowManager.sway.config.output = mkIf (cfg.displays != [ ]) wayland.windowManager.sway.config.output =
mkIf (cfg.displays != [])
(renderDisplaysForSway cfg.displays); (renderDisplaysForSway cfg.displays);
} }
]; ];
}; };
} }

View file

@ -1,13 +1,16 @@
{ user }: { lib, pkgs, config, ... }: {user}: {
with lib; lib,
let pkgs,
config,
...
}:
with lib; let
editor = config.programs.editor; editor = config.programs.editor;
pkg = editor.package; pkg = editor.package;
terminal = config.programs.terminal.package; terminal = config.programs.terminal.package;
termcmd = "${terminal}/bin/${terminal.pname}"; termcmd = "${terminal}/bin/${terminal.pname}";
menu = config.programs.menu.package + config.programs.menu.dmenuCommand; menu = config.programs.menu.package + config.programs.menu.dmenuCommand;
in in {
{
options.programs = { options.programs = {
editor = { editor = {
enable = mkEnableOption "editor"; enable = mkEnableOption "editor";
@ -19,92 +22,93 @@ in
}; };
config = mkIf editor.enable { config = mkIf editor.enable {
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
programs.vscode = { {
enable = true; programs.vscode = {
package = editor.package;
extensions =
if editor.neovim then with pkgs; [
vscode-extensions.asvetliakov.vscode-neovim
] else [ ];
userSettings = {
"keyboard.dispatch" = "keyCode";
"terminal.integrated.sendKeybindingsToShell" = true;
"aws.telemetry" = false;
"gitlens.telemetry.enabled" = false;
"redhat.telemetry.enabled" = false;
"cSpell.language" = "en,en-GB";
} // (if editor.neovim then {
"vscode-neovim.neovimExecutablePaths.linux" = "${pkgs.neovim}/bin/nvim";
"extensions.experimental.affinity" = {
"asvetliakov.vscode-neovim" = 1;
};
} else { });
};
programs.neovim = mkIf editor.neovim {
enable = true;
defaultEditor = true;
coc = {
enable = true; enable = true;
settings = { package = editor.package;
languageserver = { extensions =
go = { if editor.neovim
command = "${pkgs.gopls}/bin/gopls"; then
filetypes = [ "go" ]; with pkgs; [
}; vscode-extensions.asvetliakov.vscode-neovim
nix = { ]
command = "${pkgs.rnix-lsp}/bin/rnix-lsp"; else [];
filetypes = [ "nix" ]; userSettings =
}; {
typescript = { "keyboard.dispatch" = "keyCode";
command = "${pkgs.nodePackages.typescript-language-server}/bin/typescript-language-server"; "terminal.integrated.sendKeybindingsToShell" = true;
filetypes = [ "ts" "tsx" ]; "aws.telemetry" = false;
}; "gitlens.telemetry.enabled" = false;
}; "redhat.telemetry.enabled" = false;
}; "cSpell.language" = "en,en-GB";
}
// (
if editor.neovim
then {
"vscode-neovim.neovimExecutablePaths.linux" = "${pkgs.neovim}/bin/nvim";
"extensions.experimental.affinity" = {
"asvetliakov.vscode-neovim" = 1;
};
}
else {}
);
}; };
extraConfig = ''
vnoremap * y/\V<C-R>=escape(@",'/\')<CR><CR> programs.neovim = mkIf editor.neovim {
vnoremap <C-R> "ry:%s/<C-R>=escape(@r,'/\')<CR> enable = true;
vnoremap A :norm A defaultEditor = true;
noremap <C-S-I> :CocCommand editor.action.formatDocument<CR> extraLuaConfig = ''
set number ${builtins.readFile ./neovim/config.lua}
set rnu '';
set ignorecase extraPackages = with pkgs; [
set smartcase nodePackages_latest.typescript-language-server
set mouse=a vscode-langservers-extracted
set path=.,** gopls
let g:netrw_banner=0 nil
let g:netrw_liststyle=3 ];
set undofile plugins = with pkgs.vimPlugins; [
set undodir=~/.local/share/nvim/undo vim-surround
vim-commentary
{
plugin = telescope-nvim;
type = "lua";
config = ''
local builtin = require('telescope.builtin')
vim.keymap.set('n', '<leader>ff', builtin.find_files, {})
vim.keymap.set('n', '<leader>fg', builtin.live_grep, {})
vim.keymap.set('n', '<leader>fb', builtin.buffers, {})
vim.keymap.set('n', '<leader>fh', builtin.help_tags, {})
'';
}
{
plugin = nvim-lspconfig;
type = "lua";
config = builtins.readFile ./neovim/lspconfig.lua;
}
firenvim
];
};
}
];
programs.scripts = [
{
name = "open-code";
text = ''
code_dir=~/Documents/code
cd $code_dir
repo=$({ ls && echo clone-repo; } | ${menu})
case $repo in
clone-repo)
url=$(wl-paste)
${termcmd} -e -- git clone "$url" ;;
*) [ -e "$repo" ] && ${pkg}/bin/${pkg.executableName} $repo ;;
esac
''; '';
plugins = with pkgs.vimPlugins; [ install = false;
vim-surround hotkeys = [{key = "C";}];
vim-commentary }
firenvim ];
];
};
}];
programs.scripts = [{
name = "open-code";
text = ''
code_dir=~/Documents/code
cd $code_dir
repo=$({ ls && echo clone-repo; } | ${menu})
case $repo in
clone-repo)
url=$(wl-paste)
${termcmd} -e -- git clone "$url" ;;
*) [ -e "$repo" ] && ${pkg}/bin/${pkg.executableName} $repo ;;
esac
'';
install = false;
hotkeys = [{ key = "C"; }];
}];
}; };
} }

View file

@ -1,11 +1,17 @@
{ user, userName }: { lib, pkgs, config, ... }: {
with lib; user,
let userName,
}: {
lib,
pkgs,
config,
...
}:
with lib; let
cfg = config.roles.email; cfg = config.roles.email;
terminal = config.programs.terminal.package; terminal = config.programs.terminal.package;
termcmd = "${terminal}/bin/${terminal.pname}"; termcmd = "${terminal}/bin/${terminal.pname}";
in in {
{
options.roles = { options.roles = {
email = { email = {
enable = mkEnableOption "email settings"; enable = mkEnableOption "email settings";
@ -20,7 +26,6 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
programs.scripts = [ programs.scripts = [
{ {
name = "email"; name = "email";
@ -32,199 +37,200 @@ in
} }
]; ];
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
programs.git = { {
userName = userName; programs.git = {
userEmail = cfg.email; userName = userName;
}; userEmail = cfg.email;
accounts.email.accounts.${cfg.email} = mkIf cfg.terminal {
notmuch.enable = true;
neomutt.enable = true;
aerc.enable = true;
mbsync.enable = true;
mbsync.create = "both";
userName = cfg.email;
realName = userName;
address = cfg.email;
primary = true;
passwordCommand = "${pkgs.rbw}/bin/rbw get privateemail";
smtp = {
host = "mail.privateemail.com";
port = 465;
tls.enable = true;
}; };
imap = {
host = "mail.privateemail.com";
port = 993;
tls.enable = true;
};
};
programs.notmuch.enable = cfg.terminal; accounts.email.accounts.${cfg.email} = mkIf cfg.terminal {
programs.neomutt = { notmuch.enable = true;
enable = cfg.terminal; neomutt.enable = true;
vimKeys = true; aerc.enable = true;
sort = "reverse-date"; mbsync.enable = true;
sidebar.enable = true; mbsync.create = "both";
}; userName = cfg.email;
programs.mbsync.enable = cfg.terminal; realName = userName;
services.mbsync.enable = cfg.terminal; address = cfg.email;
primary = true;
programs.aerc = { passwordCommand = "${pkgs.rbw}/bin/rbw get privateemail";
enable = cfg.terminal; smtp = {
extraBinds = '' host = "mail.privateemail.com";
# Binds are of the form <key sequence> = <command to run> port = 465;
# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>" tls.enable = true;
# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
<C-t> = :term<Enter>
[messages]
Q = :quit<Enter>
T = :toggle-threads<Enter>
j = :next<Enter>
<Down> = :next<Enter>
<C-d> = :next 50%<Enter>
<C-f> = :next 100%<Enter>
<PgDn> = :next -s 100%<Enter>
k = :prev<Enter>
<Up> = :prev<Enter>
<C-u> = :prev 50%<Enter>
<C-b> = :prev<Enter>
<PgUp> = :prev -s 100%<Enter>
gg = :select 0<Enter>
G = :select -1<Enter>
J = :next-folder<Enter>
K = :prev-folder<Enter>
v = :mark -t<Enter>
V = :mark -v<Enter>
f = :flag<Enter>
F = :unflag<Enter>
t = :toggle-threads<Enter>
<Enter> = :view<Enter>
D = :mv Trash<Enter>
C = :compose<enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>
rr = :reply -a<Enter>
rq = :reply -aq<Enter>
rt = :unflag<Enter>:reply -a -Tthanks<Enter>
Rt = :unflag<Enter>:reply -qa -Tquoted_thanks<Enter>
a = :mv Archive<Enter>
c = :cf<space>
$ = :term<space>
! = :term<space>
| = :pipe<space>
ga = :flag<Enter>:pipe -mb git am -3<Enter>
gp = :term git push<Enter>
gl = :term git log<Enter>
/ = :search<space>
\ = :filter<space>
n = :next-result<Enter>
N = :prev-result<Enter>
o = :term mbsync -a<Enter>
q = :quit<Enter>
[view]
/ = :toggle-key-passthrough<Enter>/
q = :close<Enter>
| = :pipe -m<space>
S = :save<space>
H = :toggle-headers<Enter>
D = :mv Trash<Enter>
<C-k> = :prev-part<Enter>
<C-j> = :next-part<Enter>
J = :next<Enter>
K = :prev<Enter>
f = :forward<Enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>
rr = :reply -a<Enter>
rq = :reply -aq<Enter>
rt = :reply -Tthanks<Enter>
ga = :pipe -b git am -3<Enter>
gp = :term git push<Enter>
gl = :term git log<Enter>
[view::passthrough]
$noinherit = true
$ex = <C-x>
<Esc> = :toggle-key-passthrough<Enter>
[compose]
$ex = <C-x>
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<tab> = :next-field<Enter>
[compose::editor]
# Keybindings used when the embedded terminal is selected in the compose view
$noinherit = true
$ex = <C-x>
<C-t> = :term<Enter>
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
[compose::review]
# Keybindings used when reviewing a message to be sent
y = :send<Enter>
n = :abort<Enter>
e = :edit<Enter>
a = :attach<space>
c = :encrypt<Enter>
s = :sign<Enter>
V = :header -f X-Sourcehut-Patchset-Update NEEDS_REVISION<Enter>
A = :header -f X-Sourcehut-Patchset-Update APPLIED<Enter>
R = :header -f X-Sourcehut-Patchset-Update REJECTED<Enter>
[terminal]
$noinherit = true
$ex = <C-x>
<C-t> = :term<Enter>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
'';
extraConfig = {
general = {
pgp-provider = "gpg";
unsafe-accounts-conf = true;
}; };
ui = { }; imap = {
viewer = { }; host = "mail.privateemail.com";
filters = { port = 993;
"text/plain" = "colorize"; tls.enable = true;
"text/calendar" = "calendar";
"message/delivery-status" = "colorize";
"message/rfc822" = "colorize";
"image/*" = "img2sixel";
"text/html" = "html | colorize";
}; };
}; };
};
}]; programs.notmuch.enable = cfg.terminal;
programs.neomutt = {
enable = cfg.terminal;
vimKeys = true;
sort = "reverse-date";
sidebar.enable = true;
};
programs.mbsync.enable = cfg.terminal;
services.mbsync.enable = cfg.terminal;
programs.aerc = {
enable = cfg.terminal;
extraBinds = ''
# Binds are of the form <key sequence> = <command to run>
# To use '=' in a key sequence, substitute it with "Eq": "<Ctrl+Eq>"
# If you wish to bind #, you can wrap the key sequence in quotes: "#" = quit
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
<C-t> = :term<Enter>
[messages]
Q = :quit<Enter>
T = :toggle-threads<Enter>
j = :next<Enter>
<Down> = :next<Enter>
<C-d> = :next 50%<Enter>
<C-f> = :next 100%<Enter>
<PgDn> = :next -s 100%<Enter>
k = :prev<Enter>
<Up> = :prev<Enter>
<C-u> = :prev 50%<Enter>
<C-b> = :prev<Enter>
<PgUp> = :prev -s 100%<Enter>
gg = :select 0<Enter>
G = :select -1<Enter>
J = :next-folder<Enter>
K = :prev-folder<Enter>
v = :mark -t<Enter>
V = :mark -v<Enter>
f = :flag<Enter>
F = :unflag<Enter>
t = :toggle-threads<Enter>
<Enter> = :view<Enter>
D = :mv Trash<Enter>
C = :compose<enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>
rr = :reply -a<Enter>
rq = :reply -aq<Enter>
rt = :unflag<Enter>:reply -a -Tthanks<Enter>
Rt = :unflag<Enter>:reply -qa -Tquoted_thanks<Enter>
a = :mv Archive<Enter>
c = :cf<space>
$ = :term<space>
! = :term<space>
| = :pipe<space>
ga = :flag<Enter>:pipe -mb git am -3<Enter>
gp = :term git push<Enter>
gl = :term git log<Enter>
/ = :search<space>
\ = :filter<space>
n = :next-result<Enter>
N = :prev-result<Enter>
o = :term mbsync -a<Enter>
q = :quit<Enter>
[view]
/ = :toggle-key-passthrough<Enter>/
q = :close<Enter>
| = :pipe -m<space>
S = :save<space>
H = :toggle-headers<Enter>
D = :mv Trash<Enter>
<C-k> = :prev-part<Enter>
<C-j> = :next-part<Enter>
J = :next<Enter>
K = :prev<Enter>
f = :forward<Enter>
Rr = :reply<Enter>
Rq = :reply -q<Enter>
rr = :reply -a<Enter>
rq = :reply -aq<Enter>
rt = :reply -Tthanks<Enter>
ga = :pipe -b git am -3<Enter>
gp = :term git push<Enter>
gl = :term git log<Enter>
[view::passthrough]
$noinherit = true
$ex = <C-x>
<Esc> = :toggle-key-passthrough<Enter>
[compose]
$ex = <C-x>
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<tab> = :next-field<Enter>
[compose::editor]
# Keybindings used when the embedded terminal is selected in the compose view
$noinherit = true
$ex = <C-x>
<C-t> = :term<Enter>
<C-k> = :prev-field<Enter>
<C-j> = :next-field<Enter>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
[compose::review]
# Keybindings used when reviewing a message to be sent
y = :send<Enter>
n = :abort<Enter>
e = :edit<Enter>
a = :attach<space>
c = :encrypt<Enter>
s = :sign<Enter>
V = :header -f X-Sourcehut-Patchset-Update NEEDS_REVISION<Enter>
A = :header -f X-Sourcehut-Patchset-Update APPLIED<Enter>
R = :header -f X-Sourcehut-Patchset-Update REJECTED<Enter>
[terminal]
$noinherit = true
$ex = <C-x>
<C-t> = :term<Enter>
<C-p> = :prev-tab<Enter>
<C-n> = :next-tab<Enter>
'';
extraConfig = {
general = {
pgp-provider = "gpg";
unsafe-accounts-conf = true;
};
ui = {};
viewer = {};
filters = {
"text/plain" = "colorize";
"text/calendar" = "calendar";
"message/delivery-status" = "colorize";
"message/rfc822" = "colorize";
"image/*" = "img2sixel";
"text/html" = "html | colorize";
};
};
};
}
];
}; };
} }

View file

@ -1,17 +1,22 @@
{ user }: { lib, pkgs, config, ... }: {user}: {
with lib; lib,
{ pkgs,
config,
...
}:
with lib; {
options.roles.gamer = { options.roles.gamer = {
enable = mkEnableOption "gamer packages"; enable = mkEnableOption "gamer packages";
}; };
config = mkIf config.roles.gamer.enable { config = mkIf config.roles.gamer.enable {
# required for heroic launcher # required for heroic launcher
nixpkgs.config.permittedInsecurePackages = [ nixpkgs.config.permittedInsecurePackages = [
"electron-25.9.0" "electron-25.9.0"
]; ];
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
{
home.packages = with pkgs; [ home.packages = with pkgs; [
airshipper airshipper
minetest minetest
@ -23,11 +28,11 @@ with lib;
protontricks protontricks
protonup-qt protonup-qt
gamemode gamemode
gamescope gamescope
monado monado
openxr-loader openxr-loader
opencomposite opencomposite
(makeDesktopItem { (makeDesktopItem {
name = "x11steam"; name = "x11steam";
@ -36,37 +41,38 @@ with lib;
}) })
oversteer oversteer
]; ];
}]; }
];
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [ nixpkgs.config.allowUnfreePredicate = pkg:
builtins.elem (lib.getName pkg) [
"steam" "steam"
"steam-run" "steam-run"
"steam-original" "steam-original"
"osu-lazer" "osu-lazer"
]; ];
programs.steam = { programs.steam = {
enable = true; enable = true;
remotePlay.openFirewall = true; remotePlay.openFirewall = true;
dedicatedServer.openFirewall = true; dedicatedServer.openFirewall = true;
};
hardware.steam-hardware.enable = true;
environment.etc.logitechG920 = {
target = "usb_modeswitch.d/046d:c261";
text = ''
DefaultVendor=046d
DefaultProduct=c261
MessageEndpoint=01
ResponseEndpoint=01
TargetClass=0x03
MessageContent="0f00010142"
'';
};
services.udev.extraRules = ''
ATTR{idVendor}=="046d", ATTR{idProduct}=="c261", RUN+="${pkgs.usb-modeswitch}/bin/usb_modeswitch -c '/etc/usb_modeswitch.d/046d:c261'"
'';
hardware.new-lg4ff.enable = true;
}; };
hardware.steam-hardware.enable = true;
environment.etc.logitechG920 = {
target = "usb_modeswitch.d/046d:c261";
text = ''
DefaultVendor=046d
DefaultProduct=c261
MessageEndpoint=01
ResponseEndpoint=01
TargetClass=0x03
MessageContent="0f00010142"
'';
};
services.udev.extraRules = ''
ATTR{idVendor}=="046d", ATTR{idProduct}=="c261", RUN+="${pkgs.usb-modeswitch}/bin/usb_modeswitch -c '/etc/usb_modeswitch.d/046d:c261'"
'';
hardware.new-lg4ff.enable = true;
};
} }

View file

@ -1,9 +1,15 @@
{ user, userName }: { lib, pkgs, config, ... }:
with lib;
let
cfg = config.roles.git;
in
{ {
user,
userName,
}: {
lib,
pkgs,
config,
...
}:
with lib; let
cfg = config.roles.git;
in {
options.roles = { options.roles = {
git = { git = {
enable = mkEnableOption "email settings"; enable = mkEnableOption "email settings";
@ -11,21 +17,22 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
programs.git = { {
enable = true; programs.git = {
aliases = {
graph = "log --oneline --all --graph";
amend = "commit --amend --no-edit";
};
delta = {
enable = true; enable = true;
aliases = {
graph = "log --oneline --all --graph";
amend = "commit --amend --no-edit";
};
delta = {
enable = true;
};
extraConfig = {
pull.rebase = true;
};
}; };
extraConfig = { }
pull.rebase = true; ];
};
};
}];
}; };
} }

View file

@ -1,6 +1,10 @@
{ user }: { lib, pkgs, config, ... }: {user}: {
with lib; lib,
{ pkgs,
config,
...
}:
with lib; {
options.keyboard = { options.keyboard = {
dvorak = { dvorak = {
enable = mkEnableOption "use a good keyboard layout on a qwerty keyboard"; enable = mkEnableOption "use a good keyboard layout on a qwerty keyboard";
@ -26,7 +30,9 @@ with lib;
}; };
} }
]; ];
services.xserver.xkbVariant = if config.keyboard.dvorak.enable then "dvorak" else ""; services.xserver.xkbVariant =
if config.keyboard.dvorak.enable
then "dvorak"
else "";
}; };
} }

View file

@ -1,9 +1,12 @@
{ user }: { lib, pkgs, config, ... }: {user}: {
with lib; lib,
let pkgs,
config,
...
}:
with lib; let
cfg = config.roles.laptop; cfg = config.roles.laptop;
in in {
{
options.roles = { options.roles = {
laptop = { laptop = {
enable = mkEnableOption "is a laptop"; enable = mkEnableOption "is a laptop";
@ -14,30 +17,34 @@ in
config = mkIf cfg.enable { config = mkIf cfg.enable {
displays = mkIf cfg.displays { displays = mkIf cfg.displays {
enable = true; enable = true;
displays = [{ displays = [
name = "eDP-1"; {
scaling = 1.2; name = "eDP-1";
}]; scaling = 1.2;
}
];
}; };
keyboard.dvorak.enable = true; keyboard.dvorak.enable = true;
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
wayland.windowManager.hyprland = { {
settings = { wayland.windowManager.hyprland = {
general = { settings = {
gaps_out = 10; general = {
border_size = 3; gaps_out = 10;
}; border_size = 3;
bind = [ };
"SUPER_SHIFT, Q, killactive," bind = [
]; "SUPER_SHIFT, Q, killactive,"
"device:at-translated-set-2-keyboard" = { ];
kb_variant = "dvorak,"; "device:at-translated-set-2-keyboard" = {
kb_layout = "gb,gb"; kb_variant = "dvorak,";
kb_options = "grp:alt_shift_toggle,caps:escape"; kb_layout = "gb,gb";
kb_options = "grp:alt_shift_toggle,caps:escape";
};
}; };
}; };
}; }
}]; ];
}; };
} }

View file

@ -1,11 +1,14 @@
{ user }: { lib, pkgs, config, ... }: {user}: {
with lib; lib,
let pkgs,
config,
...
}:
with lib; let
cfg = config.programs.menu; cfg = config.programs.menu;
terminal = config.programs.terminal.package; terminal = config.programs.terminal.package;
termcmd = "${terminal}/bin/${terminal.pname}"; termcmd = "${terminal}/bin/${terminal.pname}";
in in {
{
options.programs = { options.programs = {
menu = { menu = {
enable = mkEnableOption "menu"; enable = mkEnableOption "menu";
@ -20,14 +23,16 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
programs.wofi = mkIf (cfg.package == pkgs.wofi) { {
enable = true; programs.wofi = mkIf (cfg.package == pkgs.wofi) {
settings = { enable = true;
term = termcmd; settings = {
insensitive = true; term = termcmd;
insensitive = true;
};
}; };
}; }
}]; ];
}; };
} }

View file

@ -1,47 +1,69 @@
{ user }: { lib, pkgs, config, ... }: {user}: {
with lib; lib,
let pkgs,
config,
...
}:
with lib; let
cfg = config.roles.mpd; cfg = config.roles.mpd;
in in {
{
options.roles.mpd = { options.roles.mpd = {
enable = mkEnableOption "setup mpd client"; enable = mkEnableOption "setup mpd client";
host = mkOption { default = "192.168.1.2"; }; host = mkOption {default = "192.168.1.2";};
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
programs.ncmpcpp = { {
enable = true; programs.ncmpcpp = {
settings.mpd_host = cfg.host; enable = true;
bindings = [ settings.mpd_host = cfg.host;
{ key = "j"; command = "scroll_down"; } bindings = [
{ key = "k"; command = "scroll_up"; } {
{ key = "l"; command = "next_column"; } key = "j";
{ key = "h"; command = "previous_column"; } command = "scroll_down";
{ key = "J"; command = [ "select_item" "scroll_down" ]; } }
{ key = "K"; command = [ "select_item" "scroll_up" ]; } {
]; key = "k";
}; command = "scroll_up";
services.mpd-mpris = { }
enable = true; {
mpd.host = cfg.host; key = "l";
}; command = "next_column";
programs.waybar.settings.mainBar.mpd.server = cfg.host; }
systemd.user.services = { {
snapclient = { key = "h";
Unit = { command = "previous_column";
Description = "Snapclient"; }
}; {
Service = { key = "J";
ExecStart = "${pkgs.snapcast}/bin/snapclient -h ${cfg.host}"; command = ["select_item" "scroll_down"];
}; }
Install = { {
WantedBy = [ "graphical-session.target" ]; key = "K";
command = ["select_item" "scroll_up"];
}
];
};
services.mpd-mpris = {
enable = true;
mpd.host = cfg.host;
};
programs.waybar.settings.mainBar.mpd.server = cfg.host;
systemd.user.services = {
snapclient = {
Unit = {
Description = "Snapclient";
};
Service = {
ExecStart = "${pkgs.snapcast}/bin/snapclient -h ${cfg.host}";
};
Install = {
WantedBy = ["graphical-session.target"];
};
}; };
}; };
}; }
}]; ];
}; };
} }

View file

@ -0,0 +1,19 @@
vim.g.mapleader = ' '
vim.g.maplocalleader = ' '
vim.o.relativenumber = true
vim.o.signcolumn = 'yes'
vim.o.tabstop = 2
vim.o.shiftwidth = 2
vim.o.expandtab = true
vim.o.smartindent = true
vim.o.hlsearch = false
vim.o.scrolloff = 6
vim.keymap.set("v", "J", ":m '>+1<CR>gv=gv")
vim.keymap.set("v", "K", ":m '<-2<CR>gv=gv")
vim.keymap.set("x", "p", "\"_dP")
vim.keymap.set("n", "<leader>y", "\"+y")
vim.keymap.set("v", "<leader>y", "\"+y")

View file

@ -0,0 +1,55 @@
-- Setup language servers.
local lspconfig = require('lspconfig')
lspconfig.tsserver.setup {
on_attach = function(client)
client.server_capabilities.documentFormattingProvider = false
end
}
lspconfig.eslint.setup {
on_attach = function(client)
client.server_capabilities.documentFormattingProvider = true
end
}
lspconfig.gopls.setup {}
lspconfig.nil_ls.setup {}
-- Global mappings.
-- See `:help vim.diagnostic.*` for documentation on any of the below functions
vim.keymap.set('n', '<space>e', vim.diagnostic.open_float)
vim.keymap.set('n', '[d', vim.diagnostic.goto_prev)
vim.keymap.set('n', ']d', vim.diagnostic.goto_next)
vim.keymap.set('n', '<space>q', vim.diagnostic.setloclist)
-- Use LspAttach autocommand to only map the following keys
-- after the language server attaches to the current buffer
vim.api.nvim_create_autocmd('LspAttach', {
group = vim.api.nvim_create_augroup('UserLspConfig', {}),
callback = function(ev)
-- Enable completion triggered by <c-x><c-o>
vim.bo[ev.buf].omnifunc = 'v:lua.vim.lsp.omnifunc'
-- Buffer local mappings.
-- See `:help vim.lsp.*` for documentation on any of the below functions
local opts = { buffer = ev.buf }
vim.keymap.set('n', 'gD', vim.lsp.buf.declaration, opts)
vim.keymap.set('n', 'gd', vim.lsp.buf.definition, opts)
vim.keymap.set('n', 'K', vim.lsp.buf.hover, opts)
vim.keymap.set('n', 'gi', vim.lsp.buf.implementation, opts)
vim.keymap.set('n', '<C-k>', vim.lsp.buf.signature_help, opts)
vim.keymap.set('n', '<leader>wa', vim.lsp.buf.add_workspace_folder, opts)
vim.keymap.set('n', '<leader>wr', vim.lsp.buf.remove_workspace_folder, opts)
vim.keymap.set('n', '<leader>wl', function()
print(vim.inspect(vim.lsp.buf.list_workspace_folders()))
end, opts)
vim.keymap.set('n', '<leader>D', vim.lsp.buf.type_definition, opts)
vim.keymap.set('n', '<leader>rn', vim.lsp.buf.rename, opts)
vim.keymap.set({ 'n', 'v' }, '<space>ca', vim.lsp.buf.code_action, opts)
vim.keymap.set('n', 'gr', vim.lsp.buf.references, opts)
vim.keymap.set('n', '<leader>f', function()
vim.lsp.buf.format { async = true }
end, opts)
end,
})

View file

@ -1,12 +1,15 @@
{ user }: { lib, pkgs, config, ... }: {user}: {
with lib; lib,
{ pkgs,
config,
...
}:
with lib; {
options.roles.personal = { options.roles.personal = {
enable = mkEnableOption "personal packages"; enable = mkEnableOption "personal packages";
}; };
config = mkIf config.roles.personal.enable { config = mkIf config.roles.personal.enable {
roles.email = { roles.email = {
enable = true; enable = true;
email = "tristan@tristans.cloud"; email = "tristan@tristans.cloud";
@ -22,32 +25,33 @@ with lib;
"en_US.UTF-8/UTF-8" "en_US.UTF-8/UTF-8"
]; ];
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
services.nextcloud-client.enable = true; {
services.gnome-keyring.enable = true; services.nextcloud-client.enable = true;
services.gnome-keyring.enable = true;
home.language = { home.language = {
base = "eo.UTF-8"; base = "eo.UTF-8";
}; };
home.packages = with pkgs; [ home.packages = with pkgs; [
godot_4 godot_4
ardour ardour
blender blender
musescore musescore
jellyfin-media-player jellyfin-media-player
monero-gui monero-gui
electrum electrum
xmrig xmrig
transmission-remote-gtk transmission-remote-gtk
krita krita
organicmaps organicmaps
anki anki
hugo hugo
libsForQt5.neochat libsForQt5.neochat
bookworm bookworm
]; ];
}
}]; ];
}; };
} }

View file

@ -1,9 +1,13 @@
{ user }: { lib, pkgs, config, ... }: {user}: {
with lib; lib,
let pkgs,
config,
...
}:
with lib; let
scripts = config.programs.scripts; scripts = config.programs.scripts;
hotkeyType = types.submodule ({ ... }: { hotkeyType = types.submodule ({...}: {
options = { options = {
key = mkOption { key = mkOption {
description = "the key"; description = "the key";
@ -19,7 +23,7 @@ let
}; };
}); });
scriptType = types.submodule ({ ... }: { scriptType = types.submodule ({...}: {
options = { options = {
name = mkOption { name = mkOption {
description = "name of the executable"; description = "name of the executable";
@ -30,7 +34,7 @@ let
hotkeys = mkOption { hotkeys = mkOption {
type = types.listOf hotkeyType; type = types.listOf hotkeyType;
description = "keys that run this script"; description = "keys that run this script";
default = [ ]; default = [];
}; };
install = mkOption { install = mkOption {
type = types.bool; type = types.bool;
@ -42,33 +46,35 @@ let
scriptToPackage = script: scriptToPackage = script:
pkgs.writeShellScriptBin script.name script.text; pkgs.writeShellScriptBin script.name script.text;
scriptExec = { script, hotkey }: scriptExec = {
"${scriptToPackage script}/bin/${script.name} ${hotkey.args}"; script,
hotkey,
}: "${scriptToPackage script}/bin/${script.name} ${hotkey.args}";
installScripts = scripts: installScripts = scripts: (map scriptToPackage (filter (s: s.install) scripts));
(map scriptToPackage (filter (s: s.install) scripts));
bindScript = script: concatStrings ( bindScript = script:
map concatStrings (
(hotkey: map
"${hotkey.modifier}, ${hotkey.key}, exec, ${scriptExec {inherit script hotkey;}}" (
hotkey: "${hotkey.modifier}, ${hotkey.key}, exec, ${scriptExec {inherit script hotkey;}}"
) )
script.hotkeys); script.hotkeys
);
in in {
{
options.programs = { options.programs = {
scripts = mkOption { scripts = mkOption {
type = types.listOf scriptType; type = types.listOf scriptType;
default = [ ]; default = [];
}; };
}; };
config = { config = {
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
home.packages = installScripts scripts; {
wayland.windowManager.hyprland.settings.bind = (map bindScript scripts); home.packages = installScripts scripts;
}]; wayland.windowManager.hyprland.settings.bind = map bindScript scripts;
}
];
}; };
} }

View file

@ -1,9 +1,12 @@
{ user }: { lib, pkgs, config, ... }: {user}: {
with lib; lib,
let pkgs,
config,
...
}:
with lib; let
cfg = config.programs.terminal; cfg = config.programs.terminal;
in in {
{
options.programs = { options.programs = {
terminal = { terminal = {
enable = mkEnableOption "editor"; enable = mkEnableOption "editor";
@ -14,13 +17,15 @@ in
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
programs.foot = mkIf ( cfg.package == pkgs.foot ) { {
enable = true; programs.foot = mkIf (cfg.package == pkgs.foot) {
server.enable = true; enable = true;
}; server.enable = true;
};
home.packages = [ cfg.package ]; home.packages = [cfg.package];
}]; }
];
}; };
} }

View file

@ -1,9 +1,12 @@
{ user }: { lib, pkgs, config, ... }: {user}: {
with lib; lib,
let pkgs,
config,
...
}:
with lib; let
cfg = config.windowManager; cfg = config.windowManager;
in in {
{
options.windowManager = { options.windowManager = {
hyprland = mkEnableOption "hyprland"; hyprland = mkEnableOption "hyprland";
sway = mkEnableOption "sway"; sway = mkEnableOption "sway";
@ -21,269 +24,279 @@ in
command = "sway"; command = "sway";
user = user; user = user;
}; };
default_session = if cfg.sway then sway_session else hypr_session; default_session =
if cfg.sway
then sway_session
else hypr_session;
}; };
}; };
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
wayland.windowManager.hyprland = mkIf cfg.hyprland { {
enable = true; wayland.windowManager.hyprland = mkIf cfg.hyprland {
systemd.enable = true;
settings = {
input = {
touchpad = {
natural_scroll = true;
scroll_factor = 0.5;
};
};
gestures = {
workspace_swipe = true;
workspace_swipe_numbered = true;
};
decoration = {
rounding = 5;
drop_shadow = false;
};
bezier = [
"overshot, 0.05, 0.9, 0.1, 1.1"
"linear, 0.0, 0.0, 1.0, 1.0"
];
animations = {
enabled = true;
animation = [
"windows, 1, 1, default, popin"
"border, 1, 1, default"
"fade, 1, 1, default"
"workspaces, 1, 3, overshot"
"borderangle,1, 50, linear, loop"
];
};
bind = [
"SUPER, h, movefocus,l"
"SUPER, l, movefocus,r"
"SUPER, j, layoutmsg,cyclenext"
"SUPER, k, layoutmsg,cycleprev"
"SUPER, space, layoutmsg,swapwithmaster master"
"SUPER, F, fullscreen,"
"SUPER, V, togglefloating,"
"SUPER, W, layoutmsg, orientationprev"
"SUPER_SHIFT, W, layoutmsg, orientationnext"
"SUPER_SHIFT, V, togglegroup,"
"SUPER_SHIFT, h, changegroupactive,b"
"SUPER_SHIFT, h, moveintogroup,l"
"SUPER_SHIFT, l, moveintogroup,r"
"SUPER_SHIFT, l, changegroupactive,f"
"SUPER, Y, togglespecialworkspace"
"SUPER_SHIFT, Y, movetoworkspace, special"
"SUPER, R, submap, resize"
"SUPER,1,workspace,1"
"SUPER,2,workspace,2"
"SUPER,3,workspace,3"
"SUPER,4,workspace,4"
"SUPER,5,workspace,5"
"SUPER,6,workspace,6"
"SUPER,7,workspace,7"
"SUPER,8,workspace,8"
"SUPER,9,workspace,9"
"SUPER,0,workspace,10"
"SUPER,left,workspace,r-1"
"SUPER,right,workspace,r+1"
"SUPER_SHIFT,1,movetoworkspace,1"
"SUPER_SHIFT,2,movetoworkspace,2"
"SUPER_SHIFT,3,movetoworkspace,3"
"SUPER_SHIFT,4,movetoworkspace,4"
"SUPER_SHIFT,5,movetoworkspace,5"
"SUPER_SHIFT,6,movetoworkspace,6"
"SUPER_SHIFT,7,movetoworkspace,7"
"SUPER_SHIFT,8,movetoworkspace,8"
"SUPER_SHIFT,9,movetoworkspace,9"
"SUPER_SHIFT,0,movetoworkspace,10"
];
bindm = [
"SUPER, mouse:272, movewindow"
"SUPER, mouse:273, resizewindow"
];
env = [
"GDK_BACKEND,wayland,x11"
"QT_QPA_PLATFORM,wayland;xcb"
"SDL_VIDEODRIVER,wayland"
"CLUTTER_BACKEND,wayland"
"XDG_CURRENT_DESKTOP,Hyprland"
"XDG_SESSION_TYPE,wayland"
"XDG_SESSION_DESKTOP,Hyprland"
"QT_AUTO_SCREEN_SCALE_FACTOR,1"
"QT_WAYLAND_DISABLE_WINDOWDECORATION,1"
"NIXOS_OZONE_WL,1"
];
windowrule = [
"float, title:wlogout"
"idleinhibit always, vrmonitor"
"idleinhibit focus, steam_app"
];
workspace = [
"11, default:true"
];
general = {
gaps_out = 10;
resize_on_border = true;
layout = "master";
# "col.active_border" = "rgb(FFFF00) rgb(00FFFF) rgb(FF00FF)";
border_size = lib.mkDefault 5;
};
master = {
mfact = 0.7;
new_on_top = true;
};
misc = {
vrr = 2;
focus_on_activate = true;
};
};
# https://wiki.hyprland.org/Configuring/Variables/
extraConfig = ''
submap = resize
binde = ,right,resizeactive,10 0
binde = ,left,resizeactive,-10 0
binde = ,up,resizeactive,0 -10
binde = ,down,resizeactive,0 10
binde = ,k,resizeactive,0 -10
binde = ,j,resizeactive,0 10
binde = ,l,splitratio,0.05
binde = ,h,splitratio,-0.05
binde = SHIFT,l,splitratio,0.3
binde = SHIFT,h,splitratio,-0.3
bind = , escape, submap,reset
bind = , enter, submap,reset
bind = SUPER, R, submap,reset
bind = CONTROL, C, submap,reset
submap = reset
'';
};
wayland.windowManager.sway = mkIf cfg.sway {
enable = true;
};
programs.swaylock = {
enable = true;
package = pkgs.swaylock-effects;
settings = {
clock = true;
screenshots = true;
effect-scale = 0.5;
effect-blur = "10x10";
grace = 5;
};
};
services.swayidle = {
enable = true;
systemdTarget = "graphical-session.target";
events = [
{ event = "before-sleep"; command = "${pkgs.swaylock-effects}/bin/swaylock"; }
{ event = "lock"; command = "${pkgs.swaylock-effects}/bin/swaylock"; }
];
timeouts = [
{
timeout = 300;
command = "${pkgs.swaylock-effects}/bin/swaylock -f";
}
{
timeout = 600;
command = "systemctl suspend";
}
];
};
services.mako = {
enable = true;
};
programs.waybar = {
enable = true;
settings = {
mainBar = {
layer = "top";
position = "top";
height = 36;
modules-left = [ "hyprland/workspaces" "hyprland/window" ];
modules-right = [ "mpris" "pulseaudio" "clock" "tray" "battery" ];
clock = {
format = "📅 {:%a %b-%d %I:%M %p}";
};
pulseaudio = {
format-muted = "🔇 {volume}";
format = "{icon} {volume}";
format-icons.default = [ "🔈" "🔉" "🔊" ];
on-click = "${pkgs.pavucontrol}/bin/pavucontrol";
};
mpris = {
format = "{player_icon} {artist} - {title}";
format-paused = "{status_icon} {player_icon} {artist} - {title}";
player-icons = {
default = "";
mpd = "🎵";
kdeconnect = "";
};
status-icons = {
paused = "";
};
};
battery = {
format = "{icon} {capacity}%";
format-icons = [ "🤏" "🪫" "🔋" "🔋" ];
format-charging = "🔌 {capacity}%";
states = {
warning = 30;
critical = 15;
};
};
};
};
systemd = {
enable = true; enable = true;
target = "graphical-session.target"; systemd.enable = true;
settings = {
input = {
touchpad = {
natural_scroll = true;
scroll_factor = 0.5;
};
};
gestures = {
workspace_swipe = true;
workspace_swipe_numbered = true;
};
decoration = {
rounding = 5;
drop_shadow = false;
};
bezier = [
"overshot, 0.05, 0.9, 0.1, 1.1"
"linear, 0.0, 0.0, 1.0, 1.0"
];
animations = {
enabled = true;
animation = [
"windows, 1, 1, default, popin"
"border, 1, 1, default"
"fade, 1, 1, default"
"workspaces, 1, 3, overshot"
"borderangle,1, 50, linear, loop"
];
};
bind = [
"SUPER, h, movefocus,l"
"SUPER, l, movefocus,r"
"SUPER, j, layoutmsg,cyclenext"
"SUPER, k, layoutmsg,cycleprev"
"SUPER, space, layoutmsg,swapwithmaster master"
"SUPER, F, fullscreen,"
"SUPER, V, togglefloating,"
"SUPER, W, layoutmsg, orientationprev"
"SUPER_SHIFT, W, layoutmsg, orientationnext"
"SUPER_SHIFT, V, togglegroup,"
"SUPER_SHIFT, h, changegroupactive,b"
"SUPER_SHIFT, h, moveintogroup,l"
"SUPER_SHIFT, l, moveintogroup,r"
"SUPER_SHIFT, l, changegroupactive,f"
"SUPER, Y, togglespecialworkspace"
"SUPER_SHIFT, Y, movetoworkspace, special"
"SUPER, R, submap, resize"
"SUPER,1,workspace,1"
"SUPER,2,workspace,2"
"SUPER,3,workspace,3"
"SUPER,4,workspace,4"
"SUPER,5,workspace,5"
"SUPER,6,workspace,6"
"SUPER,7,workspace,7"
"SUPER,8,workspace,8"
"SUPER,9,workspace,9"
"SUPER,0,workspace,10"
"SUPER,left,workspace,r-1"
"SUPER,right,workspace,r+1"
"SUPER_SHIFT,1,movetoworkspace,1"
"SUPER_SHIFT,2,movetoworkspace,2"
"SUPER_SHIFT,3,movetoworkspace,3"
"SUPER_SHIFT,4,movetoworkspace,4"
"SUPER_SHIFT,5,movetoworkspace,5"
"SUPER_SHIFT,6,movetoworkspace,6"
"SUPER_SHIFT,7,movetoworkspace,7"
"SUPER_SHIFT,8,movetoworkspace,8"
"SUPER_SHIFT,9,movetoworkspace,9"
"SUPER_SHIFT,0,movetoworkspace,10"
];
bindm = [
"SUPER, mouse:272, movewindow"
"SUPER, mouse:273, resizewindow"
];
env = [
"GDK_BACKEND,wayland,x11"
"QT_QPA_PLATFORM,wayland;xcb"
"SDL_VIDEODRIVER,wayland"
"CLUTTER_BACKEND,wayland"
"XDG_CURRENT_DESKTOP,Hyprland"
"XDG_SESSION_TYPE,wayland"
"XDG_SESSION_DESKTOP,Hyprland"
"QT_AUTO_SCREEN_SCALE_FACTOR,1"
"QT_WAYLAND_DISABLE_WINDOWDECORATION,1"
"NIXOS_OZONE_WL,1"
"WLR_NO_HARDWARE_CURSORS,1"
];
windowrule = [
"float, title:wlogout"
"idleinhibit always, vrmonitor"
"idleinhibit focus, steam_app"
];
workspace = [
"11, default:true"
];
general = {
gaps_out = 10;
resize_on_border = true;
layout = "master";
# "col.active_border" = "rgb(FFFF00) rgb(00FFFF) rgb(FF00FF)";
border_size = lib.mkDefault 5;
};
master = {
mfact = 0.7;
new_on_top = true;
};
misc = {
vrr = 2;
focus_on_activate = true;
};
};
# https://wiki.hyprland.org/Configuring/Variables/
extraConfig = ''
submap = resize
binde = ,right,resizeactive,10 0
binde = ,left,resizeactive,-10 0
binde = ,up,resizeactive,0 -10
binde = ,down,resizeactive,0 10
binde = ,k,resizeactive,0 -10
binde = ,j,resizeactive,0 10
binde = ,l,splitratio,0.05
binde = ,h,splitratio,-0.05
binde = SHIFT,l,splitratio,0.3
binde = SHIFT,h,splitratio,-0.3
bind = , escape, submap,reset
bind = , enter, submap,reset
bind = SUPER, R, submap,reset
bind = CONTROL, C, submap,reset
submap = reset
'';
}; };
style = ''
* {
min-height: 0;
}
window#waybar { wayland.windowManager.sway = mkIf cfg.sway {
font-size: small; enable = true;
background: rgba(0,0,0,0.8); };
}
#workspaces button { programs.swaylock = {
border-radius: 1rem; enable = true;
padding: 0px .5rem; package = pkgs.swaylock-effects;
margin: 0px .5rem 0px 0px; settings = {
} clock = true;
screenshots = true;
effect-scale = 0.5;
effect-blur = "10x10";
grace = 5;
};
};
#workspaces button.active { services.swayidle = {
background: rgba(255,255,255,0.8); enable = true;
padding: 0px 1rem; systemdTarget = "graphical-session.target";
color: black; events = [
} {
event = "before-sleep";
command = "${pkgs.swaylock-effects}/bin/swaylock";
}
{
event = "lock";
command = "${pkgs.swaylock-effects}/bin/swaylock";
}
];
timeouts = [
{
timeout = 300;
command = "${pkgs.swaylock-effects}/bin/swaylock -f";
}
{
timeout = 600;
command = "systemctl suspend";
}
];
};
#workspaces button.inactive:hover { services.mako = {
background: rgba(255,255,255,0.4); enable = true;
color: black; };
}
.modules-right widget label { programs.waybar = {
padding: 0 1rem; enable = true;
margin: 0 .5rem; settings = {
} mainBar = {
layer = "top";
position = "top";
height = 36;
modules-left = ["hyprland/workspaces" "hyprland/window"];
modules-right = ["mpris" "pulseaudio" "clock" "tray" "battery"];
clock = {
format = "📅 {:%a %b-%d %I:%M %p}";
};
pulseaudio = {
format-muted = "🔇 {volume}";
format = "{icon} {volume}";
format-icons.default = ["🔈" "🔉" "🔊"];
on-click = "${pkgs.pavucontrol}/bin/pavucontrol";
};
mpris = {
format = "{player_icon} {artist} - {title}";
format-paused = "{status_icon} {player_icon} {artist} - {title}";
player-icons = {
default = "";
mpd = "🎵";
kdeconnect = "";
};
status-icons = {
paused = "";
};
};
battery = {
format = "{icon} {capacity}%";
format-icons = ["🤏" "🪫" "🔋" "🔋"];
format-charging = "🔌 {capacity}%";
states = {
warning = 30;
critical = 15;
};
};
};
};
systemd = {
enable = true;
target = "graphical-session.target";
};
style = ''
* {
min-height: 0;
}
#tray { window#waybar {
min-width: 5rem; font-size: small;
} background: rgba(0,0,0,0.8);
''; }
};
#workspaces button {
border-radius: 1rem;
padding: 0px .5rem;
margin: 0px .5rem 0px 0px;
}
}]; #workspaces button.active {
background: rgba(255,255,255,0.8);
padding: 0px 1rem;
color: black;
}
#workspaces button.inactive:hover {
background: rgba(255,255,255,0.4);
color: black;
}
.modules-right widget label {
padding: 0 1rem;
margin: 0 .5rem;
}
#tray {
min-width: 5rem;
}
'';
};
}
];
}; };
} }

View file

@ -1,12 +1,15 @@
{ user }: { lib, pkgs, config, ... }: {user}: {
with lib; lib,
{ pkgs,
config,
...
}:
with lib; {
options.roles.work = { options.roles.work = {
enable = mkEnableOption "work packages"; enable = mkEnableOption "work packages";
}; };
config = mkIf config.roles.work.enable { config = mkIf config.roles.work.enable {
roles.email = { roles.email = {
enable = true; enable = true;
email = "tristan.beedell@cryoserver.com"; email = "tristan.beedell@cryoserver.com";
@ -20,68 +23,69 @@ with lib;
package = pkgs.vscode; package = pkgs.vscode;
}; };
home-manager.users.${user}.imports = [{ home-manager.users.${user}.imports = [
{
home.packages = with pkgs; [ home.packages = with pkgs; [
onedrive onedrive
kubectl kubectl
awscli2 awscli2
docker-compose docker-compose
minikube minikube
kubernetes-helm kubernetes-helm
thunderbird thunderbird
(import ../mkapp.nix "slack" { (import ../mkapp.nix "slack" {
inherit pkgs; inherit pkgs;
desktopName = "Slack"; desktopName = "Slack";
app-id = "mpagibdhafmlkgpemeicgogjnhclenoc"; app-id = "mpagibdhafmlkgpemeicgogjnhclenoc";
browser = "${brave}/opt/brave.com/brave/brave-browser"; browser = "${brave}/opt/brave.com/brave/brave-browser";
}) })
(import ../mkapp.nix "teams" { (import ../mkapp.nix "teams" {
inherit pkgs; inherit pkgs;
browser = "${brave}/opt/brave.com/brave/brave-browser"; browser = "${brave}/opt/brave.com/brave/brave-browser";
app-id = "cifhbcnohmdccbgoicgdjpfamggdegmo"; app-id = "cifhbcnohmdccbgoicgdjpfamggdegmo";
desktopName = "Microsoft Teams"; desktopName = "Microsoft Teams";
}) })
(pkgs.writeShellScriptBin "codex11" '' (pkgs.writeShellScriptBin "codex11" ''
NIXOS_OZONE_WL= ${pkgs.vscode}/bin/code $@ NIXOS_OZONE_WL= ${pkgs.vscode}/bin/code $@
'') '')
remmina remmina
];
gtk.gtk3.bookmarks = [
"file:///home/tristan/OneDrive/Documents/ OneDrive"
];
programs.vscode = {
extensions = with pkgs; [
vscode-extensions.ms-azuretools.vscode-docker
]; ];
userSettings = {
"aws.telemetry" = false; gtk.gtk3.bookmarks = [
"gitlens.telemetry.enabled" = false; "file:///home/tristan/OneDrive/Documents/ OneDrive"
"redhat.telemetry.enabled" = false; ];
programs.vscode = {
extensions = with pkgs; [
vscode-extensions.ms-azuretools.vscode-docker
];
userSettings = {
"aws.telemetry" = false;
"gitlens.telemetry.enabled" = false;
"redhat.telemetry.enabled" = false;
};
}; };
};
wayland.windowManager.hyprland = { wayland.windowManager.hyprland = {
extraConfig = '' extraConfig = ''
# === WORK MODULE === # === WORK MODULE ===
bind = SUPER, E, focuswindow, thunderbird bind = SUPER, E, focuswindow, thunderbird
bind = SUPER, t, focuswindow, brave-cifhbcnohmdccbgoicgdjpfamggdegmo-Profile_2 bind = SUPER, t, focuswindow, brave-cifhbcnohmdccbgoicgdjpfamggdegmo-Profile_2
''; '';
}; };
}
}];
nixpkgs.config.allowUnfreePredicate = pkg: builtins.elem (lib.getName pkg) [
# nonfree vscode required for dev containers
"vscode"
"steam-run"
]; ];
nixpkgs.config.allowUnfreePredicate = pkg:
builtins.elem (lib.getName pkg) [
# nonfree vscode required for dev containers
"vscode"
"steam-run"
];
networking = { networking = {
networkmanager = { networkmanager = {
plugins = [ pkgs.networkmanager-openvpn ]; plugins = [pkgs.networkmanager-openvpn];
}; };
}; };
@ -93,10 +97,9 @@ with lib;
enable = false; enable = false;
setSocketVariable = true; setSocketVariable = true;
daemon.settings = { daemon.settings = {
"userns-remap"= "default"; "userns-remap" = "default";
}; };
}; };
}; };
}; };
} }

View file

@ -1,5 +1,9 @@
{ config, pkgs, lib, ... }: {
let config,
pkgs,
lib,
...
}: let
my-deps = { my-deps = {
notify-send = "${pkgs.libnotify}/bin/notify-send"; notify-send = "${pkgs.libnotify}/bin/notify-send";
playerctl = "${pkgs.playerctl}/bin/playerctl"; playerctl = "${pkgs.playerctl}/bin/playerctl";
@ -21,8 +25,7 @@ let
hyprpicker = "${pkgs.hyprpicker}/bin/hyprpicker"; hyprpicker = "${pkgs.hyprpicker}/bin/hyprpicker";
sed = "${pkgs.gnused}/bin/sed"; sed = "${pkgs.gnused}/bin/sed";
}; };
in in {
{
programs.scripts = [ programs.scripts = [
{ {
name = "play-pause"; name = "play-pause";
@ -38,25 +41,33 @@ in
fi fi
''; '';
hotkeys = [ hotkeys = [
{ modifier = ""; key = "XF86AudioPlay"; } {
modifier = "";
key = "XF86AudioPlay";
}
]; ];
} }
{ {
name = "bwmenu"; name = "bwmenu";
text = '' text = ''
items="$(rbw list)" items="$(rbw list)"
echo "$items" | ${ my-deps.menu } | xargs -I_ rbw get _ | wl-copy echo "$items" | ${my-deps.menu} | xargs -I_ rbw get _ | wl-copy
''; '';
hotkeys = [{ key = "P"; }]; hotkeys = [{key = "P";}];
install = false; install = false;
} }
{ {
name = "bwotpmenu"; name = "bwotpmenu";
text = '' text = ''
items="$(rbw list)" items="$(rbw list)"
echo "$items" | ${ my-deps.menu } | xargs -I_ rbw code _ | wl-copy echo "$items" | ${my-deps.menu} | xargs -I_ rbw code _ | wl-copy
''; '';
hotkeys = [{ modifier = "SUPER_SHIFT"; key = "P"; }]; hotkeys = [
{
modifier = "SUPER_SHIFT";
key = "P";
}
];
install = false; install = false;
} }
{ {
@ -72,7 +83,10 @@ in
cat "$FILE" | wl-copy -t image/png cat "$FILE" | wl-copy -t image/png
''; '';
hotkeys = [ hotkeys = [
{ modifier = "SUPER_SHIFT"; key = "S"; } {
modifier = "SUPER_SHIFT";
key = "S";
}
]; ];
} }
{ {
@ -82,8 +96,16 @@ in
${my-deps.notify-send} "Brightness" -h int:value:$(light) -a brightness-down -t 1000 ${my-deps.notify-send} "Brightness" -h int:value:$(light) -a brightness-down -t 1000
''; '';
hotkeys = [ hotkeys = [
{ modifier = ""; key = "XF86MonBrightnessDown"; args = "10"; } {
{ modifier = "SHIFT"; key = "XF86MonBrightnessDown"; args = "1"; } modifier = "";
key = "XF86MonBrightnessDown";
args = "10";
}
{
modifier = "SHIFT";
key = "XF86MonBrightnessDown";
args = "1";
}
]; ];
install = false; install = false;
} }
@ -94,8 +116,16 @@ in
${my-deps.notify-send} "Brightness" -h int:value:$(light) -a brightness-up -t 1000 ${my-deps.notify-send} "Brightness" -h int:value:$(light) -a brightness-up -t 1000
''; '';
hotkeys = [ hotkeys = [
{ modifier = ""; key = "XF86MonBrightnessUp"; args = "10"; } {
{ modifier = "SHIFT"; key = "XF86MonBrightnessUp"; args = "1"; } modifier = "";
key = "XF86MonBrightnessUp";
args = "10";
}
{
modifier = "SHIFT";
key = "XF86MonBrightnessUp";
args = "1";
}
]; ];
install = false; install = false;
} }
@ -110,7 +140,7 @@ in
${my-deps.xargs} -I_ ${my-deps.hyprctl} dispatch focuswindow title:"_" ${my-deps.xargs} -I_ ${my-deps.hyprctl} dispatch focuswindow title:"_"
''; '';
hotkeys = [ hotkeys = [
{ key = "TAB"; } {key = "TAB";}
]; ];
} }
{ {
@ -118,18 +148,22 @@ in
text = '' text = ''
${my-deps.hyprpicker} | wl-copy && notify-send "Copied Colour" "$(wl-paste)" ${my-deps.hyprpicker} | wl-copy && notify-send "Copied Colour" "$(wl-paste)"
''; '';
hotkeys = [{ hotkeys = [
key = "G"; {
}]; key = "G";
}
];
} }
(lib.mkIf config.roles.mpd.enable { (lib.mkIf config.roles.mpd.enable {
name = "ncmpcpp"; name = "ncmpcpp";
text = '' text = ''
${my-deps.terminal} -e ncmpcpp ${my-deps.terminal} -e ncmpcpp
''; '';
hotkeys = [{ hotkeys = [
key = "M"; {
}]; key = "M";
}
];
install = false; install = false;
}) })
{ {
@ -137,9 +171,11 @@ in
text = '' text = ''
${my-deps.runmenu} ${my-deps.runmenu}
''; '';
hotkeys = [{ hotkeys = [
key = "D"; {
}]; key = "D";
}
];
install = false; install = false;
} }
{ {
@ -147,10 +183,12 @@ in
text = '' text = ''
hyprctl keyword misc:cursor_zoom_factor 2 hyprctl keyword misc:cursor_zoom_factor 2
''; '';
hotkeys = [{ hotkeys = [
modifier = "SUPER"; {
key = "EQUAL"; modifier = "SUPER";
}]; key = "EQUAL";
}
];
install = false; install = false;
} }
{ {
@ -158,10 +196,12 @@ in
text = '' text = ''
hyprctl keyword misc:cursor_zoom_factor 1 hyprctl keyword misc:cursor_zoom_factor 1
''; '';
hotkeys = [{ hotkeys = [
modifier = "SUPER"; {
key = "MINUS"; modifier = "SUPER";
}]; key = "MINUS";
}
];
install = false; install = false;
} }
{ {
@ -170,19 +210,25 @@ in
${my-deps.amixer} sset Master 5%+ && ${my-deps.amixer} sset Master unmute ${my-deps.amixer} sset Master 5%+ && ${my-deps.amixer} sset Master unmute
''; '';
hotkeys = [ hotkeys = [
{ key = "bracketright"; } {key = "bracketright";}
{ modifier = ""; key = "XF86AudioRaiseVolume"; } {
modifier = "";
key = "XF86AudioRaiseVolume";
}
]; ];
install = false; install = false;
} }
{ {
name = "lower-volume"; name = "lower-volume";
text = '' text = ''
${ my-deps.amixer } sset Master 5%- ${my-deps.amixer} sset Master 5%-
''; '';
hotkeys = [ hotkeys = [
{ key = "bracketleft"; } {key = "bracketleft";}
{ modifier = ""; key = "XF86AudioLowerVolume"; } {
modifier = "";
key = "XF86AudioLowerVolume";
}
]; ];
install = false; install = false;
} }
@ -192,8 +238,14 @@ in
${my-deps.playerctl} next ${my-deps.playerctl} next
''; '';
hotkeys = [ hotkeys = [
{ modifier = "SUPER_SHIFT"; key = "period"; } {
{ modifier = ""; key = "XF86AudioNext"; } modifier = "SUPER_SHIFT";
key = "period";
}
{
modifier = "";
key = "XF86AudioNext";
}
]; ];
install = false; install = false;
} }
@ -203,8 +255,14 @@ in
${my-deps.playerctl} previous ${my-deps.playerctl} previous
''; '';
hotkeys = [ hotkeys = [
{ modifier = "SUPER_SHIFT"; key = "comma"; } {
{ modifier = ""; key = "XF86AudioPrev"; } modifier = "SUPER_SHIFT";
key = "comma";
}
{
modifier = "";
key = "XF86AudioPrev";
}
]; ];
install = false; install = false;
} }
@ -212,7 +270,7 @@ in
name = "terminal"; name = "terminal";
text = my-deps.terminal; text = my-deps.terminal;
hotkeys = [ hotkeys = [
{ key = "RETURN"; } {key = "RETURN";}
]; ];
install = false; install = false;
} }
@ -220,7 +278,7 @@ in
name = "fileman"; name = "fileman";
text = my-deps.fileman; text = my-deps.fileman;
hotkeys = [ hotkeys = [
{ key = "O"; } {key = "O";}
]; ];
install = false; install = false;
} }
@ -237,7 +295,7 @@ in
esac esac
''; '';
hotkeys = [ hotkeys = [
{ key = "Z"; } {key = "Z";}
]; ];
install = false; install = false;
} }