{ config, lib, pkgs, inputs, hostname, ... }: let colors = import ./colors.nix; isync-oauth2 = with pkgs; buildEnv { # takens from: # https://github.com/wentasah/nix-conf/raw/master/modules/mail.nix # https://github.com/NixOS/nixpkgs/issues/108480#issuecomment-1115108802 name = "isync"; paths = [ pkgs.isync ]; pathsToLink = [ "/bin" ]; nativeBuildInputs = [ makeWrapper ]; postBuild = '' wrapProgram "$out/bin/mbsync" \ --prefix SASL_PATH : "${cyrus_sasl}/lib/sasl2:${cyrus-sasl-xoauth2}/lib/sasl2" ''; }; uvtools = with pkgs; appimageTools.wrapType2 rec { pname = "UVtools"; version = "5.0.6"; src = fetchurl { url = "https://github.com/sn4k3/${pname}/releases/download/v${version}/${pname}_linux-x64_v${version}.AppImage"; hash = "sha256-T1E2+7YocWbspRrpWoexfLmm7LZSb4Nkw8WSBD6zTHs"; }; extraPkgs = pkgs: [ pkgs.icu ]; }; my-texlive = with pkgs; texlive.withPackages ( texlivePackages: with texlivePackages; [ scheme-small latexmk algorithm2e amsmath babel biber biblatex biblatex-apa biblatex-ieee booktabs caption capt-of circuitikz cite collection-fontsrecommended ec enumitem esdiff hyperref ifoddpage microtype pgfplots preview pslatex relsize siunitx url wrapfig xcolor ] ); in { home = { username = "vin"; stateVersion = "24.05"; packages = with pkgs; [ # document writing and viewing my-texlive # messaging profanity vesktop # email muchsync oauth2ms # hardware amdgpu_top # encryption age oath-toolkit # TODO actually use my yubikey? #age-plugin-yubikey #yubikey-agent #yubikey-manager # system utils file htop mlocate ncdu nixfmt-rfc-style ripgrep unison # X and desktop-related scrot sxiv xclip xwallpaper # desktop-related dmenu scrot xclip xsel # 3d printing prusa-slicer uvtools ]; preferXdgDirectories = true; sessionPath = [ "$HOME/bin" "$HOME/.local/bin" ]; sessionVariables = { EDITOR = "emacsclient -c"; VISUAL = "emacsclient -t"; PAGER = "less"; LESS = "-iR"; LESSHISTFILE = "/dev/null"; BROWSER = "qutebrowser"; GOPROXY = "direct"; AGE_KEY = "$HOME/.ssh/id_ed25519"; AGE_PUB = "$AGE_KEY.pub"; KASI_DIR = if hostname == "demiurge" then "/data/kasi" else "/home/vin/.kasi"; KASI_ENCRYPT = "age -R $AGE_PUB"; KASI_DECRYPT = "age -d -i $AGE_KEY"; KASI_EXT = "age"; KASI_CLIPBOARD = "wl-copy -o"; # w3m is only used for aerc html preview W3M_DIR = "/var/empty"; # backblaze on rclone RCLONE_FAST_LIST = 1; CRAWL_DIR = "$HOME/.local/share/crawl"; MOZ_ACCELERATED = 1; MOZ_WEBRENDER = 1; # broken qt6.9 rendering QTWEBENGINE_FORCE_USE_GBM = 0; }; shellAliases = { # shortened commands md = "mkdir -p"; e = "$EDITOR"; p = "$PAGER"; m = "aerc"; gc = "git clone"; cbc = "wl-copy -c; wl-copy -cp"; # default arguments to commands ls = "ls -F --color=auto"; rsync = "rsync --no-inc-recursive"; mpv = "mpv --save-position-on-quit"; wget = "wget --no-hsts"; ytdl = "noglob yt-dlp"; # shortened nix commands # the `-c $SHELL` is there because it defaults to bash even if # that's not my user shell nd = "nix develop -c $SHELL"; nr = "nix run"; ns = "nix search"; nsh = "nix shell"; }; }; fonts.fontconfig = { enable = true; defaultFonts = { emoji = [ ]; monospace = [ "Comic Code" ]; sansSerif = [ "Cantarell" ]; serif = [ "CMU Serif" ]; }; }; gtk = { enable = true; font.name = "monospace 11"; iconTheme.name = "rose-pine"; iconTheme.package = pkgs.rose-pine-icon-theme; theme.name = "Everblush"; theme.package = inputs.everblush-gtk.packages.x86_64-linux.default; }; dconf.settings = { "org/virt-manager/virt-manager/connections" = { autoconnect = [ "qemu:///system" ]; uris = [ "qemu:///system" ]; }; }; accounts.email = { maildirBasePath = "/data/mail"; accounts = { university = { address = "vsureshkumar3892@floridapoly.edu"; realName = "Vineet Kumar"; userName = "vsureshkumar3892@floridapoly.edu"; passwordCommand = "oauth2ms"; imap.host = "outlook.office365.com"; smtp = { host = "smtp-mail.outlook.com"; port = 587; tls.useStartTls = true; }; mbsync = { enable = true; create = "both"; expunge = "both"; remove = "both"; patterns = [ "*" "!Calendar*" "!Contacts*" "!Conversation*" "!Notes*" "!Journal*" "!Tasks*" ]; }; msmtp = { enable = true; extraConfig.auth = "xoauth2"; }; notmuch.enable = true; }; vineetk = { address = "me@vineetk.net"; realName = "Vineet Kumar"; userName = "me@vineetk.net"; passwordCommand = "kasi pass email/vineetk"; primary = true; imap.host = "mail.vineetk.net"; smtp.host = "mail.vineetk.net"; mbsync = { enable = true; create = "both"; expunge = "both"; remove = "both"; patterns = [ "*" ]; }; msmtp.enable = true; notmuch.enable = true; }; thirteen = { address = "me@13f0.net"; realName = "Kar"; userName = "me@13f0.net"; passwordCommand = "kasi pass email/13f0"; imap.host = "mail.vineetk.net"; smtp.host = "mail.vineetk.net"; mbsync = { enable = true; create = "both"; expunge = "both"; remove = "both"; patterns = [ "*" ]; }; msmtp.enable = true; notmuch.enable = true; }; }; }; programs = { home-manager.enable = true; emacs = { enable = true; extraPackages = epkgs: with epkgs; [ # profile startup of init.el esup # the theme I use kaolin-themes # fuzzy searching orderless # better vertical completion vertico # easy to identify scopes rainbow-delimiters # short descriptions of commands marginalia # like a collection of autocomplete commands consult # saves pressing C-x u a lot (before I found C-/) undo-tree # highlights TODO/BUG/FIXME/etc. keywords hl-todo # very good git magit magit-todos # better latex mode auctex # better pdf viewer pdf-tools # I love org-mode org org-pdftools org-present org-roam # rss reader elfeed # email reader notmuch # better llm frontend gptel # nix stuff nix-mode # ocaml formatting on save ocamlformat # rust stuff rust-mode # better terminal emulation eat # project tree templates skeletor ]; }; git = { enable = true; settings = { user = { email = "git@vineetk.net"; name = "vin"; signingkey = "ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIEvM0xCLziR+ZT/SYE1aZM6dklbw4fEC17TWqbADIZRH kou@demiurge"; }; sendemail = { suppresscc = "self"; annotate = true; }; format.signOff = true; pull.rebase = true; init.defaultBranch = "master"; http = { version = "HTTP/1.1"; postBuffer = 524288000; }; commit.gpgsign = false; gpg.format = "ssh"; "gpg \"ssh\"".allowedSignersFile = "/home/vin/.ssh/allowed_signers"; credential = { helper = "kasi"; "https://git.overleaf.com/".username = "git"; }; }; ignores = [ "*~" ".*~" "*.swp" ]; }; mbsync = { enable = true; package = isync-oauth2; }; msmtp.enable = true; mpv = { enable = true; # package = pkgs.mpv.override { # archiveSupport = false; # bluraySupport = false; # bs2bSupport = false; # cacaSupport = false; # cmsSupport = false; # dvdnavSupport = false; # javascriptSupport = false; # pipewireSupport = true; # pulseSupport = false; # rubberbandSupport = false; # waylandSupport = false; # zimgSupport = false; # }; bindings = { # I wish there was a more elegant way of setting Anime4K "Ctrl+1" = "no-osd change-list glsl-shaders set '~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_VL.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_VL.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl'; show-text 'Anime4K: Mode A (HQ)'"; "Ctrl+2" = "no-osd change-list glsl-shaders set '~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_Soft_VL.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_VL.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl'; show-text 'Anime4K: Mode B (HQ)'"; "Ctrl+3" = "no-osd change-list glsl-shaders set '~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Upscale_Denoise_CNN_x2_VL.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl'; show-text 'Anime4K: Mode C (HQ)'"; "Ctrl+4" = "no-osd change-list glsl-shaders set '~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_VL.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_VL.glsl:~~/shaders/Anime4K_Restore_CNN_M.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl'; show-text 'Anime4K: Mode A+A (HQ)'"; "Ctrl+5" = "no-osd change-list glsl-shaders set '~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_Soft_VL.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_VL.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Restore_CNN_Soft_M.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl'; show-text 'Anime4K: Mode B+B (HQ)'"; "Ctrl+6" = "no-osd change-list glsl-shaders set '~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Upscale_Denoise_CNN_x2_VL.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Restore_CNN_M.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl'; show-text 'Anime4K: Mode C+A (HQ)'"; "Ctrl+0" = "no-osd change-list glsl-shaders clr ''; show-text 'GLSL shaders cleared'"; }; config = { # sets default shaders to Anime4K Mode A (HQ). laptop's igpu doesn't like it though glsl-shaders = "~~/shaders/Anime4K_Clamp_Highlights.glsl:~~/shaders/Anime4K_Restore_CNN_VL.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_VL.glsl:~~/shaders/Anime4K_AutoDownscalePre_x2.glsl:~~/shaders/Anime4K_AutoDownscalePre_x4.glsl:~~/shaders/Anime4K_Upscale_CNN_x2_M.glsl"; ytdl-format = "bestvideo[height<=?1440]+bestaudio/best"; }; }; notmuch = { enable = true; extraConfig.user = { name = "Vineet Kumar"; primary_email = "me@vineetk.net"; other_email = "vineet@vineetk.net;vsureshkumar3892@floridapoly.edu;kar@13f0.net"; }; hooks = { postNew = '' notmuch tag +13f0 -- tag:unread and to:"*@13f0.net" notmuch tag +vineetk -- tag:unread and to:"*@vineetk.net" notmuch tag +university -- tag:unread and to:vsureshkumar3892@floridapoly.edu notmuch tag +openbsd_announce -inbox -- tag:unread and to:announce@openbsd.org notmuch tag +openbsd_arm -inbox -- tag:unread and to:arm@openbsd.org notmuch tag +gameoftrees -inbox -- tag:unread and to:gameoftrees@openbsd.org notmuch tag +openbsd_misc -inbox -- tag:unread and to:misc@openbsd.org notmuch tag +openbsd_ports -inbox -- tag:unread and to:ports@openbsd.org notmuch tag +openbsd_tech -inbox -- tag:unread and to:tech@openbsd.org notmuch tag +opensmtpd_misc -inbox -- tag:unread and to:misc@opensmtpd.org notmuch tag +oss_security -inbox -- tag:unread and to:oss-security@lists.openwall.com notmuch tag +tuhs -inbox -- tag:unread and to:tuhs@tuhs.org ''; #preNew = "mbsync -a"; }; }; qutebrowser = { enable = true; quickmarks = { canvas = "https://floridapolytechnic.instructure.com"; cams = "https://cams.floridapoly.org/student/login.asp"; entertrained = "https://entertrained.app/"; burst = "https://www.burst-type.pro/"; colemakcamp = "https://colemakcamp.github.io/"; colony = "https://cmdr-nowski.github.io/scuffed/#DRmd5xEUGQMOIU5nCVEG"; }; searchEngines = { DEFAULT = "https://searx.demiurge.epistemia/search?q={}"; ddg = "https://lite.duckduckgo.com/?q={}"; nw = "https://wiki.nixos.org/index.php?search={}"; aw = "https://wiki.archlinux.org/?search={}"; gw = "https://wiki.gentoo.org/?search={}"; }; settings = { content.javascript.enabled = false; url = { default_page = "about:blank"; start_pages = [ "about:blank" ]; }; colors.webpage = { preferred_color_scheme = "dark"; darkmode = { enabled = true; policy.images = "never"; }; }; zoom.default = "133%"; }; extraConfig = '' # javascript config.set('content.javascript.enabled', True, 'chrome-devtools://*') config.set('content.javascript.enabled', True, 'devtools://*') config.set('content.javascript.enabled', True, 'chrome://*/*') config.set('content.javascript.enabled', True, 'qute://*/*') config.set('content.javascript.enabled', True, 'floridapolytechnic.instructure.com') config.set('content.javascript.enabled', True, '*.floridapoly.edu') config.set('content.javascript.enabled', True, 'login.microsoftonline.com') config.set('content.javascript.enabled', True, 'www.microsoft365.com') config.set('content.javascript.enabled', True, 'flpoly-my.sharepoint.com') config.set('content.javascript.enabled', True, 'flpoly.sharepoint.com') config.set('content.javascript.enabled', True, 'teams.microsoft.com') config.set('content.javascript.enabled', True, 'ieeexplore.ieee.org') config.set('content.javascript.enabled', True, 'gitlab.com') config.set('content.javascript.enabled', True, 'cloud.binary.ninja') config.set('content.javascript.enabled', True, 'console.hetzner.cloud') config.set('content.javascript.enabled', True, '*.hetzner.com') config.set('content.javascript.enabled', True, '*.digikey.com') config.set('content.javascript.enabled', True, '*.demiurge.epistemia') # Allow locally loaded documents to access remote URLs. config.set('content.local_content_can_access_remote_urls', True, 'file:///home/vin/.local/share/qutebrowser/userscripts/*') config.set('content.local_content_can_access_file_urls', False, 'file:///home/vin/.local/share/qutebrowser/userscripts/*') # disable dark mode for some sites config.set('colors.webpage.darkmode.enabled', False, 'flpoly-my.sharepoint.com') config.set('colors.webpage.darkmode.enabled', False, 'flpoly.sharepoint.com') config.set('colors.webpage.darkmode.enabled', False, 'teams.microsoft.com') config.set('colors.webpage.darkmode.enabled', False, 'cloud.binary.ninja') config.set('colors.webpage.darkmode.enabled', False, 'git.vineetk.net') # prevent accidental exiting config.unbind("", mode="normal") # source theme from nixos config.source("theme.py") # source redirectors config.source("redirectors.py") ''; }; yt-dlp = { enable = true; settings = { format-sort = "res:1440,vcodec:vp9,acodec:opus"; embed-metadata = true; embed-subs = true; embed-thumbnail = true; merge-output-format = "mkv"; sub-langs = "en,-livechat"; no-windows-filenames = true; sponsorblock-remove = "sponsor,selfpromo,music_offtopic,-filler,-preview"; sponsorblock-mark = "filler,preview,intro,outro"; }; }; zsh = { enable = true; enableCompletion = true; defaultKeymap = "emacs"; history = { ignoreDups = true; ignoreSpace = true; save = 1000000; # 10k is inconvenient }; initContent = '' # auto-correct commands setopt correctall # fix meta/ctrl-backspace autoload -Uz select-word-style select-word-style bash ''; syntaxHighlighting = { enable = true; highlighters = [ "main" "brackets" "pattern" ]; patterns = { "rm -rf *" = "fg=white,bold,bg=red"; }; }; }; }; services = { # batsignal # borgmatic # dunst? # glance? # gpg-agent with ssh? # mpd and ncmpcpp? # pass-secret-service? # plan9port for plumbing? # recoll? # remmina? # screen-locker # unison poweralertd.enable = true; emacs = { enable = true; client.enable = true; startWithUserSession = true; }; redshift = { enable = false; dawnTime = "07:00"; duskTime = "00:00"; temperature.day = 6500; temperature.night = 4500; }; sxhkd = { enable = true; keybindings = { # reload sxhkd "super + Escape" = "pkill -USR1 -x sxhkd"; # BSPWM # quit/restart bspwm "super + alt + shift + ctrl + {e,r}" = "bspc {quit,wm -r}"; # close/kill window "super + shift + {q,k}" = "bspc node -{c,k}"; # toggle between tiled and monocle layout "super + m" = "bspc desktop -l next"; # send newest marked node to newest preselected node "super + y" = "bspc node newest.marked.local -n newest.!automatic.local"; # swap current and biggest window "super + g" = "bspc node -s biggest.window"; # STATE/FLAGS # set the window state "super + {t,shift + t,s,f}" = "bspc node -t {tiled,pseudo_tiled,floating,fullscreen}"; # set the node flags "super + ctrl + {m,x,y,z}" = "bspc node -g {marked,locked,sticky,private}"; # FOCUS/SWAP # focus the node in the given direction "super + {_,shift + }{n,e,o,i}" = "bspc node -{f,s} {west,south,north,east}"; # focus the node for the given path jump "super + {p,b,comma,period}" = "bspc node -f @{parent,brother,first,second}"; # focus the next/previous window in the current desktop "super + {_,shift + }c" = "bspc node -f {next,prev}.local.!hidden.window"; # focus the next/previous desktop in the current monitor "super + bracket{left,right}" = "bspc desktop -f {prev,next}.local"; # focus the last node/desktop "super + {grave,Tab}" = "bspc {node,desktop} -f last"; # focus or send to the given desktop "super + {_,shift + }{1-9,0}" = "bspc {desktop -f,node -d} '^{1-9,10}'"; # PRESELECT # preselect the direction "super + ctrl + {n,e,o,i}" = "bspc node -p {west,south,north,east}"; # preselect the ratio "super + ctrl + {1-9}" = "bspc node -o 0.{1-9}"; # cancel the preselection for the focused node "super + ctrl + space" = "bspc node -p cancel"; # cancel the preselection for the focused desktop "super + ctrl + shift + space" = "bspc query -N -d | xargs -I id -n 1 bspc node id -p cancel"; # MOVE/RESIZE # expand a window by moving one of its side outward "super + alt + {n,e,o,i}" = "bspc node -z {left -20 0,bottom 0 20,top 0 -20,right 20 0}"; # contract a window by moving one of its side inward "super + alt + shift + {n,e,o,i}" = "bspc node -z {right -20 0,top 0 20,bottom 0 -20,left 20 0}"; # move a floating window "super + {Left,Down,Up,Right}" = "bspc node -v {-20 0,0 20,0 -20,20 0}"; # program keybinds "super + Return" = "emacsclient -c"; "super + shift + Return" = "qutebrowser"; "super + p" = "dmenu_run"; "super + shift + b" = "kasimenu"; "super + shift + u" = "kasimenu user"; "super + shift + t" = "kasimenu_totp"; }; }; syncthing = { enable = true; settings = { devices = { demiurge = { addresses = [ "tcp://192.168.1.2:22000" "tcp://100.64.0.2:22000" ]; id = "Y2XNSCK-DQYYKWZ-DCKSCH2-QWRHQJV-5RLNTZF-RX2QOKL-RZ7J67Z-HGMK2Q2"; }; hastur = { addresses = [ "tcp://192.168.1.3:22000" "tcp://100.64.0.3:22000" ]; id = "ZJ55XB6-VJ62N4F-5LTRNV3-JMIFI3G-TKAI2BZ-42QAFNJ-QDMVJ6I-O7KHQQ6"; }; iphonebob = { addresses = [ "tcp://192.168.1.4:22000" "tcp://100.64.0.4:22000" ]; id = "ZD43FM5-WIZLODC-PR335XA-FQBSEQK-2ZZKWG3-UHTX57B-6VDVDCX-PPNI4AD"; }; }; folders = { "bin" = { devices = [ "demiurge" "hastur" ]; path = if hostname == "demiurge" then "/data/bin" else "/home/vin/bin"; }; "docs" = { devices = [ "demiurge" "hastur" ]; path = if hostname == "demiurge" then "/data/docs" else "/home/vin/docs"; }; "emacs.d" = { devices = [ "demiurge" "hastur" ]; path = "/home/vin/.emacs.d"; }; "kasi" = { devices = [ "demiurge" "hastur" ]; path = if hostname == "demiurge" then "/data/kasi" else "/home/vin/.kasi"; }; "lit" = { devices = [ "demiurge" "hastur" ]; path = if hostname == "demiurge" then "/data_wd/lit" else "/home/vin/lit"; }; "pics" = { devices = [ "demiurge" "hastur" ]; path = if hostname == "demiurge" then "/data_wd/pics" else "/home/vin/pics"; }; "iphone" = { devices = [ "demiurge" "hastur" "iphonebob" ]; path = if hostname == "demiurge" then "/data_wd/iphone" else "/home/vin/iphone"; }; }; }; }; }; xdg = { enable = true; configFile = { "qutebrowser/theme.py".text = '' # Colors. bg0 = "${colors.current.primary.background}" bg1 = "${colors.current.normal.black}" bg2 = "${colors.current.bright.black}" fg0 = "${colors.current.primary.foreground}" fg1 = "${colors.current.normal.white}" red = "${colors.current.normal.red}" blue = "${colors.current.normal.blue}" green = "${colors.current.normal.green}" yellow = "${colors.current.normal.yellow}" cyan = "${colors.current.normal.cyan}" magenta = "${colors.current.normal.magenta}" # --- Applying colors --- # # Completion menu. c.colors.completion.category.bg = bg0 c.colors.completion.category.border.top = bg0 c.colors.completion.category.border.bottom = bg0 c.colors.completion.category.fg = fg0 c.colors.completion.even.bg = bg0 c.colors.completion.odd.bg = bg0 c.colors.completion.item.selected.bg = bg1 c.colors.completion.item.selected.border.bottom = bg1 c.colors.completion.item.selected.border.top = bg1 c.colors.completion.item.selected.fg = blue c.colors.completion.item.selected.match.fg = blue c.colors.completion.match.fg = red c.colors.completion.odd.bg = bg0 c.colors.completion.scrollbar.fg = fg0 c.colors.completion.scrollbar.bg = bg0 # Statusline. c.colors.statusbar.caret.bg = bg0 c.colors.statusbar.caret.fg = magenta c.colors.statusbar.caret.selection.bg = bg0 c.colors.statusbar.caret.selection.fg = red c.colors.statusbar.command.bg = bg0 c.colors.statusbar.command.fg = fg0 c.colors.statusbar.insert.bg = bg0 c.colors.statusbar.insert.fg = green c.colors.statusbar.normal.bg = bg0 c.colors.statusbar.normal.fg = fg0 c.colors.statusbar.passthrough.bg = bg0 c.colors.statusbar.passthrough.fg = blue c.colors.statusbar.private.bg = bg0 c.colors.statusbar.private.fg = fg0 c.colors.statusbar.progress.bg = green c.colors.statusbar.url.error.fg = red c.colors.statusbar.url.fg = fg0 c.colors.statusbar.url.hover.fg = cyan c.colors.statusbar.url.success.http.fg = green c.colors.statusbar.url.success.https.fg = green c.colors.statusbar.url.warn.fg = yellow # Tabline. c.colors.tabs.bar.bg = bg0 c.colors.tabs.even.bg = bg0 c.colors.tabs.even.fg = fg0 c.colors.tabs.indicator.error = red c.colors.tabs.indicator.start = blue c.colors.tabs.indicator.stop = green c.colors.tabs.indicator.system = "rgb" c.colors.tabs.odd.bg = bg0 c.colors.tabs.odd.fg = fg0 c.colors.tabs.pinned.even.bg = bg1 c.colors.tabs.pinned.even.fg = fg0 c.colors.tabs.pinned.odd.bg = bg1 c.colors.tabs.pinned.odd.fg = fg0 c.colors.tabs.pinned.selected.even.bg = bg0 c.colors.tabs.pinned.selected.even.fg = green c.colors.tabs.pinned.selected.odd.bg = bg0 c.colors.tabs.pinned.selected.odd.fg = green c.colors.tabs.pinned.selected.even.bg = bg0 c.colors.tabs.pinned.selected.even.fg = blue c.colors.tabs.selected.odd.bg = bg0 c.colors.tabs.selected.odd.fg = fg1 c.colors.tabs.selected.even.bg = bg0 c.colors.tabs.selected.even.fg = fg1 # Hints. c.colors.hints.bg = bg1 c.colors.hints.fg = fg0 c.colors.hints.match.fg = red c.hints.border = "2px solid " + bg0 # Messages. c.colors.messages.error.bg = bg0 c.colors.messages.error.border = bg0 c.colors.messages.error.fg = red c.colors.messages.info.bg = bg0 c.colors.messages.info.border = bg0 c.colors.messages.info.fg = blue c.colors.messages.warning.bg = bg0 c.colors.messages.warning.border = bg0 c.colors.messages.warning.fg = yellow # Download bar. c.colors.downloads.bar.bg = bg0 c.colors.downloads.error.bg = bg1 c.colors.downloads.error.fg = red c.colors.downloads.start.bg = bg1 c.colors.downloads.start.fg = blue c.colors.downloads.stop.bg = bg1 c.colors.downloads.stop.fg = green # Keyhints. c.colors.keyhint.bg = bg0 c.colors.keyhint.fg = fg0 c.colors.keyhint.suffix.fg = yellow # Default color for about:blank pages (or if the css didn't specify) #c.colors.webpage.bg = bg0 # Context menu. c.colors.contextmenu.disabled.bg = bg0 c.colors.contextmenu.disabled.fg = fg0 c.colors.contextmenu.menu.bg = bg0 c.colors.contextmenu.menu.fg = fg0 c.colors.contextmenu.selected.bg = bg1 c.colors.contextmenu.selected.fg = blue # Prompts. c.colors.prompts.bg = bg0 c.colors.prompts.border = "2px solid " + bg0 c.colors.prompts.fg = fg0 c.colors.prompts.selected.bg = bg1 c.colors.prompts.selected.fg = blue ''; "qutebrowser/redirectors.py".text = '' # I don't remember who I took this from. probably in qutebrowser m$hub issues import operator, re, typing from urllib.parse import urljoin from qutebrowser.api import interceptor, message from PyQt6.QtCore import QUrl def _pastebin_redir(url: QUrl) -> bool: p = url.path().strip('/') if p.isalnum(): url.setPath(urljoin("/raw/", p)) return True return False # Any return value other than a literal 'False' means we redirected REDIRECT_MAP = { "new.reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.epistemia'), "np.reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.epistemia'), "old.reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.epistemia'), "reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.epistemia'), "www.reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.epistemia'), "www.youtube.com": operator.methodcaller('setHost', 'invidious.demiurge.epistemia'), "youtube.com": operator.methodcaller('setHost', 'invidious.demiurge.epistemia'), "youtu.be": operator.methodcaller('setHost', 'invidious.demiurge.epistemia'), "imgur.com": operator.methodcaller('setHost', 'rimgo.bloat.cat'), "i.imgur.com": operator.methodcaller('setHost', 'rimgo.bloat.cat'), # Causes an infinite loop if the paste does not exist... "pastebin.com": _pastebin_redir, } # type: typing.Dict[str, typing.Callable[..., typing.Optional[bool]]] def int_fn(info: interceptor.Request): """Block the given request if necessary.""" if (info.resource_type != interceptor.ResourceType.main_frame or info.request_url.scheme() in {"data", "blob"}): return url = info.request_url redir = REDIRECT_MAP.get(url.host()) if redir is not None and redir(url) is not False: message.info("Redirecting to " + url.toString()) info.redirect(url) interceptor.register(int_fn) ''; }; mimeApps = { enable = true; defaultApplications = { "application/pdf" = [ "zathura.desktop" ]; "application/xhtml+xml" = [ "qutebrowser.desktop" "librewolf.desktop" ]; "text/html" = [ "qutebrowser.desktop" "librewolf.desktop" ]; "text/xml" = [ "qutebrowser.desktop" "librewolf.desktop" ]; }; }; userDirs = { createDirectories = false; desktop = "$HOME/"; documents = "$HOME/docs"; download = "$HOME/tmp"; music = "$HOME/music"; pictures = "$HOME/pics"; publicShare = "$HOME/"; templates = "$HOME/"; videos = "$HOME/"; }; }; xsession = { enable = true; profileExtra = '' export _JAVA_AWT_WM_NONREPARENTING=1 ''; windowManager.bspwm = { enable = true; monitors = { DP-4 = [ "I" "II" "III" "IV" "V" "VI" "VII" "VIII" "IX" "X" ]; eDP-1 = [ "I" "II" "III" "IV" "V" "VI" "VII" "VIII" "IX" "X" ]; }; settings = { border_width = 2; window_gap = 0; gapless_monocle = true; split_ratio = 0.52; }; startupPrograms = [ "emacsclient -r" "qutebrowser" "xwallpaper --zoom ~/pics/wp/elite_milky_way_below2.png" "xsetwacom set \"Wacom One by Wacom S Pen stylus\" MapToOutput 2304x1440+560+0" ]; }; }; }