From c9cdb0a83efe3df41dd23379afd31d70af462fb6 Mon Sep 17 00:00:00 2001 From: Sameer Rahmani Date: Sun, 14 Apr 2024 19:49:21 +0100 Subject: [PATCH] Add an Elisp script to convert Nix config to Elisp code --- lisp/build.el | 98 +++++++++++ nix/fg42/#derivation.nix# | 219 ------------------------- nix/fg42/.#derivation.nix | 1 - nix/fg42/derivation.nix | 69 ++++---- nix/fg42/unit.nix | 17 ++ nix/modules/build_config/default.nix | 122 -------------- nix/modules/default.nix | 1 - nix/modules/editor/default.nix | 12 +- nix/modules/editor/lisp/fg42.el | 12 +- nix/modules/editor/lisp/fg42/editor.el | 1 + nix/modules/editor/lisp/fg42/themes.el | 69 ++++++++ 11 files changed, 233 insertions(+), 388 deletions(-) create mode 100644 lisp/build.el delete mode 100644 nix/fg42/#derivation.nix# delete mode 120000 nix/fg42/.#derivation.nix delete mode 100644 nix/modules/build_config/default.nix create mode 100644 nix/modules/editor/lisp/fg42/themes.el diff --git a/lisp/build.el b/lisp/build.el new file mode 100644 index 0000000..0f888fd --- /dev/null +++ b/lisp/build.el @@ -0,0 +1,98 @@ +;;; FG42 --- The mighty editor for the emacsians -*- lexical-binding: t; -*- +;; +;; Copyright (c) 2010-2024 Sameer Rahmani +;; +;; Author: Sameer Rahmani +;; URL: https://devheroes.codes/FG42/FG42 +;; Version: 4.0.0 +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . +;; +;;; Commentary: +;; This is the builder script that takes the config.json from the input +;; (typically provided by Nix). And generates appropriate Elisp file +;; for the main FG42 Elsip code to load and use. +;; +;; Please note that this file runs with Emacs and not FG42. +;;; Code: +(when (not (json-available-p)) + (error "Error: libjasson support is missing")) + + +;; Elisp's hashtables are not functional so I have to store the +;; state like this, Ewwwwww! +(defvar build-state '() + "A list of expressions that will dump in the output at the end.") + + +(defmacro with-json (var &rest body) + "Read the json file from cli arguments, user VAR run the BODY on it." + (declare (indent defun)) + `(let ((input-file (car command-line-args-left))) + (message "Reading the input file: %s" input-file) + (with-temp-buffer + (insert-file-contents input-file) + (let ((,var (json-parse-buffer))) + ,@body)))) + + +(defun generate-compile-time-requires (elisp-pkgs) + "Generate a list of `require' forms of ELISP-PKGS for compile time." + (when (> (length elisp-pkgs) 0) + (add-to-list + 'build-state + `(eval-when-compile + ,@(mapcar (lambda (pkg) `(require ',(intern pkg))) elisp-pkgs))))) + +(defun generate-generic-vars (k v) + "Generate a list of vars for K and value V." + (add-to-list 'build-state `(defvar ,(intern (format "fg42/%s" k)) ,v))) + + +(defun fg42-config-key-handler (k v) + "Handle the FG42 config K and its value V." + (cond + ((string= k "requires") + (generate-compile-time-requires v)) + + (t (generate-generic-vars k v)))) + +(defun fg42-handler (config) + "Handle the CONFIG for FG42. + +CONFIG maps to the collective `config' value of Nix modules." + (maphash #'fg42-config-key-handler config)) + +(defun handle-conifg-for (k v) + "Find the handler of K and its value V to it." + (funcall (intern (format "%s-handler" k)) v)) + + +(defun handle-top-level (k v) + "Handle the key K and value V form the top level of the JSON data." + (when (not (string= k "fg42")) + (error "Don't know how to handle '%s'" k)) + (handle-conifg-for k v)) + +(with-json j + ;; TODO: To make it scale, may be let Nix modules + ;; plug into this script. There is a security + ;; rist though + (maphash #'handle-top-level j) + (with-temp-file (cadr command-line-args-left) + (mapc (lambda (x) (print x (current-buffer))) build-state))) + + +(provide 'build) +;;; build.el ends here diff --git a/nix/fg42/#derivation.nix# b/nix/fg42/#derivation.nix# deleted file mode 100644 index eefa5fd..0000000 --- a/nix/fg42/#derivation.nix# +++ /dev/null @@ -1,219 +0,0 @@ -# Fg42 - Emacs Editor for advance users -# -# Copyright (c) 2010-2024 Sameer Rahmani -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 2. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . -{ lib -, config -, stdenv -, git -, texinfo -, gcc -, bash -, utils -, emacsPackagesFor -, makeFontsConf -, xorg -, maintainers -, writeText -, writeShellApplication -, ... -}: - -with builtins; -let - cfg = config.fg42; - emacs = cfg.emacs; - version = cfg.version; - - emacsBundle = (emacsPackagesFor emacs).withPackages (_: cfg.elispPackages); - - paths = map (x: "${x}/bin/") cfg.paths; - pathsStr = lib.strings.concatStrings (lib.strings.intersperse ":" paths); - - mimeTypes = builtins.concatStringsSep ";" cfg.mimeTypes; - - fontsConf = makeFontsConf { fontDirectories = cfg.fonts; }; - - # Whatever that needs to be in the PATH is considered a runtime - # dependency. - # Fonts are obviously runtime dependency as well - runtimeDependencies = cfg.paths ++ cfg.fonts ++ cfg.elispPackages; - - buildConfig = generateBuildConfig cfg.buildConfig; - - addToList = epkg: ''(add-to-list 'directories-to-autogen "${epkg}")''; - - sexprs = [ - '' - (require 'loaddefs-gen) - (defvar directories-to-autogen '()) - (defvar output-file (getenv "LOADEF_OUTPUT")) - '' - ] ++ (map addToList cfg.elispPackages) ++ [ - '' - (message ">> %s ----- %s" directories-to-autogen output-file) - (loaddefs-generate directories-to-autogen - output-file) - (provide 'loaddef-generator) - '' - ]; - loaddefGenerator = writeText "loaddef-generator.el" (concatStringsSep "\n" sexprs); - loaddefScript = writeShellApplication { - name = "loaddef"; - - text = '' - #!${stdenv.shell} - set +x - LOADEF_OUTPUT="$1" ${emacsBundle}/bin/emacs -Q -q --batch -l ${loaddefGenerator} - ''; - }; - - startupPackage = cfg.startUp; - - - # elsipFiles = map (file: ) cfg.elispPackages; - # nativeCompiler = epkgs: '' - # emacs -L . --batch -f batch-native-compile ${elispFiles} - # ''; -in - -stdenv.mkDerivation rec { - inherit version; - pname = "FG42"; - - src = ../../.; - - buildPhase = '' - runHook preBuild - - LISPDIR=$out/share/fg42/ - mkdir -p $out/bin - mkdir -p $out/share/applications/ - - install -d $LISPDIR - - cp -rv ${src}/share $out/ - cp -rv ${src}/snippets $LISPDIR/snippets - cp "${fontsConf}" $LISPDIR/fonts.conf - - chmod 755 $LISPDIR -R - - export FONTCONFIG_FILE="$LISPDIR/fonts.conf" - - cat >> $out/share/applications/FG42.desktop << EOF - [Desktop Entry] - Encoding=UTF-8 - Name=FG42 - GenericName=FG42 - Comment=The nix base Emacs bundle for advance users - MimeType=${mimeTypes} - Type=Application - Terminal=false - Categories=Development;TextEditor; - StartupWMClass=FG42 - Exec=${placeholder "out"}/bin/fg42 - Icon=fg42 - Version=${version} - EOF - - cat >> $out/share/runtime_deps << EOF - ${lib.strings.concatLines runtimeDependencies} - ${emacsBundle} - EOF - - cd $LISPDIR - #compile stuff - cd - - - cat >> $out/bin/fg42 << EOF - #!${stdenv.shell} - - export PATH=${pathsStr}:$PATH - export FONTCONFIG_FILE="$LISPDIR/fonts.conf" - - LIBRARY_PATH="\$(${stdenv.cc}/bin/cc -print-file-name=libgccjit.so):\$LIBRARY_PATH" \ - FG42_WM=fales ${emacsBundle}/bin/emacs \ - --name FG42 \ - -q --no-splash --title FG42 \ - -l ${cfg.startUp} "\$@" - EOF - chmod +x $out/bin/fg42 - - - LISPDIR=$out/share/fg42/lisp/ - mkdir -p $LISPDIR - #emacs --batch -l package --eval "(package-generate-autoloads \"${pname}\" \"$LISPDIR\")" - # ${loaddefScript}/bin/loaddef ${placeholder "out"}/share/fg42/lisp/loaddefs.el - - runHook postBuild - - cat >> $out/bin/fg42-wm << EOF - #!${stdenv.shell} - - export FG42_HOME=${placeholder "out"}/share/fg42/ - export FG42_EMACSD=~/.fg42/v4/emacs.d - export FG42_USE_NIX=true; - export PATH=${pathsStr}:\$PATH - export FONTCONFIG_FILE="$LISPDIR/fonts.conf" - - # Disable access control for the current user. - ${xorg.xhost}/bin/xhost +SI:localuser:\$USER - - # Make Java applications aware this is a non-reparenting window manager. - export _JAVA_AWT_WM_NONREPARENTING=1 - - # Set default cursor. - xsetroot -cursor_name left_ptr - - # Set keyboard repeat rate. - xset r rate 400 30 - - # Uncomment the following block to use the exwm-xim module. - # export XMODIFIERS=@im=exwm-xim - # export GTK_IM_MODULE=xim - # export QT_IM_MODULE=xim - # export CLUTTER_IM_MODULE=xim - - LIBRARY_PATH="\$(${stdenv.cc}/bin/cc -print-file-name=libgccjit.so):\$LIBRARY_PATH" \ - FG42_WM=true ${emacsBundle}/bin/emacs \ - --name FG42 \ - -q --no-splash --title FG42 \ - -l \$FG42_HOME/lisp/fg42/fg42.el "\$@" - EOF - chmod +x $out/bin/fg42-wm - - - runHook postBuild - ''; - - buildInputs = [ emacs emacsBundle git texinfo gcc bash ]; - - addEmacsNativeLoadPath = true; - - meta = { - broken = false; - platforms = emacs.meta.platforms; - homepage = "https://fg42.org/"; - maintainers = [ maintainers.lxsameer ]; - description = "The mighty editor for the Emacsians"; - longDescription = '' - FG42 is a framework to create and editor and window manager based on GNU/Emacs. - It has a pre-defined setup as well which can be installed out of the box. But the - goal of this project is to provide the API necessary to create an integrated editor. - - So you need to know about Emacs in advance. - ''; - license = lib.licenses.gpl3Plus; - }; -} diff --git a/nix/fg42/.#derivation.nix b/nix/fg42/.#derivation.nix deleted file mode 120000 index 766c032..0000000 --- a/nix/fg42/.#derivation.nix +++ /dev/null @@ -1 +0,0 @@ -lxsameer@majin.69922:1712871165 \ No newline at end of file diff --git a/nix/fg42/derivation.nix b/nix/fg42/derivation.nix index 9c47979..caf7e4e 100644 --- a/nix/fg42/derivation.nix +++ b/nix/fg42/derivation.nix @@ -25,7 +25,7 @@ , makeFontsConf , xorg , maintainers -, writeText +, writeTextFile , writeShellApplication , ... }: @@ -50,35 +50,41 @@ let # Fonts are obviously runtime dependency as well runtimeDependencies = cfg.paths ++ cfg.fonts ++ cfg.elispPackages; - buildConfig = generateBuildConfig cfg.buildConfig; + # addToList = epkg: ''(add-to-list 'directories-to-autogen "${epkg}")''; - addToList = epkg: ''(add-to-list 'directories-to-autogen "${epkg}")''; + # sexprs = [ + # '' + # (require 'loaddefs-gen) + # (defvar directories-to-autogen '()) + # (defvar output-file (getenv "LOADEF_OUTPUT")) + # '' + # ] ++ (map addToList cfg.elispPackages) ++ [ + # '' + # (message ">> %s ----- %s" directories-to-autogen output-file) + # (loaddefs-generate directories-to-autogen + # output-file) + # (provide 'loaddef-generator) + # '' + # ]; + # loaddefGenerator = writeText "loaddef-generator.el" (concatStringsSep "\n" sexprs); + # loaddefScript = writeShellApplication { + # name = "loaddef"; - sexprs = [ - '' - (require 'loaddefs-gen) - (defvar directories-to-autogen '()) - (defvar output-file (getenv "LOADEF_OUTPUT")) - '' - ] ++ (map addToList cfg.elispPackages) ++ [ - '' - (message ">> %s ----- %s" directories-to-autogen output-file) - (loaddefs-generate directories-to-autogen - output-file) - (provide 'loaddef-generator) - '' - ]; - loaddefGenerator = writeText "loaddef-generator.el" (concatStringsSep "\n" sexprs); - loaddefScript = writeShellApplication { - name = "loaddef"; + # text = '' + # #!${stdenv.shell} + # set +x + # LOADEF_OUTPUT="$1" ${emacsBundle}/bin/emacs -Q -q --batch -l ${loaddefGenerator} + # ''; + # }; - text = '' - #!${stdenv.shell} - set +x - LOADEF_OUTPUT="$1" ${emacsBundle}/bin/emacs -Q -q --batch -l ${loaddefGenerator} - ''; + + configFile = writeTextFile { + name = "config.json"; + text = (toJSON config); + executable = false; }; + startupPackage = cfg.startUp; @@ -87,7 +93,6 @@ let # emacs -L . --batch -f batch-native-compile ${elispFiles} # ''; in - stdenv.mkDerivation rec { inherit version; pname = "FG42"; @@ -103,15 +108,20 @@ stdenv.mkDerivation rec { install -d $LISPDIR - # cp -rv ${src}/lisp/ $LISPDIR + mkdir -p $LISPDIR/lisp + cp -rv ${src}/lisp/build.el $LISPDIR/lisp cp -rv ${src}/share $out/ cp -rv ${src}/snippets $LISPDIR/snippets cp "${fontsConf}" $LISPDIR/fonts.conf - - chmod 755 $LISPDIR -R + cp "${configFile}" $LISPDIR/config.json export FONTCONFIG_FILE="$LISPDIR/fonts.conf" + chmod 755 $LISPDIR -R + + emacs --batch -l $LISPDIR/lisp/build.el $LISPDIR/config.json $LISPDIR/lisp/fg42_init.el + + cat >> $out/share/applications/FG42.desktop << EOF [Desktop Entry] @@ -156,7 +166,6 @@ stdenv.mkDerivation rec { LISPDIR=$out/share/fg42/lisp/ mkdir -p $LISPDIR #emacs --batch -l package --eval "(package-generate-autoloads \"${pname}\" \"$LISPDIR\")" - # ${loaddefScript}/bin/loaddef ${placeholder "out"}/share/fg42/lisp/loaddefs.el runHook postBuild diff --git a/nix/fg42/unit.nix b/nix/fg42/unit.nix index 1b08e15..2dac561 100644 --- a/nix/fg42/unit.nix +++ b/nix/fg42/unit.nix @@ -44,6 +44,17 @@ with lib; ''; }; + fg42.requires = mkOption { + type = types.listOf types.str; + default = [ ]; + description = '' + A list of Emacs packages to preload in compile time. + + In general you want your entry point module in this list + to setup your autoloads, hooks, and everything. + ''; + }; + fg42.paths = mkOption { type = types.listOf types.package; default = [ ]; @@ -69,6 +80,12 @@ with lib; ''; }; + fg42.font = mkOption { + type = types.uniq types.str; + example = "fg42.font = ''(cons \"Fira Code\" 10) '';"; + description = "The default font for FG42"; + }; + fg42.startUp = mkOption { type = types.uniq types.path; description = "The main startup file to load first. This is usually fg42.el"; diff --git a/nix/modules/build_config/default.nix b/nix/modules/build_config/default.nix deleted file mode 100644 index 5ad98be..0000000 --- a/nix/modules/build_config/default.nix +++ /dev/null @@ -1,122 +0,0 @@ -# Fg42 - Emacs Editor for advance users -# -# Copyright (c) 2010-2024 Sameer Rahmani -# -# This program is free software; you can redistribute it and/or modify -# it under the terms of the GNU General Public License as published by -# the Free Software Foundation, version 2. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU General Public License for more details. -# -# You should have received a copy of the GNU General Public License -# along with this program. If not, see . - -# This is the home manager module that exposes FG42. It differs -# from FG42 modules that are structurally the same but used in -# different context - -# A list of default FG42 modules to build FG42 with. -{ lib, config, pkgs, ... }: -with lib; -let - generateBuildConfig = configs: - let - defineConfig = cs: name: - let - config = builtins.getAttr name cs; - form = if config.const then "defconst" else "defvar"; - in - ''(${form} ${name} ${config.value} "${config.docs}")''; - - configsList = builtins.map (defineConfig configs) (builtins.attrNames configs); - - in - pkgs.writeTextFile { - name = "build-config"; - text = '' - ${builtins.concatStringsSep "\n" configsList} - (provide 'fg42/build-config) - ''; - executable = false; - }; - - buildConfig = generateBuildConfig (config.fg42.buildConfig); - drv = pkgs.emacsPackages.trivialBuild rec { - pname = "fg42-build-config"; - version = config.fg42.version; - src = ./.; - - buildPhase = '' - runHook preBuild - - LISPDIR=$out/share/emacs/site-lisp/fg42 - install -d $LISPDIR - - cp -v ${buildConfig} $LISPDIR/build-config.el - - emacs -L . --batch -f batch-byte-compile *.el - - runHook postBuild - ''; - installPhase = '' - runHook preInstall - - LISPDIR=$out/share/emacs/site-lisp/fg42/ - emacs --batch -l package --eval "(package-generate-autoloads \"${pname}\" \"$LISPDIR\")" - - runHook postInstall - ''; - - }; -in -{ - options = { - fg42.buildConfig = mkOption { - type = types.attrsOf - (types.submodule { - options = { - value = mkOption { - type = types.str; - default = "nil"; - description = '' - The value should be quoted. For example the string "nil" - means the actual nil in elisp and the string "\"foo\"" - means elisp string "foo". - ''; - }; - docs = mkOption { - type = types.str; - description = "The docstring for the variable or constant (mandatory)"; - }; - const = mkOption { - type = types.bool; - default = false; - description = "defvar vs defconst"; - }; - }; - }); - default = { }; - example = '' - fg42.config = { - "fg42/some-var" = { - value = "foo"; - docs = "The docstring"; - const = false; - }; - }; - ''; - description = '' - An attrset of configuration variables and their values - that should end up in `fg42/config` elisp module. - ''; - }; - - }; - - config = { - fg42.elispPackages = [ drv ]; - }; -} diff --git a/nix/modules/default.nix b/nix/modules/default.nix index 74bf1f9..77886ae 100644 --- a/nix/modules/default.nix +++ b/nix/modules/default.nix @@ -22,7 +22,6 @@ { pkgs, lib }: let modules = [ - ./build_config ./editor ]; diff --git a/nix/modules/editor/default.nix b/nix/modules/editor/default.nix index 2a49bfa..b406db0 100644 --- a/nix/modules/editor/default.nix +++ b/nix/modules/editor/default.nix @@ -49,7 +49,6 @@ let dicts = pkgs.aspellWithDicts (dicts: with dicts; [ en en-computers en-science ]); in { - config = { fg42.elispPackages = [ drv ] ++ deps; fg42.startUp = lib.mkDefault "${drv}/share/emacs/site-lisp/fg42.el"; @@ -66,14 +65,7 @@ in dicts ]); - fg42.buildConfig = { - "fg42/font" = { - value = '''("Fira Mono" 11)''; - docs = '' - The default font for FG42. You can override it - in your configuration file. - ''; - }; - }; + fg42.font = lib.mkDefault '''("Fira Mono" 11)''; + fg42.requires = [ "fg42/cpp" ]; }; } diff --git a/nix/modules/editor/lisp/fg42.el b/nix/modules/editor/lisp/fg42.el index a6088e9..68a9dbc 100644 --- a/nix/modules/editor/lisp/fg42.el +++ b/nix/modules/editor/lisp/fg42.el @@ -106,16 +106,18 @@ (defun fg42/initialize () "Initialize FG42 after the Emacs window is rendered by loading the user init file." ;; (fg42/-startup-optimization) - (require 'fg42/editor) + (require 'fg42/editor) + ;; Since the editor module imports all the submodules + ;; on compile time we should be good to assume + ;; everything that needed to be loaded or autoloaded + ;; are there already. (when (file-exists-p user-init-file) (load user-init-file)) + (fg42/setup-theme!) (fg42/setup-editor) - ;; ;; If user didn't select a theme, load the default stuff - ;; (when (not (featurep 'fg42/themes)) - ;; (require 'fg42/themes)) - + (add-hook 'emacs-startup-hook (lambda () (run-hooks 'fg42/after-init-hook) diff --git a/nix/modules/editor/lisp/fg42/editor.el b/nix/modules/editor/lisp/fg42/editor.el index c67996c..0141c9b 100644 --- a/nix/modules/editor/lisp/fg42/editor.el +++ b/nix/modules/editor/lisp/fg42/editor.el @@ -26,6 +26,7 @@ ;; We build this file via the main FG42's Nix derivation. It ;; contains the final Nix configuration of FG42. (require 'fg42/build-config) + (require 'fg42/themes) ;; ;; Language support ;; (require 'fg42/autocomplete) ;; (require 'fg42/langs/langs) diff --git a/nix/modules/editor/lisp/fg42/themes.el b/nix/modules/editor/lisp/fg42/themes.el new file mode 100644 index 0000000..db49111 --- /dev/null +++ b/nix/modules/editor/lisp/fg42/themes.el @@ -0,0 +1,69 @@ +;;; Themes --- Theme library of FG42 -*- lexical-binding: t; -*- +;; +;; Copyright (c) 2010-2024 Sameer Rahmani & Contributors +;; +;; Author: Sameer Rahmani +;; URL: https://devheroes.codes/FG42/FG42 +;; Version: 4.0.0 +;; +;; This program is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation, either version 3 of the License, or +;; (at your option) any later version. +;; +;; This program is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. +;; +;; You should have received a copy of the GNU General Public License +;; along with this program. If not, see . +;; +;;; Commentary: +;; Cubes are the building blocks of any `FG42' editor. Each `cube' is a +;; unit which defines different abilities in a deterministic and idempotent +;; way. Cubes are composable and a composition of cubes creates an editor. +;; +;;; Code: +(eval-when-compile + (require 'fpkg) + (require 'fg42/build-config)) + +(require 'fg42/utils) + +(defvar fg42/ui-hook () + "A hook that cubes can use via :ui-hook property. +It executes way before the rest of the cubes.") + +(defvar fg42/before-initializing-theme-hook () + "The hook to plug any configuration to before initialize event of themes.") + +(defvar fg42/after-initializing-theme-hook () + "The hook to plug any configuration to after initialize event of themes.") + + +(defmacro fg42/setup-theme! (&rest body) + "Grab the them provided by `fg42/theme' and load it. + +Load the theme via `use!' and pass the BODY to the `use!' macroro. +If the theme name and the theme package name are different the package +name can be set via `fg42/theme-package'". + + (declare (indent defun)) + (let ((pkg (if (not (null fg42/theme-package)) + fg42/theme-package + fg42/theme))) + `(use! ,pkg + "Setting up the ,pkg package." + :config + (load-theme fg42/theme t) + ,@body))) + +;; (use! base16-theme +;; "Load base16 based themes in FG42." +;; :config +;; (load-theme 'base16-eighties t)) + + +(provide 'fg42/themes) +;;; themes.el ends here