From 765fe566fce5a3dfc5cef4a3a8fc2cb999823ebc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9ana=20=E6=B1=9F?= Date: Wed, 26 Nov 2025 09:06:36 +0800 Subject: [PATCH 1/4] neovim/luasnip: snippet system -> stdenv.hostPlatform.system --- .config/nvim/plugin/luasnip.lua | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/.config/nvim/plugin/luasnip.lua b/.config/nvim/plugin/luasnip.lua index bd6ab457..65fe4532 100644 --- a/.config/nvim/plugin/luasnip.lua +++ b/.config/nvim/plugin/luasnip.lua @@ -5,8 +5,8 @@ local cr = function() return t { "", "" } end local i = luasnip.insert_node local f = luasnip.function_node -local function datetime() return os.date('%Y-%m-%d %H:%M:%S') end -local function date() return os.date('%Y-%m-%d') end +local function datetime() return os.date("%Y-%m-%d %H:%M:%S") end +local function date() return os.date("%Y-%m-%d") end local function quoted(s) return '"' .. s .. '"' end luasnip.add_snippets("typst", { @@ -57,5 +57,9 @@ luasnip.add_snippets("ruler", { }), }) +luasnip.add_snippets("nix", { + s("system", { t("stdenv.hostPlatform.system") }), +}) + local haskell_snippets = require("haskell-snippets").all luasnip.add_snippets("haskell", haskell_snippets, { key = "haskell" }) From bc2a414ef520f7931acd37a4e9e1200ebb6ca6ec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9ana=20=E6=B1=9F?= Date: Wed, 26 Nov 2025 14:37:33 +0800 Subject: [PATCH 2/4] Reapply "vanadium/zen-browser: init" This reverts commit c2c655981af0fc900cf73fc5b4dcc8561e6fd836. --- nix/configurations/vanadium.nix | 5 + .../vanadium/home/zen-browser.nix | 165 +++++++++++++++++ nix/homeModules/common/zen-browser.nix | 166 ++++++++++++++++++ nix/overlays/zen-browser.nix | 19 ++ npins/sources.json | 13 ++ 5 files changed, 368 insertions(+) create mode 100644 nix/configurations/vanadium/home/zen-browser.nix create mode 100644 nix/homeModules/common/zen-browser.nix create mode 100644 nix/overlays/zen-browser.nix diff --git a/nix/configurations/vanadium.nix b/nix/configurations/vanadium.nix index 80919604..7234fbdf 100644 --- a/nix/configurations/vanadium.nix +++ b/nix/configurations/vanadium.nix @@ -56,6 +56,7 @@ in ../overlays/eepy.nix ../overlays/calibre-no-mime.nix ../overlays/fcitx5-table-extra-taiwanese.nix + ../overlays/zen-browser.nix ../overlays/iosevka.nix ../packages/overlay.nix @@ -152,6 +153,7 @@ in ./vanadium/home/programs.nix ./vanadium/home/misc.nix + ./vanadium/home/zen-browser.nix ./vanadium/home/firefox.nix ./vanadium/home/xmobar.nix @@ -170,6 +172,7 @@ in ../homeModules/common/atuin.nix ../homeModules/common/direnv.nix ../homeModules/common/feh.nix + ../homeModules/common/zen-browser.nix ../homeModules/common/firefox.nix ../homeModules/common/fzf.nix ../homeModules/common/git.nix @@ -191,6 +194,8 @@ in # (sources.agenix + "/modules/age-home.nix") sources.wired-notify.asFlake.homeManagerModules.default + + sources.zen-browser.asFlake.homeModules.twilight ]; } diff --git a/nix/configurations/vanadium/home/zen-browser.nix b/nix/configurations/vanadium/home/zen-browser.nix new file mode 100644 index 00000000..beee8d6a --- /dev/null +++ b/nix/configurations/vanadium/home/zen-browser.nix @@ -0,0 +1,165 @@ +{ + pkgs, + config, + ... +}: +let + inherit (pkgs) nur; +in +{ + programs.zen-browser = { + enable = true; + + policies.SearchEngines.Add = [ + # Forges + { + Name = "GitHub"; + Alias = "@gh"; + IconURL = "https://github.com/favicon.ico"; + Description = "Your code yum yum"; + URLTemplate = "https://github.com/search?q={searchTerms}&type=repositories"; + } + { + Name = "GitHub (Code Search)"; + Alias = "@ghc"; + IconURL = "https://github.com/favicon.ico"; + Description = "Your code yum yum"; + URLTemplate = "https://github.com/search?q={searchTerms}&type=code"; + } + { + Name = "Codeberg"; + Alias = "@cb"; + IconURL = "https://codeberg.org/favicon.ico"; + Description = "Software development, but free!"; + URLTemplate = "https://codeberg.org/explore/repos?q={searchTerms}"; + } + { + Name = "?C"; + Alias = "@cc"; + IconURL = "https://git.confusedcompiler.org/favicon.ico"; + URLTemplate = "https://git.confusedcompiler.org/explore/repos?q={searchTerms}"; + } + + # Nix{,OS,pkgs} + { + Name = "NixOS Search (Package)"; + Alias = "@np"; + IconURL = "https://nixos.org/favicon.ico"; + Description = "Search in nixpkgs"; + URLTemplate = "https://search.nixos.org/packages?query={searchTerms}"; + } + { + Name = "NixOS Search (Options)"; + Alias = "@no"; + IconURL = "https://nixos.org/favicon.ico"; + Description = "Search in NixOS options"; + URLTemplate = "https://search.nixos.org/options?query={searchTerms}"; + } + + # Haskell + { + Name = "Flora"; + Alias = "@hs"; + IconURL = "https://flora.pm/static/icons/favicon-32x32.png"; + URLTemplate = "https://flora.pm/search?q={searchTerms}"; + } + + # Discourse + { + Name = "NixOS Discourse"; + Alias = "@nd"; + IconURL = "https://nixos.org/favicon.ico"; + URLTemplate = "https://discourse.nixos.org/search?q={searchTerms}"; + } + { + Name = "Framework Discourse"; + Alias = "@fd"; + IconURL = "https://frame.work/favicon.ico"; + URLTemplate = "https://community.frame.work/search?q={searchTerms}"; + } + + # Misc + { + Name = "YouTube"; + Alias = "@yt"; + IconURL = "https://youtube.com/favicon.ico"; + SuggestURLTemplate = "http://suggestqueries.google.com/complete/search?q={searchTerms}&ds=yt"; + URLTemplate = "https://www.youtube.com/results?search_query={searchTerms}"; + } + { + Name = "Genius"; + Alias = "@geni"; + IconURL = "https://genius.com/favicon.ico"; + URLTemplate = "https://genius.com/search?q={searchTerms}"; + } + ]; + + profiles = { + default = { + settings = { + # "full-screen-api.ignore-widgets" = true; # limit fullscreen mode to window + }; + userChrome = '' + /* monofont tweak */ + #statuspanel-label { + font-family: monospace; + } + .urlbar-input-box { + font-family: monospace; + } + ''; + extensions.packages = + let + addons = nur.repos.rycee.firefox-addons; + in + [ + addons.sponsorblock + addons.return-youtube-dislikes + addons.consent-o-matic + ]; + }; + + junk = { + id = 1; + inherit (config.programs.zen-browser.profiles.default) + settings + userChrome + ; + + extensions.packages = + let + addons = nur.repos.rycee.firefox-addons; + in + [ addons.multi-account-containers ]; + + containers = { + raisin = { + color = "purple"; + icon = "fruit"; + id = 1; + }; + pomme = { + color = "red"; + icon = "fruit"; + id = 2; + }; + }; + }; + + # Isolate it because it's proprietary + tampermonkey = { + id = 2; + inherit (config.programs.zen-browser.profiles.default) + settings + userChrome + ; + + extensions.packages = + let + addons = nur.repos.rycee.firefox-addons; + in + [ addons.tampermonkey ]; + }; + }; + }; +} diff --git a/nix/homeModules/common/zen-browser.nix b/nix/homeModules/common/zen-browser.nix new file mode 100644 index 00000000..b490d95b --- /dev/null +++ b/nix/homeModules/common/zen-browser.nix @@ -0,0 +1,166 @@ +{ + pkgs, + config, + lib, + ... +}: +let + inherit (pkgs) nur; + + cfg = config.programs.zen-browser; +in +{ + programs.zen-browser = { + # https://mozilla.github.io/policy-templates + # The following have more complex logic, keep them as policies and not profiles + policies = { + RequestedLocales = [ + "fr-FR" # for fuck sake stop showing me translated version of French gov sites + "zh-TW" + "en-US" + ]; + + SearchEngines = { + Remove = [ + "Google" + "Bing" + "DuckDuckGo" + "Qwant" + "eBay" + "Perplexity" + ]; + Default = "Brave"; + Add = [ + { + Name = "Brave"; + Alias = "@br"; + URLTemplate = "https://search.brave.com/search?q={searchTerms}&source=web"; + SuggestURLTemplate = "https://suggestqueries.google.com/complete/search?q={searchTerms}"; + } + ]; + }; + NoDefaultBookmarks = true; + DisplayMenuBar = "never"; + DisplayBookmarksToolbar = "never"; + DNSOverHTTPS = { + Enabled = false; + }; + }; + + # https://searchfox.org/mozilla-central/source/browser/components/enterprisepolicies/Policies.sys.mjs + # Some policies can be rewritten to profiles configuration + # + # TODO: try out the "locked" semantic from zen + # https://github.com/0xc000022070/zen-browser-flake/tree/main#preferences + profiles.default = { + settings = { + "toolkit.legacyUserProfileCustomizations.stylesheets" = true; + "browser.tabs.loadInBackground" = true; + "browser.ctrlTab.sortByRecentlyUsed" = false; + "layout.css.devPixelsPerPx" = 1.1; + + # open links in new window + # this works a lot better with xmonad where I have a bunch of windows + "browser.link.open_newwindow" = 2; + + # Sponsored crap + # Yes + "browser.newtabpage.activity-stream.showSearch" = true; + "browser.newtabpage.activity-stream.feeds.topsites" = true; + # No + "browser.newtabpage.activity-stream.showSponsoredTopSites" = false; + "browser.newtabpage.activity-stream.feeds.section.highlights" = false; + "browser.newtabpage.activity-stream.feeds.system.topstories" = false; + "browser.newtabpage.activity-stream.feeds.section.topstories" = false; + "browser.newtabpage.activity-stream.showSponsored" = false; + + # URL + # Yes + "browser.urlbar.suggest.quicksuggest.nonsponsored" = true; + # No + "browser.urlbar.suggest.quicksuggest.sponsored" = false; + + # Pasword manager + "signon.rememberSignons" = false; + "services.passwordSavingEnabled" = false; + "pref.privacy.disable_button.view_passwords" = false; + + # Hardware acceleration + "layers.acceleration.disabled" = false; + + # Screenshot + "screenshots.browser.component.enabled" = true; + + # Recommendations + "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.addons" = false; + "browser.newtabpage.activity-stream.asrouter.userprefs.cfr.features" = false; + "extensions.htmlaboutaddons.recommendations.enabled" = false; # Addons + + # Onboarding + "browser.aboutwelcome.enabled" = false; + + # AI crap + "browser.ml.chat.enabled" = false; + "browser.ml.chat.page" = false; + "browser.ml.chat.shortcuts" = false; + "browser.ml.chat.sidebar" = false; + + # Prevent WebRTC leak + # https://mullvad.net/en/help/webrtc + "media.peerconnection.enabled" = false; + }; + + extensions.packages = + let + addons = nur.repos.rycee.firefox-addons; + in + [ + addons.ublock-origin + addons.privacy-badger + addons.user-agent-string-switcher + + /* + Here's to you who want to remove news feed eradicator because you find it annoying: + It is here to annoy you so it is less likely for you to be on the agency inversion path. + DO NOT REMOVE IT. I repeat, DO NOT REMOVE IT. + + If you think it's annoying, go do some jump rope, sing, live. + */ + addons.news-feed-eradicator # did you read the comment above? + addons.multi-account-containers + ]; + }; + }; + + xdg.mimeApps = + let + associations = builtins.listToAttrs ( + map + (name: { + inherit name; + value = cfg.package.meta.desktopFileName; + }) + [ + "application/x-extension-shtml" + "application/x-extension-xhtml" + "application/x-extension-html" + "application/x-extension-xht" + "application/x-extension-htm" + "x-scheme-handler/unknown" + "x-scheme-handler/mailto" + "x-scheme-handler/chrome" + "x-scheme-handler/about" + "x-scheme-handler/https" + "x-scheme-handler/http" + "application/xhtml+xml" + "application/json" + "text/plain" + "text/html" + ] + ); + in + lib.mkIf cfg.enable { + associations.added = associations; + defaultApplications = associations; + }; +} diff --git a/nix/overlays/zen-browser.nix b/nix/overlays/zen-browser.nix new file mode 100644 index 00000000..f4ffa489 --- /dev/null +++ b/nix/overlays/zen-browser.nix @@ -0,0 +1,19 @@ +let + sources = import ../../npins; +in +final: _: +let + zenpkgs = sources.zen-browser.asFlake.packages.${final.system}; +in +{ + # TODO: upstream default is broken? They default to zen-twilight + "zen-beta-unwrapped" = zenpkgs."beta-unwrapped"; + "zen-twilight-unwrapped" = zenpkgs."twilight-unwrapped"; + "zen-twilight-official-unwrapped" = zenpkgs."twilight-official-unwrapped"; + + # default + "zen-beta" = zenpkgs."beta"; + + "zen-twilight" = zenpkgs."twilight"; + "zen-twilight-official" = zenpkgs."twilight-official"; +} diff --git a/npins/sources.json b/npins/sources.json index a1bb31dc..d7c39ceb 100644 --- a/npins/sources.json +++ b/npins/sources.json @@ -368,6 +368,19 @@ "revision": "6a96aa2066d8ad945f2323b63dc217081ef51168", "url": "https://github.com/Toqozz/wired-notify/archive/6a96aa2066d8ad945f2323b63dc217081ef51168.tar.gz", "hash": "02b8pva12rzcciq5lavwk824xaym28igfsva4kikvd7mxs06ccwx" + }, + "zen-browser": { + "type": "Git", + "repository": { + "type": "GitHub", + "owner": "0xc000022070", + "repo": "zen-browser-flake" + }, + "branch": "main", + "submodules": false, + "revision": "ef951ed2d976bcd1f57a09f358fdda9fa9425018", + "url": "https://github.com/0xc000022070/zen-browser-flake/archive/ef951ed2d976bcd1f57a09f358fdda9fa9425018.tar.gz", + "hash": "1s85cxiwhzwqgbazcgv12xqdlk1nkfynv23r9zj8gip4j6pznr4z" } }, "version": 5 From 4c4ed165b36d58d47b0173ac42ad78372ff6cd5c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9ana=20=E6=B1=9F?= Date: Wed, 26 Nov 2025 14:58:25 +0800 Subject: [PATCH 3/4] vanadium/xmonad: handle zen and launch it instead of firefox --- nix/configurations/vanadium/home/xmonad/xmonad.hs | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/nix/configurations/vanadium/home/xmonad/xmonad.hs b/nix/configurations/vanadium/home/xmonad/xmonad.hs index a41e765d..76182ee5 100644 --- a/nix/configurations/vanadium/home/xmonad/xmonad.hs +++ b/nix/configurations/vanadium/home/xmonad/xmonad.hs @@ -95,7 +95,7 @@ isEvolutionComposer = ] isFirefox :: Query Bool -isFirefox = className =? "firefox" +isFirefox = className =? "firefox" <||> className ^? "zen" isSpotify :: Query Bool isSpotify = isFirefox <&&> title ~? "Spotify" @@ -112,9 +112,11 @@ isSignal = className =? "Signal" isElement :: Query Bool isElement = isFirefox <&&> title ~? "Element" --- This changes depending on the locale of the browser :/ isFirefoxPip :: Query Bool -isFirefoxPip = isFirefox <&&> title =? "Incrustation vidéo" +isFirefoxPip = + isFirefox + -- This changes depending on the locale of the browser :/ + <&&> (title =? "Incrustation vidéo" <||> title =? "Picture-in-Picture") isPavucontrol :: Query Bool isPavucontrol = className =? "pavucontrol" @@ -223,7 +225,9 @@ myStartupHook = do -- - setting `home.sessionVariable` (home-manager) would only effect shells, probably due to the order of launched processes blah blah -- - setting `environment.sessionVariables` (NixOS) would make my set up less portable putEnv "GLFW_IM_MODULE=ibus" -- Make sure kitty knows how to talk to fcitx - putEnv "MOZ_USE_XINPUT2=1" -- Force touchpad for firefox + + -- TODO: doesn't work for firefox nor for zen since 145.0 + -- putEnv "MOZ_USE_XINPUT2=1" -- Force touchpad for firefox removedKeybinds :: [(KeyMask, KeySym)] removedKeybinds = @@ -309,7 +313,7 @@ keybinds = ) -- Launcher - ++ (let launchFirefox = "if type firefox; then firefox; else firefox-esr; fi" + ++ (let launchFirefox = "zen" launchDmenu = "dmenu_run -i -fn \"Iosevka-14\" -nb \"#36363a\" -nf \"#e2e2e4\" -sb \"#f7f7f8\" -sf \"#36363a\" -l 10" lock = "xscreensaver-command -lock" in [ ((controlMask .|. altMask, xK_m), namedScratchpadAction myScratchpads "cmus" ) From 1bec3a93a0dba88174f46b9e5919e6f9e345a69c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?L=C3=A9ana=20=E6=B1=9F?= Date: Wed, 26 Nov 2025 15:12:24 +0800 Subject: [PATCH 4/4] vanadium: improve browser xdg configuration --- nix/homeModules/common/firefox.nix | 2 +- nix/homeModules/common/zen-browser.nix | 41 +++++++++++--------------- 2 files changed, 18 insertions(+), 25 deletions(-) diff --git a/nix/homeModules/common/firefox.nix b/nix/homeModules/common/firefox.nix index d479571b..853888c9 100644 --- a/nix/homeModules/common/firefox.nix +++ b/nix/homeModules/common/firefox.nix @@ -140,7 +140,7 @@ in "x-scheme-handler/unknown" = "firefox.desktop"; }; in - lib.mkIf cfg.enable { + lib.mkIf (cfg.enable && !config.programs.zen-browser.enable) { enable = true; associations.added = associations; defaultApplications = associations; diff --git a/nix/homeModules/common/zen-browser.nix b/nix/homeModules/common/zen-browser.nix index b490d95b..c6681318 100644 --- a/nix/homeModules/common/zen-browser.nix +++ b/nix/homeModules/common/zen-browser.nix @@ -134,30 +134,23 @@ in xdg.mimeApps = let - associations = builtins.listToAttrs ( - map - (name: { - inherit name; - value = cfg.package.meta.desktopFileName; - }) - [ - "application/x-extension-shtml" - "application/x-extension-xhtml" - "application/x-extension-html" - "application/x-extension-xht" - "application/x-extension-htm" - "x-scheme-handler/unknown" - "x-scheme-handler/mailto" - "x-scheme-handler/chrome" - "x-scheme-handler/about" - "x-scheme-handler/https" - "x-scheme-handler/http" - "application/xhtml+xml" - "application/json" - "text/plain" - "text/html" - ] - ); + associations = lib.genAttrs [ + "application/x-extension-shtml" + "application/x-extension-xhtml" + "application/x-extension-html" + "application/x-extension-xht" + "application/x-extension-htm" + # "x-scheme-handler/unknown" + # "x-scheme-handler/mailto" + "x-scheme-handler/chrome" + "x-scheme-handler/about" + "x-scheme-handler/https" + "x-scheme-handler/http" + "application/xhtml+xml" + # "application/json" + # "text/plain" + "text/html" + ] (_: cfg.package.meta.desktopFileName); in lib.mkIf cfg.enable { associations.added = associations;