Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
189 changes: 108 additions & 81 deletions pages/Nix/Hyprland on Home Manager.md
Original file line number Diff line number Diff line change
@@ -1,23 +1,44 @@
You can use the Home Manager module by adding it to your configuration:

For a list of available options, check the
[module file](https://github.com/hyprwm/Hyprland/blob/main/nix/hm-module.nix).
[Home Manager options](https://nix-community.github.io/home-manager/options.html#opt-wayland.windowManager.hyprland.enable).

{{< hint title=Note >}}
- *(Required) NixOS Module*: enables critical components needed to run Hyprland properly
- *(Optional) Home-manager module*: lets you declaratively configure Hyprland
{{< /hint >}}

## Installation
- _(Required) NixOS Module_: enables critical components needed to run Hyprland
properly
- _(Optional) Home-manager module_: lets you declaratively configure Hyprland
{{< /hint >}}

The following snippets of code try to show how to bring the Hyprland flake from
the flake input and import it into the module system. Feel free to make any
adjustment for your setup.
## Installation

{{< tabs "uniqueid" >}}

{{< tab "Home Manager" >}}

Home Manager has options for Hyprland without needing to import the Flake
module.

```nix
{
wayland.windowManager.hyprland.enable = true;
}
```

{{< /tab >}}

{{< tab "Flakes" >}}

{{< hint >}}

The flake module is merely an extension to the Home Manager downstream module.
It is mainly used as a staging area for new options, so unless you're a tester
you should use the downstream Home Manager module.

{{< /hint >}}

The following snippet of code tries to show how to bring the Hyprland flake from
the flake input and import it into the module system. Feel free to make any
adjustment for your setup.

Don't forget to replace `user@hostname` with your username and hostname!

```nix
Expand Down Expand Up @@ -48,9 +69,23 @@ Don't forget to replace `user@hostname` with your username and hostname!
};
}
```

{{< /tab >}}

{{< tab "No flakes (with flake-compat)" >}}

{{< hint >}}

The flake module is merely an extension to the Home Manager downstream module.
It is mainly used as a staging area for new options, so unless you're a tester
you should use the downstream Home Manager module.

{{< /hint >}}

The following snippet of code tries to show how to bring the Hyprland flake from
the flake input and import it into the module system. Feel free to make any
adjustment for your setup.

```nix
# home config

Expand All @@ -61,61 +96,57 @@ Don't forget to replace `user@hostname` with your username and hostname!
src = builtins.fetchTarball "https://github.com/hyprwm/Hyprland/archive/master.tar.gz";
}).defaultNix;
in {
imports = [
hyprland.homeManagerModules.default
];
imports = [hyprland.homeManagerModules.default];

wayland.windowManager.hyprland = {
enable = true;

extraConfig = ''
bind = SUPER, Return, exec, kitty
# ...
'';
};
wayland.windowManager.hyprland.enable = true;
}
```

{{< /tab >}}

{{< /tabs >}}

};

## Usage

Once the module is enabled, you can use it to declaratively configure Hyprland:
Once the module is enabled, you can use it to declaratively configure Hyprland.
Here is an example config, made to work with either the upstream Home Manager
module, or the flake-based Home Manager module.

```nix
# home.nix
{config, pkgs, ...}: {
wayland.windowManager.hyprland.extraConfig = ''
$mod = SUPER

bind = $mod, F, exec, firefox
bind = , Print, exec, grimblast copy area

# workspaces
# binds $mod + [shift +] {1..10} to [move to] workspace {1..10}
${builtins.concatStringsSep "\n" (builtins.genList (
x: let
ws = let
c = (x + 1) / 10;
in
builtins.toString (x + 1 - (c * 10));
in ''
bind = $mod, ${ws}, workspace, ${toString (x + 1)}
bind = $mod SHIFT, ${ws}, movetoworkspace, ${toString (x + 1)}
''
)
10)}

# ...
'';
{
wayland.windowManager.hyprland.settings = {
"$mod" = "SUPER";
bind =
[
"$mod, F, exec, firefox"
", Print, exec, grimblast copy area"
]
++ (
# workspaces
# binds $mod + [shift +] {1..10} to [move to] workspace {1..10}
builtins.concatLists (builtins.genList (
x: let
ws = let
c = (x + 1) / 10;
in
builtins.toString (x + 1 - (c * 10));
in [
"$mod, ${ws}, workspace, ${toString (x + 1)}"
"$mod SHIFT, ${ws}, movetoworkspace, ${toString (x + 1)}"
]
)
10)
);
};
}
```

## Plugins

Hyprland plugins can be added through an option:
Hyprland plugins can be added through the `plugins` option:

```nix
wayland.windowManager.hyprland.plugins = [
Expand All @@ -124,45 +155,41 @@ wayland.windowManager.hyprland.plugins = [
];
```

For examples on how to build hyprland plugins using nix see the
For examples on how to build Hyprland plugins using nix see the
[official plugins](https://github.com/hyprwm/hyprland-plugins).

## Fixing problems with themes

If your themes for mouse cursor, icons or windows don't load correctly, try setting them with `home.pointerCursor` and `gtk.theme`, which enable a bunch of compatibility options that should make the themes load in all situations.
If your themes for mouse cursor, icons or windows don't load correctly, try
setting them with `home.pointerCursor` and `gtk.theme`, which enable a bunch of
compatibility options that should make the themes load in all situations.

Example configuration:
```
home-manager = {
useGlobalPkgs = true;
useUserPackages = true;
users.username = {
home = {
stateVersion = "23.05";
pointerCursor = {
gtk.enable = true;
# x11.enable = true;
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Amber";
size = 32;
};
};
gtk = {
enable = true;
theme = {
package = pkgs.flat-remix-gtk;
name = "Flat-Remix-GTK-Grey-Darkest";
};
iconTheme = {
package = pkgs.libsForQt5.breeze-icons;
name = "breeze-dark";
};
font = {
name = "Sans";
size = 11;
};
};
};

```nix
home.pointerCursor = {
gtk.enable = true;
# x11.enable = true;
package = pkgs.bibata-cursors;
name = "Bibata-Modern-Classic";
size = 16;
};

gtk = {
enable = true;
theme = {
package = pkgs.flat-remix-gtk;
name = "Flat-Remix-GTK-Grey-Darkest";
};

iconTheme = {
package = pkgs.gnome.adwaita-icon-theme;
name = "Adwaita";
};

font = {
name = "Sans";
size = 11;
};
};
```
18 changes: 13 additions & 5 deletions pages/Nix/_index.md
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
To install Hyprland on NixOS, we provide a NixOS and a Home Manager module.

{{< hint title=Note >}}
- *(Required) NixOS Module*: enables critical components needed to run Hyprland properly
- *(Optional) Home-manager module*: lets you declaratively configure Hyprland
{{< /hint >}}

- _(Required) NixOS Module_: enables critical components needed to run Hyprland
properly
- _(Optional) Home-manager module_: lets you declaratively configure Hyprland
{{< /hint >}}

## NixOS module

The module is now upstreamed into Nixpkgs, which means all you need in your configuration is:
The module is now upstreamed into Nixpkgs, which means all you need in your
configuration is:

```nix
{config, pkgs, ...}: {
Expand All @@ -17,7 +20,8 @@ The module is now upstreamed into Nixpkgs, which means all you need in your conf
}
```

Note that the command to run hyprland is `Hyprland` (with a capital `H`) and not `hyprland`.
Note that the command to run hyprland is `Hyprland` (with a capital `H`) and not
`hyprland`.

For more options, see
[module options](https://search.nixos.org/options?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=hyprland).
Expand All @@ -28,6 +32,10 @@ For other NixOS options, see [Hyprland on NixOS](./Hyprland-on-NixOS).

Read [Hyprland on Home Manager](./Hyprland-on-Home-Manager).

For the adventurous, [@spikespaz](https://github.com/spikespaz) has made a
Hyprland module that can be used in Home Manager and NixOS. It can be found
[here](https://github.com/spikespaz/hyprland-nix).

## Options and overrides

Read [Options & Overrides](./Options-Overrides).