Merge branch 'nix-community:master' into herbstluftwm/optional-herbstclient-alias

This commit is contained in:
Olmo Kramer 2024-06-30 15:08:36 +02:00 committed by GitHub
commit 2b825087f6
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
35 changed files with 401 additions and 34 deletions

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
introduction.md
installation.md
usage.md
nix-flakes.md

View file

@ -2,11 +2,11 @@
"nodes": {
"nixpkgs": {
"locked": {
"lastModified": 1718530797,
"narHash": "sha256-pup6cYwtgvzDpvpSCFh1TEUjw2zkNpk8iolbKnyFmmU=",
"lastModified": 1719254875,
"narHash": "sha256-ECni+IkwXjusHsm9Sexdtq8weAq/yUyt1TWIemXt3Ko=",
"owner": "NixOS",
"repo": "nixpkgs",
"rev": "b60ebf54c15553b393d144357375ea956f89e9a9",
"rev": "2893f56de08021cffd9b6b6dfc70fd9ccd51eb60",
"type": "github"
},
"original": {

View file

@ -173,6 +173,13 @@
github = "iosmanthus";
githubId = 16307070;
};
jonringer = {
email = "jonringer117@gmail.com";
matrix = "@jonringer:matrix.org";
github = "jonringer";
githubId = 7673602;
name = "Jonathan Ringer";
};
kalhauge = {
name = "Christian Gram Kalhauge";
email = "kalhauge@users.noreply.github.com";
@ -201,6 +208,12 @@
github = "kubukoz";
githubId = 894884;
};
lheckemann = {
name = "Linus Heckemann";
email = "git@sphalerite.org";
github = "lheckemann";
githubId = 341954;
};
loicreynier = {
name = "Loïc Reynier";
email = "loic@loireynier.fr";

View file

@ -1679,6 +1679,30 @@ in {
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

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

View file

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

View file

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

View file

@ -7,7 +7,7 @@ let
tomlFormat = pkgs.formats.toml { };
bashIntegration = ''
function ya() {
function ${cfg.shellWrapperName}() {
local tmp="$(mktemp -t "yazi-cwd.XXXXX")"
yazi "$@" --cwd-file="$tmp"
if cwd="$(cat -- "$tmp")" && [ -n "$cwd" ] && [ "$cwd" != "$PWD" ]; then
@ -18,7 +18,7 @@ let
'';
fishIntegration = ''
function ya
function ${cfg.shellWrapperName}
set tmp (mktemp -t "yazi-cwd.XXXXX")
yazi $argv --cwd-file="$tmp"
if set cwd (cat -- "$tmp"); and [ -n "$cwd" ]; and [ "$cwd" != "$PWD" ]
@ -29,7 +29,7 @@ let
'';
nushellIntegration = ''
def --env ya [...args] {
def --env ${cfg.shellWrapperName} [...args] {
let tmp = (mktemp -t "yazi-cwd.XXXXX")
yazi ...$args --cwd-file $tmp
let cwd = (open $tmp)
@ -40,13 +40,22 @@ let
}
'';
in {
meta.maintainers = with maintainers; [ xyenon ];
meta.maintainers = with maintainers; [ xyenon eljamm ];
options.programs.yazi = {
enable = mkEnableOption "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";
enableZshIntegration = mkEnableOption "Zsh integration";
@ -145,8 +154,11 @@ in {
default = { };
description = ''
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 ''
{
@ -161,8 +173,10 @@ in {
default = { };
description = ''
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 ''
{
@ -171,7 +185,6 @@ in {
}
'';
};
};
config = mkIf cfg.enable {
@ -198,10 +211,63 @@ in {
source = tomlFormat.generate "yazi-theme" cfg.theme;
};
"yazi/init.lua" = mkIf (cfg.initLua != null) { source = cfg.initLua; };
} // (mapAttrs'
(name: value: nameValuePair "yazi/plugins/${name}" { source = value; })
cfg.plugins) // (mapAttrs'
(name: value: nameValuePair "yazi/flavors/${name}" { source = value; })
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

@ -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

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

View file

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

View file

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

View file

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

View file

@ -336,7 +336,7 @@ in {
${pkgs.sd-switch}/bin/sd-switch \
''${DRY_RUN:+--dry-run} $VERBOSE_ARG ${timeoutArg} \
''${oldGenPath:+--old-units $oldGenPath/home-files/.config/systemd/user} \
--new-units $newGenPath/home-files/.config/systemd/user
--new-units "$newUnitsDir"
'';
};
@ -354,8 +354,15 @@ in {
warnEcho "Attempting to reload services anyway..."
fi
newUnitsDir="$newGenPath/home-files/.config/systemd/user"
if [[ ! -e $newUnitsDir ]]; then
newUnitsDir=${pkgs.emptyDirectory}
fi
${ensureRuntimeDir} \
${getAttr cfg.startServices cmd}
unset newUnitsDir
else
echo "User systemd daemon not running. Skipping reload."
fi

View file

@ -241,6 +241,7 @@ in import nmtSrc {
./modules/services/fnott
./modules/services/fusuma
./modules/services/git-sync
./modules/services/glance
./modules/services/gpg-agent
./modules/services/gromit-mpx
./modules/services/home-manager-auto-upgrade

View file

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

View file

@ -2,7 +2,7 @@
let
shellIntegration = ''
function ya
function yy
set tmp (mktemp -t "yazi-cwd.XXXXX")
yazi $argv --cwd-file="$tmp"
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

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

View file

@ -70,8 +70,22 @@
};
};
initLua = ./init.lua;
plugins = { "test.yazi" = ./plugin; };
flavors = { "test.yazi" = ./flavor; };
plugins = {
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 = { };
@ -85,9 +99,9 @@
${./theme-expected.toml}
assertFileContent home-files/.config/yazi/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}
assertFileContent home-files/.config/yazi/flavors/test.yazi/init.lua \
${./flavor/init.lua}
assertFileContent home-files/.config/yazi/flavors/testflavor.yazi/flavor.toml \
${./flavor/flavor.toml}
'';
}

View file

@ -2,7 +2,7 @@
let
shellIntegration = ''
function ya() {
function yy() {
local tmp="$(mktemp -t "yazi-cwd.XXXXX")"
yazi "$@" --cwd-file="$tmp"
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

View file

@ -0,0 +1,9 @@
[Install]
WantedBy=graphical-session.target
[Service]
ExecStart=@glance@/bin/dummy --config /home/hm-user/.config/glance/glance.yml
[Unit]
Description=Glance feed dashboard server
PartOf=graphical-session.target