nixos-config

NixOS configs for my systems
Log | Files | Refs

commit 2965d18e689adf194dedbac89d9a627865b8daf8
parent 36eaf6748060dbec05f3f630dfa9d4bb7adcb18a
Author: vin <vin@vineetk.net>
Date:   Wed,  8 Jan 2025 23:47:30 -0500

add qutebrowser config

Diffstat:
Mhome.nix | 269++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
1 file changed, 268 insertions(+), 1 deletion(-)

diff --git a/home.nix b/home.nix @@ -20,7 +20,6 @@ in { neofetch oathToolkit profanity - qutebrowser rclone transmission_4 tree @@ -334,6 +333,90 @@ in { }; }; + qutebrowser = { + enable = true; + + quickmarks = { + canvas = "https://floridapolytechnic.instructure.com"; + cams = "https://cams.floridapoly.org/student/login.asp"; + weather = "https://forecast.weather.gov/MapClick.php***REMOVED***"; + }; + + searchEngines = { + DEFAULT = "https://searx.demiurge.vpn/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.vpn') + +# 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("<Ctrl+q>", mode="normal") + +# source theme from nixos +config.source("theme.py") + +# source redirectors +config.source("redirectors.py") +''; + }; + tmux = { enable = true; @@ -469,6 +552,189 @@ set-option -sa terminal-features ',*:RGB' 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.vpn'), + "np.reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.vpn'), + "old.reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.vpn'), + "reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.vpn'), + "www.reddit.com": operator.methodcaller('setHost', 'redlib.demiurge.vpn'), + + "www.youtube.com": operator.methodcaller('setHost', 'invidious.demiurge.vpn'), + "youtube.com": operator.methodcaller('setHost', 'invidious.demiurge.vpn'), + "youtu.be": operator.methodcaller('setHost', 'invidious.demiurge.vpn'), + + "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 = { @@ -478,6 +744,7 @@ set-option -sa terminal-features ',*:RGB' "text/xml" = [ "qutebrowser.desktop" "librewolf.desktop" ]; }; }; + userDirs = { createDirectories = false; desktop = "$HOME/";