{ 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; [ # A minimal base scheme and a common build tool scheme-small latexmk # Packages from your research paper's preamble amsmath siunitx booktabs algorithm2e caption pslatex ec microtype cite url xcolor hyperref ] ); in { home = { username = "vin"; homeDirectory = "/home/vin"; stateVersion = "24.05"; packages = with pkgs; [ # document writing and viewing mupdf # needed for emacs docview 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 #tree #unzip #p7zip ripgrep nixfmt-rfc-style # 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 -r"; 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 = "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 = "vineet@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 = "kar@13f0.net"; realName = "Kar"; userName = "kar@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; aerc.enable = true; emacs.enable = true; foot = { enable = true; settings = { main = { # makes it easier when ssh'ing term = "xterm-256color"; font = "monospace:size=14"; dpi-aware = "yes"; pad = "10x10"; }; colors = let rmhash = s: builtins.substring 1 (-1) s; in { alpha = 0.9; background = rmhash colors.current.primary.background; foreground = rmhash colors.current.primary.foreground; regular0 = rmhash colors.current.normal.black; regular1 = rmhash colors.current.normal.red; regular2 = rmhash colors.current.normal.green; regular3 = rmhash colors.current.normal.yellow; regular4 = rmhash colors.current.normal.blue; regular5 = rmhash colors.current.normal.magenta; regular6 = rmhash colors.current.normal.cyan; regular7 = rmhash colors.current.normal.white; bright0 = rmhash colors.current.bright.black; bright1 = rmhash colors.current.bright.red; bright2 = rmhash colors.current.bright.green; bright3 = rmhash colors.current.bright.yellow; bright4 = rmhash colors.current.bright.blue; bright5 = rmhash colors.current.bright.magenta; bright6 = rmhash colors.current.bright.cyan; bright7 = rmhash colors.current.bright.white; }; }; }; git = { enable = true; difftastic = { enable = true; background = "dark"; color = "always"; display = "side-by-side-show-both"; }; extraConfig = { 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"; }; 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") ''; }; tmux = { enable = true; keyMode = "emacs"; mouse = false; prefix = "C-s"; terminal = "screen-256color"; extraConfig = '' # status bar set-option -g status-style bg=terminal set-option -g status-style fg=terminal set-option -g window-status-format "#[bg=terminal fg=terminal noreverse]#{window_index}:#{window_name}" set-option -g window-status-current-format "#[bg=black fg=terminal]#{window_index}:#{window_name}#{window_flags}" set-option -g status-right "%R %b %d %Y" # colorscheme stuff set-option -sa terminal-features ',*:RGB' # remove annoying escape delay set-option -g escape-time 0 ''; }; 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 # sxhkd if using bspwm and not i3 # unison poweralertd.enable = true; emacs = { enable = false; client.enable = true; startWithUserSession = true; extraOptions = [ "-f" "exwm-wm-mode" ]; }; redshift = { enable = false; dawnTime = "07:00"; duskTime = "00:00"; temperature.day = 6500; temperature.night = 4500; }; 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 = bg1 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 = bg1 c.colors.completion.odd.bg = bg1 c.colors.completion.item.selected.bg = bg2 c.colors.completion.item.selected.border.bottom = bg2 c.colors.completion.item.selected.border.top = bg2 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 = bg1 c.colors.completion.scrollbar.fg = fg0 c.colors.completion.scrollbar.bg = bg1 # 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 = bg1 c.colors.tabs.even.fg = fg1 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 = bg1 c.colors.tabs.odd.fg = fg1 c.colors.tabs.pinned.even.bg = bg2 c.colors.tabs.pinned.even.fg = fg1 c.colors.tabs.pinned.odd.bg = bg2 c.colors.tabs.pinned.odd.fg = fg1 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 = fg0 c.colors.tabs.selected.even.bg = bg0 c.colors.tabs.selected.even.fg = fg0 # Hints. c.colors.hints.bg = bg2 c.colors.hints.fg = fg0 c.colors.hints.match.fg = red c.hints.border = "2px solid " + bg1 # Messages. c.colors.messages.error.bg = bg1 c.colors.messages.error.border = bg1 c.colors.messages.error.fg = red c.colors.messages.info.bg = bg1 c.colors.messages.info.border = bg1 c.colors.messages.info.fg = blue c.colors.messages.warning.bg = bg1 c.colors.messages.warning.border = bg1 c.colors.messages.warning.fg = yellow # Download bar. c.colors.downloads.bar.bg = bg0 c.colors.downloads.error.bg = bg2 c.colors.downloads.error.fg = red c.colors.downloads.start.bg = bg2 c.colors.downloads.start.fg = blue c.colors.downloads.stop.bg = bg2 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 = bg1 # Context menu. c.colors.contextmenu.disabled.bg = bg1 c.colors.contextmenu.disabled.fg = fg1 c.colors.contextmenu.menu.bg = bg1 c.colors.contextmenu.menu.fg = fg0 c.colors.contextmenu.selected.bg = bg2 c.colors.contextmenu.selected.fg = blue # Prompts. c.colors.prompts.bg = bg1 c.colors.prompts.border = "2px solid " + bg0 c.colors.prompts.fg = fg0 c.colors.prompts.selected.bg = bg2 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/"; }; }; }