diff --git a/modules/modules.nix b/modules/modules.nix index 1171d32da..bb1a61a8b 100644 --- a/modules/modules.nix +++ b/modules/modules.nix @@ -219,6 +219,7 @@ let ./programs/notmuch.nix ./programs/numbat.nix ./programs/nushell.nix + ./programs/nyxt.nix ./programs/obs-studio.nix ./programs/obsidian.nix ./programs/octant.nix diff --git a/modules/programs/nyxt.nix b/modules/programs/nyxt.nix new file mode 100644 index 000000000..8e2486004 --- /dev/null +++ b/modules/programs/nyxt.nix @@ -0,0 +1,82 @@ +{ + lib, + pkgs, + config, + ... +}: +let + inherit (lib) + types + isString + mkIf + mkEnableOption + mkPackageOption + mkOption + ; + + cfg = config.programs.nyxt; +in +{ + meta.maintainers = with lib.hm.maintainers; [ aguirre-matteo ]; + + options.programs.nyxt = { + enable = mkEnableOption "Nyxt"; + package = mkPackageOption pkgs "nyxt" { nullable = true; }; + config = mkOption { + type = with types; either lines path; + default = ""; + example = '' + (in-package #:nyxt-user) + + (defvar *my-search-engines* + (list + (make-instance 'search-engine + :name "Google" + :shortcut "goo" + #+nyxt-4 :control-url #+nyxt-3 :search-url + "https://duckduckgo.com/?q=~a") + (make-instance 'search-engine + :name "MDN" + :shortcut "mdn" + #+nyxt-4 :control-url #+nyxt-3 :search-url + "https://developer.mozilla.org/en-US/search?q=~a"))) + + (define-configuration browser + ((restore-session-on-startup-p nil) + (default-new-buffer-url (quri:uri "https://github.com/atlas-engineer/nyxt")) + (external-editor-program (if (member :flatpak *features*) + "flatpak-spawn --host emacsclient -r" + "emacsclient -r")) + #+nyxt-4 + (search-engine-suggestions-p nil) + #+nyxt-4 + (search-engines (append %slot-default% *my-search-engines*)) + ;; Sets the font for the Nyxt UI (not for webpages). + (theme (make-instance 'theme:theme + :font-family "Iosevka" + :monospace-font-family "Iosevka")) + ;; Whether code sent to the socket gets executed. You must understand the + ;; risks before enabling this: a privileged user with access to your system + ;; can then take control of the browser and execute arbitrary code under your + ;; user profile. + ;; (remote-execution-p t) + )) + ''; + description = '' + Configuration file for Nyxt, written in the Common Lisp + programming language. + ''; + }; + }; + + config = mkIf cfg.enable { + home.packages = mkIf (cfg.package != null) [ cfg.package ]; + xdg.configFile."nyxt/config.lisp" = mkIf (cfg.config != "") { + source = + let + configSource = if isString cfg.config then pkgs.writeText "nyxt-config" cfg.config else cfg.config; + in + configSource; + }; + }; +} diff --git a/tests/darwinScrublist.nix b/tests/darwinScrublist.nix index fff07fcf4..ee6527db5 100644 --- a/tests/darwinScrublist.nix +++ b/tests/darwinScrublist.nix @@ -109,6 +109,7 @@ let "notmuch" "npth" "nushell" + "nyxt" "oh-my-posh" "ollama" "onlyoffice-desktopeditors" diff --git a/tests/default.nix b/tests/default.nix index 332cbf59b..857a59e33 100644 --- a/tests/default.nix +++ b/tests/default.nix @@ -266,6 +266,7 @@ import nmtSrc { ./modules/programs/nnn ./modules/programs/numbat ./modules/programs/nushell + ./modules/programs/nyxt ./modules/programs/oh-my-posh ./modules/programs/onlyoffice ./modules/programs/openstackclient diff --git a/tests/modules/programs/nyxt/default.nix b/tests/modules/programs/nyxt/default.nix new file mode 100644 index 000000000..695e4135a --- /dev/null +++ b/tests/modules/programs/nyxt/default.nix @@ -0,0 +1 @@ +{ nyxt-example-config = ./example-config.nix; } diff --git a/tests/modules/programs/nyxt/example-config.lisp b/tests/modules/programs/nyxt/example-config.lisp new file mode 100644 index 000000000..9345937ca --- /dev/null +++ b/tests/modules/programs/nyxt/example-config.lisp @@ -0,0 +1,35 @@ +(in-package #:nyxt-user) + +(defvar *my-search-engines* + (list + (make-instance 'search-engine + :name "Google" + :shortcut "goo" + #+nyxt-4 :control-url #+nyxt-3 :search-url + "https://duckduckgo.com/?q=~a") + (make-instance 'search-engine + :name "MDN" + :shortcut "mdn" + #+nyxt-4 :control-url #+nyxt-3 :search-url + "https://developer.mozilla.org/en-US/search?q=~a"))) + +(define-configuration browser + ((restore-session-on-startup-p nil) + (default-new-buffer-url (quri:uri "https://github.com/atlas-engineer/nyxt")) + (external-editor-program (if (member :flatpak *features*) + "flatpak-spawn --host emacsclient -r" + "emacsclient -r")) + #+nyxt-4 + (search-engine-suggestions-p nil) + #+nyxt-4 + (search-engines (append %slot-default% *my-search-engines*)) + ;; Sets the font for the Nyxt UI (not for webpages). + (theme (make-instance 'theme:theme + :font-family "Iosevka" + :monospace-font-family "Iosevka")) + ;; Whether code sent to the socket gets executed. You must understand the + ;; risks before enabling this: a privileged user with access to your system + ;; can then take control of the browser and execute arbitrary code under your + ;; user profile. + ;; (remote-execution-p t) + )) diff --git a/tests/modules/programs/nyxt/example-config.nix b/tests/modules/programs/nyxt/example-config.nix new file mode 100644 index 000000000..9422ac70c --- /dev/null +++ b/tests/modules/programs/nyxt/example-config.nix @@ -0,0 +1,48 @@ +{ + programs.nyxt = { + enable = true; + config = '' + (in-package #:nyxt-user) + + (defvar *my-search-engines* + (list + (make-instance 'search-engine + :name "Google" + :shortcut "goo" + #+nyxt-4 :control-url #+nyxt-3 :search-url + "https://duckduckgo.com/?q=~a") + (make-instance 'search-engine + :name "MDN" + :shortcut "mdn" + #+nyxt-4 :control-url #+nyxt-3 :search-url + "https://developer.mozilla.org/en-US/search?q=~a"))) + + (define-configuration browser + ((restore-session-on-startup-p nil) + (default-new-buffer-url (quri:uri "https://github.com/atlas-engineer/nyxt")) + (external-editor-program (if (member :flatpak *features*) + "flatpak-spawn --host emacsclient -r" + "emacsclient -r")) + #+nyxt-4 + (search-engine-suggestions-p nil) + #+nyxt-4 + (search-engines (append %slot-default% *my-search-engines*)) + ;; Sets the font for the Nyxt UI (not for webpages). + (theme (make-instance 'theme:theme + :font-family "Iosevka" + :monospace-font-family "Iosevka")) + ;; Whether code sent to the socket gets executed. You must understand the + ;; risks before enabling this: a privileged user with access to your system + ;; can then take control of the browser and execute arbitrary code under your + ;; user profile. + ;; (remote-execution-p t) + )) + ''; + }; + + nmt.script = '' + assertFileExists home-files/.config/nyxt/config.lisp + assertFileContent home-files/.config/nyxt/config.lisp \ + ${./example-config.lisp} + ''; +}