Skip to content

Commit 6f55012

Browse files
committed
doc: add environment variables section to HOWTO.md
1 parent 2c55335 commit 6f55012

File tree

1 file changed

+76
-1
lines changed

1 file changed

+76
-1
lines changed

docs/HOWTO.md

Lines changed: 76 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -233,7 +233,82 @@ There are three categories of options:
233233

234234
# Troubleshooting
235235

236-
## Cannot launch applications
236+
## Environment variables
237+
238+
### systemd service
239+
240+
The xremap.service will only have access to environment variables defined
241+
through the `Environment=` and `EnvironmentFile=` entries in the service file.
242+
Moreover, other environment variables may be made available to the service by
243+
using `systemctl [--user] set-environment VARIABLE=VALUE`.
244+
245+
To expose `home.sessionVariables` to the service, the following may be done:
246+
247+
```nix
248+
{lib, pkgs, ...}:
249+
{
250+
# This will make every variable to have a `Environment=VARIABLE=VALUE` entry.
251+
systemd.user.services.xremap.Service = {
252+
Environment = lib.mapAttrsToList (n: v: "${n}=\"${builtins.toString v}\"") config.home.sessionVariables;
253+
};
254+
# This will make a single `EnvironmentFile` entry, but implies the build of
255+
# derivation.
256+
systemd.user.services.xremap.Service = {
257+
EnvironmentFile = builtins.toString (
258+
pkgs.writeText "xremap-session-vars-as-env-d" (
259+
builtins.concatStringsSep "\n" (
260+
lib.mapAttrsToList (n: v: "${n}=\"${builtins.toString v}\"") config.home.sessionVariables
261+
)
262+
)
263+
);
264+
};
265+
}
266+
```
267+
268+
#### Session variables being overwritten by `/etc/profile` family of files on a shell
269+
270+
This happens because the session variables are set before the `/etc/profile`
271+
files are sourced, which happens only the shell is spawned.
272+
273+
It can be fixed with the following if guard (following example uses Bash in a
274+
posix compliant manner, so it may be used on posix compliant shells, but needs
275+
adaptation for non compliant ones like fish):
276+
277+
```nix
278+
{config, lib, ...}: {
279+
programs.bash.initExtra = lib.mkOrder 99 ''
280+
if [ -z "$__HM_SESS_VARS_SOURCED" ]; then
281+
. ${config.home.profileDirectory}/etc/profile.d/hm-session-vars.sh
282+
fi
283+
'';
284+
}
285+
```
286+
287+
Now, the session variables will be sourced after the ones from `/etc/profile`.
288+
289+
### Calling the binary directly as a non-root user
290+
291+
For xremap to have access to the user environment the following may be done:
292+
293+
1. If using home-manager for managing the xsession:
294+
```nix
295+
{pkgs, ...}:
296+
{
297+
xsession.initExtra = ''
298+
${lib.getExe pkgs.xremap} <path-to-config-file>
299+
'';
300+
}
301+
```
302+
This exposes `home.sessionVariables` to xremap, since the `xsession` file
303+
sources the `xprofile` file, which sources the file with the session
304+
variables.
305+
1. If not using home-manager, DE/WM specific solutions may be used, that is, a
306+
way to launch xremap together with. Here are some non exhaustive solutions:
307+
1. dwm: add `<binary> <config-file> &`the autostart.sh script, if using the
308+
[autostart patch](https://dwm.suckless.org/patches/autostart/).
309+
1. Hyprland: hyprctl use `hyprctl exec <binary>`.
310+
311+
### Cannot launch applications
237312

238313
If there is a binding to launch an application that looks like this:
239314

0 commit comments

Comments
 (0)