nix/global/home.nix

434 lines
11 KiB
Nix

{ config, pkgs, name, lib, ... }:
# https://nix-community.github.io/home-manager/options.html
let
my-deps = {
notify-send = "${pkgs.libnotify}/bin/notify-send";
playerctl = "${pkgs.playerctl}/bin/playerctl";
grim = "${pkgs.grim}/bin/grim";
slurp = "${pkgs.slurp}/bin/slurp";
amixer = "${pkgs.alsa-utils}/bin/amixer";
swaybg = "${pkgs.swaybg}/bin/swaybg";
terminal = "${pkgs.foot}/bin/foot";
chafa = "${pkgs.chafa}/bin/chafa";
exiftool = "${pkgs.exiftool}/bin/exiftool";
wc = "${pkgs.coreutils}/bin/wc";
jq = "${pkgs.jq}/bin/jq";
hyprctl = "${pkgs.hyprland}/bin/hyprctl";
xargs = "${pkgs.findutils}/bin/xargs";
menu = "${config.programs.menu.package}${config.programs.menu.dmenuCommand}";
fileman = "${pkgs.pcmanfm}/bin/pcmanfm";
gawk = "${pkgs.gawk}/bin/awk";
};
lf-sixel = pkgs.callPackage ../custom/lf-sixel/. { };
in
{
programs.home-manager.enable = true;
home.username = "tristan";
home.homeDirectory = "/home/tristan";
xdg.userDirs.enable = true;
home.packages = (with pkgs; [
libnotify
dig
wl-clipboard
du-dust
htop
imv
libsixel
lf-sixel
yt-dlp
playerctl
swww
neofetch
obs-studio
selectdefaultapplication
inkscape
libsForQt5.okular
pavucontrol
qpwgraph
element-desktop
brave
gimp
quickemu
bitwarden
libsForQt5.kasts
libreoffice
gimp
(makeDesktopItem {
name = "logseq";
desktopName = "Logseq";
exec = "${logseq}/bin/logseq --ozone-platform-hint=auto --enable-features=WaylandWindowDecorations --disable-gpu";
})
]);
programs.fish = {
enable = true;
};
services.udiskie = {
enable = true;
notify = true;
};
gtk = {
enable = true;
theme = {
name = "Materia-dark";
package = pkgs.materia-theme;
};
iconTheme = {
name = "Vimix-Doder";
package = pkgs.vimix-icon-theme;
};
cursorTheme = {
name = "Vanilla-DMZ";
package = pkgs.vanilla-dmz;
size = 24;
};
gtk3.bookmarks = [
"file:///home/tristan/Documents"
"file:///home/tristan/Pictures/Screenshots"
"file:///home/tristan/Downloads"
];
};
programs.ncmpcpp = {
enable = true;
settings.mpd_host = "music.local";
bindings = [
{ key = "j"; command = "scroll_down"; }
{ key = "k"; command = "scroll_up"; }
{ key = "l"; command = "next_column"; }
{ key = "h"; command = "previous_column"; }
{ key = "J"; command = [ "select_item" "scroll_down" ]; }
{ key = "K"; command = [ "select_item" "scroll_up" ]; }
];
};
services.mpd-mpris.enable = true;
services.mpd-mpris.mpd = {
host = "music.local";
};
programs.mpv.enable = true;
programs.mpv.bindings = {
l = "seek 5";
h = "seek -5";
e = "add chapter 1";
b = "add chapter -1";
">" = "multiply speed 1.1";
"<" = "multiply speed 1/1.1";
"." = "frame-step";
"," = "frame-back-step";
"ctrl+n" = "playlist-next";
"ctrl+p" = "playlist-prev";
k = "add volume 2";
j = "add volume -2";
m = "cycle mute";
c = "cycle sub-visibility";
};
programs.mpv.scripts = [
pkgs.mpvScripts.mpris
];
programs.foot.settings = {
main = {
term = "xterm-256color";
font = "mono:size=12";
};
colors = {
foreground = "abb2bf";
background = "000000";
regular0 = "222222";
regular1 = "eb3a26";
regular2 = "7fbc59";
regular3 = "e9db65";
regular4 = "4781d1";
regular5 = "7d74bb";
regular6 = "50a2bd";
regular7 = "dcdccc";
bright0 = "666666";
bright1 = "e15d4e";
bright2 = "8fbd73";
bright3 = "e3d97e";
bright4 = "6791ce";
bright5 = "8f88be";
bright6 = "6caabf";
bright7 = "ffffff";
alpha = 0.8;
};
};
programs.rbw = {
enable = true;
settings = {
email = "tristan@tristans.cloud";
base_url = "https://vault.tristans.cloud";
};
};
programs.ssh.enable = true;
programs.ssh.matchBlocks = {
"git.tristans.cloud" = {
user = "git";
port = 2222;
};
"alpine" = {
hostname = "100.116.82.65";
user = "tristan";
};
};
programs.lf.enable = true;
programs.lf.package = lf-sixel;
programs.lf.keybindings = {
D = "trash";
"<f-2>" = ":rename";
"<enter>" = "open-with";
};
programs.lf.commands = {
trash = "%${pkgs.trash-cli}/bin/trash-put \"$fx\"";
open = "$set -f; ${pkgs.ranger}/bin/rifle -p 0 \"$fx\"";
open-with = ''''${{
set -f
${pkgs.ranger}/bin/rifle -l "$fx"
read -p "Open with: " method
${pkgs.ranger}/bin/rifle -p "$method" "$fx"
}}'';
bulk-rename = ''''${{
old="$(mktemp)"
new="$(mktemp)"
if [ -n "$fs" ]; then
fs="$(basename -a $fs)"
else
fs="$(ls)"
fi
printf '%s\n' "$fs" >"$old"
printf '%s\n' "$fs" >"$new"
$EDITOR "$new"
[ "$(wc -l < "$new")" -ne "$(wc -l < "$old")" ] && exit
paste "$old" "$new" | while IFS= read -r names; do
src="$(printf '%s' "$names" | cut -f1)"
dst="$(printf '%s' "$names" | cut -f2)"
if [ "$src" = "$dst" ] || [ -e "$dst" ]; then
continue
fi
mv -- "$src" "$dst"
done
rm -- "$old" "$new"
lf -remote "send $id unselect"
}}'';
};
programs.lf.previewer.source = pkgs.writeShellScript "preview" ''
image () {
${my-deps.chafa} "$1" -f sixel -s "$(($2/2))x$3" | sed 's/#/\n#/g'
${ my-deps.exiftool } "$1"
}
batted () {
cat "$@"
}
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
*.tgz|*.tar.gz) tar tzf "$1" ;;
*.tar.bz2|*.tbz2) tar tjf "$1" ;;
*.tar.txz|*.txz) xz --list "$1" ;;
*.tar) tar tf "$1" ;;
*.zip|*.jar|*.war|*.ear|*.oxt) unzip -l "$1" ;;
*.rar) unrar l "$1" ;;
*.md) glow -s dark "$1" ;;
*.7z) 7z l "$1" ;;
*.[1-8]) man "$1" | col -b ;;
*.o) nm "$1";;
*.torrent) transmission-show "$1" ;;
*.iso) iso-info --no-header -l "$1" ;;
*.odt|*.ods|*.odp|*.sxw) odt2txt "$1" ;;
*.doc) catdoc "$1" ;;
*.docx) docx2txt "$1" - ;;
*.xml|*.html) w3m -dump "$1";;
*.xls|*.xlsx)
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)
${ my-deps.exiftool } "$1"
;;
*.pdf)
[ ! -f "$CACHE.jpg" ] && \
pdftoppm -jpeg -f 1 -singlefile "$1" "$CACHE"
image "$CACHE.jpg" "$2" "$3" "$4" "$5"
;;
*.epub)
[ ! -f "$CACHE" ] && \
epub-thumbnailer "$1" "$CACHE" 1024
image "$CACHE" "$2" "$3" "$4" "$5"
;;
*.cbz|*.cbr|*.cbt)
[ ! -f "$CACHE" ] && \
comicthumb "$1" "$CACHE" 1024
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)
[ ! -f "$CACHE.jpg" ] && \
ffmpegthumbnailer -i "$1" -o "$CACHE.jpg" -s 0 -q 5
image "$CACHE.jpg" "$2" "$3" "$4" "$5"
;;
*.bmp|*.jpg|*.jpeg|*.png|*.xpm|*.webp|*.jfif)
image "$1" "$2" "$3" "$4" "$5"
;;
*.svg)
[ ! -f "$CACHE.jpg" ] && \
convert "$1" "$CACHE.jpg"
image "$CACHE.jpg" "$2" "$3" "$4" "$5"
;;
*.ino)
batted --language=cpp "$1"
;;
*)
batted "$1"
;;
esac
'';
home.file.".icons/default".source = "${pkgs.vanilla-dmz}/share/icons/Vanilla-DMZ";
programs.librewolf.enable = true;
programs.helix = {
enable = true;
languages = {
nix = {
auto-format = true;
language-server = {
command = "${pkgs.rnix-lsp}/bin/rnix-lsp";
};
};
go = {
auto-format = true;
language-server = {
command = "${pkgs.gopls}/bin/gopls";
};
};
typescript = {
auto-format = true;
language-server = {
command = "${pkgs.nodePackages.typescript-language-server}/bin/typescript-language-server";
};
};
};
};
home.file.".config/pipewire/pipewire.conf.d/raop-discover.conf".text = ''
context.modules = [
{
name = libpipewire-module-raop-discover
args = { }
}
]
'';
systemd.user.services = {
snapclient = {
Unit = {
Description = "Snapclient";
};
Service = {
ExecStart = "${pkgs.snapcast}/bin/snapclient -h music.local";
};
};
};
services.kdeconnect = {
enable = true;
indicator = true;
};
wayland.windowManager.sway = {
enable = true;
config = {
modifier = "Mod4";
input = {
"type:keyboard" = {
xkb_layout = "gb";
xkb_options = "caps:escape";
xkb_numlock = "enable";
};
"type:touchpad" = {
natural_scroll = "enabled";
tap = "enabled";
};
};
gaps = {
inner = 10;
};
keybindings =
let
modifier = config.wayland.windowManager.sway.config.modifier;
in
lib.mkOptionDefault {
"${modifier}+Shift+x" = "kill";
"${modifier}+d" = "exec ${pkgs.wofi}/bin/wofi --show drun";
"${modifier}+o" = "exec ${my-deps.fileman}";
XF86AudioRaiseVolume = "exec ${ my-deps.amixer } sset Master 5%+ && ${ my-deps.amixer } sset Master unmute";
XF86AudioLowerVolume = "exec ${ my-deps.amixer } sset Master 5%-";
# XF86AudioPlay = "exec ${ my-scripts.play-pause }/bin/play-pause";
XF86AudioNext = "exec ${ my-deps.playerctl } next";
XF86AudioPrev = "exec ${ my-deps.playerctl } previous";
# XF86MonBrightnessUp = "exec ${ my-scripts.brightness-up }/bin/brightness-up";
# XF86MonBrightnessDown = "exec ${ my-scripts.brightness-down }/bin/brightness-down";
# "${modifier}+P" = "exec ${ my-scripts.bwmenu }/bin/bwmenu";
# "${modifier}+SHIFT+P" = "exec ${ my-scripts.bwotpmenu }/bin/bwotpmenu";
# "${modifier}+SHIFT+S" = "exec ${ my-scripts.screenshot }/bin/screenshot";
"${modifier}+M" = "exec ${ my-deps.terminal } -e ncmpcpp";
"${modifier}+Z" = "exec ${pkgs.swaylock-effects}/bin/swaylock -f";
};
bars = [ ];
};
};
programs.qutebrowser = {
enable = true;
package = pkgs.qutebrowser-qt6;
searchEngines = {
DEFAULT = "https://search.brave.com/search?q={}";
w = "https://en.wikipedia.org/wiki/Special:Search?search={}&go=Go&ns0=1";
aw = "https://wiki.archlinux.org/?search={}";
nw = "https://nixos.wiki/index.php?search={}";
nixpkgs = "https://search.nixos.org/packages?channel=unstable&query={}";
};
settings = {
colors = {
webpage.preferred_color_scheme = "dark";
};
tabs = {
background = false;
indicator.width = 0;
favicons.scale = 2.0;
position = "left";
show = "always";
width = 40;
};
};
extraConfig = ''
c.tabs.padding = {
"bottom" : 10,
"left" : 5,
"right" : 5,
"top" : 10
}
'';
};
programs.pandoc = {
enable = true;
defaults = {
metadata = {
author = "Tristan Beedell";
};
pdf-engine = "xelatex";
};
};
}