Compare commits

...

64 commits

Author SHA1 Message Date
home-manager-bot 6e090576c4
flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/b73c2221a46c13557b1b3be9c2070cc42cf01eb3?narHash=sha256-QOS0ykELUmPbrrUGmegAUlpmUFznDQeR4q7rFhl8eQg%3D' (2024-07-27)
  → 'github:NixOS/nixpkgs/52ec9ac3b12395ad677e8b62106f0b98c1f8569d?narHash=sha256-veKR07psFoJjINLC8RK4DiLniGGMgF3QMlS4tb74S6k%3D' (2024-07-28)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-07-31 23:45:38 +02:00
William Tan 58cef37962
nix-gc: remove extraneous quotes from shell script 2024-07-31 08:27:17 +02:00
Jakub Nowak 4fcd54df7c
firefox: fix userChrome example
Example CSS wasn't valid for Firefox 69+.
2024-07-30 08:33:10 +02:00
Ninja3047 d34aaf7b3b
nix-gc: set service type to oneshot 2024-07-30 07:54:40 +02:00
Ninja3047 db40fead89
nix-gc: call nix-collect-garbage in a shell script
This will match the behavior in the upstream service which allows the
user to set options to something that uses shell syntax.
2024-07-30 07:54:18 +02:00
Gaurav Juvekar 89670e27e1
home-manager: ignore hostname -f lookup errors
`hostname -f` could fail depending on the resolver. Discard any stderr
and test for the exit status before using the value for flake attribute
lookup.

I was unable to repro the exact bad exit status in #5665.
With
  - nscd disabled,
  - nsswitch.conf pointing to 'files',
  - hostname entry removed from /etc/hosts
`hostname -f` from inetutils-2.5 fell back to showing just the nodename
from `uname(2)`. Injecting an empty string into the
`(struct utsname).nodename` field of `uname(2)` using strace still
exited with empty output and 0 exit-status.

Fixes #5665
2024-07-28 21:21:23 -07:00
bricked 792757f643
firefox: support firefox derivatives
Adds support for Firefox forks by introducing methods that create
generic configs and options. Additional configs and options can be
added in separate modules.
2024-07-28 23:53:08 +02:00
Jean Sidharta 587fcca66e
eww: add terminal integration options
Use eww's shell-completions command to generate completions for
bash, zsh and fish.
2024-07-28 23:37:02 +02:00
nikitax44 a11cfcd0a1
micro: add package option 2024-07-28 23:00:57 +02:00
Milo Moisson ea72cf548f
jujutsu: support darwin guidelines for config placement
Follow up to #5207, fixing jujutsu module on darwin targets.
2024-07-28 22:54:29 +02:00
home-manager-bot 9fdadb1cb6
flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/68c9ed8bbed9dfce253cc91560bf9043297ef2fe?narHash=sha256-Tybxt65eyOARf285hMHIJ2uul8SULjFZbT9ZaEeUnP8%3D' (2024-07-21)
  → 'github:NixOS/nixpkgs/b73c2221a46c13557b1b3be9c2070cc42cf01eb3?narHash=sha256-QOS0ykELUmPbrrUGmegAUlpmUFznDQeR4q7rFhl8eQg%3D' (2024-07-27)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-07-28 22:43:01 +02:00
polykernel cd520fbd31
maintainers: remove polykernel 2024-07-28 11:58:33 -04:00
Tomodachi94 d0240a064d
gnome-terminal: update package name
The `pkgs.gnome.gnome-terminal` package was moved to
`pkgs.gnome-terminal`. The former is now a deprecated alias that
throws a warning whenever a configuration enabling the module is used:

```
The ‘gnome.gnome-terminal’ was moved to top-level. Please use
‘pkgs.gnome-terminal’ directly.
```

Related: https://github.com/NixOS/nixpkgs/pull/319659
Related: https://github.com/nix-community/home-manager/pull/5611
2024-07-28 00:32:19 +02:00
Robert Helgesson 975b83ca56
treewide: fix eval after Nixpkgs maintainer changes 2024-07-27 10:10:13 +02:00
Robert Helgesson 180158b46e
mcfly: add settings option 2024-07-27 10:10:13 +02:00
Masum Reza bc2b96acda
zsh: add programs.zsh.autosuggestions.strategy option (#5396)
defaults to history
2024-07-26 14:28:33 +02:00
Cezary Drożak 304a011325
firefox: add languagePacks option
Port the programs.firefox.languagePacks option from NixOS
2024-07-24 22:15:38 +02:00
home-manager-bot af70fc502a
flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/1d9c2c9b3e71b9ee663d11c5d298727dace8d374?narHash=sha256-8MUgifkJ7lkZs3u99UDZMB4kbOxvMEXQZ31FO3SopZ0%3D' (2024-07-19)
  → 'github:NixOS/nixpkgs/68c9ed8bbed9dfce253cc91560bf9043297ef2fe?narHash=sha256-Tybxt65eyOARf285hMHIJ2uul8SULjFZbT9ZaEeUnP8%3D' (2024-07-21)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-07-24 08:55:10 +02:00
Donovan Glover 465ea1f994
swayosd: avoid restarting too quickly
Should fix an issue where swayosd.service would stop without starting
again after restarting too quickly.

Triggered by ending a Hyprland session and logging in with tuigreet.

Related: https://github.com/nix-community/home-manager/pull/4316
2024-07-24 07:37:28 +02:00
Amit Aryeh Levy 7560dc942a
kbfs: avoid using PrivateTmp for systemd service
The kbfs service does not seem to actually work with a PrivateTmp. A
PrivateTmp seems as appropriate for kbfs as anything else, but the
upstream service does not use it either
<https://github.com/keybase/client/blob/master/packaging/linux/systemd/kbfs.service>
2024-07-23 08:04:23 +02:00
github-actions[bot] 635563f245 flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/00d80d13810dbfea8ab4ed1009b09100cca86ba8?narHash=sha256-H3%2BEC5cYuq%2BgQW8y0lSrrDZfH71LB4DAf%2BTDFyvwCNA%3D' (2024-07-01)
  → 'github:NixOS/nixpkgs/1d9c2c9b3e71b9ee663d11c5d298727dace8d374?narHash=sha256-8MUgifkJ7lkZs3u99UDZMB4kbOxvMEXQZ31FO3SopZ0%3D' (2024-07-19)
2024-07-21 03:59:25 +00:00
O. C. Taskin afd2021bed
papis: add program.papis.package option
Add `programs.papis.package` option to override default package used.
This can be useful to track latest rev from repository via a flake.
2024-07-16 15:19:18 +02:00
O. C. Taskin a38f88045e
khard: add option to contact module for khard dir
Add an extra option,

    accounts.contact.accounts.<name>.khard.defaultCollection

to hardcode a subdirectory for khard to function as intended. Khard
expects to be given a collection directory directly, from which there
can be multiple of in a vdir. This contrasts khal or vdirsyncer which
support recursive search.

Fixes #4531
2024-07-16 15:17:37 +02:00
Chris Hodapp 90ae324e2c
sd-switch: respect xdg directory specifications 2024-07-11 23:48:33 +02:00
Johann c085b984ff
gnome-keyring: update package
`pkgs.gnome.gnome-keyring` has been moved to `pkgs.gnome-keyring` In nixpgkgs-unstable
2024-07-10 23:15:28 +02:00
Lin Xianyi 57d85c6c6d
xdg-desktop-entries: allow terminal to be null 2024-07-10 23:13:46 +02:00
Robert Helgesson f79d950ac2
atuin: fix tests 2024-07-10 23:11:15 +02:00
Bruno BELANYI f749fabecc atuin: use 'lib.getExe' 2024-07-10 13:07:54 +00:00
Robert Helgesson 2fb5c1e0a1
tests: update to match new sd-switch version
Also, seems Nix has become more memory hungry so increase memory
allocation.
2024-07-08 22:34:06 +02:00
Robert Helgesson dfaf0ff2e7
systemd: only set old units directory when available 2024-07-08 22:34:05 +02:00
Weblate (bot) 6b7ce96f34
Translate using Weblate (Hungarian)
Currently translated at 43.2% (16 of 37 strings)


Translate-URL: https://hosted.weblate.org/projects/home-manager/cli/hu/
Translation: Home Manager/Home Manager CLI

Co-authored-by: Ferenci Ákos <synthetace@gmail.com>
2024-07-07 06:49:29 +02:00
Bojun Ren 10486e6b31
starship: fix type of settings to allow all valid value
Previously, type check of `programs.starship.settings` fails for some
valid settings, such as `c.commands = [["cc" "--version"]]`.

The commit fix the `type` argument passed to `mkOption`, so
`programs.starship.settings` can accept all valid values (of toml
type).
2024-07-06 20:08:39 +02:00
novenary e3582e5151 sway: unfail units before starting session target
Sometimes services can fail. Failed services will generally not be
restarted by systemd. To start previously failed services we can
just reset their failed state before starting our session target.

GNOME and Plasma do the same thing.

See: https://github.com/alebastr/sway-systemd/pull/11
2024-07-05 17:10:02 +03:00
novenary b7b55e285c sway: stop sway-session.target on exit
This ensures graphical-session.target is properly cycled, and that all
of its members are restarted on consecutive runs.
2024-07-05 17:10:02 +03:00
0x4A6F bbe6e94737
dunst: fix warning for lib.cartesianProductOfSets
"lib.cartesianProductOfSets is a deprecated alias of lib.cartesianProduct."
Rename happened in nixpkgs commit `228621e42dc43f936b66e0ed042c90c511aa0535`.
2024-07-05 10:12:00 +02:00
Robert Helgesson c514e862cd
treewide: fix eval after Nixpkgs maintainer changes 2024-07-05 01:19:01 +02:00
Tadeo Kondrak 6ea6fafa3e
mpv: remove tadeokondrak as maintainer 2024-07-05 01:09:47 +02:00
TheRealGramdalf c23060ce95
hyprland: emphasize usage of the NixOS module 2024-07-05 01:07:22 +02:00
novenary 0a30138c69
mpd: specify dependency of service on socket
This allows `systemctl --user restart mpd.socket` to work properly.
2024-07-04 00:22:58 +02:00
home-manager-bot 58268b4d77
flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/b2852eb9365c6de48ffb0dc2c9562591f652242a?narHash=sha256-C8e9S7RzshSdHB7L%2Bv9I51af1gDM5unhJ2xO1ywxNH8%3D' (2024-06-27)
  → 'github:NixOS/nixpkgs/00d80d13810dbfea8ab4ed1009b09100cca86ba8?narHash=sha256-H3%2BEC5cYuq%2BgQW8y0lSrrDZfH71LB4DAf%2BTDFyvwCNA%3D' (2024-07-01)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-07-03 23:36:42 +02:00
uncenter e915831472
yazi: allow literal string for initLua 2024-07-03 23:36:14 +02:00
sg-qwt 269cc18d94
sway: fix systemd variables example 2024-07-04 03:43:38 +08:00
Sumner Evans 36e2f9da91
maintainers: remove ivar
ivar was removed as a maintainer from upstream nixpkgs due to
inactivity: https://github.com/NixOS/nixpkgs/pull/322266

Signed-off-by: Sumner Evans <me@sumnerevans.com>
2024-07-03 09:39:20 +02:00
home-manager-bot 59ce796b25
flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/2893f56de08021cffd9b6b6dfc70fd9ccd51eb60?narHash=sha256-ECni%2BIkwXjusHsm9Sexdtq8weAq/yUyt1TWIemXt3Ko%3D' (2024-06-24)
  → 'github:NixOS/nixpkgs/b2852eb9365c6de48ffb0dc2c9562591f652242a?narHash=sha256-C8e9S7RzshSdHB7L%2Bv9I51af1gDM5unhJ2xO1ywxNH8%3D' (2024-06-27)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-07-01 11:50:39 +02:00
dependabot[bot] ef74bacbb4
ci: bump DeterminateSystems/update-flake-lock from 22 to 23
Bumps [DeterminateSystems/update-flake-lock](https://github.com/determinatesystems/update-flake-lock) from 22 to 23.
- [Release notes](https://github.com/determinatesystems/update-flake-lock/releases)
- [Commits](https://github.com/determinatesystems/update-flake-lock/compare/v22...v23)

---
updated-dependencies:
- dependency-name: DeterminateSystems/update-flake-lock
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-07-01 11:49:15 +02:00
Shogo Takata 36317d4d38
direnv: add silent option
PR #5586
2024-06-29 18:07:14 +02:00
Robert Helgesson c2f806e60a
pulseeffects: fix test evaluation
Fixes #5588
2024-06-29 17:20:18 +02:00
Gutyina Gergő 7e68e55d2e
glance: add module 2024-06-28 17:24:13 +02:00
home-manager-bot f50e2779ed
flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/d603719ec6e294f034936c0d0dc06f689d91b6c3?narHash=sha256-k3JqJrkdoYwE3fHE6xGDY676AYmyh4U2Zw%2B0Bwe5DLU%3D' (2024-06-20)
  → 'github:NixOS/nixpkgs/2893f56de08021cffd9b6b6dfc70fd9ccd51eb60?narHash=sha256-ECni%2BIkwXjusHsm9Sexdtq8weAq/yUyt1TWIemXt3Ko%3D' (2024-06-24)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-06-28 16:16:42 +02:00
Jakob Kukla 19e2f43e0b
rbw: fix url option examples
rbw expects a protocol for its base_url setting[1]. Otherwise fails
with `rbw unlock: failed to parse base url: relative URL without a
base`.

[1] 741a72cf0d/README.md (configuration)
2024-06-28 16:16:01 +02:00
Shahar "Dawn" Or 1a4f12ae0b
docs: introduction chapter
Adds an introduction chapter to the manual.
2024-06-26 23:48:52 +02:00
Adam Dinwoodie 607f969f5d
systemd: don't try to restart templates
If the user has template services in their systemd configuration, these
can't be restarted, and will produces warnings during the activation
phase.  Avoid those warnings by skipping any uninstantiated templates
when looking for services to start or stop.
2024-06-26 18:14:48 +02:00
Kacper Koniuszy 7a88ff6ad1
systemd: fix sd-switch error on empty target directory
After update to sd-switch 0.5.0, `home-manager switch` failed with the
following error message:

> Error: Error switching
>
> Caused by:
>     0: Failed to build switch plan
>     1: No such file or directory (os error 2)

This was caused by a non-existing target unit directory due to no user
services being managed by home-manager. This change makes sd-switch
run with pkgs.emptyDirectory as the target in such cases.

Closes: https://github.com/nix-community/home-manager/issues/5552
2024-06-26 17:41:48 +02:00
eljamm 92a26bf6df
yazi: add shellWrapperName & rename wrappers to yy
The program shell wrappers have been renamed from `ya` to `yy`
following the introduction of the new CLI tool named `ya`.

With this in mind, the `shellWrapperName` option has been introduced
to provide users with more flexibility in choosing the name they're
most accustomed to (ra, lf, ...).

Co-authored-by: XYenon <register@xyenon.bid>

Co-authored-by: 三咲雅 · Misaki Masa <sxyazi@gmail.com>
2024-06-26 09:08:30 +02:00
eljamm d3bf2a0612
yazi: add eljamm as maintainer 2024-06-25 14:27:44 +01:00
h7x4 6b1f90a8ff
stalonetray: move config file to XDG_CONFIG_HOME 2024-06-24 00:10:26 +02:00
Robert Helgesson d2f631a96e
yazi: ensure plugin suffix .yazi
PR #5492
2024-06-24 00:06:20 +02:00
lordkekz 216d51eb22
yazi: Fix expected structure of flavors 2024-06-23 23:12:50 +02:00
lordkekz 16f86c94ce
yazi: Assert plugin/flavor structure and warn about plugin/flavor suffix
- Always append suffix `.yazi` to plugin's and flavor's attribute names.
- Warn if the attribute names already have the suffix.
- Assert that plugin's and flavor's values point to directories
  containing an `init.lua` file.
2024-06-23 23:12:50 +02:00
Didn't read the style guide 09bc5c5949
yazi: plugin names should be in kebab case (test)
Co-authored-by: 三咲雅 · Misaki Masa <sxyazi@gmail.com>
2024-06-23 23:12:50 +02:00
lordkekz 340b98c0ab
yazi: Assert that plugins have valid structure 2024-06-23 23:12:50 +02:00
lordkekz 5ccc3d6739
yazi: Ensure plugin suffix .yazi
- Append suffix `.yazi` to symlink targets of yazi plugins, if needed
- Improve some docs, especially links to upstream docs.
- Update tests to make use of this feature.
2024-06-23 23:12:50 +02:00
home-manager-bot 6a9a1e51bb
flake.lock: Update
Flake lock file updates:

• Updated input 'nixpkgs':
    'github:NixOS/nixpkgs/b60ebf54c15553b393d144357375ea956f89e9a9?narHash=sha256-pup6cYwtgvzDpvpSCFh1TEUjw2zkNpk8iolbKnyFmmU%3D' (2024-06-16)
  → 'github:NixOS/nixpkgs/d603719ec6e294f034936c0d0dc06f689d91b6c3?narHash=sha256-k3JqJrkdoYwE3fHE6xGDY676AYmyh4U2Zw%2B0Bwe5DLU%3D' (2024-06-20)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
2024-06-23 23:11:27 +02:00
Robert Helgesson 8be82697f7
ssh-agent: fix evaluation of maintainer field 2024-06-23 23:03:18 +02:00
120 changed files with 2147 additions and 1309 deletions

View file

@ -14,7 +14,7 @@ jobs:
- name: Install Nix - name: Install Nix
uses: cachix/install-nix-action@v27 uses: cachix/install-nix-action@v27
- name: Update flake.lock - name: Update flake.lock
uses: DeterminateSystems/update-flake-lock@v22 uses: DeterminateSystems/update-flake-lock@v23
with: with:
token: ${{ secrets.GH_TOKEN_FOR_UPDATES }} token: ${{ secrets.GH_TOKEN_FOR_UPDATES }}
pr-labels: dependencies pr-labels: dependencies

View file

@ -0,0 +1,32 @@
# Introduction to Home Manager {#ch-introduction}
Home Manager is a [Nix](https://nix.dev/)-powered tool for reproducible management of the contents of users' home directories.
This includes programs, configuration files, environment variables and, well… arbitrary files.
The following example snippet of Nix code:
```nix
programs.git = {
enable = true;
userEmail = "joe@example.org";
userName = "joe";
};
```
would make available to a user the `git` executable and man pages and a configuration file `~/.config/git/config`:
```ini
[user]
email = "joe@example.org"
name = "joe"
```
Since Home Manager is implemented in Nix, it provides several benefits:
- Contents are reproducible — a home will be the exact same every time it is built, unless of course, an intentional change is made.
This also means you can have the exact same home on different hosts.
- Significantly faster and more powerful than various backup strategies.
- Unlike "dotfiles" repositories, Home Manager supports specifying programs, as well as their configurations.
- Supported by <http://cache.nixos.org/>, so that you don't have to build from source.
- If you do want to build some programs from source, there is hardly a tool more useful than Nix for that, and the build instructions can be neatly integrated in your Home Manager usage.
- Infinitely composable, so that values in different configuration files and build instructions can share a source of truth.
- Connects you with the [most extensive](https://repology.org/repositories/statistics/total) and [most up-to-date](https://repology.org/repositories/statistics/newest) software package repository on earth, [Nixpkgs](https://github.com/NixOS/nixpkgs).

View file

@ -8,6 +8,7 @@ preface.md
``` ```
```{=include=} parts ```{=include=} parts
introduction.md
installation.md installation.md
usage.md usage.md
nix-flakes.md nix-flakes.md

View file

@ -2,11 +2,11 @@
"nodes": { "nodes": {
"nixpkgs": { "nixpkgs": {
"locked": { "locked": {
"lastModified": 1718530797, "lastModified": 1722185531,
"narHash": "sha256-pup6cYwtgvzDpvpSCFh1TEUjw2zkNpk8iolbKnyFmmU=", "narHash": "sha256-veKR07psFoJjINLC8RK4DiLniGGMgF3QMlS4tb74S6k=",
"owner": "NixOS", "owner": "NixOS",
"repo": "nixpkgs", "repo": "nixpkgs",
"rev": "b60ebf54c15553b393d144357375ea956f89e9a9", "rev": "52ec9ac3b12395ad677e8b62106f0b98c1f8569d",
"type": "github" "type": "github"
}, },
"original": { "original": {

View file

@ -198,9 +198,19 @@ function setFlakeAttribute() {
;; ;;
*) *)
local name="$USER" local name="$USER"
local hostnameArray=()
# FQDN lookup can fail depending on the resolver.
local fqdn
fqdn="$(hostname -f 2> /dev/null)"
if [[ $? -eq 0 ]]; then
hostnameArray+=( "$USER@$fqdn" )
fi
# Check FQDN, long, and short hostnames; long first to preserve # Check FQDN, long, and short hostnames; long first to preserve
# pre-existing behaviour in case both happen to be defined. # pre-existing behaviour in case both happen to be defined.
for n in "$USER@$(hostname -f)" "$USER@$(hostname)" "$USER@$(hostname -s)"; do hostnameArray+=( "$USER@$(hostname)" "$USER@$(hostname -s)" )
for n in "${hostnameArray[@]}"; do
if [[ "$(nix eval "$flake#homeConfigurations" --apply "x: x ? \"$n\"")" == "true" ]]; then if [[ "$(nix eval "$flake#homeConfigurations" --apply "x: x ? \"$n\"")" == "true" ]]; then
name="$n" name="$n"
if [[ -v VERBOSE ]]; then if [[ -v VERBOSE ]]; then

View file

@ -8,8 +8,8 @@ msgstr ""
"Project-Id-Version: Home Manager\n" "Project-Id-Version: Home Manager\n"
"Report-Msgid-Bugs-To: https://github.com/nix-community/home-manager/issues\n" "Report-Msgid-Bugs-To: https://github.com/nix-community/home-manager/issues\n"
"POT-Creation-Date: 2024-04-17 23:19+0200\n" "POT-Creation-Date: 2024-04-17 23:19+0200\n"
"PO-Revision-Date: 2024-06-14 20:40+0000\n" "PO-Revision-Date: 2024-07-05 14:09+0000\n"
"Last-Translator: Balint Barna Kovari <balint+weblate@kovari.cc>\n" "Last-Translator: Ferenci Ákos <synthetace@gmail.com>\n"
"Language-Team: Hungarian <https://hosted.weblate.org/projects/home-manager/" "Language-Team: Hungarian <https://hosted.weblate.org/projects/home-manager/"
"cli/hu/>\n" "cli/hu/>\n"
"Language: hu\n" "Language: hu\n"
@ -17,7 +17,7 @@ msgstr ""
"Content-Type: text/plain; charset=UTF-8\n" "Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n" "Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n != 1;\n" "Plural-Forms: nplurals=2; plural=n != 1;\n"
"X-Generator: Weblate 5.6-dev\n" "X-Generator: Weblate 5.7-dev\n"
#. translators: For example: "home-manager: missing argument for --cores" #. translators: For example: "home-manager: missing argument for --cores"
#: home-manager/home-manager:16 #: home-manager/home-manager:16
@ -36,14 +36,17 @@ msgid ""
"Keeping your Home Manager %s in %s is deprecated,\n" "Keeping your Home Manager %s in %s is deprecated,\n"
"please move it to %s" "please move it to %s"
msgstr "" msgstr ""
"A Home Manager %s %s elérési úton való tárolása elavult. Kérem helyezze át a "
"%s elérési úthoz"
#: home-manager/home-manager:92 #: home-manager/home-manager:92
msgid "No configuration file found. Please create one at %s" msgid "No configuration file found. Please create one at %s"
msgstr "" msgstr ""
"Nem található konfigurációs fájl. Kérem hozza létre a fájlt a %s elérési úton"
#: home-manager/home-manager:107 #: home-manager/home-manager:107
msgid "Home Manager not found at %s." msgid "Home Manager not found at %s."
msgstr "" msgstr "Home Manager nem található a %s elérési úton."
#. translators: This message will be seen by very few users that likely are familiar with English. So feel free to leave this untranslated. #. translators: This message will be seen by very few users that likely are familiar with English. So feel free to leave this untranslated.
#: home-manager/home-manager:115 #: home-manager/home-manager:115
@ -90,23 +93,23 @@ msgstr ""
#: home-manager/home-manager:296 home-manager/home-manager:319 #: home-manager/home-manager:296 home-manager/home-manager:319
#: home-manager/home-manager:1051 #: home-manager/home-manager:1051
msgid "%s: unknown option '%s'" msgid "%s: unknown option '%s'"
msgstr "" msgstr "%s: ismeretlen opció '%s'"
#: home-manager/home-manager:301 home-manager/home-manager:1052 #: home-manager/home-manager:301 home-manager/home-manager:1052
msgid "Run '%s --help' for usage help" msgid "Run '%s --help' for usage help"
msgstr "" msgstr "Futtasa a '%s --help' parancsot a használattal kapcsolatos segítségért"
#: home-manager/home-manager:327 home-manager/home-manager:431 #: home-manager/home-manager:327 home-manager/home-manager:431
msgid "The file %s already exists, leaving it unchanged..." msgid "The file %s already exists, leaving it unchanged..."
msgstr "" msgstr "A fájl %s már létezik és változatlan marad..."
#: home-manager/home-manager:329 home-manager/home-manager:433 #: home-manager/home-manager:329 home-manager/home-manager:433
msgid "Creating %s..." msgid "Creating %s..."
msgstr "" msgstr "%s létrehozása..."
#: home-manager/home-manager:475 #: home-manager/home-manager:475
msgid "Creating initial Home Manager generation..." msgid "Creating initial Home Manager generation..."
msgstr "" msgstr "Kezdeti Home Manager generáció létrehozása..."
#. translators: The "%s" specifier will be replaced by a file path. #. translators: The "%s" specifier will be replaced by a file path.
#: home-manager/home-manager:480 #: home-manager/home-manager:480
@ -132,7 +135,7 @@ msgstr ""
#. translators: Here "flake" is a noun that refers to the Nix Flakes feature. #. translators: Here "flake" is a noun that refers to the Nix Flakes feature.
#: home-manager/home-manager:496 #: home-manager/home-manager:496
msgid "Can't instantiate a flake configuration" msgid "Can't instantiate a flake configuration"
msgstr "" msgstr "Flake konfiguráció nem példányosítható"
#: home-manager/home-manager:572 #: home-manager/home-manager:572
msgid "" msgid ""
@ -155,7 +158,7 @@ msgstr ""
#: home-manager/home-manager:612 #: home-manager/home-manager:612
msgid "Cannot run build in read-only directory" msgid "Cannot run build in read-only directory"
msgstr "" msgstr "Build futtatása nem lehetséges csak-olvasható könyvtárban"
#: home-manager/home-manager:693 #: home-manager/home-manager:693
msgid "No generation with ID %s" msgid "No generation with ID %s"
@ -167,7 +170,7 @@ msgstr ""
#: home-manager/home-manager:697 #: home-manager/home-manager:697
msgid "Removing generation %s" msgid "Removing generation %s"
msgstr "" msgstr "%s generáció eltávolítása"
#: home-manager/home-manager:718 #: home-manager/home-manager:718
msgid "No generations to expire" msgid "No generations to expire"
@ -179,7 +182,7 @@ msgstr ""
#: home-manager/home-manager:811 #: home-manager/home-manager:811
msgid "Unknown argument %s" msgid "Unknown argument %s"
msgstr "" msgstr "Ismeretlen argumentum %s"
#: home-manager/home-manager:835 #: home-manager/home-manager:835
msgid "This will remove Home Manager from your system." msgid "This will remove Home Manager from your system."
@ -199,7 +202,7 @@ msgstr ""
#: home-manager/home-manager:863 #: home-manager/home-manager:863
msgid "Yay!" msgid "Yay!"
msgstr "" msgstr "Hurrá!"
#: home-manager/home-manager:868 #: home-manager/home-manager:868
msgid "Home Manager is uninstalled but your home.nix is left untouched." msgid "Home Manager is uninstalled but your home.nix is left untouched."
@ -211,7 +214,7 @@ msgstr ""
#: home-manager/home-manager:1113 #: home-manager/home-manager:1113
msgid "Unknown command: %s" msgid "Unknown command: %s"
msgstr "" msgstr "Ismeretlen parancs: %s"
#: home-manager/install.nix:18 #: home-manager/install.nix:18
msgid "This derivation is not buildable, please run it using nix-shell." msgid "This derivation is not buildable, please run it using nix-shell."

View file

@ -67,7 +67,7 @@ let
}; };
in { in {
meta.maintainers = [ maintainers.polykernel maintainers.league ]; meta.maintainers = [ maintainers.league ];
imports = [ imports = [
(mkAliasOptionModule [ "xsession" "pointerCursor" "package" ] [ (mkAliasOptionModule [ "xsession" "pointerCursor" "package" ] [

View file

@ -49,6 +49,12 @@
github = "bertof"; github = "bertof";
githubId = 9915675; githubId = 9915675;
}; };
bricked = {
name = "Bricked";
email = "hello@bricked.dev";
github = "brckd";
githubId = 92804487;
};
CarlosLoboxyz = { CarlosLoboxyz = {
name = "Carlos Lobo"; name = "Carlos Lobo";
email = "86011416+CarlosLoboxyz@users.noreply.github.com"; email = "86011416+CarlosLoboxyz@users.noreply.github.com";
@ -113,6 +119,13 @@
github = "jack5079"; github = "jack5079";
githubId = 29169102; githubId = 29169102;
}; };
janik = {
name = "Janik";
email = "janik@aq0.de";
matrix = "@janik0:matrix.org";
github = "Janik-Haag";
githubId = 80165193;
};
jkarlson = { jkarlson = {
email = "jekarlson@gmail.com"; email = "jekarlson@gmail.com";
github = "jkarlson"; github = "jkarlson";
@ -173,6 +186,13 @@
github = "iosmanthus"; github = "iosmanthus";
githubId = 16307070; githubId = 16307070;
}; };
jonringer = {
email = "jonringer117@gmail.com";
matrix = "@jonringer:matrix.org";
github = "jonringer";
githubId = 7673602;
name = "Jonathan Ringer";
};
kalhauge = { kalhauge = {
name = "Christian Gram Kalhauge"; name = "Christian Gram Kalhauge";
email = "kalhauge@users.noreply.github.com"; email = "kalhauge@users.noreply.github.com";
@ -201,6 +221,19 @@
github = "kubukoz"; github = "kubukoz";
githubId = 894884; githubId = 894884;
}; };
lheckemann = {
name = "Linus Heckemann";
email = "git@sphalerite.org";
github = "lheckemann";
githubId = 341954;
};
lilyinstarlight = {
email = "lily@lily.flowers";
matrix = "@lily:lily.flowers";
github = "lilyinstarlight";
githubId = 298109;
name = "Lily Foster";
};
loicreynier = { loicreynier = {
name = "Loïc Reynier"; name = "Loïc Reynier";
email = "loic@loireynier.fr"; email = "loic@loireynier.fr";

View file

@ -1679,6 +1679,30 @@ in {
https://github.com/rafaelmardojai/blanket for more. https://github.com/rafaelmardojai/blanket for more.
''; '';
} }
{
time = "2024-06-26T07:07:17+00:00";
condition = with config.programs.yazi;
enable && (enableBashIntegration || enableZshIntegration
|| enableFishIntegration || enableNushellIntegration);
message = ''
Yazi's shell integration wrappers have been renamed from 'ya' to 'yy'.
A new option `programs.yazi.shellWrapperName` is also available that
allows you to override this name.
'';
}
{
time = "2024-06-28T14:18:16+00:00";
condition = hostPlatform.isLinux;
message = ''
A new module is available: 'services.glance'.
Glance is a self-hosted dashboard that puts all your feeds in
one place. See https://github.com/glanceapp/glance for more.
'';
}
]; ];
}; };
} }

View file

@ -311,5 +311,5 @@ in {
}) })
]); ]);
meta.maintainers = [ maintainers.polykernel ]; meta.maintainers = [ ];
} }

View file

@ -51,7 +51,7 @@ let
terminal = mkOption { terminal = mkOption {
description = "Whether the program runs in a terminal window."; description = "Whether the program runs in a terminal window.";
type = types.bool; type = types.nullOr types.bool;
default = false; default = false;
}; };

View file

@ -301,6 +301,7 @@ let
./services/fusuma.nix ./services/fusuma.nix
./services/getmail.nix ./services/getmail.nix
./services/git-sync.nix ./services/git-sync.nix
./services/glance.nix
./services/gnome-keyring.nix ./services/gnome-keyring.nix
./services/gpg-agent.nix ./services/gpg-agent.nix
./services/grobi.nix ./services/grobi.nix

View file

@ -110,18 +110,18 @@ in {
programs.bash.initExtra = mkIf cfg.enableBashIntegration '' programs.bash.initExtra = mkIf cfg.enableBashIntegration ''
if [[ :$SHELLOPTS: =~ :(vi|emacs): ]]; then if [[ :$SHELLOPTS: =~ :(vi|emacs): ]]; then
source "${pkgs.bash-preexec}/share/bash/bash-preexec.sh" source "${pkgs.bash-preexec}/share/bash/bash-preexec.sh"
eval "$(${cfg.package}/bin/atuin init bash ${flagsStr})" eval "$(${lib.getExe cfg.package} init bash ${flagsStr})"
fi fi
''; '';
programs.zsh.initExtra = mkIf cfg.enableZshIntegration '' programs.zsh.initExtra = mkIf cfg.enableZshIntegration ''
if [[ $options[zle] = on ]]; then if [[ $options[zle] = on ]]; then
eval "$(${cfg.package}/bin/atuin init zsh ${flagsStr})" eval "$(${lib.getExe cfg.package} init zsh ${flagsStr})"
fi fi
''; '';
programs.fish.interactiveShellInit = mkIf cfg.enableFishIntegration '' programs.fish.interactiveShellInit = mkIf cfg.enableFishIntegration ''
${cfg.package}/bin/atuin init fish ${flagsStr} | source ${lib.getExe cfg.package} init fish ${flagsStr} | source
''; '';
programs.nushell = mkIf cfg.enableNushellIntegration { programs.nushell = mkIf cfg.enableNushellIntegration {
@ -130,7 +130,9 @@ in {
if not ($atuin_cache | path exists) { if not ($atuin_cache | path exists) {
mkdir $atuin_cache mkdir $atuin_cache
} }
${cfg.package}/bin/atuin init nu ${flagsStr} | save --force ${config.xdg.cacheHome}/atuin/init.nu ${
lib.getExe cfg.package
} init nu ${flagsStr} | save --force ${config.xdg.cacheHome}/atuin/init.nu
''; '';
extraConfig = '' extraConfig = ''
source ${config.xdg.cacheHome}/atuin/init.nu source ${config.xdg.cacheHome}/atuin/init.nu

View file

@ -56,5 +56,5 @@ in {
}; };
}; };
meta.maintainers = [ maintainers.polykernel ]; meta.maintainers = [ ];
} }

View file

@ -95,6 +95,7 @@ in {
package = mkPackageOption pkgs "nix-direnv" { }; package = mkPackageOption pkgs "nix-direnv" { };
}; };
silent = mkEnableOption "silent mode, that is, disabling direnv logging";
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
@ -163,5 +164,7 @@ in {
} }
) )
''); '');
home.sessionVariables = lib.mkIf cfg.silent { DIRENV_LOG_FORMAT = ""; };
}; };
} }

View file

@ -5,6 +5,7 @@ with lib;
let let
cfg = config.programs.eww; cfg = config.programs.eww;
ewwCmd = "${cfg.package}/bin/eww";
in { in {
meta.maintainers = [ hm.maintainers.mainrs ]; meta.maintainers = [ hm.maintainers.mainrs ];
@ -30,10 +31,40 @@ in {
{file}`$XDG_CONFIG_HOME/eww`. {file}`$XDG_CONFIG_HOME/eww`.
''; '';
}; };
enableBashIntegration = mkEnableOption "Bash integration" // {
default = true;
};
enableZshIntegration = mkEnableOption "Zsh integration" // {
default = true;
};
enableFishIntegration = mkEnableOption "Fish integration" // {
default = true;
};
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ cfg.package ]; home.packages = [ cfg.package ];
xdg.configFile."eww".source = cfg.configDir; xdg.configFile."eww".source = cfg.configDir;
programs.bash.initExtra = mkIf cfg.enableBashIntegration ''
if [[ $TERM != "dumb" ]]; then
eval "$(${ewwCmd} shell-completions --shell bash)"
fi
'';
programs.zsh.initExtra = mkIf cfg.enableZshIntegration ''
if [[ $TERM != "dumb" ]]; then
eval "$(${ewwCmd} shell-completions --shell zsh)"
fi
'';
programs.fish.interactiveShellInit = mkIf cfg.enableFishIntegration ''
if test "$TERM" != "dumb"
eval "$(${ewwCmd} shell-completions --shell fish)"
end
'';
}; };
} }

View file

@ -1,945 +1,51 @@
{ config, lib, pkgs, ... }: { lib, ... }:
with lib; with lib;
let let
inherit (pkgs.stdenv.hostPlatform) isDarwin; modulePath = [ "programs" "firefox" ];
cfg = config.programs.firefox; moduleName = concatStringsSep "." modulePath;
jsonFormat = pkgs.formats.json { }; mkFirefoxModule = import ./firefox/mkFirefoxModule.nix;
mozillaConfigPath =
if isDarwin then "Library/Application Support/Mozilla" else ".mozilla";
firefoxConfigPath = if isDarwin then
"Library/Application Support/Firefox"
else
"${mozillaConfigPath}/firefox";
profilesPath =
if isDarwin then "${firefoxConfigPath}/Profiles" else firefoxConfigPath;
nativeMessagingHostsPath = if isDarwin then
"${mozillaConfigPath}/NativeMessagingHosts"
else
"${mozillaConfigPath}/native-messaging-hosts";
nativeMessagingHostsJoined = pkgs.symlinkJoin {
name = "ff_native-messaging-hosts";
paths = [
# Link a .keep file to keep the directory around
(pkgs.writeTextDir "lib/mozilla/native-messaging-hosts/.keep" "")
# Link package configured native messaging hosts (entire Firefox actually)
cfg.finalPackage
]
# Link user configured native messaging hosts
++ cfg.nativeMessagingHosts;
};
# The extensions path shared by all profiles; will not be supported
# by future Firefox versions.
extensionPath = "extensions/{ec8030f7-c20a-464f-9b0e-13a3a9e97384}";
profiles = flip mapAttrs' cfg.profiles (_: profile:
nameValuePair "Profile${toString profile.id}" {
Name = profile.name;
Path = if isDarwin then "Profiles/${profile.path}" else profile.path;
IsRelative = 1;
Default = if profile.isDefault then 1 else 0;
}) // {
General = { StartWithLastProfile = 1; };
};
profilesIni = generators.toINI { } profiles;
userPrefValue = pref:
builtins.toJSON (if isBool pref || isInt pref || isString pref then
pref
else
builtins.toJSON pref);
mkUserJs = prefs: extraPrefs: bookmarks:
let
prefs' = lib.optionalAttrs ([ ] != bookmarks) {
"browser.bookmarks.file" = toString (firefoxBookmarksFile bookmarks);
"browser.places.importBookmarksHTML" = true;
} // prefs;
in ''
// Generated by Home Manager.
${concatStrings (mapAttrsToList (name: value: ''
user_pref("${name}", ${userPrefValue value});
'') prefs')}
${extraPrefs}
'';
mkContainersJson = containers:
let
containerToIdentity = _: container: {
userContextId = container.id;
name = container.name;
icon = container.icon;
color = container.color;
public = true;
};
in ''
${builtins.toJSON {
version = 4;
lastUserContextId =
elemAt (mapAttrsToList (_: container: container.id) containers) 0;
identities = mapAttrsToList containerToIdentity containers ++ [
{
userContextId = 4294967294; # 2^32 - 2
name = "userContextIdInternal.thumbnail";
icon = "";
color = "";
accessKey = "";
public = false;
}
{
userContextId = 4294967295; # 2^32 - 1
name = "userContextIdInternal.webextStorageLocal";
icon = "";
color = "";
accessKey = "";
public = false;
}
];
}}
'';
firefoxBookmarksFile = bookmarks:
let
indent = level:
lib.concatStringsSep "" (map (lib.const " ") (lib.range 1 level));
bookmarkToHTML = indentLevel: bookmark:
''
${indent indentLevel}<DT><A HREF="${
escapeXML bookmark.url
}" ADD_DATE="1" LAST_MODIFIED="1"${
lib.optionalString (bookmark.keyword != null)
" SHORTCUTURL=\"${escapeXML bookmark.keyword}\""
}${
lib.optionalString (bookmark.tags != [ ])
" TAGS=\"${escapeXML (concatStringsSep "," bookmark.tags)}\""
}>${escapeXML bookmark.name}</A>'';
directoryToHTML = indentLevel: directory: ''
${indent indentLevel}<DT>${
if directory.toolbar then
''
<H3 ADD_DATE="1" LAST_MODIFIED="1" PERSONAL_TOOLBAR_FOLDER="true">Bookmarks Toolbar''
else
''<H3 ADD_DATE="1" LAST_MODIFIED="1">${escapeXML directory.name}''
}</H3>
${indent indentLevel}<DL><p>
${allItemsToHTML (indentLevel + 1) directory.bookmarks}
${indent indentLevel}</DL><p>'';
itemToHTMLOrRecurse = indentLevel: item:
if item ? "url" then
bookmarkToHTML indentLevel item
else
directoryToHTML indentLevel item;
allItemsToHTML = indentLevel: bookmarks:
lib.concatStringsSep "\n"
(map (itemToHTMLOrRecurse indentLevel) bookmarks);
bookmarkEntries = allItemsToHTML 1 bookmarks;
in pkgs.writeText "firefox-bookmarks.html" ''
<!DOCTYPE NETSCAPE-Bookmark-file-1>
<!-- This is an automatically generated file.
It will be read and overwritten.
DO NOT EDIT! -->
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=UTF-8">
<TITLE>Bookmarks</TITLE>
<H1>Bookmarks Menu</H1>
<DL><p>
${bookmarkEntries}
</DL>
'';
mkNoDuplicateAssertion = entities: entityKind:
(let
# Return an attribute set with entity IDs as keys and a list of
# entity names with corresponding ID as value. An ID is present in
# the result only if more than one entity has it. The argument
# entities is a list of AttrSet of one id/name pair.
findDuplicateIds = entities:
filterAttrs (_entityId: entityNames: length entityNames != 1)
(zipAttrs entities);
duplicates = findDuplicateIds (mapAttrsToList
(entityName: entity: { "${toString entity.id}" = entityName; })
entities);
mkMsg = entityId: entityNames:
" - ID ${entityId} is used by " + concatStringsSep ", " entityNames;
in {
assertion = duplicates == { };
message = ''
Must not have a Firefox ${entityKind} with an existing ID but
'' + concatStringsSep "\n" (mapAttrsToList mkMsg duplicates);
});
wrapPackage = package:
let
# The configuration expected by the Firefox wrapper.
fcfg = { enableGnomeExtensions = cfg.enableGnomeExtensions; };
# A bit of hackery to force a config into the wrapper.
browserName =
package.browserName or (builtins.parseDrvName package.name).name;
# The configuration expected by the Firefox wrapper builder.
bcfg = setAttrByPath [ browserName ] fcfg;
in if package == null then
null
else if isDarwin then
package
else if versionAtLeast config.home.stateVersion "19.09" then
package.override (old: {
cfg = old.cfg or { } // fcfg;
extraPolicies = (old.extraPolicies or { }) // cfg.policies;
})
else
(pkgs.wrapFirefox.override { config = bcfg; }) package { };
in { in {
meta.maintainers = [ maintainers.rycee maintainers.kira-bruneau ]; meta.maintainers =
[ maintainers.rycee maintainers.kira-bruneau hm.maintainers.bricked ];
imports = [ imports = [
(mkRemovedOptionModule [ "programs" "firefox" "extensions" ] '' (mkFirefoxModule {
inherit modulePath;
name = "Firefox";
wrappedPackageName = "firefox";
unwrappedPackageName = "firefox-unwrapped";
visible = true;
platforms.linux = rec {
vendorPath = ".mozilla";
configPath = "${vendorPath}/firefox";
};
platforms.darwin = {
vendorPath = "Library/Application Support/Mozilla";
configPath = "Library/Application Support/Firefox";
};
})
(mkRemovedOptionModule (modulePath ++ [ "extensions" ]) ''
Extensions are now managed per-profile. That is, change from Extensions are now managed per-profile. That is, change from
programs.firefox.extensions = [ foo bar ]; ${moduleName}.extensions = [ foo bar ];
to to
programs.firefox.profiles.myprofile.extensions = [ foo bar ];'') ${moduleName}.profiles.myprofile.extensions = [ foo bar ];'')
(mkRemovedOptionModule [ "programs" "firefox" "enableAdobeFlash" ] (mkRemovedOptionModule (modulePath ++ [ "enableAdobeFlash" ])
"Support for this option has been removed.") "Support for this option has been removed.")
(mkRemovedOptionModule [ "programs" "firefox" "enableGoogleTalk" ] (mkRemovedOptionModule (modulePath ++ [ "enableGoogleTalk" ])
"Support for this option has been removed.") "Support for this option has been removed.")
(mkRemovedOptionModule [ "programs" "firefox" "enableIcedTea" ] (mkRemovedOptionModule (modulePath ++ [ "enableIcedTea" ])
"Support for this option has been removed.") "Support for this option has been removed.")
]; ];
options = {
programs.firefox = {
enable = mkEnableOption "Firefox";
package = mkOption {
type = with types; nullOr package;
default = if versionAtLeast config.home.stateVersion "19.09" then
pkgs.firefox
else
pkgs.firefox-unwrapped;
defaultText = literalExpression "pkgs.firefox";
example = literalExpression ''
pkgs.firefox.override {
# See nixpkgs' firefox/wrapper.nix to check which options you can use
nativeMessagingHosts = [
# Gnome shell native connector
pkgs.gnome-browser-connector
# Tridactyl native connector
pkgs.tridactyl-native
];
}
'';
description = ''
The Firefox package to use. If state version  19.09 then
this should be a wrapped Firefox package. For earlier state
versions it should be an unwrapped Firefox package.
Set to `null` to disable installing Firefox.
'';
};
nativeMessagingHosts = mkOption {
type = types.listOf types.package;
default = [ ];
description = ''
Additional packages containing native messaging hosts that should be
made available to Firefox extensions.
'';
};
finalPackage = mkOption {
type = with types; nullOr package;
readOnly = true;
description = "Resulting Firefox package.";
};
policies = mkOption {
type = types.attrsOf jsonFormat.type;
default = { };
description =
"[See list of policies](https://mozilla.github.io/policy-templates/).";
example = {
DefaultDownloadDirectory = "\${home}/Downloads";
BlockAboutConfig = true;
};
};
profiles = mkOption {
type = types.attrsOf (types.submodule ({ config, name, ... }: {
options = {
name = mkOption {
type = types.str;
default = name;
description = "Profile name.";
};
id = mkOption {
type = types.ints.unsigned;
default = 0;
description = ''
Profile ID. This should be set to a unique number per profile.
'';
};
settings = mkOption {
type = types.attrsOf (jsonFormat.type // {
description =
"Firefox preference (int, bool, string, and also attrs, list, float as a JSON string)";
});
default = { };
example = literalExpression ''
{
"browser.startup.homepage" = "https://nixos.org";
"browser.search.region" = "GB";
"browser.search.isUS" = false;
"distribution.searchplugins.defaultLocale" = "en-GB";
"general.useragent.locale" = "en-GB";
"browser.bookmarks.showMobileBookmarks" = true;
"browser.newtabpage.pinned" = [{
title = "NixOS";
url = "https://nixos.org";
}];
}
'';
description = ''
Attribute set of Firefox preferences.
Firefox only supports int, bool, and string types for
preferences, but home-manager will automatically
convert all other JSON-compatible values into strings.
'';
};
extraConfig = mkOption {
type = types.lines;
default = "";
description = ''
Extra preferences to add to {file}`user.js`.
'';
};
userChrome = mkOption {
type = types.lines;
default = "";
description = "Custom Firefox user chrome CSS.";
example = ''
/* Hide tab bar in FF Quantum */
@-moz-document url("chrome://browser/content/browser.xul") {
#TabsToolbar {
visibility: collapse !important;
margin-bottom: 21px !important;
}
#sidebar-box[sidebarcommand="treestyletab_piro_sakura_ne_jp-sidebar-action"] #sidebar-header {
visibility: collapse !important;
}
}
'';
};
userContent = mkOption {
type = types.lines;
default = "";
description = "Custom Firefox user content CSS.";
example = ''
/* Hide scrollbar in FF Quantum */
*{scrollbar-width:none !important}
'';
};
bookmarks = mkOption {
type = let
bookmarkSubmodule = types.submodule ({ config, name, ... }: {
options = {
name = mkOption {
type = types.str;
default = name;
description = "Bookmark name.";
};
tags = mkOption {
type = types.listOf types.str;
default = [ ];
description = "Bookmark tags.";
};
keyword = mkOption {
type = types.nullOr types.str;
default = null;
description = "Bookmark search keyword.";
};
url = mkOption {
type = types.str;
description = "Bookmark url, use %s for search terms.";
};
};
}) // {
description = "bookmark submodule";
};
bookmarkType = types.addCheck bookmarkSubmodule (x: x ? "url");
directoryType = types.submodule ({ config, name, ... }: {
options = {
name = mkOption {
type = types.str;
default = name;
description = "Directory name.";
};
bookmarks = mkOption {
type = types.listOf nodeType;
default = [ ];
description = "Bookmarks within directory.";
};
toolbar = mkOption {
type = types.bool;
default = false;
description = ''
Make this the toolbar directory. Note, this does _not_
mean that this directory will be added to the toolbar,
this directory _is_ the toolbar.
'';
};
};
}) // {
description = "directory submodule";
};
nodeType = types.either bookmarkType directoryType;
in with types;
coercedTo (attrsOf nodeType) attrValues (listOf nodeType);
default = [ ];
example = literalExpression ''
[
{
name = "wikipedia";
tags = [ "wiki" ];
keyword = "wiki";
url = "https://en.wikipedia.org/wiki/Special:Search?search=%s&go=Go";
}
{
name = "kernel.org";
url = "https://www.kernel.org";
}
{
name = "Nix sites";
toolbar = true;
bookmarks = [
{
name = "homepage";
url = "https://nixos.org/";
}
{
name = "wiki";
tags = [ "wiki" "nix" ];
url = "https://wiki.nixos.org/";
}
];
}
]
'';
description = ''
Preloaded bookmarks. Note, this may silently overwrite any
previously existing bookmarks!
'';
};
path = mkOption {
type = types.str;
default = name;
description = "Profile path.";
};
isDefault = mkOption {
type = types.bool;
default = config.id == 0;
defaultText = "true if profile ID is 0";
description = "Whether this is a default profile.";
};
search = {
force = mkOption {
type = with types; bool;
default = false;
description = ''
Whether to force replace the existing search
configuration. This is recommended since Firefox will
replace the symlink for the search configuration on every
launch, but note that you'll lose any existing
configuration by enabling this.
'';
};
default = mkOption {
type = with types; nullOr str;
default = null;
example = "DuckDuckGo";
description = ''
The default search engine used in the address bar and search bar.
'';
};
privateDefault = mkOption {
type = with types; nullOr str;
default = null;
example = "DuckDuckGo";
description = ''
The default search engine used in the Private Browsing.
'';
};
order = mkOption {
type = with types; uniq (listOf str);
default = [ ];
example = [ "DuckDuckGo" "Google" ];
description = ''
The order the search engines are listed in. Any engines
that aren't included in this list will be listed after
these in an unspecified order.
'';
};
engines = mkOption {
type = with types; attrsOf (attrsOf jsonFormat.type);
default = { };
example = literalExpression ''
{
"Nix Packages" = {
urls = [{
template = "https://search.nixos.org/packages";
params = [
{ name = "type"; value = "packages"; }
{ name = "query"; value = "{searchTerms}"; }
];
}];
icon = "''${pkgs.nixos-icons}/share/icons/hicolor/scalable/apps/nix-snowflake.svg";
definedAliases = [ "@np" ];
};
"NixOS Wiki" = {
urls = [{ template = "https://wiki.nixos.org/index.php?search={searchTerms}"; }];
iconUpdateURL = "https://wiki.nixos.org/favicon.png";
updateInterval = 24 * 60 * 60 * 1000; # every day
definedAliases = [ "@nw" ];
};
"Bing".metaData.hidden = true;
"Google".metaData.alias = "@g"; # builtin engines only support specifying one additional alias
}
'';
description = ''
Attribute set of search engine configurations. Engines
that only have {var}`metaData` specified will
be treated as builtin to Firefox.
See [SearchEngine.jsm](https://searchfox.org/mozilla-central/rev/669329e284f8e8e2bb28090617192ca9b4ef3380/toolkit/components/search/SearchEngine.jsm#1138-1177)
in Firefox's source for available options. We maintain a
mapping to let you specify all options in the referenced
link without underscores, but it may fall out of date with
future options.
Note, {var}`icon` is also a special option
added by Home Manager to make it convenient to specify
absolute icon paths.
'';
};
};
containersForce = mkOption {
type = types.bool;
default = false;
description = ''
Whether to force replace the existing containers
configuration. This is recommended since Firefox will
replace the symlink on every launch, but note that you'll
lose any existing configuration by enabling this.
'';
};
containers = mkOption {
type = types.attrsOf (types.submodule ({ name, ... }: {
options = {
name = mkOption {
type = types.str;
default = name;
description = "Container name, e.g., shopping.";
};
id = mkOption {
type = types.ints.unsigned;
default = 0;
description = ''
Container ID. This should be set to a unique number per container in this profile.
'';
};
# List of colors at
# https://searchfox.org/mozilla-central/rev/5ad226c7379b0564c76dc3b54b44985356f94c5a/toolkit/components/extensions/parent/ext-contextualIdentities.js#32
color = mkOption {
type = types.enum [
"blue"
"turquoise"
"green"
"yellow"
"orange"
"red"
"pink"
"purple"
"toolbar"
];
default = "pink";
description = "Container color.";
};
icon = mkOption {
type = types.enum [
"briefcase"
"cart"
"circle"
"dollar"
"fence"
"fingerprint"
"gift"
"vacation"
"food"
"fruit"
"pet"
"tree"
"chill"
];
default = "fruit";
description = "Container icon.";
};
};
}));
default = { };
example = {
"shopping" = {
id = 1;
color = "blue";
icon = "cart";
};
"dangerous" = {
id = 2;
color = "red";
icon = "fruit";
};
};
description = ''
Attribute set of container configurations. See
[Multi-Account
Containers](https://support.mozilla.org/en-US/kb/containers)
for more information.
'';
};
extensions = mkOption {
type = types.listOf types.package;
default = [ ];
example = literalExpression ''
with pkgs.nur.repos.rycee.firefox-addons; [
privacy-badger
]
'';
description = ''
List of Firefox add-on packages to install for this profile.
Some pre-packaged add-ons are accessible from the
[Nix User Repository](https://github.com/nix-community/NUR).
Once you have NUR installed run
```console
$ nix-env -f '<nixpkgs>' -qaP -A nur.repos.rycee.firefox-addons
```
to list the available Firefox add-ons.
Note that it is necessary to manually enable these extensions
inside Firefox after the first installation.
To automatically enable extensions add
`"extensions.autoDisableScopes" = 0;`
to
[{option}`programs.firefox.profiles.<profile>.settings`](#opt-programs.firefox.profiles._name_.settings)
'';
};
};
}));
default = { };
description = "Attribute set of Firefox profiles.";
};
enableGnomeExtensions = mkOption {
type = types.bool;
default = false;
description = ''
Whether to enable the GNOME Shell native host connector. Note, you
also need to set the NixOS option
`services.gnome.gnome-browser-connector.enable` to
`true`.
'';
};
};
};
config = mkIf cfg.enable {
assertions = [
(let
defaults =
catAttrs "name" (filter (a: a.isDefault) (attrValues cfg.profiles));
in {
assertion = cfg.profiles == { } || length defaults == 1;
message = "Must have exactly one default Firefox profile but found "
+ toString (length defaults) + optionalString (length defaults > 1)
(", namely " + concatStringsSep ", " defaults);
})
(let
getContainers = profiles:
flatten
(mapAttrsToList (_: value: (attrValues value.containers)) profiles);
findInvalidContainerIds = profiles:
filter (container: container.id >= 4294967294)
(getContainers profiles);
in {
assertion = cfg.profiles == { }
|| length (findInvalidContainerIds cfg.profiles) == 0;
message = "Container id must be smaller than 4294967294 (2^32 - 2)";
})
(mkNoDuplicateAssertion cfg.profiles "profile")
] ++ (mapAttrsToList
(_: profile: mkNoDuplicateAssertion profile.containers "container")
cfg.profiles);
warnings = optional (cfg.enableGnomeExtensions or false) ''
Using 'programs.firefox.enableGnomeExtensions' has been deprecated and
will be removed in the future. Please change to overriding the package
configuration using 'programs.firefox.package' instead. You can refer to
its example for how to do this.
'';
programs.firefox.finalPackage = wrapPackage cfg.package;
home.packages = lib.optional (cfg.finalPackage != null) cfg.finalPackage;
home.file = mkMerge ([{
"${firefoxConfigPath}/profiles.ini" =
mkIf (cfg.profiles != { }) { text = profilesIni; };
"${nativeMessagingHostsPath}" = {
source =
"${nativeMessagingHostsJoined}/lib/mozilla/native-messaging-hosts";
recursive = true;
};
}] ++ flip mapAttrsToList cfg.profiles (_: profile: {
"${profilesPath}/${profile.path}/.keep".text = "";
"${profilesPath}/${profile.path}/chrome/userChrome.css" =
mkIf (profile.userChrome != "") { text = profile.userChrome; };
"${profilesPath}/${profile.path}/chrome/userContent.css" =
mkIf (profile.userContent != "") { text = profile.userContent; };
"${profilesPath}/${profile.path}/user.js" = mkIf (profile.settings != { }
|| profile.extraConfig != "" || profile.bookmarks != [ ]) {
text =
mkUserJs profile.settings profile.extraConfig profile.bookmarks;
};
"${profilesPath}/${profile.path}/containers.json" =
mkIf (profile.containers != { }) {
force = profile.containersForce;
text = mkContainersJson profile.containers;
};
"${profilesPath}/${profile.path}/search.json.mozlz4" = mkIf
(profile.search.default != null || profile.search.privateDefault != null
|| profile.search.order != [ ] || profile.search.engines != { }) {
force = profile.search.force;
source = let
settings = {
version = 6;
engines = let
# Map of nice field names to internal field names.
# This is intended to be exhaustive and should be
# updated at every version bump.
internalFieldNames = (genAttrs [
"name"
"isAppProvided"
"loadPath"
"hasPreferredIcon"
"updateInterval"
"updateURL"
"iconUpdateURL"
"iconURL"
"iconMapObj"
"metaData"
"orderHint"
"definedAliases"
"urls"
] (name: "_${name}")) // {
searchForm = "__searchForm";
};
processCustomEngineInput = input:
(removeAttrs input [ "icon" ])
// optionalAttrs (input ? icon) {
# Convenience to specify absolute path to icon
iconURL = "file://${input.icon}";
} // (optionalAttrs (input ? iconUpdateURL) {
# Convenience to default iconURL to iconUpdateURL so
# the icon is immediately downloaded from the URL
iconURL = input.iconURL or input.iconUpdateURL;
} // {
# Required for custom engine configurations, loadPaths
# are unique identifiers that are generally formatted
# like: [source]/path/to/engine.xml
loadPath = ''
[home-manager]/programs.firefox.profiles.${profile.name}.search.engines."${
replaceStrings [ "\\" ] [ "\\\\" ] input.name
}"'';
});
processEngineInput = name: input:
let
requiredInput = {
inherit name;
isAppProvided = input.isAppProvided or removeAttrs input
[ "metaData" ] == { };
metaData = input.metaData or { };
};
in if requiredInput.isAppProvided then
requiredInput
else
processCustomEngineInput (input // requiredInput);
buildEngineConfig = name: input:
mapAttrs' (name: value: {
name = internalFieldNames.${name} or name;
inherit value;
}) (processEngineInput name input);
sortEngineConfigs = configs:
let
buildEngineConfigWithOrder = order: name:
let
config = configs.${name} or {
_name = name;
_isAppProvided = true;
_metaData = { };
};
in config // {
_metaData = config._metaData // { inherit order; };
};
engineConfigsWithoutOrder =
attrValues (removeAttrs configs profile.search.order);
sortedEngineConfigs =
(imap buildEngineConfigWithOrder profile.search.order)
++ engineConfigsWithoutOrder;
in sortedEngineConfigs;
engineInput = profile.search.engines // {
# Infer profile.search.default as an app provided
# engine if it's not in profile.search.engines
${profile.search.default} =
profile.search.engines.${profile.search.default} or { };
} // {
${profile.search.privateDefault} =
profile.search.engines.${profile.search.privateDefault} or { };
};
in sortEngineConfigs (mapAttrs buildEngineConfig engineInput);
metaData = optionalAttrs (profile.search.default != null) {
current = profile.search.default;
hash = "@hash@";
} // optionalAttrs (profile.search.privateDefault != null) {
private = profile.search.privateDefault;
privateHash = "@privateHash@";
} // {
useSavedOrder = profile.search.order != [ ];
};
};
# Home Manager doesn't circumvent user consent and isn't acting
# maliciously. We're modifying the search outside of Firefox, but
# a claim by Mozilla to remove this would be very anti-user, and
# is unlikely to be an issue for our use case.
disclaimer = appName:
"By modifying this file, I agree that I am doing so "
+ "only within ${appName} itself, using official, user-driven search "
+ "engine selection processes, and in a way which does not circumvent "
+ "user consent. I acknowledge that any attempt to change this file "
+ "from outside of ${appName} is a malicious act, and will be responded "
+ "to accordingly.";
salt = if profile.search.default != null then
profile.path + profile.search.default + disclaimer "Firefox"
else
null;
privateSalt = if profile.search.privateDefault != null then
profile.path + profile.search.privateDefault
+ disclaimer "Firefox"
else
null;
in pkgs.runCommand "search.json.mozlz4" {
nativeBuildInputs = with pkgs; [ mozlz4a openssl ];
json = builtins.toJSON settings;
inherit salt privateSalt;
} ''
if [[ -n $salt ]]; then
export hash=$(echo -n "$salt" | openssl dgst -sha256 -binary | base64)
export privateHash=$(echo -n "$privateSalt" | openssl dgst -sha256 -binary | base64)
mozlz4a <(substituteStream json search.json.in --subst-var hash --subst-var privateHash) "$out"
else
mozlz4a <(echo "$json") "$out"
fi
'';
};
"${profilesPath}/${profile.path}/extensions" =
mkIf (profile.extensions != [ ]) {
source = let
extensionsEnvPkg = pkgs.buildEnv {
name = "hm-firefox-extensions";
paths = profile.extensions;
};
in "${extensionsEnvPkg}/share/mozilla/${extensionPath}";
recursive = true;
force = true;
};
}));
};
} }

File diff suppressed because it is too large Load diff

View file

@ -7,7 +7,7 @@ let
yamlFormat = pkgs.formats.yaml { }; yamlFormat = pkgs.formats.yaml { };
in { in {
meta.maintainers = [ lib.maintainers.janik ]; meta.maintainers = [ lib.hm.maintainers.janik ];
options.programs.gh-dash = { options.programs.gh-dash = {
enable = lib.mkEnableOption "GitHub CLI dashboard plugin"; enable = lib.mkEnableOption "GitHub CLI dashboard plugin";

View file

@ -316,7 +316,7 @@ in {
}) })
]; ];
home.packages = [ pkgs.gnome.gnome-terminal ]; home.packages = [ pkgs.gnome-terminal ];
dconf.settings = let dconfPath = "org/gnome/terminal/legacy"; dconf.settings = let dconfPath = "org/gnome/terminal/legacy";
in { in {

View file

@ -7,7 +7,7 @@ let
jsonFormat = pkgs.formats.json { }; jsonFormat = pkgs.formats.json { };
in { in {
meta.maintainers = [ maintainers.lilyinstarlight ]; meta.maintainers = [ hm.maintainers.lilyinstarlight ];
options.programs.hyfetch = { options.programs.hyfetch = {
enable = mkEnableOption "hyfetch"; enable = mkEnableOption "hyfetch";

View file

@ -7,6 +7,11 @@ let
cfg = config.programs.jujutsu; cfg = config.programs.jujutsu;
tomlFormat = pkgs.formats.toml { }; tomlFormat = pkgs.formats.toml { };
configDir = if pkgs.stdenv.isDarwin then
"Library/Application Support"
else
config.xdg.configHome;
in { in {
meta.maintainers = [ maintainers.shikanime ]; meta.maintainers = [ maintainers.shikanime ];
@ -51,7 +56,7 @@ in {
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ cfg.package ]; home.packages = [ cfg.package ];
xdg.configFile."jj/config.toml" = mkIf (cfg.settings != { }) { home.file."${configDir}/jj/config.toml" = mkIf (cfg.settings != { }) {
source = tomlFormat.generate "jujutsu-config" (cfg.settings source = tomlFormat.generate "jujutsu-config" (cfg.settings
// optionalAttrs (cfg.ediff) (let // optionalAttrs (cfg.ediff) (let
emacsDiffScript = pkgs.writeShellScriptBin "emacs-ediff" '' emacsDiffScript = pkgs.writeShellScriptBin "emacs-ediff" ''

View file

@ -68,6 +68,11 @@ in {
type = with lib.types; type = with lib.types;
attrsOf (submodule { attrsOf (submodule {
options.khard.enable = lib.mkEnableOption "khard access"; options.khard.enable = lib.mkEnableOption "khard access";
options.khard.defaultCollection = lib.mkOption {
type = types.str;
default = "";
description = "VCARD collection to be searched by khard.";
};
}); });
}; };
}; };
@ -75,11 +80,17 @@ in {
config = lib.mkIf cfg.enable { config = lib.mkIf cfg.enable {
home.packages = [ pkgs.khard ]; home.packages = [ pkgs.khard ];
xdg.configFile."khard/khard.conf".text = '' xdg.configFile."khard/khard.conf".text = let
makePath = anAccount:
builtins.toString (/. + lib.concatStringsSep "/" [
anAccount.local.path
anAccount.khard.defaultCollection
]);
in ''
[addressbooks] [addressbooks]
${lib.concatMapStringsSep "\n" (acc: '' ${lib.concatMapStringsSep "\n" (acc: ''
[[${acc.name}]] [[${acc.name}]]
path = ${acc.local.path} path = ${makePath acc}
'') (lib.attrValues accounts)} '') (lib.attrValues accounts)}
${renderSettings cfg.settings} ${renderSettings cfg.settings}

View file

@ -5,6 +5,8 @@ let
cfg = config.programs.mcfly; cfg = config.programs.mcfly;
tomlFormat = pkgs.formats.toml { };
bashIntegration = '' bashIntegration = ''
eval "$(${getExe pkgs.mcfly} init bash)" eval "$(${getExe pkgs.mcfly} init bash)"
'' + optionalString cfg.fzf.enable '' '' + optionalString cfg.fzf.enable ''
@ -40,6 +42,37 @@ in {
options.programs.mcfly = { options.programs.mcfly = {
enable = mkEnableOption "mcfly"; enable = mkEnableOption "mcfly";
settings = mkOption {
type = tomlFormat.type;
default = { };
example = literalExpression ''
{
colors = {
menubar = {
bg = "black";
fg = "red";
};
darkmode = {
prompt = "cyan";
timing = "yellow";
results_selection_fg = "cyan";
results_selection_bg = "black";
results_selection_hl = "red";
};
};
}
'';
description = ''
Settings written to {file}`~/.config/mcfly/config.toml`.
Note, if your McFly database is currently in {file}`~/.mcfly`,
then this option has no effect.
Move the database to {file}`$XDG_DATA_DIR/mcfly/history.db` and
remove {file}`~/.mcfly` to make the settings take effect. See
<https://github.com/cantino/mcfly#database-location>.
'';
};
keyScheme = mkOption { keyScheme = mkOption {
type = types.enum [ "emacs" "vim" ]; type = types.enum [ "emacs" "vim" ];
default = "emacs"; default = "emacs";
@ -105,6 +138,11 @@ in {
{ {
home.packages = [ pkgs.mcfly ] ++ optional cfg.fzf.enable pkgs.mcfly-fzf; home.packages = [ pkgs.mcfly ] ++ optional cfg.fzf.enable pkgs.mcfly-fzf;
# Oddly enough, McFly expects this in the data path, not in config.
xdg.dataFile."mcfly/config.toml" = mkIf (cfg.settings != { }) {
source = tomlFormat.generate "mcfly-config.toml" cfg.settings;
};
programs.bash.initExtra = mkIf cfg.enableBashIntegration bashIntegration; programs.bash.initExtra = mkIf cfg.enableBashIntegration bashIntegration;
programs.zsh.initExtra = mkIf cfg.enableZshIntegration zshIntegration; programs.zsh.initExtra = mkIf cfg.enableZshIntegration zshIntegration;

View file

@ -15,6 +15,8 @@ in {
programs.micro = { programs.micro = {
enable = mkEnableOption "micro, a terminal-based text editor"; enable = mkEnableOption "micro, a terminal-based text editor";
package = mkPackageOption pkgs "micro" { };
settings = mkOption { settings = mkOption {
type = jsonFormat.type; type = jsonFormat.type;
default = { }; default = { };
@ -35,7 +37,7 @@ in {
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
home.packages = [ pkgs.micro ]; home.packages = [ cfg.package ];
xdg.configFile."micro/settings.json".source = xdg.configFile."micro/settings.json".source =
jsonFormat.generate "micro-settings" cfg.settings; jsonFormat.generate "micro-settings" cfg.settings;

View file

@ -229,5 +229,5 @@ in {
} }
]); ]);
meta.maintainers = with maintainers; [ tadeokondrak thiagokokada chuangzhu ]; meta.maintainers = with maintainers; [ thiagokokada chuangzhu ];
} }

View file

@ -19,6 +19,8 @@ in {
options.programs.papis = { options.programs.papis = {
enable = mkEnableOption "papis"; enable = mkEnableOption "papis";
package = mkPackageOption pkgs "papis" { };
settings = mkOption { settings = mkOption {
type = with types; attrsOf (oneOf [ bool int str ]); type = with types; attrsOf (oneOf [ bool int str ]);
default = { }; default = { };
@ -84,7 +86,7 @@ in {
(", namely " + concatStringsSep "," defaultLibraries); (", namely " + concatStringsSep "," defaultLibraries);
}]; }];
home.packages = [ pkgs.papis ]; home.packages = [ cfg.package ];
xdg.configFile."papis/config" = xdg.configFile."papis/config" =
mkIf (cfg.libraries != { }) { text = generators.toINI { } settingsIni; }; mkIf (cfg.libraries != { }) { text = generators.toINI { } settingsIni; };

View file

@ -19,7 +19,7 @@ let
base_url = mkOption { base_url = mkOption {
type = with types; nullOr str; type = with types; nullOr str;
default = null; default = null;
example = "bitwarden.example.com"; example = "https://bitwarden.example.com/";
description = description =
"The base-url for a self-hosted bitwarden installation."; "The base-url for a self-hosted bitwarden installation.";
}; };
@ -27,7 +27,7 @@ let
identity_url = mkOption { identity_url = mkOption {
type = with types; nullOr str; type = with types; nullOr str;
default = null; default = null;
example = "identity.example.com"; example = "https://identity.example.com/";
description = "The identity url for your bitwarden installation."; description = "The identity url for your bitwarden installation.";
}; };

View file

@ -1,7 +1,7 @@
{ config, pkgs, lib, ... }: { config, pkgs, lib, ... }:
let cfg = config.programs.script-directory; let cfg = config.programs.script-directory;
in { in {
meta.maintainers = [ lib.maintainers.janik ]; meta.maintainers = [ lib.hm.maintainers.janik ];
options.programs.script-directory = { options.programs.script-directory = {
enable = lib.mkEnableOption "script-directory"; enable = lib.mkEnableOption "script-directory";

View file

@ -29,7 +29,7 @@ let
in "${key} ${generatedValue}"; in "${key} ${generatedValue}";
in { in {
meta.maintainers = [ maintainers.ivar ]; meta.maintainers = [ ];
options.programs.sm64ex = { options.programs.sm64ex = {
enable = mkEnableOption "sm64ex"; enable = mkEnableOption "sm64ex";

View file

@ -24,14 +24,7 @@ in {
}; };
settings = mkOption { settings = mkOption {
type = with types; type = tomlFormat.type;
let
prim = either bool (either int str);
primOrPrimAttrs = either prim (attrsOf prim);
entry = either prim (listOf primOrPrimAttrs);
entryOrAttrsOf = t: either entry (attrsOf t);
entries = entryOrAttrsOf (entryOrAttrsOf entry);
in attrsOf entries // { description = "Starship configuration"; };
default = { }; default = { };
example = literalExpression '' example = literalExpression ''
{ {

View file

@ -14,7 +14,7 @@ let
config.xdg.configHome; config.xdg.configHome;
in { in {
meta.maintainers = [ maintainers.polykernel ]; meta.maintainers = [ ];
options.programs.watson = { options.programs.watson = {
enable = mkEnableOption "watson, a wonderful CLI to track your time"; enable = mkEnableOption "watson, a wonderful CLI to track your time";

View file

@ -7,7 +7,7 @@ let
tomlFormat = pkgs.formats.toml { }; tomlFormat = pkgs.formats.toml { };
bashIntegration = '' bashIntegration = ''
function ya() { function ${cfg.shellWrapperName}() {
local tmp="$(mktemp -t "yazi-cwd.XXXXX")" local tmp="$(mktemp -t "yazi-cwd.XXXXX")"
yazi "$@" --cwd-file="$tmp" yazi "$@" --cwd-file="$tmp"
if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then
@ -18,7 +18,7 @@ let
''; '';
fishIntegration = '' fishIntegration = ''
function ya function ${cfg.shellWrapperName}
set tmp (mktemp -t "yazi-cwd.XXXXX") set tmp (mktemp -t "yazi-cwd.XXXXX")
yazi $argv --cwd-file="$tmp" yazi $argv --cwd-file="$tmp"
if set cwd (cat -- "$tmp"); and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ] if set cwd (cat -- "$tmp"); and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ]
@ -29,7 +29,7 @@ let
''; '';
nushellIntegration = '' nushellIntegration = ''
def --env ya [...args] { def --env ${cfg.shellWrapperName} [...args] {
let tmp = (mktemp -t "yazi-cwd.XXXXX") let tmp = (mktemp -t "yazi-cwd.XXXXX")
yazi ...$args --cwd-file $tmp yazi ...$args --cwd-file $tmp
let cwd = (open $tmp) let cwd = (open $tmp)
@ -40,13 +40,22 @@ let
} }
''; '';
in { in {
meta.maintainers = with maintainers; [ xyenon ]; meta.maintainers = with maintainers; [ xyenon eljamm ];
options.programs.yazi = { options.programs.yazi = {
enable = mkEnableOption "yazi"; enable = mkEnableOption "yazi";
package = mkPackageOption pkgs "yazi" { }; package = mkPackageOption pkgs "yazi" { };
shellWrapperName = mkOption {
type = types.str;
default = "yy";
example = "y";
description = ''
Name of the shell wrapper to be called.
'';
};
enableBashIntegration = mkEnableOption "Bash integration"; enableBashIntegration = mkEnableOption "Bash integration";
enableZshIntegration = mkEnableOption "Zsh integration"; enableZshIntegration = mkEnableOption "Zsh integration";
@ -132,7 +141,7 @@ in {
}; };
initLua = mkOption { initLua = mkOption {
type = with types; nullOr path; type = with types; nullOr (either path lines);
default = null; default = null;
description = '' description = ''
The init.lua for Yazi itself. The init.lua for Yazi itself.
@ -145,8 +154,11 @@ in {
default = { }; default = { };
description = '' description = ''
Lua plugins. Lua plugins.
Values should be a package or path containing an `init.lua` file.
Will be linked to {file}`$XDG_CONFIG_HOME/yazi/plugins/<name>.yazi`.
See https://yazi-rs.github.io/docs/plugins/overview/ for documentation. See <https://yazi-rs.github.io/docs/plugins/overview>
for documentation.
''; '';
example = literalExpression '' example = literalExpression ''
{ {
@ -161,8 +173,10 @@ in {
default = { }; default = { };
description = '' description = ''
Pre-made themes. Pre-made themes.
Values should be a package or path containing the required files.
Will be linked to {file}`$XDG_CONFIG_HOME/yazi/flavors/<name>.yazi`.
See https://yazi-rs.github.io/docs/flavors/overview/ for documentation. See <https://yazi-rs.github.io/docs/flavors/overview/> for documentation.
''; '';
example = literalExpression '' example = literalExpression ''
{ {
@ -171,7 +185,6 @@ in {
} }
''; '';
}; };
}; };
config = mkIf cfg.enable { config = mkIf cfg.enable {
@ -197,11 +210,69 @@ in {
"yazi/theme.toml" = mkIf (cfg.theme != { }) { "yazi/theme.toml" = mkIf (cfg.theme != { }) {
source = tomlFormat.generate "yazi-theme" cfg.theme; source = tomlFormat.generate "yazi-theme" cfg.theme;
}; };
"yazi/init.lua" = mkIf (cfg.initLua != null) { source = cfg.initLua; }; "yazi/init.lua" = mkIf (cfg.initLua != null)
} // (mapAttrs' (if builtins.isPath cfg.initLua then {
(name: value: nameValuePair "yazi/plugins/${name}" { source = value; }) source = cfg.initLua;
cfg.plugins) // (mapAttrs' } else {
(name: value: nameValuePair "yazi/flavors/${name}" { source = value; }) text = cfg.initLua;
cfg.flavors); });
} // (mapAttrs' (name: value:
nameValuePair "yazi/flavors/${name}.yazi" { source = value; })
cfg.flavors) // (mapAttrs' (name: value:
nameValuePair "yazi/plugins/${name}.yazi" { source = value; })
cfg.plugins);
warnings = filter (s: s != "") (concatLists [
(mapAttrsToList (name: value:
optionalString (hasSuffix ".yazi" name) ''
Flavors like `programs.yazi.flavors."${name}"` should no longer have the suffix ".yazi" in their attribute name.
The flavor will be linked to `$XDG_CONFIG_HOME/yazi/flavors/${name}.yazi`.
You probably want to rename it to `programs.yazi.flavors."${
removeSuffix ".yazi" name
}"`.
'') cfg.flavors)
(mapAttrsToList (name: value:
optionalString (hasSuffix ".yazi" name) ''
Plugins like `programs.yazi.plugins."${name}"` should no longer have the suffix ".yazi" in their attribute name.
The plugin will be linked to `$XDG_CONFIG_HOME/yazi/plugins/${name}.yazi`.
You probably want to rename it to `programs.yazi.plugins."${
removeSuffix ".yazi" name
}"`.
'') cfg.plugins)
]);
assertions = let
mkAsserts = opt: requiredFiles:
mapAttrsToList (name: value:
let
isDir = pathIsDirectory "${value}";
msgNotDir = optionalString (!isDir)
"The path or package should be a directory, not a single file.";
isFileMissing = file:
!(pathExists "${value}/${file}")
|| pathIsDirectory "${value}/${file}";
missingFiles = filter isFileMissing requiredFiles;
msgFilesMissing = optionalString (missingFiles != [ ])
"The ${singularOpt} is missing these files: ${
toString missingFiles
}";
singularOpt = removeSuffix "s" opt;
in {
assertion = isDir && missingFiles == [ ];
message = ''
Value at `programs.yazi.${opt}.${name}` is not a valid yazi ${singularOpt}.
${msgNotDir}
${msgFilesMissing}
Evaluated value: `${value}`
'';
}) cfg.${opt};
in (mkAsserts "flavors" [
"flavor.toml"
"tmtheme.xml"
"README.md"
"preview.png"
"LICENSE"
"LICENSE-tmtheme"
]) ++ (mkAsserts "plugins" [ "init.lua" ]);
}; };
} }

View file

@ -398,6 +398,22 @@ in
{manpage}`zshzle(1)` for syntax. {manpage}`zshzle(1)` for syntax.
''; '';
}; };
strategy = mkOption {
type = types.listOf (types.enum [ "history" "completion" "match_prev_cmd" ]);
default = [ "history" ];
description = ''
`ZSH_AUTOSUGGEST_STRATEGY` is an array that specifies how suggestions should be generated.
The strategies in the array are tried successively until a suggestion is found.
There are currently three built-in strategies to choose from:
- `history`: Chooses the most recent match from history.
- `completion`: Chooses a suggestion based on what tab-completion would suggest. (requires `zpty` module)
- `match_prev_cmd`: Like `history`, but chooses the most recent match whose preceding history item matches
the most recently executed command. Note that this strategy won't work as expected with ZSH options that
don't preserve the history order such as `HIST_IGNORE_ALL_DUPS` or `HIST_EXPIRE_DUPS_FIRST`.
'';
};
}; };
history = mkOption { history = mkOption {
@ -610,6 +626,7 @@ in
(optionalString cfg.autosuggestion.enable '' (optionalString cfg.autosuggestion.enable ''
source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh source ${pkgs.zsh-autosuggestions}/share/zsh-autosuggestions/zsh-autosuggestions.zsh
ZSH_AUTOSUGGEST_STRATEGY=(${concatStringsSep " " cfg.autosuggestion.strategy})
'') '')
(optionalString (cfg.autosuggestion.enable && cfg.autosuggestion.highlight != null) '' (optionalString (cfg.autosuggestion.enable && cfg.autosuggestion.highlight != null) ''
ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="${cfg.autosuggestion.highlight}" ZSH_AUTOSUGGEST_HIGHLIGHT_STYLE="${cfg.autosuggestion.highlight}"

View file

@ -1,7 +1,7 @@
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
let cfg = config.services.cliphist; let cfg = config.services.cliphist;
in { in {
meta.maintainers = [ lib.maintainers.janik ]; meta.maintainers = [ lib.hm.maintainers.janik ];
options.services.cliphist = { options.services.cliphist = {
enable = enable =

View file

@ -172,7 +172,7 @@ in {
mkPath = { basePath, theme, category }: mkPath = { basePath, theme, category }:
"${basePath}/share/icons/${theme.name}/${theme.size}/${category}"; "${basePath}/share/icons/${theme.name}/${theme.size}/${category}";
in concatMapStringsSep ":" mkPath (cartesianProductOfSets { in concatMapStringsSep ":" mkPath (cartesianProduct {
basePath = basePaths; basePath = basePaths;
theme = themes; theme = themes;
category = categories; category = categories;

View file

@ -9,7 +9,7 @@ let
iniFormat = pkgs.formats.ini { }; iniFormat = pkgs.formats.ini { };
in { in {
meta.maintainers = with maintainers; [ polykernel ]; meta.maintainers = [ ];
options = { options = {
services.fnott = { services.fnott = {

View file

@ -0,0 +1,77 @@
{ config, lib, pkgs, ... }:
let
cfg = config.services.glance;
inherit (lib) mkEnableOption mkPackageOption mkOption mkIf getExe;
settingsFormat = pkgs.formats.yaml { };
settingsFile = settingsFormat.generate "glance.yml" cfg.settings;
configFilePath = "${config.xdg.configHome}/glance/glance.yml";
in {
meta.maintainers = [ pkgs.lib.maintainers.gepbird ];
options.services.glance = {
enable = mkEnableOption "glance";
package = mkPackageOption pkgs "glance" { };
settings = mkOption {
type = settingsFormat.type;
default = {
pages = [{
name = "Calendar";
columns = [{
size = "full";
widgets = [{ type = "calendar"; }];
}];
}];
};
example = {
server.port = 5678;
pages = [{
name = "Home";
columns = [{
size = "full";
widgets = [
{ type = "calendar"; }
{
type = "weather";
location = "London, United Kingdom";
}
];
}];
}];
};
description = ''
Configuration written to a yaml file that is read by glance. See
<https://github.com/glanceapp/glance/blob/main/docs/configuration.md>
for more.
'';
};
};
config = mkIf cfg.enable {
assertions = [
(lib.hm.assertions.assertPlatform "services.glance" pkgs
lib.platforms.linux)
];
home.packages = [ cfg.package ];
xdg.configFile."glance/glance.yml".source = settingsFile;
systemd.user.services.glance = {
Unit = {
Description = "Glance feed dashboard server";
PartOf = [ "graphical-session.target" ];
};
Install.WantedBy = [ "graphical-session.target" ];
Service.ExecStart = "${getExe cfg.package} --config ${configFilePath}";
};
};
}

View file

@ -49,7 +49,7 @@ in {
args = concatStringsSep " " ([ "--start" "--foreground" ] args = concatStringsSep " " ([ "--start" "--foreground" ]
++ optional (cfg.components != [ ]) ++ optional (cfg.components != [ ])
("--components=" + concatStringsSep "," cfg.components)); ("--components=" + concatStringsSep "," cfg.components));
in "${pkgs.gnome.gnome-keyring}/bin/gnome-keyring-daemon ${args}"; in "${pkgs.gnome-keyring}/bin/gnome-keyring-daemon ${args}";
Restart = "on-abort"; Restart = "on-abort";
}; };

View file

@ -52,7 +52,6 @@ in {
"${pkgs.kbfs}/bin/kbfsfuse ${toString cfg.extraFlags} ${mountPoint}"; "${pkgs.kbfs}/bin/kbfsfuse ${toString cfg.extraFlags} ${mountPoint}";
ExecStopPost = "/run/wrappers/bin/fusermount -u ${mountPoint}"; ExecStopPost = "/run/wrappers/bin/fusermount -u ${mountPoint}";
Restart = "on-failure"; Restart = "on-failure";
PrivateTmp = true;
}; };
Install.WantedBy = [ "default.target" ]; Install.WantedBy = [ "default.target" ];

View file

@ -171,10 +171,17 @@ in {
]; ];
systemd.user.services.mpd = { systemd.user.services.mpd = {
Unit = { Unit = mkMerge [
After = [ "network.target" "sound.target" ]; {
Description = "Music Player Daemon"; Description = "Music Player Daemon";
}; After = [ "network.target" "sound.target" ];
}
(mkIf cfg.network.startWhenNeeded {
Requires = [ "mpd.socket" ];
After = [ "mpd.socket" ];
})
];
Install = mkIf (!cfg.network.startWhenNeeded) { Install = mkIf (!cfg.network.startWhenNeeded) {
WantedBy = [ "default.target" ]; WantedBy = [ "default.target" ];

View file

@ -110,9 +110,11 @@ in {
systemd.user.services.nix-gc = { systemd.user.services.nix-gc = {
Unit = { Description = "Nix Garbage Collector"; }; Unit = { Description = "Nix Garbage Collector"; };
Service = { Service = {
ExecStart = "${nixPackage}/bin/nix-collect-garbage ${ Type = "oneshot";
ExecStart = toString (pkgs.writeShellScript "nix-gc"
"exec ${nixPackage}/bin/nix-collect-garbage ${
lib.optionalString (cfg.options != null) cfg.options lib.optionalString (cfg.options != null) cfg.options
}"; }");
}; };
}; };
systemd.user.timers.nix-gc = { systemd.user.timers.nix-gc = {

View file

@ -15,7 +15,7 @@ let
"--basic-auth ${escapeShellArg cfg.httpAuth}"); "--basic-auth ${escapeShellArg cfg.httpAuth}");
in { in {
meta.maintainers = [ maintainers.ivar ]; meta.maintainers = [ ];
options.services.pbgopy = { options.services.pbgopy = {
enable = mkEnableOption "pbgopy"; enable = mkEnableOption "pbgopy";

View file

@ -9,7 +9,7 @@ let
presetOpts = optionalString (cfg.preset != "") "--load-preset ${cfg.preset}"; presetOpts = optionalString (cfg.preset != "") "--load-preset ${cfg.preset}";
in { in {
meta.maintainers = [ maintainers.jonringer ]; meta.maintainers = [ hm.maintainers.jonringer ];
options.services.pulseeffects = { options.services.pulseeffects = {
enable = mkEnableOption '' enable = mkEnableOption ''

View file

@ -5,7 +5,7 @@ let
cfg = config.services.ssh-agent; cfg = config.services.ssh-agent;
in { in {
meta.maintainers = [ lib.maintainers.lheckemann ]; meta.maintainers = [ lib.hm.maintainers.lheckemann ];
options = { options = {
services.ssh-agent = { services.ssh-agent = {

View file

@ -74,7 +74,7 @@ in {
} }
(mkIf (cfg.config != { }) { (mkIf (cfg.config != { }) {
home.file.".stalonetrayrc".text = let xdg.configFile."stalonetrayrc".text = let
valueToString = v: valueToString = v:
if isBool v then if isBool v then
(if v then "true" else "false") (if v then "true" else "false")
@ -88,7 +88,7 @@ in {
}) })
(mkIf (cfg.extraConfig != "") { (mkIf (cfg.extraConfig != "") {
home.file.".stalonetrayrc".text = cfg.extraConfig; xdg.configFile."stalonetrayrc".text = cfg.extraConfig;
}) })
]); ]);
} }

View file

@ -60,6 +60,8 @@ in {
After = [ "graphical-session.target" ]; After = [ "graphical-session.target" ];
ConditionEnvironment = "WAYLAND_DISPLAY"; ConditionEnvironment = "WAYLAND_DISPLAY";
Documentation = "man:swayosd(1)"; Documentation = "man:swayosd(1)";
StartLimitBurst = 5;
StartLimitIntervalSec = 10;
}; };
Service = { Service = {
@ -71,6 +73,7 @@ in {
+ (optionalString (cfg.topMargin != null) + (optionalString (cfg.topMargin != null)
" --top-margin ${toString cfg.topMargin}"); " --top-margin ${toString cfg.topMargin}");
Restart = "always"; Restart = "always";
RestartSec = "2s";
}; };
Install = { WantedBy = [ "graphical-session.target" ]; }; Install = { WantedBy = [ "graphical-session.target" ]; };

View file

@ -40,7 +40,21 @@ in {
]; ];
options.wayland.windowManager.hyprland = { options.wayland.windowManager.hyprland = {
enable = lib.mkEnableOption "Hyprland wayland compositor"; enable = lib.mkOption {
type = lib.types.bool;
default = false;
description = ''
Whether to enable configuration for Hyprland, a tiling Wayland
compositor that doesn't sacrifice on its looks.
::: {.note}
This module configures Hyprland and adds it to your user's {env}`PATH`,
but does not make certain system-level changes. NixOS users should
enable the NixOS module with {option}`programs.hyprland.enable`, which
makes system-level changes such as adding a desktop session entry.
:::
'';
};
package = lib.mkPackageOption pkgs "hyprland" { }; package = lib.mkPackageOption pkgs "hyprland" { };

View file

@ -403,7 +403,7 @@ in {
"XCURSOR_THEME" "XCURSOR_THEME"
"XCURSOR_SIZE" "XCURSOR_SIZE"
]; ];
example = [ "-all" ]; example = [ "--all" ];
description = '' description = ''
Environment variables imported into the systemd and D-Bus user environment. Environment variables imported into the systemd and D-Bus user environment.
''; '';
@ -411,7 +411,12 @@ in {
extraCommands = mkOption { extraCommands = mkOption {
type = types.listOf types.str; type = types.listOf types.str;
default = [ "systemctl --user start sway-session.target" ]; default = [
"systemctl --user reset-failed"
"systemctl --user start sway-session.target"
"swaymsg -mt subscribe '[]' || true"
"systemctl --user stop sway-session.target"
];
description = '' description = ''
Extra commands to run after D-Bus activation. Extra commands to run after D-Bus activation.
''; '';

View file

@ -14,7 +14,7 @@ let
}; };
in attrsOf confAtom; in attrsOf confAtom;
in { in {
meta.maintainers = with maintainers; [ polykernel ]; meta.maintainers = [ ];
options = { options = {
wayland.windowManager.sway.swaynag = { wayland.windowManager.sway.swaynag = {

View file

@ -34,7 +34,7 @@ function systemdPostReload() {
touch "$oldServiceFiles" touch "$oldServiceFiles"
else else
find "$oldUserServicePath" \ find "$oldUserServicePath" \
-maxdepth 1 -name '*.service' -exec basename '{}' ';' \ -maxdepth 1 -name '*.service' \! -name '*@.service' -exec basename '{}' ';' \
| sort \ | sort \
> "$oldServiceFiles" > "$oldServiceFiles"
fi fi
@ -43,7 +43,7 @@ function systemdPostReload() {
touch "$newServiceFiles" touch "$newServiceFiles"
else else
find "$newUserServicePath" \ find "$newUserServicePath" \
-maxdepth 1 -name '*.service' -exec basename '{}' ';' \ -maxdepth 1 -name '*.service' \! -name '*@.service' -exec basename '{}' ';' \
| sort \ | sort \
> "$newServiceFiles" > "$newServiceFiles"
fi fi

View file

@ -100,6 +100,8 @@ let
settingsFormat.generate "user.conf" cfg.settings; settingsFormat.generate "user.conf" cfg.settings;
}; };
configHome = lib.removePrefix config.home.homeDirectory config.xdg.configHome;
in { in {
meta.maintainers = [ lib.maintainers.rycee ]; meta.maintainers = [ lib.maintainers.rycee ];
@ -335,8 +337,8 @@ in {
in '' in ''
${pkgs.sd-switch}/bin/sd-switch \ ${pkgs.sd-switch}/bin/sd-switch \
''${DRY_RUN:+--dry-run} $VERBOSE_ARG ${timeoutArg} \ ''${DRY_RUN:+--dry-run} $VERBOSE_ARG ${timeoutArg} \
''${oldGenPath:+--old-units $oldGenPath/home-files/.config/systemd/user} \ ''${oldUnitsDir:+--old-units $oldUnitsDir} \
--new-units $newGenPath/home-files/.config/systemd/user --new-units "$newUnitsDir"
''; '';
}; };
@ -354,8 +356,22 @@ in {
warnEcho "Attempting to reload services anyway..." warnEcho "Attempting to reload services anyway..."
fi fi
if [[ -v oldGenPath ]]; then
oldUnitsDir="$oldGenPath/home-files${configHome}/systemd/user"
if [[ ! -e $oldUnitsDir ]]; then
oldUnitsDir=
fi
fi
newUnitsDir="$newGenPath/home-files${configHome}/systemd/user"
if [[ ! -e $newUnitsDir ]]; then
newUnitsDir=${pkgs.emptyDirectory}
fi
${ensureRuntimeDir} \ ${ensureRuntimeDir} \
${getAttr cfg.startServices cmd} ${getAttr cfg.startServices cmd}
unset newUnitsDir oldUnitsDir
else else
echo "User systemd daemon not running. Skipping reload." echo "User systemd daemon not running. Skipping reload."
fi fi

View file

@ -189,7 +189,7 @@ in import nmtSrc {
./modules/programs/bemenu ./modules/programs/bemenu
./modules/programs/borgmatic ./modules/programs/borgmatic
./modules/programs/boxxy ./modules/programs/boxxy
./modules/programs/firefox ./modules/programs/firefox/firefox.nix
./modules/programs/foot ./modules/programs/foot
./modules/programs/freetube ./modules/programs/freetube
./modules/programs/fuzzel ./modules/programs/fuzzel
@ -241,6 +241,7 @@ in import nmtSrc {
./modules/services/fnott ./modules/services/fnott
./modules/services/fusuma ./modules/services/fusuma
./modules/services/git-sync ./modules/services/git-sync
./modules/services/glance
./modules/services/gpg-agent ./modules/services/gpg-agent
./modules/services/gromit-mpx ./modules/services/gromit-mpx
./modules/services/home-manager-auto-upgrade ./modules/services/home-manager-auto-upgrade

View file

@ -7,6 +7,8 @@
nodes.machine = { ... }: { nodes.machine = { ... }: {
imports = [ ../../../nixos ]; # Import the HM NixOS module. imports = [ ../../../nixos ]; # Import the HM NixOS module.
virtualisation.memorySize = 2048;
users.users.alice = { users.users.alice = {
isNormalUser = true; isNormalUser = true;
description = "Alice Foobar"; description = "Alice Foobar";

View file

@ -6,7 +6,7 @@
nodes.machine = { ... }: { nodes.machine = { ... }: {
imports = [ "${pkgs.path}/nixos/modules/installer/cd-dvd/channel.nix" ]; imports = [ "${pkgs.path}/nixos/modules/installer/cd-dvd/channel.nix" ];
virtualisation.memorySize = 2048; virtualisation.memorySize = 3072;
nix = { nix = {
registry.home-manager.to = { registry.home-manager.to = {
type = "path"; type = "path";
@ -88,7 +88,7 @@
} /home/alice/.config/home-manager/home.nix") } /home/alice/.config/home-manager/home.nix")
actual = succeed_as_alice("home-manager switch") actual = succeed_as_alice("home-manager switch")
expected = "Started pueued.service - active" expected = "Starting units: pueued.service"
assert expected in actual, \ assert expected in actual, \
f"expected home-manager switch to contain {expected}, but got {actual}" f"expected home-manager switch to contain {expected}, but got {actual}"

View file

@ -85,7 +85,7 @@
} /home/alice/.config/home-manager/home.nix") } /home/alice/.config/home-manager/home.nix")
actual = succeed_as_alice("home-manager switch") actual = succeed_as_alice("home-manager switch")
expected = "Started pueued.service - active" expected = "Starting units: pueued.service"
assert expected in actual, \ assert expected in actual, \
f"expected home-manager switch to contain {expected}, but got {actual}" f"expected home-manager switch to contain {expected}, but got {actual}"

View file

@ -10,7 +10,7 @@
}; };
test.stubs = { test.stubs = {
atuin = { }; atuin = { name = "atuin"; };
bash-preexec = { }; bash-preexec = { };
}; };

View file

@ -4,7 +4,7 @@
programs.atuin.enable = true; programs.atuin.enable = true;
test.stubs = { test.stubs = {
atuin = { }; atuin = { name = "atuin"; };
bash-preexec = { }; bash-preexec = { };
}; };

View file

@ -13,7 +13,7 @@
}; };
test.stubs = { test.stubs = {
atuin = { }; atuin = { name = "atuin"; };
bash-preexec = { }; bash-preexec = { };
}; };

View file

@ -11,7 +11,7 @@
lib.mkForce (builtins.toFile "empty" ""); lib.mkForce (builtins.toFile "empty" "");
test.stubs = { test.stubs = {
atuin = { }; atuin = { name = "atuin"; };
bash-preexec = { }; bash-preexec = { };
}; };

View file

@ -18,7 +18,7 @@
lib.mkForce (builtins.toFile "empty" ""); lib.mkForce (builtins.toFile "empty" "");
test.stubs = { test.stubs = {
atuin = { }; atuin = { name = "atuin"; };
bash-preexec = { }; bash-preexec = { };
}; };

View file

@ -17,7 +17,7 @@
lib.mkForce (builtins.toFile "empty" ""); lib.mkForce (builtins.toFile "empty" "");
test.stubs = { test.stubs = {
atuin = { }; atuin = { name = "atuin"; };
bash-preexec = { }; bash-preexec = { };
}; };

View file

@ -7,7 +7,7 @@
}; };
test.stubs = { test.stubs = {
atuin = { }; atuin = { name = "atuin"; };
bash-preexec = { }; bash-preexec = { };
}; };

View file

@ -1,13 +1,19 @@
modulePath:
{ config, lib, ... }: { config, lib, ... }:
{ with lib;
imports = [ ./setup-firefox-mock-overlay.nix ];
config = lib.mkIf config.test.enableBig { let
firefoxMockOverlay = import ./setup-firefox-mock-overlay.nix modulePath;
in {
imports = [ firefoxMockOverlay ];
config = mkIf config.test.enableBig ({
test.asserts.assertions.expected = test.asserts.assertions.expected =
[ "Container id must be smaller than 4294967294 (2^32 - 2)" ]; [ "Container id must be smaller than 4294967294 (2^32 - 2)" ];
} // setAttrByPath modulePath {
programs.firefox = {
enable = true; enable = true;
profiles.my-profile = { profiles.my-profile = {
@ -22,6 +28,5 @@
}; };
}; };
}; };
}; });
};
} }

View file

@ -1,9 +0,0 @@
{
firefox-profile-settings = ./profile-settings.nix;
firefox-state-version-19_09 = ./state-version-19_09.nix;
firefox-deprecated-native-messenger = ./deprecated-native-messenger.nix;
firefox-duplicate-profile-ids = ./duplicate-profile-ids.nix;
firefox-duplicate-container-ids = ./duplicate-container-ids.nix;
firefox-container-id-out-of-range = ./container-id-out-of-range.nix;
firefox-policies = ./policies.nix;
}

View file

@ -1,21 +1,26 @@
{ config, lib, pkgs, ... }: modulePath:
{ config, lib, ... }:
with lib; with lib;
{ let
imports = [ ./setup-firefox-mock-overlay.nix ];
config = lib.mkIf config.test.enableBig { moduleName = concatStringsSep "." modulePath;
programs.firefox = {
firefoxMockOverlay = import ./setup-firefox-mock-overlay.nix modulePath;
in {
imports = [ firefoxMockOverlay ];
config = mkIf config.test.enableBig (setAttrByPath modulePath {
enable = true; enable = true;
enableGnomeExtensions = true; enableGnomeExtensions = true;
}; } // {
test.asserts.warnings.expected = ['' test.asserts.warnings.expected = [''
Using 'programs.firefox.enableGnomeExtensions' has been deprecated and Using '${moduleName}.enableGnomeExtensions' has been deprecated and
will be removed in the future. Please change to overriding the package will be removed in the future. Please change to overriding the package
configuration using 'programs.firefox.package' instead. You can refer to configuration using '${moduleName}.package' instead. You can refer to
its example for how to do this. its example for how to do this.
'']; ''];
}; });
} }

View file

@ -1,14 +1,22 @@
modulePath:
{ config, lib, ... }: { config, lib, ... }:
{ with lib;
imports = [ ./setup-firefox-mock-overlay.nix ];
config = lib.mkIf config.test.enableBig { let
cfg = getAttrFromPath modulePath config;
firefoxMockOverlay = import ./setup-firefox-mock-overlay.nix modulePath;
in {
imports = [ firefoxMockOverlay ];
config = mkIf config.test.enableBig ({
test.asserts.assertions.expected = ['' test.asserts.assertions.expected = [''
Must not have a Firefox container with an existing ID but Must not have a ${cfg.name} container with an existing ID but
- ID 9 is used by dangerous, shopping'']; - ID 9 is used by dangerous, shopping''];
} // setAttrByPath modulePath {
programs.firefox = {
enable = true; enable = true;
profiles = { profiles = {
@ -30,6 +38,5 @@
}; };
}; };
}; };
}; });
};
} }

View file

@ -1,14 +1,22 @@
modulePath:
{ config, lib, ... }: { config, lib, ... }:
{ with lib;
imports = [ ./setup-firefox-mock-overlay.nix ];
config = lib.mkIf config.test.enableBig { let
cfg = getAttrFromPath modulePath config;
firefoxMockOverlay = import ./setup-firefox-mock-overlay.nix modulePath;
in {
imports = [ firefoxMockOverlay ];
config = mkIf config.test.enableBig ({
test.asserts.assertions.expected = ['' test.asserts.assertions.expected = [''
Must not have a Firefox profile with an existing ID but Must not have a ${cfg.name} profile with an existing ID but
- ID 1 is used by first, second'']; - ID 1 is used by first, second''];
} // setAttrByPath modulePath {
programs.firefox = {
enable = true; enable = true;
profiles = { profiles = {
@ -18,6 +26,5 @@
}; };
second = { id = 1; }; second = { id = 1; };
}; };
}; });
};
} }

View file

@ -0,0 +1,11 @@
let name = "firefox";
in builtins.mapAttrs (test: module: import module [ "programs" name ]) {
"${name}-profile-settings" = ./profile-settings.nix;
"${name}-state-version-19_09" = ./state-version-19_09.nix;
"${name}-deprecated-native-messenger" = ./deprecated-native-messenger.nix;
"${name}-duplicate-profile-ids" = ./duplicate-profile-ids.nix;
"${name}-duplicate-container-ids" = ./duplicate-container-ids.nix;
"${name}-container-id-out-of-range" = ./container-id-out-of-range.nix;
"${name}-policies" = ./policies.nix;
}

View file

@ -1,22 +1,29 @@
modulePath:
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
{ with lib;
imports = [ ./setup-firefox-mock-overlay.nix ];
config = lib.mkIf config.test.enableBig { let
cfg = getAttrFromPath modulePath config;
firefoxMockOverlay = import ./setup-firefox-mock-overlay.nix modulePath;
in {
imports = [ firefoxMockOverlay ];
config = mkIf config.test.enableBig ({
home.stateVersion = "23.05"; home.stateVersion = "23.05";
} // setAttrByPath modulePath {
programs.firefox = {
enable = true; enable = true;
policies = { BlockAboutConfig = true; }; policies = { BlockAboutConfig = true; };
package = pkgs.firefox.override { package = pkgs.${cfg.wrappedPackageName}.override {
extraPolicies = { DownloadDirectory = "/foo"; }; extraPolicies = { DownloadDirectory = "/foo"; };
}; };
}; }) // {
nmt.script = '' nmt.script = ''
jq=${lib.getExe pkgs.jq} jq=${lib.getExe pkgs.jq}
config_file="${config.programs.firefox.finalPackage}/lib/firefox/distribution/policies.json" config_file="${cfg.finalPackage}/lib/${cfg.wrappedPackageName}/distribution/policies.json"
assertFileExists "$config_file" assertFileExists "$config_file"

View file

@ -1,10 +1,18 @@
modulePath:
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
{ with lib;
imports = [ ./setup-firefox-mock-overlay.nix ];
config = lib.mkIf config.test.enableBig { let
programs.firefox = {
cfg = getAttrFromPath modulePath config;
firefoxMockOverlay = import ./setup-firefox-mock-overlay.nix modulePath;
in {
imports = [ firefoxMockOverlay ];
config = mkIf config.test.enableBig (setAttrByPath modulePath {
enable = true; enable = true;
profiles.basic.isDefault = true; profiles.basic.isDefault = true;
@ -34,8 +42,7 @@
name = "wikipedia"; name = "wikipedia";
tags = [ "wiki" ]; tags = [ "wiki" ];
keyword = "wiki"; keyword = "wiki";
url = url = "https://en.wikipedia.org/wiki/Special:Search?search=%s&go=Go";
"https://en.wikipedia.org/wiki/Special:Search?search=%s&go=Go";
} }
{ {
name = "kernel.org"; name = "kernel.org";
@ -153,25 +160,25 @@
}; };
}; };
}; };
}; } // {
nmt.script = '' nmt.script = ''
assertFileRegex \ assertFileRegex \
home-path/bin/firefox \ home-path/bin/${cfg.wrappedPackageName} \
MOZ_APP_LAUNCHER MOZ_APP_LAUNCHER
assertDirectoryExists home-files/.mozilla/firefox/basic assertDirectoryExists home-files/${cfg.configPath}/basic
assertFileContent \ assertFileContent \
home-files/.mozilla/firefox/test/user.js \ home-files/${cfg.configPath}/test/user.js \
${./profile-settings-expected-user.js} ${./profile-settings-expected-user.js}
assertFileContent \ assertFileContent \
home-files/.mozilla/firefox/containers/containers.json \ home-files/${cfg.configPath}/containers/containers.json \
${./profile-settings-expected-containers.json} ${./profile-settings-expected-containers.json}
bookmarksUserJs=$(normalizeStorePaths \ bookmarksUserJs=$(normalizeStorePaths \
home-files/.mozilla/firefox/bookmarks/user.js) home-files/${cfg.configPath}/bookmarks/user.js)
assertFileContent \ assertFileContent \
$bookmarksUserJs \ $bookmarksUserJs \
@ -179,7 +186,7 @@
bookmarksFile="$(sed -n \ bookmarksFile="$(sed -n \
'/browser.bookmarks.file/ {s|^.*\(/nix/store[^"]*\).*|\1|;p}' \ '/browser.bookmarks.file/ {s|^.*\(/nix/store[^"]*\).*|\1|;p}' \
$TESTED/home-files/.mozilla/firefox/bookmarks/user.js)" $TESTED/home-files/${cfg.configPath}/bookmarks/user.js)"
assertFileContent \ assertFileContent \
$bookmarksFile \ $bookmarksFile \
@ -197,12 +204,12 @@
} }
assertFirefoxSearchContent \ assertFirefoxSearchContent \
home-files/.mozilla/firefox/search/search.json.mozlz4 \ home-files/${cfg.configPath}/search/search.json.mozlz4 \
${./profile-settings-expected-search.json} ${./profile-settings-expected-search.json}
assertFirefoxSearchContent \ assertFirefoxSearchContent \
home-files/.mozilla/firefox/searchWithoutDefault/search.json.mozlz4 \ home-files/${cfg.configPath}/searchWithoutDefault/search.json.mozlz4 \
${./profile-settings-expected-search-without-default.json} ${./profile-settings-expected-search-without-default.json}
''; '';
}; });
} }

View file

@ -1,15 +1,23 @@
{ pkgs, ... }: modulePath:
{ config, lib, pkgs, ... }:
{ with lib;
let
cfg = getAttrFromPath modulePath config;
in {
nixpkgs.overlays = [ nixpkgs.overlays = [
(self: super: { (self: super: {
firefox-unwrapped = pkgs.runCommandLocal "firefox-0" { "${cfg.wrappedPackageName}-unwrapped" =
meta.description = "I pretend to be Firefox"; pkgs.runCommandLocal "${cfg.wrappedPackageName}-0" {
meta.description = "I pretend to be ${cfg.name}";
passthru.gtk3 = null; passthru.gtk3 = null;
} '' } ''
mkdir -p "$out"/{bin,lib} mkdir -p "$out"/{bin,lib}
touch "$out/bin/firefox" touch "$out/bin/${cfg.wrappedPackageName}"
chmod 755 "$out/bin/firefox" chmod 755 "$out/bin/${cfg.wrappedPackageName}"
''; '';
chrome-gnome-shell = chrome-gnome-shell =

View file

@ -1,19 +1,24 @@
modulePath:
{ config, lib, pkgs, ... }: { config, lib, pkgs, ... }:
with lib; with lib;
{ let
imports = [ ./setup-firefox-mock-overlay.nix ];
config = lib.mkIf config.test.enableBig { cfg = getAttrFromPath modulePath config;
firefoxMockOverlay = import ./setup-firefox-mock-overlay.nix modulePath;
in {
imports = [ firefoxMockOverlay ];
config = lib.mkIf config.test.enableBig ({
home.stateVersion = "19.09"; home.stateVersion = "19.09";
} // setAttrByPath modulePath { enable = true; } // {
programs.firefox.enable = true;
nmt.script = '' nmt.script = ''
assertFileRegex \ assertFileRegex \
home-path/bin/firefox \ home-path/bin/${cfg.wrappedPackageName} \
MOZ_APP_LAUNCHER MOZ_APP_LAUNCHER
''; '';
}; });
} }

View file

@ -13,9 +13,8 @@
}; };
}; };
nixpkgs.overlays = [ nixpkgs.overlays =
(self: super: { gnome.gnome-terminal = config.lib.test.mkStubPackage { }; }) [ (self: super: { gnome-terminal = config.lib.test.mkStubPackage { }; }) ];
];
test.stubs.dconf = { }; test.stubs.dconf = { };

View file

@ -49,9 +49,7 @@ with lib;
}; };
nixpkgs.overlays = [ nixpkgs.overlays = [
(self: super: { (self: super: { gnome-terminal = config.lib.test.mkStubPackage { }; })
gnome.gnome-terminal = config.lib.test.mkStubPackage { };
})
]; ];
test.stubs.dconf = { }; test.stubs.dconf = { };

View file

@ -1,11 +1,14 @@
{ ... }: { pkgs, ... }:
{ let
configDir =
if pkgs.stdenv.isDarwin then "Library/Application Support" else ".config";
in {
programs.jujutsu.enable = true; programs.jujutsu.enable = true;
test.stubs.jujutsu = { }; test.stubs.jujutsu = { };
nmt.script = '' nmt.script = ''
assertPathNotExists home-files/.config/jj/config.toml assertPathNotExists 'home-files/${configDir}/jj/config.toml'
''; '';
} }

View file

@ -1,6 +1,9 @@
{ config, ... }: { pkgs, config, ... }:
{ let
configDir =
if pkgs.stdenv.isDarwin then "Library/Application Support" else ".config";
in {
programs.jujutsu = { programs.jujutsu = {
enable = true; enable = true;
package = config.lib.test.mkStubPackage { }; package = config.lib.test.mkStubPackage { };
@ -13,9 +16,8 @@
}; };
nmt.script = '' nmt.script = ''
assertFileExists home-files/.config/jj/config.toml assertFileExists 'home-files/${configDir}/jj/config.toml'
assertFileContent \ assertFileContent 'home-files/${configDir}/jj/config.toml' \
home-files/.config/jj/config.toml \
${ ${
builtins.toFile "expected.toml" '' builtins.toFile "expected.toml" ''
[user] [user]

View file

@ -2,4 +2,5 @@
khard_empty_config = ./empty_config.nix; khard_empty_config = ./empty_config.nix;
khard_basic_config = ./basic_config.nix; khard_basic_config = ./basic_config.nix;
khard_multiple_accounts = ./multiple_accounts.nix; khard_multiple_accounts = ./multiple_accounts.nix;
khard_dirty_path = ./dirty_path.nix;
} }

View file

@ -0,0 +1,22 @@
{
accounts.contact = {
basePath = "/home/user/who/likes///";
accounts.forward = {
local.type = "filesystem";
khard = {
enable = true;
defaultCollection = "////slashes//a/lot";
};
};
};
programs.khard.enable = true;
test.stubs.khard = { };
nmt.script = ''
assertFileContent \
home-files/.config/khard/khard.conf \
${./dirty_path_expected}
'';
}

View file

@ -0,0 +1,8 @@
[addressbooks]
[[forward]]
path = /home/user/who/likes/forward/slashes/a/lot
[general]
default_action=list

View file

@ -2,7 +2,7 @@
let let
shellIntegration = '' shellIntegration = ''
function ya() { function yy() {
local tmp="$(mktemp -t "yazi-cwd.XXXXX")" local tmp="$(mktemp -t "yazi-cwd.XXXXX")"
yazi "$@" --cwd-file="$tmp" yazi "$@" --cwd-file="$tmp"
if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then

View file

@ -1,5 +1,6 @@
{ {
yazi-settings = ./settings.nix; yazi-settings = ./settings.nix;
yazi-init-lua-string = ./init-lua-string.nix;
yazi-bash-integration-enabled = ./bash-integration-enabled.nix; yazi-bash-integration-enabled = ./bash-integration-enabled.nix;
yazi-zsh-integration-enabled = ./zsh-integration-enabled.nix; yazi-zsh-integration-enabled = ./zsh-integration-enabled.nix;
yazi-fish-integration-enabled = ./fish-integration-enabled.nix; yazi-fish-integration-enabled = ./fish-integration-enabled.nix;

View file

@ -2,7 +2,7 @@
let let
shellIntegration = '' shellIntegration = ''
function ya function yy
set tmp (mktemp -t "yazi-cwd.XXXXX") set tmp (mktemp -t "yazi-cwd.XXXXX")
yazi $argv --cwd-file="$tmp" yazi $argv --cwd-file="$tmp"
if set cwd (cat -- "$tmp"); and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ] if set cwd (cat -- "$tmp"); and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ]

View file

@ -0,0 +1,50 @@
<div align="center">
<img src="https://github.com/sxyazi/yazi/blob/main/assets/logo.png?raw=true" alt="Yazi logo" width="20%">
</div>
<h3 align="center">
Example Flavor for <a href="https://github.com/sxyazi/yazi">Yazi</a>
</h3>
## Cooking up a new flavor
> [!NOTE]
> Please remove this section from your README before publishing.
1. [x] Fork this repository and rename it to `your-flavor-name.yazi`.
2. [ ] Copy the **parts you need to customize** from the [default theme.toml](https://github.com/sxyazi/yazi/blob/main/yazi-config/preset/theme.toml) as `./flavor.toml`, and change them to meet your preferences.
3. [ ] Find a `.tmTheme` file on GitHub that matches the color of your flavor, copy it and it's license file as `./tmtheme.xml`, and `LICENSE-tmtheme`.
4. [ ] Modify the content and preview image in the README to fit your flavor.
## 👀 Preview
<img src="preview.png" width="600" />
## 🎨 Installation
<!-- Please replace "username/example.yazi" with your repository name. -->
```bash
# Linux/macOS
git clone https://github.com/username/example.yazi.git ~/.config/yazi/flavors/example.yazi
# Windows
git clone https://github.com/username/example.yazi.git %AppData%\yazi\config\flavors\example.yazi
```
## ⚙️ Usage
Add the these lines to your `theme.toml` configuration file to use it:
<!-- Please replace "example" with your flavor name. -->
```toml
[flavor]
use = "example"
```
## 📜 License
The flavor is MIT-licensed, and the included tmTheme is also MIT-licensed.
Check the [LICENSE](LICENSE) and [LICENSE-tmtheme](LICENSE-tmtheme) file for more details.

View file

@ -0,0 +1,2 @@
# This is a flavor.

View file

@ -1 +0,0 @@
-- This is a flavor.

View file

@ -0,0 +1,14 @@
{ ... }: {
programs.yazi = {
enable = true;
initLua = builtins.readFile ./init.lua;
};
test.stubs.yazi = { };
nmt.script = ''
assertFileContent home-files/.config/yazi/init.lua \
${./init.lua}
'';
}

View file

@ -2,7 +2,7 @@
let let
shellIntegration = '' shellIntegration = ''
def --env ya [...args] { def --env yy [...args] {
let tmp = (mktemp -t "yazi-cwd.XXXXX") let tmp = (mktemp -t "yazi-cwd.XXXXX")
yazi ...$args --cwd-file $tmp yazi ...$args --cwd-file $tmp
let cwd = (open $tmp) let cwd = (open $tmp)

View file

@ -70,8 +70,22 @@
}; };
}; };
initLua = ./init.lua; initLua = ./init.lua;
plugins = { "test.yazi" = ./plugin; }; plugins = {
flavors = { "test.yazi" = ./flavor; }; testplugin = ./plugin;
## Produces warning
#"plugin-with-suffix.yazi" = ./plugin;
## Fails assertion
#single-file-plugin = ./plugin/init.lua;
#empty-dir-plugin = ./empty;
};
flavors = {
testflavor = ./flavor;
## Produces warning
#"flavor-with-suffix.yazi" = ./flavor;
## Fails assertion
#single-file-flavor = ./flavor/flavor.toml;
#empty-dir-flavor = ./empty;
};
}; };
test.stubs.yazi = { }; test.stubs.yazi = { };
@ -85,9 +99,9 @@
${./theme-expected.toml} ${./theme-expected.toml}
assertFileContent home-files/.config/yazi/init.lua \ assertFileContent home-files/.config/yazi/init.lua \
${./init.lua} ${./init.lua}
assertFileContent home-files/.config/yazi/plugins/test.yazi/init.lua \ assertFileContent home-files/.config/yazi/plugins/testplugin.yazi/init.lua \
${./plugin/init.lua} ${./plugin/init.lua}
assertFileContent home-files/.config/yazi/flavors/test.yazi/init.lua \ assertFileContent home-files/.config/yazi/flavors/testflavor.yazi/flavor.toml \
${./flavor/init.lua} ${./flavor/flavor.toml}
''; '';
} }

View file

@ -2,7 +2,7 @@
let let
shellIntegration = '' shellIntegration = ''
function ya() { function yy() {
local tmp="$(mktemp -t "yazi-cwd.XXXXX")" local tmp="$(mktemp -t "yazi-cwd.XXXXX")"
yazi "$@" --cwd-file="$tmp" yazi "$@" --cwd-file="$tmp"
if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then

View file

@ -0,0 +1,15 @@
{ ... }:
{
services.glance.enable = true;
test.stubs.glance = { };
nmt.script = ''
configFile=home-files/.config/glance/glance.yml
serviceFile=home-files/.config/systemd/user/glance.service
assertFileContent $configFile ${./glance-default-config.yml}
assertFileContent $serviceFile ${./glance.service}
'';
}

View file

@ -0,0 +1,4 @@
{
glance-default-settings = ./default-settings.nix;
glance-example-settings = ./example-settings.nix;
}

View file

@ -0,0 +1,33 @@
{ ... }:
{
services.glance = {
enable = true;
settings = {
server.port = 5678;
pages = [{
name = "Home";
columns = [{
size = "full";
widgets = [
{ type = "calendar"; }
{
type = "weather";
location = "London, United Kingdom";
}
];
}];
}];
};
};
test.stubs.glance = { };
nmt.script = ''
configFile=home-files/.config/glance/glance.yml
serviceFile=home-files/.config/systemd/user/glance.service
assertFileContent $configFile ${./glance-example-config.yml}
assertFileContent $serviceFile ${./glance.service}
'';
}

View file

@ -0,0 +1,6 @@
pages:
- columns:
- size: full
widgets:
- type: calendar
name: Calendar

View file

@ -0,0 +1,10 @@
pages:
- columns:
- size: full
widgets:
- type: calendar
- location: London, United Kingdom
type: weather
name: Home
server:
port: 5678

Some files were not shown because too many files have changed in this diff Show more